Commit Graph
714 Commits
Author SHA1 Message Date
Neil 8f9354d0c7 Merge pull request #637 from nwparker/cloud/secrets-effective-shared
feat(cloud): SECRETS-EFFECTIVE-SHARED effective view answers for shared workspaces (stacked on #632)
2026-11-13 01:25:21 -08:00
Neil 7645922c24 Merge pull request #645 from nwparker/cloud/w6-repo-can-install
feat(sandbox-control): canInstall on repo-access (REPO-CAN-INSTALL)
2026-11-13 01:18:27 -08:00
Neil 35520d4da0 Merge remote-tracking branch 'private/cloud/integration' into cloud/w6-repo-can-install-local 2026-11-13 00:43:49 -08:00
Neil 6eaa958196 Merge remote-tracking branch 'private/cloud/integration' into cloud/billing-subscribed-flag 2026-11-13 00:42:57 -08:00
Neil a2f63a0c7d fix(sandbox-control): canInstall never says false for an unreadable org membership
A GitHub App user token generally can't read orgs the App isn't installed on, which is
exactly when canInstall is asked. Read the owner type anonymously first (GET /users/{owner}):
another user's account is false; an org is true only for active admin, false for another
role/state, and null for 403/404/errors/timeouts. Owner-type lookup failures are null.
2026-11-13 00:09:05 -08:00
Neil 1049be50c2 feat(sandbox-control): canInstall on GET /v1/github/repo-access (REPO-CAN-INSTALL)
Present while the Orca GitHub App isn't installed for the repo owner ('missing', or
'public' with no installation). true: the caller's connected GitHub login is the owner,
or their membership in the owner org is active admin. false: member, non-member (403/404),
or another user's account. null: no connected GitHub user token, the token can't be read
or refreshed, or GitHub errored / timed out (3 s). Never fails the answer.

The token comes from memberGitIdentity (decrypt + refresh near expiry).
2026-11-13 00:06:50 -08:00
Neil af0d0802a4 Merge remote-tracking branch 'private/sec5/shared-workspace-secrets' into secrets-effective-shared 2026-11-12 23:51:16 -08:00
Neil b022b8108f Merge cloud/integration (#594): share toast helper moves to the row actions 2026-11-12 23:41:14 -08:00
Neil bb8861807c fix(cloud): AUDIT-AUTH-EVENTS design review: billing rows say the plan, seats, date and cap 2026-11-12 23:04:38 -08:00
Neil d5e74c7822 feat(cloud): AUDIT-AUTH-EVENTS billing changes reach the team audit log; per-sender event families; wording for auth and billing events 2026-11-12 23:01:00 -08:00
Neil a065360a31 feat(cloud): effective secrets view answers for shared workspaces (no personal values), with a note 2026-11-12 22:56:54 -08:00
Neil e92fa77ee3 Merge pull request #629 from nwparker/fix/overage-reenable
fix(billing): overage can be turned on again after turning it off (OVERAGE-REENABLE)
2026-11-12 22:52:57 -08:00
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 226487dd59 Merge remote-tracking branch 'private/cloud/integration' into fix/overage-reenable 2026-11-12 22:38:15 -08:00
Neil 6bb86411cd Merge cloud/integration into SEC-6 (secret_events from #597 + secretLog) 2026-11-12 22:09:16 -08:00
Neil 912a11361a Merge branch 'cloud/integration' of https://github.com/nwparker/orca-private into sec5/shared-workspace-secrets 2026-11-12 22:05:08 -08:00
Neil 3adf9a3b04 fix(cloud): SEC-5 a shared workspace gets none of its owner's personal secrets
ownersForSandbox resolves no personal owner unless the row is private, so a workspace shared with the team gets team and repository secrets only (values and placeholders). The egress proxy's cached keys are keyed by visibility so sharing takes effect at once. Share toast and Personal tab say so.
2026-11-12 22:04:05 -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
NeilandClaude 747c389b68 feat(billing): features answer says whether the account pays for a plan (PAID-TEAM-CHOOSE-PLAN)
POST /v1/internal/entitlements/features now also returns subscribed: the
account has a subscription that is active, trialing, past_due or unpaid.
Auth counts it as Orca Cloud access, so a paying team that is not on the
per-account rollout is no longer told to choose a plan (and then refused
at checkout as already subscribed).

Read from the subscription row Stripe's webhooks keep, in every
ENTITLEMENTS_MODE. Canceled, incomplete, expired and paused
subscriptions, the no-card trial and no subscription are false.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-11-12 21:51:16 -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 368a498291 Merge pull request #597 from nwparker/cloud/sec-4-secret-activity
feat(cloud): SEC-4 secret change recording (secret_events) + activity API
2026-11-12 21:35:27 -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
NeilandClaude 571074d55d fix(billing): let overage be turned on again after turning it off
Turning overage off left the card's save flag set, so the off view showed a stuck
check-mark "Saving…" in place of the Turn on button. Replace the flag with a save
state (saving -> saved | error) that always ends with the request, and keep Turn on
rendered in the off view at all times.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-11-12 19:58:00 -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