Skip to content

fix(infra): wrap provider auth resolution in timeout for status --usage --json#74185

Closed
yelog wants to merge 9 commits into
openclaw:mainfrom
yelog:fix/status-json-usage-auth-timeout-74085
Closed

fix(infra): wrap provider auth resolution in timeout for status --usage --json#74185
yelog wants to merge 9 commits into
openclaw:mainfrom
yelog:fix/status-json-usage-auth-timeout-74085

Conversation

@yelog

@yelog yelog commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Wraps resolveProviderAuths() in the existing withTimeout helper so auth resolution (OAuth token refresh, plugin auth hooks, secret exec resolvers) cannot hang indefinitely
  • Returns empty providers on auth timeout instead of blocking forever, allowing the JSON command to complete

Problem

openclaw status --usage --json hangs when called from a non-TTY subprocess (regression from 2026.4.23 to 2026.4.26). The individual provider usage fetches are bounded by withTimeout, but resolveProviderAuths() — which iterates sequentially over 7 providers calling plugin auth hooks, OAuth token refresh, and secret ref resolvers — had no timeout boundary. In a non-TTY subprocess, any of these can block indefinitely.

Changes

src/infra/provider-usage.load.ts

  • Wrapped the resolveProviderAuths() call at line 94 in withTimeout(…, timeoutMs, []) using the same timeout budget as the fetch phase
  • On timeout, returns [] (empty auths) which causes loadProviderUsageSummary to return { providers: [] } instead of hanging

src/infra/provider-usage.load.test.ts

  • Added mock for resolveProviderAuths to support testing the timeout path
  • Added test: "returns empty providers when auth resolution exceeds timeout" — mocks auth resolution as a promise that never settles, verifies the function resolves within the timeout

Real behavior proof

Behavior addressed: non-TTY status --usage --json should complete instead of hanging while provider usage auth is resolved.

Real environment tested: local OpenClaw source checkout on branch fix/status-json-usage-auth-timeout-74085, head 9852b6356b6a8369bc4f9e19b71745466d6103c5.

Exact steps or command run after this patch:

node -e '<script uses child_process.spawnSync("node", ["scripts/run-node.mjs", "status", "--usage", "--json"], { timeout: 45000, encoding: "utf8", non-TTY stdio capture }) and prints only exit status, elapsed time, JSON parse status, top-level keys, and usage summary shape>'

Evidence after fix:

{
  "branch": "fix/status-json-usage-auth-timeout-74085",
  "head": "9852b6356b6a8369bc4f9e19b71745466d6103c5",
  "command": "node scripts/run-node.mjs status --usage --json",
  "nonTty": true,
  "exitStatus": 0,
  "signal": null,
  "timedOut": false,
  "elapsedMs": 6513,
  "stdoutBytes": 2757,
  "stderrBytes": 0,
  "parsedJson": true,
  "topLevelKeys": [
    "agents",
    "channelSummary",
    "gateway",
    "gatewayService",
    "heartbeat",
    "lastHeartbeat",
    "memory",
    "memoryPlugin",
    "nodeService",
    "os",
    "queuedSystemEvents",
    "runtimeVersion",
    "secretDiagnostics",
    "sessions",
    "taskAudit",
    "tasks",
    "update",
    "updateChannel",
    "updateChannelSource",
    "usage"
  ],
  "hasUsage": true,
  "usageKeys": [
    "providers",
    "updatedAt"
  ],
  "usageProviders": 1,
  "stderrPreview": []
}

Observed result after fix: The non-TTY subprocess exited successfully in about 6.5s, did not hit the 45s timeout, emitted parseable JSON on stdout, and included a top-level usage object with provider usage data.

What was not tested: This was a local source checkout proof rather than a packaged install, and it does not print provider names, auth profiles, credentials, or raw usage values.

Fixes #74085

@greptile-apps

greptile-apps Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Wraps resolveProviderAuths() in the existing withTimeout helper so provider auth resolution (OAuth token refresh, plugin hooks, secret-exec resolvers) cannot block indefinitely when status --usage --json is called from a non-TTY subprocess. A companion test uses a never-settling promise mock to verify the timeout path returns { providers: [] } within the budget. The change is minimal, internally consistent with how individual fetch tasks are already bounded, and well-targeted to the reported regression.

Confidence Score: 4/5

Safe to merge — the change is small, consistent with the existing timeout pattern, and the new test covers the regression path.

No P0 or P1 findings. Two P2 style suggestions (complex type in test, missing log on timeout). Score stays at 4/5.

No files require special attention.

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/infra/provider-usage.load.test.ts
Line: 176-181

Comment:
**Overly complex config type extraction**

The conditional type chain here resolves to `OpenClawConfig`, which is already exported from `../config/config.js` (the same import used in the source file). Importing it directly is cleaner and easier to understand.

```suggestion
      config: {} as import("../config/config.js").OpenClawConfig,
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/infra/provider-usage.load.ts
Line: 94-105

Comment:
**No signal on auth timeout**

`withTimeout` silently returns `[]` when auth resolution exceeds `timeoutMs`. At the call site there's no observable difference between "no providers configured" and "auth timed out", which makes this hard to diagnose in the field. Consider emitting a debug/warning log before returning the fallback so operators can distinguish the two cases.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix(infra): wrap provider auth resolutio..." | Re-trigger Greptile

Comment thread src/infra/provider-usage.load.test.ts Outdated
Comment on lines +176 to +181
config: {} as Parameters<typeof loadProviderUsageSummary>[0] extends infer O
? O extends { config?: infer C }
? NonNullable<C>
: never
: never,
env: {},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Overly complex config type extraction

The conditional type chain here resolves to OpenClawConfig, which is already exported from ../config/config.js (the same import used in the source file). Importing it directly is cleaner and easier to understand.

Suggested change
config: {} as Parameters<typeof loadProviderUsageSummary>[0] extends infer O
? O extends { config?: infer C }
? NonNullable<C>
: never
: never,
env: {},
config: {} as import("../config/config.js").OpenClawConfig,
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/infra/provider-usage.load.test.ts
Line: 176-181

Comment:
**Overly complex config type extraction**

The conditional type chain here resolves to `OpenClawConfig`, which is already exported from `../config/config.js` (the same import used in the source file). Importing it directly is cleaner and easier to understand.

```suggestion
      config: {} as import("../config/config.js").OpenClawConfig,
```

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment thread src/infra/provider-usage.load.ts Outdated
Comment on lines +94 to +105
const auths = await withTimeout(
resolveProviderAuths({
providers: opts.providers ?? usageProviders,
auth: opts.auth,
agentDir: opts.agentDir,
config,
env,
skipPluginAuthWithoutCredentialSource: opts.skipPluginAuthWithoutCredentialSource,
}),
timeoutMs,
[],
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 No signal on auth timeout

withTimeout silently returns [] when auth resolution exceeds timeoutMs. At the call site there's no observable difference between "no providers configured" and "auth timed out", which makes this hard to diagnose in the field. Consider emitting a debug/warning log before returning the fallback so operators can distinguish the two cases.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/infra/provider-usage.load.ts
Line: 94-105

Comment:
**No signal on auth timeout**

`withTimeout` silently returns `[]` when auth resolution exceeds `timeoutMs`. At the call site there's no observable difference between "no providers configured" and "auth timed out", which makes this hard to diagnose in the field. Consider emitting a debug/warning log before returning the fallback so operators can distinguish the two cases.

How can I resolve this? If you propose a fix, please make it concise.

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed July 3, 2026, 4:08 PM ET / 20:08 UTC.

Summary
The branch wraps provider usage auth resolution in a timeout with a warning and empty-provider fallback, adds regression tests, and changes status usage to pass a status-only plugin-auth skip option.

PR surface: Source +33, Tests +161. Total +194 across 6 files.

Reproducibility: yes. at source level: current main awaits resolveProviderAuths before any timeout boundary, and the linked report gives a concrete non-TTY subprocess command. I did not run the live hang reproduction in this read-only review.

Review metrics: 1 noteworthy metric.

  • Status usage auth caller: 1 caller changed. Status is a machine-readable provider usage surface, so changing plugin-auth eligibility can affect existing provider output before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #74085
Summary: This PR is the candidate fix for the linked non-TTY status usage JSON hang; adjacent status usage PRs share the surface but repaired different Codex/proxy behavior.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

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

Rank-up moves:

  • Rebase against current main and preserve Codex synthetic status usage plus proxy-aware provider usage loading.
  • Remove or explicitly owner-justify the status-only auth-hook skip gate with proof for existing provider usage output.
  • [P2] Run the focused provider-usage/status tests and formatter command after the repair.

Risk before merge

  • [P1] The branch is currently dirty/conflicting and predates current-main Codex synthetic status usage plus proxy-aware provider usage loading, so repair must carry those paths forward before merge.
  • [P1] The status-only skipPluginAuthWithoutCredentialSource opt-in can silently omit provider usage when auth is resolved by provider-owned plugin hooks that core cannot infer as credential-backed.

Maintainer options:

  1. Keep Timeout, Preserve Current Status Auth (recommended)
    Rebase onto current main, keep the auth-resolution timeout and warning, preserve Codex synthetic and proxy-aware usage paths, and remove the status-only auth-hook skip gate unless owners explicitly approve it.
  2. Accept The Status Skip As Policy
    Provider/auth owners may keep the status-only skip gate, but the PR should document the compatibility choice and prove existing provider usage output is not unexpectedly lost.
  3. Pause For Auth Surface Direction
    If maintainers are not ready to decide whether status should skip provider usage auth hooks, pause this PR until that policy is explicit.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Keep the provider auth-resolution timeout and warning in src/infra/provider-usage.load.ts. Repair the branch against current main while preserving current status Codex synthetic usage and proxy-aware provider usage loading. Remove the status-only skipPluginAuthWithoutCredentialSource opt-in unless maintainers provide explicit owner approval. Run node scripts/run-vitest.mjs src/infra/provider-usage.load.test.ts src/infra/provider-usage.auth.plugin.test.ts src/commands/status-runtime-shared.test.ts src/infra/provider-usage.load.plugin.test.ts and pnpm exec oxfmt --check --threads=1 src/commands/status-runtime-shared.ts src/commands/status-runtime-shared.test.ts src/infra/provider-usage.auth.ts src/infra/provider-usage.auth.plugin.test.ts src/infra/provider-usage.load.ts src/infra/provider-usage.load.test.ts. Do not edit CHANGELOG.md.

Next step before merge

  • [P2] A narrow repair is appropriate because the timeout fix is clear and the remaining blockers are concrete status/provider-usage edits.

Security
Cleared: No concrete security or supply-chain issue was found; the auth-sensitive concerns are functional compatibility risks in provider usage resolution.

Review findings

  • [P1] Rebase without dropping current status usage paths — src/commands/status-runtime-shared.ts:72-77
  • [P1] Preserve status usage auth hooks by default — src/commands/status-runtime-shared.ts:76
Review details

Best possible solution:

Land a rebased timeout-and-warning patch on current main that leaves default status auth-hook eligibility unchanged and preserves Codex synthetic plus proxy-aware usage behavior.

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

Yes at source level: current main awaits resolveProviderAuths before any timeout boundary, and the linked report gives a concrete non-TTY subprocess command. I did not run the live hang reproduction in this read-only review.

Is this the best way to solve the issue?

No as currently written. The timeout boundary is the right layer, but the branch must be rebased onto current main and should not change status auth-hook eligibility without owner approval and compatibility proof.

Full review comments:

  • [P1] Rebase without dropping current status usage paths — src/commands/status-runtime-shared.ts:72-77
    The PR head still has the old single-call status usage helper, while current main first loads normal usage and then merges Codex synthetic OpenAI usage for configured OpenAI Codex runtime routes. Repair the branch against current main so the timeout fix preserves that status output and the current proxy-aware provider usage loader.
    Confidence: 0.91
  • [P1] Preserve status usage auth hooks by default — src/commands/status-runtime-shared.ts:76
    Passing skipPluginAuthWithoutCredentialSource from status changes provider-owned usage auth hook eligibility. If core cannot infer a credential source, the provider hook can be skipped before it has a chance to resolve auth, so keep the timeout boundary without this status-only skip unless provider owners approve and proof covers existing providers.
    Confidence: 0.9

Overall correctness: patch is incorrect
Overall confidence: 0.92

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 5361e5a0b455.

Label changes

Label justifications:

  • P2: This is a normal-priority CLI/status automation regression fix with limited but real impact on provider usage visibility.
  • merge-risk: 🚨 compatibility: The PR changes status usage auth-hook eligibility and is currently dirty against current-main status usage behavior.
  • merge-risk: 🚨 auth-provider: The diff changes provider usage auth resolution and status caller behavior around OAuth, profile, and plugin auth.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body and follow-up comment provide redacted live terminal output from a non-TTY status usage JSON subprocess showing successful completion, parseable JSON, and a usage object after the fix.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body and follow-up comment provide redacted live terminal output from a non-TTY status usage JSON subprocess showing successful completion, parseable JSON, and a usage object after the fix.
Evidence reviewed

PR surface:

Source +33, Tests +161. Total +194 across 6 files.

View PR surface stats
Area Files Added Removed Net
Source 3 34 1 +33
Tests 3 164 3 +161
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 6 198 4 +194

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs src/infra/provider-usage.load.test.ts src/infra/provider-usage.auth.plugin.test.ts src/commands/status-runtime-shared.test.ts src/infra/provider-usage.load.plugin.test.ts.
  • [P1] pnpm exec oxfmt --check --threads=1 src/commands/status-runtime-shared.ts src/commands/status-runtime-shared.test.ts src/infra/provider-usage.auth.ts src/infra/provider-usage.auth.plugin.test.ts src/infra/provider-usage.load.ts src/infra/provider-usage.load.test.ts.
  • [P1] git diff --check.

What I checked:

  • AGENTS.md read and applied: Root policy was read fully and applied; provider routing, auth behavior, plugin hooks, fallback behavior, and whole status decision surfaces are compatibility-sensitive for review. (AGENTS.md:27, 5361e5a0b455)
  • Scoped policy check: No scoped AGENTS.md owns src/commands or src/infra directly, so the root policy governs the touched paths. (5361e5a0b455)
  • Live PR state: GitHub reports the PR open, non-draft, head 5e0acee, and merge state dirty/conflicting. (5e0acee49b78)
  • Current-main timeout gap: Current main still awaits resolveProviderAuths before the per-provider fetch timeout boundary, so a never-settling auth hook can block usage loading at source level. (src/infra/provider-usage.load.ts:101, 5361e5a0b455)
  • PR timeout implementation: The PR head wraps resolveProviderAuths in withTimeout, tracks timeout as a typed result, warns, and returns an empty provider list on auth timeout. (src/infra/provider-usage.load.ts:112, 5e0acee49b78)
  • Current-main status behavior to preserve: Current main loads normal usage and then conditionally merges Codex synthetic OpenAI usage for configured OpenAI Codex runtime routes. (src/commands/status-runtime-shared.ts:135, 5361e5a0b455)

Likely related people:

  • steipete: Introduced provider usage runtime hooks and consolidated status runtime helpers that this PR touches. (role: feature introducer / adjacent owner; confidence: high; commits: e7555724af15, 88aa81422653; files: src/infra/provider-usage.load.ts, src/infra/provider-usage.auth.ts, src/commands/status-runtime-shared.ts)
  • brokemac79: Authored merged Codex synthetic status usage repairs that current main must preserve while this timeout branch is repaired. (role: recent status usage contributor; confidence: high; commits: 1893a0727a37, a0b397748fa3; files: src/commands/status-runtime-shared.ts, src/status/codex-synthetic-usage.ts, src/infra/provider-usage.load.plugin.test.ts)
  • TurboTheTurtle: Authored the merged proxy-aware provider usage loading change in the same loader this PR modifies. (role: recent adjacent contributor; confidence: medium; commits: 0a9b1526ac3f; files: src/infra/provider-usage.load.ts, src/infra/provider-usage.load.plugin.test.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.

@yelog
yelog force-pushed the fix/status-json-usage-auth-timeout-74085 branch 2 times, most recently from d619d4d to 680d2cd Compare May 5, 2026 03:16
@openclaw-barnacle openclaw-barnacle Bot added commands Command implementations size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed size: S labels May 10, 2026
@yelog
yelog force-pushed the fix/status-json-usage-auth-timeout-74085 branch from 889bbc8 to 9852b63 Compare May 19, 2026 03:38
@yelog

yelog commented May 19, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto latest origin/main and resolved the status usage conflicts while preserving the scoped agent auth lookup, auth-resolution timeout, and status --usage no-refresh behavior.

Validation on the rebased branch:

node scripts/run-vitest.mjs src/infra/provider-usage.load.test.ts src/infra/provider-usage.auth.plugin.test.ts src/commands/status-runtime-shared.test.ts
pnpm exec oxfmt --check --threads=1 CHANGELOG.md src/commands/status-runtime-shared.ts src/commands/status-runtime-shared.test.ts src/commands/status.command.ts src/infra/provider-usage.auth.plugin.test.ts src/infra/provider-usage.auth.ts src/infra/provider-usage.load.test.ts src/infra/provider-usage.load.ts

The first formatter attempt was interrupted while pnpm retried optional binary downloads from the configured registry; retrying the same formatter command passed.

Remaining merge gate: I still need to add redacted real behavior proof from a non-TTY openclaw status --usage --json subprocess showing the fixed command completes.

@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: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels May 19, 2026
@yelog

yelog commented May 19, 2026

Copy link
Copy Markdown
Contributor Author

After-fix real behavior proof from the PR branch, redacted to command status and JSON shape only.

Behavior addressed: non-TTY status --usage --json should complete instead of hanging while provider usage auth is resolved.
Real environment tested: local OpenClaw source checkout on branch fix/status-json-usage-auth-timeout-74085, head 9852b6356b6a8369bc4f9e19b71745466d6103c5.
Exact steps or command run after this patch:

node -e '<script uses child_process.spawnSync("node", ["scripts/run-node.mjs", "status", "--usage", "--json"], { timeout: 45000, encoding: "utf8", non-TTY stdio capture }) and prints only exit status, elapsed time, JSON parse status, top-level keys, and usage summary shape>'

Evidence after fix:

{
  "branch": "fix/status-json-usage-auth-timeout-74085",
  "head": "9852b6356b6a8369bc4f9e19b71745466d6103c5",
  "command": "node scripts/run-node.mjs status --usage --json",
  "nonTty": true,
  "exitStatus": 0,
  "signal": null,
  "timedOut": false,
  "elapsedMs": 6513,
  "stdoutBytes": 2757,
  "stderrBytes": 0,
  "parsedJson": true,
  "topLevelKeys": [
    "agents",
    "channelSummary",
    "gateway",
    "gatewayService",
    "heartbeat",
    "lastHeartbeat",
    "memory",
    "memoryPlugin",
    "nodeService",
    "os",
    "queuedSystemEvents",
    "runtimeVersion",
    "secretDiagnostics",
    "sessions",
    "taskAudit",
    "tasks",
    "update",
    "updateChannel",
    "updateChannelSource",
    "usage"
  ],
  "hasUsage": true,
  "usageKeys": [
    "providers",
    "updatedAt"
  ],
  "usageProviders": 1,
  "stderrPreview": []
}

Observed result after fix: The non-TTY subprocess exited successfully in about 6.5s, did not hit the 45s timeout, emitted parseable JSON on stdout, and included a top-level usage object with provider usage data.
What was not tested: This was a local source checkout proof rather than a packaged install, and it does not print provider names, auth profiles, credentials, or raw usage values.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. 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 May 19, 2026
@giodl73-repo giodl73-repo removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 21, 2026
@clawsweeper clawsweeper Bot added status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 2, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 19, 2026
yelog added 9 commits June 22, 2026 15:01
…ge --json

resolveProviderAuths was called without any timeout boundary, so plugin
auth hooks (OAuth token refresh, secret exec resolvers) could hang
indefinitely in non-TTY subprocess contexts. Wrap the call in the
existing withTimeout helper using the same timeoutMs budget so the
status JSON command returns empty providers on auth timeout instead of
hanging.

Fixes openclaw#74085
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 22, 2026
@yelog
yelog force-pushed the fix/status-json-usage-auth-timeout-74085 branch from 7769734 to 5e0acee Compare June 22, 2026 07:23
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 28, 2026
@yelog

yelog commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

Closing this candidate without marking #74085 fixed. It is 7,115 commits behind current main, conflicts in the status/provider-usage surface, and its timeout returns an empty fallback without cancelling the in-flight auth work. The current OpenAI request timeout does not cover arbitrary provider/auth hooks. If the problem reproduces on current OpenClaw, please open a fresh report with a current non-TTY repro; a replacement must propagate cancellation/deadline to the actual auth operation and preserve current status usage paths.

@yelog yelog closed this Jul 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

commands Command implementations merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: M 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.

Bug: openclaw status --usage --json hangs/fails from non-TTY subprocess in 2026.4.26

2 participants