Commit Graph
21137 Commits
Author SHA1 Message Date
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 47864ce9f4 Merge pull request #212 from nwparker/cloud/overage-rate-copy
copy(billing): overage '{{rate}} per sandbox hour' (glossary)
2026-11-10 02:54:24 -08:00
Neil 4a45475368 Merge pull request #213 from nwparker/ds-15-16-member-billing-checkout
feat(billing): member billing walls and back-to-work after checkout (DS-15, DS-16)
2026-11-10 02:53:58 -08:00
Neil 548e1549ae fix(billing): 'Use this computer instead' and glossary error order on member cards
Design-squad sign-off tweaks for DS-15: the action reopens the composer rather
than creating, so it says so; member billing bodies put 'Nothing was created,
and you weren't charged.' before who to ask.
2026-11-10 02:51:58 -08:00
Neil 9a4bd94b66 feat(billing): member billing walls and back-to-work after checkout (DS-15, DS-16)
DS-15: no-plan access carries canManageBilling. Members see 'Ask an owner or
admin' instead of Upgrade, and the hint says 'Ask an owner or admin to choose
one.'; at the cap they're told to raise the spend cap. Every billing failure
on the build card offers 'Create on this computer instead' (same prompt,
Local), and Dismiss hands the typed prompt back to the composer.

DS-16: choosing a plan from an Orca Cloud wall leaves an intent. Once paid,
the plans dialog returns to the open composer with Orca Cloud picked, or
retries the refused create. The no-plan card adds Try again, and the Team
page's create action opens on Orca Cloud.
2026-11-10 02:44:31 -08:00
Neil 0c542e8375 copy(billing): overage reads '{{rate}} per sandbox hour' with the rate from the plan (glossary); formatRateCents always shows cents 2026-11-10 02:41:21 -08:00
Neil a5b87f43f2 Merge pull request #208 from nwparker/ds17-team-switch-reload
fix(cloud): reload billing, secrets, API keys and workspaces on team switch (DS-17)
2026-11-10 02:40:15 -08:00
Neil 05ce474270 Merge pull request #207 from nwparker/cloud/w5-ui-ds26b
fix(cloud): quieter run failure reasons, capped availability backoff (DS-26/DS-36 follow-up)
2026-11-10 02:39:19 -08:00
Neil 046e08f60d fix(cloud-ports): keyboard Share and More actions on port rows, W3 copy and contrast (DS-29) (#209)
- Port rows get hover/focus buttons: Open in browser, Share… (Orca Cloud), and
  More actions for port N, which opens the existing row menu.
- Drop focus:outline-none on the port row group so the focus-ring shows.
- Retry -> Try again; listen failure copy; sentence case for SSH/ports labels.
- Remote desktop notCloud/notInstalled/signedOut render neutral, not red.
- busy/taken -> in use on this computer.
- Expired / Turned off share status keeps full text-muted-foreground.
- New i18n keys for changed defaults; stale keys pruned from all locales.
- Fixtures: share-links portRowFocused / portRowShareFocused / portRowMoreActions.
2026-11-10 02:39:06 -08:00
Neil c689f1eddb fix(cloud): reload billing, secrets, API keys and workspaces on team switch (DS-17)
Settings and Home kept showing the previous team's plan, secrets, keys and
workspaces after a team switch while saves went to the new team, and a
billing read from before the switch could land in local state.

- useOrcaAccountKey() gives `${userId}:${activeOrgId}`; Plan & billing,
  Cloud secrets, Cloud environment and Orca API keys remount on it.
- useOrcaBillingStatus re-reads on a switch, clears the old plan, and
  drops (and re-reads) an answer whose billing generation moved.
- useCloudWorkspaces keys its read by account, hides another team's list
  instead of dimming it; Home resets its filters on a switch.
- Hook tests cover the stale response being dropped and the new team read.
2026-11-10 02:33:43 -08:00
Neil a3f28c1733 Merge pull request #206 from nwparker/ds-18-price-formats
fix(billing): spell out price formats (DS-18)
2026-11-10 02:32:06 -08:00
Neil 16d2a7aebf fix(cloud): DS-26 follow-up — run failure reasons as one quiet line (neutral for skipped/superseded/workspace gone), capped availability backoff that stops without subscribers, "Couldn't reach Orca Cloud." 2026-11-10 02:27:26 -08:00
Neil 519f6f6c9b fix(billing): spell out price formats per DS-18
Line items: '{{seats}} x {{price}} per seat, billed yearly' / 'per seat per month'
(plural keys); totals '{{total}} per year' / 'per month'; Worker plan labels
'$50 per seat per month' and '$480 per seat, billed yearly'. Drops /mo, /yr,
/year and /seat/month strings.
2026-11-10 02:27:14 -08:00
Neil b5a00612ca Merge pull request #205 from nwparker/cloud/w5-ui-ds26
fix(cloud): routine run failures in plain words; one page error on Orca API keys; Routines on Cloud workspaces (DS-26, DS-36)
2026-11-10 02:24:13 -08:00
Neil 2cf08c221e fix(run-actions): follow cloud tabs adopted as web-terminal-<id>, settle tab-list churn before forgetting a run, retire the dead tab after a relaunch; honor a host-pinned ORCA_PORT
Found on a real Orca Cloud VM (m4air): a remote host adopts the run's tab under web-terminal-<id>,
so the run was pruned at once and Stop/status/relaunch lost it; a window reload's empty tab list
pruned local runs too. Pruning now waits for the list to settle (3 s; 15 s after startup).
A one-workspace host (the VM launcher sets ORCA_PORT=3000) keeps its pinned block.
2026-11-10 02:22:07 -08:00
Neil a4f5062278 Merge pull request #204 from nwparker/cloud/ds23-entitlement-classifier
refactor(cloud): shared classifyEntitlementDenial (DS-23)
2026-11-10 02:22:00 -08:00
Neil 7de9fe8f25 fix(cloud): DS-26 run failures in plain words via InlineError; DS-36 one page-level error on Orca API keys, MCP tag contrast, Routines entry on Cloud workspaces, availability probes don't cache rejections 2026-11-10 02:20:29 -08:00
Neil 10a9c7e3a3 fix(cloud): exhaustive switches over the denial classifier 2026-11-10 02:19:23 -08:00
Neil 92142679a5 refactor(cloud): one classifyEntitlementDenial in src/shared/orca-billing.ts (DS-23); run-on access, build failure, build log, workspace errors and the phone keep their own wording 2026-11-10 02:17:30 -08:00
Neil ebec244447 Merge pull request #203 from nwparker/cloud/agents-gaps2
feat(cloud): swap COPILOT_GITHUB_TOKEN and GOOGLE_API_KEY at egress; routines run all six image agents; AWS keys marked stored on workspace
2026-11-10 02:16:56 -08:00
Neil 42b5d60656 style: one import for cloud-secret-rules 2026-11-10 02:14:30 -08:00
Neil df8927b7f5 fix(cloud): security review: Copilot token limited to Copilot's GitHub endpoints; routine summaries are final messages with session secrets redacted; untrusted context capped
- COPILOT_GITHUB_TOKEN on api.github.com: GET /user and GET /copilot_internal/* only (normalized
  paths; dot or encoded segments refused); the Copilot API hosts are unchanged. It resolves like
  an env variable (personal beats team): it is one person's GitHub identity.
- Routine summaries for opencode (JSON events), cursor (JSON result) and copilot (--silent) are the
  agent's final message, and every summary has the session's secret values replaced before it can
  be posted as a comment or PR body.
- Webhook/GitHub context in a routine prompt is capped at 48 KiB (compact, then cut), so a prompt
  passed as one argv entry stays under Linux's 128 KiB limit.
- A test fails if an agent credential is neither swapped nor marked 'Stored on workspace'.
2026-11-10 02:13:11 -08:00
Neil e35ff0844a feat(cloud): COPILOT_GITHUB_TOKEN and GOOGLE_API_KEY swapped at egress; routines run all six image agents; AWS keys marked stored on workspace
- COPILOT_GITHUB_TOKEN: placeholder in the VM, swapped on api.github.com (Bearer or token form, next to
  the workspace token's own route) and on the Copilot API hosts (left open for Copilot's own session
  token). GOOGLE_API_KEY: swapped on generativelanguage.googleapis.com and aiplatform.googleapis.com
  (Vertex express). A credential may now route to several hosts.
- Routines accept claude, codex, opencode, gemini, cursor and copilot; the in-VM runner has a
  headless command for each (checked against a local stand-in model: prompts starting with '-' stay
  prompts). The editor picks the agent from a list.
- AWS_* keys (SigV4, signed in the VM) and Bedrock API keys can't be swapped: the secrets UI marks
  them 'Stored on workspace' with the reason, in the list, the .env preview, the effective view and
  the editor.
- Gemini's auth method is seeded for GOOGLE_API_KEY too (vertex-ai with GOOGLE_GENAI_USE_VERTEXAI);
  headless Gemini refuses to start without one.
2026-11-10 02:08:00 -08:00
Neil 209d658b03 Merge pull request #202 from nwparker/cloud/status-rate
feat(cloud): one overage constant ($1/h); workspaces show sandbox hours, not dollars
2026-11-10 01:57:47 -08:00
Neil d4653c15d3 feat(cloud): one overage constant (ORCA_CLOUD_OVERAGE_CENTS_PER_HOUR, $1) for billing and the control plane; workspaces show sandbox hours, not per-workspace dollars (desktop list, phone status) 2026-11-10 01:52:05 -08:00
Neil ff5fb6b631 Merge pull request #201 from nwparker/cloud/w9-eval
feat(cloud): acceptance — agent image/keys-swap rows, sub.size at 8/16, region/size AFTER benchmarks
2026-11-10 01:46:39 -08:00
Neil 8550787232 docs(cloud): region/size AFTER benchmarks — wake p95 5.85 s in pdx1 2026-11-10 01:45:21 -08:00
Neil 2920f1c173 feat(cloud): acceptance image.agents, agent.keys-swap (no model), sub.size at 8/16 (U18); more-agents owner-reported 2026-11-10 01:45:21 -08:00
Neil d2593a8605 Merge pull request #187 from nwparker/cloud/run-actions-ports
Run actions (orca.yaml scripts.run) + per-workspace ORCA_PORT blocks; Conductor import
2026-11-10 01:37:21 -08:00
Neil 01335d7cfc Merge pull request #200 from nwparker/cloud/agents-creds
fix(cloud): Copilot CLI sign-in works in cloud workspaces (GitHub placeholder no longer overrides /login)
2026-11-10 01:36:09 -08:00
Neil bf7477e1ce refactor(cloud): run-action wake relaunch subscribes to wake progress itself (store stays under max-lines) 2026-11-10 01:35:06 -08:00
Neil 1095b509fc fix(cloud): Copilot CLI sign-in works in cloud workspaces (GitHub placeholder no longer overrides /login)
Copilot prefers GH_TOKEN/GITHUB_TOKEN over a stored /login. In Orca Cloud those hold the workspace
GitHub App placeholder, so every Copilot start said 'Resource not accessible by integration' and a
user who signed in could never use it. A wrapper drops the two placeholders for Copilot only, unless
BYOK is configured (no GitHub sign-in needed; gh in Copilot's shell keeps working).
2026-11-10 01:33:29 -08:00
Neil 118c74fb51 Merge remote-tracking branch 'private/cloud/integration' into cloud/run-actions-ports 2026-11-10 01:33:03 -08:00
Neil 7f4ff74bde Merge pull request #188 from nwparker/cloud/agents-picker
Orca Cloud agent pickers list only the agents the image ships
2026-11-10 01:28:09 -08:00
Neil 084369b74c Merge pull request #199 from nwparker/cloud/overage-100
feat(billing): overage $1.00 per sandbox hour (interim)
2026-11-10 01:28:08 -08:00
Neil dc0bf820ea feat(billing): overage $1.00 per sandbox hour (interim); plans.ts is the single source (setup script, e2e and spend-cap math read it); new Stripe TEST price 2026-11-10 01:26:39 -08:00
Neil 440e6b2737 Merge pull request #198 from nwparker/cloud/w9-eval
feat(cloud): acceptance region/size bench tools, external-result import, checkpoints verified, agent caps for user e2e
2026-11-10 01:22:24 -08:00
Neil f1aa875edc docs(cloud): checkpoints verified independently by W9 (host path + real git tests) 2026-11-10 01:21:08 -08:00
Neil 1c50f70acc Merge pull request #197 from nwparker/cloud/w2-wake-polish
fix(cloud): waking pill clears the pane header icons; predictive pill counts from the intent
2026-11-10 01:20:43 -08:00
Neil c9c0a0c65e feat(cloud): acceptance records owner-reported results (import-external); checkpoints capped until independent run 2026-11-10 01:20:19 -08:00
Neil f6b6c5141c feat(cloud): acceptance create-bench (host CPU/size/region), wake-split region + CPU per wake, bench-summary 2026-11-10 01:20:19 -08:00
Neil f9cc0f0c89 docs(cloud): agent caps lifted only by the user's own e2e session (no gateway runs) 2026-11-10 01:20:19 -08:00
Neil 84fc2c87e3 Merge pull request #191 from nwparker/cloud/code-checkpoints
feat(native-chat): per-turn code checkpoints; Rewind can also restore files
2026-11-10 01:18:54 -08:00
Neil afcb876aa9 fix(cloud): waking pill sits below the pane header icons (split/close stay clickable); a predictive wake's pill counts from the intent, not from the resume after its checks 2026-11-10 01:17:03 -08:00
Neil 434b89f36d fix(run-actions): keep every run with a live tab across reloads (restart replaces it); local runs that ended while unobserved read as exited after startup 2026-11-10 01:16:42 -08:00
Neil 027ca19046 fix(checkpoints): newline-safe undo coverage, path-matched workspace busy, focus Cancel
- assertUndoCovers never asks batch-check about a path with a newline (counts as
  unsaved), so answers can't shift.
- The workspace-busy probe matches rows by workspace id or worktree realpath and
  treats a truncated listing as busy.
- Rewind dialog opens with focus on Cancel; a disabled option reads as disabled.
- Notes: unreadable tracked deletes keep their staged blob; the turn-starting
  mark is process-local by design.
2026-11-10 01:14:22 -08:00
Neil 80af83cb46 fix(checkpoints): nested repos, undo coverage, workspace-wide busy; W10 copy
- Refuse a restore that would write or delete inside a nested repository, and
  verify every on-disk path it touches is in the undo tree first (git add can
  skip a path without failing).
- A turn counts as busy from its snapshot until the hand-off; terminal agents
  working in the workspace make restores refuse; the preview reports busy and
  the dialog disables the files choice.
- W10 copy: statement description, i18n plurals, state-dependent detail line,
  option directly under the description, 'The chat was rewound, but…' errors.
- Index restore keeps skip-worktree bits; large-file scan honours the deadline.
- Component fixture for the rewind prompt states.
2026-11-10 01:08:53 -08:00
Neil ce388262db test(e2e): live spec settles on a quiet chat, logs dispatch state 2026-11-10 01:08:53 -08:00
Neil 94d0d4041f test(e2e): live rewind-with-restore against a real Claude Code agent 2026-11-10 01:08:53 -08:00