Skip to content

fix(models): persist agent catalog cache#90457

Merged
shakkernerd merged 5 commits into
openclaw:mainfrom
ai-hpc:ai-hpc/fix-agent-model-catalog-state-cache
Jun 9, 2026
Merged

fix(models): persist agent catalog cache#90457
shakkernerd merged 5 commits into
openclaw:mainfrom
ai-hpc:ai-hpc/fix-agent-model-catalog-state-cache

Conversation

@ai-hpc

@ai-hpc ai-hpc commented Jun 4, 2026

Copy link
Copy Markdown
Member

Summary

  • Add a SQLite-backed agent model catalog cache using the existing agent_model_catalogs state table.
  • Read cached catalog rows before expensive model catalog/provider catalog discovery when the cache key still matches the agent/config/plugin scope.
  • Write refreshed catalog rows after runtime discovery, including the provider catalog path used by models list provider fanout.

Verification

  • pnpm test src/agents/model-catalog.test.ts src/agents/model-catalog-state-cache.test.ts src/commands/models/list.provider-catalog.test.ts --run
  • pnpm format:check -- src/agents/model-catalog.ts src/agents/model-catalog-state-cache.ts src/agents/model-catalog.test.ts src/agents/model-catalog-state-cache.test.ts src/commands/models/list.provider-catalog.ts src/commands/models/list.provider-catalog.test.ts
  • ./node_modules/.bin/oxlint src/agents/model-catalog.ts src/agents/model-catalog-state-cache.ts src/agents/model-catalog.test.ts src/agents/model-catalog-state-cache.test.ts src/commands/models/list.provider-catalog.ts src/commands/models/list.provider-catalog.test.ts
  • pnpm lint:kysely

Real behavior proof

behavior: The fixed branch can write and read model catalog rows through the existing agent_model_catalogs SQLite table, and the provider catalog loader now uses that cache before runtime provider discovery.

environment: Local OpenClaw source checkout on Node 22.22.2 with temporary state rooted at /tmp/openclaw-90368-proof-state.

steps:

  • Ran openclaw models list --all --provider moonshot --json from the fixed branch with temporary OpenClaw state.
  • Ran a source-level cache write/read using the same cache helper used by model catalog and provider catalog list paths.
  • Queried the temporary SQLite state database for agent_model_catalogs.

evidence:

{
  "count": 5,
  "keys": [
    "moonshot/kimi-k2-thinking",
    "moonshot/kimi-k2-thinking-turbo",
    "moonshot/kimi-k2-turbo",
    "moonshot/kimi-k2.5",
    "moonshot/kimi-k2.6"
  ]
}
{
  "keyPrefix": "agent-model-catalog:v1:be34ddd",
  "cachedRows": [
    "moonshot/kimi-k2.6"
  ]
}
[
  {
    "key_prefix": "agent-model-catalog:v1:be34ddd",
    "agent_dir": "/tmp/openclaw-proof-agent",
    "raw_json_bytes": 85,
    "updated_at": 1000
  }
]

observedResult: models list still returns the expected provider-scoped rows, and the new cache path durably stores/readbacks catalog rows in agent_model_catalogs.

notTested: Full production dashboard cold-start with every external provider account was not replayed locally; focused proof covers the shared state cache and the provider-list/model-catalog code paths changed here.

Refs #90368

@openclaw-barnacle openclaw-barnacle Bot added commands Command implementations agents Agent runtime and tooling size: M labels Jun 4, 2026
@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed June 4, 2026, 9:28 PM ET / 01:28 UTC.

Summary
Adds a SQLite-backed agent_model_catalogs cache for agent model discovery and models list provider-catalog rows, with source-fingerprint-aware keys and focused tests.

PR surface: Source +291, Tests +327. Total +618 across 7 files.

Reproducibility: yes. source-reproducible: the PR computes catalogKey before ensureOpenClawModelsJson may refresh catalog source files, then writes rows with that earlier key. The metadata omission is also visible from the new call sites and the helper's unused metadataSnapshot key input.

Review metrics: 1 noteworthy metric.

  • Persistent cache TTL: 30 minutes. The TTL defines the user-visible stale-row window if cache keys miss a catalog source or plugin metadata change.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🌊 off-meta tidepool
Patch quality: 🧂 unranked krab
Result: blocked by patch quality or review findings.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P2] Write cached model-catalog rows under the refreshed post-ensureOpenClawModelsJson key and add a regression test that a fresh file/sidebar generation is reusable after process cache reset.
  • Pass plugin metadata into persisted cache keys for both model catalog and provider-list paths, with a test that metadata/model-catalog changes miss old rows.

Risk before merge

  • [P1] The first cache-populating run after models.json or generated plugin sidecars are refreshed can write under a pre-refresh key, so the next process may miss the persisted cache and repeat expensive discovery.
  • [P1] Existing users can see stale provider/model rows for the 30-minute TTL after bundled plugin metadata or model-catalog metadata changes because the new call sites do not include metadataSnapshot in the persisted key.

Maintainer options:

  1. Use one refreshed metadata-aware key (recommended)
    Recompute or return the post-refresh fingerprint before writing cache rows, pass metadataSnapshot into persisted key construction, and cover both model-catalog and provider-list paths with stale-cache tests.
  2. Accept the bounded stale window
    Maintainers could intentionally accept a 30-minute stale/missed-cache window, but that should be explicit because it affects upgrades and provider/model selection.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Recompute or return the post-refresh model catalog source fingerprint before writing `agent_model_catalogs` rows, include plugin metadata snapshots in the persisted cache keys for `loadModelCatalog` and `loadProviderCatalogModelsForList`, and add focused regression tests for first-run post-refresh cache reuse and plugin metadata changes.

Next step before merge

  • [P2] A focused repair can update the cache key/fingerprint contract on this PR branch and add regression tests; no product decision is needed unless maintainers choose to accept stale TTL behavior.

Security
Cleared: The diff adds local SQLite cache code and tests without new dependencies, workflows, downloads, package scripts, or broader secret access; the open concerns are functional cache correctness.

Review findings

  • [P2] Write cache rows with the refreshed source key — src/agents/model-catalog.ts:703-706
  • [P2] Include plugin metadata in persisted catalog keys — src/agents/model-catalog.ts:555-563
Review details

Best possible solution:

Land the cache after reads and writes use one canonical refreshed fingerprint that covers models.json, plugin sidecars, auth state, and plugin metadata, with regression coverage for first-run persistence and metadata changes.

Do we have a high-confidence way to reproduce the issue?

Yes, source-reproducible: the PR computes catalogKey before ensureOpenClawModelsJson may refresh catalog source files, then writes rows with that earlier key. The metadata omission is also visible from the new call sites and the helper's unused metadataSnapshot key input.

Is this the best way to solve the issue?

No. Persisting the catalog is the right layer, but the best fix must use the canonical post-refresh source fingerprint and include plugin metadata before cache hits or writes can be trusted.

Full review comments:

  • [P2] Write cache rows with the refreshed source key — src/agents/model-catalog.ts:703-706
    catalogKey is built before ensureOpenClawModelsJson() runs, but that call can create or rewrite models.json and generated plugin catalog sidecars, and models-config then moves its own ready cache to a refreshed fingerprint. The rows written here can therefore be stored under a pre-refresh key that the next process will not compute, so the persisted cache may not speed the first post-refresh restart. Use the refreshed fingerprint returned after preparation, or recompute the key after the sources are current, before writing.
    Confidence: 0.86
  • [P2] Include plugin metadata in persisted catalog keys — src/agents/model-catalog.ts:555-563
    The cache helper has a metadataSnapshot input that hashes plugin model-catalog/version data, but this call only passes config, workspace, and the source fingerprint. Since the catalog rows below are produced from getManifestMetadataSnapshot() and plugin metadata, a bundled plugin or model-catalog metadata change can keep serving old rows until the TTL expires. Pass the snapshot into the key, and do the same for the provider-list cache path.
    Confidence: 0.84

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 126ebfc99710.

Label changes

Label justifications:

  • P2: This PR targets a normal-priority model-list performance/cache bug with limited blast radius, but the remaining cache correctness gaps should be fixed before merge.
  • merge-risk: 🚨 compatibility: Persisted catalog rows can survive upgrades or source refreshes and show old provider/model data when the cache key omits required freshness inputs.
  • merge-risk: 🚨 auth-provider: The cached rows influence provider/model discovery and models list, so stale rows can mislead provider and model selection until the TTL expires.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🌊 off-meta tidepool and patch quality is 🧂 unranked krab.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The PR author association is MEMBER, so the external contributor proof gate does not apply; the PR body nevertheless includes local CLI and SQLite cache read/write evidence.
Evidence reviewed

PR surface:

Source +291, Tests +327. Total +618 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 4 317 26 +291
Tests 3 327 0 +327
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 7 644 26 +618

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs src/agents/model-catalog.test.ts src/agents/model-catalog-state-cache.test.ts src/commands/models/list.provider-catalog.test.ts.
  • [P1] pnpm format:check -- src/agents/model-catalog.ts src/agents/model-catalog-state-cache.ts src/agents/model-catalog.test.ts src/agents/model-catalog-state-cache.test.ts src/commands/models/list.provider-catalog.ts src/commands/models/list.provider-catalog.test.ts.
  • [P1] pnpm lint:kysely.

What I checked:

  • Root policy read: Root repository review policy was read fully and applied; its cache, SQLite state, compatibility, and PR review-depth guidance affected this verdict. (AGENTS.md:1, 126ebfc99710)
  • Scoped agents policy read: The scoped agents guide was read fully; it reinforced checking model-catalog hot paths and adjacent tests rather than reviewing only the diff. (src/agents/AGENTS.md:1, 126ebfc99710)
  • Current main has schema but no producer: Current main defines agent_model_catalogs in the shared state schema, while source search shows only schema/generated references before this PR, matching the linked report that the shipped table had no writer. (src/state/openclaw-state-schema.generated.ts:283, 126ebfc99710)
  • PR writes with a key captured before refresh: On the PR branch, catalogKey is built from sourceFingerprint before ensureOpenClawModelsJson may rewrite models.json or plugin sidecars, then the post-discovery rows are written using that earlier key. (src/agents/model-catalog.ts:551, 57befa41275f)
  • Refresh path can change the fingerprint after writes: ensureOpenClawModelsJson recomputes the fingerprint after file writes and updates the in-process ready cache when the refreshed key differs, so callers that persist rows need the refreshed key, not only the pre-refresh key. (src/agents/models-config.ts:444, 57befa41275f)
  • Metadata shape exists but is not passed by call sites: The cache-key helper can hash plugin modelCatalog and version metadata, but the new buildAgentModelCatalogCacheKey calls in loadModelCatalog and provider-list loading pass config/workspace/source scope without metadataSnapshot. (src/agents/model-catalog-state-cache.ts:62, 57befa41275f)

Likely related people:

  • steipete: Current-main blame and log history in this checkout tie the central model-catalog, models-config, provider-list, and shared state schema surfaces to Peter Steinberger's recent work. (role: recent area contributor; confidence: medium; commits: 29f5e9d35c33, 3d4e5240149c; files: src/agents/model-catalog.ts, src/agents/models-config.ts, src/commands/models/list.provider-catalog.ts)
  • vincentkoc: Recent history for src/agents/model-catalog.ts includes Vincent Koc's release and cycle-refactor commits near the shipped v2026.6.1 context for the reported table behavior. (role: adjacent model-catalog and release contributor; confidence: medium; commits: 2e08f0f4221f, 74e7b8d47b18; files: src/agents/model-catalog.ts, src/state/openclaw-state-schema.generated.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels Jun 4, 2026
@shakkernerd shakkernerd self-assigned this Jun 9, 2026
@shakkernerd shakkernerd force-pushed the ai-hpc/fix-agent-model-catalog-state-cache branch from 57befa4 to 8d1c881 Compare June 9, 2026 16:22
@shakkernerd shakkernerd merged commit 61e93a8 into openclaw:main Jun 9, 2026
167 of 169 checks passed
@shakkernerd

Copy link
Copy Markdown
Member

Merged via rebase after refreshing the PR branch and verifying the final pushed SHA.

Verification:

  • Crabbox/Testbox focused coverage passed for the model catalog cache paths, provider catalog cache keys, state-cache pruning, type checks, and core lint.
  • Post-push GitHub CI completed cleanly on the final PR head.

Thanks @ai-hpc.

eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 12, 2026
…26.6.6) (#1040)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.6.5` → `2026.6.6` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.6.6`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202666)

[Compare Source](openclaw/openclaw@v2026.6.5...v2026.6.6)

##### Highlights

- Security boundaries are substantially tighter across transcripts, sandbox binds, host environment inheritance, MCP stdio, Codex HTTP access, native search policy, elevated sender checks, deleted-agent ACP bypasses, loopback tools, Discord moderation, and Teams group actions; exec approvals now fail closed on timeout. ([#&#8203;91529](openclaw/openclaw#91529), [#&#8203;91618](openclaw/openclaw#91618), [#&#8203;91615](openclaw/openclaw#91615), [#&#8203;91619](openclaw/openclaw#91619), [#&#8203;91741](openclaw/openclaw#91741), [#&#8203;91745](openclaw/openclaw#91745), [#&#8203;91746](openclaw/openclaw#91746), [#&#8203;91748](openclaw/openclaw#91748), [#&#8203;91749](openclaw/openclaw#91749), [#&#8203;91750](openclaw/openclaw#91750), [#&#8203;91751](openclaw/openclaw#91751), [#&#8203;91752](openclaw/openclaw#91752), [#&#8203;91763](openclaw/openclaw#91763), [#&#8203;89938](openclaw/openclaw#89938)) Thanks [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;shakkernerd](https://github.com/shakkernerd), and [@&#8203;drobison00](https://github.com/drobison00).
- Telegram delivery is safer and more coherent: account-scoped topics route to the right agent, streamed text survives tool calls, `/compact` works on generic ingress, callback handling uses concrete APIs, draft chunking is shared, durable dispatch dedupe moved into the SDK, and unauthorized DM text stays out of cache and prompt context. ([#&#8203;91189](openclaw/openclaw#91189), [#&#8203;88682](openclaw/openclaw#88682), [#&#8203;89588](openclaw/openclaw#89588), [#&#8203;90212](openclaw/openclaw#90212), [#&#8203;91876](openclaw/openclaw#91876), [#&#8203;91874](openclaw/openclaw#91874), [#&#8203;91904](openclaw/openclaw#91904), [#&#8203;91478](openclaw/openclaw#91478), [#&#8203;91915](openclaw/openclaw#91915)) Thanks [@&#8203;codysai001](https://github.com/codysai001), [@&#8203;alexzhu0](https://github.com/alexzhu0), [@&#8203;joelnishanth](https://github.com/joelnishanth), [@&#8203;snowzlm](https://github.com/snowzlm), [@&#8203;obviyus](https://github.com/obviyus), and [@&#8203;sallyom](https://github.com/sallyom).
- iMessage recovery and delivery now cover always-on inbound restart, durable echo markers, block streaming, idle approval discovery, hardened outbound transport, and actionable inbound startup diagnostics. ([#&#8203;91335](openclaw/openclaw#91335), [#&#8203;91449](openclaw/openclaw#91449), [#&#8203;88969](openclaw/openclaw#88969), [#&#8203;88530](openclaw/openclaw#88530), [#&#8203;91783](openclaw/openclaw#91783), [#&#8203;91785](openclaw/openclaw#91785)) Thanks [@&#8203;omarshahine](https://github.com/omarshahine), [@&#8203;jmissig](https://github.com/jmissig), and [@&#8203;colmbrogan](https://github.com/colmbrogan).
- Browser and MCP connectivity gained existing-session CDP support, discovered WebSocket validation, default-profile `cdpUrl` handling, safer browser-output boundaries, Streamable HTTP loopback transport, corrected OAuth/SSE authorization handling, and broader schema compatibility. ([#&#8203;91422](openclaw/openclaw#91422), [#&#8203;89851](openclaw/openclaw#89851), [#&#8203;91736](openclaw/openclaw#91736), [#&#8203;91747](openclaw/openclaw#91747), [#&#8203;91451](openclaw/openclaw#91451), [#&#8203;80143](openclaw/openclaw#80143)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia), [@&#8203;lifuyue](https://github.com/lifuyue), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;LiuwqGit](https://github.com/LiuwqGit), and [@&#8203;HemantSudarshan](https://github.com/HemantSudarshan).
- Control UI startup and first-reply latency are lower through cached model metadata, removal of the startup catalog wait, lazy slash-command loading, and first-event tracing with slow-reply diagnostics. ([#&#8203;91531](openclaw/openclaw#91531), [#&#8203;91538](openclaw/openclaw#91538), [#&#8203;91568](openclaw/openclaw#91568), [#&#8203;91583](openclaw/openclaw#91583), [#&#8203;91598](openclaw/openclaw#91598))
- Provider support expands with OpenRouter OAuth onboarding and Claude Fable 5 adaptive thinking, while Codex sessions keep correct compaction ownership, local models skip guardian review, dynamic tool progress normalizes cleanly, and Gemma 4 reasoning replay is preserved. ([#&#8203;91830](openclaw/openclaw#91830), [#&#8203;91882](openclaw/openclaw#91882), [#&#8203;91590](openclaw/openclaw#91590), [#&#8203;88630](openclaw/openclaw#88630), [#&#8203;88768](openclaw/openclaw#88768), [#&#8203;91696](openclaw/openclaw#91696)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;bdjben](https://github.com/bdjben), and [@&#8203;Coder-Wangyankun](https://github.com/Coder-Wangyankun).

##### Changes

- CLI progress: emit Claude CLI commentary progress events and bridge inter-tool commentary into channel progress without exposing internal protocol scaffolding. ([#&#8203;89834](openclaw/openclaw#89834), [#&#8203;90883](openclaw/openclaw#90883)) Thanks [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia).
- Observability: allow trusted diagnostics channels to capture tool input/output content, add first-assistant-event traces, and warn on slow initial replies. ([#&#8203;91256](openclaw/openclaw#91256), [#&#8203;91568](openclaw/openclaw#91568), [#&#8203;91583](openclaw/openclaw#91583)) Thanks [@&#8203;amknight](https://github.com/amknight).
- Plugins/ClawHub: dogfood reusable package publishing, let dry runs skip publish approval, allow declared installed trusted hooks, report managed plugin version drift, and warn instead of failing on retired Skill Workshop configuration. ([#&#8203;91574](openclaw/openclaw#91574), [#&#8203;91591](openclaw/openclaw#91591), [#&#8203;90004](openclaw/openclaw#90004), [#&#8203;90927](openclaw/openclaw#90927), [#&#8203;90838](openclaw/openclaw#90838)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;brokemac79](https://github.com/brokemac79), and [@&#8203;lonexreb](https://github.com/lonexreb).
- Memory/providers: move the local llama.cpp runtime into its provider plugin, batch embeddings across files, persist the agent model catalog cache, and keep QMD JSON search one-shot while filtering stale REM recall previews. ([#&#8203;91324](openclaw/openclaw#91324), [#&#8203;89138](openclaw/openclaw#89138), [#&#8203;90457](openclaw/openclaw#90457), [#&#8203;91837](openclaw/openclaw#91837), [#&#8203;91851](openclaw/openclaw#91851)) Thanks [@&#8203;osolmaz](https://github.com/osolmaz), [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;ai-hpc](https://github.com/ai-hpc), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Channels/mobile: add the QQBot group mention toggle, improve iPad and iPhone control surfaces, and expose the active connection host in the TUI footer. ([#&#8203;91423](openclaw/openclaw#91423), [#&#8203;91557](openclaw/openclaw#91557), [#&#8203;89909](openclaw/openclaw#89909)) Thanks [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh), [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin), and [@&#8203;baskduf](https://github.com/baskduf).
- Performance: prewarm TUI runtime plugins, deduplicate plugin auto-enable fanout, trim dense text-delta snapshots, and reuse prepared startup model metadata. ([#&#8203;90782](openclaw/openclaw#90782), [#&#8203;89978](openclaw/openclaw#89978), [#&#8203;91580](openclaw/openclaw#91580), [#&#8203;91531](openclaw/openclaw#91531)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa) and [@&#8203;ai-hpc](https://github.com/ai-hpc).

##### Fixes

- Agent/session recovery: drop stale approval follow-ups after session rebind, remove drained reply-queue items by identity, recover stale main and visible replies, preserve Codex context-engine compaction ownership, lower the default compaction timeout to 180 seconds while respecting explicit configuration, and keep provider-failure terminal lifecycle state correct. ([#&#8203;85679](openclaw/openclaw#85679), [#&#8203;91450](openclaw/openclaw#91450), [#&#8203;91566](openclaw/openclaw#91566), [#&#8203;91840](openclaw/openclaw#91840), [#&#8203;91590](openclaw/openclaw#91590), [#&#8203;91361](openclaw/openclaw#91361), [#&#8203;91895](openclaw/openclaw#91895)) Thanks [@&#8203;openperf](https://github.com/openperf), [@&#8203;yetval](https://github.com/yetval), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;wangmiao0668000666](https://github.com/wangmiao0668000666), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- User-visible content boundaries: suppress Codex/Harmony protocol artifacts, neutralize browser and LanceDB memory media directives, redact transcript images, and preserve native `/compact` replies through source suppression. ([#&#8203;89151](openclaw/openclaw#89151), [#&#8203;91422](openclaw/openclaw#91422), [#&#8203;91425](openclaw/openclaw#91425), [#&#8203;91529](openclaw/openclaw#91529), [#&#8203;90212](openclaw/openclaw#90212)) Thanks [@&#8203;joelnishanth](https://github.com/joelnishanth), [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;joshavant](https://github.com/joshavant), and [@&#8203;snowzlm](https://github.com/snowzlm).
- Channel delivery: keep WhatsApp captured replies attached to the successor controller after restart, retry Feishu rate limits, preserve Mattermost thread replies, canonicalize LINE webhook paths, restore Discord reply hydration and runtime timeout exports, and show OpenAI Realtime WebRTC assistant transcripts. ([#&#8203;85823](openclaw/openclaw#85823), [#&#8203;89659](openclaw/openclaw#89659), [#&#8203;91684](openclaw/openclaw#91684), [#&#8203;91649](openclaw/openclaw#91649), [#&#8203;90263](openclaw/openclaw#90263), [#&#8203;91686](openclaw/openclaw#91686), [#&#8203;90426](openclaw/openclaw#90426)) Thanks [@&#8203;itsuzef](https://github.com/itsuzef), [@&#8203;ladygege](https://github.com/ladygege), [@&#8203;jacobtomlinson](https://github.com/jacobtomlinson), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), and [@&#8203;shushushv](https://github.com/shushushv).
- Cron: cancel active task runs cleanly, preserve terminal timeout/cancel state, and recover no-deliver tool warnings instead of silently losing the outcome. ([#&#8203;90666](openclaw/openclaw#90666), [#&#8203;90678](openclaw/openclaw#90678)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc).
- Gateway/config/auth: share the approval runtime socket token, replace arrays explicitly in `config.patch`, skip the deleted-agent guard only for valid ACP harness sessions, surface headless LaunchAgent state, verify SQLite auth migration before cleanup, and arm QMD startup maintenance. ([#&#8203;87105](openclaw/openclaw#87105), [#&#8203;91551](openclaw/openclaw#91551), [#&#8203;91219](openclaw/openclaw#91219), [#&#8203;91614](openclaw/openclaw#91614), [#&#8203;91740](openclaw/openclaw#91740), [#&#8203;91978](openclaw/openclaw#91978)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev) and [@&#8203;scotthuang](https://github.com/scotthuang).
- Providers/Codex: clarify quota errors, restore the Codex synthetic usage line, canonicalize Codex protocol assets, require API-key auth for realtime voice, normalize ACP model refs, preserve Gemma 4 `reasoning_content`, and avoid guardian review for local models. ([#&#8203;91390](openclaw/openclaw#91390), [#&#8203;91709](openclaw/openclaw#91709), [#&#8203;91507](openclaw/openclaw#91507), [#&#8203;91567](openclaw/openclaw#91567), [#&#8203;88630](openclaw/openclaw#88630), [#&#8203;91696](openclaw/openclaw#91696)) Thanks [@&#8203;hxy91819](https://github.com/hxy91819), [@&#8203;brokemac79](https://github.com/brokemac79), [@&#8203;RomneyDa](https://github.com/RomneyDa), [@&#8203;joshavant](https://github.com/joshavant), and [@&#8203;Coder-Wangyankun](https://github.com/Coder-Wangyankun).
- Updates/builds: recover package Gateway restarts after refresh failure, expose plugin convergence repair, fall back to Corepack in PATH-less pnpm environments, seed the correct Docker store packages, and keep ClawHub dry-run and publish paths reusable. ([#&#8203;91581](openclaw/openclaw#91581), [#&#8203;91599](openclaw/openclaw#91599), [#&#8203;91547](openclaw/openclaw#91547), [#&#8203;91591](openclaw/openclaw#91591)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;sallyom](https://github.com/sallyom), and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- UI: require explicit user intent before opening chat sessions and drain restored chat queues after session switches. ([#&#8203;91480](openclaw/openclaw#91480)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Android: avoid the `dataSync` foreground-service type for persistent nodes. ([#&#8203;80082](openclaw/openclaw#80082)) Thanks [@&#8203;davelutztx](https://github.com/davelutztx).
- Native hooks: bound relay lifetimes so abandoned native hook connections cannot linger indefinitely. ([#&#8203;91550](openclaw/openclaw#91550)) Thanks [@&#8203;joshavant](https://github.com/joshavant).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/1040
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling commands Command implementations merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: XL status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants