@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1
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/driver-value-preparation.js +23 -2
- 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 +84 -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 +6 -0
- package/dist/db/row-level-security-boot-check.js +86 -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 +12 -2
- package/dist/schema-cli/shared.js +24 -2
- package/dist/schema-cli/status-command.js +8 -2
- package/dist/schema-cli/validate-command.js +48 -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 +2 -9
- package/dist/upgrade-cli.js +28 -70
- 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 +23 -19
- package/src/changes.json +236 -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,5 +1,6 @@
|
|
|
1
|
+
import type { SaveContext } from "@cosmicdrift/kumiko-types/hooks";
|
|
1
2
|
import type { TenantDb } from "../db/tenant-db.ts";
|
|
2
|
-
import {
|
|
3
|
+
import type { Registry, SessionUser } from "../engine/types/index.ts";
|
|
3
4
|
export declare function disposeRemovedFileRefs(args: {
|
|
4
5
|
readonly registry: Registry;
|
|
5
6
|
readonly result: SaveContext;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isFileField
|
|
1
|
+
import { isFileField } from "../engine/field-helpers.js";
|
|
2
2
|
import { reraiseAsKumikoError } from "../errors/index.js";
|
|
3
3
|
import { fileRefIdsOf } from "./bind-pending-file-refs.js";
|
|
4
4
|
import { getFileRefExecutor } from "./create-file-ref.js";
|
package/dist/files/feature.js
CHANGED
|
@@ -41,10 +41,10 @@ export function createFilesFeature(options = {}) {
|
|
|
41
41
|
handler: async (_payload, ctx) => {
|
|
42
42
|
await sweepOrphanedUploads({
|
|
43
43
|
db: ctx.db,
|
|
44
|
-
files: ctx.files,
|
|
44
|
+
files: ctx.services.files,
|
|
45
45
|
now: ctx.tz.now(),
|
|
46
46
|
graceHours: uploadSweepGraceHours,
|
|
47
|
-
log: ctx.log,
|
|
47
|
+
log: ctx.obs.log,
|
|
48
48
|
});
|
|
49
49
|
},
|
|
50
50
|
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// The contract the framework exposes to hook/handler code: a FileHandle lets
|
|
4
4
|
// you read/write/delete the binary behind a storage key without ever passing
|
|
5
5
|
// the binary through event payloads, job queues, or hook signatures. Events
|
|
6
|
-
// carry the key, hooks reach for `ctx.files.ref(key)` when they actually need
|
|
6
|
+
// carry the key, hooks reach for `ctx.services.files.ref(key)` when they actually need
|
|
7
7
|
// the bytes, and big files stay in the storage layer where they belong.
|
|
8
8
|
//
|
|
9
9
|
// `derive(suffix)` is the primitive for thumbnail/variant keys: it inserts a
|
|
@@ -2,7 +2,7 @@ import type { RateLimitResolver } from "@cosmicdrift/kumiko-types/rate-limit-typ
|
|
|
2
2
|
import type { WriteErrorInfo } from "@cosmicdrift/kumiko-types/write-error-info-types";
|
|
3
3
|
import { Hono } from "hono";
|
|
4
4
|
import type { DbConnection } from "../db/connection.ts";
|
|
5
|
-
import {
|
|
5
|
+
import type { Registry, SessionUser, TenantId } from "../engine/types/index.ts";
|
|
6
6
|
import type { FileProviderResolver } from "./provider-resolver.ts";
|
|
7
7
|
import type { RecordReadCheck } from "./record-read-check.ts";
|
|
8
8
|
import { type RecordWriteCheck } from "./record-write-check.ts";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isUuid } from "@cosmicdrift/kumiko-types/identifiers";
|
|
1
2
|
import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
2
3
|
import { Hono } from "hono";
|
|
3
4
|
import { bodyLimit } from "hono/body-limit";
|
|
@@ -5,10 +6,12 @@ import { getUser } from "../api/auth-middleware.js";
|
|
|
5
6
|
import { requestContext } from "../api/request-context.js";
|
|
6
7
|
import { collectPiiSubjectFields, configuredPiiSubjectKms, decryptPiiFieldValues, isPiiCiphertext, PII_ERASED_SENTINEL, } from "../crypto/index.js";
|
|
7
8
|
import { selectMany } from "../db/query.js";
|
|
9
|
+
import { runInRowLevelSecurityScope, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
|
|
8
10
|
import { createProjectingTenantDb } from "../db/tenant-db.js";
|
|
9
|
-
import { createDerivativesContext,
|
|
11
|
+
import { createDerivativesContext, resolveRenderer } from "../derivatives/derivatives-context.js";
|
|
12
|
+
import { resolveFieldVariant } from "../derivatives/index.js";
|
|
13
|
+
import { isFileField } from "../engine/field-helpers.js";
|
|
10
14
|
import { isAnonymousSessionUser, SYSTEM_USER_ID } from "../engine/system-user.js";
|
|
11
|
-
import { isFileField, isUuid, } from "../engine/types/index.js";
|
|
12
15
|
import { createFailOpenReporter, respondRateLimited } from "../rate-limit/middleware.js";
|
|
13
16
|
import { listActionFormFileFields, mayUseActionForm } from "./action-form-upload.js";
|
|
14
17
|
import { buildContentDispositionHeader } from "./content-disposition.js";
|
|
@@ -116,6 +119,13 @@ export function createFileRoutes(options) {
|
|
|
116
119
|
const executor = getFileRefExecutor();
|
|
117
120
|
const piiSubjectFields = collectPiiSubjectFields(fileRefEntity);
|
|
118
121
|
const api = new Hono();
|
|
122
|
+
// These routes read the file table on the root connection, outside the dispatcher, so the caller's tenant scope is opened here.
|
|
123
|
+
api.use("*", async (c, next) => {
|
|
124
|
+
const user = getUser(c);
|
|
125
|
+
if (user === undefined)
|
|
126
|
+
return next();
|
|
127
|
+
return runInRowLevelSecurityScope(tenantRowLevelSecurityScope(user.tenantId), next);
|
|
128
|
+
});
|
|
119
129
|
const tenantDbFor = (tenantId) => createProjectingTenantDb(db, tenantId, options.registry);
|
|
120
130
|
const fileNameIsPersonal = piiSubjectFields.includes("fileName");
|
|
121
131
|
function kmsContextFor() {
|
package/dist/files/index.d.ts
CHANGED
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
export { listActionFormFileFields, resolveActionFormFileField } from "./action-form-upload.ts";
|
|
2
|
-
export type {
|
|
2
|
+
export type { PendingFileRef } from "./bind-pending-file-refs.ts";
|
|
3
3
|
export { bindPendingFileRef, loadPendingFileRef } from "./bind-pending-file-refs.ts";
|
|
4
|
-
export type { CreatedFileRef,
|
|
4
|
+
export type { CreatedFileRef, CreateFileRefInput, UploadedFileBytes, } from "./create-file-ref-from-bytes.ts";
|
|
5
5
|
export { createFileRefFromBytes, createFileRefFromUploadedBytes, uploadFileBytesBeforeTransaction, } from "./create-file-ref-from-bytes.ts";
|
|
6
6
|
export { createFilesFeature, FILES_FEATURE } from "./feature.ts";
|
|
7
|
-
export type { FileContext
|
|
7
|
+
export type { FileContext } from "./file-handle.ts";
|
|
8
8
|
export { createFileContext, createTenantFileContext, deriveKey, storageKeyStemPrefix, } from "./file-handle.ts";
|
|
9
9
|
export { FILE_REF_ENTITY_NAME, fileRefEntity } from "./file-ref-entity.ts";
|
|
10
10
|
export { fileRefsTable } from "./file-ref-table.ts";
|
|
11
|
-
export type {
|
|
12
|
-
export {
|
|
11
|
+
export type { FileAccessGuard } from "./file-routes.ts";
|
|
12
|
+
export { readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.ts";
|
|
13
13
|
export type { InMemoryFileProvider } from "./in-memory-provider.ts";
|
|
14
14
|
export { createInMemoryFileProvider } from "./in-memory-provider.ts";
|
|
15
15
|
export { createLocalProvider } from "./local-provider.ts";
|
|
16
|
-
export type { FileProviderContext, FileProviderPlugin, FileProviderResolver,
|
|
17
|
-
export { createFileProviderForTenant, isFileProviderPlugin,
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
20
|
-
export {
|
|
21
|
-
export
|
|
22
|
-
export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, parseMaxSize, resolveUploadMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, validateFileContent, } from "./types.ts";
|
|
23
|
-
export { createFileUploadLedger, fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.ts";
|
|
16
|
+
export type { FileProviderContext, FileProviderPlugin, FileProviderResolver, } from "./provider-resolver.ts";
|
|
17
|
+
export { createFileProviderForTenant, isFileProviderPlugin, } from "./provider-resolver.ts";
|
|
18
|
+
export { filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.ts";
|
|
19
|
+
export type { FileStorageProvider, SignedUrlOptions, } from "./types.ts";
|
|
20
|
+
export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, } from "./types.ts";
|
|
21
|
+
export { fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.ts";
|
|
24
22
|
export type { ZipEntry } from "./zip-stream.ts";
|
|
25
23
|
export { createZipStream } from "./zip-stream.ts";
|
package/dist/files/index.js
CHANGED
|
@@ -7,13 +7,11 @@ export { createFilesFeature, FILES_FEATURE } from "./feature.js";
|
|
|
7
7
|
export { createFileContext, createTenantFileContext, deriveKey, storageKeyStemPrefix, } from "./file-handle.js";
|
|
8
8
|
export { FILE_REF_ENTITY_NAME, fileRefEntity } from "./file-ref-entity.js";
|
|
9
9
|
export { fileRefsTable } from "./file-ref-table.js";
|
|
10
|
-
export {
|
|
10
|
+
export { readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.js";
|
|
11
11
|
export { createInMemoryFileProvider } from "./in-memory-provider.js";
|
|
12
12
|
export { createLocalProvider } from "./local-provider.js";
|
|
13
|
-
export { createFileProviderForTenant, isFileProviderPlugin,
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, parseMaxSize, resolveUploadMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, validateFileContent, } from "./types.js";
|
|
18
|
-
export { createFileUploadLedger, fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.js";
|
|
13
|
+
export { createFileProviderForTenant, isFileProviderPlugin, } from "./provider-resolver.js";
|
|
14
|
+
export { filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.js";
|
|
15
|
+
export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, } from "./types.js";
|
|
16
|
+
export { fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.js";
|
|
19
17
|
export { createZipStream } from "./zip-stream.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { SaveContext } from "@cosmicdrift/kumiko-types/hooks";
|
|
1
2
|
import type { TenantDb } from "../db/tenant-db.ts";
|
|
2
|
-
import {
|
|
3
|
+
import type { Registry, SessionUser } from "../engine/types/index.ts";
|
|
3
4
|
export type FileRefRows = ReadonlyMap<string, Readonly<Record<string, unknown>>>;
|
|
4
5
|
export declare function loadSaveFileRefs(args: {
|
|
5
6
|
readonly registry: Registry;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { selectMany } from "../db/query.js";
|
|
2
2
|
import { tenantDbRunner } from "../db/tenant-db-runner.js";
|
|
3
|
-
import { isFileField
|
|
3
|
+
import { isFileField } from "../engine/field-helpers.js";
|
|
4
4
|
import { getStreamVersions } from "../event-store/event-store.js";
|
|
5
5
|
import { fileRefIdsOf } from "./bind-pending-file-refs.js";
|
|
6
6
|
import { FILE_REF_ENTITY_NAME } from "./file-ref-entity.js";
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { CacheSyncBus } from "@cosmicdrift/kumiko-types/cache-sync-types";
|
|
2
|
+
import type { ConfigAccessor, ConfigAccessorFactory } from "@cosmicdrift/kumiko-types/config";
|
|
2
3
|
import type { FileProviderResolver } from "@cosmicdrift/kumiko-types/file-provider-resolver-types";
|
|
3
4
|
import type { DbConnection } from "../db/connection.ts";
|
|
4
5
|
import type { TenantDb } from "../db/tenant-db.ts";
|
|
5
|
-
import type {
|
|
6
|
+
import type { Registry } from "../engine/types/index.ts";
|
|
6
7
|
import type { SecretsContext } from "../secrets/index.ts";
|
|
7
8
|
import type { FileStorageProvider } from "./types.ts";
|
|
8
9
|
/**
|
|
@@ -28,7 +29,7 @@ import type { FileStorageProvider } from "./types.ts";
|
|
|
28
29
|
export type FileProviderContext = {
|
|
29
30
|
readonly config?: ConfigAccessor;
|
|
30
31
|
readonly registry?: Registry;
|
|
31
|
-
readonly secrets
|
|
32
|
+
readonly secrets: SecretsContext | undefined;
|
|
32
33
|
readonly auditUserId?: string | undefined;
|
|
33
34
|
};
|
|
34
35
|
/**
|
|
@@ -38,7 +39,7 @@ export type FileProviderContext = {
|
|
|
38
39
|
*
|
|
39
40
|
* **Plugin-Author-Warning:** `ctx` is EXPLICITLY a FileProviderContext, not
|
|
40
41
|
* a full HandlerContext. Fields outside the narrow surface (e.g.
|
|
41
|
-
* `ctx.tx`, `ctx.actor`, `ctx.signal`) are NOT available on the worker path.
|
|
42
|
+
* `ctx.tx`, `ctx.actor`, `ctx.lifecycle.signal`) are NOT available on the worker path.
|
|
42
43
|
* Casting `ctx as unknown as HandlerContext` fails at runtime on the worker —
|
|
43
44
|
* the crash only appears in production with the first S3 tenant. If a plugin
|
|
44
45
|
* needs fields outside FileProviderContext, extend FileProviderContext
|
|
@@ -52,7 +53,7 @@ export declare function createFileProviderForTenant(ctx: FileProviderContext, te
|
|
|
52
53
|
export type { FileProviderResolver } from "@cosmicdrift/kumiko-types/file-provider-resolver-types";
|
|
53
54
|
export type FileProviderResolverDeps = {
|
|
54
55
|
readonly registry?: Registry;
|
|
55
|
-
readonly
|
|
56
|
+
readonly configAccessorFactory?: ConfigAccessorFactory;
|
|
56
57
|
readonly secrets?: SecretsContext;
|
|
57
58
|
readonly db?: DbConnection | TenantDb;
|
|
58
59
|
readonly cacheSync?: CacheSyncBus;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// File-provider resolution — lives in the framework so the upload routes,
|
|
2
|
-
// `ctx.files`, AND the GDPR export/forget jobs resolve their FileStorageProvider
|
|
2
|
+
// `ctx.services.files`, AND the GDPR export/forget jobs resolve their FileStorageProvider
|
|
3
3
|
// through ONE path. Divergence (uploads writing one store, erasure deleting
|
|
4
4
|
// another) is structurally impossible: there is a single resolver.
|
|
5
5
|
//
|
|
@@ -101,11 +101,11 @@ export function makeFileProviderResolver(deps) {
|
|
|
101
101
|
if (cached)
|
|
102
102
|
return cached;
|
|
103
103
|
const built = (async () => {
|
|
104
|
-
if (!deps.registry || !deps.
|
|
105
|
-
throw new Error("makeFileProviderResolver: registry/
|
|
104
|
+
if (!deps.registry || !deps.configAccessorFactory || !deps.db) {
|
|
105
|
+
throw new Error("makeFileProviderResolver: registry/configAccessorFactory/db missing — " +
|
|
106
106
|
"mount the config + file-foundation features and wire context.db");
|
|
107
107
|
}
|
|
108
|
-
const config = deps.
|
|
108
|
+
const config = deps.configAccessorFactory({
|
|
109
109
|
user: { id: SYSTEM_USER_ID, tenantId },
|
|
110
110
|
db: deps.db,
|
|
111
111
|
secrets: deps.secrets,
|
|
@@ -11,11 +11,13 @@
|
|
|
11
11
|
// consumer-cursor row. Apps that want it pass filesStorageTrackingFeature
|
|
12
12
|
// into createApp / setupTestStack alongside their domain features.
|
|
13
13
|
import { bigint, instant, integer, table as pgTable, sql, uuid } from "../db/dialect.js";
|
|
14
|
-
import { entityEventName
|
|
14
|
+
import { entityEventName } from "../db/index.js";
|
|
15
15
|
import { toPostgresArrayLiteral } from "../db/queries/postgres-array-literal.js";
|
|
16
|
+
import { executeRawQueryRead } from "../db/queries/raw-sql.js";
|
|
16
17
|
import { incrementCounter } from "../db/query.js";
|
|
17
18
|
import { defineFeature, qn, toKebab } from "../engine/index.js";
|
|
18
|
-
import {
|
|
19
|
+
import { selectConsumerCursorForUpdate } from "../pipeline/event-dispatcher-delivery.js";
|
|
20
|
+
import { SHARED_INSTANCE_SENTINEL } from "../pipeline/index.js";
|
|
19
21
|
import { parseJsonOrThrow } from "../utils/index.js";
|
|
20
22
|
const FILE_REF_AGGREGATE_TYPE = "fileRef";
|
|
21
23
|
const STORAGE_TRACKING_FEATURE_NAME = "files-storage-tracking";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FileContext } from "@cosmicdrift/kumiko-types/file-handle-types";
|
|
2
2
|
import type { Logger } from "@cosmicdrift/kumiko-types/logger";
|
|
3
|
-
import {
|
|
3
|
+
import type { TenantDb } from "../db/tenant-db.ts";
|
|
4
4
|
export declare const ORPHANED_UPLOAD_SWEEP_BATCH = 500;
|
|
5
5
|
export declare const DEFAULT_UPLOAD_SWEEP_GRACE_HOURS = 24;
|
|
6
6
|
export declare const MIN_UPLOAD_SWEEP_GRACE_HOURS = 1;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { selectMany } from "../db/query.js";
|
|
2
|
-
import { runInOwnTransaction } from "../db/tenant-db.js";
|
|
2
|
+
import { runInOwnTransaction } from "../db/tenant-db-scoped-rebind.js";
|
|
3
3
|
import { deleteFileRefBytes } from "../derivatives/delete-stored-file.js";
|
|
4
4
|
import { fileRefsTable } from "./file-ref-table.js";
|
|
5
5
|
import { fileUploadLedgerTable, takeUploadLedgerEntry } from "./upload-ledger.js";
|
package/dist/i18n/index.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import type { Registry } from "../engine/types/index.ts";
|
|
2
|
+
import type { I18n, I18nOptions } from "./internals.ts";
|
|
2
3
|
export { hasMailTranslationKey, hasMailTranslations, listMailLocales, mailT, registerMailTranslations, resolveMailLocale, } from "./mail-registry.ts";
|
|
3
|
-
export { canonicalizeLocaleTag,
|
|
4
|
+
export { canonicalizeLocaleTag, isValidLocaleTag, rankPreferredLocales, } from "./request-locale.ts";
|
|
4
5
|
export { SETTINGS_HUB_I18N } from "./settings-hub-keys.ts";
|
|
5
|
-
export type I18nOptions = {
|
|
6
|
-
defaultLocale: string;
|
|
7
|
-
};
|
|
8
|
-
export type I18n = {
|
|
9
|
-
t(key: string, locale?: string, params?: Readonly<Record<string, unknown>>): string;
|
|
10
|
-
getAllKeys(): string[];
|
|
11
|
-
};
|
|
12
6
|
export declare function createI18n(registry: Registry, options: I18nOptions): I18n;
|
package/dist/i18n/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolveTranslationValue } from "../ui-types/plural.js";
|
|
2
2
|
export { hasMailTranslationKey, hasMailTranslations, listMailLocales, mailT, registerMailTranslations, resolveMailLocale, } from "./mail-registry.js";
|
|
3
|
-
export { canonicalizeLocaleTag,
|
|
3
|
+
export { canonicalizeLocaleTag, isValidLocaleTag, rankPreferredLocales, } from "./request-locale.js";
|
|
4
4
|
export { SETTINGS_HUB_I18N } from "./settings-hub-keys.js";
|
|
5
5
|
export function createI18n(registry, options) {
|
|
6
6
|
const translations = registry.getAllTranslations();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NavDefinition } from "@cosmicdrift/kumiko-types/nav";
|
|
2
|
+
import type { ScreenDefinition } from "@cosmicdrift/kumiko-types/screen";
|
|
3
|
+
import type { WorkspaceDefinition } from "@cosmicdrift/kumiko-types/workspace";
|
|
4
|
+
import type { FeatureDefinition } from "../engine/types/index.ts";
|
|
2
5
|
/** Pseudo-entity for actionForm field labels (renderer action-form-shim). */
|
|
3
6
|
export declare const ACTION_FORM_ENTITY = "__action-form__";
|
|
4
7
|
/** Pseudo-entity for configEdit field labels (renderer config-edit-shim). */
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { isRowLevelSecurityViolation } from "../db/pg-error.ts";
|
|
2
|
+
export { DEFAULT_ROW_LEVEL_SECURITY_MODE } from "../db/render-rls-ddl.ts";
|
|
3
|
+
export { appHookScopedRunner, runInRowLevelSecurityScope, runInSystemRowLevelSecurityScope, systemScopedRunner, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.ts";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { isRowLevelSecurityViolation } from "../db/pg-error.js";
|
|
2
|
+
export { DEFAULT_ROW_LEVEL_SECURITY_MODE } from "../db/render-rls-ddl.js";
|
|
3
|
+
export { appHookScopedRunner, runInRowLevelSecurityScope, runInSystemRowLevelSecurityScope, systemScopedRunner, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { isClosedConnectionError } from "../db/closed-connection.ts";
|
|
2
2
|
export { createDbConnection } from "../db/connection.ts";
|
|
3
|
-
export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
|
|
3
|
+
export { acquireSessionAdvisoryLock, createApplicationRole, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, transferDatabaseOwnership, transferPublicSchemaOwnership, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
|
|
4
4
|
export type { AnyDb } from "../db/query.ts";
|
|
5
5
|
export { columnNamesOf } from "../db/schema-inspection.ts";
|
|
6
6
|
export { schemaTableName } from "../db/table-introspection.ts";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @runtime dev
|
|
2
2
|
export { isClosedConnectionError } from "../db/closed-connection.js";
|
|
3
3
|
export { createDbConnection } from "../db/connection.js";
|
|
4
|
-
export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
|
|
4
|
+
export { acquireSessionAdvisoryLock, createApplicationRole, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, transferDatabaseOwnership, transferPublicSchemaOwnership, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
|
|
5
5
|
export { columnNamesOf } from "../db/schema-inspection.js";
|
|
6
6
|
export { schemaTableName } from "../db/table-introspection.js";
|
|
7
7
|
export { addMissingColumns, addMissingIndexes, tableToMeta, unsafeCreateEntityTable, unsafeEnsureEntityTable, unsafePushTables, } from "../db/table-push.js";
|
|
@@ -6,6 +6,7 @@ export { resetBlindIndexKeyForTests } from "../crypto/blind-index.ts";
|
|
|
6
6
|
export { resetEventPiiCatalogForTests } from "../crypto/event-pii.ts";
|
|
7
7
|
export { resetPiiSubjectKmsForTests } from "../crypto/pii-field-encryption.ts";
|
|
8
8
|
export { resetEntityFieldEncryptionCacheForTests } from "../db/entity-field-encryption.ts";
|
|
9
|
+
export { type ExecutorManagedEntitySource, executorManagedEntitySourceOf, } from "../db/executor-managed-tables.ts";
|
|
9
10
|
export declare function withExecutorManagedWritesForTests(db: TenantDb): ExecutorManagedTenantDb;
|
|
10
11
|
export declare function withExecutorManagedWritesForTests(db: DbRunner): ExecutorManagedRunner;
|
|
11
12
|
export declare function withExecutorManagedWritesForTests(db: AnyDb): ExecutorManagedTenantDb | ExecutorManagedRunner;
|
package/dist/internal/testing.js
CHANGED
|
@@ -4,13 +4,17 @@ export { resetBlindIndexKeyForTests } from "../crypto/blind-index.js";
|
|
|
4
4
|
export { resetEventPiiCatalogForTests } from "../crypto/event-pii.js";
|
|
5
5
|
export { resetPiiSubjectKmsForTests } from "../crypto/pii-field-encryption.js";
|
|
6
6
|
export { resetEntityFieldEncryptionCacheForTests } from "../db/entity-field-encryption.js";
|
|
7
|
+
export { executorManagedEntitySourceOf, } from "../db/executor-managed-tables.js";
|
|
7
8
|
export function withExecutorManagedWritesForTests(db) {
|
|
8
9
|
if (isBoundTenantDb(db)) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const options = { db: withExecutorManagedWrites(tenantDbRunner(db)), tenantId: db.tenantId };
|
|
11
|
+
return db.mode === "system"
|
|
12
|
+
? createTenantDb({
|
|
13
|
+
...options,
|
|
14
|
+
mode: "system",
|
|
15
|
+
reason: "test seeding mirrors a system-mode TenantDb",
|
|
16
|
+
})
|
|
17
|
+
: createTenantDb(options);
|
|
14
18
|
}
|
|
15
19
|
if (isDbRunner(db))
|
|
16
20
|
return withExecutorManagedWrites(db);
|
package/dist/jobs/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type { JobDroppedMeta, JobLogEntry, JobMeta, JobOutcomeMeta, JobQueuedMeta, JobRunner, JobRunnerOptions,
|
|
1
|
+
export type { JobDroppedMeta, JobLogEntry, JobMeta, JobOutcomeMeta, JobQueuedMeta, JobRunner, JobRunnerOptions, } from "./job-runner.ts";
|
|
2
2
|
export { createJobRunner, serializeJobSubject } from "./job-runner.ts";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AppendEventFn } from "@cosmicdrift/kumiko-types/handlers";
|
|
2
|
+
import type { TenantDb } from "../db/tenant-db.ts";
|
|
3
|
+
import type { Registry, SessionUser } from "../engine/types/index.ts";
|
|
4
|
+
type JobAppendEventInput = {
|
|
5
|
+
readonly registry: Registry;
|
|
6
|
+
readonly jobDb: TenantDb | undefined;
|
|
7
|
+
readonly tenantId: string;
|
|
8
|
+
readonly systemUser: SessionUser;
|
|
9
|
+
readonly jobName: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function createJobAppendEvent(input: JobAppendEventInput): AppendEventFn;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { tenantDbWriteRunner } from "../db/tenant-db-runner.js";
|
|
2
|
+
import { runInOwnTransaction } from "../db/tenant-db-scoped-rebind.js";
|
|
3
|
+
import { InternalError } from "../errors/index.js";
|
|
4
|
+
import { appendDomainEventCore } from "../pipeline/append-event-core.js";
|
|
5
|
+
import { asTypedAppendEventFn } from "../pipeline/typed-append-event.js";
|
|
6
|
+
const CALL_SITE_LABEL = "job ctx.events.append";
|
|
7
|
+
export function createJobAppendEvent(input) {
|
|
8
|
+
const { registry, jobDb, tenantId, systemUser, jobName } = input;
|
|
9
|
+
return asTypedAppendEventFn(async (args) => {
|
|
10
|
+
if (jobDb === undefined) {
|
|
11
|
+
throw new InternalError({
|
|
12
|
+
message: `Job ${jobName}: ctx.events.append needs a tenant db`,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
const callerFeature = registry.getJobFeature(jobName);
|
|
16
|
+
if (callerFeature === undefined) {
|
|
17
|
+
throw new InternalError({
|
|
18
|
+
message: `Job ${jobName}: ctx.events.append needs an owning feature, none is registered for this job`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
await runInOwnTransaction(jobDb, (txDb) => appendDomainEventCore({
|
|
22
|
+
registry,
|
|
23
|
+
db: tenantDbWriteRunner(txDb, CALL_SITE_LABEL),
|
|
24
|
+
tenantId,
|
|
25
|
+
userId: String(systemUser.id),
|
|
26
|
+
callSiteLabel: CALL_SITE_LABEL,
|
|
27
|
+
callerFeature,
|
|
28
|
+
}, args));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
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
3
|
import type { WriteOrigin } from "@cosmicdrift/kumiko-types/event-store-types";
|
|
4
|
+
import type { JobContext } from "@cosmicdrift/kumiko-types/handlers";
|
|
4
5
|
import type { DbRow } from "../db/connection.ts";
|
|
5
|
-
import type { JobContext, JobDefinition } from "../engine/types/index.ts";
|
|
6
6
|
import type { JobRunnerScope } from "./job-runner-scope.ts";
|
|
7
7
|
import type { JobInvocation, JobLogEntry, JobMeta } from "./job-runner-types.ts";
|
|
8
8
|
export type TenantVisibleSubjects = {
|
|
@@ -6,11 +6,14 @@ import { createDerivativesContext } from "../derivatives/derivatives-context.js"
|
|
|
6
6
|
import { createSystemUser } from "../engine/system-user.js";
|
|
7
7
|
import { InternalError } from "../errors/index.js";
|
|
8
8
|
import { createTenantFileContext } from "../files/file-handle.js";
|
|
9
|
-
import { createEscapeHatchReporter
|
|
9
|
+
import { createEscapeHatchReporter } from "../observability/escape-hatch-report.js";
|
|
10
|
+
import { createMetricsForFactory } from "../observability/index.js";
|
|
10
11
|
import { configAccessorFactoryOf } from "../pipeline/config-accessor-factory.js";
|
|
12
|
+
import { buildContextServices } from "../pipeline/context-services.js";
|
|
11
13
|
import { createGatedIdentitySwitch } from "../pipeline/system-identity-switch.js";
|
|
12
14
|
import { buildPersonalDataGate, parseWriteOrigin } from "../pipeline/write-origin.js";
|
|
13
|
-
import {
|
|
15
|
+
import { createJobAppendEvent } from "./job-append-event.js";
|
|
16
|
+
import { attemptNumberOf, createJobLogger, handlerPayloadOf, hasDeferBudgetLeft, isFinalAttempt, isJobTriggerEvent, jobSubjectKey, missingDbProxy, tenantIdOfJobData, } from "./job-runner-helpers.js";
|
|
14
17
|
// Tenant-visible failure record (JobDefinition.tenantVisibleFailure). The
|
|
15
18
|
// subject is read from the handler payload, so it is resolved where the
|
|
16
19
|
// payload is built, not in the callbacks.
|
|
@@ -72,7 +75,7 @@ function buildJobDbFacets(scope, facetInput) {
|
|
|
72
75
|
const { jobDef, tenantId, writeOrigin } = input;
|
|
73
76
|
const personalDataGate = writeOrigin ? buildPersonalDataGate(registry, writeOrigin) : undefined;
|
|
74
77
|
const configDb = context.db; // @cast-boundary db-operator
|
|
75
|
-
// Shared by the config accessor and ctx.derivatives below — both need the
|
|
78
|
+
// Shared by the config accessor and ctx.services.derivatives below — both need the
|
|
76
79
|
// same tenant-scoped db, and building it twice would let the two calls
|
|
77
80
|
// drift apart. Always "system" mode regardless of the job's own
|
|
78
81
|
// systemScope() status (pre-existing, not something this change alters)
|
|
@@ -85,6 +88,7 @@ function buildJobDbFacets(scope, facetInput) {
|
|
|
85
88
|
db: configDb,
|
|
86
89
|
tenantId,
|
|
87
90
|
mode: "system",
|
|
91
|
+
reason: "job context db for cross-tenant jobs, ctx.systemDb exposure is gated by isSystemJob",
|
|
88
92
|
grants: {
|
|
89
93
|
projectionRegistry: registry,
|
|
90
94
|
...(personalDataGate && { personalDataGate }),
|
|
@@ -120,12 +124,12 @@ function buildJobServiceFacets(scope, facetInput, tenantScopedDb) {
|
|
|
120
124
|
const { context, registry } = scope;
|
|
121
125
|
const { input, systemUser } = facetInput;
|
|
122
126
|
const { tenantId } = input;
|
|
123
|
-
// Mirror dispatch-shared.ts buildHandlerContext: ctx.files must resolve
|
|
127
|
+
// Mirror dispatch-shared.ts buildHandlerContext: ctx.services.files must resolve
|
|
124
128
|
// through the same _fileProviderResolver for jobs as for write-handlers,
|
|
125
|
-
// otherwise event-triggered jobs silently get an unresolved ctx.files.
|
|
129
|
+
// otherwise event-triggered jobs silently get an unresolved ctx.services.files.
|
|
126
130
|
const fileResolver = context._fileProviderResolver;
|
|
127
131
|
const files = fileResolver ? createTenantFileContext(fileResolver, tenantId) : context.files;
|
|
128
|
-
// Same buildHandlerContext parity as ctx.files above: ctx.notify/ctx.config
|
|
132
|
+
// Same buildHandlerContext parity as ctx.services.files above: ctx.notify/ctx.config
|
|
129
133
|
// must resolve for jobs the same way they do for write-handlers, or an
|
|
130
134
|
// app-author job calling ctx.notify(...)/ctx.config(...) hits a TypeError
|
|
131
135
|
// at runtime the write-handler path never would.
|
|
@@ -138,7 +142,7 @@ function buildJobServiceFacets(scope, facetInput, tenantScopedDb) {
|
|
|
138
142
|
secrets: context.secrets,
|
|
139
143
|
})
|
|
140
144
|
: undefined;
|
|
141
|
-
// Mirror dispatch-shared.ts: ctx.derivatives needs files+db, same
|
|
145
|
+
// Mirror dispatch-shared.ts: ctx.services.derivatives needs files+db, same
|
|
142
146
|
// tenant-scoped db the config accessor above uses.
|
|
143
147
|
const derivatives = files && tenantScopedDb
|
|
144
148
|
? createDerivativesContext({ files, registry, db: tenantScopedDb, tenantId })
|
|
@@ -190,6 +194,24 @@ function createJobDefer(jobName, bullJob, token) {
|
|
|
190
194
|
return { kind: "job-deferral", delayMs };
|
|
191
195
|
};
|
|
192
196
|
}
|
|
197
|
+
function buildJobServices(scope, parts) {
|
|
198
|
+
const { files, derivatives, selfRunner } = parts;
|
|
199
|
+
return buildContextServices(scope.context, {
|
|
200
|
+
...(files && { files }),
|
|
201
|
+
...(derivatives && { derivatives }),
|
|
202
|
+
// Expose the runner so handlers can chain a follow-up job. Symmetric with
|
|
203
|
+
// how the command-dispatcher hands write-handlers their jobRunner.
|
|
204
|
+
...(selfRunner !== undefined && { jobRunner: selfRunner }),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
function buildJobObservability(scope, log) {
|
|
208
|
+
const { meter } = scope.context;
|
|
209
|
+
return {
|
|
210
|
+
log,
|
|
211
|
+
metricsFor: createMetricsForFactory(meter),
|
|
212
|
+
...(meter && { meter }),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
193
215
|
function buildJobContext(scope, input) {
|
|
194
216
|
const { jobName, bullJob, token, rawData, tenantId, triggeredById, attempt, finalAttempt } = input;
|
|
195
217
|
const systemUser = createSystemUser(tenantId);
|
|
@@ -212,12 +234,24 @@ function buildJobContext(scope, input) {
|
|
|
212
234
|
// this run (see createJobTriggerEventConsumer).
|
|
213
235
|
const rawTriggerEvent = rawData["_triggerEvent"];
|
|
214
236
|
const triggerEvent = isJobTriggerEvent(rawTriggerEvent) ? rawTriggerEvent : undefined;
|
|
237
|
+
const jobLogger = createJobLogger(input.logs);
|
|
215
238
|
const jobContext = {
|
|
216
239
|
defer: createJobDefer(jobName, bullJob, token),
|
|
217
|
-
|
|
240
|
+
canDefer: token !== undefined &&
|
|
241
|
+
bullJob.moveToDelayed !== undefined &&
|
|
242
|
+
hasDeferBudgetLeft(rawData, input.jobDef.maxDefers),
|
|
218
243
|
db: jobDb ?? missingDbProxy(jobName),
|
|
219
|
-
|
|
220
|
-
|
|
244
|
+
events: {
|
|
245
|
+
append: createJobAppendEvent({
|
|
246
|
+
registry: scope.registry,
|
|
247
|
+
jobDb,
|
|
248
|
+
tenantId,
|
|
249
|
+
systemUser,
|
|
250
|
+
jobName,
|
|
251
|
+
}),
|
|
252
|
+
},
|
|
253
|
+
services: buildJobServices(scope, { files, derivatives, selfRunner }),
|
|
254
|
+
lifecycle: scope.context.signal ? { signal: scope.context.signal } : {},
|
|
221
255
|
...(notify !== undefined && { notify }),
|
|
222
256
|
...(config !== undefined && { config }),
|
|
223
257
|
...(systemDb && { systemDb }),
|
|
@@ -226,18 +260,14 @@ function buildJobContext(scope, input) {
|
|
|
226
260
|
// workers can reach projections/jobs without the app author duplicating
|
|
227
261
|
// it into `context` (the JobContext contract guarantees `registry`).
|
|
228
262
|
registry: scope.registry,
|
|
229
|
-
// Expose the runner so handlers can chain a follow-up job. Symmetric with
|
|
230
|
-
// how the command-dispatcher hands write-handlers their jobRunner.
|
|
231
|
-
...(selfRunner !== undefined && { jobRunner: selfRunner }),
|
|
232
263
|
systemUser,
|
|
233
264
|
triggeredBy: triggeredById !== null ? { id: triggeredById, tenantId } : null,
|
|
234
265
|
attempt,
|
|
235
266
|
finalAttempt,
|
|
236
|
-
|
|
237
|
-
metricsFor: createMetricsForFactory(scope.context.meter),
|
|
267
|
+
obs: buildJobObservability(scope, jobLogger),
|
|
238
268
|
...(triggerName !== undefined && { triggerName }),
|
|
239
269
|
...(triggerEvent !== undefined && { triggerEvent }),
|
|
240
|
-
|
|
270
|
+
dispatch: dispatchFacets,
|
|
241
271
|
};
|
|
242
272
|
return { jobContext, config };
|
|
243
273
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="temporal-polyfill/global" preserve="true" />
|
|
2
|
-
import type { JobDeferral } from "
|
|
2
|
+
import type { JobDeferral } from "@cosmicdrift/kumiko-types/handlers";
|
|
3
3
|
import type { JobRun } from "./job-runner-context.ts";
|
|
4
4
|
import { type JobRunnerScope } from "./job-runner-scope.ts";
|
|
5
5
|
import type { JobInvocation } from "./job-runner-types.ts";
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/// <reference types="temporal-polyfill/global" preserve="true" />
|
|
2
2
|
import { UnrecoverableError } from "bullmq";
|
|
3
3
|
import { requestContext } from "../api/request-context.js";
|
|
4
|
+
import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
|
|
4
5
|
import { qnScope } from "../engine/qualified-name.js";
|
|
5
6
|
import { InternalError } from "../errors/index.js";
|
|
6
7
|
import { scrubLogText } from "../logging/index.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
8
|
+
import { withEscapeHatchAuditScope } from "../observability/escape-hatch-report.js";
|
|
9
|
+
import { emitJobLastSuccess } from "../observability/standard-metrics.js";
|
|
10
|
+
import { DEFAULT_MAX_DEFERS, HANDLER_DEFER_COUNT_KEY, hasDeferBudgetLeft, isJobDeferral, priorDeferCountOf, readTraceContext, resolveJobTz, tenantFailureMessageKey, } from "./job-runner-helpers.js";
|
|
9
11
|
import { laneForJob, logFailedAttempt } from "./job-runner-scope.js";
|
|
10
12
|
function buildOutcomeMeta(run, messageKey, unrecoverable = false) {
|
|
11
13
|
const { jobDef, subjects } = run;
|
|
@@ -48,7 +50,7 @@ async function runJobHandler(scope, run, correlation) {
|
|
|
48
50
|
}
|
|
49
51
|
function assertDeferBudget(run) {
|
|
50
52
|
const maxDefers = run.jobDef.maxDefers ?? DEFAULT_MAX_DEFERS;
|
|
51
|
-
if (
|
|
53
|
+
if (!hasDeferBudgetLeft(run.rawData, run.jobDef.maxDefers)) {
|
|
52
54
|
// The counter never resets, so a retry would hit the cap again.
|
|
53
55
|
throw new UnrecoverableError(`Job "${run.jobName}" was deferred ${maxDefers} times (maxDefers); giving up.`);
|
|
54
56
|
}
|
|
@@ -135,7 +137,7 @@ export async function executeJobInSpan(scope, run) {
|
|
|
135
137
|
: {}),
|
|
136
138
|
},
|
|
137
139
|
...(parentContext ? { parent: parentContext } : {}),
|
|
138
|
-
}, () => runAndRecordJob(scope, run, { requestId, correlationId })));
|
|
140
|
+
}, () => runInSystemRowLevelSecurityScope("job execution span reads job rows of every tenant", () => runAndRecordJob(scope, run, { requestId, correlationId }))));
|
|
139
141
|
}
|
|
140
142
|
export async function applyHandlerDeferral(scope, run, bullJob, deferral, token) {
|
|
141
143
|
if (!deferral || token === undefined || !bullJob.moveToDelayed)
|