{
  "interval": {
    "intervalStart": "2026-01-13T00:00:00.000Z",
    "intervalEnd": "2026-01-14T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-01-13 to 2026-01-14, elizaos/eliza had 5 new PRs (1 merged), 0 new issues, and 6 active contributors.",
  "topIssues": [
    {
      "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_kwDOMT5cIs7iYgxe",
      "title": "In non-signed up version, make \"Sign up for free\" in agent message a hyperlink to sign up",
      "author": "borisudovicic",
      "number": 6353,
      "repository": "elizaos/eliza",
      "body": "See agent's message here below.\n\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/bf11b5bd-aa7a-488b-8ac8-fee65e066b31/4dae5333-e25e-4c93-881b-06c9f9a2238d?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy9iZjExYjViZC1hYTdhLTQ4OGItOGFjOC1mZWU2NWUwNjZiMzEvNGRhZTUzMzMtZTI1ZS00YzkzLTg4MWItMDZjOWY5YTIyMzhkIiwiaWF0IjoxNzY3OTg2MDI5LCJleHAiOjE3OTk1NTY1ODl9.ILGGqZ87OZOcNyFnG8MDu3Q75vEMW-ag15e4oCDHHpY \" alt=\"Screenshot 2026-01-09 at 14.12.50.png\" width=\"1219\" data-linear-height=\"747\" />",
      "createdAt": "2026-01-09T19:13:50Z",
      "closedAt": "2026-01-13T00:24:06Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7iX0nC",
      "title": "Public/Private icons in dashboard/my agent page",
      "author": "borisudovicic",
      "number": 6352,
      "repository": "elizaos/eliza",
      "body": "Let's move the private/public icons to the right of the agent name. Also when user hovers over the lock or globe icons, there should be a pop up (like the one below from agent builder section) describing the public/private state and what it means. Also can we find better icons to use here. More thick/bold icons.\n\nCopy for public: Public agents can be seen and interacted with by anyone.\n\nCopy for private: Only you have access to private agents.\n\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/6c6b403e-35f2-40f8-8aac-1bca2d59b7e1/ddee7fa0-29d9-48ad-9b9e-560a62ba5b6c?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy82YzZiNDAzZS0zNWYyLTQwZjgtOGFhYy0xYmNhMmQ1OWI3ZTEvZGRlZTdmYTAtMjlkOS00OGFkLTliOWUtNTYwYTYyYmE1YjZjIiwiaWF0IjoxNzY3OTgyNzg1LCJleHAiOjE3OTk1NTMzNDV9.l_Cu3Oo_P9taxNpH4KIKspD_Vbzw1Zoku3kGAGmIDzc \" alt=\"Screenshot 2026-01-09 at 13.19.36.png\" width=\"342\" />\n\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/4fd68bd6-cfa8-4d94-9e72-02009bec1a77/1004faaf-1722-4777-93a0-49e2f30f0955?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy80ZmQ2OGJkNi1jZmE4LTRkOTQtOWU3Mi0wMjAwOWJlYzFhNzcvMTAwNGZhYWYtMTcyMi00Nzc3LTkzYTAtNDllMmYzMGYwOTU1IiwiaWF0IjoxNzY3OTgyNzg1LCJleHAiOjE3OTk1NTMzNDV9.bIs9e8oNci_DWhoYiokBIxVXY9VtTzHWFVi2IL1Gq1Q \" alt=\"Screenshot 2026-01-09 at 13.15.13.png\" width=\"632\" data-linear-height=\"542\" />",
      "createdAt": "2026-01-09T18:16:29Z",
      "closedAt": "2026-01-13T00:24:06Z",
      "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": null,
      "additions": 6085,
      "deletions": 1559
    },
    {
      "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_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
    },
    {
      "id": "PR_kwDOMT5cIs689_PJ",
      "title": "fix(cli): always use 'latest' for @elizaos deps in created projects",
      "author": "0xbbjoker",
      "number": 6362,
      "body": "## Summary\n\n- Fixes issue where `elizaos create` fails when CLI is linked from monorepo because packages with version like `1.7.2-alpha.0` couldn't be found on npm\n- Both build-time and runtime scripts now use `'latest'` for `@elizaos/*` dependencies instead of pinning to CLI version\n- Ensures created projects can always install dependencies from npm, regardless of CLI version used\n\n## Changes\n\n### `packages/cli/src/scripts/copy-templates.ts`\n- Removed CLI version reading logic\n- `updatePackageJson` now always converts `workspace:*` to `'latest'`\n- Simplified filter function in copy operation\n\n### `packages/cli/src/utils/copy-template.ts`\n- Simplified `normalizeElizaDeps` function to always set `'latest'` for `@elizaos/*` deps\n- Removed duplicate path in template search array\n- Cleaned up verbose comments\n\n### `packages/cli/tests/utils/copy-template.test.ts`\n- Added test for \"latest\" version enforcement\n- Removed verbose comments\n\n### `packages/cli/tests/integration/local-development.test.ts` (new)\n- Integration tests for local development scenarios:\n  1. Monorepo development with `bun run dev/start`\n  2. Linked CLI development from `packages/project-starter`\n  3. Bundled templates use `'latest'` versions\n  4. Version consistency between source and bundled templates\n\n## Test plan\n\n- [x] Run `bun test tests/utils/copy-template.test.ts` - all tests pass\n- [x] Run `bun test tests/integration/local-development.test.ts` - all tests pass\n- [x] Run `bun run build:cli` - CLI builds successfully\n- [x] Run `bun run lint` - code passes linting\n- [x] Verify bundled templates in `dist/templates/*/package.json` use `'latest'`\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> <sup>[Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) is generating a summary for commit 63907a14ec8cd9f256343e93d3ff5545fa510315. 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 fixes a critical issue where `elizaos create` failed when the CLI was linked from the monorepo because alpha versions (like `1.7.2-alpha.0`) couldn't be found on npm.\n\n## Key Changes\n\n- **Build-time script** (`copy-templates.ts`): Now unconditionally converts `workspace:*` to `'latest'` instead of pinning to CLI version\n- **Runtime utility** (`copy-template.ts`): Simplified `normalizeElizaDeps` to always set `@elizaos/*` dependencies to `'latest'`, ensuring npm installability regardless of how templates are bundled\n- **Comprehensive tests**: Added integration tests verifying monorepo development, linked CLI usage, bundled template versions, and version consistency\n\n## Impact\n\nProjects created with `elizaos create` will now successfully install dependencies from npm, regardless of whether the CLI is:\n- Installed globally from npm\n- Linked from the monorepo during development\n- Running an alpha/beta version\n\nThe approach aligns with the repository's philosophy: monorepo packages use `workspace:*` (per CLAUDE.md guidelines), but generated user projects use `'latest'` for npm compatibility.\n\n### Confidence Score: 5/5\n\n- This PR is safe to merge with high confidence - it fixes a critical bug with well-tested changes\n- The changes are straightforward, well-tested, and directly address the stated problem. The logic is simplified rather than made more complex, reducing the surface area for bugs. Comprehensive unit and integration tests verify both build-time and runtime scenarios. The fix aligns with repository guidelines about workspace dependencies.\n- No files require special attention - all changes are clean and well-implemented\n\n<h3>Important Files Changed</h3>\n\n\n\nFile Analysis\n\n\n\n| Filename | Score | Overview |\n|----------|-------|----------|\n| packages/cli/src/scripts/copy-templates.ts | 5/5 | Simplified build script to always use `'latest'` instead of CLI version for `@elizaos/*` dependencies, removing version reading logic and cleaning up filter function |\n| packages/cli/src/utils/copy-template.ts | 5/5 | Refactored `normalizeElizaDeps` to unconditionally set all `@elizaos/*` dependencies to `'latest'`, removed duplicate template path, cleaned up verbose comments |\n| packages/cli/tests/utils/copy-template.test.ts | 5/5 | Added test case to verify all `@elizaos/*` dependencies are set to `'latest'` for npm installability |\n| packages/cli/tests/integration/local-development.test.ts | 5/5 | New integration test file covering 4 scenarios: monorepo development, linked CLI, bundled templates, and version consistency |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Dev as Developer\n    participant Build as build.ts\n    participant CopyTemplates as copy-templates.ts\n    participant Mono as Monorepo packages/\n    participant Templates as cli/templates/\n    participant Dist as cli/dist/templates/\n    participant User as elizaos create\n    participant CopyTemplate as copy-template.ts\n    participant Target as User Project\n\n    Note over Dev,Build: Build Time\n    Dev->>Build: bun run build\n    Build->>CopyTemplates: preBuild: copy-templates.ts\n    \n    CopyTemplates->>Mono: Read template packages<br/>(project-starter, plugin-starter, etc.)\n    Note over Mono: Dependencies use<br/>workspace:*\n    \n    CopyTemplates->>CopyTemplates: updatePackageJson()\n    Note over CopyTemplates: Convert workspace:* → 'latest'<br/>(NEW: Always 'latest', not CLI version)\n    \n    CopyTemplates->>Templates: Copy to cli/templates/<br/>with 'latest' versions\n    \n    Build->>Build: Compile TypeScript\n    Build->>Dist: Post-build: Copy templates/<br/>to dist/templates/\n    \n    Note over Dev,User: Runtime\n    User->>CopyTemplate: elizaos create my-project\n    \n    CopyTemplate->>CopyTemplate: Find template in<br/>dist/templates/ or fallback paths\n    \n    CopyTemplate->>Target: copyDir(template, targetDir)\n    \n    CopyTemplate->>CopyTemplate: normalizeElizaDeps()\n    Note over CopyTemplate: Set all @elizaos/* deps to 'latest'<br/>(NEW: Unconditional, not just workspace:*)\n    \n    CopyTemplate->>Target: Write package.json<br/>with 'latest' versions\n    \n    User->>Target: bun install\n    Note over Target: Successfully installs<br/>from npm registry\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-13T16:16:16Z",
      "mergedAt": null,
      "additions": 307,
      "deletions": 96
    }
  ],
  "codeChanges": {
    "additions": 2473,
    "deletions": 1149,
    "files": 50,
    "commitCount": 65
  },
  "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"
      ]
    }
  ],
  "topContributors": [
    {
      "username": "0xbbjoker",
      "avatarUrl": "https://avatars.githubusercontent.com/u/54844437?u=90fe1762420de6ad493a1c1582f1f70c0d87d8e2&v=4",
      "totalScore": 105.14137221366065,
      "prScore": 91.64137221366065,
      "issueScore": 0,
      "reviewScore": 13.5,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "odilitime",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16395496?u=c9bac48e632aae594a0d85aaf9e9c9c69b674d8b&v=4",
      "totalScore": 43.9817738965761,
      "prScore": 43.5437738965761,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.43799999999999994,
      "summary": null
    },
    {
      "username": "revlentless",
      "avatarUrl": "https://avatars.githubusercontent.com/u/215957173?v=4",
      "totalScore": 43.5437738965761,
      "prScore": 43.5437738965761,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 22.7,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 22.5,
      "commentScore": 0.2,
      "summary": null
    }
  ],
  "newPRs": 5,
  "mergedPRs": 1,
  "newIssues": 0,
  "closedIssues": 3,
  "activeContributors": 6
}