Commit Graph
936 Commits
Author SHA1 Message Date
Neil 84a776923c docs(cloud): sandbox-control typecheck split pinned by path; README on why raw tsc shows imported diagnostics 2026-11-13 11:16:23 -08:00
Neil ec679a8f52 fix(cloud): sandbox-control typecheck to zero (SANDBOX-CONTROL-TYPECHECK) 2026-11-13 11:14:50 -08:00
Neil d20dc4e20a feat(cloud): TRANSFER-SLOW-N60 a completed owner hand-off logs how long each step took 2026-11-13 11:04:44 -08:00
Neil 46f081f336 Merge pull request #703 from nwparker/cloud/g9-claude-key-tail
fix(cloud): G9 never write a real ANTHROPIC_API_KEY tail into ~/.claude.json
2026-11-13 10:33:28 -08:00
Neil 648f5bb67f feat(cloud): OWNER-TRANSFER previous-owner notices expire after 90 days and go with a deleted team 2026-11-13 07:39:07 -08:00
Neil a58aad5522 Merge pull request #713 from nwparker/cloud/owner-transfer-notify
feat(cloud): OWNER-TRANSFER tell the previous owner; expose the owner-changed mark
2026-11-13 07:27:20 -08:00
Neil 881b82e401 Merge pull request #711 from nwparker/create-speed/snap404-skip-deleted
fix(cloud): the fresh-build 404 retry never runs for a create its owner deleted
2026-11-13 07:16:53 -08:00
Neil 04457ec384 fix(cloud): OWNER-TRANSFER an email answer with no mode is not a delivery (sso-scim review) 2026-11-13 07:15:58 -08:00
Neil 8026ca98af feat(cloud): OWNER-TRANSFER tell the previous owner (notice in Orca, email asked of auth, audit row); expose the owner-changed mark 2026-11-13 07:14:33 -08:00
Neil 950a8165c8 Merge pull request #691 from nwparker/cloud/ep10-cancel-on-delete
feat(billing): EP-10 team delete can cancel a plan that's already set to end (cancel-now)
2026-11-13 07:11:50 -08:00
Neil 7922504e4b fix(cloud): the fresh-build 404 retry never runs for a create its owner deleted 2026-11-13 06:59:42 -08:00
Neil e05dee2312 Merge remote-tracking branch 'private/cloud/integration' into cloud/env-build-churn 2026-11-13 06:50:47 -08:00
Neil 59ed67dd0c Merge pull request #689 from nwparker/cloud/ep9-billing-mint-org
fix(cloud): EP-9 billing tokens name the team this device shows (cross-device active-team leak)
2026-11-13 06:49:21 -08:00
Neil 5e6fcd30f3 Merge pull request #702 from nwparker/cloud/owner-transfer-fix
fix(cloud): OWNER-TRANSFER a workspace is only handed to a current team member, and a transferred workspace stays in shared mode for credentials
2026-11-13 06:42:12 -08:00
Neil 77db6ffc48 fix(billing): EP-10 cancel-now decides on Stripe's live state: a plan resumed after auth's delete check is refused (409 not_cancelling) (sso-scim) 2026-11-13 06:39:43 -08:00
Neil 3e228f227d feat(billing): EP-10 team delete can cancel a plan that is already set to end
GET /v1/internal/accounts/:accountId/subscription adds cancelling / endsAt / periodEnd (additive);
new POST .../subscription/cancel-now (membership-sync token) cancels the team's subscription
immediately (invoice_now: reported overage is billed; prorate false: no refund) but only one
already set to end (cancel_at_period_end or a portal cancel_at); a renewing plan gets 409
not_cancelling. Idempotent; a Stripe failure is a 502 and changes nothing, so auth must not
delete the team. Mirror re-read from Stripe, grants revoked.
2026-11-13 06:39:43 -08:00
Neil 15b94d9567 Merge remote-tracking branch 'private/cloud/integration' into cloud/ep9-billing-mint-org 2026-11-13 06:39:11 -08:00
Neil 1b59a54b9f Merge remote-tracking branch 'private/cloud/integration' into cloud/env-build-churn 2026-11-13 06:39:03 -08:00
Neil 5faae7d94b Merge pull request #686 from nwparker/cloud/ep9-cancel-at
fix(billing): EP-9 a portal cancel (Stripe cancel_at) shows as the team's own plan ending
2026-11-13 06:32:14 -08:00
Neil b671273718 Merge remote-tracking branch 'private/cloud/integration' into cloud/env-build-churn
# Conflicts:
#	cloud/apps/sandbox-control/src/environments.ts
2026-11-13 06:18:54 -08:00
Neil 477583f9f4 fix(cloud): EP-5 a cancelled create never goes on with a new row; cancel sweeps the workspace 2026-11-13 06:18:39 -08:00
Neil 771b19d532 Merge remote-tracking branch 'private/cloud/integration' into cloud/owner-transfer-fix
# Conflicts:
#	cloud/apps/sandbox-control/src/index.ts
2026-11-13 06:14:23 -08:00
Neil 0a9b8a6bde test(cloud): OWNER-TRANSFER a wake racing the hand-off refuses it and leaves the VM as woken 2026-11-13 06:13:47 -08:00
Neil 90e181af0f fix(cloud): OWNER-TRANSFER stop before the write; refuse during a boot or stop, and when the stop fails (sso-scim review) 2026-11-13 06:13:02 -08:00
Neil ff8f915c05 fix(cloud): G9 ~/.claude.json pre-approves only an Orca placeholder's tail; a real ANTHROPIC_API_KEY leaves nothing of itself on disk and an older tail is scrubbed 2026-11-13 06:10:57 -08:00
Neil e746a764e5 Merge pull request #699 from nwparker/cloud/e3-swap-fail-closed
fix(cloud): EGRESS-SWAP-FAIL-CLOSED withhold keys without the egress proxy in deployed envs; health 503 egress_proxy_missing
2026-11-13 06:09:26 -08:00
Neil 93f2066812 fix(cloud): OWNER-TRANSFER a workspace is only handed to a current team member, and a transferred workspace is in shared mode for credentials for good 2026-11-13 06:09:22 -08:00
Neil 20c83d1412 fix(cloud): EGRESS-SWAP-FAIL-CLOSED review: egress_swap_disabled log when an operator turns placeholders off, proxy refuses without its URL 2026-11-13 06:05:44 -08:00
Neil c9f68dfa63 fix(cloud): EGRESS-SWAP-FAIL-CLOSED merged spec: egress_swap_unavailable at error level (count only), health keySwap on/off, design-squad message, deployed-with-proxy test 2026-11-13 06:04:30 -08:00
Neil a5cf31a7a8 Merge pull request #694 from nwparker/create-speed/build-snapshot-404
fix(cloud): retry a fresh build snapshot's 404 once; name orcad start failures
2026-11-13 06:03:14 -08:00
Neil ee19ee2684 fix(cloud): EGRESS-SWAP-FAIL-CLOSED a deployed env without EGRESS_PROXY_URL withholds model keys and account sign-ins (firewall answers the placeholder), logs once per session, /v1/health 503 egress_proxy_missing 2026-11-13 06:03:03 -08:00
Neil 138a2e8b9f Merge remote-tracking branch 'private/cloud/integration' into cloud/env-build-churn 2026-11-13 05:57:36 -08:00
Neil 931eeaa835 wip(cloud): ENV-BUILD-CHURN server side 2026-11-13 05:57:34 -08:00
Neil 1aa00c9ab8 Merge pull request #693 from nwparker/cloud/e3-push-cap
fix(cloud): PUSH-CAP plain message when a git push exceeds the egress proxy's ~100 MB cap
2026-11-13 05:56:03 -08:00
Neil 24eb6a0e41 Merge pull request #688 from nwparker/cloud/auto-env-deps-every-build
fix(cloud): every build of an automatic environment installs from its lockfile (AUTO-ENV-DEPS-NOT-RUNNING)
2026-11-13 05:54:09 -08:00
Neil a50afdc731 fix(cloud): retry a fresh build snapshot's 404 once; name orcad start failures (CREATE-BUILD-SNAPSHOT-404, CREATE-FAIL-LABELS) 2026-11-13 05:51:24 -08:00
Neil 7014c59a2d fix(cloud): PUSH-CAP design-squad wording; 'connect GitHub' catalog form in the no-access line 2026-11-13 05:45:44 -08:00
Neil f7d3a47079 fix(cloud): PUSH-CAP git shim replaces the bare HTTP 413 on a github.com push over the egress proxy cap with a plain Orca line 2026-11-13 05:44:51 -08:00
Neil 389292a819 fix(billing): EP-9b reconcile counts a cancel_at change as a fix (sso-scim nit) 2026-11-13 05:35:01 -08:00
Neil de4286aa73 fix(cloud): EP-9 billing tokens are minted for the team this device shows, never auth's shared active team
The desktop minted billing tokens with an empty body, so auth picked the team from the cloud
profile's active team, which every device of the same user shares: one device switching teams made
the other read (and act on) that team's plan, hours and usage. mintBillingToken now sends {orgId}
for this device's team (auth #761), refuses a token whose org claim is any other team (fail
closed: billing_org_mismatch), and falls back to {} on an older auth (400) with the claim still
checked. Mirrors the sandbox mint (#634).
Billing test: two teams of one owner on one Stripe customer each read only their own plan/hours.
2026-11-13 05:30:51 -08:00
Neil 881bdac5f4 fix(cloud): every build of an automatic environment installs from its lockfile (AUTO-ENV-DEPS-NOT-RUNNING)
Only the first build and the failed-build retry used autoConfig(); a golden refresh reused the active
build's stored (pre-#660) config, and a manual Rebuild built a default config, so neither got
ORCA_AUTO_INSTALL (and a Rebuild lost the blobless clone). startBuild now derives both from the
environment's kind: every build of an automatic environment, whatever started it, clones blobless and
installs from the lockfile. Tests for create, retry, golden refresh and manual Rebuild.
2026-11-13 05:29:24 -08:00
Neil c93623e1bc Merge remote-tracking branch 'private/cloud/integration' into create-speed/ep5-cancel-create 2026-11-13 05:24:56 -08:00
Neil edaa5ecd46 fix(billing): EP-9 a portal cancel (Stripe cancel_at) shows as the team's plan ending on that date
Stripe's portal on API 2025-09-30.clover cancels by setting cancel_at, not cancel_at_period_end,
so billing never saw the cancellation: no 'Plan ends', no grant end. The mirror now stores
cancel_at (migration 0009); cancel_at_period_end is the 'cancelling' flag for either form; grants
end at cancel_at; entitlements carry cancelAt; the desktop's 'Plan ends' uses it.
Test: two teams of one owner (separate customers), one cancels via cancel_at: its own plan shows
ending on that date, the other is untouched; un-cancelling clears it.
2026-11-13 05:24:47 -08:00
Neil 80d65a5b1c feat(cloud): EP-3c the control plane takes member display names from auth, as labels only 2026-11-13 05:13:29 -08:00
Neil 4d5fb95f9b Merge remote-tracking branch 'private/cloud/integration' into create-speed/ep5-cancel-create 2026-11-13 05:08:01 -08:00
Neil 2be9406d7d fix(cloud): validate ORCA_PLATFORM_HOST_SUFFIXES up front; smoke boots use the configured hosts (#680)
* fix(cloud): validate ORCA_PLATFORM_HOST_SUFFIXES up front; smoke boots use the configured hosts

A malformed suffix now refuses every request (503 platform_hosts_misconfigured,
naming the bad entries) and skips scheduled work, instead of failing each
limited-mode create later. Golden-image and environment-build smoke boots
use the workspace base allowlist, so they follow the configured platform
hosts rather than the built-in *.onorca.dev.

* fix(cloud): narrow the platform-host guard to what compiles an allowlist

A malformed ORCA_PLATFORM_HOST_SUFFIXES no longer takes the Worker down.
GET /v1/health (no auth, for the post-deploy smoke) returns 503
platform_hosts_misconfigured; limited-mode creates, wakes and resumes,
new environment builds and the golden rotation refuse or skip. Reads,
sleep, stop, delete and the reconcile cron keep working; open-mode
creates compile no allowlist and are unaffected.

* fix(cloud): platform_hosts_misconfigured responses carry the code only

/v1/health is public, so the bad entries stay in the config_error log
line; the authenticated refusals return the same bare code.
2026-11-13 05:03:58 -08:00
Neil a3b133ed6c test(cloud): wake test counts only the wake's background work (create outlives its request too) 2026-11-13 04:51:33 -08:00
Neil a319237abf fix(cloud): EP-5 a cancelled create never leaks its sandbox or claims it was deleted 2026-11-13 04:33:18 -08:00
Neil b6453d9dc9 Merge pull request #664 from nwparker/create-speed/parity-docker
feat(cloud): Docker in Orca Cloud workspaces, installed on first use (PARITY-DOCKER)
2026-11-13 04:13:00 -08:00
Neil c92b709831 feat(cloud): docker shim copy per design-squad (retry hints, three-line CA notice once per workspace) 2026-11-13 04:10:53 -08:00