@antasphere/chassis-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +82 -0
- package/dist/accounts/deletion.d.ts +163 -0
- package/dist/accounts/deletion.d.ts.map +1 -0
- package/dist/accounts/deletion.js +360 -0
- package/dist/accounts/deletion.js.map +1 -0
- package/dist/accounts/erasure-log.d.ts +66 -0
- package/dist/accounts/erasure-log.d.ts.map +1 -0
- package/dist/accounts/erasure-log.js +117 -0
- package/dist/accounts/erasure-log.js.map +1 -0
- package/dist/accounts/index.d.ts +6 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +6 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/mint-refusal.d.ts +47 -0
- package/dist/accounts/mint-refusal.d.ts.map +1 -0
- package/dist/accounts/mint-refusal.js +59 -0
- package/dist/accounts/mint-refusal.js.map +1 -0
- package/dist/accounts/signup-duplicate.d.ts +14 -0
- package/dist/accounts/signup-duplicate.d.ts.map +1 -0
- package/dist/accounts/signup-duplicate.js +25 -0
- package/dist/accounts/signup-duplicate.js.map +1 -0
- package/dist/accounts/superadmin.d.ts +27 -0
- package/dist/accounts/superadmin.d.ts.map +1 -0
- package/dist/accounts/superadmin.js +46 -0
- package/dist/accounts/superadmin.js.map +1 -0
- package/dist/api/apikeys.d.ts +14 -0
- package/dist/api/apikeys.d.ts.map +1 -0
- package/dist/api/apikeys.js +124 -0
- package/dist/api/apikeys.js.map +1 -0
- package/dist/api/audit.d.ts +4 -0
- package/dist/api/audit.d.ts.map +1 -0
- package/dist/api/audit.js +75 -0
- package/dist/api/audit.js.map +1 -0
- package/dist/api/break-glass.d.ts +48 -0
- package/dist/api/break-glass.d.ts.map +1 -0
- package/dist/api/break-glass.js +217 -0
- package/dist/api/break-glass.js.map +1 -0
- package/dist/api/cli-auth.d.ts +84 -0
- package/dist/api/cli-auth.d.ts.map +1 -0
- package/dist/api/cli-auth.js +177 -0
- package/dist/api/cli-auth.js.map +1 -0
- package/dist/api/create-api.d.ts +123 -0
- package/dist/api/create-api.d.ts.map +1 -0
- package/dist/api/create-api.js +1165 -0
- package/dist/api/create-api.js.map +1 -0
- package/dist/api/demo-passes.d.ts +45 -0
- package/dist/api/demo-passes.d.ts.map +1 -0
- package/dist/api/demo-passes.js +143 -0
- package/dist/api/demo-passes.js.map +1 -0
- package/dist/api/errors.d.ts +5 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +5 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/export.d.ts +63 -0
- package/dist/api/export.d.ts.map +1 -0
- package/dist/api/export.js +393 -0
- package/dist/api/export.js.map +1 -0
- package/dist/api/files.d.ts +40 -0
- package/dist/api/files.d.ts.map +1 -0
- package/dist/api/files.js +150 -0
- package/dist/api/files.js.map +1 -0
- package/dist/api/index.d.ts +17 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +17 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/invitations.d.ts +50 -0
- package/dist/api/invitations.d.ts.map +1 -0
- package/dist/api/invitations.js +313 -0
- package/dist/api/invitations.js.map +1 -0
- package/dist/api/members.d.ts +25 -0
- package/dist/api/members.d.ts.map +1 -0
- package/dist/api/members.js +522 -0
- package/dist/api/members.js.map +1 -0
- package/dist/api/onboarding.d.ts +26 -0
- package/dist/api/onboarding.d.ts.map +1 -0
- package/dist/api/onboarding.js +23 -0
- package/dist/api/onboarding.js.map +1 -0
- package/dist/api/openapi-doc.d.ts +21 -0
- package/dist/api/openapi-doc.d.ts.map +1 -0
- package/dist/api/openapi-doc.js +25 -0
- package/dist/api/openapi-doc.js.map +1 -0
- package/dist/api/projects.d.ts +24 -0
- package/dist/api/projects.d.ts.map +1 -0
- package/dist/api/projects.js +624 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/scope-routes.d.ts +12 -0
- package/dist/api/scope-routes.d.ts.map +1 -0
- package/dist/api/scope-routes.js +2 -0
- package/dist/api/scope-routes.js.map +1 -0
- package/dist/api/sso-connect.d.ts +70 -0
- package/dist/api/sso-connect.d.ts.map +1 -0
- package/dist/api/sso-connect.js +164 -0
- package/dist/api/sso-connect.js.map +1 -0
- package/dist/api/sso-logout.d.ts +41 -0
- package/dist/api/sso-logout.d.ts.map +1 -0
- package/dist/api/sso-logout.js +34 -0
- package/dist/api/sso-logout.js.map +1 -0
- package/dist/api/teams.d.ts +43 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +447 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/workspaces.d.ts +114 -0
- package/dist/api/workspaces.d.ts.map +1 -0
- package/dist/api/workspaces.js +462 -0
- package/dist/api/workspaces.js.map +1 -0
- package/dist/apikeys/index.d.ts +3 -0
- package/dist/apikeys/index.d.ts.map +1 -0
- package/dist/apikeys/index.js +3 -0
- package/dist/apikeys/index.js.map +1 -0
- package/dist/apikeys/peppers.d.ts +53 -0
- package/dist/apikeys/peppers.d.ts.map +1 -0
- package/dist/apikeys/peppers.js +97 -0
- package/dist/apikeys/peppers.js.map +1 -0
- package/dist/apikeys/service.d.ts +56 -0
- package/dist/apikeys/service.d.ts.map +1 -0
- package/dist/apikeys/service.js +196 -0
- package/dist/apikeys/service.js.map +1 -0
- package/dist/app.d.ts +65 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +142 -0
- package/dist/app.js.map +1 -0
- package/dist/audit/filters.d.ts +38 -0
- package/dist/audit/filters.d.ts.map +1 -0
- package/dist/audit/filters.js +97 -0
- package/dist/audit/filters.js.map +1 -0
- package/dist/audit/index.d.ts +3 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +3 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/service.d.ts +65 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +103 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/boot.d.ts +8 -0
- package/dist/boot.d.ts.map +1 -0
- package/dist/boot.js +822 -0
- package/dist/boot.js.map +1 -0
- package/dist/constant-time.d.ts +3 -0
- package/dist/constant-time.d.ts.map +1 -0
- package/dist/constant-time.js +10 -0
- package/dist/constant-time.js.map +1 -0
- package/dist/email/driver.d.ts +16 -0
- package/dist/email/driver.d.ts.map +1 -0
- package/dist/email/driver.js +136 -0
- package/dist/email/driver.js.map +1 -0
- package/dist/email/index.d.ts +4 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +4 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/shell.d.ts +72 -0
- package/dist/email/shell.d.ts.map +1 -0
- package/dist/email/shell.js +146 -0
- package/dist/email/shell.js.map +1 -0
- package/dist/email/templates.d.ts +83 -0
- package/dist/email/templates.d.ts.map +1 -0
- package/dist/email/templates.js +96 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/entitlements/check.d.ts +140 -0
- package/dist/entitlements/check.d.ts.map +1 -0
- package/dist/entitlements/check.js +276 -0
- package/dist/entitlements/check.js.map +1 -0
- package/dist/entitlements/clock-skew.d.ts +27 -0
- package/dist/entitlements/clock-skew.d.ts.map +1 -0
- package/dist/entitlements/clock-skew.js +58 -0
- package/dist/entitlements/clock-skew.js.map +1 -0
- package/dist/entitlements/gate.d.ts +113 -0
- package/dist/entitlements/gate.d.ts.map +1 -0
- package/dist/entitlements/gate.js +430 -0
- package/dist/entitlements/gate.js.map +1 -0
- package/dist/entitlements/hub-machine-token.d.ts +83 -0
- package/dist/entitlements/hub-machine-token.d.ts.map +1 -0
- package/dist/entitlements/hub-machine-token.js +175 -0
- package/dist/entitlements/hub-machine-token.js.map +1 -0
- package/dist/entitlements/hub-subject.d.ts +32 -0
- package/dist/entitlements/hub-subject.d.ts.map +1 -0
- package/dist/entitlements/hub-subject.js +68 -0
- package/dist/entitlements/hub-subject.js.map +1 -0
- package/dist/entitlements/index.d.ts +9 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +9 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/entitlements/poster.d.ts +81 -0
- package/dist/entitlements/poster.d.ts.map +1 -0
- package/dist/entitlements/poster.js +169 -0
- package/dist/entitlements/poster.js.map +1 -0
- package/dist/entitlements/profiles.d.ts +121 -0
- package/dist/entitlements/profiles.d.ts.map +1 -0
- package/dist/entitlements/profiles.js +212 -0
- package/dist/entitlements/profiles.js.map +1 -0
- package/dist/entitlements/slot.d.ts +33 -0
- package/dist/entitlements/slot.d.ts.map +1 -0
- package/dist/entitlements/slot.js +75 -0
- package/dist/entitlements/slot.js.map +1 -0
- package/dist/env.d.ts +293 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +383 -0
- package/dist/env.js.map +1 -0
- package/dist/files/http.d.ts +23 -0
- package/dist/files/http.d.ts.map +1 -0
- package/dist/files/http.js +66 -0
- package/dist/files/http.js.map +1 -0
- package/dist/files/index.d.ts +5 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +5 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/serve.d.ts +43 -0
- package/dist/files/serve.d.ts.map +1 -0
- package/dist/files/serve.js +71 -0
- package/dist/files/serve.js.map +1 -0
- package/dist/files/service.d.ts +69 -0
- package/dist/files/service.d.ts.map +1 -0
- package/dist/files/service.js +188 -0
- package/dist/files/service.js.map +1 -0
- package/dist/files/spool.d.ts +21 -0
- package/dist/files/spool.d.ts.map +1 -0
- package/dist/files/spool.js +47 -0
- package/dist/files/spool.js.map +1 -0
- package/dist/identity/better-auth.d.ts +3927 -0
- package/dist/identity/better-auth.d.ts.map +1 -0
- package/dist/identity/better-auth.js +896 -0
- package/dist/identity/better-auth.js.map +1 -0
- package/dist/identity/demo-pass-plugin.d.ts +29 -0
- package/dist/identity/demo-pass-plugin.d.ts.map +1 -0
- package/dist/identity/demo-pass-plugin.js +88 -0
- package/dist/identity/demo-pass-plugin.js.map +1 -0
- package/dist/identity/demo-pass-rules.d.ts +84 -0
- package/dist/identity/demo-pass-rules.d.ts.map +1 -0
- package/dist/identity/demo-pass-rules.js +223 -0
- package/dist/identity/demo-pass-rules.js.map +1 -0
- package/dist/identity/demo-pass.d.ts +159 -0
- package/dist/identity/demo-pass.d.ts.map +1 -0
- package/dist/identity/demo-pass.js +319 -0
- package/dist/identity/demo-pass.js.map +1 -0
- package/dist/identity/hub-grant.d.ts +182 -0
- package/dist/identity/hub-grant.d.ts.map +1 -0
- package/dist/identity/hub-grant.js +594 -0
- package/dist/identity/hub-grant.js.map +1 -0
- package/dist/identity/hub-jwt.d.ts +22 -0
- package/dist/identity/hub-jwt.d.ts.map +1 -0
- package/dist/identity/hub-jwt.js +77 -0
- package/dist/identity/hub-jwt.js.map +1 -0
- package/dist/identity/hub-live-gate.d.ts +17 -0
- package/dist/identity/hub-live-gate.d.ts.map +1 -0
- package/dist/identity/hub-live-gate.js +146 -0
- package/dist/identity/hub-live-gate.js.map +1 -0
- package/dist/identity/hub-logout.d.ts +88 -0
- package/dist/identity/hub-logout.d.ts.map +1 -0
- package/dist/identity/hub-logout.js +158 -0
- package/dist/identity/hub-logout.js.map +1 -0
- package/dist/identity/hub-projection.d.ts +103 -0
- package/dist/identity/hub-projection.d.ts.map +1 -0
- package/dist/identity/hub-projection.js +130 -0
- package/dist/identity/hub-projection.js.map +1 -0
- package/dist/identity/hub-reconcile.d.ts +151 -0
- package/dist/identity/hub-reconcile.d.ts.map +1 -0
- package/dist/identity/hub-reconcile.js +400 -0
- package/dist/identity/hub-reconcile.js.map +1 -0
- package/dist/identity/hub-sso.d.ts +363 -0
- package/dist/identity/hub-sso.d.ts.map +1 -0
- package/dist/identity/hub-sso.js +536 -0
- package/dist/identity/hub-sso.js.map +1 -0
- package/dist/identity/hub-user-client.d.ts +222 -0
- package/dist/identity/hub-user-client.d.ts.map +1 -0
- package/dist/identity/hub-user-client.js +406 -0
- package/dist/identity/hub-user-client.js.map +1 -0
- package/dist/identity/index.d.ts +13 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +13 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/oauth-jwt.d.ts +32 -0
- package/dist/identity/oauth-jwt.d.ts.map +1 -0
- package/dist/identity/oauth-jwt.js +122 -0
- package/dist/identity/oauth-jwt.js.map +1 -0
- package/dist/identity/resolve-membership.d.ts +28 -0
- package/dist/identity/resolve-membership.d.ts.map +1 -0
- package/dist/identity/resolve-membership.js +69 -0
- package/dist/identity/resolve-membership.js.map +1 -0
- package/dist/identity/signing-key.d.ts +49 -0
- package/dist/identity/signing-key.d.ts.map +1 -0
- package/dist/identity/signing-key.js +144 -0
- package/dist/identity/signing-key.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/invitations/index.d.ts +2 -0
- package/dist/invitations/index.d.ts.map +1 -0
- package/dist/invitations/index.js +2 -0
- package/dist/invitations/index.js.map +1 -0
- package/dist/invitations/service.d.ts +36 -0
- package/dist/invitations/service.d.ts.map +1 -0
- package/dist/invitations/service.js +122 -0
- package/dist/invitations/service.js.map +1 -0
- package/dist/jobs/index.d.ts +3 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +3 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/pgboss.d.ts +119 -0
- package/dist/jobs/pgboss.d.ts.map +1 -0
- package/dist/jobs/pgboss.js +521 -0
- package/dist/jobs/pgboss.js.map +1 -0
- package/dist/jobs/timers.d.ts +127 -0
- package/dist/jobs/timers.d.ts.map +1 -0
- package/dist/jobs/timers.js +228 -0
- package/dist/jobs/timers.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +64 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/errors.d.ts +37 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +77 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/http.d.ts +35 -0
- package/dist/mcp/http.d.ts.map +1 -0
- package/dist/mcp/http.js +80 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/inputs.d.ts +19 -0
- package/dist/mcp/inputs.d.ts.map +1 -0
- package/dist/mcp/inputs.js +28 -0
- package/dist/mcp/inputs.js.map +1 -0
- package/dist/mcp/projects.d.ts +31 -0
- package/dist/mcp/projects.d.ts.map +1 -0
- package/dist/mcp/projects.js +315 -0
- package/dist/mcp/projects.js.map +1 -0
- package/dist/mcp/server.d.ts +52 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +93 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/teams.d.ts +7 -0
- package/dist/mcp/teams.d.ts.map +1 -0
- package/dist/mcp/teams.js +62 -0
- package/dist/mcp/teams.js.map +1 -0
- package/dist/mcp/tool-kit.d.ts +67 -0
- package/dist/mcp/tool-kit.d.ts.map +1 -0
- package/dist/mcp/tool-kit.js +74 -0
- package/dist/mcp/tool-kit.js.map +1 -0
- package/dist/members/removal.d.ts +95 -0
- package/dist/members/removal.d.ts.map +1 -0
- package/dist/members/removal.js +143 -0
- package/dist/members/removal.js.map +1 -0
- package/dist/middleware/auth-body.d.ts +25 -0
- package/dist/middleware/auth-body.d.ts.map +1 -0
- package/dist/middleware/auth-body.js +55 -0
- package/dist/middleware/auth-body.js.map +1 -0
- package/dist/middleware/auth-context.d.ts +170 -0
- package/dist/middleware/auth-context.d.ts.map +1 -0
- package/dist/middleware/auth-context.js +251 -0
- package/dist/middleware/auth-context.js.map +1 -0
- package/dist/middleware/body-cap.d.ts +17 -0
- package/dist/middleware/body-cap.d.ts.map +1 -0
- package/dist/middleware/body-cap.js +31 -0
- package/dist/middleware/body-cap.js.map +1 -0
- package/dist/middleware/body-refusal.d.ts +20 -0
- package/dist/middleware/body-refusal.d.ts.map +1 -0
- package/dist/middleware/body-refusal.js +5 -0
- package/dist/middleware/body-refusal.js.map +1 -0
- package/dist/middleware/cross-site.d.ts +61 -0
- package/dist/middleware/cross-site.d.ts.map +1 -0
- package/dist/middleware/cross-site.js +59 -0
- package/dist/middleware/cross-site.js.map +1 -0
- package/dist/middleware/hub-managed.d.ts +45 -0
- package/dist/middleware/hub-managed.d.ts.map +1 -0
- package/dist/middleware/hub-managed.js +56 -0
- package/dist/middleware/hub-managed.js.map +1 -0
- package/dist/middleware/idempotency.d.ts +14 -0
- package/dist/middleware/idempotency.d.ts.map +1 -0
- package/dist/middleware/idempotency.js +222 -0
- package/dist/middleware/idempotency.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +12 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/json-depth.d.ts +32 -0
- package/dist/middleware/json-depth.d.ts.map +1 -0
- package/dist/middleware/json-depth.js +80 -0
- package/dist/middleware/json-depth.js.map +1 -0
- package/dist/middleware/no-store.d.ts +21 -0
- package/dist/middleware/no-store.d.ts.map +1 -0
- package/dist/middleware/no-store.js +32 -0
- package/dist/middleware/no-store.js.map +1 -0
- package/dist/middleware/oauth-public.d.ts +16 -0
- package/dist/middleware/oauth-public.d.ts.map +1 -0
- package/dist/middleware/oauth-public.js +50 -0
- package/dist/middleware/oauth-public.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +182 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +277 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/request-id.d.ts +10 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +42 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/middleware/scopes.d.ts +33 -0
- package/dist/middleware/scopes.d.ts.map +1 -0
- package/dist/middleware/scopes.js +139 -0
- package/dist/middleware/scopes.js.map +1 -0
- package/dist/middleware/security-headers.d.ts +53 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +96 -0
- package/dist/middleware/security-headers.js.map +1 -0
- package/dist/observability/index.d.ts +3 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +3 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +17 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +82 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/otel.d.ts +20 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +54 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/pagination.d.ts +57 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +90 -0
- package/dist/pagination.js.map +1 -0
- package/dist/platform/edition.d.ts +57 -0
- package/dist/platform/edition.d.ts.map +1 -0
- package/dist/platform/edition.js +90 -0
- package/dist/platform/edition.js.map +1 -0
- package/dist/platform/entitlements.d.ts +26 -0
- package/dist/platform/entitlements.d.ts.map +1 -0
- package/dist/platform/entitlements.js +28 -0
- package/dist/platform/entitlements.js.map +1 -0
- package/dist/platform/events.d.ts +87 -0
- package/dist/platform/events.d.ts.map +1 -0
- package/dist/platform/events.js +32 -0
- package/dist/platform/events.js.map +1 -0
- package/dist/platform/index.d.ts +8 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +8 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/local-identity.d.ts +39 -0
- package/dist/platform/local-identity.d.ts.map +1 -0
- package/dist/platform/local-identity.js +87 -0
- package/dist/platform/local-identity.js.map +1 -0
- package/dist/platform/registry.d.ts +23 -0
- package/dist/platform/registry.d.ts.map +1 -0
- package/dist/platform/registry.js +5 -0
- package/dist/platform/registry.js.map +1 -0
- package/dist/platform/usage.d.ts +11 -0
- package/dist/platform/usage.d.ts.map +1 -0
- package/dist/platform/usage.js +12 -0
- package/dist/platform/usage.js.map +1 -0
- package/dist/platform/workspaces.d.ts +25 -0
- package/dist/platform/workspaces.d.ts.map +1 -0
- package/dist/platform/workspaces.js +44 -0
- package/dist/platform/workspaces.js.map +1 -0
- package/dist/projects/access.d.ts +40 -0
- package/dist/projects/access.d.ts.map +1 -0
- package/dist/projects/access.js +133 -0
- package/dist/projects/access.js.map +1 -0
- package/dist/projects/index.d.ts +2 -0
- package/dist/projects/index.d.ts.map +1 -0
- package/dist/projects/index.js +2 -0
- package/dist/projects/index.js.map +1 -0
- package/dist/route-label.d.ts +23 -0
- package/dist/route-label.d.ts.map +1 -0
- package/dist/route-label.js +29 -0
- package/dist/route-label.js.map +1 -0
- package/dist/routes/health.d.ts +30 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +54 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +3 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/wellknown.d.ts +11 -0
- package/dist/routes/wellknown.d.ts.map +1 -0
- package/dist/routes/wellknown.js +45 -0
- package/dist/routes/wellknown.js.map +1 -0
- package/dist/secret.d.ts +30 -0
- package/dist/secret.d.ts.map +1 -0
- package/dist/secret.js +97 -0
- package/dist/secret.js.map +1 -0
- package/dist/setup-transport.d.ts +23 -0
- package/dist/setup-transport.d.ts.map +1 -0
- package/dist/setup-transport.js +52 -0
- package/dist/setup-transport.js.map +1 -0
- package/dist/state.d.ts +21 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +4 -0
- package/dist/state.js.map +1 -0
- package/dist/storage/driver.d.ts +38 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +14 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/factory.d.ts +4 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +20 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +21 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +88 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/s3.d.ts +29 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +82 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/testing/fake-hub.d.ts +425 -0
- package/dist/testing/fake-hub.d.ts.map +1 -0
- package/dist/testing/fake-hub.js +1074 -0
- package/dist/testing/fake-hub.js.map +1 -0
- package/dist/testing/helpers.d.ts +124 -0
- package/dist/testing/helpers.d.ts.map +1 -0
- package/dist/testing/helpers.js +174 -0
- package/dist/testing/helpers.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/setup-origins.d.ts +21 -0
- package/dist/testing/setup-origins.d.ts.map +1 -0
- package/dist/testing/setup-origins.js +57 -0
- package/dist/testing/setup-origins.js.map +1 -0
- package/dist/testing/sso-helpers.d.ts +43 -0
- package/dist/testing/sso-helpers.d.ts.map +1 -0
- package/dist/testing/sso-helpers.js +159 -0
- package/dist/testing/sso-helpers.js.map +1 -0
- package/dist/tool-definition.d.ts +382 -0
- package/dist/tool-definition.d.ts.map +1 -0
- package/dist/tool-definition.js +46 -0
- package/dist/tool-definition.js.map +1 -0
- package/dist/util/index.d.ts +8 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +8 -0
- package/dist/util/index.js.map +1 -0
- package/package.json +161 -0
- package/src/accounts/deletion.ts +389 -0
- package/src/accounts/erasure-log.ts +140 -0
- package/src/accounts/index.ts +5 -0
- package/src/accounts/mint-refusal.ts +67 -0
- package/src/accounts/signup-duplicate.ts +21 -0
- package/src/accounts/superadmin.ts +46 -0
- package/src/api/apikeys.ts +147 -0
- package/src/api/audit.ts +83 -0
- package/src/api/break-glass.ts +294 -0
- package/src/api/cli-auth.ts +308 -0
- package/src/api/create-api.ts +1403 -0
- package/src/api/demo-passes.ts +207 -0
- package/src/api/errors.ts +13 -0
- package/src/api/export.ts +482 -0
- package/src/api/files.ts +200 -0
- package/src/api/index.ts +29 -0
- package/src/api/invitations.ts +396 -0
- package/src/api/members.ts +617 -0
- package/src/api/onboarding.ts +50 -0
- package/src/api/openapi-doc.ts +34 -0
- package/src/api/projects.ts +788 -0
- package/src/api/scope-routes.ts +12 -0
- package/src/api/sso-connect.ts +246 -0
- package/src/api/sso-logout.ts +76 -0
- package/src/api/teams.ts +575 -0
- package/src/api/workspaces.ts +649 -0
- package/src/apikeys/index.ts +2 -0
- package/src/apikeys/peppers.ts +118 -0
- package/src/apikeys/service.ts +223 -0
- package/src/app.ts +228 -0
- package/src/audit/filters.ts +101 -0
- package/src/audit/index.ts +9 -0
- package/src/audit/service.ts +154 -0
- package/src/boot.ts +953 -0
- package/src/constant-time.ts +9 -0
- package/src/email/driver.ts +139 -0
- package/src/email/index.ts +26 -0
- package/src/email/shell.ts +201 -0
- package/src/email/templates.ts +184 -0
- package/src/entitlements/check.ts +435 -0
- package/src/entitlements/clock-skew.ts +58 -0
- package/src/entitlements/gate.ts +636 -0
- package/src/entitlements/hub-machine-token.ts +205 -0
- package/src/entitlements/hub-subject.ts +77 -0
- package/src/entitlements/index.ts +37 -0
- package/src/entitlements/poster.ts +265 -0
- package/src/entitlements/profiles.ts +303 -0
- package/src/entitlements/slot.ts +105 -0
- package/src/env.ts +456 -0
- package/src/files/http.ts +77 -0
- package/src/files/index.ts +4 -0
- package/src/files/serve.ts +115 -0
- package/src/files/service.ts +209 -0
- package/src/files/spool.ts +58 -0
- package/src/identity/better-auth.ts +1103 -0
- package/src/identity/demo-pass-plugin.ts +121 -0
- package/src/identity/demo-pass-rules.ts +229 -0
- package/src/identity/demo-pass.ts +390 -0
- package/src/identity/hub-grant.ts +704 -0
- package/src/identity/hub-jwt.ts +78 -0
- package/src/identity/hub-live-gate.ts +167 -0
- package/src/identity/hub-logout.ts +174 -0
- package/src/identity/hub-projection.ts +251 -0
- package/src/identity/hub-reconcile.ts +572 -0
- package/src/identity/hub-sso.ts +696 -0
- package/src/identity/hub-user-client.ts +554 -0
- package/src/identity/index.ts +56 -0
- package/src/identity/oauth-jwt.ts +128 -0
- package/src/identity/resolve-membership.ts +104 -0
- package/src/identity/signing-key.ts +164 -0
- package/src/index.ts +65 -0
- package/src/invitations/index.ts +1 -0
- package/src/invitations/service.ts +171 -0
- package/src/jobs/index.ts +25 -0
- package/src/jobs/pgboss.ts +594 -0
- package/src/jobs/timers.ts +287 -0
- package/src/logger.ts +67 -0
- package/src/mcp/errors.ts +111 -0
- package/src/mcp/http.ts +129 -0
- package/src/mcp/index.ts +28 -0
- package/src/mcp/inputs.ts +33 -0
- package/src/mcp/projects.ts +480 -0
- package/src/mcp/server.ts +174 -0
- package/src/mcp/teams.ts +97 -0
- package/src/mcp/tool-kit.ts +148 -0
- package/src/members/removal.ts +216 -0
- package/src/middleware/auth-body.ts +58 -0
- package/src/middleware/auth-context.ts +384 -0
- package/src/middleware/body-cap.ts +33 -0
- package/src/middleware/body-refusal.ts +23 -0
- package/src/middleware/cross-site.ts +122 -0
- package/src/middleware/hub-managed.ts +61 -0
- package/src/middleware/idempotency.ts +264 -0
- package/src/middleware/index.ts +33 -0
- package/src/middleware/json-depth.ts +74 -0
- package/src/middleware/no-store.ts +30 -0
- package/src/middleware/oauth-public.ts +54 -0
- package/src/middleware/rate-limit.ts +432 -0
- package/src/middleware/request-id.ts +54 -0
- package/src/middleware/scopes.ts +150 -0
- package/src/middleware/security-headers.ts +129 -0
- package/src/observability/index.ts +2 -0
- package/src/observability/metrics.ts +102 -0
- package/src/observability/otel.ts +79 -0
- package/src/pagination.ts +118 -0
- package/src/platform/edition.ts +140 -0
- package/src/platform/entitlements.ts +47 -0
- package/src/platform/events.ts +71 -0
- package/src/platform/index.ts +7 -0
- package/src/platform/local-identity.ts +90 -0
- package/src/platform/registry.ts +28 -0
- package/src/platform/usage.ts +13 -0
- package/src/platform/workspaces.ts +41 -0
- package/src/projects/access.ts +160 -0
- package/src/projects/index.ts +7 -0
- package/src/route-label.ts +29 -0
- package/src/routes/health.ts +79 -0
- package/src/routes/index.ts +2 -0
- package/src/routes/wellknown.ts +67 -0
- package/src/secret.ts +115 -0
- package/src/setup-transport.ts +46 -0
- package/src/state.ts +23 -0
- package/src/storage/driver.ts +48 -0
- package/src/storage/factory.ts +34 -0
- package/src/storage/index.ts +3 -0
- package/src/storage/local.ts +93 -0
- package/src/storage/s3.ts +109 -0
- package/src/testing/fake-hub.ts +1316 -0
- package/src/testing/helpers.ts +254 -0
- package/src/testing/index.ts +11 -0
- package/src/testing/setup-origins.ts +58 -0
- package/src/testing/sso-helpers.ts +178 -0
- package/src/tool-definition.ts +463 -0
- package/src/util/index.ts +17 -0
- package/test/fixtures/onboarding-backfill.sql +13 -0
- package/test/fixtures/operator-user-id-backfill.sql +18 -0
- package/test/host/dr-lib.sh +253 -0
- package/test/host/drizzle/0000_chassis_baseline.sql +438 -0
- package/test/host/drizzle/0001_last_owner_guard.sql +42 -0
- package/test/host/drizzle/meta/0000_snapshot.json +3566 -0
- package/test/host/drizzle/meta/_journal.json +20 -0
- package/test/host/drizzle.config.ts +17 -0
- package/test/host/identity.ts +41 -0
- package/test/host/minimal-host.ts +35 -0
- package/test/host/minimal-tool.ts +123 -0
- package/test/integration/account-oracle-uniformity.test.ts +284 -0
- package/test/integration/account-recovery.test.ts +236 -0
- package/test/integration/account.test.ts +120 -0
- package/test/integration/api-quota.test.ts +208 -0
- package/test/integration/apikey-expiry.test.ts +178 -0
- package/test/integration/apikey-pepper-rotation.test.ts +190 -0
- package/test/integration/boot-posture.test.ts +169 -0
- package/test/integration/break-glass.test.ts +484 -0
- package/test/integration/cloud-lifecycle.test.ts +233 -0
- package/test/integration/credential-boundaries.test.ts +195 -0
- package/test/integration/default-workspace.test.ts +414 -0
- package/test/integration/demo-pass-rules.test.ts +332 -0
- package/test/integration/demo-pass.test.ts +1222 -0
- package/test/integration/dr-verify-real-dump.test.ts +154 -0
- package/test/integration/edition.test.ts +868 -0
- package/test/integration/email-change.test.ts +394 -0
- package/test/integration/empty-tool.test.ts +267 -0
- package/test/integration/entitlements-null-hook.test.ts +187 -0
- package/test/integration/entitlements.test.ts +693 -0
- package/test/integration/export-entries.test.ts +321 -0
- package/test/integration/files.test.ts +320 -0
- package/test/integration/first-boot-claim.test.ts +131 -0
- package/test/integration/gdpr.test.ts +532 -0
- package/test/integration/helpers.ts +29 -0
- package/test/integration/hub-grant.test.ts +505 -0
- package/test/integration/hub-live-gate.test.ts +612 -0
- package/test/integration/hub-managed-membership.test.ts +559 -0
- package/test/integration/hub-org-selector.test.ts +281 -0
- package/test/integration/hub-reconcile.test.ts +646 -0
- package/test/integration/hub-sso.test.ts +704 -0
- package/test/integration/hub-teams.test.ts +771 -0
- package/test/integration/idempotency.test.ts +261 -0
- package/test/integration/invite-verification.test.ts +210 -0
- package/test/integration/last-owner-race.test.ts +263 -0
- package/test/integration/m9-fixes.test.ts +290 -0
- package/test/integration/mcp-projects.test.ts +463 -0
- package/test/integration/member-removal-race.test.ts +466 -0
- package/test/integration/member-removal.test.ts +794 -0
- package/test/integration/oauth-mcp.test.ts +477 -0
- package/test/integration/oauth-workspace.test.ts +371 -0
- package/test/integration/observability.test.ts +183 -0
- package/test/integration/onboarding.test.ts +268 -0
- package/test/integration/orphan-purge.test.ts +451 -0
- package/test/integration/pagination.test.ts +344 -0
- package/test/integration/platform-core.test.ts +305 -0
- package/test/integration/platform.test.ts +246 -0
- package/test/integration/pool-survives-restart.test.ts +80 -0
- package/test/integration/projects-cloud.test.ts +193 -0
- package/test/integration/projects.test.ts +1310 -0
- package/test/integration/security-fixes.test.ts +190 -0
- package/test/integration/setup-transport.test.ts +118 -0
- package/test/integration/signin-wall.test.ts +103 -0
- package/test/integration/signing-key-rotation.test.ts +349 -0
- package/test/integration/sso-helpers.ts +15 -0
- package/test/integration/sso-logout.test.ts +283 -0
- package/test/integration/teams-cloud.test.ts +194 -0
- package/test/integration/teams.test.ts +551 -0
- package/test/integration/timers.test.ts +377 -0
- package/test/integration/two-factor.test.ts +301 -0
- package/test/integration/usage-window.test.ts +161 -0
- package/test/integration/workspace-create-cloud.test.ts +523 -0
- package/test/integration/workspace-create.test.ts +510 -0
- package/test/integration/workspace-scoping.test.ts +530 -0
- package/test/integration/zz-adv-replay-owner.test.ts +205 -0
- package/test/unit/apikey-peppers.test.ts +110 -0
- package/test/unit/apikey-prefix.test.ts +34 -0
- package/test/unit/audit-filters.test.ts +135 -0
- package/test/unit/auth-origins.test.ts +92 -0
- package/test/unit/body-cap.test.ts +84 -0
- package/test/unit/clock-skew.test.ts +68 -0
- package/test/unit/cross-site.test.ts +166 -0
- package/test/unit/declared-credits.test.ts +13 -0
- package/test/unit/demo-pass-rules.test.ts +192 -0
- package/test/unit/email-driver.test.ts +127 -0
- package/test/unit/end-pool.test.ts +181 -0
- package/test/unit/entitlement-check.test.ts +492 -0
- package/test/unit/entitlement-gate.test.ts +1333 -0
- package/test/unit/entitlement-profiles.test.ts +289 -0
- package/test/unit/erasure-log.test.ts +72 -0
- package/test/unit/error-mapping.test.ts +89 -0
- package/test/unit/export-entries.test.ts +85 -0
- package/test/unit/export-sanitize.test.ts +27 -0
- package/test/unit/files-head-route.test.ts +155 -0
- package/test/unit/files-http.test.ts +97 -0
- package/test/unit/head-rewrite.test.ts +72 -0
- package/test/unit/hub-create-org.test.ts +181 -0
- package/test/unit/hub-jwt.test.ts +93 -0
- package/test/unit/hub-sso-params.test.ts +39 -0
- package/test/unit/hub-subject.test.ts +83 -0
- package/test/unit/idempotency-crypto.test.ts +45 -0
- package/test/unit/json-depth.test.ts +88 -0
- package/test/unit/logger-redaction.test.ts +66 -0
- package/test/unit/mcp-errors.test.ts +110 -0
- package/test/unit/mcp-inputs.test.ts +106 -0
- package/test/unit/mcp-project-hints.test.ts +26 -0
- package/test/unit/no-store.test.ts +49 -0
- package/test/unit/no-tool-migration-filename.test.ts +70 -0
- package/test/unit/observability.test.ts +64 -0
- package/test/unit/openapi-doc.test.ts +93 -0
- package/test/unit/rate-limit-consume-on.test.ts +76 -0
- package/test/unit/rate-limit.test.ts +39 -0
- package/test/unit/readyz-storage.test.ts +157 -0
- package/test/unit/request-quota.test.ts +146 -0
- package/test/unit/scopes.test.ts +66 -0
- package/test/unit/security-headers.test.ts +131 -0
- package/test/unit/serve-content-type.test.ts +74 -0
- package/test/unit/setup-transport.test.ts +29 -0
- package/test/unit/storage-local.test.ts +53 -0
- package/test/unit/superadmin.test.ts +32 -0
- package/test/unit/timers.test.ts +287 -0
- package/test/unit/tool-definition-guards.test.ts +166 -0
- package/test/unit/tool-entitlements-guard.test.ts +168 -0
- package/test/unit/usage-poster.test.ts +542 -0
- package/test/unit/usage-window.test.ts +48 -0
- package/test/unit/workspace-create-audit.test.ts +48 -0
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import { and, eq, ne, sql } from 'drizzle-orm';
|
|
2
|
+
import { ACTIVE_WORKSPACE_HEADER } from '@antasphere/chassis-contract';
|
|
3
|
+
import { defaultWorkspaceSetRoute, workspaceCreateRoute, workspaceUpdateRoute } from '@antasphere/chassis-contract/routes';
|
|
4
|
+
import { apiKeys, workspaceMembers, workspaces } from '@antasphere/chassis-db';
|
|
5
|
+
import { projectOrgMembership } from '../identity/hub-projection.js';
|
|
6
|
+
import { requireAuth, requireRole } from '../middleware/auth-context.js';
|
|
7
|
+
const err = (code, message) => ({ error: { code, message } });
|
|
8
|
+
/**
|
|
9
|
+
* POST /workspaces — a signed-in person creates ANOTHER workspace from inside
|
|
10
|
+
* the product (PRDCT-2444 self-hosted, PRDCT-2443 cloud). ADR 014 kept this
|
|
11
|
+
* door shut in the template ("workspace creation is a product decision");
|
|
12
|
+
* this module is that decision, taken.
|
|
13
|
+
*
|
|
14
|
+
* One route, two editions:
|
|
15
|
+
* - oss: `WorkspaceService.create` (the setup path) under a per-user
|
|
16
|
+
* advisory lock + the operator's `MAX_WORKSPACES_PER_USER` cap — the
|
|
17
|
+
* hub's `POST /orgs` model, mirrored.
|
|
18
|
+
* - cloud: the organization is created AT THE HUB as the caller (their own
|
|
19
|
+
* stored grant, ADR 019 — no service key, no target-user parameter), then
|
|
20
|
+
* the caller's reconcile is forced so the local projection and the
|
|
21
|
+
* `origin='hub'` owner membership exist before the answer. The answer
|
|
22
|
+
* carries the LOCAL workspace id.
|
|
23
|
+
*
|
|
24
|
+
* SESSIONS ONLY, twice: the path is deliberately UNLISTED in the fail-closed
|
|
25
|
+
* machine scope allowlist (middleware/scopes.ts — never list it), and the
|
|
26
|
+
* handler re-checks `via === 'session'` itself. /mcp carries no tool for it.
|
|
27
|
+
*
|
|
28
|
+
* A WORKSPACE NEVER LEARNS WHAT ITS MEMBERS DO ELSEWHERE: the route is
|
|
29
|
+
* exempt from the generic audit middleware (which would attribute the event
|
|
30
|
+
* to the workspace the person happened to be in) and writes its one genesis
|
|
31
|
+
* row, `workspace.create`, into the NEW workspace's own trail — the setup
|
|
32
|
+
* pattern. The idempotency claim is the only trace left in the caller's
|
|
33
|
+
* current scope, and it is a sealed replay cache, never a readable surface.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Per-user creation lock, two-int advisory form `(classid, hashtext(userId))`.
|
|
37
|
+
* 7432006 is free in this repository (7432001 migrations, 7432002/3 the
|
|
38
|
+
* last-owner guards, 7432004 the grant refresh + pg-boss, 7432005 a tool's
|
|
39
|
+
* uploads) and is, on purpose, the same number the hub uses for the same
|
|
40
|
+
* job in ITS database.
|
|
41
|
+
*/
|
|
42
|
+
const WORKSPACE_CREATE_LOCK_NAMESPACE = 7432006;
|
|
43
|
+
/**
|
|
44
|
+
* THE ONE eligibility rule, shared by the route (inside its locked
|
|
45
|
+
* transaction) and by `/me.canCreateWorkspace` — so the flag can never
|
|
46
|
+
* promise what the route refuses. Order = the order the refusals are
|
|
47
|
+
* reported in.
|
|
48
|
+
*
|
|
49
|
+
* - sessions only;
|
|
50
|
+
* - the operator's dial at 0 closes the door on both editions;
|
|
51
|
+
* - a GUEST-ONLY user (every active membership is `origin='guest'`) is an
|
|
52
|
+
* outsider invited to single resources (D2): refused like every other
|
|
53
|
+
* workspace-level act. One non-guest active membership anywhere lifts it
|
|
54
|
+
* — it is a fact about the PERSON, not about the workspace they are in;
|
|
55
|
+
* - oss: fewer ACTIVE OWNER memberships than the cap (setup's counts);
|
|
56
|
+
* - cloud: the tool not restricted (TOOL_RESTRICTED), then a live hub link.
|
|
57
|
+
* The count is the hub's own cap, asked there.
|
|
58
|
+
*/
|
|
59
|
+
export async function workspaceCreationRefusal(conn, policy, caller) {
|
|
60
|
+
if (caller.via !== 'session')
|
|
61
|
+
return 'session_required';
|
|
62
|
+
if (policy.maxPerUser === 0)
|
|
63
|
+
return 'workspace_creation_disabled';
|
|
64
|
+
const rows = await conn
|
|
65
|
+
.select({ origin: workspaceMembers.origin, role: workspaceMembers.role })
|
|
66
|
+
.from(workspaceMembers)
|
|
67
|
+
.where(and(eq(workspaceMembers.userId, caller.userId), eq(workspaceMembers.isActive, true)));
|
|
68
|
+
if (rows.length > 0 && rows.every((r) => r.origin === 'guest'))
|
|
69
|
+
return 'guest_forbidden';
|
|
70
|
+
if (policy.hasHubLink) {
|
|
71
|
+
if (policy.restricted)
|
|
72
|
+
return 'restricted_tool';
|
|
73
|
+
return (await policy.hasHubLink(caller.userId)) ? null : 'hub_link_required';
|
|
74
|
+
}
|
|
75
|
+
const owned = rows.filter((r) => r.role === 'owner').length;
|
|
76
|
+
return owned >= policy.maxPerUser ? 'workspace_limit_reached' : null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Every refusal but `guest_forbidden`, whose sentence is the tool's
|
|
80
|
+
* (`WorkspaceRouteDeps.guestForbiddenMessage`), and `restricted_tool`, whose
|
|
81
|
+
* sentence names the tool (`restrictedToolMessage`).
|
|
82
|
+
*/
|
|
83
|
+
const CHASSIS_REFUSAL_MESSAGES = {
|
|
84
|
+
session_required: 'Creating a workspace requires a browser session',
|
|
85
|
+
workspace_creation_disabled: 'Workspace creation is closed on this instance',
|
|
86
|
+
workspace_limit_reached: 'This account already owns the maximum number of workspaces',
|
|
87
|
+
hub_link_required: 'Sign in with Antasphere to create an organization'
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* The restricted tool's refusal (PRDCT-2947), tool-neutral through the
|
|
91
|
+
* identity: who opens an organization to the tool, and whom to ask.
|
|
92
|
+
*/
|
|
93
|
+
export const restrictedToolMessage = (displayName) => `Organizations that open ${displayName} are granted by Antasphere; ask Antasphere to open it for yours`;
|
|
94
|
+
const personKey = (userId) => `u:${userId}`;
|
|
95
|
+
async function bucketExhausted(limiter, key) {
|
|
96
|
+
// A backend read error fails open, like every other read of a limiter here.
|
|
97
|
+
const state = await limiter.get(key).catch(() => null);
|
|
98
|
+
return Boolean(state && state.remainingPoints <= 0 && state.msBeforeNext > 0);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Read-only: would the wall refuse this person at this address right now?
|
|
102
|
+
* `/me.canCreateWorkspace` asks it so the flag stays honest about the wall.
|
|
103
|
+
*/
|
|
104
|
+
export async function workspaceCreateWallClosed(wall, address, userId) {
|
|
105
|
+
return ((await bucketExhausted(wall.person, personKey(userId))) || (await bucketExhausted(wall.address, address)));
|
|
106
|
+
}
|
|
107
|
+
/** Spend one attempt. False = walled (429). */
|
|
108
|
+
async function spendCreationAttempt(wall, address, userId) {
|
|
109
|
+
// A walled ADDRESS refuses without charging the person for it.
|
|
110
|
+
if (await bucketExhausted(wall.address, address))
|
|
111
|
+
return false;
|
|
112
|
+
try {
|
|
113
|
+
await wall.person.consume(personKey(userId));
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false; // the person's own budget is spent: the address bucket is NOT touched
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
await wall.address.consume(address);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
/** Control-flow marker: a refusal decided inside the locked transaction. */
|
|
127
|
+
class CreationRefused extends Error {
|
|
128
|
+
refusal;
|
|
129
|
+
constructor(refusal) {
|
|
130
|
+
super(refusal);
|
|
131
|
+
this.refusal = refusal;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export function workspaceCreationPolicy(deps) {
|
|
135
|
+
return { maxPerUser: deps.maxPerUser, restricted: deps.restricted, hasHubLink: deps.cloud?.hasHubLink };
|
|
136
|
+
}
|
|
137
|
+
export function registerWorkspaceRoutes(api, deps) {
|
|
138
|
+
const { db, auth, audit, registry, logger, cloud } = deps;
|
|
139
|
+
const policy = workspaceCreationPolicy(deps);
|
|
140
|
+
const REFUSAL_MESSAGES = {
|
|
141
|
+
...CHASSIS_REFUSAL_MESSAGES,
|
|
142
|
+
guest_forbidden: deps.guestForbiddenMessage,
|
|
143
|
+
restricted_tool: restrictedToolMessage(deps.displayName)
|
|
144
|
+
};
|
|
145
|
+
api.openapi(workspaceCreateRoute, async (c) => {
|
|
146
|
+
const principal = c.get('principal');
|
|
147
|
+
// Defense in depth: the scope allowlist already 403s every machine
|
|
148
|
+
// principal (POST /workspaces is unlisted, fail-closed); this explicit
|
|
149
|
+
// check stays so a future allowlist edit cannot silently hand workspace
|
|
150
|
+
// creation to an API key or an OAuth bearer.
|
|
151
|
+
if (principal && principal.via !== 'session') {
|
|
152
|
+
return c.json(err('session_required', REFUSAL_MESSAGES.session_required), 403);
|
|
153
|
+
}
|
|
154
|
+
// The caller. A resolved principal is a session by now. WITHOUT one, the
|
|
155
|
+
// cloud edition still serves the ZERO-MEMBERSHIP session (the /me zero
|
|
156
|
+
// state: a hub user whose last organization was removed creates their
|
|
157
|
+
// next one here) — resolved route-locally, the /me pattern, and ONLY
|
|
158
|
+
// for the selector-less request. On oss no principal means no active
|
|
159
|
+
// membership of this instance: not someone who may create here.
|
|
160
|
+
let userId;
|
|
161
|
+
if (principal) {
|
|
162
|
+
userId = principal.userId;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// A request that NAMED a workspace and failed its membership check keeps
|
|
166
|
+
// the fail-closed 401 (no oracle about that workspace) — /me's rule.
|
|
167
|
+
if (c.req.header(ACTIVE_WORKSPACE_HEADER)?.trim()) {
|
|
168
|
+
return c.json(err('unauthenticated', 'Authentication required'), 401);
|
|
169
|
+
}
|
|
170
|
+
const session = cloud ? await auth.api.getSession({ headers: c.req.raw.headers }) : null;
|
|
171
|
+
if (!session?.user)
|
|
172
|
+
return c.json(err('unauthenticated', 'Authentication required'), 401);
|
|
173
|
+
userId = session.user.id;
|
|
174
|
+
}
|
|
175
|
+
const actor = { userId, via: 'session' };
|
|
176
|
+
// The rate wall, now that the caller is a known person (see
|
|
177
|
+
// WorkspaceCreateWall): nothing above this line spends a point.
|
|
178
|
+
if (!(await spendCreationAttempt(deps.wall, deps.clientIp(c), userId))) {
|
|
179
|
+
return c.json(err('rate_limited', 'Too many requests, slow down'), 429);
|
|
180
|
+
}
|
|
181
|
+
const body = c.req.valid('json');
|
|
182
|
+
const name = body.name.trim();
|
|
183
|
+
if (!name)
|
|
184
|
+
return c.json(err('validation_error', 'The workspace needs a name'), 400);
|
|
185
|
+
// The look the person picked in the dialog: written on the row the
|
|
186
|
+
// moment it exists (oss) or once it is projected (cloud), so the
|
|
187
|
+
// workspace opens with it on every member's screen, not just this browser's.
|
|
188
|
+
const look = {
|
|
189
|
+
theme: body.look?.theme ?? null,
|
|
190
|
+
pattern: body.look?.pattern ?? null,
|
|
191
|
+
field: body.look?.field ?? null,
|
|
192
|
+
grain: body.look?.grain ?? null
|
|
193
|
+
};
|
|
194
|
+
let workspaceId;
|
|
195
|
+
let workspaceName = name;
|
|
196
|
+
if (!cloud) {
|
|
197
|
+
// ── oss: local creation under the per-user lock ─────────────────────
|
|
198
|
+
try {
|
|
199
|
+
workspaceId = await db.transaction(async (tx) => {
|
|
200
|
+
// Serializes THIS user's creations: two concurrent requests can
|
|
201
|
+
// never both count "one under the cap". Transaction-scoped — it
|
|
202
|
+
// cannot leak.
|
|
203
|
+
await tx.execute(sql `SELECT pg_advisory_xact_lock(${WORKSPACE_CREATE_LOCK_NAMESPACE}, hashtext(${userId}))`);
|
|
204
|
+
const refusal = await workspaceCreationRefusal(tx, policy, actor);
|
|
205
|
+
if (refusal)
|
|
206
|
+
throw new CreationRefused(refusal);
|
|
207
|
+
// The registry's WorkspaceService (ADR 014), joined to this
|
|
208
|
+
// transaction exactly as setup does: workspace + ACTIVE OWNER
|
|
209
|
+
// membership (origin defaults to 'local') or nothing.
|
|
210
|
+
const created = await registry.workspaces.create(name, userId, tx);
|
|
211
|
+
await tx
|
|
212
|
+
.update(workspaces)
|
|
213
|
+
.set({
|
|
214
|
+
lookTheme: look.theme,
|
|
215
|
+
lookPattern: look.pattern,
|
|
216
|
+
lookField: look.field,
|
|
217
|
+
lookGrain: look.grain
|
|
218
|
+
})
|
|
219
|
+
.where(eq(workspaces.id, created.workspaceId));
|
|
220
|
+
return created.workspaceId;
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
catch (cause) {
|
|
224
|
+
if (cause instanceof CreationRefused) {
|
|
225
|
+
return c.json(err(cause.refusal, REFUSAL_MESSAGES[cause.refusal]), 403);
|
|
226
|
+
}
|
|
227
|
+
throw cause;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// ── cloud: create at the hub as the caller, then project ────────────
|
|
232
|
+
const refusal = await workspaceCreationRefusal(db, policy, actor);
|
|
233
|
+
if (refusal)
|
|
234
|
+
return c.json(err(refusal, REFUSAL_MESSAGES[refusal]), 403);
|
|
235
|
+
const created = await cloud.createOrg(userId, name);
|
|
236
|
+
switch (created.kind) {
|
|
237
|
+
case 'created':
|
|
238
|
+
break;
|
|
239
|
+
case 'limit_reached':
|
|
240
|
+
return c.json(err('workspace_limit_reached', 'This account already owns the maximum number of organizations'), 403);
|
|
241
|
+
case 'invalid':
|
|
242
|
+
return c.json(err('validation_error', 'Antasphere refused this organization name'), 400);
|
|
243
|
+
case 'no_link':
|
|
244
|
+
return c.json(err('hub_link_required', REFUSAL_MESSAGES.hub_link_required), 403);
|
|
245
|
+
case 'grant_dead':
|
|
246
|
+
// The existing live-gate verdict, verbatim: a browser SSO re-login heals it.
|
|
247
|
+
return c.json(err('hub_grant_expired', 'Your Antasphere grant on this instance has expired — sign in with Antasphere again to renew it'), 401);
|
|
248
|
+
case 'reauth_required':
|
|
249
|
+
// The grant is alive but predates `orgs:create` (or a CLI connect
|
|
250
|
+
// replaced it). Same status and same cure as hub_grant_expired — a
|
|
251
|
+
// browser sign-in — under its own code, so it is never mistaken
|
|
252
|
+
// for a refusal that signing in again would not lift.
|
|
253
|
+
return c.json(err('hub_reauth_required', 'Sign in again to create a workspace, then retry'), 401);
|
|
254
|
+
case 'refused':
|
|
255
|
+
return c.json(err('hub_refused', 'Antasphere did not accept the creation of this organization'), 403);
|
|
256
|
+
case 'inconclusive':
|
|
257
|
+
// The existing live-gate verdict's code. Never retried here: the
|
|
258
|
+
// hub commits before it answers, so the organization may exist —
|
|
259
|
+
// if it does, the caller's next reconcile pass projects it.
|
|
260
|
+
return c.json(err('hub_unavailable', 'Antasphere could not be reached — the organization was not confirmed'), 403);
|
|
261
|
+
}
|
|
262
|
+
// The reconcile IS the projection (the login path's rule): force the
|
|
263
|
+
// caller's pass so the workspace row and the origin='hub' membership
|
|
264
|
+
// are written by the same code every other hub org goes through.
|
|
265
|
+
const pass = await cloud.forceReconcile(userId);
|
|
266
|
+
const find = () => db
|
|
267
|
+
.select({ id: workspaces.id, name: workspaces.name })
|
|
268
|
+
.from(workspaces)
|
|
269
|
+
.innerJoin(workspaceMembers, and(eq(workspaceMembers.workspaceId, workspaces.id), eq(workspaceMembers.userId, userId), eq(workspaceMembers.isActive, true)))
|
|
270
|
+
.where(eq(workspaces.centralAccountId, created.org.id))
|
|
271
|
+
.limit(1);
|
|
272
|
+
let [local] = await find();
|
|
273
|
+
if (!local && created.org.role !== null) {
|
|
274
|
+
// The pass right after the 201 was inconclusive (a hub blip). The
|
|
275
|
+
// 201 itself is hub truth read AS THE USER about THIS org — the same
|
|
276
|
+
// standing as one entry of their GET /orgs list — so project that
|
|
277
|
+
// one entry through the same primitive rather than answer an error
|
|
278
|
+
// for an organization that exists (a retry would create a second).
|
|
279
|
+
// Never from a token, never for anyone but the caller.
|
|
280
|
+
logger.warn({ userId, pass }, 'workspace create: forced reconcile did not project the new org — projecting from the hub 201');
|
|
281
|
+
await projectOrgMembership(db, {
|
|
282
|
+
localUserId: userId,
|
|
283
|
+
hubWorkspaceId: created.org.id,
|
|
284
|
+
hubWorkspaceName: created.org.name,
|
|
285
|
+
role: created.org.role
|
|
286
|
+
});
|
|
287
|
+
[local] = await find();
|
|
288
|
+
}
|
|
289
|
+
if (!local) {
|
|
290
|
+
logger.error({ userId, pass }, 'workspace create: hub org created but no local projection');
|
|
291
|
+
return c.json(err('hub_unavailable', 'The organization was created at Antasphere and will appear shortly'), 403);
|
|
292
|
+
}
|
|
293
|
+
workspaceId = local.id;
|
|
294
|
+
workspaceName = local.name;
|
|
295
|
+
// The look is a LOCAL fact of the projection (the hub reconcile writes
|
|
296
|
+
// the name and the status, never the look's columns).
|
|
297
|
+
await db
|
|
298
|
+
.update(workspaces)
|
|
299
|
+
.set({
|
|
300
|
+
lookTheme: look.theme,
|
|
301
|
+
lookPattern: look.pattern,
|
|
302
|
+
lookField: look.field,
|
|
303
|
+
lookGrain: look.grain
|
|
304
|
+
})
|
|
305
|
+
.where(eq(workspaces.id, workspaceId));
|
|
306
|
+
}
|
|
307
|
+
// Genesis row in the NEW workspace's own trail — and nowhere else.
|
|
308
|
+
await audit.write({
|
|
309
|
+
workspaceId,
|
|
310
|
+
principal: actor,
|
|
311
|
+
action: 'workspace.create',
|
|
312
|
+
resourceType: 'workspace',
|
|
313
|
+
resourceId: workspaceId,
|
|
314
|
+
requestId: c.get('requestId'),
|
|
315
|
+
ip: deps.clientIp(c),
|
|
316
|
+
metadata: { name: workspaceName }
|
|
317
|
+
});
|
|
318
|
+
registry.events.emit('workspace.created', { workspaceId, ownerUserId: userId });
|
|
319
|
+
return c.json({ workspace: { id: workspaceId, name: workspaceName, look } }, 201);
|
|
320
|
+
});
|
|
321
|
+
// ── PATCH /workspace: the active workspace's own settings ───────────────
|
|
322
|
+
// Owners and admins, from a browser session (unlisted in the machine scope
|
|
323
|
+
// allowlist like the create; re-checked here). The route names no id: the
|
|
324
|
+
// request's one workspace is the one edited (ADR 014). A guest never
|
|
325
|
+
// holds admin, so requireRole covers D2 too.
|
|
326
|
+
// PUT /me/default-workspace (PRDCT-2815): the person chooses the workspace
|
|
327
|
+
// a request naming none resolves to. `workspace_members.is_default` and
|
|
328
|
+
// the selection rule (identity/resolve-membership.ts) are shared by both
|
|
329
|
+
// editions; only the WRITER differs. On cloud the hub reconcile is the
|
|
330
|
+
// writer (it clears and sets the flag from the person's account at every
|
|
331
|
+
// pass, so a local write would be undone within minutes): the route
|
|
332
|
+
// refuses with the account site to set it on, whatever the workspace. On
|
|
333
|
+
// self-hosted this route is the writer.
|
|
334
|
+
//
|
|
335
|
+
// A setting of the PERSON: it reads `principal.userId` and never the
|
|
336
|
+
// request's workspace, is open to the person's keys and tokens under the
|
|
337
|
+
// write scope (the CLI sets it), and is refused to a key pinned to one
|
|
338
|
+
// workspace, which reaches that workspace alone and must not change where
|
|
339
|
+
// the person's other credentials land. It writes NO audit row: a
|
|
340
|
+
// workspace never learns what its members do elsewhere, and the row would
|
|
341
|
+
// land in the trail of the workspace the request happened to be in. The
|
|
342
|
+
// path is exempt from the generic audit middleware (audit/service.ts),
|
|
343
|
+
// and the change is on the server log.
|
|
344
|
+
api.use('/me/default-workspace', requireAuth());
|
|
345
|
+
api.openapi(defaultWorkspaceSetRoute, async (c) => {
|
|
346
|
+
const principal = c.get('principal');
|
|
347
|
+
if (cloud) {
|
|
348
|
+
return c.json({
|
|
349
|
+
error: {
|
|
350
|
+
code: 'hub_managed',
|
|
351
|
+
message: 'Your default workspace is a setting of your Antasphere account — choose it there',
|
|
352
|
+
details: { manageUrl: cloud.manageUrl }
|
|
353
|
+
}
|
|
354
|
+
}, 403);
|
|
355
|
+
}
|
|
356
|
+
if (principal.apiKeyId) {
|
|
357
|
+
const [key] = await db
|
|
358
|
+
.select({ pin: apiKeys.workspaceId })
|
|
359
|
+
.from(apiKeys)
|
|
360
|
+
.where(eq(apiKeys.id, principal.apiKeyId))
|
|
361
|
+
.limit(1);
|
|
362
|
+
if (!key || key.pin !== null) {
|
|
363
|
+
return c.json(err('key_pinned', 'This key is pinned to one workspace and cannot change your default workspace'), 403);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
const { workspaceId } = c.req.valid('json');
|
|
367
|
+
if (workspaceId !== null) {
|
|
368
|
+
// An ACTIVE membership of the caller, or nothing: a workspace that
|
|
369
|
+
// does not exist and one the caller does not belong to answer alike.
|
|
370
|
+
const [membership] = await db
|
|
371
|
+
.select({ id: workspaceMembers.id })
|
|
372
|
+
.from(workspaceMembers)
|
|
373
|
+
.where(and(eq(workspaceMembers.userId, principal.userId), eq(workspaceMembers.workspaceId, workspaceId), eq(workspaceMembers.isActive, true)))
|
|
374
|
+
.limit(1);
|
|
375
|
+
if (!membership)
|
|
376
|
+
return c.json(err('not_found', 'Workspace not found'), 404);
|
|
377
|
+
}
|
|
378
|
+
// Clear-then-set in ONE transaction: the partial unique index (user_id
|
|
379
|
+
// WHERE is_default) forbids two trues even transiently (the reconcile's
|
|
380
|
+
// own order). The set re-states the active membership, so a membership
|
|
381
|
+
// switched off between the check and the write is never made the default.
|
|
382
|
+
const chosen = await db.transaction(async (tx) => {
|
|
383
|
+
await tx
|
|
384
|
+
.update(workspaceMembers)
|
|
385
|
+
.set({ isDefault: false })
|
|
386
|
+
.where(and(eq(workspaceMembers.userId, principal.userId), eq(workspaceMembers.isDefault, true), ...(workspaceId !== null ? [ne(workspaceMembers.workspaceId, workspaceId)] : [])));
|
|
387
|
+
if (workspaceId === null)
|
|
388
|
+
return null;
|
|
389
|
+
const set = await tx
|
|
390
|
+
.update(workspaceMembers)
|
|
391
|
+
.set({ isDefault: true })
|
|
392
|
+
.where(and(eq(workspaceMembers.userId, principal.userId), eq(workspaceMembers.workspaceId, workspaceId), eq(workspaceMembers.isActive, true)))
|
|
393
|
+
.returning({ workspaceId: workspaceMembers.workspaceId });
|
|
394
|
+
return set[0]?.workspaceId ?? null;
|
|
395
|
+
});
|
|
396
|
+
if (workspaceId !== null && chosen === null) {
|
|
397
|
+
return c.json(err('not_found', 'Workspace not found'), 404);
|
|
398
|
+
}
|
|
399
|
+
logger.info({ userId: principal.userId, via: principal.via, defaultWorkspaceId: chosen }, 'default workspace changed by the person');
|
|
400
|
+
return c.json({ defaultWorkspaceId: chosen }, 200);
|
|
401
|
+
});
|
|
402
|
+
api.use('/workspace', requireRole('admin'));
|
|
403
|
+
api.openapi(workspaceUpdateRoute, async (c) => {
|
|
404
|
+
const principal = c.get('principal');
|
|
405
|
+
if (!principal)
|
|
406
|
+
return c.json(err('unauthenticated', 'Authentication required'), 401);
|
|
407
|
+
if (principal.via !== 'session') {
|
|
408
|
+
return c.json(err('session_required', 'Changing a workspace requires a browser session'), 403);
|
|
409
|
+
}
|
|
410
|
+
const body = c.req.valid('json');
|
|
411
|
+
const patch = {};
|
|
412
|
+
if (body.name !== undefined) {
|
|
413
|
+
const name = body.name.trim();
|
|
414
|
+
if (!name)
|
|
415
|
+
return c.json(err('validation_error', 'The workspace needs a name'), 400);
|
|
416
|
+
// P7: a hub-origin workspace's name is the hub's — renamed there, and
|
|
417
|
+
// the next reconcile pass would overwrite a local rename anyway.
|
|
418
|
+
if (principal.accountRef) {
|
|
419
|
+
return c.json({
|
|
420
|
+
error: {
|
|
421
|
+
code: 'hub_managed',
|
|
422
|
+
message: 'This workspace is an Antasphere organization — rename it at Antasphere',
|
|
423
|
+
details: { manageUrl: cloud?.manageUrl ?? null }
|
|
424
|
+
}
|
|
425
|
+
}, 403);
|
|
426
|
+
}
|
|
427
|
+
patch.name = name;
|
|
428
|
+
}
|
|
429
|
+
if (body.look?.theme !== undefined)
|
|
430
|
+
patch.lookTheme = body.look.theme;
|
|
431
|
+
if (body.look?.pattern !== undefined)
|
|
432
|
+
patch.lookPattern = body.look.pattern;
|
|
433
|
+
if (body.look?.field !== undefined)
|
|
434
|
+
patch.lookField = body.look.field;
|
|
435
|
+
if (body.look?.grain !== undefined)
|
|
436
|
+
patch.lookGrain = body.look.grain;
|
|
437
|
+
const [row] = await db
|
|
438
|
+
.update(workspaces)
|
|
439
|
+
.set(patch)
|
|
440
|
+
.where(eq(workspaces.id, principal.workspaceId))
|
|
441
|
+
.returning({
|
|
442
|
+
id: workspaces.id,
|
|
443
|
+
name: workspaces.name,
|
|
444
|
+
lookTheme: workspaces.lookTheme,
|
|
445
|
+
lookPattern: workspaces.lookPattern,
|
|
446
|
+
lookField: workspaces.lookField,
|
|
447
|
+
lookGrain: workspaces.lookGrain
|
|
448
|
+
});
|
|
449
|
+
// The principal's workspace exists by construction (a live join built
|
|
450
|
+
// it); a missing row here is a race with a deletion, refused like a gate.
|
|
451
|
+
if (!row)
|
|
452
|
+
return c.json(err('forbidden', 'Workspace not found'), 403);
|
|
453
|
+
return c.json({
|
|
454
|
+
workspace: {
|
|
455
|
+
id: row.id,
|
|
456
|
+
name: row.name,
|
|
457
|
+
look: { theme: row.lookTheme, pattern: row.lookPattern, field: row.lookField, grain: row.lookGrain }
|
|
458
|
+
}
|
|
459
|
+
}, 200);
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/api/workspaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/apikeys/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/apikeys/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned API-key peppers — the seam that lets API keys survive an
|
|
3
|
+
* AUTH_SECRET rotation (ADR 008).
|
|
4
|
+
*
|
|
5
|
+
* Version 1 is ALWAYS the pepper that hashed keys before versioning existed:
|
|
6
|
+
* the resolved auth secret, used verbatim as `sha256(secret + pepper)`. With
|
|
7
|
+
* no `API_KEY_PEPPERS` set the registry is exactly `{ 1: authSecret }` and
|
|
8
|
+
* new keys mint at version 1 — byte-identical to the pre-versioning
|
|
9
|
+
* behaviour, nothing to migrate.
|
|
10
|
+
*
|
|
11
|
+
* `API_KEY_PEPPERS` supplies additional versions as `<version>:<secret>`
|
|
12
|
+
* entries joined by `;` (e.g. `1:<old secret>;2:<new pepper>`). Entries
|
|
13
|
+
* override the defaults, so pinning `1:<value>` freezes version 1
|
|
14
|
+
* independently of the live AUTH_SECRET — the first step of the rotation
|
|
15
|
+
* runbook in internal/security-runbooks.md. LOUD RULE: whenever version 1 is pinned, its
|
|
16
|
+
* value MUST be the historical AUTH_SECRET-derived pepper (the secret that
|
|
17
|
+
* was live when the version-1 keys were minted), or every existing key stops
|
|
18
|
+
* resolving. New keys always mint under the HIGHEST version in the registry.
|
|
19
|
+
*
|
|
20
|
+
* Resolution looks up the pepper by the key row's stored `pepper_version`
|
|
21
|
+
* and FAILS CLOSED on a version the registry does not contain — same 401 as
|
|
22
|
+
* a revoked key, never a fallback to another pepper.
|
|
23
|
+
*/
|
|
24
|
+
/** `pepper_version` is a Postgres smallint. */
|
|
25
|
+
export declare const MAX_PEPPER_VERSION = 32767;
|
|
26
|
+
export interface PepperRegistry {
|
|
27
|
+
/** The version new keys are minted under — the highest defined. */
|
|
28
|
+
readonly current: number;
|
|
29
|
+
/** True when API_KEY_PEPPERS explicitly pins version 1 (rotation-safe). */
|
|
30
|
+
readonly v1Pinned: boolean;
|
|
31
|
+
/** The pepper for a stored version, or undefined — the caller MUST fail closed. */
|
|
32
|
+
get(version: number): string | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Every registered version, ascending. For credentials that carry no
|
|
35
|
+
* version indicator (share-token secrets, whose sha256 IS the DB lookup
|
|
36
|
+
* key), resolution computes the candidate hash under EACH version — the
|
|
37
|
+
* registry has one entry per rotation, so this stays O(rotations).
|
|
38
|
+
*/
|
|
39
|
+
readonly versions: readonly number[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse the `API_KEY_PEPPERS` value into a version→secret map. Throws a
|
|
43
|
+
* readable Error on any malformed entry — surfaced by the env schema, so a
|
|
44
|
+
* bad value refuses boot instead of silently mis-hashing keys.
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseApiKeyPeppers(raw: string): Map<number, string>;
|
|
47
|
+
/**
|
|
48
|
+
* Build the registry from the resolved auth secret plus the optional
|
|
49
|
+
* `API_KEY_PEPPERS` value (already format-validated by the env schema; this
|
|
50
|
+
* re-parses so direct callers get the same guarantees).
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildPepperRegistry(authSecret: string, apiKeyPeppers?: string): PepperRegistry;
|
|
53
|
+
//# sourceMappingURL=peppers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peppers.d.ts","sourceRoot":"","sources":["../../src/apikeys/peppers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,+CAA+C;AAC/C,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAKxC,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,mFAAmF;IACnF,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCnE;AAQD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,cAAc,CAe9F"}
|