@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,12 @@
|
|
|
1
|
+
import type { defineChassisRoutes } from '@antasphere/chassis-contract/routes';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The generic routes that carry something of the TOOL: its scope vocabulary
|
|
5
|
+
* (`/me`, the API-key family, the two CLI key mints) or its own words in the
|
|
6
|
+
* OpenAPI text (the export route, the file delete route). The tool
|
|
7
|
+
* instantiates them once (`defineChassisRoutes(contract, identity, copy)`) and
|
|
8
|
+
* hands the SAME objects to the routers below, so the OpenAPI document is
|
|
9
|
+
* built from one definition.
|
|
10
|
+
* The chassis reads a scope as a plain string.
|
|
11
|
+
*/
|
|
12
|
+
export type ScopeRoutes = ReturnType<typeof defineChassisRoutes<string>>;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import { and, eq, lt, sql } from 'drizzle-orm';
|
|
3
|
+
import type { ScopeRoutes } from './scope-routes.js';
|
|
4
|
+
import { apiKeys as apiKeysTable, ssoConnectJtis, workspaceMembers, type Db } from '@antasphere/chassis-db';
|
|
5
|
+
import type { Auth } from '../identity/better-auth.js';
|
|
6
|
+
import { HubSsoLoginError, type HubConnectAssertion, type HubSsoService } from '../identity/hub-sso.js';
|
|
7
|
+
import type { HubGrantService } from '../identity/hub-grant.js';
|
|
8
|
+
import type { ApiKeyService } from '../apikeys/service.js';
|
|
9
|
+
import type { AuditService } from '../audit/service.js';
|
|
10
|
+
import type { Logger } from '../logger.js';
|
|
11
|
+
|
|
12
|
+
const err = (code: string, message: string) => ({ error: { code, message } });
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* CLI cross-tool connect (cloud edition ONLY — internal/federation.md P5):
|
|
16
|
+
*
|
|
17
|
+
* POST /sso/cli-connect → verify a hub-minted 120 s exchange JWT (the H3
|
|
18
|
+
* counterpart), JIT-provision exactly like an SSO login, store the H3
|
|
19
|
+
* offline grant, reconcile fail-closed, mint a USER-scoped API key
|
|
20
|
+
*
|
|
21
|
+
* PUBLIC path (the hub JWT IS the credential — the invitation-lookup /
|
|
22
|
+
* cli-auth tier-2 pattern), rate-limited on the login wall (api/index.ts),
|
|
23
|
+
* and registered by api/index.ts ONLY when the instance boots EDITION=cloud
|
|
24
|
+
* — an oss boot never mounts this module, so the path answers the JSON 404
|
|
25
|
+
* terminator there (zero hub surface, matching every other cloud seam).
|
|
26
|
+
*
|
|
27
|
+
* Because the endpoint is public, verification discipline is the whole
|
|
28
|
+
* game (a replayable exchange token mints N keys):
|
|
29
|
+
*
|
|
30
|
+
* - the token passes `HubSsoService.verifyConnectToken` — hub-JWKS
|
|
31
|
+
* signature, iss pinned to the hub, aud pinned to OUR resource URL,
|
|
32
|
+
* RS256 only, expiry, `purpose: 'sso-connect'` required, `jti` required;
|
|
33
|
+
* its TRANSITIONAL org claims are never read (org truth = reconcile);
|
|
34
|
+
* - the `jti` is consumed ONE-TIME-USE via an INSERT into the Postgres
|
|
35
|
+
* `sso_connect_jtis` ledger — the primary-key conflict IS the replay
|
|
36
|
+
* signal, multi-replica safe by construction (finding G8). Claim-first
|
|
37
|
+
* discipline: the jti is burned BEFORE provisioning, so two concurrent
|
|
38
|
+
* presentations of one token can never both reach the mint (a
|
|
39
|
+
* transient provisioning failure costs the caller one fresh hub
|
|
40
|
+
* exchange — cheap, and the safe side of the race);
|
|
41
|
+
* - every verification failure (signature, iss, aud, purpose, expiry,
|
|
42
|
+
* replay) answers ONE uniform 401 — no oracle for probing tokens.
|
|
43
|
+
*
|
|
44
|
+
* On success the user is provisioned through the SAME HubSsoService path as
|
|
45
|
+
* a browser SSO login (JIT user via the internal adapter — the user.created
|
|
46
|
+
* hook and collaborator sweep fire — plus D9 trusted link, D10 email sync),
|
|
47
|
+
* the request's `hubRefreshToken` (the raw H3 offline grant) is stored
|
|
48
|
+
* encrypted on the account row (`acquireFromConnect` — the same row a
|
|
49
|
+
* browser login writes), and the SAME fail-closed reconcile as a browser
|
|
50
|
+
* login projects the user's orgs as-the-user. Only a definitive 'ok' pass
|
|
51
|
+
* mints: the key is an ordinary USER-scoped API key (workspaceId null —
|
|
52
|
+
* the org is a per-request parameter, like every credential), scopes
|
|
53
|
+
* the tool's read + write — NEVER its export scope (the
|
|
54
|
+
* CLI_KEY_SCOPES grant, same as /cli/auth/complete), named "Antasphere CLI
|
|
55
|
+
* <date>", audited, returned once. A connect that can prove NO usable grant
|
|
56
|
+
* (none carried, none stored, or the carried one is dead) refuses with
|
|
57
|
+
* explicit steering instead of minting a born-dead key.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
export interface SsoConnectRouteDeps {
|
|
61
|
+
db: Db;
|
|
62
|
+
auth: Auth;
|
|
63
|
+
hubSso: HubSsoService;
|
|
64
|
+
/** The per-user hub grant store — the H3 `hubRefreshToken` lands here. */
|
|
65
|
+
grant: HubGrantService;
|
|
66
|
+
apiKeys: ApiKeyService;
|
|
67
|
+
audit: AuditService;
|
|
68
|
+
logger: Logger;
|
|
69
|
+
/** The CLI key's fixed grant — the same list /cli/auth/complete mints with. */
|
|
70
|
+
cliKeyScopes: readonly string[];
|
|
71
|
+
/** The tool's instantiation of the scope-carrying connect route. */
|
|
72
|
+
routes: Pick<ScopeRoutes, 'ssoCliConnectRoute'>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const GRANT_MISSING_MESSAGE =
|
|
76
|
+
'This exchange carried no usable hub grant for this instance — run `antasphere login` again with a ' +
|
|
77
|
+
'current CLI (the hub issues a grant with every exchange), or sign in to this instance once in a browser ' +
|
|
78
|
+
'with Antasphere.';
|
|
79
|
+
|
|
80
|
+
export function registerSsoConnectRoutes(api: OpenAPIHono, deps: SsoConnectRouteDeps): void {
|
|
81
|
+
const { db, auth, hubSso, grant, apiKeys, audit, logger, cliKeyScopes } = deps;
|
|
82
|
+
const { ssoCliConnectRoute } = deps.routes;
|
|
83
|
+
|
|
84
|
+
api.openapi(ssoCliConnectRoute, async (c) => {
|
|
85
|
+
const body = c.req.valid('json');
|
|
86
|
+
|
|
87
|
+
// 1. Verify hard. One uniform 401 for every rejection reason.
|
|
88
|
+
let assertion: HubConnectAssertion;
|
|
89
|
+
try {
|
|
90
|
+
assertion = await hubSso.verifyConnectToken(body.token);
|
|
91
|
+
} catch (cause) {
|
|
92
|
+
logger.warn({ err: cause }, 'sso cli-connect: exchange token rejected');
|
|
93
|
+
return c.json(err('invalid_token', 'The exchange token is invalid, expired, or already used'), 401);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// 2. Burn the jti (one-time-use, G8). Insert-first: the claim precedes
|
|
97
|
+
// any effect, so a replay — even a concurrent one — mints nothing. The
|
|
98
|
+
// sweep keeps the ledger tiny; best-effort, never correctness-bearing
|
|
99
|
+
// (expired rows only shadow jtis of already-expired tokens).
|
|
100
|
+
void db
|
|
101
|
+
.delete(ssoConnectJtis)
|
|
102
|
+
.where(lt(ssoConnectJtis.expiresAt, sql`now() - interval '1 minute'`))
|
|
103
|
+
.catch(() => {});
|
|
104
|
+
const claimed = await db
|
|
105
|
+
.insert(ssoConnectJtis)
|
|
106
|
+
.values({ jti: assertion.jti, expiresAt: assertion.expiresAt })
|
|
107
|
+
.onConflictDoNothing()
|
|
108
|
+
.returning({ jti: ssoConnectJtis.jti });
|
|
109
|
+
if (claimed.length === 0) {
|
|
110
|
+
logger.warn({ jti: assertion.jti }, 'sso cli-connect: replayed jti rejected');
|
|
111
|
+
return c.json(err('invalid_token', 'The exchange token is invalid, expired, or already used'), 401);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// 3. JIT-provision through the SSO path (identical rows; no projection
|
|
115
|
+
// here — the reconcile below IS the projection).
|
|
116
|
+
let provisioned: Awaited<ReturnType<HubSsoService['provisionConnect']>>;
|
|
117
|
+
try {
|
|
118
|
+
provisioned = await hubSso.provisionConnect(auth, assertion);
|
|
119
|
+
} catch (cause) {
|
|
120
|
+
if (cause instanceof HubSsoLoginError) {
|
|
121
|
+
logger.warn({ err: cause, code: cause.code }, 'sso cli-connect: provisioning refused');
|
|
122
|
+
return c.json(err(cause.code, 'Could not provision this account on the instance'), 403);
|
|
123
|
+
}
|
|
124
|
+
logger.error({ err: cause }, 'sso cli-connect: provisioning failed');
|
|
125
|
+
return c.json(err('internal', 'Connect failed — try again'), 500);
|
|
126
|
+
}
|
|
127
|
+
const { user } = provisioned;
|
|
128
|
+
|
|
129
|
+
// 4. The grant channel: store the H3 offline grant the request carried
|
|
130
|
+
// (newest mint wins — the replaced family idles to expiry at the hub).
|
|
131
|
+
// Without one, an already-stored grant (an earlier browser login or
|
|
132
|
+
// connect) carries the day; with NEITHER, refuse with steering — a key
|
|
133
|
+
// whose every org read would answer hub_grant_expired must not exist.
|
|
134
|
+
if (body.hubRefreshToken) {
|
|
135
|
+
try {
|
|
136
|
+
await grant.acquireFromConnect(user.id, body.hubRefreshToken);
|
|
137
|
+
} catch (cause) {
|
|
138
|
+
logger.error({ err: cause }, 'sso cli-connect: storing the hub grant failed');
|
|
139
|
+
return c.json(err('internal', 'Connect failed — try again'), 500);
|
|
140
|
+
}
|
|
141
|
+
} else if (!(await grant.hasStoredGrant(user.id))) {
|
|
142
|
+
logger.warn({ userId: user.id }, 'sso cli-connect: no grant carried and none stored — refusing');
|
|
143
|
+
return c.json(err('hub_grant_missing', GRANT_MISSING_MESSAGE), 403);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// 5. The fail-closed projection pass — the browser login's assertLogin
|
|
147
|
+
// step 3, on the connect path: one forced reconcile AS THE USER with
|
|
148
|
+
// the grant stored above. This is also what validates the presented
|
|
149
|
+
// hubRefreshToken end-to-end (redeemed at the hub under OUR client
|
|
150
|
+
// credentials); anything but a definitive 'ok' mints nothing.
|
|
151
|
+
let outcome: Awaited<ReturnType<HubSsoService['reconcileConnect']>>;
|
|
152
|
+
try {
|
|
153
|
+
outcome = await hubSso.reconcileConnect(user.id);
|
|
154
|
+
} catch (cause) {
|
|
155
|
+
logger.error({ err: cause }, 'sso cli-connect: reconcile pass threw');
|
|
156
|
+
return c.json(err('internal', 'Connect failed — try again'), 500);
|
|
157
|
+
}
|
|
158
|
+
if (outcome === 'grant_dead' || outcome === 'no_link') {
|
|
159
|
+
// The carried/stored grant is definitively unusable (revoked,
|
|
160
|
+
// expired, reuse-torn-down, or — no_link, unreachable after step 3 —
|
|
161
|
+
// the link itself vanished). Same steering as carrying none.
|
|
162
|
+
logger.warn({ userId: user.id, outcome }, 'sso cli-connect: grant unusable — refusing the mint');
|
|
163
|
+
return c.json(err('hub_grant_missing', GRANT_MISSING_MESSAGE), 403);
|
|
164
|
+
}
|
|
165
|
+
if (outcome !== 'ok') {
|
|
166
|
+
// Transient (hub unreachable / 5xx): nothing destroyed; the caller
|
|
167
|
+
// re-exchanges. Never mint on a pass that proved nothing.
|
|
168
|
+
logger.warn({ userId: user.id, outcome }, 'sso cli-connect: reconcile inconclusive — try again');
|
|
169
|
+
return c.json(err('internal', 'Connect failed — try again'), 500);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// 5b. The reconciled truth must leave the key USABLE: a user-scoped key
|
|
173
|
+
// resolves through the holder's active memberships, so zero of them
|
|
174
|
+
// (e.g. the hub answered only unknown-role entries — D11 derives roles,
|
|
175
|
+
// never maps them) would mint a born-dead key. Refuse instead; the
|
|
176
|
+
// hub-side H3 gate makes this unreachable in the healthy contract.
|
|
177
|
+
const hasActive = await db
|
|
178
|
+
.select({ id: workspaceMembers.id })
|
|
179
|
+
.from(workspaceMembers)
|
|
180
|
+
.where(and(eq(workspaceMembers.userId, user.id), eq(workspaceMembers.isActive, true)))
|
|
181
|
+
.limit(1);
|
|
182
|
+
if (hasActive.length === 0) {
|
|
183
|
+
logger.warn({ userId: user.id }, 'sso cli-connect: reconcile left no usable membership — refusing');
|
|
184
|
+
return c.json(
|
|
185
|
+
err('no_membership', 'Your Antasphere account has no organization usable on this instance'),
|
|
186
|
+
403
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// 6. Mint the ordinary local key — USER-scoped (no workspace pin): the
|
|
191
|
+
// org is a per-request parameter authorized against the caller's live
|
|
192
|
+
// memberships, exactly like every other credential.
|
|
193
|
+
const name = `Antasphere CLI ${new Date().toISOString().slice(0, 10)}`;
|
|
194
|
+
const minted = await apiKeys.mint({
|
|
195
|
+
workspaceId: null,
|
|
196
|
+
createdBy: user.id,
|
|
197
|
+
name,
|
|
198
|
+
scopes: [...cliKeyScopes],
|
|
199
|
+
expiresAt: null
|
|
200
|
+
});
|
|
201
|
+
const [row] = await db.select().from(apiKeysTable).where(eq(apiKeysTable.id, minted.id)).limit(1);
|
|
202
|
+
if (!row) {
|
|
203
|
+
return c.json(err('internal', 'Key mint failed — try again'), 500);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Principal-less public route: the audit middleware cannot attribute it —
|
|
207
|
+
// write the row directly, exactly like /cli/auth/complete does. The key
|
|
208
|
+
// is a USER credential, so the row is INSTANCE-attributed (ADR 014).
|
|
209
|
+
await audit.write({
|
|
210
|
+
workspaceId: null,
|
|
211
|
+
principal: { userId: user.id, via: 'session' },
|
|
212
|
+
action: 'apikey.create',
|
|
213
|
+
resourceType: 'api_key',
|
|
214
|
+
resourceId: minted.id,
|
|
215
|
+
requestId: c.get('requestId'),
|
|
216
|
+
metadata: {
|
|
217
|
+
name,
|
|
218
|
+
scopes: [...cliKeyScopes],
|
|
219
|
+
via: 'sso_cli_connect',
|
|
220
|
+
hubSub: assertion.sub,
|
|
221
|
+
grantChannel: body.hubRefreshToken ? 'h3_exchange' : 'stored'
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
return c.json(
|
|
226
|
+
{
|
|
227
|
+
key: minted.key,
|
|
228
|
+
apiKey: {
|
|
229
|
+
id: row.id,
|
|
230
|
+
name: row.name,
|
|
231
|
+
keyId: row.keyId,
|
|
232
|
+
scopes: row.scopes as string[],
|
|
233
|
+
workspaceId: row.workspaceId,
|
|
234
|
+
createdBy: row.createdBy,
|
|
235
|
+
createdAt: row.createdAt.toISOString(),
|
|
236
|
+
lastUsedAt: row.lastUsedAt?.toISOString() ?? null,
|
|
237
|
+
revokedAt: row.revokedAt?.toISOString() ?? null,
|
|
238
|
+
expiresAt: row.expiresAt?.toISOString() ?? null
|
|
239
|
+
},
|
|
240
|
+
user,
|
|
241
|
+
workspaceId: null
|
|
242
|
+
},
|
|
243
|
+
201
|
|
244
|
+
);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import { ssoLogoutRoute } from '@antasphere/chassis-contract/routes';
|
|
3
|
+
import type { Auth } from '../identity/better-auth.js';
|
|
4
|
+
import { hintCookieClearHeader, type HubLogoutService } from '../identity/hub-logout.js';
|
|
5
|
+
import type { Logger } from '../logger.js';
|
|
6
|
+
|
|
7
|
+
const err = (code: string, message: string) => ({ error: { code, message } });
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* POST /sso/logout — the single-logout server leg (SL-2, cloud edition
|
|
11
|
+
* ONLY; api/index.ts registers this module iff the instance boots
|
|
12
|
+
* EDITION=cloud, so oss answers the JSON 404 terminator: zero hub surface).
|
|
13
|
+
*
|
|
14
|
+
* Reachability, fail-closed on every side:
|
|
15
|
+
* - MACHINES NEVER GET HERE: the path is deliberately UNLISTED in the
|
|
16
|
+
* fail-closed scope allowlist (middleware/scopes.ts), so authContext
|
|
17
|
+
* 403s every API key and OAuth bearer before this handler runs. Never
|
|
18
|
+
* list it — a credential must not be able to end its user's sessions.
|
|
19
|
+
* - SESSIONS resolve ROUTE-LOCALLY via auth.api.getSession (the /me
|
|
20
|
+
* zero-state pattern): a live session whose user holds no active
|
|
21
|
+
* membership — the cloud operator pre-break-glass, a hub user whose
|
|
22
|
+
* last org was removed — resolves to a null principal upstream but must
|
|
23
|
+
* still be able to log out.
|
|
24
|
+
* - ANONYMOUS callers 401.
|
|
25
|
+
*
|
|
26
|
+
* Handler order (the plan's pinned sequence): resolve session → build the
|
|
27
|
+
* hub end-session URL (ANY failure → null, never an error) → revoke the
|
|
28
|
+
* local session server-side, forwarding better-auth's cookie-clearing
|
|
29
|
+
* Set-Cookie → clear the shared hint cookie → respond {url}. The local
|
|
30
|
+
* revoke + hint clear run even when url is null — a hub outage degrades the
|
|
31
|
+
* logout to local-only, it never blocks it.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
export interface SsoLogoutRouteDeps {
|
|
35
|
+
auth: Auth;
|
|
36
|
+
logout: HubLogoutService;
|
|
37
|
+
/** The shared hint cookie's clearing attributes (cross-repo contract). */
|
|
38
|
+
hint: { name: string; domain: string; secure: boolean };
|
|
39
|
+
logger: Logger;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function registerSsoLogoutRoutes(api: OpenAPIHono, deps: SsoLogoutRouteDeps): void {
|
|
43
|
+
const { auth, logout, hint, logger } = deps;
|
|
44
|
+
|
|
45
|
+
api.openapi(ssoLogoutRoute, async (c) => {
|
|
46
|
+
const session = await auth.api.getSession({ headers: c.req.raw.headers });
|
|
47
|
+
if (!session?.user) {
|
|
48
|
+
return c.json(err('unauthenticated', 'Authentication required'), 401);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 1. Build the hub leg FIRST (it reads the account row the revoke does
|
|
52
|
+
// not touch; null on any failure — the steps below never depend on it).
|
|
53
|
+
const url = await logout.endSessionUrl(session.user.id);
|
|
54
|
+
|
|
55
|
+
// 2. Revoke the local session server-side. better-auth's /sign-out
|
|
56
|
+
// deletes the session row and emits the cookie-clearing Set-Cookie —
|
|
57
|
+
// forward it so the browser drops the cookie in the same response.
|
|
58
|
+
// Its handler already swallows a failed row delete (cookie still
|
|
59
|
+
// cleared), so this throws only on wiring-level failures.
|
|
60
|
+
const signedOut = await auth.api.signOut({
|
|
61
|
+
headers: c.req.raw.headers,
|
|
62
|
+
returnHeaders: true
|
|
63
|
+
});
|
|
64
|
+
for (const value of signedOut.headers.getSetCookie()) {
|
|
65
|
+
c.header('set-cookie', value, { append: true });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 3. Clear the shared hint cookie (Domain-scoped to the parent, exactly
|
|
69
|
+
// as the hub set it) — logout anywhere must stop every tool's silent
|
|
70
|
+
// auto-connect until the next hub login re-asserts it.
|
|
71
|
+
c.header('set-cookie', hintCookieClearHeader(hint), { append: true });
|
|
72
|
+
|
|
73
|
+
logger.info({ userId: session.user.id, hubLeg: url !== null }, 'sso logout: local session revoked');
|
|
74
|
+
return c.json({ url }, 200);
|
|
75
|
+
});
|
|
76
|
+
}
|