Repository navigation
Continue a usage-limited chat with another account or agent - #31241
brennanb2025 wants to merge 79 commits into
Conversation
…ore its next message A running chat's agent read its account only when it started, and nothing compared it with the account a start would use now, so open chats kept answering on the old account after a switch. The agent a chat runs now records the account its launch used, and the host's replace-before-the- next-send check replaces an idle one whose account is no longer what a start would use. A chat mid-reply finishes on the old account first. Claude chats follow; agents whose chats keep the account they were created on are never compared. A chat's model-list reads and saves now use the account it runs on, so a moved chat no longer writes its new account's list under its first account (STA-11281). Tracked in STA-11211.
…er that wires the host
|
A chat that reaches its usage limit should offer the ways to keep working beside the warning. This PR adds account actions on the chat's host and Hand Off to Another Agent. Continue Now appears only after the provider's reported reset time has passed; it stays hidden when no reset time is known. Switching accounts does not send anything: the next message you send uses the selected account. The account action reuses the existing switcher after the host verifies that this chat's saved history is available to every native account destination. With at most one signed-in account, a local chat opens Add Account…; a paired chat offers Hand Off only. Isolated or unverified history also offers Hand Off only. Add and Manage open the chat host's native account view without changing the saved Windows/WSL preference. Explicit location choices and ordinary Settings/sidebar navigation restore the normal preference. Hand Off excludes launch modes of the same CLI, uses the source workspace and opens the existing chooser. The final repair removes excluded source-family rows from the actual menu as well as its selection, search and terminal paths, tracked in STA-13138. Its new branch-only screenshot is recorded in the scoped picker evidence below. With no alternative available, Start is disabled. A Claude destination opens an editable draft that still requires Send. File-backed chats intentionally pass their existing live native file, with no export or snapshot file. Database-backed chats pass accurately labelled recent loaded messages; full saved history there remains a temporary limitation tracked in STA-11454. Older hosts safely omit the two optional read-only recovery fields and use the recent-message fallback. Nothing is saved for these fields and no minimum server version changes. Six source-review rounds are complete, including the reset timer fix verification. The review fixed account-destination proof, repeated filesystem discovery, stale hand-off preparation, paired roster updates, native Windows account navigation, same-CLI exclusion, missing native-file admission and source-directory ownership. Reset eligibility now uses current wall time and a capped boundary timer with cleanup. The shorter warning copy is intended, retaining the sentence removal in #33392 and the October 25 reset-time ruling; manual composer sends remain available. Final reviewed and pushed head is
Before integration, the reset delta passed56 focused renderer tests. No runtime latency claim is made by these count contracts. Current-head CI for Final scoped picker evidence — ticket3789 Production Hand Off picker screenshot. Local image: The scoped picker evidence audit passed: exact The audited production imports/styles and declared inventory are limited to this CLI-only renderer fixture. The primary screenshot was directly inspected. The nonempty flow is unchanged through What was exercised and carried forward Real-agent evidence is carried from
Quota failures were declared success-bound replay fixtures, not natural account exhaustion. Agent replies, recorded file reads and UI actions were real. Raw JSONL reads sometimes truncated; successful follow-up extraction is identified separately. Empty nongit-workspace searches returned exit 1 while original-file reads succeeded. The initial long-history setup repeated its probe and did not establish beyond-tail coverage; the later fact-free source/tail measurements and real destination did. No extra agent rounds are claimed for UI/Settings, saved-unlisted choice or controlled-delay experiments: those use CI/renderer contracts under the QA classification. Controlled-delay seams were unavailable, native-picker interaction was not tested, and no live Windows/WSL run is claimed. Actual successful agents in these accepted records are Claude, Codex, OpenCode, OMP and Pi, with Pi's narrower scope above. Separately registered OpenCode2 was not exercised: only its installed Account sign-in completion and repeated switcher testing waived by Brennan (October 22): “Why do I need four claude sign ins??? Isn't this reusing this existing claude switcher? This doesn't need to be tested if reusing the same code”. That repeated batch was cancelled; it is not a new pass or a blanket waiver for other agents/flows. The earlier real managed 1->2->1 evidence remains accepted. Local Add/Manage, paired Accounts routing/parity and loading behavior use renderer/source contracts and the existing screenshots; earlier routing-only attempts established ordinary local Accounts but did not complete eligible quota-row routing or parity. A listed OMP model inspection did not prove saved-unlisted continuity. The later Stop-only attempt never reached a source request; its cleanup also left the disposable QA profile's OMP command at Deferred and inherited observations A failed Windows Account Location settings write can end the temporary native-account view even though the preference was not saved; reopen chat Add/Manage or retry the location choice. This low-impact failure case is deferred, tracked in STA-13139. The final repair removes repeated retained-chat tab scans by reusing the existing index. Account menus share one observed host stream and stable provider results, keeping unchanged Claude menus quiet during Codex/other-host updates; explicit reloads remain fresh. Operation and render contracts cover100/1000 retained chats and10/100 account readers, including real producer counts, meaningful updates and cleanup. No measured latency claim is made. Clicking Accounts in the Settings sidebar intentionally returns to the ordinary saved view, including when Accounts is already selected; it writes no preference. Source-family exclusion can leave misleading existing “No enabled Agents” copy when only excluded modes are detected. This copy-only P2 is assigned and parented as STA-13153, deferred without changing the settled exclusion policy. Genuinely empty-host feedback is separately fixed by Historical observations were tracked separately: STA-11573 recorded draft loss after restart on the old main build and is now Done; this review does not claim it remains on current main. STA-11589, STA-11590, and STA-11596 recorded missing-file wording, a generic OpenCode quota error and delayed dialog layout shift. Those historical QA reports are not current-head reproductions or newly asserted blockers. The separate socket-test flake was fixed in #31520. Intermittent History zero counts/previews, workspace labels, loading/connecting and renderer observations did not establish a PR cause or data loss; they are not silently promoted to passes or repaired here. All accepted selected packets retained independent exact-file/byte/hash checks and their original provenance limits. Cleanup records support recorded owned processes stopped and assigned ports clear; they are bounded inventories, not every machine process. Temporary trust-key restoration preserved the other checked data; genuine histories stayed. Real config hash changes during concurrent QA had unknown attribution, and no contents were read/copied/restored. The reset evidence audit accepts the two screenshots and 27 payload hashes, with runtime full-head/isolation details beyond receipts remaining lead attestations. Ticket2437's later check found six recorded PIDs absent/ports clear; the targeted retry2151 found 58 recorded identities absent. Earlier cleanup/setup failures remain historical limitations, not successful flow evidence. For Brennan's review The reset fixture before/after frames are the current presentation evidence; earlier UI captures below deliberately retain their historic build labels. All carried screenshots are retained here with their original scope: Three code spots for judgment: reset-time shortcut, owning-host file and account proof, chat-owned Accounts visit. |
…eceiving fixtures Main now resolves a worker start lazily through bindRun with objective and task references, and creating a Run no longer unbinds a coordinator's earlier Runs; run-use does. The receiving fixtures follow the same production owners so every original scenario, input and bound is exercised unchanged. The receiving runtime subclass moves verbatim into its own support module. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A live Claude chat compared its account against the selected one only after that account's folder passed an availability check, so an account still being set up (or whose setup failed) left the chat silently answering on the previous account, and a resting chat refused its start before preparation could run. The retirement comparison and the start pre-read now ask the router for the selected route as identity, through the existing resolver purposes; catalog, create and probe reads keep checking availability. Preparation, typed launch failure and parking are unchanged. Session History details show the account a chat was last launched under when the host recorded one, else its founding home. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…sertion The History account case now reads the fixture receipt through the typed acquisition reader instead of spreading the record field through a cast; the three assertions and their inputs are unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The account-setup cases spread an optional link, which typed its id as possibly undefined; the rig always links a handle, so a guard that cannot fire narrows it. No assertion or input changes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… the History account projection Chat admission no longer reads an experimental host setting, so the continuation-context test drops the spy main dropped in its own fixtures. The two History consumers that install a minimal chat host give their fake store the record accessor and host id the real store has, since the projection now reads the acquisition receipt. An operation-count contract holds the production History projection to one roster read and one record lookup per owned row at 10 and 100 rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…port The declared-effort fixture builds a catalog service without the capture member the options reader asks every catalog for, which failed its desktop, catalog and phone consumers; it now supplies the inert test operation like the other fakes. The History projection contract also drops an unused map parameter. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ted worktree visibility
…split at-rest suites Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Main's keyed journal records deliver each change after an epoch's frozen prefix as an outcome sequence naming touched keys instead of typed rows. The receiving-account index now re-reads those keys at their current values: queue cards by id, a deleted submission retires its exact notice, and a deleted item drives the existing recovery rebuild, with Stop marks still excluded. The in-process read row exposes the already-persisted queue.cards keys and per-key deletion facts; itemIds and submissionIds keep listing every touched key. The mobile unknown-consumer test mocks MobileSwitch as main's picker test does. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…2025/usage-limit-actions # Conflicts: # src/main/claude-accounts/claude-profile-router.ts # src/main/claude/claude-structured-launch-home.ts # src/main/native-chat/agent-session-wire/structured-agent-session-options-read.test.ts # src/main/native-chat/agent-session-wire/structured-agent-session-options-read.ts # src/main/native-chat/structured-agent-cli-conversations.ts # src/main/opencode/opencode-transcript-import.ts # src/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.test.tsx # src/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.tsx # src/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsx # src/renderer/src/components/native-chat/NativeChatNoticeRow.test.tsx # src/renderer/src/components/native-chat/NativeChatNoticeRow.tsx # src/renderer/src/components/native-chat/NativeChatStructuredSession.tsx # src/renderer/src/components/native-chat/use-structured-agent-session-option-state.ts # src/renderer/src/components/native-chat/use-structured-agent-session-options.ts # src/renderer/src/components/settings/AccountsPane.owner-scope.test.tsx # src/renderer/src/components/settings/chat-settings-unsaved-guard.test.tsx # src/renderer/src/components/status-bar/ClaudeSwitcherMenu.tsx # src/renderer/src/i18n/locales/en.json # src/renderer/src/i18n/locales/es.json # src/renderer/src/i18n/locales/fr.json # src/renderer/src/i18n/locales/ja.json # src/renderer/src/i18n/locales/ko.json # src/renderer/src/i18n/locales/zh.json # src/renderer/src/lib/settings-navigation-types.ts
…mit-actions # Conflicts: # src/main/claude-accounts/claude-profile-router.ts # src/renderer/src/i18n/locales/en.json # src/renderer/src/i18n/locales/es.json # src/renderer/src/i18n/locales/fr.json # src/renderer/src/i18n/locales/ja.json # src/renderer/src/i18n/locales/ko.json # src/renderer/src/i18n/locales/zh.json
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review.
|
There was a problem hiding this comment.
Actionable comments posted: 2

Review info
-
Run configuration-
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
76af7cb4-75af-4148-a0a7-c8ce9a8a8f87
Files selected for processing: 80-
src/main/claude-accounts/claude-launch-routing.test.tssrc/main/claude-accounts/claude-profile-router.tssrc/main/claude-accounts/claude-profile-selection-homes.tssrc/main/claude/claude-launch-destination-home.tssrc/main/claude/claude-structured-launch-account-routing.test.tssrc/main/claude/claude-structured-launch-home.tssrc/main/claude/claude-structured-launch-resolution.tssrc/main/claude/claude-structured-session-acquisition.tssrc/main/claude/claude-structured-session-publication.tssrc/main/native-chat/agent-model-catalog/agent-model-catalog-fingerprint.tssrc/main/native-chat/agent-model-catalog/agent-model-catalog-prewarm.test.tssrc/main/native-chat/agent-model-catalog/agent-model-catalog-running-account.tssrc/main/native-chat/agent-model-catalog/agent-model-catalog-service.tssrc/main/native-chat/agent-session-wire/structured-agent-session-acquisition.tssrc/main/native-chat/agent-session-wire/structured-agent-session-adapter.tssrc/main/native-chat/agent-session-wire/structured-agent-session-attach-flow.tssrc/main/native-chat/agent-session-wire/structured-agent-session-attach-orchestration.tssrc/main/native-chat/agent-session-wire/structured-agent-session-attach-publish.tssrc/main/native-chat/agent-session-wire/structured-agent-session-host-delivery.tssrc/main/native-chat/agent-session-wire/structured-agent-session-host-types.tssrc/main/native-chat/agent-session-wire/structured-agent-session-host.tssrc/main/native-chat/agent-session-wire/structured-agent-session-options-read.test.tssrc/main/native-chat/agent-session-wire/structured-agent-session-options-read.tssrc/main/native-chat/agent-session-wire/structured-agent-session-outgrown-child.test.tssrc/main/native-chat/agent-session-wire/structured-agent-session-outgrown-child.tssrc/main/native-chat/agent-session-wire/structured-agent-session-recovery-read.test.tssrc/main/native-chat/agent-session-wire/structured-agent-session-recovery-read.tssrc/main/native-chat/structured-agent-cli-conversations.tssrc/main/opencode/opencode-transcript-import.tssrc/main/runtime/rpc/methods/structured-agent-session-options-read.tssrc/main/runtime/session-tabs/structured-session-account-home.tssrc/main/runtime/structured-agent-model-catalog-wiring.tssrc/main/runtime/structured-agent-runtime-metadata.tssrc/main/runtime/structured-agent-runtime-registration-types.tssrc/main/runtime/structured-agent-session-runtime.tssrc/main/runtime/structured-session-recovery-options.test.tssrc/main/runtime/structured-session-recovery-options.tssrc/main/runtime/workspaces/workspace-process-listing-dependencies.tssrc/main/runtime/workspaces/workspace-process-listing.tssrc/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.test.tsxsrc/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.tsxsrc/renderer/src/components/agent-session-continuation/agent-session-continuation-selection.tssrc/renderer/src/components/native-chat/NativeChatInterruptedContinue.tsxsrc/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsxsrc/renderer/src/components/native-chat/NativeChatNoticeRow.test.tsxsrc/renderer/src/components/native-chat/NativeChatNoticeRow.tsxsrc/renderer/src/components/native-chat/NativeChatStructuredSession.tsxsrc/renderer/src/components/native-chat/NativeChatUsageLimitActions.test.tsxsrc/renderer/src/components/native-chat/NativeChatUsageLimitActions.tsxsrc/renderer/src/components/native-chat/use-structured-agent-session-option-state.tssrc/renderer/src/components/native-chat/use-structured-agent-session-options.tssrc/renderer/src/components/native-chat/use-structured-agent-session.tssrc/renderer/src/components/settings/AccountsPane.owner-scope.test.tsxsrc/renderer/src/components/settings/AccountsPane.tsxsrc/renderer/src/components/settings/accounts-pane-location-section.tsxsrc/renderer/src/components/settings/accounts-pane-types.tssrc/renderer/src/components/settings/chat-settings-unsaved-guard.test.tsxsrc/renderer/src/components/settings/settings-capability-section-renderers.tsxsrc/renderer/src/components/settings/settings-view-model.tssrc/renderer/src/components/settings/use-settings-host-navigation.tssrc/renderer/src/components/settings/use-settings-page-effects.tssrc/renderer/src/components/settings/use-settings-store-model.tssrc/renderer/src/components/status-bar/ClaudeSwitcherMenu.tsxsrc/renderer/src/components/status-bar/ProviderAccountChatButton.tsxsrc/renderer/src/components/status-bar/ProviderDetailsMenu.tsxsrc/renderer/src/components/status-bar/claude-status-sign-in.test.tsxsrc/renderer/src/components/status-bar/status-bar-claude-accounts.tssrc/renderer/src/components/status-bar/use-provider-account-list.tssrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/lib/agent-session-continuation.tssrc/renderer/src/lib/settings-navigation-types.tssrc/shared/agent-session-account-home.tssrc/shared/agent-session-options-result.tssrc/shared/telemetry-property-schemas.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 5 remain after this review.
-
There was a problem hiding this comment.
Actionable comments posted: 2

Review info
-
Run configuration-
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
a118121c-b7ee-46d8-a8c2-029c7aab7440
Files selected for processing: 41-
src/main/claude-accounts/claude-account-usage-preparation.tssrc/main/claude-accounts/claude-launch-routing.test.tssrc/main/claude-accounts/claude-profile-router.tssrc/main/native-chat/agent-session-wire/structured-agent-session-options-read.tssrc/main/native-chat/agent-session-wire/structured-agent-session-recovery-read.tssrc/main/native-chat/structured-agent-cli-conversations.tssrc/main/opencode/opencode-transcript-import.tssrc/main/runtime/rpc/methods/structured-agent-session-options-read.tssrc/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.test.tsxsrc/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.tsxsrc/renderer/src/components/agent-session-continuation/agent-session-continuation-selection.tssrc/renderer/src/components/native-chat/NativeChatInterruptedContinue.tsxsrc/renderer/src/components/native-chat/NativeChatMessageList.turn-status.test.tsxsrc/renderer/src/components/native-chat/NativeChatNoticeRow.test.tsxsrc/renderer/src/components/native-chat/NativeChatNoticeRow.tsxsrc/renderer/src/components/native-chat/NativeChatStructuredSession.tsxsrc/renderer/src/components/native-chat/NativeChatUsageLimitActions.tsxsrc/renderer/src/components/native-chat/use-structured-agent-session-option-state.tssrc/renderer/src/components/native-chat/use-structured-agent-session-options.tssrc/renderer/src/components/native-chat/use-structured-agent-session.tssrc/renderer/src/components/settings/AccountsPane.owner-scope.test.tsxsrc/renderer/src/components/settings/AccountsPane.tsxsrc/renderer/src/components/settings/settings-capability-section-renderers.tsxsrc/renderer/src/components/settings/settings-view-model.tssrc/renderer/src/components/settings/use-settings-page-effects.tssrc/renderer/src/components/settings/use-settings-store-model.tssrc/renderer/src/components/status-bar/ClaudeSwitcherMenu.tsxsrc/renderer/src/components/status-bar/ProviderDetailsMenu.tsxsrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/lib/agent-session-continuation.tssrc/renderer/src/lib/settings-navigation-types.tssrc/renderer/src/lib/structured-agent-session-selection-lifetime.test.tsxsrc/shared/agent-session-options-result.tssrc/shared/structured-agent-session-options-read-owner.test.tssrc/shared/structured-agent-session-options-read-owner.ts
Files skipped from review as they are similar to previous changes: 7-
- src/renderer/src/i18n/en-runtime-required.json
- src/renderer/src/i18n/locales/en.json
- src/renderer/src/i18n/locales/zh.json
- src/renderer/src/i18n/locales/es.json
- src/renderer/src/i18n/locales/ja.json
- src/renderer/src/i18n/locales/fr.json
- src/renderer/src/i18n/locales/ko.json
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 2 remain after this review.
-
There was a problem hiding this comment.
Actionable comments posted: 1

Review info
-
Run configuration-
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
0090a89e-a5ac-4054-aad1-305bdcaca540
Files selected for processing: 18-
src/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.test-fixture.tsxsrc/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.test.tsxsrc/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.tsxsrc/renderer/src/components/native-chat/NativeChatNoticeRow.test.tsxsrc/renderer/src/components/native-chat/NativeChatUsageLimitActions.scaling.test.tsxsrc/renderer/src/components/native-chat/NativeChatUsageLimitActions.test.tsxsrc/renderer/src/components/native-chat/NativeChatUsageLimitActions.tsxsrc/renderer/src/components/status-bar/ClaudeSwitcherForOwner.tsxsrc/renderer/src/components/status-bar/ClaudeSwitcherMenu.observation.test.tsxsrc/renderer/src/components/status-bar/ClaudeSwitcherMenu.owner-lifetime.test.tsxsrc/renderer/src/components/status-bar/ClaudeSwitcherMenu.tsxsrc/renderer/src/components/status-bar/provider-account-sync-key.tssrc/renderer/src/components/status-bar/status-bar-claude-accounts.tssrc/renderer/src/components/status-bar/use-claude-switcher-state.tssrc/renderer/src/components/status-bar/use-provider-account-list.tssrc/renderer/src/runtime/observed-provider-accounts.test.tsxsrc/renderer/src/runtime/observed-provider-accounts.tssrc/renderer/src/runtime/provider-account-observation.test-fixture.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.
-
There was a problem hiding this comment.
Actionable comments posted: 1

Review info
-
Run configuration-
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
ccd6ddc6-22e5-441b-aedc-800094fd7a7c
Files selected for processing: 3-
src/renderer/src/components/status-bar/use-provider-account-list.tssrc/renderer/src/runtime/observed-provider-accounts.test.tsxsrc/renderer/src/runtime/provider-account-observation.test-fixture.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 4 remain after this review.
-


ELI5
When a chat hits its account's usage limit, its warning row only offers Continue. Using another account or handing the work to another agent requires leaving the conversation and finding those actions elsewhere. The row now offers an account action when this open chat can follow the selection and Hand Off to Another Agent, plus Continue Now once the limit's reported reset time has passed. Before the reset, or when the provider reports no reset time, Continue Now stays hidden because the same limit would refuse the message; after switching accounts, the next message the person sends continues on the new account.
What Changed
The warning keeps its reset time and adds “Continue this chat without waiting:” followed by small outline buttons. Switch Account opens the existing account menu. With one signed-in account on this computer, Add Account… opens this chat’s native account settings. A paired host with at most one signed-in account offers Hand Off only; eligible paired hosts with two or more still offer Switch Account. Hand Off opens the existing dialog using this chat’s title and owning workspace, with a different available agent selected. File-backed sources pass their existing admitted native transcript; database-backed sources pass recent loaded chat messages. Full saved history for database-backed sources is a temporary limitation, tracked in STA-11454. No export files or retention mechanism are added. Without another available agent, Start is disabled. A Claude destination remains an editable draft that requires Send; other agents keep their existing submission behavior. The execution host resolves the file through the same account-scoped transcript importer used to open a chat in the command-line interface. The row reads the current options response on click so a newly created chat gets its saved transcript too. Older hosts or providers without a saved path use loaded chat context, labelled as chat messages. These controls disappear with Continue Now once another message is sent, and loading controls remain disabled.
Account eligibility comes from the chat's host: it verifies that launches follow account selection and that this conversation's projects store is shared with System default and every native account destination. An isolated or unverified store offers Hand Off only. Shared custom folders remain eligible. The options response carries optional canSwitchAccount and transcriptPath fields; neither is saved, and older peers safely omit or ignore them. A fresh eligibility read before each switch covers new roster destinations. Ordinary options reads outside a stopped usage-limit turn do no recovery discovery; lookup remains outside send/Stop serialization. Mounted paired rows observe their host’s account roster. A single current hand-off request prevents a late response reopening a cancelled or superseded dialog. Codex and OpenCode offer Hand Off only. The existing account menu, switching action and settings navigation target the chat’s host, including paired servers. Add and Manage open its native account view even when Windows Settings normally prefers WSL; explicit account-location choices and ordinary Settings visits retain their existing behavior and defaults. Chat-row switches skip terminal restart offers. The account slot keeps a fixed width through loading, Add/Switch labels, and ineligible states so Hand Off does not move; switcher instances are keyed to their owner. The phone stays unchanged. No automatic continuation, saved field, new operation, or new runtime capability is added.
Why
Changing the selected account helps only if this exact conversation will use it. Reading the host's per-chat proof keeps the button honest for shared and isolated history, including with older servers. Reusing the existing account menu and hand-off dialog keeps their sign-in, switching, and launch behavior consistent. The common pattern derives recovery controls from the current stopped turn; the extra row entry points are an intended difference: the common pattern offers those workflows from a composer picker or plugin, while Orca's existing equivalents are the status-bar account switcher and hand-off dialog. Brennan chose the row to reach them. Account recovery keeps Orca's existing native resume and separate explicit hand-off, an intended mechanism difference from the common pattern that preserves the approved conversation behavior. Passing the saved transcript file is an intended transport difference that reuses the existing agent launch flow. Automatic retry and scheduled continuation are excluded by the approved product scope.
Linked Issue
Follow-up to the usage-limit warning introduced in #30396, tracked in #30955 for moving open chats to the selected account.
Visual Proof
The review status comment retains the accepted real-agent evidence from
8fe9e7e030ea, the separately identified private integration runs, their explicit agent limits, and the before/after reset screenshots on323e395a842. The reset images use the actual notice row in a declared hidden renderer fixture, with no provider or agent run.The final Hand Off picker uses the production dialog and menu in a scoped renderer fixture, with no agent launch: picker screenshot. Local image:
/Users/brennanbenson/orca-qa/usage-limit-actions/workers/pr-31241-final/qa3789-agent-menu-open.png. Evidence and limits:/Users/brennanbenson/orca-qa/usage-limit-actions/workers/pr-31241-final/qa3789-report.md. The independently audited and inspected capture is from exactf0ab7bea, using production imports/styles and a declared Claude/Claude Agent Teams/Codex/Gemini inventory on CLI surfaces only. Codex is visible and the source-family menu rows are absent. It proves no actual Start, agent launch, account operation or chat route. The five-minute stalled attempt and successful fresh-session retry remain recorded in the report. This unchanged nonempty flow carries through476fb91d.Testing
The integrated branch passed 160 tests across 12 named files covering account-history proof, source ownership, Settings routing, reset behavior, shared options reads, hand-off selection and cancellation. The subsequent repair passed 71 tests across 11 named files, including the actual picker rows, 100/1,000 retained chats, 10/100 account readers, provider/host isolation, equal serialized Settings replies, and pending account operations during an owner change. Tests count producer work separately from renders and verify that genuine account/name changes still update their consumers. The original implementations fail the corresponding regression controls.
The historical notice fixture correction passed 52 notice-row tests. The changed-code-quality correction passed its three affected files and 11 tests; it preserves the real account-controller producer and every operation/render assertion. The later type/config correction passed five focused files and 17 tests, preserving scheduled type coverage and the existing verification contracts. Restoring the existing empty-host explanation passed 13 rendered tests; its regression control first failed on the missing paragraph. The public-mock-type annotation passed the same 13 dialog tests, with runtime values and assertions unchanged. The existing feature-tip test adapter now follows the Settings navigation input, matching production host choice; all eight tests passed with every assertion unchanged. Normal pre-commit hooks passed. Current-head CI for
476fb91df1d5f8c7c9ecd5149aa13075186c9511: PASS — PR checks, including all 12 unit shards, static analysis/typecheck, both package jobs, relay integration and cross-version compatibility; mobile verification, persistence, Windows compiler diagnostics and all three WSL distro jobs also passed. The single current-head watcher exited 0..Changed lifecycle and hand-off flows retain the accepted real-agent evidence and limits in the status comment. Later changes affect renderer/state contracts or verification only; they do not repeat agent QA. The final picker has its separate branch-only screenshot above. The empty-host correction restores the existing localized paragraph from the same settled menu rows, without a new layout, control or interaction; rendered tests cover that state. The nonempty picker screenshot does not prove the empty flow, and no additional screenshot or agent run is claimed for the paragraph condition.
Integration and verification
The final reviewed and pushed head is
476fb91df1d5f8c7c9ecd5149aa13075186c9511. Correctness accepted onf0ab7beacarries through the accepted code-quality and type/config corrections and the restored empty-host feedback. The final independent mechanism comparison is complete ona1588114and carries through the test-only annotation at1dc20fa0and feature-tip adapter at476fb91d. Its CI result is listed above.2bdfcef56e87e104e95d8606e00b756a4ee883f0ab7bea8d00ba90029a833a15881141dc20fa0476fb91dAgent skill upstream boundary
Notes
#30955 has landed, and this PR now targets main with its account-following behavior included. Merging this PR ships usable account recovery and hand-off actions.
Folder workspaces and git worktrees use the same owning-workspace hand-off path. Remote chats switch accounts only on their execution host, when that host verifies this conversation can move. Codex remains hand-off-only until the #30957 follow-up supplies account following. Older peers omit or ignore the optional response fields. The Session History list was considered for transcript lookup, but its scan roots omit isolated workspace account stores; the host importer already has the record-scoped lookup that covers them. Mobile behavior is unchanged.
Author: @BrennanKB5
Checklist