Commit Graph
21567 Commits
Author SHA1 Message Date
Neil 71b219cbaf fix(cloud): RA-11 Restart resumes the pane's own conversation on the host; quieter restarting/failed strip
m4air run 3: same tab, same leaf, new PTY, and state 1 after, but the relaunch was a new conversation
(no --resume; new session id). Orca Cloud tabs are host-surface tabs: the desktop reconnect only
attaches, and the host woke the slept leaf with its original launch. After the reversible stop, the
desktop now asks the host to ensure the agent on the pane's own provider session, placed in the same
host tab and leaf, then reconnects. A pane with no session keeps the host's fresh launch ('Starts a
new conversation'). A host that does not stop or resume shows the failure with the reason.

Strip (design-squad): 'Restarting Claude…' is the spinner and words only, with no button and no ×.
The failure says it once: the body names the reason when known ('The workspace didn't respond.')
and is otherwise empty; Try again and × stay.
2026-11-10 22:59:59 -08:00
Neil bf0a962b01 fix(cloud): RA-11 Restart on a paired pane sleeps that pane, then wakes it; never closes a tab
m4air run 2: a plain stop (keepHistory false) is a close, and the host dropped the whole Claude tab, so
the reconnect had nowhere to relaunch. The stop is now the reversible one the pane-sleep path uses
(terminal.stopExact, keepHistory + targetOnly): the leaf stays as a sleeping surface and the
reconnect wakes it with --resume.

If the pane is gone anyway, the attempt ends with a toast naming the workspace, 'Couldn't restart
Claude in {workspace}.' with Open workspace, instead of vanishing with the strip. Tests assert the
same tab and leaf before and after, the reversible single-target stop, and the toast.
2026-11-10 22:45:12 -08:00
Neil 3f3ca73627 fix(cloud): RA-11 Restart on a paired pane stops its host terminal first; success needs a new PTY
m4air (clean run, no other client): Restart showed 'Restarting Claude…', the pane took the queued
restart, but its PTY never changed and the old Claude kept running; the strip then cleared on the
'quiet relaunch counts' rule, a false success. An Orca Cloud pane is a paired web-host pane: the
desktop reconnect asks the host to ensure the pane's agent session, and the host hands back the live
terminal still running that session. Nothing on the remote path stopped it (local panes pass
replacesPtyId; remote ones had nothing).

Now a strip Restart on a remote-runtime pane resolves that pane's host PTY and stops exactly it
(terminal.stopExact, targetOnly), suppressing its exit, and only then reconnects with the resume
startup. A stop that fails shows 'Couldn't restart Claude' and never reconnects. Success needs proof:
the pane bound to a new PTY. The 'relaunched but quiet counts as restarted' rule is gone; anything
short of proof is 'Couldn't restart' at 10 s. Account-switch restarts are unchanged.
2026-11-10 22:14:44 -08:00
Neil 9802620b0d fix(cloud): RA-11 Restart shows Restarting… then a result, never vanishes silently
On click the strip stays as 'Restarting Claude…' (spinner, button disabled, no ×). It settles on the
relaunched agent's first status, after which it follows the account (state 1 again if the sign-in is
still bad). No relaunch within 10 s, no startup to launch, or a startup that throws shows
'Couldn't restart Claude · Try again.' with Try again and Dismiss. A relaunch that stays quiet past
10 s counts as restarted. The forced past-the-mid-turn mark now clears on launch, failure or timeout,
so a stale queued restart never jumps the account-switch wait rule.

The pane runner is extracted (runReadyPaneAccountRestarts) and covered end to end through the real
store: a 'blocked' Claude relaunches in place with its resume startup, an account-switch restart still
waits, and each failure path reports.
2026-11-10 21:54:01 -08:00
Neil 397961698d fix(cloud): RA-11 reads the per-workspace answer and its own memory through store snapshots (React Compiler)
m4air: the strip never appeared in a normal session. The per-workspace Source read settled true,
but useWorkspaceUsesAccount returned null: the React Compiler memoized its plain map read on the key,
so the first (unread) answer stuck. It now comes from a useSyncExternalStore snapshot. The strip
decision also takes the store's revision as an input, so a dismiss or restart re-decides.
2026-11-10 20:55:17 -08:00
Neil 4378fbd16e fix(cloud): RA-11 Restart runs while the signed-out Claude reports 'blocked'
m4air: after Renew, Restart Claude queued an account restart that never ran. A 'Not logged in'
Claude reports 'blocked', which the account-restart path reads as mid-turn and waits on. A Restart
the person clicks on the Orca Cloud strip is marked and may run now; account-switch restarts keep the
mid-turn rule.
2026-11-10 20:11:35 -08:00
Neil b616b823a1 test(cloud): sandbox-id test without a cast 2026-11-10 19:31:11 -08:00
Neil 3bdfe919cf fix(cloud): resolve the sandbox id of composer-created Orca Cloud workspaces (recipe without provider)
Real-app m4air: per-workspace Sources (#287's workspaceSources, used by RA-11's D13 gate, the
build-sheet Source menu and cloud secrets) answered not_found for every workspace the current
composer creates, because its runtime record's recipe carries no provider. orcaCloudSandboxIdFor now
accepts a missing provider, like cloud-desktop-keys does; the hosted-sandbox handle remains the
proof. Tests cover provider-less, explicit, other-provider, handle-less and unknown runtimes.
2026-11-10 19:23:56 -08:00
Neil decb280b01 fix(cloud): RA-11 Restart with no session to resume starts a new conversation on Orca Cloud
design-squad's state 2 promises 'Starts a new conversation.' when there is nothing to resume, but the
account-restart path returned null for Claude without a session (Restart did nothing). On an Orca
Cloud pane it now starts Claude fresh (same builder Codex already used, generalised), after the
session-env refresh. Off Orca Cloud nothing changes. Tests cover resume, fresh, and off-cloud.
2026-11-10 19:10:26 -08:00
Neil c197c3de0b test(cloud): RA-11 restart env test without a cast 2026-11-10 19:04:35 -08:00
Neil dcfb8139e1 fix(cloud): RA-11 Restart on Orca Cloud refreshes the pane shell's session env first
m4air: after Renew, Restart Claude relaunched with --resume in the pane's existing shell, whose env
predates the renewed account, so the agent came back 'Not logged in' (no placeholder at all). On an
Orca Cloud pane the account-restart command is now prefixed with the image's
eval "$(orca-env)", which loads the current session env (placeholders only) into that shell. Other
hosts are unchanged. One call site in agent-account-restart-startup.ts; logic and tests in
lib/orca-cloud/cloud-restart-session-env.ts.
2026-11-10 19:02:39 -08:00
Neil d422a64eea fix(cloud): RA-11 retries a failed workspace Source read on the next account read (never caches a failure)
Real-app m4air: the first per-workspace Source read ran right after start, failed, and the cached
null hid state 1 for 10 minutes. Only a good answer is cached now; a failed read retries when the
account is read again (focus / the visible-window interval).
2026-11-10 18:48:09 -08:00
Neil f4bacdfa39 fix(cloud): RA-11 shows state 1 only where the workspace runs the agent on the person's own account (D13); narrow Restart keeps its full aria-label
The pane's workspace Source is read once (GET /v1/agent-sources?workspaceId via workspaceSources,
cached 10 min) when the account flips; a shared workspace or a key-sourced one shows nothing, and an
unread or failed read shows nothing (fail quiet). Unit tests cover shared, key-sourced, nothing
chosen with and without a covering key, and the unread case.
2026-11-10 18:31:17 -08:00
Neil fc05d53388 fix(cloud): RA-11 account reads use the visibility-aware interval (no fixed timer) 2026-11-10 18:27:19 -08:00
Neil 047c96855e feat(cloud): RA-11 strip over a running Orca Cloud agent whose sign-in expires; strip reserves its height
- When the Orca account goes from active/expiring to expired/revoked, every running Orca Cloud
  Claude/Codex pane shows the strip (same component, place, height as #315): 'Your Claude sign-in
  expired' / 'Renew to keep working. Your conversation is kept.' / Renew (compact: 'Claude sign-in
  expired' + Renew). The process keeps running; nothing is parsed from terminal output.
- One Renew clears state 1 everywhere; the panes that showed it move to state 2: 'Claude sign-in
  renewed' / 'Restart Claude to pick up where you left off.' (or 'Starts a new conversation.') /
  Restart Claude / Dismiss. Restart reuses the account-restart path (queuePaneAccountRestarts), which
  resumes the pane's own session. Never automatic; a turn that ends cleanly after the renewal clears it.
- Kill switch / never offered: nothing new on a running pane. A held launch keeps #315's strip.
- Account reads while a running cloud agent pane is mounted: on window focus and at most once a
  minute (one timer per window).
- #315 P2: the strip is a pane-top banner (useReservePaneTopSpace), so the terminal refits below it
  and no row is covered; a spacer keeps it under a chromeless pane's title-row buttons.
- Spec: terminal starts below the strip and its last row stays visible (held and running); state 2's
  Dismiss sits a full title row below the pane's ×. Removes the debug screenshot left in #315's spec
  and polls the resize assertion (it raced the layout).
2026-11-10 18:25:46 -08:00
Neil defa46442a Merge pull request #315 from nwparker/cloud/ra1-cloud-launch-hold
fix(cloud): RA-1 — hold host-published Orca Cloud agent launches on an expired account; strip renders in the real app
2026-11-10 18:12:44 -08:00
Neil 96ed405376 Merge remote-tracking branch 'private/cloud/integration' into cloud/ra1-cloud-launch-hold 2026-11-10 18:09:23 -08:00
Neil 41b6b2c67f Merge pull request #321 from nwparker/cloud/w2-asleep-restore
fix(cloud): asleep workspace keeps its project after restart; asleep Files tab; calm terminal banner (RA-9, RA-10)
2026-11-10 18:04:02 -08:00
Neil 187aaf4dce test(cloud): RA-1 resize spec without a cast 2026-11-10 18:01:44 -08:00
Neil 4789756cd8 Merge branch 'cloud/integration' of https://github.com/nwparker/orca-private into cloud/w2-asleep-restore 2026-11-10 18:00:20 -08:00
Neil 8d12c9054d test(cloud): asleep Files panel fixtures (changed, no snapshot, waking) 2026-11-10 18:00:17 -08:00
Neil 7df9b12e32 fix(cloud): RA-1 strip follows its live width and sits below the pane's title row
From the m4air real-app shots:
- The width class was frozen at mount, so a pane narrowed after mount collapsed the text to 'Y.'/'S.'.
  The strip now lays itself out from its own width (ResizeObserver): wide / narrow / tiny, plus a
  compact class below 360 px with one line ('Claude sign-in expired') and Renew; the detail stays the
  region's aria-describedby and tooltip. Height stays 56 px.
- The strip sat under the pane's split and close buttons. CloudStripLayer (shared by the pane and the
  fixture) starts it below the pane title row (--orca-pane-title-height), and the renew strip drops
  its own × (Renew is the action; Escape still cancels).
Specs: resize after mount keeps the title readable at 520 and 320 px; the pane's split and close
buttons are hit-testable above the strip in three states.
2026-11-10 17:58:56 -08:00
Neil 0be973e1f7 fix(cloud): change status as the explorer's letter (M/U/A/D/R) in the asleep Files tab 2026-11-10 17:55:58 -08:00
Neil 3627a05b29 Merge pull request #323 from nwparker/core-ui-ra/agent-accounts-jump
feat(cloud): Agent accounts jump row (This computer · Hosts · Orca Cloud)
2026-11-10 17:55:38 -08:00
Neil f9d01534d4 Merge pull request #325 from nwparker/cloud/fix-flaky-tests
fix(cloud-integration): picker-prompt test mock error; shot-editor test hermetic
2026-11-10 17:52:24 -08:00
Neil 4759dd9ee8 Merge pull request #324 from nwparker/cloud/w6-revoke-confirm
fix(cloud): confirm a provider 401 before revoking an Orca account (migration 0047)
2026-11-10 17:50:51 -08:00
Neil 93530ded64 fix(cloud): asleep Files tab trusts the local VM record too, so it shows right after Sleep 2026-11-10 17:49:40 -08:00
Neil fee92b2f67 Merge pull request #319 from nwparker/cloud/ra5-agent-accounts-polish
fix(cloud): RA-5 — Agent accounts polish from the real-app re-check
2026-11-10 17:49:23 -08:00
Neil 95960cd081 fix(cloud-integration): picker-prompt test mock error; shot-editor test hermetic
- interrupted-turn-continue reads its delivery helpers at call time: the cloud workspace store
  imports it, so launch-agent-picker-prompt.test's partial paste mock failed at module load
- plugin-shot-editor test marks its temp cwd as a repo root so the default shots dir (which walks up
  to the nearest plugin folder / repo root) can't be redirected by anything above the shared temp dir
2026-11-10 17:49:01 -08:00
Neil ca73c6c8dc fix(cloud): confirm a provider 401 with one auth check before revoking an Orca account
A single 401 on an Orca-account request no longer revokes the person's Claude account everywhere. The hook only fires after the real credential was swapped in and sent. The control plane then makes one free auth check with the real token (Anthropic count_tokens, oauth beta) and revokes only on a definite authentication_error; anything else (passes, 429, 5xx, other 401 types, network) keeps the account. Checks are rate-limited to one per person and agent per minute (agent_credentials.checked_at), and every keep/revoke is audited (agent_credential_audit, migration 0047). Codex keeps its lease-refresh path.
2026-11-10 17:47:58 -08:00
Neil f28253beff Merge pull request #309 from nwparker/np4-polish/cloud-project-rows
fix(cloud): one row per cloud workspace (hide sandbox clones); scope cloud workspaces to the active team (np4-e2e bugs 6, 7)
2026-11-10 17:47:07 -08:00
Neil 549d76a01b chore(settings): jump row prop is links (matches stablyai/orca#40965 6f2ee281ce) 2026-11-10 17:43:57 -08:00
Neil c7c129ca9e Merge pull request #322 from nwparker/cloud/w6-revoke-all-sandboxes
fix(cloud): a provider 401 refreshes all of the person's running sandboxes
2026-11-10 17:42:57 -08:00
Neil 937109543c Merge remote-tracking branch 'private/cloud/integration' into cloud/ra5-agent-accounts-polish 2026-11-10 17:42:47 -08:00
Neil 5818222629 Merge remote-tracking branch 'private/cloud/integration' into cloud/ra1-cloud-launch-hold 2026-11-10 17:42:37 -08:00
Neil ddf6cfe09f fix(cloud): a provider 401 drops the dead account placeholder from all the person's running sandboxes 2026-11-10 17:40:14 -08:00
Neil 2315ac1bbb fix(cloud): asleep Files tab lists changed files, then recent commits on the branch; dates past a month; no filter or search while asleep (RA-10 review) 2026-11-10 17:39:22 -08:00
Neil c92edf9f96 feat(cloud): Hosts and Orca Cloud as Agent accounts parts, listed in the page's jump row 2026-11-10 17:37:58 -08:00
Neil b59a580246 feat(settings): Agent accounts takes parts and links them from a jump row
renderAccountsSettingsSection now takes additionalParts ({ id, title, description, content }) and
titles each with AgentAccountsSubsection. When the page has more than one part, a jump row under the
description links to each one ('This computer · …'); a link scrolls the settings pane to the part and
moves focus to its heading.
2026-11-10 17:37:40 -08:00
Neil b53af3448c Merge pull request #320 from nwparker/core-ui-ra/agent-accounts-merge
feat(cloud): one Agent accounts page (This computer, Hosts, Orca Cloud) + sentence-case nav (RA-8)
2026-11-10 17:33:16 -08:00
Neil 88e03f017e fix(sidebar): state word's separator is its own element, hidden when nothing follows on line 2 (every state) 2026-11-10 17:32:14 -08:00
Neil d7435b2bec test: fixed clock in the terminal override test 2026-11-10 17:29:31 -08:00
Neil 66bae33860 Merge branch 'cloud/integration' of https://github.com/nwparker/orca-private into cloud/w2-asleep-restore 2026-11-10 17:27:27 -08:00
Neil ce7eada73b fix(cloud): terminal asleep/waking banner — none while waking, neutral line when asleep, no VM in shared copy; empty-changes wording in the asleep Files tab 2026-11-10 17:27:24 -08:00
Neil 3dc4899821 fix(cloud): RA-5 Paste a token instead as a muted link (link-muted button variant) 2026-11-10 17:24:14 -08:00
Neil 53284ee79f feat(cloud): fold Agent accounts into the one Agent accounts page (Hosts, Orca Cloud parts)
Drops the separate cloud 'agent-accounts' settings entry. The upstream 'accounts' page (now
Agent accounts) gets Hosts (S3) and Orca Cloud (S0) through renderAccountsSettingsSection's
additionalSections; deep links move to pane 'accounts' with sectionId orca-cloud / accounts-hosts.
In Orca Cloud builds the entry loses its Optional badge and gains the cloud search entries.
2026-11-10 17:20:08 -08:00
Neil 4fcfd84e81 fix(cloud): RA-5 lint and catalog fixes (link button, new expired-detail key, retired keys removed) 2026-11-10 17:18:20 -08:00
Neil 8e21d2620e fix(cloud): asleep cloud workspace keeps its project after a restart (stand-in setup from the VM record) and shows no activity; Files tab covers waking too (RA-9, RA-10) 2026-11-10 17:17:09 -08:00
Neil ade507d04c Merge pull request #318 from nwparker/cloud/w6-ra1-session-env
fix(cloud): agents orcad spawns directly get the live session env (RA-1, P0)
2026-11-10 17:11:02 -08:00
Neil a50c182463 feat(settings): one Agent accounts page and a sentence-case settings nav
AI provider accounts becomes Agent accounts: a page whose first part is This computer (or the
selected host), holding the existing provider accounts, switching and usage. renderAccountsSettingsSection
takes additionalSections so other parts can be added below it with AgentAccountsSubsection. The
section id stays 'accounts', so every deep link keeps working.

The Settings nav, its group labels and the matching section titles move to sentence case
(Orca account, Computer use, SSH hosts, ...). In-app, CLI and docs references to
'AI Provider Accounts' now say 'Agent accounts'.
2026-11-10 17:10:10 -08:00