{
  "interval": {
    "intervalStart": "2025-09-25T00:00:00.000Z",
    "intervalEnd": "2025-09-26T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2025-09-25 to 2025-09-26, elizaos/eliza had 4 new PRs (0 merged), 2 new issues, and 6 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7I-3_W",
      "title": "Refactor Eliza CLI",
      "author": "borisudovicic",
      "number": 5860,
      "repository": "elizaos/eliza",
      "body": "### **Summary**\n\nThe current CLI is overly complex and duplicates logic that should live inside project directories. Instead of bootstrapping AgentServer inside the CLI, we should streamline it to handle only configuration and delegate execution to the project’s runtime.\n\n### **Problem**\n\n* **Duplication of logic:** Both the CLI and project code (e.g. project-starter/src/index.ts) contain overlapping runner and module management logic .\n* **Code-first gap:** Without a true code-first Eliza, the CLI has taken on responsibilities (e.g. instantiating AgentServer) that should belong to projects.\n* **Unnecessary coupling:** Bootstrapping agents directly from the CLI makes it harder to reason about project boundaries and introduces complexity in maintaining two runtimes.\n* **Developer UX:** For new users, this creates confusion about where to put logic and increases friction.\n\n### **Proposal**\n\n* **CLI responsibilities:**\n  * Manage environment and char.json configuration (via env and config commands).\n  * Provide a clean interface for project creation (elizaos create) .\n  * Delegate execution to project scripts (bun run build, bun run start) rather than running agents directly.\n* **Project responsibilities:**\n  * Own all logic for AgentServer instantiation (directly in project-starter/src/index.ts).\n  * Expose a clear entry point (start/dev) that the CLI calls into.\n  * Keep all runtime and module complexity contained in project code.",
      "createdAt": "2025-09-01T09:20:11Z",
      "closedAt": "2025-09-25T04:30:06Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7NZ5mA",
      "title": "zod/v4 not loading in 1.5.10 (causing several plugins to fail)",
      "author": "harperaa",
      "number": 5995,
      "repository": "elizaos/eliza",
      "body": "**Describe the bug**\n\nI updated to 1.5.10 and now several plugins wont load.\n\n**To Reproduce**\n\nelizaos update\nbun run build\nLOG_LEVEL=debug elizaos start\n\n...\n...\nAgentServer is listening on port 3000\n Info       [SUCCESS] REST API bound to 0.0.0.0:3000. If running locally, access it at http://localhost:3000.\n Debug      Active agents: 0\n Debug      Loading ElizaOS plugin: @elizaos/plugin-sql (7 strategies)\n Info       [SUCCESS] Successfully loaded plugin '@elizaos/plugin-sql' using direct path (@elizaos/plugin-sql)\n Debug      Loading ElizaOS plugin: @elizaos/plugin-anthropic (7 strategies)\n Info       [SUCCESS] Successfully loaded plugin '@elizaos/plugin-anthropic' using direct path (@elizaos/plugin-anthropic)\n Debug      Loading ElizaOS plugin: @elizaos/plugin-openrouter (7 strategies)\n Debug      Import failed using direct path ('@elizaos/plugin-openrouter'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/node_modules/ai/dist/index.mjs'\n Debug      Import failed using local node_modules ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider-utils/dist/index.js'\n Debug      Global node_modules directory not found at /root/.bun/lib/node_modules/@elizaos, skipping for @elizaos/plugin-openrouter\n Debug      Import failed using package.json entry (dist/node/index.node.js) ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/node/index.node.js'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/node_modules/ai/dist/index.mjs'\n Debug      Import failed using common dist pattern ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/index.js'): error: Cannot find module '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/index.js' from '/root/nimi-ai/node_modules/@elizaos/cli/dist/index.js'\n Warn       Failed to load plugin module '@elizaos/plugin-openrouter' using all relevant strategies.\n Info       Plugin @elizaos/plugin-openrouter not available, installing...\n Debug      Installing plugin: @elizaos/plugin-openrouter\n Debug      [bunExec] Executing: bun \"add\" \"@elizaos/plugin-openrouter@1.5.10\"\n Debug      Loading ElizaOS plugin: @elizaos/plugin-openrouter (7 strategies)\n Debug      Import failed using direct path ('@elizaos/plugin-openrouter'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/node_modules/ai/dist/index.mjs'\n Debug      Import failed using local node_modules ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider-utils/dist/index.js'\n Debug      Global node_modules directory not found at /root/.bun/lib/node_modules/@elizaos, skipping for @elizaos/plugin-openrouter\n Debug      Import failed using package.json entry (dist/node/index.node.js) ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/node/index.node.js'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/node_modules/ai/dist/index.mjs'\n Debug      Import failed using common dist pattern ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/index.js'): error: Cannot find module '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/index.js' from '/root/nimi-ai/node_modules/@elizaos/cli/dist/index.js'\n Warn       Failed to load plugin module '@elizaos/plugin-openrouter' using all relevant strategies.\n Warn       Plugin @elizaos/plugin-openrouter installed from npm with potential GitHub fallback but could not be loaded/verified.\n Debug      Loading ElizaOS plugin: @elizaos/plugin-openrouter (7 strategies)\n Debug      Import failed using direct path ('@elizaos/plugin-openrouter'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/node_modules/ai/dist/index.mjs'\n Debug      Import failed using local node_modules ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider-utils/dist/index.js'\n Debug      Global node_modules directory not found at /root/.bun/lib/node_modules/@elizaos, skipping for @elizaos/plugin-openrouter\n Debug      Import failed using package.json entry (dist/node/index.node.js) ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/node/index.node.js'): error: Cannot find module 'zod/v4' from '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/node_modules/ai/dist/index.mjs'\n Debug      Import failed using common dist pattern ('/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/index.js'): error: Cannot find module '/root/nimi-ai/node_modules/@elizaos/plugin-openrouter/dist/index.js' from '/root/nimi-ai/node_modules/@elizaos/cli/dist/index.js'\n Warn       Failed to load plugin module '@elizaos/plugin-openrouter' using all relevant strategies.\n Error      Failed to load module for plugin @elizaos/plugin-openrouter.\n... \n**Expected behavior**\n\nExpecting the plugins to load, as they did before... when in debug mode, can see that zod/v4 is not loading.\n",
      "createdAt": "2025-09-23T17:32:38Z",
      "closedAt": "2025-09-25T04:19:50Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7N3ORS",
      "title": "Unhandled exception when getAgents() fails in runtime.ts (missing agents table)",
      "author": "digitalsimboja",
      "number": 6003,
      "repository": "elizaos/eliza",
      "body": "**Describe the bug**\n\nWhen initializing `AgentRuntime`, the following code in `runtime.ts`:\n`tsthis.agent = await this.adapter.getAgent(this.character.id);`\n\nthrows an unhandled exception if:\n - the agents table does not exist (e.g. migrations incomplete), or\n - character.id is missing/undefined.\n\nThis prevents runtime startup and crashes the process.\n\n\n\n**To Reproduce**\n\nRun AgentRuntime with a new Postgres database where the agents table has not been created.\nOr, start with a character config missing an id field.\nObserve the runtime crash with getAgent error.\n\n**Expected behavior**\nIf getAgent() fails due to a missing record, the runtime should gracefully create the agent with createAgent().\nIf character.id is missing, a clear error should be logged, not an unhandled exception.\n\n**Screenshots**\nN/A but here are the logs\n```\nDatabase operation failed (attempt 1/3): Failed query: select \"id\", \"name\", \"bio\" from \"agents\"\n2025-09-25 14:53:12 params: , nextRetryIn: 1.9s\n2025-09-25 14:53:14  Warn       Database operation failed (attempt 2/3): Failed query: select \"id\", \"name\", \"bio\" from \"agents\"\n2025-09-25 14:53:14 params: , nextRetryIn: 2.8s\n2025-09-25 14:53:17  Error      Max retry attempts reached: Failed query: select \"id\", \"name\", \"bio\" from \"agents\"\n2025-09-25 14:53:17 params: , totalAttempts: 3\n```\n\n**Additional context**\nProposed fix is to wrap getAgent() in a try/catch and fall back to createAgent() where possible.",
      "createdAt": "2025-09-25T14:04:41Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7NzHXv",
      "title": "Migrate All Dependencies and Plugins to Zod v4",
      "author": "borisudovicic",
      "number": 5999,
      "repository": "elizaos/eliza",
      "body": "We need to migrate the Eliza monorepo and all plugins from Zod v3 to Zod v4.\n\n* Stan has already initiated \\~20–25 PRs across referenced plugins to bump dependencies (core, bootstrap, langchain/ai/vercel, etc.) to the latest compatible Zod v4 versions.\n* Some plugins currently have mismatched peer dependencies; migration only works if all packages are upgraded consistently.\n* Newer versions of the AI SDK also rely on Zod v4, so all LLM plugins must be updated to the latest ai-sdk.\n\nThis migration is a blocking dependency upgrade: partial migration causes runtime and type errors. We need a coordinated effort to upgrade and test the full set of \\~40 plugins.\n\nAcceptance Criteria:\n\n* Update package.json in all monorepo packages to depend on zod@^4.\n* Update all plugins (bootstrap, sql, LLM plugins, etc.) to use Zod v4 schemas.\n* Resolve peer dependency mismatches across packages.\n* Upgrade all AI SDK–based packages to versions that use Zod v4.",
      "createdAt": "2025-09-25T09:15:09Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs6qfHDP",
      "title": "refactor(core): make runtime initialization idempotent and improve service registration coordination",
      "author": "tcm390",
      "number": 6001,
      "body": "## Problem\r\n\r\nPreviously, we had two separate but related requirements:\r\n\r\n1. **Services need to wait for embedding model** - Services (like Twitter plugin) must wait for embedding model availability, otherwise the app would crash\r\n2. **Contributors wanted to register plugins after runtime startup** - This required distinguishing between initial registration vs. post-startup registration\r\n\r\nThe solution was:\r\n- **Service queue (`servicesInitQueue`)** - Services were queued and only registered after embedding model was ready\r\n- **`isInitialized` flag** - Used to distinguish: if runtime is initialized, register service immediately; otherwise, push to queue for later registration\r\n\r\nHowever, this approach had several issues:\r\n- Complex queue management that was hard to reason about\r\n- Brittle initialization guards that prevented multiple `initialize()` calls  \r\n- Race conditions between embedding model setup and service registration\r\n- Unclear coordination between initialization phases\r\n\r\n## Solution\r\n\r\nThis PR refactors the initialization system to be **idempotent** and **coordination-based**:\r\n\r\n### Idempotent Operations\r\n- `adapter.init()` now checks `isReady()` before initializing\r\n- `runPluginMigrations()` tracks completed migrations to avoid re-running\r\n- `registerService()` skips if service already exists\r\n- `initialize()` can now be called multiple times safely\r\n\r\n### Improved Service Coordination\r\n- **Removed service queue complexity** - services register immediately during plugin registration\r\n- **Added embedding model promise** - `ensureEmbeddingModelReady()` coordinates embedding availability\r\n- **Services automatically wait** for embedding model before starting via `await this.ensureEmbeddingModelReady()`\r\n- **Better dependency management** - clear async coordination instead of initialization flags\r\n\r\n### Cleanup\r\n- Removed unused `initPromise`/`initResolver` pattern\r\n- Removed `isInitialized` flag and `servicesInitQueue`\r\n- Simplified runtime lifecycle management\r\n\r\n## Benefits\r\n\r\n- ✅ **Robust**: `initialize()` can be called multiple times safely\r\n- ✅ **Cleaner**: Each operation manages its own preconditions  \r\n- ✅ **Better coordination**: Services properly wait for embedding model readiness\r\n- ✅ **Maintainable**: Less complex state management\r\n- ✅ **Backward compatible**: Same external API behavior\r\n\r\n## Testing\r\n\r\n- All existing initialization flows continue to work\r\n- Services still wait for embedding model availability as intended\r\n- Multiple `initialize()` calls are now safe and efficient\r\n\r\n## Technical Details\r\n\r\n### Before\r\n```typescript\r\n// Complex initialization guard\r\nif (this.isInitialized) {\r\n  this.logger.warn('Agent already initialized');\r\n  return;\r\n}\r\n\r\n// Service queueing system based on initialization state\r\nif (this.isInitialized) {\r\n  // Runtime already started - register immediately\r\n  await this.registerService(service);\r\n} else {\r\n  // Runtime not started yet - queue for later (after embedding model ready)\r\n  this.servicesInitQueue.add(service);\r\n}\r\n```\r\n\r\n### After\r\n```typescript\r\n// Idempotent operations\r\nif (!(await this.adapter.isReady())) {\r\n  await this.adapter.init();\r\n}\r\n\r\n// Direct service registration with coordination\r\nawait this.ensureEmbeddingModelReady();\r\nconst serviceInstance = await serviceDef.start(this);\r\n```\r\n\r\nThis maintains the original contributor's intent (plugin registration after init) while properly handling embedding model coordination to prevent crashes, making the system more robust and maintainable.\r\n",
      "repository": "elizaos/eliza",
      "createdAt": "2025-09-25T11:25:15Z",
      "mergedAt": null,
      "additions": 65,
      "deletions": 32
    },
    {
      "id": "PR_kwDOMT5cIs6qg0ou",
      "title": "refactor(core): replace service initialization queue with embedding model promise",
      "author": "tcm390",
      "number": 6002,
      "body": "## Problem Statement\r\n\r\nPreviously, we had two separate but related requirements:\r\n\r\n1. **Services need to wait for embedding model** - Services (like Twitter plugin) must wait for embedding model availability, otherwise the app would crash\r\n2. **Contributors wanted to register plugins after runtime startup** - This required distinguishing between initial registration vs. post-startup registration\r\n\r\nThe solution was:\r\n\r\n- **Service queue (servicesInitQueue)** - Services were queued and only registered after embedding model was ready\r\n- **isInitialized flag** - Used to distinguish: if runtime is initialized, register service immediately; otherwise, push to queue for later registration\r\n\r\nHowever, this approach had several issues:\r\n\r\n### Issues with the Previous Approach\r\n- Complex queue management that was hard to reason about\r\n- Brittle initialization guards that prevented multiple `initialize()` calls\r\n- Unclear coordination between initialization phases\r\n\r\n## Solution\r\n\r\nThis PR replaces the complex queue system with a much cleaner **embedding model promise** approach:\r\n\r\n### Key Changes\r\n\r\n#### 1. **Embedding Model Promise System**\r\n```typescript\r\n// Add embedding promise that resolves when TEXT_EMBEDDING model is available\r\nprivate embeddingModelPromise: Promise<void>;\r\nprivate embeddingModelResolver: (() => void) | undefined;\r\n\r\n// All services wait for this promise\r\nawait this.embeddingModelPromise;\r\n```\r\n\r\n#### 2. **Removed Queue Complexity**\r\n- ❌ Removed `servicesInitQueue`\r\n- ❌ Removed `isInitialized` flag\r\n- ❌ Removed queue processing logic\r\n- ❌ Removed `initPromise` and `initResolver`\r\n\r\n#### 3. **Made Operations Idempotent**\r\n- ✅ `initialize()` can be called multiple times safely\r\n- ✅ `registerPlugin()` checks for existing plugins\r\n- ✅ `runPluginMigrations()` tracks completed migrations\r\n- ✅ `adapter.init()` checks if already ready\r\n\r\n#### 4. **Simplified Service Registration**\r\n```typescript\r\n// Before: Complex queue logic\r\nif (this.isInitialized) {\r\n  await this.registerService(service);\r\n} else {\r\n  this.servicesInitQueue.add(service);\r\n}\r\n\r\n// After: Simple promise-based waiting\r\nawait this.embeddingModelPromise; // All services wait here\r\nconst serviceInstance = await serviceDef.start(this);\r\n```\r\n\r\n#### 5. **Automatic Dependency Resolution**\r\n- Services automatically wait for embedding model regardless of plugin load order\r\n- Promise resolves when `TEXT_EMBEDDING` model is registered by any plugin\r\n- No manual queue management needed\r\n\r\n\r\n## Technical Details\r\n\r\n### Promise Resolution Flow\r\n```mermaid\r\ngraph TD\r\n    A[Plugin Registration] --> B{TEXT_EMBEDDING model registered?}\r\n    B -->|Yes| C[Resolve embeddingModelPromise]\r\n    B -->|No| D[Continue with other plugins]\r\n    D --> E[OpenAI Plugin loads]\r\n    E --> F[Registers TEXT_EMBEDDING model]\r\n    F --> C\r\n    C --> G[All waiting services proceed]\r\n    G --> H[Services start successfully]\r\n```\r\n\r\n## Testing\r\n\r\n- ✅ Created test service to validate cross-plugin dependencies\r\n- ✅ Verified plugin loading order independence\r\n- ✅ Tested idempotent operations\r\n- ✅ Confirmed backward compatibility\r\n\r\n\r\n",
      "repository": "elizaos/eliza",
      "createdAt": "2025-09-25T13:41:35Z",
      "mergedAt": null,
      "additions": 43,
      "deletions": 26
    },
    {
      "id": "PR_kwDOMT5cIs6qjTGU",
      "title": "refactor(core): make runtime initialization idempotent and improve service registration coordination",
      "author": "tcm390",
      "number": 6004,
      "body": "# Core Cleanup: Remove legacy service initialization code\r\n\r\n## Problem Statement\r\n\r\nPart of Core Cleanup #5911:\r\n- Remove legacy code paths (double-inits, redundant type guards)\r\n- Audit and refactor type definitions across runtime\r\n- Clean up redundant initialization patterns\r\n\r\nPreviously, we had two separate but related requirements:\r\n\r\n1. **Services need to wait for embedding model** - Services (like Twitter plugin) must wait for embedding model availability, otherwise the app would crash\r\n2. **Contributors wanted to register plugins after runtime startup** - This required distinguishing between initial registration vs. post-startup registration\r\n\r\nThe solution was:\r\n- **Service queue (`servicesInitQueue`)** - Services were queued and only registered after embedding model was ready\r\n- **`isInitialized` flag** - Used to distinguish: if runtime is initialized, register service immediately; otherwise, push to queue for later registration\r\n\r\n## Solution\r\n\r\nClean up legacy initialization patterns and make operations idempotent:\r\n\r\n- **Remove redundant `isInitialized` flag** - Legacy double-init protection\r\n- **Remove `servicesInitQueue`** - Simplify to direct promise-based waiting\r\n- **Add proper type annotation** - `initPromise: Promise<void>`\r\n- **Make operations idempotent** - Prevent duplicate migrations and adapter init\r\n- **Simplify service registration** - Services wait for `initPromise` directly\r\n\r\n## Key Changes\r\n\r\n- Remove legacy `isInitialized` flag and associated guard logic\r\n- Remove `servicesInitQueue` - services now wait for `initPromise` directly  \r\n- Add proper TypeScript typing for `initPromise`\r\n- Make `adapter.init()` and `runPluginMigrations()` idempotent\r\n- Add migration tracking with `migratedPlugins` set\r\n\r\n## Files Changed\r\n\r\n- `packages/core/src/runtime.ts` - Legacy code cleanup and type improvements",
      "repository": "elizaos/eliza",
      "createdAt": "2025-09-25T16:59:26Z",
      "mergedAt": null,
      "additions": 27,
      "deletions": 19
    },
    {
      "id": "PR_kwDOMT5cIs6qe-Lf",
      "title": "docs: fix typo",
      "author": "viktorking7",
      "number": 6000,
      "body": "Occassionally -> Occasionally\r\n\r\n\r\n",
      "repository": "elizaos/eliza",
      "createdAt": "2025-09-25T11:12:13Z",
      "mergedAt": null,
      "additions": 1,
      "deletions": 1
    }
  ],
  "codeChanges": {
    "additions": 0,
    "deletions": 0,
    "files": 0,
    "commitCount": 12
  },
  "completedItems": [],
  "topContributors": [
    {
      "username": "tcm390",
      "avatarUrl": "https://avatars.githubusercontent.com/u/60634884?u=c6c41679b8322eaa0c81f72e0b4ed95e80f0ac16&v=4",
      "totalScore": 43.29080516121499,
      "prScore": 43.29080516121499,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "viktorking7",
      "avatarUrl": "https://avatars.githubusercontent.com/u/140458814?u=9822a819c8ca631b27e2507dac20c9298e85b52b&v=4",
      "totalScore": 4.654306144334055,
      "prScore": 4.654306144334055,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "digitalsimboja",
      "avatarUrl": "https://avatars.githubusercontent.com/u/32062279?u=11064631ad3e24d807602060c6a444827aaf9b32&v=4",
      "totalScore": 2.2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "borisudovicic",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31806472?u=8935f4d43fd7e4eb9bf5ff92d54d4d2f8ac8a786&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    }
  ],
  "newPRs": 4,
  "mergedPRs": 0,
  "newIssues": 2,
  "closedIssues": 2,
  "activeContributors": 6
}