{
  "interval": {
    "intervalStart": "2026-01-17T00:00:00.000Z",
    "intervalEnd": "2026-01-18T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-01-17 to 2026-01-18, elizaos/eliza had 10 new PRs (0 merged), 2 new issues, and 5 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7jNLxv",
      "title": "\"Reflection evaluator fails with 'Entity not found' - UPDATE_CONTACT requires entity initialization\"",
      "author": "thewoweffect",
      "number": 6364,
      "repository": "elizaos/eliza",
      "body": "\nVersion: 1.7.1\nError: UPDATE_CONTACT fails with \"Entity not found\"\nCause: ensureConnection() is not called before saving facts\nLogs: afterSplice values + \"No ownership data found for world\"\nProposed fix: // V reflection.ts před UPDATE_CONTACT\nawait runtime.ensureConnection({\n  entityId, roomId, userName, name, worldId, source\n});\n",
      "createdAt": "2026-01-14T07:10:02Z",
      "closedAt": "2026-01-17T06:31:52Z",
      "state": "CLOSED",
      "commentCount": 1
    },
    {
      "id": "I_kwDOMT5cIs7kBiUr",
      "title": "Eliminate 500 character limit in first app prompt",
      "author": "borisudovicic",
      "number": 6381,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2026-01-17T18:13:07Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    },
    {
      "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_kwDOMT5cIs69wZLY",
      "title": "fix: load .env files in agent commands for authentication",
      "author": "YuriNachos",
      "number": 6374,
      "body": "## Summary\n- Fixes authentication failures in `elizaos agent` commands when connecting to servers with `ELIZA_SERVER_AUTH_TOKEN` set\n- Adds `.env` file loading to CLI agent commands\n- Ensures consistency with `elizaos start` command behavior\n\n## Problem\nThe `elizaos agent` commands were not loading `.env` files, which caused authentication failures when connecting to servers that have `ELIZA_SERVER_AUTH_TOKEN` configured. The error was: \"Unauthorized access attempt: Missing or invalid X-API-KEY from 127.0.0.1\"\n\nThe `elizaos start` command already loads `.env` files, but agent commands did not, creating inconsistent behavior.\n\n## Solution\nAdded `.env` file loading to:\n- `createApiClientConfig()` function\n- `getAuthHeaders()` function\n\nBoth functions now call `loadEnvFilesWithPrecedence()` before checking for `ELIZA_SERVER_AUTH_TOKEN`, ensuring environment variables from `.env` files are available.\n\n## Changes\n- `packages/cli/src/commands/shared/auth-utils.ts`: Added `.env` file loading to authentication functions\n\nNow users can store `ELIZA_SERVER_AUTH_TOKEN` in their `.env` files and agent commands will automatically use it when connecting to remote servers.\n\nFixes #5707\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 authentication failures in `elizaos agent` commands by adding `.env` file loading to authentication utilities. When `ELIZA_SERVER_AUTH_TOKEN` is stored in `.env` files, it's now properly loaded before checking environment variables, ensuring consistency with the `elizaos start` command.\n\n**Key changes:**\n- Added `.env` file loading to `getAuthHeaders()` and `createApiClientConfig()` functions in auth-utils.ts\n- Added `unregisterAction()` method to core runtime with full test coverage\n- Fixed action callback handling in multi-step mode to properly forward callbacks to users\n- Added entity connection validation in reflection evaluator to prevent database constraint violations\n- Minor code quality improvement: changed `fact != null` to `fact !== null` for strict equality\n\n<h3>Confidence Score: 4/5</h3>\n\n\n- Safe to merge with minor performance consideration\n- The changes are well-tested and solve real issues. The main concern is the repeated `.env` file loading on each function call could impact performance for commands that make multiple API calls. Otherwise, all changes follow project patterns and include appropriate test coverage.\n- packages/cli/src/commands/shared/auth-utils.ts - consider adding caching to avoid repeated file I/O\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/cli/src/commands/shared/auth-utils.ts | Added `.env` file loading to authentication functions to fix missing auth token issue for agent commands |\n| packages/core/src/runtime.ts | Added `unregisterAction` method to allow removing actions from runtime |\n| packages/plugin-bootstrap/src/evaluators/reflection.ts | Added entity connection validation before saving facts to prevent database constraint violations |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant CLI as elizaos CLI\n    participant AuthUtils as auth-utils.ts\n    participant EnvLoader as loadEnvFilesWithPrecedence\n    participant Server as ElizaOS Server\n    \n    User->>CLI: elizaos agent get <name>\n    CLI->>AuthUtils: createApiClientConfig(opts)\n    AuthUtils->>EnvLoader: loadEnvVars()\n    EnvLoader->>EnvLoader: Read .env files from disk\n    EnvLoader-->>AuthUtils: Environment vars loaded\n    AuthUtils->>AuthUtils: Check opts.authToken || process.env.ELIZA_SERVER_AUTH_TOKEN\n    AuthUtils-->>CLI: ApiClientConfig with auth token\n    CLI->>Server: GET /agents/:id with X-API-KEY header\n    Server->>Server: Validate X-API-KEY\n    Server-->>CLI: Agent data\n    CLI-->>User: Display agent info\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-17T08:14:12Z",
      "mergedAt": null,
      "additions": 237,
      "deletions": 3
    },
    {
      "id": "PR_kwDOMT5cIs69wYZ8",
      "title": "fix(plugin-bootstrap): ensure entity connection before saving facts in reflection evaluator",
      "author": "YuriNachos",
      "number": 6370,
      "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\n- Fixes \"Entity not found\" errors in reflection evaluator by adding room lookup and `ensureConnection()` call before saving facts to ensure proper database entity initialization\n- Implements unregister functionality for actions with new `unregisterAction` method in AgentRuntime interface and implementation with proper validation and logging\n- Enhances environment variable loading in CLI auth utilities to ensure `.env` files are consistently loaded across commands and improves action callback handling in message service to prevent double-calling\n\n<h3>Important Files Changed</h3>\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-bootstrap/src/evaluators/reflection.ts | Fixed entity connection issue by adding room lookup and ensureConnection() before saving facts |\n| packages/core/src/runtime.ts | Added unregisterAction method to complement existing registerAction functionality |\n| packages/core/src/services/default-message-service.ts | Added flag to prevent double-calling of action callbacks in multi-step processing |\n| packages/plugin-bootstrap/src/__tests__/reflection-entity-connection.test.ts | New test file with incomplete coverage and potential mock conflicts |\n\n<h3>Confidence score: 3/5</h3>\n\n\n- This PR contains multiple unrelated changes that appear to address different issues beyond the stated reflection evaluator fix, indicating scope creep\n- Score lowered due to incomplete test coverage, potential mock conflicts in the new test file, and disconnect between PR description and several changes (unregisterAction, auth utilities)\n- Pay close attention to the test file which has mock restoration conflicts and the message service changes that may affect callback behavior\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Runtime as AgentRuntime\n    participant Evaluator as ReflectionEvaluator\n    participant Model as LLM Model\n    participant DB as Database\n\n    Runtime->>Evaluator: evaluate(message, state)\n    \n    Evaluator->>Evaluator: validate(message)\n    Note over Evaluator: Check if enough messages<br/>since last reflection\n    \n    Evaluator->>DB: getRelationships(entityId)\n    Evaluator->>DB: getEntityDetails(roomId)\n    Evaluator->>DB: getMemories(\"facts\", roomId)\n    \n    Evaluator->>Evaluator: composePrompt(state, template)\n    \n    Evaluator->>Model: useModel(\"TEXT_SMALL\", prompt)\n    Model-->>Evaluator: XML response with facts/relationships\n    \n    Evaluator->>Evaluator: parseKeyValueXml(response)\n    \n    Evaluator->>Runtime: getRoom(roomId)\n    Runtime-->>Evaluator: room with worldId\n    \n    Evaluator->>Runtime: ensureConnection(entityId, roomId, worldId)\n    \n    loop For each new fact\n        Evaluator->>Runtime: createMemory(factMemory, \"facts\")\n        Runtime-->>Evaluator: memoryId\n        Evaluator->>Runtime: queueEmbeddingGeneration(memory)\n    end\n    \n    loop For each relationship\n        Evaluator->>Evaluator: resolveEntity(sourceId, entities)\n        Evaluator->>Evaluator: resolveEntity(targetId, entities)\n        alt Existing relationship\n            Evaluator->>Runtime: updateRelationship(relationship)\n        else New relationship\n            Evaluator->>Runtime: createRelationship(relationship)\n        end\n    end\n    \n    Evaluator->>Runtime: setCache(lastProcessedMessageId)\n```\n\n<!-- greptile_other_comments_section -->\n\n**Context used:**\n\n- Context from `dashboard` - CLAUDE.md ([source](https://app.greptile.com/review/custom-context?memory=8ef4c9a3-e221-4aef-8556-8c9b88bf6bbb))\n- Context from `dashboard` - .cursorrules ([source](https://app.greptile.com/review/custom-context?memory=00074882-001f-44b1-89c4-859ed3656db9))\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-17T08:12:10Z",
      "mergedAt": null,
      "additions": 237,
      "deletions": 3
    },
    {
      "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_kwDOMT5cIs69wY0l",
      "title": "feat: add unregisterAction method to core runtime",
      "author": "YuriNachos",
      "number": 6372,
      "body": "## Summary\n- Adds ability to unregister actions from the runtime\n- Implements `unregisterAction` method using array mutation (splice)\n- Adds comprehensive test coverage for unregister functionality\n\n## Problem\nThere was no way to remove actions from the runtime once they were registered. This made it impossible to dynamically manage actions during runtime.\n\n## Solution\nAdded `unregisterAction(actionName: string): boolean` method to:\n- `IAgentRuntime` interface in `packages/core/src/types/runtime.ts`\n- Runtime implementation in `packages/core/src/runtime.ts`\n- Test coverage in `packages/core/src/__tests__/runtime.test.ts`\n\nThe implementation uses `splice()` to modify the readonly array in-place, avoiding TypeScript errors while maintaining readonly semantics for external consumers.\n\n## Changes\n- `packages/core/src/types/runtime.ts`: Added `unregisterAction` method signature\n- `packages/core/src/runtime.ts`: Implemented `unregisterAction` using array mutation\n- `packages/core/src/__tests__/runtime.test.ts`: Added 3 test cases\n\nFixes #5697\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 adds the ability to dynamically unregister actions from the runtime, addressing issue #5697. The implementation includes a new `unregisterAction` method that removes actions by name and returns a boolean indicating success. The PR also includes an unrelated but beneficial fix to the reflection evaluator that ensures entity connections exist before saving facts, preventing potential database constraint violations.\n\n**Key Changes:**\n- Added `unregisterAction(actionName: string): boolean` to the `IAgentRuntime` interface\n- Implemented the method in `AgentRuntime` using `Array.splice()` with proper logging (debug on success, warn on not found)\n- Added 3 comprehensive test cases covering successful unregistration, non-existent action handling, and selective removal\n- Enhanced reflection evaluator to call `ensureConnection` before saving facts, with proper error handling\n- Added test coverage for the reflection evaluator entity connection logic\n- Changed null check from `!=` to `!==` for stricter equality (minor code quality improvement)\n\n**Implementation Quality:**\nThe `unregisterAction` implementation follows the project's patterns with appropriate logging and clean boolean return semantics. The use of `splice()` on the readonly array is acceptable as it maintains external immutability while allowing internal mutation. The test coverage is thorough and follows existing test patterns using `bun:test`.\n\n**Reflection Evaluator Enhancement:**\nThe plugin-bootstrap changes are marked as part of this PR but appear to be a separate logical fix (ensuring entity connections before fact persistence). This is a positive addition that prevents runtime errors, though it could have been a separate PR for clearer change tracking.\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, well-tested, and follows existing patterns in the codebase. The `unregisterAction` method uses standard array manipulation with proper error handling and logging. All 3 test cases pass and cover the main scenarios. The reflection evaluator enhancement is a defensive improvement that prevents potential database errors. No breaking changes or security concerns identified.\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/types/runtime.ts | Added `unregisterAction` method signature to `IAgentRuntime` interface, consistent with existing patterns |\n| packages/core/src/runtime.ts | Implemented `unregisterAction` method with proper logging and boolean return value indicating success/failure |\n| packages/core/src/__tests__/runtime.test.ts | Added comprehensive test coverage for unregister functionality with 3 test cases covering happy path, error case, and selective removal |\n| packages/plugin-bootstrap/src/evaluators/reflection.ts | Enhanced reflection evaluator to ensure entity connections before saving facts, preventing database constraint violations |\n| packages/plugin-bootstrap/src/__tests__/reflection-entity-connection.test.ts | Added test coverage for reflection evaluator entity connection logic |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant Runtime\n    participant Actions Array\n    participant Logger\n\n    Note over Client,Logger: unregisterAction Flow\n\n    Client->>Runtime: unregisterAction(\"actionName\")\n    Runtime->>Actions Array: findIndex(a => a.name === \"actionName\")\n    \n    alt Action Found (index !== -1)\n        Actions Array-->>Runtime: return valid index\n        Runtime->>Actions Array: splice(index, 1)\n        Actions Array-->>Runtime: action removed\n        Runtime->>Logger: debug(\"Action unregistered\")\n        Runtime-->>Client: return true\n    else Action Not Found (index === -1)\n        Actions Array-->>Runtime: return -1\n        Runtime->>Logger: warn(\"Action not found, cannot unregister\")\n        Runtime-->>Client: return false\n    end\n\n    Note over Client,Logger: Reflection Evaluator Enhancement\n\n    participant Evaluator\n    participant State\n    participant RoomDB\n\n    Evaluator->>Runtime: Extract facts from AI response\n    Evaluator->>State: Get room from state?.data?.room\n    \n    alt Room not in state\n        Evaluator->>RoomDB: getRoom(roomId)\n        RoomDB-->>Evaluator: return room with worldId\n    end\n    \n    alt Room or worldId missing\n        Evaluator->>Logger: warn(\"Room or world ID not found\")\n        Evaluator-->>Evaluator: return early (skip fact save)\n    else Room and worldId exist\n        Evaluator->>Runtime: ensureConnection({entityId, roomId, worldId, ...})\n        alt Connection Success\n            Runtime-->>Evaluator: connection ensured\n            Evaluator->>Logger: debug(\"Entity connection ensured\")\n            Evaluator->>Runtime: createMemory(fact)\n            Runtime-->>Evaluator: fact saved\n        else Connection Failure\n            Runtime-->>Evaluator: throw error\n            Evaluator->>Logger: error(\"Failed to ensure entity connection\")\n            Evaluator-->>Evaluator: return early (skip fact save)\n        end\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-17T08:13:14Z",
      "mergedAt": null,
      "additions": 207,
      "deletions": 2
    },
    {
      "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
    }
  ],
  "codeChanges": {
    "additions": 0,
    "deletions": 0,
    "files": 0,
    "commitCount": 7
  },
  "completedItems": [],
  "topContributors": [
    {
      "username": "YuriNachos",
      "avatarUrl": "https://avatars.githubusercontent.com/u/19365375?u=35202bfa8350f028db180527a789e8dcb7576d42&v=4",
      "totalScore": 249.18435236903713,
      "prScore": 248.98435236903714,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": "YuriNachos: Focused on a broad range of improvements, opening 10 PRs across bug fixes, new features, and documentation, including addressing authentication in agent commands (elizaos/eliza#6376, elizaos/eliza#6374) and adding an `unregisterAction` method to the core runtime (elizaos/eliza#6375, elizaos/eliza#6372), demonstrating a primary focus on bug fixes and feature development."
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 18.2,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 18,
      "commentScore": 0.2,
      "summary": "greptile-apps: No activity today."
    },
    {
      "username": "Xayaan",
      "avatarUrl": "https://avatars.githubusercontent.com/u/5237930?u=7840b286463bde982c8af8f389e61e26a01328cb&v=4",
      "totalScore": 4,
      "prScore": 0,
      "issueScore": 4,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "Xayaan: Created one issue, elizaos/eliza#6380, to report a SQL error related to zero vector fallback."
    },
    {
      "username": "borisudovicic",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31806472?u=8935f4d43fd7e4eb9bf5ff92d54d4d2f8ac8a786&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "borisudovicic: Focused on product improvement by creating an issue in elizaos/eliza (#6381) to eliminate the 500-character limit in the first app prompt."
    },
    {
      "username": "madjin",
      "avatarUrl": "https://avatars.githubusercontent.com/u/32600939?u=cdcf89f44c7a50906c7a80d889efa85023af2049&v=4",
      "totalScore": 0.43799999999999994,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.43799999999999994,
      "summary": "madjin: No activity today."
    }
  ],
  "newPRs": 10,
  "mergedPRs": 0,
  "newIssues": 2,
  "closedIssues": 1,
  "activeContributors": 5
}