@cosmicdrift/kumiko-framework 0.388.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 +12 -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/golden-path.md +13 -1
- 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 +55 -2
- package/agents/examples/list-table-options.md +466 -0
- package/agents/examples/managed-config.md +4 -4
- package/agents/examples/managed-pages.md +1 -1
- package/agents/examples/pdf-audit-export.md +4 -2
- 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 +5 -4
- package/agents/examples/tenant-isolation.md +73 -1
- 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 +5 -4
- package/agents/features.md +1 -1
- package/agents/widgets.md +1 -0
- package/dist/api/api-constants.d.ts +1 -0
- package/dist/api/api-constants.js +2 -0
- package/dist/api/auth-middleware.js +1 -1
- package/dist/api/auth-routes-invite.js +2 -1
- package/dist/api/auth-routes-shared.d.ts +2 -0
- package/dist/api/auth-routes-shared.js +5 -0
- package/dist/api/client-error-route.js +2 -3
- package/dist/api/entity-read-access.d.ts +4 -1
- package/dist/api/entity-read-access.js +14 -0
- package/dist/api/export/export-cells-reference.d.ts +9 -0
- package/dist/api/export/export-cells-reference.js +21 -0
- package/dist/api/export/export-cells.d.ts +11 -0
- package/dist/api/export/export-cells.js +136 -0
- package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
- package/dist/api/export/export-ciphertext-guard.js +27 -0
- package/dist/api/export/export-columns.d.ts +31 -0
- package/dist/api/export/export-columns.js +85 -0
- package/dist/api/export/export-errors.d.ts +4 -0
- package/dist/api/export/export-errors.js +14 -0
- package/dist/api/export/export-route.d.ts +4 -0
- package/dist/api/export/export-route.js +75 -0
- package/dist/api/export/export-rows.d.ts +13 -0
- package/dist/api/export/export-rows.js +62 -0
- package/dist/api/export/export-screen.d.ts +13 -0
- package/dist/api/export/export-screen.js +47 -0
- package/dist/api/export/export-xlsx-writer.d.ts +4 -0
- package/dist/api/export/export-xlsx-writer.js +21 -0
- package/dist/api/extra-route.d.ts +7 -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/pii-leak-guard.d.ts +3 -0
- package/dist/api/pii-leak-guard.js +3 -2
- 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.d.ts +16 -0
- package/dist/api/routes.js +9 -5
- 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 +5 -1
- package/dist/api/server-middleware.js +3 -1
- package/dist/api/server-routes.d.ts +3 -2
- package/dist/api/server-routes.js +8 -2
- package/dist/api/server-wiring.js +8 -4
- package/dist/api/server.d.ts +2 -1
- package/dist/api/sse-route.d.ts +3 -1
- package/dist/api/sse-route.js +11 -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 +11 -9
- 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.d.ts +1 -0
- package/dist/crypto/pg-kms-adapter.js +17 -18
- package/dist/db/aggregate-sql.d.ts +2 -0
- package/dist/db/aggregate-sql.js +10 -0
- 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/closed-connection.js +12 -19
- 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 +7 -6
- package/dist/db/connection.js +43 -24
- 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-row-coercion.js +4 -4
- package/dist/db/driver-value-preparation.js +6 -4
- 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-aggregate-currencies.d.ts +17 -0
- package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
- package/dist/db/event-store-executor-read-aggregate.js +36 -5
- package/dist/db/event-store-executor-read-filter.d.ts +1 -1
- package/dist/db/event-store-executor-read-filter.js +6 -3
- 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.d.ts +4 -0
- package/dist/db/event-store-executor-write-atomic.js +42 -0
- package/dist/db/event-store-executor-write-steps.d.ts +3 -5
- package/dist/db/event-store-executor-write-steps.js +0 -5
- package/dist/db/event-store-executor-write.js +22 -19
- package/dist/db/event-store-executor.d.ts +1 -1
- package/dist/db/event-store-executor.js +2 -1
- package/dist/db/executor-managed-tables.d.ts +7 -1
- package/dist/db/executor-managed-tables.js +12 -3
- 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 +7 -3
- 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 +37 -21
- package/dist/db/queries/backfill-pii.js +3 -6
- package/dist/db/queries/database-now.js +2 -1
- 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 +11 -28
- package/dist/db/queries/test-stack.d.ts +4 -1
- package/dist/db/queries/test-stack.js +83 -2
- package/dist/db/query.d.ts +14 -0
- package/dist/db/query.js +77 -48
- package/dist/db/reference-data.d.ts +1 -1
- package/dist/db/reference-data.js +20 -3
- 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/statement-timeout.js +2 -1
- 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-upsert.d.ts +5 -0
- package/dist/db/tenant-db-upsert.js +91 -0
- package/dist/db/tenant-db.d.ts +17 -12
- package/dist/db/tenant-db.js +60 -121
- 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/bundled-lists-table.d.ts +2 -0
- package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
- 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 +3 -0
- package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
- package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
- package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
- package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
- package/dist/engine/boot-validator/list-column-layout.js +41 -0
- package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
- package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
- package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
- package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
- package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
- package/dist/engine/boot-validator/list-table-export-options.js +27 -0
- package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
- package/dist/engine/boot-validator/list-table-options.js +77 -0
- package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
- package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
- 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/projection-list-screens.js +3 -13
- package/dist/engine/boot-validator/query-refs.d.ts +2 -1
- package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
- package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
- package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
- package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
- package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
- package/dist/engine/boot-validator/screens-lists.js +12 -2
- 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/build-app-schema.d.ts +2 -1
- package/dist/engine/build-app-schema.js +9 -1
- package/dist/engine/build-config-feature-schema.js +6 -1
- 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 +5 -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 +9 -1
- package/dist/engine/feature-builder-state.js +1 -0
- 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.d.ts +1 -0
- package/dist/engine/feature-manifest.js +2 -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 +3 -1
- package/dist/engine/field-access.js +12 -0
- package/dist/engine/handler-field-references.d.ts +0 -4
- package/dist/engine/index.d.ts +58 -55
- package/dist/engine/index.js +23 -28
- 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 +2 -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/strip-disabled-features-from-app-schema.js +7 -3
- package/dist/engine/template-variables.d.ts +2 -1
- package/dist/engine/transfer-adjacency.d.ts +1 -1
- package/dist/engine/types/feature.d.ts +1 -0
- package/dist/engine/types/index.d.ts +8 -30
- package/dist/engine/types/index.js +2 -10
- package/dist/engine/types/screen.d.ts +1 -1
- package/dist/engine/types/screen.js +1 -1
- package/dist/engine/validation.d.ts +2 -1
- package/dist/entrypoint/index.d.ts +9 -35
- package/dist/entrypoint/index.js +10 -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.d.ts +1 -0
- package/dist/event-store/event-store.js +42 -32
- 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/provenance-append.js +1 -1
- 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 +6 -3
- package/dist/files/create-file-ref.d.ts +6 -2
- package/dist/files/create-file-ref.js +13 -4
- 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 +3 -1
- package/dist/files/file-routes.js +41 -4
- 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 +6 -4
- package/dist/files/provider-resolver.js +5 -5
- package/dist/files/record-write-check.d.ts +6 -0
- package/dist/files/record-write-check.js +13 -0
- 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/files/upload-ledger.d.ts +2 -2
- package/dist/files/upload-ledger.js +4 -4
- 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/i18n/required-surface-keys.js +7 -2
- 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 +10 -6
- 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-scope.js +6 -6
- package/dist/jobs/job-runner-types.d.ts +2 -1
- package/dist/jobs/job-runner.js +22 -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/escape-hatch-report.js +9 -2
- 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/after-rollback-sink.d.ts +6 -0
- package/dist/pipeline/after-rollback-sink.js +32 -0
- 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 +39 -19
- 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 -194
- 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 +7 -3
- package/dist/pipeline/event-dispatcher.d.ts +3 -2
- package/dist/pipeline/event-dispatcher.js +13 -12
- 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 +14 -6
- package/dist/pipeline/handler-context-dispatch.js +18 -5
- package/dist/pipeline/handler-context-events.d.ts +22 -38
- package/dist/pipeline/handler-context-events.js +42 -35
- 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 +6 -2
- package/dist/pipeline/system-hooks.js +61 -10
- 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/pipeline/write-result-masking.js +13 -10
- 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 +107 -91
- 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 -0
- package/dist/upgrade-changelog.js +18 -0
- package/dist/upgrade-cli-internals.d.ts +8 -0
- package/dist/upgrade-cli-internals.js +63 -0
- package/dist/upgrade-cli.d.ts +1 -18
- package/dist/upgrade-cli.js +29 -137
- package/dist/upgrade-marker-parse.d.ts +32 -0
- package/dist/upgrade-marker-parse.js +73 -0
- 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 +27 -20
- package/src/changes.json +451 -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 -10
- package/dist/engine/feature-ast/extractors/round1.js +0 -81
- 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 -483
- package/dist/engine/feature-ast/patch.d.ts +0 -210
- package/dist/engine/feature-ast/patch.js +0 -610
- 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 -1476
- package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
- package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
- package/dist/engine/feature-ast/patterns.d.ts +0 -318
- package/dist/engine/feature-ast/patterns.js +0 -106
- package/dist/engine/feature-ast/render.d.ts +0 -47
- package/dist/engine/feature-ast/render.js +0 -662
- 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 -93
- 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 -20
- package/dist/engine/pattern-library/static-schemas.js +0 -478
- package/dist/engine/pattern-library/types.d.ts +0 -158
- package/dist/engine/pattern-library/types.js +0 -36
- package/dist/engine/provider-plugin-context.d.ts +0 -3
- package/dist/engine/provider-plugin-context.js +0 -28
- 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
|
@@ -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)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="temporal-polyfill/global" preserve="true" />
|
|
2
|
-
import type { JobDefinition } from "
|
|
2
|
+
import type { JobDefinition } from "@cosmicdrift/kumiko-types/config";
|
|
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,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="temporal-polyfill/global" preserve="true" />
|
|
2
1
|
import { prepareJobRun } from "./job-runner-context.js";
|
|
3
2
|
import { attemptNumberOf, buildRetryBullOpts, DEFER_COUNT_KEY, deferDelayMs, isFinalAttempt, priorAttemptsOf, priorDeferCountOf, } from "./job-runner-helpers.js";
|
|
4
3
|
import { ACTIVE_TENANT_IDS_QUERY_NAME, perTenantChildJobId } from "./job-runner-schedulers.js";
|
|
@@ -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 = {
|
|
@@ -13,21 +13,21 @@ export function laneForJob(def) {
|
|
|
13
13
|
// lane (jobDef.runIn is static), but walking both is cheap and avoids
|
|
14
14
|
// a subtle bug if someone ever reassigns a job to a different lane
|
|
15
15
|
// between deploys while old queue contents are still draining.
|
|
16
|
+
// One getJobs per queue reads the requested lists in a single Lua script, so a job
|
|
17
|
+
// moving from waiting to active between two separate reads can no longer vanish
|
|
18
|
+
// from the count; that gap let a third dispatch pass the cap in CI.
|
|
16
19
|
// `activeOnly` + `self` serve the defer check, which runs inside the job being
|
|
17
20
|
// counted: it must not see waiting jobs or itself, and only counts jobs that
|
|
18
21
|
// became active before it. Without that order, workers that fetch a burst of
|
|
19
22
|
// jobs together all see each other as active and all defer, again and again.
|
|
20
23
|
export async function isOverPerTenantLimit(scope, jobName, tenantId, max, countFilter = {}) {
|
|
21
24
|
const { queues } = scope;
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
queues.worker.getActive(),
|
|
25
|
-
...(countFilter.activeOnly ? [] : [queues.api.getWaiting(), queues.worker.getWaiting()]),
|
|
26
|
-
]);
|
|
25
|
+
const types = countFilter.activeOnly ? ["active"] : ["active", "waiting"];
|
|
26
|
+
const results = await Promise.all([queues.api.getJobs(types), queues.worker.getJobs(types)]);
|
|
27
27
|
let count = 0;
|
|
28
28
|
for (const list of results) {
|
|
29
29
|
for (const j of list) {
|
|
30
|
-
if (j.name !== jobName)
|
|
30
|
+
if (j === undefined || j.name !== jobName)
|
|
31
31
|
continue;
|
|
32
32
|
if (countFilter.self && !isActiveBefore(j, countFilter.self))
|
|
33
33
|
continue;
|
|
@@ -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);
|
|
@@ -264,6 +276,9 @@ export function createJobRunner(options) {
|
|
|
264
276
|
// a hanging process instead of a non-zero exit.
|
|
265
277
|
await worker?.close();
|
|
266
278
|
worker = null;
|
|
279
|
+
// A failed start() may never be followed by stop(); the abandoned gate must not keep
|
|
280
|
+
// writing to DB/Redis while the process shuts down.
|
|
281
|
+
await settleAbandonedBootGates(Math.min(bootRedisTimeoutMs, STOP_QUEUE_READY_TIMEOUT_MS));
|
|
267
282
|
throw err;
|
|
268
283
|
}
|
|
269
284
|
finally {
|
|
@@ -343,6 +358,7 @@ export function createJobRunner(options) {
|
|
|
343
358
|
}
|
|
344
359
|
const runnerApi = {
|
|
345
360
|
async start() {
|
|
361
|
+
assertNoActiveRowLevelSecurityScope("JobRunner worker");
|
|
346
362
|
// skip: enqueuer-only runner — no BullMQ worker, no cron schedules,
|
|
347
363
|
// no boot jobs. The API-process (runLocalJobs=false) lands here; it
|
|
348
364
|
// still holds the queue-clients so dispatch()/handleEvent() can
|
|
@@ -572,7 +588,7 @@ export function createJobRunner(options) {
|
|
|
572
588
|
data[TRACE_CONTEXT_KEY] = traceCtx;
|
|
573
589
|
// Propagate correlation from the scheduling request into the job
|
|
574
590
|
// execution context. The worker re-enters requestContext.run with
|
|
575
|
-
// this value so ctx.
|
|
591
|
+
// this value so ctx.events.append / executor writes during the job
|
|
576
592
|
// stamp the same correlation as the HTTP request that scheduled it.
|
|
577
593
|
const reqCtx = requestContext.get();
|
|
578
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";
|
|
@@ -40,6 +40,12 @@ const READ_WINDOW_KINDS = new Set([
|
|
|
40
40
|
// A long-lived worker must leave an audit event inside every retention window
|
|
41
41
|
// (90 days), or its crons vanish from the log once the first event is pruned.
|
|
42
42
|
const PROCESS_REAUDIT_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
43
|
+
// Declared escape hatches of system crons are audited once per day and process for each
|
|
44
|
+
// (handler, kind, tenant, target): the declaration, the system actor and the reason are
|
|
45
|
+
// identical on every run, so repeats carry no information. The target is part of the
|
|
46
|
+
// key only where it names a table (one run can write several global tables); a row target
|
|
47
|
+
// would add a key and an audit event per touched foreign row.
|
|
48
|
+
const TABLE_TARGET_KINDS = new Set(["global-write"]);
|
|
43
49
|
// Row-level targets add a key per touched row; without a sweep a long-lived worker keeps them all.
|
|
44
50
|
function sweepExpiredProcessDedup(dedup, nowMs) {
|
|
45
51
|
if (nowMs - dedup.lastSweep.atMs >= PROCESS_REAUDIT_INTERVAL_MS) {
|
|
@@ -157,12 +163,13 @@ export function createEscapeHatchReporter(opts) {
|
|
|
157
163
|
emitEscapeHatchUse(opts.meter, opts.handler, kind);
|
|
158
164
|
const { processDedup } = opts;
|
|
159
165
|
if (processDedup?.kinds.has(kind)) {
|
|
166
|
+
const keyTarget = TABLE_TARGET_KINDS.has(kind) ? target : undefined;
|
|
160
167
|
const processKey = JSON.stringify([
|
|
161
168
|
opts.handler,
|
|
162
169
|
kind,
|
|
163
170
|
opts.tenantId,
|
|
164
|
-
|
|
165
|
-
|
|
171
|
+
keyTarget?.id ?? null,
|
|
172
|
+
keyTarget?.tenantId ?? null,
|
|
166
173
|
]);
|
|
167
174
|
const nowMs = now();
|
|
168
175
|
const lastAuditedAt = processDedup.lastAuditedAt.get(processKey);
|
|
@@ -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, "_");
|