Commit Graph
20984 Commits
Author SHA1 Message Date
Neil 6bc1fffc67 W8: teammates wake a team workspace from the phone (team-route wake; owner route not widened) (#155)
* feat(w8): teammates wake a team workspace from the phone (team route long-poll wake, same access/billing/cap; owner route stays the fallback)

* test(w8): team wake refuses an admin on a private row, never returns the endpoint; phone never falls back on 401/403
2026-11-09 19:59:10 -08:00
Neil 5e9fdffc41 W8: phone forgets cloud workspaces that are gone (confirmed by the registry), never on transient errors (#154)
* fix(w8): phone forgets cloud workspaces that are gone (missing from the complete registry list, or wake says not_found); never on transient errors

* fix(w8): prune only on the registry's own not_found for that workspace (lists are capped and skip hidden rows; status 404s are owner-only); restore a link whose host removal failed

* perf(w8): host prune is single-flight and remembers a confirmed-present workspace for 5 minutes
2026-11-09 19:52:06 -08:00
Neil e5e0ef5cc7 Merge pull request #153 from nwparker/cloud/orphan-sweep-pool
fix(sandbox-control): orphan sweep must not stop warm-pool VMs
2026-11-09 19:51:00 -08:00
Neil 78fce9977d fix(sandbox-control): the orphan sweep no longer stops warm-pool VMs (their record is the pool row) 2026-11-09 19:49:24 -08:00
Neil d5e57508cf Merge pull request #152 from nwparker/cloud/activity-keepalive
feat(cloud): VM activity, not the desktop, keeps a sandbox's lease alive
2026-11-09 19:44:57 -08:00
Neil 71ca377e18 chore(ratchet): orcad work-verdict beacon is a heartbeat whose cadence is the feature (stopped on orcad cleanup) 2026-11-09 19:42:57 -08:00
Neil 4dee4cc7c6 feat(cloud): VM activity keeps a sandbox alive without a desktop - orcad publishes its work verdict, the cron renews busy leases and sleeps idle ones 2026-11-09 19:41:36 -08:00
Neil 893be16f77 perf(terminal): prove an idle Linux daemon shell from /proc so Enter skips the paste settle (#151)
terminal.send text+Enter to a daemon-backed shell always waited the 500 ms agent paste
settle: the daemon's shell-foreground answer is lifecycle ownership, which is only proven
after a recovery or full-screen exit, never for a fresh or plain-command shell. On Linux
the idle-prompt claim now also accepts the shell's own /proc stat (process group is the
terminal foreground group, i.e. ps '+'), scoped to the target PTY; other hosts unchanged.

The acceptance wake split uses one persistent paired connection per wake (the desktop's
transport) by default; transport=cli keeps the per-call socket the CLI dials.
2026-11-09 19:38:55 -08:00
Neil 550a35c374 fix(mobile): subscribe to window focus/blur AppState events on Android only (iOS rejects them with a red screen in development) (#150) 2026-11-09 19:36:12 -08:00
Neil 05d43602c8 Merge pull request #149 from nwparker/cloud/delete-unconfirmed-fix
fix(cloud): P0 delete leak - never drop a row for an unconfirmed sandbox; creator can delete across teams; asleep delete without wake
2026-11-09 19:33:17 -08:00
Neil 9b497d2b0e test(cloud): drop type assertions in cloud delete tests 2026-11-09 19:29:52 -08:00
Neil 5bdec31000 fix(cloud): address review - asleep delete needs Force delete and runs ownership checks, destroyed sandboxes forget their row, removed members get no cross-team delete, destroy errors always surface 2026-11-09 19:27:29 -08:00
Neil cb7d58bbc0 fix(cloud): deletes never drop a row for a sandbox Orca Cloud can't confirm; asleep cloud delete skips the wake; creator can delete across teams; picker sign-in selects Orca Cloud; signed-out create shows the sign-in card 2026-11-09 19:20:44 -08:00
Neil 59a628033e Merge pull request #144 from nwparker/cloud/w2-close
feat(cloud): Apply changes again after a partial move; continue an agent when its view is reopened after a restart (real-app run on m4air)
2026-11-09 19:19:35 -08:00
Neil 3335c23f73 fix(cloud): a stale continue loop exiting never un-tracks the newer loop for that pane 2026-11-09 19:16:01 -08:00
Neil 0f73bb4a80 fix(cloud): single node:fs import 2026-11-09 19:11:05 -08:00
Neil 4e047c7844 Merge pull request #148 from nwparker/cloud/w9-eval
feat(cloud): acceptance — remote desktop, wake-delivery split, persistent-connection downloads, desktop #127 run on a remote Mac
2026-11-09 19:10:10 -08:00
Neil 55624dad49 refactor(cloud): continue helpers out of the continue module (line limit) 2026-11-09 19:08:59 -08:00
Neil 1417e042fc feat(cloud): desktop acceptance covers the #127 fixes and runs on a remote Mac
- auth.signed-out-create (D-1/D-4), proj.cloud-name (D-3), life.delete-unconfirmed (D-2,
  team switch -> not_found), life.delete-after-oob-destroy; life.destroy now requires destroyed
  and records the asleep-delete refusal
- starts signed out (dev auth) with no sign-in-then-relaunch workaround; mock keychain so a
  fresh dev app identity does not block on a macOS Keychain prompt
- cloud vs local rows disambiguated by badge (Move to this computer reuses the name)
- upload/download helpers for staging and collecting a run on a paired Orca environment
2026-11-09 19:08:55 -08:00
Neil f2df1de717 feat(cloud): acceptance wake-delivery split benchmark, persistent-connection downloads, golden status helper 2026-11-09 19:08:55 -08:00
Neil d7552c51a0 feat(cloud): acceptance remote-desktop check (ticketed websockify upgrade on the VM loopback) 2026-11-09 19:08:55 -08:00
Neil 75f7919107 docs(cloud): acceptance findings — desktop fixes #127 awaiting UI re-run 2026-11-09 19:08:55 -08:00
Neil da208a006d fix(cloud): keep the untracked archive on any skipped file, sweep temps, link fallback, Discard on the after-restart offer, disarm reaches running continue loops 2026-11-09 19:08:15 -08:00
Neil 2a075764a7 fix(sandbox-control): golden builds retry apt downloads and wait for the dpkg lock (provision_exit_100) (#147) 2026-11-09 19:06:04 -08:00
Neil c8eb1319fc perf(cloud): 0-RTT port-forward opens, idle-proof SSH/forward activity, faster small downloads (#146)
- Forward tunnel early data (workspace-ports.forward-tunnel.early-data.v1). It is negotiated on
  each attach: the client asks for it and the host echoes it in `ready`. The client sends up to
  64 KiB, its receive credit and a half-close right behind Open. The host holds those bytes
  until the destination connects, writes them before Opened, and drops them if the connect
  fails. Old hosts and old clients keep the strict ordering, and the browser tunnel is unchanged.
  New-connection HTTP GET through a forward on a real VM: p50 127 -> 64 ms, p95 138 -> 70 ms.
- SSH and port-forward idle-sleep activity now use ForwardUseMeter instead of the
  2 KiB/min byte threshold. An idle VS Code remote window sends 2.3-3.0 KB/min of
  keepalives, so it kept the VM awake forever. The meter counts packet bursts and
  payload-sized packets instead; the unit tests replay traces recorded on the real VM.
- Downloads: files.stat now goes out with the first pages instead of one round trip ahead
  of them.
2026-11-09 19:06:01 -08:00
Neil effd263938 refactor(cloud): move-run guard in its own module (no import cycle) 2026-11-09 19:03:09 -08:00
Neil 6cce49913b fix(cloud): typecheck in the re-apply flow 2026-11-09 19:01:46 -08:00
Neil bbb035b5a4 fix(cloud): review fixes for Apply changes again and late continue (staged+unstaged re-apply, untracked files never lost, no archive with leftovers, atomic writes, per-transfer lock and worktree check, after-restart offer; one continue loop per pane, late reopen verifies session or offers Continue) 2026-11-09 18:59:48 -08:00
Neil 126597343f chore(sandbox-control): operator rotation prints the build's log tail on failure (#145) 2026-11-09 18:55:32 -08:00
Neil 5adc8fbf32 Merge pull request #142 from nwparker/cloud/w6-agent-firstrun
W6: agents work from the phone — pre-answer Claude/Codex first-run screens; Open terminal opens the terminal
2026-11-09 18:49:54 -08:00
Neil 6100c61bf5 Merge pull request #143 from nwparker/cloud/sync-upstream-main
Merge stablyai/orca main into cloud/integration (+ health fixes, gate/sync script updates)
2026-11-09 18:48:01 -08:00
Neil 4c1b26e67e Merge remote-tracking branch 'private/cloud/integration' into w6-agent-firstrun
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-09 18:45:39 -08:00
Neil 0a625740cc perf(orcad): skip the disposable startup preflight on Orca Cloud boots (#141)
On every Orca Cloud start and wake, orcad ran its disposable startup preflight child. That child is a
second full load of the 15 MB bundle plus the SQLite and node-pty probes, and it ran before main().
The cloud slot could never be qualified: qualification needed the managed-activation env, and the
marker lives in the slot directory, which is root-owned in the image. In-VM profiles showed the main
thread idle for about 580 ms waiting on that child.

- ORCA_ORCAD_STARTUP_QUALIFICATION_DIR names a writable directory for the startup-qualified marker
  and opts the slot into qualification. The key is unchanged: artifact version, file stat identity,
  runtime, ABI, kernel and launch env. It survives a stop and resume: inode, mtime and ctime are
  identical after resume, and the first launch after resume skipped the preflight.
- The image creates /opt/orca/startup-qualification. The provisioning smoke run records the marker,
  and orca-sandbox-start passes the env.
- Agent-state-rules live updates and speech-model warm-up now start after the ready line instead of
  before it.
- Once the ready line is published, a terminal list warms the terminal path (worktree catalog,
  daemon inventory) before the reconnecting desktop asks for it.

Real 4-vCPU VMs, readyMs median of 5: idle 1475 -> 903 ms; with 3 busy cores 1921 -> 1200 ms.
2026-11-09 18:44:16 -08:00
Neil 0ac8bb1e79 Merge remote-tracking branch 'private/cloud/integration' into cloud-sync
# Conflicts:
#	src/renderer/src/lib/browser/navigation/remote-oauth-callback-relay.ts
2026-11-09 18:42:43 -08:00
Neil d98b730df9 fix(cloud): agents start working from the phone/API — Claude Code first-run screens and Codex trust/sandbox pre-answered in the sandbox, no self-update mid-session; 'Open terminal to sign in' opens the terminal (paneView rides with paneKey) 2026-11-09 18:42:25 -08:00
Neil e72c7598fb fix(cloud-integration): tests green after merging stably/main
- remote-desktop guest setup tolerates a destroyed/partial guest on its first load read
  (13 browser-manager suites)
- worktree Sleep handlers import the offline seam, not the whole offline service (6 worktrees ipc suites)
- ordinary http links open synchronously; only a runtime OAuth loopback URL waits for its relay
  (terminal link and markdown link-routing suites)
- recipe options load through a promise so a missing VM bridge is a handled failure
2026-11-09 18:37:08 -08:00
Neil a2dee979c9 feat(sandbox-control): rebuild org environments on the new golden after every golden swap (#140)
Environment snapshots are built on a golden, so workspaces from them kept that golden's orcad and VM
scripts after rotation (e.g. no files.archiveStart). Each 5-minute tick, after the golden tick, every
environment whose active build's base_snapshot_id is not the current golden gets a background rebuild
of the active build's config (only the base image changes), attributed to system:golden-refresh and
billed like any build. The active build serves until the new one succeeds, then the newest-success
activation swaps it atomically; the old snapshot stays for rollback; a failed rebuild keeps the active
build, shows the usual failed build, and is not retried for that golden. At most 2 starts per tick
and 3 builds in flight overall. startBuild accepts an explicit config for this.
2026-11-09 18:33:09 -08:00
Neil cdaa328407 fix(w8): cloud row says "Created just now" (not "just now ago") and drops the repeated activity time (#139) 2026-11-09 18:27:00 -08:00
Neil 1f51735ac4 fix(cloud): localization keys for Apply changes again; fixed clock in the sweep test 2026-11-09 18:24:51 -08:00
Neil ef5db64afc fix(cloud): lint (no casts; persisted transfer parsed with zod), split partial-result view 2026-11-09 18:22:12 -08:00
Neil 13d5cc0b68 test(cloud): type the reopen-continue send mock 2026-11-09 18:19:12 -08:00
Neil fb6c38e5c6 Merge pull request #138 from nwparker/cloud/w3-desktop-p2
Cloud remote desktop P2: Unarchive action, wake then open, light reconnect card, palette entry
2026-11-09 18:17:37 -08:00
Neil 4abbc03f42 feat(cloud): Apply changes again after a partial or failed move (idempotent apply onto the same worktree, conflicts reported, survives restart); continue an interrupted agent when its pane is reopened later 2026-11-09 18:17:17 -08:00
Neil 78cfe7a87b chore(cloud): desktop P2 fixtures follow the primitives' lint rules 2026-11-09 18:14:46 -08:00
Neil 8ef12e5729 fix(cloud): desktop P2 review — unarchiving state, dismissible progress, late/thrown wake failures, one failure message 2026-11-09 18:12:17 -08:00
Neil 724e8bce0b feat(cloud): remote desktop P2 — Unarchive action, wake then open, light reconnect card, palette entry 2026-11-09 18:12:13 -08:00
Neil 63377c810d fix(sandbox-control): source-built goldens provision with the built commit's image files, not the Worker's copies (#137)
The Worker-started source build used the VM scripts, provision script and manifest pins embedded in
the Worker that started it, so a golden built from a newer commit could miss that commit's new VM
scripts (seen live: snap_HTsU from 19f900e has #122's orcad but not orca-desktop-proxy or
orca-desktop-page.js). source-build.sh now sources image/commit-provision-env.mjs from the fetched
checkout (no dependencies; mirrors provisionEnv, enforced by a test), so the image ships exactly that
commit. Tests also require every image/vm file to be a declared VM script and installed by provision.
2026-11-09 18:10:35 -08:00
Neil 0d5fc44d67 Merge pull request #136 from nwparker/cloud/w6-mcp-lows
W6: close MCP sync lower-severity review findings
2026-11-09 18:08:29 -08:00
Neil 9309abdba8 test: compare parsed servers without a cast 2026-11-09 18:05:53 -08:00
Neil 5049474808 Merge pull request #124 from nwparker/cloud/w5-ui-followups
feat(cloud): teammate names on Orca API keys, connected apps, audit and routines; meaningful i18n placeholder names
2026-11-09 18:04:52 -08:00