@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
|
@@ -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,17 +6,20 @@ 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 {
|
|
15
|
+
import { createFailOpenReporter, respondRateLimited } from "../rate-limit/middleware.js";
|
|
12
16
|
import { listActionFormFileFields, mayUseActionForm } from "./action-form-upload.js";
|
|
13
17
|
import { buildContentDispositionHeader } from "./content-disposition.js";
|
|
14
18
|
import { DEFAULT_MAX_UPLOAD_SIZE, getFileRefExecutor, storeFileAsFileRef, } from "./create-file-ref.js";
|
|
15
19
|
import { createFileContext, createTenantFileContext } from "./file-handle.js";
|
|
16
20
|
import { fileRefEntity } from "./file-ref-entity.js";
|
|
17
21
|
import { fileRefsTable } from "./file-ref-table.js";
|
|
18
|
-
import { RecordWriteDecisions } from "./record-write-check.js";
|
|
22
|
+
import { isStoredRecordLocked, RecordWriteDecisions, } from "./record-write-check.js";
|
|
19
23
|
import { neutralFileNameForMimeType } from "./resolve-content-type.js";
|
|
20
24
|
import { parseMaxSize, resolveServedContentType } from "./types.js";
|
|
21
25
|
import { withUploadLedger } from "./upload-ledger.js";
|
|
@@ -31,6 +35,8 @@ const DEFAULT_PRIVILEGED_ROLES = ["Admin", "SystemAdmin"];
|
|
|
31
35
|
// credential (see "Signed-URL default expiry" in core-files.md).
|
|
32
36
|
const SIGNED_URL_DEFAULT_EXPIRY_SECONDS = 15 * 60;
|
|
33
37
|
const MAX_BATCH_META_IDS = 100;
|
|
38
|
+
const META_BATCH_IDS_PER_WINDOW = 1_000;
|
|
39
|
+
const META_BATCH_WINDOW_SECONDS = 60;
|
|
34
40
|
// Each detail() read decrypts through the KMS pool; a bounded chunk keeps one batch from hogging it.
|
|
35
41
|
const BATCH_META_CONCURRENCY = 10;
|
|
36
42
|
// Default guard: on attached files, allow the uploader or a privileged role,
|
|
@@ -101,7 +107,8 @@ export function readFilesRouteOptions(registry) {
|
|
|
101
107
|
return {};
|
|
102
108
|
}
|
|
103
109
|
export function createFileRoutes(options) {
|
|
104
|
-
const { db } = options;
|
|
110
|
+
const { db, metaBatchRateLimitResolver } = options;
|
|
111
|
+
const reportMetaBatchLimiterFailOpen = createFailOpenReporter("files-meta-batch");
|
|
105
112
|
// Plain resolvers (not built via withFileProviderResolver) get the ledger on the route's own root connection.
|
|
106
113
|
const resolveProvider = options.resolveProvider.uploadLedgerFor
|
|
107
114
|
? options.resolveProvider
|
|
@@ -112,6 +119,13 @@ export function createFileRoutes(options) {
|
|
|
112
119
|
const executor = getFileRefExecutor();
|
|
113
120
|
const piiSubjectFields = collectPiiSubjectFields(fileRefEntity);
|
|
114
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
|
+
});
|
|
115
129
|
const tenantDbFor = (tenantId) => createProjectingTenantDb(db, tenantId, options.registry);
|
|
116
130
|
const fileNameIsPersonal = piiSubjectFields.includes("fileName");
|
|
117
131
|
function kmsContextFor() {
|
|
@@ -205,6 +219,10 @@ export function createFileRoutes(options) {
|
|
|
205
219
|
}
|
|
206
220
|
const data = new Uint8Array(await file.arrayBuffer());
|
|
207
221
|
const files = createTenantFileContext(resolveProvider, user.tenantId);
|
|
222
|
+
const { registry } = options;
|
|
223
|
+
const isAttachTargetLocked = registry !== undefined && entityType !== undefined && entityId !== undefined
|
|
224
|
+
? (rowDb) => isStoredRecordLocked({ registry, db: rowDb, entityType, entityId })
|
|
225
|
+
: undefined;
|
|
208
226
|
const outcome = await storeFileAsFileRef({
|
|
209
227
|
user,
|
|
210
228
|
tenantDb: tenantDbFor(user.tenantId),
|
|
@@ -216,6 +234,7 @@ export function createFileRoutes(options) {
|
|
|
216
234
|
await files.ref(key).delete();
|
|
217
235
|
await files.forgetUploadBytes(key);
|
|
218
236
|
},
|
|
237
|
+
...(isAttachTargetLocked ? { isAttachTargetLocked } : {}),
|
|
219
238
|
}, {
|
|
220
239
|
fileName: file.name,
|
|
221
240
|
declaredMimeType: file.type,
|
|
@@ -227,6 +246,9 @@ export function createFileRoutes(options) {
|
|
|
227
246
|
});
|
|
228
247
|
if (outcome.kind === "rejected")
|
|
229
248
|
return c.json({ error: outcome.error }, 400);
|
|
249
|
+
if (outcome.kind === "target-locked") {
|
|
250
|
+
return c.json({ error: "record_locked: the record is locked" }, 409);
|
|
251
|
+
}
|
|
230
252
|
if (outcome.kind === "failed")
|
|
231
253
|
return c.json({ error: "upload_failed" }, 500);
|
|
232
254
|
return c.json(outcome.fileRef, 201);
|
|
@@ -240,6 +262,21 @@ export function createFileRoutes(options) {
|
|
|
240
262
|
const ids = [...new Set((c.req.query("ids") ?? "").split(",").filter((id) => isUuid(id)))];
|
|
241
263
|
if (ids.length > MAX_BATCH_META_IDS)
|
|
242
264
|
return c.json({ error: "too_many_ids" }, 400);
|
|
265
|
+
if (metaBatchRateLimitResolver && ids.length > 0) {
|
|
266
|
+
const bucket = `files-meta:${user.tenantId}:${user.id}`;
|
|
267
|
+
try {
|
|
268
|
+
const decision = await metaBatchRateLimitResolver.check(bucket, {
|
|
269
|
+
limit: META_BATCH_IDS_PER_WINDOW,
|
|
270
|
+
windowSeconds: META_BATCH_WINDOW_SECONDS,
|
|
271
|
+
cost: ids.length,
|
|
272
|
+
});
|
|
273
|
+
if (!decision.allowed)
|
|
274
|
+
return respondRateLimited(c, decision, bucket);
|
|
275
|
+
}
|
|
276
|
+
catch (e) {
|
|
277
|
+
reportMetaBatchLimiterFailOpen(e);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
243
280
|
const files = [];
|
|
244
281
|
for (let start = 0; start < ids.length; start += BATCH_META_CONCURRENCY) {
|
|
245
282
|
const chunk = ids.slice(start, start + BATCH_META_CONCURRENCY);
|
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,9 +53,10 @@ 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;
|
|
60
|
+
readonly now?: () => Temporal.Instant;
|
|
59
61
|
};
|
|
60
62
|
export declare function makeFileProviderResolver(deps: FileProviderResolverDeps): FileProviderResolver;
|
|
@@ -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,
|
|
@@ -119,5 +119,5 @@ export function makeFileProviderResolver(deps) {
|
|
|
119
119
|
cache.set(tenantId, built);
|
|
120
120
|
return built;
|
|
121
121
|
};
|
|
122
|
-
return deps.db ? withUploadLedger(resolveProvider, deps.db) : resolveProvider;
|
|
122
|
+
return deps.db ? withUploadLedger(resolveProvider, deps.db, deps.now) : resolveProvider;
|
|
123
123
|
}
|
|
@@ -20,3 +20,9 @@ export declare function createRecordWriteCheck(args: {
|
|
|
20
20
|
readonly canReadRecord: RecordReadCheck;
|
|
21
21
|
readonly tenantDbFor: (tenantId: TenantId) => TenantDb;
|
|
22
22
|
}): RecordWriteCheck;
|
|
23
|
+
export declare function isStoredRecordLocked(args: {
|
|
24
|
+
readonly registry: Registry;
|
|
25
|
+
readonly db: TenantDb;
|
|
26
|
+
readonly entityType: string;
|
|
27
|
+
readonly entityId: string;
|
|
28
|
+
}): Promise<boolean>;
|
|
@@ -62,3 +62,16 @@ export function createRecordWriteCheck(args) {
|
|
|
62
62
|
return RecordWriteDecisions.writable;
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
|
+
// The stored row, read through the given db so a transaction sees the lock state it commits against.
|
|
66
|
+
export async function isStoredRecordLocked(args) {
|
|
67
|
+
const { registry, db, entityType, entityId } = args;
|
|
68
|
+
const entity = registry.getEntity(entityType);
|
|
69
|
+
const table = findImplicitEntityTable(registry, entityType);
|
|
70
|
+
if (!entity || !table || entity.lockedWhen === undefined)
|
|
71
|
+
return false;
|
|
72
|
+
const row = await db.fetchOne(table, {
|
|
73
|
+
id: entityId,
|
|
74
|
+
...(entity.softDelete === true && { isDeleted: false }),
|
|
75
|
+
});
|
|
76
|
+
return row !== undefined && isRecordLocked(entity.lockedWhen, row);
|
|
77
|
+
}
|
|
@@ -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";
|
|
@@ -5,6 +5,6 @@ import type { TenantId } from "@cosmicdrift/kumiko-types/identifiers";
|
|
|
5
5
|
import type { DbConnection } from "../db/connection.ts";
|
|
6
6
|
import { type TenantDb } from "../db/tenant-db.ts";
|
|
7
7
|
export declare const fileUploadLedgerTable: WritableTable;
|
|
8
|
-
export declare function createFileUploadLedger(db: DbConnection | TenantDb, tenantId: TenantId): FileUploadLedger;
|
|
9
|
-
export declare function withUploadLedger(resolver: (tenantId: TenantId) => Promise<FileStorageProvider>, db: DbConnection | TenantDb): FileProviderResolver;
|
|
8
|
+
export declare function createFileUploadLedger(db: DbConnection | TenantDb, tenantId: TenantId, now?: () => Temporal.Instant): FileUploadLedger;
|
|
9
|
+
export declare function withUploadLedger(resolver: (tenantId: TenantId) => Promise<FileStorageProvider>, db: DbConnection | TenantDb, now?: () => Temporal.Instant): FileProviderResolver;
|
|
10
10
|
export declare function takeUploadLedgerEntry(txDb: TenantDb, storageKey: string): Promise<boolean>;
|
|
@@ -21,7 +21,7 @@ function isTenantDb(db) {
|
|
|
21
21
|
}
|
|
22
22
|
// The ledger writes on a connection of its own, never on a handler transaction: a rollback of the
|
|
23
23
|
// handler must not take the row with it, or the bytes it uploaded would be unfindable.
|
|
24
|
-
export function createFileUploadLedger(db, tenantId) {
|
|
24
|
+
export function createFileUploadLedger(db, tenantId, now = () => Temporal.Now.instant()) {
|
|
25
25
|
const runner = isTenantDb(db) ? tenantDbRunner(db) : db;
|
|
26
26
|
if (!runnerCanBeginTransaction(runner)) {
|
|
27
27
|
throw new InternalError({
|
|
@@ -34,7 +34,7 @@ export function createFileUploadLedger(db, tenantId) {
|
|
|
34
34
|
await ledgerDb.insertOne(fileUploadLedgerTable, {
|
|
35
35
|
storageKey,
|
|
36
36
|
tenantId,
|
|
37
|
-
createdAt:
|
|
37
|
+
createdAt: now(),
|
|
38
38
|
});
|
|
39
39
|
},
|
|
40
40
|
forget: async (storageKey) => {
|
|
@@ -42,9 +42,9 @@ export function createFileUploadLedger(db, tenantId) {
|
|
|
42
42
|
},
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
-
export function withUploadLedger(resolver, db) {
|
|
45
|
+
export function withUploadLedger(resolver, db, now) {
|
|
46
46
|
return Object.assign(resolver, {
|
|
47
|
-
uploadLedgerFor: (tenantId) => createFileUploadLedger(db, tenantId),
|
|
47
|
+
uploadLedgerFor: (tenantId) => createFileUploadLedger(db, tenantId, now),
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
// Runs inside the transaction that creates the fileRef row. False means no ledger row was left to
|
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). */
|
|
@@ -199,8 +199,9 @@ function pushRelatedListSectionKeys(out, section) {
|
|
|
199
199
|
}
|
|
200
200
|
for (const action of section.rowActions ?? [])
|
|
201
201
|
pushRowActionKeys(out, action);
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
const grouping = section.table?.grouping;
|
|
203
|
+
pushKey(out, grouping?.label);
|
|
204
|
+
for (const label of Object.values(grouping?.labels ?? {}))
|
|
204
205
|
pushKey(out, label);
|
|
205
206
|
}
|
|
206
207
|
function pushListEmptyStateKeys(out, emptyState) {
|
|
@@ -237,6 +238,8 @@ function pushListChromeKeys(out, list) {
|
|
|
237
238
|
pushRowActionKeys(out, action);
|
|
238
239
|
for (const action of list.toolbarActions ?? [])
|
|
239
240
|
pushToolbarActionKeys(out, action);
|
|
241
|
+
for (const bulk of list.bulkActions ?? [])
|
|
242
|
+
pushKey(out, bulk.confirm);
|
|
240
243
|
}
|
|
241
244
|
function collectEntityListKeys(ctx, list) {
|
|
242
245
|
for (const col of list.columns) {
|
|
@@ -372,6 +375,8 @@ function collectProjectionDetailKeys(ctx, detail) {
|
|
|
372
375
|
}
|
|
373
376
|
if (section.kind === "relatedList") {
|
|
374
377
|
pushRelatedListSectionKeys(ctx.out, section);
|
|
378
|
+
for (const bulk of section.bulkActions ?? [])
|
|
379
|
+
pushKey(ctx.out, bulk.confirm);
|
|
375
380
|
continue;
|
|
376
381
|
}
|
|
377
382
|
if (isWriteFormEditSection(section)) {
|
|
@@ -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,15 +4,19 @@ 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);
|
|
17
|
-
throw new Error("withExecutorManagedWritesForTests: expected a TenantDb or a
|
|
21
|
+
throw new Error("withExecutorManagedWritesForTests: expected a TenantDb or a Bun.SQL runner");
|
|
18
22
|
}
|
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 = {
|