Skip to content

refactor(auth): store auth profiles in SQLite#89102

Merged
steipete merged 1 commit into
mainfrom
refactor/sqlite-auth-profiles
Jun 3, 2026
Merged

refactor(auth): store auth profiles in SQLite#89102
steipete merged 1 commit into
mainfrom
refactor/sqlite-auth-profiles

Conversation

@steipete

@steipete steipete commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Move auth profile and auth runtime state into each agent's openclaw-agent.sqlite as the canonical runtime store.
  • Remove runtime JSON fallback/cache paths for auth-profiles.json, auth-state.json, and legacy per-agent auth.json; openclaw doctor --fix imports shipped JSON stores once and archives/removes them.
  • Keep credential payloads on the existing auth-profile/SecretRef boundary; this does not add a generic token table.

Verification

  • node scripts/run-vitest.mjs src/commands/doctor/shared/stale-oauth-profile-shadows.test.ts src/commands/doctor-auth-flat-profiles.test.ts src/commands/doctor-auth.profile-health.test.ts src/commands/doctor/repair-sequencing.test.ts src/agents/auth-profiles/oauth-manager.test.ts src/agents/auth-profiles.sqlite-store.test.ts src/secrets/apply.test.ts src/infra/backup-create.test.ts
  • node scripts/run-vitest.mjs src/commands/doctor-auth-flat-profiles.test.ts
  • pnpm tsgo --noEmit
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.core.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core-test.tsbuildinfo
  • pnpm lint:kysely
  • git diff --check
  • .agents/skills/autoreview/scripts/autoreview --mode local (clean)
  • node scripts/run-oxlint-shards.mjs --only=core --split-core
  • node scripts/crabbox-wrapper.mjs run -- --provider aws -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 CI=1 PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN=false corepack pnpm check:changed (run_bf788285d80e)

@steipete steipete requested a review from a team as a code owner June 1, 2026 14:00
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation gateway Gateway runtime commands Command implementations agents Agent runtime and tooling size: XL maintainer Maintainer-authored PR labels Jun 1, 2026
@clawsweeper

clawsweeper Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 3, 2026, 7:12 PM ET / 23:12 UTC.

Summary
This PR moves per-agent auth profile credentials and auth routing state from JSON files into each agent's openclaw-agent.sqlite, with doctor migration, docs, backup, secrets, and security-audit updates.

Reproducibility: yes. from source inspection: configure a custom agents.list[].agentDir, put openclaw-agent.sqlite there, and the PR-head audit/fix loops inspect stateDir/agents/<id>/agent instead. The OAuth race is also source-reproducible because a refused saveOAuthCredentialWithStoreLock result is ignored before returning the external credential.

Review metrics: 1 noteworthy metric.

  • Auth store migration surface: 3 legacy JSON auth stores become doctor-import-only; 1 per-agent SQLite store becomes canonical. This is an upgrade-sensitive persistence change, so fresh-install and existing-state behavior need review beyond green tests.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🌊 off-meta tidepool
Patch quality: 🦪 silver shellfish
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] Fix the two review findings and add focused tests for the custom-agent security path and refused OAuth guarded-save path.

Risk before merge

  • [P1] Custom agents.list[].agentDir users can have the new canonical SQLite credential store outside stateDir/agents/<id>/agent, so the PR's new security audit/fix coverage can miss the real file.
  • [P1] The external OAuth adoption path can use an externally managed credential even after the guarded store write detects that the persisted profile changed, which can return credentials that no longer match the canonical profile.

Maintainer options:

  1. Fix both auth blockers before merge (recommended)
    Update the PR so custom agent-dir SQLite auth stores are audited/chmod-fixed and refused external OAuth writes do not continue with stale credentials.
  2. Accept the compatibility and security gaps
    Maintainers could intentionally land with known custom-agent audit coverage and OAuth race gaps, but that should be an explicit ownership decision.
  3. Pause until the migration scope narrows
    If maintainers do not want to solve these edge cases in this large refactor, pause this branch and land a smaller migration slice later.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Fix the PR so `collectStateDeepFilesystemFindings` and `collectSecurityPermissionTargets` include auth SQLite files under configured `agents.list[].agentDir` paths, add focused custom-agent-dir tests for audit and fix, and make the external OAuth adoption branch abort or reload when `saveOAuthCredentialWithStoreLock` returns false before using the external credential.

Next step before merge

  • [P1] There are two narrow mechanical repairs suitable for an automated fix pass on the PR branch.

Security
Needs attention: The diff introduces security-sensitive auth persistence changes and currently misses configured custom auth DB permission checks.

Review findings

  • [P2] Honor refused external OAuth writes — src/agents/auth-profiles/oauth-manager.ts:556-561
  • [P2] Resolve auth DB checks from configured agent dirs — src/security/audit-extra.async.ts:711-714
Review details

Best possible solution:

Keep the SQLite-only auth-store design, but merge only after custom agent directories share the runtime resolver in security audit/fix paths and the OAuth external-credential branch aborts or reloads when the guarded write is refused.

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

Yes from source inspection: configure a custom agents.list[].agentDir, put openclaw-agent.sqlite there, and the PR-head audit/fix loops inspect stateDir/agents/<id>/agent instead. The OAuth race is also source-reproducible because a refused saveOAuthCredentialWithStoreLock result is ignored before returning the external credential.

Is this the best way to solve the issue?

No; the architecture direction is reasonable, but the current patch is not the best merge shape until these two owner-boundary issues are fixed in the PR branch.

Full review comments:

  • [P2] Honor refused external OAuth writes — src/agents/auth-profiles/oauth-manager.ts:556-561
    saveOAuthCredentialWithStoreLock returns false when the persisted profile changed, but this branch ignores that result and then can return an API key built from externallyManaged. In the race this guard is meant to catch, OpenClaw would use credentials that no longer match the canonical stored profile; abort or reload before using the external credential when the guarded save is refused.
    Confidence: 0.9
  • [P2] Resolve auth DB checks from configured agent dirs — src/security/audit-extra.async.ts:711-714
    When an agent config sets a custom agents.list[].agentDir, this loop now audits stateDir/agents/<id>/agent/openclaw-agent.sqlite instead of the configured directory where the new canonical auth DB is stored. That leaves the real SQLite credential store unaudited, and the matching security fix target has the same path assumption, so insecure permissions on custom-agent auth DBs can pass security checks.
    Confidence: 0.9

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 1878ca082085.

Label changes

Label changes:

  • add merge-risk: 🚨 security-boundary: The new credential SQLite store may stay unreadited or chmod-unfixed when it lives outside the default state-dir layout.
  • add rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🌊 off-meta tidepool and patch quality is 🦪 silver shellfish.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: This is a maintainer-labeled PR, so the external-contributor real-behavior-proof gate is not applied; the PR body records targeted tests, lint/type checks, autoreview, and a remote changed-check run.
  • remove rating: 🌊 off-meta tidepool: Current PR rating is rating: 🦪 silver shellfish, so this older rating label is no longer current.

Label justifications:

  • P2: The PR has bounded but merge-blocking auth persistence defects with limited blast radius.
  • merge-risk: 🚨 compatibility: Configured custom agent directories can be missed by the new SQLite auth audit/fix paths during upgrades.
  • merge-risk: 🚨 auth-provider: The OAuth guarded-save bug can return credentials that no longer match the persisted provider profile.
  • merge-risk: 🚨 security-boundary: The new credential SQLite store may stay unreadited or chmod-unfixed when it lives outside the default state-dir layout.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🌊 off-meta tidepool and patch quality is 🦪 silver shellfish.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: This is a maintainer-labeled PR, so the external-contributor real-behavior-proof gate is not applied; the PR body records targeted tests, lint/type checks, autoreview, and a remote changed-check run.
Evidence reviewed

Security concerns:

  • [medium] Custom auth DB permissions can be missed — src/security/audit-extra.async.ts:711
    The audit and fix loops derive auth SQLite paths from stateDir/agents/<id>/agent instead of resolving configured agentDir, so the actual credential database can stay world-readable or writable without a finding or chmod repair.
    Confidence: 0.9
  • [medium] Refused OAuth write can still be used — src/agents/auth-profiles/oauth-manager.ts:556
    The external OAuth branch ignores a failed guarded save and can return a credential that no longer matches the canonical persisted profile, weakening the provider auth boundary under race conditions.
    Confidence: 0.85

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs src/security/audit-extra.async.test.ts src/security/fix.test.ts src/agents/auth-profiles/oauth-manager.test.ts.
  • [P1] git diff --check.

What I checked:

  • Repository policy: Root AGENTS.md and relevant scoped guides were read; auth persistence, SQLite runtime state, doctor migration, security, and compatibility guidance apply to this review. (AGENTS.md:1, 1878ca082085)
  • Configured agent dirs are runtime-supported: Current main resolves agents.list[].agentDir through resolveAgentDir, so PR code that targets auth stores must preserve configured custom directories rather than assuming the state-dir layout. (src/agents/agent-scope-config.ts:201, 1878ca082085)
  • Security audit misses configured auth DB dirs: At PR head, collectStateDeepFilesystemFindings constructs auth SQLite paths from stateDir/agents/<id>/agent, which misses agents.list[].agentDir custom locations. (src/security/audit-extra.async.ts:711, 815b2384c299)
  • Security fix misses configured auth DB dirs: At PR head, collectSecurityPermissionTargets adds chmod targets for stateDir/agents/<id>/agent/openclaw-agent.sqlite, not the configured custom agent directory. (src/security/fix.ts:357, 815b2384c299)
  • Guarded OAuth save result is ignored: At PR head, the external OAuth adoption branch awaits saveOAuthCredentialWithStoreLock but does not check its boolean result before using the external credential. (src/agents/auth-profiles/oauth-manager.ts:556, 815b2384c299)
  • Store guard can refuse the write: At PR head, saveOAuthCredentialWithStoreLock returns false when the stored profile no longer matches the expected credential, making the unchecked result observable. (src/agents/auth-profiles/oauth-manager.ts:418, 815b2384c299)

Likely related people:

  • steipete: Recent file history ties steipete to auth-profile storage, per-agent SQLite state, and security-fix paths relevant to this PR. (role: recent area contributor; confidence: high; commits: 1bfae9d45890, fc50f949d48b, 0b8aabe8648e; files: src/agents/auth-profiles/store.ts, src/state/openclaw-agent-db.ts, src/security/fix.ts)
  • samzong: Recent merged provider-auth warmup work touched the same provider credential resolution area that the OAuth guarded-save finding affects. (role: adjacent auth-provider contributor; confidence: medium; commits: 316fd5b62572; files: src/agents/auth-profiles/store.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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 17c24c16d1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

function resolveAuthProfileDatabaseOptions(agentDir?: string) {
const dir = resolveAgentDir(agentDir);
return {
agentId: resolveRegisteredAgentIdForDir(dir) ?? inferAgentIdFromDir(dir),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve configured agent ids for custom auth DBs

When a custom agentDir is first accessed through the exported auth-store helpers before resolveAgentDir has registered that directory, this fallback initializes openclaw-agent.sqlite with agent_id=custom-<hash>. Later, normal config resolution registers the same directory under the real agent id, and openOpenClawAgentDatabase rejects the existing database as belonging to the hash owner (src/state/openclaw-agent-db.ts:131-134). This can break users/plugins that create or migrate auth profiles for a configured custom agent directory before the runtime has resolved that agent; the old JSON store had no owner mismatch. The resolver needs to get the real configured agent id (or require registration) before creating the per-agent auth DB.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label Jun 1, 2026
@steipete steipete self-assigned this Jun 3, 2026
@steipete steipete force-pushed the refactor/sqlite-auth-profiles branch from 17c24c1 to 29064bb Compare June 3, 2026 22:29
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. 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. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 3, 2026
@steipete steipete force-pushed the refactor/sqlite-auth-profiles branch from 29064bb to 059826a Compare June 3, 2026 22:44
@openclaw-barnacle openclaw-barnacle Bot added the scripts Repository scripts label Jun 3, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 059826a4c3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +556 to 561
await saveOAuthCredentialWithStoreLock({
agentDir: ownerAgentDir,
profileId: params.profileId,
expected: cred,
credential: externallyManaged,
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Stop using external OAuth creds after a failed guarded save

When the stored profile changes between the initial load and this guarded write, saveOAuthCredentialWithStoreLock returns false, but this branch ignores that result and continues to set credentialToRefresh; the next hasUsableOAuthCredential(externallyManaged) branch can then return an API key for credentials that no longer match the persisted profile. This race was previously covered by the auth-store lock around the whole load/save/use sequence, so the SQLite guard needs to abort or reload when the save is refused.

Useful? React with 👍 / 👎.

@steipete steipete force-pushed the refactor/sqlite-auth-profiles branch 2 times, most recently from 1cd39cb to f4b3d22 Compare June 3, 2026 22:53

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f4b3d22ae2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

});
const authTargets = [
{ path: path.join(agentDir, "auth-profiles.json"), label: "legacy auth-profiles.json" },
...resolveAuthProfileDatabaseFilePaths(agentDir).map((targetPath) => ({

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Resolve auth DB checks from configured agent dirs

When an agent config sets a custom agents.list[].agentDir, this new SQLite target list audits stateDir/agents/<id>/agent/openclaw-agent.sqlite instead of the configured directory where auth is actually stored via resolveAgentDir/resolveAuthProfileDatabaseFilePaths. That leaves the new auth DB for custom-agent users unaudited (and the analogous fix target in src/security/fix.ts will not chmod it), so insecure permissions on the real SQLite credential store can pass security checks.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 3, 2026
@steipete steipete force-pushed the refactor/sqlite-auth-profiles branch from f4b3d22 to 815b238 Compare June 3, 2026 23:06
@clawsweeper clawsweeper Bot removed the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label Jun 3, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels Jun 3, 2026
@steipete

steipete commented Jun 3, 2026

Copy link
Copy Markdown
Contributor Author

Land-ready proof for head 815b2384c299009aeb7dfab44f5aa14372fbaeff:

Summary:

  • Moved auth profile persistence to the per-agent SQLite DB and kept runtime reads/writes on the canonical SQLite path.
  • Kept legacy JSON handling in doctor migration/test fixtures only.
  • Added security audit/fix coverage for openclaw-agent.sqlite plus WAL/SHM sidecars after autoreview found the gap.

Local proof:

  • node scripts/run-vitest.mjs src/commands/doctor-auth-oauth-sidecar.test.ts src/agents/models-config.applies-config-env-vars.test.ts src/agents/embedded-agent-runner/model.test.ts src/media-understanding/runner.local-no-auth.test.ts src/auto-reply/reply/commands-status.test.ts src/agents/command/attempt-execution.cli.test.ts src/agents/auth-profiles/oauth.openai-codex-refresh-fallback.test.ts src/security/audit-extra.async.test.ts src/security/fix.test.ts src/agents/auth-profiles.sqlite-store.test.ts test/scripts/lint-suppressions.test.ts
  • pnpm lint --threads=8
  • pnpm check:architecture
  • pnpm tsgo --noEmit
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.core.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core-test.tsbuildinfo
  • pnpm deadcode:unused-files
  • git diff --check

Review/CI:

  • Autoreview: .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main clean, no accepted/actionable findings after the final rebase.
  • GitHub CI: green on head 815b2384c299009aeb7dfab44f5aa14372fbaeff.
  • Final run ids: CI 26918673839, CodeQL 26918673845, CodeQL Critical Quality 26918673850, Workflow Sanity 26918673968, OpenGrep PR Diff 26918673857.

Known gaps:

  • No live provider startup smoke was run; this is covered here by focused auth persistence, doctor migration, security audit/fix, lint, architecture, type, and full PR CI proof.

@steipete steipete merged commit e16ac04 into main Jun 3, 2026
182 of 185 checks passed
@steipete steipete deleted the refactor/sqlite-auth-profiles branch June 3, 2026 23:14
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
SebTardif pushed a commit to SebTardif/openclaw that referenced this pull request Jun 4, 2026
849261680 pushed a commit to 849261680/openclaw that referenced this pull request Jun 7, 2026
wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 9, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 9, 2026
…26.6.5) (#963)

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.1` → `2026.6.5` |

---

### Release Notes

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

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

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

##### Highlights

- QQBot now strips model reasoning/thinking scaffolding before native delivery, preventing raw `<thinking>` content from leaking into channel replies. ([#&#8203;89913](openclaw/openclaw#89913), [#&#8203;90132](openclaw/openclaw#90132)) Thanks [@&#8203;openperf](https://github.com/openperf).
- MCP tool results now coerce `resource_link`, `resource`, `audio`, malformed image, and future non-text/image blocks at the materialize boundary, preventing Anthropic 400s and poisoned session history after a tool returns richer MCP content. ([#&#8203;90710](openclaw/openclaw#90710), [#&#8203;90728](openclaw/openclaw#90728)) Thanks [@&#8203;RanSHammer](https://github.com/RanSHammer) and [@&#8203;849261680](https://github.com/849261680).
- Anthropic extended-thinking sessions recover after prompt-cache expiry or Gateway restart because stream start events wait for `message_start`, letting pre-generation signature errors trigger the existing recovery retry. ([#&#8203;90667](openclaw/openclaw#90667), [#&#8203;90697](openclaw/openclaw#90697)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Parallel is now a bundled `web_search` provider with `PARALLEL_API_KEY` discovery, guarded endpoint handling, cache-safe session ids, onboarding picker support, and docs. ([#&#8203;85158](openclaw/openclaw#85158)) Thanks [@&#8203;NormallyGaussian](https://github.com/NormallyGaussian).
- Google Vertex ADC users get static catalog rows and runtime model resolution again, while single-provider cooldown recovery and memory adapter status checks are more reliable. ([#&#8203;90506](openclaw/openclaw#90506), [#&#8203;90609](openclaw/openclaw#90609), [#&#8203;90717](openclaw/openclaw#90717), [#&#8203;90816](openclaw/openclaw#90816)) Thanks [@&#8203;849261680](https://github.com/849261680).
- Matrix can preflight voice notes before mention gating, preserve thread reads/replies through Matrix relations pagination, and carry QA coverage for voice and thread flows. ([#&#8203;78016](openclaw/openclaw#78016), [#&#8203;90415](openclaw/openclaw#90415))
- Auth and plugin install state is more durable: auth profiles now live in SQLite, official npm plugin install records keep their trusted pins, and prerelease fallback integrity checks avoid carrying stale integrity forward. ([#&#8203;89102](openclaw/openclaw#89102), [#&#8203;88585](openclaw/openclaw#88585))
- macOS node mode no longer silently self-reconnects away from a healthy direct Gateway session, reducing unexpected companion app session churn. ([#&#8203;90668](openclaw/openclaw#90668), [#&#8203;90815](openclaw/openclaw#90815)) Thanks [@&#8203;vrurg](https://github.com/vrurg).
- Upgrade and service paths are safer: cron legacy JSON stores migrate during doctor preflight, service env placeholders no longer mask state-dir secrets, WhatsApp startup waits are bounded, and disabled WhatsApp accounts tear down on config reload. ([#&#8203;90072](openclaw/openclaw#90072), [#&#8203;90208](openclaw/openclaw#90208), [#&#8203;90277](openclaw/openclaw#90277), [#&#8203;90488](openclaw/openclaw#90488), [#&#8203;90486](openclaw/openclaw#90486), [#&#8203;87951](openclaw/openclaw#87951), [#&#8203;87965](openclaw/openclaw#87965)) Thanks [@&#8203;MonkeyLeeT](https://github.com/MonkeyLeeT), [@&#8203;sallyom](https://github.com/sallyom), [@&#8203;mcaxtr](https://github.com/mcaxtr), and [@&#8203;MukundaKatta](https://github.com/MukundaKatta).

##### Changes

- Search/providers: add the Parallel bundled web-search plugin, live provider tests, registration contracts, onboarding/docs wiring, and guarded `api.parallel.ai/v1/search` support. ([#&#8203;85158](openclaw/openclaw#85158)) Thanks [@&#8203;NormallyGaussian](https://github.com/NormallyGaussian).
- Matrix/channels: add voice-message preflight and thread-aware read/reply behavior, including Matrix QA scenario wiring and docs for voice-message behavior. ([#&#8203;78016](openclaw/openclaw#78016), [#&#8203;90415](openclaw/openclaw#90415))
- Skills/ClawHub: install ClawHub skills backed by GitHub repositories through the resolved install API, download the pinned GitHub commit, keep install-policy checks, and report install telemetry after success. ([#&#8203;90478](openclaw/openclaw#90478)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- Google Chat/channels: add native approval card actions and click handling so Google Chat approvals use platform-native cards instead of generic message flow.
- Mobile: Android provider/model screens now surface expiring, unavailable, unresolved, and attention states more clearly, while iOS settings and Talk tabs keep diagnostics, gateway rows, attachment labels, and unavailable Talk controls reachable.
- Memory: QMD search can use the new rerank toggle, and memory adapter status uses the resolved default model identity when checking plain status. ([#&#8203;61834](openclaw/openclaw#61834))
- Docs/tooling: add Parallel search docs, refresh weather-skill guidance toward `web_fetch`, clarify legacy `openai-codex` auth, document release/test helper scripts, and tighten changed-test routing docs for CI/debugging work. ([#&#8203;90028](openclaw/openclaw#90028), [#&#8203;90250](openclaw/openclaw#90250)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Release/process: switch release trains to `YYYY.M.PATCH` monthly patch numbering, keep pre-transition tags compatible, and pin the June 2026 floor at `2026.6.5` after the published beta.
- Platform maintenance: refresh Android, Swift/macOS, Docker, CodeQL, Buildx, Docker build/push, and Codex Action dependencies for this release train. ([#&#8203;74980](openclaw/openclaw#74980), [#&#8203;81757](openclaw/openclaw#81757), [#&#8203;86481](openclaw/openclaw#86481), [#&#8203;86483](openclaw/openclaw#86483), [#&#8203;90601](openclaw/openclaw#90601))
- QQBot: add `/bot-group-allways on|off` slash command (with named-account and default-account support) to toggle whether group messages require an `@mention` before the bot replies, and clear the runtime config snapshot after the write so the new account-level `defaultRequireMention` takes effect immediately without restart. ([#&#8203;91423](openclaw/openclaw#91423)) Thanks [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh).

##### Fixes

- Channel content boundaries: QQBot now strips reasoning/thinking tags before sending, preserving final answers while hiding internal model narration from users. ([#&#8203;89913](openclaw/openclaw#89913), [#&#8203;90132](openclaw/openclaw#90132)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Agents/MCP/providers: coerce non-text/image MCP tool-result blocks before they reach provider converters, preserving valid images and turning richer MCP content into text instead of malformed image blocks. ([#&#8203;90710](openclaw/openclaw#90710), [#&#8203;90728](openclaw/openclaw#90728)) Thanks [@&#8203;RanSHammer](https://github.com/RanSHammer) and [@&#8203;849261680](https://github.com/849261680).
- Anthropic/Codex/ACP/agent recovery: defer Anthropic stream start events until `message_start`, strip stale compaction thinking signatures before Anthropic replay, detect unsigned thinking-only stalls, refresh prompt fences after compaction writes, reject empty completion handoffs, preserve parent streaming-off overrides/shared progress commentary, forward heartbeat metadata to context-engine hooks, and cover Codex session/thread migration edge cases. ([#&#8203;90667](openclaw/openclaw#90667), [#&#8203;90697](openclaw/openclaw#90697), [#&#8203;90163](openclaw/openclaw#90163), [#&#8203;90108](openclaw/openclaw#90108), [#&#8203;89874](openclaw/openclaw#89874), [#&#8203;89505](openclaw/openclaw#89505), [#&#8203;90632](openclaw/openclaw#90632), [#&#8203;89302](openclaw/openclaw#89302), [#&#8203;90729](openclaw/openclaw#90729), [#&#8203;90317](openclaw/openclaw#90317), [#&#8203;90319](openclaw/openclaw#90319)) Thanks [@&#8203;openperf](https://github.com/openperf), [@&#8203;100yenadmin](https://github.com/100yenadmin), and [@&#8203;ooiuuii](https://github.com/ooiuuii).
- Provider/model resolution: preserve Google Vertex ADC auth markers in generated catalogs, re-probe a single-provider primary after cooldown, share Codex model visibility, fail closed for unknown model auth, preserve Codex alias availability, keep unresolved profile refs unknown, and avoid resolving auth while listing models. ([#&#8203;90506](openclaw/openclaw#90506), [#&#8203;90609](openclaw/openclaw#90609), [#&#8203;90717](openclaw/openclaw#90717), [#&#8203;90702](openclaw/openclaw#90702)) Thanks [@&#8203;849261680](https://github.com/849261680).
- Gateway/macOS/mobile: avoid duplicate Gateway probe warnings by identity, rate-limit node pairing requests while preserving paired-node reconnects, keep macOS node mode on a healthy direct Gateway session, keep iOS diagnostics and gateway rows reachable, and avoid Linux ARM Gradle resource tasks during Android builds. ([#&#8203;85791](openclaw/openclaw#85791), [#&#8203;90147](openclaw/openclaw#90147), [#&#8203;90668](openclaw/openclaw#90668), [#&#8203;90815](openclaw/openclaw#90815)) Thanks [@&#8203;giodl73-repo](https://github.com/giodl73-repo) and [@&#8203;vrurg](https://github.com/vrurg).
- TUI/chat/Workboard/auto-reply: optimistic user messages stay stable across stale history reloads, runId reassignment, and abort windows instead of disappearing, jumping, or lingering as ghost rows; Workboard stale lifecycle bulk updates no longer overwrite newer status/provenance; message-tool sends now count as delivery. ([#&#8203;86205](openclaw/openclaw#86205), [#&#8203;89600](openclaw/openclaw#89600), [#&#8203;88592](openclaw/openclaw#88592), [#&#8203;90123](openclaw/openclaw#90123)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Cron/update/service env: doctor config preflight now migrates legacy cron JSON stores into SQLite before runtime reads, service env planning skips unresolved placeholders that would mask state-dir `.env` values, and session transcript rewrites keep registry markers/discriminants consistent. ([#&#8203;90072](openclaw/openclaw#90072), [#&#8203;90208](openclaw/openclaw#90208), [#&#8203;90277](openclaw/openclaw#90277), [#&#8203;90488](openclaw/openclaw#90488)) Thanks [@&#8203;MonkeyLeeT](https://github.com/MonkeyLeeT) and [@&#8203;sallyom](https://github.com/sallyom).
- Security/config/tooling: guard MCP HTTP redirects, protect global agent config defaults, and keep release/test/tooling proof failures bounded and explicit. ([#&#8203;89732](openclaw/openclaw#89732), [#&#8203;90145](openclaw/openclaw#90145))
- Channels: WhatsApp restarts when per-account config changes, bounds background startup waits, closes failed sockets, and preserves reconnect behavior; Mattermost slash commands keep their state on `globalThis`; Feishu streaming cards preserve full merged content; voice-call tracks Twilio streams after connect; ClickClack reply tools respect `toolsAllow`. ([#&#8203;87951](openclaw/openclaw#87951), [#&#8203;87965](openclaw/openclaw#87965), [#&#8203;90486](openclaw/openclaw#90486), [#&#8203;68113](openclaw/openclaw#68113), [#&#8203;90534](openclaw/openclaw#90534), [#&#8203;90181](openclaw/openclaw#90181), [#&#8203;90607](openclaw/openclaw#90607), [#&#8203;89500](openclaw/openclaw#89500)) Thanks [@&#8203;MukundaKatta](https://github.com/MukundaKatta), [@&#8203;mcaxtr](https://github.com/mcaxtr), [@&#8203;infoanton](https://github.com/infoanton), [@&#8203;mushuiyu886](https://github.com/mushuiyu886), and [@&#8203;sahibzada-allahyar](https://github.com/sahibzada-allahyar).
- Feishu: retry transient send rate-limit errors (HTTP 429, per-chat code 230020, tenant-level code 11232) with linear backoff, including SDK responses that fulfill with rate-limit bodies instead of throwing, and route streaming-card sends through the retry wrapper. ([#&#8203;89659](openclaw/openclaw#89659)) Thanks [@&#8203;ladygege](https://github.com/ladygege).
- Release/CI/E2E: main CI guard drift, PR merge diff scoping, live Docker credential staging, base-image qualification, installer Docker classification, Playwright dependency install recovery, API-key auth for Codex live Docker lanes, Parallels option terminators, and JSON-mode progress handling are tighter so release proof fails cleaner. ([#&#8203;90532](openclaw/openclaw#90532), [#&#8203;90287](openclaw/openclaw#90287), [#&#8203;90058](openclaw/openclaw#90058)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa), [@&#8203;hxy91819](https://github.com/hxy91819), and [@&#8203;mrunalp](https://github.com/mrunalp).
- Release/CI/E2E: Docker E2E and live Docker harness runs now apply default memory, CPU, and process ceilings while preserving explicit per-lane overrides.
- Release/CI/E2E: plugin lifecycle matrix resource sampling now fails phases that exceed RSS, wall-clock, or CPU ceilings instead of only logging the measurements.
- Release/CI/E2E: Codex npm plugin live assertions now cap transcript discovery and diagnostic log reads so failure proof stays bounded.
- Tests/state isolation: QA Lab valid-tool-call metrics now require runtime tool-call evidence when runtime parity data is available instead of counting tool-backed scenario pass status alone.
- Tests/state isolation: QA Lab runtime parity now fails planned-only tool-call rows without matching tool results instead of treating matching mock plans as real tool evidence.
- Tests/state isolation: provider, media, auth, cron, task, session, sandbox, Gateway, and Codex timeout fixtures now scope more home/state/env data per test, reducing cross-test leakage and making release validation failures less noisy. ([#&#8203;90027](openclaw/openclaw#90027), [#&#8203;89974](openclaw/openclaw#89974))

</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/963
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
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 docs Improvements or additions to documentation gateway Gateway runtime maintainer Maintainer-authored PR 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. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P2 Normal backlog priority with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. scripts Repository scripts 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.

1 participant