@cosmicdrift/kumiko-framework 0.389.0 → 0.390.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/AGENTS.md +9 -4
- package/README.md +1 -1
- package/agents/examples/apex-surface-auth.md +2 -3
- package/agents/examples/api-worker-split.md +9 -2
- package/agents/examples/auth-claims.md +1 -1
- package/agents/examples/cross-feature-events.md +12 -12
- package/agents/examples/crypto-shredding-hr.md +2 -2
- package/agents/examples/encrypted-tenant-config.md +1 -1
- package/agents/examples/error-contract.md +12 -7
- package/agents/examples/event-sourcing.md +29 -29
- package/agents/examples/files-post-processing.md +10 -8
- package/agents/examples/inbound-mail-triage.md +1 -0
- package/agents/examples/lane-routing.md +2 -1
- package/agents/examples/legal-pages.md +2 -2
- package/agents/examples/lifecycle-hooks.md +3 -3
- package/agents/examples/managed-config.md +4 -4
- package/agents/examples/managed-pages.md +1 -1
- package/agents/examples/relations.md +19 -4
- package/agents/examples/search.md +4 -4
- package/agents/examples/secrets-demo.md +9 -6
- package/agents/examples/state-machine.md +2 -2
- package/agents/examples/tenant-settings.md +1 -1
- package/agents/examples/user-data-rights.md +3 -6
- package/agents/examples/workflow-engine.md +53 -47
- package/agents/examples.md +4 -4
- package/agents/features.md +1 -1
- package/dist/api/auth-middleware.js +1 -1
- package/dist/api/auth-routes-invite.js +2 -1
- package/dist/api/entity-read-access.d.ts +3 -1
- package/dist/api/export/export-columns.d.ts +3 -1
- package/dist/api/export/export-route.js +3 -2
- package/dist/api/export/export-screen.d.ts +2 -1
- package/dist/api/extra-route.d.ts +3 -1
- package/dist/api/index.d.ts +23 -27
- package/dist/api/index.js +13 -15
- package/dist/api/jwt.js +1 -1
- package/dist/api/observability-middleware.d.ts +1 -1
- package/dist/api/observability-middleware.js +2 -1
- package/dist/api/request-context-internals.d.ts +31 -0
- package/dist/api/request-context-internals.js +11 -0
- package/dist/api/request-context-scopes.d.ts +14 -0
- package/dist/api/request-context-scopes.js +69 -0
- package/dist/api/request-context.d.ts +1 -40
- package/dist/api/request-context.js +22 -51
- package/dist/api/request-id-middleware.d.ts +1 -1
- package/dist/api/route-registrars.d.ts +2 -1
- package/dist/api/route-registrars.js +1 -1
- package/dist/api/routes.js +7 -3
- package/dist/api/server-boot-checks.d.ts +1 -1
- package/dist/api/server-boot-checks.js +2 -2
- package/dist/api/server-event-dispatcher.d.ts +6 -1
- package/dist/api/server-event-dispatcher.js +3 -4
- package/dist/api/server-extra-routes.d.ts +1 -1
- package/dist/api/server-extra-routes.js +2 -1
- package/dist/api/server-middleware.js +3 -1
- package/dist/api/server-routes.d.ts +2 -1
- package/dist/api/server-wiring.js +6 -4
- package/dist/api/server.d.ts +2 -1
- package/dist/api/sse-route.d.ts +2 -1
- package/dist/api/tenant-scoped-secrets.d.ts +2 -0
- package/dist/api/tenant-scoped-secrets.js +13 -0
- package/dist/api/websocket-route.d.ts +1 -1
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/roles.d.ts +0 -5
- package/dist/compliance/duration-spec.d.ts +0 -1
- package/dist/compliance/duration-spec.js +0 -5
- package/dist/compliance/index.d.ts +4 -4
- package/dist/compliance/index.js +2 -2
- package/dist/compliance/profiles.d.ts +0 -15
- package/dist/compliance/profiles.js +0 -23
- package/dist/config/index.d.ts +10 -10
- package/dist/config/index.js +13 -1
- package/dist/config/internals.d.ts +9 -0
- package/dist/config/internals.js +1 -0
- package/dist/consumer-cli-internals.d.ts +4 -0
- package/dist/consumer-cli-internals.js +1 -0
- package/dist/consumer-cli.d.ts +1 -4
- package/dist/consumer-cli.js +5 -1
- package/dist/crypto/event-pii.js +1 -1
- package/dist/crypto/index.d.ts +8 -9
- package/dist/crypto/index.js +7 -8
- package/dist/crypto/pg-kms-adapter.js +6 -1
- package/dist/db/apply-entity-event.d.ts +1 -1
- package/dist/db/apply-entity-event.js +15 -47
- package/dist/db/blind-index-cleanup.js +91 -77
- package/dist/db/collect-table-metas.js +1 -1
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/compound-types.js +0 -7
- package/dist/db/config-seed.d.ts +2 -1
- package/dist/db/config-seed.js +6 -1
- package/dist/db/connection.d.ts +3 -1
- package/dist/db/connection.js +15 -5
- package/dist/db/cross-tenant-reads.d.ts +1 -1
- package/dist/db/cross-tenant-reads.js +1 -1
- package/dist/db/dialect.d.ts +0 -5
- package/dist/db/dialect.js +0 -3
- package/dist/db/eagerload.d.ts +2 -1
- package/dist/db/entity-field-encryption.d.ts +1 -1
- package/dist/db/entity-table-meta.d.ts +1 -1
- package/dist/db/event-store-executor-context.d.ts +3 -1
- package/dist/db/event-store-executor-context.js +4 -3
- package/dist/db/event-store-executor-read-filter.d.ts +1 -1
- package/dist/db/event-store-executor-read-rows.d.ts +2 -1
- package/dist/db/event-store-executor-read-search.d.ts +2 -1
- package/dist/db/event-store-executor-read-sort.d.ts +2 -1
- package/dist/db/event-store-executor-read.js +2 -2
- package/dist/db/event-store-executor-write-atomic.js +8 -7
- package/dist/db/event-store-executor-write-steps.d.ts +3 -2
- package/dist/db/event-store-executor-write.js +7 -4
- package/dist/db/event-store-executor.d.ts +1 -1
- package/dist/db/executor-managed-tables.d.ts +7 -1
- package/dist/db/executor-managed-tables.js +11 -2
- package/dist/db/index.d.ts +29 -28
- package/dist/db/index.js +22 -20
- package/dist/db/known-table-names.d.ts +6 -0
- package/dist/db/known-table-names.js +21 -0
- package/dist/db/list-aggregate-labels.d.ts +1 -1
- package/dist/db/located-timestamp.d.ts +1 -1
- package/dist/db/located-timestamp.js +0 -5
- package/dist/db/migrate-generator.d.ts +17 -1
- package/dist/db/migrate-generator.js +50 -20
- package/dist/db/migrate-primary-key.d.ts +12 -0
- package/dist/db/migrate-primary-key.js +45 -0
- package/dist/db/migrate-rls-diff.d.ts +20 -0
- package/dist/db/migrate-rls-diff.js +61 -0
- package/dist/db/migrate-runner.js +4 -0
- package/dist/db/money.d.ts +1 -1
- package/dist/db/money.js +1 -1
- package/dist/db/parent-ref-clause.d.ts +2 -1
- package/dist/db/pg-error.d.ts +2 -0
- package/dist/db/pg-error.js +11 -0
- package/dist/db/queries/ddl.d.ts +3 -0
- package/dist/db/queries/ddl.js +34 -1
- package/dist/db/queries/event-store.js +4 -2
- package/dist/db/queries/event-tenants.d.ts +2 -0
- package/dist/db/queries/event-tenants.js +17 -0
- package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
- package/dist/db/queries/rebuild-rls-guard.js +29 -0
- package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
- package/dist/db/queries/rls-boot-catalog.js +39 -0
- package/dist/db/queries/rls-catalog.d.ts +6 -0
- package/dist/db/queries/rls-catalog.js +82 -0
- package/dist/db/queries/rls-scope.d.ts +3 -0
- package/dist/db/queries/rls-scope.js +17 -0
- package/dist/db/queries/rls-shape.d.ts +10 -0
- package/dist/db/queries/rls-shape.js +42 -0
- package/dist/db/queries/session-advisory-lock.d.ts +2 -0
- package/dist/db/queries/session-advisory-lock.js +23 -0
- package/dist/db/queries/shadow-swap.d.ts +1 -2
- package/dist/db/queries/shadow-swap.js +9 -25
- package/dist/db/queries/test-stack.d.ts +4 -1
- package/dist/db/queries/test-stack.js +83 -2
- package/dist/db/query.js +11 -7
- package/dist/db/reference-data.d.ts +1 -1
- package/dist/db/reference-data.js +6 -1
- package/dist/db/render-ddl.d.ts +6 -2
- package/dist/db/render-ddl.js +7 -7
- package/dist/db/render-rls-ddl.d.ts +35 -0
- package/dist/db/render-rls-ddl.js +127 -0
- package/dist/db/replay-migration-sql.d.ts +3 -1
- package/dist/db/replay-migration-sql.js +22 -5
- package/dist/db/replay-rls.d.ts +25 -0
- package/dist/db/replay-rls.js +156 -0
- package/dist/db/row-level-security-boot-check.d.ts +5 -0
- package/dist/db/row-level-security-boot-check.js +85 -0
- package/dist/db/row-level-security-connection.d.ts +3 -0
- package/dist/db/row-level-security-connection.js +213 -0
- package/dist/db/row-level-security-scope.d.ts +33 -0
- package/dist/db/row-level-security-scope.js +127 -0
- package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
- package/dist/db/scope-tenant-db-to-tenant.js +14 -0
- package/dist/db/sql-identifier.d.ts +1 -0
- package/dist/db/sql-identifier.js +3 -0
- package/dist/db/table-builder.d.ts +2 -1
- package/dist/db/table-builder.js +1 -1
- package/dist/db/table-info.js +1 -1
- package/dist/db/table-push.d.ts +11 -2
- package/dist/db/table-push.js +15 -2
- package/dist/db/tenant-db-runner.d.ts +3 -1
- package/dist/db/tenant-db-runner.js +4 -3
- package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
- package/dist/db/tenant-db-scoped-rebind.js +33 -0
- package/dist/db/tenant-db-statement-runner.d.ts +13 -0
- package/dist/db/tenant-db-statement-runner.js +48 -0
- package/dist/db/tenant-db.d.ts +17 -12
- package/dist/db/tenant-db.js +49 -120
- package/dist/db/tenant-id-filter.d.ts +3 -0
- package/dist/db/tenant-id-filter.js +30 -0
- package/dist/db/transaction-serialization.d.ts +6 -0
- package/dist/db/transaction-serialization.js +60 -0
- package/dist/derivatives/delete-stored-file.js +1 -1
- package/dist/derivatives/index.d.ts +2 -5
- package/dist/derivatives/index.js +2 -3
- package/dist/engine/access.d.ts +2 -1
- package/dist/engine/access.js +1 -1
- package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
- package/dist/engine/boot-validator/entity-handler.js +1 -1
- package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
- package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
- package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
- package/dist/engine/boot-validator/nav.d.ts +3 -1
- package/dist/engine/boot-validator/nav.js +1 -1
- package/dist/engine/boot-validator/ownership.d.ts +2 -1
- package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
- package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
- package/dist/engine/boot-validator/query-refs.d.ts +2 -1
- package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
- package/dist/engine/boot-validator/screens.d.ts +2 -1
- package/dist/engine/boot-validator/workspaces.d.ts +3 -1
- package/dist/engine/bridge-stub.d.ts +5 -2
- package/dist/engine/bridge-stub.js +39 -24
- package/dist/engine/config-helpers.d.ts +2 -2
- package/dist/engine/config-helpers.js +0 -9
- package/dist/engine/constants.d.ts +0 -10
- package/dist/engine/constants.js +0 -8
- package/dist/engine/create-app.js +1 -1
- package/dist/engine/define-feature.d.ts +2 -1
- package/dist/engine/define-feature.js +1 -2
- package/dist/engine/define-handler.d.ts +1 -1
- package/dist/engine/define-step.d.ts +0 -1
- package/dist/engine/define-step.js +0 -3
- package/dist/engine/embedded-derived.d.ts +1 -1
- package/dist/engine/entity-handlers.d.ts +2 -1
- package/dist/engine/entity-handlers.js +7 -7
- package/dist/engine/entity-list-runtime-options.js +3 -1
- package/dist/engine/entity-list-searchability.d.ts +2 -1
- package/dist/engine/event-def.d.ts +2 -1
- package/dist/engine/event-helpers.d.ts +3 -1
- package/dist/engine/event-helpers.js +3 -3
- package/dist/engine/extension-names.d.ts +2 -8
- package/dist/engine/extension-names.js +2 -2
- package/dist/engine/extension-selector-plugins.d.ts +1 -1
- package/dist/engine/extensions/storage-provider.d.ts +1 -2
- package/dist/engine/extensions/user-data.d.ts +0 -8
- package/dist/engine/factories.d.ts +2 -1
- package/dist/engine/feature-builder-state.d.ts +8 -1
- package/dist/engine/feature-changelog.d.ts +1 -1
- package/dist/engine/feature-config-events-jobs.d.ts +4 -1
- package/dist/engine/feature-entity-handlers.d.ts +5 -1
- package/dist/engine/feature-manifest.js +1 -1
- package/dist/engine/feature-ui-extensions.d.ts +7 -1
- package/dist/engine/feature-ui-extensions.js +6 -4
- package/dist/engine/field-access.d.ts +2 -1
- package/dist/engine/handler-field-references.d.ts +0 -4
- package/dist/engine/index.d.ts +57 -54
- package/dist/engine/index.js +22 -27
- package/dist/engine/instruction-fields.d.ts +1 -1
- package/dist/engine/personal-data-fields.d.ts +1 -1
- package/dist/engine/qualified-name.d.ts +0 -1
- package/dist/engine/read-claim.d.ts +2 -1
- package/dist/engine/registry-facade.js +0 -3
- package/dist/engine/registry-ingest.d.ts +2 -1
- package/dist/engine/registry-ingest.js +1 -2
- package/dist/engine/registry-state.d.ts +12 -2
- package/dist/engine/registry-state.js +2 -3
- package/dist/engine/registry-validate.d.ts +3 -1
- package/dist/engine/registry-validate.js +7 -7
- package/dist/engine/run-in.d.ts +1 -1
- package/dist/engine/run-in.js +0 -1
- package/dist/engine/schema-builder.d.ts +1 -1
- package/dist/engine/schema-builder.js +1 -1
- package/dist/engine/screen-filter-ops.d.ts +2 -1
- package/dist/engine/screen-filter-ops.js +0 -5
- package/dist/engine/soft-delete-cleanup.d.ts +1 -1
- package/dist/engine/soft-delete-cleanup.js +4 -4
- package/dist/engine/state-machine.js +2 -1
- package/dist/engine/steps/_read-source.js +1 -1
- package/dist/engine/steps/aggregate-append-event.js +2 -2
- package/dist/engine/steps/call-feature.js +2 -2
- package/dist/engine/steps/mail-send.js +1 -1
- package/dist/engine/steps/retry.js +1 -1
- package/dist/engine/steps/wait-for-event.js +1 -1
- package/dist/engine/steps/wait.js +1 -1
- package/dist/engine/steps/webhook-send.js +1 -1
- package/dist/engine/template-variables.d.ts +2 -1
- package/dist/engine/transfer-adjacency.d.ts +1 -1
- package/dist/engine/types/index.d.ts +8 -31
- package/dist/engine/types/index.js +2 -10
- package/dist/engine/validation.d.ts +2 -1
- package/dist/entrypoint/index.d.ts +7 -35
- package/dist/entrypoint/index.js +7 -1
- package/dist/entrypoint/internals.d.ts +40 -0
- package/dist/entrypoint/internals.js +1 -0
- package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
- package/dist/entrypoint/row-level-security-mode-check.js +19 -0
- package/dist/env/dry-run-internals.d.ts +10 -0
- package/dist/env/dry-run-internals.js +1 -0
- package/dist/env/dry-run.d.ts +1 -10
- package/dist/env/dry-run.js +2 -1
- package/dist/env/index.d.ts +1 -85
- package/dist/env/index.js +6 -50
- package/dist/env/internals.d.ts +87 -0
- package/dist/env/internals.js +53 -0
- package/dist/errors/classes.js +2 -2
- package/dist/errors/index.d.ts +5 -14
- package/dist/errors/index.js +4 -9
- package/dist/errors/member-resolution.js +1 -1
- package/dist/errors/reasons.d.ts +0 -1
- package/dist/errors/reasons.js +7 -7
- package/dist/errors/serialize.d.ts +0 -18
- package/dist/errors/serialize.js +0 -27
- package/dist/es-ops/index.d.ts +4 -4
- package/dist/es-ops/index.js +2 -2
- package/dist/es-ops/operations-schema.d.ts +1 -1
- package/dist/es-ops/types.d.ts +4 -5
- package/dist/event-store/admin-api-internals.d.ts +14 -0
- package/dist/event-store/admin-api-internals.js +1 -0
- package/dist/event-store/admin-api.d.ts +1 -14
- package/dist/event-store/admin-api.js +11 -6
- package/dist/event-store/archive.js +4 -2
- package/dist/event-store/errors.js +2 -2
- package/dist/event-store/event-store.js +41 -34
- package/dist/event-store/events-schema.js +4 -1
- package/dist/event-store/index.d.ts +11 -13
- package/dist/event-store/index.js +7 -9
- package/dist/event-store/rebuild-dead-letter.js +4 -2
- package/dist/event-store/snapshot.js +4 -3
- package/dist/event-store/stream-scope.d.ts +2 -0
- package/dist/event-store/stream-scope.js +6 -0
- package/dist/event-store/upcaster-dead-letter.js +4 -2
- package/dist/event-store/upcaster.d.ts +2 -1
- package/dist/files/action-form-upload.d.ts +2 -1
- package/dist/files/action-form-upload.js +1 -1
- package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
- package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
- package/dist/files/bind-pending-file-refs.d.ts +2 -1
- package/dist/files/bind-pending-file-refs.js +2 -1
- package/dist/files/bind-referenced-files.write.js +1 -1
- package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
- package/dist/files/create-file-ref-from-bytes.js +3 -3
- package/dist/files/create-file-ref.d.ts +3 -2
- package/dist/files/create-file-ref.js +2 -2
- package/dist/files/dispose-removed-file-refs.d.ts +2 -1
- package/dist/files/dispose-removed-file-refs.js +1 -1
- package/dist/files/feature.js +2 -2
- package/dist/files/file-handle.js +1 -1
- package/dist/files/file-routes.d.ts +1 -1
- package/dist/files/file-routes.js +12 -2
- package/dist/files/index.d.ts +11 -13
- package/dist/files/index.js +5 -7
- package/dist/files/load-save-file-refs.d.ts +2 -1
- package/dist/files/load-save-file-refs.js +1 -1
- package/dist/files/provider-resolver.d.ts +5 -4
- package/dist/files/provider-resolver.js +4 -4
- package/dist/files/storage-tracking.js +4 -2
- package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
- package/dist/files/sweep-orphaned-uploads.js +1 -1
- package/dist/i18n/index.d.ts +2 -8
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/internals.d.ts +7 -0
- package/dist/i18n/internals.js +1 -0
- package/dist/i18n/required-surface-keys.d.ts +4 -1
- package/dist/internal/row-level-security.d.ts +3 -0
- package/dist/internal/row-level-security.js +3 -0
- package/dist/internal/stack-support.d.ts +1 -1
- package/dist/internal/stack-support.js +1 -1
- package/dist/internal/testing.d.ts +1 -0
- package/dist/internal/testing.js +9 -5
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/job-append-event.d.ts +12 -0
- package/dist/jobs/job-append-event.js +30 -0
- package/dist/jobs/job-runner-context.d.ts +2 -2
- package/dist/jobs/job-runner-context.js +46 -16
- package/dist/jobs/job-runner-execution.d.ts +1 -1
- package/dist/jobs/job-runner-execution.js +6 -4
- package/dist/jobs/job-runner-gates.d.ts +1 -1
- package/dist/jobs/job-runner-gates.js +0 -1
- package/dist/jobs/job-runner-helpers.d.ts +11 -4
- package/dist/jobs/job-runner-helpers.js +10 -1
- package/dist/jobs/job-runner-scope.d.ts +5 -2
- package/dist/jobs/job-runner-types.d.ts +2 -1
- package/dist/jobs/job-runner.js +19 -6
- package/dist/jobs/max-per-tenant.d.ts +1 -1
- package/dist/logging/index.d.ts +1 -2
- package/dist/logging/index.js +1 -1
- package/dist/logging/pino-logger.js +1 -1
- package/dist/logging/utils.d.ts +1 -0
- package/dist/logging/utils.js +6 -0
- package/dist/migrations/index.d.ts +3 -3
- package/dist/migrations/index.js +3 -3
- package/dist/migrations/pending-rebuilds.d.ts +1 -1
- package/dist/migrations/pending-rebuilds.js +1 -1
- package/dist/migrations/pii-event-backfill.js +4 -1
- package/dist/observability/escape-hatch-report.d.ts +2 -1
- package/dist/observability/index.d.ts +7 -15
- package/dist/observability/index.js +4 -12
- package/dist/observability/metric-validator.js +1 -1
- package/dist/observability/metrics-handle.d.ts +0 -1
- package/dist/observability/metrics-handle.js +2 -15
- package/dist/observability/recording-tracer.d.ts +1 -2
- package/dist/observability/recording-tracer.js +0 -6
- package/dist/observability/sensitive-filter.d.ts +0 -2
- package/dist/observability/sensitive-filter.js +0 -29
- package/dist/pipeline/active-membership.d.ts +2 -1
- package/dist/pipeline/active-membership.js +6 -2
- package/dist/pipeline/append-event-core.d.ts +2 -1
- package/dist/pipeline/append-event-core.js +2 -2
- package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
- package/dist/pipeline/attach-outside-transaction.js +13 -0
- package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
- package/dist/pipeline/cascade-handler.d.ts +2 -1
- package/dist/pipeline/cascade-handler.js +3 -2
- package/dist/pipeline/config-accessor-factory.d.ts +1 -1
- package/dist/pipeline/config-accessor-factory.js +1 -1
- package/dist/pipeline/context-services.d.ts +56 -0
- package/dist/pipeline/context-services.js +73 -0
- package/dist/pipeline/dispatch-batch.d.ts +2 -1
- package/dist/pipeline/dispatch-batch.js +31 -18
- package/dist/pipeline/dispatch-query.js +5 -4
- package/dist/pipeline/dispatch-scope.d.ts +6 -0
- package/dist/pipeline/dispatch-scope.js +27 -0
- package/dist/pipeline/dispatch-shared.d.ts +13 -9
- package/dist/pipeline/dispatch-shared.js +75 -198
- package/dist/pipeline/dispatch-stream.js +8 -4
- package/dist/pipeline/dispatch-write.d.ts +2 -1
- package/dist/pipeline/dispatch-write.js +10 -8
- package/dist/pipeline/dispatcher-utils.d.ts +3 -1
- package/dist/pipeline/dispatcher-utils.js +8 -2
- package/dist/pipeline/dispatcher.d.ts +3 -2
- package/dist/pipeline/dispatcher.js +4 -3
- package/dist/pipeline/event-consumer-state.d.ts +0 -1
- package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
- package/dist/pipeline/event-dispatcher-delivery.js +4 -2
- package/dist/pipeline/event-dispatcher.d.ts +2 -2
- package/dist/pipeline/event-dispatcher.js +7 -3
- package/dist/pipeline/event-retention.js +59 -56
- package/dist/pipeline/handler-access-error.js +2 -1
- package/dist/pipeline/handler-context-auth.d.ts +5 -6
- package/dist/pipeline/handler-context-auth.js +7 -4
- package/dist/pipeline/handler-context-config.d.ts +2 -5
- package/dist/pipeline/handler-context-config.js +2 -2
- package/dist/pipeline/handler-context-db.d.ts +32 -7
- package/dist/pipeline/handler-context-db.js +26 -17
- package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
- package/dist/pipeline/handler-context-dispatch.js +9 -8
- package/dist/pipeline/handler-context-events.d.ts +22 -36
- package/dist/pipeline/handler-context-events.js +36 -31
- package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
- package/dist/pipeline/handler-context-member-resolution.js +110 -0
- package/dist/pipeline/handler-context-notify.d.ts +3 -2
- package/dist/pipeline/handler-context-notify.js +1 -1
- package/dist/pipeline/handler-context-observability.d.ts +2 -4
- package/dist/pipeline/handler-context-observability.js +7 -5
- package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
- package/dist/pipeline/handler-context-phase-denials.js +98 -0
- package/dist/pipeline/handler-context-scope.d.ts +7 -10
- package/dist/pipeline/handler-context-scope.js +18 -20
- package/dist/pipeline/index.d.ts +9 -21
- package/dist/pipeline/index.js +5 -7
- package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
- package/dist/pipeline/irreversible-operation-gate.js +2 -2
- package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
- package/dist/pipeline/lifecycle-pipeline.js +9 -15
- package/dist/pipeline/member-read-only-transaction.js +11 -3
- package/dist/pipeline/member-reader.d.ts +1 -1
- package/dist/pipeline/member-reader.js +2 -2
- package/dist/pipeline/msp-rebuild.js +5 -3
- package/dist/pipeline/multi-stream-apply-context.js +3 -2
- package/dist/pipeline/notify-scope.d.ts +2 -1
- package/dist/pipeline/pre-handler-gates.d.ts +2 -1
- package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
- package/dist/pipeline/pre-transaction-reservations.js +9 -7
- package/dist/pipeline/projection-rebuild.js +12 -5
- package/dist/pipeline/projection-state.d.ts +0 -6
- package/dist/pipeline/projection-state.js +0 -5
- package/dist/pipeline/projections-runner.d.ts +2 -1
- package/dist/pipeline/projections-runner.js +10 -6
- package/dist/pipeline/system-hooks.d.ts +3 -1
- package/dist/pipeline/system-hooks.js +6 -4
- package/dist/pipeline/system-identity-switch.d.ts +4 -2
- package/dist/pipeline/system-identity-switch.js +51 -36
- package/dist/pipeline/typed-append-event.d.ts +2 -0
- package/dist/pipeline/typed-append-event.js +4 -0
- package/dist/pipeline/write-origin.js +2 -2
- package/dist/pipeline/write-result-masking.d.ts +1 -1
- package/dist/random/index.d.ts +1 -2
- package/dist/random/index.js +1 -2
- package/dist/rate-limit/bucket.d.ts +2 -1
- package/dist/rate-limit/middleware.js +2 -1
- package/dist/redis/index.d.ts +3 -4
- package/dist/redis/index.js +2 -2
- package/dist/schema-cli/apply-command.js +5 -2
- package/dist/schema-cli/baseline-command.js +7 -2
- package/dist/schema-cli/generate-command.js +7 -9
- package/dist/schema-cli/shared.d.ts +4 -0
- package/dist/schema-cli/shared.js +21 -2
- package/dist/schema-cli/status-command.js +8 -2
- package/dist/schema-cli/validate-command.js +52 -4
- package/dist/schema-cli.d.ts +0 -1
- package/dist/search/configure-tenant-index.d.ts +1 -3
- package/dist/search/configure-tenant-index.js +0 -4
- package/dist/search/index.d.ts +1 -4
- package/dist/search/index.js +0 -2
- package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
- package/dist/search/meilisearch-adapter-internals.js +9 -0
- package/dist/search/meilisearch-adapter.d.ts +1 -8
- package/dist/search/meilisearch-adapter.js +6 -7
- package/dist/search/meilisearch-peer.d.ts +2 -0
- package/dist/search/meilisearch-peer.js +5 -0
- package/dist/search/reindex-entity.js +93 -87
- package/dist/secrets/index.d.ts +3 -4
- package/dist/secrets/index.js +2 -3
- package/dist/seeding/index.d.ts +2 -2
- package/dist/seeding/index.js +1 -2
- package/dist/time/index.d.ts +2 -2
- package/dist/time/index.js +1 -1
- package/dist/time/tz-context.d.ts +0 -5
- package/dist/time/tz-context.js +0 -9
- package/dist/ui-types/index.d.ts +8 -11
- package/dist/ui-types/index.js +3 -3
- package/dist/upgrade-changelog.d.ts +3 -2
- package/dist/upgrade-changelog.js +12 -8
- package/dist/upgrade-cli-internals.d.ts +8 -0
- package/dist/upgrade-cli-internals.js +63 -0
- package/dist/upgrade-cli.d.ts +1 -9
- package/dist/upgrade-cli.js +10 -64
- package/dist/utils/import-optional-peer.d.ts +6 -0
- package/dist/utils/import-optional-peer.js +19 -0
- package/dist/utils/index.d.ts +1 -4
- package/dist/utils/index.js +1 -4
- package/package.json +22 -18
- package/src/changes.json +206 -0
- package/dist/crypto/request-kms-cache.d.ts +0 -8
- package/dist/crypto/request-kms-cache.js +0 -21
- package/dist/engine/codemod/index.d.ts +0 -2
- package/dist/engine/codemod/index.js +0 -1
- package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
- package/dist/engine/codemod/pipeline-codemod.js +0 -536
- package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
- package/dist/engine/feature-ast/entity-field-types.js +0 -35
- package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
- package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
- package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
- package/dist/engine/feature-ast/extractors/events.js +0 -275
- package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/handlers.js +0 -358
- package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/hooks.js +0 -248
- package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
- package/dist/engine/feature-ast/extractors/index.js +0 -13
- package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
- package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
- package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
- package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
- package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
- package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
- package/dist/engine/feature-ast/extractors/round1.js +0 -87
- package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/round2.js +0 -191
- package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
- package/dist/engine/feature-ast/extractors/round3.js +0 -292
- package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
- package/dist/engine/feature-ast/extractors/round5.js +0 -68
- package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
- package/dist/engine/feature-ast/extractors/round6.js +0 -17
- package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
- package/dist/engine/feature-ast/extractors/shared.js +0 -343
- package/dist/engine/feature-ast/index.d.ts +0 -16
- package/dist/engine/feature-ast/index.js +0 -10
- package/dist/engine/feature-ast/parse.d.ts +0 -31
- package/dist/engine/feature-ast/parse.js +0 -485
- package/dist/engine/feature-ast/patch.d.ts +0 -212
- package/dist/engine/feature-ast/patch.js +0 -611
- package/dist/engine/feature-ast/patcher.d.ts +0 -217
- package/dist/engine/feature-ast/patcher.js +0 -281
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
- package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
- package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
- package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
- package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
- package/dist/engine/feature-ast/patterns.d.ts +0 -322
- package/dist/engine/feature-ast/patterns.js +0 -107
- package/dist/engine/feature-ast/render.d.ts +0 -47
- package/dist/engine/feature-ast/render.js +0 -666
- package/dist/engine/feature-ast/source-location.d.ts +0 -17
- package/dist/engine/feature-ast/source-location.js +0 -27
- package/dist/engine/pattern-library/index.d.ts +0 -2
- package/dist/engine/pattern-library/index.js +0 -3
- package/dist/engine/pattern-library/library.d.ts +0 -14
- package/dist/engine/pattern-library/library.js +0 -94
- package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
- package/dist/engine/pattern-library/mixed-schemas.js +0 -559
- package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
- package/dist/engine/pattern-library/opaque-schemas.js +0 -115
- package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
- package/dist/engine/pattern-library/shared-fields.js +0 -88
- package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
- package/dist/engine/pattern-library/static-schemas.js +0 -487
- package/dist/engine/pattern-library/types.d.ts +0 -158
- package/dist/engine/pattern-library/types.js +0 -36
- package/dist/engine/resolve-config-or-param.d.ts +0 -18
- package/dist/engine/resolve-config-or-param.js +0 -76
- package/src/scripts/codemod/README.md +0 -187
- package/src/scripts/codemod/codemod-support.ts +0 -334
- package/src/scripts/codemod/collect-source-files.ts +0 -48
- package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
- package/src/scripts/codemod/db-factory.ts +0 -810
- package/src/scripts/codemod/feature-factory.ts +0 -429
- package/src/scripts/codemod/feature-layout.ts +0 -424
- package/src/scripts/codemod/import-extensions.ts +0 -118
- package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
- package/src/scripts/codemod/migrate-db-raw.ts +0 -401
- package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
- package/src/scripts/codemod/object-form.ts +0 -746
- package/src/scripts/codemod/package-merge.ts +0 -299
- package/src/scripts/codemod/pii-personal-migration.ts +0 -816
- package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
- package/src/scripts/codemod/s3-imports.ts +0 -236
- package/src/scripts/codemod/tenant-db-options.ts +0 -454
- package/src/scripts/codemod/testing-injection.ts +0 -215
- package/src/scripts/codemod/testing-move-targets.ts +0 -161
- package/src/scripts/codemod/testing-move.ts +0 -542
- package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/// <reference types="temporal-polyfill/global" preserve="true" />
|
|
2
|
-
import type { ConfigAccessor } from "@cosmicdrift/kumiko-types/config";
|
|
2
|
+
import type { ConfigAccessor, JobDefinition } from "@cosmicdrift/kumiko-types/config";
|
|
3
|
+
import type { JobDeferral, JobTriggerEvent } from "@cosmicdrift/kumiko-types/handlers";
|
|
4
|
+
import type { Meter, SerializedTraceContext, Tracer } from "@cosmicdrift/kumiko-types/observability";
|
|
3
5
|
import type { TzContext } from "@cosmicdrift/kumiko-types/tz-context";
|
|
4
6
|
import type { JobsOptions, Queue } from "bullmq";
|
|
5
7
|
import type { TenantDb } from "../db/tenant-db.ts";
|
|
6
|
-
import type { AppContext,
|
|
8
|
+
import type { AppContext, JobRunIn } from "../engine/types/index.ts";
|
|
7
9
|
import type { Logger } from "../logging/types.ts";
|
|
8
|
-
import type { Meter, SerializedTraceContext, Tracer } from "../observability/index.ts";
|
|
9
10
|
import type { JobInvocation, JobLogEntry, JobSubjectValue } from "./job-runner-types.ts";
|
|
10
11
|
export declare function isJobTriggerEvent(value: unknown): value is JobTriggerEvent;
|
|
11
12
|
export declare function stampGatedWriteOrigin(data: Record<string, unknown>): void;
|
|
@@ -27,11 +28,15 @@ export declare const DEFER_BACKOFF_MAX_DOUBLINGS = 5;
|
|
|
27
28
|
export declare function readTraceContext(data: Record<string, unknown>): SerializedTraceContext | undefined;
|
|
28
29
|
export declare function captureTraceContext(tracer: Tracer): SerializedTraceContext | undefined;
|
|
29
30
|
export declare function startQueueDepthPolling(queue: Queue, lane: JobRunIn, meter: Meter): Promise<ReturnType<typeof setInterval>>;
|
|
30
|
-
|
|
31
|
+
type RedisConnectionOptions = {
|
|
31
32
|
host: string;
|
|
32
33
|
port: number;
|
|
33
34
|
db?: number | undefined;
|
|
35
|
+
username?: string | undefined;
|
|
36
|
+
password?: string | undefined;
|
|
37
|
+
tls?: Record<string, never> | undefined;
|
|
34
38
|
};
|
|
39
|
+
export declare function parseRedisOpts(url: string): RedisConnectionOptions;
|
|
35
40
|
export declare const BOOT_REDIS_TIMEOUT_MS = 10000;
|
|
36
41
|
export declare const STOP_QUEUE_READY_TIMEOUT_MS = 1000;
|
|
37
42
|
export declare const BOOT_GATE_SLOW_WARN_MS = 60000;
|
|
@@ -46,6 +51,7 @@ export declare const FAILED_JOB_RETENTION_AGE_SEC = 604800;
|
|
|
46
51
|
export declare function maxRetryWindowMs(jobDef: JobDefinition): number;
|
|
47
52
|
export declare function isJobDeferral(value: unknown): value is JobDeferral;
|
|
48
53
|
export declare function priorDeferCountOf(data: Record<string, unknown>, key: string): number;
|
|
54
|
+
export declare function hasDeferBudgetLeft(data: Record<string, unknown>, maxDefers: number | undefined): boolean;
|
|
49
55
|
export declare function handlerPayloadOf(data: Record<string, unknown>): Record<string, unknown>;
|
|
50
56
|
export declare function tenantIdOfJobData(data: Record<string, unknown>): string;
|
|
51
57
|
export declare function deferDelayMs(deferMs: number, deferCount: number): number;
|
|
@@ -56,3 +62,4 @@ export declare function isActiveBefore(other: {
|
|
|
56
62
|
readonly id: string | undefined;
|
|
57
63
|
readonly processedOn: number | undefined;
|
|
58
64
|
}): boolean;
|
|
65
|
+
export {};
|
|
@@ -5,7 +5,7 @@ import { SYSTEM_TENANT_ID } from "../engine/types/index.js";
|
|
|
5
5
|
import { InternalError } from "../errors/index.js";
|
|
6
6
|
import { isKumikoError } from "../errors/kumiko-error.js";
|
|
7
7
|
import { createFallbackLogger, scrubLogText } from "../logging/index.js";
|
|
8
|
-
import { emitJobQueueDepth } from "../observability/
|
|
8
|
+
import { emitJobQueueDepth } from "../observability/standard-metrics.js";
|
|
9
9
|
import { TENANT_TIMEZONE_CONFIG_KEY } from "../pipeline/tenant-timezone-config-key.js";
|
|
10
10
|
import { isPersonalDataGated } from "../pipeline/write-origin.js";
|
|
11
11
|
import { createTzContext, isValidIanaTimeZone } from "../time/index.js";
|
|
@@ -210,6 +210,12 @@ export function parseRedisOpts(url) {
|
|
|
210
210
|
if (parsed.pathname.length > 1) {
|
|
211
211
|
result.db = Number(parsed.pathname.slice(1));
|
|
212
212
|
}
|
|
213
|
+
if (parsed.username)
|
|
214
|
+
result.username = decodeURIComponent(parsed.username);
|
|
215
|
+
if (parsed.password)
|
|
216
|
+
result.password = decodeURIComponent(parsed.password);
|
|
217
|
+
if (parsed.protocol === "rediss:")
|
|
218
|
+
result.tls = {};
|
|
213
219
|
return result;
|
|
214
220
|
}
|
|
215
221
|
// redisOpts carries no connectTimeout/retry cap, so an unreachable Redis
|
|
@@ -299,6 +305,9 @@ export function priorDeferCountOf(data, key) {
|
|
|
299
305
|
const prior = data[key];
|
|
300
306
|
return typeof prior === "number" ? prior : 0;
|
|
301
307
|
}
|
|
308
|
+
export function hasDeferBudgetLeft(data, maxDefers) {
|
|
309
|
+
return priorDeferCountOf(data, HANDLER_DEFER_COUNT_KEY) < (maxDefers ?? DEFAULT_MAX_DEFERS);
|
|
310
|
+
}
|
|
302
311
|
export function handlerPayloadOf(data) {
|
|
303
312
|
const payload = {};
|
|
304
313
|
for (const [k, v] of Object.entries(data)) {
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import type { JobDefinition } from "@cosmicdrift/kumiko-types/config";
|
|
2
|
+
import type { DispatchWriteRef } from "@cosmicdrift/kumiko-types/handlers";
|
|
3
|
+
import type { Tracer } from "@cosmicdrift/kumiko-types/observability";
|
|
1
4
|
import type { Queue } from "bullmq";
|
|
2
|
-
import type { AppContext,
|
|
5
|
+
import type { AppContext, JobRunIn, Registry, TenantId } from "../engine/types/index.ts";
|
|
3
6
|
import type { createFallbackLogger } from "../logging/index.ts";
|
|
4
|
-
import type { EscapeHatchProcessDedup, EscapeHatchReportWindow
|
|
7
|
+
import type { EscapeHatchProcessDedup, EscapeHatchReportWindow } from "../observability/escape-hatch-report.ts";
|
|
5
8
|
import type { DistributedLock } from "../pipeline/distributed-lock.ts";
|
|
6
9
|
import type { JobRunner, JobRunnerOptions } from "./job-runner-types.ts";
|
|
7
10
|
export type JobRunnerScope = {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="temporal-polyfill/global" preserve="true" />
|
|
2
|
-
import type {
|
|
2
|
+
import type { DispatchWriteRef, JobTriggerEvent } from "@cosmicdrift/kumiko-types/handlers";
|
|
3
|
+
import type { AppContext, JobRunIn, Registry, SessionUser, TenantId } from "../engine/types/index.ts";
|
|
3
4
|
export type JobLogEntry = {
|
|
4
5
|
level: "info" | "warn" | "error";
|
|
5
6
|
message: string;
|
package/dist/jobs/job-runner.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { DelayedError, Queue, Worker } from "bullmq";
|
|
2
2
|
import { Redis } from "ioredis";
|
|
3
3
|
import { requestContext } from "../api/request-context.js";
|
|
4
|
+
import { assertNoActiveRowLevelSecurityScope, runInSystemRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
|
|
4
5
|
import { createTenantDb, createUncheckedSystemDb } from "../db/tenant-db.js";
|
|
5
6
|
import { bridgeStub } from "../engine/bridge-stub.js";
|
|
6
7
|
import { createSystemUser } from "../engine/system-user.js";
|
|
7
8
|
import { SYSTEM_TENANT_ID } from "../engine/types/index.js";
|
|
8
9
|
import { InternalError } from "../errors/index.js";
|
|
9
10
|
import { createFallbackLogger } from "../logging/index.js";
|
|
10
|
-
import { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, flushEscapeHatchAudits,
|
|
11
|
+
import { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, flushEscapeHatchAudits, } from "../observability/escape-hatch-report.js";
|
|
12
|
+
import { getFallbackTracer } from "../observability/fallback.js";
|
|
13
|
+
import { registerStandardMetrics } from "../observability/standard-metrics.js";
|
|
14
|
+
import { attachOutsideTransaction } from "../pipeline/attach-outside-transaction.js";
|
|
11
15
|
import { createDistributedLock } from "../pipeline/distributed-lock.js";
|
|
12
16
|
import { RedisKeys } from "../pipeline/redis-keys.js";
|
|
13
17
|
import { cronRepeatOptions } from "./cron-repeat-options.js";
|
|
@@ -61,7 +65,12 @@ export function createJobRunner(options) {
|
|
|
61
65
|
return undefined;
|
|
62
66
|
return async () => {
|
|
63
67
|
const systemUser = createSystemUser(SYSTEM_TENANT_ID);
|
|
64
|
-
const systemModeDb = createTenantDb({
|
|
68
|
+
const systemModeDb = createTenantDb({
|
|
69
|
+
db,
|
|
70
|
+
tenantId: SYSTEM_TENANT_ID,
|
|
71
|
+
mode: "system",
|
|
72
|
+
reason: "system jobs run without tenant scope and read across tenants by design",
|
|
73
|
+
});
|
|
65
74
|
const reportEscapeHatch = createEscapeHatchReporter({
|
|
66
75
|
handler: ACTIVE_TENANT_IDS_QUERY_NAME,
|
|
67
76
|
tenantId: SYSTEM_TENANT_ID,
|
|
@@ -71,8 +80,7 @@ export function createJobRunner(options) {
|
|
|
71
80
|
window: escapeHatchReportWindow,
|
|
72
81
|
});
|
|
73
82
|
const result = await handler.handler({ type: ACTIVE_TENANT_IDS_QUERY_NAME, payload: {}, user: systemUser }, {
|
|
74
|
-
db: systemModeDb,
|
|
75
|
-
dbOutsideTransaction: systemModeDb,
|
|
83
|
+
db: attachOutsideTransaction(systemModeDb, systemModeDb),
|
|
76
84
|
systemDb: createUncheckedSystemDb(systemModeDb, undefined, reportEscapeHatch),
|
|
77
85
|
registry,
|
|
78
86
|
...bridgeStub(),
|
|
@@ -198,7 +206,11 @@ export function createJobRunner(options) {
|
|
|
198
206
|
getSelfRunner: () => selfRunner,
|
|
199
207
|
getDispatchWriteRef: () => dispatchWriteRef,
|
|
200
208
|
};
|
|
201
|
-
|
|
209
|
+
// Per invocation, never around the worker loop: the loop itself must stay outside any scope.
|
|
210
|
+
function handleJob(bullJob, token) {
|
|
211
|
+
return runInSystemRowLevelSecurityScope("job runner executes jobs of every tenant", () => handleJobInScope(bullJob, token));
|
|
212
|
+
}
|
|
213
|
+
async function handleJobInScope(bullJob, token) {
|
|
202
214
|
const perTenantTarget = perTenantTargetOf(bullJob.name);
|
|
203
215
|
if (perTenantTarget !== undefined) {
|
|
204
216
|
await fanOutPerTenantJob(scope, bullJob, perTenantTarget);
|
|
@@ -346,6 +358,7 @@ export function createJobRunner(options) {
|
|
|
346
358
|
}
|
|
347
359
|
const runnerApi = {
|
|
348
360
|
async start() {
|
|
361
|
+
assertNoActiveRowLevelSecurityScope("JobRunner worker");
|
|
349
362
|
// skip: enqueuer-only runner — no BullMQ worker, no cron schedules,
|
|
350
363
|
// no boot jobs. The API-process (runLocalJobs=false) lands here; it
|
|
351
364
|
// still holds the queue-clients so dispatch()/handleEvent() can
|
|
@@ -575,7 +588,7 @@ export function createJobRunner(options) {
|
|
|
575
588
|
data[TRACE_CONTEXT_KEY] = traceCtx;
|
|
576
589
|
// Propagate correlation from the scheduling request into the job
|
|
577
590
|
// execution context. The worker re-enters requestContext.run with
|
|
578
|
-
// this value so ctx.
|
|
591
|
+
// this value so ctx.events.append / executor writes during the job
|
|
579
592
|
// stamp the same correlation as the HTTP request that scheduled it.
|
|
580
593
|
const reqCtx = requestContext.get();
|
|
581
594
|
if (reqCtx?.correlationId)
|
package/dist/logging/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export type { LoggerOptions } from "./pino-logger.ts";
|
|
2
1
|
export { createLogger } from "./pino-logger.ts";
|
|
3
|
-
export { scrubLogText
|
|
2
|
+
export { scrubLogText } from "./scrub.ts";
|
|
4
3
|
export type { Logger } from "./types.ts";
|
|
5
4
|
export { createFallbackLogger, setProcessLogger } from "./utils.ts";
|
package/dist/logging/index.js
CHANGED
package/dist/logging/utils.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ type FallbackLogger = {
|
|
|
7
7
|
};
|
|
8
8
|
export declare function setProcessLogger(logger: Logger | null): void;
|
|
9
9
|
export declare function createFallbackLogger(namespace: string, logger?: (Pick<Logger, "error"> & Partial<Pick<Logger, "info" | "warn" | "debug" | "child">>) | undefined): FallbackLogger;
|
|
10
|
+
export declare function createFallbackFullLogger(namespace: string): Logger;
|
|
10
11
|
export {};
|
package/dist/logging/utils.js
CHANGED
|
@@ -101,3 +101,9 @@ export function createFallbackLogger(namespace, logger) {
|
|
|
101
101
|
},
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
|
+
// A full Logger for contexts whose typed surface promises one (ctx.obs.log) but that have no
|
|
105
|
+
// app logger wired; child() returns the same instance because there is no sink to scope.
|
|
106
|
+
export function createFallbackFullLogger(namespace) {
|
|
107
|
+
const logger = { ...createFallbackLogger(namespace), child: () => logger };
|
|
108
|
+
return logger;
|
|
109
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { assertKumikoSchemaCurrent,
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { assertKumikoSchemaCurrent, SchemaDriftError, } from "./kumiko-drift.ts";
|
|
2
|
+
export { enqueueProjectionRebuild, listPendingRebuilds, PROJECTION_REBUILD_JOB, queueRebuildsFromMarkers, rebuildProjectionOrMultiStream, reportPendingRebuildRun, runPendingRebuilds, } from "./pending-rebuilds.ts";
|
|
3
|
+
export { runPiiEventBackfill } from "./pii-event-backfill.ts";
|
|
4
4
|
export { buildProjectionTableIndex } from "./projection-table-index.ts";
|
package/dist/migrations/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Drizzle-free gate (kumiko/migrations system) — the canonical boot-gate.
|
|
2
|
-
export { assertKumikoSchemaCurrent,
|
|
2
|
+
export { assertKumikoSchemaCurrent, SchemaDriftError, } from "./kumiko-drift.js";
|
|
3
3
|
// Persistente Pending-Rebuild-Queue (survives Rebuild-Failures + Crashes).
|
|
4
|
-
export {
|
|
4
|
+
export { enqueueProjectionRebuild, listPendingRebuilds, PROJECTION_REBUILD_JOB, queueRebuildsFromMarkers, rebuildProjectionOrMultiStream, reportPendingRebuildRun, runPendingRebuilds, } from "./pending-rebuilds.js";
|
|
5
5
|
// Boot-time backfill: re-encrypts plaintext events after a PII annotation was added.
|
|
6
|
-
export {
|
|
6
|
+
export { runPiiEventBackfill } from "./pii-event-backfill.js";
|
|
7
7
|
// tableName → projection-name, for application-side projection rebuilds.
|
|
8
8
|
export { buildProjectionTableIndex } from "./projection-table-index.js";
|
|
@@ -2,7 +2,7 @@ import type { DbConnection } from "../db/connection.ts";
|
|
|
2
2
|
import type { Registry } from "../engine/types/index.ts";
|
|
3
3
|
import type { JobRunner } from "../jobs/index.ts";
|
|
4
4
|
import type { Logger } from "../logging/types.ts";
|
|
5
|
-
import {
|
|
5
|
+
import type { RebuildResult } from "../pipeline/projection-rebuild.ts";
|
|
6
6
|
export declare const pendingRebuildsTable: import("@cosmicdrift/kumiko-types/executor-brand").WritableSchemaTable;
|
|
7
7
|
export declare function createPendingRebuildsTable(db: DbConnection): Promise<void>;
|
|
8
8
|
/** Reads rebuild markers from freshly applied migrations and queues the
|
|
@@ -16,7 +16,7 @@ import { readRebuildMarker } from "../db/rebuild-marker.js";
|
|
|
16
16
|
import { tableExists } from "../db/schema-inspection.js";
|
|
17
17
|
import { unsafePushTables } from "../db/table-push.js";
|
|
18
18
|
import { createFallbackLogger } from "../logging/utils.js";
|
|
19
|
-
import { rebuildMultiStreamProjection, rebuildProjection
|
|
19
|
+
import { rebuildMultiStreamProjection, rebuildProjection } from "../pipeline/index.js";
|
|
20
20
|
import { buildProjectionTableIndex } from "./projection-table-index.js";
|
|
21
21
|
export const pendingRebuildsTable = pgTable("kumiko_pending_rebuilds", {
|
|
22
22
|
tableName: text("table_name").primaryKey(),
|
|
@@ -17,6 +17,7 @@ import { backfillEventPiiEncryptionBatch, } from "../db/queries/backfill-pii.js"
|
|
|
17
17
|
import { alterTableAddColumn } from "../db/queries/ddl.js";
|
|
18
18
|
import { persistPiiBackfillState, readPiiBackfillState, } from "../db/queries/pii-backfill-state.js";
|
|
19
19
|
import { upsertOnConflict } from "../db/query.js";
|
|
20
|
+
import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
|
|
20
21
|
import { tableExists } from "../db/schema-inspection.js";
|
|
21
22
|
import { withoutStatementTimeout } from "../db/statement-timeout.js";
|
|
22
23
|
import { unsafePushTables } from "../db/table-push.js";
|
|
@@ -209,7 +210,9 @@ function reportRunOutcome(log, progress) {
|
|
|
209
210
|
}
|
|
210
211
|
}
|
|
211
212
|
export function runPiiEventBackfill(db, registry, options = {}) {
|
|
212
|
-
return
|
|
213
|
+
return runInSystemRowLevelSecurityScope("PII event backfill rewrites events across all tenants", () => {
|
|
214
|
+
return withoutStatementTimeout(db, (unboundedDb) => backfillPiiEvents(unboundedDb, registry, options));
|
|
215
|
+
});
|
|
213
216
|
}
|
|
214
217
|
async function backfillPiiEvents(db, registry, options) {
|
|
215
218
|
const log = createFallbackLogger("pii-event-backfill", options.logger);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { EscapeHatchAuditSink, EscapeHatchKind, EscapeHatchReporter, EscapeHatchUseEvent
|
|
1
|
+
import type { EscapeHatchAuditSink, EscapeHatchKind, EscapeHatchReporter, EscapeHatchUseEvent } from "@cosmicdrift/kumiko-types/handlers";
|
|
2
|
+
import type { TenantId } from "../engine/types/index.ts";
|
|
2
3
|
import type { Logger } from "../logging/types.ts";
|
|
3
4
|
import type { Meter } from "./types/index.ts";
|
|
4
5
|
export declare const ESCAPE_HATCH_USED_SIGNAL = "security:escape-hatch-used";
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, ESCAPE_HATCH_USED_SIGNAL, type EscapeHatchProcessDedup, type EscapeHatchReportWindow, fallbackEscapeHatchReporter, flushEscapeHatchAudits, reportEscapeHatchUse, UNATTRIBUTED_ACTOR, withEscapeHatchAuditScope, } from "./escape-hatch-report.ts";
|
|
4
|
-
export { getFallbackMeter, getFallbackProvider, getFallbackTracer } from "./fallback.ts";
|
|
5
|
-
export { generateSpanId, generateTraceId } from "./ids.ts";
|
|
6
|
-
export { buildMetricName, validateLabelKey, validateMetricName, } from "./metric-validator.ts";
|
|
7
|
-
export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, createUnboundMetricsHandle, } from "./metrics-handle.ts";
|
|
8
|
-
export { type ObservabilityWiring, prometheusMetricsEnvSchema, resolveObservabilityWiring, } from "./metrics-wiring.ts";
|
|
1
|
+
export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, } from "./metrics-handle.ts";
|
|
2
|
+
export { prometheusMetricsEnvSchema, resolveObservabilityWiring, } from "./metrics-wiring.ts";
|
|
9
3
|
export { createNoopProvider } from "./noop-provider.ts";
|
|
10
|
-
export { createPrometheusMeter
|
|
11
|
-
export { type MetricEvent,
|
|
12
|
-
export { type RecordedSpan, RecordingTracer,
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export { emitDbQuery, emitDispatcherError, emitDispatcherHandler, emitEscapeHatchUse, emitEventConsumerLag, emitEventConsumerPassOutcome, emitEventConsumerPassSkipped, emitEventConsumerPendingGaps, emitEventConsumerRearmExhausted, emitEventDispatcherListenConnected, emitHttpRequest, emitJobLastSuccess, emitJobQueueDepth, registerStandardMetrics, STANDARD_METRIC_DEFS, } from "./standard-metrics.ts";
|
|
16
|
-
export type { Counter, Gauge, Histogram, Meter, MetricDefinition, MetricLabels, MetricsHandle, MetricType, ObservabilityOptions, ObservabilityProvider, SamplingConfig, SensitiveFilterConfig, SerializedTraceContext, Span, SpanAttributes, SpanAttributeValue, SpanKind, SpanStatus, StartSpanOptions, Tracer, } from "./types/index.ts";
|
|
4
|
+
export { createPrometheusMeter } from "./prometheus-meter.ts";
|
|
5
|
+
export { type MetricEvent, RecordingMeter, } from "./recording-meter.ts";
|
|
6
|
+
export { type RecordedSpan, RecordingTracer, } from "./recording-tracer.ts";
|
|
7
|
+
export { DEFAULT_SENSITIVE_CONFIG, mergeSensitiveConfig, } from "./sensitive-filter.ts";
|
|
8
|
+
export type { MetricsHandle, ObservabilityOptions, ObservabilityProvider, } from "./types/index.ts";
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
// Public surface of the observability module.
|
|
2
|
-
export {
|
|
3
|
-
export { observabilityContext } from "./context.js";
|
|
4
|
-
export { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, ESCAPE_HATCH_USED_SIGNAL, fallbackEscapeHatchReporter, flushEscapeHatchAudits, reportEscapeHatchUse, UNATTRIBUTED_ACTOR, withEscapeHatchAuditScope, } from "./escape-hatch-report.js";
|
|
5
|
-
export { getFallbackMeter, getFallbackProvider, getFallbackTracer } from "./fallback.js";
|
|
6
|
-
export { generateSpanId, generateTraceId } from "./ids.js";
|
|
7
|
-
export { buildMetricName, validateLabelKey, validateMetricName, } from "./metric-validator.js";
|
|
8
|
-
export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, createUnboundMetricsHandle, } from "./metrics-handle.js";
|
|
2
|
+
export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, } from "./metrics-handle.js";
|
|
9
3
|
export { prometheusMetricsEnvSchema, resolveObservabilityWiring, } from "./metrics-wiring.js";
|
|
10
4
|
export { createNoopProvider } from "./noop-provider.js";
|
|
11
|
-
export { createPrometheusMeter
|
|
5
|
+
export { createPrometheusMeter } from "./prometheus-meter.js";
|
|
12
6
|
export { RecordingMeter, } from "./recording-meter.js";
|
|
13
|
-
export { RecordingTracer,
|
|
14
|
-
export {
|
|
15
|
-
export { DEFAULT_SENSITIVE_CONFIG, mergeSensitiveConfig, REDACTED, redactAttributes, redactHeaders, redactQueryString, redactValue, shouldRedactAttribute, } from "./sensitive-filter.js";
|
|
16
|
-
export { emitDbQuery, emitDispatcherError, emitDispatcherHandler, emitEscapeHatchUse, emitEventConsumerLag, emitEventConsumerPassOutcome, emitEventConsumerPassSkipped, emitEventConsumerPendingGaps, emitEventConsumerRearmExhausted, emitEventDispatcherListenConnected, emitHttpRequest, emitJobLastSuccess, emitJobQueueDepth, registerStandardMetrics, STANDARD_METRIC_DEFS, } from "./standard-metrics.js";
|
|
7
|
+
export { RecordingTracer, } from "./recording-tracer.js";
|
|
8
|
+
export { DEFAULT_SENSITIVE_CONFIG, mergeSensitiveConfig, } from "./sensitive-filter.js";
|
|
@@ -51,7 +51,7 @@ export function validateMetricName(name, type) {
|
|
|
51
51
|
// r.metric() is called with `feature.name` as registered at defineFeature
|
|
52
52
|
// time) — normalize "-" to "_" here so a feature like "ai-foundation"
|
|
53
53
|
// resolves to the same "kumiko_ai_foundation_x" on both the registration
|
|
54
|
-
// path (registry-ingest.ts) and the read path (ctx.metrics / ctx.metricsFor),
|
|
54
|
+
// path (registry-ingest.ts) and the read path (ctx.obs.metrics / ctx.obs.metricsFor),
|
|
55
55
|
// instead of the kebab form being rejected outright.
|
|
56
56
|
export function buildMetricName(featureName, shortName) {
|
|
57
57
|
const normalizedFeatureName = toKebab(featureName).replace(/-/g, "_");
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { Meter, MetricsHandle } from "./types/index.ts";
|
|
2
2
|
export declare function createMetricsHandle(meter: Meter, featureName: string): MetricsHandle;
|
|
3
3
|
export declare function createSafeMetricsHandle(meter: Meter, featureName: string): MetricsHandle;
|
|
4
|
-
export declare function createUnboundMetricsHandle(meter: Meter): MetricsHandle;
|
|
5
4
|
export declare function createNoopMetricsHandle(): MetricsHandle;
|
|
6
5
|
export declare function createMetricsForFactory(meter: Meter | undefined): (featureName: string) => MetricsHandle;
|
|
@@ -26,7 +26,7 @@ export function createMetricsHandle(meter, featureName) {
|
|
|
26
26
|
// Same feature-bound resolution as createMetricsHandle, but for an
|
|
27
27
|
// explicit `featureName` chosen by the caller rather than the dispatching
|
|
28
28
|
// handler's own feature. Meant for shared/library code
|
|
29
|
-
// invoked from many features' HandlerContext (ctx.metricsFor) — the
|
|
29
|
+
// invoked from many features' HandlerContext (ctx.obs.metricsFor) — the
|
|
30
30
|
// library owns one stable metric name instead of splintering into
|
|
31
31
|
// kumiko_<caller>_x per consumer.
|
|
32
32
|
//
|
|
@@ -77,19 +77,6 @@ export function createSafeMetricsHandle(meter, featureName) {
|
|
|
77
77
|
// Fallback for contexts where the feature is unknown (e.g. system-hooks,
|
|
78
78
|
// internal pipeline code). Short names are used verbatim — useful for
|
|
79
79
|
// framework-level usage, but rejected by the Meter unless pre-registered.
|
|
80
|
-
export function createUnboundMetricsHandle(meter) {
|
|
81
|
-
return {
|
|
82
|
-
inc(name, labels, value) {
|
|
83
|
-
meter.counter(name).inc(value, labels);
|
|
84
|
-
},
|
|
85
|
-
observe(name, value, labels) {
|
|
86
|
-
meter.histogram(name).observe(value, labels);
|
|
87
|
-
},
|
|
88
|
-
set(name, value, labels) {
|
|
89
|
-
meter.gauge(name).set(value, labels);
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
80
|
// Noop fallback used when no provider is configured and for safety in
|
|
94
81
|
// contexts where we can't determine the feature. Every call is a no-op —
|
|
95
82
|
// tests and non-observability-aware features never crash.
|
|
@@ -100,7 +87,7 @@ export function createNoopMetricsHandle() {
|
|
|
100
87
|
set(_name, _value, _labels) { },
|
|
101
88
|
};
|
|
102
89
|
}
|
|
103
|
-
// Shared factory behind ctx.metricsFor for handler and job contexts, so both
|
|
90
|
+
// Shared factory behind ctx.obs.metricsFor for handler and job contexts, so both
|
|
104
91
|
// keep the same no-op-on-unregistered contract.
|
|
105
92
|
export function createMetricsForFactory(meter) {
|
|
106
93
|
return meter
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SensitiveFilterConfig,
|
|
1
|
+
import type { SensitiveFilterConfig, Span, SpanAttributeValue, SpanKind, SpanStatus, StartSpanOptions, Tracer } from "./types/index.ts";
|
|
2
2
|
export type RecordedSpan = {
|
|
3
3
|
readonly traceId: string;
|
|
4
4
|
readonly spanId: string;
|
|
@@ -28,5 +28,4 @@ export declare class RecordingTracer implements Tracer {
|
|
|
28
28
|
withSpan<T>(name: string, optionsOrFn: StartSpanOptions | ((span: Span) => Promise<T>), fn?: (span: Span) => Promise<T>): Promise<T>;
|
|
29
29
|
getActiveSpan(): Span | undefined;
|
|
30
30
|
}
|
|
31
|
-
export declare function serializeSpanContext(span: Span): SerializedTraceContext;
|
|
32
31
|
export {};
|
|
@@ -2,8 +2,6 @@ import type { SensitiveFilterConfig, SpanAttributeValue } from "./types/index.ts
|
|
|
2
2
|
export declare const REDACTED = "[REDACTED]";
|
|
3
3
|
export declare const DEFAULT_SENSITIVE_CONFIG: SensitiveFilterConfig;
|
|
4
4
|
export declare function mergeSensitiveConfig(override: Partial<SensitiveFilterConfig> | undefined): SensitiveFilterConfig;
|
|
5
|
-
export declare function redactHeaders(headers: Readonly<Record<string, string>>, config: SensitiveFilterConfig): Record<string, string>;
|
|
6
|
-
export declare function redactQueryString(input: string, config: SensitiveFilterConfig): string;
|
|
7
5
|
export declare function shouldRedactAttribute(key: string, config: SensitiveFilterConfig): boolean;
|
|
8
6
|
export declare function redactValue(value: SpanAttributeValue): SpanAttributeValue;
|
|
9
7
|
export declare function redactAttributes(attrs: Readonly<Record<string, SpanAttributeValue>>, config: SensitiveFilterConfig): Record<string, SpanAttributeValue>;
|
|
@@ -32,35 +32,6 @@ export function mergeSensitiveConfig(override) {
|
|
|
32
32
|
DEFAULT_SENSITIVE_CONFIG.redactedAttributeKeyPatterns,
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
function lowercaseSet(names) {
|
|
36
|
-
return new Set(names.map((n) => n.toLowerCase()));
|
|
37
|
-
}
|
|
38
|
-
export function redactHeaders(headers, config) {
|
|
39
|
-
const redacted = lowercaseSet(config.redactedHeaders);
|
|
40
|
-
const out = {};
|
|
41
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
42
|
-
out[key] = redacted.has(key.toLowerCase()) ? REDACTED : value;
|
|
43
|
-
}
|
|
44
|
-
return out;
|
|
45
|
-
}
|
|
46
|
-
// Redact sensitive query params in a URL or query string. Returns a new URL
|
|
47
|
-
// string with the same shape — path, fragment, and ordering preserved.
|
|
48
|
-
export function redactQueryString(input, config) {
|
|
49
|
-
const redacted = lowercaseSet(config.redactedQueryParams);
|
|
50
|
-
// URL wants absolute; handle both absolute and path-only forms.
|
|
51
|
-
const hasScheme = /^[a-z][a-z0-9+\-.]*:/i.test(input);
|
|
52
|
-
const base = hasScheme ? undefined : "http://_internal";
|
|
53
|
-
const url = base ? new URL(input, base) : new URL(input);
|
|
54
|
-
for (const key of Array.from(url.searchParams.keys())) {
|
|
55
|
-
if (redacted.has(key.toLowerCase())) {
|
|
56
|
-
url.searchParams.set(key, REDACTED);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (!hasScheme) {
|
|
60
|
-
return `${url.pathname}${url.search}${url.hash}`;
|
|
61
|
-
}
|
|
62
|
-
return url.toString();
|
|
63
|
-
}
|
|
64
35
|
// Check a single attribute key against the redaction patterns.
|
|
65
36
|
// Used by the Span implementation when setAttribute is called.
|
|
66
37
|
export function shouldRedactAttribute(key, config) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { ActiveMembershipResult } from "@cosmicdrift/kumiko-types/handlers";
|
|
1
2
|
import { type PrincipalStatusPlugin, type TenantLifecycleStatusPlugin } from "../engine/active-membership.ts";
|
|
2
3
|
import type { TenantId } from "../engine/types/identifiers.ts";
|
|
3
|
-
import type {
|
|
4
|
+
import type { Registry } from "../engine/types/index.ts";
|
|
4
5
|
import { type DispatchContext } from "./dispatch-shared.ts";
|
|
5
6
|
export type ActiveMembershipPolicy = {
|
|
6
7
|
readonly allowPendingDestruction: boolean;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// One framework-owned composition of membership / principal-status /
|
|
2
2
|
// tenant-lifecycle checks so login, switch-tenant and MFA completion can't independently drift.
|
|
3
|
+
import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
|
|
3
4
|
import { isPrincipalStatusPlugin, isTenantLifecycleStatusPlugin, TENANT_TEARDOWN_STATUSES, } from "../engine/active-membership.js";
|
|
4
5
|
import { EXT_PRINCIPAL_STATUS, EXT_TENANT_LIFECYCLE_STATUS } from "../engine/extension-names.js";
|
|
5
6
|
import { createSystemUser } from "../engine/system-user.js";
|
|
@@ -41,7 +42,7 @@ async function findMembership(ctx, userId, tenantId) {
|
|
|
41
42
|
}
|
|
42
43
|
return rawMemberships.find((m) => m.tenantId === tenantId);
|
|
43
44
|
}
|
|
44
|
-
// Exported so member-reader.ts (ctx.queryAsMember) can reach the registered
|
|
45
|
+
// Exported so member-reader.ts (ctx.dispatch.queryAsMember) can reach the registered
|
|
45
46
|
// PrincipalStatusPlugin's resolveProfile without duplicating this lookup.
|
|
46
47
|
export function resolvePrincipalPlugin(registry) {
|
|
47
48
|
const usages = registry.getExtensionUsages(EXT_PRINCIPAL_STATUS);
|
|
@@ -84,7 +85,10 @@ function isTeardownRejected(status, policy) {
|
|
|
84
85
|
}
|
|
85
86
|
// Order is load-bearing: a non-member must never learn a foreign tenant's
|
|
86
87
|
// lifecycle/blocked state, so membership is resolved and checked FIRST.
|
|
87
|
-
export
|
|
88
|
+
export function resolveActiveMembershipFn(ctx, userId, tenantId, policy) {
|
|
89
|
+
return runInSystemRowLevelSecurityScope("active membership lookup runs before the request tenant is established", () => resolveActiveMembershipInScope(ctx, userId, tenantId, policy));
|
|
90
|
+
}
|
|
91
|
+
async function resolveActiveMembershipInScope(ctx, userId, tenantId, policy) {
|
|
88
92
|
const { registry } = ctx;
|
|
89
93
|
const membership = await findMembership(ctx, userId, tenantId);
|
|
90
94
|
if (!membership) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { AppendEventArgs } from "@cosmicdrift/kumiko-types/handlers";
|
|
1
2
|
import type { DbRunner } from "../db/connection.ts";
|
|
2
|
-
import type {
|
|
3
|
+
import type { Registry, TenantId } from "../engine/types/index.ts";
|
|
3
4
|
import { type StoredEvent } from "../event-store/event-store.ts";
|
|
4
5
|
export type AppendDomainEventCoreDeps = {
|
|
5
6
|
readonly registry: Registry;
|
|
@@ -63,7 +63,7 @@ export async function appendDomainEventCore(deps, args) {
|
|
|
63
63
|
throw new ArchivedStreamError(deps.tenantId, args.aggregateId);
|
|
64
64
|
}
|
|
65
65
|
// Stream-version authoritative. See Block 0 / getStreamVersion doc for
|
|
66
|
-
// why row.version isn't sufficient once ctx.
|
|
66
|
+
// why row.version isn't sufficient once ctx.events.append enters the picture.
|
|
67
67
|
// A caller-pinned version (fetchForWriting handles) must reach append() so a
|
|
68
68
|
// write landing between fetch and append conflicts instead of being re-read.
|
|
69
69
|
const expectedVersion = args.expectedVersion ?? (await getStreamVersion(deps.db, args.aggregateId, deps.tenantId));
|
|
@@ -91,7 +91,7 @@ export async function appendDomainEventCore(deps, args) {
|
|
|
91
91
|
});
|
|
92
92
|
// Inline projections fire in the same tx — a throw rolls everything back
|
|
93
93
|
// together. Same semantics regardless of which call-site triggered the
|
|
94
|
-
// append (write-handler ctx.
|
|
94
|
+
// append (write-handler ctx.events.append vs. MSP-apply ctx.appendEvent).
|
|
95
95
|
await runProjectionsForEvent(stored, deps.registry, deps.db);
|
|
96
96
|
return stored;
|
|
97
97
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// TenantDb identity keys WeakMaps (rebinders, personal-data gates), so the exposed db is never
|
|
2
|
+
// wrapped or spread; the non-enumerable property keeps spreads and logging of the db unchanged.
|
|
3
|
+
function defineOutsideTransaction(db, outsideTransaction) {
|
|
4
|
+
Object.defineProperty(db, "outsideTransaction", {
|
|
5
|
+
value: outsideTransaction,
|
|
6
|
+
enumerable: false,
|
|
7
|
+
configurable: true,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function attachOutsideTransaction(db, outsideTransaction) {
|
|
11
|
+
defineOutsideTransaction(db, outsideTransaction);
|
|
12
|
+
return db;
|
|
13
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { AuthClaimsContext, AuthClaimsHookDef
|
|
1
|
+
import type { AuthClaimsContext, AuthClaimsHookDef } from "@cosmicdrift/kumiko-types/handlers";
|
|
2
|
+
import type { SessionUser } from "../engine/types/index.ts";
|
|
2
3
|
import type { Logger } from "../logging/types.ts";
|
|
3
4
|
export type ResolveAuthClaimsArgs = {
|
|
4
5
|
readonly user: SessionUser;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { PreDeleteHookFn } from "@cosmicdrift/kumiko-types/hooks";
|
|
1
2
|
import type { TableColumns } from "../db/dialect.ts";
|
|
2
|
-
import type {
|
|
3
|
+
import type { Registry } from "../engine/types/index.ts";
|
|
3
4
|
import type { SystemHookDef } from "./lifecycle-pipeline.ts";
|
|
4
5
|
type TableMap = ReadonlyMap<string, TableColumns>;
|
|
5
6
|
export declare function createCascadeDeleteHook(registry: Registry, tables: TableMap): SystemHookDef<PreDeleteHookFn>;
|
|
@@ -4,7 +4,8 @@ import { isBoundTenantDb } from "../db/tenant-db-runner.js";
|
|
|
4
4
|
import { OnDeleteStrategies, SystemHookNames, SystemHookPriorities } from "../engine/constants.js";
|
|
5
5
|
import { isRecordLocked } from "../engine/screen-helpers.js";
|
|
6
6
|
import { createSystemUser } from "../engine/system-user.js";
|
|
7
|
-
import {
|
|
7
|
+
import { RecordLockedError } from "../errors/classes.js";
|
|
8
|
+
import { ConflictError, FrameworkReasons, InternalError, reraiseAsKumikoError, } from "../errors/index.js";
|
|
8
9
|
// The cascade is a consequence of the parent delete the caller was already authorized for, so the
|
|
9
10
|
// children are written as the framework system user and the lock decision is taken once, up front.
|
|
10
11
|
const CASCADE_CHILD_WRITE_OPTIONS = { unsafeSkipLockGuard: true };
|
|
@@ -18,7 +19,7 @@ export function createCascadeDeleteHook(registry, tables) {
|
|
|
18
19
|
? ctx.systemDb.acknowledgeCrossTenant(`cascade delete for r.systemScope() write handler (${entityName ?? "unknown"})`)
|
|
19
20
|
: ctx.db;
|
|
20
21
|
if (!entityName || !db) {
|
|
21
|
-
ctx.log?.debug(`cascadeDelete: skipping — ${!entityName ? "no entityName" : "no db"} on payload ${payload.id}`);
|
|
22
|
+
ctx.obs.log?.debug(`cascadeDelete: skipping — ${!entityName ? "no entityName" : "no db"} on payload ${payload.id}`);
|
|
22
23
|
return;
|
|
23
24
|
}
|
|
24
25
|
const writeDb = isBoundTenantDb(db) ? db : undefined;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { ConfigAccessorFactory } from "@cosmicdrift/kumiko-types/config";
|
|
2
2
|
import type { AppContext } from "@cosmicdrift/kumiko-types/handlers";
|
|
3
|
-
export declare function configAccessorFactoryOf(context: Pick<AppContext, "configAccessorFactory"
|
|
3
|
+
export declare function configAccessorFactoryOf(context: Pick<AppContext, "configAccessorFactory">): ConfigAccessorFactory | undefined;
|