fix: load Claude CLI OAuth for PI auth profiles#87167
Conversation
|
Codex review: needs maintainer review before merge. Reviewed May 27, 2026, 4:14 AM ET / 08:14 UTC. Summary PR surface: Source +300, Tests +737. Total +1037 across 7 files. Reproducibility: yes. source-reproducible: current main's PI and Review metrics: 1 noteworthy metric.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge Security Review detailsBest possible solution: Land the focused runtime auth fix after maintainer auth-provider compatibility sign-off and current-main CI, while keeping any remaining on-disk SecretRef migration gap tracked by the linked issue. Do we have a high-confidence way to reproduce the issue? Yes, source-reproducible: current main's PI and Is this the best way to solve the issue? Mostly yes. A shared selection helper is a maintainable way to keep PI and AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against cefa6777e20d. Label changesLabel justifications:
Evidence reviewedPR surface: Source +300, Tests +737. Total +1037 across 7 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
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 PR egg ✨ Hatched: 🥚 common Gilded Shellbean Hatch commandComment Hatchability rules:
Rarity: 🥚 common. What is this egg doing here?
|
0e13996 to
2e0af10
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
@clawsweeper re-review |
|
🦞👀 Command router queued. I will update this comment with the next step. Re-review progress:
|
* test: cover auth profile SecretRef regressions * docs: note auth profile regression coverage * test: satisfy auth profile regression lint * fix: load Claude CLI OAuth overlay for PI runs * fix(agents): share external CLI auth selection with btw * chore: remove release-owned changelog entry
…026.5.27) (#698) 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.26` → `2026.5.27` | --- ### Release Notes <details> <summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary> ### [`v2026.5.27`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026527) [Compare Source](openclaw/openclaw@v2026.5.26...v2026.5.27) ##### Highlights - Safer local/runtime boundaries: OpenClaw now rejects unsafe command wrappers, malformed CLI numeric options, unsafe Node runtime env overrides, no-auth Tailscale exposure, and non-admin device-role pairing approvals before they can affect live runs. ([#​87308](openclaw/openclaw#87308), [#​87305](openclaw/openclaw#87305), [#​87292](openclaw/openclaw#87292), [#​87146](openclaw/openclaw#87146)) - Matrix and auto-reply delivery are steadier: mention previews stay inert, final mention replies deliver normally, shared-DM notices are awaited, MXID parsing ignores filenames, and reasoning-prefixed `NO_REPLY` responses stay suppressed. - Provider and agent reliability improved across OpenAI-compatible embeddings, cached token usage, Anthropic/Codex/Claude runtime state, unsupported tool-schema quarantine, heartbeat templates, and session fallback errors. ([#​85269](openclaw/openclaw#85269), [#​82062](openclaw/openclaw#82062), [#​85416](openclaw/openclaw#85416), [#​86855](openclaw/openclaw#86855)) - Plugin and package release paths got tighter: Pixverse ships as an external video plugin with region selection, package exclusions and shrinkwrap inventory match the published npm shape, and release/package smoke commands fail bounded instead of hanging. - Gateway hot paths do less rediscovery by reusing current plugin metadata fingerprints, stable plugin index fingerprints, read-only session metadata, active working stores, status fast paths, and auth/env snapshots. ([#​86439](openclaw/openclaw#86439)) ##### Changes - Memory: add a core OpenAI-compatible embedding provider for local and hosted OpenAI-style endpoints, with config, doctor, and docs support. ([#​85269](openclaw/openclaw#85269)) Thanks [@​dutifulbob](https://github.com/dutifulbob). - Plugin SDK: mark memory-specific embedding provider registration as deprecated compatibility and surface non-bundled usage in plugin compatibility diagnostics. ([#​85072](openclaw/openclaw#85072)) Thanks [@​mbelinky](https://github.com/mbelinky). - Pixverse: add video generation provider support, API region selection, and external plugin publishing. - Plugins: expose approval action metadata for plugin-driven approval surfaces. ##### Fixes - Security/CLI/runtime: harden hostname normalization for repeated trailing dots, block side-effecting command wrappers, reject unsafe Node runtime env overrides, reject loose numeric CLI and gateway options, require admin approval for node device-role pairing, and reject no-auth Tailscale exposure. ([#​87305](openclaw/openclaw#87305), [#​87292](openclaw/openclaw#87292), [#​87308](openclaw/openclaw#87308), [#​87146](openclaw/openclaw#87146)) Thanks [@​pgondhi987](https://github.com/pgondhi987). - Doctor: validate runtime tool schemas for every configured embedded agent while skipping ACP-only profiles, so bad non-default plugin or MCP tools are reported before assistant turns. - Telegram: route `sendMessage` action replies through durable outbound delivery so completed agent responses remain retryable when the gateway send path times out. ([#​87261](openclaw/openclaw#87261)) Thanks [@​mbelinky](https://github.com/mbelinky). - Matrix/auto-reply: keep draft previews mention-inert, preserve final mention delivery, send mention finals normally, await shared DM notices, ignore filename-embedded MXIDs, and suppress reasoning-prefixed `NO_REPLY` responses. - Agents/providers: add OpenAI-compatible cache retention, forward cached token usage in chat completions, preserve runtime context before active user turns, strip stale Anthropic thinking, load Claude CLI OAuth for Pi auth profiles, avoid false Codex runtime live switches, and quarantine unsupported tool schemas. ([#​82062](openclaw/openclaw#82062), [#​87167](openclaw/openclaw#87167), [#​86855](openclaw/openclaw#86855)) - Gateway/performance: cache plugin metadata fingerprints and stable plugin index fingerprints, borrow read-only session metadata safely, keep the active session working store hot, keep status on a bounded fast path, and preserve model auth profile suffixes. ([#​86439](openclaw/openclaw#86439)) - Package/install/release: align npm package exclusions and inventory, omit unpacked test helpers, skip Homebrew until macOS packages need it, cap tsdown heap in containers, bound install/release smoke waits, and harden post-publish verification. - Codex/Auth: bound ChatGPT OAuth token exchange and refresh requests, and honor cancellation across Codex and Anthropic OAuth login flows. - QA/E2E/CI: bound Telegram, kitchen-sink, Open WebUI, ClawHub, MCP, Discord, realtime, labeler, and GitHub API waits; fail empty explicit test, live-media, gateway CPU, startup benchmark, plugin gauntlet, and beta-smoke runs instead of false-greening. - Agents/Codex: keep spawned agent bootstrap files rooted in the agent workspace while running task commands, transcripts, and compaction from the requested cwd. ([#​87218](openclaw/openclaw#87218)) Thanks [@​mbelinky](https://github.com/mbelinky). </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/698
* test: cover auth profile SecretRef regressions * docs: note auth profile regression coverage * test: satisfy auth profile regression lint * fix: load Claude CLI OAuth overlay for PI runs * fix(agents): share external CLI auth selection with btw * chore: remove release-owned changelog entry
* test: cover auth profile SecretRef regressions * docs: note auth profile regression coverage * test: satisfy auth profile regression lint * fix: load Claude CLI OAuth overlay for PI runs * fix(agents): share external CLI auth selection with btw * chore: remove release-owned changelog entry
Summary
/btw, so side questions preserve Claude CLI OAuth when the active session has a stale auto-selected static Anthropic profile./btw, and direct Anthropic auth with Claude CLI fallback./btwauth on the no-external auth-profile store path.origin/main: production: ~320 added lines; tests: ~740 added lines.Refs #86756.
Verification
.agents/skills/autoreview/scripts/autoreview --mode local(clean after fixing first-pass legacy source-less override finding)node scripts/run-vitest.mjs src/agents/btw.test.ts -- --reporter=verbose(2 files passed, 66 tests passed)node scripts/run-vitest.mjs src/agents/pi-embedded-runner/run.overflow-compaction.test.ts src/agents/auth-profiles.external-cli-sync.test.ts src/agents/auth-profiles.external-cli-scope.test.ts src/agents/model-runtime-aliases.test.ts -- --reporter=verbose(6 files passed, 129 tests passed)./node_modules/.bin/oxfmt --check --threads=1 src/agents/auth-profiles/external-cli-auth-selection.ts src/agents/pi-embedded-runner/run.ts src/agents/btw.ts src/agents/btw.test.tsgit diff --checkReal behavior proof
Behavior addressed: PI embedded runs and
/btwside questions using Claude CLI OAuth no longer lose runtime-only Claude CLI credentials when the static SecretRef/auth-profile snapshot excludes external OAuth profiles.Real environment tested: Local macOS checkout with real Claude Code OAuth copied from the local Claude credential source into an isolated HOME, no Anthropic or Claude token env vars present, synthetic OpenClaw auth-profile config/store state, and PI embedded-runner plus
/btwlive requests; earlier branch proof also used direct AWS Crabbox Linux for the SecretRef/auth-profile regression tests.Exact steps or command run after this patch:
node scripts/run-vitest.mjs src/agents/btw.test.ts -- --reporter=verbose;node scripts/run-vitest.mjs src/agents/pi-embedded-runner/run.overflow-compaction.test.ts src/agents/auth-profiles.external-cli-sync.test.ts src/agents/auth-profiles.external-cli-scope.test.ts src/agents/model-runtime-aliases.test.ts -- --reporter=verbose; then one-offnode --import tsx/esm --input-type=modulelive probes withHOME,OPENCLAW_STATE_DIR, andOPENCLAW_SKIP_CHANNELS=1isolated from the user profile, including stale-session repro probes and clean happy-path probes with no session auth override.Evidence after fix: Focused
/btwproof passed 2 files / 66 tests; PI/auth regression proof passed 6 files / 129 tests; the live stale-session PI prompt returned exactlyOC87167_PI_OK; the live stale-session/btwside question returned exactlyOC87167_PI_OK; the clean live auth resolver selectedanthropic:claude-cliOAuth; the clean live PI prompt returned exactlyOC87167_HAPPY_PI_OK; the clean live/btwside question returned exactlyOC87167_HAPPY_PI_OK.Observed result after fix: PI and
/btwloadensureAuthProfileStore(... externalCliProviderIds: ["claude-cli"], allowKeychainPrompt: false)when Claude CLI OAuth is selected by config auth order, persisted auth-store order, runtime policy, explicit PI runtime, or fallback order; stale auto-selected static Anthropic profiles no longer suppress Claude CLI OAuth; user-locked static Anthropic profiles, including legacy source-less overrides, continue using the static profile path; clean Claude CLI OAuth PI and/btwflows still work without stale session auth state.What was not tested: Full production UI/manual slash-command dispatch was not driven end-to-end; the live proof calls the same embedded PI and
/btwruntime entrypoints directly with isolated local state.