@cosmicdrift/kumiko-framework 0.328.0 → 0.329.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/dist/api/anonymous-cookie.d.ts +8 -0
- package/dist/api/anonymous-cookie.js +40 -0
- package/dist/api/api-constants.d.ts +47 -0
- package/dist/api/api-constants.js +136 -0
- package/dist/api/auth-middleware.d.ts +42 -0
- package/dist/api/auth-middleware.js +450 -0
- package/dist/api/auth-routes.d.ts +83 -0
- package/dist/api/auth-routes.js +1003 -0
- package/dist/api/client-ip.d.ts +15 -0
- package/dist/api/client-ip.js +101 -0
- package/dist/api/csrf-middleware.d.ts +9 -0
- package/dist/api/csrf-middleware.js +67 -0
- package/dist/api/extra-route.d.ts +99 -0
- package/dist/api/extra-route.js +48 -0
- package/dist/api/http-cache.d.ts +31 -0
- package/dist/api/http-cache.js +102 -0
- package/dist/api/index.d.ts +32 -0
- package/dist/api/index.js +20 -0
- package/dist/api/jwt.d.ts +22 -0
- package/dist/api/jwt.js +199 -0
- package/dist/api/observability-middleware.d.ts +8 -0
- package/dist/api/observability-middleware.js +68 -0
- package/dist/api/origin-middleware.d.ts +12 -0
- package/dist/api/origin-middleware.js +120 -0
- package/dist/api/pat-route-guard.d.ts +2 -0
- package/dist/api/pat-route-guard.js +43 -0
- package/dist/api/pat-scope.d.ts +2 -0
- package/dist/api/pat-scope.js +13 -0
- package/dist/api/pii-leak-guard.d.ts +2 -0
- package/dist/api/pii-leak-guard.js +40 -0
- package/dist/api/post-auth-landing.d.ts +14 -0
- package/dist/api/post-auth-landing.js +92 -0
- package/dist/api/readiness.d.ts +23 -0
- package/dist/api/readiness.js +98 -0
- package/dist/api/redis-sse-broker.d.ts +13 -0
- package/dist/api/redis-sse-broker.js +138 -0
- package/dist/api/request-context.d.ts +34 -0
- package/dist/api/request-context.js +60 -0
- package/dist/api/request-id-middleware.d.ts +37 -0
- package/dist/api/request-id-middleware.js +112 -0
- package/dist/api/route-registrars.d.ts +24 -0
- package/dist/api/route-registrars.js +133 -0
- package/dist/api/routes.d.ts +20 -0
- package/dist/api/routes.js +373 -0
- package/dist/api/server.d.ts +81 -0
- package/dist/api/server.js +1068 -0
- package/dist/api/sse-broker.d.ts +36 -0
- package/dist/api/sse-broker.js +112 -0
- package/dist/api/sse-route.d.ts +24 -0
- package/dist/api/sse-route.js +61 -0
- package/dist/api/tokens.d.ts +1 -0
- package/dist/api/tokens.js +15 -0
- package/dist/api/websocket-route.d.ts +60 -0
- package/dist/api/websocket-route.js +270 -0
- package/dist/arg-parser.d.ts +8 -0
- package/dist/arg-parser.js +59 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/roles.d.ts +16 -0
- package/dist/auth/roles.js +35 -0
- package/dist/bun-db/connection.d.ts +16 -0
- package/dist/bun-db/connection.js +54 -0
- package/dist/bun-db/index.d.ts +4 -0
- package/dist/bun-db/index.js +4 -0
- package/dist/bun-db/query.d.ts +64 -0
- package/dist/bun-db/query.js +1145 -0
- package/dist/compliance/duration-spec.d.ts +7 -0
- package/dist/compliance/duration-spec.js +37 -0
- package/dist/compliance/index.d.ts +6 -0
- package/dist/compliance/index.js +7 -0
- package/dist/compliance/override-schema.d.ts +78 -0
- package/dist/compliance/override-schema.js +124 -0
- package/dist/compliance/profiles.d.ts +125 -0
- package/dist/compliance/profiles.js +284 -0
- package/dist/compliance/sub-processors.d.ts +69 -0
- package/dist/compliance/sub-processors.js +109 -0
- package/dist/consumer-cli.d.ts +5 -0
- package/dist/consumer-cli.js +116 -0
- package/dist/crypto/blind-index.d.ts +10 -0
- package/dist/crypto/blind-index.js +97 -0
- package/dist/crypto/ciphertext-pattern.d.ts +3 -0
- package/dist/crypto/ciphertext-pattern.js +16 -0
- package/dist/crypto/event-pii.d.ts +8 -0
- package/dist/crypto/event-pii.js +79 -0
- package/dist/crypto/in-memory-kms-adapter.d.ts +11 -0
- package/dist/crypto/in-memory-kms-adapter.js +33 -0
- package/dist/crypto/index.d.ts +11 -0
- package/dist/crypto/index.js +11 -0
- package/dist/crypto/is-self-pii-field.d.ts +5 -0
- package/dist/crypto/is-self-pii-field.js +4 -0
- package/dist/crypto/kek-source.d.ts +23 -0
- package/dist/crypto/kek-source.js +122 -0
- package/dist/crypto/kms-adapter.d.ts +26 -0
- package/dist/crypto/kms-adapter.js +46 -0
- package/dist/crypto/kms-wiring.d.ts +67 -0
- package/dist/crypto/kms-wiring.js +125 -0
- package/dist/crypto/pg-kms-adapter.d.ts +55 -0
- package/dist/crypto/pg-kms-adapter.js +232 -0
- package/dist/crypto/pii-field-encryption.d.ts +20 -0
- package/dist/crypto/pii-field-encryption.js +201 -0
- package/dist/crypto/request-kms-cache.d.ts +8 -0
- package/dist/crypto/request-kms-cache.js +21 -0
- package/dist/crypto/subject-resolver.d.ts +30 -0
- package/dist/crypto/subject-resolver.js +153 -0
- package/dist/crypto/system-event-pii.d.ts +4 -0
- package/dist/crypto/system-event-pii.js +37 -0
- package/dist/db/api.d.ts +18 -0
- package/dist/db/api.js +23 -0
- package/dist/db/apply-entity-event.d.ts +21 -0
- package/dist/db/apply-entity-event.js +175 -0
- package/dist/db/assert-exists-in.d.ts +23 -0
- package/dist/db/assert-exists-in.js +34 -0
- package/dist/db/blind-index-cleanup.d.ts +5 -0
- package/dist/db/blind-index-cleanup.js +112 -0
- package/dist/db/bun-provider.d.ts +2 -0
- package/dist/db/bun-provider.js +37 -0
- package/dist/db/collect-table-metas.d.ts +3 -0
- package/dist/db/collect-table-metas.js +76 -0
- package/dist/db/compound-types.d.ts +9 -0
- package/dist/db/compound-types.js +31 -0
- package/dist/db/config-seed.d.ts +19 -0
- package/dist/db/config-seed.js +75 -0
- package/dist/db/connection.d.ts +10 -0
- package/dist/db/connection.js +35 -0
- package/dist/db/cursor.d.ts +9 -0
- package/dist/db/cursor.js +39 -0
- package/dist/db/dialect.d.ts +100 -0
- package/dist/db/dialect.js +386 -0
- package/dist/db/eagerload.d.ts +18 -0
- package/dist/db/eagerload.js +191 -0
- package/dist/db/entity-field-encryption.d.ts +15 -0
- package/dist/db/entity-field-encryption.js +127 -0
- package/dist/db/entity-table-from-registry.d.ts +4 -0
- package/dist/db/entity-table-from-registry.js +25 -0
- package/dist/db/entity-table-meta-types.d.ts +1 -0
- package/dist/db/entity-table-meta-types.js +1 -0
- package/dist/db/entity-table-meta.d.ts +30 -0
- package/dist/db/entity-table-meta.js +423 -0
- package/dist/db/event-store-executor-context.d.ts +49 -0
- package/dist/db/event-store-executor-context.js +368 -0
- package/dist/db/event-store-executor-read.d.ts +10 -0
- package/dist/db/event-store-executor-read.js +683 -0
- package/dist/db/event-store-executor-write.d.ts +3 -0
- package/dist/db/event-store-executor-write.js +705 -0
- package/dist/db/event-store-executor.d.ts +20 -0
- package/dist/db/event-store-executor.js +11 -0
- package/dist/db/feature-table-sources.d.ts +6 -0
- package/dist/db/feature-table-sources.js +24 -0
- package/dist/db/index.d.ts +37 -0
- package/dist/db/index.js +29 -0
- package/dist/db/located-timestamp.d.ts +22 -0
- package/dist/db/located-timestamp.js +100 -0
- package/dist/db/migrate-generator.d.ts +81 -0
- package/dist/db/migrate-generator.js +428 -0
- package/dist/db/migrate-runner.d.ts +30 -0
- package/dist/db/migrate-runner.js +273 -0
- package/dist/db/money.d.ts +30 -0
- package/dist/db/money.js +153 -0
- package/dist/db/parent-ref-clause.d.ts +10 -0
- package/dist/db/parent-ref-clause.js +124 -0
- package/dist/db/pg-error.d.ts +10 -0
- package/dist/db/pg-error.js +63 -0
- package/dist/db/postgres-provider.d.ts +2 -0
- package/dist/db/postgres-provider.js +21 -0
- package/dist/db/queries/advisory-lock.d.ts +3 -0
- package/dist/db/queries/advisory-lock.js +5 -0
- package/dist/db/queries/backfill-pii.d.ts +38 -0
- package/dist/db/queries/backfill-pii.js +433 -0
- package/dist/db/queries/ddl.d.ts +4 -0
- package/dist/db/queries/ddl.js +22 -0
- package/dist/db/queries/entity-read.d.ts +2 -0
- package/dist/db/queries/entity-read.js +5 -0
- package/dist/db/queries/es-ops.d.ts +5 -0
- package/dist/db/queries/es-ops.js +10 -0
- package/dist/db/queries/event-consumer.d.ts +36 -0
- package/dist/db/queries/event-consumer.js +261 -0
- package/dist/db/queries/event-store-admin.d.ts +24 -0
- package/dist/db/queries/event-store-admin.js +71 -0
- package/dist/db/queries/event-store-transfer.d.ts +20 -0
- package/dist/db/queries/event-store-transfer.js +31 -0
- package/dist/db/queries/event-store.d.ts +54 -0
- package/dist/db/queries/event-store.js +231 -0
- package/dist/db/queries/pii-backfill-state.d.ts +7 -0
- package/dist/db/queries/pii-backfill-state.js +14 -0
- package/dist/db/queries/projection-rebuild.d.ts +6 -0
- package/dist/db/queries/projection-rebuild.js +65 -0
- package/dist/db/queries/raw-sql.d.ts +9 -0
- package/dist/db/queries/raw-sql.js +16 -0
- package/dist/db/queries/seed-context.d.ts +20 -0
- package/dist/db/queries/seed-context.js +25 -0
- package/dist/db/queries/shadow-swap.d.ts +18 -0
- package/dist/db/queries/shadow-swap.js +307 -0
- package/dist/db/queries/table-ops.d.ts +4 -0
- package/dist/db/queries/table-ops.js +8 -0
- package/dist/db/queries/test-stack.d.ts +6 -0
- package/dist/db/queries/test-stack.js +20 -0
- package/dist/db/query-api.d.ts +2 -0
- package/dist/db/query-api.js +6 -0
- package/dist/db/query.d.ts +1 -0
- package/dist/db/query.js +3 -0
- package/dist/db/rebuild-marker.d.ts +4 -0
- package/dist/db/rebuild-marker.js +96 -0
- package/dist/db/reference-data.d.ts +14 -0
- package/dist/db/reference-data.js +66 -0
- package/dist/db/render-ddl.d.ts +4 -0
- package/dist/db/render-ddl.js +55 -0
- package/dist/db/replay-migration-sql.d.ts +12 -0
- package/dist/db/replay-migration-sql.js +223 -0
- package/dist/db/schema-inspection.d.ts +3 -0
- package/dist/db/schema-inspection.js +60 -0
- package/dist/db/table-builder.d.ts +194 -0
- package/dist/db/table-builder.js +430 -0
- package/dist/db/tenant-db-runner.d.ts +4 -0
- package/dist/db/tenant-db-runner.js +17 -0
- package/dist/db/tenant-db.d.ts +32 -0
- package/dist/db/tenant-db.js +501 -0
- package/dist/derivatives/delete-stored-file.d.ts +6 -0
- package/dist/derivatives/delete-stored-file.js +70 -0
- package/dist/derivatives/derivatives-context.d.ts +21 -0
- package/dist/derivatives/derivatives-context.js +212 -0
- package/dist/derivatives/field-variants.d.ts +3 -0
- package/dist/derivatives/field-variants.js +16 -0
- package/dist/derivatives/index.d.ts +6 -0
- package/dist/derivatives/index.js +4 -0
- package/dist/derivatives/variant-key.d.ts +10 -0
- package/dist/derivatives/variant-key.js +100 -0
- package/dist/engine/access.d.ts +2 -0
- package/dist/engine/access.js +25 -0
- package/dist/engine/active-membership.d.ts +26 -0
- package/dist/engine/active-membership.js +25 -0
- package/dist/engine/boot-validator/access-declarations.d.ts +2 -0
- package/dist/engine/boot-validator/access-declarations.js +148 -0
- package/dist/engine/boot-validator/access-roles.d.ts +2 -0
- package/dist/engine/boot-validator/access-roles.js +76 -0
- package/dist/engine/boot-validator/action-wiring.d.ts +3 -0
- package/dist/engine/boot-validator/action-wiring.js +104 -0
- package/dist/engine/boot-validator/api-ext.d.ts +3 -0
- package/dist/engine/boot-validator/api-ext.js +54 -0
- package/dist/engine/boot-validator/boot-check.d.ts +2 -0
- package/dist/engine/boot-validator/boot-check.js +20 -0
- package/dist/engine/boot-validator/config-deps.d.ts +10 -0
- package/dist/engine/boot-validator/config-deps.js +180 -0
- package/dist/engine/boot-validator/custom-screen-write-qns.d.ts +8 -0
- package/dist/engine/boot-validator/custom-screen-write-qns.js +75 -0
- package/dist/engine/boot-validator/detail-screens.d.ts +6 -0
- package/dist/engine/boot-validator/detail-screens.js +31 -0
- package/dist/engine/boot-validator/entity-handler.d.ts +23 -0
- package/dist/engine/boot-validator/entity-handler.js +754 -0
- package/dist/engine/boot-validator/entity-list-screens.d.ts +4 -0
- package/dist/engine/boot-validator/entity-list-screens.js +75 -0
- package/dist/engine/boot-validator/gdpr-storage.d.ts +2 -0
- package/dist/engine/boot-validator/gdpr-storage.js +48 -0
- package/dist/engine/boot-validator/global-tenancy.d.ts +2 -0
- package/dist/engine/boot-validator/global-tenancy.js +24 -0
- package/dist/engine/boot-validator/i18n-keys.d.ts +2 -0
- package/dist/engine/boot-validator/i18n-keys.js +88 -0
- package/dist/engine/boot-validator/index.d.ts +34 -0
- package/dist/engine/boot-validator/index.js +196 -0
- package/dist/engine/boot-validator/nav.d.ts +20 -0
- package/dist/engine/boot-validator/nav.js +202 -0
- package/dist/engine/boot-validator/ownership.d.ts +36 -0
- package/dist/engine/boot-validator/ownership.js +268 -0
- package/dist/engine/boot-validator/parent-ref.d.ts +3 -0
- package/dist/engine/boot-validator/parent-ref.js +73 -0
- package/dist/engine/boot-validator/pii-retention.d.ts +2 -0
- package/dist/engine/boot-validator/pii-retention.js +204 -0
- package/dist/engine/boot-validator/projection-list-screens.d.ts +4 -0
- package/dist/engine/boot-validator/projection-list-screens.js +219 -0
- package/dist/engine/boot-validator/query-output-columns.d.ts +2 -0
- package/dist/engine/boot-validator/query-output-columns.js +160 -0
- package/dist/engine/boot-validator/query-refs.d.ts +2 -0
- package/dist/engine/boot-validator/query-refs.js +72 -0
- package/dist/engine/boot-validator/record-owned.d.ts +2 -0
- package/dist/engine/boot-validator/record-owned.js +16 -0
- package/dist/engine/boot-validator/screens.d.ts +34 -0
- package/dist/engine/boot-validator/screens.js +1665 -0
- package/dist/engine/boot-validator/security-baseline.d.ts +3 -0
- package/dist/engine/boot-validator/security-baseline.js +18 -0
- package/dist/engine/boot-validator/transfer-graph.d.ts +3 -0
- package/dist/engine/boot-validator/transfer-graph.js +120 -0
- package/dist/engine/boot-validator/url-prefill-fields.d.ts +2 -0
- package/dist/engine/boot-validator/url-prefill-fields.js +106 -0
- package/dist/engine/boot-validator/workspaces.d.ts +20 -0
- package/dist/engine/boot-validator/workspaces.js +81 -0
- package/dist/engine/boot-validator/zod-shape.d.ts +5 -0
- package/dist/engine/boot-validator/zod-shape.js +110 -0
- package/dist/engine/boot-validator.d.ts +1 -0
- package/dist/engine/boot-validator.js +1 -0
- package/dist/engine/build-app-schema.d.ts +14 -0
- package/dist/engine/build-app-schema.js +494 -0
- package/dist/engine/build-config-feature-schema.d.ts +15 -0
- package/dist/engine/build-config-feature-schema.js +582 -0
- package/dist/engine/build-target.d.ts +28 -0
- package/dist/engine/build-target.js +43 -0
- package/dist/engine/changeset-changes.d.ts +12 -0
- package/dist/engine/changeset-changes.js +104 -0
- package/dist/engine/codemod/index.d.ts +2 -0
- package/dist/engine/codemod/index.js +1 -0
- package/dist/engine/codemod/pipeline-codemod.d.ts +50 -0
- package/dist/engine/codemod/pipeline-codemod.js +529 -0
- package/dist/engine/config-helpers.d.ts +42 -0
- package/dist/engine/config-helpers.js +115 -0
- package/dist/engine/constants.d.ts +52 -0
- package/dist/engine/constants.js +79 -0
- package/dist/engine/create-app.d.ts +17 -0
- package/dist/engine/create-app.js +119 -0
- package/dist/engine/cross-tenant.d.ts +3 -0
- package/dist/engine/cross-tenant.js +18 -0
- package/dist/engine/dedupe-features.d.ts +2 -0
- package/dist/engine/dedupe-features.js +36 -0
- package/dist/engine/define-feature.d.ts +7 -0
- package/dist/engine/define-feature.js +143 -0
- package/dist/engine/define-handler.d.ts +21 -0
- package/dist/engine/define-handler.js +117 -0
- package/dist/engine/define-roles.d.ts +5 -0
- package/dist/engine/define-roles.js +14 -0
- package/dist/engine/define-step.d.ts +4 -0
- package/dist/engine/define-step.js +22 -0
- package/dist/engine/define-workflow.d.ts +89 -0
- package/dist/engine/define-workflow.js +70 -0
- package/dist/engine/effective-features.d.ts +6 -0
- package/dist/engine/effective-features.js +73 -0
- package/dist/engine/embedded-derived.d.ts +29 -0
- package/dist/engine/embedded-derived.js +82 -0
- package/dist/engine/entity-handlers.d.ts +67 -0
- package/dist/engine/entity-handlers.js +567 -0
- package/dist/engine/escape-hatch-declaration.d.ts +2 -0
- package/dist/engine/escape-hatch-declaration.js +5 -0
- package/dist/engine/event-helpers.d.ts +11 -0
- package/dist/engine/event-helpers.js +47 -0
- package/dist/engine/extension-names.d.ts +164 -0
- package/dist/engine/extension-names.js +172 -0
- package/dist/engine/extension-selector-plugins.d.ts +5 -0
- package/dist/engine/extension-selector-plugins.js +14 -0
- package/dist/engine/extensions/escape-hatch-usage.d.ts +2 -0
- package/dist/engine/extensions/escape-hatch-usage.js +12 -0
- package/dist/engine/extensions/storage-provider.d.ts +4 -0
- package/dist/engine/extensions/storage-provider.js +1 -0
- package/dist/engine/extensions/tenant-data.d.ts +15 -0
- package/dist/engine/extensions/tenant-data.js +7 -0
- package/dist/engine/extensions/tenant-resource.d.ts +14 -0
- package/dist/engine/extensions/tenant-resource.js +6 -0
- package/dist/engine/extensions/user-data.d.ts +152 -0
- package/dist/engine/extensions/user-data.js +12 -0
- package/dist/engine/factories.d.ts +195 -0
- package/dist/engine/factories.js +387 -0
- package/dist/engine/feature-ast/entity-field-types.d.ts +13 -0
- package/dist/engine/feature-ast/entity-field-types.js +35 -0
- package/dist/engine/feature-ast/extractors/ai-steps.d.ts +6 -0
- package/dist/engine/feature-ast/extractors/ai-steps.js +254 -0
- package/dist/engine/feature-ast/extractors/events.d.ts +5 -0
- package/dist/engine/feature-ast/extractors/events.js +262 -0
- package/dist/engine/feature-ast/extractors/handlers.d.ts +23 -0
- package/dist/engine/feature-ast/extractors/handlers.js +319 -0
- package/dist/engine/feature-ast/extractors/hooks.d.ts +23 -0
- package/dist/engine/feature-ast/extractors/hooks.js +228 -0
- package/dist/engine/feature-ast/extractors/index.d.ts +14 -0
- package/dist/engine/feature-ast/extractors/index.js +13 -0
- package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +7 -0
- package/dist/engine/feature-ast/extractors/jobs-routes.js +141 -0
- package/dist/engine/feature-ast/extractors/projections-screens.d.ts +10 -0
- package/dist/engine/feature-ast/extractors/projections-screens.js +195 -0
- package/dist/engine/feature-ast/extractors/resolve-import.d.ts +14 -0
- package/dist/engine/feature-ast/extractors/resolve-import.js +152 -0
- package/dist/engine/feature-ast/extractors/round1.d.ts +10 -0
- package/dist/engine/feature-ast/extractors/round1.js +81 -0
- package/dist/engine/feature-ast/extractors/round2.d.ts +7 -0
- package/dist/engine/feature-ast/extractors/round2.js +158 -0
- package/dist/engine/feature-ast/extractors/round3.d.ts +22 -0
- package/dist/engine/feature-ast/extractors/round3.js +280 -0
- package/dist/engine/feature-ast/extractors/round5.d.ts +8 -0
- package/dist/engine/feature-ast/extractors/round5.js +63 -0
- package/dist/engine/feature-ast/extractors/round6.d.ts +4 -0
- package/dist/engine/feature-ast/extractors/round6.js +17 -0
- package/dist/engine/feature-ast/extractors/shared.d.ts +85 -0
- package/dist/engine/feature-ast/extractors/shared.js +326 -0
- package/dist/engine/feature-ast/index.d.ts +16 -0
- package/dist/engine/feature-ast/index.js +10 -0
- package/dist/engine/feature-ast/parse.d.ts +30 -0
- package/dist/engine/feature-ast/parse.js +464 -0
- package/dist/engine/feature-ast/patch.d.ts +207 -0
- package/dist/engine/feature-ast/patch.js +771 -0
- package/dist/engine/feature-ast/patcher.d.ts +211 -0
- package/dist/engine/feature-ast/patcher.js +277 -0
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +670 -0
- package/dist/engine/feature-ast/pattern-change-schema.js +1196 -0
- package/dist/engine/feature-ast/patterns.d.ts +302 -0
- package/dist/engine/feature-ast/patterns.js +113 -0
- package/dist/engine/feature-ast/render.d.ts +47 -0
- package/dist/engine/feature-ast/render.js +681 -0
- package/dist/engine/feature-ast/source-location.d.ts +17 -0
- package/dist/engine/feature-ast/source-location.js +27 -0
- package/dist/engine/feature-builder-state.d.ts +69 -0
- package/dist/engine/feature-builder-state.js +64 -0
- package/dist/engine/feature-changelog.d.ts +21 -0
- package/dist/engine/feature-changelog.js +76 -0
- package/dist/engine/feature-config-events-jobs.d.ts +58 -0
- package/dist/engine/feature-config-events-jobs.js +318 -0
- package/dist/engine/feature-entity-handlers.d.ts +38 -0
- package/dist/engine/feature-entity-handlers.js +185 -0
- package/dist/engine/feature-manifest.d.ts +73 -0
- package/dist/engine/feature-manifest.js +87 -0
- package/dist/engine/feature-ui-extensions.d.ts +68 -0
- package/dist/engine/feature-ui-extensions.js +488 -0
- package/dist/engine/field-access.d.ts +4 -0
- package/dist/engine/field-access.js +119 -0
- package/dist/engine/field-helpers.d.ts +4 -0
- package/dist/engine/field-helpers.js +28 -0
- package/dist/engine/handler-helpers.d.ts +19 -0
- package/dist/engine/handler-helpers.js +24 -0
- package/dist/engine/hook-helpers.d.ts +4 -0
- package/dist/engine/hook-helpers.js +13 -0
- package/dist/engine/i18n-key.d.ts +2 -0
- package/dist/engine/i18n-key.js +10 -0
- package/dist/engine/index.d.ts +77 -0
- package/dist/engine/index.js +70 -0
- package/dist/engine/instruction-fields.d.ts +2 -0
- package/dist/engine/instruction-fields.js +9 -0
- package/dist/engine/membership-roles.d.ts +5 -0
- package/dist/engine/membership-roles.js +48 -0
- package/dist/engine/object-form.d.ts +4 -0
- package/dist/engine/object-form.js +21 -0
- package/dist/engine/ownership.d.ts +12 -0
- package/dist/engine/ownership.js +339 -0
- package/dist/engine/parse-ref-target.d.ts +6 -0
- package/dist/engine/parse-ref-target.js +21 -0
- package/dist/engine/pattern-library/index.d.ts +2 -0
- package/dist/engine/pattern-library/index.js +3 -0
- package/dist/engine/pattern-library/library.d.ts +14 -0
- package/dist/engine/pattern-library/library.js +92 -0
- package/dist/engine/pattern-library/mixed-schemas.d.ts +16 -0
- package/dist/engine/pattern-library/mixed-schemas.js +569 -0
- package/dist/engine/pattern-library/opaque-schemas.d.ts +7 -0
- package/dist/engine/pattern-library/opaque-schemas.js +115 -0
- package/dist/engine/pattern-library/shared-fields.d.ts +120 -0
- package/dist/engine/pattern-library/shared-fields.js +71 -0
- package/dist/engine/pattern-library/static-schemas.d.ts +19 -0
- package/dist/engine/pattern-library/static-schemas.js +435 -0
- package/dist/engine/pattern-library/types.d.ts +158 -0
- package/dist/engine/pattern-library/types.js +36 -0
- package/dist/engine/personal-data-fields.d.ts +5 -0
- package/dist/engine/personal-data-fields.js +56 -0
- package/dist/engine/pipeline.d.ts +4 -0
- package/dist/engine/pipeline.js +87 -0
- package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
- package/dist/engine/project-app-schema-for-roles.js +679 -0
- package/dist/engine/projection-helpers.d.ts +7 -0
- package/dist/engine/projection-helpers.js +61 -0
- package/dist/engine/qualified-name.d.ts +27 -0
- package/dist/engine/qualified-name.js +137 -0
- package/dist/engine/read-claim.d.ts +2 -0
- package/dist/engine/read-claim.js +28 -0
- package/dist/engine/registry-facade.d.ts +3 -0
- package/dist/engine/registry-facade.js +231 -0
- package/dist/engine/registry-ingest.d.ts +14 -0
- package/dist/engine/registry-ingest.js +415 -0
- package/dist/engine/registry-state.d.ts +93 -0
- package/dist/engine/registry-state.js +233 -0
- package/dist/engine/registry-validate.d.ts +25 -0
- package/dist/engine/registry-validate.js +669 -0
- package/dist/engine/registry.d.ts +2 -0
- package/dist/engine/registry.js +52 -0
- package/dist/engine/resolve-config-or-param.d.ts +18 -0
- package/dist/engine/resolve-config-or-param.js +76 -0
- package/dist/engine/role-assignment.d.ts +1 -0
- package/dist/engine/role-assignment.js +58 -0
- package/dist/engine/run-in.d.ts +2 -0
- package/dist/engine/run-in.js +28 -0
- package/dist/engine/run-pipeline.d.ts +25 -0
- package/dist/engine/run-pipeline.js +111 -0
- package/dist/engine/schema-builder.d.ts +8 -0
- package/dist/engine/schema-builder.js +406 -0
- package/dist/engine/screen-filter-ops.d.ts +3 -0
- package/dist/engine/screen-filter-ops.js +55 -0
- package/dist/engine/screen-helpers.d.ts +27 -0
- package/dist/engine/screen-helpers.js +100 -0
- package/dist/engine/soft-delete-cleanup.d.ts +10 -0
- package/dist/engine/soft-delete-cleanup.js +114 -0
- package/dist/engine/state-machine.d.ts +34 -0
- package/dist/engine/state-machine.js +44 -0
- package/dist/engine/steps/_duration-utils.d.ts +1 -0
- package/dist/engine/steps/_duration-utils.js +28 -0
- package/dist/engine/steps/_event-match.d.ts +2 -0
- package/dist/engine/steps/_event-match.js +88 -0
- package/dist/engine/steps/_no-return-guard.d.ts +2 -0
- package/dist/engine/steps/_no-return-guard.js +16 -0
- package/dist/engine/steps/_read-source.d.ts +6 -0
- package/dist/engine/steps/_read-source.js +7 -0
- package/dist/engine/steps/_resolver-utils.d.ts +11 -0
- package/dist/engine/steps/_resolver-utils.js +36 -0
- package/dist/engine/steps/_step-dispatch-constants.d.ts +13 -0
- package/dist/engine/steps/_step-dispatch-constants.js +32 -0
- package/dist/engine/steps/aggregate-append-event.d.ts +10 -0
- package/dist/engine/steps/aggregate-append-event.js +43 -0
- package/dist/engine/steps/aggregate-create.d.ts +6 -0
- package/dist/engine/steps/aggregate-create.js +38 -0
- package/dist/engine/steps/aggregate-update.d.ts +10 -0
- package/dist/engine/steps/aggregate-update.js +38 -0
- package/dist/engine/steps/branch.d.ts +8 -0
- package/dist/engine/steps/branch.js +66 -0
- package/dist/engine/steps/call-feature.d.ts +7 -0
- package/dist/engine/steps/call-feature.js +30 -0
- package/dist/engine/steps/compute.d.ts +2 -0
- package/dist/engine/steps/compute.js +29 -0
- package/dist/engine/steps/describe-workflow-step-error.d.ts +1 -0
- package/dist/engine/steps/describe-workflow-step-error.js +6 -0
- package/dist/engine/steps/for-each.d.ts +9 -0
- package/dist/engine/steps/for-each.js +88 -0
- package/dist/engine/steps/mail-send.d.ts +10 -0
- package/dist/engine/steps/mail-send.js +33 -0
- package/dist/engine/steps/read-find-many.d.ts +10 -0
- package/dist/engine/steps/read-find-many.js +32 -0
- package/dist/engine/steps/read-find-one.d.ts +9 -0
- package/dist/engine/steps/read-find-one.js +41 -0
- package/dist/engine/steps/retry.d.ts +9 -0
- package/dist/engine/steps/retry.js +76 -0
- package/dist/engine/steps/return.d.ts +4 -0
- package/dist/engine/steps/return.js +25 -0
- package/dist/engine/steps/unsafe-projection-delete.d.ts +8 -0
- package/dist/engine/steps/unsafe-projection-delete.js +35 -0
- package/dist/engine/steps/unsafe-projection-upsert.d.ts +8 -0
- package/dist/engine/steps/unsafe-projection-upsert.js +73 -0
- package/dist/engine/steps/wait-for-event.d.ts +8 -0
- package/dist/engine/steps/wait-for-event.js +63 -0
- package/dist/engine/steps/wait.d.ts +6 -0
- package/dist/engine/steps/wait.js +50 -0
- package/dist/engine/steps/webhook-send.d.ts +24 -0
- package/dist/engine/steps/webhook-send.js +38 -0
- package/dist/engine/system-user.d.ts +8 -0
- package/dist/engine/system-user.js +29 -0
- package/dist/engine/tier-resolver-extension.d.ts +62 -0
- package/dist/engine/tier-resolver-extension.js +55 -0
- package/dist/engine/types/config.d.ts +1 -0
- package/dist/engine/types/config.js +1 -0
- package/dist/engine/types/define-handler.d.ts +1 -0
- package/dist/engine/types/define-handler.js +1 -0
- package/dist/engine/types/entity-handlers.d.ts +1 -0
- package/dist/engine/types/entity-handlers.js +1 -0
- package/dist/engine/types/event-type-map.js +1 -0
- package/dist/engine/types/extension-options-map.js +1 -0
- package/dist/engine/types/feature.d.ts +1 -0
- package/dist/engine/types/feature.js +1 -0
- package/dist/engine/types/fields.d.ts +1 -0
- package/dist/engine/types/fields.js +1 -0
- package/dist/engine/types/handlers.d.ts +2 -0
- package/dist/engine/types/handlers.js +1 -0
- package/dist/engine/types/hooks.d.ts +1 -0
- package/dist/engine/types/hooks.js +1 -0
- package/dist/engine/types/http-route.js +1 -0
- package/dist/engine/types/identifiers.js +1 -0
- package/dist/engine/types/index.d.ts +30 -0
- package/dist/engine/types/index.js +10 -0
- package/dist/engine/types/nav.d.ts +1 -0
- package/dist/engine/types/nav.js +1 -0
- package/dist/engine/types/ownership.d.ts +1 -0
- package/dist/engine/types/ownership.js +1 -0
- package/dist/engine/types/projection.d.ts +1 -0
- package/dist/engine/types/projection.js +1 -0
- package/dist/engine/types/relations.js +1 -0
- package/dist/engine/types/screen.d.ts +2 -0
- package/dist/engine/types/screen.js +1 -0
- package/dist/engine/types/step.d.ts +1 -0
- package/dist/engine/types/step.js +1 -0
- package/dist/engine/types/target-ref.js +1 -0
- package/dist/engine/types/tree-node.js +1 -0
- package/dist/engine/types/workspace.d.ts +1 -0
- package/dist/engine/types/workspace.js +1 -0
- package/dist/engine/validate-projection-allowlist.d.ts +10 -0
- package/dist/engine/validate-projection-allowlist.js +164 -0
- package/dist/engine/validation.d.ts +3 -0
- package/dist/engine/validation.js +23 -0
- package/dist/engine/where-rule-lint.d.ts +2 -0
- package/dist/engine/where-rule-lint.js +171 -0
- package/dist/engine/write-handler-qn-extract.d.ts +15 -0
- package/dist/engine/write-handler-qn-extract.js +36 -0
- package/dist/entrypoint/index.d.ts +83 -0
- package/dist/entrypoint/index.js +312 -0
- package/dist/env/_zod-introspect.d.ts +17 -0
- package/dist/env/_zod-introspect.js +35 -0
- package/dist/env/dry-run.d.ts +13 -0
- package/dist/env/dry-run.js +158 -0
- package/dist/env/index.d.ts +98 -0
- package/dist/env/index.js +313 -0
- package/dist/errors/classes.d.ts +109 -0
- package/dist/errors/classes.js +190 -0
- package/dist/errors/field-issue.d.ts +6 -0
- package/dist/errors/field-issue.js +1 -0
- package/dist/errors/index.d.ts +15 -0
- package/dist/errors/index.js +9 -0
- package/dist/errors/kumiko-error.d.ts +25 -0
- package/dist/errors/kumiko-error.js +43 -0
- package/dist/errors/member-resolution.d.ts +2 -0
- package/dist/errors/member-resolution.js +10 -0
- package/dist/errors/reasons.d.ts +23 -0
- package/dist/errors/reasons.js +81 -0
- package/dist/errors/serialize.d.ts +32 -0
- package/dist/errors/serialize.js +76 -0
- package/dist/errors/to-kumiko-error.d.ts +2 -0
- package/dist/errors/to-kumiko-error.js +9 -0
- package/dist/errors/transition-details.d.ts +7 -0
- package/dist/errors/transition-details.js +16 -0
- package/dist/errors/write-error-info.d.ts +20 -0
- package/dist/errors/write-error-info.js +99 -0
- package/dist/errors/zod-bridge.d.ts +3 -0
- package/dist/errors/zod-bridge.js +58 -0
- package/dist/es-ops/context.d.ts +19 -0
- package/dist/es-ops/context.js +70 -0
- package/dist/es-ops/index.d.ts +4 -0
- package/dist/es-ops/index.js +14 -0
- package/dist/es-ops/operations-schema.d.ts +5 -0
- package/dist/es-ops/operations-schema.js +40 -0
- package/dist/es-ops/runner.d.ts +29 -0
- package/dist/es-ops/runner.js +195 -0
- package/dist/es-ops/types.d.ts +92 -0
- package/dist/es-ops/types.js +14 -0
- package/dist/event-store/admin-api.d.ts +17 -0
- package/dist/event-store/admin-api.js +173 -0
- package/dist/event-store/archive.d.ts +14 -0
- package/dist/event-store/archive.js +55 -0
- package/dist/event-store/errors.d.ts +15 -0
- package/dist/event-store/errors.js +49 -0
- package/dist/event-store/event-store.d.ts +38 -0
- package/dist/event-store/event-store.js +310 -0
- package/dist/event-store/events-schema.d.ts +3 -0
- package/dist/event-store/events-schema.js +66 -0
- package/dist/event-store/index.d.ts +12 -0
- package/dist/event-store/index.js +12 -0
- package/dist/event-store/provenance-append.d.ts +13 -0
- package/dist/event-store/provenance-append.js +49 -0
- package/dist/event-store/rebuild-dead-letter.d.ts +25 -0
- package/dist/event-store/rebuild-dead-letter.js +71 -0
- package/dist/event-store/row-to-stored-event.d.ts +17 -0
- package/dist/event-store/row-to-stored-event.js +15 -0
- package/dist/event-store/snapshot.d.ts +26 -0
- package/dist/event-store/snapshot.js +155 -0
- package/dist/event-store/transfer.d.ts +13 -0
- package/dist/event-store/transfer.js +62 -0
- package/dist/event-store/types.d.ts +1 -0
- package/dist/event-store/types.js +1 -0
- package/dist/event-store/upcaster-dead-letter.d.ts +27 -0
- package/dist/event-store/upcaster-dead-letter.js +76 -0
- package/dist/event-store/upcaster.d.ts +14 -0
- package/dist/event-store/upcaster.js +86 -0
- package/dist/files/content-disposition.d.ts +3 -0
- package/dist/files/content-disposition.js +50 -0
- package/dist/files/feature.d.ts +9 -0
- package/dist/files/feature.js +26 -0
- package/dist/files/file-handle.d.ts +7 -0
- package/dist/files/file-handle.js +71 -0
- package/dist/files/file-ref-entity.d.ts +134 -0
- package/dist/files/file-ref-entity.js +32 -0
- package/dist/files/file-ref-table.d.ts +134 -0
- package/dist/files/file-ref-table.js +12 -0
- package/dist/files/file-routes.d.ts +34 -0
- package/dist/files/file-routes.js +433 -0
- package/dist/files/in-memory-provider.d.ts +7 -0
- package/dist/files/in-memory-provider.js +82 -0
- package/dist/files/index.d.ts +17 -0
- package/dist/files/index.js +13 -0
- package/dist/files/local-provider.d.ts +2 -0
- package/dist/files/local-provider.js +128 -0
- package/dist/files/provider-resolver.d.ts +58 -0
- package/dist/files/provider-resolver.js +87 -0
- package/dist/files/storage-tracking.d.ts +20 -0
- package/dist/files/storage-tracking.js +179 -0
- package/dist/files/types.d.ts +59 -0
- package/dist/files/types.js +276 -0
- package/dist/files/zip-stream.d.ts +31 -0
- package/dist/files/zip-stream.js +207 -0
- package/dist/http/index.d.ts +2 -0
- package/dist/http/index.js +1 -0
- package/dist/i18n/index.d.ts +12 -0
- package/dist/i18n/index.js +27 -0
- package/dist/i18n/mail-registry.d.ts +7 -0
- package/dist/i18n/mail-registry.js +34 -0
- package/dist/i18n/request-locale.d.ts +22 -0
- package/dist/i18n/request-locale.js +62 -0
- package/dist/i18n/required-surface-keys.d.ts +33 -0
- package/dist/i18n/required-surface-keys.js +416 -0
- package/dist/i18n/settings-hub-keys.d.ts +14 -0
- package/dist/i18n/settings-hub-keys.js +29 -0
- package/dist/jobs/index.d.ts +2 -0
- package/dist/jobs/index.js +1 -0
- package/dist/jobs/job-runner.d.ts +54 -0
- package/dist/jobs/job-runner.js +1110 -0
- package/dist/lifecycle/index.d.ts +2 -0
- package/dist/lifecycle/index.js +2 -0
- package/dist/lifecycle/lifecycle.d.ts +23 -0
- package/dist/lifecycle/lifecycle.js +111 -0
- package/dist/lifecycle/signal-handlers.d.ts +10 -0
- package/dist/lifecycle/signal-handlers.js +40 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/pino-logger.d.ts +9 -0
- package/dist/logging/pino-logger.js +61 -0
- package/dist/logging/types.js +1 -0
- package/dist/logging/utils.d.ts +8 -0
- package/dist/logging/utils.js +41 -0
- package/dist/migrations/index.d.ts +4 -0
- package/dist/migrations/index.js +8 -0
- package/dist/migrations/kumiko-drift.d.ts +26 -0
- package/dist/migrations/kumiko-drift.js +151 -0
- package/dist/migrations/pending-rebuilds.d.ts +81 -0
- package/dist/migrations/pending-rebuilds.js +163 -0
- package/dist/migrations/pii-event-backfill.d.ts +40 -0
- package/dist/migrations/pii-event-backfill.js +275 -0
- package/dist/migrations/projection-table-index.d.ts +5 -0
- package/dist/migrations/projection-table-index.js +21 -0
- package/dist/observability/console-provider.d.ts +10 -0
- package/dist/observability/console-provider.js +101 -0
- package/dist/observability/context.d.ts +10 -0
- package/dist/observability/context.js +13 -0
- package/dist/observability/escape-hatch-report.d.ts +23 -0
- package/dist/observability/escape-hatch-report.js +92 -0
- package/dist/observability/fallback.d.ts +4 -0
- package/dist/observability/fallback.js +28 -0
- package/dist/observability/ids.d.ts +2 -0
- package/dist/observability/ids.js +22 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.js +15 -0
- package/dist/observability/metric-validator.d.ts +4 -0
- package/dist/observability/metric-validator.js +73 -0
- package/dist/observability/metrics-handle.d.ts +5 -0
- package/dist/observability/metrics-handle.js +102 -0
- package/dist/observability/metrics-wiring.d.ts +18 -0
- package/dist/observability/metrics-wiring.js +21 -0
- package/dist/observability/noop-provider.d.ts +2 -0
- package/dist/observability/noop-provider.js +105 -0
- package/dist/observability/prometheus-meter.d.ts +26 -0
- package/dist/observability/prometheus-meter.js +257 -0
- package/dist/observability/recording-meter.d.ts +31 -0
- package/dist/observability/recording-meter.js +127 -0
- package/dist/observability/recording-tracer.d.ts +32 -0
- package/dist/observability/recording-tracer.js +135 -0
- package/dist/observability/redis-wrapper.d.ts +3 -0
- package/dist/observability/redis-wrapper.js +121 -0
- package/dist/observability/sensitive-filter.d.ts +9 -0
- package/dist/observability/sensitive-filter.js +92 -0
- package/dist/observability/standard-metrics.d.ts +41 -0
- package/dist/observability/standard-metrics.js +237 -0
- package/dist/observability/types/index.js +1 -0
- package/dist/observability/types/metric.js +1 -0
- package/dist/observability/types/provider.js +1 -0
- package/dist/observability/types/span.js +1 -0
- package/dist/pipeline/active-membership.d.ts +12 -0
- package/dist/pipeline/active-membership.js +124 -0
- package/dist/pipeline/append-event-core.d.ts +12 -0
- package/dist/pipeline/append-event-core.js +84 -0
- package/dist/pipeline/auth-claims-resolver.d.ts +9 -0
- package/dist/pipeline/auth-claims-resolver.js +76 -0
- package/dist/pipeline/cascade-handler.d.ts +6 -0
- package/dist/pipeline/cascade-handler.js +85 -0
- package/dist/pipeline/dispatch-batch.d.ts +5 -0
- package/dist/pipeline/dispatch-batch.js +217 -0
- package/dist/pipeline/dispatch-query.d.ts +4 -0
- package/dist/pipeline/dispatch-query.js +141 -0
- package/dist/pipeline/dispatch-shared.d.ts +58 -0
- package/dist/pipeline/dispatch-shared.js +924 -0
- package/dist/pipeline/dispatch-stream.d.ts +3 -0
- package/dist/pipeline/dispatch-stream.js +89 -0
- package/dist/pipeline/dispatch-write.d.ts +6 -0
- package/dist/pipeline/dispatch-write.js +428 -0
- package/dist/pipeline/dispatcher-utils.d.ts +36 -0
- package/dist/pipeline/dispatcher-utils.js +139 -0
- package/dist/pipeline/dispatcher.d.ts +30 -0
- package/dist/pipeline/dispatcher.js +131 -0
- package/dist/pipeline/distributed-lock.d.ts +13 -0
- package/dist/pipeline/distributed-lock.js +42 -0
- package/dist/pipeline/entity-cache.d.ts +7 -0
- package/dist/pipeline/entity-cache.js +68 -0
- package/dist/pipeline/event-consumer-state.d.ts +16 -0
- package/dist/pipeline/event-consumer-state.js +96 -0
- package/dist/pipeline/event-dedup.d.ts +11 -0
- package/dist/pipeline/event-dedup.js +12 -0
- package/dist/pipeline/event-dispatcher-admin.d.ts +46 -0
- package/dist/pipeline/event-dispatcher-admin.js +196 -0
- package/dist/pipeline/event-dispatcher-delivery.d.ts +68 -0
- package/dist/pipeline/event-dispatcher-delivery.js +310 -0
- package/dist/pipeline/event-dispatcher.d.ts +52 -0
- package/dist/pipeline/event-dispatcher.js +523 -0
- package/dist/pipeline/event-retention.d.ts +20 -0
- package/dist/pipeline/event-retention.js +78 -0
- package/dist/pipeline/idempotency.d.ts +19 -0
- package/dist/pipeline/idempotency.js +115 -0
- package/dist/pipeline/index.d.ts +34 -0
- package/dist/pipeline/index.js +19 -0
- package/dist/pipeline/irreversible-operation-gate.d.ts +4 -0
- package/dist/pipeline/irreversible-operation-gate.js +57 -0
- package/dist/pipeline/lifecycle-pipeline.d.ts +29 -0
- package/dist/pipeline/lifecycle-pipeline.js +266 -0
- package/dist/pipeline/member-read-only-transaction.d.ts +3 -0
- package/dist/pipeline/member-read-only-transaction.js +68 -0
- package/dist/pipeline/member-reader.d.ts +7 -0
- package/dist/pipeline/member-reader.js +87 -0
- package/dist/pipeline/msp-rebuild.d.ts +12 -0
- package/dist/pipeline/msp-rebuild.js +163 -0
- package/dist/pipeline/multi-stream-apply-context.d.ts +18 -0
- package/dist/pipeline/multi-stream-apply-context.js +40 -0
- package/dist/pipeline/pending-gap-ranges.d.ts +12 -0
- package/dist/pipeline/pending-gap-ranges.js +99 -0
- package/dist/pipeline/projection-rebuild.d.ts +55 -0
- package/dist/pipeline/projection-rebuild.js +285 -0
- package/dist/pipeline/projection-state.d.ts +9 -0
- package/dist/pipeline/projection-state.js +51 -0
- package/dist/pipeline/projections-runner.d.ts +5 -0
- package/dist/pipeline/projections-runner.js +57 -0
- package/dist/pipeline/redis-keys.d.ts +8 -0
- package/dist/pipeline/redis-keys.js +10 -0
- package/dist/pipeline/system-hooks.d.ts +25 -0
- package/dist/pipeline/system-hooks.js +590 -0
- package/dist/pipeline/system-identity-switch.d.ts +30 -0
- package/dist/pipeline/system-identity-switch.js +248 -0
- package/dist/pipeline/tenant-timezone-cache.d.ts +17 -0
- package/dist/pipeline/tenant-timezone-cache.js +55 -0
- package/dist/pipeline/write-origin.d.ts +10 -0
- package/dist/pipeline/write-origin.js +110 -0
- package/dist/random/generate.d.ts +56 -0
- package/dist/random/generate.js +92 -0
- package/dist/random/index.d.ts +2 -0
- package/dist/random/index.js +2 -0
- package/dist/random/words.d.ts +2 -0
- package/dist/random/words.js +391 -0
- package/dist/rate-limit/bucket.d.ts +14 -0
- package/dist/rate-limit/bucket.js +20 -0
- package/dist/rate-limit/index.d.ts +3 -0
- package/dist/rate-limit/index.js +3 -0
- package/dist/rate-limit/middleware.d.ts +24 -0
- package/dist/rate-limit/middleware.js +101 -0
- package/dist/rate-limit/resolver.d.ts +9 -0
- package/dist/rate-limit/resolver.js +177 -0
- package/dist/redis/client.d.ts +9 -0
- package/dist/redis/client.js +44 -0
- package/dist/redis/index.d.ts +4 -0
- package/dist/redis/index.js +2 -0
- package/dist/redis/pubsub-signal.d.ts +11 -0
- package/dist/redis/pubsub-signal.js +79 -0
- package/dist/schema-cli.d.ts +21 -0
- package/dist/schema-cli.js +438 -0
- package/dist/scripts/codemod/crypto-shredding-testing-move.d.ts +2 -0
- package/dist/scripts/codemod/crypto-shredding-testing-move.js +109 -0
- package/dist/scripts/codemod/migrate-cross-tenant.d.ts +19 -0
- package/dist/scripts/codemod/migrate-cross-tenant.js +266 -0
- package/dist/scripts/codemod/migrate-db-raw.d.ts +23 -0
- package/dist/scripts/codemod/migrate-db-raw.js +345 -0
- package/dist/scripts/codemod/migrate-open-to-all.d.ts +22 -0
- package/dist/scripts/codemod/migrate-open-to-all.js +194 -0
- package/dist/scripts/codemod/pii-personal-migration.d.ts +11 -0
- package/dist/scripts/codemod/pii-personal-migration.js +615 -0
- package/dist/scripts/codemod/unprocessable-error-details-reason.d.ts +2 -0
- package/dist/scripts/codemod/unprocessable-error-details-reason.js +235 -0
- package/dist/search/derive-search-adapter-config.d.ts +3 -0
- package/dist/search/derive-search-adapter-config.js +23 -0
- package/dist/search/in-memory-adapter.d.ts +2 -0
- package/dist/search/in-memory-adapter.js +96 -0
- package/dist/search/index.d.ts +6 -0
- package/dist/search/index.js +8 -0
- package/dist/search/meilisearch-adapter.d.ts +10 -0
- package/dist/search/meilisearch-adapter.js +175 -0
- package/dist/search/purge-subject.d.ts +7 -0
- package/dist/search/purge-subject.js +178 -0
- package/dist/search/reindex-entity.d.ts +18 -0
- package/dist/search/reindex-entity.js +139 -0
- package/dist/search/types.js +1 -0
- package/dist/secrets/dek-cache.d.ts +13 -0
- package/dist/secrets/dek-cache.js +97 -0
- package/dist/secrets/derive-purpose-secret.d.ts +1 -0
- package/dist/secrets/derive-purpose-secret.js +16 -0
- package/dist/secrets/env-master-key-provider.d.ts +6 -0
- package/dist/secrets/env-master-key-provider.js +134 -0
- package/dist/secrets/envelope-cipher.d.ts +8 -0
- package/dist/secrets/envelope-cipher.js +36 -0
- package/dist/secrets/envelope.d.ts +3 -0
- package/dist/secrets/envelope.js +44 -0
- package/dist/secrets/index.d.ts +9 -0
- package/dist/secrets/index.js +9 -0
- package/dist/secrets/leak-guard.d.ts +1 -0
- package/dist/secrets/leak-guard.js +79 -0
- package/dist/secrets/rotation.d.ts +2 -0
- package/dist/secrets/rotation.js +29 -0
- package/dist/secrets/stored-envelope.d.ts +11 -0
- package/dist/secrets/stored-envelope.js +32 -0
- package/dist/secrets/types.d.ts +1 -0
- package/dist/seeding/entity-seed.d.ts +19 -0
- package/dist/seeding/entity-seed.js +12 -0
- package/dist/seeding/index.d.ts +2 -0
- package/dist/seeding/index.js +2 -0
- package/dist/seeding/types.d.ts +7 -0
- package/dist/seeding/types.js +1 -0
- package/dist/stack/db.d.ts +19 -0
- package/dist/stack/db.js +61 -0
- package/dist/stack/drain-event-consumers.d.ts +4 -0
- package/dist/stack/drain-event-consumers.js +48 -0
- package/dist/stack/drain-jobs.d.ts +20 -0
- package/dist/stack/drain-jobs.js +99 -0
- package/dist/stack/event-collector.d.ts +9 -0
- package/dist/stack/event-collector.js +12 -0
- package/dist/stack/index.d.ts +9 -0
- package/dist/stack/index.js +19 -0
- package/dist/stack/push-entity-projection-tables.d.ts +24 -0
- package/dist/stack/push-entity-projection-tables.js +73 -0
- package/dist/stack/redis.d.ts +11 -0
- package/dist/stack/redis.js +38 -0
- package/dist/stack/request-helper.d.ts +35 -0
- package/dist/stack/request-helper.js +144 -0
- package/dist/stack/table-helpers.d.ts +32 -0
- package/dist/stack/table-helpers.js +138 -0
- package/dist/stack/test-stack.d.ts +161 -0
- package/dist/stack/test-stack.js +398 -0
- package/dist/stack/test-users.d.ts +33 -0
- package/dist/stack/test-users.js +29 -0
- package/dist/testing/access-assertions.d.ts +2 -0
- package/dist/testing/access-assertions.js +13 -0
- package/dist/testing/assertions.d.ts +10 -0
- package/dist/testing/assertions.js +22 -0
- package/dist/testing/boot-validator-fixture.d.ts +3 -0
- package/dist/testing/boot-validator-fixture.js +101 -0
- package/dist/testing/closed-connection-error.d.ts +7 -0
- package/dist/testing/closed-connection-error.js +47 -0
- package/dist/testing/db-cleanup.d.ts +9 -0
- package/dist/testing/db-cleanup.js +31 -0
- package/dist/testing/e2e-generator.d.ts +49 -0
- package/dist/testing/e2e-generator.js +377 -0
- package/dist/testing/expect-error.d.ts +2 -0
- package/dist/testing/expect-error.js +22 -0
- package/dist/testing/file-provider-contract.d.ts +2 -0
- package/dist/testing/file-provider-contract.js +102 -0
- package/dist/testing/handler-context.d.ts +4 -0
- package/dist/testing/handler-context.js +72 -0
- package/dist/testing/http-cookies.d.ts +7 -0
- package/dist/testing/http-cookies.js +47 -0
- package/dist/testing/index.d.ts +24 -0
- package/dist/testing/index.js +32 -0
- package/dist/testing/late-bound.d.ts +9 -0
- package/dist/testing/late-bound.js +31 -0
- package/dist/testing/multipart-helper.d.ts +22 -0
- package/dist/testing/multipart-helper.js +77 -0
- package/dist/testing/mutable-master-key-provider.d.ts +7 -0
- package/dist/testing/mutable-master-key-provider.js +35 -0
- package/dist/testing/observability-recorder.d.ts +9 -0
- package/dist/testing/observability-recorder.js +29 -0
- package/dist/testing/real-providers.d.ts +3 -0
- package/dist/testing/real-providers.js +21 -0
- package/dist/testing/seed.d.ts +9 -0
- package/dist/testing/seed.js +21 -0
- package/dist/testing/shared-entities.d.ts +256 -0
- package/dist/testing/shared-entities.js +56 -0
- package/dist/testing/utils.d.ts +1 -0
- package/dist/testing/utils.js +1 -0
- package/dist/testing/wait-for.d.ts +20 -0
- package/dist/testing/wait-for.js +46 -0
- package/dist/testing/without-ambient-temporal.d.ts +5 -0
- package/dist/testing/without-ambient-temporal.js +17 -0
- package/dist/time/boot-tz-warning.d.ts +5 -0
- package/dist/time/boot-tz-warning.js +24 -0
- package/dist/time/geo-tz.js +1 -0
- package/dist/time/iana.d.ts +1 -0
- package/dist/time/iana.js +18 -0
- package/dist/time/index.d.ts +6 -0
- package/dist/time/index.js +15 -0
- package/dist/time/legacy-date.d.ts +5 -0
- package/dist/time/legacy-date.js +15 -0
- package/dist/time/polyfill.d.ts +9 -0
- package/dist/time/polyfill.js +52 -0
- package/dist/time/tz-context.d.ts +13 -0
- package/dist/time/tz-context.js +80 -0
- package/dist/ui-types/app-schema.d.ts +26 -0
- package/dist/ui-types/app-schema.js +9 -0
- package/dist/ui-types/formality.d.ts +2 -0
- package/dist/ui-types/formality.js +5 -0
- package/dist/ui-types/index.d.ts +22 -0
- package/dist/ui-types/index.js +31 -0
- package/dist/ui-types/list-row-meta.d.ts +18 -0
- package/dist/ui-types/list-row-meta.js +65 -0
- package/dist/ui-types/plural.d.ts +12 -0
- package/dist/ui-types/plural.js +57 -0
- package/dist/upgrade-cli.d.ts +11 -0
- package/dist/upgrade-cli.js +532 -0
- package/dist/utils/assert.d.ts +1 -0
- package/dist/utils/assert.js +18 -0
- package/dist/utils/case.d.ts +1 -0
- package/dist/utils/case.js +6 -0
- package/dist/utils/compare.d.ts +1 -0
- package/dist/utils/compare.js +10 -0
- package/dist/utils/env-parse.d.ts +1 -0
- package/dist/utils/env-parse.js +13 -0
- package/dist/utils/ids.d.ts +2 -0
- package/dist/utils/ids.js +23 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/is-plain-object.d.ts +2 -0
- package/dist/utils/is-plain-object.js +4 -0
- package/dist/utils/parse-string-array-json.d.ts +2 -0
- package/dist/utils/parse-string-array-json.js +11 -0
- package/dist/utils/safe-json.d.ts +17 -0
- package/dist/utils/safe-json.js +47 -0
- package/dist/utils/serialization.d.ts +1 -0
- package/dist/utils/serialization.js +13 -0
- package/package.json +274 -93
- package/src/changes.json +12 -0
- package/src/scripts/codemod/pii-personal-migration.ts +5 -5
- package/src/__tests__/anonymous-access.integration.test.ts +0 -513
- package/src/__tests__/consumer-cli.integration.test.ts +0 -172
- package/src/__tests__/derived-fields.integration.test.ts +0 -126
- package/src/__tests__/entity-list-limits.integration.test.ts +0 -84
- package/src/__tests__/entity-permalink-open.integration.test.ts +0 -99
- package/src/__tests__/error-contract.integration.test.ts +0 -436
- package/src/__tests__/field-access.integration.test.ts +0 -273
- package/src/__tests__/fixtures/migrate-cross-tenant/manual-only.expected.ts +0 -44
- package/src/__tests__/fixtures/migrate-cross-tenant/manual-only.input.ts +0 -44
- package/src/__tests__/fixtures/migrate-cross-tenant/rewrite.expected.ts +0 -41
- package/src/__tests__/fixtures/migrate-cross-tenant/rewrite.input.ts +0 -41
- package/src/__tests__/fixtures/migrate-db-raw/global-fetch.expected.ts +0 -9
- package/src/__tests__/fixtures/migrate-db-raw/global-fetch.input.ts +0 -10
- package/src/__tests__/fixtures/migrate-db-raw/global-select.expected.ts +0 -6
- package/src/__tests__/fixtures/migrate-db-raw/global-select.input.ts +0 -12
- package/src/__tests__/fixtures/migrate-db-raw/import-pruning.expected.ts +0 -12
- package/src/__tests__/fixtures/migrate-db-raw/import-pruning.input.ts +0 -12
- package/src/__tests__/fixtures/migrate-db-raw/manual-only.expected.ts +0 -26
- package/src/__tests__/fixtures/migrate-db-raw/manual-only.input.ts +0 -26
- package/src/__tests__/fixtures/migrate-db-raw/own-tenant-const-shorthand.expected.ts +0 -10
- package/src/__tests__/fixtures/migrate-db-raw/own-tenant-const-shorthand.input.ts +0 -11
- package/src/__tests__/fixtures/migrate-db-raw/own-tenant-event.expected.ts +0 -9
- package/src/__tests__/fixtures/migrate-db-raw/own-tenant-event.input.ts +0 -15
- package/src/__tests__/fixtures/migrate-open-to-all/manual-only.expected.ts +0 -16
- package/src/__tests__/fixtures/migrate-open-to-all/manual-only.input.ts +0 -16
- package/src/__tests__/fixtures/migrate-open-to-all/test-nested-shorthand.expected.ts +0 -12
- package/src/__tests__/fixtures/migrate-open-to-all/test-nested-shorthand.input.ts +0 -12
- package/src/__tests__/fixtures/migrate-open-to-all/test-simple.expected.ts +0 -7
- package/src/__tests__/fixtures/migrate-open-to-all/test-simple.input.ts +0 -7
- package/src/__tests__/full-stack.integration.test.ts +0 -924
- package/src/__tests__/migrate-cross-tenant-codemod.test.ts +0 -106
- package/src/__tests__/migrate-db-raw-codemod.test.ts +0 -132
- package/src/__tests__/migrate-open-to-all-codemod.test.ts +0 -84
- package/src/__tests__/ownership-where-write-path.integration.test.ts +0 -147
- package/src/__tests__/ownership.integration.test.ts +0 -454
- package/src/__tests__/pii-personal-migration-report-codemod.test.ts +0 -160
- package/src/__tests__/reference-data.integration.test.ts +0 -243
- package/src/__tests__/related-list-parent-filter.integration.test.ts +0 -103
- package/src/__tests__/schema-cli-kms-slots.integration.test.ts +0 -172
- package/src/__tests__/schema-cli-rebuild.integration.test.ts +0 -189
- package/src/__tests__/schema-cli-status.integration.test.ts +0 -96
- package/src/__tests__/schema-cli-temporal-polyfill.test.ts +0 -48
- package/src/__tests__/schema-cli.integration.test.ts +0 -485
- package/src/__tests__/store-table.integration.test.ts +0 -94
- package/src/__tests__/transition-guard.integration.test.ts +0 -342
- package/src/__tests__/unprocessable-error-details-reason-codemod.test.ts +0 -205
- package/src/__tests__/upgrade-cli.test.ts +0 -723
- package/src/api/__tests__/api-constants-completeness.test.ts +0 -63
- package/src/api/__tests__/api.test.ts +0 -869
- package/src/api/__tests__/auth-middleware-anonymous-access-boot.test.ts +0 -40
- package/src/api/__tests__/auth-middleware-transport.test.ts +0 -102
- package/src/api/__tests__/auth-routes-cookie.test.ts +0 -330
- package/src/api/__tests__/auth-routes-invalid-body-invite.test.ts +0 -263
- package/src/api/__tests__/auth-routes-mfa-preauth-confirm.test.ts +0 -230
- package/src/api/__tests__/auth-routes-mfa-preauth-enable-start.test.ts +0 -263
- package/src/api/__tests__/auth-routes-mfa-verify.test.ts +0 -221
- package/src/api/__tests__/auth-routes-trusted-proxy.test.ts +0 -164
- package/src/api/__tests__/batch.integration.test.ts +0 -548
- package/src/api/__tests__/body-limit.test.ts +0 -184
- package/src/api/__tests__/client-ip.test.ts +0 -184
- package/src/api/__tests__/csrf-constants-sync.test.ts +0 -20
- package/src/api/__tests__/csrf-middleware.test.ts +0 -97
- package/src/api/__tests__/dispatcher-live.integration.test.ts +0 -292
- package/src/api/__tests__/extra-route-rejection.test.ts +0 -38
- package/src/api/__tests__/extra-routes.integration.test.ts +0 -663
- package/src/api/__tests__/http-cache.test.ts +0 -173
- package/src/api/__tests__/http-route-entry.integration.test.ts +0 -114
- package/src/api/__tests__/http-route-rate-limit.integration.test.ts +0 -148
- package/src/api/__tests__/jwt.test.ts +0 -316
- package/src/api/__tests__/login-rate-limiter-sweep.test.ts +0 -50
- package/src/api/__tests__/metrics-endpoint.test.ts +0 -132
- package/src/api/__tests__/nested-write-ownership.integration.test.ts +0 -268
- package/src/api/__tests__/nested-write.integration.test.ts +0 -210
- package/src/api/__tests__/origin-middleware.integration.test.ts +0 -273
- package/src/api/__tests__/origin-middleware.test.ts +0 -279
- package/src/api/__tests__/pat-route-guard.integration.test.ts +0 -126
- package/src/api/__tests__/pat-scope.test.ts +0 -36
- package/src/api/__tests__/pii-leak-guard.integration.test.ts +0 -112
- package/src/api/__tests__/post-auth-landing.test.ts +0 -100
- package/src/api/__tests__/readiness.test.ts +0 -76
- package/src/api/__tests__/redis-login-rate-limiter.integration.test.ts +0 -138
- package/src/api/__tests__/redis-sse-broker.integration.test.ts +0 -321
- package/src/api/__tests__/request-id-middleware.test.ts +0 -229
- package/src/api/__tests__/request-locale.integration.test.ts +0 -146
- package/src/api/__tests__/schema-route.integration.test.ts +0 -157
- package/src/api/__tests__/server-boot-guards.test.ts +0 -308
- package/src/api/__tests__/server-error-logging.test.ts +0 -342
- package/src/api/__tests__/server-jwt-ttl.test.ts +0 -58
- package/src/api/__tests__/sse-broker.test.ts +0 -267
- package/src/api/__tests__/sse-route.test.ts +0 -245
- package/src/api/__tests__/stream-escape-hatch.integration.test.ts +0 -203
- package/src/api/__tests__/websocket-route.test.ts +0 -552
- package/src/api/anonymous-cookie.ts +0 -61
- package/src/api/api-constants.ts +0 -153
- package/src/api/auth-middleware.ts +0 -694
- package/src/api/auth-routes.ts +0 -1590
- package/src/api/client-ip.ts +0 -131
- package/src/api/csrf-middleware.ts +0 -74
- package/src/api/extra-route.ts +0 -178
- package/src/api/http-cache.ts +0 -122
- package/src/api/index.ts +0 -117
- package/src/api/jwt.ts +0 -277
- package/src/api/observability-middleware.ts +0 -89
- package/src/api/origin-middleware.ts +0 -137
- package/src/api/pat-route-guard.ts +0 -51
- package/src/api/pat-scope.ts +0 -14
- package/src/api/pii-leak-guard.ts +0 -46
- package/src/api/post-auth-landing.ts +0 -105
- package/src/api/readiness.ts +0 -132
- package/src/api/redis-sse-broker.ts +0 -171
- package/src/api/request-context.ts +0 -137
- package/src/api/request-id-middleware.ts +0 -138
- package/src/api/route-registrars.ts +0 -193
- package/src/api/routes.ts +0 -432
- package/src/api/server.ts +0 -1550
- package/src/api/sse-broker.ts +0 -175
- package/src/api/sse-route.ts +0 -74
- package/src/api/tokens.ts +0 -16
- package/src/api/websocket-route.ts +0 -327
- package/src/arg-parser.ts +0 -66
- package/src/auth/__tests__/roles.test.ts +0 -24
- package/src/auth/index.ts +0 -7
- package/src/auth/roles.ts +0 -42
- package/src/bun-db/__tests__/PATTERN.md +0 -72
- package/src/bun-db/__tests__/_helpers.ts +0 -104
- package/src/bun-db/__tests__/batch-methods.integration.test.ts +0 -143
- package/src/bun-db/__tests__/batch-methods.test.ts +0 -21
- package/src/bun-db/__tests__/bun-test-db.ts +0 -19
- package/src/bun-db/__tests__/closed-connection-retry.integration.test.ts +0 -252
- package/src/bun-db/__tests__/coerce-row-plain-date.test.ts +0 -70
- package/src/bun-db/__tests__/coerce-row-temporal.test.ts +0 -41
- package/src/bun-db/__tests__/column-types.integration.test.ts +0 -132
- package/src/bun-db/__tests__/compound-types.integration.test.ts +0 -134
- package/src/bun-db/__tests__/decimal-field.integration.test.ts +0 -81
- package/src/bun-db/__tests__/extract-table-info.test.ts +0 -71
- package/src/bun-db/__tests__/jsonb-edge-cases.integration.test.ts +0 -235
- package/src/bun-db/__tests__/postgres-closed-socket-write.integration.test.ts +0 -87
- package/src/bun-db/__tests__/query-guards.test.ts +0 -111
- package/src/bun-db/__tests__/run-in-savepoint-if-supported.integration.test.ts +0 -47
- package/src/bun-db/__tests__/select-many-retry.integration.test.ts +0 -138
- package/src/bun-db/__tests__/smoke.integration.test.ts +0 -43
- package/src/bun-db/__tests__/sql-expr-brand.test.ts +0 -115
- package/src/bun-db/__tests__/sql-methods.integration.test.ts +0 -231
- package/src/bun-db/__tests__/where-patterns.integration.test.ts +0 -213
- package/src/bun-db/__tests__/write-brand.test.ts +0 -72
- package/src/bun-db/connection.ts +0 -87
- package/src/bun-db/index.ts +0 -36
- package/src/bun-db/query.ts +0 -1394
- package/src/compliance/__tests__/duration-spec.test.ts +0 -72
- package/src/compliance/__tests__/profiles.test.ts +0 -308
- package/src/compliance/__tests__/sub-processors.test.ts +0 -149
- package/src/compliance/duration-spec.ts +0 -44
- package/src/compliance/index.ts +0 -31
- package/src/compliance/override-schema.ts +0 -136
- package/src/compliance/profiles.ts +0 -424
- package/src/compliance/sub-processors.ts +0 -165
- package/src/consumer-cli.ts +0 -134
- package/src/crypto/__tests__/blind-index.test.ts +0 -132
- package/src/crypto/__tests__/event-pii.test.ts +0 -417
- package/src/crypto/__tests__/kek-rotation.integration.test.ts +0 -180
- package/src/crypto/__tests__/kek-source.test.ts +0 -441
- package/src/crypto/__tests__/kms-adapter-contract.ts +0 -134
- package/src/crypto/__tests__/kms-adapter.contract.test.ts +0 -4
- package/src/crypto/__tests__/kms-wiring.test.ts +0 -203
- package/src/crypto/__tests__/pg-kms-adapter.integration.test.ts +0 -154
- package/src/crypto/__tests__/pii-field-encryption.test.ts +0 -403
- package/src/crypto/__tests__/request-kms-cache.test.ts +0 -74
- package/src/crypto/__tests__/subject-id-schema.test.ts +0 -60
- package/src/crypto/__tests__/subject-key-record.test.ts +0 -109
- package/src/crypto/__tests__/subject-resolver.test.ts +0 -250
- package/src/crypto/__tests__/system-event-pii.test.ts +0 -77
- package/src/crypto/blind-index.ts +0 -118
- package/src/crypto/ciphertext-pattern.ts +0 -19
- package/src/crypto/event-pii.ts +0 -99
- package/src/crypto/in-memory-kms-adapter.ts +0 -50
- package/src/crypto/index.ts +0 -84
- package/src/crypto/is-self-pii-field.ts +0 -8
- package/src/crypto/kek-source.ts +0 -180
- package/src/crypto/kms-adapter.ts +0 -51
- package/src/crypto/kms-wiring.ts +0 -208
- package/src/crypto/pg-kms-adapter.ts +0 -303
- package/src/crypto/pii-field-encryption.ts +0 -266
- package/src/crypto/request-kms-cache.ts +0 -38
- package/src/crypto/subject-resolver.ts +0 -232
- package/src/crypto/system-event-pii.ts +0 -57
- package/src/db/__tests__/apply-entity-event-removed-column.integration.test.ts +0 -109
- package/src/db/__tests__/apply-entity-event-tenant.integration.test.ts +0 -159
- package/src/db/__tests__/assert-exists-in.integration.test.ts +0 -120
- package/src/db/__tests__/assert-no-unreachable-live-rows.integration.test.ts +0 -190
- package/src/db/__tests__/big-int-field.test.ts +0 -132
- package/src/db/__tests__/blind-index.integration.test.ts +0 -280
- package/src/db/__tests__/build-filter-where.test.ts +0 -50
- package/src/db/__tests__/collect-table-metas.test.ts +0 -188
- package/src/db/__tests__/column-ddl.integration.test.ts +0 -122
- package/src/db/__tests__/compound-types.test.ts +0 -126
- package/src/db/__tests__/config-seed.integration.test.ts +0 -292
- package/src/db/__tests__/connection-close-outage.integration.test.ts +0 -110
- package/src/db/__tests__/connection-options.test.ts +0 -68
- package/src/db/__tests__/cursor.test.ts +0 -42
- package/src/db/__tests__/decimal-field.test.ts +0 -109
- package/src/db/__tests__/dialect-instant.test.ts +0 -47
- package/src/db/__tests__/eagerload.integration.test.ts +0 -374
- package/src/db/__tests__/entity-field-encryption.test.ts +0 -74
- package/src/db/__tests__/entity-table-from-registry.test.ts +0 -79
- package/src/db/__tests__/entity-table-meta-source.test.ts +0 -92
- package/src/db/__tests__/entity-table-types.test.ts +0 -162
- package/src/db/__tests__/event-store-executor-context.pii-roundtrip.test.ts +0 -67
- package/src/db/__tests__/event-store-executor-global-tenancy.integration.test.ts +0 -73
- package/src/db/__tests__/event-store-executor-list.integration.test.ts +0 -791
- package/src/db/__tests__/event-store-executor-money-rehydrate.integration.test.ts +0 -153
- package/src/db/__tests__/event-store-executor-reference-search.integration.test.ts +0 -643
- package/src/db/__tests__/event-store-executor-reference-sort.integration.test.ts +0 -256
- package/src/db/__tests__/event-store-executor-write-verbs.integration.test.ts +0 -788
- package/src/db/__tests__/event-store-executor.integration.test.ts +0 -844
- package/src/db/__tests__/event-store-system-stream.integration.test.ts +0 -96
- package/src/db/__tests__/feature-table-sources.test.ts +0 -34
- package/src/db/__tests__/implicit-projection-equivalence.integration.test.ts +0 -393
- package/src/db/__tests__/instant-to-driver-temporal.test.ts +0 -21
- package/src/db/__tests__/list-filter-field-access.integration.test.ts +0 -218
- package/src/db/__tests__/list-pagination.test.ts +0 -28
- package/src/db/__tests__/list-row-meta-drift.test.ts +0 -15
- package/src/db/__tests__/located-timestamp.test.ts +0 -203
- package/src/db/__tests__/managed-recreate.integration.test.ts +0 -78
- package/src/db/__tests__/migrate-generator.test.ts +0 -383
- package/src/db/__tests__/migrate-runner.test.ts +0 -118
- package/src/db/__tests__/money.test.ts +0 -291
- package/src/db/__tests__/multi-row-insert.integration.test.ts +0 -88
- package/src/db/__tests__/number-field-fractional.integration.test.ts +0 -58
- package/src/db/__tests__/parent-ref-clause.test.ts +0 -213
- package/src/db/__tests__/parse-auto-verb.test.ts +0 -70
- package/src/db/__tests__/pg-error.test.ts +0 -57
- package/src/db/__tests__/rebuild-marker.test.ts +0 -180
- package/src/db/__tests__/replay-migration-sql.test.ts +0 -401
- package/src/db/__tests__/required-not-null-migration-safety.integration.test.ts +0 -109
- package/src/db/__tests__/run-in-own-transaction.integration.test.ts +0 -166
- package/src/db/__tests__/schema-inspection.test.ts +0 -27
- package/src/db/__tests__/schema-migration.integration.test.ts +0 -354
- package/src/db/__tests__/source-shadow-create.integration.test.ts +0 -59
- package/src/db/__tests__/system-db-view-export.test.ts +0 -107
- package/src/db/__tests__/table-builder-indexes.test.ts +0 -189
- package/src/db/__tests__/table-builder-meta-lockstep.test.ts +0 -224
- package/src/db/__tests__/table-builder-required.test.ts +0 -214
- package/src/db/__tests__/tenant-db-convention-cross-tenant.test.ts +0 -72
- package/src/db/__tests__/tenant-db-count.integration.test.ts +0 -92
- package/src/db/__tests__/tenant-db-declared-unsafe-raw.test.ts +0 -163
- package/src/db/__tests__/tenant-db-global.integration.test.ts +0 -134
- package/src/db/__tests__/tenant-db-global.test.ts +0 -352
- package/src/db/__tests__/tenant-db-no-raw.test.ts +0 -85
- package/src/db/__tests__/tenant-db-where-merge.integration.test.ts +0 -123
- package/src/db/__tests__/tenant-db-where-merge.test.ts +0 -164
- package/src/db/__tests__/tenant-db.integration.test.ts +0 -575
- package/src/db/__tests__/unchecked-system-db.test.ts +0 -259
- package/src/db/__tests__/unique-violation-mapping.integration.test.ts +0 -200
- package/src/db/__tests__/with-systemdb-unsafe-raw-grant.test.ts +0 -71
- package/src/db/api.ts +0 -52
- package/src/db/apply-entity-event.ts +0 -211
- package/src/db/assert-exists-in.ts +0 -52
- package/src/db/blind-index-cleanup.ts +0 -145
- package/src/db/bun-provider.ts +0 -42
- package/src/db/collect-table-metas.ts +0 -98
- package/src/db/compound-types.ts +0 -47
- package/src/db/config-seed.ts +0 -104
- package/src/db/connection.ts +0 -57
- package/src/db/cursor.ts +0 -47
- package/src/db/dialect.ts +0 -544
- package/src/db/eagerload.ts +0 -260
- package/src/db/entity-field-encryption.ts +0 -158
- package/src/db/entity-table-from-registry.ts +0 -31
- package/src/db/entity-table-meta-types.ts +0 -2
- package/src/db/entity-table-meta.ts +0 -491
- package/src/db/event-store-executor-context.ts +0 -510
- package/src/db/event-store-executor-read.ts +0 -916
- package/src/db/event-store-executor-write.ts +0 -920
- package/src/db/event-store-executor.ts +0 -50
- package/src/db/feature-table-sources.ts +0 -35
- package/src/db/index.ts +0 -162
- package/src/db/located-timestamp.ts +0 -118
- package/src/db/migrate-generator.ts +0 -549
- package/src/db/migrate-runner.ts +0 -348
- package/src/db/money.ts +0 -211
- package/src/db/parent-ref-clause.ts +0 -182
- package/src/db/pg-error.ts +0 -74
- package/src/db/postgres-provider.ts +0 -28
- package/src/db/queries/__tests__/event-store-idempotency-index.integration.test.ts +0 -78
- package/src/db/queries/__tests__/shadow-swap.test.ts +0 -43
- package/src/db/queries/__tests__/unsafe-read-retrying.integration.test.ts +0 -115
- package/src/db/queries/advisory-lock.ts +0 -11
- package/src/db/queries/backfill-pii.ts +0 -578
- package/src/db/queries/ddl.ts +0 -45
- package/src/db/queries/entity-read.ts +0 -15
- package/src/db/queries/es-ops.ts +0 -17
- package/src/db/queries/event-consumer.ts +0 -418
- package/src/db/queries/event-store-admin.ts +0 -130
- package/src/db/queries/event-store-transfer.ts +0 -73
- package/src/db/queries/event-store.ts +0 -354
- package/src/db/queries/pii-backfill-state.ts +0 -33
- package/src/db/queries/projection-rebuild.ts +0 -104
- package/src/db/queries/raw-sql.ts +0 -28
- package/src/db/queries/seed-context.ts +0 -62
- package/src/db/queries/shadow-swap.ts +0 -378
- package/src/db/queries/table-ops.ts +0 -11
- package/src/db/queries/test-stack.ts +0 -32
- package/src/db/query-api.ts +0 -24
- package/src/db/query.ts +0 -35
- package/src/db/rebuild-marker.ts +0 -103
- package/src/db/reference-data.ts +0 -73
- package/src/db/render-ddl.ts +0 -57
- package/src/db/replay-migration-sql.ts +0 -257
- package/src/db/schema-inspection.ts +0 -81
- package/src/db/table-builder.ts +0 -692
- package/src/db/tenant-db-runner.ts +0 -23
- package/src/db/tenant-db.ts +0 -727
- package/src/derivatives/__tests__/derivatives-context.integration.test.ts +0 -231
- package/src/derivatives/__tests__/derivatives-context.test.ts +0 -369
- package/src/derivatives/__tests__/field-variants.test.ts +0 -62
- package/src/derivatives/__tests__/variant-key.test.ts +0 -183
- package/src/derivatives/__tests__/variant-route.integration.test.ts +0 -268
- package/src/derivatives/delete-stored-file.ts +0 -86
- package/src/derivatives/derivatives-context.ts +0 -314
- package/src/derivatives/field-variants.ts +0 -20
- package/src/derivatives/index.ts +0 -14
- package/src/derivatives/variant-key.ts +0 -108
- package/src/engine/__tests__/_pipeline-test-utils.ts +0 -23
- package/src/engine/__tests__/auth-claims-registrar.test.ts +0 -74
- package/src/engine/__tests__/boot-validator-action-wiring.test.ts +0 -362
- package/src/engine/__tests__/boot-validator-api-exposure.test.ts +0 -142
- package/src/engine/__tests__/boot-validator-boot-check.test.ts +0 -104
- package/src/engine/__tests__/boot-validator-dashboard.test.ts +0 -381
- package/src/engine/__tests__/boot-validator-detail-for.test.ts +0 -106
- package/src/engine/__tests__/boot-validator-entity-list.test.ts +0 -120
- package/src/engine/__tests__/boot-validator-gdpr-storage.test.ts +0 -85
- package/src/engine/__tests__/boot-validator-i18n-keys.test.ts +0 -153
- package/src/engine/__tests__/boot-validator-located-timestamps.test.ts +0 -92
- package/src/engine/__tests__/boot-validator-nav-area.test.ts +0 -116
- package/src/engine/__tests__/boot-validator-pii-retention.test.ts +0 -994
- package/src/engine/__tests__/boot-validator-projection-list.test.ts +0 -629
- package/src/engine/__tests__/boot-validator-query-output-schema.test.ts +0 -578
- package/src/engine/__tests__/boot-validator-query-refs.test.ts +0 -151
- package/src/engine/__tests__/boot-validator-ref-entity.test.ts +0 -196
- package/src/engine/__tests__/boot-validator-s0-integration.test.ts +0 -172
- package/src/engine/__tests__/boot-validator.test.ts +0 -5984
- package/src/engine/__tests__/build-app-schema-settings-hub.test.ts +0 -246
- package/src/engine/__tests__/build-app-schema-url-prefill.test.ts +0 -222
- package/src/engine/__tests__/build-app-schema.test.ts +0 -1167
- package/src/engine/__tests__/build-config-feature-schema-extension-selector.test.ts +0 -395
- package/src/engine/__tests__/build-config-feature-schema-secrets.test.ts +0 -188
- package/src/engine/__tests__/build-config-feature-schema.test.ts +0 -511
- package/src/engine/__tests__/build-target.test.ts +0 -127
- package/src/engine/__tests__/changeset-changes.test.ts +0 -64
- package/src/engine/__tests__/claim-keys.test.ts +0 -274
- package/src/engine/__tests__/codemod-pipeline.test.ts +0 -682
- package/src/engine/__tests__/config-helpers.test.ts +0 -309
- package/src/engine/__tests__/content-collection.test.ts +0 -307
- package/src/engine/__tests__/decimal-field.test.ts +0 -59
- package/src/engine/__tests__/dedupe-features.test.ts +0 -85
- package/src/engine/__tests__/define-feature-entity-mapping.test.ts +0 -53
- package/src/engine/__tests__/define-roles.test.ts +0 -21
- package/src/engine/__tests__/define-workflow.test.ts +0 -79
- package/src/engine/__tests__/describe-workflow-step-error.test.ts +0 -17
- package/src/engine/__tests__/duration-utils.test.ts +0 -16
- package/src/engine/__tests__/effective-features.test.ts +0 -86
- package/src/engine/__tests__/embedded-derived.test.ts +0 -35
- package/src/engine/__tests__/engine.test.ts +0 -2406
- package/src/engine/__tests__/entity-create-caller-id.integration.test.ts +0 -87
- package/src/engine/__tests__/entity-exclude-fields.integration.test.ts +0 -134
- package/src/engine/__tests__/entity-handlers-escape-hatch.test.ts +0 -91
- package/src/engine/__tests__/entity-handlers.test.ts +0 -562
- package/src/engine/__tests__/entity-presave-wiring.integration.test.ts +0 -153
- package/src/engine/__tests__/entity-restore-tenant-isolation.integration.test.ts +0 -168
- package/src/engine/__tests__/entity-write-crosstenant.integration.test.ts +0 -317
- package/src/engine/__tests__/event-helpers.test.ts +0 -68
- package/src/engine/__tests__/event-migration-declarative.test.ts +0 -67
- package/src/engine/__tests__/event-type-map-augmentation.test.ts +0 -24
- package/src/engine/__tests__/extend-entity-projection.test.ts +0 -133
- package/src/engine/__tests__/extends-registrar.test.ts +0 -279
- package/src/engine/__tests__/factories-long-text.test.ts +0 -95
- package/src/engine/__tests__/factories-number-unit.test.ts +0 -23
- package/src/engine/__tests__/factories-personal.test.ts +0 -216
- package/src/engine/__tests__/factories-time.test.ts +0 -94
- package/src/engine/__tests__/feature-crud-shorthand.test.ts +0 -73
- package/src/engine/__tests__/feature-crud-verb-access.integration.test.ts +0 -83
- package/src/engine/__tests__/feature-manifest.test.ts +0 -137
- package/src/engine/__tests__/field-access.test.ts +0 -65
- package/src/engine/__tests__/field-predicates.test.ts +0 -48
- package/src/engine/__tests__/form-money-currency-types.test.ts +0 -90
- package/src/engine/__tests__/hook-identity-switch-grant.test.ts +0 -188
- package/src/engine/__tests__/hook-phases.test.ts +0 -172
- package/src/engine/__tests__/http-route-anonymous-required.test.ts +0 -43
- package/src/engine/__tests__/identifiers.test.ts +0 -35
- package/src/engine/__tests__/lifecycle-hooks.test.ts +0 -243
- package/src/engine/__tests__/membership-roles.test.ts +0 -67
- package/src/engine/__tests__/metric-navigate-tab.test.ts +0 -167
- package/src/engine/__tests__/multiselect-filter.integration.test.ts +0 -141
- package/src/engine/__tests__/nav.test.ts +0 -497
- package/src/engine/__tests__/no-return-guard.test.ts +0 -17
- package/src/engine/__tests__/ownership.test.ts +0 -475
- package/src/engine/__tests__/parse-ref-target.test.ts +0 -43
- package/src/engine/__tests__/pipeline-engine.test.ts +0 -215
- package/src/engine/__tests__/pipeline-handler.integration.test.ts +0 -880
- package/src/engine/__tests__/pipeline-observability.integration.test.ts +0 -142
- package/src/engine/__tests__/pipeline-performance.integration.test.ts +0 -152
- package/src/engine/__tests__/pipeline-sub-pipelines.test.ts +0 -288
- package/src/engine/__tests__/post-query-hook.test.ts +0 -144
- package/src/engine/__tests__/project-app-schema-for-roles.test.ts +0 -500
- package/src/engine/__tests__/projection-detail-actions.test.ts +0 -145
- package/src/engine/__tests__/projection-detail-singleton.test.ts +0 -86
- package/src/engine/__tests__/projection-detail-tabs.test.ts +0 -314
- package/src/engine/__tests__/projection-helpers.test.ts +0 -75
- package/src/engine/__tests__/projection-list-filter.integration.test.ts +0 -115
- package/src/engine/__tests__/projection.test.ts +0 -191
- package/src/engine/__tests__/qualified-name.test.ts +0 -306
- package/src/engine/__tests__/read-steps-tenant-filter.integration.test.ts +0 -215
- package/src/engine/__tests__/registrar-object-form.test.ts +0 -141
- package/src/engine/__tests__/registry.test.ts +0 -326
- package/src/engine/__tests__/required-surface-keys.test.ts +0 -477
- package/src/engine/__tests__/resolve-config-or-param.test.ts +0 -315
- package/src/engine/__tests__/role-assignment.test.ts +0 -71
- package/src/engine/__tests__/row-action-navigate-tab.test.ts +0 -107
- package/src/engine/__tests__/run-in.test.ts +0 -38
- package/src/engine/__tests__/schema-builder-date-bounds.test.ts +0 -47
- package/src/engine/__tests__/schema-builder.test.ts +0 -1211
- package/src/engine/__tests__/screen-definition-exports.test.ts +0 -102
- package/src/engine/__tests__/screen-filter-ops.test.ts +0 -31
- package/src/engine/__tests__/screen-helpers.test.ts +0 -52
- package/src/engine/__tests__/screen.test.ts +0 -1684
- package/src/engine/__tests__/search-payload-extension.test.ts +0 -288
- package/src/engine/__tests__/soft-delete-cleanup-job-tenant-db.integration.test.ts +0 -82
- package/src/engine/__tests__/soft-delete-cleanup.test.ts +0 -167
- package/src/engine/__tests__/state-machine.test.ts +0 -148
- package/src/engine/__tests__/steps-aggregate-append-event.test.ts +0 -115
- package/src/engine/__tests__/steps-aggregate-create.test.ts +0 -92
- package/src/engine/__tests__/steps-aggregate-update.test.ts +0 -127
- package/src/engine/__tests__/steps-call-feature.test.ts +0 -123
- package/src/engine/__tests__/steps-mail-send.test.ts +0 -137
- package/src/engine/__tests__/steps-read.test.ts +0 -332
- package/src/engine/__tests__/steps-resolver-utils.test.ts +0 -50
- package/src/engine/__tests__/steps-unsafe-projection-delete.test.ts +0 -77
- package/src/engine/__tests__/steps-unsafe-projection-upsert.test.ts +0 -131
- package/src/engine/__tests__/steps-webhook-send.test.ts +0 -143
- package/src/engine/__tests__/steps-workflow.test.ts +0 -353
- package/src/engine/__tests__/store-table.test.ts +0 -247
- package/src/engine/__tests__/system-user.test.ts +0 -57
- package/src/engine/__tests__/tier-resolver-extension.test.ts +0 -69
- package/src/engine/__tests__/toolbar-navigate-tab.test.ts +0 -233
- package/src/engine/__tests__/tree-actions-patterns.test.ts +0 -163
- package/src/engine/__tests__/validate-custom-screen-write-qns.test.ts +0 -43
- package/src/engine/__tests__/validate-projection-allowlist.test.ts +0 -498
- package/src/engine/__tests__/validation-hooks.test.ts +0 -77
- package/src/engine/__tests__/where-rule-lint.test.ts +0 -79
- package/src/engine/__tests__/write-handler-qn-extract.test.ts +0 -50
- package/src/engine/access.ts +0 -27
- package/src/engine/active-membership.ts +0 -70
- package/src/engine/boot-validator/__tests__/access-declarations.test.ts +0 -707
- package/src/engine/boot-validator/__tests__/access-roles.test.ts +0 -84
- package/src/engine/boot-validator/__tests__/action-icon.test.ts +0 -81
- package/src/engine/boot-validator/__tests__/anonymous-rate-limit-required.test.ts +0 -63
- package/src/engine/boot-validator/__tests__/config-deps.test.ts +0 -92
- package/src/engine/boot-validator/__tests__/global-tenancy.test.ts +0 -73
- package/src/engine/boot-validator/__tests__/i18n-keys.test.ts +0 -340
- package/src/engine/boot-validator/__tests__/nav.test.ts +0 -290
- package/src/engine/boot-validator/__tests__/no-all-role-in-handler-access.test.ts +0 -77
- package/src/engine/boot-validator/__tests__/ownership.test.ts +0 -87
- package/src/engine/boot-validator/__tests__/parent-ref.test.ts +0 -161
- package/src/engine/boot-validator/__tests__/rate-limit-disabled-reason.test.ts +0 -45
- package/src/engine/boot-validator/__tests__/record-owned.test.ts +0 -65
- package/src/engine/boot-validator/__tests__/security-baseline.test.ts +0 -107
- package/src/engine/boot-validator/__tests__/transfer-graph.test.ts +0 -138
- package/src/engine/boot-validator/access-declarations.ts +0 -211
- package/src/engine/boot-validator/access-roles.ts +0 -85
- package/src/engine/boot-validator/action-wiring.ts +0 -163
- package/src/engine/boot-validator/api-ext.ts +0 -81
- package/src/engine/boot-validator/boot-check.ts +0 -21
- package/src/engine/boot-validator/config-deps.ts +0 -246
- package/src/engine/boot-validator/custom-screen-write-qns.ts +0 -87
- package/src/engine/boot-validator/detail-screens.ts +0 -49
- package/src/engine/boot-validator/entity-handler.ts +0 -1011
- package/src/engine/boot-validator/entity-list-screens.ts +0 -100
- package/src/engine/boot-validator/gdpr-storage.ts +0 -59
- package/src/engine/boot-validator/global-tenancy.ts +0 -29
- package/src/engine/boot-validator/i18n-keys.ts +0 -101
- package/src/engine/boot-validator/index.ts +0 -301
- package/src/engine/boot-validator/nav.ts +0 -241
- package/src/engine/boot-validator/ownership.ts +0 -352
- package/src/engine/boot-validator/parent-ref.ts +0 -96
- package/src/engine/boot-validator/pii-retention.ts +0 -272
- package/src/engine/boot-validator/projection-list-screens.ts +0 -293
- package/src/engine/boot-validator/query-output-columns.ts +0 -273
- package/src/engine/boot-validator/query-refs.ts +0 -141
- package/src/engine/boot-validator/record-owned.ts +0 -21
- package/src/engine/boot-validator/screens.ts +0 -2604
- package/src/engine/boot-validator/security-baseline.ts +0 -26
- package/src/engine/boot-validator/transfer-graph.ts +0 -135
- package/src/engine/boot-validator/url-prefill-fields.ts +0 -178
- package/src/engine/boot-validator/workspaces.ts +0 -106
- package/src/engine/boot-validator/zod-shape.ts +0 -142
- package/src/engine/boot-validator.ts +0 -8
- package/src/engine/build-app-schema.ts +0 -542
- package/src/engine/build-config-feature-schema.ts +0 -815
- package/src/engine/build-target.ts +0 -99
- package/src/engine/changeset-changes.ts +0 -117
- package/src/engine/codemod/index.ts +0 -15
- package/src/engine/codemod/pipeline-codemod.ts +0 -641
- package/src/engine/config-helpers.ts +0 -217
- package/src/engine/constants.ts +0 -117
- package/src/engine/create-app.ts +0 -177
- package/src/engine/cross-tenant.test.ts +0 -32
- package/src/engine/cross-tenant.ts +0 -22
- package/src/engine/dedupe-features.ts +0 -46
- package/src/engine/define-feature.ts +0 -169
- package/src/engine/define-handler.ts +0 -194
- package/src/engine/define-roles.ts +0 -19
- package/src/engine/define-step.ts +0 -28
- package/src/engine/define-workflow.ts +0 -147
- package/src/engine/effective-features.ts +0 -97
- package/src/engine/embedded-derived.ts +0 -93
- package/src/engine/entity-handlers.ts +0 -782
- package/src/engine/escape-hatch-declaration.ts +0 -7
- package/src/engine/event-helpers.ts +0 -73
- package/src/engine/extension-names.ts +0 -242
- package/src/engine/extension-selector-plugins.ts +0 -24
- package/src/engine/extensions/__tests__/hook-ctx-db-tenant-scoped.test.ts +0 -76
- package/src/engine/extensions/escape-hatch-usage.ts +0 -16
- package/src/engine/extensions/storage-provider.ts +0 -16
- package/src/engine/extensions/tenant-data.ts +0 -34
- package/src/engine/extensions/tenant-resource.ts +0 -40
- package/src/engine/extensions/user-data.ts +0 -181
- package/src/engine/factories.ts +0 -559
- package/src/engine/feature-ast/__tests__/canonical-form.test.ts +0 -416
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-name-const/constants.ts +0 -1
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-name-const/feature.ts +0 -8
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-patch-const/constants.ts +0 -2
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-patch-const/feature.ts +0 -8
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/feature.ts +0 -9
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/screens.ts +0 -4
- package/src/engine/feature-ast/__tests__/fixtures/resolve-import/alias-reexport.ts +0 -1
- package/src/engine/feature-ast/__tests__/fixtures/resolve-import/cycle-a.ts +0 -1
- package/src/engine/feature-ast/__tests__/fixtures/resolve-import/cycle-b.ts +0 -1
- package/src/engine/feature-ast/__tests__/fixtures/resolve-import/entry.ts +0 -3
- package/src/engine/feature-ast/__tests__/fixtures/resolve-import/local-rebind.ts +0 -3
- package/src/engine/feature-ast/__tests__/fixtures/resolve-import/origin.ts +0 -1
- package/src/engine/feature-ast/__tests__/fixtures/resolve-import/star-barrel.ts +0 -1
- package/src/engine/feature-ast/__tests__/handler-header-roundtrip.test.ts +0 -669
- package/src/engine/feature-ast/__tests__/parse-happy-path.test.ts +0 -196
- package/src/engine/feature-ast/__tests__/parse-real-features.test.ts +0 -138
- package/src/engine/feature-ast/__tests__/parse.test.ts +0 -2841
- package/src/engine/feature-ast/__tests__/patch-update.test.ts +0 -718
- package/src/engine/feature-ast/__tests__/patch.test.ts +0 -780
- package/src/engine/feature-ast/__tests__/patcher.test.ts +0 -468
- package/src/engine/feature-ast/__tests__/pattern-change-schema.test.ts +0 -819
- package/src/engine/feature-ast/__tests__/read-optional-access-rule.test.ts +0 -42
- package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +0 -947
- package/src/engine/feature-ast/__tests__/resolve-import.test.ts +0 -138
- package/src/engine/feature-ast/entity-field-types.ts +0 -41
- package/src/engine/feature-ast/extractors/ai-steps.ts +0 -352
- package/src/engine/feature-ast/extractors/events.ts +0 -349
- package/src/engine/feature-ast/extractors/handlers.ts +0 -459
- package/src/engine/feature-ast/extractors/hooks.ts +0 -331
- package/src/engine/feature-ast/extractors/index.ts +0 -92
- package/src/engine/feature-ast/extractors/jobs-routes.ts +0 -225
- package/src/engine/feature-ast/extractors/projections-screens.ts +0 -269
- package/src/engine/feature-ast/extractors/resolve-import.ts +0 -187
- package/src/engine/feature-ast/extractors/round1.ts +0 -150
- package/src/engine/feature-ast/extractors/round2.ts +0 -276
- package/src/engine/feature-ast/extractors/round3.ts +0 -474
- package/src/engine/feature-ast/extractors/round5.ts +0 -114
- package/src/engine/feature-ast/extractors/round6.ts +0 -32
- package/src/engine/feature-ast/extractors/shared.ts +0 -356
- package/src/engine/feature-ast/index.ts +0 -113
- package/src/engine/feature-ast/parse.ts +0 -615
- package/src/engine/feature-ast/patch.ts +0 -979
- package/src/engine/feature-ast/patcher.ts +0 -546
- package/src/engine/feature-ast/pattern-change-schema.ts +0 -1411
- package/src/engine/feature-ast/patterns.ts +0 -803
- package/src/engine/feature-ast/render.ts +0 -767
- package/src/engine/feature-ast/source-location.ts +0 -45
- package/src/engine/feature-builder-state.ts +0 -174
- package/src/engine/feature-changelog.ts +0 -95
- package/src/engine/feature-config-events-jobs.ts +0 -472
- package/src/engine/feature-entity-handlers.ts +0 -269
- package/src/engine/feature-manifest.ts +0 -173
- package/src/engine/feature-ui-extensions.ts +0 -648
- package/src/engine/field-access.ts +0 -140
- package/src/engine/field-helpers.ts +0 -35
- package/src/engine/handler-helpers.ts +0 -26
- package/src/engine/hook-helpers.ts +0 -16
- package/src/engine/i18n-key.ts +0 -12
- package/src/engine/index.ts +0 -585
- package/src/engine/instruction-fields.ts +0 -11
- package/src/engine/membership-roles.ts +0 -61
- package/src/engine/object-form.ts +0 -27
- package/src/engine/ownership.ts +0 -404
- package/src/engine/parse-ref-target.ts +0 -28
- package/src/engine/pattern-library/__tests__/library.test.ts +0 -399
- package/src/engine/pattern-library/index.ts +0 -24
- package/src/engine/pattern-library/library.ts +0 -140
- package/src/engine/pattern-library/mixed-schemas.ts +0 -588
- package/src/engine/pattern-library/opaque-schemas.ts +0 -124
- package/src/engine/pattern-library/shared-fields.ts +0 -79
- package/src/engine/pattern-library/static-schemas.ts +0 -456
- package/src/engine/pattern-library/types.ts +0 -255
- package/src/engine/personal-data-fields.ts +0 -66
- package/src/engine/pipeline.ts +0 -111
- package/src/engine/project-app-schema-for-roles.ts +0 -950
- package/src/engine/projection-helpers.ts +0 -79
- package/src/engine/qualified-name.ts +0 -165
- package/src/engine/read-claim.ts +0 -31
- package/src/engine/registry-facade.ts +0 -381
- package/src/engine/registry-ingest.ts +0 -479
- package/src/engine/registry-state.ts +0 -410
- package/src/engine/registry-validate.ts +0 -810
- package/src/engine/registry.ts +0 -94
- package/src/engine/resolve-config-or-param.ts +0 -157
- package/src/engine/role-assignment.ts +0 -63
- package/src/engine/run-in.ts +0 -29
- package/src/engine/run-pipeline.ts +0 -162
- package/src/engine/schema-builder.ts +0 -428
- package/src/engine/screen-filter-ops.ts +0 -60
- package/src/engine/screen-helpers.ts +0 -161
- package/src/engine/soft-delete-cleanup.ts +0 -126
- package/src/engine/state-machine.ts +0 -71
- package/src/engine/steps/__tests__/duration-utils.test.ts +0 -20
- package/src/engine/steps/_duration-utils.ts +0 -35
- package/src/engine/steps/_event-match.ts +0 -98
- package/src/engine/steps/_no-return-guard.ts +0 -21
- package/src/engine/steps/_read-source.ts +0 -12
- package/src/engine/steps/_resolver-utils.ts +0 -42
- package/src/engine/steps/_step-dispatch-constants.ts +0 -38
- package/src/engine/steps/aggregate-append-event.ts +0 -56
- package/src/engine/steps/aggregate-create.ts +0 -56
- package/src/engine/steps/aggregate-update.ts +0 -68
- package/src/engine/steps/branch.ts +0 -84
- package/src/engine/steps/call-feature.ts +0 -49
- package/src/engine/steps/compute.ts +0 -41
- package/src/engine/steps/describe-workflow-step-error.ts +0 -6
- package/src/engine/steps/for-each.ts +0 -111
- package/src/engine/steps/mail-send.ts +0 -48
- package/src/engine/steps/read-find-many.ts +0 -57
- package/src/engine/steps/read-find-one.ts +0 -59
- package/src/engine/steps/retry.ts +0 -99
- package/src/engine/steps/return.ts +0 -35
- package/src/engine/steps/unsafe-projection-delete.ts +0 -50
- package/src/engine/steps/unsafe-projection-upsert.ts +0 -88
- package/src/engine/steps/wait-for-event.ts +0 -90
- package/src/engine/steps/wait.ts +0 -69
- package/src/engine/steps/webhook-send.ts +0 -63
- package/src/engine/system-user.ts +0 -38
- package/src/engine/tier-resolver-extension.ts +0 -107
- package/src/engine/types/config.ts +0 -2
- package/src/engine/types/define-handler.ts +0 -2
- package/src/engine/types/entity-handlers.ts +0 -2
- package/src/engine/types/feature.ts +0 -2
- package/src/engine/types/fields.ts +0 -2
- package/src/engine/types/handlers.ts +0 -3
- package/src/engine/types/hooks.ts +0 -2
- package/src/engine/types/index.ts +0 -394
- package/src/engine/types/nav.ts +0 -2
- package/src/engine/types/ownership.ts +0 -2
- package/src/engine/types/projection.ts +0 -2
- package/src/engine/types/screen.ts +0 -3
- package/src/engine/types/step.ts +0 -2
- package/src/engine/types/workspace.ts +0 -2
- package/src/engine/validate-projection-allowlist.ts +0 -191
- package/src/engine/validation.ts +0 -33
- package/src/engine/where-rule-lint.ts +0 -196
- package/src/engine/write-handler-qn-extract.ts +0 -47
- package/src/entrypoint/__tests__/entrypoint-attach-dispatcher.integration.test.ts +0 -140
- package/src/entrypoint/__tests__/entrypoint-job-wiring.integration.test.ts +0 -292
- package/src/entrypoint/__tests__/split-deploy.integration.test.ts +0 -467
- package/src/entrypoint/index.ts +0 -541
- package/src/env/__tests__/compose-env-schema.test.ts +0 -410
- package/src/env/__tests__/dry-run.test.ts +0 -161
- package/src/env/__tests__/parse-env-dry-run.test.ts +0 -40
- package/src/env/_zod-introspect.ts +0 -51
- package/src/env/dry-run.ts +0 -204
- package/src/env/index.ts +0 -435
- package/src/errors/__tests__/classes.test.ts +0 -442
- package/src/errors/__tests__/error-helpers.test.ts +0 -58
- package/src/errors/__tests__/reason-i18n.test.ts +0 -46
- package/src/errors/__tests__/write-failures.test.ts +0 -167
- package/src/errors/classes.ts +0 -311
- package/src/errors/field-issue.ts +0 -8
- package/src/errors/i18n/de.yaml +0 -244
- package/src/errors/i18n/en.yaml +0 -234
- package/src/errors/index.ts +0 -47
- package/src/errors/kumiko-error.ts +0 -67
- package/src/errors/member-resolution.ts +0 -12
- package/src/errors/reasons.ts +0 -102
- package/src/errors/serialize.ts +0 -136
- package/src/errors/to-kumiko-error.ts +0 -8
- package/src/errors/transition-details.ts +0 -30
- package/src/errors/write-error-info.ts +0 -124
- package/src/errors/zod-bridge.ts +0 -62
- package/src/es-ops/README.md +0 -179
- package/src/es-ops/__tests__/context.integration.test.ts +0 -378
- package/src/es-ops/__tests__/runner.integration.test.ts +0 -483
- package/src/es-ops/__tests__/runner.test.ts +0 -202
- package/src/es-ops/context.ts +0 -98
- package/src/es-ops/index.ts +0 -34
- package/src/es-ops/operations-schema.ts +0 -57
- package/src/es-ops/runner.ts +0 -253
- package/src/es-ops/types.ts +0 -124
- package/src/event-store/__tests__/admin-api.integration.test.ts +0 -412
- package/src/event-store/__tests__/backfill-pii.integration.test.ts +0 -880
- package/src/event-store/__tests__/event-attribution.integration.test.ts +0 -236
- package/src/event-store/__tests__/event-store.integration.test.ts +0 -932
- package/src/event-store/__tests__/get-stream-version-perf.integration.test.ts +0 -87
- package/src/event-store/__tests__/perf.integration.test.ts +0 -283
- package/src/event-store/__tests__/provenance-append.integration.test.ts +0 -140
- package/src/event-store/__tests__/row-to-stored-event.test.ts +0 -68
- package/src/event-store/__tests__/snapshot.integration.test.ts +0 -328
- package/src/event-store/__tests__/transfer.integration.test.ts +0 -236
- package/src/event-store/__tests__/unscoped-stream-primitives.guard.test.ts +0 -62
- package/src/event-store/__tests__/upcaster-dead-letter.integration.test.ts +0 -202
- package/src/event-store/__tests__/upcaster.integration.test.ts +0 -491
- package/src/event-store/admin-api.ts +0 -241
- package/src/event-store/archive.ts +0 -83
- package/src/event-store/errors.ts +0 -58
- package/src/event-store/event-store.ts +0 -449
- package/src/event-store/events-schema.ts +0 -89
- package/src/event-store/index.ts +0 -80
- package/src/event-store/provenance-append.ts +0 -67
- package/src/event-store/rebuild-dead-letter.ts +0 -111
- package/src/event-store/row-to-stored-event.ts +0 -34
- package/src/event-store/snapshot.ts +0 -235
- package/src/event-store/transfer.ts +0 -84
- package/src/event-store/types.ts +0 -2
- package/src/event-store/upcaster-dead-letter.ts +0 -120
- package/src/event-store/upcaster.ts +0 -147
- package/src/files/__tests__/build-storage-key.test.ts +0 -28
- package/src/files/__tests__/content-disposition.test.ts +0 -123
- package/src/files/__tests__/file-field-pipeline.integration.test.ts +0 -229
- package/src/files/__tests__/file-handle.test.ts +0 -175
- package/src/files/__tests__/file-ref-entity.test.ts +0 -42
- package/src/files/__tests__/files.integration.test.ts +0 -1749
- package/src/files/__tests__/in-memory-provider.contract.test.ts +0 -4
- package/src/files/__tests__/in-memory-provider.test.ts +0 -94
- package/src/files/__tests__/local-provider.contract.test.ts +0 -14
- package/src/files/__tests__/local-provider.test.ts +0 -31
- package/src/files/__tests__/provider-resolver.test.ts +0 -70
- package/src/files/__tests__/read-stream.test.ts +0 -105
- package/src/files/__tests__/storage-tracking.integration.test.ts +0 -238
- package/src/files/__tests__/storage-tracking.test.ts +0 -46
- package/src/files/__tests__/write-stream.test.ts +0 -250
- package/src/files/__tests__/zip-stream.test.ts +0 -357
- package/src/files/content-disposition.ts +0 -55
- package/src/files/feature.ts +0 -44
- package/src/files/file-handle.ts +0 -83
- package/src/files/file-ref-entity.ts +0 -33
- package/src/files/file-ref-table.ts +0 -13
- package/src/files/file-routes.ts +0 -579
- package/src/files/in-memory-provider.ts +0 -113
- package/src/files/index.ts +0 -57
- package/src/files/local-provider.ts +0 -132
- package/src/files/provider-resolver.ts +0 -176
- package/src/files/storage-tracking.ts +0 -245
- package/src/files/types.ts +0 -336
- package/src/files/zip-stream.ts +0 -251
- package/src/http/index.ts +0 -10
- package/src/i18n/__tests__/i18n.test.ts +0 -113
- package/src/i18n/__tests__/mail-registry.test.ts +0 -54
- package/src/i18n/__tests__/request-locale.test.ts +0 -19
- package/src/i18n/__tests__/required-surface-keys.test.ts +0 -17
- package/src/i18n/index.ts +0 -51
- package/src/i18n/mail-registry.ts +0 -42
- package/src/i18n/request-locale.ts +0 -72
- package/src/i18n/required-surface-keys.ts +0 -459
- package/src/i18n/settings-hub-keys.ts +0 -31
- package/src/jobs/__tests__/job-attempt-context.integration.test.ts +0 -76
- package/src/jobs/__tests__/job-backoff.integration.test.ts +0 -147
- package/src/jobs/__tests__/job-event-trigger.integration.test.ts +0 -175
- package/src/jobs/__tests__/job-last-success.integration.test.ts +0 -135
- package/src/jobs/__tests__/job-multi-trigger.integration.test.ts +0 -147
- package/src/jobs/__tests__/job-public-intake-origin.integration.test.ts +0 -536
- package/src/jobs/__tests__/job-queue-depth.integration.test.ts +0 -82
- package/src/jobs/__tests__/job-retention.integration.test.ts +0 -316
- package/src/jobs/__tests__/job-retry-enqueue-paths.integration.test.ts +0 -309
- package/src/jobs/__tests__/job-runner-boot-timeout.test.ts +0 -55
- package/src/jobs/__tests__/job-systemdb.integration.test.ts +0 -153
- package/src/jobs/__tests__/job-tenant-db.integration.test.ts +0 -162
- package/src/jobs/__tests__/job-write-as.integration.test.ts +0 -251
- package/src/jobs/__tests__/jobs.integration.test.ts +0 -1563
- package/src/jobs/__tests__/scheduler-id.test.ts +0 -30
- package/src/jobs/index.ts +0 -8
- package/src/jobs/job-runner.ts +0 -1390
- package/src/lifecycle/__tests__/create-test-lifecycle.ts +0 -19
- package/src/lifecycle/__tests__/lifecycle-server.integration.test.ts +0 -108
- package/src/lifecycle/__tests__/lifecycle.test.ts +0 -212
- package/src/lifecycle/__tests__/signal-handlers.test.ts +0 -98
- package/src/lifecycle/index.ts +0 -13
- package/src/lifecycle/lifecycle.ts +0 -157
- package/src/lifecycle/signal-handlers.ts +0 -64
- package/src/logging/__tests__/fallback-logger.test.ts +0 -90
- package/src/logging/__tests__/pino-trace-bridge.test.ts +0 -50
- package/src/logging/index.ts +0 -4
- package/src/logging/pino-logger.ts +0 -68
- package/src/logging/utils.ts +0 -50
- package/src/migrations/__tests__/kumiko-drift.integration.test.ts +0 -238
- package/src/migrations/__tests__/kumiko-drift.report.test.ts +0 -105
- package/src/migrations/__tests__/pending-rebuilds.integration.test.ts +0 -412
- package/src/migrations/__tests__/pii-event-backfill.integration.test.ts +0 -457
- package/src/migrations/index.ts +0 -36
- package/src/migrations/kumiko-drift.ts +0 -187
- package/src/migrations/pending-rebuilds.ts +0 -251
- package/src/migrations/pii-event-backfill.ts +0 -422
- package/src/migrations/projection-table-index.ts +0 -23
- package/src/observability/__tests__/console-provider.test.ts +0 -67
- package/src/observability/__tests__/escape-hatch-report.test.ts +0 -149
- package/src/observability/__tests__/metric-validator.test.ts +0 -95
- package/src/observability/__tests__/metrics-handle.test.ts +0 -30
- package/src/observability/__tests__/metrics-wiring.test.ts +0 -61
- package/src/observability/__tests__/noop-provider.test.ts +0 -82
- package/src/observability/__tests__/observability.integration.test.ts +0 -639
- package/src/observability/__tests__/prometheus-meter.test.ts +0 -144
- package/src/observability/__tests__/recording-meter.test.ts +0 -101
- package/src/observability/__tests__/recording-tracer.test.ts +0 -112
- package/src/observability/__tests__/sensitive-filter.test.ts +0 -98
- package/src/observability/console-provider.ts +0 -130
- package/src/observability/context.ts +0 -26
- package/src/observability/escape-hatch-report.ts +0 -129
- package/src/observability/fallback.ts +0 -34
- package/src/observability/ids.ts +0 -25
- package/src/observability/index.ts +0 -88
- package/src/observability/metric-validator.ts +0 -98
- package/src/observability/metrics-handle.ts +0 -105
- package/src/observability/metrics-wiring.ts +0 -32
- package/src/observability/noop-provider.ts +0 -137
- package/src/observability/prometheus-meter.ts +0 -286
- package/src/observability/recording-meter.ts +0 -156
- package/src/observability/recording-tracer.ts +0 -186
- package/src/observability/redis-wrapper.ts +0 -132
- package/src/observability/sensitive-filter.ts +0 -108
- package/src/observability/standard-metrics.ts +0 -295
- package/src/pipeline/__tests__/archive-stream.integration.test.ts +0 -299
- package/src/pipeline/__tests__/auth-claims-resolver.test.ts +0 -279
- package/src/pipeline/__tests__/blind-index-rebuild-guard.integration.test.ts +0 -94
- package/src/pipeline/__tests__/cascade-handler.integration.test.ts +0 -435
- package/src/pipeline/__tests__/cascade-handler.test.ts +0 -67
- package/src/pipeline/__tests__/causation-chain.integration.test.ts +0 -207
- package/src/pipeline/__tests__/ctx-bridge.integration.test.ts +0 -507
- package/src/pipeline/__tests__/ctx-systemdb.integration.test.ts +0 -120
- package/src/pipeline/__tests__/dispatcher-utils.test.ts +0 -132
- package/src/pipeline/__tests__/dispatcher.test.ts +0 -1091
- package/src/pipeline/__tests__/distributed-lock.integration.test.ts +0 -110
- package/src/pipeline/__tests__/domain-events-projections.integration.test.ts +0 -323
- package/src/pipeline/__tests__/escape-hatch-audit.integration.test.ts +0 -254
- package/src/pipeline/__tests__/escape-hatch.integration.test.ts +0 -90
- package/src/pipeline/__tests__/event-consumer-state.integration.test.ts +0 -81
- package/src/pipeline/__tests__/event-dedup.integration.test.ts +0 -153
- package/src/pipeline/__tests__/event-define-event-strict.integration.test.ts +0 -196
- package/src/pipeline/__tests__/event-dispatcher-batch-delivery.test.ts +0 -178
- package/src/pipeline/__tests__/event-dispatcher-batch-handler.integration.test.ts +0 -143
- package/src/pipeline/__tests__/event-dispatcher-commit-order.integration.test.ts +0 -278
- package/src/pipeline/__tests__/event-dispatcher-db-outage.integration.test.ts +0 -224
- package/src/pipeline/__tests__/event-dispatcher-delivery-max-attempts.test.ts +0 -127
- package/src/pipeline/__tests__/event-dispatcher-idle.integration.test.ts +0 -94
- package/src/pipeline/__tests__/event-dispatcher-lifecycle.integration.test.ts +0 -209
- package/src/pipeline/__tests__/event-dispatcher-multi-instance.integration.test.ts +0 -424
- package/src/pipeline/__tests__/event-dispatcher-pass-failure.integration.test.ts +0 -266
- package/src/pipeline/__tests__/event-dispatcher-per-consumer-turns.integration.test.ts +0 -126
- package/src/pipeline/__tests__/event-dispatcher-pg-listen.integration.test.ts +0 -106
- package/src/pipeline/__tests__/event-dispatcher-rearm.integration.test.ts +0 -263
- package/src/pipeline/__tests__/event-dispatcher-recovery.integration.test.ts +0 -202
- package/src/pipeline/__tests__/event-dispatcher-second-audit.integration.test.ts +0 -282
- package/src/pipeline/__tests__/event-dispatcher-start-from.integration.test.ts +0 -276
- package/src/pipeline/__tests__/event-dispatcher-strict.test.ts +0 -67
- package/src/pipeline/__tests__/event-dispatcher.integration.test.ts +0 -290
- package/src/pipeline/__tests__/event-retention.integration.test.ts +0 -242
- package/src/pipeline/__tests__/fetch-for-writing.integration.test.ts +0 -364
- package/src/pipeline/__tests__/hook-systemdb-escape-hatch.integration.test.ts +0 -246
- package/src/pipeline/__tests__/idempotency-transient-failure.integration.test.ts +0 -198
- package/src/pipeline/__tests__/instruction-field-gate.integration.test.ts +0 -213
- package/src/pipeline/__tests__/irreversible-operation-gate.integration.test.ts +0 -249
- package/src/pipeline/__tests__/job-trigger-consumer.integration.test.ts +0 -235
- package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +0 -800
- package/src/pipeline/__tests__/load-aggregate-query.integration.test.ts +0 -281
- package/src/pipeline/__tests__/member-resolution-read-only.test.ts +0 -79
- package/src/pipeline/__tests__/msp-error-mode.integration.test.ts +0 -149
- package/src/pipeline/__tests__/msp-multi-hop.integration.test.ts +0 -231
- package/src/pipeline/__tests__/msp-rebuild.integration.test.ts +0 -510
- package/src/pipeline/__tests__/multi-stream-projection.integration.test.ts +0 -313
- package/src/pipeline/__tests__/pending-gap-ranges.test.ts +0 -94
- package/src/pipeline/__tests__/perf-rebuild.integration.test.ts +0 -147
- package/src/pipeline/__tests__/post-query-hook.integration.test.ts +0 -165
- package/src/pipeline/__tests__/projection-rebuild.integration.test.ts +0 -1033
- package/src/pipeline/__tests__/projections-runner-systemscope.integration.test.ts +0 -101
- package/src/pipeline/__tests__/public-intake-runtime-gate.integration.test.ts +0 -684
- package/src/pipeline/__tests__/query-projection.integration.test.ts +0 -357
- package/src/pipeline/__tests__/rate-limit-default.integration.test.ts +0 -118
- package/src/pipeline/__tests__/rate-limit-default.test.ts +0 -117
- package/src/pipeline/__tests__/rebuild-poison-quarantine.integration.test.ts +0 -275
- package/src/pipeline/__tests__/redis-keys.test.ts +0 -12
- package/src/pipeline/__tests__/redis-pipeline.integration.test.ts +0 -490
- package/src/pipeline/__tests__/search-consumer-named-events.integration.test.ts +0 -274
- package/src/pipeline/__tests__/system-identity-switch.integration.test.ts +0 -583
- package/src/pipeline/__tests__/system-identity-switch.test.ts +0 -645
- package/src/pipeline/__tests__/tenant-timezone-cache.test.ts +0 -89
- package/src/pipeline/__tests__/try-append-event.integration.test.ts +0 -168
- package/src/pipeline/__tests__/unsafe-raw-escape-hatch.integration.test.ts +0 -103
- package/src/pipeline/active-membership.ts +0 -190
- package/src/pipeline/append-event-core.ts +0 -117
- package/src/pipeline/auth-claims-resolver.ts +0 -103
- package/src/pipeline/cascade-handler.ts +0 -109
- package/src/pipeline/dispatch-batch.ts +0 -269
- package/src/pipeline/dispatch-query.ts +0 -195
- package/src/pipeline/dispatch-shared.ts +0 -1242
- package/src/pipeline/dispatch-stream.ts +0 -129
- package/src/pipeline/dispatch-write.ts +0 -599
- package/src/pipeline/dispatcher-utils.ts +0 -199
- package/src/pipeline/dispatcher.ts +0 -278
- package/src/pipeline/distributed-lock.ts +0 -66
- package/src/pipeline/entity-cache.ts +0 -82
- package/src/pipeline/event-consumer-state.ts +0 -190
- package/src/pipeline/event-dedup.ts +0 -23
- package/src/pipeline/event-dispatcher-admin.ts +0 -320
- package/src/pipeline/event-dispatcher-delivery.ts +0 -499
- package/src/pipeline/event-dispatcher.ts +0 -817
- package/src/pipeline/event-retention.ts +0 -144
- package/src/pipeline/idempotency.ts +0 -158
- package/src/pipeline/index.ts +0 -83
- package/src/pipeline/irreversible-operation-gate.ts +0 -76
- package/src/pipeline/lifecycle-pipeline.ts +0 -421
- package/src/pipeline/member-read-only-transaction.ts +0 -71
- package/src/pipeline/member-reader.ts +0 -110
- package/src/pipeline/msp-rebuild.ts +0 -312
- package/src/pipeline/multi-stream-apply-context.ts +0 -85
- package/src/pipeline/pending-gap-ranges.ts +0 -120
- package/src/pipeline/projection-rebuild.ts +0 -539
- package/src/pipeline/projection-state.ts +0 -60
- package/src/pipeline/projections-runner.ts +0 -66
- package/src/pipeline/redis-keys.ts +0 -11
- package/src/pipeline/system-hooks.ts +0 -695
- package/src/pipeline/system-identity-switch.ts +0 -401
- package/src/pipeline/tenant-timezone-cache.ts +0 -92
- package/src/pipeline/write-origin.ts +0 -128
- package/src/random/__tests__/generate.test.ts +0 -149
- package/src/random/__tests__/words.test.ts +0 -44
- package/src/random/generate.ts +0 -141
- package/src/random/index.ts +0 -8
- package/src/random/words.ts +0 -393
- package/src/rate-limit/__tests__/dispatcher-l3.integration.test.ts +0 -111
- package/src/rate-limit/__tests__/middleware.integration.test.ts +0 -246
- package/src/rate-limit/__tests__/resolver.integration.test.ts +0 -211
- package/src/rate-limit/bucket.ts +0 -36
- package/src/rate-limit/index.ts +0 -14
- package/src/rate-limit/middleware.ts +0 -179
- package/src/rate-limit/resolver.ts +0 -251
- package/src/redis/__tests__/redis-options.test.ts +0 -54
- package/src/redis/client.ts +0 -77
- package/src/redis/index.ts +0 -4
- package/src/redis/pubsub-signal.ts +0 -107
- package/src/schema-cli.ts +0 -510
- package/src/search/__tests__/derive-search-adapter-config.test.ts +0 -65
- package/src/search/__tests__/meilisearch-adapter.integration.test.ts +0 -413
- package/src/search/__tests__/meilisearch-ids.test.ts +0 -30
- package/src/search/__tests__/reindex-entity.integration.test.ts +0 -243
- package/src/search/__tests__/search-adapter.test.ts +0 -271
- package/src/search/__tests__/search-consumer-batch.integration.test.ts +0 -306
- package/src/search/__tests__/search-pii-derived-index.integration.test.ts +0 -208
- package/src/search/derive-search-adapter-config.ts +0 -27
- package/src/search/in-memory-adapter.ts +0 -129
- package/src/search/index.ts +0 -20
- package/src/search/meilisearch-adapter.ts +0 -213
- package/src/search/purge-subject.ts +0 -253
- package/src/search/reindex-entity.ts +0 -190
- package/src/secrets/__tests__/contains-secret.test.ts +0 -108
- package/src/secrets/__tests__/dek-cache.test.ts +0 -211
- package/src/secrets/__tests__/derive-purpose-secret.test.ts +0 -52
- package/src/secrets/__tests__/env-master-key-provider.test.ts +0 -119
- package/src/secrets/__tests__/envelope-cipher.test.ts +0 -59
- package/src/secrets/__tests__/envelope.test.ts +0 -74
- package/src/secrets/__tests__/leak-guard.test.ts +0 -104
- package/src/secrets/__tests__/rotation.test.ts +0 -149
- package/src/secrets/dek-cache.ts +0 -137
- package/src/secrets/derive-purpose-secret.ts +0 -17
- package/src/secrets/env-master-key-provider.ts +0 -162
- package/src/secrets/envelope-cipher.ts +0 -53
- package/src/secrets/envelope.ts +0 -57
- package/src/secrets/index.ts +0 -33
- package/src/secrets/leak-guard.ts +0 -87
- package/src/secrets/rotation.ts +0 -34
- package/src/secrets/stored-envelope.ts +0 -46
- package/src/seeding/__tests__/entity-seed.test.ts +0 -70
- package/src/seeding/entity-seed.ts +0 -31
- package/src/seeding/index.ts +0 -6
- package/src/seeding/types.ts +0 -8
- package/src/stack/__tests__/drain-event-consumers.integration.test.ts +0 -166
- package/src/stack/__tests__/drain-jobs.integration.test.ts +0 -159
- package/src/stack/__tests__/event-collector.test.ts +0 -42
- package/src/stack/__tests__/ownership-boot-guard.integration.test.ts +0 -108
- package/src/stack/__tests__/push-entity-projection-tables-column-sync.integration.test.ts +0 -107
- package/src/stack/__tests__/request-helper.integration.test.ts +0 -140
- package/src/stack/__tests__/request-helper.test.ts +0 -159
- package/src/stack/__tests__/setup-test-stack-entity-tables.integration.test.ts +0 -65
- package/src/stack/__tests__/setup-test-stack-jobs.integration.test.ts +0 -185
- package/src/stack/__tests__/setup-test-stack-metrics.integration.test.ts +0 -79
- package/src/stack/db.ts +0 -82
- package/src/stack/drain-event-consumers.ts +0 -74
- package/src/stack/drain-jobs.ts +0 -129
- package/src/stack/event-collector.ts +0 -23
- package/src/stack/index.ts +0 -34
- package/src/stack/push-entity-projection-tables.ts +0 -95
- package/src/stack/redis.ts +0 -55
- package/src/stack/request-helper.ts +0 -298
- package/src/stack/table-helpers.ts +0 -175
- package/src/stack/test-stack.ts +0 -620
- package/src/stack/test-users.ts +0 -37
- package/src/testing/__tests__/db-cleanup.test.ts +0 -40
- package/src/testing/__tests__/e2e-generator.test.ts +0 -349
- package/src/testing/__tests__/ensure-entity-table.integration.test.ts +0 -52
- package/src/testing/__tests__/late-bound.test.ts +0 -32
- package/src/testing/__tests__/multipart-helper.test.ts +0 -49
- package/src/testing/__tests__/real-providers.test.ts +0 -62
- package/src/testing/__tests__/wait-for.test.ts +0 -104
- package/src/testing/access-assertions.ts +0 -15
- package/src/testing/assertions.ts +0 -35
- package/src/testing/boot-validator-fixture.ts +0 -124
- package/src/testing/closed-connection-error.ts +0 -62
- package/src/testing/db-cleanup.ts +0 -45
- package/src/testing/e2e-generator.ts +0 -494
- package/src/testing/expect-error.ts +0 -25
- package/src/testing/file-provider-contract.ts +0 -123
- package/src/testing/handler-context.ts +0 -143
- package/src/testing/http-cookies.ts +0 -52
- package/src/testing/index.ts +0 -60
- package/src/testing/late-bound.ts +0 -41
- package/src/testing/multipart-helper.ts +0 -94
- package/src/testing/mutable-master-key-provider.ts +0 -57
- package/src/testing/observability-recorder.ts +0 -54
- package/src/testing/real-providers.ts +0 -30
- package/src/testing/seed.ts +0 -50
- package/src/testing/shared-entities.ts +0 -65
- package/src/testing/utils.ts +0 -1
- package/src/testing/wait-for.ts +0 -49
- package/src/testing/without-ambient-temporal.ts +0 -14
- package/src/time/__tests__/boot-tz-warning.test.ts +0 -46
- package/src/time/__tests__/geo-tz.test.ts +0 -71
- package/src/time/__tests__/iana.test.ts +0 -35
- package/src/time/__tests__/polyfill-reinstall.test.ts +0 -17
- package/src/time/__tests__/polyfill.test.ts +0 -73
- package/src/time/__tests__/tz-context.test.ts +0 -121
- package/src/time/__tests__/tz-dateline.test.ts +0 -34
- package/src/time/boot-tz-warning.ts +0 -30
- package/src/time/iana.ts +0 -19
- package/src/time/index.ts +0 -23
- package/src/time/legacy-date.ts +0 -18
- package/src/time/polyfill.ts +0 -59
- package/src/time/tz-context.ts +0 -100
- package/src/ui-types/__tests__/plural.test.ts +0 -108
- package/src/ui-types/app-schema.ts +0 -91
- package/src/ui-types/formality.ts +0 -7
- package/src/ui-types/index.ts +0 -159
- package/src/ui-types/list-row-meta.ts +0 -87
- package/src/ui-types/plural.ts +0 -69
- package/src/upgrade-cli.ts +0 -651
- package/src/utils/__tests__/assert.test.ts +0 -17
- package/src/utils/__tests__/case.test.ts +0 -16
- package/src/utils/__tests__/compare.test.ts +0 -20
- package/src/utils/__tests__/env-parse.test.ts +0 -54
- package/src/utils/__tests__/ids.test.ts +0 -52
- package/src/utils/__tests__/is-plain-object.test.ts +0 -16
- package/src/utils/__tests__/parse-string-array-json.test.ts +0 -16
- package/src/utils/__tests__/safe-json-temporal.test.ts +0 -28
- package/src/utils/__tests__/safe-json.test.ts +0 -22
- package/src/utils/__tests__/serialization.test.ts +0 -30
- package/src/utils/assert.ts +0 -18
- package/src/utils/case.ts +0 -6
- package/src/utils/compare.ts +0 -10
- package/src/utils/env-parse.ts +0 -16
- package/src/utils/ids.ts +0 -26
- package/src/utils/index.ts +0 -9
- package/src/utils/is-plain-object.ts +0 -4
- package/src/utils/parse-string-array-json.ts +0 -14
- package/src/utils/safe-json.ts +0 -50
- package/src/utils/serialization.ts +0 -14
- /package/{src/engine/types/event-type-map.ts → dist/engine/types/event-type-map.d.ts} +0 -0
- /package/{src/engine/types/extension-options-map.ts → dist/engine/types/extension-options-map.d.ts} +0 -0
- /package/{src/engine/types/http-route.ts → dist/engine/types/http-route.d.ts} +0 -0
- /package/{src/engine/types/identifiers.ts → dist/engine/types/identifiers.d.ts} +0 -0
- /package/{src/engine/types/relations.ts → dist/engine/types/relations.d.ts} +0 -0
- /package/{src/engine/types/target-ref.ts → dist/engine/types/target-ref.d.ts} +0 -0
- /package/{src/engine/types/tree-node.ts → dist/engine/types/tree-node.d.ts} +0 -0
- /package/{src/logging/types.ts → dist/logging/types.d.ts} +0 -0
- /package/{src/observability/types/index.ts → dist/observability/types/index.d.ts} +0 -0
- /package/{src/observability/types/metric.ts → dist/observability/types/metric.d.ts} +0 -0
- /package/{src/observability/types/provider.ts → dist/observability/types/provider.d.ts} +0 -0
- /package/{src/observability/types/span.ts → dist/observability/types/span.d.ts} +0 -0
- /package/{src/search/types.ts → dist/search/types.d.ts} +0 -0
- /package/{src/secrets/types.ts → dist/secrets/types.js} +0 -0
- /package/{src/time/geo-tz.ts → dist/time/geo-tz.d.ts} +0 -0
package/src/api/server.ts
DELETED
|
@@ -1,1550 +0,0 @@
|
|
|
1
|
-
import { Hono, type MiddlewareHandler } from "hono";
|
|
2
|
-
import { ROLES } from "../auth/roles";
|
|
3
|
-
import type { DbConnection, PgClient } from "../db/connection";
|
|
4
|
-
import { createDerivativesContext } from "../derivatives/derivatives-context";
|
|
5
|
-
import { buildAppSchema } from "../engine/build-app-schema";
|
|
6
|
-
import { EXT_FILE_PROVIDER, EXT_PRINCIPAL_STATUS } from "../engine/extension-names";
|
|
7
|
-
import { projectAppSchemaForRoles } from "../engine/project-app-schema-for-roles";
|
|
8
|
-
import { runsInLane } from "../engine/run-in";
|
|
9
|
-
import { ANONYMOUS_ROLE, createAnonymousUser, createSystemUser } from "../engine/system-user";
|
|
10
|
-
import {
|
|
11
|
-
type AppContext,
|
|
12
|
-
type HttpRouteMethod,
|
|
13
|
-
isFileField,
|
|
14
|
-
type Registry,
|
|
15
|
-
type RunIn,
|
|
16
|
-
type SessionUser,
|
|
17
|
-
type TenantId,
|
|
18
|
-
type WebSocketRouteDefinition,
|
|
19
|
-
type WriteResult,
|
|
20
|
-
} from "../engine/types";
|
|
21
|
-
import { createFileContext } from "../files/file-handle";
|
|
22
|
-
import type { FileRoutesOptions } from "../files/file-routes";
|
|
23
|
-
import { createFileRoutes, readFilesRouteOptions } from "../files/file-routes";
|
|
24
|
-
import { makeFileProviderResolver } from "../files/provider-resolver";
|
|
25
|
-
import type { Lifecycle } from "../lifecycle";
|
|
26
|
-
import { createFallbackLogger } from "../logging";
|
|
27
|
-
import {
|
|
28
|
-
createNoopProvider,
|
|
29
|
-
DEFAULT_SENSITIVE_CONFIG,
|
|
30
|
-
mergeSensitiveConfig,
|
|
31
|
-
type ObservabilityOptions,
|
|
32
|
-
type ObservabilityProvider,
|
|
33
|
-
registerStandardMetrics,
|
|
34
|
-
wrapRedisClient,
|
|
35
|
-
} from "../observability";
|
|
36
|
-
import { resolveTenantLifecyclePlugin } from "../pipeline/active-membership";
|
|
37
|
-
import type { DispatcherOptions } from "../pipeline/dispatcher";
|
|
38
|
-
import { createDispatcher, type Dispatcher } from "../pipeline/dispatcher";
|
|
39
|
-
import { SHARED_INSTANCE_SENTINEL } from "../pipeline/event-consumer-state";
|
|
40
|
-
import type { EventDedup } from "../pipeline/event-dedup";
|
|
41
|
-
import type { EventConsumer, EventDispatcher } from "../pipeline/event-dispatcher";
|
|
42
|
-
import { createEventDispatcher } from "../pipeline/event-dispatcher";
|
|
43
|
-
import { createLifecycleHooks, type SystemHooks } from "../pipeline/lifecycle-pipeline";
|
|
44
|
-
import { createMultiStreamApplyContext } from "../pipeline/multi-stream-apply-context";
|
|
45
|
-
import {
|
|
46
|
-
createAccessInvalidationEventConsumer,
|
|
47
|
-
createJobTriggerEventConsumer,
|
|
48
|
-
createSearchEventConsumer,
|
|
49
|
-
createSseBroadcastEventConsumer,
|
|
50
|
-
} from "../pipeline/system-hooks";
|
|
51
|
-
import {
|
|
52
|
-
type AuthEndpointRateLimitOptions,
|
|
53
|
-
authEndpointRateLimit,
|
|
54
|
-
createRateLimitResolver,
|
|
55
|
-
type GlobalIpRateLimitOptions,
|
|
56
|
-
globalIpRateLimit,
|
|
57
|
-
} from "../rate-limit";
|
|
58
|
-
import { deriveSearchAdapterConfig } from "../search/derive-search-adapter-config";
|
|
59
|
-
import type { SearchAdapter } from "../search/types";
|
|
60
|
-
import type { AppSchema } from "../ui-types/app-schema";
|
|
61
|
-
import { assertUnreachable, generateId } from "../utils";
|
|
62
|
-
import { NO_ROUTE_MATCH_HEADER_NAME, PUBLIC_API_PATHS, Routes } from "./api-constants";
|
|
63
|
-
import {
|
|
64
|
-
type AnonymousAccessResolved,
|
|
65
|
-
type AuthSessionChecker,
|
|
66
|
-
authMiddleware,
|
|
67
|
-
getAuthTokenExpiry,
|
|
68
|
-
getUser,
|
|
69
|
-
type TenantLifecycleStatusResolver,
|
|
70
|
-
} from "./auth-middleware";
|
|
71
|
-
import { type AuthRoutesConfig, createAuthRoutes, type LoginRateLimiter } from "./auth-routes";
|
|
72
|
-
import {
|
|
73
|
-
assertValidTrustedProxyHops,
|
|
74
|
-
type ClientIpResolver,
|
|
75
|
-
clientIpSourceFromHonoContext,
|
|
76
|
-
createClientIpResolver,
|
|
77
|
-
} from "./client-ip";
|
|
78
|
-
import { csrfMiddleware } from "./csrf-middleware";
|
|
79
|
-
import {
|
|
80
|
-
type ExtraRouteDefinition,
|
|
81
|
-
ExtraRouteEntries,
|
|
82
|
-
type ExtraRouteEntry,
|
|
83
|
-
ExtraRouteRejection,
|
|
84
|
-
type SystemDispatchArgs,
|
|
85
|
-
} from "./extra-route";
|
|
86
|
-
import { computeStrongEtag, etagMatches } from "./http-cache";
|
|
87
|
-
import { createJwtHelper, type JwtHelper, type JwtKeyring } from "./jwt";
|
|
88
|
-
import { observabilityMiddleware } from "./observability-middleware";
|
|
89
|
-
import {
|
|
90
|
-
assertOriginGuardConfig,
|
|
91
|
-
isWebSocketOriginAllowed,
|
|
92
|
-
normalizeOrigin,
|
|
93
|
-
originMiddleware,
|
|
94
|
-
rejectOrigin,
|
|
95
|
-
} from "./origin-middleware";
|
|
96
|
-
import { patRouteGuard } from "./pat-route-guard";
|
|
97
|
-
import { piiCiphertextResponseGuard } from "./pii-leak-guard";
|
|
98
|
-
import { createDefaultSseBroker, type RedisSseBroker } from "./redis-sse-broker";
|
|
99
|
-
import { type RequestContextData, requestContext } from "./request-context";
|
|
100
|
-
import { buildRequestContextData, requestIdMiddleware } from "./request-id-middleware";
|
|
101
|
-
import {
|
|
102
|
-
DEFAULT_MAX_REQUEST_BYTES,
|
|
103
|
-
registerBodyLimit,
|
|
104
|
-
registerHealthRoutes,
|
|
105
|
-
registerMetricsRoute,
|
|
106
|
-
registerVersionRoute,
|
|
107
|
-
} from "./route-registrars";
|
|
108
|
-
import { createApiRoutes } from "./routes";
|
|
109
|
-
import type { SseBroker } from "./sse-broker";
|
|
110
|
-
import { createSseRoute } from "./sse-route";
|
|
111
|
-
import {
|
|
112
|
-
buildWebSocketSessionRevalidator,
|
|
113
|
-
createWebSocketConnectionLimiter,
|
|
114
|
-
hasWebSocketUpgradeServer,
|
|
115
|
-
isWebSocketUpgradeRequest,
|
|
116
|
-
WEBSOCKET_DEFAULT_MAX_CONNECTIONS_PER_USER,
|
|
117
|
-
WEBSOCKET_DEFAULT_MAX_MESSAGE_BYTES,
|
|
118
|
-
type WebSocketConnectionLimiter,
|
|
119
|
-
} from "./websocket-route";
|
|
120
|
-
|
|
121
|
-
export type ServerOptions = {
|
|
122
|
-
registry: Registry;
|
|
123
|
-
context: AppContext;
|
|
124
|
-
jwtSecret: string | JwtKeyring;
|
|
125
|
-
jwtIssuer?: string;
|
|
126
|
-
// JWT lifetime in seconds. Explicit always wins. When omitted, the default
|
|
127
|
-
// depends on `auth.sessionChecker`: wired (revocation possible) keeps the
|
|
128
|
-
// long-lived 24h default; unwired (stateless JWTs, no revocation) drops to
|
|
129
|
-
// 1h so a leaked stateless token has a much smaller exposure window.
|
|
130
|
-
jwtTtl?: number;
|
|
131
|
-
dispatcherOptions?: Omit<DispatcherOptions, "lifecycle">;
|
|
132
|
-
systemHooks?: SystemHooks;
|
|
133
|
-
eventDedup?: EventDedup;
|
|
134
|
-
sseBroker?: SseBroker;
|
|
135
|
-
auth?: AuthRoutesConfig;
|
|
136
|
-
// Number of trusted reverse-proxy hops for client-IP resolution — feeds
|
|
137
|
-
// requestIdMiddleware's `ip`, the L1/L2
|
|
138
|
-
// rate-limit middleware below, and createAuthRoutes. Wins over the
|
|
139
|
-
// deprecated `auth.trustedProxyHops`. Default 0 = trust no proxy header,
|
|
140
|
-
// only the socket address (or "unknown") counts — see client-ip.ts.
|
|
141
|
-
trustedProxyHops?: number;
|
|
142
|
-
// No `files` option: file-storage is wired by mounting `file-foundation` +
|
|
143
|
-
// a `file-provider-*` feature. Upload routes, ctx.files and the GDPR jobs
|
|
144
|
-
// resolve the provider per-tenant through that single source (issue #608).
|
|
145
|
-
// Upload-route policy (accessGuard/privilegedRoles/maxUploadSize) lives on
|
|
146
|
-
// `createFilesFeature(opts?)`.
|
|
147
|
-
// Async event-dispatcher config. The dispatcher is created automatically
|
|
148
|
-
// when (a) context.db is a DbConnection AND (b) at least one consumer is
|
|
149
|
-
// wired — SSE (iff sseBroker), Search (iff context.searchAdapter), or
|
|
150
|
-
// feature-level r.multiStreamProjection consumers.
|
|
151
|
-
//
|
|
152
|
-
// Mirrors the old outboxPoller contract: `KumikoServer.eventDispatcher` is
|
|
153
|
-
// created but NOT auto-started. Production boot must call `.start()`;
|
|
154
|
-
// shutdown must call `.stop()`. Tests prefer `.runOnce()` for determinism
|
|
155
|
-
// and skip `.start()` entirely.
|
|
156
|
-
eventDispatcher?: {
|
|
157
|
-
pollIntervalMs?: number;
|
|
158
|
-
batchSize?: number;
|
|
159
|
-
maxAttempts?: number;
|
|
160
|
-
rearmCooldownMs?: number;
|
|
161
|
-
maxRearmCount?: number;
|
|
162
|
-
// Opt out of building the dispatcher even if consumers exist — e.g. ops
|
|
163
|
-
// runs a dedicated dispatcher process, or a test needs to control the
|
|
164
|
-
// consumer lifecycle manually.
|
|
165
|
-
disabled?: boolean;
|
|
166
|
-
// Opt out of the auto-built system consumers (SSE, Search, Job-Trigger)
|
|
167
|
-
// while still running feature r.multiStreamProjection consumers. Useful
|
|
168
|
-
// for tests that assert only on subscriber behaviour, or for a
|
|
169
|
-
// deployment that routes SSE via a different transport. Default: sse/
|
|
170
|
-
// search enabled when the respective dependency (sseBroker /
|
|
171
|
-
// context.searchAdapter) is available; jobTrigger enabled when a
|
|
172
|
-
// jobRunner is wired via dispatcherOptions.
|
|
173
|
-
systemConsumers?: {
|
|
174
|
-
sse?: boolean;
|
|
175
|
-
search?: boolean;
|
|
176
|
-
jobTrigger?: boolean;
|
|
177
|
-
accessInvalidation?: boolean;
|
|
178
|
-
};
|
|
179
|
-
// Raw postgres.js client for LISTEN/NOTIFY wake-up (Sprint E.4). When
|
|
180
|
-
// present, `.start()` subscribes to EVENTS_PUBSUB_CHANNEL — delivery
|
|
181
|
-
// latency drops from pollIntervalMs to TCP-round-trip. The poll timer
|
|
182
|
-
// stays on as a safety net. Typically wired from
|
|
183
|
-
// `createDbConnection(url).client` so both Drizzle-queries and the
|
|
184
|
-
// dispatcher share the same underlying postgres.js pool.
|
|
185
|
-
pgClient?: PgClient;
|
|
186
|
-
};
|
|
187
|
-
// Observability: tracer + meter used for auto-instrumentation across
|
|
188
|
-
// HTTP, dispatcher, pipeline, DB. Omitted => NoopProvider (zero overhead,
|
|
189
|
-
// no spans or metrics emitted). Typically set to a ConsoleProvider in dev,
|
|
190
|
-
// OTLPProvider in prod.
|
|
191
|
-
observability?: ObservabilityProvider;
|
|
192
|
-
observabilityOptions?: ObservabilityOptions;
|
|
193
|
-
// L1/L2 rate-limit middleware. Both layers share the auto-wired
|
|
194
|
-
// resolver (or `context.rateLimit` if you provided one). Layers are
|
|
195
|
-
// independent — wire only what you need:
|
|
196
|
-
// - `global`: gates every /api/* request by client IP. Use behind
|
|
197
|
-
// Cloudflare-less deployments to absorb naive floods at the edge
|
|
198
|
-
// of the app process.
|
|
199
|
-
// - `auth`: gates a single path-pattern (default `/api/auth/*`)
|
|
200
|
-
// with tighter limits. Typically `limit: 5, windowSeconds: 60`
|
|
201
|
-
// to slow brute-force without breaking real users. GET /api/auth/tenants
|
|
202
|
-
// (session read, called on every page load) is always exempt — see
|
|
203
|
-
// AUTH_RATE_LIMIT_EXEMPT_ROUTES in api-constants.ts.
|
|
204
|
-
// Both omitted → no L1/L2 wired and no resolver auto-built unless an
|
|
205
|
-
// L3 handler declared `rateLimit:`. This keeps zero-cost when unused.
|
|
206
|
-
rateLimit?: {
|
|
207
|
-
readonly global?: Omit<GlobalIpRateLimitOptions, "resolver">;
|
|
208
|
-
readonly auth?: Omit<AuthEndpointRateLimitOptions, "resolver"> & {
|
|
209
|
-
// Path-pattern the L2 middleware applies to. Default `/api/auth/*`.
|
|
210
|
-
// Override for apps with a different auth route layout. The
|
|
211
|
-
// GET /api/auth/tenants exemption above applies regardless of `path`.
|
|
212
|
-
readonly path?: string;
|
|
213
|
-
};
|
|
214
|
-
};
|
|
215
|
-
// Hard cap on JSON request bodies in bytes. Applied to /api/write,
|
|
216
|
-
// /api/batch, /api/query, /api/command and /api/auth/*. File uploads
|
|
217
|
-
// (/api/files) are excluded — those have their own per-field maxSize.
|
|
218
|
-
// `undefined` → 1 MB default. `0` disables the limit entirely (tests
|
|
219
|
-
// or bespoke deployments with a reverse-proxy that caps upstream).
|
|
220
|
-
maxRequestBytes?: number;
|
|
221
|
-
// SSE heartbeat interval for POST /api/stream (ms). Omit → framework default.
|
|
222
|
-
// Tune down behind proxies with aggressive idle timeouts.
|
|
223
|
-
sseHeartbeatMs?: number;
|
|
224
|
-
// Process lifecycle. When present:
|
|
225
|
-
// - GET /health/ready reflects lifecycle.state() (200 ready / 503 else)
|
|
226
|
-
// - eventDispatcher.stop() is auto-registered as a shutdown hook, so
|
|
227
|
-
// lifecycle.drain() tears the poller down without the caller wiring it
|
|
228
|
-
// Production main.ts passes `createLifecycle()`; tests that don't care
|
|
229
|
-
// about drain() orchestration omit this and /health/ready stays absent.
|
|
230
|
-
lifecycle?: Lifecycle;
|
|
231
|
-
// Prometheus-scrape endpoint. When set, `/metrics` returns the current
|
|
232
|
-
// accumulated metric state in OpenMetrics text format. Requires the
|
|
233
|
-
// configured `observability` to use a PrometheusMeter (duck-typed via
|
|
234
|
-
// the `snapshot` method) — otherwise the route returns 503 with a
|
|
235
|
-
// note about misconfiguration. The optional `token` enforces
|
|
236
|
-
// `Authorization: Bearer <token>`; without a token set the endpoint
|
|
237
|
-
// is open (fine inside a private cluster, dangerous on the public
|
|
238
|
-
// internet). Omit this option entirely to skip the route.
|
|
239
|
-
metrics?: {
|
|
240
|
-
readonly token?: string;
|
|
241
|
-
readonly path?: string; // default "/metrics"
|
|
242
|
-
};
|
|
243
|
-
// /health/ready depth. When lifecycle is wired, the readiness handler
|
|
244
|
-
// ALSO runs dependency checks before returning 200:
|
|
245
|
-
// - DB ping (auto-wired when context.db is a DbConnection)
|
|
246
|
-
// - Redis PING (auto-wired when context.redis is set)
|
|
247
|
-
// - Dispatcher consumer-lag (opt-in via maxDispatcherLag — off by default
|
|
248
|
-
// because a default threshold would false-503 small deployments that
|
|
249
|
-
// legitimately lag during bursts)
|
|
250
|
-
// Checks run in parallel with a per-check timeout; any failed check drops
|
|
251
|
-
// the probe to 503 with a JSON body listing which check failed.
|
|
252
|
-
readiness?: {
|
|
253
|
-
readonly timeoutMs?: number;
|
|
254
|
-
readonly maxDispatcherLag?: bigint;
|
|
255
|
-
};
|
|
256
|
-
// Which deploy-lane this process runs — drives MSP-consumer filtering.
|
|
257
|
-
// "api": picks up MSPs with runIn in {api, both}.
|
|
258
|
-
// "worker": picks up MSPs with runIn in {worker, both, undefined (default)}.
|
|
259
|
-
// "both": all-in-one, no filtering — every MSP runs here.
|
|
260
|
-
// When omitted, defaults to "worker" — preserves pre-Welle-2.6 behaviour
|
|
261
|
-
// (every MSP runs on the single dispatcher, wherever it lives).
|
|
262
|
-
processLane?: RunIn;
|
|
263
|
-
// Stable identifier for THIS process in the event-consumer state table.
|
|
264
|
-
// Used as the `instance_id` on every per-instance consumer's cursor row
|
|
265
|
-
// (Welle 2.7). Shared consumers ignore this and always write the reserved
|
|
266
|
-
// sentinel. Default: `process.env.KUMIKO_INSTANCE_ID ?? generateId()`
|
|
267
|
-
// — a fresh UUID at boot is fine for single-process deploys, but
|
|
268
|
-
// multi-instance deploys SHOULD set KUMIKO_INSTANCE_ID to a stable
|
|
269
|
-
// identifier (pod name, hostname) so ops can correlate lag metrics to
|
|
270
|
-
// specific instances and can DELETE stale rows on scale-down. Must never
|
|
271
|
-
// equal the sentinel; validator fails boot if it does.
|
|
272
|
-
instanceId?: string;
|
|
273
|
-
// Opt-in: serve unauthenticated requests on handlers that allow
|
|
274
|
-
// roles=["anonymous"]. When omitted, every /api/* request still requires
|
|
275
|
-
// a valid JWT (status quo). App-facing config is AnonymousAccessConfig
|
|
276
|
-
// (defaultTenantId only); run{Prod,Dev}App merge auth-foundation tenant
|
|
277
|
-
// providers into AnonymousAccessResolved before calling buildServer.
|
|
278
|
-
anonymousAccess?: AnonymousAccessResolved;
|
|
279
|
-
// Declarative HTTP routes outside the /api/write|query|batch pipeline that
|
|
280
|
-
// still need the framework's dispatcher (webhooks, OAuth callbacks, admin
|
|
281
|
-
// escape-hatches). Each entry declares its access tier (`entry`) up
|
|
282
|
-
// front — buildServer wires the matching guard + deps, no handler gets a
|
|
283
|
-
// raw db/redis. Mounted right after the r.httpRoute loop, before
|
|
284
|
-
// registerVersionRoute (kumiko-framework#3050).
|
|
285
|
-
extraRoutes?: readonly ExtraRouteDefinition[];
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
export type KumikoServer = {
|
|
289
|
-
app: Hono;
|
|
290
|
-
jwt: JwtHelper;
|
|
291
|
-
sseBroker: SseBroker;
|
|
292
|
-
observability: ObservabilityProvider;
|
|
293
|
-
// The command-dispatcher behind /api/* — same idempotency/jobRunner/
|
|
294
|
-
// lifecycle wiring as HTTP-dispatched writes. For dispatching outside
|
|
295
|
-
// the HTTP pipeline, e.g. provider-webhook routes that authenticate
|
|
296
|
-
// via signature instead of JWT (subscription-stripe et al.).
|
|
297
|
-
dispatcher: Dispatcher;
|
|
298
|
-
// Present when at least one consumer is wired and context.db is a
|
|
299
|
-
// DbConnection. Caller owns the lifecycle: `.start()` in boot, `.stop()`
|
|
300
|
-
// in shutdown. Tests drain via `.runOnce()` instead.
|
|
301
|
-
eventDispatcher?: EventDispatcher;
|
|
302
|
-
// Echoed back so the caller has a single handle for both the app and the
|
|
303
|
-
// lifecycle. Only set when the caller passed one in.
|
|
304
|
-
lifecycle?: Lifecycle;
|
|
305
|
-
// The AppContext every handler on this server sees — options.context plus
|
|
306
|
-
// what buildServer wires onto it (_fileProviderResolver, rateLimit, the
|
|
307
|
-
// observability tracer/meter). Callers that build a second consumer of the
|
|
308
|
-
// same registry outside this server (a dev-server's job-runners) must pass
|
|
309
|
-
// THIS, not their own pre-buildServer literal, or that consumer reaches for
|
|
310
|
-
// fields only the request path has (#1232).
|
|
311
|
-
context: AppContext;
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
// The per-tenant file-provider resolver, built once for a registry+context so
|
|
315
|
-
// a job-runner and the server it runs beside share one instance (and one
|
|
316
|
-
// per-tenant provider cache). Mirrors buildServer's own resolution exactly —
|
|
317
|
-
// including NOT inventing a resolver when no `file-provider-*` plugin is
|
|
318
|
-
// mounted, which is what keeps buildServer's boot-guard below able to fire.
|
|
319
|
-
export function withFileProviderResolver(registry: Registry, context: AppContext): AppContext {
|
|
320
|
-
if (context._fileProviderResolver !== undefined) return context;
|
|
321
|
-
if (registry.getExtensionUsages(EXT_FILE_PROVIDER).length === 0) return context;
|
|
322
|
-
return {
|
|
323
|
-
...context,
|
|
324
|
-
_fileProviderResolver: makeFileProviderResolver({
|
|
325
|
-
registry,
|
|
326
|
-
_configAccessorFactory: context._configAccessorFactory,
|
|
327
|
-
secrets: context.secrets,
|
|
328
|
-
db: context.db,
|
|
329
|
-
}),
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
export function buildServer(options: ServerOptions): KumikoServer {
|
|
334
|
-
// Single effective hop-count for every IP-derived rate-limit + requestMeta
|
|
335
|
-
// below — the top-level option wins over the deprecated
|
|
336
|
-
// `auth.trustedProxyHops` fallback.
|
|
337
|
-
const trustedProxyHops = options.trustedProxyHops ?? options.auth?.trustedProxyHops ?? 0;
|
|
338
|
-
assertValidTrustedProxyHops(trustedProxyHops, "buildServer");
|
|
339
|
-
// Exactly ONE resolver for the whole server — the warn-once flag must fire
|
|
340
|
-
// once per boot, not once per consumer (requestIdMiddleware, L1, L2,
|
|
341
|
-
// auth-routes each sharing this same instance rather than building a
|
|
342
|
-
// private one).
|
|
343
|
-
const clientIpResolver = createClientIpResolver(trustedProxyHops, "buildServer");
|
|
344
|
-
|
|
345
|
-
// File-storage is resolved per-tenant through file-foundation: a mounted
|
|
346
|
-
// `file-provider-*` plugin (inmemory/s3/s3-env) is the single source for
|
|
347
|
-
// uploads, ctx.files and the GDPR jobs.
|
|
348
|
-
const hasFileProvider = options.registry.getExtensionUsages(EXT_FILE_PROVIDER).length > 0;
|
|
349
|
-
// A test/advanced caller may inject the resolver directly on the context
|
|
350
|
-
// (e.g. a static in-memory provider) instead of mounting a provider plugin.
|
|
351
|
-
const hasInjectedResolver = options.context._fileProviderResolver !== undefined;
|
|
352
|
-
// Hard-fail when the registry declares file/image fields but no provider
|
|
353
|
-
// plugin is mounted — uploads would otherwise fail at the first request
|
|
354
|
-
// instead of at boot. Proves a plugin is mounted, not that each tenant
|
|
355
|
-
// selected one; per-tenant misconfig surfaces via createFileProviderForTenant.
|
|
356
|
-
if (registryDeclaresFileFields(options.registry) && !hasFileProvider && !hasInjectedResolver) {
|
|
357
|
-
throw new Error(
|
|
358
|
-
"Features declare file/image fields but no file-storage provider is mounted — " +
|
|
359
|
-
"mount `file-foundation` + a `file-provider-*` feature (inmemory/s3/s3-env) and " +
|
|
360
|
-
"select one per tenant via the 'file-foundation:config:provider' config-key.",
|
|
361
|
-
);
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
// #2051 — a screen whose search box renders (kumiko-screen.tsx gates it on
|
|
365
|
-
// `screen.searchable ?? entity-has-searchable-field`, the same condition
|
|
366
|
-
// used below) sends `payload.search` on every query. Without a
|
|
367
|
-
// context.searchAdapter that throws UnprocessableError at request time
|
|
368
|
-
// (#2032) — surface the misconfig at boot instead of on the first search.
|
|
369
|
-
// Warn, not throw: unlike missing file-storage (uploads always fail),
|
|
370
|
-
// list screens still work without search: only the search box is broken.
|
|
371
|
-
// Several deployed apps (offlot-app, publicstatus, kumiko-studio,
|
|
372
|
-
// kumiko-enterprise) currently run in exactly this state.
|
|
373
|
-
if (!options.context.searchAdapter) {
|
|
374
|
-
const unwiredEntities = entitiesWithSearchableScreen(options.registry);
|
|
375
|
-
if (unwiredEntities.length > 0) {
|
|
376
|
-
console.warn(
|
|
377
|
-
`[kumiko:boot] ${unwiredEntities.length} entit${unwiredEntities.length === 1 ? "y" : "ies"} ` +
|
|
378
|
-
`have a searchable list screen but no SearchAdapter is wired on context.searchAdapter: ` +
|
|
379
|
-
`${unwiredEntities.join(", ")}. Search requests against ${unwiredEntities.length === 1 ? "it" : "them"} will fail with a 422 (search_adapter_not_wired) at runtime. ` +
|
|
380
|
-
"Wire a SearchAdapter (e.g. createMeilisearchAdapter) on context.searchAdapter, or remove `searchable: true` from the affected fields.",
|
|
381
|
-
);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Stateless JWTs (no sessionChecker → no revocation) default to a shorter
|
|
386
|
-
// TTL than session-backed ones, since a leaked stateless token can't be
|
|
387
|
-
// revoked and stays valid until it expires. Explicit jwtTtl always wins.
|
|
388
|
-
const defaultJwtTtl = options.auth?.sessionChecker ? 8 * 60 * 60 : 60 * 60;
|
|
389
|
-
const jwt = createJwtHelper(
|
|
390
|
-
options.jwtSecret,
|
|
391
|
-
options.jwtIssuer,
|
|
392
|
-
options.jwtTtl ?? defaultJwtTtl,
|
|
393
|
-
);
|
|
394
|
-
// An explicit ServerOptions.sseBroker always wins (caller owns its
|
|
395
|
-
// lifecycle) — createDefaultSseBroker is the single decision point every
|
|
396
|
-
// other caller must funnel through instead of picking a broker on its
|
|
397
|
-
// own, so the REDIS_URL-gated cross-replica default (fw#2625) can't be
|
|
398
|
-
// silently bypassed the way runProdApp bypassed it before this existed.
|
|
399
|
-
let sseBroker: SseBroker;
|
|
400
|
-
let ownedRedisSseBroker: RedisSseBroker | undefined;
|
|
401
|
-
if (options.sseBroker) {
|
|
402
|
-
sseBroker = options.sseBroker;
|
|
403
|
-
} else {
|
|
404
|
-
const defaults = createDefaultSseBroker();
|
|
405
|
-
sseBroker = defaults.sseBroker;
|
|
406
|
-
ownedRedisSseBroker = defaults.ownedRedisSseBroker;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Resolve the per-process instance identifier. Prefer explicit
|
|
410
|
-
// ServerOptions.instanceId (tests, deliberate wiring), fall back to the
|
|
411
|
-
// deploy-env variable, finally a boot-time UUID. Validator rejects the
|
|
412
|
-
// sentinel — a deliberate collision attempt would silently merge this
|
|
413
|
-
// instance's per-instance cursors with the shared-row cursors and
|
|
414
|
-
// deliver events twice to one shard while starving the other.
|
|
415
|
-
const resolvedInstanceId =
|
|
416
|
-
options.instanceId ?? process.env["KUMIKO_INSTANCE_ID"] ?? generateId();
|
|
417
|
-
if (resolvedInstanceId === SHARED_INSTANCE_SENTINEL) {
|
|
418
|
-
throw new Error(
|
|
419
|
-
`ServerOptions.instanceId / KUMIKO_INSTANCE_ID cannot equal the reserved sentinel "${SHARED_INSTANCE_SENTINEL}" — ` +
|
|
420
|
-
`pick any other stable string.`,
|
|
421
|
-
);
|
|
422
|
-
}
|
|
423
|
-
// Warn when we fell back to a random UUID: the default SSE system-consumer
|
|
424
|
-
// is delivery="per-instance", so every boot gets a fresh cursor-row in
|
|
425
|
-
// kumiko_event_consumers. The previous boot's row stays behind on its last
|
|
426
|
-
// cursor and pins pruneEvents (retention-guard uses MIN(lastProcessedEventId)
|
|
427
|
-
// across all shards). Without a stable KUMIKO_INSTANCE_ID this accumulates
|
|
428
|
-
// on every restart, not just scale-down. Silent when options.instanceId or
|
|
429
|
-
// KUMIKO_INSTANCE_ID is explicit — those are deliberate choices (the test
|
|
430
|
-
// suite sets KUMIKO_INSTANCE_ID="test-instance" in vitest config).
|
|
431
|
-
const instanceIdWasRandom =
|
|
432
|
-
options.instanceId === undefined && !process.env["KUMIKO_INSTANCE_ID"];
|
|
433
|
-
if (instanceIdWasRandom) {
|
|
434
|
-
console.warn(
|
|
435
|
-
`[kumiko:boot] No ServerOptions.instanceId / KUMIKO_INSTANCE_ID set — generated a random UUID (${resolvedInstanceId}). ` +
|
|
436
|
-
`Per-instance consumers (SSE by default) write one cursor-row per instance; without a stable id, each restart leaves an orphaned row behind and pins events-retention on its last cursor. ` +
|
|
437
|
-
`Set KUMIKO_INSTANCE_ID to a stable value (e.g. hostname, pod name) in production.`,
|
|
438
|
-
);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
// Observability — Noop by default so no call-site needs to null-check.
|
|
442
|
-
// Every handler/middleware that reaches for ctx.tracer / ctx.metrics gets
|
|
443
|
-
// a working, zero-cost fallback when no provider is configured.
|
|
444
|
-
const observability = options.observability ?? createNoopProvider();
|
|
445
|
-
|
|
446
|
-
// Register framework + feature metrics once on this meter. Standard
|
|
447
|
-
// metrics (HTTP, dispatcher, DB) are used by Auto-Instrumentation; feature
|
|
448
|
-
// metrics come from r.metric(...) declarations collected in the registry.
|
|
449
|
-
registerStandardMetrics(observability.meter);
|
|
450
|
-
for (const [name, def] of options.registry.getAllMetrics()) {
|
|
451
|
-
if (observability.meter.definitions().has(name)) continue;
|
|
452
|
-
observability.meter.registerMetric({
|
|
453
|
-
name,
|
|
454
|
-
type: def.type,
|
|
455
|
-
description: def.description,
|
|
456
|
-
labels: def.labels,
|
|
457
|
-
buckets: def.buckets,
|
|
458
|
-
unit: def.unit,
|
|
459
|
-
tenantLabel: def.tenantLabel,
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
// When a non-default provider is configured, wrap the injected Redis clients
|
|
464
|
-
// so `redis.cmd` spans attach to every command. For the default NoopProvider
|
|
465
|
-
// we skip the proxy to keep zero runtime overhead when observability is off.
|
|
466
|
-
const shouldWrapRedis = options.observability !== undefined;
|
|
467
|
-
const redisCtx = options.context.redis;
|
|
468
|
-
const wrappedRedis =
|
|
469
|
-
shouldWrapRedis && redisCtx ? wrapRedisClient(redisCtx, observability.tracer) : redisCtx;
|
|
470
|
-
|
|
471
|
-
// Inject tracer + meter into the AppContext so the dispatcher can propagate
|
|
472
|
-
// them into every HandlerContext it builds. Build the per-tenant file-provider
|
|
473
|
-
// resolver once (when a provider plugin is mounted) — the dispatcher uses it
|
|
474
|
-
// to materialise `ctx.files`, the upload routes + MSP-applies share it. The
|
|
475
|
-
// resolver reads config + the s3.secretAccessKey secret under SYSTEM identity.
|
|
476
|
-
const contextWithFiles = withFileProviderResolver(options.registry, options.context);
|
|
477
|
-
const fileProviderResolver = contextWithFiles._fileProviderResolver;
|
|
478
|
-
// Auto-wire the rate-limit resolver, but ONLY when at least one
|
|
479
|
-
// handler actually declared a rateLimit option. Apps that don't use
|
|
480
|
-
// L3 pay zero cost: no resolver instance, no Lua-script registration
|
|
481
|
-
// on Redis, no AppContext field. Apps that wire L1/L2 middleware can
|
|
482
|
-
// pass `context.rateLimit` explicitly — that takes precedence over
|
|
483
|
-
// the auto-wire (e.g. middleware-only setup without any L3 handler).
|
|
484
|
-
// Auto-build the resolver when L3 handlers declared rateLimit OR when
|
|
485
|
-
// the caller asked for L1/L2 middleware. Either path needs a resolver;
|
|
486
|
-
// both share the same instance to avoid duplicate Lua-script registration.
|
|
487
|
-
const wantsL3 = options.registry.hasRateLimitedHandler();
|
|
488
|
-
const wantsL1L2 =
|
|
489
|
-
options.rateLimit?.global !== undefined || options.rateLimit?.auth !== undefined;
|
|
490
|
-
const wantsResolver = wantsL3 || wantsL1L2;
|
|
491
|
-
const rateLimitResolver =
|
|
492
|
-
options.context.rateLimit ??
|
|
493
|
-
(wrappedRedis && wantsResolver ? createRateLimitResolver({ redis: wrappedRedis }) : undefined);
|
|
494
|
-
const contextWithObservability: AppContext = {
|
|
495
|
-
...contextWithFiles,
|
|
496
|
-
...(wrappedRedis ? { redis: wrappedRedis } : {}),
|
|
497
|
-
...(rateLimitResolver ? { rateLimit: rateLimitResolver } : {}),
|
|
498
|
-
// Propagate the feature-toggle resolver to the context so the event-
|
|
499
|
-
// dispatcher (and any future context-reading consumer) sees the same
|
|
500
|
-
// source as the command dispatcher's handler-gate. Options take
|
|
501
|
-
// precedence over whatever was already on context — the
|
|
502
|
-
// dispatcher-options arg is the authoritative wire-up point.
|
|
503
|
-
...(options.dispatcherOptions?.effectiveFeatures
|
|
504
|
-
? { effectiveFeatures: options.dispatcherOptions.effectiveFeatures }
|
|
505
|
-
: {}),
|
|
506
|
-
tracer: observability.tracer,
|
|
507
|
-
meter: observability.meter,
|
|
508
|
-
};
|
|
509
|
-
|
|
510
|
-
const lifecycle = createLifecycleHooks(
|
|
511
|
-
options.registry,
|
|
512
|
-
options.systemHooks,
|
|
513
|
-
options.eventDedup ? { eventDedup: options.eventDedup } : undefined,
|
|
514
|
-
);
|
|
515
|
-
|
|
516
|
-
const dispatcher = createDispatcher(options.registry, contextWithObservability, {
|
|
517
|
-
...options.dispatcherOptions,
|
|
518
|
-
lifecycle,
|
|
519
|
-
sseBroker,
|
|
520
|
-
...(options.auth ? { membershipQuery: options.auth.membershipQuery } : {}),
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
// Async event-dispatcher — the replacement for the old transactional
|
|
524
|
-
// outbox. Consumer sources:
|
|
525
|
-
// 1. System: SSE broadcast (iff sseBroker), Search index (iff
|
|
526
|
-
// context.searchAdapter).
|
|
527
|
-
// 2. Features: every r.multiStreamProjection registered in the registry
|
|
528
|
-
// becomes its own consumer row with an independent cursor. The MSP
|
|
529
|
-
// apply map is routed by event.type; apply receives the raw DbRunner
|
|
530
|
-
// of a TX-scoped, tenant-bound DB handle so per-tenant writes stay
|
|
531
|
-
// isolated.
|
|
532
|
-
//
|
|
533
|
-
// The dispatcher is built but NOT started here. Production boot code
|
|
534
|
-
// must call `.start()`; test code typically calls `.runOnce()`.
|
|
535
|
-
// @cast-boundary engine-bridge — context.db union narrows to DbConnection here
|
|
536
|
-
const baseDb = contextWithObservability.db as DbConnection | undefined;
|
|
537
|
-
// @cast-boundary engine-bridge — searchAdapter is an optional context-extension
|
|
538
|
-
const searchAdapter = (contextWithObservability as { searchAdapter?: SearchAdapter })
|
|
539
|
-
.searchAdapter;
|
|
540
|
-
// Adapter is built before the registry exists (app boot order) — hand it
|
|
541
|
-
// the registry-derived default config here so it can lazily configure
|
|
542
|
-
// each tenant index on first access instead of requiring per-tenant app
|
|
543
|
-
// wiring.
|
|
544
|
-
const derivedSearchConfig = searchAdapter
|
|
545
|
-
? deriveSearchAdapterConfig(options.registry)
|
|
546
|
-
: undefined;
|
|
547
|
-
if (searchAdapter && derivedSearchConfig) {
|
|
548
|
-
searchAdapter.setDefaultConfig?.(derivedSearchConfig);
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
const sseConsumerEnabled = options.eventDispatcher?.systemConsumers?.sse ?? true;
|
|
552
|
-
const searchConsumerEnabled = options.eventDispatcher?.systemConsumers?.search ?? true;
|
|
553
|
-
const jobTriggerConsumerEnabled = options.eventDispatcher?.systemConsumers?.jobTrigger ?? true;
|
|
554
|
-
const jobRunnerForTriggers = options.dispatcherOptions?.jobRunner;
|
|
555
|
-
|
|
556
|
-
const systemConsumers: EventConsumer[] = [];
|
|
557
|
-
if (sseConsumerEnabled) {
|
|
558
|
-
systemConsumers.push(createSseBroadcastEventConsumer(sseBroker));
|
|
559
|
-
}
|
|
560
|
-
if (searchConsumerEnabled && searchAdapter) {
|
|
561
|
-
systemConsumers.push(createSearchEventConsumer(searchAdapter, options.registry));
|
|
562
|
-
}
|
|
563
|
-
if (jobTriggerConsumerEnabled && jobRunnerForTriggers) {
|
|
564
|
-
systemConsumers.push(createJobTriggerEventConsumer(jobRunnerForTriggers, options.registry));
|
|
565
|
-
}
|
|
566
|
-
// Default ON (#1524 global-by-default). Tests that opt out of SSE via
|
|
567
|
-
// systemConsumers.accessInvalidation=false (test-stack mirrors sse off)
|
|
568
|
-
// skip the row so retention prune suites are not blocked by a lagging
|
|
569
|
-
// cursor=0 consumer they never drain.
|
|
570
|
-
const accessInvalidationEnabled =
|
|
571
|
-
options.eventDispatcher?.systemConsumers?.accessInvalidation ?? true;
|
|
572
|
-
if (accessInvalidationEnabled) {
|
|
573
|
-
systemConsumers.push(createAccessInvalidationEventConsumer(sseBroker));
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
// MultiStreamProjections: one EventConsumer per MSP. Handler routes by
|
|
577
|
-
// event.type into the MSP's apply map. MSPs aggregate cross-aggregate but
|
|
578
|
-
// still within one tenant by default — the applier receives the plain
|
|
579
|
-
// baseDb DbRunner; tenant consistency comes from the triggering event's
|
|
580
|
-
// own tenantId, not a per-event TenantDb scope.
|
|
581
|
-
//
|
|
582
|
-
// Lane-filter (Welle 2.6.b): MSPs declare `runIn` to pin them to a
|
|
583
|
-
// deploy-lane. An MSP with `runIn: "api"` won't be wired into the
|
|
584
|
-
// worker-process dispatcher (and vice versa). `runIn: "both"` (or the
|
|
585
|
-
// legacy undefined default of "worker") runs wherever a dispatcher is
|
|
586
|
-
// started — SKIP LOCKED on the consumer-cursor handles the race between
|
|
587
|
-
// processes that both want the same event.
|
|
588
|
-
const processLane: RunIn = options.processLane ?? "worker";
|
|
589
|
-
const mspDefs = [...options.registry.getAllMultiStreamProjections().values()].filter((msp) =>
|
|
590
|
-
runsInLane(msp.runIn, processLane),
|
|
591
|
-
);
|
|
592
|
-
const mspConsumers: EventConsumer[] = mspDefs.map((msp) => ({
|
|
593
|
-
name: msp.name,
|
|
594
|
-
// Feature-toggle gating: carry the owning feature so the event-dispatcher
|
|
595
|
-
// can pause this consumer when the feature is globally disabled. Events
|
|
596
|
-
// queue up in the store and replay cleanly from the same cursor on resume.
|
|
597
|
-
...(options.registry.getMultiStreamProjectionFeature(msp.name) && {
|
|
598
|
-
featureName: options.registry.getMultiStreamProjectionFeature(msp.name) as string, // @cast-boundary engine-bridge
|
|
599
|
-
}),
|
|
600
|
-
// Copy the continuous-lifecycle error policy straight onto the consumer.
|
|
601
|
-
// Rebuild uses its own policy (rebuildProjection reads msp.errorMode.rebuild
|
|
602
|
-
// directly); steady-state delivery runs through this consumer.
|
|
603
|
-
...(msp.errorMode?.continuous && { errorPolicy: msp.errorMode.continuous }),
|
|
604
|
-
// Carry the MSP's declared delivery semantic through to the consumer.
|
|
605
|
-
// Default (shared) is applied inside event-dispatcher, so omitting when
|
|
606
|
-
// the MSP didn't declare one keeps the existing behaviour.
|
|
607
|
-
...(msp.delivery && { delivery: msp.delivery }),
|
|
608
|
-
// Carry the MSP's declared cursor-seed through to the consumer. Default
|
|
609
|
-
// (beginning) is applied inside insertConsumerIfAbsent.
|
|
610
|
-
...(msp.startFrom && { startFrom: msp.startFrom }),
|
|
611
|
-
handler: async (event, ctx) => {
|
|
612
|
-
const applyFn = msp.apply[event.type];
|
|
613
|
-
// skip: this MSP doesn't care about this event type — fast path,
|
|
614
|
-
// every event type passes through every MSP consumer exactly once.
|
|
615
|
-
if (!applyFn) return;
|
|
616
|
-
if (!baseDb) {
|
|
617
|
-
// skip: no baseDb wired — allConsumers.length > 0 + baseDb check
|
|
618
|
-
// above gates dispatcher creation, so we won't reach here in
|
|
619
|
-
// production. Defensive return for the type-narrowing path.
|
|
620
|
-
return;
|
|
621
|
-
}
|
|
622
|
-
// Saga/process-manager ctx: apply can call ctx.appendEvent to cascade
|
|
623
|
-
// a follow-up event onto another aggregate. Uses the triggering event's
|
|
624
|
-
// tenantId + userId so the causal chain stays tenant-consistent.
|
|
625
|
-
// MSP qualified names are "<feature>:projection:<short>" — the
|
|
626
|
-
// prefix before the first ":" owns the MSP. Used to reject
|
|
627
|
-
// cross-feature ctx.appendEvent calls at emit-site.
|
|
628
|
-
const mspOwner = msp.name.split(":")[0];
|
|
629
|
-
const mspFiles = fileProviderResolver
|
|
630
|
-
? createFileContext(() => fileProviderResolver(event.tenantId))
|
|
631
|
-
: undefined;
|
|
632
|
-
const applyCtx = createMultiStreamApplyContext({
|
|
633
|
-
registry: options.registry,
|
|
634
|
-
db: baseDb,
|
|
635
|
-
tenantId: event.tenantId,
|
|
636
|
-
userId: event.metadata.userId,
|
|
637
|
-
...(mspOwner && { callerFeature: mspOwner }),
|
|
638
|
-
...(mspFiles && { files: mspFiles }),
|
|
639
|
-
...(contextWithObservability.secrets && { secrets: contextWithObservability.secrets }),
|
|
640
|
-
...(mspFiles && {
|
|
641
|
-
derivatives: createDerivativesContext({
|
|
642
|
-
files: mspFiles,
|
|
643
|
-
registry: options.registry,
|
|
644
|
-
db: baseDb,
|
|
645
|
-
tenantId: event.tenantId,
|
|
646
|
-
}),
|
|
647
|
-
}),
|
|
648
|
-
});
|
|
649
|
-
await applyFn(event, baseDb, applyCtx);
|
|
650
|
-
// Keep ctx reachable to satisfy the EventConsumerHandler signature.
|
|
651
|
-
void ctx;
|
|
652
|
-
},
|
|
653
|
-
}));
|
|
654
|
-
|
|
655
|
-
const allConsumers = [...systemConsumers, ...mspConsumers];
|
|
656
|
-
const {
|
|
657
|
-
disabled: dispatcherDisabled,
|
|
658
|
-
systemConsumers: _systemConsumersOpt,
|
|
659
|
-
...dispatcherTunables
|
|
660
|
-
} = options.eventDispatcher ?? {};
|
|
661
|
-
let eventDispatcher: EventDispatcher | undefined;
|
|
662
|
-
if (allConsumers.length > 0 && baseDb && !dispatcherDisabled) {
|
|
663
|
-
eventDispatcher = createEventDispatcher({
|
|
664
|
-
db: baseDb,
|
|
665
|
-
consumers: allConsumers,
|
|
666
|
-
context: contextWithObservability,
|
|
667
|
-
tracer: observability.tracer,
|
|
668
|
-
meter: observability.meter,
|
|
669
|
-
instanceId: resolvedInstanceId,
|
|
670
|
-
...dispatcherTunables,
|
|
671
|
-
});
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
// Wire the event-dispatcher shutdown into the lifecycle so the caller
|
|
675
|
-
// doesn't have to know the dispatcher exists. Hooks drain LIFO, so this
|
|
676
|
-
// runs before anything registered later by the caller (e.g. DB pool close).
|
|
677
|
-
if (options.lifecycle && eventDispatcher) {
|
|
678
|
-
const dispatcher = eventDispatcher;
|
|
679
|
-
options.lifecycle.registerShutdownHook("eventDispatcher", async () => {
|
|
680
|
-
await dispatcher.stop();
|
|
681
|
-
});
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
// Same reasoning, scoped to the broker this function created itself — an
|
|
685
|
-
// app-injected sseBroker (options.sseBroker) owns its own teardown.
|
|
686
|
-
if (options.lifecycle && ownedRedisSseBroker) {
|
|
687
|
-
const broker = ownedRedisSseBroker;
|
|
688
|
-
options.lifecycle.registerShutdownHook("redisSseBroker", async () => {
|
|
689
|
-
await broker.close();
|
|
690
|
-
});
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
const app = new Hono();
|
|
694
|
-
|
|
695
|
-
// Only entry:"signature" bypasses jwtGuard (verify() authenticates
|
|
696
|
-
// itself); entry:"anonymous" still needs the anonymousAccess fallthrough
|
|
697
|
-
// (tenant-by-host), entry:"user" needs c.get("user") populated.
|
|
698
|
-
const extraRoutePublicMatchers = compileExtraRoutePublicMatchers(options.extraRoutes);
|
|
699
|
-
const isExtraRoutePublicPath = (c: import("hono").Context): boolean =>
|
|
700
|
-
extraRoutePublicMatchers.some((m) => m.method === c.req.method && m.pattern.test(c.req.path));
|
|
701
|
-
|
|
702
|
-
const sensitiveConfig = mergeSensitiveConfig(
|
|
703
|
-
options.observabilityOptions?.sensitiveFilter ?? DEFAULT_SENSITIVE_CONFIG,
|
|
704
|
-
);
|
|
705
|
-
|
|
706
|
-
registerHealthRoutes(app, {
|
|
707
|
-
lifecycle: options.lifecycle,
|
|
708
|
-
readiness: {
|
|
709
|
-
db: baseDb,
|
|
710
|
-
redis: options.context.redis,
|
|
711
|
-
consumers: allConsumers,
|
|
712
|
-
...(options.readiness ?? {}),
|
|
713
|
-
},
|
|
714
|
-
});
|
|
715
|
-
|
|
716
|
-
if (options.metrics) {
|
|
717
|
-
registerMetricsRoute(app, observability.meter, options.metrics);
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
app.use("/api/*", requestIdMiddleware({ resolver: clientIpResolver }));
|
|
721
|
-
|
|
722
|
-
// Cap JSON bodies before rate-limit/auth/observability even run. Header-
|
|
723
|
-
// check is O(1); oversized requests never allocate memory for a full body
|
|
724
|
-
// parse. Upload route keeps its own per-field maxSize.
|
|
725
|
-
registerBodyLimit(app, options.maxRequestBytes ?? DEFAULT_MAX_REQUEST_BYTES);
|
|
726
|
-
|
|
727
|
-
// L1/L2 rate-limit middleware run BEFORE auth so an unauthenticated
|
|
728
|
-
// flood can't even reach the JWT-verify code path. Wired only when
|
|
729
|
-
// the caller passed `rateLimit.global` or `rateLimit.auth`. The
|
|
730
|
-
// resolver is the auto-wired one (or `context.rateLimit` if set);
|
|
731
|
-
// boot-fails loudly when the caller asked for middleware without a
|
|
732
|
-
// working Redis to back it.
|
|
733
|
-
if (wantsL1L2) {
|
|
734
|
-
if (!rateLimitResolver) {
|
|
735
|
-
throw new Error(
|
|
736
|
-
"rateLimit middleware requested but no resolver available — pass `context.redis` " +
|
|
737
|
-
"or `context.rateLimit` so the resolver can be built.",
|
|
738
|
-
);
|
|
739
|
-
}
|
|
740
|
-
if (options.rateLimit?.global) {
|
|
741
|
-
app.use(
|
|
742
|
-
"/api/*",
|
|
743
|
-
globalIpRateLimit({
|
|
744
|
-
...options.rateLimit.global,
|
|
745
|
-
resolver: rateLimitResolver,
|
|
746
|
-
clientIpResolver,
|
|
747
|
-
}),
|
|
748
|
-
);
|
|
749
|
-
}
|
|
750
|
-
if (options.rateLimit?.auth) {
|
|
751
|
-
const { path: l2Path = "/api/auth/*", ...l2Opts } = options.rateLimit.auth;
|
|
752
|
-
app.use(
|
|
753
|
-
l2Path,
|
|
754
|
-
authEndpointRateLimit({ ...l2Opts, resolver: rateLimitResolver, clientIpResolver }),
|
|
755
|
-
);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
// Observability span wraps everything that follows (auth, routes).
|
|
759
|
-
// Must come AFTER request-id (so span can carry the id) and BEFORE auth
|
|
760
|
-
// (so auth-verify can be a child span once we instrument it in v2).
|
|
761
|
-
app.use(
|
|
762
|
-
"/api/*",
|
|
763
|
-
observabilityMiddleware({
|
|
764
|
-
tracer: observability.tracer,
|
|
765
|
-
meter: observability.meter,
|
|
766
|
-
sensitiveConfig,
|
|
767
|
-
}),
|
|
768
|
-
);
|
|
769
|
-
|
|
770
|
-
// Tripwire: a kumiko-pii: ciphertext in a JSON response is always a bug
|
|
771
|
-
// (raw read leaked past a decrypt) — dev fails loud, prod redacts (#820).
|
|
772
|
-
app.use("/api/*", piiCiphertextResponseGuard());
|
|
773
|
-
|
|
774
|
-
// Auth middleware skips public paths (login, health) — those routes need
|
|
775
|
-
// to be callable without a valid JWT. Every other /api/* request requires
|
|
776
|
-
// a token (or, when anonymousAccess is wired, falls through as anonymous).
|
|
777
|
-
// A session-checker is forwarded when the auth-config wires one, so the
|
|
778
|
-
// middleware can reject revoked sids on every request.
|
|
779
|
-
// Mounting a tenantLifecycleStatus provider is what turns the 410 on, so no
|
|
780
|
-
// entrypoint can forget the wiring; `??` short-circuits, so an explicit
|
|
781
|
-
// auth.resolveTenantLifecycleStatus remains the override.
|
|
782
|
-
const tenantLifecycleResolver =
|
|
783
|
-
options.auth?.resolveTenantLifecycleStatus ??
|
|
784
|
-
deriveTenantLifecycleResolver(options.registry, baseDb);
|
|
785
|
-
// sessionOnlyGuard deliberately does NOT get this — its callers have no
|
|
786
|
-
// anonymousAccess fallback, so a foreign-origin cookie there must keep
|
|
787
|
-
// failing through the sibling originMiddleware 403.
|
|
788
|
-
const normalizedForeignCookieOrigins = options.auth?.allowedOrigins?.length
|
|
789
|
-
? new Set(options.auth.allowedOrigins.map(normalizeOrigin))
|
|
790
|
-
: undefined;
|
|
791
|
-
const jwtGuard = authMiddleware(jwt, {
|
|
792
|
-
...(options.auth?.sessionChecker ? { sessionChecker: options.auth.sessionChecker } : {}),
|
|
793
|
-
...(options.auth?.tokenVerifier ? { tokenVerifier: options.auth.tokenVerifier } : {}),
|
|
794
|
-
...(tenantLifecycleResolver ? { resolveTenantLifecycleStatus: tenantLifecycleResolver } : {}),
|
|
795
|
-
...(options.anonymousAccess ? { anonymousAccess: options.anonymousAccess } : {}),
|
|
796
|
-
...(normalizedForeignCookieOrigins
|
|
797
|
-
? { foreignCookieOrigins: normalizedForeignCookieOrigins }
|
|
798
|
-
: {}),
|
|
799
|
-
});
|
|
800
|
-
app.use("/api/*", async (c, next) => {
|
|
801
|
-
if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
|
|
802
|
-
return jwtGuard(c, next);
|
|
803
|
-
});
|
|
804
|
-
|
|
805
|
-
// Fail-closed PAT scoping: a PAT-authenticated caller (user.pat set by
|
|
806
|
-
// jwtGuard's tokenVerifier above) may only reach the dispatcher routes —
|
|
807
|
-
// everywhere else on /api/* is off-limits regardless of granted scopes.
|
|
808
|
-
const patRouteGuardMiddleware = patRouteGuard();
|
|
809
|
-
app.use("/api/*", async (c, next) => {
|
|
810
|
-
if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
|
|
811
|
-
return patRouteGuardMiddleware(c, next);
|
|
812
|
-
});
|
|
813
|
-
|
|
814
|
-
// Without anonymousAccess a missing token 401s instead of falling through as anonymous.
|
|
815
|
-
const sessionOnlyGuard = authMiddleware(jwt, {
|
|
816
|
-
...(options.auth?.sessionChecker ? { sessionChecker: options.auth.sessionChecker } : {}),
|
|
817
|
-
...(options.auth?.tokenVerifier ? { tokenVerifier: options.auth.tokenVerifier } : {}),
|
|
818
|
-
...(tenantLifecycleResolver ? { resolveTenantLifecycleStatus: tenantLifecycleResolver } : {}),
|
|
819
|
-
});
|
|
820
|
-
|
|
821
|
-
// PAT rate limiting — runs AFTER the auth guard so the resolved principal is
|
|
822
|
-
// available. Only PAT-authenticated requests are counted (keyed by token id);
|
|
823
|
-
// cookie/JWT users pass through untouched. In-memory limiter is per-instance
|
|
824
|
-
// (see run-prod-app) — a multi-node deployment wanting a shared counter swaps
|
|
825
|
-
// in a Redis-backed LoginRateLimiter.
|
|
826
|
-
const patRateLimiter = options.auth?.patRateLimiter;
|
|
827
|
-
const patRateLimitGuard = patRateLimiter ? buildPatRateLimitGuard(patRateLimiter) : undefined;
|
|
828
|
-
if (patRateLimitGuard) {
|
|
829
|
-
app.use("/api/*", async (c, next) => {
|
|
830
|
-
if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
|
|
831
|
-
return patRateLimitGuard(c, next);
|
|
832
|
-
});
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
// Origin-allowlist guard — additional CSRF-hardening for deployments that
|
|
836
|
-
// widen the auth cookie across subdomains (auth.cookieDomain). Registered
|
|
837
|
-
// only when allowedOrigins is non-empty, with the same /api/* + public-skip
|
|
838
|
-
// scope as the CSRF guard and BEFORE it, so a disallowed cross-site POST
|
|
839
|
-
// surfaces as `origin_not_allowed` rather than `csrf_token_mismatch`. Fails
|
|
840
|
-
// closed (assertOriginGuardConfig throws) when a wide cookieDomain is set
|
|
841
|
-
// without an allowlist and without an explicit opt-out — that config is the
|
|
842
|
-
// unguarded-subdomain-XSS footgun, not a warn-and-continue case.
|
|
843
|
-
assertOriginGuardConfig(options.auth);
|
|
844
|
-
const allowedOrigins = options.auth?.allowedOrigins;
|
|
845
|
-
const originGuard =
|
|
846
|
-
allowedOrigins && allowedOrigins.length > 0 ? originMiddleware(allowedOrigins) : undefined;
|
|
847
|
-
if (originGuard) {
|
|
848
|
-
app.use("/api/*", async (c, next) => {
|
|
849
|
-
if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
|
|
850
|
-
return originGuard(c, next);
|
|
851
|
-
});
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
// Double-submit CSRF guard — runs only on cookie-authenticated,
|
|
855
|
-
// state-changing requests (POST/PUT/PATCH/DELETE). The guard reads the
|
|
856
|
-
// authTransport flag set by authMiddleware, so public paths (no auth)
|
|
857
|
-
// and bearer-authenticated paths (no cookie vector) fall straight
|
|
858
|
-
// through. Must be registered AFTER the auth middleware above so the
|
|
859
|
-
// flag is populated; registered for the same scope so /api/* routes
|
|
860
|
-
// are covered uniformly.
|
|
861
|
-
const csrfGuard = csrfMiddleware();
|
|
862
|
-
app.use("/api/*", async (c, next) => {
|
|
863
|
-
if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
|
|
864
|
-
return csrfGuard(c, next);
|
|
865
|
-
});
|
|
866
|
-
|
|
867
|
-
// Same order as /api/* above: auth → PAT route scope → PAT rate-limit → origin → CSRF.
|
|
868
|
-
const sessionOnlyHttpRouteGuards: readonly MiddlewareHandler[] = [
|
|
869
|
-
sessionOnlyGuard,
|
|
870
|
-
patRouteGuardMiddleware,
|
|
871
|
-
...(patRateLimitGuard ? [patRateLimitGuard] : []),
|
|
872
|
-
...(originGuard ? [originGuard] : []),
|
|
873
|
-
csrfGuard,
|
|
874
|
-
];
|
|
875
|
-
|
|
876
|
-
// Public auth routes (login) need to be registered BEFORE the generic
|
|
877
|
-
// api routes so Hono matches them first.
|
|
878
|
-
if (options.auth) {
|
|
879
|
-
// A membershipQuery handler is registered but nothing fulfils
|
|
880
|
-
// principalStatus — surface that misconfig at boot instead of an InternalError on first login/switch-tenant.
|
|
881
|
-
if (
|
|
882
|
-
options.registry.getQueryHandler(options.auth.membershipQuery) &&
|
|
883
|
-
options.registry.getExtensionUsages(EXT_PRINCIPAL_STATUS).length === 0
|
|
884
|
-
) {
|
|
885
|
-
throw new Error(
|
|
886
|
-
`[kumiko] auth membershipQuery "${options.auth.membershipQuery}" is registered but no feature ` +
|
|
887
|
-
'provides the "principalStatus" contract — mount the user feature (tenant switch and sign-in ' +
|
|
888
|
-
"need it to reject blocked principals).",
|
|
889
|
-
);
|
|
890
|
-
}
|
|
891
|
-
app.route(
|
|
892
|
-
"/api",
|
|
893
|
-
createAuthRoutes(dispatcher, jwt, { ...options.auth, resolver: clientIpResolver }),
|
|
894
|
-
);
|
|
895
|
-
}
|
|
896
|
-
app.route(
|
|
897
|
-
"/api",
|
|
898
|
-
createApiRoutes(dispatcher, {
|
|
899
|
-
...(options.sseHeartbeatMs !== undefined ? { sseHeartbeatMs: options.sseHeartbeatMs } : {}),
|
|
900
|
-
}),
|
|
901
|
-
);
|
|
902
|
-
app.route("/api", createSseRoute(sseBroker));
|
|
903
|
-
|
|
904
|
-
// GET /api/schema — the only way a client obtains the AppSchema. Behind
|
|
905
|
-
// jwtGuard (NON_PUBLIC_API_PATHS), so anonymousAccess's synthesised user
|
|
906
|
-
// also gets rejected below — the schema never reaches an unauthenticated
|
|
907
|
-
// caller. The FULL schema is built lazily once — the registry is
|
|
908
|
-
// immutable for this server's lifetime, so it's the same on every
|
|
909
|
-
// request — then projected per caller-role-set (fw#3314: a role only
|
|
910
|
-
// sees the screens/navs/workspaces/content-collections it may reach,
|
|
911
|
-
// not the whole app's schema) and cached per role key. Tenant is
|
|
912
|
-
// deliberately NOT part of the key: the projection depends only on
|
|
913
|
-
// roles, and per-tenant caching would grow unboundedly across tenants
|
|
914
|
-
// that share the same role set.
|
|
915
|
-
let fullSchema: AppSchema | undefined;
|
|
916
|
-
const projectedSchemaCache = new Map<string, { readonly json: string; readonly etag: string }>();
|
|
917
|
-
app.get(`/api${Routes.schema}`, (c) => {
|
|
918
|
-
const user = getUser(c);
|
|
919
|
-
if (isMissingOrAnonymousUser(user)) {
|
|
920
|
-
return unauthenticatedResponse(c);
|
|
921
|
-
}
|
|
922
|
-
const roleKey = JSON.stringify([...new Set(user?.roles ?? [])].sort());
|
|
923
|
-
let cached = projectedSchemaCache.get(roleKey);
|
|
924
|
-
if (cached === undefined) {
|
|
925
|
-
if (fullSchema === undefined) {
|
|
926
|
-
fullSchema = buildAppSchema(options.registry, {
|
|
927
|
-
searchAdapterMissing: !options.context.searchAdapter,
|
|
928
|
-
});
|
|
929
|
-
}
|
|
930
|
-
const projected = projectAppSchemaForRoles(fullSchema, user?.roles ?? []);
|
|
931
|
-
const json = JSON.stringify(projected);
|
|
932
|
-
cached = { json, etag: computeStrongEtag(json) };
|
|
933
|
-
projectedSchemaCache.set(roleKey, cached);
|
|
934
|
-
}
|
|
935
|
-
const cacheHeaders = { "Cache-Control": "private, no-cache", ETag: cached.etag };
|
|
936
|
-
if (etagMatches(c.req.header("If-None-Match") ?? null, cached.etag)) {
|
|
937
|
-
return c.body(null, 304, cacheHeaders);
|
|
938
|
-
}
|
|
939
|
-
return c.body(cached.json, 200, {
|
|
940
|
-
"Content-Type": "application/json; charset=utf-8",
|
|
941
|
-
...cacheHeaders,
|
|
942
|
-
});
|
|
943
|
-
});
|
|
944
|
-
|
|
945
|
-
// Mount upload/download routes whenever a file provider is resolvable (a
|
|
946
|
-
// file-provider plugin is mounted, or a resolver was injected). They resolve
|
|
947
|
-
// the provider per-tenant through file-foundation — no `files` option; route
|
|
948
|
-
// policy comes from createFilesFeature(opts?). Gating on the resolver (not on
|
|
949
|
-
// declared file fields) keeps unattached uploads working and matches the old
|
|
950
|
-
// "files option present → routes" behavior.
|
|
951
|
-
if (fileProviderResolver) {
|
|
952
|
-
const fileDb = options.context.db as FileRoutesOptions["db"]; // @cast-boundary engine-bridge
|
|
953
|
-
if (!fileDb) throw new Error("file routes require db in context");
|
|
954
|
-
const routeOptions = readFilesRouteOptions(options.registry);
|
|
955
|
-
app.route(
|
|
956
|
-
"/api",
|
|
957
|
-
createFileRoutes({
|
|
958
|
-
db: fileDb,
|
|
959
|
-
registry: options.registry,
|
|
960
|
-
resolveProvider: fileProviderResolver,
|
|
961
|
-
...(routeOptions.accessGuard ? { accessGuard: routeOptions.accessGuard } : {}),
|
|
962
|
-
...(routeOptions.privilegedRoles ? { privilegedRoles: routeOptions.privilegedRoles } : {}),
|
|
963
|
-
...(routeOptions.maxUploadSize ? { maxUploadSize: routeOptions.maxUploadSize } : {}),
|
|
964
|
-
}),
|
|
965
|
-
);
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
// Feature-deklarierte HTTP-Routes (r.httpRoute). Mount nach /api/* damit
|
|
969
|
-
// /api/* immer Vorrang hat — feature-Routes liegen ohnehin außerhalb
|
|
970
|
-
// (Boot-Validator blockt /api-Prefix). deps.app ist die Outer-App, sodass
|
|
971
|
-
// der Handler /api/query intern via app.fetch(...) nutzen kann (gleicher
|
|
972
|
-
// Auth-Pfad wie ein echter HTTP-Call). deps.systemQuery umgeht diesen
|
|
973
|
-
// Pfad bewusst — für Routes die einen FESTEN Tenant erzwingen müssen
|
|
974
|
-
// (z.B. legal-pages → immer SYSTEM_TENANT_ID), statt ihn per X-Tenant-
|
|
975
|
-
// Header vorzutäuschen (das sieht für die anonymousAccess-Auflösung
|
|
976
|
-
// wie ein normaler Client-Header aus und wird von resolverTrust:
|
|
977
|
-
// "authoritative"-Configs zurecht als Tenant-Override abgelehnt).
|
|
978
|
-
for (const feature of options.registry.features.values()) {
|
|
979
|
-
for (const route of Object.values(feature.httpRoutes)) {
|
|
980
|
-
// @wrapper-known semantic-alias
|
|
981
|
-
const honoHandler = async (c: import("hono").Context): Promise<Response> =>
|
|
982
|
-
route.handler(c, {
|
|
983
|
-
app,
|
|
984
|
-
// createAnonymousUser, NOT createSystemUser: systemQuery's
|
|
985
|
-
// synthesized user must clear the SAME access gate a real
|
|
986
|
-
// anonymous visitor would, no more — regardless of the route's
|
|
987
|
-
// own `anonymous` mode. The system role would ALSO satisfy that
|
|
988
|
-
// gate here, but it can read fields gated to "system" that
|
|
989
|
-
// "anonymous" can't (filterReadFields is a plain role-in-map
|
|
990
|
-
// check) — a systemQuery caller reading a system-gated field
|
|
991
|
-
// would leak it into the response. The forced tenant already
|
|
992
|
-
// comes from bypassing the HTTP layer entirely; no elevated
|
|
993
|
-
// role is needed or wanted on top of that.
|
|
994
|
-
systemQuery: makeSystemQuery(c, dispatcher, clientIpResolver),
|
|
995
|
-
clientIp: clientIpResolver.resolve(clientIpSourceFromHonoContext(c)),
|
|
996
|
-
});
|
|
997
|
-
mountHonoRoute(
|
|
998
|
-
app,
|
|
999
|
-
route.method,
|
|
1000
|
-
route.path,
|
|
1001
|
-
honoHandler,
|
|
1002
|
-
route.anonymous ? [] : sessionOnlyHttpRouteGuards,
|
|
1003
|
-
);
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
|
|
1007
|
-
// r.webSocketRoute — GET routes under /api/ws/*, so the jwt/pat/rate-limit
|
|
1008
|
-
// chain above already ran. Origin/CSRF guards skip GETs, hence the own check.
|
|
1009
|
-
const webSocketOriginAllowlist = allowedOrigins?.length
|
|
1010
|
-
? new Set(allowedOrigins.map(normalizeOrigin))
|
|
1011
|
-
: undefined;
|
|
1012
|
-
const webSocketRoutePaths = new Map<string, string>();
|
|
1013
|
-
const webSocketConnectionLimiter = createWebSocketConnectionLimiter();
|
|
1014
|
-
for (const feature of options.registry.features.values()) {
|
|
1015
|
-
for (const route of Object.values(feature.webSocketRoutes)) {
|
|
1016
|
-
const owner = webSocketRoutePaths.get(route.path);
|
|
1017
|
-
if (owner !== undefined) {
|
|
1018
|
-
throw new Error(
|
|
1019
|
-
`[kumiko] WebSocket route "${route.path}" is declared by both feature "${owner}" and ` +
|
|
1020
|
-
`"${feature.name}" — paths must be unique across features.`,
|
|
1021
|
-
);
|
|
1022
|
-
}
|
|
1023
|
-
webSocketRoutePaths.set(route.path, feature.name);
|
|
1024
|
-
app.get(
|
|
1025
|
-
route.path,
|
|
1026
|
-
buildWebSocketRouteHandler(route, {
|
|
1027
|
-
dispatcher,
|
|
1028
|
-
clientIpResolver,
|
|
1029
|
-
originAllowlist: webSocketOriginAllowlist,
|
|
1030
|
-
...(options.auth?.sessionChecker ? { sessionChecker: options.auth.sessionChecker } : {}),
|
|
1031
|
-
...(tenantLifecycleResolver
|
|
1032
|
-
? { resolveTenantLifecycleStatus: tenantLifecycleResolver }
|
|
1033
|
-
: {}),
|
|
1034
|
-
connectionLimiter: webSocketConnectionLimiter,
|
|
1035
|
-
}),
|
|
1036
|
-
);
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
// extraRoutes (kumiko-framework#3050) — declarative HTTP-routes with a
|
|
1041
|
-
// Pflicht `entry` tier. Mounted after r.httpRoute for the same reason: an
|
|
1042
|
-
// extraRoute dispatching through `dispatcher` builds Hono's matcher, so
|
|
1043
|
-
// this must run before any seed that also dispatches (runProdApp/
|
|
1044
|
-
// createKumikoServer call buildServer before seeding).
|
|
1045
|
-
if (options.extraRoutes) {
|
|
1046
|
-
// Boot-time validation for the whole list BEFORE mounting anything —
|
|
1047
|
-
// an app with one bad route should fail loud at boot, not mount N-1
|
|
1048
|
-
// routes and then throw on route N.
|
|
1049
|
-
for (const route of options.extraRoutes) {
|
|
1050
|
-
if (!isKnownExtraRouteEntry(route.entry)) {
|
|
1051
|
-
throw new Error(
|
|
1052
|
-
`[kumiko] extraRoutes: unknown entry "${String(route.entry)}" on ` +
|
|
1053
|
-
`"${route.method} ${route.path}" — expected "anonymous" | "user" | "signature". ` +
|
|
1054
|
-
"A JS caller without the ExtraRouteDefinition type can hit this at boot.",
|
|
1055
|
-
);
|
|
1056
|
-
}
|
|
1057
|
-
if (route.entry === ExtraRouteEntries.user && !route.path.startsWith("/api/")) {
|
|
1058
|
-
throw new Error(
|
|
1059
|
-
`[kumiko] extraRoutes: entry:"user" route "${route.method} ${route.path}" must be ` +
|
|
1060
|
-
"mounted under \"/api/\" — that's the only path prefix that rides the framework's " +
|
|
1061
|
-
"jwtGuard chain, which is what populates deps.user.",
|
|
1062
|
-
);
|
|
1063
|
-
}
|
|
1064
|
-
// A signature route under /api/ skips jwtGuard/origin/csrf for every
|
|
1065
|
-
// path its pattern matches — a wildcard would switch off auth for
|
|
1066
|
-
// unrelated /api/* handlers (e.g. "/api/*" swallows /api/write).
|
|
1067
|
-
if (
|
|
1068
|
-
route.entry === ExtraRouteEntries.signature &&
|
|
1069
|
-
route.path.startsWith("/api/") &&
|
|
1070
|
-
route.path.includes("*")
|
|
1071
|
-
) {
|
|
1072
|
-
throw new Error(
|
|
1073
|
-
`[kumiko] extraRoutes: entry:"signature" route "${route.method} ${route.path}" must not ` +
|
|
1074
|
-
'use a wildcard under "/api/" — it would bypass the auth chain for every matching path.',
|
|
1075
|
-
);
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
const dispatchSystemWrite = makeDispatchSystemWrite(dispatcher);
|
|
1079
|
-
const dispatchSystemQuery = makeDispatchSystemQuery(dispatcher);
|
|
1080
|
-
for (const route of options.extraRoutes) {
|
|
1081
|
-
const honoHandler = buildExtraRouteHonoHandler(route, {
|
|
1082
|
-
app,
|
|
1083
|
-
dispatcher,
|
|
1084
|
-
registry: options.registry,
|
|
1085
|
-
secrets: contextWithObservability.secrets,
|
|
1086
|
-
dispatchSystemWrite,
|
|
1087
|
-
dispatchSystemQuery,
|
|
1088
|
-
clientIpResolver,
|
|
1089
|
-
});
|
|
1090
|
-
mountHonoRoute(app, route.method, route.path, honoHandler);
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
|
|
1094
|
-
// /version-Default registriert NACH feature-routes — Hono "first match
|
|
1095
|
-
// wins", also gewinnt feature-deklariertes /version (z.B. App-spezifisches
|
|
1096
|
-
// version-format mit Tenant-Stats) wenn vorhanden, sonst greift der
|
|
1097
|
-
// Default-Handler aus BUILD_VERSION/BUILD_TIME-env-vars.
|
|
1098
|
-
registerVersionRoute(app);
|
|
1099
|
-
|
|
1100
|
-
// Marks "no route matched this path" so tryHonoFirst (server-runtime)
|
|
1101
|
-
// can tell it apart from a matched route's OWN deliberate 404 (e.g.
|
|
1102
|
-
// default-deny reads like file-derivatives' public-variant route) —
|
|
1103
|
-
// without this, tryHonoFirst's only signal was the status code, and a
|
|
1104
|
-
// matched route answering 404 got silently rewritten to the SPA shell
|
|
1105
|
-
// with status 200 (kumiko-framework#2435). Must be the LAST thing wired
|
|
1106
|
-
// on `app`: this only fires when the router found no handler at all, so
|
|
1107
|
-
// a route's own `c.text(..., 404)` never passes through here. A handler
|
|
1108
|
-
// that calls `c.notFound()` instead of building its own Response DOES
|
|
1109
|
-
// route through this same handler and stays indistinguishable from a
|
|
1110
|
-
// routing miss — pre-existing Hono semantics, not something this fix
|
|
1111
|
-
// changes; deliberate 404s must build their own Response.
|
|
1112
|
-
// The header is an internal signal only — tryHonoFirst and every direct
|
|
1113
|
-
// app.fetch() passthrough strip it before a response reaches a client.
|
|
1114
|
-
app.notFound((c) => c.text("Not Found", 404, { [NO_ROUTE_MATCH_HEADER_NAME]: "1" }));
|
|
1115
|
-
|
|
1116
|
-
return {
|
|
1117
|
-
app,
|
|
1118
|
-
jwt,
|
|
1119
|
-
sseBroker,
|
|
1120
|
-
observability,
|
|
1121
|
-
dispatcher,
|
|
1122
|
-
context: contextWithObservability,
|
|
1123
|
-
...(eventDispatcher ? { eventDispatcher } : {}),
|
|
1124
|
-
...(options.lifecycle ? { lifecycle: options.lifecycle } : {}),
|
|
1125
|
-
};
|
|
1126
|
-
}
|
|
1127
|
-
|
|
1128
|
-
// Method-switch shared by r.httpRoute and extraRoutes — one place to keep
|
|
1129
|
-
// the two mounting paths from drifting on which Hono methods get a
|
|
1130
|
-
// convenience-call vs. app.on().
|
|
1131
|
-
function mountHonoRoute(
|
|
1132
|
-
app: Hono,
|
|
1133
|
-
method: HttpRouteMethod,
|
|
1134
|
-
path: string,
|
|
1135
|
-
// biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
|
|
1136
|
-
handler: (c: import("hono").Context<any, any>) => Response | Promise<Response>,
|
|
1137
|
-
middlewares: readonly MiddlewareHandler[] = [],
|
|
1138
|
-
): void {
|
|
1139
|
-
// Guards go into the route's own handler chain, never a method-gated
|
|
1140
|
-
// app.use: Hono serves HEAD through the GET route with c.req.method still
|
|
1141
|
-
// "HEAD", so a `method === c.req.method` gate would skip them for HEAD.
|
|
1142
|
-
if (middlewares.length > 0) {
|
|
1143
|
-
// [path]: only Hono's array-path overload accepts a variable-length handler spread.
|
|
1144
|
-
app.on(method, [path], ...middlewares, handler);
|
|
1145
|
-
// skip: guarded route already mounted with its guard chain
|
|
1146
|
-
return;
|
|
1147
|
-
}
|
|
1148
|
-
switch (method) {
|
|
1149
|
-
case "GET":
|
|
1150
|
-
app.get(path, handler);
|
|
1151
|
-
break;
|
|
1152
|
-
case "POST":
|
|
1153
|
-
app.post(path, handler);
|
|
1154
|
-
break;
|
|
1155
|
-
case "PUT":
|
|
1156
|
-
app.put(path, handler);
|
|
1157
|
-
break;
|
|
1158
|
-
case "PATCH":
|
|
1159
|
-
app.patch(path, handler);
|
|
1160
|
-
break;
|
|
1161
|
-
case "DELETE":
|
|
1162
|
-
app.delete(path, handler);
|
|
1163
|
-
break;
|
|
1164
|
-
case "OPTIONS":
|
|
1165
|
-
case "HEAD":
|
|
1166
|
-
// Hono's on() for the methods without a convenience method.
|
|
1167
|
-
app.on(method, path, handler);
|
|
1168
|
-
break;
|
|
1169
|
-
default:
|
|
1170
|
-
assertUnreachable(method, "http method");
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
|
-
|
|
1174
|
-
// Must run after the auth guard so getUser(c) carries the PAT.
|
|
1175
|
-
function buildPatRateLimitGuard(patRateLimiter: LoginRateLimiter): MiddlewareHandler {
|
|
1176
|
-
return async (c, next) => {
|
|
1177
|
-
const pat = getUser(c)?.pat;
|
|
1178
|
-
if (pat && !(await patRateLimiter.check(pat.tokenId))) {
|
|
1179
|
-
return c.json(
|
|
1180
|
-
{
|
|
1181
|
-
error: {
|
|
1182
|
-
code: "pat_rate_limited",
|
|
1183
|
-
httpStatus: 429,
|
|
1184
|
-
message: "personal access token rate limit exceeded",
|
|
1185
|
-
i18nKey: "auth.errors.patRateLimited",
|
|
1186
|
-
},
|
|
1187
|
-
},
|
|
1188
|
-
429,
|
|
1189
|
-
);
|
|
1190
|
-
}
|
|
1191
|
-
return next();
|
|
1192
|
-
};
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
// Shared systemQuery builder for r.httpRoute and extraRoutes (anonymous +
|
|
1196
|
-
// signature entries). requestContext.run must wrap the dispatcher call —
|
|
1197
|
-
// both route kinds run outside the requestIdMiddleware chain that normally
|
|
1198
|
-
// populates it, and `rateLimit: {per: "ip", ...}` on a handler invoked
|
|
1199
|
-
// through systemQuery is otherwise silent dead-code (enforceRateLimit reads
|
|
1200
|
-
// requestContext.get()?.ip, undefined without this wrap).
|
|
1201
|
-
function makeSystemQuery(
|
|
1202
|
-
// biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
|
|
1203
|
-
c: import("hono").Context<any, any>,
|
|
1204
|
-
dispatcher: Dispatcher,
|
|
1205
|
-
clientIpResolver?: ClientIpResolver,
|
|
1206
|
-
): (type: string, payload: unknown, tenantId: TenantId) => Promise<unknown> {
|
|
1207
|
-
return (type, payload, tenantId) =>
|
|
1208
|
-
requestContext.run(requestContext.get() ?? buildRequestContextData(c, clientIpResolver), () =>
|
|
1209
|
-
dispatcher.query(type, payload, createAnonymousUser(tenantId)),
|
|
1210
|
-
);
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
// SystemAdmin write/query builders shared by buildServer's `extraRoutes`
|
|
1214
|
-
// mount and server-runtime's `wire` hook (runProdApp/createKumikoServer,
|
|
1215
|
-
// after buildServer). Privilege-scope: SystemAdmin is the highest
|
|
1216
|
-
// non-tenant-scoped role — reaches ANY SystemAdmin-gated handler on ANY
|
|
1217
|
-
// tenant. Only safe for callers that already proved their own authenticity
|
|
1218
|
-
// (signature verify(), HMAC state, ...), never exposed to a raw request.
|
|
1219
|
-
export function makeDispatchSystemWrite(
|
|
1220
|
-
dispatcher: Dispatcher,
|
|
1221
|
-
): (args: SystemDispatchArgs) => Promise<WriteResult> {
|
|
1222
|
-
return ({ handlerQn, payload, tenantId }) =>
|
|
1223
|
-
dispatcher.write(handlerQn, payload, createSystemUser(tenantId, [ROLES.SystemAdmin]));
|
|
1224
|
-
}
|
|
1225
|
-
|
|
1226
|
-
export function makeDispatchSystemQuery(
|
|
1227
|
-
dispatcher: Dispatcher,
|
|
1228
|
-
): (args: SystemDispatchArgs) => Promise<unknown> {
|
|
1229
|
-
return ({ handlerQn, payload, tenantId }) =>
|
|
1230
|
-
dispatcher.query(handlerQn, payload, createSystemUser(tenantId, [ROLES.SystemAdmin]));
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1233
|
-
// Same dispatcher.write(...) as entry:"user", but the user is getUser(c) —
|
|
1234
|
-
// see AnonymousExtraRouteDeps.write for the privilege/tenant contract.
|
|
1235
|
-
function makeAnonymousWrite(
|
|
1236
|
-
// biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
|
|
1237
|
-
c: import("hono").Context<any, any>,
|
|
1238
|
-
dispatcher: Dispatcher,
|
|
1239
|
-
): (type: string, payload: unknown) => Promise<WriteResult> {
|
|
1240
|
-
return (type, payload) => {
|
|
1241
|
-
const user = getUser(c);
|
|
1242
|
-
if (!user) {
|
|
1243
|
-
throw new Error(
|
|
1244
|
-
'[kumiko] extraRoutes: entry:"anonymous" deps.write requires this route to be mounted ' +
|
|
1245
|
-
'under "/api/" with anonymousAccess wired — no request-resolved session user was found.',
|
|
1246
|
-
);
|
|
1247
|
-
}
|
|
1248
|
-
return dispatcher.write(type, payload, user);
|
|
1249
|
-
};
|
|
1250
|
-
}
|
|
1251
|
-
|
|
1252
|
-
// Shared by entry:"user" extra routes and GET /api/schema — both require a
|
|
1253
|
-
// real, signed-in principal and reject the synthesised anonymousAccess user
|
|
1254
|
-
// (SessionUser.roles includes ANONYMOUS_ROLE) the same way.
|
|
1255
|
-
function isMissingOrAnonymousUser(user: SessionUser | undefined): boolean {
|
|
1256
|
-
return !user || user.roles.includes(ANONYMOUS_ROLE);
|
|
1257
|
-
}
|
|
1258
|
-
|
|
1259
|
-
function unauthenticatedResponse(c: import("hono").Context): Response {
|
|
1260
|
-
return c.json(
|
|
1261
|
-
{
|
|
1262
|
-
error: {
|
|
1263
|
-
code: "unauthenticated",
|
|
1264
|
-
httpStatus: 401,
|
|
1265
|
-
message: "this route requires a signed-in user",
|
|
1266
|
-
i18nKey: "auth.errors.missingToken",
|
|
1267
|
-
},
|
|
1268
|
-
},
|
|
1269
|
-
401,
|
|
1270
|
-
);
|
|
1271
|
-
}
|
|
1272
|
-
|
|
1273
|
-
type WebSocketRouteHandlerDeps = {
|
|
1274
|
-
readonly dispatcher: Dispatcher;
|
|
1275
|
-
readonly clientIpResolver: ClientIpResolver;
|
|
1276
|
-
readonly originAllowlist: ReadonlySet<string> | undefined;
|
|
1277
|
-
readonly sessionChecker?: AuthSessionChecker;
|
|
1278
|
-
readonly resolveTenantLifecycleStatus?: TenantLifecycleStatusResolver;
|
|
1279
|
-
readonly connectionLimiter: WebSocketConnectionLimiter;
|
|
1280
|
-
};
|
|
1281
|
-
|
|
1282
|
-
const webSocketLog = createFallbackLogger("websocket");
|
|
1283
|
-
|
|
1284
|
-
function webSocketErrorResponse(
|
|
1285
|
-
c: import("hono").Context,
|
|
1286
|
-
status: 400 | 426 | 429 | 501,
|
|
1287
|
-
code: string,
|
|
1288
|
-
message: string,
|
|
1289
|
-
): Response {
|
|
1290
|
-
return c.json({ error: { code, httpStatus: status, message } }, status);
|
|
1291
|
-
}
|
|
1292
|
-
|
|
1293
|
-
function buildWebSocketRouteHandler(
|
|
1294
|
-
route: WebSocketRouteDefinition,
|
|
1295
|
-
shared: WebSocketRouteHandlerDeps,
|
|
1296
|
-
// biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
|
|
1297
|
-
): (c: import("hono").Context<any, any>) => Promise<Response> {
|
|
1298
|
-
return async (c) => {
|
|
1299
|
-
if (!isWebSocketOriginAllowed(c, shared.originAllowlist)) return rejectOrigin(c);
|
|
1300
|
-
const user = getUser(c);
|
|
1301
|
-
if (isMissingOrAnonymousUser(user)) return unauthenticatedResponse(c);
|
|
1302
|
-
if (!isWebSocketUpgradeRequest(c.req.raw)) {
|
|
1303
|
-
return webSocketErrorResponse(
|
|
1304
|
-
c,
|
|
1305
|
-
426,
|
|
1306
|
-
"websocket_upgrade_required",
|
|
1307
|
-
"this route only accepts WebSocket upgrade requests",
|
|
1308
|
-
);
|
|
1309
|
-
}
|
|
1310
|
-
const honoEnv: unknown = c.env;
|
|
1311
|
-
if (!hasWebSocketUpgradeServer(honoEnv)) {
|
|
1312
|
-
const message = "webSocketUpgradeFetch not wired: pass it to buildBunServeOptions";
|
|
1313
|
-
webSocketLog.error(message, { path: route.path });
|
|
1314
|
-
return webSocketErrorResponse(c, 501, "websocket_upgrade_not_wired", message);
|
|
1315
|
-
}
|
|
1316
|
-
// The slot is taken before connect (a refused attempt must not run it) and stays synchronous with
|
|
1317
|
-
// the check, so concurrent upgrades can't overshoot the cap. Every path without a live socket frees it.
|
|
1318
|
-
const releaseConnectionSlot = shared.connectionLimiter.tryAcquire(
|
|
1319
|
-
`${route.path}\n${user.tenantId}\n${user.id}`,
|
|
1320
|
-
route.maxConnectionsPerUser ?? WEBSOCKET_DEFAULT_MAX_CONNECTIONS_PER_USER,
|
|
1321
|
-
);
|
|
1322
|
-
if (!releaseConnectionSlot) {
|
|
1323
|
-
return webSocketErrorResponse(
|
|
1324
|
-
c,
|
|
1325
|
-
429,
|
|
1326
|
-
"websocket_connection_limit",
|
|
1327
|
-
"too many open WebSocket connections for this user",
|
|
1328
|
-
);
|
|
1329
|
-
}
|
|
1330
|
-
let upgraded = false;
|
|
1331
|
-
try {
|
|
1332
|
-
const handlers = await route.connect(c, {
|
|
1333
|
-
user,
|
|
1334
|
-
query: (type, payload) => shared.dispatcher.query(type, payload, user),
|
|
1335
|
-
write: (type, payload) => shared.dispatcher.write(type, payload, user),
|
|
1336
|
-
clientIp: shared.clientIpResolver.resolve(clientIpSourceFromHonoContext(c)),
|
|
1337
|
-
});
|
|
1338
|
-
if (handlers instanceof Response) return handlers;
|
|
1339
|
-
|
|
1340
|
-
const captured = requestContext.get();
|
|
1341
|
-
const requestContextData = captured ? withoutAbortSignal(captured) : undefined;
|
|
1342
|
-
const revalidateSession = buildWebSocketSessionRevalidator({
|
|
1343
|
-
user,
|
|
1344
|
-
sessionChecker: shared.sessionChecker,
|
|
1345
|
-
resolveTenantLifecycleStatus: shared.resolveTenantLifecycleStatus,
|
|
1346
|
-
tokenExpiresAtSec: getAuthTokenExpiry(c),
|
|
1347
|
-
});
|
|
1348
|
-
upgraded = honoEnv.server.upgrade(c.req.raw, {
|
|
1349
|
-
data: {
|
|
1350
|
-
handlers,
|
|
1351
|
-
maxMessageBytes: route.maxMessageBytes ?? WEBSOCKET_DEFAULT_MAX_MESSAGE_BYTES,
|
|
1352
|
-
requestContextData,
|
|
1353
|
-
revalidateSession,
|
|
1354
|
-
releaseConnectionSlot,
|
|
1355
|
-
},
|
|
1356
|
-
});
|
|
1357
|
-
if (!upgraded) {
|
|
1358
|
-
return webSocketErrorResponse(
|
|
1359
|
-
c,
|
|
1360
|
-
400,
|
|
1361
|
-
"websocket_upgrade_failed",
|
|
1362
|
-
"the WebSocket upgrade was rejected",
|
|
1363
|
-
);
|
|
1364
|
-
}
|
|
1365
|
-
// Bun ignores the returned Response after a successful upgrade.
|
|
1366
|
-
return new Response(null);
|
|
1367
|
-
} finally {
|
|
1368
|
-
if (!upgraded) releaseConnectionSlot();
|
|
1369
|
-
}
|
|
1370
|
-
};
|
|
1371
|
-
}
|
|
1372
|
-
|
|
1373
|
-
// The request's AbortSignal fires when the upgrade request ends, which would
|
|
1374
|
-
// abort every later handler running under the captured context.
|
|
1375
|
-
function withoutAbortSignal(data: RequestContextData): RequestContextData {
|
|
1376
|
-
const { signal: _signal, ...rest } = data;
|
|
1377
|
-
return rest;
|
|
1378
|
-
}
|
|
1379
|
-
|
|
1380
|
-
function isKnownExtraRouteEntry(entry: unknown): entry is ExtraRouteEntry {
|
|
1381
|
-
return (
|
|
1382
|
-
entry === ExtraRouteEntries.anonymous ||
|
|
1383
|
-
entry === ExtraRouteEntries.user ||
|
|
1384
|
-
entry === ExtraRouteEntries.signature
|
|
1385
|
-
);
|
|
1386
|
-
}
|
|
1387
|
-
|
|
1388
|
-
// Hono path pattern ("/api/foo/:bar", "/api/foo/*") → RegExp. Only the
|
|
1389
|
-
// subset extraRoutes actually uses (static segments, `:param`, trailing
|
|
1390
|
-
// `*`) — no inline `:param{regex}` constraints, no optional `:param?`.
|
|
1391
|
-
function honoPathToRegex(path: string): RegExp {
|
|
1392
|
-
const segments = path
|
|
1393
|
-
.split("/")
|
|
1394
|
-
.map((segment) => {
|
|
1395
|
-
if (segment.startsWith(":")) return "[^/]+";
|
|
1396
|
-
if (segment === "*") return ".*";
|
|
1397
|
-
return segment.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1398
|
-
})
|
|
1399
|
-
.join("/");
|
|
1400
|
-
return new RegExp(`^${segments}$`);
|
|
1401
|
-
}
|
|
1402
|
-
|
|
1403
|
-
type ExtraRoutePublicMatcher = { readonly method: string; readonly pattern: RegExp };
|
|
1404
|
-
|
|
1405
|
-
// See the bypass comment at the jwtGuard mount above — only signature
|
|
1406
|
-
// routes are public here.
|
|
1407
|
-
function compileExtraRoutePublicMatchers(
|
|
1408
|
-
extraRoutes: readonly ExtraRouteDefinition[] | undefined,
|
|
1409
|
-
): readonly ExtraRoutePublicMatcher[] {
|
|
1410
|
-
if (!extraRoutes) return [];
|
|
1411
|
-
return extraRoutes
|
|
1412
|
-
.filter((route) => route.entry === ExtraRouteEntries.signature)
|
|
1413
|
-
.map((route) => ({ method: route.method, pattern: honoPathToRegex(route.path) }));
|
|
1414
|
-
}
|
|
1415
|
-
|
|
1416
|
-
type ExtraRouteHonoHandlerDeps = {
|
|
1417
|
-
readonly app: Hono;
|
|
1418
|
-
readonly dispatcher: Dispatcher;
|
|
1419
|
-
readonly registry: Registry;
|
|
1420
|
-
readonly secrets: import("../secrets").SecretsContext | undefined;
|
|
1421
|
-
readonly dispatchSystemWrite: (args: SystemDispatchArgs) => Promise<WriteResult>;
|
|
1422
|
-
readonly dispatchSystemQuery: (args: SystemDispatchArgs) => Promise<unknown>;
|
|
1423
|
-
readonly clientIpResolver: ClientIpResolver;
|
|
1424
|
-
};
|
|
1425
|
-
|
|
1426
|
-
function buildExtraRouteHonoHandler(
|
|
1427
|
-
route: ExtraRouteDefinition,
|
|
1428
|
-
shared: ExtraRouteHonoHandlerDeps,
|
|
1429
|
-
// biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
|
|
1430
|
-
): (c: import("hono").Context<any, any>) => Promise<Response> {
|
|
1431
|
-
switch (route.entry) {
|
|
1432
|
-
case ExtraRouteEntries.anonymous:
|
|
1433
|
-
return async (c) =>
|
|
1434
|
-
route.handler(c, {
|
|
1435
|
-
app: shared.app,
|
|
1436
|
-
registry: shared.registry,
|
|
1437
|
-
systemQuery: makeSystemQuery(c, shared.dispatcher, shared.clientIpResolver),
|
|
1438
|
-
write: makeAnonymousWrite(c, shared.dispatcher),
|
|
1439
|
-
clientIp: shared.clientIpResolver.resolve(clientIpSourceFromHonoContext(c)),
|
|
1440
|
-
});
|
|
1441
|
-
case ExtraRouteEntries.user:
|
|
1442
|
-
return async (c) => {
|
|
1443
|
-
const user = getUser(c);
|
|
1444
|
-
if (isMissingOrAnonymousUser(user)) {
|
|
1445
|
-
return unauthenticatedResponse(c);
|
|
1446
|
-
}
|
|
1447
|
-
return route.handler(c, {
|
|
1448
|
-
app: shared.app,
|
|
1449
|
-
registry: shared.registry,
|
|
1450
|
-
user,
|
|
1451
|
-
query: (type, payload) => shared.dispatcher.query(type, payload, user),
|
|
1452
|
-
write: (type, payload) => shared.dispatcher.write(type, payload, user),
|
|
1453
|
-
});
|
|
1454
|
-
};
|
|
1455
|
-
case ExtraRouteEntries.signature:
|
|
1456
|
-
return async (c) => {
|
|
1457
|
-
const rawBody = await c.req.text();
|
|
1458
|
-
const headers: Record<string, string> = {};
|
|
1459
|
-
c.req.raw.headers.forEach((value, key) => {
|
|
1460
|
-
headers[key.toLowerCase()] = value;
|
|
1461
|
-
});
|
|
1462
|
-
let verified: unknown;
|
|
1463
|
-
try {
|
|
1464
|
-
verified = await route.verify(
|
|
1465
|
-
{ rawBody, headers, params: c.req.param(), query: c.req.query() },
|
|
1466
|
-
{ registry: shared.registry, secrets: shared.secrets },
|
|
1467
|
-
);
|
|
1468
|
-
} catch (e) {
|
|
1469
|
-
if (e instanceof ExtraRouteRejection) {
|
|
1470
|
-
if (e.retryAfterSeconds !== undefined) {
|
|
1471
|
-
return c.json(e.body, e.status, { "Retry-After": String(e.retryAfterSeconds) });
|
|
1472
|
-
}
|
|
1473
|
-
return c.json(e.body, e.status);
|
|
1474
|
-
}
|
|
1475
|
-
return c.json(
|
|
1476
|
-
{
|
|
1477
|
-
error: {
|
|
1478
|
-
code: "extra_route_signature_invalid",
|
|
1479
|
-
message: e instanceof Error ? e.message : String(e),
|
|
1480
|
-
},
|
|
1481
|
-
},
|
|
1482
|
-
401,
|
|
1483
|
-
);
|
|
1484
|
-
}
|
|
1485
|
-
return route.handler(c, verified, {
|
|
1486
|
-
app: shared.app,
|
|
1487
|
-
registry: shared.registry,
|
|
1488
|
-
secrets: shared.secrets,
|
|
1489
|
-
systemQuery: makeSystemQuery(c, shared.dispatcher, shared.clientIpResolver),
|
|
1490
|
-
dispatchSystemWrite: shared.dispatchSystemWrite,
|
|
1491
|
-
dispatchSystemQuery: shared.dispatchSystemQuery,
|
|
1492
|
-
});
|
|
1493
|
-
};
|
|
1494
|
-
default:
|
|
1495
|
-
return assertUnreachable(route, "extra route entry");
|
|
1496
|
-
}
|
|
1497
|
-
}
|
|
1498
|
-
|
|
1499
|
-
function deriveTenantLifecycleResolver(
|
|
1500
|
-
registry: Registry,
|
|
1501
|
-
db: DbConnection | undefined,
|
|
1502
|
-
): TenantLifecycleStatusResolver | undefined {
|
|
1503
|
-
const plugin = resolveTenantLifecyclePlugin(registry, "buildServer");
|
|
1504
|
-
if (!plugin) return undefined;
|
|
1505
|
-
if (!db) {
|
|
1506
|
-
throw new Error(
|
|
1507
|
-
"[kumiko] a tenantLifecycleStatus provider is mounted (tenant-lifecycle) but context.db is " +
|
|
1508
|
-
"missing — the request-level teardown gate needs a DbConnection. Pass context.db, or wire " +
|
|
1509
|
-
"auth.resolveTenantLifecycleStatus explicitly.",
|
|
1510
|
-
);
|
|
1511
|
-
}
|
|
1512
|
-
return (tenantId) => plugin.resolveStatus(tenantId, { db });
|
|
1513
|
-
}
|
|
1514
|
-
|
|
1515
|
-
// Scans every feature's entities for a file/image/files/images field. Short-
|
|
1516
|
-
// circuits on the first hit — no need to build a full inventory, we only want
|
|
1517
|
-
// the yes/no answer for the boot check.
|
|
1518
|
-
function registryDeclaresFileFields(registry: Registry): boolean {
|
|
1519
|
-
for (const feature of registry.features.values()) {
|
|
1520
|
-
for (const entity of Object.values(feature.entities ?? {})) {
|
|
1521
|
-
for (const field of Object.values(entity.fields)) {
|
|
1522
|
-
if (isFileField(field)) return true;
|
|
1523
|
-
}
|
|
1524
|
-
}
|
|
1525
|
-
}
|
|
1526
|
-
return false;
|
|
1527
|
-
}
|
|
1528
|
-
|
|
1529
|
-
// Entities whose entityList screen WOULD render a search box based on
|
|
1530
|
-
// screen/field config alone: `screen.searchable` wins when set, otherwise
|
|
1531
|
-
// the box shows iff the entity has ≥1 searchable field. `screen.searchable
|
|
1532
|
-
// === false` is excluded — the boot-validator (entity-list-screens.ts) only
|
|
1533
|
-
// allows that on the whitelisted download-attempt-list-style screens, which
|
|
1534
|
-
// never render the box. This is the config-only half of the rule; the
|
|
1535
|
-
// client additionally gates on FeatureSchema.searchAdapterMissing (#2062,
|
|
1536
|
-
// set from the same `!options.context.searchAdapter` check below) so the
|
|
1537
|
-
// box is actually suppressed once this function finds a hit.
|
|
1538
|
-
function entitiesWithSearchableScreen(registry: Registry): readonly string[] {
|
|
1539
|
-
const entities = new Set<string>();
|
|
1540
|
-
for (const feature of registry.features.values()) {
|
|
1541
|
-
for (const screen of Object.values(feature.screens)) {
|
|
1542
|
-
if (screen.type !== "entityList") continue;
|
|
1543
|
-
const isSearchable =
|
|
1544
|
-
screen.searchable === true ||
|
|
1545
|
-
(screen.searchable === undefined && registry.getSearchableFields(screen.entity).length > 0);
|
|
1546
|
-
if (isSearchable) entities.add(screen.entity);
|
|
1547
|
-
}
|
|
1548
|
-
}
|
|
1549
|
-
return [...entities];
|
|
1550
|
-
}
|