@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,463 @@
|
|
|
1
|
+
import type { Db, DbHandle } from '@antasphere/chassis-db';
|
|
2
|
+
import type { ToolIdentity, UsageDownstream } from '@antasphere/chassis-contract';
|
|
3
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
4
|
+
import type { Hono, MiddlewareHandler, Context } from 'hono';
|
|
5
|
+
import type { RateLimiterAbstract } from 'rate-limiter-flexible';
|
|
6
|
+
import type { z } from 'zod';
|
|
7
|
+
import type { ExportEntriesFn } from './api/export.js';
|
|
8
|
+
import type { FileRouteDeps } from './api/files.js';
|
|
9
|
+
import type { ScopeRoutes } from './api/scope-routes.js';
|
|
10
|
+
import type { PepperRegistry } from './apikeys/peppers.js';
|
|
11
|
+
import type { AuditService } from './audit/service.js';
|
|
12
|
+
import type { EmailDriver } from './email/driver.js';
|
|
13
|
+
import type { ToolEntitlementDeclaration } from './entitlements/slot.js';
|
|
14
|
+
import type { CreditCheckDials } from './entitlements/check.js';
|
|
15
|
+
import type { EntitlementProfileDials } from './entitlements/profiles.js';
|
|
16
|
+
import type { UsageRetry } from './jobs/pgboss.js';
|
|
17
|
+
import type { EnvExtension, ToolEnv } from './env.js';
|
|
18
|
+
import type { FileService } from './files/service.js';
|
|
19
|
+
import type { Auth } from './identity/better-auth.js';
|
|
20
|
+
import type { HubFederationDials } from './identity/hub-reconcile.js';
|
|
21
|
+
import type { DemoSessionRefusedApiRoute } from './identity/demo-pass-rules.js';
|
|
22
|
+
import type { HubSsoService } from './identity/hub-sso.js';
|
|
23
|
+
import type { HubOrgCreator } from './identity/hub-user-client.js';
|
|
24
|
+
import type { JobDeclaration, Jobs } from './jobs/pgboss.js';
|
|
25
|
+
import type { Timers } from './jobs/timers.js';
|
|
26
|
+
import type { Logger } from './logger.js';
|
|
27
|
+
import type { MembershipRemovalHook } from './members/removal.js';
|
|
28
|
+
import type { McpToolDefinition } from './mcp/server.js';
|
|
29
|
+
import type { BucketDeclaration, ClientIpFn, RateLimiters } from './middleware/rate-limit.js';
|
|
30
|
+
import type { Otel } from './observability/otel.js';
|
|
31
|
+
import type { EventBus } from './platform/events.js';
|
|
32
|
+
import type { PlatformRegistry } from './platform/registry.js';
|
|
33
|
+
import type { RuntimeState } from './state.js';
|
|
34
|
+
import type { StorageDriver } from './storage/driver.js';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The tool definition: everything a product plugs into the chassis, as NAMED
|
|
38
|
+
* SLOTS. The chassis owns the locked boot order (boot.ts), the locked
|
|
39
|
+
* middleware and route registration order of the API app (api/create-api.ts)
|
|
40
|
+
* and the mount order of the root app (app.ts); a tool never reorders
|
|
41
|
+
* anything. Each positional hook below is invoked at one fixed place of those
|
|
42
|
+
* sequences, named in its comment.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/** A tool's bucket declarations: a tool bucket can never take a chassis bucket's name. */
|
|
46
|
+
export type ToolBuckets<TBuckets extends string> = {
|
|
47
|
+
[K in TBuckets]: K extends keyof RateLimiters ? never : BucketDeclaration;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/** The limiters boot hands around: the chassis buckets plus the tool's own. */
|
|
51
|
+
export type ToolRateLimiters<TBuckets extends string> = RateLimiters & Record<TBuckets, RateLimiterAbstract>;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* What the `services` slot receives: the generic services that exist once the
|
|
55
|
+
* storage is probed, before the rate limiters and the auth-dependent assembly.
|
|
56
|
+
*/
|
|
57
|
+
export interface ServiceCore<TEnvShape extends z.ZodRawShape, TEvents, TToolOverrides> {
|
|
58
|
+
db: Db;
|
|
59
|
+
env: ToolEnv<TEnvShape>;
|
|
60
|
+
logger: Logger;
|
|
61
|
+
storage: StorageDriver;
|
|
62
|
+
fileService: FileService;
|
|
63
|
+
pepperRegistry: PepperRegistry;
|
|
64
|
+
email: EmailDriver;
|
|
65
|
+
events: EventBus<TEvents>;
|
|
66
|
+
authSecret: string;
|
|
67
|
+
/** One-off timers on the queues the `jobs` slot declared (`jobs/timers.ts`): a service arms and withdraws them. */
|
|
68
|
+
timers: Timers;
|
|
69
|
+
/** The tool's own test seams (`BootOverrides.tool`); undefined in production. */
|
|
70
|
+
overrides: TToolOverrides | undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The same, once the rate limiters exist: what the `publicRoutes` slot receives. */
|
|
74
|
+
export interface PlatformCore<
|
|
75
|
+
TEnvShape extends z.ZodRawShape,
|
|
76
|
+
TBuckets extends string,
|
|
77
|
+
TEvents,
|
|
78
|
+
TToolOverrides
|
|
79
|
+
> extends ServiceCore<TEnvShape, TEvents, TToolOverrides> {
|
|
80
|
+
limiters: ToolRateLimiters<TBuckets>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** What the `jobs` slot receives. It runs BEFORE the services exist: the domain is read lazily. */
|
|
84
|
+
export interface JobsContext<TEnvShape extends z.ZodRawShape, TDomain> {
|
|
85
|
+
env: ToolEnv<TEnvShape>;
|
|
86
|
+
db: Db;
|
|
87
|
+
logger: Logger;
|
|
88
|
+
/** The `services` result, or null until that slot has run. Read it at RUN time, inside a handler. */
|
|
89
|
+
getTool: () => TDomain | null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** What every positional hook of the API app receives. */
|
|
93
|
+
export interface ApiContext<TEnvShape extends z.ZodRawShape, TBuckets extends string, TEvents> {
|
|
94
|
+
db: Db;
|
|
95
|
+
env: ToolEnv<TEnvShape>;
|
|
96
|
+
auth: Auth;
|
|
97
|
+
registry: PlatformRegistry<TEvents>;
|
|
98
|
+
logger: Logger;
|
|
99
|
+
audit: AuditService;
|
|
100
|
+
email: EmailDriver;
|
|
101
|
+
limiters: ToolRateLimiters<TBuckets>;
|
|
102
|
+
storage: StorageDriver;
|
|
103
|
+
fileService: FileService;
|
|
104
|
+
authSecret: string;
|
|
105
|
+
/** Cloud presence switch (internal/federation.md): undefined on oss. */
|
|
106
|
+
hubSso: HubSsoService | undefined;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** The rate-limit hook also gets the client-identity function the chassis walls key on. */
|
|
110
|
+
export interface ApiRateLimitContext<
|
|
111
|
+
TEnvShape extends z.ZodRawShape,
|
|
112
|
+
TBuckets extends string,
|
|
113
|
+
TEvents
|
|
114
|
+
> extends ApiContext<TEnvShape, TBuckets, TEvents> {
|
|
115
|
+
clientIp: ClientIpFn;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The routes hook also gets the cached instance id for usage-event sources. */
|
|
119
|
+
export interface ApiRoutesContext<
|
|
120
|
+
TEnvShape extends z.ZodRawShape,
|
|
121
|
+
TBuckets extends string,
|
|
122
|
+
TEvents
|
|
123
|
+
> extends ApiRateLimitContext<TEnvShape, TBuckets, TEvents> {
|
|
124
|
+
instanceId: () => Promise<string>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The answer of the body-limit slot for one path: no cap here, this cap, or (undefined) the 1 MiB default. */
|
|
128
|
+
/**
|
|
129
|
+
* A body-size cap the tool declares for a path (PRDCT-2632): the ceiling in
|
|
130
|
+
* bytes and the refusal it answers. The chassis builds the middleware from it
|
|
131
|
+
* (hono's `bodyLimit`: a declared Content-Length over the cap is refused
|
|
132
|
+
* before a byte is read, an undeclared body is counted and cut mid-stream),
|
|
133
|
+
* and DEFERS the declared-size refusal on a route that declares a plan limit
|
|
134
|
+
* so the entitlement gate judges the size first — a metered account meets
|
|
135
|
+
* the plan refusal with its upgrade link, the cap answers only when the
|
|
136
|
+
* plan allows the size. Declare the object ONCE (the slot's factory runs
|
|
137
|
+
* once at boot; the middleware is built per object).
|
|
138
|
+
*/
|
|
139
|
+
export interface BodyCap {
|
|
140
|
+
maxBytes: number;
|
|
141
|
+
onError: (c: Context) => Response;
|
|
142
|
+
}
|
|
143
|
+
export type BodyLimitVerdict = 'exempt' | BodyCap | undefined;
|
|
144
|
+
|
|
145
|
+
/** The generic files surface's per-blob policy (SL-B1): the tool owns what references a blob. */
|
|
146
|
+
export type FilePolicy = Pick<FileRouteDeps, 'blobInUse' | 'blobReadScope'>;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The tool's WORDING of the chassis refusals that name its domain (slot 21).
|
|
150
|
+
* Not identity: these sentences say what the tool's resource is called, where
|
|
151
|
+
* the chassis only knows "a guest" and "a blob in use". Every field is the
|
|
152
|
+
* complete sentence, sent as written. REQUIRED, no chassis default.
|
|
153
|
+
*/
|
|
154
|
+
export interface ToolCopy {
|
|
155
|
+
/** 403 `guest_forbidden`, from both sources: the `requireNonGuest()` guard and the workspace creation refusal. */
|
|
156
|
+
guestForbidden: string;
|
|
157
|
+
/** 403 `guest_target`: the credential mints under `/members` refuse a guest target. */
|
|
158
|
+
guestTarget: string;
|
|
159
|
+
/** 409 `file_in_use`: the message of `DELETE /files/{id}` when the tool's `blobInUse` says yes. */
|
|
160
|
+
fileInUse: string;
|
|
161
|
+
/**
|
|
162
|
+
* The words of the account mails that are the tool's own. The layout
|
|
163
|
+
* (email/shell.ts) and every other sentence of those five mails are the
|
|
164
|
+
* chassis's; these three say what the tool IS, which the chassis cannot know.
|
|
165
|
+
*/
|
|
166
|
+
mail: {
|
|
167
|
+
/** One line under the footer's name: what this product is. */
|
|
168
|
+
tagline: string;
|
|
169
|
+
/** Workspace invitation, the sentence after "…a workspace on <name>.": what joining gives. */
|
|
170
|
+
invitePitch: string;
|
|
171
|
+
/** Workspace invitation's inbox preview, the end of "Join <workspace> on <name>: …". */
|
|
172
|
+
invitePreheader: string;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export interface ToolApiSlots<TEnvShape extends z.ZodRawShape, TDomain, TBuckets extends string, TEvents> {
|
|
177
|
+
/**
|
|
178
|
+
* Origins that are never trusted (slot 9). ONE source for both the
|
|
179
|
+
* cross-site guard's `deniedOrigins` and Better Auth's `untrustedOrigins`.
|
|
180
|
+
* Empty = nothing installed.
|
|
181
|
+
*/
|
|
182
|
+
untrustedOrigins?: (env: ToolEnv<TEnvShape>) => string[];
|
|
183
|
+
/** Paths the cross-site guard lets through (slot 10): token-authed, cookie-less surfaces only. */
|
|
184
|
+
csrfExempt?: (path: string) => boolean;
|
|
185
|
+
/** Paths exempt from the generic audit row (slot 10), beside the chassis ones. */
|
|
186
|
+
auditExempt?: (path: string) => boolean;
|
|
187
|
+
/** The tool's Idempotency-Key targets (POST only), beside the chassis ones. */
|
|
188
|
+
idempotencyTargets?: (path: string) => boolean;
|
|
189
|
+
/** Positional hook (slot 11): right after `noStoreAuthenticated()`, before the body caps. */
|
|
190
|
+
early?: (api: OpenAPIHono, ctx: ApiContext<TEnvShape, TBuckets, TEvents>) => void;
|
|
191
|
+
/**
|
|
192
|
+
* Body-size caps (slot 12). Called ONCE at registration (build the limit
|
|
193
|
+
* middlewares here, never per request); the returned function is consulted
|
|
194
|
+
* per request AFTER the chassis `/files` rule and BEFORE the 1 MiB default.
|
|
195
|
+
*/
|
|
196
|
+
bodyLimit?: (ctx: ApiContext<TEnvShape, TBuckets, TEvents>) => (path: string) => BodyLimitVerdict;
|
|
197
|
+
/** Paths exempt from the JSON nesting cap (slot 13): bodies that are never parsed. */
|
|
198
|
+
jsonDepthExempt?: (path: string) => boolean;
|
|
199
|
+
/** Positional hook (slot 14): between the `/invitations/*` walls and the `/admin/break-glass/*` wall. */
|
|
200
|
+
rateLimits?: (api: OpenAPIHono, ctx: ApiRateLimitContext<TEnvShape, TBuckets, TEvents>) => void;
|
|
201
|
+
/**
|
|
202
|
+
* The files routes' blob policy (slot 15). REQUIRED: what references a blob,
|
|
203
|
+
* and who may read one, is the tool's to state — the chassis has no default
|
|
204
|
+
* (a blob read is never authorized on `workspace_id` alone, SL-B1).
|
|
205
|
+
*/
|
|
206
|
+
filePolicy: (tool: TDomain) => FilePolicy;
|
|
207
|
+
/**
|
|
208
|
+
* The tool's entries of `GET /workspace/export` (slot 15b). OPTIONAL: absent,
|
|
209
|
+
* the bundle is the chassis sections and the blobs, byte for byte. Called
|
|
210
|
+
* ONCE at registration with the tool's domain; the returned function runs
|
|
211
|
+
* per export, with the handle the route reads with (`db`, not a transaction)
|
|
212
|
+
* and the workspace id, and filters on that workspace ITSELF. Each entry is
|
|
213
|
+
* written as `<sanitized name>.json`, after `files.json` and before the
|
|
214
|
+
* blobs, in the order returned; an empty list writes nothing. Every entry is
|
|
215
|
+
* computed before the first byte: a throw, a name of
|
|
216
|
+
* `RESERVED_EXPORT_ENTRY_NAMES` or the same name twice answers 500, never a
|
|
217
|
+
* truncated zip. The manifest does not list them. Select the columns to
|
|
218
|
+
* export: a secret left in a row leaves the instance.
|
|
219
|
+
*/
|
|
220
|
+
exportEntries?: (tool: TDomain) => ExportEntriesFn;
|
|
221
|
+
/**
|
|
222
|
+
* Positional hook (slot 16): AFTER the files routes, BEFORE the OpenAPI
|
|
223
|
+
* document and the JSON 404. The tool keeps its own internal order.
|
|
224
|
+
*/
|
|
225
|
+
routes?: (api: OpenAPIHono, ctx: ApiRoutesContext<TEnvShape, TBuckets, TEvents>, tool: TDomain) => void;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export interface ToolAppSlots<TEnvShape extends z.ZodRawShape, TDomain, TBuckets extends string, TEvents> {
|
|
229
|
+
/**
|
|
230
|
+
* Positional hook (slot 17): after the metrics middleware, before `onError`
|
|
231
|
+
* and every mount. Return undefined to install NOTHING.
|
|
232
|
+
*/
|
|
233
|
+
rootMiddleware?: (env: ToolEnv<TEnvShape>) => MiddlewareHandler | undefined;
|
|
234
|
+
/** Extra `frame-src` origins of the dashboard CSP (slot 18). */
|
|
235
|
+
cspFrameSrc?: (env: ToolEnv<TEnvShape>) => string[];
|
|
236
|
+
/** Extra `img-src` sources of the dashboard CSP (slot 18, the same place): `blob:` for a dashboard that shows images it fetched through the API. */
|
|
237
|
+
cspImgSrc?: (env: ToolEnv<TEnvShape>) => string[];
|
|
238
|
+
/** A public Hono app (slot 19), mounted after well-known, before static and the SPA fallback. */
|
|
239
|
+
publicRoutes?: (core: PlatformCore<TEnvShape, TBuckets, TEvents, never>, tool: TDomain) => Hono;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export interface ToolDefinition<
|
|
243
|
+
TEnvShape extends z.ZodRawShape,
|
|
244
|
+
TDomain,
|
|
245
|
+
TBuckets extends string = never,
|
|
246
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
247
|
+
TEvents = {},
|
|
248
|
+
TToolOverrides = never
|
|
249
|
+
> {
|
|
250
|
+
/**
|
|
251
|
+
* Slot 0: the tool's identity, the ONE value that names it (`ToolIdentity`,
|
|
252
|
+
* written in the tool's contract package). REQUIRED, and the chassis has no
|
|
253
|
+
* default for any of its fields: a tool that leaves one out fails to compile,
|
|
254
|
+
* and fails to boot (`assertToolIdentity`).
|
|
255
|
+
*/
|
|
256
|
+
identity: ToolIdentity;
|
|
257
|
+
/** Slot 1: facts of the APP's packaging, computed from the app's own entry file. */
|
|
258
|
+
runtime: {
|
|
259
|
+
/** The tool's package version: the default of APP_VERSION. */
|
|
260
|
+
version: string;
|
|
261
|
+
/** Resolves the committed migrations folder; throws when none exists. Called once, at the migration stage. */
|
|
262
|
+
findMigrationsDir: () => string;
|
|
263
|
+
/** Directory holding the built dashboard SPA. */
|
|
264
|
+
publicDir: string;
|
|
265
|
+
};
|
|
266
|
+
/** Slot 2: the pool + drizzle handle over the tool's merged schema. */
|
|
267
|
+
db: (url: string) => DbHandle;
|
|
268
|
+
/** Slot 3: the tool's own environment keys, merged into the chassis schema. */
|
|
269
|
+
env?: EnvExtension<TEnvShape>;
|
|
270
|
+
/** Slot 4: the scope vocabulary and the machine allowlist. */
|
|
271
|
+
scopes: {
|
|
272
|
+
/** The published OAuth scope list (order included). */
|
|
273
|
+
oauth: readonly string[];
|
|
274
|
+
/** The CLI key's fixed grant. */
|
|
275
|
+
cliKey: readonly string[];
|
|
276
|
+
/** The composed fail-closed allowlist: chassis rules first, then the tool's; null = 403. */
|
|
277
|
+
requiredScopeFor: (path: string, method: string) => string | null;
|
|
278
|
+
/** The generic routes that carry the tool's scopes or wording (`defineChassisRoutes(contract, identity, copy)`). */
|
|
279
|
+
contractRoutes: ScopeRoutes;
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* Slot 5 (and 6): called ONCE, right after the storage probe and before the
|
|
283
|
+
* rate limiters and the auth-dependent assembly. The returned object is
|
|
284
|
+
* `BootResult.tool`. A tool subscribes to `core.events` here.
|
|
285
|
+
*/
|
|
286
|
+
services: (core: ServiceCore<TEnvShape, TEvents, TToolOverrides>) => TDomain;
|
|
287
|
+
/** Slot 7: declared BEFORE the pg-boss install lock opens; handlers read the domain lazily. */
|
|
288
|
+
jobs?: (ctx: JobsContext<TEnvShape, TDomain>) => JobDeclaration[];
|
|
289
|
+
/** Slot 8: extra named buckets built by the chassis factory. */
|
|
290
|
+
rateLimiters?: ToolBuckets<TBuckets>;
|
|
291
|
+
/** Slots 9-16. */
|
|
292
|
+
api: ToolApiSlots<TEnvShape, TDomain, TBuckets, TEvents>;
|
|
293
|
+
/** Slots 17-19. */
|
|
294
|
+
app?: ToolAppSlots<TEnvShape, TDomain, TBuckets, TEvents>;
|
|
295
|
+
/**
|
|
296
|
+
* Slot 20: the MCP definition. (The server's name, the tool names' prefix and
|
|
297
|
+
* the name of an instance that is not set up yet come from `identity`.)
|
|
298
|
+
*/
|
|
299
|
+
mcp: McpToolDefinition;
|
|
300
|
+
/** Slot 21: the tool's wording of the chassis refusals that name its domain. */
|
|
301
|
+
copy: ToolCopy;
|
|
302
|
+
/**
|
|
303
|
+
* Slot 23: the tool's half of a member's removal (PRDCT-2816). The chassis
|
|
304
|
+
* deletes the person's project grants and team seats; what the TOOL hangs
|
|
305
|
+
* on a person in a workspace (an invite waiting for them, a grant on one of
|
|
306
|
+
* its resources) is ended here, in the same transaction, on both editions:
|
|
307
|
+
* `POST /members/{id}/remove` and the hub reconcile's sweep call it. A tool
|
|
308
|
+
* with nothing of the kind leaves the slot out.
|
|
309
|
+
*/
|
|
310
|
+
membershipRemoval?: MembershipRemovalHook;
|
|
311
|
+
/**
|
|
312
|
+
* Slot 24: the tool's own API routes a session opened by a demo link is
|
|
313
|
+
* refused, appended to `DEMO_SESSION_REFUSED_API_ROUTES` at the one mount
|
|
314
|
+
* (`api/create-api.ts`), the same 403 `demo_session`. A pass's session is a
|
|
315
|
+
* visit: a product route that answers a credential (an invite link, a claim
|
|
316
|
+
* link, a key) joins this list, and the tool's own contract walk test fails
|
|
317
|
+
* on one that does not. Absent = the chassis list alone.
|
|
318
|
+
*/
|
|
319
|
+
demoSessionRefusedRoutes?: readonly DemoSessionRefusedApiRoute[];
|
|
320
|
+
/**
|
|
321
|
+
* Slot 22: the billing rail's declarations (the pay-per-use billing rail
|
|
322
|
+
* spec, §7 and §8b) — the priced actions with their default credits, the
|
|
323
|
+
* limits and the features per tier, and the routes that carry a meter, a
|
|
324
|
+
* limit or a feature (declared ONCE, in the tool's contract, beside the
|
|
325
|
+
* route). A function of the environment so an oss value can be the
|
|
326
|
+
* operator's env cap. Shown on `GET /instance`; enforced by the chassis'
|
|
327
|
+
* one entitlement gate, after the scope gate and before the handler.
|
|
328
|
+
* Absent = nothing declared: no route gated, empty lists in discovery.
|
|
329
|
+
*/
|
|
330
|
+
entitlements?: (env: ToolEnv<TEnvShape>, ctx: EntitlementsContext<TDomain>) => ToolEntitlementDeclaration;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* What the `entitlements` slot receives beside the env (PRDCT-2634): the
|
|
335
|
+
* database and the domain, LATE-BOUND like the jobs slot's, because the slot
|
|
336
|
+
* runs before `services` and an `actor` hook of an anonymous surface (a form
|
|
337
|
+
* response through a share link: the share secret → the deck → its owner →
|
|
338
|
+
* the owner's workspace and account) resolves at REQUEST time through the
|
|
339
|
+
* domain's own services. Read `getTool()` inside the hook, never at
|
|
340
|
+
* declaration time.
|
|
341
|
+
*/
|
|
342
|
+
export interface EntitlementsContext<TDomain> {
|
|
343
|
+
db: Db;
|
|
344
|
+
/** The `services` result, or null until that slot has run. Read it at RUN time, inside a hook. */
|
|
345
|
+
getTool: () => TDomain | null;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/** Test seams only — production boot never passes overrides. */
|
|
349
|
+
export interface BootOverrides<TToolOverrides = never> {
|
|
350
|
+
/** Downstream sink the pg-boss worker hands batches to (default: no-op on oss, the hub poster on cloud). */
|
|
351
|
+
usageDownstream?: UsageDownstream;
|
|
352
|
+
/**
|
|
353
|
+
* The usage queue's retry budget (`retryLimit`, `retryDelay` in seconds,
|
|
354
|
+
* exponential backoff) and the hold before a held batch is re-driven:
|
|
355
|
+
* production runs ten retries from thirty seconds, about eight hours in
|
|
356
|
+
* all, then holds and re-drives hourly; a test shrinks them to watch a
|
|
357
|
+
* retried or a held batch land in milliseconds.
|
|
358
|
+
*/
|
|
359
|
+
usageRetry?: Partial<UsageRetry>;
|
|
360
|
+
/** Shrinks the entitlement profile cache dials (30 s TTL, 15 min stale window) for the cloud tests. */
|
|
361
|
+
entitlementDials?: Partial<EntitlementProfileDials>;
|
|
362
|
+
/**
|
|
363
|
+
* Shrinks the credit check dials (30 s allowed / 5 s denied cache, 15 min
|
|
364
|
+
* fail-open window, 5 s hub budget, entitlements/check.ts) for the cloud
|
|
365
|
+
* tests. Production always runs the fixed defaults.
|
|
366
|
+
*/
|
|
367
|
+
entitlementCheckDials?: Partial<CreditCheckDials> | undefined;
|
|
368
|
+
/**
|
|
369
|
+
* Replaces the env-derived email driver. Exists because change-email tokens
|
|
370
|
+
* are stateless JWTs (never stored) — tests can only observe them by
|
|
371
|
+
* recording the outbound mail.
|
|
372
|
+
*/
|
|
373
|
+
email?: EmailDriver;
|
|
374
|
+
/**
|
|
375
|
+
* Shrinks the live-federation dials (reconcile TTL / stale window /
|
|
376
|
+
* timeouts, identity/hub-reconcile.ts) so integration tests can watch
|
|
377
|
+
* suspension/removal/grant-death propagate in milliseconds. Production
|
|
378
|
+
* always runs the fixed defaults.
|
|
379
|
+
*/
|
|
380
|
+
hubDials?: Partial<HubFederationDials>;
|
|
381
|
+
/**
|
|
382
|
+
* The hub reconciler's clock (its TTL, retry throttle and team-list
|
|
383
|
+
* window, identity/hub-reconcile.ts), so a test moves time forward
|
|
384
|
+
* instead of sleeping against those windows. Production always reads
|
|
385
|
+
* `Date.now`.
|
|
386
|
+
*/
|
|
387
|
+
hubNow?: () => number;
|
|
388
|
+
/**
|
|
389
|
+
* Replaces the ONE hub call POST /workspaces makes on cloud
|
|
390
|
+
* (`HubUserClient.createOrg`) — the function boundary its tests fake to
|
|
391
|
+
* drive every hub answer without a hub. Ignored on oss.
|
|
392
|
+
*/
|
|
393
|
+
hubCreateOrg?: HubOrgCreator;
|
|
394
|
+
/** The tool's own test seams, handed to its `services` slot as `core.overrides`. */
|
|
395
|
+
tool?: TToolOverrides;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
export interface BootResult<
|
|
399
|
+
TEnvShape extends z.ZodRawShape,
|
|
400
|
+
TDomain,
|
|
401
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
402
|
+
TEvents = {}
|
|
403
|
+
> {
|
|
404
|
+
app: Hono;
|
|
405
|
+
env: ToolEnv<TEnvShape>;
|
|
406
|
+
logger: Logger;
|
|
407
|
+
state: RuntimeState;
|
|
408
|
+
db: DbHandle;
|
|
409
|
+
auth: Auth;
|
|
410
|
+
/** What the tool's `services` slot returned. */
|
|
411
|
+
tool: TDomain;
|
|
412
|
+
registry: PlatformRegistry<TEvents>;
|
|
413
|
+
jobs: Jobs;
|
|
414
|
+
email: EmailDriver;
|
|
415
|
+
otel: Otel;
|
|
416
|
+
authSecret: string;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* The boot-time half of "identity is required": a definition that reached the
|
|
421
|
+
* chassis untyped (plain JS, a cast) with a field missing or empty stops the
|
|
422
|
+
* boot here, naming the field. Never a silent fallback name.
|
|
423
|
+
*/
|
|
424
|
+
export function assertToolCopy(copy: ToolCopy | undefined): asserts copy is ToolCopy {
|
|
425
|
+
if (!copy) throw new Error('tool definition: the `copy` slot is required');
|
|
426
|
+
for (const name of ['guestForbidden', 'guestTarget', 'fileInUse'] as const) {
|
|
427
|
+
if (typeof copy[name] !== 'string' || copy[name] === '') {
|
|
428
|
+
throw new Error(`tool definition: copy.${name} is required (a non-empty sentence)`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
for (const name of ['tagline', 'invitePitch', 'invitePreheader'] as const) {
|
|
432
|
+
if (typeof copy.mail?.[name] !== 'string' || copy.mail[name] === '') {
|
|
433
|
+
throw new Error(`tool definition: copy.mail.${name} is required (non-empty words)`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export function assertToolIdentity(identity: ToolIdentity | undefined): asserts identity is ToolIdentity {
|
|
439
|
+
if (!identity) throw new Error('tool definition: the `identity` slot is required');
|
|
440
|
+
const i = identity as unknown as Record<string, Record<string, unknown> | undefined> &
|
|
441
|
+
Record<string, unknown>;
|
|
442
|
+
const fields: Array<[string, unknown]> = [
|
|
443
|
+
['slug', i.slug],
|
|
444
|
+
['displayName', i.displayName],
|
|
445
|
+
['apiKeyPrefix', i.apiKeyPrefix],
|
|
446
|
+
['scopes.read', i.scopes?.read],
|
|
447
|
+
['scopes.write', i.scopes?.write],
|
|
448
|
+
['scopes.dataExport', i.scopes?.dataExport],
|
|
449
|
+
['cliKeyScopesLabel', i.cliKeyScopesLabel],
|
|
450
|
+
['cli.bin', i.cli?.bin],
|
|
451
|
+
['cli.envPrefix', i.cli?.envPrefix],
|
|
452
|
+
['cli.legacyConfigDir', i.cli?.legacyConfigDir],
|
|
453
|
+
['mcp.serverName', i.mcp?.serverName],
|
|
454
|
+
['mcp.toolPrefix', i.mcp?.toolPrefix],
|
|
455
|
+
['otelServiceName', i.otelServiceName],
|
|
456
|
+
['imageName', i.imageName]
|
|
457
|
+
];
|
|
458
|
+
for (const [name, value] of fields) {
|
|
459
|
+
if (typeof value !== 'string' || value === '') {
|
|
460
|
+
throw new Error(`tool definition: identity.${name} is required (a non-empty string)`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { constantTimeEquals } from '../constant-time.js';
|
|
2
|
+
export {
|
|
3
|
+
createdAtText,
|
|
4
|
+
cursorRowId,
|
|
5
|
+
decodeKeysetCursor,
|
|
6
|
+
encodeKeysetCursor,
|
|
7
|
+
isUuid,
|
|
8
|
+
keysetBefore,
|
|
9
|
+
keysetBeforeValue,
|
|
10
|
+
pageOf,
|
|
11
|
+
type KeysetValueCursor
|
|
12
|
+
} from '../pagination.js';
|
|
13
|
+
export { routeLabel } from '../route-label.js';
|
|
14
|
+
export { clearGeneratedSetupToken, resolveAuthSecret, resolveSetupToken } from '../secret.js';
|
|
15
|
+
export { isSecureSetupOrigin } from '../setup-transport.js';
|
|
16
|
+
export { type RuntimeState, createRuntimeState } from '../state.js';
|
|
17
|
+
export { apiError } from '../api/errors.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
--# Chassis test fixture (PRDCT-2544). It mirrors the onboarding backfill migration of
|
|
2
|
+
--# the product this chassis was extracted from: every line below this header is that
|
|
3
|
+
--# migration, byte for byte. The chassis owns this copy, so its suite names no tool
|
|
4
|
+
--# migration file; the product keeps a test that the two stay equal.
|
|
5
|
+
-- SL-6 backfill: every user existing at deploy is marked already-dismissed —
|
|
6
|
+
-- the first-run welcome belongs to users whose FIRST login happens after
|
|
7
|
+
-- this ships; nobody gets a retroactive banner. New users get their row
|
|
8
|
+
-- (dismissed_at NULL = welcome owed) from the login path's lazy insert.
|
|
9
|
+
-- ON CONFLICT keeps the backfill re-runnable and never clobbers a row the
|
|
10
|
+
-- login path already wrote.
|
|
11
|
+
INSERT INTO "user_onboarding" ("user_id", "first_login_at", "dismissed_at")
|
|
12
|
+
SELECT "id", now(), now() FROM "user"
|
|
13
|
+
ON CONFLICT ("user_id") DO NOTHING;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
--# Chassis test fixture (PRDCT-2544). It mirrors the operator user id migration of the
|
|
2
|
+
--# product this chassis was extracted from: everything below this header is that
|
|
3
|
+
--# migration's part after its first statement breakpoint (the backfill, not the ALTER),
|
|
4
|
+
--# byte for byte. The chassis owns this copy, so its suite names no tool migration file;
|
|
5
|
+
--# the product keeps a test that the two stay equal.
|
|
6
|
+
|
|
7
|
+
UPDATE "instance_settings" s
|
|
8
|
+
SET "operator_user_id" = g.owner_id
|
|
9
|
+
FROM (
|
|
10
|
+
SELECT (metadata->>'ownerUserId') AS owner_id
|
|
11
|
+
FROM "audit_log"
|
|
12
|
+
WHERE action = 'instance.setup'
|
|
13
|
+
ORDER BY created_at ASC
|
|
14
|
+
LIMIT 1
|
|
15
|
+
) g
|
|
16
|
+
WHERE s."operator_user_id" IS NULL
|
|
17
|
+
AND g.owner_id IS NOT NULL
|
|
18
|
+
AND EXISTS (SELECT 1 FROM "user" u WHERE u.id = g.owner_id);
|