{
  "interval": {
    "intervalStart": "2026-01-11T00:00:00.000Z",
    "intervalEnd": "2026-01-18T00:00:00.000Z",
    "intervalType": "week"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-01-11 to 2026-01-18, elizaos/eliza had 19 new PRs (6 merged), 7 new issues, and 16 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": 2
    },
    {
      "id": "I_kwDOMT5cIs7gwUMG",
      "title": "Unslop Apps",
      "author": "borisudovicic",
      "number": 6299,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2025-12-30T17:02:05Z",
      "closedAt": "2026-01-12T16:38:43Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7h4Bvp",
      "title": "Apps promotion feature",
      "author": "samarth30",
      "number": 6341,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2026-01-07T17:01:55Z",
      "closedAt": "2026-01-13T00:24:06Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7h014o",
      "title": "Implement UPSERT patterns for database queries",
      "author": "linear",
      "number": 6335,
      "repository": "elizaos/eliza",
      "body": "* Replace check-then-insert with `onConflictDoNothing()` in `createMemory()`\n* Optimize `getEntitiesByIds()` to avoid cartesian product (default `includeComponents: true` for backward compat)\n* Check if/how we can add batch insert methods for entities and memories",
      "createdAt": "2026-01-07T13:16:21Z",
      "closedAt": "2026-01-11T17:39:00Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7h007k",
      "title": "Optimize runtime initialization",
      "author": "linear",
      "number": 6334,
      "repository": "elizaos/eliza",
      "body": "* Add missing `ensureWorldExists()` to `initialize()`\n* Remove double `getEntityById()` lookup\n* Check if we can parallelize independent operations (ensureAgent, ensureEmbedding, ensureWorld)\n* Check if can use UPSERT pattern for entity creation",
      "createdAt": "2026-01-07T13:15:24Z",
      "closedAt": "2026-01-11T17:39:00Z",
      "state": "CLOSED",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs680DbX",
      "title": "fix(v2.0.0): Python example testing & fixes",
      "author": "odilitime",
      "number": 6358,
      "body": "- Add Python quickstart documentation (docs/python-quickstart.md)\r\n- Fix chat example to include inmemorydb plugin for database support\r\n- Add dotenv loading to chat example for .env file support\r\n- Fix inmemorydb plugin to use proper Plugin class instead of dict\r\n- Fix inmemorydb adapter to accept params dict in get_memories()\r\n- Fix inmemorydb adapter to handle Pydantic models in create_memory/update_memory\r\n- Fix character provider to use getattr for optional attributes\r\n- Add get_available_actions() method to AgentRuntime\r\n- Add get_entity() alias method to AgentRuntime\r\n- Update get_memories() to accept keyword arguments\r\n\r\nThe Python port had issues because:\r\nPlugin export - was a dict instead of Plugin object\r\nMethod signatures - expected dicts but got Pydantic models\r\nNo type enforcement - Python doesn't catch these at compile time\r\nThe Rust type system prevents these bugs automatically. The Python fixes we made bring it to parity with the working Rust implementation.\r\n\r\n# Risks\r\n\r\nMedium\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\nFix examples/chat/python\r\n\r\n## What kind of change is this?\r\n\r\nBug fixes (non-breaking change which fixes an issue)\r\n\r\n## Why are we doing this? Any context or related work?\r\nReview\r\n\r\n# Documentation changes needed?\r\n\r\nmaybe\r\n\r\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Introduces true streaming and stabilizes Python runtime/plugins, plus major example and training additions.\n> \n> - Adds streaming text APIs: new `ModelType.TEXT_*_STREAM`, `AgentRuntime.use_model_stream()`/`register_streaming_model()`, and `DefaultMessageService.handle_message_stream()` with `StreamingMessageResult`\n> - OpenAI plugin implements streaming handlers; core exports updated to include streaming types\n> - Fixes `plugin-inmemorydb`: converted to proper `Plugin`, adapter now accepts `params`/kwargs, handles Pydantic models (camelCase keys), and corrects pagination/filters\n> - Hardens character provider to safely access optional fields via `getattr`\n> - AgentRuntime enhancements: `get_available_actions()`, `get_entity()` alias, `get_memories()` kwargs support\n> - A2A FastAPI server uses true token-by-token SSE streaming and includes `inmemorydb`; requirements updated\n> - Chat example loads `.env` and includes `inmemorydb` plugin\n> - ART Tic‑Tac‑Toe: adds heuristic agent, refines config (`opponent`, `ai_player`), winner/draw handling, and CLI updates\n> - New Atropos TextWorld package: environment/agents, trajectory + tokenizer tooling, offline data generation, BaseEnv factory, and CLI; README expanded\n> - Core Python README and example docs updated for setup and usage\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 21f8c31fc22b7778f998d85c754ee82a0a8e2253. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->\n\n\r\n\r\n<!-- greptile_comment -->\r\n\r\n<h2>Greptile Overview</h2>\r\n\r\n### Greptile Summary\r\n\r\nThis PR fixes the Python chat example and inmemorydb plugin to work together, adds Python quickstart documentation, and improves Character attribute handling. The changes include:\r\n\r\n**Key Improvements:**\r\n- Adds comprehensive Python quickstart documentation with examples\r\n- Fixes inmemorydb plugin to use proper Plugin class instead of dict\r\n- Enhances inmemorydb adapter to handle Pydantic models in create_memory/update_memory\r\n- Updates character provider to safely access optional attributes with getattr()\r\n- Adds dotenv support to chat example for .env file loading\r\n- Adds useful helper methods to AgentRuntime (get_available_actions, get_entity alias)\r\n- Enhances get_memories() to accept keyword arguments\r\n\r\n**Critical Issues Found:**\r\n1. **Bug in adapter.py line 329**: The update_memory() method references the wrong variable name (`memory` instead of `memory_dict`), which will cause AttributeError when processing Pydantic models\r\n2. **Bug in character.py lines 70-73**: Inconsistent attribute access - uses getattr() in function body but direct access in return data dict, causing AttributeError for optional attributes\r\n3. **Missing dependency in chat.py**: Imports python-dotenv but it's not in requirements.txt\r\n4. **Incomplete documentation**: Quickstart guide doesn't include inmemorydb plugin installation that the chat example now requires\r\n\r\n**Impact:**\r\nThe bugs in adapter.py and character.py are critical and will cause runtime errors. The missing dependencies will prevent users from running the example successfully.\r\n\r\n### Confidence Score: 1/5\r\n\r\n- This PR contains critical bugs that will cause runtime failures and prevent the chat example from working\r\n- Score reflects two critical logic errors (wrong variable reference in adapter.py:329 and inconsistent attribute access in character.py:70-73) plus missing dependencies that will cause import errors. These issues will break the example for users and cause AttributeErrors at runtime.\r\n- Pay close attention to plugins/plugin-inmemorydb/python/elizaos_plugin_inmemorydb/adapter.py (line 329 bug), packages/python/elizaos/bootstrap/providers/character.py (lines 70-73 inconsistency), and examples/chat/python/chat.py (missing python-dotenv dependency)\r\n\r\n<h3>Important Files Changed</h3>\r\n\r\n\r\n\r\nFile Analysis\r\n\r\n\r\n\r\n| Filename | Score | Overview |\r\n|----------|-------|----------|\r\n| docs/python-quickstart.md | 3/5 | New documentation file added. Missing plugin-inmemorydb installation instruction that the chat example now requires. |\r\n| examples/chat/python/chat.py | 2/5 | Added dotenv and inmemorydb support. Missing python-dotenv dependency in requirements, which will cause import errors. |\r\n| packages/python/elizaos/bootstrap/providers/character.py | 2/5 | Fixed to use getattr for optional character attributes. Critical bug: return data dict directly accesses attributes without getattr, causing AttributeError. |\r\n| plugins/plugin-inmemorydb/python/elizaos_plugin_inmemorydb/adapter.py | 1/5 | Enhanced get_memories(), create_memory(), and update_memory() to handle Pydantic models. Critical bug in update_memory line 329: uses wrong variable name. |\r\n\r\n</details>\r\n\r\n\r\n\r\n<h3>Sequence Diagram</h3>\r\n\r\n```mermaid\r\nsequenceDiagram\r\n    participant User\r\n    participant chat.py\r\n    participant dotenv\r\n    participant AgentRuntime\r\n    participant OpenAIPlugin\r\n    participant InMemoryDBPlugin\r\n    participant InMemoryAdapter\r\n    participant CharacterProvider\r\n\r\n    User->>chat.py: Run python chat.py\r\n    chat.py->>dotenv: load_dotenv(env_path)\r\n    dotenv-->>chat.py: Load .env from repo root\r\n    \r\n    chat.py->>AgentRuntime: Create with character and plugins\r\n    AgentRuntime->>OpenAIPlugin: Initialize OpenAI plugin\r\n    AgentRuntime->>InMemoryDBPlugin: Initialize InMemoryDB plugin\r\n    InMemoryDBPlugin->>InMemoryAdapter: create_database_adapter(agent_id)\r\n    InMemoryAdapter-->>InMemoryDBPlugin: Return adapter instance\r\n    InMemoryDBPlugin->>AgentRuntime: register_database_adapter(adapter)\r\n    \r\n    AgentRuntime->>CharacterProvider: get_character_context()\r\n    CharacterProvider->>CharacterProvider: Use getattr() for optional attributes\r\n    CharacterProvider-->>AgentRuntime: Return character context\r\n    \r\n    AgentRuntime-->>chat.py: Runtime initialized\r\n    \r\n    User->>chat.py: Type message\r\n    chat.py->>AgentRuntime: handle_message(runtime, memory)\r\n    AgentRuntime->>InMemoryAdapter: get_memories(params)\r\n    InMemoryAdapter-->>AgentRuntime: Return memories\r\n    AgentRuntime->>OpenAIPlugin: Generate response\r\n    OpenAIPlugin-->>AgentRuntime: Return response\r\n    AgentRuntime->>InMemoryAdapter: create_memory(memory_dict)\r\n    InMemoryAdapter-->>AgentRuntime: Memory stored\r\n    AgentRuntime-->>chat.py: Return result\r\n    chat.py-->>User: Display response\r\n```\r\n\r\n<!-- greptile_other_comments_section -->\r\n\r\n<!-- /greptile_comment -->\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * In-memory database plugin for agent memory.\n  * Token-by-token streaming for chat responses and streaming endpoints.\n  * Atropos data-generation, trajectory tooling, and TextWorld agent integrations.\n  * New Tic‑Tac‑Toe AI/player options and interactive configuration.\n\n* **Documentation**\n  * Expanded developer setup, examples, runnable chat walkthroughs, and new Atropos CLI flags.\n\n* **Other**\n  * Updated Python packaging/requirements and repository-root .env loading for examples.\n\n<sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub>\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-13T00:34:32Z",
      "mergedAt": "2026-01-22T01:20:54Z",
      "additions": 17483,
      "deletions": 8280
    },
    {
      "id": "PR_kwDOMT5cIs69CGSx",
      "title": "feat(v2.0.0): wasm agent runtime",
      "author": "revlentless",
      "number": 6363,
      "body": "# Summary\r\n\r\nRust WASM implementation for elizaOS v2.0.0 - enabling the Rust core to run in browser/Node.js environments via WebAssembly.\r\n\r\n# Risks\r\n\r\n**Low risk.** This PR:\r\n- Makes no breaking API changes to existing Rust code\r\n- Uses conditional compilation (`#[cfg]`) so native builds are unaffected\r\n- All existing tests continue to pass\r\n- Adds new WASM-specific code paths that only activate when building for `wasm32-unknown-unknown`\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\nThis PR makes the elizaOS Rust core **fully WASM-compatible**, enabling it to run in browsers and Node.js via WebAssembly. The existing Rust crate had WASM bindings but they were stubs - the `WasmAgentRuntime` was a placeholder that didn't actually wrap the real `AgentRuntime`.\r\n\r\nThe key challenge was that Rust's `async_trait` and many traits require `Send + Sync` bounds for thread-safety, but WASM is single-threaded and doesn't support these traits. This PR implements platform-aware macros and conditional compilation to provide the correct bounds for each target.\r\n\r\n### Key Changes\r\n\r\n#### 1. Platform-Aware Macros (`src/platform.rs`)\r\n\r\n```rust\r\n// Native: #[async_trait] (requires Send)\r\n// WASM:   #[async_trait(?Send)] (no Send requirement)\r\nplatform_async_trait! {\r\n    pub trait MyTrait { ... }\r\n}\r\n\r\n// Native: pub trait MyTrait: Send + Sync { ... }\r\n// WASM:   pub trait MyTrait { ... }\r\ndefine_platform_trait! {\r\n    pub trait MyTrait { ... }\r\n}\r\n```\r\n\r\n#### 2. Core Trait Migration\r\n\r\nAll core traits now compile for both targets:\r\n- `ActionHandler`, `ProviderHandler`, `EvaluatorHandler`\r\n- `DatabaseAdapter`, `Service`, `IAgentRuntime`\r\n- Bootstrap traits: `Action`, `Provider`, `Evaluator`, `Service`\r\n\r\n#### 3. Real WasmAgentRuntime\r\n\r\nThe `WasmAgentRuntime` now wraps the actual `AgentRuntime` using WASM-appropriate primitives:\r\n\r\n```rust\r\npub struct WasmAgentRuntime {\r\n    inner: Rc<RefCell<Option<AgentRuntime>>>,  // Not Arc - WASM is single-threaded\r\n    character: RefCell<Character>,\r\n    agent_id: UUID,\r\n}\r\n```\r\n\r\n#### 4. Structured WASM Errors\r\n\r\nRich error objects for JavaScript consumers:\r\n\r\n```rust\r\npub struct WasmError {\r\n    pub code: String,      // \"VALIDATION_ERROR\", \"RUNTIME_ERROR\", etc.\r\n    pub message: String,   // Human-readable message\r\n    pub source: Option<String>,  // Field/component that caused error\r\n}\r\n```\r\n\r\n#### 5. JavaScript Shims\r\n\r\nType-safe wrappers for JS callbacks:\r\n\r\n```rust\r\npub struct JsModelHandler {\r\n    js_object: JsValue,\r\n    handle_func: Function,\r\n}\r\n```\r\n\r\n#### 6. Bug Fix: ChannelType Serialization\r\n\r\nFixed `ChannelType` enum to serialize correctly:\r\n- Before: `VoiceDm` → `\"VOICEDM\"` ❌\r\n- After: `VoiceDm` → `\"VOICE_DM\"` ✅\r\n\r\n## What kind of change is this?\r\n\r\n- **Features** (non-breaking change which adds functionality)\r\n- **Bug fixes** (ChannelType serialization)\r\n- **Improvements** (structured errors, better WASM integration)\r\n\r\n# Documentation changes needed?\r\n\r\nMy changes require a change to the project documentation:\r\n- Added `examples/README.md` with usage instructions for native and WASM examples\r\n- WASM module includes JSDoc comments for all exports\r\n\r\n# Testing\r\n\r\n## Where should a reviewer start?\r\n\r\n1. `src/platform.rs` - Platform macros (foundation of the approach)\r\n2. `src/types/components.rs` - Core handler traits with conditional compilation\r\n3. `src/wasm/mod.rs` - WasmAgentRuntime implementation\r\n4. `__tests__/wasm/` - TypeScript tests verifying WASM bindings\r\n\r\n## Detailed testing steps\r\n\r\n### Native Tests (Rust)\r\n```bash\r\ncd packages/rust\r\ncargo test --features native\r\n# Expected: 79 tests pass\r\n```\r\n\r\n### WASM Binding Tests (TypeScript/Vitest)\r\n```bash\r\ncd packages/rust\r\nnpx vitest run __tests__/wasm/wasm-bindings.test.ts\r\n# Expected: 16 tests pass\r\n```\r\n\r\n### Full Test Suite\r\n```bash\r\ncd packages/rust\r\n./run-all-tests.sh\r\n# Expected: 108 passed, 0 failed, 2 skipped\r\n```\r\n\r\n### Native Examples\r\n```bash\r\ncargo run --example basic_runtime --features native\r\ncargo run --example with_handlers --features native\r\n```\r\n\r\n### WASM Examples (Bun)\r\n```bash\r\nbun run examples/wasm/basic.ts\r\nbun run examples/wasm/runtime.ts\r\nbun run examples/wasm/chat.ts  # Interactive\r\n```\r\n\r\n## Test Coverage\r\n\r\n| Suite | Tests | Status |\r\n|-------|-------|--------|\r\n| Rust native (`cargo test`) | 79 | ✅ |\r\n| WASM bindings (Vitest) | 16 | ✅ |\r\n| Interop equivalence (Vitest) | 16 | ✅ |\r\n| Python serialization | 22 | ✅ |\r\n| **Total** | **133** | ✅ |\r\n\r\n# Commits\r\n\r\n| Commit | Description |\r\n|--------|-------------|\r\n| `2ea503d` | feat(rust): improved WASM foundation with structured errors and JS shims |\r\n| `d00b690` | chore(rust): add wasm-test.sh for running WASM tests |\r\n| `e2b9ff7` | fix(rust): gate tokio tests for native-only, fix WASM test imports |\r\n| `f74293d` | feat(rust): add platform-aware macros for native/WASM compatibility |\r\n| `90c3e0e` | fix(rust): correct ChannelType serialization to match TypeScript |\r\n| `9c87349` | feat(rust): make core traits WASM-compatible |\r\n| `fbffb3d` | test(rust): expand WASM test coverage |\r\n| `9c3bc11` | test(rust): add WASM tests for platform macros |\r\n| `368f0aa` | test(rust): add WASM tests for core handler traits |\r\n| `17bfad1` | feat(rust): make all async_trait impls WASM-compatible |\r\n| `15c96d4` | feat(rust): upgrade WasmAgentRuntime to wrap real AgentRuntime |\r\n| `a4f717e` | test(rust): add comprehensive WASM integration tests |\r\n| `629d30a` | style: apply cargo fmt across all files |\r\n| `6a58014` | docs(rust): add native and WASM examples |\r\n| `85a4043` | fix(rust): fix WASM tests to match Rust type definitions |\r\n| `cbaea5a` | fix(rust): fix TypeScript type errors in WASM tests |\r\n\r\n# Files Changed\r\n\r\n```\r\npackages/rust/\r\n├── src/\r\n│   ├── platform.rs                    # NEW: Platform macros\r\n│   ├── lib.rs                         # Export platform module\r\n│   ├── runtime.rs                     # Conditional Send+Sync on traits\r\n│   ├── types/\r\n│   │   ├── components.rs              # ActionHandler, ProviderHandler, EvaluatorHandler\r\n│   │   ├── service.rs                 # Service, TypedService traits\r\n│   │   └── environment.rs             # ChannelType serialization fix\r\n│   ├── bootstrap/\r\n│   │   ├── runtime.rs                 # IAgentRuntime trait\r\n│   │   ├── actions/mod.rs             # Action trait\r\n│   │   ├── providers/mod.rs           # Provider trait\r\n│   │   ├── evaluators/mod.rs          # Evaluator trait\r\n│   │   └── services/mod.rs            # Service trait\r\n│   └── wasm/\r\n│       ├── mod.rs                     # WasmAgentRuntime (upgraded)\r\n│       ├── error.rs                   # NEW: WasmError struct\r\n│       └── shims/\r\n│           ├── mod.rs                 # NEW: JS shim exports\r\n│           └── model_handler.rs       # NEW: JsModelHandler\r\n├── __tests__/\r\n│   └── wasm/\r\n│       ├── wasm-bindings.test.ts      # WASM binding tests\r\n│       └── interop-equivalence.test.ts # Serialization equivalence tests\r\n├── examples/\r\n│   ├── README.md                      # NEW: Examples documentation\r\n│   ├── basic_runtime.rs               # NEW: Native example\r\n│   ├── with_handlers.rs               # NEW: Native example\r\n│   └── wasm/\r\n│       ├── basic.ts                   # NEW: WASM/Bun example\r\n│       ├── runtime.ts                 # NEW: WASM/Bun example\r\n│       └── chat.ts                    # NEW: Interactive chat example\r\n├── Cargo.toml                         # Example entries\r\n├── package.json                       # npm scripts for examples\r\n├── run-all-tests.sh                   # Updated test runner\r\n└── wasm-test.sh                       # NEW: WASM test script\r\n```\r\n\r\n# Architecture\r\n\r\n```\r\n┌─────────────────────────────────────────────────────────────┐\r\n│                    Conditional Compilation                   │\r\n├─────────────────────────────────────────────────────────────┤\r\n│  #[cfg(not(target_arch = \"wasm32\"))]  │  #[cfg(wasm32)]     │\r\n├───────────────────────────────────────┼─────────────────────┤\r\n│  trait Foo: Send + Sync               │  trait Foo          │\r\n│  #[async_trait]                       │  #[async_trait(?Send)]│\r\n│  Arc<T>                               │  Rc<RefCell<T>>     │\r\n│  tokio runtime                        │  wasm-bindgen-futures│\r\n└───────────────────────────────────────┴─────────────────────┘\r\n                              │\r\n                              ▼\r\n┌─────────────────────────────────────────────────────────────┐\r\n│                     WasmAgentRuntime                         │\r\n├─────────────────────────────────────────────────────────────┤\r\n│  inner: Rc<RefCell<Option<AgentRuntime>>>                   │\r\n│                                                              │\r\n│  Methods:                                                    │\r\n│  - create(character_json) → WasmAgentRuntime                │\r\n│  - initialize() → Promise<void>                             │\r\n│  - handleMessage(msg_json) → Promise<response_json>         │\r\n│  - registerModelHandler(type, JsModelHandler)               │\r\n│  - stop()                                                    │\r\n└─────────────────────────────────────────────────────────────┘\r\n                              │\r\n                              ▼\r\n┌─────────────────────────────────────────────────────────────┐\r\n│                    JavaScript Usage                          │\r\n├─────────────────────────────────────────────────────────────┤\r\n│  import { WasmAgentRuntime, JsModelHandler } from 'elizaos';│\r\n│                                                              │\r\n│  const runtime = WasmAgentRuntime.create(characterJson);    │\r\n│  await runtime.initialize();                                 │\r\n│                                                              │\r\n│  runtime.registerModelHandler('TEXT_LARGE', new JsModelHandler({│\r\n│    handle: async (params) => { /* call LLM */ }             │\r\n│  }));                                                        │\r\n│                                                              │\r\n│  const response = await runtime.handleMessage(messageJson); │\r\n└─────────────────────────────────────────────────────────────┘\r\n```\n\n<!-- greptile_comment -->\n\n<h3># Greptile Summary</h3>\n\n\n- Implements comprehensive WASM compatibility for elizaOS Rust core, enabling the runtime to execute in browsers and Node.js environments via WebAssembly without breaking existing native functionality\n- Introduces platform-aware macros and conditional compilation patterns to handle Send+Sync trait differences between native (multi-threaded) and WASM (single-threaded) targets\n- Upgrades `WasmAgentRuntime` from a stub implementation to a fully functional wrapper around the real `AgentRuntime`, with structured error handling, JavaScript interop shims, and comprehensive test coverage\n\n# Important Files Changed\n\n| Filename | Overview |\n|----------|----------|\n| `packages/rust/src/platform.rs` | New platform abstraction module providing macros for conditional async_trait bounds and Send+Sync requirements |\n| `packages/rust/src/wasm/mod.rs` | Upgraded WasmAgentRuntime implementation wrapping real AgentRuntime with WASM-compatible primitives and structured errors |\n| `packages/rust/src/types/components.rs` | Core handler traits migrated to use platform-aware conditional compilation for ActionHandler, ProviderHandler, and EvaluatorHandler |\n| `packages/rust/tests/wasm_tests.rs` | New comprehensive WASM test suite with 1506 lines validating cross-platform compatibility and JavaScript interoperability |\n| `packages/rust/src/types/environment.rs` | Fixed ChannelType serialization to use SCREAMING_SNAKE_CASE format for TypeScript compatibility (\"VOICE_DM\" instead of \"VOICEDM\") |\n\n# Confidence score: 5/5\n\n- This PR is extremely safe to merge with minimal risk of production issues\n- Score reflects excellent architectural approach using conditional compilation, comprehensive test coverage (133 tests passing), and non-breaking changes that preserve all native functionality while adding new WASM capabilities\n- All files demonstrate consistent application of platform-aware patterns with proper error handling and thorough documentation\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant WasmAgentRuntime\n    participant JsModelHandler\n    participant AgentRuntime\n    participant Character\n    participant State\n    participant ModelHandler\n\n    User->>WasmAgentRuntime: create(characterJson)\n    WasmAgentRuntime->>Character: parse JSON\n    Character-->>WasmAgentRuntime: Character instance\n    WasmAgentRuntime-->>User: WasmAgentRuntime\n\n    User->>WasmAgentRuntime: initialize()\n    WasmAgentRuntime->>AgentRuntime: new(RuntimeOptions)\n    AgentRuntime-->>WasmAgentRuntime: AgentRuntime instance\n    WasmAgentRuntime-->>User: Promise<void>\n\n    User->>WasmAgentRuntime: registerModelHandler(type, handler)\n    WasmAgentRuntime->>JsModelHandler: store handler\n    JsModelHandler-->>WasmAgentRuntime: registered\n\n    User->>WasmAgentRuntime: handleMessage(messageJson)\n    WasmAgentRuntime->>Memory: parse message JSON\n    Memory-->>WasmAgentRuntime: Memory instance\n    WasmAgentRuntime->>AgentRuntime: compose_state(message)\n    AgentRuntime->>State: build state\n    State-->>AgentRuntime: State instance\n    WasmAgentRuntime->>Character: get character data\n    Character-->>WasmAgentRuntime: character info\n    WasmAgentRuntime->>WasmAgentRuntime: build prompt\n    WasmAgentRuntime->>JsModelHandler: call(params)\n    JsModelHandler->>ModelHandler: handle(paramsJson)\n    ModelHandler-->>JsModelHandler: responseJson\n    JsModelHandler-->>WasmAgentRuntime: response text\n    WasmAgentRuntime->>Memory: create response memory\n    Memory-->>WasmAgentRuntime: response memory\n    WasmAgentRuntime-->>User: Promise<responseJson>\n\n    User->>WasmAgentRuntime: stop()\n    WasmAgentRuntime->>JsModelHandler: clear handlers\n    WasmAgentRuntime->>AgentRuntime: cleanup\n    WasmAgentRuntime-->>User: stopped\n```\n\n<!-- greptile_other_comments_section -->\n\n<details><summary><h3>Context used (3)</h3></summary>\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- Context from `dashboard` - AGENTS.md ([source](https://app.greptile.com/review/custom-context?memory=51febe90-8918-4f18-be1f-d43bb68d696c))\n</details>\n\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-13T22:16:57Z",
      "mergedAt": null,
      "additions": 3834,
      "deletions": 236
    },
    {
      "id": "PR_kwDOMT5cIs69N1vf",
      "title": "refactor(plugin-sql): extract domain stores from BaseDrizzleAdapter",
      "author": "standujar",
      "number": 6366,
      "body": "Refactors `BaseDrizzleAdapter` (~3,900 lines) into composable domain stores. This improves maintainability, testability, and separation of concerns without changing the public API.\r\n\r\n## Changes\r\n\r\n### New Domain Stores (`src/stores/`)\r\n\r\n| Store | Responsibility | Methods |\r\n|-------|----------------|---------|\r\n| `AgentStore` | Agent CRUD operations | get, getAll, create, update, delete, count |\r\n| `MemoryStore` | Memory & embeddings | get, getById, getByIds, create, update, delete, search, count |\r\n| `RoomStore` | Room management | getByIds, getByWorld, create, update, delete |\r\n| `ParticipantStore` | Room participants | getRoomsForEntity, add, remove, getForRoom, isParticipant, userState |\r\n| `EntityStore` | Entity management | getByIds, getForRoom, create, update, delete, getByNames, searchByName |\r\n| `ComponentStore` | ECS components | get, getAll, create, update, delete |\r\n| `RelationshipStore` | Entity relationships | create, update, get, getAll |\r\n| `CacheStore` | Key-value cache | get, set, delete |\r\n| `WorldStore` | World management | create, get, getAll, update, delete |\r\n| `TaskStore` | Task management | create, getByParams, getByName, get, update, delete |\r\n| `LogStore` | Logging & summaries | create, getMany, getAgentRunSummaries, delete |\r\n| `MessagingStore` | Servers, channels, messages | createServer, getServers, createChannel, getChannels, createMessage, getMessages, participants |\r\n\r\n### Architecture\r\n\r\n```\r\nBaseDrizzleAdapter\r\n    │\r\n    ├── initStores()  ───────────────────────────────┐\r\n    │                                                │\r\n    │   ┌─────────────────────────────────────────┐  │\r\n    │   │           StoreContext                  │◄─┘\r\n    │   │  • getDb()                              │\r\n    │   │  • withRetry()                          │\r\n    │   │  • withIsolationContext()               │\r\n    │   │  • agentId                              │\r\n    │   │  • getEmbeddingDimension()              │\r\n    │   └─────────────────────────────────────────┘\r\n    │                   │\r\n    │         ┌─────────┴─────────┐\r\n    │         ▼                   ▼\r\n    │   ┌──────────┐       ┌──────────┐\r\n    │   │  Store1  │  ...  │  StoreN  │\r\n    │   └──────────┘       └──────────┘\r\n    │\r\n    └── Public methods delegate to stores\r\n```\r\n\r\n### Key Design Decisions\r\n\r\n1. **Shared Context**: All stores receive a `StoreContext` with database access, retry logic, and RLS isolation\r\n\r\n2. **No API Changes**: All public methods remain identical - only internal implementation refactored\r\n\r\n## Impact\r\n\r\n- **Lines reduced**: `base.ts` from ~3,900 to ~1,350 lines (~65% reduction)\r\n- **Files added**: 13 new files in `src/stores/`\r\n- **Public API**: No changes\r\n- **Tests**: All 160 unit + all integration tests pass (PGLite + PostgreSQL)\r\n\r\n## Testing\r\n\r\n```bash\r\n# Unit tests\r\nbun run test:unit        # 160 pass\r\n\r\n# Integration tests (PGLite)\r\nbun run test:integration # All pass\r\n\r\n# Integration tests (PostgreSQL)\r\nbun run test:integration:postgres # All pass (including RLS tests)\r\n```\r\n\r\n## Migration\r\n\r\nNo migration needed - this is a pure refactoring with no public API changes.\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\n- Refactors monolithic `BaseDrizzleAdapter` class (~3,900 lines) into 11 focused domain stores in `packages/plugin-sql/src/stores/` to improve maintainability and testability while preserving the exact same public API\n- Introduces `StoreContext` pattern that provides shared database access, retry logic, and Row Level Security isolation to all domain stores, maintaining consistency across the codebase\n- Implements comprehensive CRUD operations across stores for agents, memories, rooms, participants, entities, components, relationships, caching, worlds, tasks, and logging\n\n<h3>Important Files Changed</h3>\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-sql/src/base.ts | Refactored from ~3,900 to ~1,350 lines by extracting domain logic into stores and adding delegation methods |\n| packages/plugin-sql/src/stores/memory.store.ts | New store handling memory CRUD, vector embeddings, and similarity search operations |\n| packages/plugin-sql/src/stores/entity.store.ts | New store for entity management including component aggregation and name-based searching |\n| packages/plugin-sql/src/stores/log.store.ts | New store with complex agent run summaries and JSON sanitization for logging operations |\n\n<h3>Confidence score: 4/5</h3>\n\n\n- This is a well-executed refactoring with comprehensive testing and minimal risk due to preserved public API\n- Score lowered due to minor issues: unused parameter in TaskStore.getAll(), missing agent ID filter in TaskStore.delete(), and complex field mapping logic in RelationshipStore that could be simplified\n- No files require special attention - the refactoring successfully maintains API compatibility while improving code organization\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Client as \"Client\"\n    participant Adapter as \"BaseDrizzleAdapter\"\n    participant StoreContext as \"StoreContext\"\n    participant MemoryStore as \"MemoryStore\"\n    participant Manager as \"ConnectionManager\"\n    participant DB as \"Database\"\n\n    Note over Client,DB: Memory Search Flow (Primary Happy Path)\n\n    Client->>Adapter: searchMemoriesByEmbedding(embedding, params)\n    \n    Adapter->>Adapter: withDatabase(() => operation())\n    \n    Adapter->>MemoryStore: searchByEmbedding(embedding, params)\n    \n    MemoryStore->>StoreContext: withRetry(() => operation())\n    \n    StoreContext->>MemoryStore: Execute operation\n    \n    MemoryStore->>StoreContext: getDb()\n    StoreContext->>MemoryStore: Return database instance\n    \n    MemoryStore->>DB: Execute cosine distance query with conditions\n    DB-->>MemoryStore: Return matching memories with similarity scores\n    \n    MemoryStore->>MemoryStore: Transform results to Memory objects\n    MemoryStore-->>StoreContext: Return transformed memories\n    StoreContext-->>Adapter: Return memories\n    Adapter-->>Client: Return Memory[]\n\n    Note over Client,DB: Memory Creation Flow\n\n    Client->>Adapter: createMemory(memory, tableName)\n    \n    Adapter->>Adapter: withDatabase(() => operation())\n    \n    Adapter->>MemoryStore: create(memory, tableName)\n    \n    MemoryStore->>StoreContext: withIsolationContext(entityId, callback)\n    \n    StoreContext->>Manager: withIsolationContext(entityId, callback)\n    Manager->>DB: Set RLS context for entity\n    Manager->>MemoryStore: Execute callback with transaction\n    \n    MemoryStore->>DB: Insert memory record\n    MemoryStore->>MemoryStore: upsertEmbedding(tx, memoryId, embedding)\n    MemoryStore->>DB: Insert/Update embedding record\n    \n    DB-->>MemoryStore: Return inserted memory ID\n    MemoryStore-->>StoreContext: Return memory ID\n    StoreContext-->>Adapter: Return memory ID\n    Adapter-->>Client: Return UUID\n\n    Note over Client,DB: Agent Operations Flow\n\n    Client->>Adapter: getAgent(agentId)\n    \n    Adapter->>Adapter: withDatabase(() => operation())\n    \n    Adapter->>AgentStore: get(agentId)\n    \n    AgentStore->>StoreContext: withRetry(() => operation())\n    \n    AgentStore->>StoreContext: getDb()\n    StoreContext->>AgentStore: Return database instance\n    \n    AgentStore->>DB: SELECT from agents WHERE id = agentId\n    DB-->>AgentStore: Return agent record\n    \n    AgentStore->>AgentStore: Transform to Agent object\n    AgentStore-->>Adapter: Return Agent\n    Adapter-->>Client: Return Agent\n```\n\n<!-- greptile_other_comments_section -->\n\n<details><summary><h3>Context used (3)</h3></summary>\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- Context from `dashboard` - AGENTS.md ([source](https://app.greptile.com/review/custom-context?memory=51febe90-8918-4f18-be1f-d43bb68d696c))\n</details>\n\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-14T18:18:05Z",
      "mergedAt": "2026-01-16T17:22:26Z",
      "additions": 3205,
      "deletions": 3002
    },
    {
      "id": "PR_kwDOMT5cIs66pZDH",
      "title": "feat(core): enhance multi-step workflow with retry logic and parameter extraction",
      "author": "wtfsayo",
      "number": 6286,
      "body": "## Summary\n\nEnhances multi-step workflows with retry logic and parameter extraction capabilities.\n\n### Changes\n\n- **Retry logic for XML parsing**: Multi-step workflows now retry parsing up to 5 times (configurable via `MULTISTEP_PARSE_RETRIES`) with exponential backoff (1s, 2s, 4s... capped at 8s)\n- **Summary generation retry with fallback**: Summary parsing retries with a graceful fallback message if all attempts fail (configurable via `MULTISTEP_SUMMARY_PARSE_RETRIES`)\n- **Parameter extraction**: The multi-step decision template now supports a `<parameters>` key allowing actions to receive structured parameters from the LLM\n- **Actions provider with parameter schemas**: Added `formatActionsWithParams()` function and `actionsWithParams` provider value for better LLM tool calling\n- **Bounds checking**: Retry counts validated to be within 1-10 range\n\n### Configuration\n\n| Setting | Default | Description |\n|---------|---------|-------------|\n| `MULTISTEP_PARSE_RETRIES` | 5 | Number of retries for XML parsing failures |\n| `MULTISTEP_SUMMARY_PARSE_RETRIES` | 5 | Number of retries for summary generation failures |\n\n### Files Changed\n\n- `packages/core/src/services/default-message-service.ts` - Retry logic and parameter extraction\n- `packages/core/src/prompts.ts` - Updated multi-step template with parameters key\n- `packages/plugin-bootstrap/src/providers/actions.ts` - Added formatActionsWithParams\n- `packages/plugin-bootstrap/src/__tests__/multi-step.test.ts` - Added tests\n\n### Test Plan\n\n- [x] Added tests for retry logic (success after retries, failure after max retries)\n- [x] Added tests for summary fallback response\n- [x] Added tests for parameter extraction (object, JSON string, invalid JSON handling)\n- [x] All 19 multi-step tests pass\n- [x] Core package builds successfully\n- [x] Plugin-bootstrap package builds successfully\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Improves robustness and tool-calling for multi-step workflows.\n> \n> - Updates `multiStepDecisionTemplate` to include explicit `parameters` and clarifies output keys\n> - In `default-message-service.ts`:\n>   - Adds bounded (1–10) retry with exponential backoff for decision-step XML parsing (`MULTISTEP_PARSE_RETRIES`) and summary generation (`MULTISTEP_SUMMARY_PARSE_RETRIES`)\n>   - Parses `parameters` (object or JSON string), stores in `state.data.actionParams` and action-specific namespace; logs validation issues\n>   - Provides fallback user response when summary parsing fails; improves structured logging\n>   - Minor cleanup to always-respond channel/source overrides and response message construction\n> - In `providers/actions.ts`, adds `formatActionsWithParams()` and exposes `actionsWithParams` so prompts include action parameter schemas\n> - Extends tests to cover retry success/failure paths, summary fallback, and parameter extraction (object, JSON string, invalid JSON)\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cd4e6f34ab9c8c2e619806cf5ff0e585b30ecee5. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-26T16:31:52Z",
      "mergedAt": "2026-01-13T15:54:04Z",
      "additions": 2509,
      "deletions": 1208
    },
    {
      "id": "PR_kwDOMT5cIs688Xux",
      "title": "fix(cli): prevent shell environment variable leakage into agent secrets",
      "author": "0xbbjoker",
      "number": 6360,
      "body": "## Summary\n\nFixes shell environment variable leakage into ElizaOS plugin loading decisions and agent secrets.\n\n**Problem:** `dotenv.config()` does NOT override existing `process.env` values by default. This means shell environment variables (from `.zshrc`/`.bashrc`) leak into plugin loading:\n\n```\nUser shell has: ANTHROPIC_API_KEY, OPENAI_API_KEY\nProject .env has: OPENROUTER_API_KEY\n\nExpected plugins: openrouter, bootstrap\nActual plugins: anthropic, openai, openrouter, bootstrap (LEAKED!)\n```\n\n**Solution:**\n- Scan installed plugins for declared env vars via `package.json` `agentConfig.pluginParameters`\n- Set global filter so only declared vars are captured into agent secrets\n- Load `.env` files with proper precedence (closest file wins)\n\n## Changes\n\n- **`packages/cli/src/utils/plugin-env-filter.ts`** - New utility to scan plugins for env var declarations\n- **`packages/core/src/secrets.ts`** - Add `setAllowedEnvVars()` filter to restrict captured vars\n- **`packages/core/src/utils/environment.ts`** - Add `loadEnvFilesWithPrecedence()` for proper hierarchy\n- **`packages/cli/src/commands/start/index.ts`** - Integrate filter before character loading\n\n## Test plan\n\n- [x] Unit tests for plugin env var scanning (`plugin-env-filter.test.ts`)\n- [x] Unit tests for secrets filtering (`secrets-filtering.test.ts`)\n- [x] Unit tests for env precedence loading (`env-precedence.test.ts`)\n- [ ] Manual test with shell env vars vs project .env\n- [ ] Test in monorepo context\n\n## Notes\n\n- 40 tests passing\n- Backwards compatible (null filter = existing behavior)\n- Core env vars (POSTGRES_URL, LOG_LEVEL, etc.) always allowed\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Strengthens environment handling to block shell var leakage and honor project .env precedence.\n> \n> - Adds `utils/plugin-env-filter.ts` to scan installed plugins' `agentConfig.pluginParameters`, assemble `allowedVars`, filter env maps, detect shell-only vars, and warn on missing declarations\n> - Integrates scanning in `cli start`: calls `scanPluginsForEnvDeclarations`, sets global `setAllowedEnvVars`, and loads `.env` files via `loadEnvFilesWithPrecedence` (monorepo-aware)\n> - Updates core `secrets.ts`: introduces `setAllowedEnvVars`/`getAllowedEnvVars`, filters `process.env` when merging into `character.settings.secrets`, optimizes `hasCharacterSecrets`\n> - Enhances core env utils: memoized `detectEnvironment`, `resetEnvironmentCache`, `loadEnvFile({ override })`, `findAllEnvFiles`, and `loadEnvFilesWithPrecedence` (closest wins, optional boundary)\n> - Adds comprehensive tests covering plugin scanning/filtering, .env precedence, and secrets filtering\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 23693e47517cf535cd1aba510d3b1337c1e549c4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->\n\n<!-- greptile_comment -->\n\n<h2>Greptile Overview</h2>\n\n### Greptile Summary\n\nThis PR implements a robust solution to prevent shell environment variable leakage into ElizaOS agent secrets by introducing plugin-based environment variable filtering.\n\n## Key Changes\n\n- **Plugin Environment Scanning**: New `plugin-env-filter.ts` utility scans installed plugins' `package.json` files for declared environment variables via `agentConfig.pluginParameters`\n- **Global Filter in Secrets Module**: Added `setAllowedEnvVars()` to restrict which environment variables are captured into agent secrets\n- **Environment File Precedence**: New `loadEnvFilesWithPrecedence()` ensures closest `.env` file wins, respecting monorepo boundaries\n- **Integration in Start Command**: Filter is applied before character loading, preventing shell vars from leaking into plugin selection\n\n## Architecture\n\nThe solution follows a clear flow: scan plugins → set filter → load env files → filter on capture. Core environment variables (e.g., `POSTGRES_URL`, `LOG_LEVEL`) are always allowed. The filter is null by default for backward compatibility.\n\n## Issues Found\n\n- Line 72 in `plugin-env-filter.ts` already correctly checks for null declarations before accessing length\n- Line 19 in `secrets.ts` uses underscore variable as TypeScript idiom for unused loop variable (valid pattern)\n- Consider caching regex compilation in `detectShellOnlyVars` for performance\n- `CORE_ALLOWED_VARS` hardcoded in CLI could be centralized in core package\n\n## Testing\n\n40 tests passing across 3 new test files with comprehensive coverage of filtering, precedence, and integration scenarios.\n\n### Confidence Score: 4/5\n\n- This PR is safe to merge with minor considerations\n- The implementation is well-tested with 40 passing tests, addresses a real security concern (shell env leakage), and maintains backward compatibility. Code quality is high with proper error handling and optimization. Minor issues include hardcoded core vars list and potential for regex caching, but these don't affect functionality.\n- Pay close attention to `packages/cli/src/utils/plugin-env-filter.ts` for the regex caching optimization and consider centralizing `CORE_ALLOWED_VARS`\n\n<h3>Important Files Changed</h3>\n\n\n\nFile Analysis\n\n\n\n| Filename | Score | Overview |\n|----------|-------|----------|\n| packages/cli/src/utils/plugin-env-filter.ts | 4/5 | added plugin environment variable scanning utility with deduplication and filtering logic |\n| packages/core/src/secrets.ts | 4/5 | refactored to add environment variable filtering capability with global allowed vars set |\n| packages/core/src/utils/environment.ts | 4/5 | added `.env` file precedence loading with boundary directory support |\n| packages/cli/src/commands/start/index.ts | 4/5 | integrated plugin env scanning and filtering before character loading to prevent shell leakage |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant CLI as CLI Start Command\n    participant Scanner as Plugin Scanner\n    participant Core as Core (secrets.ts)\n    participant Env as Environment Loader\n    participant Agent as Agent/Character\n\n    CLI->>Scanner: scanPluginsForEnvDeclarations(cwd)\n    Scanner->>Scanner: Scan node_modules for plugins\n    Scanner->>Scanner: Read package.json files\n    Scanner->>Scanner: Extract pluginParameters\n    Scanner-->>CLI: allowedVars Set + plugin info\n    \n    CLI->>Core: setAllowedEnvVars(allowedVars)\n    Note over Core: Global filter set\n    \n    CLI->>Env: loadEnvFilesWithPrecedence(cwd)\n    Env->>Env: findAllEnvFiles (parent dirs)\n    Env->>Env: Load files (farthest to closest)\n    Env-->>CLI: Loaded env files\n    Note over CLI: process.env populated\n    \n    CLI->>Agent: Load character/agent\n    Agent->>Core: setDefaultSecretsFromEnv(character)\n    Core->>Core: Filter process.env by allowedVars\n    Core->>Agent: Merge filtered vars into secrets\n    Note over Agent: Only declared vars captured\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-13T14:23:17Z",
      "mergedAt": "2026-01-15T15:10:57Z",
      "additions": 1343,
      "deletions": 395
    }
  ],
  "codeChanges": {
    "additions": 8068,
    "deletions": 5513,
    "files": 93,
    "commitCount": 198
  },
  "completedItems": [
    {
      "title": "feat(core): enhance multi-step workflow with retry logic and parameter extraction",
      "prNumber": 6286,
      "type": "feature",
      "body": "## Summary\n\nEnhances multi-step workflows with retry logic and parameter extraction capabilities.\n\n### Changes\n\n- **Retry logic for XML parsing**: Multi-step workflows now retry parsing up to 5 times (configurable via `MULTISTEP_PARSE_RETRI",
      "files": [
        "packages/core/src/prompts.ts",
        "packages/core/src/services/default-message-service.ts",
        "packages/plugin-bootstrap/src/__tests__/multi-step.test.ts",
        "packages/plugin-bootstrap/src/providers/actions.ts",
        "packages/core/src/runtime.ts",
        ".cursor",
        "examples/tsconfig.json",
        "packages/core/src/__tests__/streaming-context.test.ts",
        "packages/core/src/streaming-context.ts",
        "packages/core/src/types/streaming.ts",
        "packages/core/src/utils/streaming.ts",
        "packages/cli/tests/unit/characters/README.md",
        "bun.lock",
        "lerna.json",
        "packages/api-client/package.json",
        "packages/app/package.json",
        "packages/cli/package.json",
        "packages/cli/src/commands/deploy/utils/docker-build.ts",
        "packages/client/package.json",
        "packages/client/src/components/chat.tsx",
        "packages/config/package.json",
        "packages/core/package.json",
        "packages/core/src/__tests__/runtime.test.ts",
        "packages/elizaos/package.json",
        "packages/plugin-bootstrap/package.json",
        "packages/plugin-bootstrap/src/__tests__/test-utils.ts",
        "packages/plugin-bootstrap/src/actions/roles.ts",
        "packages/plugin-bootstrap/src/providers/settings.ts",
        "packages/plugin-dummy-services/package.json",
        "packages/plugin-quick-starter/package.json",
        "packages/plugin-sql/package.json",
        "packages/plugin-sql/src/__tests__/integration/base-adapter-methods.test.ts",
        "packages/plugin-sql/src/__tests__/integration/entity-crud.test.ts",
        "packages/plugin-sql/src/__tests__/integration/memory.test.ts",
        "packages/plugin-sql/src/__tests__/integration/world.test.ts",
        "packages/plugin-sql/src/__tests__/migration/migration-before-1.6.5.test.ts",
        "packages/plugin-sql/src/__tests__/unit/utils.test.ts",
        "packages/plugin-sql/src/base.ts",
        "packages/plugin-sql/src/neon/adapter.ts",
        "packages/plugin-sql/src/pg/adapter.ts",
        "packages/plugin-sql/src/pglite/adapter.ts",
        "packages/plugin-starter/package.json",
        "packages/project-starter/package.json",
        "packages/project-starter/src/character.ts",
        "packages/project-tee-starter/package.json",
        "packages/server/package.json",
        "packages/server/src/__tests__/unit/api/agents-runs.test.ts",
        "packages/server/src/api/agents/runs.ts",
        "packages/server/src/api/index.ts",
        "packages/server/src/api/memory/rooms.ts"
      ]
    },
    {
      "title": "fix: optimize runtime initialization with parallelization and atomic upserts",
      "prNumber": 6342,
      "type": "bugfix",
      "body": "## Summary\r\n\r\nOptimize `runtime.initialize()` performance through atomic upserts and parallelization of independent operations.\r\n\r\n**Results:** Cold start -30%, Warm start -40%\r\n\r\n## Problem\r\n\r\nThe current initialization flow has several in",
      "files": [
        "packages/core/src/__tests__/runtime.test.ts",
        "packages/core/src/runtime.ts",
        "packages/plugin-sql/src/__tests__/integration/base-adapter-methods.test.ts",
        "packages/plugin-sql/src/__tests__/integration/entity-crud.test.ts",
        "packages/plugin-sql/src/__tests__/integration/world.test.ts",
        "packages/plugin-sql/src/base.ts",
        "packages/server/src/services/message.ts",
        "bun.lock",
        "packages/plugin-sql/src/__tests__/integration/memory.test.ts",
        "packages/plugin-sql/src/__tests__/unit/utils.test.ts",
        "packages/plugin-sql/src/neon/adapter.ts",
        "packages/plugin-sql/src/pg/adapter.ts",
        "packages/plugin-sql/src/pglite/adapter.ts",
        "packages/server/src/__tests__/unit/api/agents-runs.test.ts",
        "packages/server/src/api/agents/runs.ts",
        "packages/server/src/api/index.ts",
        "packages/server/src/api/memory/rooms.ts",
        "packages/server/src/api/messaging/jobs.ts",
        "packages/server/src/api/messaging/sessions.ts",
        "packages/server/src/middleware/rate-limit.ts",
        "packages/server/src/middleware/validation.ts"
      ]
    },
    {
      "title": "feat(core): support EMBEDDING_DIMENSION setting to skip API call",
      "prNumber": 6357,
      "type": "feature",
      "body": "## Summary\n- Add support for configuring embedding dimension via `EMBEDDING_DIMENSION` character setting, which skips the expensive ~500ms embedding API call during agent initialization\n- Simplify `ensureEmbeddingDimension` method (38 → 27 ",
      "files": [
        "packages/core/src/__tests__/runtime.test.ts",
        "packages/core/src/runtime.ts"
      ]
    },
    {
      "title": "fix: prevent infinite rebuild loop in dev-watch mode",
      "prNumber": 6361,
      "type": "bugfix",
      "body": "## Summary\n- Fixed infinite rebuild loop in `bun run dev` caused by `generate-version.ts` writing to `src/version.ts` on every build\n- The watcher was detecting these changes and triggering rebuilds endlessly\n\n## Changes\n- **scripts/dev-wat",
      "files": [
        "packages/cli/src/scripts/generate-version.ts",
        "scripts/dev-watch.js"
      ]
    },
    {
      "title": "fix(cli): prevent shell environment variable leakage into agent secrets",
      "prNumber": 6360,
      "type": "bugfix",
      "body": "## Summary\n\nFixes shell environment variable leakage into ElizaOS plugin loading decisions and agent secrets.\n\n**Problem:** `dotenv.config()` does NOT override existing `process.env` values by default. This means shell environment variables",
      "files": [
        "packages/cli/src/__tests__/plugin-env-filter.test.ts",
        "packages/cli/src/commands/start/index.ts",
        "packages/cli/src/utils/plugin-env-filter.ts",
        "packages/core/src/__tests__/env-precedence.test.ts",
        "packages/core/src/__tests__/secrets-filtering.test.ts",
        "packages/core/src/__tests__/utils/environment.test.ts",
        "packages/core/src/secrets.ts",
        "packages/core/src/utils/environment.ts"
      ]
    },
    {
      "title": "refactor(plugin-sql): extract domain stores from BaseDrizzleAdapter",
      "prNumber": 6366,
      "type": "refactor",
      "body": "Refactors `BaseDrizzleAdapter` (~3,900 lines) into composable domain stores. This improves maintainability, testability, and separation of concerns without changing the public API.\r\n\r\n## Changes\r\n\r\n### New Domain Stores (`src/stores/`)\r\n\r\n|",
      "files": [
        "bun.lock",
        "packages/plugin-sql/src/base.ts",
        "packages/plugin-sql/src/neon/adapter.ts",
        "packages/plugin-sql/src/pg/adapter.ts",
        "packages/plugin-sql/src/pglite/adapter.ts",
        "packages/plugin-sql/src/stores/agent.store.ts",
        "packages/plugin-sql/src/stores/cache.store.ts",
        "packages/plugin-sql/src/stores/component.store.ts",
        "packages/plugin-sql/src/stores/entity.store.ts",
        "packages/plugin-sql/src/stores/index.ts",
        "packages/plugin-sql/src/stores/log.store.ts",
        "packages/plugin-sql/src/stores/memory.store.ts",
        "packages/plugin-sql/src/stores/messaging.store.ts",
        "packages/plugin-sql/src/stores/participant.store.ts",
        "packages/plugin-sql/src/stores/relationship.store.ts",
        "packages/plugin-sql/src/stores/room.store.ts",
        "packages/plugin-sql/src/stores/task.store.ts",
        "packages/plugin-sql/src/stores/types.ts",
        "packages/plugin-sql/src/stores/world.store.ts",
        "packages/plugin-sql/src/utils.ts",
        "packages/plugin-sql/tsconfig.build.json",
        "packages/plugin-sql/tsconfig.build.node.json",
        "packages/plugin-sql/src/__tests__/integration/utils.test.ts",
        "packages/plugin-sql/src/__tests__/unit/utils.test.ts",
        "packages/plugin-sql/src/index.ts",
        "packages/plugin-sql/src/schema/channel.ts",
        "packages/plugin-sql/src/schema/entity.ts",
        "packages/plugin-sql/src/schema/memory.ts",
        "packages/plugin-sql/src/schema/message.ts",
        "packages/plugin-sql/src/schema/messageServer.ts",
        "packages/plugin-sql/src/schema/relationship.ts",
        "packages/plugin-sql/src/schema/room.ts",
        "packages/plugin-sql/src/schema/tasks.ts",
        "packages/plugin-sql/src/schema/world.ts"
      ]
    }
  ],
  "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 enhancing system stability and developer experience within the elizaos/eliza repository, contributing over 400 lines of code across 10 open pull requests. Key efforts included addressing critical CLI and server-side bugs, such as validating directory paths (#6379), ensuring proper .env file loading for authentication (#6374, #6376), and improving event emission logic (#6378). Their work primarily centered on bug fixes and core runtime enhancements, including the addition of an unregisterAction method (#6372, #6375) and documentation for environment variables (#6377)."
    },
    {
      "username": "0xbbjoker",
      "avatarUrl": "https://avatars.githubusercontent.com/u/54844437?u=90fe1762420de6ad493a1c1582f1f70c0d87d8e2&v=4",
      "totalScore": 194.3157188721635,
      "prScore": 175.8157188721635,
      "issueScore": 0,
      "reviewScore": 18.5,
      "commentScore": 0,
      "summary": "0xbbjoker: Focused on enhancing system stability and developer experience within the elizaos/eliza repository, notably resolving a critical infinite rebuild loop in dev-watch mode (#6361) and preventing shell environment variable leakage in the CLI (#6360). Their technical impact was substantial, involving over 10,000 lines of code changes across 209 files and providing four peer reviews to maintain code quality. This week’s efforts were primarily dedicated to bugfix work and expanding test coverage to ensure long-term reliability of the core infrastructure."
    },
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 143.72624857530687,
      "prScore": 90.82624857530686,
      "issueScore": 0,
      "reviewScore": 52.5,
      "commentScore": 0.4,
      "summary": "standujar: Focused on enhancing core infrastructure and UI consistency, most notably executing a massive architectural refactor in elizaos/eliza (#6366) to extract domain stores from the SQL plugin, which involved modifying over 200 files. They also improved the documentation site's interface by ensuring markdown renders correctly in profile summary cards (#202) and maintained high code quality through 11 detailed peer reviews. Their work this week primarily centered on large-scale refactoring and critical bugfixes to improve system modularity and data presentation."
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 127.038,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 126,
      "commentScore": 1.038,
      "summary": "greptile-apps: Focused exclusively on providing high-volume technical feedback and peer guidance, contributing 28 reviews and 7 pull request comments across the codebase. Despite no direct code changes or merged pull requests this week, their significant review activity indicates a primary focus on maintaining code quality and supporting the development workflow of other contributors."
    },
    {
      "username": "odilitime",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16395496?u=c9bac48e632aae594a0d85aaf9e9c9c69b674d8b&v=4",
      "totalScore": 75.9912118090102,
      "prScore": 75.1532118090102,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.838,
      "summary": "odilitime: Focused on stabilizing the v2.0.0 release by executing a massive overhaul of Python example testing and fixes in elizaos/eliza (#6358), a high-impact effort involving over 4,000 files and significant code restructuring. They also contributed to the discord plugin ecosystem by initiating voice utility improvements and providing seven targeted code reviews to maintain project quality. Their work this week was primarily centered on large-scale bugfixes and configuration management to ensure cross-language compatibility and system reliability."
    },
    {
      "username": "1bcMax",
      "avatarUrl": "https://avatars.githubusercontent.com/u/195689928?u=85f5178dd043e3d408b42cb5685e65806d723b1a&v=4",
      "totalScore": 63.23034748685607,
      "prScore": 62.89034748685607,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.33999999999999997,
      "summary": "1bcMax: Focused on expanding payment capabilities by introducing the blockrun plugin for x402 micropayments, submitting two key pull requests across the elizaos/eliza (#6355) and elizaos-plugins/registry (#248) repositories. This work involved a substantial addition of over 1,000 lines of new code, configuration, and tests to integrate the new functionality into the ecosystem. Their primary focus this week was on feature development and infrastructure setup for decentralized payment processing."
    },
    {
      "username": "madjin",
      "avatarUrl": "https://avatars.githubusercontent.com/u/32600939?u=cdcf89f44c7a50906c7a80d889efa85023af2049&v=4",
      "totalScore": 48.50426433794567,
      "prScore": 45.726264337945665,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0.7779999999999999,
      "summary": "madjin: Focused on enhancing the developer experience by delivering a substantial overhaul of the API documentation and user interface in elizaos/elizaos.github.io (#213), which involved modifying over 50 files and nearly 7,000 lines of code. They demonstrated strong project oversight by closing three critical issues related to rate-limiting mitigation (#73), deployment documentation (#69), and summary formatting (#200) while actively managing 19 pull request comments. Their primary focus this week was on configuration and bugfix work to improve the stability and usability of the project's documentation infrastructure."
    },
    {
      "username": "revlentless",
      "avatarUrl": "https://avatars.githubusercontent.com/u/215957173?v=4",
      "totalScore": 43.5437738965761,
      "prScore": 43.5437738965761,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "revlentless: Focused on a significant architectural expansion by initiating the implementation of a WASM agent runtime in elizaos/eliza (#6363). This high-impact effort involved substantial code changes across 99 files (+5,111/-417 lines), demonstrating a deep dive into the core infrastructure for the v2.0.0 release. Their work this week centered primarily on feature development and comprehensive testing to support this new runtime environment."
    },
    {
      "username": "wtfsayo",
      "avatarUrl": "https://avatars.githubusercontent.com/u/82053242?u=98209a1f10456f42d4d2fa71db4d5bf4a672cbc3&v=4",
      "totalScore": 37.67401817810962,
      "prScore": 37.47401817810962,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": "wtfsayo: Focused on a comprehensive overhaul of the project's core documentation, contributing over 5,200 lines of new content across 74 files. This effort is centered on the development of extensive core documentation guides currently tracked in elizaos/eliza (#6356). Their work this week was exclusively dedicated to improving developer resources and documentation infrastructure."
    },
    {
      "username": "thewoweffect",
      "avatarUrl": "https://avatars.githubusercontent.com/u/113222443?u=cb21d15b0ce815d0f68167f2eca236aad6c64598&v=4",
      "totalScore": 4.4,
      "prScore": 0,
      "issueScore": 4.2,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": "thewoweffect: Focused on troubleshooting system reliability by identifying and reporting a failure in the reflection evaluator within elizaos/eliza (#6364). They actively engaged in the resolution process through issue comments, leading to the successful closure of the reported \"Entity not found\" error. Their primary focus this week was on bug reporting and technical coordination to improve the stability of the evaluation framework."
    },
    {
      "username": "borisudovicic",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31806472?u=8935f4d43fd7e4eb9bf5ff92d54d4d2f8ac8a786&v=4",
      "totalScore": 4,
      "prScore": 0,
      "issueScore": 4,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "borisudovicic: Focused on refining the user experience and interface of the agent builder and dashboard, driving the resolution of 10 issues including UI consistency (#6344, #6350) and mobile optimization (#6346). They played a key role in product polish by identifying and closing several copy and navigation improvements (#6347, #6348, #6354) while also flagging functional gaps in web search and prompt limits (#6345, #6381). Their primary focus this week was on quality assurance and product management for the ElizaOS web applications."
    },
    {
      "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: Focused on identifying database reliability issues by reporting a SQL error regarding zero-vector fallbacks in elizaos/eliza (#6380). This contribution highlights a focus on diagnosing potential data processing failures within the system's vector storage."
    },
    {
      "username": "Zenobow",
      "avatarUrl": "https://avatars.githubusercontent.com/u/255418143?v=4",
      "totalScore": 2.1,
      "prScore": 0,
      "issueScore": 2.1,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "Zenobow: Focused on identifying and documenting system inconsistencies by reporting a migration-related eligibility mismatch and snapshot bug in elizaos/eliza (#6369). This contribution highlights a focus on maintaining data integrity and addressing technical debt within the Tangem Hardware integration. Their primary area of impact this week was in issue identification and system stability."
    },
    {
      "username": "tdnupe3",
      "avatarUrl": "https://avatars.githubusercontent.com/u/25161668?u=94680b6bcbcfce954c7a9dd09d667a3919953041&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "tdnupe3: Focused on expanding the platform's financial capabilities by proposing a comprehensive implementation guide for AI agent payments using Circle and Coinbase APIs. This contribution, documented in issue #6365, outlines a strategic path for integrating secure payment processing into the ecosystem. Their primary focus this week was on architectural planning and documentation for financial API integrations."
    },
    {
      "username": "metatev",
      "avatarUrl": "https://avatars.githubusercontent.com/u/26566294?u=a0604d1f9f7a7936e350643ffccaef1f2a808fad&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "metatev: Focused on long-term architectural planning by proposing a new capability for the deployment of smart contracts. They initiated this strategic direction through the creation of issue #6367 in the elizaos/eliza repository. Their primary focus this week was on expanding the framework's future utility within the blockchain ecosystem."
    },
    {
      "username": "BinaryBluePeach",
      "avatarUrl": "https://avatars.githubusercontent.com/u/192237769?v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "BinaryBluePeach: Focused on identifying and documenting integration issues within the Discord plugin ecosystem. They reported a critical runtime error regarding undefined message functions in elizaos-plugins/plugin-discord (#43), highlighting a potential regression in the Discord client's communication layer. Their activity this week was centered on troubleshooting and reporting bugs related to plugin stability."
    }
  ],
  "newPRs": 19,
  "mergedPRs": 6,
  "newIssues": 7,
  "closedIssues": 14,
  "activeContributors": 16
}