Commit Graph
696 Commits
Author SHA1 Message Date
Neil 346ceda64c Merge cloud/integration into SEC-6 (KMS unwrapper; kms_unavailable log via secretLog) 2026-11-12 22:40:50 -08:00
Neil 8e9c16a229 Merge pull request #625 from nwparker/cloud/sec3-kms-kek
feat(cloud): hold the secrets KEK behind Cloud KMS, off by default (SEC-3)
2026-11-12 22:39:19 -08:00
Neil 6bb86411cd Merge cloud/integration into SEC-6 (secret_events from #597 + secretLog) 2026-11-12 22:09:16 -08:00
Neil bb7da07082 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-settings-arrow 2026-11-12 21:53:09 -08:00
Neil 0f6eeb6797 Merge pull request #624 from nwparker/sec2/build-secrets
fix(cloud): SEC-2 builds never get model keys, and fail if a team secret is left on disk
2026-11-12 21:52:27 -08:00
Neil e3b140d823 feat(cloud): hold the secrets KEK behind Cloud KMS, off by default (SEC-3)
SECRETS_KEK_SOURCE=kms unwraps KMS-wrapped KEKs once per isolate. Unset, the
SECRETS_KEK path is unchanged. With it on there is no plaintext fallback: a KMS
failure answers 503 secrets_unavailable and a workspace create fails instead of
starting without secrets. Tested against a fake KMS only.
2026-11-12 21:41:36 -08:00
Neil ab27c1d396 fix(cloud): SEC-2 builds never get model keys, and fail if a team secret is left on disk
Environment builds get only the team secrets an admin named, never a swapped model key, hand them to the install script alone, and fail with no snapshot (secret_in_image) when a value is still in a file the build changed.
2026-11-12 21:37:25 -08:00
Neil ccabbee200 Merge branch 'cloud/integration' of https://github.com/nwparker/orca-private into cloud/enterprise-audit-log
# Conflicts:
#	cloud/apps/sandbox-control/src/index.ts
2026-11-12 21:20:52 -08:00
Neil 2b96b3bc35 feat(cloud): auth's token may push role changes (SSO-ROLE-PUSH) (#615) 2026-11-12 21:05:35 -08:00
Neil eca563dfef Merge branches 'cloud/integration' and 'cloud/sec-4-secret-activity' of https://github.com/nwparker/orca-private into cloud/enterprise-audit-log 2026-11-12 20:45:23 -08:00
Neil 669e7249bc test(cloud): malformed cursor test reads the personal route 2026-11-12 20:39:33 -08:00
Neil 19c1d799f6 fix(cloud): SEC-4 activity route serves personal only; team reads go through the plan-gated unified audit log 2026-11-12 20:38:57 -08:00
Neil 68ecac0d32 fix(cloud): ENTERPRISE-AUDIT the older GET /v1/audit is behind the same plan gate for a team 2026-11-12 20:37:50 -08:00
Neil e954d833bb Merge pull request #556 from nwparker/cloud/entitlements-on
chore(cloud): ENTITLEMENTS-ON dev billing switches to ENTITLEMENTS_MODE=on
2026-11-12 20:15:15 -08:00
Neil dd9b9713a6 feat(cloud): ENTERPRISE-AUDIT unified team audit log API (GET /v1/audit-log), Enterprise feature entitlements, audit ingest route 2026-11-12 20:09:12 -08:00
Neil 90c1d791ba Merge branch 'cloud/sec-4-secret-activity' of https://github.com/nwparker/orca-private into cloud/enterprise-audit-log 2026-11-12 19:52:00 -08:00
Neil a0ef341878 feat(cloud): audit_log entitlement on Enterprise (catalog v2), feature flags route, contact-sales grant 2026-11-12 19:51:55 -08:00
Neil af554dd1ab feat(cloud): KEK rotation re-wraps stored secrets (SEC-3)
Operator routes GET /v1/internal/secrets/kek and POST /v1/internal/secrets/rewrap
move every envelope-encrypted row (secrets, agent_credentials, github_user_tokens)
from a retired KEK to the active one: idempotent, resumable, conditional writes,
counts-only logs. A v2 row format behind SECRETS_SEAL_FORMAT=v2 (default v1)
keeps the KEK id out of the value layer's AAD so rotation re-wraps data keys
without decrypting values. Adds the KMS design doc.
2026-11-12 19:06:23 -08:00
Neil 53cdc4edfd test(cloud): SEC-4 window test re-mints tokens; fixture activity newest first 2026-11-12 18:01:37 -08:00
Neil 399ef26f19 test(cloud): member effective view hides team hints 2026-11-12 17:50:38 -08:00
Neil d7549cf530 fix(cloud): SEC-6 secret writes need a fresh admin token, hints only for writers, redacting log sink for secret code 2026-11-12 17:20:03 -08:00
Neil 38ed468ae4 fix(cloud): VM git lines say Settings → Account (glossary path arrow; design-squad) 2026-11-12 17:17:33 -08:00
Neil a5a1343a11 feat(cloud): SEC-4 customer-visible secret activity log (create/update/delete, names only, 90 days, owners/admins) 2026-11-12 17:16:36 -08:00
Neil b16f430738 Merge pull request #589 from nwparker/cloud/w6-iat-backdate
fix(cloud): IAT-BACKDATE-GAP member-change/removal checks allow for auth's 30 s iat backdate
2026-11-12 17:08:32 -08:00
Neil 2f5e89cc35 Merge pull request #585 from nwparker/cloud/w6-vm-scripts-stamp
fix(sandbox-control): never install older VM scripts over a newer golden (VM-SCRIPTS-DOWNGRADE)
2026-11-12 17:04:27 -08:00
Neil 63c4d367ef fix(cloud): IAT-BACKDATE-GAP member-change and removal checks compare the mint time (auth backdates iat 30 s); harness mints like auth 2026-11-12 16:59:25 -08:00
Neil 018d81b096 fix(sandbox-control): never install older VM scripts over a newer golden (VM-SCRIPTS-DOWNGRADE)
The generator now emits VM_SCRIPTS_HASH and a monotonic VM_SCRIPTS_STAMP
(kept while the scripts are unchanged; max(previous + 1, now) on a change).
Provisioning records the stamp in /opt/orca/bin/.scripts-stamp (source
builds use the fetched commit's stamp), installEntryPoints writes the
Worker's, and ensureEntryPoints probes stamp + marker in one command and
skips images whose stamp is newer than the Worker's. Golden refreshes use
ensureEntryPoints too, so a lagging Worker cannot bake older scripts into
a refreshed golden.
2026-11-12 16:52:50 -08:00
Neil 34d86a539a fix(cloud): stale_token on create/secrets/GitHub allows for auth's 30 s iat backdate, so the desktop's one re-mint succeeds 2026-11-12 16:50:53 -08:00
Neil 006676a59b fix(cloud): ORG-TOKEN-STALE Worker backstop: x-orca-org mismatch -> 409 org_mismatch; role-changed token -> 401 stale_token on create, secrets and GitHub 2026-11-12 16:49:00 -08:00
Neil 4f2b3772ca fix(cloud): GitHub not-found on push/fetch says to check the name, or install the App if it's private (design-squad) 2026-11-12 16:14:15 -08:00
Neil cc62955616 test(cloud): resume-stuck waits for the resuming claim instead of a fixed 10 ms (flaked under load) 2026-11-12 16:09:57 -08:00
Neil 3de6f16d82 fix(cloud): VM git lines point to Settings › Account (true with or without billing; design-squad) 2026-11-12 16:05:27 -08:00
Neil 61d31da441 fix(cloud): PUSH-RAW-PROMPT a github.com push, pull or fetch with no credential never prompts; one plain line says what to do 2026-11-12 16:04:07 -08:00
Neil bac96ce153 Merge pull request #534 from nwparker/cloud/entitlements-g
fix(cloud): ENTITLEMENTS-G grants start when the subscription is live (test-clock shadow diff); includes #529
2026-11-12 11:32:36 -08:00
Neil 51e8f5a2be chore(cloud): ENTITLEMENTS-ON dev billing serves the catalog + grants (ENTITLEMENTS_MODE=on) 2026-11-12 11:25:16 -08:00
Neil 5a6cceca7d fix(billing): V3-06 Top workspaces names up to 5 live workspaces, then one deleted line, then others; billing sends the top 20 so deleted ones don't crowd out live ones 2026-11-12 11:01:01 -08:00
Neil cbb8c09008 fix(billing): serve the team subscription route from the main dispatcher (it sat inside handleCloudSetup, reached only for /cloud-setup paths) 2026-11-12 06:42:04 -08:00
Neil 49d26b647c cloud: internal routes for deleting a team (TEAM-DELETE)
billing: GET /v1/internal/accounts/:accountId/subscription -> {status, open}
(MEMBERSHIP_SYNC_TOKEN), so auth refuses to delete a team with an open subscription.

sandbox-control (auth's MEMBER_REMOVED_TOKEN, never the operator routes):
- GET /v1/internal/accounts/:accountId/delete-check -> {workspaces}: the team's
  workspaces in any state but destroyed.
- POST /v1/internal/accounts/:accountId/secrets/purge -> {purged}: deletes the
  team's org- and repo-scoped cloud secrets; 409 workspaces_exist while any remain.
2026-11-12 06:42:04 -08:00
Neil 3806afd978 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-shim-nudge 2026-11-12 06:27:30 -08:00
Neil cd02de307b test(cloud): runtime-bundles test uses a shasum-backed sha256sum (macOS now ships a BSD /sbin/sha256sum without -c --status) 2026-11-12 06:18:33 -08:00
Neil c5683dcbd1 fix(cloud): ENTITLEMENTS-G a live subscription's grants start when Stripe says it is live, not at a period start ahead of our clock
Found by the dev shadow run: Stripe test clocks put current_period_start a month ahead, so the
grant read as not started and the resolver denied (subscription_inactive) where legacy allowed.
starts_at is now min(period start, first sync) and stays stable across syncs.
2026-11-12 04:32:11 -08:00
Neil 3091a87385 Merge stablyai/orca main (52b618339f) into cloud/integration
Resolve 104 conflicts toward upstream's regrouped layout (rpc, profile-state, orca-profiles,
renderer lib/runtime moves) with cloud behaviour re-applied; repoint cloud imports at moved modules.
2026-11-12 03:30:25 -08:00
Neil 965febdb34 fix(cloud): ENTITLEMENTS-E Enterprise contact and Team supportUrl are https://orca.dev/enterprise (the onorca.dev contact page 404s) 2026-11-12 02:35:22 -08:00
Neil 7c82189bd8 feat(cloud): ENTITLEMENTS-E Team v2 lists the sandbox size and ready-in-seconds; plans carry an optional supportUrl
- catalog: Team v2 (same entitlements and policy as v1, so v1 subscribers see no change) adds the
  sandbox_spec and ready_in_seconds features the desktop already localizes; currentVersion 2
- catalog plans take an optional supportUrl (https: or mailto: only) and GET /v1/plans returns it
  per plan; clients fall back to the Enterprise contact
2026-11-12 02:33:14 -08:00
Neil d3b6609ac9 refactor(rpc): group root modules by defining owner (#41475)
* refactor(rpc): group root modules by defining owner

* test(orcad): include JSON CLI failures in launcher diagnostics
2026-11-12 02:18:19 -08:00
Neil 0f98742050 feat(cloud): a commit under Orca Cloud's name says once per session how to use your own (Connect your GitHub in Account & billing; design-squad) 2026-11-12 02:02:59 -08:00
Neil c856b945f1 feat(cloud): ENTITLEMENTS-B2 metadata.orca_plan on Stripe prices is the catalog join key
Neil's Q1 answer: a plan id on the Stripe Price/Product maps to the repo catalog's entitlements.
seatPriceMatch reads price.metadata.orca_plan (after env ids and price history, before lookup key
and product); the catalog sync logs a lookup-key/tag mismatch; stripe-test-setup tags every price.
2026-11-12 01:44:10 -08:00
Neil fe2db1b352 Merge pull request #507 from nwparker/cloud/entitlements-b
feat(cloud): ENTITLEMENTS-B Stripe lifecycle for grants, reconciliation, GET /v1/plans and GET /v1/entitlements (fixes the planForPrice orphaning bug)
2026-11-12 01:44:05 -08:00
Neil c2f5b1fbb7 Merge remote-tracking branch 'private/cloud/integration' into cloud/n02-reland
# Conflicts:
#	cloud/apps/sandbox-control/image/vm-scripts.generated.ts
2026-11-12 01:25:37 -08:00
Neil 4b7456cada Merge pull request #520 from nwparker/cloud/w6-bind-identity
fix(cloud): binding the GitHub App through OAuth also connects the binder's GitHub identity (commits as you)
2026-11-12 01:25:14 -08:00