Commit Graph
16894 Commits
Author SHA1 Message Date
Neil 3ce99fa03b fix(cloud): design-squad sign-off fixes: no section numbers, pre-save helper copy 2026-11-10 06:23:27 -08:00
Neil ea1f1a43cf fix(cloud): plain chips instead of restyled Badge (shadcn no-restyle) 2026-11-10 06:14:58 -08:00
Neil 9b1754a6d7 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-spec-ui
# Conflicts:
#	src/renderer/src/i18n/locales/en.json
2026-11-10 06:12:10 -08:00
Neil a5859bdfdc fix(cloud): W6 UI review round 2: replay pruning on ready, Dismiss focus, F6 scope, split-group visibility, lint 2026-11-10 06:07:25 -08:00
Neil 055428b381 feat(billing): dedicated 100% usage alert copy by overage state (design-squad) 2026-11-10 06:03:44 -08:00
Neil 6273ed88fe fix(billing): async ledger I/O behind a queue; no casts in usage alerts 2026-11-10 06:03:44 -08:00
Neil 6a8f8b2b0f test(billing): type the usage-alert show mock 2026-11-10 06:03:44 -08:00
Neil 7f5e6a9af3 feat(billing): alert owners and admins at 75/90/100% of sandbox hours
- Desktop notification (title "Orca Cloud", body reuses the in-app usage sentence) when a
  billing read crosses 75, 90 or 100%, once per level per account and billing period. Main
  owns the ledger (userData/orca-billing-usage-alerts.json), so reloads, re-renders and
  second windows never repeat it; a new period starts over. Members are never notified.
- Click opens Settings > Orca account (Plan & billing) via ui:openSettings with a target.
- The in-app usage notice (account menu, billing panel, plans page) is now owners/admins only.
- Billing panel: muted note under the Overage description that owners and admins are alerted
  at 75%, 90% and 100%.
- Fixtures: account menu at 90% (admin and member), billing panel member at 90%.
2026-11-10 06:03:44 -08:00
Neil 95bb1dd372 Merge pull request #249 from nwparker/cloud/w6-a9-recipe
A9 sign-out before delete + recipe env-forwarding warning (P-4)
2026-11-10 06:03:08 -08:00
Neil 99c52ba889 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-a9-recipe
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-10 05:53:41 -08:00
Neil aac87b9446 fix(cloud-start): parse setup errors without type assertions 2026-11-10 05:50:29 -08:00
Neil 21ac87b972 feat(cloud-start): setup return link, setup telemetry, X1 error model, B2 team-plans lookup (NP-4)
- N9: orca://cloud/setup/return?session=cs_… is routed (open-url + second
  instance), validated, focuses Orca and fans out to renderer listeners
  (onCloudSetupReturn) so the setup session re-reads at once.
- N10: cloud_setup_step_{started,done,failed}, cloud_setup_first_sandbox and
  cloud_setup_plan_chosen, enum-only, derived from the setup rows.
- X1: setup error kinds (timed_out, checkout_canceled, bank_step,
  trial_unavailable, team_create_failed, wrong_account) and their actions.
- B2: billing POST /v1/billing/team-plans returns other teams' plan state with
  the caller's own token; auth confirms membership from that token (no new
  credential). Desktop IPC billingTeamPlans + useSwitchToPlannedTeam. The team
  switch logic moves out of SidebarTeamSubmenu so the composer can reuse it.
2026-11-10 05:50:29 -08:00
Neil 5b8bc2d479 Merge pull request #244 from nwparker/cloud/agents-a6-design
fix(cloud): A6/DS-02 design follow-ups (Save to your Orca account rows, catalog names, cloud build-sheet fixture, DS-33 hint)
2026-11-10 05:47:28 -08:00
Neil 732c04ddd7 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-a9-recipe
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-10 05:43:06 -08:00
Neil 7fa51b6a0b Merge pull request #246 from nwparker/np4/github-repo-access
NP-4: GitHub repo access, preselected install URLs, install requests, webhook auto-start, repository list (N2/N3/N12, D2/D3)
2026-11-10 05:42:57 -08:00
Neil e897152ec4 fix(cloud): W6 UI review round 1: S4-b focus/F6, collapse, Details hook, routing, replay, shared copy 2026-11-10 05:38:20 -08:00
Neil 4620815e04 fix(cloud): DS-02 sign-off fixes: saved row drops 'only on this computer', a failed row's only action is Try again, the variable sits on its own line; Agent API keys scope note
Per design-squad on #244. The Agent API keys editor gets one muted line under the host scope choice,
'Not used in Orca Cloud. Save a key to your Orca account to use it in cloud workspaces.', instead of
changing #40303's own label.
2026-11-10 05:32:00 -08:00
Neil d6e36a9c38 merge integration 2026-11-10 05:31:24 -08:00
Neil 4114eea5d0 fix(cloud): show the delete sign-out line only when the running sandbox holds a CLI login (D14) 2026-11-10 05:28:37 -08:00
Neil fed130d30a feat(cloud): orcad reports its build; desktop flags out-of-range version skew with a cloud workspace (#254)
* feat(cloud): orcad reports its build commit; desktop flags out-of-range version skew with a cloud workspace

* review: shared compat verdict, status role, retries, tests, version-skew runbook section

* fix: lint gates (async commit read, no casts, retry outside effect, surface split)

* test(cloud): status panel error action is Try again (DS-13 copy)
2026-11-10 05:27:55 -08:00
Neil 849a12773b fix(cloud): find agent CLIs in /opt/orca/tools/bin; delete note only for running sandboxes; test retry skip
Verified on a dev sandbox (Claude Code 2.1.319, codex-cli 0.166.0): runCommand runs as ubuntu with
HOME=/vercel (same user as orcad); `claude auth logout` and `codex logout` exist and exit 0; the
script reported {loggedOut:2,left:0}, removed both credential files and kept other ~/.claude.json keys.
2026-11-10 05:27:41 -08:00
Neil 367a36b679 fix(cloud): exhaustive switches, fixed clocks in repo-access tests 2026-11-10 05:19:46 -08:00
Neil 1746238a8a fix(cloud): repo access hook uses cloudWorkspaceApi(); test bridges gain the new methods 2026-11-10 05:19:45 -08:00
Neil 0bdf4af437 fix(cloud): D1 GitHub row drives the primary 'Give access and start' instead of an in-row button 2026-11-10 05:19:45 -08:00
Neil 521c9fe3c5 feat(cloud): desktop repo access hook, GitHub row model and repo list plumbing (NP-4 N2/N12, D2/D3) 2026-11-10 05:19:45 -08:00
Neil bfa713140c fix(i18n): plural defaults for the recipe env warning; sync runtime and protected-copy catalogs 2026-11-10 05:03:10 -08:00
Neil 4ca180d5ae fix(w8): cloud-icon rule on the phone (paired desktop cloud rows, home label, nav glyph) (#245)
* fix(w8): cloud-icon rule on the phone: a paired desktop's Orca Cloud workspaces lead with the Cloud glyph + state dot (worktree.ps carries orcaCloud.status), home cloud rows read 'Cloud workspace, …', muted Cloud before the cloud workspace title

* fix(w8): cloud-icon review: glyph label merges into the row (no own focus stop), no filled ring behind the dot (pressed/active fills), newest VM record speaks for a workspace

* fix(w8): cloud-icon review 2: a cleaned-only workspace stays cloud (as on the desktop) with no dot, a live VM beats a cleaned one, cleanup_failed draws no forever-pulsing dot; store-order test

* test(w8): cloud-icon ps status test without a cast

* fix(w8): cloud-icon dot sits mostly outside the glyph's bottom-right (design-squad), clear of the title
2026-11-10 04:53:44 -08:00
Neil 2454d31779 feat(cloud): agent-accounts W6 UI slices: panel Cloud sections 2–3, S2 build-sheet Secrets, S4-b secret request card
- Panel sections 2–3 on Orca Cloud (standalone, for gap-agents' AgentHostPanel shell):
  Cloud-secret key rows with scope chips and shadowed keys listed disabled with the reason;
  effective variables; missing names with inline Add / Add mine; asleep and shared (D13) states.
- S2: missing = environment envVarNames − effective secrets for the repo and caller; Paste .env,
  per-name scope, batch save, build-time team-only note (Q7), post-open 'secrets missing' notice.
- S4-b: card for orcad secrets.requested/requestSettled; Personal by default, Repository only if
  writable, agent scope as hint; N more requests; expired and saved-after-expiry; touchRequest at
  most once a minute; Restart {{agent}}; value saved via Cloud secrets PUT, then resolveRequest.
- Main: cloudSecrets.workspaceSharing reads GET /v1/agent-sources (owner, sharedWorkspace).
- Fixtures for every state, dark and light.
2026-11-10 04:53:42 -08:00
Neil a81afb57e0 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-a9-recipe
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-10 04:49:31 -08:00
Neil 240809a43b Merge pull request #239 from nwparker/cloud/w2-squad-p1
fix(cloud): design-squad P1s for W2 lifecycle (DS-03/05/06/08/10/11/12/13)
2026-11-10 04:43:24 -08:00
Neil aedf0809eb Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-a9-recipe
# Conflicts:
#	src/renderer/src/i18n/locales/en.json
2026-11-10 04:43:10 -08:00
Neil f236d8183e revert: keep the #40303 scope label as is (its source default lives in the held upstream PR) 2026-11-10 04:35:19 -08:00
Neil dd34314dc0 feat(billing): bill overage by the minute, put sandboxes to sleep at the cap (U22, U24)
- Overage stays $1.00 per sandbox hour (ORCA_CLOUD_OVERAGE_CENTS_PER_HOUR) and is now billed by
  the minute: a per-minute metered TEST price (unit_amount_decimal = rate / 60 to 12 decimals,
  transform_quantity divide_by 60, round up), created the same way by stripe-test-setup.ts.
  capSeconds rounds the cap down to whole minutes and spentCents mirrors the invoice, so the
  cap math matches Stripe. The meter still counts seconds.
- Opting in re-prices an overage item still on an older price (e.g. $0.75 / h) instead of adding
  a second item on the same meter, and removes any extra stale one.
- Alerts at 75%, 90% and 100% of included hours (warnAtPercent).
- New top-level entitlement.suspendRunning: payment grace expired, or at the limit (out of hours
  with overage off, or at the spend cap). The start check and usage answers carry it, so the
  control plane puts running sandboxes to sleep (snapshot kept, never deleted). Payment fields and
  /v1/internal/suspensions stay payment-only, so no data-retention clock starts at a cap.
- Copy (desktop billing panel, plan card, build sheet, phone, CLI): "billed by the minute" after
  the rate; at the limit "Running sandboxes go to sleep and new ones can't start. Nothing is
  deleted, and your files are safe."
2026-11-10 04:33:07 -08:00
Neil a51bf67968 fix(cloud): Home running-sandbox limit error offers Show cloud workspaces (Mine) instead of a retry (DS-12) 2026-11-10 04:33:03 -08:00
Neil 13c48a6206 fix(cloud): A6/DS-02 design follow-ups: 'Save to your Orca account' rows with per-row outcomes, catalog names, build-sheet fixture on the Orca Cloud path, agent prompt hidden while Orca Cloud is blocked
- Keys-on-this-computer rows read '{{agent}}: your API key ••••{{hint}} is only on this computer'
  with 'Save to your Orca account' (spec v4); a saved row shows a check and 'Saved to your Orca
  account', a failed row a compact error 'Couldn't save {{ENV}}. Nothing was changed.' with Try again.
- Agent API keys scope reads 'Every host except Orca Cloud'.
- Copy: 'Choose how your agents get access…', 'Give your agents access in Orca Cloud.', 'Claude'
  (catalog name) instead of 'Claude Code' in the setup dialog and composer hint.
- The build-sheet fixtures now are the Orca Cloud path (provider orca-cloud: 'Starting your cloud
  workspace' / 'Start sandbox'), wire the desktop-key action, and add one with both outcomes.
- DS-33: the composer's agent prompt is hidden while Orca Cloud can't start (signed out, no plan,
  cap, payment issue).
2026-11-10 04:25:30 -08:00
Neil 21212562b7 Merge remote-tracking branch 'private/cloud/integration' into cloud/run-actions-design 2026-11-10 04:15:35 -08:00
Neil 82bf5795a9 Merge pull request #236 from nwparker/cloud/run-actions-gaps
Run actions: split panes don't end a run; autoRunAfterSetup on first open for environment-built workspaces
2026-11-10 04:15:25 -08:00
Neil d2ac44951e fix(cloud): design-squad P1s: glossary sleep failures (DS-06), Couldn't wake vs Couldn't start + Starting (DS-08), denial copy from the shared classifier (DS-10), status refresh re-reads after a stale in-flight read (DS-11), Sleep in the panel + Show cloud workspaces opens Home (DS-12), Try again and no raw errors (DS-13), sandbox hours with a unit (DS-03), no VM badge on cloud cards (DS-05) 2026-11-10 04:11:32 -08:00
Neil be30702701 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-a9-recipe
# Conflicts:
#	cloud/apps/sandbox-control/image/provision-golden.sh
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-10 04:11:07 -08:00
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 12fe0c867f feat(cloud): sign agents out before sandbox delete, scrub env-build images, recipe env warning (A9, P-4)
- Worker: run orca-agent-signout (each agent's logout, then credential files) on a running sandbox
  before the provider delete; bounded (20 s) and best effort, never blocks the delete.
- Environment builds: scrub agent auth (--scrub-only) before the snapshot; fail closed.
- New VM script registered in VM_SCRIPTS + provision loop; vm-scripts regenerated.
- Main IPC ephemeralVm:forwardedEnvSummary returns names only, grouped by credential-looking.
- P-4 warning component (+ fixture) shown under Settings > recipes; delete dialog line for awake
  Orca Cloud sandboxes.
2026-11-10 04:07:13 -08:00
Neil 33202f5bd9 Merge remote-tracking branch 'private/cloud/integration' into cloud/w5-cli-glossary
# Conflicts:
#	src/cli/root-help-text-primary.ts
2026-11-10 04:06:22 -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 989e2e2b62 Merge remote-tracking branch 'private/cloud/integration' into cloud/w2-squad-p1 2026-11-10 03:49:22 -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 f90e3f4b51 chore(i18n): remove retired run-action keys from the nested catalog 2026-11-10 03:45:22 -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 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