Every button that opens a URL in the external browser gets a chevron with
"Copy link" that copies the exact URL (minted the same way for lazy links),
for incognito windows or another browser profile.
* fix(cloud): PAIRED-WAKE (1/2) a sleeping paired cloud workspace wakes when opened (sidebar, Home), on focus and on hover, like an owned one
cloudWorkspaces:wake wakes a paired workspace's sandbox through the control plane (this desktop has
no VM record to resume) and reconnects its bound server at once. Opening its sidebar row wakes it
when asleep (waking overlay, failure card), and Home > Open wakes it before connecting to the saved
pairing. Predictive wake treats a sleeping paired workspace as a candidate with the same preflight
(fresh status + billing caps) and wakes it quietly (coordinator decision). Wake progress never adds
a paired row to the owned ids.
* fix(cloud): PAIRED-WAKE localize the not-paired message; test uses fixed timestamps
* fix(cloud): PAIRED-WAKE design-squad copy for the not-linked wake failure
The W-number chip, Home's Copy link, the menu items and the copy-link
shortcut all went through navigator.clipboard.writeText after an awaited
control-plane lookup. Electron rejects that write once the document has
lost focus or user activation (always true from the menu or a shortcut),
so the copy failed with "Couldn't copy the link". Use
window.api.ui.writeClipboardText like every other renderer copy, make the
link lookup never reject (3s cap, sandbox-id link fallback for paired or
offline devices), and keep the error toast for real clipboard failures.
The chip tooltip now also says who the link is for.
* fix(cloud): PAIRED-NO-ROW a paired cloud workspace keeps its sidebar row (paired servers left out of team scoping)
Since #562 a paired "<name> (cloud)" server counts as Orca Cloud, so selectOrcaCloudHostScopeKey
scoped it by team. Its owner is never in cloudAccountIdByEnvironmentId (this desktop's own runtimes
only), so it landed in hiddenHostIds and every row and project of a paired workspace vanished, a
GitHub-only create included (n37 P-paired). Paired servers are left out of that scoping, as before
#562.
* test(cloud): PAIRED-NO-ROW typed repo literal
* fix(cloud): PAIRED-STATUS one status path for paired cloud workspaces (main resolves a bound pairing; store registers paired rows)
getStatus/getArchive take { workspaceId, environmentId? }: main resolves this desktop's own runtime
first, else a paired server bound to a sandbox (findCloudSandbox), never an arbitrary sandbox.
The window registers each paired cloud workspace's own row (main checkout on a server the catalog
marks orcaCloudPaired) in the cloud workspace store's `paired` map, apart from the owned ids, so its
status lands in status[worktreeId] and every status surface reads it unchanged.
* fix(cloud): PAIRED-STATUS read worktrees through selectWorktreesByRepo (workspace-record ratchet)
Sleep on a paired cloud workspace's own row (no local VM record) now stops its sandbox via
cloudWorkspaces.sleep(sandboxId), so it stops billing; failures reuse the cloud sleep toast.
useIsCloudHostRow / isCloudPrimaryRowNow also read the runtime catalog's orcaCloudPaired mark,
so a GitHub-only create loses its "primary" badge and gets "Delete workspace…" and Sleep without
waiting for the pairing bindings to load.
The proof's first restart showed "couldn't check your sign-in" on a chat whose
account read returned 'none' a moment later: a hold restored before the read
landed stayed 'unread'. The account watch now turns it into the read's answer
(isn't set up / expired / covered); it still never starts.
* fix(cloud): PAIRED-AWARE paired Orca Cloud servers count as Orca Cloud everywhere (catalog marks bound servers; shared check and sandbox map include them)
* fix(cloud): PAIRED-AWARE paired-server mark held in memory from bindings reads and writes (no sync fs on main); catalog republishes on change
- holdCloudAgentLaunch registers its outcome before awaiting the account read,
so startup and the launch's retry asking at once share one hold (no orphaned
hold, no hung launch). resumeChat leaves a hold the retry already owns.
- joinedSessions is marked only when the joined hold was put back at startup.
- useCloudHeldChatUnavailable hides only the not-signed-in verdict.
- cloud-structured-held-launch-memory: one record per held structured chat
(session, workspace, environment, agent), per Orca profile; never prompts
or secrets; bounded, ages out.
- holdStructuredCloudLaunch remembers a chat while it holds and forgets it on
settle; a chat with a record holds as restored (a failed or covered read
waits as awaitingStart, never creates signed out); a launch joins a hold
already placed for its key (joinCloudAgentHold) instead of holding twice.
In-session launches are unchanged.
- cloud-held-launch-resume: at the host subscription, each held chat's hold is
put back as soon as its tab is in the store, whatever becomes of its
launch's retry (probes that throw leave the hold and strip up). If no retry
joined it, Start retries the launch once and Cancel abandons it.
- While a chat is held on its cloud strip, the host's not-signed-in verdict is
the strip's to explain (useCloudHeldChatUnavailable in the structured pane
notices); unheld chats keep the generic notice.
- DUP-EXPIRED-STRIP: CloudRunningStripPortal yields to a tab-key hold too, so
a host-published held strip never stacks with the running strip.
composer-redo's #555 note: cloudAgentHoldReason returns null for killSwitch and
unavailable, so the account watch started an expired hold while the agent was
paused or withdrawn. Proceed only when coverage is 'account' or 'key'.
Tests: kill switch keeps it held, a renewal then starts it; the in-session
cases move to their own describe.
holdCloudAgentLaunch's account watch treated any change away from 'expired'
as a renewal, so removing the credential ('none' -> notSetUp) started the
agent with nothing covering it. Proceed only when the account now covers the
agent; a removed sign-in turns the hold into the one-time setup.
In builds that offer Orca Cloud, when signed out (never, or the session
ended) with projects and no cloud list, Home shows a quiet 'Cloud
workspaces · Sign in to see your team's cloud workspaces' card where the
list would be. It stands in for the trial card while signed out. The base
landing (wordmark, no-project Home) is unchanged pending FR1.
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(cloud-auth): plain sign-in asks for auth's branded page (V3-04)
Settings › Sign in to Orca opened the bare provider page while cloud setup opened the
branded page. A plain sign-in now sends signin_page=1, so auth (stablyai/orca-cloud#758)
shows the same shell with only its Account step. Servers that don't know the flag ignore
it.
* fix(cloud-auth): keep profile-cloud-service under 300 lines; no wall clock in the new test
* fix(cloud-auth): profile-cloud-service back to 300 lines
* refactor(cloud-auth): set the V3-04 sign-in flag in the PKCE flow, not the service
profile-cloud-service.ts sits at the 300-line cap; the plain-sign-in default
(signin_page=1) now lives where the authorize parameters are applied. Cloud setup still
passes its own parameters, which never include it. Tests at the PKCE level.
The hold on a not-set-up/expired Claude or Codex launch lived only in memory
(cloud-agent-launch-hold) with the launch's args in a pending promise; a quit
dropped both and the placeholder came back as a plain shell: no strip, no key
mark, no way to start the agent.
- cloud-held-launch-memory: one record per held placeholder (environment,
workspace, tab, agent, prompt, cwd, group), per Orca profile in localStorage;
never env, command or secrets. Bounded (50) and aged out after 7 days.
- createWithCloudAgentHold remembers the placeholder; the hold's settle
(settleHeldPlaceholder, shared) forgets it on Start, cancel or tab gone.
- cloud-held-launch-resume: when a host's session subscription opens, each
record's hold is put back once its placeholder tab is in the store again
(bounded wait; a tab that never returns is dropped and logged). A restored
hold waits for the person's Start even if the account now covers the agent
(holdCloudAgentLaunch restored: true): nothing launches unasked. Start
launches the original agent and prompt and closes the placeholder.
The setup page said 'Orca on m4airs MacBook Air': the desktop sent the hostname
with hyphens turned to spaces, which loses the apostrophe macOS drops from the
hostname. On macOS send scutil's ComputerName (the shared runtime lookup), exactly
as System Settings shows it; fall back to the cleaned hostname off macOS or if
scutil can't answer.
- RA-11's running strip on a structured chat (useCloudChatRunningStrip,
mounted in CloudStructuredChatBanners): expired shows Renew; renewed only
confirms ("Your next message uses it.") with a dismiss, no Restart - the
chat's next message goes out with the renewed sign-in (the proxy swaps it in
per request; live-checked). A held launch's strip wins.
- cloudRunningStrip: turnEndedFallback for structured chats (their status has
no turnEndedAt; done-since dates the clean turn), terminal panes unchanged.
- On an Orca Cloud chat, the agent's not-signed-in card says "Renew it above,
then send your message again." instead of the CLI login advice and its
terminal Sign in button (private cloud-chat-sign-in-notice + a render-time
hook in NativeChatNoticeRow; shared copy untouched).