Conversation
Bound the ambient refresh wait without cancelling the provider request, and refresh the adapter independently when a stalled predecessor delays that read. Keep credential transactions serialized through the current adapter list. Adopts #3750 with a bounded join instead of a task group that still waits for its suspended child. Refs #3736. Co-authored-by: keepitmello <keepitmello@users.noreply.github.com>
Name the disabled Keychain setting without changing credential precedence or prompt policy. Keep active subscription identity and an unavailable-quota note when subs_usage is omitted or null, while rejecting malformed payloads. Share snapshot fields and remove redundant credential checks. Adopts #3772. Verified with synthetic credentials and both plugin engines. Co-authored-by: oldcai <hi@oldcai.com>
Route USD conversion through the existing pivot and remove one-use cache and rate wrappers. Preserve public initialization, normalized currency codes, cached-rate precedence, and locking. Use in-memory defaults for offline fallback and cache coverage. Follow-up cleanup for the converter reviewed in #3624, whose TRY support is already on main. No currency behavior changes are intended. Co-authored-by: aguvener <90110302+aguvener@users.noreply.github.com>
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs maintainer review before merge. Reviewed September 21, 2026, 3:25 AM ET / 07:25 UTC. ClawSweeper reviewWhat this changesThe branch bounds Claude account-switch refresh waits, improves Muse login diagnostics and missing-quota handling, and consolidates currency conversion and cache access. Merge readiness✅ Ready for maintainer review The fixes remain useful: current main still waits indefinitely for ambient Claude refresh and rejects windowless Muse subscriptions. No blocking defect was found in the introduced changes. This owner-authored PR is not eligible for cleanup closure. Priority: P2 Review scores
Verification
How this fits togetherCodexBar turns provider credentials, usage responses, and exchange rates into menu-bar account status and spending displays. Claude switching reconciles an external account adapter with ambient usage, while Muse parses subscription responses through its bundled provider plugin. flowchart TD
A[Account switch] --> B[Serialized adapter activation]
B --> C[Bounded ambient refresh wait]
C --> D[Adapter reconciliation]
D --> G[Account and usage display]
E[Muse login and subscription response] --> G
F[Cached or live currency rates] --> H[Converted spending display]
Before mergeNone. Agent review detailsSecurityNone. Review metrics
Technical reviewBest possible solution: Keep account activation serialized through adapter reconciliation while allowing slow ambient usage to finish independently, and display unavailable Muse quota honestly without changing credential selection. Do we have a high-confidence way to reproduce the issue? Yes, from source: suspend ambient Claude refresh after activation, or supply an active Muse response with omitted/null quota windows. Current main exposes both failure paths; this read-only review did not execute them. Is this the best way to solve the issue? Yes. Reusing the bounded join avoids structured-task timeout draining, preserves adapter serialization, and keeps Muse recovery within existing credential and parser boundaries. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against ec12a0243d2a. LabelsLabel changes:
Label justifications:
EvidenceWhat I checked:
Likely related people:
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
|
Bound the ambient refresh wait without cancelling the provider request, and refresh the adapter independently when a stalled predecessor delays that read. Keep credential transactions serialized through the current adapter list. Adopts #3750 with a bounded join instead of a task group that still waits for its suspended child. Refs #3736. Co-authored-by: keepitmello <keepitmello@users.noreply.github.com> (cherry picked from commit b73c145)
Name the disabled Keychain setting without changing credential precedence or prompt policy. Keep active subscription identity and an unavailable-quota note when subs_usage is omitted or null, while rejecting malformed payloads. Share snapshot fields and remove redundant credential checks. Adopts #3772. Verified with synthetic credentials and both plugin engines. Co-authored-by: oldcai <hi@oldcai.com> (cherry picked from commit 4d8a9ab)
Route USD conversion through the existing pivot and remove one-use cache and rate wrappers. Preserve public initialization, normalized currency codes, cached-rate precedence, and locking. Use in-memory defaults for offline fallback and cache coverage. Follow-up cleanup for the converter reviewed in #3624, whose TRY support is already on main. No currency behavior changes are intended. Co-authored-by: aguvener <90110302+aguvener@users.noreply.github.com> (cherry picked from commit f8052f9)
A stalled ambient Claude refresh could leave claude-swap account chips disabled after activation. This bounds that wait to five seconds while preserving adapter-list reconciliation, serialized credential transactions, and late ambient results. A subsequent switch can reconcile its adapter even when its ambient refresh is queued behind a stalled predecessor. The task-group timeout proposed in #3750 was rewritten to use the existing bounded join, because a task group still waits for a suspended child.
Muse now names Disable Keychain access when it blocks a Keychain-only login. Active subscriptions with omitted or null
subs_usageretain plan/identity and an unavailable-quota note; malformed quota payloads still fail. Credential precedence and no-prompt behavior are preserved. Thanks @keepitmello and @oldcai!TRY support from @aguvener is already on main in
ec12a0243d2a(#3624). The currency follow-up only shares the existing conversion path and removes redundant private rate/cache wrappers, with isolated offline fallback/cache tests. Production code is net −5 lines (6 files changed, 75 insertions(+), 80 deletions(-)); tests are5 files changed, 168 insertions(+), 2 deletions(-).Verification
Final rebased branch:
Results: 352 tests in 27 suites, 99 portable plugin tests in 10 suites, and 14 CLI swap tests passed. XCTest reported 10 passing tests and 3 skipped opt-in native UI proofs.
make checkpassed with 0 violations in 2,517 files. Independent reviews of Claude, Muse, and the complete rebased branch found no actionable P0–P2 issues.Regression checks, run before their production fixes:
Claude: 3 existing tests passed; the 2 new tests failed with 3 issues while the ambient probe stayed suspended. Muse: 16 tests passed; the 2 new behavior tests failed with 6 issues. Both regressions pass after the fixes. An initial broad concurrent Claude run hit 23 timing issues in 3 existing subprocess tests; the repository-standard serial rerun and final run passed.
All account proof uses synthetic adapters, credentials, responses, or in-memory defaults. No real account probes, Keychain prompts, cookie imports, or app relaunches were used. Bundled Muse JavaScript was regenerated with
Scripts/regenerate-plugin-js.sh --write.Closes #3750
Closes #3772
Refs #3736
Refs #3624