{
  "interval": {
    "intervalStart": "2026-01-20T00:00:00.000Z",
    "intervalEnd": "2026-01-21T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-01-20 to 2026-01-21, elizaos/eliza had 1 new PRs (0 merged), 0 new issues, and 6 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7j-zcv",
      "title": "SQL error 384-dim zero vector fallback",
      "author": "Xayaan",
      "number": 6380,
      "repository": "elizaos/eliza",
      "body": "**Describe the bug**\n\nUSE_OPENAI_EMBEDDING setting isn't being respected, and the code is using a 384-dim zero vector fallback while the DB adapter is hardcoded to use the dim_1536 column.\n\nError      [PLUGIN:SQL] Failed to create entities (entityId=a2271fc6-fcbd-03f5-afa6-9e462c212936, error=Failed query: insert into \"entities\" (\"id\", \"agent_id\", \"created_at\", \"names\", \"metadata\") values ($1, $2, default, $3, $4) on conflict do nothing\n\n\n**To Reproduce**\n\n\n**Expected behavior**\n\n\n**Screenshots**\n\n\n**Additional context**\n\nFull error : \n\nError engaging with search terms: 36 |   async queryWithCache(queryString, params, query) {\n37 |     if (this.cache === void 0 || is(this.cache, NoopCache) || this.queryMetadata === void 0) {\n38 |       try {\n39 |         return await query();\n40 |       } catch (e) {\n41 |         throw new DrizzleQueryError(queryString, params, e);\n                   ^\nerror: Failed query: insert into \"embeddings\" (\"id\", \"memory_id\", \"created_at\", \"dim_384\", \"dim_512\", \"dim_768\", \"dim_1024\", \"dim_1536\", \"dim_3072\") values ($1, $2, default, default, default, default, default, $3, default)\nparams: da258e42-b781-4f19-93bc-2d61783524b0,fa3547f4-6271-0e2d-88cf-c88125baacf5,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\n  query: \"insert into \\\"embeddings\\\" (\\\"id\\\", \\\"memory_id\\\", \\\"created_at\\\", \\\"dim_384\\\", \\\"dim_512\\\", \\\"dim_768\\\", \\\"dim_1024\\\", \\\"dim_1536\\\", \\\"dim_3072\\\") values ($1, $2, default, default, default, default, default, $3, default)\",\n params: [\n  \"da258e42-b781-4f19-93bc-2d61783524b0\", \"fa3547f4-6271-0e2d-88cf-c88125baacf5\", \"[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\"\n],\n\n      at queryWithCache (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/drizzle-orm/pg-core/session.js:41:15)\n\n1 | import{b as ae,e as s,f as h,g as d,h as p,i as oe,j as y}from\"./chunk-QY3QWFKW.js\";var hn={};ae(hn,{ABSTIME:()=>Et,ACLITEM:()=>Vt,BIT:()=>jt,BOOL:()=>be,BPCHAR:()=>_e,BYTEA:()=>ge,CHAR:()=>gt,CID:()=>St,CIDR:()=>Tt,CIRCLE:()=>Ut,DATE:()=>He,FLOAT4:()=>Qe,FLOAT8:()=>We,GTSVECTOR:()=>rn,INET:()=>kt,INT2:()=>ve,INT4:()=>Ge,INT8:()=>we,INTERVAL:()=>vt,JSON:()=>Ae,JSONB:()=>Ye,MACADDR:()=>Ot,MACADDR8:()=>Nt,MONEY:()=>Lt,NUMERIC:()=>Wt,OID:()=>je,PATH:()=>Mt,PG_DEPENDENCIES:()=>en,PG_LSN:()=>Xt,PG_NDISTINCT:()=>Zt,PG_NODE_TREE:()=>Bt,POLYGON:()=>Rt,REFCURSOR:()=>_t,REGCLASS:()=>Yt,REGCONFIG:()=>sn,REGDICTIONARY:()=>an,REGNAMESPACE:()=>on,REGOPER:()=>Ht,REGOPERATOR:()=>qt,REGPROC:()=>wt,REGPROCEDURE:()=>zt,REGROLE:()=>un,REGTYPE:()=>$t,RELTIME:()=>Ct,SMGR:()=>It,TEXT:()=>V,TID:()=>At,TIME:()=>Ft,TIMESTAMP:()=>qe,TIMESTAMPTZ:()=>xe,TIMETZ:()=>Gt,TINTERVAL:()=>Pt,TSQUERY:()=>nn,TSVECTOR:()=>tn,TXID_SNAPSHOT:()=>Jt,UUID:()=>Kt,VARBIT:()=>Qt,VARCHAR:()=>ze,XID:()=>xt,XML:()=>Dt,arrayParser:()=>yn,arraySerializer:()=>Ke\n\nerror: expected 1536 dimensions, not 384\n     length: 93,\n   severity: \"ERROR\",\n     detail: undefined,\n       hint: undefined,\n   position: undefined,\n internalPosition: undefined,\n internalQuery: undefined,\n      where: undefined,\n     schema: undefined,\n      table: undefined,\n   dataType: undefined,\n constraint: undefined,\n       file: \"vector.c\",\n    routine: \"CheckExpectedDim\",\n      query: \"insert into \\\"embeddings\\\" (\\\"id\\\", \\\"memory_id\\\", \\\"created_at\\\", \\\"dim_384\\\", \\\"dim_512\\\", \\\"dim_768\\\", \\\"dim_1024\\\", \\\"dim_1536\\\", \\\"dim_3072\\\") values ($1, $2, default, default, default, default, default, $3, default)\",\n     params: [\n  \"da258e42-b781-4f19-93bc-2d61783524b0\", \"fa3547f4-6271-0e2d-88cf-c88125baacf5\", \"[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\"\n],\n queryOptions: {\n  rowMode: \"object\",\n  parsers: [Object ...],\n},\n       code: \"22000\"\n\n      at Ve (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/chunk-3WWIVTCY.js:1:17620)\n      at parse (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/chunk-3WWIVTCY.js:1:52)\n      at /Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/index.js:1:249\n      at unknown:1:1\n      at unknown:1:1\n      at unknown:1:1\n      at unknown:1:1\n      at invoke_v (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/index.js:1:249)\n      at unknown:1:1\n      at execProtocolRawSync (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/index.js:1:249)\n      at execProtocolRaw (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/index.js:1:249)\n      at execProtocolRaw (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/index.js:1:249)\n      at execProtocolStream (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/index.js:1:249)\n      at execProtocolStream (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/index.js:1:249)\n      at /Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/chunk-F2DQ4FIK.js:1:296\n      at y (/Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/chunk-F2DQ4FIK.js:1:296)\n      at /Users/zayaan_1/Downloads/AIXE-BOT-DEV/AIXE-BOT/node_modules/@electric-sql/pglite/dist/chunk-F2DQ4FIK.js:1:296\n      at processTicksAndRejections (native:7:39)\n\n",
      "createdAt": "2026-01-17T10:58:55Z",
      "closedAt": "2026-01-20T19:38:03Z",
      "state": "CLOSED",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs6-HSpn",
      "title": "V2.0.0: dynamic execution engine (test if context is going to blown)",
      "author": "odilitime",
      "number": 6384,
      "body": "Redo #6113 for 2.0.0, first pass\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Introduces a validation-aware, schema-driven prompt execution path and applies it across runtimes and message flows.\n> \n> - Adds `dynamic_prompt_exec_from_state`/`dynamicPromptExecFromState` (TS/Python/Rust) with per-field/checkpoint UUID validation codes, required-field checks, and retry with backoff; supports XML/JSON\n> - Refactors message handling (should-respond, single-shot, multi-step decision, final summary) to use structured schemas instead of ad-hoc parsing\n> - Implements streaming support in TS with `ValidationStreamExtractor`, `MarkableExtractor`, and streaming context helpers; emits rich `StreamEvent`s\n> - Introduces shared types: `SchemaRow`, `RetryBackoffConfig`, `StreamEvent(Type)` in Python/Rust/TS type modules\n> - Adds XML parsing utilities (nested-safe) and normalizes structured responses; basic templating in Rust, Handlebars in TS\n> - Exposes validation level configuration (0–3) and model selection; defaults to large text models\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1e447bbc005cbad715eb819aba27eb35b54aa5b8. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added dynamic prompt execution with state injection and schema-driven validation.\n  * Enabled validation-aware streaming with configurable validation levels (0-3).\n  * Introduced built-in retry logic with exponential backoff for improved resilience.\n  * Support for structured output validation across JSON and XML formats.\n  * Per-field and checkpoint-level validation for enhanced data integrity.\n\n<sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub>\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nIntroduces `dynamicPromptExecFromState()` across Python, Rust, and TypeScript runtimes to provide schema-driven prompt execution with context validation via UUID codes. The implementation detects when LLMs truncate output due to limited context windows by injecting validation codes at strategic positions (start/middle/end or per-field). Supports four validation levels (0=trusted to 3=full), exponential backoff retries, and optional validation-aware streaming via `ValidationStreamExtractor`.\n\n**Key changes:**\n- Cross-language API consistency for dynamic prompt execution with state injection\n- Validation code system to detect context overflow (4 levels: trusted, progressive, checkpoint, full)\n- Streaming integration with progressive validation and retry support\n- Schema-based structured output parsing (XML/JSON) with required field validation\n- Performance metrics tracking per model+schema combination (TypeScript only)\n- Comprehensive type definitions (`SchemaRow`, `RetryBackoffConfig`, `StreamEvent`)\n\n**Critical issues in Python implementation:**\n- Callable prompt invocation wraps state incorrectly (`{\"state\": state}` vs direct state access)\n- Template substitution assumes `state.values` has dynamic attributes accessible via `dir()`, incompatible with protobuf State\n- XML parsing regex `\\w+` won't match validation field names with underscores like `code_text_start`\n\n**Minor issues:**\n- Rust template rendering uses basic string replacement instead of full Handlebars compiler\n- TypeScript `_smartRetryContext` deletion during retry loop prevents reuse on subsequent attempts\n- ValidationStreamExtractor abort handling may leave inconsistent state\n\n<h3>Confidence Score: 3/5</h3>\n\n\n- Python implementation has runtime errors that will break production usage; TypeScript and Rust implementations are safer but need testing\n- Score reflects critical logical errors in Python (3 bugs that will cause runtime failures), plus architecture differences across languages. TypeScript implementation is most complete with metrics and full Handlebars support. Python bugs must be fixed before merge to avoid breaking callers.\n- `packages/python/elizaos/runtime.py` requires immediate fixes for callable invocation, state.values access pattern, and XML regex. Test the Python implementation thoroughly before merging.\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/python/elizaos/runtime.py | Adds `dynamic_prompt_exec_from_state` with validation codes and retry logic; has critical bugs in callable invocation, state.values access, and XML parsing regex |\n| packages/rust/src/runtime.rs | Implements `dynamic_prompt_exec_from_state` with validation and retry; template rendering is basic string replacement vs full Handlebars |\n| packages/typescript/src/runtime.ts | Implements `dynamicPromptExecFromState` with metrics, streaming, and validation; minor issue with `_smartRetryContext` deletion timing |\n| packages/typescript/src/utils/streaming.ts | Implements validation-aware streaming with multiple extractor types; minor state inconsistency on abort signal |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant Runtime\n    participant ValidationExtractor\n    participant LLM\n    participant Parser\n\n    Client->>Runtime: dynamicPromptExecFromState(state, schema, options)\n    \n    Note over Runtime: Generate validation codes<br/>(UUID snippets)\n    \n    Runtime->>Runtime: Build extended schema<br/>with validation fields\n    \n    Runtime->>Runtime: Inject codes into prompt<br/>(initial, middle, end)\n    \n    Runtime->>Runtime: Compile template with<br/>Handlebars/state values\n    \n    alt Streaming enabled\n        Runtime->>ValidationExtractor: Create extractor<br/>(level, schema, codes)\n    end\n    \n    loop Retry attempts (0 to maxRetries)\n        Runtime->>LLM: Generate text with prompt\n        \n        alt Streaming\n            loop Stream chunks\n                LLM-->>ValidationExtractor: chunk\n                ValidationExtractor->>ValidationExtractor: Extract field content\n                ValidationExtractor->>ValidationExtractor: Check per-field codes<br/>(level 0-1)\n                ValidationExtractor-->>Client: Stream validated content\n            end\n        else Non-streaming\n            LLM-->>Runtime: Complete response\n        end\n        \n        Runtime->>Runtime: Clean response<br/>(remove <think> tags)\n        \n        Runtime->>Parser: Parse XML/JSON response\n        Parser-->>Runtime: Parsed fields object\n        \n        Runtime->>Runtime: Normalize structured response\n        \n        alt Validation level 0-1\n            loop For each field with code\n                Runtime->>Runtime: Check start/end codes match\n            end\n        else Validation level 2-3\n            Runtime->>Runtime: Check checkpoint codes<br/>(one_initial, one_middle, etc)\n        end\n        \n        Runtime->>Runtime: Validate required fields<br/>are present and non-empty\n        \n        alt All validations pass\n            alt Streaming (level 2-3)\n                Runtime->>ValidationExtractor: flush()\n                ValidationExtractor-->>Client: Buffered content\n            end\n            Runtime->>Runtime: Remove validation code fields\n            Runtime->>Runtime: Update success metrics\n            Runtime-->>Client: Return parsed response\n        else Validation fails\n            alt Has retries remaining\n                Runtime->>Runtime: Calculate backoff delay\n                Runtime->>Runtime: Wait for backoff\n                Note over Runtime: Loop continues with retry\n            else No retries left\n                Runtime->>Runtime: Update failure metrics\n                Runtime-->>Client: Return null\n            end\n        end\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-20T02:29:59Z",
      "mergedAt": null,
      "additions": 4309,
      "deletions": 1591
    },
    {
      "id": "PR_kwDOMT5cIs69wZA0",
      "title": "fix: send action callbacks to user in multi-step mode",
      "author": "YuriNachos",
      "number": 6373,
      "body": "## Summary\n- Fixes issue where action callbacks were not being sent to users in multi-step mode\n- Changes empty callback to actually call user's callback with action response\n- Ensures action responses (with attachments, etc.) are properly delivered\n\n## Problem\nIn multi-step mode, the callback passed to `processActions` was an empty function that just returned `[]`. This meant when action handlers called `callback()` with their response (e.g., generated images with attachments), it was never sent to the user. Users would only see \"Provider executed: ATTACHMENTS\" instead of their actual action response.\n\n## Solution\nModified the callback in multi-step mode to:\n1. Mark when action callback is called with actual content\n2. Call the user's callback with the action's response content\n\n## Changes\n- `packages/core/src/services/default-message-service.ts`: Updated action callback in multi-step mode to properly forward action responses to the user\n\nFixes #4947\n\n---\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nThis PR fixes a critical bug in multi-step mode where action callbacks were not being sent to users. The PR also adds an `unregisterAction` method to the runtime and fixes an entity connection issue in the reflection evaluator.\n\n**Main Changes:**\n- **Action Callback Fix**: Modified the callback in `default-message-service.ts` multi-step mode to properly forward action responses to the user's callback instead of returning an empty array. This ensures action handlers that call `callback()` with responses (e.g., generated images with attachments) are properly delivered to users.\n- **Unregister Action**: Added `unregisterAction()` method to `AgentRuntime` class and `IAgentRuntime` interface, allowing dynamic removal of actions with comprehensive test coverage.\n- **Reflection Evaluator Fix**: Added entity connection check in reflection evaluator before saving facts to prevent foreign key constraint violations when the agent entity hasn't been registered in the room yet.\n\nThe changes are well-tested with new test cases added for both the `unregisterAction` method and the reflection evaluator entity connection handling.\n\n<h3>Confidence Score: 5/5</h3>\n\n\n- This PR is safe to merge with minimal risk\n- The changes are straightforward bug fixes with clear intent. The action callback fix properly implements the expected behavior, the unregisterAction method is simple and well-tested, and the reflection evaluator fix adds proper defensive checks. All changes include appropriate test coverage and follow existing code patterns.\n- No files require special attention\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/core/src/services/default-message-service.ts | Fixed action callback in multi-step mode to properly forward action responses to users instead of returning empty arrays |\n| packages/core/src/runtime.ts | Added `unregisterAction` method to allow dynamic removal of actions from runtime |\n| packages/plugin-bootstrap/src/evaluators/reflection.ts | Added entity connection check before saving facts to prevent foreign key constraint violations |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant MessageService\n    participant Runtime\n    participant ActionHandler\n    participant UserCallback\n\n    User->>MessageService: Send message\n    MessageService->>MessageService: handleMultiStepMode()\n    MessageService->>Runtime: processActions(message, callback)\n    Note over MessageService,Runtime: Before fix: callback = async () => []<br/>After fix: callback forwards to user's callback\n    Runtime->>ActionHandler: action.handler(runtime, message, state, callback)\n    ActionHandler->>ActionHandler: Execute action logic<br/>(e.g., generate image)\n    ActionHandler->>Runtime: callback(content)<br/>{text: \"...\", attachments: [...]}\n    Runtime->>MessageService: Forward callback response\n    alt After Fix\n        MessageService->>UserCallback: callback(content)\n        UserCallback->>User: Send response with attachments\n    else Before Fix\n        MessageService->>User: Return empty array []<br/>User sees \"ATTACHMENTS\" instead\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-17T08:13:43Z",
      "mergedAt": null,
      "additions": 217,
      "deletions": 3
    },
    {
      "id": "PR_kwDOMT5cIs6eytdJ",
      "title": "[DRAFT] Docker Infrastructure Enhancement Proposal",
      "author": "bealers",
      "number": 5583,
      "body": "## Docker Infrastructure Enhancement Proposal\r\n\r\nThis PR proposes enhanced Docker infrastructure for elizaOS with optimised builds and streamlined deployment workflows.\r\n\r\n### Key Features\r\n- `elizaos deploy` command for unified deployment operations\r\n- Enhanced `--docker` flags for existing `elizaos dev` and `elizaos start` commands  \r\n- Multi-environment build targets (dev, test, prod, demo)\r\n- Build optimisation strategies and container testing framework\r\n- CI integration and registry deployment options\r\n\r\n### Justification\r\n\r\nAt minimum, there are several low-hanging fruit optimisations available, and we're keeping any new commands namespaced to avoid too much overlap. Once we have a stable and minimised container image, we can start to have fun building clusters for horizontal scaling tests, benchmarking and swarms like the-org.\r\n\r\n### Documentation\r\nSee `docs/docker-infrastructure.md` for complete specification.\r\n\r\n**This is a draft for team review and discussion.**",
      "repository": "elizaos/eliza",
      "createdAt": "2025-07-14T12:18:33Z",
      "mergedAt": null,
      "additions": 171,
      "deletions": 0
    },
    {
      "id": "PR_kwDOMT5cIs69wYkI",
      "title": "fix(plugin-bootstrap): ensure entity connection before saving facts in reflection evaluator",
      "author": "YuriNachos",
      "number": 6371,
      "body": "## Summary\n- Fixes issue where reflection evaluator fails with \"Entity not found\" error\n- Adds room information lookup before saving facts\n- Calls `ensureConnection()` to initialize entity in database\n\n## Problem\nThe reflection evaluator in `packages/plugin-bootstrap/src/evaluators/reflection.ts` was saving facts without ensuring the agent entity exists in the database. This caused \"Entity not found\" errors when the UPDATE_CONTACT action was triggered.\n\n## Solution\nAdded room lookup and `ensureConnection()` call before saving facts. If room or world ID is not found, the operation fails gracefully with a warning message.\n\n## Changes\n- `packages/plugin-bootstrap/src/evaluators/reflection.ts`: Added room lookup and ensureConnection call\n- `packages/plugin-bootstrap/src/__tests__/reflection-entity-connection.test.ts`: Added test for entity connection behavior\n\nFixes #6364\n\n---\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nThis PR fixes the \"Entity not found\" error in the reflection evaluator by ensuring the agent entity is properly initialized in the database before saving facts.\n\n**Key Changes:**\n- Added room lookup to retrieve `worldId` (required for entity connection)\n- Added `ensureConnection()` call before saving facts to initialize entity in database\n- Added graceful error handling when room/worldId is not found\n- Added test coverage for the entity connection behavior\n- Minor code quality improvement: changed `fact != null` to `fact !== null` for strict equality\n\n**How it works:**\nThe reflection evaluator processes conversations to extract facts and relationships. Previously, it attempted to save facts directly without ensuring the agent entity existed in the database, causing UPDATE operations to fail. The fix retrieves the room information (which contains the worldId), then calls `ensureConnection()` to create or update the entity before proceeding with fact storage.\n\nThe solution follows the established pattern used elsewhere in the codebase (e.g., `packages/plugin-bootstrap/src/index.ts:814`, `packages/core/src/elizaos.ts:496`).\n\n<h3>Confidence Score: 4/5</h3>\n\n\n- This PR is safe to merge with minimal risk - it adds necessary entity initialization before database operations\n- The fix properly addresses the root cause by ensuring entity existence before UPDATE operations. The implementation follows established patterns in the codebase and includes appropriate error handling. Minor deduction for limited test coverage (only tests the error path, not the success path) and potential optimization opportunity with the room lookup fallback.\n- No files require special attention - the changes are straightforward and well-structured\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-bootstrap/src/evaluators/reflection.ts | Added room lookup and `ensureConnection()` call before saving facts to fix \"Entity not found\" error |\n| packages/plugin-bootstrap/src/__tests__/reflection-entity-connection.test.ts | Added test to verify evaluator returns early when room is not found |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant RE as Reflection Evaluator\n    participant RT as Runtime\n    participant DB as Database\n    \n    RE->>RT: getRelationships(entityId)\n    RT->>DB: Query relationships\n    DB-->>RT: Return relationships\n    RT-->>RE: Return relationships\n    \n    RE->>RT: getEntityDetails(runtime, roomId)\n    RT->>DB: Query entities in room\n    DB-->>RT: Return entities\n    RT-->>RE: Return entities\n    \n    RE->>RT: getMemories(facts, roomId)\n    RT->>DB: Query existing facts\n    DB-->>RT: Return facts\n    RT-->>RE: Return facts\n    \n    RE->>RT: useModel(prompt)\n    RT-->>RE: XML reflection response\n    \n    Note over RE: Parse facts and relationships from XML\n    \n    alt Room lookup from state\n        RE->>RE: Get room from state.data.room\n    else Room lookup from database\n        RE->>RT: getRoom(roomId)\n        RT->>DB: Query room\n        DB-->>RT: Return room with worldId\n        RT-->>RE: Return room\n    end\n    \n    alt Room or worldId not found\n        RE->>RT: logger.warn(\"Room or world ID not found\")\n        RE-->>RE: Return early (skip fact saving)\n    else Room and worldId found\n        RE->>RT: ensureConnection({entityId, roomId, worldId, name, source})\n        RT->>DB: Check if entity exists\n        alt Entity does not exist\n            DB-->>RT: Entity not found\n            RT->>DB: Create entity\n            DB-->>RT: Entity created\n        else Entity exists\n            DB-->>RT: Entity found\n            RT->>DB: Update entity metadata\n            DB-->>RT: Entity updated\n        end\n        RT-->>RE: Connection ensured\n        \n        loop For each new fact\n            RE->>RT: createMemory(factMemory, 'facts', true)\n            RT->>DB: Insert fact into facts table\n            DB-->>RT: Return memory ID\n            RT-->>RE: Return memory ID\n            RE->>RT: queueEmbeddingGeneration(memory, 'low')\n            RT-->>RE: Queued\n        end\n        \n        loop For each relationship\n            alt Relationship exists\n                RE->>RT: updateRelationship({...existingRelationship, updated tags/metadata})\n                RT->>DB: Update relationship\n                DB-->>RT: Updated\n            else New relationship\n                RE->>RT: createRelationship({sourceEntityId, targetEntityId, tags, metadata})\n                RT->>DB: Insert relationship\n                DB-->>RT: Created\n            end\n        end\n        \n        RE->>RT: setCache(reflection-last-processed, messageId)\n        RT-->>RE: Cache set\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-17T08:12:46Z",
      "mergedAt": null,
      "additions": 159,
      "deletions": 2
    },
    {
      "id": "PR_kwDOMT5cIs69w0n0",
      "title": "feat: add unregisterAction method to core runtime",
      "author": "YuriNachos",
      "number": 6375,
      "body": "This PR adds the `unregisterAction` method to the `AgentRuntime` class, addressing #5697.\n\n## Summary\n\nAdds the ability to dynamically remove actions from the runtime at runtime.\n\n## Changes\n\n- Added `unregisterAction(actionName: string): boolean` method to `AgentRuntime` class\n- Added type definition to `IAgentRuntime` interface\n- Added comprehensive test coverage including:\n  - Successful unregistration\n  - Unregistering non-existent actions\n  - Multiple action management\n\n## Method Behavior\n\nThe method:\n- Searches for an action by name in the actions array\n- Removes it if found\n- Logs the operation for debugging\n- Returns `true` if successful, `false` if action not found\n\n## Use Cases\n\n- Hot-reloading plugin configurations\n- Dynamically managing available actions\n- Testing and development scenarios\n\n## Testing\n\nAll existing tests pass (54 pass, 0 fail).\n\nCloses #5697\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nAdded `unregisterAction` method to `AgentRuntime` class to enable dynamic removal of actions at runtime.\n\n- Implemented `unregisterAction(actionName: string): boolean` method in `AgentRuntime` class\n- Added method signature to `IAgentRuntime` interface for type safety\n- Included comprehensive test coverage for successful unregistration, non-existent actions, and multiple action scenarios\n- Method follows existing patterns with proper logging (debug on success, warn on not found)\n- Returns boolean to indicate success/failure, consistent with good API design\n\n<h3>Confidence Score: 5/5</h3>\n\n\n- This PR is safe to merge with minimal risk\n- The implementation is straightforward, follows existing code patterns precisely (mirrors `registerAction` structure), includes comprehensive test coverage, has proper error handling and logging, and introduces no breaking changes. The method signature is correctly added to the interface, ensuring type safety across the codebase.\n- No files require special attention\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/core/src/runtime.ts | Added `unregisterAction` method with proper logging and boolean return value |\n| packages/core/src/types/runtime.ts | Added `unregisterAction` method signature to `IAgentRuntime` interface |\n| packages/core/src/__tests__/runtime.test.ts | Added comprehensive tests for `unregisterAction` covering success, failure, and multiple actions |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant Runtime as AgentRuntime\n    participant Actions as actions[]\n    participant Logger\n\n    User->>Runtime: unregisterAction(\"actionName\")\n    Runtime->>Actions: findIndex(action.name === \"actionName\")\n    \n    alt Action found (index !== -1)\n        Actions-->>Runtime: return index\n        Runtime->>Actions: splice(index, 1)\n        Runtime->>Logger: debug(\"Action unregistered\")\n        Runtime-->>User: return true\n    else Action not found (index === -1)\n        Actions-->>Runtime: return -1\n        Runtime->>Logger: warn(\"Action not found\")\n        Runtime-->>User: return false\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-17T10:10:18Z",
      "mergedAt": null,
      "additions": 48,
      "deletions": 0
    }
  ],
  "codeChanges": {
    "additions": 0,
    "deletions": 0,
    "files": 0,
    "commitCount": 18
  },
  "completedItems": [],
  "topContributors": [
    {
      "username": "odilitime",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16395496?u=c9bac48e632aae594a0d85aaf9e9c9c69b674d8b&v=4",
      "totalScore": 43.7437738965761,
      "prScore": 43.5437738965761,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": "odilitime: Focused on significant feature development and bug fixes, contributing to the \"V2.0.0: dynamic execution engine\" in elizaos/eliza via PR #6384, which involved substantial code changes across 37 files (+3855/-499 lines) and 13 commits, primarily in code files."
    },
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 31.938,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 31.5,
      "commentScore": 0.43799999999999994,
      "summary": "standujar: Focused on bugfix work, modifying 238 files with 5 commits, and provided 6 reviews, including 3 change requests, and 7 PR comments."
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 4.5,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 4.5,
      "commentScore": 0,
      "summary": "greptile-apps: No activity today."
    }
  ],
  "newPRs": 1,
  "mergedPRs": 0,
  "newIssues": 0,
  "closedIssues": 1,
  "activeContributors": 6
}