@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,414 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
2
|
+
import type { StartedPostgreSqlContainer } from '@testcontainers/postgresql';
|
|
3
|
+
import { and, eq } from 'drizzle-orm';
|
|
4
|
+
import { workspaceMembers } from '@antasphere/chassis-db';
|
|
5
|
+
import {
|
|
6
|
+
createDatabase,
|
|
7
|
+
createTestApp,
|
|
8
|
+
extractCookie,
|
|
9
|
+
readJson,
|
|
10
|
+
startPostgres,
|
|
11
|
+
type TestApp,
|
|
12
|
+
host
|
|
13
|
+
} from './helpers.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The person's default workspace on self-hosted (PRDCT-2815):
|
|
17
|
+
* `PUT /me/default-workspace`. Pinned: the set and the clear (exactly one
|
|
18
|
+
* `is_default` row of the caller, or none), the selection rule that follows
|
|
19
|
+
* (`GET /me` naming no workspace resolves to the chosen one, then to the
|
|
20
|
+
* oldest again after a clear), the three 404s that answer alike and write
|
|
21
|
+
* nothing, the 400s, the 401, that only the caller's own rows move, that the
|
|
22
|
+
* body wins over the request's workspace header, a guest-origin membership,
|
|
23
|
+
* the machines (write scope, read scope, pinned key, unlisted methods), no
|
|
24
|
+
* audit row, and a removed membership that can no longer be the default.
|
|
25
|
+
*/
|
|
26
|
+
const PASSWORD = 'a-long-default-password-1';
|
|
27
|
+
const OWNER = { email: 'owner@default.test', name: 'Olive Owner', password: PASSWORD };
|
|
28
|
+
const UNKNOWN_WS = '0f0f0f0f-1111-4222-8333-444455556666';
|
|
29
|
+
|
|
30
|
+
type Actor = { email: string; cookie: string; userId: string; memberId: string };
|
|
31
|
+
|
|
32
|
+
let container: StartedPostgreSqlContainer;
|
|
33
|
+
let app: TestApp;
|
|
34
|
+
let firstId = '';
|
|
35
|
+
let secondId = '';
|
|
36
|
+
const actors: Record<string, Actor> = {};
|
|
37
|
+
|
|
38
|
+
let ipCounter = 0;
|
|
39
|
+
const nextIp = () => `10.82.${Math.floor(ipCounter / 250)}.${(ipCounter++ % 250) + 1}`;
|
|
40
|
+
|
|
41
|
+
const send = (
|
|
42
|
+
method: string,
|
|
43
|
+
path: string,
|
|
44
|
+
who: { cookie?: string; key?: string },
|
|
45
|
+
body?: unknown,
|
|
46
|
+
headers: Record<string, string> = {}
|
|
47
|
+
) =>
|
|
48
|
+
app.app.request(`/api/v1${path}`, {
|
|
49
|
+
method,
|
|
50
|
+
headers: {
|
|
51
|
+
'x-forwarded-for': nextIp(),
|
|
52
|
+
...(who.cookie ? { cookie: who.cookie } : {}),
|
|
53
|
+
...(who.key ? { authorization: `Bearer ${who.key}` } : {}),
|
|
54
|
+
...(body !== undefined ? { 'content-type': 'application/json' } : {}),
|
|
55
|
+
...headers
|
|
56
|
+
},
|
|
57
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {})
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
async function expectError(res: Response, status: number, code: string): Promise<void> {
|
|
61
|
+
const body = await readJson(res);
|
|
62
|
+
expect({ status: res.status, code: body?.error?.code }).toEqual({ status, code });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function signIn(email: string): Promise<string> {
|
|
66
|
+
const res = await send('POST', '/auth/sign-in/email', {}, { email, password: PASSWORD });
|
|
67
|
+
expect(res.status).toBe(200);
|
|
68
|
+
return extractCookie(res);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function addActor(
|
|
72
|
+
name: string,
|
|
73
|
+
opts: { role?: 'owner' | 'admin' | 'member'; origin?: 'local' | 'guest'; workspace?: string } = {}
|
|
74
|
+
): Promise<Actor> {
|
|
75
|
+
const email = `${name}@default.test`;
|
|
76
|
+
const created = await app.auth.api.signUpEmail({ body: { email, password: PASSWORD, name } });
|
|
77
|
+
const [row] = await app.db.db
|
|
78
|
+
.insert(workspaceMembers)
|
|
79
|
+
.values({
|
|
80
|
+
workspaceId: opts.workspace ?? firstId,
|
|
81
|
+
userId: created.user.id,
|
|
82
|
+
role: opts.role ?? 'member',
|
|
83
|
+
origin: opts.origin ?? 'local'
|
|
84
|
+
})
|
|
85
|
+
.returning({ id: workspaceMembers.id });
|
|
86
|
+
const actor = { email, cookie: await signIn(email), userId: created.user.id, memberId: row!.id };
|
|
87
|
+
actors[name] = actor;
|
|
88
|
+
return actor;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function mintKey(cookie: string, scopes: string[], workspaceId?: string): Promise<string> {
|
|
92
|
+
const res = await send(
|
|
93
|
+
'POST',
|
|
94
|
+
'/api-keys',
|
|
95
|
+
{ cookie },
|
|
96
|
+
{
|
|
97
|
+
name: `key-${scopes.join('-')}${workspaceId ? '-pinned' : ''}`,
|
|
98
|
+
scopes,
|
|
99
|
+
...(workspaceId ? { workspaceId } : {})
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
expect(res.status).toBe(201);
|
|
103
|
+
return (await readJson(res)).key;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const setDefault = (
|
|
107
|
+
who: { cookie?: string; key?: string },
|
|
108
|
+
workspaceId: string | null,
|
|
109
|
+
headers?: Record<string, string>
|
|
110
|
+
) => send('PUT', '/me/default-workspace', who, { workspaceId }, headers);
|
|
111
|
+
|
|
112
|
+
/** The workspace ids of the user's rows with is_default = true. */
|
|
113
|
+
const defaultsOf = async (userId: string): Promise<string[]> =>
|
|
114
|
+
(
|
|
115
|
+
await app.db.db
|
|
116
|
+
.select({ workspaceId: workspaceMembers.workspaceId })
|
|
117
|
+
.from(workspaceMembers)
|
|
118
|
+
.where(and(eq(workspaceMembers.userId, userId), eq(workspaceMembers.isDefault, true)))
|
|
119
|
+
).map((r) => r.workspaceId);
|
|
120
|
+
|
|
121
|
+
/** `GET /me` naming no workspace: the server's selection rule answers. */
|
|
122
|
+
async function meNamingNone(who: { cookie?: string; key?: string }): Promise<{
|
|
123
|
+
activeWorkspaceId: string;
|
|
124
|
+
workspaces: Array<{ id: string; default: boolean }>;
|
|
125
|
+
}> {
|
|
126
|
+
const res = await send('GET', '/me', who);
|
|
127
|
+
expect(res.status).toBe(200);
|
|
128
|
+
return readJson(res);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const defaultEntries = (me: { workspaces: Array<{ id: string; default: boolean }> }) =>
|
|
132
|
+
me.workspaces.filter((w) => w.default).map((w) => w.id);
|
|
133
|
+
|
|
134
|
+
beforeAll(async () => {
|
|
135
|
+
container = await startPostgres();
|
|
136
|
+
app = await createTestApp(await createDatabase(container, 'default_workspace'));
|
|
137
|
+
const setup = await send(
|
|
138
|
+
'POST',
|
|
139
|
+
'/setup',
|
|
140
|
+
{},
|
|
141
|
+
{ setupToken: 'integration-test-setup-token', instanceName: 'Default', owner: OWNER }
|
|
142
|
+
);
|
|
143
|
+
expect(setup.status).toBe(201);
|
|
144
|
+
firstId = (await readJson(setup)).workspaceId;
|
|
145
|
+
const ownerCookie = await signIn(OWNER.email);
|
|
146
|
+
const me = await readJson(await send('GET', '/me', { cookie: ownerCookie }));
|
|
147
|
+
const [ownerRow] = await app.db.db
|
|
148
|
+
.select({ id: workspaceMembers.id })
|
|
149
|
+
.from(workspaceMembers)
|
|
150
|
+
.where(and(eq(workspaceMembers.workspaceId, firstId), eq(workspaceMembers.userId, me.user.id)));
|
|
151
|
+
actors.owner = { email: OWNER.email, cookie: ownerCookie, userId: me.user.id, memberId: ownerRow!.id };
|
|
152
|
+
secondId = (await app.registry.workspaces.create('Second', me.user.id)).workspaceId;
|
|
153
|
+
}, 180_000);
|
|
154
|
+
|
|
155
|
+
afterAll(async () => {
|
|
156
|
+
await app?.stop();
|
|
157
|
+
await container?.stop();
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe('a person in two workspaces chooses, changes and clears their default', () => {
|
|
161
|
+
it('before any choice the first answers; after the set the second answers', async () => {
|
|
162
|
+
const owner = actors.owner!;
|
|
163
|
+
const before = await meNamingNone(owner);
|
|
164
|
+
expect(before.activeWorkspaceId).toBe(firstId);
|
|
165
|
+
expect(before.workspaces.map((w) => w.id).sort()).toEqual([firstId, secondId].sort());
|
|
166
|
+
expect(defaultEntries(before)).toEqual([]);
|
|
167
|
+
|
|
168
|
+
const res = await setDefault(owner, secondId);
|
|
169
|
+
expect(res.status).toBe(200);
|
|
170
|
+
expect(await readJson(res)).toEqual({ defaultWorkspaceId: secondId });
|
|
171
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
172
|
+
|
|
173
|
+
const after = await meNamingNone(owner);
|
|
174
|
+
expect(after.activeWorkspaceId).toBe(secondId);
|
|
175
|
+
expect(defaultEntries(after)).toEqual([secondId]);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('changing it back and forth never leaves two true rows', async () => {
|
|
179
|
+
const owner = actors.owner!;
|
|
180
|
+
const res = await setDefault(owner, firstId);
|
|
181
|
+
expect(res.status).toBe(200);
|
|
182
|
+
expect(await readJson(res)).toEqual({ defaultWorkspaceId: firstId });
|
|
183
|
+
expect(await defaultsOf(owner.userId)).toEqual([firstId]);
|
|
184
|
+
|
|
185
|
+
for (const target of [secondId, firstId, secondId, firstId, secondId]) {
|
|
186
|
+
const step = await setDefault(owner, target);
|
|
187
|
+
expect(step.status).toBe(200);
|
|
188
|
+
expect(await readJson(step)).toEqual({ defaultWorkspaceId: target });
|
|
189
|
+
expect(await defaultsOf(owner.userId)).toEqual([target]);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('null clears: no true row, and the oldest membership answers again', async () => {
|
|
194
|
+
const owner = actors.owner!;
|
|
195
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
196
|
+
const res = await setDefault(owner, null);
|
|
197
|
+
expect(res.status).toBe(200);
|
|
198
|
+
expect(await readJson(res)).toEqual({ defaultWorkspaceId: null });
|
|
199
|
+
expect(await defaultsOf(owner.userId)).toEqual([]);
|
|
200
|
+
|
|
201
|
+
const me = await meNamingNone(owner);
|
|
202
|
+
expect(me.activeWorkspaceId).toBe(firstId);
|
|
203
|
+
expect(defaultEntries(me)).toEqual([]);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
describe('a workspace that is not an active membership of the caller answers 404, and nothing moves', () => {
|
|
208
|
+
let strangersWs = '';
|
|
209
|
+
let inactiveWs = '';
|
|
210
|
+
|
|
211
|
+
beforeAll(async () => {
|
|
212
|
+
const stranger = await addActor('stranger');
|
|
213
|
+
strangersWs = (await app.registry.workspaces.create('Strangers', stranger.userId)).workspaceId;
|
|
214
|
+
// The caller's own membership, switched off: a plain member's row (the
|
|
215
|
+
// last-owner trigger forbids switching off a workspace's only owner).
|
|
216
|
+
inactiveWs = (await app.registry.workspaces.create('Switched off', stranger.userId)).workspaceId;
|
|
217
|
+
await app.db.db
|
|
218
|
+
.insert(workspaceMembers)
|
|
219
|
+
.values({ workspaceId: inactiveWs, userId: actors.owner!.userId, role: 'member', isActive: false });
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('an unknown id, another person’s workspace and the caller’s own inactive membership answer alike', async () => {
|
|
223
|
+
const owner = actors.owner!;
|
|
224
|
+
expect((await setDefault(owner, secondId)).status).toBe(200);
|
|
225
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
226
|
+
|
|
227
|
+
const bodies: unknown[] = [];
|
|
228
|
+
for (const target of [UNKNOWN_WS, strangersWs, inactiveWs]) {
|
|
229
|
+
const res = await setDefault(owner, target);
|
|
230
|
+
const body = await readJson(res);
|
|
231
|
+
expect({ status: res.status, code: body?.error?.code }).toEqual({ status: 404, code: 'not_found' });
|
|
232
|
+
bodies.push(body);
|
|
233
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
234
|
+
}
|
|
235
|
+
// The three answers are the same answer: no oracle about which it was.
|
|
236
|
+
expect(bodies[1]).toEqual(bodies[0]);
|
|
237
|
+
expect(bodies[2]).toEqual(bodies[0]);
|
|
238
|
+
// The stranger's own rows are not touched either.
|
|
239
|
+
expect(await defaultsOf(actors.stranger!.userId)).toEqual([]);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
describe('a malformed body is 400', () => {
|
|
244
|
+
it('a workspaceId that is not a uuid, an empty object and no body at all', async () => {
|
|
245
|
+
const owner = actors.owner!;
|
|
246
|
+
const before = await defaultsOf(owner.userId);
|
|
247
|
+
await expectError(
|
|
248
|
+
await send('PUT', '/me/default-workspace', owner, { workspaceId: 'not-a-uuid' }),
|
|
249
|
+
400,
|
|
250
|
+
'validation_error'
|
|
251
|
+
);
|
|
252
|
+
await expectError(await send('PUT', '/me/default-workspace', owner, {}), 400, 'validation_error');
|
|
253
|
+
await expectError(await send('PUT', '/me/default-workspace', owner), 400, 'validation_error');
|
|
254
|
+
expect(await defaultsOf(owner.userId)).toEqual(before);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
describe('anonymous', () => {
|
|
259
|
+
it('is 401', async () => {
|
|
260
|
+
await expectError(await setDefault({}, firstId), 401, 'unauthenticated');
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
describe('it touches the caller’s rows only', () => {
|
|
265
|
+
it('another member’s default on the same workspace survives the owner’s set and clear', async () => {
|
|
266
|
+
const other = await addActor('other', { workspace: secondId });
|
|
267
|
+
await app.db.db
|
|
268
|
+
.update(workspaceMembers)
|
|
269
|
+
.set({ isDefault: true })
|
|
270
|
+
.where(eq(workspaceMembers.id, other.memberId));
|
|
271
|
+
expect(await defaultsOf(other.userId)).toEqual([secondId]);
|
|
272
|
+
|
|
273
|
+
const owner = actors.owner!;
|
|
274
|
+
expect((await setDefault(owner, secondId)).status).toBe(200);
|
|
275
|
+
expect(await defaultsOf(other.userId)).toEqual([secondId]);
|
|
276
|
+
expect((await setDefault(owner, firstId)).status).toBe(200);
|
|
277
|
+
expect(await defaultsOf(other.userId)).toEqual([secondId]);
|
|
278
|
+
expect((await setDefault(owner, null)).status).toBe(200);
|
|
279
|
+
expect(await defaultsOf(other.userId)).toEqual([secondId]);
|
|
280
|
+
expect(await defaultsOf(owner.userId)).toEqual([]);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it('two other members of the workspace whose default is false stay false after the owner sets it', async () => {
|
|
284
|
+
const plainA = await addActor('plain-a', { workspace: secondId });
|
|
285
|
+
const plainB = await addActor('plain-b', { workspace: secondId });
|
|
286
|
+
const isDefaultOf = async (memberId: string) =>
|
|
287
|
+
(
|
|
288
|
+
await app.db.db
|
|
289
|
+
.select({ isDefault: workspaceMembers.isDefault })
|
|
290
|
+
.from(workspaceMembers)
|
|
291
|
+
.where(eq(workspaceMembers.id, memberId))
|
|
292
|
+
)[0]?.isDefault;
|
|
293
|
+
expect(await isDefaultOf(plainA.memberId)).toBe(false);
|
|
294
|
+
expect(await isDefaultOf(plainB.memberId)).toBe(false);
|
|
295
|
+
|
|
296
|
+
const owner = actors.owner!;
|
|
297
|
+
expect((await setDefault(owner, secondId)).status).toBe(200);
|
|
298
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
299
|
+
// A set that lost its user_id clause would turn these two true.
|
|
300
|
+
expect(await isDefaultOf(plainA.memberId)).toBe(false);
|
|
301
|
+
expect(await isDefaultOf(plainB.memberId)).toBe(false);
|
|
302
|
+
expect((await setDefault(owner, null)).status).toBe(200);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
describe('the request’s workspace header does not decide', () => {
|
|
307
|
+
it('naming the first workspace in X-Workspace-Id and the second in the body sets the second', async () => {
|
|
308
|
+
const owner = actors.owner!;
|
|
309
|
+
const res = await setDefault(owner, secondId, { 'x-workspace-id': firstId });
|
|
310
|
+
expect(res.status).toBe(200);
|
|
311
|
+
expect(await readJson(res)).toEqual({ defaultWorkspaceId: secondId });
|
|
312
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
313
|
+
expect((await setDefault(owner, null)).status).toBe(200);
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
describe('a guest-origin membership', () => {
|
|
318
|
+
it('the guest sets their default to the workspace where they are a guest: 200', async () => {
|
|
319
|
+
const guest = await addActor('guest', { origin: 'guest' });
|
|
320
|
+
const res = await setDefault(guest, firstId);
|
|
321
|
+
const body = await readJson(res);
|
|
322
|
+
expect({ status: res.status, body }).toEqual({ status: 200, body: { defaultWorkspaceId: firstId } });
|
|
323
|
+
expect(await defaultsOf(guest.userId)).toEqual([firstId]);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
describe('machines', () => {
|
|
328
|
+
it('an unpinned key with read and write sets the default', async () => {
|
|
329
|
+
const owner = actors.owner!;
|
|
330
|
+
expect((await setDefault(owner, null)).status).toBe(200);
|
|
331
|
+
const key = await mintKey(owner.cookie, [host.scopes.read, host.scopes.write]);
|
|
332
|
+
const res = await setDefault({ key }, secondId);
|
|
333
|
+
expect(res.status).toBe(200);
|
|
334
|
+
expect(await readJson(res)).toEqual({ defaultWorkspaceId: secondId });
|
|
335
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('a key with the read scope only is 403 insufficient_scope, and nothing moves', async () => {
|
|
339
|
+
const owner = actors.owner!;
|
|
340
|
+
const key = await mintKey(owner.cookie, [host.scopes.read]);
|
|
341
|
+
await expectError(await setDefault({ key }, firstId), 403, 'insufficient_scope');
|
|
342
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
it('a key pinned to one workspace is 403 key_pinned, and nothing moves', async () => {
|
|
346
|
+
const owner = actors.owner!;
|
|
347
|
+
const key = await mintKey(owner.cookie, [host.scopes.read, host.scopes.write], firstId);
|
|
348
|
+
await expectError(await setDefault({ key }, firstId), 403, 'key_pinned');
|
|
349
|
+
await expectError(await setDefault({ key }, null), 403, 'key_pinned');
|
|
350
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('GET, POST and DELETE on the path are refused to the unpinned key (endpoint_not_allowed)', async () => {
|
|
354
|
+
const owner = actors.owner!;
|
|
355
|
+
const key = await mintKey(owner.cookie, [host.scopes.read, host.scopes.write]);
|
|
356
|
+
await expectError(await send('GET', '/me/default-workspace', { key }), 403, 'endpoint_not_allowed');
|
|
357
|
+
await expectError(
|
|
358
|
+
await send('POST', '/me/default-workspace', { key }, { workspaceId: firstId }),
|
|
359
|
+
403,
|
|
360
|
+
'endpoint_not_allowed'
|
|
361
|
+
);
|
|
362
|
+
await expectError(await send('DELETE', '/me/default-workspace', { key }), 403, 'endpoint_not_allowed');
|
|
363
|
+
expect(await defaultsOf(owner.userId)).toEqual([secondId]);
|
|
364
|
+
expect((await setDefault(owner, null)).status).toBe(200);
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
describe('no audit row', () => {
|
|
369
|
+
const counts = async () => {
|
|
370
|
+
const { rows } = await app.db.pool.query(
|
|
371
|
+
`SELECT
|
|
372
|
+
(SELECT count(*)::int FROM audit_log WHERE action ILIKE '%default%') AS default_actions,
|
|
373
|
+
(SELECT count(*)::int FROM audit_log WHERE workspace_id = $1) AS in_second,
|
|
374
|
+
(SELECT count(*)::int FROM audit_log WHERE workspace_id = $2) AS in_first,
|
|
375
|
+
(SELECT count(*)::int FROM audit_log) AS total`,
|
|
376
|
+
[secondId, firstId]
|
|
377
|
+
);
|
|
378
|
+
return rows[0] as { default_actions: number; in_second: number; in_first: number; total: number };
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
it('a set and a clear leave the audit log as it was', async () => {
|
|
382
|
+
const owner = actors.owner!;
|
|
383
|
+
const before = await counts();
|
|
384
|
+
expect((await setDefault(owner, secondId)).status).toBe(200);
|
|
385
|
+
expect((await setDefault(owner, null)).status).toBe(200);
|
|
386
|
+
expect(await counts()).toEqual(before);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
describe('a removed membership can no longer be the default', () => {
|
|
391
|
+
it('the removal clears the flag, and the removed person naming that workspace is 404', async () => {
|
|
392
|
+
const leaver = await addActor('leaver');
|
|
393
|
+
// A second membership, so the person keeps a principal after the removal.
|
|
394
|
+
await app.db.db
|
|
395
|
+
.insert(workspaceMembers)
|
|
396
|
+
.values({ workspaceId: secondId, userId: leaver.userId, role: 'member' });
|
|
397
|
+
|
|
398
|
+
expect((await setDefault(leaver, firstId)).status).toBe(200);
|
|
399
|
+
expect(await defaultsOf(leaver.userId)).toEqual([firstId]);
|
|
400
|
+
|
|
401
|
+
const removed = await send('POST', `/members/${leaver.memberId}/remove`, actors.owner!, undefined, {
|
|
402
|
+
'x-workspace-id': firstId
|
|
403
|
+
});
|
|
404
|
+
expect(removed.status).toBe(200);
|
|
405
|
+
const [row] = await app.db.db
|
|
406
|
+
.select()
|
|
407
|
+
.from(workspaceMembers)
|
|
408
|
+
.where(eq(workspaceMembers.id, leaver.memberId));
|
|
409
|
+
expect(row).toMatchObject({ isActive: false, isDefault: false });
|
|
410
|
+
|
|
411
|
+
await expectError(await setDefault(leaver, firstId), 404, 'not_found');
|
|
412
|
+
expect(await defaultsOf(leaver.userId)).toEqual([]);
|
|
413
|
+
});
|
|
414
|
+
});
|