@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,400 @@
|
|
|
1
|
+
import { Counter } from 'prom-client';
|
|
2
|
+
import { and, eq, inArray, isNotNull, ne, notInArray, sql } from 'drizzle-orm';
|
|
3
|
+
import { workspaceMembers, workspaces } from '@antasphere/chassis-db';
|
|
4
|
+
import { deleteMembershipGrants } from '../members/removal.js';
|
|
5
|
+
import { projectOrgMembership, projectOrgTeams, projectTeamSeats } from './hub-projection.js';
|
|
6
|
+
export const DEFAULT_FEDERATION_DIALS = {
|
|
7
|
+
reconcileTtlMs: 10_000,
|
|
8
|
+
reconcileStaleMaxMs: 15 * 60_000,
|
|
9
|
+
retryMs: 15_000,
|
|
10
|
+
orgsTimeoutMs: 1_500,
|
|
11
|
+
tokenTimeoutMs: 5_000,
|
|
12
|
+
accessSkewMs: 60_000,
|
|
13
|
+
// Must cover probe + presentation under the refresh lock (hub-grant.ts
|
|
14
|
+
// clamps it up if not): 5 s + 5 s + 2 s headroom.
|
|
15
|
+
lockWatchdogMs: 12_000,
|
|
16
|
+
orgTeamsTtlMs: 5 * 60_000
|
|
17
|
+
};
|
|
18
|
+
/** Bound the cache — a user-id flood must never balloon memory. */
|
|
19
|
+
const MAX_CACHE_ENTRIES = 10_000;
|
|
20
|
+
export class HubOrgReconciler {
|
|
21
|
+
deps;
|
|
22
|
+
/** local userId → pass freshness. */
|
|
23
|
+
cache = new Map();
|
|
24
|
+
inFlight = new Map();
|
|
25
|
+
/** hub org id → its whole team list's freshness (bounded like the user cache). */
|
|
26
|
+
orgTeams = new Map();
|
|
27
|
+
now;
|
|
28
|
+
dials;
|
|
29
|
+
/** Registered into the Prometheus registry by boot (cloud only). */
|
|
30
|
+
promMetrics;
|
|
31
|
+
passes;
|
|
32
|
+
orgTeamsRefreshes;
|
|
33
|
+
constructor(deps) {
|
|
34
|
+
this.deps = deps;
|
|
35
|
+
this.now = deps.now ?? Date.now;
|
|
36
|
+
this.dials = deps.dials;
|
|
37
|
+
// registers: [] — boot attaches this to the app registry on cloud; an
|
|
38
|
+
// oss boot never constructs this class, so the metric never exists there.
|
|
39
|
+
this.passes = new Counter({
|
|
40
|
+
name: 'hub_reconcile_passes_total',
|
|
41
|
+
help: 'Hub org-list reconciliation passes by outcome',
|
|
42
|
+
labelNames: ['outcome'],
|
|
43
|
+
registers: []
|
|
44
|
+
});
|
|
45
|
+
this.orgTeamsRefreshes = new Counter({
|
|
46
|
+
name: 'hub_org_teams_refresh_total',
|
|
47
|
+
help: 'Reads of a hub organization’s whole team list by outcome',
|
|
48
|
+
labelNames: ['outcome'],
|
|
49
|
+
registers: []
|
|
50
|
+
});
|
|
51
|
+
this.promMetrics = [this.passes, this.orgTeamsRefreshes];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The identity-path read-through: cached per user (~10 s), single-flight,
|
|
55
|
+
* retry-throttled after failures. Awaits one pass on expiry — the request
|
|
56
|
+
* that triggered it observes the reconciled state — and NEVER throws.
|
|
57
|
+
* Returns the windowed verdict the live gate enforces.
|
|
58
|
+
*/
|
|
59
|
+
async reconcile(localUserId) {
|
|
60
|
+
const now = this.now();
|
|
61
|
+
const entry = this.cache.get(localUserId);
|
|
62
|
+
if (!entry || now - entry.fetchedAt >= this.dials.reconcileTtlMs) {
|
|
63
|
+
let flight = this.inFlight.get(localUserId);
|
|
64
|
+
if (!flight) {
|
|
65
|
+
// Outage throttle: after a FAILED pass (lastAttemptAt advanced past
|
|
66
|
+
// the last success), at most one re-probe per retryMs — a down hub
|
|
67
|
+
// costs each user one bounded timeout per window. A successful pass
|
|
68
|
+
// is never throttled beyond its own TTL.
|
|
69
|
+
const throttled = entry !== undefined &&
|
|
70
|
+
entry.lastAttemptAt > entry.fetchedAt &&
|
|
71
|
+
now - entry.lastAttemptAt < this.dials.retryMs;
|
|
72
|
+
if (!throttled) {
|
|
73
|
+
flight = this.startPass(localUserId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (flight)
|
|
77
|
+
await flight;
|
|
78
|
+
}
|
|
79
|
+
return this.verdict(localUserId);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The login-time pass (assertLogin step 3): TTL and throttle deliberately
|
|
83
|
+
* bypassed — a login is the freshest signal there is, and `login` carries
|
|
84
|
+
* the callback access token so no refresh is needed. Returns the PASS'S
|
|
85
|
+
* OWN outcome (not the windowed verdict): the fail-CLOSED login requires
|
|
86
|
+
* this very pass to have succeeded, never a recent cached one.
|
|
87
|
+
*/
|
|
88
|
+
async forceReconcile(localUserId, login) {
|
|
89
|
+
const flight = this.runPass(localUserId, login).finally(() => {
|
|
90
|
+
if (this.inFlight.get(localUserId) === flight)
|
|
91
|
+
this.inFlight.delete(localUserId);
|
|
92
|
+
});
|
|
93
|
+
// Concurrent cached reconciles join this pass instead of doubling it.
|
|
94
|
+
this.inFlight.set(localUserId, flight);
|
|
95
|
+
return flight;
|
|
96
|
+
}
|
|
97
|
+
startPass(localUserId) {
|
|
98
|
+
const flight = this.runPass(localUserId, undefined).finally(() => {
|
|
99
|
+
if (this.inFlight.get(localUserId) === flight)
|
|
100
|
+
this.inFlight.delete(localUserId);
|
|
101
|
+
});
|
|
102
|
+
this.inFlight.set(localUserId, flight);
|
|
103
|
+
return flight;
|
|
104
|
+
}
|
|
105
|
+
verdict(localUserId) {
|
|
106
|
+
const entry = this.cache.get(localUserId);
|
|
107
|
+
const now = this.now();
|
|
108
|
+
if (entry && entry.lastDefinitive && now - entry.fetchedAt < this.dials.reconcileStaleMaxMs) {
|
|
109
|
+
// Definitive data within the window. A definitive DEAD grant refuses
|
|
110
|
+
// immediately (no stale grace — Romain's decision 3); 'ok'/'no_link'
|
|
111
|
+
// serve on local rows.
|
|
112
|
+
return entry.lastDefinitive === 'grant_dead' ? { kind: 'grant_dead' } : { kind: 'ok' };
|
|
113
|
+
}
|
|
114
|
+
// No definitive pass within the window (or ever, e.g. a replica that
|
|
115
|
+
// restarted mid-outage) and the hub keeps failing: fail closed.
|
|
116
|
+
return { kind: 'unavailable' };
|
|
117
|
+
}
|
|
118
|
+
async runPass(localUserId, login) {
|
|
119
|
+
try {
|
|
120
|
+
const result = await this.deps.client.orgs(localUserId, login);
|
|
121
|
+
if (result.kind === 'no_link') {
|
|
122
|
+
// A purely local user: the hub asserts nothing about them, and that
|
|
123
|
+
// IS the definitive answer. Nothing is swept.
|
|
124
|
+
//
|
|
125
|
+
// EXCEPT (CLOUD-1, PRDCT-1356) when the user HOLDS origin='hub'
|
|
126
|
+
// membership rows: those rows exist only because a hub link once
|
|
127
|
+
// projected them, so "no link" means the link was SEVERED (an
|
|
128
|
+
// unlinked account row, a partial cleanup) — and treating that as
|
|
129
|
+
// the fail-open definitive answer, cached like a success, was the
|
|
130
|
+
// one way to switch cloud enforcement off permanently. It fails
|
|
131
|
+
// CLOSED instead, as a dead grant: the gate answers 401
|
|
132
|
+
// hub_grant_expired, and a browser SSO re-login (which re-links)
|
|
133
|
+
// heals it. Local/guest rows are untouched — they never reconcile.
|
|
134
|
+
const [hubRow] = await this.deps.db
|
|
135
|
+
.select({ id: workspaceMembers.id })
|
|
136
|
+
.from(workspaceMembers)
|
|
137
|
+
.where(and(eq(workspaceMembers.userId, localUserId), eq(workspaceMembers.origin, 'hub')))
|
|
138
|
+
.limit(1);
|
|
139
|
+
if (hubRow) {
|
|
140
|
+
this.deps.logger.warn({ userId: localUserId }, 'hub org reconcile: no hub link but hub-origin memberships exist — link severed; failing CLOSED');
|
|
141
|
+
this.remember(localUserId, 'grant_dead');
|
|
142
|
+
this.passes.inc({ outcome: 'link_severed' });
|
|
143
|
+
return 'grant_dead';
|
|
144
|
+
}
|
|
145
|
+
this.remember(localUserId, 'no_link');
|
|
146
|
+
this.passes.inc({ outcome: 'no_link' });
|
|
147
|
+
return 'no_link';
|
|
148
|
+
}
|
|
149
|
+
if (result.kind === 'grant_dead') {
|
|
150
|
+
// Definitive: the grant family is gone. Freshness-wise a real
|
|
151
|
+
// answer (cached); enforcement is the gate's 401 hub_grant_expired.
|
|
152
|
+
// Nothing is swept — org truth was not read, only the grant state.
|
|
153
|
+
this.remember(localUserId, 'grant_dead');
|
|
154
|
+
this.passes.inc({ outcome: 'grant_dead' });
|
|
155
|
+
return 'grant_dead';
|
|
156
|
+
}
|
|
157
|
+
if (result.kind === 'inconclusive') {
|
|
158
|
+
// Loudly logged by the client already; retry at the next window.
|
|
159
|
+
this.remember(localUserId, null);
|
|
160
|
+
this.passes.inc({ outcome: 'inconclusive' });
|
|
161
|
+
return 'inconclusive';
|
|
162
|
+
}
|
|
163
|
+
// Definitive 200 list — the ONLY thing that may ever mutate state.
|
|
164
|
+
// Every listed org is kept, suspended ones included (visible but
|
|
165
|
+
// blocked: the synced hub_status is what refuses their requests);
|
|
166
|
+
// role-null entries are kept but not projected/synced.
|
|
167
|
+
const keep = new Set(result.orgs.map((o) => o.id));
|
|
168
|
+
// Deactivation sweep FIRST (removal must win over projection within
|
|
169
|
+
// one pass): ONE conditional UPDATE covering exactly the rows the hub
|
|
170
|
+
// no longer asserts — origin='hub' AND active AND the workspace IS a
|
|
171
|
+
// projection whose hub org is off the keep-set. local/guest rows and
|
|
172
|
+
// rows in non-projected workspaces are structurally out of scope.
|
|
173
|
+
// `is_active = true` in the WHERE makes the flip observable: only the
|
|
174
|
+
// pass that actually flipped a row audits it — one logical removal
|
|
175
|
+
// writes ONE member.deactivate row.
|
|
176
|
+
const keepIds = [...keep];
|
|
177
|
+
const sweptWorkspaces = this.deps.db
|
|
178
|
+
.select({ id: workspaces.id })
|
|
179
|
+
.from(workspaces)
|
|
180
|
+
.where(keepIds.length > 0
|
|
181
|
+
? and(isNotNull(workspaces.centralAccountId), notInArray(workspaces.centralAccountId, keepIds))
|
|
182
|
+
: isNotNull(workspaces.centralAccountId));
|
|
183
|
+
// The project grants that rode on a swept membership go WITH it, in the
|
|
184
|
+
// same transaction. The sweep deactivates the row and never deletes it
|
|
185
|
+
// (a re-add at the hub reactivates the very same row), so the foreign
|
|
186
|
+
// key's cascade never fires here: without this delete, a person removed
|
|
187
|
+
// at the hub and added back later would find every old project grant
|
|
188
|
+
// waiting. A removal is a removal: a re-add starts with none. (A LOCAL
|
|
189
|
+
// deactivation by an admin is a pause, not a removal, and keeps them.)
|
|
190
|
+
const deactivated = await this.deps.db.transaction(async (tx) => {
|
|
191
|
+
const rows = await tx
|
|
192
|
+
.update(workspaceMembers)
|
|
193
|
+
.set({ isActive: false })
|
|
194
|
+
.where(and(eq(workspaceMembers.userId, localUserId), eq(workspaceMembers.origin, 'hub'), eq(workspaceMembers.isActive, true), inArray(workspaceMembers.workspaceId, sweptWorkspaces)))
|
|
195
|
+
.returning({ id: workspaceMembers.id, workspaceId: workspaceMembers.workspaceId });
|
|
196
|
+
// The grants and the seats go with the membership: the one statement
|
|
197
|
+
// of what a removal takes, shared with the tool's own removal route.
|
|
198
|
+
await deleteMembershipGrants(tx, rows.map((row) => ({ memberId: row.id, workspaceId: row.workspaceId, userId: localUserId })), this.deps.onMembershipRemoval);
|
|
199
|
+
return rows;
|
|
200
|
+
});
|
|
201
|
+
for (const row of deactivated) {
|
|
202
|
+
await this.deps.audit.write({
|
|
203
|
+
workspaceId: row.workspaceId,
|
|
204
|
+
principal: null,
|
|
205
|
+
action: 'member.deactivate',
|
|
206
|
+
resourceType: 'member',
|
|
207
|
+
resourceId: localUserId,
|
|
208
|
+
metadata: { reason: 'hub_reconcile' }
|
|
209
|
+
});
|
|
210
|
+
this.deps.logger.info({ userId: localUserId, workspaceId: row.workspaceId }, 'hub reconcile: membership no longer asserted by the hub — local membership deactivated');
|
|
211
|
+
}
|
|
212
|
+
// Then project/upsert every well-formed entry (role upserts are
|
|
213
|
+
// deliberately NOT audited — the login-projection precedent), the
|
|
214
|
+
// person's team seats in it, and sync the org-level hub_status. One
|
|
215
|
+
// failing entry logs and moves on: a single bad org must never starve
|
|
216
|
+
// the others.
|
|
217
|
+
for (const org of result.orgs) {
|
|
218
|
+
try {
|
|
219
|
+
if (org.role !== null) {
|
|
220
|
+
const projected = await projectOrgMembership(this.deps.db, {
|
|
221
|
+
localUserId,
|
|
222
|
+
hubWorkspaceId: org.id,
|
|
223
|
+
hubWorkspaceName: org.name,
|
|
224
|
+
role: org.role
|
|
225
|
+
});
|
|
226
|
+
// The person's own seats in this org's teams: one transaction
|
|
227
|
+
// per org, so a seat set is never half-applied.
|
|
228
|
+
await this.deps.db.transaction(async (tx) => {
|
|
229
|
+
await projectTeamSeats(tx, {
|
|
230
|
+
workspaceId: projected.workspaceId,
|
|
231
|
+
memberId: projected.memberId,
|
|
232
|
+
teams: org.teams
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
// Then the org's whole team list, when it is due (never fails the pass).
|
|
236
|
+
await this.refreshOrgTeams(localUserId, org.id, projected.workspaceId, login !== undefined);
|
|
237
|
+
}
|
|
238
|
+
// Org-level suspension is LOCALLY MATERIALIZED truth: the gate
|
|
239
|
+
// (and guests' requests — the accepted staleness bound) read this
|
|
240
|
+
// column, never a hub round-trip of their own. A role-null entry
|
|
241
|
+
// still syncs it when the projection already exists.
|
|
242
|
+
await this.deps.db
|
|
243
|
+
.update(workspaces)
|
|
244
|
+
.set({ hubStatus: org.status })
|
|
245
|
+
.where(and(eq(workspaces.centralAccountId, org.id), ne(workspaces.hubStatus, org.status)));
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
this.deps.logger.error({ err, userId: localUserId, hubOrgId: org.id }, 'hub reconcile: projecting one org failed — continuing with the rest');
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Materialize the hub-level default org on the user's membership rows
|
|
252
|
+
// (selection happens inside the resolvers, before any gate — the flag
|
|
253
|
+
// must live locally). Clear-then-set in ONE transaction: the partial
|
|
254
|
+
// unique index (user_id WHERE is_default) forbids two trues even
|
|
255
|
+
// transiently, so a single both-ways UPDATE could trip it on row
|
|
256
|
+
// order. A cross-replica race still can — the violation aborts only
|
|
257
|
+
// this step and self-heals next pass.
|
|
258
|
+
try {
|
|
259
|
+
const defaultOrgId = result.orgs.find((o) => o.isDefault)?.id ?? null;
|
|
260
|
+
let defaultWorkspaceId = null;
|
|
261
|
+
if (defaultOrgId) {
|
|
262
|
+
const [ws] = await this.deps.db
|
|
263
|
+
.select({ id: workspaces.id })
|
|
264
|
+
.from(workspaces)
|
|
265
|
+
.where(eq(workspaces.centralAccountId, defaultOrgId))
|
|
266
|
+
.limit(1);
|
|
267
|
+
defaultWorkspaceId = ws?.id ?? null;
|
|
268
|
+
}
|
|
269
|
+
await this.deps.db.transaction(async (tx) => {
|
|
270
|
+
await tx
|
|
271
|
+
.update(workspaceMembers)
|
|
272
|
+
.set({ isDefault: false })
|
|
273
|
+
.where(and(eq(workspaceMembers.userId, localUserId), eq(workspaceMembers.isDefault, true), ...(defaultWorkspaceId ? [ne(workspaceMembers.workspaceId, defaultWorkspaceId)] : [])));
|
|
274
|
+
if (defaultWorkspaceId) {
|
|
275
|
+
await tx
|
|
276
|
+
.update(workspaceMembers)
|
|
277
|
+
.set({ isDefault: true })
|
|
278
|
+
.where(and(eq(workspaceMembers.userId, localUserId), eq(workspaceMembers.workspaceId, defaultWorkspaceId), eq(workspaceMembers.isDefault, false)));
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
this.deps.logger.warn({ err, userId: localUserId }, 'hub reconcile: default-org sync failed — selection falls back to oldest-active until the next pass');
|
|
284
|
+
}
|
|
285
|
+
this.remember(localUserId, 'ok', result.denied);
|
|
286
|
+
this.passes.inc({ outcome: 'ok' });
|
|
287
|
+
return 'ok';
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
// Fail open, always: reconciliation is freshness; enforcement lives
|
|
291
|
+
// in the gate's windowed verdict.
|
|
292
|
+
this.remember(localUserId, null);
|
|
293
|
+
this.passes.inc({ outcome: 'error' });
|
|
294
|
+
this.deps.logger.error({ err, userId: localUserId }, 'hub org reconcile pass failed — serving local state');
|
|
295
|
+
return 'error';
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Read the organization's WHOLE team list as this person and project it
|
|
300
|
+
* (PRDCT-2813), when the last read is older than `orgTeamsTtlMs` (or never
|
|
301
|
+
* happened) and no failed read happened within `retryMs`. The LOGIN pass
|
|
302
|
+
* reads it whatever the window says (`force`): a login is the freshest
|
|
303
|
+
* signal there is, and Romain's rule is "at login, then every five minutes". A refinement
|
|
304
|
+
* of a pass whose org list already succeeded: it never throws and never
|
|
305
|
+
* fails the pass; a failed read keeps the previous list and is logged once
|
|
306
|
+
* per throttle window.
|
|
307
|
+
*
|
|
308
|
+
* No lock: two replicas (or two passes) may both refresh the same org. The
|
|
309
|
+
* upsert is idempotent and the delete is by membership of the list each
|
|
310
|
+
* one read, so the last writer leaves the hub's list, whichever it is.
|
|
311
|
+
*/
|
|
312
|
+
async refreshOrgTeams(localUserId, hubOrgId, workspaceId,
|
|
313
|
+
/** A login: the freshest signal there is, read whatever the window says (the login pass's own rule). */
|
|
314
|
+
force = false) {
|
|
315
|
+
const now = this.now();
|
|
316
|
+
const entry = this.orgTeams.get(hubOrgId);
|
|
317
|
+
if (entry) {
|
|
318
|
+
// A login skips the window, never the failure throttle: a hub whose
|
|
319
|
+
// team list hangs must not cost every sign-in one timeout per org
|
|
320
|
+
// (verifier round 2).
|
|
321
|
+
if (!force && entry.refreshedAt > 0 && now - entry.refreshedAt < this.dials.orgTeamsTtlMs)
|
|
322
|
+
return;
|
|
323
|
+
if (entry.lastAttemptAt > entry.refreshedAt && now - entry.lastAttemptAt < this.dials.retryMs)
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
let outcome;
|
|
327
|
+
try {
|
|
328
|
+
// Stamped BEFORE the read, on the DATABASE's clock (the one the rows'
|
|
329
|
+
// `created_at` is written from, whatever the app host's says; never the
|
|
330
|
+
// test seam): a team projected here while the hub answered is newer
|
|
331
|
+
// than the list and is not deleted by it.
|
|
332
|
+
const [clock] = (await this.deps.db.execute(sql `SELECT now() AS now`)).rows;
|
|
333
|
+
const readAt = new Date(clock.now);
|
|
334
|
+
const result = await this.deps.client.orgTeams(localUserId, hubOrgId);
|
|
335
|
+
if (result.kind === 'ok') {
|
|
336
|
+
await this.deps.db.transaction(async (tx) => {
|
|
337
|
+
await projectOrgTeams(tx, { workspaceId, teams: result.teams, complete: result.complete, readAt });
|
|
338
|
+
});
|
|
339
|
+
outcome = 'ok';
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
outcome = result.kind;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
this.deps.logger.warn({ err, hubOrgId }, 'hub reconcile: projecting the org’s team list failed');
|
|
347
|
+
outcome = 'error';
|
|
348
|
+
}
|
|
349
|
+
this.orgTeamsRefreshes.inc({ outcome });
|
|
350
|
+
const at = this.now();
|
|
351
|
+
pruneOversized(this.orgTeams, (e) => at - e.refreshedAt >= this.dials.orgTeamsTtlMs);
|
|
352
|
+
const prev = this.orgTeams.get(hubOrgId);
|
|
353
|
+
if (outcome === 'ok') {
|
|
354
|
+
this.orgTeams.set(hubOrgId, { refreshedAt: at, lastAttemptAt: prev?.lastAttemptAt ?? 0 });
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
this.orgTeams.set(hubOrgId, { refreshedAt: prev?.refreshedAt ?? 0, lastAttemptAt: at });
|
|
358
|
+
if (outcome !== 'error') {
|
|
359
|
+
this.deps.logger.warn({ hubOrgId, outcome }, 'hub reconcile: the org’s team list could not be read — keeping the previous one');
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* The organizations the person's last definitive hub list named as not
|
|
364
|
+
* opening this tool to them (`GET /me`'s `hubDenied`, the refusal page's
|
|
365
|
+
* words). Empty when unknown: never read, evicted, or cleared by a
|
|
366
|
+
* `no_link` / `grant_dead` pass. Per replica, like the rest of the cache.
|
|
367
|
+
*/
|
|
368
|
+
deniedOrgs(localUserId) {
|
|
369
|
+
return this.cache.get(localUserId)?.denied ?? [];
|
|
370
|
+
}
|
|
371
|
+
remember(localUserId, definitive, denied = []) {
|
|
372
|
+
const now = this.now();
|
|
373
|
+
pruneOversized(this.cache, (entry) => now - entry.fetchedAt >= this.dials.reconcileTtlMs);
|
|
374
|
+
const prev = this.cache.get(localUserId);
|
|
375
|
+
this.cache.set(localUserId, {
|
|
376
|
+
fetchedAt: definitive ? now : (prev?.fetchedAt ?? 0),
|
|
377
|
+
lastAttemptAt: now,
|
|
378
|
+
lastDefinitive: definitive ?? prev?.lastDefinitive ?? null,
|
|
379
|
+
// 'ok' carries the fresh list; a failed pass keeps the last one; a
|
|
380
|
+
// definitive no_link / grant_dead has no list to show.
|
|
381
|
+
denied: definitive === 'ok' ? denied : definitive === null ? (prev?.denied ?? []) : []
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/** Keep a cache under MAX_CACHE_ENTRIES: drop expired entries first, then oldest-inserted. */
|
|
386
|
+
export function pruneOversized(cache, expired) {
|
|
387
|
+
if (cache.size < MAX_CACHE_ENTRIES)
|
|
388
|
+
return;
|
|
389
|
+
for (const [key, value] of cache) {
|
|
390
|
+
if (expired(value))
|
|
391
|
+
cache.delete(key);
|
|
392
|
+
}
|
|
393
|
+
while (cache.size >= MAX_CACHE_ENTRIES) {
|
|
394
|
+
const oldest = cache.keys().next();
|
|
395
|
+
if (oldest.done)
|
|
396
|
+
break;
|
|
397
|
+
cache.delete(oldest.value);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=hub-reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-reconcile.js","sourceRoot":"","sources":["../../src/identity/hub-reconcile.ts"],"names":[],"mappings":"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"}
|