{
  "interval": {
    "intervalStart": "2026-02-01T00:00:00.000Z",
    "intervalEnd": "2026-02-08T00:00:00.000Z",
    "intervalType": "week"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-02-01 to 2026-02-08, elizaos/eliza had 7 new PRs (5 merged), 25 new issues, and 18 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7nsf3_",
      "title": "[Agent] Eliza Character File & Prompt Engineering",
      "author": "borisudovicic",
      "number": 6447,
      "repository": "elizaos/eliza",
      "body": "## Description\n\nImprove Eliza's character file and prompts based on initial testing feedback.\n\n## Background\n\nBoris (Feb 2): \"I've talked to Eliza only a little bit, just to test her out. I think she'll definitely need some edits in her character file, some more prompt engineering. She's a good start so far, but there's definitely stuff we're gonna have to work on. It'll be iterative.\"\n\n## Acceptance Criteria\n\n- [ ] Review current character file responses\n- [ ] Identify areas needing improvement\n- [ ] Update character file with better prompts\n- [ ] Add message examples (Ben has PRs for this)\n- [ ] Test with Sonnet model\n- [ ] Iterate based on user feedback\n\n## Technical Notes\n\nBen mentioned:\n\n* Currently using a different model, switching to Sonnet\n* Two PRs coming that add message examples and change model to Sonnet\n* \"Huge difference in price between Sonnet and \\[current model\\]\"\n\nBoris mentioned Sonnet 5 coming out soon - good timing to test on Eliza if cheaper.\n\n## Priority\n\n**P2 - Iterative improvement**",
      "createdAt": "2026-02-02T17:48:44Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 1
    },
    {
      "id": "I_kwDOMT5cIs68iWIi",
      "title": "EVENT MESSAGE SENT not working",
      "author": "Srenonno",
      "number": 5216,
      "repository": "elizaos/eliza",
      "body": "**Describe the bug**\n\nthe sendAgentResponseToBus doens't emit event EventType.MESSAGE_SENT when Sending payload to central server API endpoint (/api/messaging/submit).\n \n**To Reproduce**\n\nCreate a plugin with Message_sent event and it worn't get triggred\n**Expected behavior**\nthe vent need to be emmitted for every message submitted to the central channel\n",
      "createdAt": "2025-06-20T12:13:56Z",
      "closedAt": "2026-02-04T19:22:01Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7BduHW",
      "title": "feat(scenarios): Enhance LLM Judge with multi-level evaluation",
      "author": "monilpat",
      "number": 5637,
      "repository": "elizaos/eliza",
      "body": "#### **Description**\n\nCurrently, the `llm_judge` evaluator provides a binary `PASS`/`FAIL` outcome. This is effective for clear-cut cases but doesn't capture the nuance of Large Language Model (LLM) responses, which can often be partially correct, contain good information but have poor formatting, or be conceptually right but incomplete.\n\nThis ticket proposes an enhancement to the `llm_judge` evaluator to support a multi-level evaluation scale (e.g., `FAIL`, `PARTIAL PASS`, `PASS`). This will enable more granular and realistic testing of LLM behavior, providing more insightful feedback on an agent's performance. It allows scenario creators to define what constitutes a full pass versus a partial one, leading to more sophisticated agent evaluations.\n\n#### **Acceptance Criteria**\n\n1.  The `LLMJudgeEvaluationSchema` in `packages/cli/src/scenarios/schema.ts` is updated to allow the `expected` field to be an array of strings, representing the possible evaluation levels (e.g., `['FAIL', 'PARTIAL', 'PASS']`).\n2.  The `LLMJudgeEvaluator` in `packages/cli/src/scenarios/EvaluationEngine.ts` is refactored to instruct the LLM judge to respond with one of the provided evaluation levels.\n3.  The `EvaluationResult` interface is updated to include the specific `level` (e.g., 'PARTIAL') returned by an evaluator, in addition to the overall `success` boolean.\n4.  The `Reporter` class in `packages/cli/src/scenarios/Reporter.ts` is updated to display the evaluation level in its output, using distinct icons and colors for each level (e.g., ✅ PASS, 🟠 PARTIAL, ❌ FAIL).\n5.  The final `judgment` logic in `packages/cli/src/commands/scenario.ts` is enhanced to accommodate the new levels. For example, an `all_pass` strategy should require all evaluations to achieve the highest success level (e.g., 'PASS').\n6.  The process exit code logic remains `0` for an overall scenario pass and `1` for a fail, based on the final judgment.\n\n#### **Technical Approach**\n\n**1. Update Scenario Schema (`schema.ts`)**\n\nModify the `LLMJudgeEvaluationSchema` to accept an array of strings for the `expected` field. This array defines the custom evaluation scale for the judge. The system prompt for the LLM will be dynamically constructed from this array.\n\n```typescript\n// packages/cli/src/scenarios/schema.ts\n// ...\nconst LLMJudgeEvaluationSchema = BaseEvaluationSchema.extend({\n  type: z.literal('llm_judge'),\n  prompt: z.string(),\n  // Change from z.string() to z.array(z.string()) to define the evaluation scale.\n  // Default to a binary scale if not provided.\n  expected: z.array(z.string()).optional().default(['FAIL', 'PASS']),\n});\n// ...\n```\n\n**2. Refactor Evaluation Engine (`EvaluationEngine.ts`)**\n\nThe `LLMJudgeEvaluator` must be updated to pass the new evaluation scale to the LLM. The general `EvaluationResult` type will also be updated to include the `level`.\n\n```typescript\n// packages/cli/src/scenarios/EvaluationEngine.ts\n// ...\nexport interface EvaluationResult {\n    success: boolean; // True if not the lowest evaluation level\n    level: string;    // The specific outcome, e.g., 'PASS', 'FAIL', 'PARTIAL'\n    message: string;\n}\n\ninterface Evaluator {\n    // This method will now return the string level of the outcome.\n    evaluate(runtime: IAgentRuntime, result: ScenarioResult): Promise<string>;\n    getMessage(level: string): string;\n    // Helper to get the expected levels\n    getLevels(): string[];\n}\n\nclass LLMJudgeEvaluator implements Evaluator {\n    constructor(private prompt: string, private expected: string[]) {}\n\n    async evaluate(runtime: IAgentRuntime, result: ScenarioResult): Promise<string> {\n        const systemPrompt = `You are an AI assistant that judges the output of a command. Based on the prompt and the command output, respond with ONLY one of the following values: [${this.expected.join(', ')}].`;\n\n        const llmResult = await runtime.useModel('TEXT_LARGE', {\n            system: systemPrompt,\n            messages: [{\n                role: 'user',\n                content: `Prompt: ${this.prompt}\\nOutput: ${result.stdout}`\n            }]\n        });\n        \n        const response = llmResult.trim().toUpperCase();\n        // Validate the LLM's response against the expected levels.\n        if (this.expected.map(e => e.toUpperCase()).includes(response)) {\n            return response;\n        }\n        // Default to the first (lowest) level if the LLM's response is invalid.\n        return this.expected[0].toUpperCase();\n    }\n    \n    getLevels(): string[] {\n        return this.expected;\n    }\n    // ... getMessage remains similar ...\n}\n\nexport class EvaluationEngine {\n    // ...\n    async run(runtime: IAgentRuntime, result: ScenarioResult): Promise<EvaluationResult[]> {\n        const results: EvaluationResult[] = [];\n        for (const evaluator of this.evaluators) {\n            const level = await evaluator.evaluate(runtime, result);\n            const levels = evaluator.getLevels();\n            // \"Success\" is defined as any outcome that is not the lowest possible level.\n            const success = level !== levels[0].toUpperCase();\n            results.push({ success, level, message: evaluator.getMessage(level) });\n        }\n        return results;\n    }\n}\n```\n\n**3. Enhance Reporter (`Reporter.ts`)**\n\nUpdate the reporter to handle and display the new evaluation levels with distinct formatting.\n\n```typescript\n// packages/cli/src/scenarios/Reporter.ts\n// ...\n  public reportEvaluationResults(results: EvaluationResult[]) {\n    // ...\n    results.forEach(res => {\n      let status;\n      // Use a switch to handle different levels, with default for unknown levels.\n      switch(res.level.toUpperCase()) {\n        case 'PASS':\n          status = chalk.green('✅ PASS');\n          break;\n        case 'PARTIAL':\n        case 'PARTIAL PASS':\n          status = chalk.yellow('🟠 PARTIAL');\n          break;\n        case 'FAIL':\n        default:\n          status = chalk.red('❌ FAIL');\n          break;\n      }\n      console.log(`${status}: ${res.message}`);\n    });\n    // ...\n  }\n// ...\n```\n\n**4. Update Judgment Logic (`scenario.ts`)**\n\nThe logic for determining the final outcome must be updated to be aware of the different levels.\n\n```typescript\n// packages/cli/src/commands/scenario.ts\n// ...\n// --- JUDGMENT ---\nif (scenario.judgment?.pass?.all) {\n    // Strictest strategy: all evaluations must be the highest possible level.\n    finalStatus = evalResults.every(res => res.level === 'PASS'); // Assuming 'PASS' is the highest\n}\n// Potentially add new strategies here in the future, e.g., 'all_pass_or_partial'\n// ...\n```\n\n#### **Testing Strategy**\n\n1.  **Create a new scenario file**: `llm-judge-partial-pass.scenario.yaml`.\n2.  **Define a multi-level evaluation**:\n    ```yaml\n    # ...\n    evaluations:\n      - type: llm_judge\n        prompt: \"Respond with the capital of France in a complete sentence.\"\n        expected: ['FAIL', 'PARTIAL', 'PASS']\n    judgment:\n      pass:\n        all: true # This will require a 'PASS' result\n    ```\n3.  **Run with an input that yields a partial pass** (e.g., `input: \"echo 'Paris'\"`).\n    *   **Verify**: The reporter shows `🟠 PARTIAL`, the final status is `❌ FAIL`, and the exit code is `1`.\n4.  **Run with an input that yields a full pass** (e.g., `input: \"echo 'The capital of France is Paris.'\"`).\n    *   **Verify**: The reporter shows `✅ PASS`, the final status is `✅ PASS`, and the exit code is `0`.",
      "createdAt": "2025-07-20T00:26:09Z",
      "closedAt": "2026-02-04T23:28:26Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7l9MHc",
      "title": "[Infra] Telegram Webhook Registration",
      "author": "borisudovicic",
      "number": 6425,
      "repository": "elizaos/eliza",
      "body": "## Description\n\nSet up Telegram webhook registration so the bot can catch and route messages to the correct agent instance.\n\n## Acceptance Criteria\n\n- [ ] Telegram webhook properly registered\n- [ ] Webhook endpoint receiving messages\n- [ ] Messages routed to correct agent instance\n- [ ] Works with pure webhook approach (no polling)\n\n## Technical Notes\n\n* TG will work on pure webhook but needs it registered to catch for agent\n* Odilitime can help with this setup\n* Different from Discord - TG uses webhooks natively\n\n## Priority\n\n**P0 - This Week**",
      "createdAt": "2026-01-26T22:55:20Z",
      "closedAt": "2026-02-05T10:20:33Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7l9MC5",
      "title": "[Infra] Deploy Discord as AWS Service",
      "author": "borisudovicic",
      "number": 6424,
      "repository": "elizaos/eliza",
      "body": "## Description\n\nDeploy Discord plugin as a service in our AWS infrastructure that can handle incoming messages and route them to agents.\n\n## Acceptance Criteria\n\n- [ ] Discord service deployed to AWS\n- [ ] Service can handle incoming Discord events\n- [ ] Proper scaling and reliability\n- [ ] Integrates with existing Cloud infrastructure\n\n## Technical Notes\n\n* We have a PR for this already\n* Odilitime to help get Hanzla up to speed\n* Needs to be a proper AWS service, not just local\n\n## Assignee\n\nHanzla (with help from Odilitime)\n\n## Priority\n\n**P0 - This Week**",
      "createdAt": "2026-01-26T22:55:12Z",
      "closedAt": "2026-02-06T19:50:29Z",
      "state": "CLOSED",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs68XpPS",
      "title": "V2.0.0",
      "author": "lalalune",
      "number": 6351,
      "body": "This is  a working branch of elizaOS v2.0.0\r\n\r\nCritically, this removes app, server, CLI and all non-essentials. Instead, we focus on runtime in Rust, Typescript, with critical plugins ported as well",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-09T17:06:10Z",
      "mergedAt": null,
      "additions": 2384715,
      "deletions": 298813
    },
    {
      "id": "PR_kwDOMT5cIs7CJoKo",
      "title": "next",
      "author": "lalalune",
      "number": 6474,
      "body": "This is the next version of eliza\r\n\r\nRust, python and typescript\r\n\r\n\r\n# Major Updates\r\n\r\n- Add complete Python and Rust core packages, extending Eliza to these languages\r\n- Add Python and Rust native versions of popular plugins\r\n- Remove default application, client and server infrastructure\r\n- Add examples for all major frameworks\r\n- Bootstrap is integrated into core, enabled with basicCapabilities by default and optionally extendedCapabiltiies\r\n- Core plugins are also rust, python and typescript\r\n- Comes with a WIP code agent\r\n\r\n# Minor updates\r\n\r\n- Agents can now respond without needing a roomId or worldId\r\n- Initial message memory is created inside the message handler service (was confusing and not that way)\r\n- Can running planningMode true or false, on false skips planning and calls single action (good for games and simple agents)\r\n- Actions can have arguments, and can be called with arguments. This way they can be called like tools without needing a separate step\r\n\r\nTODO\r\n- LLM mode -- can be SMALL, LARGE or DEFAULT -- SMALL and LARGE override the LLM small or large so all use the small or all use the large\r\n- checkShouldRespond defaults to true but can be turned off for ChatGPT mode",
      "repository": "elizaos/eliza",
      "createdAt": "2026-02-07T08:00:35Z",
      "mergedAt": null,
      "additions": 591239,
      "deletions": 282388
    },
    {
      "id": "PR_kwDOMT5cIs64E0uE",
      "title": "Eliza Cloud Integration, add MCP + A2A service starter, integrate CLI and starter projects tight",
      "author": "lalalune",
      "number": 6216,
      "body": "The goal of this PR is to tightly integrate the elizaos cloud plugin, which now can use cloud as a db and storage provider, and encourage users through the CLI to get up and running with elizaos cloud. CLI should auto log them in, provision API key and make sure project is set up.\r\n\r\nPlease thoroughly review and understand the create -> deploy -> publish and monetize flow, may still need some work",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-10T07:26:45Z",
      "mergedAt": null,
      "additions": 9989,
      "deletions": 101
    },
    {
      "id": "PR_kwDOMT5cIs7CDViG",
      "title": "fix: Add null/undefined checks to prevent Object.entries errors in plugin-bootstrap",
      "author": "anchapin",
      "number": 6470,
      "body": "## Summary\n\nFixes critical runtime errors in `plugin-bootstrap` providers when metadata or values are null/undefined.\n\n## Problem\n\nThe agent crashes with the error:\n```\nObject.entries requires that input parameter not be null or undefined\n```\n\nThis occurs in several providers:\n1. **relationshipsProvider**: When `entity.metadata` is null/undefined\n2. **actionStateProvider**: When `result.values` or `workingMemory` are not objects\n3. **recentMessagesProvider**: Similar issues with null values\n\n## Solution\n\nAdded proper null/undefined checks before calling `Object.entries()`:\n\n### 1. `src/providers/relationships.ts`\n- Added null/undefined check in `formatMetadata()`\n- Returns `'{}'` for null/undefined metadata instead of crashing\n\n### 2. `src/providers/actionState.ts`  \n- Added type check for `result.values` before calling `Object.entries()`\n- Added type/null check for `workingMemory` before calling `Object.keys()`\n\n## Changes\n\n- **packages/plugin-bootstrap/src/providers/relationships.ts**: Guard `formatMetadata()` against null metadata\n- **packages/plugin-bootstrap/src/providers/actionState.ts**: Add type guards for `result.values` and `workingMemory`\n\n## Testing\n\n1. Started ElizaOS agent\n2. Sent messages via web interface (http://localhost:3000)\n3. Verified no more `Object.entries` errors\n4. Confirmed agent responds properly instead of showing IGNORE action\n\n## Impact\n\n- ✅ Prevents agent crashes when entities have null metadata\n- ✅ Improves stability for action result processing\n- ✅ Fixes \"IGNORE\" action issue when agent can't retrieve conversation context\n- ✅ No breaking changes - only adds safety checks\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>\n\n<!-- greptile_comment -->\n\n<h2>Greptile Overview</h2>\n\n<h3>Greptile Summary</h3>\n\nThis PR fixes critical `Object.entries` runtime errors in plugin-bootstrap providers that caused agent crashes when metadata or values were null/undefined. However, **the PR contains significantly more changes than described in the title and description**.\n\n## What's Actually in This PR\n\n### 1. Plugin-Bootstrap Fixes (Matches PR Description)\n- `actionState.ts`: Added type guards before `Object.entries()` on `result.values` and `workingMemory`\n- `relationships.ts`: Added null check in `formatMetadata()` to prevent crashes\n\n### 2. Major New Feature (Not Mentioned in PR Description)\n- **Request Context System**: New per-entity settings infrastructure for multi-tenant deployments\n  - Added `packages/core/src/request-context.ts` and `request-context.node.ts` (856+ lines)\n  - Modified `runtime.ts` `getSetting()` to check request context first\n  - Enables different users sharing the same runtime to have different API keys, OAuth tokens, etc.\n\n### 3. Message Service Changes (Not Mentioned in PR Description)\n- Refactored message creation logic in `message.ts`\n- Added `MESSAGE_SENT` event emission after sending to central server\n\n### 4. Version Bumps\n- All packages bumped to `1.7.3-alpha.3`\n\n## Concerns\n\nThe PR title says \"fix: Add null/undefined checks\" but this PR includes:\n- A major architectural feature (request context system)\n- Message service refactoring\n- 30 files changed, 1107 insertions, 52 deletions\n\n**This should have been split into separate PRs** for better review, testing, and rollback capability. The plugin-bootstrap fixes are straightforward and safe, but bundling them with a major new feature makes it difficult to:\n- Review each change independently\n- Test each feature in isolation\n- Roll back if issues arise with one component\n\n## Technical Review\n\nThe actual code changes are well-implemented:\n- Null checks are correctly placed and handle edge cases\n- Request context system follows AsyncLocalStorage patterns appropriately\n- Message service changes maintain event emission order\n\nThe plugin-bootstrap fixes will definitely prevent the `Object.entries` crashes described in the PR.\n\n<h3>Confidence Score: 3/5</h3>\n\n- This PR contains well-implemented code but has significant scope creep beyond its stated purpose\n- Score of 3 reflects that while the code quality is good and the plugin-bootstrap fixes are safe, the PR includes undocumented major features (request context system, message service changes) that should have been separate PRs. This makes comprehensive testing difficult and increases risk. The PR description is misleading about the actual scope of changes.\n- Pay close attention to `packages/core/src/runtime.ts` and `packages/core/src/request-context.ts` as these introduce a new architectural pattern for per-entity settings that affects how settings are resolved throughout the system\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-bootstrap/src/providers/actionState.ts | Added type guards for `result.values` and `workingMemory` before calling `Object.keys()` to prevent runtime errors when these values are null/undefined |\n| packages/plugin-bootstrap/src/providers/relationships.ts | Added null/undefined check in `formatMetadata()` to return `'{}'` when metadata is null/undefined instead of crashing on `Object.entries()` |\n| packages/core/src/runtime.ts | Added request context lookup in `getSetting()` for per-entity settings support - enables multi-tenant deployments with per-user API keys |\n| packages/server/src/services/message.ts | Refactored message creation to emit MESSAGE_SENT event after successfully sending to central server, improving event lifecycle tracking |\n| packages/core/src/request-context.ts | New file implementing request context system for per-entity settings in multi-tenant deployments |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant MessageService\n    participant Runtime\n    participant Provider\n    participant Database\n\n    Note over User,Database: Object.entries Error Flow (Before Fix)\n    User->>MessageService: Send message\n    MessageService->>Runtime: Process message\n    Runtime->>Provider: Get context (actionStateProvider)\n    Provider->>Provider: Access result.values (null)\n    Provider->>Provider: Object.entries(null) ❌\n    Provider-->>Runtime: CRASH\n\n    Note over User,Database: Fixed Flow (After This PR)\n    User->>MessageService: Send message\n    MessageService->>Runtime: Process message\n    Runtime->>Provider: Get context (actionStateProvider)\n    Provider->>Provider: Check if result.values is object\n    alt result.values is null/undefined\n        Provider->>Provider: Skip Object.entries\n    else result.values is valid object\n        Provider->>Provider: Object.entries(result.values) ✓\n    end\n    Provider-->>Runtime: Return formatted context\n    Runtime->>Runtime: Generate response\n    Runtime->>Database: Create memory\n    MessageService->>MessageService: Emit MESSAGE_SENT event\n    MessageService-->>User: Response delivered\n\n    Note over User,Database: Request Context Feature (New)\n    User->>Runtime: getSetting(key)\n    Runtime->>Runtime: Check request context\n    alt Entity-specific setting exists\n        Runtime-->>User: Return entity setting\n    else No entity setting\n        Runtime->>Runtime: Fall back to agent setting\n        Runtime-->>User: Return agent setting\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<sub>(2/5) Greptile learns from your feedback when you react with thumbs up/down!</sub>\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-02-06T17:51:12Z",
      "mergedAt": null,
      "additions": 9596,
      "deletions": 54
    },
    {
      "id": "PR_kwDOMT5cIs6-HSpn",
      "title": "V2.0.0: dynamic execution engine (test if context is going to blown)",
      "author": "odilitime",
      "number": 6384,
      "body": "Redo #6113 for 2.0.0, first pass\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Introduces a validation-aware, schema-driven prompt execution path and applies it across runtimes and message flows.\n> \n> - Adds `dynamic_prompt_exec_from_state`/`dynamicPromptExecFromState` (TS/Python/Rust) with per-field/checkpoint UUID validation codes, required-field checks, and retry with backoff; supports XML/JSON\n> - Refactors message handling (should-respond, single-shot, multi-step decision, final summary) to use structured schemas instead of ad-hoc parsing\n> - Implements streaming support in TS with `ValidationStreamExtractor`, `MarkableExtractor`, and streaming context helpers; emits rich `StreamEvent`s\n> - Introduces shared types: `SchemaRow`, `RetryBackoffConfig`, `StreamEvent(Type)` in Python/Rust/TS type modules\n> - Adds XML parsing utilities (nested-safe) and normalizes structured responses; basic templating in Rust, Handlebars in TS\n> - Exposes validation level configuration (0–3) and model selection; defaults to large text models\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1e447bbc005cbad715eb819aba27eb35b54aa5b8. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added dynamic prompt execution with state injection and schema-driven validation.\n  * Enabled validation-aware streaming with configurable validation levels (0-3).\n  * Introduced built-in retry logic with exponential backoff for improved resilience.\n  * Support for structured output validation across JSON and XML formats.\n  * Per-field and checkpoint-level validation for enhanced data integrity.\n\n<sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub>\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nIntroduces `dynamicPromptExecFromState()` across Python, Rust, and TypeScript runtimes to provide schema-driven prompt execution with context validation via UUID codes. The implementation detects when LLMs truncate output due to limited context windows by injecting validation codes at strategic positions (start/middle/end or per-field). Supports four validation levels (0=trusted to 3=full), exponential backoff retries, and optional validation-aware streaming via `ValidationStreamExtractor`.\n\n**Key changes:**\n- Cross-language API consistency for dynamic prompt execution with state injection\n- Validation code system to detect context overflow (4 levels: trusted, progressive, checkpoint, full)\n- Streaming integration with progressive validation and retry support\n- Schema-based structured output parsing (XML/JSON) with required field validation\n- Performance metrics tracking per model+schema combination (TypeScript only)\n- Comprehensive type definitions (`SchemaRow`, `RetryBackoffConfig`, `StreamEvent`)\n\n**Critical issues in Python implementation:**\n- Callable prompt invocation wraps state incorrectly (`{\"state\": state}` vs direct state access)\n- Template substitution assumes `state.values` has dynamic attributes accessible via `dir()`, incompatible with protobuf State\n- XML parsing regex `\\w+` won't match validation field names with underscores like `code_text_start`\n\n**Minor issues:**\n- Rust template rendering uses basic string replacement instead of full Handlebars compiler\n- TypeScript `_smartRetryContext` deletion during retry loop prevents reuse on subsequent attempts\n- ValidationStreamExtractor abort handling may leave inconsistent state\n\n<h3>Confidence Score: 3/5</h3>\n\n\n- Python implementation has runtime errors that will break production usage; TypeScript and Rust implementations are safer but need testing\n- Score reflects critical logical errors in Python (3 bugs that will cause runtime failures), plus architecture differences across languages. TypeScript implementation is most complete with metrics and full Handlebars support. Python bugs must be fixed before merge to avoid breaking callers.\n- `packages/python/elizaos/runtime.py` requires immediate fixes for callable invocation, state.values access pattern, and XML regex. Test the Python implementation thoroughly before merging.\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/python/elizaos/runtime.py | Adds `dynamic_prompt_exec_from_state` with validation codes and retry logic; has critical bugs in callable invocation, state.values access, and XML parsing regex |\n| packages/rust/src/runtime.rs | Implements `dynamic_prompt_exec_from_state` with validation and retry; template rendering is basic string replacement vs full Handlebars |\n| packages/typescript/src/runtime.ts | Implements `dynamicPromptExecFromState` with metrics, streaming, and validation; minor issue with `_smartRetryContext` deletion timing |\n| packages/typescript/src/utils/streaming.ts | Implements validation-aware streaming with multiple extractor types; minor state inconsistency on abort signal |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant Runtime\n    participant ValidationExtractor\n    participant LLM\n    participant Parser\n\n    Client->>Runtime: dynamicPromptExecFromState(state, schema, options)\n    \n    Note over Runtime: Generate validation codes<br/>(UUID snippets)\n    \n    Runtime->>Runtime: Build extended schema<br/>with validation fields\n    \n    Runtime->>Runtime: Inject codes into prompt<br/>(initial, middle, end)\n    \n    Runtime->>Runtime: Compile template with<br/>Handlebars/state values\n    \n    alt Streaming enabled\n        Runtime->>ValidationExtractor: Create extractor<br/>(level, schema, codes)\n    end\n    \n    loop Retry attempts (0 to maxRetries)\n        Runtime->>LLM: Generate text with prompt\n        \n        alt Streaming\n            loop Stream chunks\n                LLM-->>ValidationExtractor: chunk\n                ValidationExtractor->>ValidationExtractor: Extract field content\n                ValidationExtractor->>ValidationExtractor: Check per-field codes<br/>(level 0-1)\n                ValidationExtractor-->>Client: Stream validated content\n            end\n        else Non-streaming\n            LLM-->>Runtime: Complete response\n        end\n        \n        Runtime->>Runtime: Clean response<br/>(remove <think> tags)\n        \n        Runtime->>Parser: Parse XML/JSON response\n        Parser-->>Runtime: Parsed fields object\n        \n        Runtime->>Runtime: Normalize structured response\n        \n        alt Validation level 0-1\n            loop For each field with code\n                Runtime->>Runtime: Check start/end codes match\n            end\n        else Validation level 2-3\n            Runtime->>Runtime: Check checkpoint codes<br/>(one_initial, one_middle, etc)\n        end\n        \n        Runtime->>Runtime: Validate required fields<br/>are present and non-empty\n        \n        alt All validations pass\n            alt Streaming (level 2-3)\n                Runtime->>ValidationExtractor: flush()\n                ValidationExtractor-->>Client: Buffered content\n            end\n            Runtime->>Runtime: Remove validation code fields\n            Runtime->>Runtime: Update success metrics\n            Runtime-->>Client: Return parsed response\n        else Validation fails\n            alt Has retries remaining\n                Runtime->>Runtime: Calculate backoff delay\n                Runtime->>Runtime: Wait for backoff\n                Note over Runtime: Loop continues with retry\n            else No retries left\n                Runtime->>Runtime: Update failure metrics\n                Runtime-->>Client: Return null\n            end\n        end\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-20T02:29:59Z",
      "mergedAt": "2026-02-06T18:10:02Z",
      "additions": 4309,
      "deletions": 1591
    }
  ],
  "codeChanges": {
    "additions": 6250,
    "deletions": 2264,
    "files": 51,
    "commitCount": 25
  },
  "completedItems": [
    {
      "title": "docs: core documentation guides",
      "prNumber": 6356,
      "type": "docs",
      "body": "## Summary\n- Adds core documentation pages: architecture, core concepts, plugin development, interop, deployment, and API reference.\n\n## Test plan\n- [ ] Review rendered markdown formatting and links.\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n",
      "files": [
        "docs/API_REFERENCE.md",
        "docs/ARCHITECTURE.md",
        "docs/CORE_CONCEPTS.md",
        "docs/DEPLOYMENT_GUIDE.md",
        "docs/INTEROP_GUIDE.md",
        "docs/PLUGIN_DEVELOPMENT.md",
        "packages/interop/README.md"
      ]
    },
    {
      "title": "fix(server): emit MESSAGE_SENT event after sending to central server",
      "prNumber": 6378,
      "type": "bugfix",
      "body": "This PR fixes #5216 - EventType.MESSAGE_SENT event not being emitted when agent responses are sent to the central server API.\n\n## Problem\n\nThe `sendAgentResponseToBus` function in `packages/server/src/services/message.ts` sends agent respon",
      "files": [
        "packages/server/src/services/message.ts"
      ]
    },
    {
      "title": "V2.0.0: dynamic execution engine (test if context is going to blown)",
      "prNumber": 6384,
      "type": "tests",
      "body": "Redo #6113 for 2.0.0, first pass\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Introduces a validation-aware, schema-driven prompt execution path and applies it across runtimes and message flows.\n> \n> - Adds `dynamic_prompt_exec_from_state`/`dy",
      "files": [
        "packages/python/elizaos/runtime.py",
        "packages/python/elizaos/services/message_service.py",
        "packages/python/elizaos/types/__init__.py",
        "packages/python/elizaos/types/state.py",
        "packages/rust/src/runtime.rs",
        "packages/rust/src/services/message_service.rs",
        "packages/rust/src/types/mod.rs",
        "packages/rust/src/types/state.rs",
        "packages/rust/src/types/streaming.rs",
        "packages/typescript/src/runtime.ts",
        "packages/typescript/src/services/message.ts",
        "packages/typescript/src/types/runtime.ts",
        "packages/typescript/src/types/state.ts",
        "packages/typescript/src/types/streaming.ts",
        "packages/typescript/src/utils/streaming.ts",
        "bun.lock",
        "package.json"
      ]
    },
    {
      "title": "V2.0.0: fixed avatar example and elevenlabs plugin",
      "prNumber": 6387,
      "type": "bugfix",
      "body": "# Relates to\r\n\r\nFixes ElevenLabs API integration issues in `examples/avatar` (formerly `vrm` example) and consolidates the project structure.\r\n\r\n# Risks\r\n\r\nLow. Changes are isolated to the `examples/avatar` directory and the `plugin-elevenl",
      "files": [
        "examples/avatar/README.md",
        "examples/avatar/index.html",
        "examples/avatar/src/App.tsx",
        "examples/vrm/src/App.tsx",
        "plugins/plugin-elevenlabs/README.md",
        "plugins/plugin-elevenlabs/python/README.md",
        "plugins/plugin-elevenlabs/python/src/eliza_plugin_elevenlabs/types.py",
        "plugins/plugin-elevenlabs/python/tests/conftest.py",
        "plugins/plugin-elevenlabs/python/tests/test_types.py",
        "plugins/plugin-elevenlabs/rust/README.md",
        "plugins/plugin-elevenlabs/rust/src/services/elevenlabs_service.rs",
        "plugins/plugin-elevenlabs/rust/src/types.rs",
        "plugins/plugin-elevenlabs/rust/tests/integration_tests.rs",
        "plugins/plugin-elevenlabs/rust/tests/tts_integration.rs",
        "plugins/plugin-elevenlabs/typescript/README.md",
        "plugins/plugin-elevenlabs/typescript/package.json",
        "plugins/plugin-elevenlabs/typescript/src/index.browser.ts",
        "plugins/plugin-elevenlabs/typescript/src/index.ts",
        "plugins/plugin-s3-storage/README.md"
      ]
    },
    {
      "title": "feat(core): add request context for per-user entity settings",
      "prNumber": 6457,
      "type": "feature",
      "body": "## Summary\n- Adds `RequestContext` using AsyncLocalStorage to propagate per-request entity settings\n- Enables runtime methods to access the originating entity context without explicit parameter passing\n- Includes helper methods: `withEntity",
      "files": [
        "packages/core/src/__tests__/request-context.test.ts",
        "packages/core/src/__tests__/runtime-request-context.test.ts",
        "packages/core/src/index.node.ts",
        "packages/core/src/index.ts",
        "packages/core/src/request-context.node.ts",
        "packages/core/src/request-context.ts",
        "packages/core/src/runtime.ts"
      ]
    }
  ],
  "topContributors": [
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 255.3033606936588,
      "prScore": 250.10336069365877,
      "issueScore": 0,
      "reviewScore": 5,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "0xbbjoker",
      "avatarUrl": "https://avatars.githubusercontent.com/u/54844437?u=90fe1762420de6ad493a1c1582f1f70c0d87d8e2&v=4",
      "totalScore": 122.52868371689756,
      "prScore": 120.52868371689756,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "anchapin",
      "avatarUrl": "https://avatars.githubusercontent.com/u/6326294?u=2864a5f885294da5b54b95865b6bf6b82781e688&v=4",
      "totalScore": 72.99868671293827,
      "prScore": 72.99868671293827,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 68.1,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 67.5,
      "commentScore": 0.6000000000000001,
      "summary": null
    },
    {
      "username": "borisudovicic",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31806472?u=8935f4d43fd7e4eb9bf5ff92d54d4d2f8ac8a786&v=4",
      "totalScore": 42,
      "prScore": 0,
      "issueScore": 42,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "lalalune",
      "avatarUrl": "https://avatars.githubusercontent.com/u/18633264?u=e2e906c3712c2506ebfa98df01c2cfdc50050b30&v=4",
      "totalScore": 37.504773896576104,
      "prScore": 37.1647738965761,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.33999999999999997,
      "summary": null
    },
    {
      "username": "hanzlamateen",
      "avatarUrl": "https://avatars.githubusercontent.com/u/10975502?u=53f23921078d9a27d96751373bb44f4bd2d58bf4&v=4",
      "totalScore": 34.39669771918965,
      "prScore": 34.39669771918965,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "bytes0xcr6",
      "avatarUrl": "https://avatars.githubusercontent.com/u/102038261?u=45bcd82b0f6cc2f6c6f8db5bdc01949b3afe7560&v=4",
      "totalScore": 23.546573590279973,
      "prScore": 14.346573590279972,
      "issueScore": 0,
      "reviewScore": 9,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "erdGeclaw",
      "avatarUrl": "https://avatars.githubusercontent.com/u/258411179?u=4607f14fd9d7eb4b4e6d2c26964d37b47937a49c&v=4",
      "totalScore": 22.034212794122055,
      "prScore": 22.034212794122055,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "arthur-orderly",
      "avatarUrl": "https://avatars.githubusercontent.com/u/258538952?v=4",
      "totalScore": 14.346573590279972,
      "prScore": 14.346573590279972,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "0xKairo",
      "avatarUrl": "https://avatars.githubusercontent.com/u/258482051?u=1b8329700a063d57382def591660e68809952a16&v=4",
      "totalScore": 14.346573590279972,
      "prScore": 14.346573590279972,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "ATHLSolutions",
      "avatarUrl": "https://avatars.githubusercontent.com/u/6761719?u=3517709343c7ed9e4e80cd95304fff0c357e58e0&v=4",
      "totalScore": 14,
      "prScore": 14,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "10inchdev",
      "avatarUrl": "https://avatars.githubusercontent.com/u/226776904?u=f8556423cfa0bd4464d64395c6c0d526050ba553&v=4",
      "totalScore": 12.874147180559946,
      "prScore": 12.874147180559946,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "puncar-dev",
      "avatarUrl": "https://avatars.githubusercontent.com/u/72890404?v=4",
      "totalScore": 8,
      "prScore": 0,
      "issueScore": 8,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "saoirse102345-blip",
      "avatarUrl": "https://avatars.githubusercontent.com/u/258542122?v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "fiv3fingers",
      "avatarUrl": "https://avatars.githubusercontent.com/u/59544796?u=58c2849a3bd9087a4d2e0a5d31ba3cba75babfd6&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "basedmereum",
      "avatarUrl": "https://avatars.githubusercontent.com/u/223933470?v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    }
  ],
  "newPRs": 7,
  "mergedPRs": 5,
  "newIssues": 25,
  "closedIssues": 22,
  "activeContributors": 18
}