Commit Graph
21206 Commits
Author SHA1 Message Date
Neil dc150fa8a5 fix(run-actions): a split pane in the run tab can't end the run; autoRunAfterSetup fires on first open when the host ran setup in an environment build
- Command-finished events carry the pane's leaf; a run learns its pane while its tab has one,
  ignores other panes, and Stop interrupts the run's own pane.
- Workspaces whose setup ran in the environment build (hooks report environmentProvisioned) start
  the autoRunAfterSetup action the first time they are opened, once per workspace.
2026-11-10 04:09:36 -08:00
Neil ceea5240df Merge pull request #233 from nwparker/cloud/run-actions-semantics
Run actions: nonconcurrent = same action only; host launcher port block goes to the first workspace
2026-11-10 04:06:10 -08:00
Neil c12d99f08e fix(w8): DS-41 phone polish (grouped backdrop, amber contrast, access row labels) (#232)
* fix(w8): DS-41 phone polish: grey backdrop behind white groups in light, light amber at 3:1+, access rows read '{device}, last used {date}' with a 'Removes this phone's access' hint

* fix(w8): DS-41 review: white text on light amber badges (onStatusAmber, 5:1), grey backdrop only behind grouped lists (card screens keep white), 'connected {date}' label when a phone was never used
2026-11-10 04:05:52 -08:00
Neil 2d99d9b591 fix(w8): DS-28 new cloud workspace repo picker + idle-sleep line (#231)
* feat(w8): DS-28 new cloud workspace: pick the repository from this phone's recents and the team's projects ('Other repository…' for any other), and say 'Sleeps after N minutes idle' (new screen, empty Home)

* copy(w8): DS-28 with the picker, the note says 'Pick none for a blank project'

* fix(w8): DS-28 review: explicit 'No repository (blank project)' row, the field stays while typing an unlisted repo, choosing 'Other repository…' again keeps the text

* fix(w8): DS-28 nit: typing in the field selects 'Other repository…'
2026-11-10 04:03:15 -08:00
Neil 298844533c fix(run-actions): nonconcurrent stops only the same action elsewhere; ports: a host launcher's block goes to the first workspace, the rest get registry blocks
- nonconcurrent now matches Conductor's run_mode: starting it stops that action in the project's
  other workspaces; the project's other actions keep running (W9 finding).
- A VM launcher's ORCA_PORT=3000 is the first workspace's block (persisted, stable across wake), so
  its agents, terminals, setup and run actions all agree; later worktrees on the VM get registry
  blocks that never overlap it. The daemon no longer hands the host's block to panes without one,
  and setup/archive hooks resolve the workspace block before they run.
2026-11-10 04:01:24 -08:00
Neil a7989dfd1e fix(w8): DS-27 phone cloud states: sign in when not connected (returns to the link), 'Couldn't reach Orca Cloud' on errors, Not responding + owner Restart, Deleting, glossary-only headline, asleep cloud host gate (Wake), banner 'Try again'; state logic tested (#227) 2026-11-10 04:00:07 -08:00
Neil 55598b5432 Merge pull request #230 from nwparker/cloud/w9-eval
feat(cloud): acceptance read-asleep access control and phone protocol, triggered by W9
2026-11-10 04:00:03 -08:00
Neil adc417cae5 feat(cloud): acceptance read-asleep access (operator member removal, private prune) and phone protocol path, by W9 2026-11-10 03:54:00 -08:00
Neil 3f2b8ead4e Merge pull request #228 from nwparker/cloud/w9-eval
feat(cloud): acceptance — run actions + ports (m4air UI), read-while-asleep (live E2EE), gap rows
2026-11-10 03:51:42 -08:00
Neil f88c09c7fa Merge pull request #211 from nwparker/cloud/w2-squad-archive
fix(cloud): archive from the team list really stops the sandbox (DS-01 P0, DS-09)
2026-11-10 03:47:46 -08:00
Neil c14e875adc Merge pull request #225 from nwparker/fix/ds-34-44-billing-polish
fix(billing): DS-34 billing polish + DS-44 nits
2026-11-10 03:42:47 -08:00
Neil b199587d7e feat(cloud): desktop run actions + ports checks (W9D_ONLY=run-actions)
- local.run-actions: autoRunAfterSetup after a good setup and not after a failed one, Run button,
  one trust prompt, Stop -> Stopped, menu Restart replaces the tab, Cmd+Opt+Enter start/restart
- run.nonconcurrent: echo-loop started in B stops A's
- run.ports: ORCA_PORT/ORCA_PORT_COUNT/CONDUCTOR_PORT per terminal, distinct blocks, stable across
  an app restart, served locally; cloud half: the action in the VM reachable here via auto-forward
- run.cloud-resume: action back after Sleep/wake and after Restart sandbox
2026-11-10 03:42:31 -08:00
Neil 29cdd2cb99 feat(cloud): acceptance read-while-asleep (live, E2EE, no wake) plus access/phone rows (owner-reported) 2026-11-10 03:42:31 -08:00
Neil 322ba5eabb feat(cloud): acceptance catalog rows for run actions and per-workspace ports (gap 4) 2026-11-10 03:42:31 -08:00
Neil c5199433a9 Merge pull request #214 from nwparker/cloud/w6-secret-request
feat(cloud): agent secret requests: orcad RPC, orca secret request, orca-env (contract §3)
2026-11-10 03:42:02 -08:00
Neil 6fa10c836b Merge remote-tracking branch 'private/cloud/integration' into cloud/w2-squad-archive
# Conflicts:
#	src/renderer/src/components/orca-cloud/cloud-workspace-actions.ts
2026-11-10 03:40:01 -08:00
Neil 018f918a8c fix(billing): usage warning states the actual share used, floored (DS-34 review) 2026-11-10 03:39:22 -08:00
Neil 01d2482a3a fix(billing): one billing store, skeleton, plurals, plans focus and billing nits (DS-34, DS-44)
DS-34:
- One billing store (billing-summary-store) replaces the summary, the hook's local state and the
  Run-on picker cache; it keeps the last good result through a failed read and still drops answers
  from before a team or account switch (DS-17).
- Skeleton while Plan & billing loads.
- '{{count}} sandbox hours left' and '{{count}} sandbox hours over the included amount this month'
  as i18n plurals; no bare 'hours'; the unreachable 100% branch is gone.
- Usage warning driven by usageWarningPercent ('Your team has used {{percent}}% of this month's
  sandbox hours.'), in Settings, the plans page and the account menu.
- capTooHigh states the maximum ('The spend cap can be at most {{max}}.'), from offers.maxSpendCapCents.
- Plans dialog focuses its heading on open, so Tab reaches the interval toggle before the cards.
- Payment notice uses InlineError; the build card's overage buttons land on the overage section.
- Account menu names the team once and adds the hours-left line.

DS-44: warning tone at 90%+, '$' as an input prefix, neutral paid check, 24px dialog close hit
area, no <p> inside the CheckoutPanel <dl>.
2026-11-10 03:39:21 -08:00
Neil e604bd4f39 Merge pull request #226 from nwparker/cloud/u22-cpu-fairuse
feat(sandbox-control): internal per-session CPU + operator fair-use report (U22)
2026-11-10 03:38:55 -08:00
Neil cfb0b56118 fix(cloud): archive confirm starts focus on Cancel 2026-11-10 03:36:20 -08:00
Neil e02edd279f Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-secret-request
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-10 03:34:32 -08:00
Neil d76cb62c57 fix(sandbox-control): keep preview URLs on for the dev Worker (preview aliases 404ed) (#224) 2026-11-10 03:34:07 -08:00
Neil f8e362259a fix(cloud): harden agent secret requests (review of #214)
- Agent and worktree come from the terminal orcad verifies from launch
  evidence (verifiedCallerTerminalHandle, shared with turn-sender); the
  terminalHandle param is gone and a worktree hint is kept only when the
  host knows it.
- secrets.* are accepted, and their events sent, only on cloud orcad
  (ORCA_IS_CLOUD=1 + ORCA_SANDBOX_ID); already-set never reads orcad's env.
- touchRequest emits secrets.requestUpdated; natural expiry emits
  secrets.requestSettled {status: expired}.
- orca-env skips the control plane's reserved names and prefixes, with a
  test that reads them from secrets.ts.
- reason drops bidi controls and turns C0/C1 controls into spaces.
2026-11-10 03:34:04 -08:00
Neil 43aa595ee7 feat(sandbox-control): internal per-session CPU tracking and fair-use report (U22)
Customers keep flat sandbox hours. Each stopped session's activeCpuDurationMs
(from Vercel's stop response or GET session) is stored in a new session_cpu
table (migration 0042), idempotent per session. Recording is best-effort and
never blocks suspend, stop or usage reporting; a 5-minute cron sweep retries
recent sessions still missing CPU. Operator-only GET /v1/internal/fair-use
reports per-account 30-day utilisation sum(active_cpu_ms)/sum(wall_ms*vcpus)
with fairUseFlag above 60%. Nothing reaches usage_outbox, billing or clients.
2026-11-10 03:34:00 -08:00
Neil 0f8ab90314 Merge pull request #222 from nwparker/cloud/w6-agent-sources
W6: agent Source per person (/v1/agent-sources) + per-agent credential names
2026-11-10 03:31:03 -08:00
Neil bc7e012e6e Merge pull request #219 from nwparker/cloud/agents-a6
feat(cloud): this computer's Agent API Keys never reach an Orca Cloud VM; save each as a personal Cloud secret (A6)
2026-11-10 03:27:21 -08:00
Neil 18918529cf Merge pull request #218 from nwparker/cloud/read-snapshot-session-list
fix(cloud): read snapshot lists chats from orcad's session store
2026-11-10 03:24:40 -08:00
Neil 4b31500921 Merge pull request #221 from nwparker/cloud/run-actions-no-port-pin
fix(ports): each workspace keeps its own ORCA_PORT block, even on a VM whose launcher sets ORCA_PORT
2026-11-10 03:24:09 -08:00
Neil 9d9d91e875 Merge pull request #220 from nwparker/ds-35-signin-copy-team-page
fix(cloud): DS-35 sign-in copy, one unauthorized sentence, team busy row and chip contrast
2026-11-10 03:23:46 -08:00
Neil 9b56250956 feat(cloud): agent Source per person (GET/PUT /v1/agent-sources, offer answers, owner block) — 'Your sign-in' keeps that agent's credentials out of the sandbox session live; shared credential-names module + Worker mirror (migration 0041) 2026-11-10 03:21:22 -08:00
Neil c7f9f4a80b fix(cloud): DS-35 expired session is a neutral status with a LogIn Sign in action 2026-11-10 03:20:21 -08:00
Neil 8102e770dc fix(cloud): the registry edit can no longer label a workspace archived; tests for asleep archive (no wake) and creating/suspending refusals 2026-11-10 03:18:45 -08:00
Neil 97764fe305 fix(cloud): DS-35 sign-in copy, one unauthorized sentence, team busy row and chip contrast
- Orca account pane: signed-out and reconnect-required lines name Orca Cloud.
- Every unauthorized failure (lifecycle toast, cloud workspace errors, share links,
  cloud secrets) now says "Sign in to Orca again to continue." with a "Sign in" action.
- Team page busy row keeps full contrast: spinner + aria-busy, no opacity dimming.
- destructive-chip text uses a new --destructive-text token (light: 85% mix with
  foreground) so it clears AA on its tint.
- TeamDialogHost quietRefresh depends on the stable refresh callbacks.
2026-11-10 03:13:26 -08:00
Neil 233ddf8111 fix(ports): never pin every workspace on a host to the host's ORCA_PORT
#216 let a launcher-set ORCA_PORT (the VM launcher sets 3000) override the per-workspace block, so
two worktrees on one cloud VM would both get 3000. Each workspace always gets its own registry
block again; a regression test covers a host env with ORCA_PORT=3000.
2026-11-10 03:12:32 -08:00
Neil 86ccf4eb29 fix(cloud): read snapshot lists chats from orcad's session store (the local socket can't stream subscribeStatus)
Live on dev the first capture sealed zero sessions: agentSession.subscribeStatus needs a streaming
transport and the unix socket refuses it, and worktree.ps lists only agents live right now. The
collector now reads orcad's own session records (agent-session-journal.db, read-only): provider,
name and last turn, open tabs first; live worktree.ps rows override status; history still comes
from agentSession.history, with the stored last turn as fallback.
2026-11-10 03:10:34 -08:00
Neil be26e2f832 copy(w8): DS-04 phone status reads "N sandbox hours so far. Uses sandbox hours while running." / "…Uses no sandbox hours while asleep." (no dollars) (#217) 2026-11-10 03:09:39 -08:00
Neil 9b48cee115 Merge pull request #216 from nwparker/cloud/run-actions-followup
Run actions: fixes from the live cloud proof (adopted tab ids, persisted runs, rollover relaunch, host-pinned ORCA_PORT)
2026-11-10 03:09:04 -08:00
Neil c392a487a1 Merge remote-tracking branch 'private/cloud/integration' into cloud/w2-squad-archive
# Conflicts:
#	cloud/apps/sandbox-control/src/index.ts
#	src/renderer/src/components/cloud-workspaces/CloudWorkspacesHome.tsx
#	src/renderer/src/i18n/locales/en.json
2026-11-10 03:09:00 -08:00
Neil 7dbd33a1ad Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-secret-request
# Conflicts:
#	cloud/apps/sandbox-control/image/provision-golden.sh
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-10 03:05:52 -08:00
Neil d3bf567b19 fix: keep the launch path free of Electron (user data path set at startup) 2026-11-10 03:05:42 -08:00
Neil 7734019354 fix(w3): DS-29 follow-up — port row inline actions trimmed, distinct Copy details icon (#215)
* fix(w3): port row keeps only Open in browser, Share… and More inline; Copy details gets its own icon (DS-29 follow-up)

* chore(w3): drop the unreferenced inline copy-button label from every locale
2026-11-10 03:04:17 -08:00
Neil 797504f582 chore(run-actions): read worktree records through the catalog selector 2026-11-10 03:02:30 -08:00
Neil 0b4a4327a9 Merge pull request #189 from nwparker/cloud/sleeping-read-snapshot
feat(cloud): read a sleeping workspace from an E2EE snapshot, without waking it (gap 5)
2026-11-10 03:01:19 -08:00
Neil a4b5d89437 Merge remote-tracking branch 'private/cloud/integration' into cloud/sleeping-read-snapshot 2026-11-10 03:01:14 -08:00
Neil 4ececa2c61 fix: keep the runtime call site to its original size; one import per module 2026-11-10 03:00:43 -08:00
Neil 07ff07d386 Merge pull request #210 from nwparker/cloud/checkpoints-ds39
DS-39: rewind file list, files-only restore, focus ring, disabled checkbox
2026-11-10 02:59:21 -08:00
Neil e3748c9725 Merge remote-tracking branch 'private/cloud/integration' into cloud/w2-squad-archive
# Conflicts:
#	src/renderer/src/i18n/locales/en.json
2026-11-10 02:57:28 -08:00
Neil b341b2b7dd Merge remote-tracking branch 'private/cloud/integration' into cloud/run-actions-followup 2026-11-10 02:55:44 -08:00
Neil e9561c3c50 fix(run-actions): persisted runs load at startup (TDZ), relaunch after a rollover waits for the new host to answer
Found live on an Orca Cloud rollover (m4air): the persisted-run reader referenced a const declared
below the module-level read, so every restart started with no runs and nothing relaunched. The
relaunch also read orca.yaml before the replacement host served RPCs; it now retries with a bound.
2026-11-10 02:55:34 -08:00
Neil 81577b1ac7 feat(cloud): agent secret requests (secrets.request RPC, orca secret request, orca-env)
orcad keeps agent-initiated secret requests in memory with the contract's
limits (3 pending, 10/hour, 15 min TTL, touch capped at 60 min, dedupe per
name), derives the agent from the calling terminal, and announces
secrets.requested on runtime.clientEvents (replayed on attach; phones get
status only). The CLI waits on it and prints the D4 reload hint; the VM
ships orca-env and makes zsh read the session env hook.
2026-11-10 02:55:15 -08:00