Commit Graph
399 Commits
Author SHA1 Message Date
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 e998a5ce96 W8 follow-ups: removal and role loss reach phones; role-aware plan-denial copy (#135)
* fix(w8): removing a member revokes their phones; role changes move phones too; a phone's stored role never re-syncs keys

* fix(w8): one removal path revokes keys, phones, grants and routines; stale desktop tokens can't re-sync roles or vouch phones; a grant revoked mid-issue stays revoked

* fix(w8): a removed member's unexpired desktop tokens stop working; changes count from auth's time; desktop re-mints and retries enroll on stale_token

* feat(w8): role-aware plan-denial copy on the phone (owners and admins get the fix, members who to ask)

* fix(w8): W10 copy (per-seat team limit, choose a plan) and FE review (3 s abortable role read, Android live region, more copy cases); no casts
2026-11-09 18:02:56 -08:00
Neil c68f06864a fix(cloud): name the VM project after its repo (orca repo add --display-name); golden builder uses wait=true exit probe; image-only merges rebuild (#133)
* feat(cli,sandbox-control): orca repo add --display-name; cloud sandboxes name the project after its repository

The VM checkout lives at /vercel/sandbox/project, so boot-time registration (#104) named the repo
'project'. repo.add already accepts displayName; the CLI now exposes it as --display-name and
orca-sandbox-start passes the repository basename from ORCA_REPO_URL.

* fix(sandbox-control): golden builder polls detached builds with a bounded wait=true read; image-only merges trigger a rebuild

The provider reports a detached command's exit code only to a wait=true read (W1's finding, #123):
stepBuild's plain GET is what kept finished golden builds 'running' until the deadline. stepBuild and
the operator rotation now use the same bounded wait probe (4 s); the exit-file marker stays as a
fallback. golden-source's VM path list now includes cloud/apps/sandbox-control/image/ (VM scripts,
provision, manifest), so a script-only merge (e.g. orca-desktop-proxy) rebuilds the golden too.
2026-11-09 17:56:20 -08:00
Neil b7eae3fec8 Merge pull request #131 from nwparker/cloud/w9-eval
fix(cloud): acceptance cleans up staging teams via cleanup-teams.mjs
2026-11-09 17:54:23 -08:00
Neil fb332cc4ca Merge pull request #87 from nwparker/cloud/w2-final
feat(cloud): W2 final pass: glossary, control-plane idle minutes, rollover restarting state, Move to this computer flow
2026-11-09 17:51:09 -08:00
Neil fe4ae20d78 fix(cloud): acceptance deletes staging teams via cleanup-teams.mjs (#130), skips team checks when cleanup is unavailable 2026-11-09 17:50:02 -08:00
Neil 56315c1f2b Merge pull request #129 from nwparker/cloud/w9-eval
feat(cloud): acceptance — headless downloads, staging team checks, poll-mode env builds
2026-11-09 17:46:40 -08:00
Neil 8b05b95c98 docs(cloud): acceptance findings — downloads pass on the #115 image 2026-11-09 17:46:24 -08:00
Neil 84b02d6761 Merge remote-tracking branch 'private/cloud/integration' into cloud/w2-final
# Conflicts:
#	src/renderer/src/components/worktree-creation/vm-build-failure.test.ts
2026-11-09 17:43:38 -08:00
Neil eedb151a46 feat(cloud): acceptance headless download check, staging team create/invite, findings 2026-11-09 17:41:37 -08:00
Neil 60377d3364 feat(cloud): remote desktop Beta — single-use tickets, fit, clipboard, keyboard release (W10 RD-1..6) (#122)
* feat(cloud): remote desktop single-use tickets, fit, clipboard and keyboard release

- VM: Xvnc on a 0600 socket with no VNC auth plus an X cookie; orca-desktop-proxy (websockify
  subclass) admits one WebSocket per unused 60 s ticket from the same localhost origin, refuses
  rebinding Hosts, scrubs tickets from logs, serves the page with connect-src 'self'.
- Worker: POST /desktop mints a fresh ticket per call (schemaVersion 2).
- Desktop: no secret in the tab URL; main hands the page tickets on load and reconnect (backoff,
  floor, pause with Reconnect), only for the exact URL of a live forward it opened; keyboard stays
  in the desktop until Ctrl+Cmd / Ctrl+Alt; a paste key pushes this computer's clipboard; sandbox
  copies reach this computer after a copy gesture.
- UI: keyboard hint, asleep/starting neutral tone and mapping, persistent error toasts, Beta badge.

* fix(cloud): remote desktop review fixes

- Security review: noVNC host/port/encrypt pinned to the page's origin, CSP connect-src 'self',
  exact-URL + live-forward trust, mint floor and per-minute cap, copy gate on copy gestures only,
  X display cookie.
- Design review: archived is its own neutral state, starting covers waking, page messages say
  "Wake it in Orca", pause overlay is a status for calm states and focuses Reconnect, hint wraps
  and hides from assistive tech when faded.
- FE review: paste follows the keyboard layout, AltGr never releases, page calls settle on
  navigation, state notices only on change, hint once per load/release, paste always pushes,
  no committed bytecode, session tests.

* fix(cloud): remote desktop archived page message, hint layout, fixtures

* fix(cloud): remote desktop copy gate counts double-clicks (pointer events have no click count)

* chore(cloud): remote desktop lint (exhaustive pause reasons, no test casts or wall clock)
2026-11-09 17:36:19 -08:00
Neil 87da8eb16a Merge remote-tracking branch 'private/cloud/integration' into cloud/w2-final 2026-11-09 17:36:10 -08:00
Neil a2a92474c0 fix(cloud): acceptance polls env builds by default (verifies server-side progression); findings update 2026-11-09 17:36:05 -08:00
Neil 04e6a800d8 fix(cloud): env builds finish without a reader: bounded wait=true exit probe (#123)
* fix(sandbox-control): read the orgRole claim that Orca Cloud auth mints (#29)

Auth mints the live org role as orgRole on sandbox tokens (same claim as billing
tokens, stablyai/orca-cloud#695); the verifier read org_role, so admins would
never have been recognized.

* wip(cloud): environment builds control plane

* wip(cloud): environment build boot path, staleness, routes

* wip(cloud): env build tests, anonymous staleness fallback

* wip(cloud): migration 0008 (claimed), quieter recovered clone errors

* fix(cloud): env build review: interrupted-snapshot recovery, bounded log reads, secret redaction, activation guard, hook/prelude fixes

* fix(cloud): wait briefly for the build exit code after its log ends; print the base image and package manager

* wip(desktop): org environments client, IPC, CLI, settings UI, orcad disk usage + low-disk banner

* perf(cloud): smoke-boot each environment build before activating it; skip the redundant prelude fetch

* fix(cloud): a GitHub token error fails the build as github_unavailable instead of cloning anonymously

* perf(cloud): warm pool VMs per hot environment build, so a create from an org environment skips the provider boot

* wip(desktop): cloud environment UI round-3 fixes

* fix(cloud): pool-per-build review: smoke race safety, provider hiccups skip smoke, usage-based hot builds with caps, bounded boots, index

* fix(desktop): Configure with an agent hands the prompt over at launch (trust dialog swallowed the pasted Enter); CLI builds table widths

* polish(desktop): W10 P2s — InlineError action slot, shared focus-ring, copy

* feat(cloud): build event stream heartbeat every 20 s

* fix(desktop): FE review — stable virtualizer, shadow-buffer replays, heartbeat-aware build watch, CLI follower restarts, repo import path checks, poll races

* feat(cloud): meter environment build sandbox time to the member who started it; no setup-script nudge for workspaces booted from an env build

* fix(cloud): environment builds progress server-side on a Durable Object alarm, not only while someone streams their log

* fix(cloud): advance env builds with a bounded wait=true exit probe (Vercel reports exit codes only to waiting readers)
2026-11-09 17:33:04 -08:00
Neil 4220d3f837 Merge pull request #121 from nwparker/cloud/w9-eval
feat(cloud): real-VM acceptance harness (W9) — parity checks, benchmarks, desktop run, evaluation report
2026-11-09 17:29:03 -08:00
Neil 2fca518200 Merge pull request #120 from nwparker/cloud/w6-precedence-test
W6: test + doc that the egress swap uses the same precedence as plain injection
2026-11-09 17:28:53 -08:00
Neil d84196a177 docs(cloud): acceptance findings — W6 precedence confirmed 2026-11-09 17:28:51 -08:00
Neil e95a147837 fix(cloud): env builds progress server-side on a Durable Object alarm, not only while streamed (#118)
* fix(sandbox-control): read the orgRole claim that Orca Cloud auth mints (#29)

Auth mints the live org role as orgRole on sandbox tokens (same claim as billing
tokens, stablyai/orca-cloud#695); the verifier read org_role, so admins would
never have been recognized.

* wip(cloud): environment builds control plane

* wip(cloud): environment build boot path, staleness, routes

* wip(cloud): env build tests, anonymous staleness fallback

* wip(cloud): migration 0008 (claimed), quieter recovered clone errors

* fix(cloud): env build review: interrupted-snapshot recovery, bounded log reads, secret redaction, activation guard, hook/prelude fixes

* fix(cloud): wait briefly for the build exit code after its log ends; print the base image and package manager

* wip(desktop): org environments client, IPC, CLI, settings UI, orcad disk usage + low-disk banner

* perf(cloud): smoke-boot each environment build before activating it; skip the redundant prelude fetch

* fix(cloud): a GitHub token error fails the build as github_unavailable instead of cloning anonymously

* perf(cloud): warm pool VMs per hot environment build, so a create from an org environment skips the provider boot

* wip(desktop): cloud environment UI round-3 fixes

* fix(cloud): pool-per-build review: smoke race safety, provider hiccups skip smoke, usage-based hot builds with caps, bounded boots, index

* fix(desktop): Configure with an agent hands the prompt over at launch (trust dialog swallowed the pasted Enter); CLI builds table widths

* polish(desktop): W10 P2s — InlineError action slot, shared focus-ring, copy

* feat(cloud): build event stream heartbeat every 20 s

* fix(desktop): FE review — stable virtualizer, shadow-buffer replays, heartbeat-aware build watch, CLI follower restarts, repo import path checks, poll races

* feat(cloud): meter environment build sandbox time to the member who started it; no setup-script nudge for workspaces booted from an env build

* fix(cloud): environment builds progress server-side on a Durable Object alarm, not only while someone streams their log
2026-11-09 16:26:55 -08:00
Neil 721d726c4a chore(cloud): register the acceptance harness test runner 2026-11-09 16:26:37 -08:00
Neil 5f4e84fd6d test(sandbox-control): egress swap and plain injection resolve keys with the same precedence (team > repository > personal for agent keys) 2026-11-09 16:19:02 -08:00
Neil 36ef6c1f65 test(cloud): acceptance harness unit tests 2026-11-09 16:17:06 -08:00
Neil be86278bb5 feat(cloud): acceptance desktop import, build event-stream wait, routine creds, key revocation, summary 2026-11-09 16:16:40 -08:00
Neil 86390320c8 feat(cloud): desktop Electron acceptance run (create, keystroke, ports, ssh, sleep/wake, transfer, destroy) 2026-11-09 16:16:39 -08:00
Neil 947813d4fc fix(cloud): acceptance check fixes (seat true-down, repo object, ssh probe, ports bound, kid from key file, load notes) 2026-11-09 16:16:39 -08:00
Neil f0192658c8 feat(cloud): acceptance checks for W1 builds, W2 lifecycle, W3 shares/ssh/ports, W4 team, W5 API/MCP/routines, W8 devices 2026-11-09 16:16:39 -08:00
Neil d904c66d96 feat(cloud): acceptance seat proration and dunning checks (test clocks) 2026-11-09 16:16:38 -08:00
Neil 8433de5032 feat(cloud): acceptance checks for agents, findings, 3DS, kill switch on a slept box 2026-11-09 16:16:38 -08:00
Neil 664a5206df feat(cloud): real-VM acceptance harness skeleton (checks, benchmarks, ledger, report) 2026-11-09 16:16:38 -08:00
Neil 8fec6ef31e feat(sandbox-control): role changes re-cap keys and MCP grants; Idempotency-Key on workspace create; teammate names in API views and the sender envelope 2026-11-09 16:12:43 -08:00
Neil ce3a2ff02c Merge remote-tracking branch 'private/cloud/integration' into cloud/w2-final
# Conflicts:
#	cloud/apps/sandbox-control/src/index.ts
#	src/renderer/src/i18n/locales/en.json
2026-11-09 15:48:05 -08:00
Neil b490cde491 Merge pull request #112 from nwparker/cloud/w5-cli
feat(cli): orca cloud commands + in-VM cloud access (VMs can reach the control plane their token names)
2026-11-09 15:37:43 -08:00
Neil 923a1504b9 fix(cloud): grants register the workspace project on the VM so a phone (which can't add projects) can open it (#111) 2026-11-09 15:32:36 -08:00
Neil 2c084b8c0d Merge cloud/integration into cloud/w2-final; Move to this computer review fixes (archive afterwards, counts, step-aware failure, hide and timeout, focus and announcements, concurrency guard); idle minutes behind a features header 2026-11-09 15:32:07 -08:00
Neil 77d6aecb6e fix(sandbox-control): source golden builds finish even when Vercel keeps reporting the command as running (#108)
Seen live twice: source-build.sh had exited (provision done, no processes left) but GET cmd kept
exitCode null for 40 min, so the build hit its deadline. source-build.sh now writes its exit code
(/tmp/source-build.exit) and the provision report (/tmp/source-build.report); the operator rotation
and the Worker's stepBuild fall back to the marker. The operator script reads the report from the
file instead of the command log stream (which never ends in that state) and prints the running build
step every ~2 min.
2026-11-09 15:22:47 -08:00
Neil 31d9699af5 fix(sandbox-control): let VMs reach the control plane their workspace token names
Workspace tokens tell the in-VM orca cloud CLI to call publicOrigin(env), but
that host was only reachable when EGRESS_EXTRA_HOSTS listed it (previews did,
the dev Worker did not), so every in-VM call failed with 'fetch failed'.
extraEgressHostsFor(env) now always adds the public API host. The CLI's
cloud_unreachable hint inside a VM names the egress allowlist.
2026-11-09 15:20:42 -08:00
Neil 44e7c9fdf6 fix(sandbox-control): register the workspace project in orcad at every start (API, MCP, routines, phone see the repo) (#104)
orcad listed the cloned project only after a client called repo.add, which only the desktop does on
connect. orca-sandbox-start now runs 'orca repo add --path /vercel/sandbox/project' (folder kind
when it is not a git checkout) in the background once orcad is ready; re-adding is a no-op. Verified
on a VM from the active golden: repo list shows /vercel/sandbox/project right after start.
2026-11-09 15:14:54 -08:00
Neil d7497308c1 feat(sandbox-control): egress key swap on by default for every team, per-team kill switch SECRETS_EGRESS_PLACEHOLDERS_OFF 2026-11-09 15:13:19 -08:00
Neil 604ce7c913 Merge pull request #99 from nwparker/cloud/w6-mcp-final
W6: MCP config sync into Orca Cloud sandboxes (egress hosts + OAuth loopback relay)
2026-11-09 15:10:16 -08:00
Neil 53dced42c8 fix(cloud): MCP sync review — generic OAuth relay accepts only a loopback GET for its port (2-min TTL, never displaces a sign-in), first sync is an explicit consent before tokens leave this computer, no '.' on the image PATH 2026-11-09 15:09:45 -08:00
Neil fa70f42ae1 fix(sandbox-control): honest create timing (create_ms/wake_ms, migration 0035); operator golden rotation script (#102)
* feat(sandbox-control): operator golden rotation from a git ref (image/rotate-golden-from-source.ts)

Fallback while the Worker's git-source build can't read the repo: uploads git archive of the ref
(default private/cloud/integration) into a managed-image build sandbox, runs source-build.sh (now
accepts an uploaded ORCA_SRC_DIR), wipes, snapshots, smoke-boots (SOURCE_COMMIT matches, tools, orca
CLI reaches orcad, stop/resume), and registers a smoking golden_images row with bundle_sha256
git:<sha>. Refuses a desktop-less image when the manifest pins one. Durable ledger in
~/.orca-cloud-ops (survives /tmp wipes); --cleanup deletes orphans of an interrupted run.

* fix(sandbox-control): honest create timing: create_ms/wake_ms written once per start, not ready_at - created_at

GET /v1/config said create p95 23 s. Its source, ready_at - created_at, moves on every wake, so every
sandbox slept and woken within two minutes of creation (bench and smoke cycles: 15-23 s, 35-90 s) counted
as a slow create. Real creates on dev are p50 2.9 s / p95 4.0 s. Migration 0035 adds create_ms
(write-ahead row to first ready) and wake_ms (resume claim to ready); createTiming reads create_ms.
2026-11-09 15:08:16 -08:00
Neil 04305cecbe Merge pull request #101 from nwparker/cloud/w4-name
feat(cloud): label teammates from the token name claim (W4, migration 0034)
2026-11-09 15:04:19 -08:00
Neil 119ffb907e feat(cloud): label teammates from the token name claim (member_names, migration 0034)
Each member's own /v1/team request records the sanitized name claim for their account;
workspace views return memberNames for owner, creator, last active and presence ids. Home
falls back to these when the org roster has no entry (dev orgs, members who left). Labels
only; access never reads them. Write failures never fail the request.
2026-11-09 15:03:14 -08:00
Neil d3a9385ab8 fix(cloud): review round 1: cache /v1/config timing per isolate, pending actions stay focusable, retry config after offline, reactive repos in the sidebar row, focus + URL tests 2026-11-09 14:48:07 -08:00
Neil ee1f14b871 Revert "fix(sandbox-control): a workspace started without a repo gets an empty repository Orca can open"
This reverts commit 0c4ec3ac451e173fe0b0c5840a139b08728fc9fb.
2026-11-09 14:48:07 -08:00
Neil 991d8ad665 fix(sandbox-control): a workspace started without a repo gets an empty repository Orca can open 2026-11-09 14:48:07 -08:00
Neil a8d6bb4698 fix(cloud): build sheet round 4: glossary cards, GitHub not connected + no GitHub remote before any sandbox, measured start hint from /v1/config, Orca Cloud host label
- Account/billing cards use glossary titles (Out of sandbox hours, Spend cap reached, Payment failed,
  running-sandbox limits), role-aware next steps, and 'Nothing was created, and you weren't charged.'
- 409 github_not_connected: 'GitHub isn't connected for <owner/repo>' + Connect GitHub (POST
  /v1/github/connect, opens the GitHub install page) + Try again.
- A repo without a GitHub remote is refused in main before the control plane is called, with
  Start empty / Push to GitHub first.
- GET /v1/config serves createTiming (p50/p95 of recent create-to-ready); the sheet's 'usually ~Ns'
  reads it and shows no hint without a measurement.
- Orca Cloud servers display as 'Orca Cloud' in sidebar host labels and the usage segment; legacy
  '<repo> VM <id>' names are renamed at startup.
2026-11-09 14:48:06 -08:00
Neil ea9bac87ee test(billing): robust 3DS e2e (match ACS buttons by name, commit-level waits, settle missed redirects) 2026-11-09 08:55:56 -08:00
Neil 6bd93fc20b feat(cloud): meter environment build time; no setup-script nudge for env-build workspaces (#94)
* fix(sandbox-control): read the orgRole claim that Orca Cloud auth mints (#29)

Auth mints the live org role as orgRole on sandbox tokens (same claim as billing
tokens, stablyai/orca-cloud#695); the verifier read org_role, so admins would
never have been recognized.

* wip(cloud): environment builds control plane

* wip(cloud): environment build boot path, staleness, routes

* wip(cloud): env build tests, anonymous staleness fallback

* wip(cloud): migration 0008 (claimed), quieter recovered clone errors

* fix(cloud): env build review: interrupted-snapshot recovery, bounded log reads, secret redaction, activation guard, hook/prelude fixes

* fix(cloud): wait briefly for the build exit code after its log ends; print the base image and package manager

* wip(desktop): org environments client, IPC, CLI, settings UI, orcad disk usage + low-disk banner

* perf(cloud): smoke-boot each environment build before activating it; skip the redundant prelude fetch

* fix(cloud): a GitHub token error fails the build as github_unavailable instead of cloning anonymously

* perf(cloud): warm pool VMs per hot environment build, so a create from an org environment skips the provider boot

* wip(desktop): cloud environment UI round-3 fixes

* fix(cloud): pool-per-build review: smoke race safety, provider hiccups skip smoke, usage-based hot builds with caps, bounded boots, index

* fix(desktop): Configure with an agent hands the prompt over at launch (trust dialog swallowed the pasted Enter); CLI builds table widths

* polish(desktop): W10 P2s — InlineError action slot, shared focus-ring, copy

* feat(cloud): build event stream heartbeat every 20 s

* fix(desktop): FE review — stable virtualizer, shadow-buffer replays, heartbeat-aware build watch, CLI follower restarts, repo import path checks, poll races

* feat(cloud): meter environment build sandbox time to the member who started it; no setup-script nudge for workspaces booted from an env build
2026-11-09 08:11:06 -08:00