Commit Graph
17614 Commits
Author SHA1 Message Date
Neil d4cd4dd2cb fix(cloud): N-01 lint: no as-casts in phase guards, return await in failAfterStart 2026-11-11 13:01:35 -08:00
Neil ef49c858c5 feat(cloud): N-01 per-create phase timing in app.log
Each Orca Cloud create logs `[orca-cloud] create <creationId> <phase> +<ms>`
(ms since its provision started) to the main app log, so a slow create shows
which phase took the time. The provision's own `[orca-cloud] <stage>` progress
lines are unchanged.

Also folds the two identical post-start cleanup-and-fail blocks in the
provision handler into one helper (ephemeral-vm.ts was at the 300-line cap).
2026-11-11 13:01:35 -08:00
Neil d8dac59474 Merge pull request #466 from nwparker/cloud/n04-held-queued-copy
fix(cloud): N-04 queued prompt editing hint says it waits for agent setup when held
2026-11-11 12:55:04 -08:00
Neil 3eaf1ea505 test(cloud): N-04 cast on its own annotated line 2026-11-11 12:38:37 -08:00
Neil 8103fc9886 Merge pull request #462 from nwparker/cloud/n02-reattach-history
fix(cloud): N-02 desktop subscribers get a local terminal's scrollback depth (app restart keeps cloud history)
2026-11-11 12:32:03 -08:00
Neil de4b5045ca test(cloud): N-02 a full desktop-budget snapshot goes out in frames under every receiver cap 2026-11-11 12:19:13 -08:00
Neil 4df88820f5 fix(cloud): N-04 held hint matches the row's 'Sends once {{agent}} is set up'; fixture agent is Claude 2026-11-11 12:18:35 -08:00
Neil ffe1d633ed fix(cloud): N-04 held copy in the queued prompt's editing hint, decided from the first frame 2026-11-11 12:17:08 -08:00
Neil 9211cbfa8b Merge branch 'cloud/integration' of https://github.com/nwparker/orca-private into cloud/n03-scoped-notices
# Conflicts:
#	src/renderer/src/components/worktree-creation/VmBuildStepRow.test.tsx
#	src/renderer/src/components/worktree-creation/VmBuildStepRow.tsx
2026-11-11 12:16:15 -08:00
Neil 8a384f4692 Merge pull request #458 from nwparker/cloud/n03-scoped-toasts
Cloud: no away toast for a held cloud agent; the sidebar row marks it (N-03, my half)
2026-11-11 12:12:48 -08:00
Neil 760142b055 Merge pull request #464 from nwparker/lc2/ja25-branch-label
copy(cloud): composer branch choice says "Branch for this workspace" when Run on is Orca Cloud (JA-25 follow-up)
2026-11-11 12:08:40 -08:00
Neil a1970323fb Merge pull request #457 from nwparker/cloud/mpg-n05-chip
fix(cloud): N-05 W-number chip reads as Copy link at rest
2026-11-11 11:56:54 -08:00
Neil 5def277410 copy(cloud): cloud New branch hint reads "Create a new branch." (the branch lives in the sandbox); local keeps upstream copy (JA-25) 2026-11-11 11:54:04 -08:00
Neil c19ddc77d4 Merge pull request #459 from nwparker/lc2/ja25-nouns
copy(cloud): JA-25 remaining nouns: Start, Cloud workspace, workspace and its files
2026-11-11 11:52:57 -08:00
Neil 58bf15f6d6 test(cloud): JA-25 branch choice title per run target; orcaCloudRemoteBranch fixture 2026-11-11 11:51:39 -08:00
Neil 95db71fa56 fix(cloud-create): repository placeholder shows at once once the create has waited 150 ms (no blank row in fixtures or remounts) 2026-11-11 11:48:16 -08:00
Neil 6a8a0f997a fix(cloud): N-03 the row mark in the template-based sidebar card too (real-run find) 2026-11-11 11:48:11 -08:00
Neil df0998e827 copy(cloud): the composer's branch choice says "Branch for this workspace" when Run on is Orca Cloud; local keeps the upstream label (JA-25) 2026-11-11 11:46:56 -08:00
Neil c3a4d46176 fix(cloud): N-02 a desktop subscriber gets a local terminal's scrollback depth, so an app restart keeps a cloud pane's history
Quitting and reopening the app restored a running cloud terminal's saved
scrollback, then its reattach replayed the host's subscribe snapshot with a
clear - capped at the phone-sized 1000 rows - so everything above was gone.
Local panes survive the same clear because their daemon snapshot carries the
full 5000 rows.

Host side (runs in the VM; needs the dev golden rotation):
- the initial subscribe snapshot for a non-mobile stream tries 5000 rows
  (DESKTOP_TERMINAL_SCROLLBACK_ROWS_DEFAULT) under a 2 MB raw budget (the same
  a requested desktop snapshot already gets; snapshots are chunked), stepping
  down 5000 -> 2000 -> 1000 -> ... when over; phones keep 1000 rows / 512 KB;
- ack-recovery snapshots after dropped output: desktop depth for non-mobile.
Renderer: a gap resync asks for desktop depth (the host caps by bytes).
2026-11-11 11:46:27 -08:00
Neil 4dca3ca244 chore(cloud): N-03 drop the removed toast's strings 2026-11-11 11:46:06 -08:00
Neil 809c2dcff3 test: N-01 stage threshold (4.9 s / 5 s) and one fixture per stage line 2026-11-11 11:41:23 -08:00
Neil 6f904ba5c3 copy(cloud): Run on's Orca Cloud subtitle reads "Sandbox · 8 vCPU · 16 GB", not "Hosted sandbox" (JA-25, glossary) 2026-11-11 11:41:22 -08:00
Neil c4f0cacf42 feat(cloud): workspace notices stay in their workspace, never over Settings (N-03); neutral repository step on an early failure (N-12) 2026-11-11 11:40:33 -08:00
Neil ca276bf0da fix(cloud): N-03 no away toast for a held cloud agent; the sidebar row marks it instead
journey-audit v2: the 'Claude isn't set up' toast followed the user through other workspaces and the sleep view. design-squad (PC-3 reversed on purpose): in the workspace the pane's Set up once strip asks; away, the sidebar row shows a key mark with the tooltip and aria-label 'Claude isn't set up for Orca Cloud' (or 'sign-in expired'). The away toast and its modules are removed. Toast-stack scoping (push notice) is env-check-ux's half.
2026-11-11 11:39:26 -08:00
Neil b5e6dbed03 fix(cloud): N-05 copied state keeps the chip's width — check glyph, 'Link copied' in the tooltip 2026-11-11 11:38:21 -08:00
Neil db67596159 fix(cloud-create): 'Start sandbox' names what it waits on after 5 s (N-01 progress text)
Past 5 s the running Start sandbox row says what it is waiting on: 'Getting your project ready…'
(the desktop is still preparing, before the create is sent), 'Checking your plan…', 'Starting the
sandbox…', or 'Connecting to the sandbox…' (after the server answered). A normal start stays quiet.
Replaces the immediate phase detail (latestOrcaCloudPhaseLabel).
2026-11-11 11:37:43 -08:00
Neil fd82d3f655 fix(cloud): N-05 W-number chip leads with a link glyph so it reads as Copy link at rest; drops below 960px 2026-11-11 11:36:59 -08:00
Neil eb8c8a978f test(cloud): WAKE-SCROLLBACK-SCROLL keepWakeScrollPlace waits for the replay rebuild, pins, corrects one fit drift, leaves a return-to-bottom alone 2026-11-11 11:30:05 -08:00
Neil a5373f4ba4 fix(cloud): WAKE-SCROLLBACK-SCROLL re-apply the kept line once after the pane's own fit (bottom-offset pin drift) 2026-11-11 11:25:48 -08:00
Neil 309e753ace fix(cloud): WAKE-SCROLLBACK-SCROLL apply the kept place after the replay's own scroll-intent rebuild completes (it restored follow-output) 2026-11-11 11:23:38 -08:00
Neil cc79bf1fbe fix(cloud): WAKE-SCROLLBACK-SCROLL scroll back with intent enforcement paused (its synchronous follow-output snapped back), then pin 2026-11-11 11:18:34 -08:00
Neil 98cc759063 test(cloud): WAKE-SCROLLBACK-SCROLL the wake scroll listener: capture phase hears a wheel xterm stops, passive, removed on cleanup 2026-11-11 11:12:43 -08:00
Neil 2275be0d29 fix(cloud): WAKE-SCROLLBACK-SCROLL hear the wheel in the capture phase (xterm's scrollable element stops its propagation) 2026-11-11 11:09:28 -08:00
Neil 8669af7a7e test(cloud): WAKE-SCROLLBACK-SCROLL a pinned wake scroll stays put under new output and follows output again at the bottom 2026-11-11 11:08:41 -08:00
Neil 5bae7c5b13 fix(cloud): WAKE-SCROLLBACK-SCROLL a scroll made during a wake survives the remount (stale held at-bottom fit restores are cancelled) 2026-11-11 11:02:40 -08:00
Neil f1f0cfc5d3 fix(cloud): WAKE-SCROLLBACK the kept scroll is recorded as a pinned scroll intent, so post-fit intent restores keep it 2026-11-11 10:24:54 -08:00
Neil c4bb9d26b5 fix(cloud): WAKE-SCROLLBACK any sleep keeps the full history (pre-resubscribe copy for sleeps not clicked here), a scroll made while asleep/waking survives the wake remount 2026-11-11 10:16:23 -08:00
Neil a974f6120b fix(cloud): WAKE-SCROLLBACK capture only at going-to-sleep/asleep (never while waking, when a remount holds restored copies); preview only into a remount with no replayed saved output 2026-11-11 10:03:30 -08:00
Neil 80c180c8fb fix(cloud): WAKE-SCROLLBACK the restore drops the scrollback with xterm's clear() so a remount preview is never duplicated 2026-11-11 09:58:23 -08:00
Neil a07ca09b41 fix(cloud): WAKE-SCROLLBACK a pane remounted on wake paints its kept output at once (the blank frames were the fresh xterm before the snapshot) 2026-11-11 09:53:09 -08:00
Neil 1ed60a9774 fix(cloud): WAKE-SCROLLBACK hold rendering from the woken terminal's bind (the process-boundary ground released it), so no pre-restore clear is painted; tests on a fixed clock 2026-11-11 09:47:25 -08:00
Neil 40d2c4d1f3 fix(cloud): WAKE-SCROLLBACK divider copy on its own key (the catalog value renders; the old key had from/to) 2026-11-11 09:43:04 -08:00
Neil 1d5a9f5e7d fix(cloud): WAKE-SCROLLBACK no blank frame on attach, and the whole pre-sleep history (m4air proof)
Two defects the real-app proof found:
- ~400 ms blank pane on attach: the woken terminal's fresh-spawn viewport
  blanking ran before the snapshot drain. A pane with pre-sleep output to put
  back now holds rendering (DEC 2026) there instead of blanking; it keeps its
  greyed history until the restore rewrites it.
- History cut to ~880 rows: by "asleep" the transport had resubscribed and
  replaced the buffer with the host's 1000-row snapshot, and the capture could
  re-run on it. It now captures when sleep is asked for (going to sleep), once
  per sleep (a later look only refines the start time), and arms only after
  the workspace was actually asleep.
2026-11-11 09:40:06 -08:00
Neil 66546e7cd7 fix(cloud): WAKE-SCROLLBACK the woken terminal's first snapshot takes the restore (new PTY id), no race with React arming; test times relative to now 2026-11-11 09:24:57 -08:00
Neil 685d83a9f7 fix(cloud): WAKE-SCROLLBACK divider time as a locale range (2:02–2:31 PM); render held (DEC 2026) from the snapshot's clear to the restore, so no blank or history-less frame; fixture filler labelled 2026-11-11 09:09:26 -08:00
Neil 1226eccf6f feat(cloud): WAKE-SCROLLBACK a woken cloud terminal keeps its pre-sleep output above a "Slept … · processes stopped" divider
Sleep reboots the VM; the woken pane attaches to a new terminal whose snapshot
replay erases scrollback (`\x1b[3J`), so everything the pane showed was gone.

- Capture (asleep/waking, before the new terminal attaches): the pane's normal
  buffer rendered from its cells as text + SGR only (never its escape stream),
  capped at terminalScrollbackRows. Shell panes keep their visible rows too;
  agent / full-screen panes (the #451 rule) keep only the scrollback above, so
  no frozen TUI frame comes back. No live buffer (never mounted, restarted
  while asleep): the plain-text read-only copy saved at sleep, uncoloured; none
  at all: nothing restored, nothing said.
- Restore (once the workspace left "asleep"; the woken terminal's snapshot
  drain): after the snapshot paints, a client-side rewrite of restored output,
  the dim divider, then the woken screen, cursor put back with relative moves.
  Nothing reaches the PTY (replay writer, replay guard); a final sanitizer keeps
  only text and CSI…m (OSC 52/0, DECSET, bracketed paste, cursor moves dropped).
  Pinned to the bottom unless the person had scrolled up. One divider per sleep.
- The kept output is dropped once restored, or when its pane / tab / workspace
  goes away.
2026-11-11 09:07:46 -08:00
Neil fc09b95427 test(cloud): WAKE-RERUN a finished silent command (true, fresh prompt) offers nothing 2026-11-11 08:51:19 -08:00
Neil 52fa2026b1 fix(cloud): WAKE-RERUN a silent command still running at sleep (sleep 900) gets its Rerun
On cut 68321452c9 a shell pane running `sleep 900` woke with no "Woke up"
bar. The command printed nothing, so its prompt line was the last text and the
detector read it as idle / half-typed (a rule from the first JA-15 detector).

The capture now notes whether the cursor sat below the last text: Enter was
pressed on that prompt line, so the silent command is running and gets Rerun. A
half-typed line (cursor still on it) and a bare prompt still offer nothing; agent
launches and the orca-launch script are still never offered.
2026-11-11 08:48:56 -08:00
Neil 72b88e5d49 fix(cloud): RST-FLAGS Restart keeps the permission flag when default args are substituted
#402's fallback sent the raw settings.agentDefaultArgs string as agentArgs for a
pane with nothing recorded. The host takes explicit agentArgs verbatim and only
projects its launch profile (configured Arguments + permission choice) when none
are sent, so a pane launched as 'claude --dangerously-skip-permissions --model
opus --effort high' restarted as 'claude --model opus --effort high' (real-app,
pane's own process by marker, before/after). Project the defaults through
resolveTuiAgentLaunchRawArgs (the same projection a fresh launch uses), so the
permission choice is kept; with no default args nothing is sent, as before.
2026-11-11 07:52:51 -08:00
Neil 075c7bb794 Merge pull request #451 from nwparker/cloud/ja15-hide-after-relaunch
fix(cloud): RA-WAKE no woke-up bar over an agent the host relaunched
2026-11-11 07:13:29 -08:00