Commit Graph
22115 Commits
Author SHA1 Message Date
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 593c00f38a Merge pull request #465 from nwparker/cloud/premerge-concurrency
chore(cloud): premerge runs at most 2 at once per machine (queues and logs the wait; killed runs clean up)
2026-11-11 11:58:14 -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 7652e1a4a4 Merge pull request #463 from nwparker/create-speed/fixture-settle
fix(cloud-create): no blank Repository row: placeholder shows at once after 150 ms of create
2026-11-11 11:51:52 -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 4dca3ca244 chore(cloud): N-03 drop the removed toast's strings 2026-11-11 11:46:06 -08:00
Neil af0e0cf855 Merge pull request #461 from nwparker/create-speed/start-stage
fix(cloud-create): 'Start sandbox' names what it waits on after 5 s (N-01 progress text)
2026-11-11 11:45:09 -08:00
Neil 61f8c9f26e fix(cloud): premerge removes its temp merge worktree on any exit, including a kill while queued
The slot-holding python parent now traps INT/TERM (forwarding to a running child) and, in a finally, removes the temp
worktree (git worktree remove --force, rm -rf) and prunes it from the main repo. The pre-exec stage has its own
EXIT/INT/TERM trap for the window between worktree add and the hand-over. Tested: 3 runs, limit 2, run 3 killed with
TERM while queued -> exit 143, 'stopped by signal 15; removed …'; all three temp worktrees gone from disk and from
git worktree list.
2026-11-11 11:44:01 -08:00
Neil 6f8a4e9183 chore(cloud): premerge runs at most 2 at once per machine; extra runs queue and log the wait
The shared Mac hit load 60 from parallel premerges and vitest runs, starving the e2e harness. In the merged copy
every branch re-runs (#447), after the merge and before install/typecheck/lint/tests, the script now takes one of
PREMERGE_MAX_CONCURRENT (default 2) flock'd slot files under PREMERGE_LOCK_DIR (default /tmp/vdrv), held by a python
parent for the run (a killed run frees its slot). Queued runs print 'premerge: queued for one of 2 slots …, waited Ns'
every 30 s and 'got slot i/2 after Ns'. Tested: 3 concurrent runs with a limit of 2, the third queued 10 s.
2026-11-11 11:42:24 -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 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 3df8851c3b Merge pull request #456 from nwparker/cloud/wake-scrollback-scroll
fix(cloud): WAKE-SCROLLBACK-SCROLL a scroll made during a wake survives the remount
2026-11-11 11:34:57 -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 5db0b96893 Merge pull request #455 from nwparker/cloud/wake-scrollback
feat(cloud): WAKE-SCROLLBACK keep a woken terminal's pre-sleep output above a 'Slept … · processes stopped' divider
2026-11-11 10:32:59 -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 f53d323f42 Merge pull request #454 from nwparker/cloud/ja15-rerun-silent-command
fix(cloud): WAKE-RERUN a silent command running at sleep (sleep 900) gets its Rerun
2026-11-11 08:54:26 -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 68321452c9 Merge pull request #453 from nwparker/cloud/rst-flags-keep-permission
fix(cloud): RST-FLAGS Restart keeps the permission flag when default args are substituted (P1)
2026-11-11 07:55:37 -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 146b220e76 Merge pull request #452 from nwparker/cloud/premerge-base-list
chore(cloud): premerge skips full-suite base-list tests (exact-match filter, unit-tested, logged)
2026-11-11 07:21:55 -08:00
Neil 8b7b51394e test(cloud): base-list skip is an exact whole-line filter with a unit test; off-list tests stay selected
filter-base-list-tests.sh is the one place premerge drops base-list tests (logged to stderr). The test covers:
a base-list test is dropped and logged while an off-list test is still selected; shared prefix/suffix/folder
never skips; entries are literal (no regex) and comments are ignored; a missing list keeps everything.
2026-11-11 07:17:49 -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