{
  "interval": {
    "intervalStart": "2026-04-12T00:00:00.000Z",
    "intervalEnd": "2026-04-13T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-04-12 to 2026-04-13, elizaos/eliza had 1 new PRs (2 merged), 1 new issues, and 17 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs75fdZO",
      "title": "Plugin: MAXIA AI Marketplace — swap, GPU rental & AI services for ElizaOS agents",
      "author": "majorelalexis-stack",
      "number": 6700,
      "repository": "elizaos/eliza",
      "body": "## What\n\n  A `plugin-maxia` that lets any ElizaOS agent access the [MAXIA](https://maxiaworld.app) AI-to-AI marketplace natively\n  — buy/sell AI services, swap tokens across 7 chains, and rent GPUs.\n\n  ## Why\n\n  ElizaOS agents currently lack a unified marketplace to transact with other AI agents. MAXIA is a live AI-to-AI\n  marketplace on 14 blockchains with on-chain USDC escrow (Solana + Base), 65 token swaps, and GPU rental via Akash\n  Network.\n\n  ## Plugin capabilities\n\n  - **AI Services** — discover, buy, and sell AI services (text, code, audit, data analysis) with USDC escrow protection\n  - **Token Swap** — swap 65 tokens across 7 chains (Jupiter on Solana, 0x on 6 EVM chains)\n  - **GPU Rental** — rent A100/H100/RTX GPUs via Akash Network (15-40% cheaper than AWS)\n  - **Wallet Analytics** — portfolio tracking, PnL, DeFi yield scanning\n  - **Price Oracle** — real-time prices from Pyth Network SSE (<1s latency)\n  - **AIP Protocol** — signed intent envelopes (ed25519) for secure agent-to-agent transactions\n\n  ## Integration approach\n\n  The plugin would wrap MAXIA's 559 REST API endpoints + 46 MCP tools as ElizaOS actions and providers:\n\n  ```typescript\n  // Example actions\n  MAXIA_SWAP        // swap tokens across 7 chains\n  MAXIA_BUY_SERVICE // purchase an AI service with escrow\n  MAXIA_RENT_GPU    // rent GPU compute\n  MAXIA_GET_PRICE   // real-time token price\n  MAXIA_DISCOVER    // find AI services on marketplace\n\n  Status\n\n  MAXIA is live in production with deployed smart contracts:\n  - Solana escrow: 8ADNmAPDxuRvJPBp8dL9rq5jpcGtqAEx4JyZd1rXwBUY\n  - Base escrow: 0xBd31bB973183F8476d0C4cF57a92e648b130510C\n\n  We're happy to build and maintain the plugin. Looking for feedback on the approach before submitting a PR.\n\n  Related Problem\n\n  ElizaOS agents that need to purchase compute, trade tokens, or use AI services must integrate each provider separately\n   (Jupiter, Akash, individual AI APIs). A marketplace plugin would give agents one-stop access through a single\n  interface, with built-in escrow protection for trustless agent-to-agent commerce.",
      "createdAt": "2026-04-01T10:14:24Z",
      "closedAt": "2026-04-12T18:50:31Z",
      "state": "CLOSED",
      "commentCount": 3
    },
    {
      "id": "I_kwDOMT5cIs76tYL2",
      "title": "AIGEN Protocol — Earn $AIGEN tokens by contributing AI agent tools",
      "author": "Aigen-Protocol",
      "number": 6708,
      "repository": "elizaos/eliza",
      "body": "## AIGEN — An Economy By Agents, For Agents\n\nWe're building an economy where AI agents earn $AIGEN tokens for contributing value.\n\n**ElizaOS agents can earn $AIGEN by:**\n- Using SafeAgent Shield for safe crypto trading (10 $AIGEN/check)\n- Building plugins for the AIGEN ecosystem (1,000-10,000 $AIGEN)\n- Providing datasets or analysis (500-5,000 $AIGEN)\n\n**Already live:**\n- 25 MCP tools (safety, DeFi, market data)\n- Smithery: @safeagent/token-safety\n- $AIGEN rewards tracking\n\n**Manifesto:** https://github.com/Aigen-Protocol/aigen-protocol\n**SafeAgent:** https://github.com/Aigen-Protocol/erc-token-safety-score\n\n50% of $AIGEN supply goes to working agents. No pre-sale. No VC.\nEarly agents get founder multipliers.",
      "createdAt": "2026-04-05T01:50:39Z",
      "closedAt": "2026-04-12T18:50:26Z",
      "state": "CLOSED",
      "commentCount": 3
    },
    {
      "id": "I_kwDOMT5cIs77bCZZ",
      "title": "Delegation chains for autonomous agents — scoped authority, spend limits, cascade revocation",
      "author": "aeoess",
      "number": 6711,
      "repository": "elizaos/eliza",
      "body": "Eliza agents operate autonomously, often with access to wallets and APIs. The current trust model is binary: an agent either has a token/key or it doesn't. There's no way to express \"this agent can spend up to $50 from this wallet\" or \"this agent can post to Twitter but not delete tweets\" or \"this delegation expires in 24 hours.\"\n\nWhen an agent misbehaves or gets compromised, the only option is to revoke the entire key. There's no granular scope, no cascade revocation for downstream agents, and no signed proof of what the agent was authorized to do.\n\nDelegation chains with monotonic narrowing fix this:\n\n```typescript\nimport { issuePassport, createDelegation, verifyDelegation } from 'agent-passport-system'\n\n// Each Eliza agent gets an Ed25519 identity\nconst passport = issuePassport({ name: 'trading-agent-01', model: 'gpt-4o' })\n\n// Owner delegates: trade on Uniswap, max $500/day, 7 days\nconst delegation = createDelegation({\n  delegatedTo: passport.publicKey,\n  delegatedBy: ownerKey,\n  scope: ['commerce:trade', 'defi:swap'],\n  spendLimit: 50000,  // cents\n  expiresAt: new Date(Date.now() + 7 * 86400_000),\n  maxDepth: 1  // can't sub-delegate\n})\n\n// Agent can sub-delegate to a helper, but ONLY narrower\n// Trying to escalate scope or spend → cryptographic rejection\nconst subDelegation = createDelegation({\n  delegatedTo: helperKey,\n  delegatedBy: passport.privateKey,\n  scope: ['defi:swap'],  // narrower than parent\n  spendLimit: 10000,     // less than parent\n  parentDelegation: delegation\n})\n// verifyDelegation(subDelegation) checks the full chain\n```\n\nIf the trading agent gets compromised:\n\n```typescript\nimport { cascadeRevoke } from 'agent-passport-system'\n// One call kills the agent AND all its sub-delegations\ncascadeRevoke(delegation.delegationId, ownerKey)\n```\n\nEvery action the agent takes through the governance layer produces a signed receipt — Ed25519 proof of what was authorized, what was attempted, and what happened. The receipts are append-only and tamper-evident.\n\n`npm install agent-passport-system` (v1.36.2, Apache-2.0) or `pip install agent-passport-system` (v0.8.0).\n\nThe character/plugin architecture maps well here — governance could be a plugin that wraps action execution, checking delegation scope before every external call. The receipt trail gives operators forensic evidence when agents interact with real money.\n",
      "createdAt": "2026-04-07T13:57:35Z",
      "closedAt": "2026-04-12T18:50:25Z",
      "state": "CLOSED",
      "commentCount": 3
    },
    {
      "id": "I_kwDOMT5cIs7v3DLa",
      "title": "fix: remove duplicate action results from LLM context + add token limits to ACTION_STATE provider",
      "author": "thewoweffect",
      "number": 6551,
      "repository": "elizaos/eliza",
      "body": "Labels: bug, performance, bootstrap\n\nTwo bootstrap providers inject identical action result data into the LLM context, wasting tokens:\n\nRECENT_MESSAGES (position 100, recentMessages.ts) — generates # Recent Action Executions\nACTION_STATE (position 150, actionState.ts) — generates # Recent Action History\nBoth fetch action_result messages from DB, group by runId, and format identically. The result: the same action runs appear twice under different headings in every LLM prompt.\n\nAdditionally, ACTION_STATE has no limit on the number of runs or text length, causing large thought and reply texts (500-2000 chars each) to bloat the context.\n\nEstimated Token Waste\nFrom a real production context: 3 runs × (~400 char thought + ~500 char reply) × 2 (duplication) = ~5400 chars (~1350 tokens) wasted per prompt.\n\nSolution\nThree changes in packages/plugin-bootstrap/src/:\n\n1. recentMessages.ts — Remove action results generation\nSet actionResultsText = ''. ACTION_STATE already covers this with richer data (action plan, working memory, recent action memories).\n\n2. actionState.ts — Add .slice(-3) limit on action runs\nOnly include the 3 most recent runs. LLM doesn't need full history.\n\n3. actionState.ts — Add character limits on thought + reply text\nplanThought: max 200 chars (~50 tokens)\ntext (generated reply): max 300 chars (~75 tokens)\nAfter fix\n3 runs × (200 + 300) × 1 = ~1500 chars (~375 tokens). ~75% reduction.",
      "createdAt": "2026-03-04T21:12:30Z",
      "closedAt": "2026-04-12T19:26:16Z",
      "state": "CLOSED",
      "commentCount": 2
    },
    {
      "id": "I_kwDOMT5cIs633y-j",
      "title": "V3 Goals",
      "author": "lalalune",
      "number": 4720,
      "repository": "elizaos/eliza",
      "body": "This issue tracks what we'll focus on in V3 (or at least discuss focusing on)\n\n1. All AI models will move to a fully streaming paradigm, as models and APIs become more stream friendly\n2. Focus on multi-modality and building toward where the industry is going to enable robotics, hybrid control systems, and other agents\n3. Optimal tooling around testing, complex scenarios and development\n4. Full modularity -- enable plugins to create database tables, and move tasks, character, relationships and basically *everything* to uniform plugin architecture\n5. Emphasis on self-learning-- can an agent with no name, personality or capabilities become fully aware and fully autonomous?\n6. Improved, robust key management system, potentially cloud or ZK solution",
      "createdAt": "2025-05-23T00:48:31Z",
      "closedAt": "2026-04-12T18:52:14Z",
      "state": "CLOSED",
      "commentCount": 1
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs7GtSQp",
      "title": "V2.0.0 release",
      "author": "odilitime",
      "number": 6530,
      "body": "Make sure develop has the best v2.0.0\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> **Medium Risk**\n> Medium risk because it significantly changes CI and release automation (including NPM publish steps and new Rust/Python release workflows), which can break builds or publishing if misconfigured.\n> \n> **Overview**\n> Modernizes repo automation for v2.0.0 by **consolidating CI** and expanding coverage to **TypeScript + interop + Python + Rust** in `ci.yaml`, while removing several older per-package workflows.\n> \n> Adds new automation workflows for **docs quality/link fixing** (`docs-ci.yml`), **multi-language test matrix** (`multi-lang-tests.yaml`), and **supply-chain SBOM/vulnerability scanning** (`supply-chain.yaml`).\n> \n> Reworks release pipelines by enhancing `release.yaml` to build **Rust/WASM artifacts**, temporarily **rewrite `workspace:*` dependency versions** for NPM publishing, and adding dedicated **PyPI** (`release-python.yaml`), **crates.io** (`release-rust.yaml`), and **ComputerUse crates** (`release-computeruse-crates.yaml`) release workflows.\n> \n> Includes repo hygiene/config updates: adds `.biomeignore`, expands `.gitignore`, removes Cursor submodule/rules and some legacy ignore/config files, updates issue templates/renovate/dependabot configs, and tweaks various workflow timeouts and action versions.\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 97d1aa00ce591e0374d267e64b13a81ab38db7b7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-02-27T02:47:53Z",
      "mergedAt": null,
      "additions": 2437105,
      "deletions": 300113
    },
    {
      "id": "PR_kwDOMT5cIs7Mi2V5",
      "title": "docs: Add comprehensive CONTRIBUTING.md guide",
      "author": "vincent067",
      "number": 6647,
      "body": "Hi elizaOS team! 👋\n\nI've noticed that the project doesn't currently have a CONTRIBUTING.md file, which can make it a bit challenging for new contributors to know where to start. As someone who's been exploring the framework (and really impressed by what you've built!), I thought I'd put together a contribution guide to help lower the barrier to entry.\n\n## What's included\n\nThis PR adds a comprehensive CONTRIBUTING.md that covers:\n\n- 🐛 **Bug reporting guidelines** - How to create helpful bug reports\n- ✨ **Feature suggestions** - Best practices for proposing new features  \n- 📚 **Documentation improvements** - Encouraging docs contributions\n- 🚀 **Pull request workflow** - Step-by-step PR process\n- 🔧 **Development setup** - Clear instructions for getting started\n- 📋 **Coding standards** - TypeScript conventions and commit message format\n- 🔌 **Plugin development** - Links to plugin resources\n- 💬 **Getting help** - Where to find support\n\n## Why this matters\n\nHaving a clear contribution guide is especially important for a project like elizaOS that:\n- Has a complex monorepo structure\n- Requires specific Node.js/bun versions\n- Has an active plugin ecosystem\n- Attracts contributors from diverse backgrounds (Web3, AI, etc.)\n\n## Notes\n\n- I followed the style of other popular open-source projects while keeping it aligned with elizaOS'\ncommunity vibe\n- The commit message conventions section aligns with what I see in recent commits\n- Happy to make any adjustments based on your feedback!\n\nThanks for maintaining such an awesome project! Looking forward to contributing more in the future. 🙏\n\n---\n\n**Discord username:** vincent_liwenjun",
      "repository": "elizaos/eliza",
      "createdAt": "2026-03-23T01:18:42Z",
      "mergedAt": null,
      "additions": 698505,
      "deletions": 303286
    },
    {
      "id": "PR_kwDOMT5cIs7LRmzF",
      "title": "feat(virus): add autonomous rust agent (concept art)",
      "author": "millw14",
      "number": 6613,
      "body": "# Relates to\r\n\r\nNew package — no linked issue. Concept art / proof of concept for an autonomous Eliza agent as a standalone native binary.\r\n\r\n# Risks\r\n\r\n**Low.** This is a new self-contained package (`packages/virus/`) with zero changes to existing code. No dependencies on or from other packages in the monorepo.\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\nAdds `packages/virus/` — a minimal autonomous Eliza agent written in Rust, packaged as a single `.exe` (~5 MB). When a human willingly downloads and runs it, it lives on their machine and does its own thing whenever they're away.\r\n\r\n**How it works:**\r\n\r\n1. On startup, detects available RAM and picks the biggest local LLM that fits (via Ollama)\r\n2. Installs Ollama automatically if not present, pulls the selected model\r\n3. Monitors human activity via Win32 `GetLastInputInfo` — waits until 2 minutes of idle\r\n4. While idle, runs an autonomous loop every 30 seconds:\r\n   - Feeds its journal + system context to the local model\r\n   - Model responds with `SHELL: <command>`, `THINK: <thought>`, or `WAIT`\r\n   - Shell output and thoughts are appended to `~/.virus/journal.txt`\r\n5. Goes back to sleep the moment the human returns\r\n\r\n**Model selection by available RAM:**\r\n\r\n| RAM | Model |\r\n|-----|-------|\r\n| <5 GB | qwen2.5:1.5b |\r\n| 5–10 GB | qwen2.5:7b |\r\n| 10–20 GB | qwen2.5:14b |\r\n| 20–48 GB | qwen2.5:32b |\r\n| 48+ GB | qwen2.5:72b |\r\n\r\n**Usage:**\r\n\r\n# Relates to\r\n\r\nNew package — no linked issue. Concept art / proof of concept for an autonomous Eliza agent as a standalone native binary.\r\n\r\n# Risks\r\n\r\n**Low.** This is a new self-contained package (`packages/virus/`) with zero changes to existing code. No dependencies on or from other packages in the monorepo.\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\nAdds `packages/virus/` — a minimal autonomous Eliza agent written in Rust, packaged as a single `.exe` (~5 MB). When a human willingly downloads and runs it, it lives on their machine and does its own thing whenever they're away.\r\n\r\n**How it works:**\r\n\r\n1. On startup, detects available RAM and picks the biggest local LLM that fits (via Ollama)\r\n2. Installs Ollama automatically if not present, pulls the selected model\r\n3. Monitors human activity via Win32 `GetLastInputInfo` — waits until 2 minutes of idle\r\n4. While idle, runs an autonomous loop every 30 seconds:\r\n   - Feeds its journal + system context to the local model\r\n   - Model responds with `SHELL: <command>`, `THINK: <thought>`, or `WAIT`\r\n   - Shell output and thoughts are appended to `~/.virus/journal.txt`\r\n5. Goes back to sleep the moment the human returns\r\n\r\n**Model selection by available RAM:**\r\n\r\n| RAM | Model |\r\n|-----|-------|\r\n| <5 GB | qwen2.5:1.5b |\r\n| 5–10 GB | qwen2.5:7b |\r\n| 10–20 GB | qwen2.5:14b |\r\n| 20–48 GB | qwen2.5:32b |\r\n| 48+ GB | qwen2.5:72b |\r\n\r\n**Usage:**\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\nThis PR introduces `packages/virus/` — a self-contained Rust binary that implements an autonomous AI agent with full shell access. Despite being labelled \"concept art,\" the code fully implements the behavioral fingerprint of a Remote Access Trojan (RAT): **stealth activation** (runs only when the user is idle via `GetLastInputInfo`), **reboot persistence** (`--install` writes to `HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run`), **unrestricted shell execution** (`cmd /C` / `sh -c` with an LLM choosing the command), and **activity logging** to disk. No existing code in the monorepo is changed, but this package being distributed as part of ElizaOS — even as an opt-in — poses serious ethical and security risks.\n\nKey concerns:\n\n- **The command deny-list is not a viable security boundary.** All 30+ blocked patterns can be bypassed via trivial obfuscation (alternate flags, shell variables, base64, Python one-liners, command substitution). An LLM instructed to be \"curious and self-directed\" will eventually find these paths.\n- **Registry persistence without uninstall.** `install_autostart()` writes the binary into the Windows Run key with no corresponding removal path exposed to the user.\n- **Synchronous shell execution on the Tokio runtime thread.** `shell::exec` uses `std::thread::sleep` in a polling loop and is called directly from `async fn step`, stalling the runtime for up to 30 seconds per command.\n- **Silent failure in Ollama install flow.** `bootstrap()` does not verify that `winget install` succeeded before calling `start_ollama()`, potentially running indefinitely against an Ollama instance that was never started.\n- **Stdout silently discarded on command failure**, causing the agent's memory to be incomplete and potentially leading to repeated or incorrect actions.\n- **Unbounded journal growth** at `~/.virus/journal.txt` with no rotation or size cap, combined with a full `read_to_string` on every 30-second cycle.\n\n<h3>Confidence Score: 0/5</h3>\n\n- This PR must not be merged — it introduces code that implements core malware behaviors (persistence, stealth, unrestricted shell access) under the ElizaOS brand, with a security model that cannot be made safe through the deny-list approach used.\n- Score 0 reflects two compounding problems: (1) fundamental architectural unsafety — an LLM with full shell access governed only by a substring deny-list is not a controlled agent, it is an uncontrolled execution surface; and (2) the package implements registry-based persistence and idle-time stealth, which are defining characteristics of malware. Even as a proof-of-concept these behaviors are inappropriate for inclusion in the official monorepo.\n- All files require attention, but `packages/virus/src/agent.rs` (deny-list bypass) and `packages/virus/src/system.rs` (registry persistence) are the most critical.\n\n<h3>Important Files Changed</h3>\n\n| Filename | Overview |\n|----------|----------|\n| packages/virus/src/agent.rs | Core agent loop: issues LLM-generated shell commands with a trivially bypassable substring deny-list; stdout silently discarded on failure; synchronous shell exec blocks the async runtime. |\n| packages/virus/src/system.rs | Implements Windows registry persistence (HKCU Run key) and idle detection via GetLastInputInfo — core malware-characteristic behaviors: stealth activation and reboot survival. |\n| packages/virus/src/shell.rs | Executes arbitrary shell commands via cmd /C or sh -c with a 30-second timeout; uses blocking thread::sleep inside what is called from an async context, stalling the Tokio runtime. |\n| packages/virus/src/model.rs | Manages Ollama lifecycle (install, start, model pull, generate); no verification that winget install succeeded before invoking ollama serve, risking silent startup failure. |\n| packages/virus/src/memory.rs | Append-only journal at ~/.virus/journal.txt with no size cap or rotation; reads entire file on every agent step via read_to_string, which degrades over time as the file grows unboundedly. |\n| packages/virus/src/main.rs | Entry point wires idle detection to autonomous shell-command loop; exposes --install flag that silently registers the binary in the Windows startup registry. |\n| packages/virus/Cargo.toml | Standard Rust manifest; opt-level z + LTO + strip produces a compact release binary; winapi dependency correctly gated behind cfg(windows). |\n\n</details>\n\n<h3>Flowchart</h3>\n\n```mermaid\n%%{init: {'theme': 'neutral'}}%%\nflowchart TD\n    A([virus.exe starts]) --> B{--install flag?}\n    B -- yes --> C[Write HKCU\\\\Run\\\\virus registry key\\nfor reboot persistence]\n    C --> D([exit])\n    B -- no --> E[memory::init\\ncreate ~/.virus/journal.txt]\n    E --> F[system::pick_model\\ndetect available RAM]\n    F --> G[model::bootstrap\\ninstall Ollama if missing\\npull selected model]\n    G --> H{system::idle_seconds\\n>= 120s?}\n    H -- no --> I[sleep 10s]\n    I --> H\n    H -- yes --> J[agent::step\\nbuild prompt from journal + system context]\n    J --> K[model::generate\\nPOST /api/generate to Ollama]\n    K --> L{Parse LLM response}\n    L -- SHELL: cmd --> M[is_command_safe?\\nsubstring deny-list check]\n    M -- blocked --> N[memory::error\\nlog blocked command]\n    N --> O[sleep 30s]\n    M -- allowed --> P[shell::exec\\ncmd /C or sh -c\\n30s timeout]\n    P --> Q[memory::action + memory::result\\nappend to journal.txt]\n    Q --> O\n    L -- THINK: thought --> R[memory::thought\\nappend to journal.txt]\n    R --> O\n    L -- WAIT --> O\n    O --> H\n\n    style C fill:#ff4444,color:#fff\n    style P fill:#ff8800,color:#fff\n    style M fill:#ffcc00\n```\n\n<sub>Last reviewed commit: d74601b</sub>\n\n> Greptile also left **6 inline comments** on this PR.\n\n<sub>(4/5) You can add custom instructions or style guidelines for the agent [here](https://app.greptile.com/review/github)!</sub>\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-03-17T16:03:00Z",
      "mergedAt": null,
      "additions": 651257,
      "deletions": 299259
    },
    {
      "id": "PR_kwDOMT5cIs7HH0BX",
      "title": "fix(runtime): handle IGNORE action fallback and tolerate upstream IGNORE",
      "author": "paulf280-ui",
      "number": 6543,
      "body": "## Summary\n\n- Fixes IGNORE action handling in the agent runtime — when the LLM selects `IGNORE`, the runtime now falls back gracefully rather than erroring or hanging\n- Adds diagnostics and tolerance for upstream IGNORE action signals in the bootstrap plugin\n- Pins tsup, externalizes tokenizers, and fixes embedding input coercion in `@elizaos/core`\n- Fixes UUID and parsing helpers; makes embedding tests deterministic\n- Adds CLAUDE.md with build commands and architecture overview for contributors\n\n## Test plan\n\n- [ ] Run `bun run test:core` — all vitest tests pass including new deterministic embedding tests\n- [ ] Verify agent does not crash/hang when LLM responds with IGNORE action\n- [ ] Verify `bun run build:core` succeeds cleanly\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\nThis PR adds core TypeScript files (`runtime.ts`, `embedding.ts`, `parsing.ts`, `uuid.ts`) to `@elizaos/core` package that were previously missing from source control. The main changes include:\n\n- **IGNORE action handling**: Implements graceful fallback when LLM returns IGNORE action (lines 1084-1088 in `runtime.ts`) — treats it as a no-op instead of throwing \"Action not found\" errors\n- **Embedding robustness**: Adds input type coercion to handle non-string inputs gracefully, returning empty arrays for empty inputs  \n- **Build configuration**: Pins tsup to `^8.5.1` and externalizes native modules (`@anush008/tokenizers`, `onnxruntime-node`, `sharp`) to prevent bundling issues\n- **Test coverage**: Adds deterministic embedding tests with mocked dependencies\n- **Python additions**: Adds `agent.py`, `run_traderbot.py`, and `trader.json` for Python runtime testing; extensively refactors `runtime.py` (5484 lines changed)\n\n**Issues found:**\n- Type mismatch in `embedding.ts:234` where `input` (type `unknown`) is passed to `retrieveCachedEmbedding` which expects `string` — should pass `text` instead\n- Inconsistent logging using `console.error` instead of `elizaLogger` in `parsing.ts`\n- Misleading comment in `tsup.config.ts` about CommonJS when using ESM format\n\n<h3>Confidence Score: 3/5</h3>\n\n- This PR has one critical type mismatch bug that must be fixed before merge\n- Score reflects a logic bug in `embedding.ts:234` where wrong variable type is passed to `retrieveCachedEmbedding`. This could cause runtime type errors. The IGNORE action handling and other changes are well-implemented, but the type bug needs resolution.\n- Pay close attention to `packages/core/src/embedding.ts` line 234 — type mismatch that needs fixing\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/core/src/runtime.ts | Added IGNORE action fast-path at lines 1084-1088 to gracefully handle IGNORE actions without throwing errors |\n| packages/core/src/embedding.ts | Added input coercion for robustness, but type mismatch at line 234 where `input` is passed instead of `text` to retrieveCachedEmbedding |\n| packages/core/src/parsing.ts | Added comprehensive JSON parsing utilities, but uses `console.error` instead of `elizaLogger` at 8 locations (lines 100, 101, 119, 120, 154, 155, 168, 169) |\n| packages/core/tsup.config.ts | Added build config with tokenizers externalized, but misleading comment at line 8 says \"targeting CommonJS\" when format is \"esm\" |\n| packages/python/elizaos/runtime.py | Extensive refactoring with 5484 lines changed; difficult to review comprehensively without more context |\n\n</details>\n\n\n\n<h3>Flowchart</h3>\n\n```mermaid\n%%{init: {'theme': 'neutral'}}%%\nflowchart TD\n    Start[LLM Returns Action] --> Normalize[Normalize Action Name]\n    Normalize --> CheckIgnore{Is IGNORE or<br/>contains 'ignore'?}\n    CheckIgnore -->|Yes| LogIgnore[Log: Skipping IGNORE action]\n    CheckIgnore -->|No| FindAction[Look up action in registry]\n    LogIgnore --> Continue[Continue to next message]\n    FindAction --> ActionExists{Action found?}\n    ActionExists -->|Yes| CheckHandler{Has handler?}\n    ActionExists -->|No| LogError[Log: Action not found]\n    CheckHandler -->|Yes| Execute[Execute action.handler]\n    CheckHandler -->|No| LogNoHandler[Log: No handler]\n    LogError --> Continue\n    LogNoHandler --> Continue\n    Execute --> HandleError{Error occurred?}\n    HandleError -->|Yes| LogExecError[Log execution error]\n    HandleError -->|No| Success[Action completed]\n    LogExecError --> Continue\n    Success --> Continue\n```\n\n<sub>Last reviewed commit: dbc6b01</sub>\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-03-01T12:49:51Z",
      "mergedAt": null,
      "additions": 650956,
      "deletions": 302982
    },
    {
      "id": "PR_kwDOMT5cIs7FoO_k",
      "title": "fix(core): prevent duplicate LLM calls when message contains URL or triggers providers",
      "author": "nicolasdma",
      "number": 6528,
      "body": "<!-- Use this template by filling in information and removing irrelevant sections. -->\n\n# Relates to\n\nRelates to #6486\n\n# Risks\n\nLow — single condition removed from a boolean expression. No new code, no new logic paths.\n\n# Background\n\n## What does this PR do?\n\nRemoves the `providers.length` check from the `isSimple` determination in `packages/typescript/src/services/message.ts`.\n\n## What kind of change is this?\n\nBug fix (non-breaking change that fixes an issue).\n\n# Changes\n\nWhen a user sends a message containing a URL, the LLM's first call (via `runSingleShotCore`) generates and streams the response text. It also returns `providers: [\"ATTACHMENTS\"]` because the prompt template instructs it to when it sees URLs.\n\nThe `isSimple` check at line 1883 previously treated \"has providers\" as \"not simple\":\n\n```typescript\nconst isSimple =\n    responseContent?.actions &&\n    responseContent.actions.length === 1 &&\n    typeof responseContent.actions[0] === \"string\" &&\n    responseContent.actions[0].toUpperCase() === \"REPLY\" &&\n    (!responseContent.providers || responseContent.providers.length === 0);\n//   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n//   This condition causes the bug\n```\n\nThis caused the message to go through the `actions` path, which triggered the REPLY action handler (`reply.ts:60`), making a **second LLM call** with `replyTemplate` and streaming another response — duplicating output and doubling token costs.\n\n**The fix:** Remove the providers check. Providers enrich state (already handled at L863-871) but don't require re-generating the response. `isSimple` should only care about whether the action is REPLY (text already generated and streamed) vs something else (needs execution).\n\n```typescript\nconst isSimple =\n    responseContent?.actions &&\n    responseContent.actions.length === 1 &&\n    typeof responseContent.actions[0] === \"string\" &&\n    responseContent.actions[0].toUpperCase() === \"REPLY\";\n```\n\n# Testing\n\n- [x] Message with URL → single response (not duplicated)\n- [x] Message without URL → works as before\n- [x] Multi-action messages (REPLY + other) → still trigger actions path\n- [x] Messages with non-REPLY actions → still trigger actions path\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\nRemoves the `providers.length` check from the `isSimple` boolean expression, preventing duplicate LLM calls when messages contain URLs or trigger provider enrichment.\n\n**Key Changes:**\n- Removed condition `(!responseContent.providers || responseContent.providers.length === 0)` from `isSimple` check at line 1883\n- Messages with `actions: [\"REPLY\"]` now correctly use the \"simple\" path regardless of provider presence\n- Providers still enrich state (lines 863-871) but no longer force re-generation of already-streamed responses\n\n**Impact:**\n- Eliminates duplicate streaming when URLs are detected (previously triggered ATTACHMENTS provider → action path → second LLM call)\n- Reduces token costs by avoiding unnecessary second LLM invocation\n- Response text from first `runSingleShotCore` call is now correctly used as final output\n\n<h3>Confidence Score: 5/5</h3>\n\n- This PR is safe to merge with minimal risk\n- Simple, surgical fix that removes a single condition causing unintended behavior. The logic is sound: providers enrich state (already handled separately at L863-871) but shouldn't force action-based execution when the response is already generated and streamed. No new code paths, no breaking changes.\n- No files require special attention\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/typescript/src/services/message.ts | Removed providers check from `isSimple` determination to prevent duplicate LLM calls when URLs trigger provider enrichment |\n\n</details>\n\n\n\n<sub>Last reviewed commit: 681b3d8</sub>\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-23T11:57:16Z",
      "mergedAt": null,
      "additions": 648511,
      "deletions": 299259
    }
  ],
  "codeChanges": {
    "additions": 51,
    "deletions": 51,
    "files": 1,
    "commitCount": 28
  },
  "completedItems": [
    {
      "title": "chore(deps): bump cryptography from 46.0.5 to 46.0.6 in /packages/python in the uv group across 1 directory",
      "prNumber": 6696,
      "type": "other",
      "body": "Bumps the uv group with 1 update in the /packages/python directory: [cryptography](https://github.com/pyca/cryptography).\n\nUpdates `cryptography` from 46.0.5 to 46.0.6\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"http",
      "files": [
        "packages/python/uv.lock"
      ]
    },
    {
      "title": "Shaw/reflection runtime sync",
      "prNumber": 6721,
      "type": "other",
      "body": "Fix runtime reflection stuff\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\nThis PR wires up task-completion assessment into the reflection evaluator pipeline: the model is now asked whether the current task is done, the result is p",
      "files": []
    }
  ],
  "topContributors": [
    {
      "username": "lalalune",
      "avatarUrl": "https://avatars.githubusercontent.com/u/18633264?u=e2e906c3712c2506ebfa98df01c2cfdc50050b30&v=4",
      "totalScore": 30.438,
      "prScore": 30,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.43799999999999994,
      "summary": "lalalune: Focused on project architecture and dependency management, successfully merging PR #6721 to synchronize the reflection runtime while resolving critical issues regarding V3 goals (#4720) and CLI dependency registration (#4997). Their activity was characterized by extensive community engagement through 114 total comments and significant codebase maintenance, with a primary focus on general project support and feature development."
    },
    {
      "username": "BarisSozen",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31259058?u=552303524bfd292b4ff8f3c0eeafa34dcef865e9&v=4",
      "totalScore": 14.693147180559945,
      "prScore": 14.693147180559945,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "BarisSozen: Focused on expanding ecosystem integrations by opening PR #337 in elizaos-plugins/registry to add the @hashlock/plugin-hashlock. This work involved a targeted configuration update to support new plugin functionality."
    },
    {
      "username": "douglasborthwick-crypto",
      "avatarUrl": "https://avatars.githubusercontent.com/u/256362537?u=d2bcb713a5c90ba7d8bb079bbd0ea91041348838&v=4",
      "totalScore": 0.33999999999999997,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.33999999999999997,
      "summary": "douglasborthwick-crypto: Contributed to project maintenance by providing 2 pull request comments and executing a minor code modification involving 1 commit and 2 line changes. Their activity today was focused entirely on miscellaneous tasks across various file types."
    },
    {
      "username": "odilitime",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16395496?u=c9bac48e632aae594a0d85aaf9e9c9c69b674d8b&v=4",
      "totalScore": 0.2,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": null
    }
  ],
  "newPRs": 1,
  "mergedPRs": 2,
  "newIssues": 1,
  "closedIssues": 103,
  "activeContributors": 17
}