{
  "interval": {
    "intervalStart": "2026-04-26T00:00:00.000Z",
    "intervalEnd": "2026-05-03T00:00:00.000Z",
    "intervalType": "week"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-04-26 to 2026-05-03, elizaos/eliza had 121 new PRs (109 merged), 19 new issues, and 16 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs8AAAABAKqtpQ",
      "title": "telegram read receipts should fetch by message IDs and avoid nested receipt lookup",
      "author": "dutchiono",
      "number": 7009,
      "repository": "elizaos/eliza",
      "body": "## Summary\nA follow-up is needed after the fix in commit `55f4f27` / PR #7008.\n\nThe critical correctness bug around 1:1 outbound read state is fixed:\n- use `readViaOutbox` (`numericMsgId <= readOutboxMaxId`) for 1:1 outbound read status\n- use `readViaCount` as fallback for groups\n- clarify the `getMessagesReadParticipants` limitation\n\nTwo issues remain.\n\n## Remaining issue 1: requested message IDs are not fetched directly\n`getTelegramReadReceipts` still calls:\n\n```ts\nclient.getMessages(entity, {\n  search: \"\",\n  limit: Math.max(requested.size * 2, MAX_RECENT_LIMIT),\n})\n```\n\nThis is not an IDs-based fetch and can silently miss older requested message IDs.\n\n### Expected fix\n- extend `TelegramLocalClientLike.getMessages` to support an `ids` parameter\n- fetch the exact requested Telegram message IDs instead of relying on `search: \"\"`\n- make `getTelegramReadReceipts` deterministic for older messages\n\n## Remaining issue 2: O(n*m) receipt lookup\nThe final assembly still does a nested scan via:\n- `args.messageIds.map(...)`\n- `receipts.find(...)`\n\nThis should be replaced with a `Map<string, TelegramReadReceiptResult>` so lookup is linear.\n\n## Why this matters\n- issue 1 is still a correctness gap\n- issue 2 is lower-risk, but worth fixing while touching the same path\n\n## Context\n- fixed in PR: #7008\n- fixed commit: `55f4f27`",
      "createdAt": "2026-04-22T01:21:52Z",
      "closedAt": "2026-04-29T21:07:32Z",
      "state": "CLOSED",
      "commentCount": 1
    },
    {
      "id": "I_kwDOMT5cIs8AAAABA4Rdow",
      "title": "build: dev-ui.mjs references `./claude-code-stealth.mjs` preload that doesn't exist on fresh clone",
      "author": "Sw4pIO",
      "number": 7210,
      "repository": "elizaos/eliza",
      "body": "## Summary\n\n`packages/app-core/scripts/dev-ui.mjs` declares `./claude-code-stealth.mjs` as a Bun `--preload` entry when the user has an Anthropic subscription, but **no build step generates that file** and **it isn't checked in**. The script's existence check (`existsSync(path.join(cwd, filePath))`) silently filters the missing file out of the preload list, so the stealth fetch interceptor never installs.\n\nThe interceptor is what prepends the Claude Code system prefix and identity headers (`anthropic-beta`, `user-agent: claude-cli/...`, `x-app: cli`) that Anthropic's API requires for OAuth subscription tokens. Without it, every `api.anthropic.com` request from a subscription user gets `401 Invalid authentication credentials` even though the token is valid and registered correctly.\n\nThe TypeScript source is at `packages/agent/src/auth/claude-code-stealth.ts` and exports `installClaudeCodeStealthFetchInterceptor()`, but the dev preload expects a different file at the **repo root**, named `.mjs`, that auto-runs on import.\n\n## Reproduction\n\nOn a fresh clone of any consumer repo (e.g. milady on `develop`):\n\n1. Sign in to an Anthropic subscription via `POST /api/subscription/anthropic/start` + `/exchange` so `~/.eliza/auth/anthropic-subscription.json` is written.\n2. Manually enable `@elizaos/plugin-anthropic` in `~/.<branding>/<branding>.json` (auto-enable refuses for subscription-only).\n3. Set `ANTHROPIC_AUTH_MODE=oauth` and `CLAUDE_CODE_OAUTH_TOKEN=<token>` in the runtime env.\n4. `bun run dev`\n5. Boot log shows:\n   ```\n   [milady] Stealth imports enabled: \n   ```\n   (notice — empty list because the file doesn't exist; it was silently filtered)\n6. Send any chat message → backend retries 3× with `AI_APICallError: Invalid authentication credentials` and surfaces the parse error to the user.\n\n## Diagnostic trail\n\n- `packages/app-core/scripts/dev-ui.mjs:785` declares the preload:\n  ```js\n  if (stealth.claude) nodeStealthImports.push(\"./claude-code-stealth.mjs\");\n  ```\n- Then filters by existence:\n  ```js\n  const resolvedStealthImports = nodeStealthImports.filter((filePath) =>\n    existsSync(path.join(cwd, filePath)),\n  );\n  ```\n- `find . -name claude-code-stealth.mjs -not -path '*/node_modules/*'` returns nothing on a fresh clone.\n- The TS source exists at `packages/agent/src/auth/claude-code-stealth.ts` and exports `installClaudeCodeStealthFetchInterceptor()`. Nothing builds it into the expected location.\n\n## Suggested fix\n\nEither of:\n\n1. **Check in / generate the `.mjs`** at the repo root (or wherever `cwd` resolves to in `dev-ui.mjs`), with a self-installing call at the bottom. I verified locally that creating this file unblocks the Anthropic subscription auth path end-to-end (successful chat turns, zero 401s, model calls confirmed via `[stealth] →anthropic` debug logs with `ELIZA_STEALTH_DEBUG=1`).\n\n2. **Fail loud instead of silent**: in `dev-ui.mjs`, when `stealth.claude === true` but the resolved preload file is missing, log a clear warning so users know what's wrong instead of chasing parse errors.\n\nBoth would help; (1) makes the feature work out of the box, (2) prevents the same multi-hour debug hunt for the next person.\n\n## Why this matters\n\nWithout the stealth interceptor, subscription auth is **completely non-functional** on the runtime side, which:\n- Makes the `/api/subscription/anthropic/*` flow look broken (it works correctly, but the runtime that consumes its credentials can't actually use them).\n- Forces users to either get a paid API key or sign up for Eliza Cloud — even though the codebase clearly intends to support direct subscription OAuth via the stealth path.\n\n## Environment\n- bun 1.3.13\n- eliza submodule HEAD: `4e650ca0ad`\n- Discovered while booting milady on `develop`",
      "createdAt": "2026-04-29T22:09:53Z",
      "closedAt": "2026-05-01T20:04:54Z",
      "state": "CLOSED",
      "commentCount": 1
    },
    {
      "id": "I_kwDOMT5cIs8AAAABA2wj0Q",
      "title": "@elizaos/agent server has hard imports from app-* packages, contradicts \"standalone backend\" description",
      "author": "2-A-M",
      "number": 7204,
      "repository": "elizaos/eliza",
      "body": "\n### Summary\n\n`@elizaos/agent` is described in [`packages/agent/package.json`](https://github.com/elizaOS/eliza/blob/main/packages/agent/package.json) as:\n\n> \"Standalone elizaOS-based agent and backend server package.\"\n\nIn practice, [`packages/agent/src/api/server.ts`](https://github.com/elizaOS/eliza/blob/main/packages/agent/src/api/server.ts#L31-L49) imports directly from a number of Milady-app-specific packages, which makes the package non-standalone for any host that isn't Milady:\n\n```ts\n// packages/agent/src/api/server.ts\nimport { DropService, setElizaMakerDropService } from \"@elizaos/app-elizamaker\";\nimport { handleKnowledgeRoutes } from \"@elizaos/app-knowledge/routes\";\nimport {\n  normalizeJsonRpcUrl,\n  probeJsonRpcEndpoint,\n  TxService,\n} from \"@elizaos/app-steward/api/tx-service\";\nimport {\n  ensurePrivyWalletsForCustomUser,\n  isPrivyWalletProvisioningEnabled,\n} from \"@elizaos/app-steward/services/privy-wallets\";\nimport { wireCoordinatorBridgesWhenReady } from \"@elizaos/app-task-coordinator/api/coordinator-wiring\";\nimport {\n  handleTrainingRoutes,\n  handleTrajectoryRoute,\n} from \"@elizaos/app-training/routes\";\n```\n\nThe same pattern shows up in [`@elizaos/app-core`](https://github.com/elizaOS/eliza/tree/main/packages/app-core) — its source re-exports from `@elizaos/app-companion` (e.g. [`character-catalog.ts`](https://github.com/elizaOS/eliza/blob/main/packages/app-core/src/character-catalog.ts), [`state/vrm.ts`](https://github.com/elizaOS/eliza/blob/main/packages/app-core/src/state/vrm.ts), [`components/pages/VectorBrowserView.tsx`](https://github.com/elizaOS/eliza/blob/main/packages/app-core/src/components/pages/VectorBrowserView.tsx)) and imports from `@elizaos/app-steward` in several files (`awareness/contributors/wallet.ts`, `api/client.ts`, `api/client-wallet.ts`, `config/boot-config-store.ts`). `app-core/package.json` describes itself as `\"Shared application core for elizaOS white-label agent apps\"` — same gap.\n\n### Why this matters\n\nFor Atelier — and any future fork that wants to embed elizaOS as a backend — there is no clean spawn target in upstream eliza that doesn't pull in Milady-specific app code, services, routes, and dependencies (xyflow, ethers, telegraf, the full Milady plugin tree). We're tolerating it in v0.1 because cleaning it up isn't on our critical path, but the bundle includes ~50MB of dead Milady code and the dependency graph carries Milady-app concepts (steward wallets, elizamaker drops, lifeops automations) that have no meaning in a non-Milady host.\n\nThe pattern of routes-extracted-into-the-app-itself already exists in this repo — see `server.ts:30`:\n\n```ts\n// Discord local routes extracted to @elizaos/plugin-discord (setup-routes.ts)\n```\n\nSo the architectural shape is established. It just hasn't been generalized to the other apps that still have routes living in the agent server.\n\n### Possible PR shapes — which would you accept?\n\n1. **Move app-* routes into the apps themselves.** `app-elizamaker`, `app-knowledge`, `app-steward`, `app-task-coordinator`, `app-training` would each export their own `setup-routes.ts` (mirroring `plugin-discord`). `agent/src/api/server.ts` would no longer import from any `@elizaos/app-*` package; the apps register their routes via a host-controlled list (or via `runtime.registerRoutes(...)` if such an API is preferred).\n2. **Promote the truly-shared parts into a new `@elizaos/runtime` package.** `@elizaos/agent` becomes a thin orchestrator over `@elizaos/runtime`. Hosts that want a Milady-style stack import `@elizaos/agent`; hosts that want only the runtime import `@elizaos/runtime`. Bigger refactor; cleaner long-term.\n3. **Document the actual coupling and rename `@elizaos/agent`.** If the Milady coupling is intentional and the maintainers prefer to keep it, the package description should reflect that — and a separate \"really standalone\" runtime package should exist for forks. We'd rather have honest naming than a misleading \"standalone\" label.\n\n### What we're doing while this is in flight\n\nWe're spawning `@elizaos/app-core/src/entry.ts start` as-is from Atelier's main process. The Milady coupling rides along in our bundle. We've tracked the cleanup as a follow-up gated on this issue's outcome.\n\n### Reproduction (if useful)\n\n```bash\ngit clone https://github.com/elizaOS/eliza\ncd eliza\ngrep -nE 'from [\"\\'@/]*elizaos/app-(elizamaker|knowledge|steward|task-coordinator|training|companion)' \\\n  packages/agent/src packages/app-core/src\n```\n\nReturns ~15 matches across `packages/agent/src/api/server.ts` and the `app-core` files cited above.\n\n---\n\nHappy to draft a PR for any of (1)/(2)/(3) once we know which shape would land. Thanks for elizaOS — the orchestration layer is exactly what we needed.\n",
      "createdAt": "2026-04-29T17:17:50Z",
      "closedAt": "2026-04-29T21:37:19Z",
      "state": "CLOSED",
      "commentCount": 1
    },
    {
      "id": "I_kwDOMT5cIs8AAAABA18TjA",
      "title": "ux: opaque \"No handler found for delegate type: ACTION_PLANNER\" when no LLM provider is configured",
      "author": "andex23",
      "number": 7203,
      "repository": "elizaos/eliza",
      "body": "## Summary\n\nWhen a runtime boots without any LLM provider plugin (no `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `OPENROUTER_API_KEY` / `ELIZAOS_CLOUD_API_KEY` / Ollama / etc.), the boot logs a clear, actionable message:\n\n```\nInfo [eliza] No AI provider plugin was loaded. Set an API key environment variable\n(e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY) or log in to\nEliza Cloud (ELIZAOS_CLOUD_API_KEY) to enable at least one model provider.\n```\n\nBut as soon as the user sends a chat message, the message service calls `runtime.useModel(ModelType.ACTION_PLANNER, ...)` (`packages/typescript/src/services/message.ts:3753`), which walks the fallback chain `[ACTION_PLANNER, TEXT_MEDIUM, TEXT_SMALL]`, finds nothing registered, and throws:\n\n```\nError: No handler found for delegate type: ACTION_PLANNER\n   at AgentRuntime.useModel (packages/typescript/src/runtime.ts:4250)\n```\n\nIn the dashboard chat this surfaces as:\n\n> I hit an internal parsing error while preparing the reply. Reason: No handler found for delegate type: ACTION_PLANNER. Please try again or ask me to retry the last step.\n\nThat message is misleading — there's no parsing error, retrying won't help, and the real fix (set an API key or sign in to Eliza Cloud) is nowhere in the user-facing string. The runtime already knows this state at boot.\n\n## Repro\n\n1. Fresh checkout, no `*_API_KEY` env vars set, not signed in to Eliza Cloud.\n2. `bun run dev`\n3. Note the `[eliza] No AI provider plugin was loaded.` info log — boot is otherwise clean.\n4. Open the dashboard, send any chat message to the default agent.\n5. The reply contains the cryptic `ACTION_PLANNER` error.\n\n## Suggested fix\n\nIn `AgentRuntime.useModel` (`packages/typescript/src/runtime.ts` around line 4249), when `resolveModelRegistration` returns `undefined` for any text-generation model, detect \"no provider configured at all\" (no handlers registered for any of `TEXT_NANO/TEXT_SMALL/TEXT_MEDIUM/TEXT_LARGE/TEXT_MEGA/RESPONSE_HANDLER/ACTION_PLANNER/TEXT_COMPLETION`) and throw a typed, user-facing error such as:\n\n```ts\nthrow new NoModelProviderConfiguredError(\n  \"This agent has no LLM provider configured. \" +\n  \"Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY in your environment, \" +\n  \"or sign in to Eliza Cloud (ELIZAOS_CLOUD_API_KEY).\"\n);\n```\n\nThe chat surface (e.g. milady's dashboard) can then catch that specific error type and render the actionable hint instead of the \"internal parsing error\" generic. The current opaque message stays only for the genuine case where one provider is registered but the requested model + its fallbacks all happen to be missing — which is the rarer, real \\\"misconfiguration\\\" case.\n\n## Environment\n- bun 1.3.13\n- eliza submodule HEAD: `4e650ca0ad`\n- Discovered while exercising the dashboard chat in milady on `develop`",
      "createdAt": "2026-04-29T14:56:06Z",
      "closedAt": "2026-04-29T21:11:35Z",
      "state": "CLOSED",
      "commentCount": 1
    },
    {
      "id": "I_kwDOMT5cIs8AAAABA1ztIQ",
      "title": "bug: commit 8551fccafe deleted re-export shims but left dangling imports across packages/agent",
      "author": "andex23",
      "number": 7202,
      "repository": "elizaos/eliza",
      "body": "## Summary\n\nCommit [`8551fccafe`](https://github.com/elizaos/eliza/commit/8551fccafe) (\"updates\", Apr 15 2026) deleted ~30 single-line re-export shim files under `packages/agent/src/**`, but did **not** update the consumers that still import from them. The result: on a fresh clone, the API server crashes immediately on startup with `Cannot find module './<deleted-shim>.js'` errors.\n\n## Reproduction\n\nOn any consumer of this commit (e.g. milady-ai/milady on `develop`, which pins eliza to a descendant of `8551fccafe`):\n\n1. `bun install`\n2. `bun run dev`\n3. API process exits during boot with one of the errors below.\n\n## Verified missing modules → still imported\n\nI bisected by restoring shims one at a time. The following deleted files have **live importers** that were not updated:\n\n| Deleted shim | Re-exported from | Still imported by |\n|---|---|---|\n| `packages/agent/src/api/task-agent-message-routing.ts` | `@elizaos/app-task-coordinator/api/task-agent-message-routing` | `packages/agent/src/api/server.ts`, `packages/agent/src/api/server-helpers-swarm.ts` |\n| `packages/agent/src/api/website-blocker-routes.ts` | `@elizaos/app-lifeops/routes/website-blocker-routes` | `packages/agent/src/api/server.ts` |\n| `packages/agent/src/runtime/roles/src/utils.ts` | `@elizaos/core` | `packages/agent/src/runtime/roles/src/index.ts`, `packages/agent/src/config/includes.ts` |\n| `packages/agent/src/onboarding-presets.ts` | `@elizaos/shared/onboarding-presets` | `packages/shared/src/i18n/keyword-matching.ts` |\n| `packages/agent/src/providers/lifeops.ts` | `@elizaos/app-lifeops/providers/lifeops` | `packages/agent/src/api/workbench-routes.ts` |\n| `packages/agent/src/actions/life-param-extractor.ts` | `@elizaos/app-lifeops/actions/life-param-extractor` | `packages/agent/src/actions/life-param-extractor-real.test.ts` |\n| `packages/agent/src/actions/life-recent-context.ts` | `@elizaos/app-lifeops/actions/life-recent-context` | `packages/agent/src/actions/context-signal.ts` |\n\nThere may be more — I stopped after the dev server got past boot. The full deletion list from `8551fccafe` contains 33 source files; finding which ones still have callers is straightforward with `git grep`.\n\n## Sample error\n\n```\nerror: Cannot find module './task-agent-message-routing.js'\n       from '/path/to/eliza/packages/agent/src/api/server.ts'\n```\n\nThe `.js` extension comes from ESM-style relative imports against `.ts` sources, but the underlying `.ts` file is gone.\n\n## Suggested fix\n\nTwo reasonable options:\n\n1. **Restore the shim files** (one-line `export * from \"@elizaos/<app-package>/...\"` each). Lowest-impact, preserves the existing import boundary.\n2. **Update the importers** to point at the underlying app package directly (e.g. change `from \"./website-blocker-routes.js\"` to `from \"@elizaos/app-lifeops/routes/website-blocker-routes\"`). Cleaner long-term but touches more files.\n\nI have local diffs for option 1 (verified the dev server boots cleanly with all 7 shims restored). Filing as an issue per request rather than sending a PR — happy to convert if useful.\n\n## Environment\n- bun 1.3.13\n- eliza submodule HEAD: `4e650ca0ad` (descendant of `8551fccafe`)\n- Discovered while booting milady on `develop`",
      "createdAt": "2026-04-29T14:37:23Z",
      "closedAt": "2026-04-29T21:02:47Z",
      "state": "CLOSED",
      "commentCount": 1
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs7XooKA",
      "title": "chore: add cloud and plugins, remove rust and python",
      "author": "lalalune",
      "number": 7235,
      "body": "This PR simplifies and consolidates",
      "repository": "elizaos/eliza",
      "createdAt": "2026-05-02T11:46:07Z",
      "mergedAt": "2026-05-03T00:50:22Z",
      "additions": 1307096,
      "deletions": 248884
    },
    {
      "id": "PR_kwDOMT5cIs7V0zva",
      "title": "Shaw/checkpoint 20260426 eliza",
      "author": "lalalune",
      "number": 7135,
      "body": "Add some new things",
      "repository": "elizaos/eliza",
      "createdAt": "2026-04-27T04:40:12Z",
      "mergedAt": null,
      "additions": 26405,
      "deletions": 4667
    },
    {
      "id": "PR_kwDOMT5cIs7WsOJC",
      "title": "feat(vault): @elizaos/vault — cross-platform secrets vault + Settings UI integration",
      "author": "Dexploarer",
      "number": 7197,
      "body": "# Relates to\n\nThis is the upstream-targeting twin of milady-ai/eliza#6. The vault feature originated in the Milady fork; this PR lands the upstream-relevant slice on `elizaOS/eliza:develop`.\n\n# Risks\n\n**Low.** The vault is an additive workspace package; the runtime + Settings UI integration is a write-through mirror over the existing `config.env.X` storage path, so disabling it is a one-line change in `plugins-compat-routes.ts` (`mirrorPluginSensitiveToVault` → no-op). Cross-platform secret-service behaviour is exercised by a new dedicated CI workflow (macOS Keychain / Windows Credential Manager / Linux libsecret) so the headline portability claim is verifiable on every PR. The legacy `config.env.X` write path is unchanged — even if every vault call failed, plugin saves would still persist.\n\n# Background\n\n## What does this PR do?\n\nAdds **`@elizaos/vault`** — a cross-platform secrets/config vault — and wires it into the agent runtime + Settings UI so the existing \"save my OpenAI key\" flow stops storing plaintext in `config.env` and starts encrypting at rest with a key from the OS keychain.\n\n### `@elizaos/vault` (new package, `packages/vault/`)\n\n- **Encryption-at-rest** with AES-256-GCM, secret-id-as-AAD (so a leaked ciphertext can't be replayed against a different key).\n- **Master key in the OS keychain by default** — macOS Keychain, Windows Credential Manager, Linux Secret Service via `@napi-rs/keyring`.\n- **Headless fallback**: `passphraseMasterKey()` / `passphraseMasterKeyFromEnv(\"MILADY_VAULT_PASSPHRASE\")` derives the master key with `scrypt` for Linux servers and CI without a Secret Service agent.\n- `defaultMasterKey()` chains keychain → passphrase → throws `MasterKeyUnavailableError` whose message names every remediation path.\n- **One API for sensitive and non-sensitive config** — `vault.set(key, value, { sensitive: true })` vs `vault.set(key, value)`.\n- **Password-manager references are first-class** — values can live in 1Password / Proton Pass / Bitwarden, the vault stores only the resolver reference.\n- **`SecretsManager`** layer routes per-key writes/reads to the user-selected backend (`in-house`, `1password`, `bitwarden`, `protonpass`), with detection + preferences API at `/api/secrets/manager/{backends,preferences}`.\n- **Audit log** at `audit/vault.jsonl` per write.\n- **Testing harness** (`@elizaos/vault/testing#createTestVault`) that produces a vault wired to an in-memory master key for downstream tests.\n\n### Runtime + Settings UI integration\n\n- **Write-through mirror in `/api/plugins/:id` PUT**: when a sensitive plugin field is saved, the value is mirrored into the vault (encrypted at rest) on top of the existing `config.env.X` write. Mirror failures are surfaced to the UI under `vaultMirrorFailures` rather than silently swallowed.\n- **Vault-first reveal**: `POST /api/plugins/:id/reveal` consults `sharedVault().get(key)` before falling back to `process.env` / `config.env`, so a freshly-saved key is the value the user sees.\n- **Per-process cached `sharedVault()`** so concurrent saves share `VaultImpl.mutate()`'s mutex; a per-request `createVault()` would race and silently lose entries.\n- **Broader credential heuristic** — `pickPrimaryCredentialParam()` walks a priority-ordered regex list (`API_KEY` → `API_TOKEN` → `BOT_TOKEN` → `ACCESS_TOKEN` → `SECRET_KEY` → `PRIVATE_KEY` → `CLIENT_SECRET`) instead of only matching `*_API_KEY$`, with an explicit fallback to the first sensitive parameter. Closes the bug where typing a model field before the API-key field caused `Object.values(config).find()` to pick up the model slug; also fixes connectors whose primary credential is a bot token / private key / client secret.\n- **Settings UI** — `SecretsManagerSection` + `ApiKeyConfig` with inline prefix validation and validation warnings, keyboard shortcut `⌘⌥⌃V` (Mac) / `Ctrl+Alt+Shift+V` (Win/Linux), global modal mount, application menu accelerator.\n- **Cloud disconnect orphan-route patch**: `/api/cloud/disconnect` now nulls every routed service (`llmText`, `tts`, `media`, `embeddings`, `rpc`) instead of just `llmText`, so disconnect doesn't leave silently-401'ing voice/image/embedding features routed at the dead `cloud-proxy → elizacloud`. Plus `linkedAccounts.elizacloud.status=\"unlinked\"` to prevent the in-memory state from overwriting the canonical unlinked state on next `saveElizaConfig`.\n\n### Runtime-ops × vault\n\n- `ProviderSwitchIntent.apiKeyRef` replaces plaintext `apiKey` end-to-end. The provider-switch route writes the vault entry, persists only the reference, and resolves through the vault when the runtime reload-hot needs the key.\n- Legacy ops with plaintext `apiKey` are auto-migrated to `apiKeyRef` on hydrate.\n- Repository pruning suite (retention, cap, idempotency, hydrate; 6 tests).\n- A `simplify` pass that dedupes utility code, removes ghost phases, and consolidates state.\n\n## What kind of change is this?\n\n**Features** — non-breaking. `@elizaos/vault` is new. The runtime/Settings wiring is additive on top of the existing config-write path, controlled by feature presence rather than a flag. The provider-switch `apiKeyRef` replaces `apiKey` but a hydrate-time migration upgrades legacy ops in place.\n\n# Documentation changes needed?\n\nMy changes do not require a change to the project documentation. New package documentation lives inline in `packages/vault/README.md` and the public API surface is documented via TSDoc. The Settings UI changes are user-facing but match the existing settings pattern.\n\n# Testing\n\n## Where should a reviewer start?\n\n1. **`packages/vault/`** — start with `src/vault.ts` (the public API), then `src/master-key.ts` (the keychain/passphrase chain), then `src/manager.ts` (the multi-backend router). Tests in `test/{vault,master-key,manager,store,envelope,references,keyring}.test.ts` exercise every public path; `test/master-key.test.ts` covers the headless-fallback chain explicitly.\n2. **`packages/app-core/src/services/vault-mirror.ts`** + `packages/app-core/src/services/vault-mirror.test.ts` — the write-through mirror is small, isolated, and has a focused test that includes failure-collection and a source-text guard for the vault-first reveal ordering.\n3. **`packages/app-core/src/api/plugins-compat-routes.ts`** — the `PUT /api/plugins/:id` handler and `/reveal` route, where the vault wiring sits next to the existing legacy code path.\n4. **`packages/agent/src/runtime/operations/`** — `vault-bridge.ts`, `vault-integration.test.ts`, and `health.test.ts` show the `apiKeyRef` migration. The 22-case integration suite is the strongest evidence that the runtime path keeps working.\n\n## Detailed testing steps\n\nAutomated tests are acceptable.\n\n- **Vault unit suite (cross-platform)**: `bun run --cwd packages/vault test` — 64 tests covering vault, master-key (incl. passphrase fallback), manager, store, envelope, references, keyring round-trips. The new `vault-ci` workflow runs this matrix on `ubuntu-latest`, `macos-latest`, `windows-latest` so the OS-keychain claim is checked on every PR.\n- **App-core wiring suite**: `bun run --cwd packages/app-core test` — 37 wiring tests (vault-mirror unit + source-text guards, secrets-manager-routes integration via real `http.Server`, usePluginsSkillsState heuristic priority list, useSecretsManagerShortcut Mac/Win/Linux chord matching, server.cloud-disconnect orphan-route guard).\n- **Runtime-ops vault integration**: 22 cases in `packages/agent/src/runtime/operations/vault-integration.test.ts` proving the `apiKeyRef` path works end-to-end.\n- **End-to-end save-flow**: `provider-switch-routes.e2e.test.ts` stands up a real `http.Server` and exercises Settings PUT → mirror → reveal → provider switch against an in-memory vault.\n- **Cross-platform CI**: the new `vault-ci` workflow (`.github/workflows/vault-ci.yaml`) runs the vault suite on macOS / Linux / Windows runners; an `app-core-wiring` job runs the wiring tests on `ubuntu-latest` with proto generation as a prerequisite.\n\n### Manual smoke (UI)\n\n1. Open the desktop app → **Settings → Plugins → OpenAI** (or any AI provider).\n2. Enter an API key, save.\n3. The plugin row should turn green and reload the agent. Open `~/.milady/vault.json` — the value is encrypted; the OS keychain holds the master key under `service: \"milady\"`, `account: \"vault.masterKey\"`.\n4. Open the **Secrets Vault** modal via `⌘⌥⌃V` (or **Edit → Secrets Vault** menu). Switch the routing for `OPENAI_API_KEY` to a different backend, save. Subsequent reveals fetch from the new backend.\n\n## Deploy notes\n\n- **`@elizaos/vault` is a new workspace package** — `bun install` at the repo root picks it up; nothing extra to do.\n- **No database changes.**\n- **No breaking changes** to existing config files. Legacy `config.env.X` writes still happen alongside the vault mirror; vault values shadow `process.env` only in the reveal path. The `apiKeyRef` migration on the runtime-ops side is in-place on hydrate (no operator action required).\n\n---\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n",
      "repository": "elizaos/eliza",
      "createdAt": "2026-04-29T11:25:51Z",
      "mergedAt": "2026-05-01T03:12:42Z",
      "additions": 22472,
      "deletions": 677
    },
    {
      "id": "PR_kwDOMT5cIs7WjdAP",
      "title": "Shaw/pr 2067 eliza fix",
      "author": "lalalune",
      "number": 7175,
      "body": "<!-- Use this template by filling in information and copying and pasting relevant items out of the HTML comments. -->\r\n\r\n# Relates to\r\n\r\n<!-- LINK TO ISSUE OR TICKET -->\r\n\r\n<!-- This risks section must be filled out before the final review and merge. -->\r\n\r\n# Risks\r\n\r\n<!--\r\nLow, medium, large. List what kind of risks and what could be affected.\r\n-->\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\n## What kind of change is this?\r\n\r\n<!--\r\nBug fixes (non-breaking change which fixes an issue)\r\nImprovements (misc. changes to existing features)\r\nFeatures (non-breaking change which adds functionality)\r\nUpdates (new versions of included code)\r\n-->\r\n\r\n<!-- This \"Why\" section is most relevant if there are no linked issues explaining why. If there is a related issue, it might make sense to skip this why section. -->\r\n<!--\r\n## Why are we doing this? Any context or related work?\r\n-->\r\n\r\n# Documentation changes needed?\r\n\r\n<!--\r\nMy changes do not require a change to the project documentation.\r\nMy changes require a change to the project documentation.\r\nIf documentation change is needed: I have updated the documentation accordingly.\r\n-->\r\n\r\n<!-- Please show how you tested the PR. This will really help if the PR needs to be retested and probably help the PR get merged quicker. -->\r\n\r\n# Testing\r\n\r\n## Where should a reviewer start?\r\n\r\n## Detailed testing steps\r\n\r\n<!--\r\nNone: Automated tests are acceptable.\r\n-->\r\n\r\n<!--\r\n- As [anon/admin], go to [link]\r\n  - [do action]\r\n  - verify [result]\r\n-->\r\n\r\n<!-- If there is a UI change, please include before and after screenshots or videos. This will speed up PRs being merged. It is extra nice to annotate screenshots with arrows or boxes pointing out the differences. -->\r\n<!--\r\n## Screenshots\r\n### Before\r\n### After\r\n-->\r\n\r\n<!-- If there is anything about the deployment, please make a note. -->\r\n<!--\r\n# Deploy Notes\r\n-->\r\n\r\n<!--  Copy and paste command line output. -->\r\n<!--\r\n## Database changes\r\n-->\r\n\r\n<!--  Please specify deploy instructions if there is something more than the automated steps. -->\r\n<!--\r\n## Deployment instructions\r\n-->\r\n\r\n<!-- If you are on Discord, please join https://discord.gg/ai16z and state your Discord username here for the contributor role and join us in #development-feed -->\r\n<!--\r\n## Discord username\r\n\r\n-->\r\n",
      "repository": "elizaos/eliza",
      "createdAt": "2026-04-29T02:39:06Z",
      "mergedAt": "2026-04-29T02:39:14Z",
      "additions": 20547,
      "deletions": 3209
    },
    {
      "id": "PR_kwDOMT5cIs7Whalw",
      "title": "feat(agent): runtime operations manager + widget host refresh",
      "author": "Dexploarer",
      "number": 7166,
      "body": "## Summary\n\nBundles in-flight feature work on `feat/widget-host-cycle-and-greenup` so it isn't sitting as uncommitted state. Includes:\n\n- New `packages/agent/src/runtime/operations/` module — `RuntimeOperationManager` as the single-flight gate for provider switches / restarts / reloads, plus classifier (idempotency-key dedupe), health predicates, hot-reload + cold-restart strategies. Tests included.\n- Provider switch route now reads `Idempotency-Key`, routes through the manager rather than the legacy `providerSwitchInProgress` boolean.\n- Restart, server, and dev-platform paths refactored against the new manager.\n- Earlier widget-host cycle/chunking + steward static-import fixes (already on the branch).\n- Splash asset + launchpad fixes (already on the branch).\n\nWIP — squash / split as makes sense for review. The runtime-operations module is the largest new surface and the most reviewable as a single unit.\n\n## Test plan\n\n- [ ] `bun run test` — exercises classifier + health unit tests\n- [ ] Manual provider switch under load with idempotency key — verify dedupe\n- [ ] Hot reload path — verify health gate prevents premature traffic resume\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- greptile_comment -->\n\n<details><summary><h3>Greptile Summary</h3></summary>\n\nThis PR introduces a `RuntimeOperationManager` module as the single-flight gate for provider switches and runtime restarts, replacing the previous `providerSwitchInProgress` boolean with a filesystem-backed operation repository, idempotency-key dedup, tier-classified reload strategies (hot/warm/cold), and health-gated promotion. Three issues need attention before merging:\n\n- Config is persisted to disk before the manager's rejection check — a `409 rejected-busy` response leaves the on-disk config mutated with the new provider while the running runtime is unchanged.\n- The `warm` tier strategy is never registered in `server.ts`, so same-family provider switches (classified as `warm` by the classifier) always fail internally with `\\\"no-strategy-for-tier\\\"`.\n- The raw API key is serialized into the persisted `ProviderSwitchIntent` JSON on disk.\n</details>\n\n<h3>Confidence Score: 3/5</h3>\n\nNot safe to merge — config-mutation-before-rejection and the missing warm strategy are current defects on the provider switch hot path.\n\nTwo P1 behavioral bugs (config written before rejection check, warm strategy unregistered causing silent failures) plus one P1 security issue (API key on disk) pull the score below the P1 ceiling of 4. Multiple P1s in core paths warrant a 3.\n\npackages/agent/src/api/provider-switch-routes.ts and packages/agent/src/api/server.ts\n\n<details open><summary><h3>Security Review</h3></summary>\n\n- **Plaintext credential storage** (`packages/agent/src/api/provider-switch-routes.ts`, `packages/agent/src/runtime/operations/repository.ts`): The `ProviderSwitchIntent` includes the raw `apiKey` and is serialized in full to `<stateDir>/runtime-operations/<id>.json`. Although the file is created with mode `0600`, the API key is readable by any process running as the same user and persists for up to 24 hours. API keys should be stripped from the persisted record.\n</details>\n\n<details><summary><h3>Important Files Changed</h3></summary>\n\n| Filename | Overview |\n|----------|----------|\n| packages/agent/src/runtime/operations/manager.ts | New DefaultRuntimeOperationManager: single-flight gate with idempotency-key dedup, async execution chain, and health-gated promotion — logic is sound but warm-tier strategy gap causes silent failures for same-family switches |\n| packages/agent/src/runtime/operations/types.ts | Well-typed contracts for operations, phases, repository, health checks, and strategies; clean discriminated union intent model |\n| packages/agent/src/runtime/operations/classifier.ts | Pure tier classifier: returns \"warm\" for same-family switches but no warm strategy is wired in server.ts, making those operations always fail |\n| packages/agent/src/runtime/operations/repository.ts | Filesystem-backed repo with atomic writes and in-memory O(1) cache; abandoned-op reaping on hydrate is solid; file mode 0600 is appropriate but intent JSON (including API keys) still lands on disk in cleartext |\n| packages/agent/src/api/provider-switch-routes.ts | Route correctly routes through the new manager, but saves config to disk before checking the manager outcome (config mutated even on 409) and embeds the raw API key in the persisted intent |\n| packages/agent/src/api/server.ts | Manager wiring looks correct; warm strategy is missing from the strategies map causing all same-family provider switches to fail with \"no-strategy-for-tier\" |\n| packages/agent/src/runtime/operations/cold-strategy.ts | Cold restart delegates correctly to the injected restartRuntime closure, but double-appends \"shutdown-old\" phase producing a duplicate entry in the log |\n| packages/agent/src/runtime/operations/reload-hot.ts | Hot strategy correctly applies env vars and best-effort notifies plugins; defaultApplyProviderEnv double-writes config since the route also writes before submitting the operation |\n| packages/agent/src/runtime/operations/health.ts | HealthChecker with parallel execution, per-check timeouts via Promise.race, and clean required/optional semantics — well implemented |\n| packages/agent/src/runtime/operations/index.ts | Clean barrel export for the operations module |\n\n</details>\n\n</details>\n\n<details><summary><h3>Sequence Diagram</h3></summary>\n\n```mermaid\nsequenceDiagram\n    participant C as Client\n    participant R as ProviderSwitchRoute\n    participant M as RuntimeOperationManager\n    participant Repo as FilesystemRepository\n    participant S as ReloadStrategy (hot/cold)\n    participant H as HealthChecker\n\n    C->>R: POST /api/provider/switch\n    R->>R: saveElizaConfig ⚠️ written before rejection check\n    R->>M: start({intent, idempotencyKey})\n    M->>Repo: findByIdempotencyKey(key)\n    alt key exists\n        Repo-->>M: existing op\n        M-->>R: deduped\n        R-->>C: 200\n    end\n    M->>Repo: findActive()\n    alt op in flight\n        Repo-->>M: active op\n        M-->>R: rejected-busy ⚠️ config already written\n        R-->>C: 409\n    end\n    M->>Repo: create(op)\n    M-->>R: accepted\n    R-->>C: 202 + operationId\n    Note over M: async execution chain\n    M->>S: apply(ctx)\n    S-->>M: newRuntime\n    M->>H: runForRuntime(newRuntime)\n    H-->>M: HealthCheckReport\n    alt ok\n        M->>Repo: update succeeded\n    else failed\n        M->>Repo: update failed\n    end\n```\n</details>\n\n<a href=\"https://app.greptile.com/ide/claude-code?prompt=Fix%20the%20following%204%20code%20review%20issues.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fprovider-switch-routes.ts%3A136-196%0A**Config%20written%20to%20disk%20before%20rejection%20is%20checked**%0A%0A%60applyOnboardingConnectionConfig%60%20and%20%60saveElizaConfig%60%20run%20at%20lines%20136%E2%80%93137%20before%20the%20operation%20manager's%20outcome%20is%20evaluated.%20When%20the%20manager%20returns%20%60%22rejected-busy%22%60%2C%20the%20route%20correctly%20returns%20409%2C%20but%20the%20config%20file%20has%20already%20been%20mutated%20on%20disk%20with%20the%20new%20provider%20settings.%20The%20system%20is%20now%20in%20a%20split%20state%3A%20the%20config%20reflects%20provider%20B%20while%20the%20running%20runtime%20still%20uses%20provider%20A%20%28and%20no%20restart%20will%20happen%29.%20On%20the%20next%20cold%20restart%20the%20new%20provider%20config%20will%20be%20loaded%2C%20potentially%20breaking%20the%20running%20agent.%0A%0AThe%20config%20mutation%20should%20only%20be%20persisted%20once%20the%20manager%20has%20accepted%20the%20request%2C%20or%20the%20hot-strategy's%20%60defaultApplyProviderEnv%60%20should%20be%20the%20sole%20writer%20%28it's%20called%20by%20the%20strategy%20itself%20on%20the%20async%20execution%20path%29.%0A%0A%23%23%23%20Issue%202%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fserver.ts%3A1098-1102%0A**%60warm%60%20tier%20has%20no%20registered%20strategy%20%E2%80%94%20same-family%20provider%20switches%20always%20fail**%0A%0A%60strategies%3A%20%7B%20cold%3A%20coldStrategy%2C%20hot%3A%20hotStrategy%20%7D%60%20omits%20the%20warm%20strategy.%20The%20classifier%20in%20%60classifier.ts%60%20returns%20%60%22warm%22%60%20for%20same-family%20provider%20switches%20%28e.g.%20%60openai%60%20%E2%86%94%20%60openai-subscription%60%29.%20In%20%60manager.ts%60%20lines%20182%E2%80%93188%2C%20a%20missing%20strategy%20calls%20%60failOperation%60%20with%20%60%22no-strategy-for-tier%22%60.%20Any%20user%20switching%20between%20providers%20in%20the%20same%20family%20will%20receive%20a%20silent%20internal%20failure%20with%20no%20clear%20error%20surfaced.%0A%0AEither%20register%20a%20warm%20strategy%20here%20%28falling%20back%20to%20the%20hot%20strategy%20is%20a%20safe%20interim%20choice%29%20or%20change%20the%20classifier%20to%20collapse%20%60warm%60%20to%20%60cold%60%20until%20the%20warm%20strategy%20exists.%0A%0A%60%60%60ts%0Astrategies%3A%20%7B%20cold%3A%20coldStrategy%2C%20hot%3A%20hotStrategy%2C%20warm%3A%20hotStrategy%20%7D%2C%0A%60%60%60%0A%0A%23%23%23%20Issue%203%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fprovider-switch-routes.ts%3A139-147%0A**API%20key%20written%20to%20disk%20in%20plaintext%20via%20intent%20serialization**%0A%0AThe%20%60ProviderSwitchIntent%60%20built%20here%20includes%20the%20raw%20%60apiKey%60%20value%2C%20and%20the%20%60FilesystemRuntimeOperationRepository%60%20serializes%20the%20full%20%60RuntimeOperation%60%20%28including%20%60intent%60%29%20to%20%60%3CstateDir%3E%2Fruntime-operations%2F%3Cid%3E.json%60%20%28mode%200600%2C%20but%20still%20a%20plain%20JSON%20file%29.%20Every%20provider%20switch%20stores%20the%20user's%20API%20key%20on%20the%20filesystem%20in%20cleartext%20for%20up%20to%20the%2024-hour%20retention%20window.%0A%0AThe%20API%20key%20should%20be%20redacted%20from%20the%20persisted%20intent.%20One%20approach%20is%20to%20store%20only%20a%20boolean%20flag%20%60apiKeyProvided%3A%20true%60%20in%20the%20persisted%20intent%20while%20keeping%20the%20real%20key%20in-memory%20only%20for%20the%20duration%20of%20the%20operation.%0A%0A%23%23%23%20Issue%204%20of%204%0Apackages%2Fagent%2Fsrc%2Fruntime%2Foperations%2Fcold-strategy.ts%3A29-42%0A**%22shutdown-old%22%20phase%20is%20appended%20twice%20instead%20of%20updated%20once**%0A%0A%60ctx.reportPhase%60%20maps%20to%20%60repository.appendPhase%60%2C%20which%20always%20adds%20a%20new%20entry%20to%20the%20phases%20array.%20Calling%20it%20first%20with%20%60status%3A%20%22running%22%60%20and%20then%20immediately%20with%20%60status%3A%20%22succeeded%22%60%20produces%20two%20separate%20%60%22shutdown-old%22%60%20entries%20in%20the%20log%20rather%20than%20one%20entry%20whose%20status%20transitions.%20No%20actual%20shutdown%20work%20occurs%20between%20the%20two%20calls%20%E2%80%94%20%60restartRuntime%60%20is%20invoked%20in%20the%20%60%22start-new%22%60%20phase%20below.%0A%0AThe%20manager's%20health-check%20code%20uses%20%60appendPhase%60%20%28for%20%60%22running%22%60%29%20%2B%20%60updateLastPhase%60%20%28for%20the%20terminal%20state%29.%20The%20cold%20strategy%20should%20follow%20the%20same%20pattern%2C%20or%20both%20phases%20should%20be%20a%20single%20append%20recording%20the%20final%20status%20since%20shutdown%20is%20effectively%20instantaneous%20here.%0A%0A&repo=elizaos%2Feliza&pr=7166&platform=github\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInClaudeDark.svg?v=2\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInClaude.svg?v=2\"><img alt=\"Fix All in Claude Code\" src=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInClaude.svg?v=2\" height=\"20\"></picture></a> <a href=\"https://chatgpt.com/codex/deeplink?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22elizaos%2Feliza%22%20on%20the%20existing%20branch%20%22feat%2Fwidget-host-cycle-and-greenup%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22feat%2Fwidget-host-cycle-and-greenup%22.%0A%0AFix%20the%20following%204%20code%20review%20issues.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fprovider-switch-routes.ts%3A136-196%0A**Config%20written%20to%20disk%20before%20rejection%20is%20checked**%0A%0A%60applyOnboardingConnectionConfig%60%20and%20%60saveElizaConfig%60%20run%20at%20lines%20136%E2%80%93137%20before%20the%20operation%20manager's%20outcome%20is%20evaluated.%20When%20the%20manager%20returns%20%60%22rejected-busy%22%60%2C%20the%20route%20correctly%20returns%20409%2C%20but%20the%20config%20file%20has%20already%20been%20mutated%20on%20disk%20with%20the%20new%20provider%20settings.%20The%20system%20is%20now%20in%20a%20split%20state%3A%20the%20config%20reflects%20provider%20B%20while%20the%20running%20runtime%20still%20uses%20provider%20A%20%28and%20no%20restart%20will%20happen%29.%20On%20the%20next%20cold%20restart%20the%20new%20provider%20config%20will%20be%20loaded%2C%20potentially%20breaking%20the%20running%20agent.%0A%0AThe%20config%20mutation%20should%20only%20be%20persisted%20once%20the%20manager%20has%20accepted%20the%20request%2C%20or%20the%20hot-strategy's%20%60defaultApplyProviderEnv%60%20should%20be%20the%20sole%20writer%20%28it's%20called%20by%20the%20strategy%20itself%20on%20the%20async%20execution%20path%29.%0A%0A%23%23%23%20Issue%202%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fserver.ts%3A1098-1102%0A**%60warm%60%20tier%20has%20no%20registered%20strategy%20%E2%80%94%20same-family%20provider%20switches%20always%20fail**%0A%0A%60strategies%3A%20%7B%20cold%3A%20coldStrategy%2C%20hot%3A%20hotStrategy%20%7D%60%20omits%20the%20warm%20strategy.%20The%20classifier%20in%20%60classifier.ts%60%20returns%20%60%22warm%22%60%20for%20same-family%20provider%20switches%20%28e.g.%20%60openai%60%20%E2%86%94%20%60openai-subscription%60%29.%20In%20%60manager.ts%60%20lines%20182%E2%80%93188%2C%20a%20missing%20strategy%20calls%20%60failOperation%60%20with%20%60%22no-strategy-for-tier%22%60.%20Any%20user%20switching%20between%20providers%20in%20the%20same%20family%20will%20receive%20a%20silent%20internal%20failure%20with%20no%20clear%20error%20surfaced.%0A%0AEither%20register%20a%20warm%20strategy%20here%20%28falling%20back%20to%20the%20hot%20strategy%20is%20a%20safe%20interim%20choice%29%20or%20change%20the%20classifier%20to%20collapse%20%60warm%60%20to%20%60cold%60%20until%20the%20warm%20strategy%20exists.%0A%0A%60%60%60ts%0Astrategies%3A%20%7B%20cold%3A%20coldStrategy%2C%20hot%3A%20hotStrategy%2C%20warm%3A%20hotStrategy%20%7D%2C%0A%60%60%60%0A%0A%23%23%23%20Issue%203%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fprovider-switch-routes.ts%3A139-147%0A**API%20key%20written%20to%20disk%20in%20plaintext%20via%20intent%20serialization**%0A%0AThe%20%60ProviderSwitchIntent%60%20built%20here%20includes%20the%20raw%20%60apiKey%60%20value%2C%20and%20the%20%60FilesystemRuntimeOperationRepository%60%20serializes%20the%20full%20%60RuntimeOperation%60%20%28including%20%60intent%60%29%20to%20%60%3CstateDir%3E%2Fruntime-operations%2F%3Cid%3E.json%60%20%28mode%200600%2C%20but%20still%20a%20plain%20JSON%20file%29.%20Every%20provider%20switch%20stores%20the%20user's%20API%20key%20on%20the%20filesystem%20in%20cleartext%20for%20up%20to%20the%2024-hour%20retention%20window.%0A%0AThe%20API%20key%20should%20be%20redacted%20from%20the%20persisted%20intent.%20One%20approach%20is%20to%20store%20only%20a%20boolean%20flag%20%60apiKeyProvided%3A%20true%60%20in%20the%20persisted%20intent%20while%20keeping%20the%20real%20key%20in-memory%20only%20for%20the%20duration%20of%20the%20operation.%0A%0A%23%23%23%20Issue%204%20of%204%0Apackages%2Fagent%2Fsrc%2Fruntime%2Foperations%2Fcold-strategy.ts%3A29-42%0A**%22shutdown-old%22%20phase%20is%20appended%20twice%20instead%20of%20updated%20once**%0A%0A%60ctx.reportPhase%60%20maps%20to%20%60repository.appendPhase%60%2C%20which%20always%20adds%20a%20new%20entry%20to%20the%20phases%20array.%20Calling%20it%20first%20with%20%60status%3A%20%22running%22%60%20and%20then%20immediately%20with%20%60status%3A%20%22succeeded%22%60%20produces%20two%20separate%20%60%22shutdown-old%22%60%20entries%20in%20the%20log%20rather%20than%20one%20entry%20whose%20status%20transitions.%20No%20actual%20shutdown%20work%20occurs%20between%20the%20two%20calls%20%E2%80%94%20%60restartRuntime%60%20is%20invoked%20in%20the%20%60%22start-new%22%60%20phase%20below.%0A%0AThe%20manager's%20health-check%20code%20uses%20%60appendPhase%60%20%28for%20%60%22running%22%60%29%20%2B%20%60updateLastPhase%60%20%28for%20the%20terminal%20state%29.%20The%20cold%20strategy%20should%20follow%20the%20same%20pattern%2C%20or%20both%20phases%20should%20be%20a%20single%20append%20recording%20the%20final%20status%20since%20shutdown%20is%20effectively%20instantaneous%20here.%0A%0A\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=2\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=2\"><img alt=\"Fix All in Codex\" src=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=2\" height=\"20\"></picture></a> <a href=\"https://app.greptile.com/api/ide/cursor?prompt=Fix%20the%20following%204%20code%20review%20issues.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fprovider-switch-routes.ts%3A136-196%0A**Config%20written%20to%20disk%20before%20rejection%20is%20checked**%0A%0A%60applyOnboardingConnectionConfig%60%20and%20%60saveElizaConfig%60%20run%20at%20lines%20136%E2%80%93137%20before%20the%20operation%20manager's%20outcome%20is%20evaluated.%20When%20the%20manager%20returns%20%60%22rejected-busy%22%60%2C%20the%20route%20correctly%20returns%20409%2C%20but%20the%20config%20file%20has%20already%20been%20mutated%20on%20disk%20with%20the%20new%20provider%20settings.%20The%20system%20is%20now%20in%20a%20split%20state%3A%20the%20config%20reflects%20provider%20B%20while%20the%20running%20runtime%20still%20uses%20provider%20A%20%28and%20no%20restart%20will%20happen%29.%20On%20the%20next%20cold%20restart%20the%20new%20provider%20config%20will%20be%20loaded%2C%20potentially%20breaking%20the%20running%20agent.%0A%0AThe%20config%20mutation%20should%20only%20be%20persisted%20once%20the%20manager%20has%20accepted%20the%20request%2C%20or%20the%20hot-strategy's%20%60defaultApplyProviderEnv%60%20should%20be%20the%20sole%20writer%20%28it's%20called%20by%20the%20strategy%20itself%20on%20the%20async%20execution%20path%29.%0A%0A%23%23%23%20Issue%202%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fserver.ts%3A1098-1102%0A**%60warm%60%20tier%20has%20no%20registered%20strategy%20%E2%80%94%20same-family%20provider%20switches%20always%20fail**%0A%0A%60strategies%3A%20%7B%20cold%3A%20coldStrategy%2C%20hot%3A%20hotStrategy%20%7D%60%20omits%20the%20warm%20strategy.%20The%20classifier%20in%20%60classifier.ts%60%20returns%20%60%22warm%22%60%20for%20same-family%20provider%20switches%20%28e.g.%20%60openai%60%20%E2%86%94%20%60openai-subscription%60%29.%20In%20%60manager.ts%60%20lines%20182%E2%80%93188%2C%20a%20missing%20strategy%20calls%20%60failOperation%60%20with%20%60%22no-strategy-for-tier%22%60.%20Any%20user%20switching%20between%20providers%20in%20the%20same%20family%20will%20receive%20a%20silent%20internal%20failure%20with%20no%20clear%20error%20surfaced.%0A%0AEither%20register%20a%20warm%20strategy%20here%20%28falling%20back%20to%20the%20hot%20strategy%20is%20a%20safe%20interim%20choice%29%20or%20change%20the%20classifier%20to%20collapse%20%60warm%60%20to%20%60cold%60%20until%20the%20warm%20strategy%20exists.%0A%0A%60%60%60ts%0Astrategies%3A%20%7B%20cold%3A%20coldStrategy%2C%20hot%3A%20hotStrategy%2C%20warm%3A%20hotStrategy%20%7D%2C%0A%60%60%60%0A%0A%23%23%23%20Issue%203%20of%204%0Apackages%2Fagent%2Fsrc%2Fapi%2Fprovider-switch-routes.ts%3A139-147%0A**API%20key%20written%20to%20disk%20in%20plaintext%20via%20intent%20serialization**%0A%0AThe%20%60ProviderSwitchIntent%60%20built%20here%20includes%20the%20raw%20%60apiKey%60%20value%2C%20and%20the%20%60FilesystemRuntimeOperationRepository%60%20serializes%20the%20full%20%60RuntimeOperation%60%20%28including%20%60intent%60%29%20to%20%60%3CstateDir%3E%2Fruntime-operations%2F%3Cid%3E.json%60%20%28mode%200600%2C%20but%20still%20a%20plain%20JSON%20file%29.%20Every%20provider%20switch%20stores%20the%20user's%20API%20key%20on%20the%20filesystem%20in%20cleartext%20for%20up%20to%20the%2024-hour%20retention%20window.%0A%0AThe%20API%20key%20should%20be%20redacted%20from%20the%20persisted%20intent.%20One%20approach%20is%20to%20store%20only%20a%20boolean%20flag%20%60apiKeyProvided%3A%20true%60%20in%20the%20persisted%20intent%20while%20keeping%20the%20real%20key%20in-memory%20only%20for%20the%20duration%20of%20the%20operation.%0A%0A%23%23%23%20Issue%204%20of%204%0Apackages%2Fagent%2Fsrc%2Fruntime%2Foperations%2Fcold-strategy.ts%3A29-42%0A**%22shutdown-old%22%20phase%20is%20appended%20twice%20instead%20of%20updated%20once**%0A%0A%60ctx.reportPhase%60%20maps%20to%20%60repository.appendPhase%60%2C%20which%20always%20adds%20a%20new%20entry%20to%20the%20phases%20array.%20Calling%20it%20first%20with%20%60status%3A%20%22running%22%60%20and%20then%20immediately%20with%20%60status%3A%20%22succeeded%22%60%20produces%20two%20separate%20%60%22shutdown-old%22%60%20entries%20in%20the%20log%20rather%20than%20one%20entry%20whose%20status%20transitions.%20No%20actual%20shutdown%20work%20occurs%20between%20the%20two%20calls%20%E2%80%94%20%60restartRuntime%60%20is%20invoked%20in%20the%20%60%22start-new%22%60%20phase%20below.%0A%0AThe%20manager's%20health-check%20code%20uses%20%60appendPhase%60%20%28for%20%60%22running%22%60%29%20%2B%20%60updateLastPhase%60%20%28for%20the%20terminal%20state%29.%20The%20cold%20strategy%20should%20follow%20the%20same%20pattern%2C%20or%20both%20phases%20should%20be%20a%20single%20append%20recording%20the%20final%20status%20since%20shutdown%20is%20effectively%20instantaneous%20here.%0A%0A&pr=7166&platform=github\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCursorDark.svg?v=2\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCursor.svg?v=2\"><img alt=\"Fix All in Cursor\" src=\"https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCursor.svg?v=2\" height=\"20\"></picture></a>\n\n<sub>Reviews (1): Last reviewed commit: [\"feat(agent): runtime operations manager ...\"](https://github.com/elizaos/eliza/commit/3b41268180da76fa04f245d949cf9132bc08005e) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=30101058)</sub>\n\n> Greptile also left **4 inline comments** on this PR.\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-04-28T23:14:38Z",
      "mergedAt": "2026-04-29T02:39:15Z",
      "additions": 6861,
      "deletions": 619
    }
  ],
  "codeChanges": {
    "additions": 28825,
    "deletions": 10702,
    "files": 467,
    "commitCount": 1349
  },
  "completedItems": [
    {
      "title": "fix: WidgetHost re-export cycle + steward static node imports + agent re-exports",
      "prNumber": 7133,
      "type": "bugfix",
      "body": "## Summary\n\nThree small follow-ups that landed AFTER #7115 (now merged) and need their own PR. All targeted at remaining build warnings + a cross-package test gap.\n\n### 1. WidgetHost re-export cycle\n\nRollup warning (new since #7115 introduc",
      "files": [
        "apps/app-steward/src/services/steward-sidecar.ts",
        "apps/app-steward/src/services/steward-sidecar/process-management.ts",
        "apps/app-steward/src/services/steward-sidecar/wallet-setup.ts",
        "packages/agent/src/api/index.ts",
        "packages/app-core/src/components/character/CharacterHubView.tsx",
        "packages/app-core/src/components/chat/TasksEventsPanel.tsx",
        "packages/app-core/src/components/pages/AutomationsView.tsx",
        "packages/app-core/src/components/pages/HeartbeatsView.tsx"
      ]
    },
    {
      "title": "chore(deps): update dependency vitest to v4",
      "prNumber": 7131,
      "type": "tests",
      "body": "> ℹ️ **Note**\n> \n> This PR body was truncated due to platform limits.\n\nThis PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-con",
      "files": [
        "templates/min-app/package.json",
        "templates/min-plugin/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency vite to v8",
      "prNumber": 7130,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [vite](https://vite.dev) ([source](http",
      "files": [
        "templates/min-app/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @vitejs/plugin-react to v6",
      "prNumber": 7129,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@vitejs/plugin-react](https://redirect",
      "files": [
        "templates/min-app/package.json"
      ]
    },
    {
      "title": "fix(automations): in-flight draft selection survives stale-id check + synthesizes draft item",
      "prNumber": 7128,
      "type": "bugfix",
      "body": "## Summary\n\nTwo coupled bugs around in-flight workflow drafts in `AutomationsView`:\n\n1. **Stale-id validation effect cleared the in-flight `workflow-draft:<id>` selection** before generation finished. The `selectedItemId` validation effect ",
      "files": [
        "packages/app-core/src/components/pages/AutomationsView.tsx"
      ]
    },
    {
      "title": "feat(automations): WorkflowGenerationProgress — multi-stage progress card",
      "prNumber": 7127,
      "type": "feature",
      "body": "## Summary\n\nReplaces the single \"Building workflow...\" chip in `WorkflowGraphViewer`'s generating overlay with a **6-stage timer-cycled progress card** that gives users meaningful feedback during the ~10–30s LLM workflow-generation window.\n",
      "files": [
        "packages/app-core/src/components/pages/WorkflowGraphViewer.tsx"
      ]
    },
    {
      "title": "test(n8n): pin handleGenerateWorkflow deployWorkflow path",
      "prNumber": 7126,
      "type": "tests",
      "body": "## Summary\n\nAdds unit-test coverage for the `handleGenerateWorkflow` → `service.deployWorkflow` → `service.getWorkflow` flow introduced by [#7118](https://github.com/elizaOS/eliza/pull/7118). This is the regression net for the route's new s",
      "files": [
        "packages/app-core/src/api/client-n8n.ts",
        "packages/app-core/src/api/n8n-routes.test.ts",
        "packages/app-core/src/api/n8n-routes.ts"
      ]
    },
    {
      "title": "fix(automations): hide right-rail chat dock on Overview empty state",
      "prNumber": 7125,
      "type": "bugfix",
      "body": "## Summary\n\nWhen the Automations Overview is in its empty state (no workflows, no triggers selected), the right-rail page-scoped chat dock was visible alongside the hero-input compose surface — two compose surfaces on screen at once with ov",
      "files": [
        "packages/app-core/src/components/pages/AutomationsView.tsx",
        "packages/app-core/src/components/workspace/AppWorkspaceChrome.tsx"
      ]
    },
    {
      "title": "fix(triggers): CREATE_TRIGGER_TASK page-automations unblock + LIFE handler hardening",
      "prNumber": 7124,
      "type": "bugfix",
      "body": "## Summary\n\nThree coordinated fixes for the page-automations `LIFE`-vs-trigger routing problem:\n\n1. **`packages/agent/src/triggers/action.ts`** — remove `SET_REMINDER` from `createTriggerTaskAction`'s similes (it collides with LIFE's simile",
      "files": [
        "apps/app-lifeops/src/actions/life.test.ts",
        "apps/app-lifeops/src/actions/life.ts",
        "packages/agent/src/triggers/action.ts",
        "packages/typescript/src/__tests__/owned-action-correction.test.ts",
        "packages/typescript/src/services/message.ts"
      ]
    },
    {
      "title": "fix(lifeops): scope-reject LIFE on foreign page-* scopes",
      "prNumber": 7123,
      "type": "bugfix",
      "body": "## Summary\n\nAdjusts the `LIFE` action handler in app-lifeops to scope-reject when invoked on a foreign `page-*` scope (e.g. `page-automations`, `page-chat`). Previously, `LIFE` would accept the action even from these foreign scopes, which g",
      "files": [
        "apps/app-lifeops/src/actions/life.test.ts",
        "apps/app-lifeops/src/actions/life.ts"
      ]
    },
    {
      "title": "fix(telegram): emit MESSAGE_RECEIVED on Telegram messages so event-kind triggers fire",
      "prNumber": 7122,
      "type": "bugfix",
      "body": "## Summary\n\nEmits `MESSAGE_RECEIVED` on the runtime event bus when an inbound Telegram message arrives via the in-process Telegram shim path. Without this emission, event-kind triggers bound to Telegram messages register fine but never fire",
      "files": [
        "packages/app-core/src/runtime/eliza.ts"
      ]
    },
    {
      "title": "fix(automations): delete chat conversation when workflow is deleted + skip orphan workflow rooms in aggregator",
      "prNumber": 7121,
      "type": "bugfix",
      "body": "## Summary\n\nTwo related cleanup fixes on the Automations layer:\n\n1. **Delete the per-workflow chat conversation when the workflow is deleted.** Previously, deleting a workflow left its `workflow:<id>` chat room in the database. Those rooms ",
      "files": [
        "packages/app-core/src/api/automations-compat-routes.ts",
        "packages/app-core/src/components/pages/AutomationsView.tsx"
      ]
    },
    {
      "title": "feat(automations): disambiguate workflow vs trigger + hide empty-state chat pane",
      "prNumber": 7120,
      "type": "feature",
      "body": "## Summary\n\nTwo small UX/planner improvements on the Automations page:\n\n1. **Planner-side disambiguation prompt:** the action-planner now distinguishes between user prompts that mean \"create an n8n workflow\" (multi-node automation pipeline)",
      "files": [
        "packages/app-core/src/components/pages/N8nWorkflowsPanel.tsx",
        "packages/app-core/src/i18n/locales/en.json",
        "packages/typescript/src/prompts.ts"
      ]
    },
    {
      "title": "fix(triggers): unblock CREATE_TRIGGER_TASK dispatch on page-automations",
      "prNumber": 7119,
      "type": "bugfix",
      "body": "## Summary\n\nFixes a routing bug where `CREATE_TRIGGER_TASK` actions issued from the page-automations scope were silently dropped before reaching the trigger-action handler.\n\n### Root cause\n\n`page-scoped-conversations.ts` filtered out `CREAT",
      "files": [
        "packages/agent/src/triggers/action.test.ts",
        "packages/agent/src/triggers/action.ts",
        "packages/app-core/src/components/pages/page-scoped-conversations.ts"
      ]
    },
    {
      "title": "fix(n8n): hero-chat workflow create resolves credentials end-to-end",
      "prNumber": 7118,
      "type": "bugfix",
      "body": "## Summary\n\nWires the credential-resolution path through the hero-chat workflow-creation entry point. Previously, workflows created via `POST /api/n8n/workflows/generate` proxied straight to n8n after generation and bypassed `service.deploy",
      "files": [
        "packages/app-core/src/api/client-n8n.ts",
        "packages/app-core/src/api/n8n-routes.ts"
      ]
    },
    {
      "title": "fix(chat): bump streaming generation timeout 90s -> 180s",
      "prNumber": 7117,
      "type": "bugfix",
      "body": "## Summary\n\nBumps the streaming chat-route generation timeout from 90s to 180s.\n\n90s is too short for many real-world LLM workloads we hit downstream:\n- Workflow generation against tool-use / structured-output models routinely takes 60-120s",
      "files": [
        "packages/agent/src/api/chat-routes.ts"
      ]
    },
    {
      "title": "feat(triggers): wire event-kind triggers to the runtime event bus",
      "prNumber": 7116,
      "type": "feature",
      "body": "## Summary\n\nAdds a `TriggerEventBridge` service that listens on the runtime event bus and dispatches matching event-kind triggers (Discord MESSAGE_RECEIVED, Telegram MESSAGE_RECEIVED, Webhook, etc.) to the trigger-handler pipeline. Without ",
      "files": [
        "packages/app-core/src/runtime/eliza.ts",
        "packages/app-core/src/services/trigger-event-bridge.test.ts",
        "packages/app-core/src/services/trigger-event-bridge.ts"
      ]
    },
    {
      "title": "feat(app-core): apps as native windows + App Details page (test-green)",
      "prNumber": 7115,
      "type": "feature",
      "body": "## Summary\n\nThis is the org-owned (milady-ai/eliza) version of [Dexploarer/eliza#26 → elizaOS/eliza#7114](https://github.com/elizaOS/eliza/pull/7114) — same changes, pushed from the org fork instead of a personal fork.\n\n- Every app — intern",
      "files": [
        "apps/app-companion/src/components/companion/CompanionAppView.tsx",
        "apps/app-companion/src/components/companion/CompanionView.tsx",
        "apps/app/src/main.tsx",
        "packages/app-core/platforms/electrobun/electrobun.config.ts",
        "packages/app-core/platforms/electrobun/src/application-menu.ts",
        "packages/app-core/platforms/electrobun/src/index.ts",
        "packages/app-core/platforms/electrobun/src/native/desktop.ts",
        "packages/app-core/platforms/electrobun/src/native/steward.ts",
        "packages/app-core/platforms/electrobun/src/rpc-handlers.ts",
        "packages/app-core/platforms/electrobun/src/rpc-schema.ts",
        "packages/app-core/platforms/electrobun/src/surface-windows.ts",
        "packages/app-core/src/App.tsx",
        "packages/app-core/src/api/auth.ts",
        "packages/app-core/src/components/apps/helpers.ts",
        "packages/app-core/src/components/apps/internal-tool-apps.ts",
        "packages/app-core/src/components/apps/launch-history.ts",
        "packages/app-core/src/components/apps/per-app-config.ts",
        "packages/app-core/src/components/apps/useRegistryCatalog.ts",
        "packages/app-core/src/components/character/CharacterOverviewSection.test.tsx",
        "packages/app-core/src/components/onboarding/BootstrapStep.tsx",
        "packages/app-core/src/components/pages/AppDetailsView.tsx",
        "packages/app-core/src/components/pages/AppsView.tsx",
        "packages/app-core/src/i18n/locales/en.json",
        "packages/app-core/src/i18n/locales/es.json",
        "packages/app-core/src/i18n/locales/ko.json",
        "packages/app-core/src/i18n/locales/pt.json",
        "packages/app-core/src/i18n/locales/tl.json",
        "packages/app-core/src/i18n/locales/vi.json",
        "packages/app-core/src/i18n/locales/zh-CN.json",
        "packages/app-core/src/navigation/index.ts",
        "packages/app-core/src/shell/AppWindowRenderer.tsx",
        "packages/app-core/src/shell/DetachedShellRoot.tsx",
        "packages/app-core/src/shell/index.ts",
        "packages/app-core/src/state/startup-phase-hydrate.test.ts",
        "packages/shared/src/app-hero-art.ts"
      ]
    },
    {
      "title": "chore(deps): bump lambda_runtime from 0.13.0 to 1.1.3 in /packages/examples/aws/rust",
      "prNumber": 7113,
      "type": "other",
      "body": "Bumps [lambda_runtime](https://github.com/aws/aws-lambda-rust-runtime) from 0.13.0 to 1.1.3.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/aws/aws-lambda-rust-runtime/releases\">lambda_runtime's r",
      "files": [
        "packages/examples/aws/rust/Cargo.lock",
        "packages/examples/aws/rust/Cargo.toml"
      ]
    },
    {
      "title": "chore(deps): update ui-tars requirement from >=0.4.2.2 to >=0.5.1 in /packages/benchmarks/OSWorld",
      "prNumber": 7112,
      "type": "other",
      "body": "Updates the requirements on ui-tars to permit the latest version.\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: ",
      "files": [
        "packages/benchmarks/OSWorld/requirements.txt"
      ]
    },
    {
      "title": "chore(deps): update transformers requirement from ~=5.6.0 to ~=5.6.2 in /packages/benchmarks/OSWorld",
      "prNumber": 7111,
      "type": "other",
      "body": "Updates the requirements on [transformers](https://github.com/huggingface/transformers) to permit the latest version.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/huggingface/transformers/releas",
      "files": [
        "packages/benchmarks/OSWorld/pyproject.toml",
        "packages/benchmarks/OSWorld/requirements.txt"
      ]
    },
    {
      "title": "chore(deps): bump axum from 0.7.9 to 0.8.9 in /packages/examples/gcp/rust",
      "prNumber": 7110,
      "type": "other",
      "body": "Bumps [axum](https://github.com/tokio-rs/axum) from 0.7.9 to 0.8.9.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/tokio-rs/axum/releases\">axum's releases</a>.</em></p>\n<blockquote>\n<h2>axum-v0.8.",
      "files": [
        "packages/examples/gcp/rust/Cargo.lock",
        "packages/examples/gcp/rust/Cargo.toml"
      ]
    },
    {
      "title": "chore(deps): bump tower-http from 0.5.2 to 0.6.8 in /packages/examples/a2a/rust",
      "prNumber": 7109,
      "type": "other",
      "body": "Bumps [tower-http](https://github.com/tower-rs/tower-http) from 0.5.2 to 0.6.8.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/tower-rs/tower-http/releases\">tower-http's releases</a>.</em></p>\n<bl",
      "files": [
        "packages/examples/a2a/rust/Cargo.lock",
        "packages/examples/a2a/rust/Cargo.toml"
      ]
    },
    {
      "title": "Codex signal cli auto install",
      "prNumber": 7107,
      "type": "other",
      "body": "<!-- Use this template by filling in information and copying and pasting relevant items out of the HTML comments. -->\r\n\r\n# Relates to\r\n\r\n<!-- LINK TO ISSUE OR TICKET -->\r\n\r\n<!-- This risks section must be filled out before the final review ",
      "files": [
        "packages/agent/src/services/signal-pairing.test.ts",
        "packages/agent/src/services/signal-pairing.ts",
        "packages/app-core/src/registry/entries/connectors/signal.json",
        "plugins/plugin-signal/typescript/package.json",
        "plugins/plugin-signal/typescript/src/config.ts",
        "plugins/plugin-signal/typescript/src/pairing-service.test.ts",
        "plugins/plugin-signal/typescript/src/pairing-service.ts",
        "plugins/plugin-signal/typescript/src/service.ts"
      ]
    },
    {
      "title": "chore(deps): update supabase/postgres docker tag to v17.6.1.111",
      "prNumber": 7105,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Update | Change |\n|---|---|---|\n| supabase/postgres | patch | `17.6.1.110` → `17.6.1.111` |\n\n---\n\n> [!WARNING]\n> Some dependencies could not be looked up. Check the [Dependency Dashboard]",
      "files": [
        "packages/app-core/deploy/docker-compose.supabase-db.yml"
      ]
    },
    {
      "title": "chore(deps): bump openssl from 0.10.75 to 0.10.78 in /packages/examples/telegram/rust/telegram-agent in the cargo group across 1 directory",
      "prNumber": 7104,
      "type": "other",
      "body": "Bumps the cargo group with 1 update in the /packages/examples/telegram/rust/telegram-agent directory: [openssl](https://github.com/rust-openssl/rust-openssl).\n\nUpdates `openssl` from 0.10.75 to 0.10.78\n<details>\n<summary>Release notes</summ",
      "files": [
        "packages/examples/telegram/rust/telegram-agent/Cargo.lock"
      ]
    },
    {
      "title": "chore(deps): bump lxml from 6.0.1 to 6.1.0 in /packages/benchmarks/OSWorld in the uv group across 1 directory",
      "prNumber": 7103,
      "type": "other",
      "body": "Bumps the uv group with 1 update in the /packages/benchmarks/OSWorld directory: [lxml](https://github.com/lxml/lxml).\n\nUpdates `lxml` from 6.0.1 to 6.1.0\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com",
      "files": [
        "packages/benchmarks/OSWorld/uv.lock"
      ]
    },
    {
      "title": "fix(message): keep explicit-REPLY response when race-discard fires",
      "prNumber": 7143,
      "type": "bugfix",
      "body": "## what\n\nWhen a newer message arrives in the same room while we're generating a response, the race-check at `packages/typescript/src/services/message.ts:3830` blanket-discards the older response. The intent is to avoid spamming back-to-back",
      "files": [
        "packages/typescript/src/services/message.test.ts",
        "packages/typescript/src/services/message.ts"
      ]
    },
    {
      "title": "chore(deps): update supabase/postgres docker tag to v17.6.1.112",
      "prNumber": 7142,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Update | Change |\n|---|---|---|\n| supabase/postgres | patch | `17.6.1.111` → `17.6.1.112` |\n\n---\n\n> [!WARNING]\n> Some dependencies could not be looked up. Check the [Dependency Dashboard]",
      "files": [
        "packages/app-core/deploy/docker-compose.supabase-db.yml"
      ]
    },
    {
      "title": "fix(message): respect explicit REPLY action in metadata-rescue gate",
      "prNumber": 7141,
      "type": "bugfix",
      "body": "## what\n\nWhen the planner returns `['REPLY']`, the metadata-overlap rescue at the end of the action-routing pipeline (`message.ts:5987`, the \"Recovered primary action from action metadata after passive reply draft\" log line) considers REPLY",
      "files": [
        "packages/typescript/src/services/message.test.ts",
        "packages/typescript/src/services/message.ts"
      ]
    },
    {
      "title": "feat(github-connection): add settings card + PAT storage for coding sub-agents",
      "prNumber": 7139,
      "type": "feature",
      "body": "## what\n\nAdds a GitHub connection card to **Settings → Coding Agents** (the local UI on `:2138`) that persists a single per-user PAT and exposes it to spawned coding sub-agents through `process.env.GITHUB_TOKEN`.\n\nToday, when a coding sub-a",
      "files": [
        "apps/app-task-coordinator/src/CodingAgentSettingsSection.tsx",
        "apps/app-task-coordinator/src/GitHubConnectionCard.tsx",
        "packages/app-core/src/api/github-routes.test.ts",
        "packages/app-core/src/api/github-routes.ts",
        "packages/app-core/src/api/server.ts",
        "packages/app-core/src/runtime/dev-server.ts",
        "packages/app-core/src/services/github-credentials.test.ts",
        "packages/app-core/src/services/github-credentials.ts"
      ]
    },
    {
      "title": "fix(n8n-sidecar): demote binary-missing diagnostics to debug",
      "prNumber": 7138,
      "type": "bugfix",
      "body": "## what\n\nWhen the local n8n sidecar can't find the n8n binary (user hasn't installed it / npm cache miss), every supervisor retry pumps two warn-level lines into the dev-server log:\n\n```\n[n8n-sidecar:stderr] sh: 1: n8n: not found\n[n8n-sidec",
      "files": [
        "packages/app-core/src/services/n8n-sidecar.test.ts",
        "packages/app-core/src/services/n8n-sidecar.ts"
      ]
    },
    {
      "title": "feat(automations): missing-credentials banner in AutomationsView",
      "prNumber": 7134,
      "type": "feature",
      "body": "## Summary\n\nWhen `POST /api/n8n/workflows/generate` returns the missing-credentials shape (`{ ...deployed, missingCredentials, warning: \\\"missing credentials\\\" }`), the client now discriminates the response, surfaces a CTA banner above the ",
      "files": [
        "packages/app-core/src/api/client-n8n.ts",
        "packages/app-core/src/api/client-types-chat.ts",
        "packages/app-core/src/components/pages/AutomationsView.tsx"
      ]
    },
    {
      "title": "feat(agent): runtime operations manager + widget host refresh",
      "prNumber": 7166,
      "type": "feature",
      "body": "## Summary\n\nBundles in-flight feature work on `feat/widget-host-cycle-and-greenup` so it isn't sitting as uncommitted state. Includes:\n\n- New `packages/agent/src/runtime/operations/` module — `RuntimeOperationManager` as the single-flight g",
      "files": [
        "apps/app-clawville/assets/hero.png",
        "apps/app-defense-of-the-agents/assets/hero.png",
        "apps/app-steward/package.json",
        "apps/app-steward/src/browser-workspace-wallet.ts",
        "apps/app-steward/src/routes/wallet-browser-compat-routes.ts",
        "apps/app/tsconfig.json",
        "packages/agent/src/actions/browser-session.ts",
        "packages/agent/src/actions/launchpad-launch.test.ts",
        "packages/agent/src/actions/launchpad-launch.ts",
        "packages/agent/src/api/chat-augmentation.ts",
        "packages/agent/src/api/cloud-status-routes.ts",
        "packages/agent/src/api/provider-switch-routes.ts",
        "packages/agent/src/api/server.ts",
        "packages/agent/src/runtime/eliza-plugin.ts",
        "packages/agent/src/runtime/operations/classifier.test.ts",
        "packages/agent/src/runtime/operations/classifier.ts",
        "packages/agent/src/runtime/operations/cold-strategy.ts",
        "packages/agent/src/runtime/operations/health-checks.ts",
        "packages/agent/src/runtime/operations/health.test.ts",
        "packages/agent/src/runtime/operations/health.ts",
        "packages/agent/src/runtime/operations/index.ts",
        "packages/agent/src/runtime/operations/manager.ts",
        "packages/agent/src/runtime/operations/reload-hot.ts",
        "packages/agent/src/runtime/operations/repository.ts",
        "packages/agent/src/runtime/operations/types.ts",
        "packages/agent/src/runtime/restart.ts",
        "packages/agent/src/services/browser-workspace-desktop.ts",
        "packages/agent/src/services/browser-workspace-types.ts",
        "packages/agent/src/services/browser-workspace.ts",
        "packages/agent/src/services/index.ts",
        "packages/agent/src/services/launchpads/image-generator.ts",
        "packages/agent/src/services/launchpads/launchpad-engine.test.ts",
        "packages/agent/src/services/launchpads/launchpad-engine.ts",
        "packages/agent/src/services/launchpads/launchpad-types.ts",
        "packages/agent/src/services/launchpads/metadata-generator.ts",
        "packages/agent/src/services/launchpads/profiles/flap-sh.ts",
        "packages/agent/src/services/launchpads/profiles/four-meme.ts",
        "packages/agent/tsconfig.json",
        "packages/app-core/platforms/electrobun/src/bridge/browser-tabs-renderer-registry.ts",
        "packages/app-core/platforms/electrobun/src/bridge/electrobun-direct-rpc.ts",
        "packages/app-core/platforms/electrobun/src/native/browser-workspace.ts",
        "packages/app-core/platforms/electrobun/src/preload.js",
        "packages/app-core/platforms/electrobun/src/rpc-handlers.ts",
        "packages/app-core/platforms/electrobun/src/rpc-schema.ts",
        "packages/app-core/scripts/dev-platform.mjs",
        "packages/app-core/scripts/dev-ui.mjs",
        "packages/app-core/src/ambient-modules.d.ts",
        "packages/app-core/src/api/catalog-routes.ts",
        "packages/app-core/src/api/client-base.ts",
        "packages/app-core/src/api/client-types-core.ts"
      ]
    },
    {
      "title": "[codex] Clear stale Eliza Cloud auth on relink",
      "prNumber": 7165,
      "type": "other",
      "body": "## Summary\n- Clear stale in-memory Eliza Cloud auth when a new account login is persisted.\n- Reinitialize `CloudManager` with the newly linked API key instead of keeping an old client alive.\n- Preserve the linked account identity in runtime",
      "files": [
        "apps/app-lifeops/src/lifeops/relative-time.ts",
        "apps/app-lifeops/src/lifeops/repository.ts",
        "apps/app-lifeops/src/lifeops/schedule-insight.ts",
        "apps/app-lifeops/src/lifeops/schedule-state.ts",
        "apps/app-lifeops/src/lifeops/schedule-sync-contracts.ts",
        "packages/agent/src/api/__tests__/provider-switch-config.test.ts",
        "packages/agent/src/api/cloud-routes.ts",
        "packages/agent/src/api/provider-switch-config.ts",
        "packages/agent/src/auth/credentials.test.ts",
        "packages/agent/src/auth/credentials.ts",
        "packages/agent/src/cloud/cloud-manager.ts",
        "packages/app-core/src/api/cloud-connection.ts",
        "packages/app-core/src/api/cloud-routes.test.ts",
        "packages/app-core/src/api/cloud-routes.ts",
        "packages/app-core/src/components/shell/StartupShell.tsx",
        "packages/elizaos/templates/fullstack-app/README.md",
        "packages/elizaos/templates/fullstack-app/apps/app/scripts/generate-brand-assets.mjs",
        "packages/shared/src/contracts/lifeops.ts",
        "packages/templates/fullstack-app/README.md",
        "packages/templates/fullstack-app/apps/app/scripts/generate-brand-assets.mjs",
        "plugins/plugin-elizacloud"
      ]
    },
    {
      "title": "feat(n8n): propagate originating-conversation routing into workflow generator",
      "prNumber": 7164,
      "type": "feature",
      "body": "## Summary\n\nWhen a workflow is generated from inside a platform conversation (e.g. a Discord DM or a Telegram chat), surface the originating channel or chat to the LLM as a `## Runtime Facts` line. The user can say *\\\"post the result back t",
      "files": [
        "packages/app-core/src/api/client-types-chat.ts",
        "packages/app-core/src/api/n8n-routes.ts",
        "packages/app-core/src/components/pages/AutomationsView.tsx",
        "packages/app-core/src/runtime/eliza.ts",
        "packages/app-core/src/services/n8n-runtime-context-provider.test.ts",
        "packages/app-core/src/services/n8n-runtime-context-provider.ts"
      ]
    },
    {
      "title": "feat(app-core): n8n runtime-context provider — surface Discord guilds/channels + Gmail to workflow generator",
      "prNumber": 7163,
      "type": "feature",
      "body": "## Summary\n\nRegisters an optional service of type `n8n_runtime_context_provider` that the patched `@elizaos/plugin-n8n-workflow` (see #25) reads to inject live connector facts into the workflow-generation prompt:\n\n- **Discord facts** — enum",
      "files": [
        "packages/app-core/src/runtime/eliza.ts",
        "packages/app-core/src/services/n8n-runtime-context-provider.test.ts",
        "packages/app-core/src/services/n8n-runtime-context-provider.ts"
      ]
    },
    {
      "title": "fix(connectors): purge n8n credential cache on disconnect so disconnect actually disconnects",
      "prNumber": 7162,
      "type": "bugfix",
      "body": "## Summary\n\nThe S25 missing-credentials banner shipped in #7134 silently fails when a user disconnects a connector. The disconnect path clears OAuth tokens from `milady.json` but leaves the n8n credential cache (`credStore` in plugin-n8n-wo",
      "files": [
        "packages/agent/src/api/connector-routes.ts",
        "packages/agent/src/api/server.ts",
        "packages/app-core/src/components/pages/AutomationsView.tsx",
        "packages/app-core/src/components/pages/SettingsView.tsx",
        "packages/app-core/src/state/connector-deeplink.ts",
        "packages/app-core/src/state/index.ts",
        "packages/app-core/src/styles/styles.css",
        "packages/app/src/main.tsx",
        "packages/shared/src/connector-cred-types.ts",
        "packages/shared/src/index.ts"
      ]
    },
    {
      "title": "feat(automations): deep-link banner Connect → Settings connector panel",
      "prNumber": 7161,
      "type": "feature",
      "body": "## Summary\n\nThe missing-credentials banner shipped in #7134 dropped the user on the Settings page top — they had to scroll/search for the right connector. This closes the loop: each \"Connect <Service> →\" button now scrolls the matching conn",
      "files": [
        "packages/app-core/src/components/pages/AutomationsView.tsx",
        "packages/app-core/src/components/pages/SettingsView.tsx",
        "packages/app-core/src/state/connector-deeplink.ts",
        "packages/app-core/src/state/index.ts",
        "packages/app-core/src/styles/styles.css",
        "packages/app/src/main.tsx"
      ]
    },
    {
      "title": "feat(skills): bundle build-monetized-app skill",
      "prNumber": 7160,
      "type": "feature",
      "body": "## Summary\n\nAdd a new bundled skill — **`build-monetized-app`** — that teaches the agent how to build a monetized app on Eliza Cloud, deploy it as a container, and route the earnings back into hosting via the existing pay-as-you-go-from-ear",
      "files": [
        "packages/skills/skills/build-monetized-app/SKILL.md",
        "packages/skills/skills/build-monetized-app/references/failure-modes.md",
        "packages/skills/skills/build-monetized-app/references/sdk-flow.md",
        "packages/skills/skills/build-monetized-app/references/survival-economics.md"
      ]
    },
    {
      "title": "fix(actions): skip non-string entries in formatActionSimiles/Tags",
      "prNumber": 7159,
      "type": "bugfix",
      "body": "## Summary\n\n`formatActionSimiles` and `formatActionTags` call `.trim()` on every entry of `action.similes` / `action.tags` without filtering out non-string entries. If any registered action ships with a malformed tags/similes array (contain",
      "files": [
        "packages/typescript/src/__tests__/actions.test.ts",
        "packages/typescript/src/actions.ts"
      ]
    },
    {
      "title": "chore(deps): update dependency ruby to v3.4.9",
      "prNumber": 7158,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [ruby](https://www.ruby-lang.org) ([source](https://redirect.github.com/ruby/ruby)) | uses-with | minor | `3.2` → `3.4.9` |\n\n---\n\n> [!WARNING]",
      "files": [
        ".github/workflows/android-release.yml",
        ".github/workflows/apple-store-release.yml"
      ]
    },
    {
      "title": "chore(deps): update dependency python to 3.14",
      "prNumber": 7157,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [python](https://redirect.github.com/actions/python-versions) | uses-with | minor | `3.12` → `3.14` |\n| [python](https://redirect.github.com/a",
      "files": [
        ".github/workflows/publish-packages.yml",
        ".github/workflows/publish-plugin-elizacloud.yml",
        ".github/workflows/test-packaging.yml"
      ]
    },
    {
      "title": "fix(deps): update react monorepo to v19.2.5",
      "prNumber": 7156,
      "type": "bugfix",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [react](https://react.dev/) ([source](h",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency bun to v1.3.13",
      "prNumber": 7155,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [bun](https://bun.com) ([source](https:",
      "files": [
        ".github/workflows/snap-build-test.yml"
      ]
    },
    {
      "title": "chore: remove @elizaos/plugin-todo and @elizaos/plugin-rolodex",
      "prNumber": 7154,
      "type": "other",
      "body": "## Summary\nRemoves every remaining reference to \\`@elizaos/plugin-todo\\` and \\`@elizaos/plugin-rolodex\\` from the monorepo. Neither \\`plugins/plugin-todo\\` nor \\`plugins/plugin-rolodex\\` exists as a directory in this checkout, but stale ref",
      "files": [
        ".github/workflows/release-rust.yaml",
        "packages/app-core/src/registry/entries/plugins/rolodex.json",
        "packages/app-core/src/registry/entries/plugins/todo.json",
        "packages/benchmarks/rolodex/conversations.ts",
        "packages/benchmarks/rolodex/handlers/eliza.ts",
        "packages/benchmarks/rolodex/handlers/perfect.ts",
        "packages/benchmarks/rolodex/handlers/rolodex.ts",
        "packages/benchmarks/rolodex/python_bench/__init__.py",
        "packages/benchmarks/rolodex/python_bench/__main__.py",
        "packages/benchmarks/rolodex/python_bench/conversations.py",
        "packages/benchmarks/rolodex/python_bench/handlers/__init__.py",
        "packages/benchmarks/rolodex/python_bench/handlers/eliza.py",
        "packages/benchmarks/rolodex/python_bench/handlers/perfect.py",
        "packages/benchmarks/rolodex/python_bench/handlers/rolodex.py",
        "packages/benchmarks/rolodex/python_bench/reporter.py",
        "packages/benchmarks/rolodex/python_bench/run.py",
        "packages/benchmarks/rolodex/python_bench/scorer.py",
        "packages/benchmarks/rolodex/python_bench/types.py",
        "packages/benchmarks/rolodex/python_bench/world.py",
        "packages/benchmarks/rolodex/reporter.ts",
        "packages/benchmarks/rolodex/run.ts",
        "packages/benchmarks/rolodex/scorer.ts",
        "packages/benchmarks/rolodex/types.ts",
        "packages/benchmarks/rolodex/world.ts",
        "packages/examples/code/package.json",
        "packages/examples/code/src/lib/agent.ts"
      ]
    },
    {
      "title": "Fix cloud provider switch model drift",
      "prNumber": 7153,
      "type": "bugfix",
      "body": "## Summary\n- clear stale direct-provider model state when switching the runtime to Eliza Cloud or a remote provider\n- skip injecting Codex/OpenAI subscription credentials into the main runtime when cloud inference is active\n- add regression",
      "files": [
        "apps/app-lifeops/src/lifeops/relative-time.ts",
        "apps/app-lifeops/src/lifeops/repository.ts",
        "apps/app-lifeops/src/lifeops/schedule-insight.ts",
        "apps/app-lifeops/src/lifeops/schedule-state.ts",
        "apps/app-lifeops/src/lifeops/schedule-sync-contracts.ts",
        "packages/agent/src/api/__tests__/provider-switch-config.test.ts",
        "packages/agent/src/api/provider-switch-config.ts",
        "packages/agent/src/auth/credentials.test.ts",
        "packages/agent/src/auth/credentials.ts",
        "packages/app-core/src/components/shell/StartupShell.tsx",
        "packages/elizaos/templates/fullstack-app/README.md",
        "packages/elizaos/templates/fullstack-app/apps/app/scripts/generate-brand-assets.mjs",
        "packages/shared/src/contracts/lifeops.ts",
        "packages/templates/fullstack-app/README.md",
        "packages/templates/fullstack-app/apps/app/scripts/generate-brand-assets.mjs"
      ]
    },
    {
      "title": "fix(message): add CREATE_TASK to EXPLICIT_INTENT_ACTIONS",
      "prNumber": 7152,
      "type": "bugfix",
      "body": "## Summary\n\n`findOwnedActionCorrectionFromMetadata` was overriding the planner's correct `CREATE_TASK` pick with role-gated actions like `OWNER_CALENDAR` based on incidental keyword overlap (e.g. a date in the prompt overlapping the calenda",
      "files": [
        "packages/typescript/src/services/message.test.ts",
        "packages/typescript/src/services/message.ts"
      ]
    },
    {
      "title": "chore(deps): bump TypeScript to ^6.0.3",
      "prNumber": 7151,
      "type": "other",
      "body": "## Summary\n- Bumps the \\`typescript\\` devDependency to \\`^6.0.3\\` across all 18 packages that previously pinned a 5.x version.\n- Adds \\`\\\"ignoreDeprecations\\\": \\\"6.0\\\"\\` to the tsconfigs that still use TS 6-deprecated options (\\`moduleResol",
      "files": [
        "bun.lock",
        "package.json",
        "packages/app-core/package.json",
        "packages/autonomous/package.json",
        "packages/autonomous/tsconfig.json",
        "packages/computeruse/examples/mcp-client-elicitation/package.json",
        "packages/computeruse/examples/recaptcha-resolver/package.json",
        "packages/computeruse/packages/kv/package.json",
        "packages/computeruse/packages/kv/tsconfig.json",
        "packages/computeruse/packages/workflow/package.json",
        "packages/computeruse/packages/workflow/tsconfig.json",
        "packages/daemon/package.json",
        "packages/elizaos/package.json",
        "packages/home/package.json",
        "packages/home/tsconfig.json",
        "packages/interop/package.json",
        "packages/sweagent/package.json",
        "packages/sweagent/typescript/package.json",
        "packages/sweagent/typescript/src/run/package.json",
        "packages/sweagent/typescript/src/run/tsconfig.json",
        "packages/sweagent/typescript/tools/package.json",
        "packages/sweagent/typescript/tools/tsconfig.json",
        "packages/training/package.json",
        "packages/training/tsconfig.json",
        "packages/typescript/package.json",
        "packages/typescript/tsconfig.declarations.json",
        "packages/ui/package.json",
        "packages/ui/tsconfig.json",
        "tsconfig.build.template.json",
        "tsconfig.json"
      ]
    },
    {
      "title": "chore(deps): bump rollup transitive to 4.60.2",
      "prNumber": 7149,
      "type": "other",
      "body": "## Summary\n- Adds \\`rollup: ^4.60.2\\` to root \\`overrides\\` so \\`vite\\` and \\`vitest/vite\\` resolve rollup at 4.60.2 instead of the lockfile-pinned 4.59.0.\n\nRollup isn't a direct dep — \\`vite@5.4.21\\` (\\`^4.20.0\\`) and \\`vitest/vite@7.3.1\\`",
      "files": [
        "bun.lock",
        "package.json"
      ]
    },
    {
      "title": "chore(deps): bump Node.js to 24.15.0 (LTS Krypton)",
      "prNumber": 7148,
      "type": "other",
      "body": "## Summary\n- \\`engines.node\\` 23.3.0 -> 24.15.0 (root)\n- Workflow \\`node-version\\`: 22 / 23 / 23.3.0 -> 24 / 24.15.0\n  - \\`ci.yaml\\` (3 jobs)\n  - \\`jsdoc-automation.yml\\`\n  - \\`release-computeruse-npm.yaml\\` (3 jobs)\n  - \\`release.yaml\\`\n  ",
      "files": [
        ".github/workflows/ci.yaml",
        ".github/workflows/jsdoc-automation.yml",
        ".github/workflows/publish-next-prerelease.yaml",
        ".github/workflows/release-computeruse-npm.yaml",
        ".github/workflows/release.yaml",
        ".github/workflows/sync-next-dist-tags.yaml",
        "package.json"
      ]
    },
    {
      "title": "chore(deps): bump @capacitor/* to current minor versions",
      "prNumber": 7147,
      "type": "other",
      "body": "## Summary\n- @capacitor/core 8.0.2 -> 8.3.1\n- @capacitor/app ^8.0.1 -> ^8.1.0\n- @capacitor/keyboard 8.0.0 -> 8.0.3\n- @capacitor/haptics 8.0.0 -> 8.0.2\n- @capacitor/status-bar ^8.0.1 -> ^8.0.2\n- @capacitor/preferences left at ^8.0.1 (already",
      "files": [
        "bun.lock",
        "packages/app-core/package.json",
        "packages/home/package.json"
      ]
    },
    {
      "title": "fix(windows): test portability for path separators and mode bits",
      "prNumber": 7145,
      "type": "bugfix",
      "body": "## Summary\n- **paths.test.ts**: replace hardcoded forward-slash expected values with `path.join()` so tests pass on windows where `path.join` produces backslashes\n- **account-storage.test.ts**: gate the `0o600` POSIX mode-bit assertion behi",
      "files": [
        "packages/agent/src/auth/__tests__/account-storage.test.ts",
        "packages/app-core/src/services/local-inference/paths.test.ts"
      ]
    },
    {
      "title": "fix(deps): update dependency lucide-react to v1",
      "prNumber": 7209,
      "type": "bugfix",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [lucide-react](https://lucide.dev) ([so",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update softprops/action-gh-release action to v3",
      "prNumber": 7208,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [softprops/action-gh-release](https://redirect.github.com/softprops/action-gh-release) | action | major | `v2` → `v3` |\n\n---\n\n> [!WARNING]\n> S",
      "files": [
        ".github/workflows/nightly.yml",
        ".github/workflows/release-electrobun.yml"
      ]
    },
    {
      "title": "chore(deps): update peter-evans/repository-dispatch action to v4",
      "prNumber": 7207,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [peter-evans/repository-dispatch](https://redirect.github.com/peter-evans/repository-dispatch) | action | major | `v3` → `v4` |\n\n---\n\n> [!WARN",
      "files": [
        ".github/workflows/update-homebrew.yml"
      ]
    },
    {
      "title": "chore(deps): update dependency ai to v6.0.170",
      "prNumber": 7206,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [ai](https://ai-sdk.dev/docs) ([source]",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "Miladyos local agent on android",
      "prNumber": 7205,
      "type": "other",
      "body": "Agent on android\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\nThis PR wires up a full on-device Eliza agent on Android: a new `MiladyAgentService` foreground service extracts and exec's a Bun runtime + agent bundle from APK assets",
      "files": [
        "packages/agent/src/bin.ts",
        "packages/agent/src/cli/index.ts",
        "packages/agent/src/runtime/aosp-llama-adapter.test.ts",
        "packages/agent/src/runtime/aosp-llama-adapter.ts",
        "packages/agent/src/runtime/aosp-local-inference-bootstrap.test.ts",
        "packages/agent/src/runtime/aosp-local-inference-bootstrap.ts",
        "packages/app-core/platforms/android/app/build.gradle",
        "packages/app-core/platforms/android/app/src/main/java/ai/elizaos/app/MainActivity.java",
        "packages/app-core/platforms/android/app/src/main/java/ai/elizaos/app/MiladyAgentService.java",
        "packages/app-core/scripts/lib/stage-android-agent.mjs",
        "packages/app-core/scripts/lib/stage-android-agent.test.ts",
        "packages/app-core/scripts/run-mobile-build.mjs",
        "packages/app-core/scripts/run-mobile-build.test.ts",
        "packages/app-core/src/components/shell/RuntimeGate.tsx",
        "packages/app-core/src/onboarding/probe-local-agent.ts",
        "packages/app-core/src/runtime/ensure-local-inference-handler.test.ts",
        "packages/app-core/src/runtime/ensure-local-inference-handler.ts",
        "packages/app-core/src/services/local-inference/catalog.ts",
        "packages/app-core/src/services/local-inference/router-handler.test.ts",
        "packages/app-core/test/onboarding/probe-local-agent.test.ts"
      ]
    },
    {
      "title": "chore(deps): update github artifact actions (major)",
      "prNumber": 7201,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/download-artifact](https://redirect.github.com/actions/download-artifact) | action | major | `v4` → `v8` |\n| [actions/upload-artifact",
      "files": [
        ".github/workflows/android-release.yml",
        ".github/workflows/apple-store-release.yml",
        ".github/workflows/benchmark-weekly.yml",
        ".github/workflows/docker-ci-smoke.yml",
        ".github/workflows/live-scenarios.yml",
        ".github/workflows/mobile-build-smoke.yml",
        ".github/workflows/publish-packages.yml",
        ".github/workflows/release-electrobun.yml",
        ".github/workflows/scenario-matrix.yml",
        ".github/workflows/snap-build-test.yml",
        ".github/workflows/test-flatpak.yml",
        ".github/workflows/test-packaging.yml"
      ]
    },
    {
      "title": "chore(deps): update eslint monorepo to v10 (major)",
      "prNumber": 7200,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@eslint/js](https://eslint.org) ([sour",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency wrangler to v4",
      "prNumber": 7199,
      "type": "other",
      "body": "> ℹ️ **Note**\n> \n> This PR body was truncated due to platform limits.\n\nThis PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-con",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency vite to v8",
      "prNumber": 7198,
      "type": "other",
      "body": "> ℹ️ **Note**\n> \n> This PR body was truncated due to platform limits.\n\nThis PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-con",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "feat(vault): @elizaos/vault — cross-platform secrets vault + Settings UI integration",
      "prNumber": 7197,
      "type": "feature",
      "body": "# Relates to\n\nThis is the upstream-targeting twin of milady-ai/eliza#6. The vault feature originated in the Milady fork; this PR lands the upstream-relevant slice on `elizaOS/eliza:develop`.\n\n# Risks\n\n**Low.** The vault is an additive works",
      "files": [
        ".github/actions/setup-bun-workspace/action.yml",
        ".github/workflows/apple-store-release.yml",
        ".github/workflows/mobile-build-smoke.yml",
        ".github/workflows/nightly.yml",
        ".github/workflows/quality-fork.yml",
        ".github/workflows/test-electrobun-release.yml",
        ".github/workflows/vault-ci.yaml",
        ".github/workflows/windows-dev-smoke.yml",
        "apps/app/.env.example",
        "apps/app/.gitignore",
        "apps/app/README.md",
        "apps/app/app.config.ts",
        "apps/app/capacitor.config.ts",
        "apps/app/electrobun/.gitignore",
        "apps/app/index.html",
        "apps/app/package.json",
        "apps/app/playwright.electrobun.packaged.config.ts",
        "apps/app/playwright.ui-packaged.config.ts",
        "apps/app/playwright.ui-smoke.config.ts",
        "apps/app/playwright.web-views.config.ts",
        "apps/app/public/android-chrome-192x192.png",
        "apps/app/public/android-chrome-512x512.png",
        "apps/app/public/apple-touch-icon.png",
        "apps/app/public/favicon-16x16.png",
        "apps/app/public/favicon-32x32.png",
        "apps/app/public/favicon.ico",
        "apps/app/public/logos/anthropic-icon-white.png",
        "apps/app/public/logos/anthropic-icon.png",
        "apps/app/public/logos/claude-icon.png",
        "apps/app/public/logos/deepseek-icon.png",
        "apps/app/public/logos/elizaos-icon.png",
        "apps/app/public/logos/gemini-icon.png",
        "apps/app/public/logos/grok-icon-white.png",
        "apps/app/public/logos/grok-icon.png",
        "apps/app/public/logos/groq-icon-white.png",
        "apps/app/public/logos/groq-icon.png",
        "apps/app/public/logos/mistral-icon.png",
        "apps/app/public/logos/ollama-icon-white.png",
        "apps/app/public/logos/ollama-icon.png",
        "apps/app/public/logos/openai-icon-white.png",
        "apps/app/public/logos/openai-icon.png",
        "apps/app/public/logos/openrouter-icon-white.png",
        "apps/app/public/logos/openrouter-icon.png",
        "apps/app/public/logos/together-ai-icon.png",
        "apps/app/public/logos/zai-icon-white.png",
        "apps/app/public/logos/zai-icon.png",
        "apps/app/public/og-image.png",
        "apps/app/public/splash-bg.jpg",
        "apps/app/scripts/build.mjs",
        "apps/app/scripts/capacitor-plugin-names.mjs"
      ]
    },
    {
      "title": "chore(deps): update dependency typescript to v6",
      "prNumber": 7193,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [typescript](https://www.typescriptlang",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency ruby to v4",
      "prNumber": 7192,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [ruby](https://www.ruby-lang.org) ([source](https://redirect.github.com/ruby/ruby)) | uses-with | major | `3.4.9` → `4.0.3` |\n\n---\n\n> [!WARNIN",
      "files": [
        ".github/workflows/android-release.yml",
        ".github/workflows/apple-store-release.yml"
      ]
    },
    {
      "title": "chore(deps): update dependency node to v24",
      "prNumber": 7191,
      "type": "other",
      "body": "> ℹ️ **Note**\n> \n> This PR body was truncated due to platform limits.\n\nThis PR contains the following updates:\n\n| Package | Type | Update | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovateb",
      "files": [
        ".github/workflows/benchmark-tests.yml",
        ".github/workflows/docker-ci-smoke.yml",
        ".github/workflows/integration-dod-gap-issues.yml",
        ".github/workflows/mobile-build-smoke.yml",
        ".github/workflows/publish-plugin-elizacloud.yml",
        ".github/workflows/release-electrobun.yml",
        ".github/workflows/test-electrobun-release.yml",
        ".github/workflows/test-packaging.yml",
        ".github/workflows/windows-desktop-preload-smoke.yml",
        ".github/workflows/windows-dev-smoke.yml",
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency macos to v15",
      "prNumber": 7190,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [macos](https://redirect.github.com/actions/runner-images) | github-runner | major | `14` → `15` |\n\n---\n\n> [!WARNING]\n> Some dependencies coul",
      "files": [
        ".github/workflows/apple-store-release.yml",
        ".github/workflows/release-electrobun.yml"
      ]
    },
    {
      "title": "chore(deps): update dependency @vitejs/plugin-react to v6",
      "prNumber": 7189,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@vitejs/plugin-react](https://redirect",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update android-actions/setup-android action to v4",
      "prNumber": 7188,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [android-actions/setup-android](https://redirect.github.com/android-actions/setup-android) | action | major | `v3` → `v4` |\n\n---\n\n> [!WARNING]",
      "files": [
        ".github/workflows/elizaos-cuttlefish.yml",
        ".github/workflows/mobile-build-smoke.yml"
      ]
    },
    {
      "title": "chore(deps): update actions/setup-python action to v6",
      "prNumber": 7186,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/setup-python](https://redirect.github.com/actions/setup-python) | action | major | `v5` → `v6` |\n\n---\n\n> [!WARNING]\n> Some dependenci",
      "files": [
        ".github/actions/setup-bun-workspace/action.yml",
        ".github/workflows/publish-packages.yml",
        ".github/workflows/publish-plugin-elizacloud.yml",
        ".github/workflows/test-packaging.yml"
      ]
    },
    {
      "title": "chore(deps): update actions/setup-java action to v5",
      "prNumber": 7185,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/setup-java](https://redirect.github.com/actions/setup-java) | action | major | `v4` → `v5` |\n\n---\n\n> [!WARNING]\n> Some dependencies c",
      "files": [
        ".github/workflows/elizaos-cuttlefish.yml"
      ]
    },
    {
      "title": "chore(deps): update dependency ai to v6.0.169",
      "prNumber": 7184,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [ai](https://ai-sdk.dev/docs) ([source]",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/provider-utils to v4.0.24",
      "prNumber": 7183,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/provider-utils](https://ai-sdk",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/provider to v3.0.9",
      "prNumber": 7182,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/provider](https://ai-sdk.dev/d",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/openai to v3.0.54",
      "prNumber": 7181,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/openai](https://ai-sdk.dev/doc",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update actions/setup-node action to v6",
      "prNumber": 7180,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/setup-node](https://redirect.github.com/actions/setup-node) | action | major | `v4` → `v6` |\n\n---\n\n> [!WARNING]\n> Some dependencies c",
      "files": [
        ".github/workflows/android-release.yml",
        ".github/workflows/apple-store-release.yml",
        ".github/workflows/benchmark-tests.yml",
        ".github/workflows/benchmark-weekly.yml",
        ".github/workflows/docker-ci-smoke.yml",
        ".github/workflows/integration-dod-gap-issues.yml",
        ".github/workflows/live-scenarios.yml",
        ".github/workflows/mobile-build-smoke.yml",
        ".github/workflows/nightly.yml",
        ".github/workflows/publish-plugin-elizacloud.yml",
        ".github/workflows/quality-fork.yml",
        ".github/workflows/quality.yml",
        ".github/workflows/release-electrobun.yml",
        ".github/workflows/test-electrobun-release.yml",
        ".github/workflows/test-packaging.yml",
        ".github/workflows/test.yml",
        ".github/workflows/windows-desktop-preload-smoke.yml",
        ".github/workflows/windows-dev-smoke.yml"
      ]
    },
    {
      "title": "chore(deps): update actions/setup-java action to v5",
      "prNumber": 7179,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/setup-java](https://redirect.github.com/actions/setup-java) | action | major | `v4` → `v5` |\n\n---\n\n> [!WARNING]\n> Some dependencies c",
      "files": [
        ".github/workflows/android-release.yml",
        ".github/workflows/mobile-build-smoke.yml"
      ]
    },
    {
      "title": "chore(deps): update actions/labeler action to v6",
      "prNumber": 7178,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/labeler](https://redirect.github.com/actions/labeler) | action | major | `v5` → `v6` |\n\n---\n\n> [!WARNING]\n> Some dependencies could n",
      "files": [
        ".github/workflows/auto-label.yml"
      ]
    },
    {
      "title": "chore(deps): update actions/github-script action to v9",
      "prNumber": 7177,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/github-script](https://redirect.github.com/actions/github-script) | action | major | `v7` → `v9` |\n\n---\n\n> [!WARNING]\n> Some dependen",
      "files": [
        ".github/workflows/auto-label.yml"
      ]
    },
    {
      "title": "Miladyos local agent on android",
      "prNumber": 7176,
      "type": "other",
      "body": "<!-- Use this template by filling in information and copying and pasting relevant items out of the HTML comments. -->\r\n\r\n# Relates to\r\n\r\n<!-- LINK TO ISSUE OR TICKET -->\r\n\r\n<!-- This risks section must be filled out before the final review ",
      "files": [
        "packages/agent/scripts/build-mobile-bundle.mjs",
        "packages/agent/src/api/provider-switch-config.test.ts",
        "packages/agent/src/api/provider-switch-config.ts",
        "packages/agent/src/api/provider-switch-routes.ts",
        "packages/agent/src/api/server-helpers-auth.ts",
        "packages/agent/src/runtime/first-time-setup.test.ts",
        "packages/agent/src/runtime/first-time-setup.ts",
        "packages/app-core/platforms/android/app/src/main/java/ai/elizaos/app/MiladyAgentService.java",
        "packages/app-core/scripts/lib/stage-android-agent.mjs",
        "packages/app-core/scripts/run-mobile-build.mjs",
        "packages/app-core/src/components/shell/RuntimeGate.tsx",
        "packages/app-core/src/onboarding-config.ts",
        "packages/app-core/src/runtime/embedding-warmup-policy.test.ts",
        "packages/app-core/src/runtime/embedding-warmup-policy.ts",
        "packages/app-core/src/services/local-inference/catalog.test.ts",
        "packages/app-core/src/services/local-inference/catalog.ts",
        "packages/app-core/src/services/local-inference/types.ts",
        "packages/app-core/test/onboarding-config.test.ts",
        "packages/shared/src/contracts/service-routing.test.ts",
        "packages/shared/src/contracts/service-routing.ts"
      ]
    },
    {
      "title": "Shaw/pr 2067 eliza fix",
      "prNumber": 7175,
      "type": "bugfix",
      "body": "<!-- Use this template by filling in information and copying and pasting relevant items out of the HTML comments. -->\r\n\r\n# Relates to\r\n\r\n<!-- LINK TO ISSUE OR TICKET -->\r\n\r\n<!-- This risks section must be filled out before the final review ",
      "files": [
        ".github/workflows/confidant-ci.yaml",
        "apps/app-clawville/assets/hero.png",
        "apps/app-companion/src/components/companion/CompanionAppView.tsx",
        "apps/app-companion/src/components/companion/CompanionHeader.tsx",
        "apps/app-companion/src/components/companion/CompanionSettingsPanel.tsx",
        "apps/app-companion/src/components/companion/CompanionShell.tsx",
        "apps/app-companion/src/components/companion/CompanionView.tsx",
        "apps/app-companion/src/components/companion/index.ts",
        "apps/app-defense-of-the-agents/assets/hero.png",
        "apps/app-lifeops/src/actions/screen-time.ts",
        "apps/app-lifeops/src/api/client-lifeops.ts",
        "apps/app-lifeops/src/components/BrowserBridgeStatusChip.test.tsx",
        "apps/app-lifeops/src/components/BrowserBridgeStatusChip.tsx",
        "apps/app-lifeops/src/components/EventEditorDrawer.test.tsx",
        "apps/app-lifeops/src/components/EventEditorDrawer.tsx",
        "apps/app-lifeops/src/components/LifeOpsCalendarSection.tsx",
        "apps/app-lifeops/src/components/LifeOpsInboxSection.test.tsx",
        "apps/app-lifeops/src/components/LifeOpsInboxSection.tsx",
        "apps/app-lifeops/src/components/LifeOpsMoneySection.test.tsx",
        "apps/app-lifeops/src/components/LifeOpsMoneySection.tsx",
        "apps/app-lifeops/src/components/LifeOpsOverviewSection.test.tsx",
        "apps/app-lifeops/src/components/LifeOpsOverviewSection.tsx",
        "apps/app-lifeops/src/components/LifeOpsRemindersSection.test.tsx",
        "apps/app-lifeops/src/components/LifeOpsRemindersSection.tsx",
        "apps/app-lifeops/src/components/LifeOpsScreenTimeSection.test.tsx",
        "apps/app-lifeops/src/components/LifeOpsScreenTimeSection.tsx",
        "apps/app-lifeops/src/components/LifeOpsSectionContent.tsx",
        "apps/app-lifeops/src/components/LifeOpsSettingsSection.tsx",
        "apps/app-lifeops/src/components/LifeOpsSleepSection.test.tsx",
        "apps/app-lifeops/src/components/LifeOpsSleepSection.tsx",
        "apps/app-lifeops/src/components/MissingSourceCard.tsx",
        "apps/app-lifeops/src/contracts/index.ts",
        "apps/app-lifeops/src/hooks/useCalendarWeek.test.tsx",
        "apps/app-lifeops/src/hooks/useCalendarWeek.ts",
        "apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.test.ts",
        "apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.ts",
        "apps/app-lifeops/src/hooks/useLifeOpsActivitySignals.ts",
        "apps/app-lifeops/src/inbox/channel-deep-links.ts",
        "apps/app-lifeops/src/inbox/message-fetcher.test.ts",
        "apps/app-lifeops/src/inbox/message-fetcher.ts",
        "apps/app-lifeops/src/lifeops/browser-readiness.ts",
        "apps/app-lifeops/src/lifeops/discord-browser-scraper.ts",
        "apps/app-lifeops/src/lifeops/email-classifier.test.ts",
        "apps/app-lifeops/src/lifeops/gmail-account-safety-repository.test.ts",
        "apps/app-lifeops/src/lifeops/google-calendar.test.ts",
        "apps/app-lifeops/src/lifeops/google-calendar.ts",
        "apps/app-lifeops/src/lifeops/google-fetch.test.ts",
        "apps/app-lifeops/src/lifeops/google-fetch.ts",
        "apps/app-lifeops/src/lifeops/google-gmail.test.ts",
        "apps/app-lifeops/src/lifeops/google-gmail.ts"
      ]
    },
    {
      "title": "chore(deps): update actions/checkout action to v6",
      "prNumber": 7174,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/checkout](https://redirect.github.com/actions/checkout) | action | major | `v4` → `v6` |\n\n---\n\n> [!WARNING]\n> Some dependencies could",
      "files": [
        ".github/workflows/android-release.yml",
        ".github/workflows/apple-store-release.yml",
        ".github/workflows/benchmark-tests.yml",
        ".github/workflows/benchmark-weekly.yml",
        ".github/workflows/docker-ci-smoke.yml",
        ".github/workflows/integration-dod-gap-issues.yml",
        ".github/workflows/live-scenarios.yml",
        ".github/workflows/mobile-build-smoke.yml",
        ".github/workflows/nightly.yml",
        ".github/workflows/publish-packages.yml",
        ".github/workflows/publish-plugin-elizacloud.yml",
        ".github/workflows/quality-fork.yml",
        ".github/workflows/quality.yml",
        ".github/workflows/release-electrobun.yml",
        ".github/workflows/scenario-matrix.yml",
        ".github/workflows/snap-build-test.yml",
        ".github/workflows/test-electrobun-release.yml",
        ".github/workflows/test-flatpak.yml",
        ".github/workflows/test-packaging.yml",
        ".github/workflows/test.yml",
        ".github/workflows/windows-desktop-preload-smoke.yml",
        ".github/workflows/windows-dev-smoke.yml"
      ]
    },
    {
      "title": "chore(deps): update actions/cache action to v5",
      "prNumber": 7173,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/cache](https://redirect.github.com/actions/cache) | action | major | `v4` → `v5` |\n\n---\n\n> [!WARNING]\n> Some dependencies could not b",
      "files": [
        ".github/actions/setup-bun-workspace/action.yml",
        ".github/workflows/docker-ci-smoke.yml",
        ".github/workflows/release-electrobun.yml"
      ]
    },
    {
      "title": "feat(local-agent-on-android): full @elizaos/agent runs on the phone",
      "prNumber": 7172,
      "type": "feature",
      "body": "Five-phase landing of the local-agent-on-Android architecture proven by the spike in scripts/spike-android-agent/ and documented in docs/agent-on-mobile.md.\r\n\r\nPhase A — APK asset pipeline (run-mobile-build.mjs + scripts/lib/stage-android-a",
      "files": [
        ".gitignore",
        "packages/agent/package.json",
        "packages/agent/scripts/build-mobile-bundle.mjs",
        "packages/agent/scripts/mobile-stubs/canvas.cjs",
        "packages/agent/scripts/mobile-stubs/huggingface-transformers.cjs",
        "packages/agent/scripts/mobile-stubs/node-llama-cpp.cjs",
        "packages/agent/scripts/mobile-stubs/null-plugin.cjs",
        "packages/agent/scripts/mobile-stubs/onnxruntime-node.cjs",
        "packages/agent/scripts/mobile-stubs/pty-manager.cjs",
        "packages/agent/scripts/mobile-stubs/puppeteer-core.cjs",
        "packages/agent/scripts/mobile-stubs/sharp.cjs",
        "packages/agent/src/runtime/core-plugins.ts",
        "packages/agent/src/runtime/eliza.ts",
        "packages/agent/src/runtime/plugin-collector.ts",
        "packages/app-core/platforms/android/app/src/main/AndroidManifest.xml",
        "packages/app-core/platforms/android/app/src/main/java/ai/elizaos/app/MainActivity.java",
        "packages/app-core/platforms/android/app/src/main/java/ai/elizaos/app/MiladyAgentService.java",
        "packages/app-core/platforms/android/app/src/main/java/ai/elizaos/app/MiladyBootReceiver.java",
        "packages/app-core/scripts/lib/stage-android-agent.mjs",
        "packages/app-core/scripts/run-mobile-build.mjs",
        "packages/app-core/src/api/client-base.ts",
        "packages/app-core/src/components/shell/RuntimeGate.tsx",
        "packages/app-core/src/i18n/locales/en.json",
        "packages/app-core/src/i18n/locales/es.json",
        "packages/app-core/src/i18n/locales/ko.json",
        "packages/app-core/src/i18n/locales/pt.json",
        "packages/app-core/src/i18n/locales/tl.json",
        "packages/app-core/src/i18n/locales/vi.json",
        "packages/app-core/src/i18n/locales/zh-CN.json",
        "packages/app-core/src/onboarding/mobile-runtime-mode.ts",
        "packages/app-core/src/onboarding/probe-local-agent.ts",
        "packages/app-core/src/platform/init.ts",
        "packages/app-core/src/runtime/eliza.ts",
        "packages/app-core/test/onboarding/mobile-runtime-mode.test.ts",
        "packages/app-core/test/onboarding/probe-local-agent.test.ts",
        "packages/app-core/test/onboarding/should-show-local-option.test.ts",
        "packages/native-plugins/agent/src/web.ts",
        "packages/shared/src/runtime-env.ts"
      ]
    },
    {
      "title": "fix(deps): update dependency transformers to ~=5.7.0",
      "prNumber": 7171,
      "type": "bugfix",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [transformers](https://redirect.github.",
      "files": [
        "packages/benchmarks/OSWorld/pyproject.toml",
        "packages/benchmarks/OSWorld/requirements.txt",
        "packages/benchmarks/OSWorld/setup.py",
        "packages/benchmarks/OSWorld/uv.lock"
      ]
    },
    {
      "title": "fix(deps): update dependency three to ^0.184.0",
      "prNumber": 7170,
      "type": "bugfix",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [three](https://threejs.org/) ([source]",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "fix(deps): update dependency lucide-react to ^0.577.0",
      "prNumber": 7169,
      "type": "bugfix",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [lucide-react](https://lucide.dev) ([so",
      "files": [
        "packages/homepage/package.json"
      ]
    },
    {
      "title": "chore(deps): update gradle to v9.5.0",
      "prNumber": 7168,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Update | Change |\n|---|---|---|\n| [gradle](https://gradle.org) ([source](https://redirect.github.com/gradle/gradle)) | minor | `9.4.1` → `9.5.0` |\n\n---\n\n> [!WARNING]\n> Some dependencies c",
      "files": [
        "packages/app-core/platforms/android/gradle/wrapper/gradle-wrapper.properties"
      ]
    },
    {
      "title": "chore(deps): update supabase/postgres docker tag to v17.6.1.113",
      "prNumber": 7219,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Update | Change |\n|---|---|---|\n| supabase/postgres | patch | `17.6.1.112` → `17.6.1.113` |\n\n---\n\n> [!WARNING]\n> Some dependencies could not be looked up. Check the [Dependency Dashboard]",
      "files": [
        "packages/app-core/deploy/docker-compose.supabase-db.yml"
      ]
    },
    {
      "title": "fix(deps): update dependency @anthropic-ai/sdk to ^0.92.0",
      "prNumber": 7218,
      "type": "bugfix",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@anthropic-ai/sdk](https://redirect.gi",
      "files": [
        "packages/typescript/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency ai to v6.0.172",
      "prNumber": 7217,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [ai](https://ai-sdk.dev/docs) ([source]",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/provider-utils to v4.0.25",
      "prNumber": 7216,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/provider-utils](https://ai-sdk",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/provider to v3.0.10",
      "prNumber": 7215,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/provider](https://ai-sdk.dev/d",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/openai to v3.0.55",
      "prNumber": 7214,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/openai](https://ai-sdk.dev/doc",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "feat(self-hosted): CORS + bearer auth + cross-platform build fixes",
      "prNumber": 7212,
      "type": "feature",
      "body": "# Relates to\n\nSelf-hosting cross-platform connectivity. The runtime now serves browser dashboards over HTTPS at a custom domain, App Store-style mobile builds (Capacitor), and Electrobun desktop builds — all routed through a remote agent vi",
      "files": [
        "package.json",
        "packages/agent/src/api/experience-routes.test.ts",
        "packages/agent/src/api/experience-routes.ts",
        "packages/agent/src/runtime/plugin-lifecycle.ts",
        "packages/app-core/platforms/android/variables.gradle",
        "packages/app-core/platforms/electrobun/assets/brand-config.json",
        "packages/app-core/platforms/electrobun/electrobun.config.ts",
        "packages/app-core/scripts/desktop-build.mjs",
        "packages/app-core/src/App.tsx",
        "packages/app-core/src/api/auth-client.ts",
        "packages/app-core/src/api/auth-pairing-compat-routes.ts",
        "packages/app-core/src/api/auth-session-routes.ts",
        "packages/app-core/src/api/client-agent.ts",
        "packages/app-core/src/api/client-base.test.ts",
        "packages/app-core/src/api/client-base.ts",
        "packages/app-core/src/api/csrf-client.test.ts",
        "packages/app-core/src/api/csrf-client.ts",
        "packages/app-core/src/api/server-cors.test.ts",
        "packages/app-core/src/api/server-cors.ts",
        "packages/app-core/src/api/server.ts",
        "packages/app-core/src/components/pages/ChatView.tsx",
        "packages/app-core/src/components/shell/RuntimeGate.tsx",
        "packages/app-core/src/registry/index.ts",
        "packages/app-core/src/state/persistence.ts",
        "packages/app-core/src/state/startup-phase-poll.ts",
        "packages/app-core/src/state/startup-phase-restore.ts",
        "packages/app-core/src/state/startup-phase-runtime.ts",
        "plugins/plugin-agent-skills",
        "plugins/plugin-anthropic",
        "plugins/plugin-cli",
        "plugins/plugin-commands",
        "plugins/plugin-cron",
        "plugins/plugin-discord",
        "plugins/plugin-edge-tts",
        "plugins/plugin-elizacloud",
        "plugins/plugin-evm",
        "plugins/plugin-google-genai",
        "plugins/plugin-groq",
        "plugins/plugin-local-ai",
        "plugins/plugin-local-embedding",
        "plugins/plugin-ollama",
        "plugins/plugin-openai",
        "plugins/plugin-openrouter",
        "plugins/plugin-pdf",
        "plugins/plugin-shell",
        "plugins/plugin-solana",
        "plugins/plugin-sql",
        "plugins/plugin-whatsapp",
        "plugins/plugin-agent-orchestrator"
      ]
    },
    {
      "title": "chore(deps): update dependency ai to v6.0.174",
      "prNumber": 7229,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [ai](https://ai-sdk.dev/docs) ([source]",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @biomejs/biome to v2.4.14",
      "prNumber": 7228,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@biomejs/biome](https://biomejs.dev) (",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/openai to v3.0.58",
      "prNumber": 7227,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/openai](https://ai-sdk.dev/doc",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "test(app-core): remove api module mocks",
      "prNumber": 7226,
      "type": "tests",
      "body": "<!-- Use this template by filling in information and copying and pasting relevant items out of the HTML comments. -->\r\n\r\n# Relates to\r\n\r\n<!-- LINK TO ISSUE OR TICKET -->\r\n\r\n<!-- This risks section must be filled out before the final review ",
      "files": [
        "packages/app-core/src/api/client-base.test.ts",
        "packages/app-core/src/api/csrf-client.test.ts"
      ]
    },
    {
      "title": "chore(deps): update dependency ai to v6.0.173",
      "prNumber": 7225,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [ai](https://ai-sdk.dev/docs) ([source]",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/provider-utils to v4.0.26",
      "prNumber": 7224,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/provider-utils](https://ai-sdk",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @ai-sdk/openai to v3.0.57",
      "prNumber": 7223,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@ai-sdk/openai](https://ai-sdk.dev/doc",
      "files": [
        "package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency @electric-sql/pglite to ^0.4.0",
      "prNumber": 7221,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [@electric-sql/pglite](https://pglite.d",
      "files": [
        "apps/app-lifeops/package.json"
      ]
    },
    {
      "title": "chore(deps): update actions/upload-artifact action to v7",
      "prNumber": 7220,
      "type": "other",
      "body": "This PR contains the following updates:\n\n| Package | Type | Update | Change |\n|---|---|---|---|\n| [actions/upload-artifact](https://redirect.github.com/actions/upload-artifact) | action | major | `v4` → `v7` |\n\n---\n\n> [!WARNING]\n> Some depe",
      "files": [
        ".github/workflows/mobile-build-smoke.yml"
      ]
    },
    {
      "title": "chore(deps): update node.js to v24",
      "prNumber": 7239,
      "type": "other",
      "body": "> ℹ️ **Note**\n> \n> This PR body was truncated due to platform limits.\n\nThis PR contains the following updates:\n\n| Package | Type | Update | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovateb",
      "files": [
        "plugins/plugin-agent-wallet/package.json"
      ]
    },
    {
      "title": "fix(deps): update dependency viem to v2.48.8",
      "prNumber": 7237,
      "type": "bugfix",
      "body": "This PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [viem](https://viem.sh) ([source](https",
      "files": [
        "plugins/plugin-agent-wallet/package.json"
      ]
    },
    {
      "title": "chore(deps): update dependency tsdown to ^0.21.0",
      "prNumber": 7236,
      "type": "other",
      "body": "> ℹ️ **Note**\n> \n> This PR body was truncated due to platform limits.\n\nThis PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-con",
      "files": [
        "plugins/plugin-agent-wallet/package.json"
      ]
    },
    {
      "title": "fix(ci): handle bogus Inno Setup exit codes on Windows Server 2025",
      "prNumber": 7232,
      "type": "bugfix",
      "body": "## Summary\nWindows Server 2025 headless CI runners return non-zero exit codes from Inno Setup (exit code 5) even when the install succeeds or partially succeeds. The smoke test was treating this as a hard failure and retrying, which also fa",
      "files": [
        "packages/app-core/platforms/electrobun/scripts/smoke-test-windows.ps1"
      ]
    },
    {
      "title": "fix(vault, confidant): skip OS keychain on headless Linux to prevent native segfault on agent boot",
      "prNumber": 7230,
      "type": "bugfix",
      "body": "## What this fixes\n\nAgent runtime hard-crashes on boot (process-level segfault, not a catchable JS error) on any host where `@napi-rs/keyring`'s `libsecret` backend can't reach a D-Bus Secret Service. That's:\n\n- **Headless Linux servers** (",
      "files": [
        "packages/app-core/src/api/secrets-manager-routes.test.ts",
        "packages/confidant/src/backends/keyring.ts",
        "packages/confidant/src/crypto/master-key.ts",
        "packages/confidant/src/keychain-host.ts",
        "packages/vault/src/master-key.ts",
        "packages/vault/test/master-key.test.ts"
      ]
    }
  ],
  "topContributors": [
    {
      "username": "lalalune",
      "avatarUrl": "https://avatars.githubusercontent.com/u/18633264?u=e2e906c3712c2506ebfa98df01c2cfdc50050b30&v=4",
      "totalScore": 767.0313816406095,
      "prScore": 762.9353816406096,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 2.0959999999999996,
      "summary": null
    },
    {
      "username": "2-A-M",
      "avatarUrl": "https://avatars.githubusercontent.com/u/96268540?u=b7d92c0e2a91af580d09eeae862eef576955ab8a&v=4",
      "totalScore": 634.7842422959881,
      "prScore": 630.5842422959881,
      "issueScore": 4,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "Dexploarer",
      "avatarUrl": "https://avatars.githubusercontent.com/u/211557447?u=21a243d61cc1f87574328ae07fc64d7d7577b53d&v=4",
      "totalScore": 420.21321756671693,
      "prScore": 419.37521756671697,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.838,
      "summary": null
    },
    {
      "username": "NubsCarson",
      "avatarUrl": "https://avatars.githubusercontent.com/u/192162056?u=d2be9082dbee60fcbad21d32bf6e662ab1af3674&v=4",
      "totalScore": 387.2486824729237,
      "prScore": 384.84868247292366,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0.4,
      "summary": null
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 342.4,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 342,
      "commentScore": 0.4,
      "summary": null
    },
    {
      "username": "RemilioNubilio",
      "avatarUrl": "https://avatars.githubusercontent.com/u/275382225?u=b1501ee01bb54e5b31ca64895f2a07c69f554a37&v=4",
      "totalScore": 287.6601887695951,
      "prScore": 285.6601887695951,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "jqmwa",
      "avatarUrl": "https://avatars.githubusercontent.com/u/95416268?u=aa05f4d49acc8c161a83f6a313231f63904521e9&v=4",
      "totalScore": 124.51612782554723,
      "prScore": 124.31612782554723,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "odilitime",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16395496?u=c9bac48e632aae594a0d85aaf9e9c9c69b674d8b&v=4",
      "totalScore": 120.9565477931522,
      "prScore": 97.1785477931522,
      "issueScore": 0,
      "reviewScore": 23,
      "commentScore": 0.7779999999999999,
      "summary": null
    },
    {
      "username": "0xSolace",
      "avatarUrl": "https://avatars.githubusercontent.com/u/257989456?u=e0d4e0c6385403319241eb46ba647b49083d4a05&v=4",
      "totalScore": 97.89207210748786,
      "prScore": 97.45407210748786,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.43799999999999994,
      "summary": null
    },
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 79.9817738965761,
      "prScore": 59.5437738965761,
      "issueScore": 0,
      "reviewScore": 20,
      "commentScore": 0.43799999999999994,
      "summary": null
    },
    {
      "username": "andex23",
      "avatarUrl": "https://avatars.githubusercontent.com/u/49397867?u=760e6ec36b34f3511f24928686d87f912c3eb7ba&v=4",
      "totalScore": 26.63905732961526,
      "prScore": 16.63905732961526,
      "issueScore": 10,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "vyctorbrzezowski",
      "avatarUrl": "https://avatars.githubusercontent.com/u/51521767?u=9cd153e7883fb4e8486fe44817b3ae46a6a3df22&v=4",
      "totalScore": 21.0695263639469,
      "prScore": 21.0695263639469,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "Sw4pIO",
      "avatarUrl": "https://avatars.githubusercontent.com/u/250003491?u=b9bad2342b9ccdb72ee4d4502d5534b6256e9d5c&v=4",
      "totalScore": 20,
      "prScore": 0,
      "issueScore": 20,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "github-code-quality",
      "avatarUrl": "https://avatars.githubusercontent.com/u/9919?v=4",
      "totalScore": 18,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 18,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "chopmob-cloud",
      "avatarUrl": "https://avatars.githubusercontent.com/u/250041792?u=295fb2375e2007927789532dae29a2c2bd3c5f80&v=4",
      "totalScore": 14.893147180559945,
      "prScore": 14.693147180559945,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "binkyfishai",
      "avatarUrl": "https://avatars.githubusercontent.com/u/172897890?u=13dcfbbffef5a3f90ae60741795eaf47cc93a244&v=4",
      "totalScore": 12,
      "prScore": 0,
      "issueScore": 12,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "dutchiono",
      "avatarUrl": "https://avatars.githubusercontent.com/u/86275975?u=0d8badaa81aa47682651f87dc2d363837876de98&v=4",
      "totalScore": 5.763180262308081,
      "prScore": 5.763180262308081,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "srotzin",
      "avatarUrl": "https://avatars.githubusercontent.com/u/140019476?u=4afff7c0f6603a8301374438c61471cb77500f0e&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "bkauto3",
      "avatarUrl": "https://avatars.githubusercontent.com/u/255684383?v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "sailorpepe",
      "avatarUrl": "https://avatars.githubusercontent.com/u/159828807?u=9298c48eb8b41b0a0b0968e987c029e307771855&v=4",
      "totalScore": 0.4,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.4,
      "summary": null
    },
    {
      "username": "meanstackofdoom",
      "avatarUrl": "https://avatars.githubusercontent.com/u/64149093?u=1a1540f5e733b8c122a2435890eb6f614fb6467c&v=4",
      "totalScore": 0.33999999999999997,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.33999999999999997,
      "summary": null
    },
    {
      "username": "bartonguestier1725-collab",
      "avatarUrl": "https://avatars.githubusercontent.com/u/249058300?v=4",
      "totalScore": 0.2,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": null
    }
  ],
  "newPRs": 121,
  "mergedPRs": 109,
  "newIssues": 19,
  "closedIssues": 12,
  "activeContributors": 16
}