Skip to content

fix(whatsapp): resolve auth dir from active profile#82492

Merged
mcaxtr merged 6 commits into
openclaw:mainfrom
lidge-jun:codex/64555-whatsapp-profile-auth-dir
May 29, 2026
Merged

fix(whatsapp): resolve auth dir from active profile#82492
mcaxtr merged 6 commits into
openclaw:mainfrom
lidge-jun:codex/64555-whatsapp-profile-auth-dir

Conversation

@lidge-jun

Copy link
Copy Markdown
Contributor

Summary

  • Resolve the WhatsApp default web auth dir lazily so OPENCLAW_STATE_DIR / profile env can be applied before the historic WA_WEB_AUTH_DIR export is first read.
  • Keep WhatsApp account auth-dir discovery aligned with the active process env at call time instead of pinning an OAuth root during module evaluation.
  • Add regression coverage for importing the WhatsApp auth module before setting OPENCLAW_STATE_DIR, then reading auth paths after the profile env is active.

Closes #64555

Real behavior proof (required for external PRs)

Behavior addressed: WhatsApp Baileys auth directories no longer get fixed to the default ~/.openclaw/credentials path just because the auth module was imported before a named profile set OPENCLAW_STATE_DIR. The default web auth export and account auth discovery now resolve under the active profile state directory when first read/called.

Real environment tested: macOS local workstation, Node v24.14.1, pnpm v11.1.0, OpenClaw built from source at PR head 21259b1.

Exact steps or command run after this patch:
node scripts/run-vitest.mjs extensions/whatsapp/src/auth-store.lazy-dir.test.ts extensions/whatsapp/src/accounts.test.ts extensions/whatsapp/src/accounts.whatsapp-auth.test.ts
node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/whatsapp/src/auth-store.ts extensions/whatsapp/src/accounts.ts extensions/whatsapp/src/auth-store.lazy-dir.test.ts
git diff --check origin/main..HEAD

Evidence after fix:
$ node scripts/run-vitest.mjs extensions/whatsapp/src/auth-store.lazy-dir.test.ts extensions/whatsapp/src/accounts.test.ts extensions/whatsapp/src/accounts.whatsapp-auth.test.ts
Test Files 3 passed (3)
Tests 15 passed (15)

$ node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/whatsapp/src/auth-store.ts extensions/whatsapp/src/accounts.ts extensions/whatsapp/src/auth-store.lazy-dir.test.ts
Found 0 warnings and 0 errors.
Finished in 1.7s on 3 files with 216 rules using 1 threads.

$ git diff --check origin/main..HEAD
(no output)

Observed result after fix: the new regression test imports the WhatsApp auth module before OPENCLAW_STATE_DIR is set, then sets a temporary profile state dir and verifies WA_WEB_AUTH_DIR and resolveDefaultWebAuthDir() both point at <profile-state>/credentials/whatsapp/default. A companion test verifies listWhatsAppAuthDirs({}) includes the active profile credentials root and default WhatsApp account directory.

What was not tested: live WhatsApp/Baileys pairing against Meta services, systemd profile gateway startup, and cross-platform filesystem behavior on Linux/Windows.

Verification

  • node scripts/run-vitest.mjs extensions/whatsapp/src/auth-store.lazy-dir.test.ts extensions/whatsapp/src/accounts.test.ts extensions/whatsapp/src/accounts.whatsapp-auth.test.ts
  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/whatsapp/src/auth-store.ts extensions/whatsapp/src/accounts.ts extensions/whatsapp/src/auth-store.lazy-dir.test.ts
  • git diff --check origin/main..HEAD

@openclaw-barnacle openclaw-barnacle Bot added channel: whatsapp-web Channel integration: whatsapp-web size: S proof: supplied External PR includes structured after-fix real behavior proof. labels May 16, 2026
@clawsweeper

clawsweeper Bot commented May 16, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed May 29, 2026, 2:04 AM ET / 06:04 UTC.

Summary
The PR changes WhatsApp web auth-dir resolution to use a light-runtime resolver at call time, keeps the legacy string export fallback, and adds focused regression tests for profile state-dir resolution.

PR surface: Source +13, Tests +118. Total +131 across 8 files.

Reproducibility: yes. source inspection gives a high-confidence repro path: current main exports a top-level WA_WEB_AUTH_DIR value and core reads that cached value, while the linked issue reports a named-profile gateway whose OPENCLAW_STATE_DIR is active only after early imports. I did not run a live gateway or WhatsApp pairing path in this read-only review.

Review metrics: 1 noteworthy metric.

  • Runtime auth surface: 1 resolver added, 1 legacy export retained. The PR changes the light-runtime contract used by core while keeping the older string export as a compatibility fallback.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🐚 platinum hermit
Result: blocked until real behavior proof from a real setup is added.

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

Rank-up moves:

  • [P1] Add redacted real behavior proof from a named-profile gateway run showing WhatsApp credentials resolving under the profile state dir.
  • Call out the expected upgrade behavior for profiles that already have WhatsApp credentials in the old main-state location.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR body supplies focused tests, lint, and diff-check output, but no after-fix real named-profile gateway or live WhatsApp credential-path proof; the contributor should add redacted terminal output, logs, screenshots, recordings, or linked artifacts that show the real runtime path and then update the PR body so ClawSweeper can re-review automatically, or ask a maintainer to comment @clawsweeper re-review if it does not.

Risk before merge

  • [P1] Merging this intentionally changes named-profile WhatsApp credential resolution, so existing profiles that were accidentally using credentials under the main state dir may appear logged out or need operator cleanup after upgrade.
  • [P2] The branch adds a new light-runtime resolver while preserving the old string export fallback; that lowers the installed-plugin compatibility risk, but maintainers should still treat the runtime surface as compatibility-sensitive.
  • [P1] The supplied proof does not yet show the real user path from the linked issue: starting or calling a named-profile gateway and observing WhatsApp credentials under that profile state dir.

Maintainer options:

  1. Require named-profile proof before merge (recommended)
    Ask for redacted terminal output, logs, or a short recording showing a profile-scoped gateway resolving WhatsApp credentials under the active profile state directory after this patch.
  2. Document or own the upgrade behavior
    Before merge, maintainers can explicitly accept that existing mislocated WhatsApp sessions may require re-login or cleanup, or add a narrow migration/doctor follow-up for that state.
  3. Pause if live proof is unavailable
    If no one can exercise the named-profile gateway path, keep the PR open rather than landing an auth/session routing change based only on mocked tests.

Next step before merge

  • [P1] Needs contributor proof and maintainer-visible upgrade handling before merge; there is no narrow automated code repair to make while real behavior proof is missing.

Security
Cleared: The diff changes credential-path routing but does not introduce new dependencies, scripts, workflow permissions, downloaded code, or broader secret access; the main security concern is handled as auth/session compatibility risk.

Review details

Best possible solution:

Land this only after maintainer-visible upgrade handling and redacted real named-profile gateway proof confirm the fixed credential path and expected behavior for profiles with previously misplaced WhatsApp creds.

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

Yes, source inspection gives a high-confidence repro path: current main exports a top-level WA_WEB_AUTH_DIR value and core reads that cached value, while the linked issue reports a named-profile gateway whose OPENCLAW_STATE_DIR is active only after early imports. I did not run a live gateway or WhatsApp pairing path in this read-only review.

Is this the best way to solve the issue?

Mostly yes: resolving the default auth dir through a callable light-runtime export and falling back to the old string export is the narrow owner-boundary fix. The remaining solution gap is upgrade handling/proof for profiles with already-misplaced WhatsApp credentials, not a clear code defect in the latest patch.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🐚 platinum hermit.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🦪 silver shellfish, so this older rating label is no longer current.

Label justifications:

  • P1: The PR addresses a high-impact WhatsApp profile isolation bug that can leak or reuse auth state across named profiles, but it still needs real behavior proof before merge.
  • merge-risk: 🚨 compatibility: Changing default credential resolution can alter upgrade behavior for existing named-profile deployments that already have WhatsApp credentials in the old main-state location.
  • merge-risk: 🚨 auth-provider: The diff changes WhatsApp auth-provider credential-path routing and the core light-runtime auth export contract.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🐚 platinum hermit.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body supplies focused tests, lint, and diff-check output, but no after-fix real named-profile gateway or live WhatsApp credential-path proof; the contributor should add redacted terminal output, logs, screenshots, recordings, or linked artifacts that show the real runtime path and then update the PR body so ClawSweeper can re-review automatically, or ask a maintainer to comment @clawsweeper re-review if it does not.
Evidence reviewed

PR surface:

Source +13, Tests +118. Total +131 across 8 files.

View PR surface stats
Area Files Added Removed Net
Source 4 18 5 +13
Tests 4 120 2 +118
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 8 138 7 +131

What I checked:

  • Root repository policy: Full root AGENTS.md was read; it treats plugin APIs, auth/session state, config loading, fallback behavior, and provider routing as compatibility/upgrade-sensitive, which applies to this auth-dir runtime-surface PR. (AGENTS.md:9, fa9901c78ff0)
  • Scoped plugin/runtime policy: extensions/AGENTS.md requires bundled plugins to treat public barrels and runtime APIs as plugin-boundary contracts; src/plugins/AGENTS.md requires loader/runtime behavior to stay aligned with public SDK and preserve external plugin behavior. (extensions/AGENTS.md:3, fa9901c78ff0)
  • Current main behavior: On current main, WhatsApp auth-store exports WA_WEB_AUTH_DIR as a top-level value and core resolveWebChannelAuthDir reads that light-runtime value directly, so an early module import can pin the default credentials path. (extensions/whatsapp/src/auth-store.ts:42, fa9901c78ff0)
  • PR implementation: At PR head, the light runtime exports resolveDefaultWebAuthDir and core calls it each time, falling back to the older WA_WEB_AUTH_DIR string export when the resolver is absent. (src/plugins/runtime/runtime-web-channel-plugin.ts:297, 605ffbf6abdf)
  • Regression coverage: The PR adds focused tests for importing auth-store before setting OPENCLAW_STATE_DIR, for account auth-dir discovery under the active profile state dir, and for the core runtime resolver plus legacy string fallback. (extensions/whatsapp/src/auth-store.lazy-dir.test.ts:29, 605ffbf6abdf)
  • Proof gap: The PR body’s real-behavior section lists focused Vitest, oxlint, and diff-check output, but it does not include a real named-profile gateway run, credential-path log, gateway call output, or live WhatsApp/Baileys proof after the patch. (605ffbf6abdf)

Likely related people:

  • giodl73-repo: Current main blame for both the top-level WhatsApp auth-dir export and core resolveWebChannelAuthDir points to the sandbox posture conformance commit reviewed/co-authored by giodl73-repo. (role: recent area contributor; confidence: high; commits: af64a824a1f8; files: extensions/whatsapp/src/auth-store.ts, src/plugins/runtime/runtime-web-channel-plugin.ts)
  • steipete: git log -S shows Peter Steinberger carried recent plugin-runtime seam work that introduced or reshaped the core web-channel runtime boundary relevant to this PR. (role: plugin runtime refactor owner; confidence: medium; commits: f59d0eac687f, 27ae826f6525; files: src/plugins/runtime/runtime-web-channel-plugin.ts)
  • scoootscooob: git log -S shows the WhatsApp implementation was moved into extensions/whatsapp in commit 1650571, making this history relevant for ownership routing around the auth-store files. (role: WhatsApp extension migration contributor; confidence: medium; commits: 16505718e827; files: extensions/whatsapp/src/auth-store.ts, extensions/whatsapp/src/accounts.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.

@lidge-jun lidge-jun force-pushed the codex/64555-whatsapp-profile-auth-dir branch 2 times, most recently from 4e2ca62 to 6a9a6c4 Compare May 17, 2026 01:53
@openclaw-barnacle openclaw-barnacle Bot added the extensions: memory-core Extension: memory-core label May 17, 2026
@clawsweeper clawsweeper Bot added the P1 High-priority user-facing bug, regression, or broken workflow. label May 17, 2026
@lidge-jun lidge-jun force-pushed the codex/64555-whatsapp-profile-auth-dir branch from 6a9a6c4 to 2f1e6ae Compare May 17, 2026 02:36
@openclaw-barnacle openclaw-barnacle Bot added the commands Command implementations label May 17, 2026
@clawsweeper clawsweeper Bot added impact:security Security boundary, credential, authz, sandbox, or sensitive-data risk. impact:session-state Session, memory, transcript, context, or agent state can drift or corrupt. impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. labels May 17, 2026
@lidge-jun lidge-jun force-pushed the codex/64555-whatsapp-profile-auth-dir branch from 2f1e6ae to f753b2e Compare May 17, 2026 02:47
@openclaw-barnacle openclaw-barnacle Bot removed the extensions: memory-core Extension: memory-core label May 17, 2026
@mcaxtr mcaxtr self-assigned this May 29, 2026
@mcaxtr mcaxtr force-pushed the codex/64555-whatsapp-profile-auth-dir branch from f753b2e to 4b729c0 Compare May 29, 2026 05:12
@openclaw-barnacle openclaw-barnacle Bot removed the commands Command implementations label May 29, 2026
@clawsweeper clawsweeper Bot added the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label May 29, 2026
@mcaxtr mcaxtr force-pushed the codex/64555-whatsapp-profile-auth-dir branch from 4b729c0 to cdd3fcd Compare May 29, 2026 05: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. 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. impact:session-state Session, memory, transcript, context, or agent state can drift or corrupt. impact:security Security boundary, credential, authz, sandbox, or sensitive-data risk. impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. labels May 29, 2026
@mcaxtr mcaxtr force-pushed the codex/64555-whatsapp-profile-auth-dir branch from cdd3fcd to 605ffbf Compare May 29, 2026 05:59
@mcaxtr mcaxtr force-pushed the codex/64555-whatsapp-profile-auth-dir branch from aa5f9da to 82b1404 Compare May 29, 2026 06:17
@openclaw-barnacle openclaw-barnacle Bot added size: S and removed docs Improvements or additions to documentation channel: discord Channel integration: discord gateway Gateway runtime cli CLI command changes agents Agent runtime and tooling extensions: fal extensions: tavily extensions: policy size: XL labels May 29, 2026
@mcaxtr mcaxtr merged commit aa53823 into openclaw:main May 29, 2026
112 of 118 checks passed
@mcaxtr

mcaxtr commented May 29, 2026

Copy link
Copy Markdown
Member

Merged via squash.

Thanks @lidge-jun!

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 30, 2026
Merged via squash.

Prepared head SHA: 82b1404
Co-authored-by: lidge-jun <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: mcaxtr <7562095+mcaxtr@users.noreply.github.com>
Reviewed-by: @mcaxtr
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 31, 2026
…026.5.28) (#759)

This PR contains the following updates:

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

---

### Release Notes

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

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

[Compare Source](openclaw/openclaw@v2026.5.27...v2026.5.28)

##### Highlights

- Agent and Codex runtime recovery is steadier: subagents keep cwd/workspace separation, hook context stays prompt-local, session locks release on timeout abort while live OpenClaw locks survive cleanup, stale restart continuations are avoided, and Codex app-server/helper failures no longer tear down shared runtime state. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;87409](openclaw/openclaw#87409), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;88129](openclaw/openclaw#88129))
- Channel delivery and session identity got safer across outbound plugin hooks, Matrix room ids, iMessage reactions/approvals, Slack final replies, Discord recovered tool warnings, runtime-config message actions, WhatsApp profile auth roots, Telegram polling, and Microsoft Teams service URL trust checks. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;87160](openclaw/openclaw#87160))
- Mobile and chat surfaces got a broader refresh: the iOS Pro UI, hosted push relay default, realtime Talk tab playback, Gateway chat transport, onboarding, Talk permissions, WebChat reconnect delivery, and session picker behavior now preserve more state across reconnects and empty searches. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;87531](openclaw/openclaw#87531), [#&#8203;87682](openclaw/openclaw#87682), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;ngutman](https://github.com/ngutman) and [@&#8203;BunsDev](https://github.com/BunsDev).
- Browser, channel, and automation inputs are stricter: Browser tool timeouts, viewport/tab indices, Gateway ports, cron retry handling, Discord component ids, schema array refs, Telegram callback pages, and channel progress callbacks now reject malformed values earlier and preserve the intended delivery context. ([#&#8203;82887](openclaw/openclaw#82887))
- Provider, media, and document coverage expands with Claude Opus 4.8, Fal Krea image schemas, NVIDIA featured models, MiniMax streaming music responses, encrypted PDF extraction, voice model catalogs, GitHub Copilot agent runtime support, and a Codex Supervisor plugin path for delegated Codex workflows. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87751](openclaw/openclaw#87751), [#&#8203;87794](openclaw/openclaw#87794))
- CLI, auth, doctor, and provider paths fail faster and recover more clearly: malformed numeric/version options are rejected, workspace dotenv provider credentials are ignored, heartbeat defaults, OAuth/token lifetimes, and local service startup requests are bounded, agent auth health labels are clearer, legacy `api_key` auth profiles migrate to canonical form, and restart guidance is actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924)) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- Plugin and Gateway hot paths do less repeated work while preserving cache correctness for install records, config JSON parsing, tool search catalogs, session stores, manifest model rows, auto-enabled plugin config, browser tokens, viewer assets, and release-split external plugin packages. ([#&#8203;86699](openclaw/openclaw#86699))
- Release, QA, and E2E validation now bound more log, artifact, harness, and cross-OS waits so failing lanes produce proof instead of hanging or false-greening.

##### Changes

- Status: show active subagent details in status output.
- Diffs: split the default language pack and expand default Diffs language coverage while keeping the host floor aligned. ([#&#8203;87370](openclaw/openclaw#87370), [#&#8203;87372](openclaw/openclaw#87372)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- ClawHub: add plugin display names plus skill verification and trust surfaces. ([#&#8203;87354](openclaw/openclaw#87354), [#&#8203;86699](openclaw/openclaw#86699)) Thanks [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow) and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- iOS: refresh the dev app with Pro Command, Chat, Agents, Settings, hosted push relay defaults, and realtime Talk playback wired to gateway sessions, diagnostics, chat, and realtime Talk. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin) and [@&#8203;ngutman](https://github.com/ngutman).
- Docs: clarify Codex computer-use setup, paste-token stdin auth setup, macOS gateway sleep troubleshooting, native Codex hook relay recovery, container model auth, install deployment cards, device-token admin gating, CLI setup flow compatibility, Notte cloud browser CDP setup, and backport targets. ([#&#8203;87313](openclaw/openclaw#87313), [#&#8203;63050](openclaw/openclaw#63050), [#&#8203;87685](openclaw/openclaw#87685)) Thanks [@&#8203;bdjben](https://github.com/bdjben), [@&#8203;liaoandi](https://github.com/liaoandi), and [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow).
- PDF/tools: use ClawPDF for PDF extraction, support encrypted PDF extraction, and surface MCP structured content in agent tool results. ([#&#8203;87670](openclaw/openclaw#87670), [#&#8203;87751](openclaw/openclaw#87751))
- Providers: add Claude Opus 4.8 support, Fal Krea image model schemas, NVIDIA featured model catalogs, MiniMax streaming music responses, and provider-backed voice model catalogs. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87794](openclaw/openclaw#87794)) Thanks [@&#8203;eleqtrizit](https://github.com/eleqtrizit) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Codex/GitHub: add the GitHub Copilot agent runtime and the Codex Supervisor plugin package.
- Plugins: externalize GitHub Copilot and Tokenjuice as official install-on-demand plugins with npm and ClawHub publish metadata.
- Workboard: add agent coordination tools for tracking and handing off active agent work.
- Discord: show commentary in progress drafts so live Discord runs expose useful in-progress context. ([#&#8203;85200](openclaw/openclaw#85200))
- Plugin SDK: add a reply payload sending hook for plugins that need to deliver channel-owned replies and flatten package types for SDK declarations. ([#&#8203;82823](openclaw/openclaw#82823), [#&#8203;87165](openclaw/openclaw#87165)) Thanks [@&#8203;piersonr](https://github.com/piersonr) and [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Policy: add policy comparison, ingress-channel conformance, and sandbox-posture conformance checks. ([#&#8203;85572](openclaw/openclaw#85572), [#&#8203;85744](openclaw/openclaw#85744), [#&#8203;86768](openclaw/openclaw#86768))

##### Fixes

- Agents: fall back to local config pruning when the optional `agents delete` Gateway probe cannot authenticate, so offline installs can still delete agents without removing shared workspaces.
- Tighten phone-control mutation authorization \[AI]. ([#&#8203;87150](openclaw/openclaw#87150)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Clarify directive persistence authorization policy \[AI]. ([#&#8203;86369](openclaw/openclaw#86369)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Agents/Codex: keep spawned agent cwd/workspace state separated, forward ACP spawn attachments, keep hook context prompt-local, release session locks on timeout abort and runtime teardown without deleting live OpenClaw-owned locks during cleanup, avoid session event queue self-wait, clean up exec abort listeners, stream assistant deltas incrementally, recover raw missing-thread compaction failures, preserve rotated compaction session identity, keep compaction-timeout snapshots continuable, preserve shared app-server state across startup or helper failures, keep native hook relay alive across restarts and prune stale bridge files, close native hook relay replacement races, keep Claude live tool progress visible for watchdog recovery, suppress abandoned requester completion handoff, route workspace memory through tools, resolve Codex runtime models first, report quarantined dynamic tools, format `skills` command output, bind node auto-review to prepared plans, retry Claude CLI transcript probes, and bound compaction/steering retries. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;86123](openclaw/openclaw#86123), [#&#8203;88129](openclaw/openclaw#88129), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;72574](openclaw/openclaw#72574), [#&#8203;87383](openclaw/openclaw#87383), [#&#8203;87400](openclaw/openclaw#87400), [#&#8203;83022](openclaw/openclaw#83022), [#&#8203;87671](openclaw/openclaw#87671), [#&#8203;87738](openclaw/openclaw#87738), [#&#8203;87747](openclaw/openclaw#87747), [#&#8203;87706](openclaw/openclaw#87706), [#&#8203;87546](openclaw/openclaw#87546), [#&#8203;87541](openclaw/openclaw#87541), [#&#8203;81048](openclaw/openclaw#81048)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky), [@&#8203;Alix-007](https://github.com/Alix-007), [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;yetval](https://github.com/yetval), [@&#8203;sjf](https://github.com/sjf), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;benjamin1492](https://github.com/benjamin1492), [@&#8203;c19354837](https://github.com/c19354837), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;pfrederiksen](https://github.com/pfrederiksen), and [@&#8203;dodge1218](https://github.com/dodge1218).
- Codex Supervisor: keep real-home app-server MCP session listing on the loaded state path, bound stored history scans, and close WebSocket probes cleanly.
- Channels: thread canonical session keys into outbound hooks, preserve Matrix room-id case, keep fallback tool warnings mention-inert, retain delivered Slack final replies during late cleanup, continue iMessage polling after denied reactions, suppress duplicate native exec approvals, resolve Gateway message actions against the active runtime config, preserve Telegram SecretRef prompt config and polling keepalives, preserve WhatsApp profile auth roots, QR display, document filenames, and plugin hook config, suppress Discord recovered tool warnings, preserve the Discord voice outbound helper, cap Discord/Signal/Zalo channel request and container timeouts, and block untrusted Teams service URLs while keeping TeamsSDK patterns aligned. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87465](openclaw/openclaw#87465), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;76262](openclaw/openclaw#76262), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;87581](openclaw/openclaw#87581), [#&#8203;77114](openclaw/openclaw#77114), [#&#8203;86426](openclaw/openclaw#86426), [#&#8203;85529](openclaw/openclaw#85529), [#&#8203;87160](openclaw/openclaw#87160)) Thanks [@&#8203;zeroaltitude](https://github.com/zeroaltitude), [@&#8203;lukeboyett](https://github.com/lukeboyett), [@&#8203;jarvis-mns1](https://github.com/jarvis-mns1), [@&#8203;xiaotian](https://github.com/xiaotian), [@&#8203;funmerlin](https://github.com/funmerlin), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;heyitsaamir](https://github.com/heyitsaamir), [@&#8203;amittell](https://github.com/amittell), [@&#8203;lidge-jun](https://github.com/lidge-jun), [@&#8203;liorb-mountapps](https://github.com/liorb-mountapps), [@&#8203;masatohoshino](https://github.com/masatohoshino), [@&#8203;bladin](https://github.com/bladin), and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- CLI/auth/doctor/providers: reject malformed numeric/timeout/subcommand-version inputs, ignore workspace dotenv provider credentials, wait for respawn child shutdown, bound heartbeat defaults plus Codex, GitHub Copilot, OpenAI, Anthropic, Google, Feishu, LM Studio, MiniMax, Xiaomi TTS, and local-provider OAuth/token/model requests, harden Codex auth probes, label auth health by agent, preserve explicit agentRuntime pins during Codex model migration, warm provider auth off the main thread, honor Codex response timeouts, stop migrating current Claude Haiku 4.5 profiles to Sonnet, bound local service startup, resolve GPT-5.5 without cached catalog, migrate legacy memory auto-provider config, rewrite non-canonical `api_key` auth profiles, and make doctor restart follow-ups actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;87719](openclaw/openclaw#87719), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924), [#&#8203;84362](openclaw/openclaw#84362)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;samzong](https://github.com/samzong), [@&#8203;giodl73-repo](https://github.com/giodl73-repo), [@&#8203;alkor2000](https://github.com/alkor2000), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;nxmxbbd](https://github.com/nxmxbbd), and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Gateway/security/session state: expire browser tokens after auth rotation, scope assistant idempotency dedupe, drain probe client closes, avoid stale restart continuation reuse, preserve retry-after fallbacks and stale rate-limit cooldown probes, bound webchat image and artifact transcript scans, include seconds in inbound metadata timestamps, clear completed session active runs, clear stale chat stream buffers, and evict current plugin-state namespaces at row caps. ([#&#8203;87810](openclaw/openclaw#87810), [#&#8203;87833](openclaw/openclaw#87833), [#&#8203;75089](openclaw/openclaw#75089)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;litang9](https://github.com/litang9).
- Config/parsing/network: reject partial numeric parsing, parse provider/Discord retry headers and dates strictly, honor IPv6 and bare IPv6 `no_proxy` entries, preserve empty plugin allowlists, canonicalize secret target array indexes, and reject malformed media content lengths, inspected TCP ports, marketplace content lengths, cron epochs, sandbox stat fields, unsafe duration values, empty config path segments, noncanonical schema array refs, unsafe Telegram callback pages, and invalid Teams attachment-fetch DNS targets. ([#&#8203;87883](openclaw/openclaw#87883)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Browser/input hardening: reject invalid tab indexes, excessive viewport resizes, explicit zero CDP ports, malformed geolocation options, unsafe screenshot or permission-grant timeouts, loose response-body limits, invalid cookie expiries, and non-finite Browser tool delays/timeouts.
- Cron/automation: retry recurring jobs after transient model rate limits before waiting for the next scheduled slot, and preflight model fallbacks before skipping scheduled work. ([#&#8203;82887](openclaw/openclaw#82887)) Thanks [@&#8203;chen-zhang-cs-code](https://github.com/chen-zhang-cs-code).
- Auto-reply/directives: respect provider and relayed channel metadata during directive persistence so channel-originated decisions keep their intended context. ([#&#8203;87683](openclaw/openclaw#87683))
- WhatsApp: resolve the auth directory from the active profile so profile-scoped WhatsApp installs do not drift to the wrong credential root. ([#&#8203;82492](openclaw/openclaw#82492)) Thanks [@&#8203;lidge-jun](https://github.com/lidge-jun).
- Gateway/session state: clear completed session active runs, avoid cold-loading providers for MCP inventory, cache single-session child indexes, cap handshake timers, and bound preauth, auth-guard, media, transcript, readiness, and port options.
- Channels/replies: preserve channel-owned progress callbacks when verbose output is off, keep group-room progress suppression intact, prefer external session delivery context, escape Discord component id delimiters, force final TUI chat repaints, show Slack reasoning previews, and normalize Discord/Matrix/Mattermost channel numeric options. ([#&#8203;87476](openclaw/openclaw#87476), [#&#8203;87423](openclaw/openclaw#87423))
- Agents/tool args: harden smart-quoted argument repair for edit arrays and exact escaped arguments so model-produced tool calls recover without corrupting valid input. ([#&#8203;86611](openclaw/openclaw#86611)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).
- Providers/agents: preserve seeded Anthropic signatures, preserve signed thinking payloads, concatenate signature-delta chunks, preserve DeepSeek `reasoning_content` replay across tier suffixes, apply OpenRouter strict9 ids to Mistral routes, promote Ollama plain-text tool calls, load NVIDIA featured model catalogs, stream MiniMax music generation responses, and recover empty preflight compaction. ([#&#8203;87593](openclaw/openclaw#87593), [#&#8203;87493](openclaw/openclaw#87493), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764)) Thanks [@&#8203;Pluviobyte](https://github.com/Pluviobyte) and [@&#8203;eleqtrizit](https://github.com/eleqtrizit).
- Media/images: skip CLI image cache refs when resolving generated images, allow trusted generated HTML attachments, and bound generated video downloads so stale refs and slow providers fail cleanly. ([#&#8203;87523](openclaw/openclaw#87523), [#&#8203;87982](openclaw/openclaw#87982))
- File transfer: handle late tar stdin pipe errors after archive validation or unpacking has already settled.
- Performance: trust install-record caches between reloads, prefer native JSON parsing, reuse unchanged tool-search catalogs, reuse gateway session and plugin metadata paths, skip unchanged store serialization, patch single-entry session writes, add precomputed session patch writers, reduce store clone allocations, cache manifest model catalog rows and auto-enabled plugin config, avoid full session snapshots for entry reads, defer configured Slack full startup, prefer bundled plugin dist entries, and slim current metadata identity caches. ([#&#8203;87760](openclaw/openclaw#87760))
- Docker/release/QA: package runtime workspace templates, stream cross-OS served artifacts, preserve sparse Crabbox run artifacts, isolate npm plugin installs per package, reject incompatible package plugin API installs, drop the leftover root Sharp dependency from package manifests after the Rastermill migration, bound OpenClaw instance logs, plugin gauntlet relay logs, MCP channel buffers, kitchen-sink scans, agent-turn assertions, QA-Lab credential broker calls, QA Matrix substrate requests, and release scenario logs, and keep release/google live guards current. ([#&#8203;87647](openclaw/openclaw#87647), [#&#8203;87477](openclaw/openclaw#87477)) Thanks [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Release/CI: bound manual git fetches, ClawHub verifier responses, ClawHub owner metadata, dependency-guard error bodies, Parallels limits, startup/test/memory budget parsing, and diffs viewer build warnings so release lanes fail with useful proof instead of hanging. ([#&#8203;87839](openclaw/openclaw#87839))

</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/759
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
Merged via squash.

Prepared head SHA: 82b1404
Co-authored-by: lidge-jun <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: mcaxtr <7562095+mcaxtr@users.noreply.github.com>
Reviewed-by: @mcaxtr
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
Merged via squash.

Prepared head SHA: 82b1404
Co-authored-by: lidge-jun <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: mcaxtr <7562095+mcaxtr@users.noreply.github.com>
Reviewed-by: @mcaxtr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: whatsapp-web Channel integration: whatsapp-web 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. P1 High-priority user-facing bug, regression, or broken workflow. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: S status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: WhatsApp credentials leak across --profile boundaries

2 participants