Commit Graph
503 Commits
Author SHA1 Message Date
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 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 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 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 a1676f8109 Merge pull request #105 from nwparker/cloud/staging-test-accounts
chore(cloud): durable staging test-account setup
2026-11-09 15:17:25 -08:00
Neil d843e88b18 chore(cloud): durable staging test-account setup (provision, headless desktop sign-in, >100-invites live check) 2026-11-09 15:16:59 -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
Neil 0df9ea1fbf feat(cloud): org environment builds — desktop: Settings → Cloud environment, live logs, CLI, low-disk banner (#47)
* 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
2026-11-09 08:03:35 -08:00
Neil 3c553acc77 feat(cloud): MCP servers panel on Orca Cloud workspaces; resolve stdio commands like agent launches; image puts node/npx on agents' PATH 2026-11-09 07:59:02 -08:00
Neil 07f607d414 fix(cloud): default workspace git author on images older than the start-script default 2026-11-09 07:48:30 -08:00
Neil 5c53102202 Merge pull request #90 from nwparker/cloud/w6-mcp-egress
W6: per-workspace egress hosts for synced remote MCP servers
2026-11-09 07:46:17 -08:00
Neil 6c2a37c83b feat(sandbox-control): per-workspace tool egress hosts for synced remote MCP servers (PUT/GET /v1/sandboxes/:id/egress/hosts, migration 0032) 2026-11-09 07:46:04 -08:00
Neil 1ba34366c9 chore(cloud): regenerate VM scripts
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-09 07:30:56 -08:00
Neil 6afde0d63d fix(cloud): attest plain terminals by handle+pane (agent terminals still prove their launch token); default workspace git author 2026-11-09 07:30:50 -08:00
Neil baef8f91e0 feat(cloud): member git identity only within a window after the member's own client reports a send (0031); entry points kept current per boot
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-09 07:30:39 -08:00
Neil a3c5f1ed50 fix(cloud): owner device joins the VM member map as soon as it is recorded 2026-11-09 07:30:27 -08:00
Neil fc50ad9466 feat(cloud): per-device sender attestation (orcad orchestration.turnSender, orca sender), root-only member identities + sudo helper, sender-aware git in VMs (default on); terminal-agent sender envelope; follow teammates into chats and chat links; name claim
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
#	src/renderer/src/components/cloud-workspaces/CloudMemberAvatars.tsx
2026-11-09 07:30:27 -08:00
Neil 2d01a3d1b2 feat(w3): remote desktop polish — glossary copy, InlineError toasts with one next action, fixtures (#83) 2026-11-09 07:27:19 -08:00
Neil e141a74ead feat(cloud): one idle-sleep constant (ORCA_CLOUD_IDLE_SLEEP_MINUTES = 15) for control plane, desktop scheduler, billing plans and toasts; GET /v1/config serves it (#80)
Plans said 15 minutes, the desktop slept at 20. The shared wire module now owns the value; the
control plane serves it at GET /v1/config (public product constants), the desktop driver's idleStopMs,
billing's Team plan idleSleepMinutes and the billing fixtures read the constant, and the idle-sleep
toast already prints the scheduler's value from the event.
2026-11-09 07:15:51 -08:00
Neil 0272e323b3 docs(sandbox-control): glossary pass on OpenAPI, /docs and MCP tool descriptions (sandbox, team, sleep/wake/delete, Orca API keys) 2026-11-09 07:12:44 -08:00
Neil 5ab167c0d1 Merge pull request #76 from nwparker/cloud/w2-transfer
feat(cloud): move a cloud workspace to this computer (worktree, changes, chats) + preview wake helper
2026-11-09 07:04:00 -08:00