@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,6 +1,9 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { assertRowLevelSecurityTableState, createDbConnection, generateMigration, } from "../db/index.js";
|
|
4
|
+
import { knownTablesOf } from "../db/known-table-names.js";
|
|
5
|
+
import { readMigrationSqlTexts } from "../db/migrate-runner.js";
|
|
6
|
+
import { diffReplayAgainstSnapshot, replayMigrationsDir } from "../db/replay-migration-sql.js";
|
|
4
7
|
import { validateBoot } from "../engine/boot-validator.js";
|
|
5
8
|
import { describeThrown, loadPreviousSnapshot, loadSchemaModOrReport, nextSequenceNumber, SNAPSHOT_FILENAME, } from "./shared.js";
|
|
6
9
|
import { featureDefinitionsOf, parseValidateBootOptions, withFileStoragePresence, } from "./validate-boot-input.js";
|
|
@@ -9,6 +12,7 @@ function checkSchemaDrift(ctx, schemaMod, prevSnapshot) {
|
|
|
9
12
|
const { out, migrationsDir } = ctx;
|
|
10
13
|
const drift = generateMigration({
|
|
11
14
|
metas: schemaMod.entityMetas,
|
|
15
|
+
rowLevelSecurity: schemaMod.rowLevelSecurity,
|
|
12
16
|
prevSnapshot,
|
|
13
17
|
name: "validate",
|
|
14
18
|
sequenceNumber: nextSequenceNumber(migrationsDir),
|
|
@@ -19,13 +23,14 @@ function checkSchemaDrift(ctx, schemaMod, prevSnapshot) {
|
|
|
19
23
|
...drift.diff.changedTables.map((t) => t.tableName),
|
|
20
24
|
...drift.diff.droppedTables,
|
|
21
25
|
...drift.retiredDrops.map((t) => t.tableName),
|
|
26
|
+
...drift.rowLevelSecurityChanges.map((c) => c.tableName),
|
|
22
27
|
];
|
|
23
28
|
if (pendingTables.length === 0) {
|
|
24
29
|
out.log(" ✓ schema: migrations match the entity definitions");
|
|
25
30
|
return true;
|
|
26
31
|
}
|
|
27
32
|
out.err(" ✗ schema drift: entity definitions are ahead of kumiko/migrations.");
|
|
28
|
-
out.err(` pending — new: ${drift.diff.newTables.length}, changed: ${drift.diff.changedTables.length}, dropped: ${drift.diff.droppedTables.length}`);
|
|
33
|
+
out.err(` pending — new: ${drift.diff.newTables.length}, changed: ${drift.diff.changedTables.length}, dropped: ${drift.diff.droppedTables.length}, row level security: ${drift.rowLevelSecurityChanges.length}`);
|
|
29
34
|
out.err(` tables: ${pendingTables.join(", ")}`);
|
|
30
35
|
out.err(" Fix: `kumiko-schema generate <name>`, then commit the migration.");
|
|
31
36
|
return false;
|
|
@@ -57,6 +62,46 @@ function checkBootValidity(out, schemaMod) {
|
|
|
57
62
|
return false;
|
|
58
63
|
}
|
|
59
64
|
}
|
|
65
|
+
// 4. Live row-level security table state — the table half of the boot check. Only with a DATABASE_URL;
|
|
66
|
+
// without one the command stays database-free.
|
|
67
|
+
async function checkLiveRowLevelSecurity(out, schemaMod) {
|
|
68
|
+
const dbUrl = process.env["DATABASE_URL"];
|
|
69
|
+
if (!dbUrl) {
|
|
70
|
+
out.log(" · row-level security: skipped — set DATABASE_URL to check the live database.");
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
let features;
|
|
74
|
+
try {
|
|
75
|
+
features = featureDefinitionsOf(schemaMod.features);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// skip: the boot check already reported the unreadable FEATURES export
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const knownTables = features === undefined ? { has: () => true } : knownTablesOf(features);
|
|
82
|
+
const { db, close } = createDbConnection({
|
|
83
|
+
url: dbUrl,
|
|
84
|
+
maxConnections: 1,
|
|
85
|
+
rowLevelSecurity: schemaMod.rowLevelSecurity,
|
|
86
|
+
});
|
|
87
|
+
try {
|
|
88
|
+
await assertRowLevelSecurityTableState(db, schemaMod.rowLevelSecurity, knownTables);
|
|
89
|
+
out.log(" ✓ row-level security: live database matches the configured mode");
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
out.err(` ✗ row-level security: ${describeThrown(e)}`);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
try {
|
|
98
|
+
await close();
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// The check result is already reported; a failing close must not hide it.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
60
105
|
function reportMigrationContentMismatches(out, mismatches) {
|
|
61
106
|
out.err(" ✗ migration-content drift: committed *.sql files don't produce .snapshot.json.");
|
|
62
107
|
for (const m of mismatches) {
|
|
@@ -72,7 +117,7 @@ function reportMigrationContentMismatches(out, mismatches) {
|
|
|
72
117
|
"job-run-log store table for the pattern.");
|
|
73
118
|
}
|
|
74
119
|
if (mismatches.some((m) => m.kind !== "unexpected-table")) {
|
|
75
|
-
out.err(" Fix (missing-table/column-drift): a migration file's body doesn't match " +
|
|
120
|
+
out.err(" Fix (missing-table/column-drift/row-level-security-drift): a migration file's body doesn't match " +
|
|
76
121
|
"what it (or the snapshot) claims — hand-fix the file, or ship a corrective " +
|
|
77
122
|
"migration if it's already applied in prod.");
|
|
78
123
|
}
|
|
@@ -117,6 +162,8 @@ function checkMigrationContentDrift(ctx, prevSnapshot) {
|
|
|
117
162
|
// Layer 1 alone misses this: it only compares ENTITY_METAS to the
|
|
118
163
|
// snapshot, never the snapshot to the SQL that's supposed to have
|
|
119
164
|
// produced it.
|
|
165
|
+
// 4. live row-level security (only with DATABASE_URL): the boot's
|
|
166
|
+
// table-state check against the real database (not the role: that is a boot-time property).
|
|
120
167
|
// The DB-level gate (assertKumikoSchemaCurrent) stays at boot/deploy.
|
|
121
168
|
export async function runValidateCommand(ctx) {
|
|
122
169
|
const schemaMod = await loadSchemaModOrReport(ctx);
|
|
@@ -126,5 +173,6 @@ export async function runValidateCommand(ctx) {
|
|
|
126
173
|
const schemaOk = checkSchemaDrift(ctx, schemaMod, prevSnapshot);
|
|
127
174
|
const bootOk = checkBootValidity(ctx.out, schemaMod);
|
|
128
175
|
const migrationsOk = checkMigrationContentDrift(ctx, prevSnapshot);
|
|
129
|
-
|
|
176
|
+
const rowLevelSecurityOk = await checkLiveRowLevelSecurity(ctx.out, schemaMod);
|
|
177
|
+
return schemaOk && bootOk && migrationsOk && rowLevelSecurityOk ? 0 : 1;
|
|
130
178
|
}
|
package/dist/schema-cli.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { RunSchemaCliOptions, SchemaCliOut } from "./schema-cli/shared.ts";
|
|
2
|
-
export type { RunSchemaCliOptions, SchemaCliOut } from "./schema-cli/shared.ts";
|
|
3
2
|
/**
|
|
4
3
|
* Runs a schema-CLI subcommand. `appCwd` is the app workspace root (where
|
|
5
4
|
* `kumiko/schema.ts` + `kumiko/migrations/` live). Returns a process exit code.
|
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
import type { Registry
|
|
2
|
-
import type { SearchAdapter } from "./types.ts";
|
|
1
|
+
import type { Registry } from "../engine/types/index.ts";
|
|
3
2
|
export declare function collectSearchableFieldNames(registry: Registry): readonly string[];
|
|
4
|
-
export declare function configureTenantSearchIndex(searchAdapter: SearchAdapter, registry: Registry, tenantId: TenantId): Promise<void>;
|
|
@@ -2,7 +2,3 @@ import { deriveSearchAdapterConfig } from "./derive-search-adapter-config.js";
|
|
|
2
2
|
export function collectSearchableFieldNames(registry) {
|
|
3
3
|
return deriveSearchAdapterConfig(registry)?.searchableFields ?? [];
|
|
4
4
|
}
|
|
5
|
-
export async function configureTenantSearchIndex(searchAdapter, registry, tenantId) {
|
|
6
|
-
const fields = collectSearchableFieldNames(registry);
|
|
7
|
-
await searchAdapter.configure(tenantId, { searchableFields: fields, rankingFields: fields });
|
|
8
|
-
}
|
package/dist/search/index.d.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
export { collectSearchableFieldNames, configureTenantSearchIndex, } from "./configure-tenant-index.ts";
|
|
2
|
-
export { deriveSearchAdapterConfig } from "./derive-search-adapter-config.ts";
|
|
3
1
|
export { createInMemorySearchAdapter } from "./in-memory-adapter.ts";
|
|
4
2
|
export { purgeSearchDocumentsForSubject } from "./purge-subject.ts";
|
|
5
|
-
export type { ReindexEntityFailure, ReindexEntityOptions, ReindexEntityResult, } from "./reindex-entity.ts";
|
|
6
3
|
export { reindexEntity } from "./reindex-entity.ts";
|
|
7
|
-
export type { SearchAdapter, SearchAdapterConfig,
|
|
4
|
+
export type { SearchAdapter, SearchAdapterConfig, } from "./types.ts";
|
package/dist/search/index.js
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
// `@cosmicdrift/kumiko-framework/search/meilisearch`. This keeps the main barrel from loading a
|
|
3
3
|
// Meilisearch client when consumers only use SearchAdapter types, so apps that do not use
|
|
4
4
|
// Meilisearch do not pull in the client code.
|
|
5
|
-
export { collectSearchableFieldNames, configureTenantSearchIndex, } from "./configure-tenant-index.js";
|
|
6
|
-
export { deriveSearchAdapterConfig } from "./derive-search-adapter-config.js";
|
|
7
5
|
export { createInMemorySearchAdapter } from "./in-memory-adapter.js";
|
|
8
6
|
export { purgeSearchDocumentsForSubject } from "./purge-subject.js";
|
|
9
7
|
export { reindexEntity } from "./reindex-entity.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EntityId, TenantId } from "../engine/types/identifiers.ts";
|
|
2
|
+
export type MeilisearchAdapterOptions = {
|
|
3
|
+
url: string;
|
|
4
|
+
apiKey: string;
|
|
5
|
+
indexPrefix?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function meilisearchTenantIndex(prefix: string, tenantId: TenantId): string;
|
|
8
|
+
export declare function meilisearchDocId(entityType: string, entityId: EntityId): string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Exported for unit tests (index-name / primary-key shape) without a live Meili.
|
|
2
|
+
export function meilisearchTenantIndex(prefix, tenantId) {
|
|
3
|
+
return `${prefix}t${tenantId}`;
|
|
4
|
+
}
|
|
5
|
+
// Meilisearch primary-key-ids: alphanumerics, `-`, `_`. UUIDs contain `-` —
|
|
6
|
+
// legal. Replace anything else just in case callers pass unexpected shapes.
|
|
7
|
+
export function meilisearchDocId(entityType, entityId) {
|
|
8
|
+
return `${entityType}_${String(entityId).replace(/[^0-9A-Za-z_-]/g, "_")}`;
|
|
9
|
+
}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type MeilisearchAdapterOptions } from "./meilisearch-adapter-internals.ts";
|
|
2
2
|
import type { SearchAdapter } from "./types.ts";
|
|
3
|
-
export type MeilisearchAdapterOptions = {
|
|
4
|
-
url: string;
|
|
5
|
-
apiKey: string;
|
|
6
|
-
indexPrefix?: string;
|
|
7
|
-
};
|
|
8
|
-
export declare function meilisearchTenantIndex(prefix: string, tenantId: TenantId): string;
|
|
9
|
-
export declare function meilisearchDocId(entityType: string, entityId: EntityId): string;
|
|
10
3
|
export declare function createMeilisearchAdapter(options: MeilisearchAdapterOptions): SearchAdapter;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { errorCodeOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
2
|
-
import {
|
|
2
|
+
import { importOptionalPeer } from "../utils/import-optional-peer.js";
|
|
3
|
+
import { meilisearchDocId, meilisearchTenantIndex, } from "./meilisearch-adapter-internals.js";
|
|
4
|
+
import { MEILISEARCH_PEER } from "./meilisearch-peer.js";
|
|
5
|
+
// meilisearch is an optional peer; a static import would fail with the runtime's bare
|
|
6
|
+
// "Cannot find package" error instead of naming the peer and how to install it.
|
|
7
|
+
const { ErrorStatusCode, Meilisearch } = await importOptionalPeer(MEILISEARCH_PEER, () => import("meilisearch"));
|
|
3
8
|
// meilisearch's waitTask() RESOLVES (never rejects) once the server task
|
|
4
9
|
// reaches a terminal state, even "failed" — a rejected doc (e.g. an id over
|
|
5
10
|
// Meili's 511-byte limit) otherwise fails silently and the caller thinks
|
|
@@ -50,14 +55,8 @@ function isIndexNotFound(err) {
|
|
|
50
55
|
return errorCodeOf(cause) === ErrorStatusCode.INDEX_NOT_FOUND;
|
|
51
56
|
}
|
|
52
57
|
// Exported for unit tests (index-name / primary-key shape) without a live Meili.
|
|
53
|
-
export function meilisearchTenantIndex(prefix, tenantId) {
|
|
54
|
-
return `${prefix}t${tenantId}`;
|
|
55
|
-
}
|
|
56
58
|
// Meilisearch primary-key-ids: alphanumerics, `-`, `_`. UUIDs contain `-` —
|
|
57
59
|
// legal. Replace anything else just in case callers pass unexpected shapes.
|
|
58
|
-
export function meilisearchDocId(entityType, entityId) {
|
|
59
|
-
return `${entityType}_${String(entityId).replace(/[^0-9A-Za-z_-]/g, "_")}`;
|
|
60
|
-
}
|
|
61
60
|
export function createMeilisearchAdapter(options) {
|
|
62
61
|
const client = new Meilisearch({ host: options.url, apiKey: options.apiKey });
|
|
63
62
|
const prefix = options.indexPrefix ?? "kumiko_";
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
// existing row and indexes it, same as a live write would.
|
|
7
7
|
import { resolveTableName } from "../db/entity-table-meta.js";
|
|
8
8
|
import { executeRawQueryRead } from "../db/queries/raw-sql.js";
|
|
9
|
-
import {
|
|
9
|
+
import { runInNewTransaction, runnerCanBeginTransaction } from "../db/query.js";
|
|
10
|
+
import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
|
|
10
11
|
import { buildSearchDocument, decryptSearchableSubjectFields, hasErasedSearchableSubjectField, } from "../pipeline/system-hooks.js";
|
|
11
12
|
import { toSnakeCase } from "../utils/case.js";
|
|
12
13
|
function quoteIdent(name) {
|
|
@@ -26,111 +27,126 @@ function rowToState(row, fieldNames) {
|
|
|
26
27
|
}
|
|
27
28
|
return state;
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (!
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
const searchableFields = registry.getSearchableFields(entityName);
|
|
38
|
-
const extensions = registry.getSearchPayloadExtensions(entityName);
|
|
39
|
-
if (searchableFields.length === 0 && extensions.length === 0) {
|
|
40
|
-
throw new Error(`reindexEntity: entity "${entityName}" has no searchable fields and no search-payload ` +
|
|
41
|
-
`extensions — nothing to index.`);
|
|
30
|
+
// Server pools cap statement_timeout, and a batch scan over a large table can outlast it. The caller's
|
|
31
|
+
// runner (often a gated proxy around the pool) is used as is, so the cap is lifted per batch
|
|
32
|
+
// with a transaction-local set_config instead of moving the scan to an ungated sibling pool. A runner already inside a
|
|
33
|
+
// transaction keeps the caller's setting rather than leaking ours into its remaining statements.
|
|
34
|
+
async function readBatchWithoutStatementTimeout(db, sqlText, params) {
|
|
35
|
+
if (!runnerCanBeginTransaction(db)) {
|
|
36
|
+
return executeRawQueryRead(db, sqlText, params);
|
|
42
37
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
38
|
+
return runInNewTransaction(db, async (tx) => {
|
|
39
|
+
await executeRawQueryRead(tx, "SELECT set_config('statement_timeout', '0', true)", []);
|
|
40
|
+
return executeRawQueryRead(tx, sqlText, params);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export async function reindexEntity(db, registry, searchAdapter, entityName, tenantId, options = {}) {
|
|
44
|
+
return runInSystemRowLevelSecurityScope("search reindex reads entity rows of all tenants", async () => {
|
|
45
|
+
const entity = registry.getEntity(entityName);
|
|
46
|
+
if (!entity) {
|
|
47
|
+
throw new Error(`reindexEntity: unknown entity "${entityName}"`);
|
|
48
|
+
}
|
|
49
|
+
const searchableFields = registry.getSearchableFields(entityName);
|
|
50
|
+
const extensions = registry.getSearchPayloadExtensions(entityName);
|
|
51
|
+
if (searchableFields.length === 0 && extensions.length === 0) {
|
|
52
|
+
throw new Error(`reindexEntity: entity "${entityName}" has no searchable fields and no search-payload ` +
|
|
53
|
+
`extensions — nothing to index.`);
|
|
54
|
+
}
|
|
55
|
+
const batchSize = options.batchSize ?? 500;
|
|
56
|
+
const tableName = resolveTableName(entityName, entity, undefined);
|
|
57
|
+
const fieldNames = Object.keys(entity.fields);
|
|
58
|
+
// Soft-deleted rows already left the live index (the .deleted consumer
|
|
59
|
+
// calls searchAdapter.remove()) — resurrecting them here would make
|
|
60
|
+
// erased entities findable again.
|
|
61
|
+
const deletedFilter = entity.softDelete === true ? `AND ${quoteIdent("is_deleted")} IS NOT TRUE` : "";
|
|
62
|
+
const failures = [];
|
|
63
|
+
const result = { scannedRows: 0, indexedRows: 0, wouldIndexRows: 0, failures };
|
|
64
|
+
let lastId;
|
|
65
|
+
// Whether a searchable field lacks a matching read-table column depends
|
|
66
|
+
// only on the table's column set (rowToState/Object.hasOwn), not on any
|
|
67
|
+
// particular row's data — every row from the same SELECT * has the same
|
|
68
|
+
// columns. Check once against the first row instead of every row, so a
|
|
69
|
+
// dropped/never-migrated column fails fast with one clear error instead
|
|
70
|
+
// of one identical failures[] entry per scanned row (1M rows → 1M
|
|
71
|
+
// entries, and the real schema problem is buried in "x failed").
|
|
72
|
+
let uncheckedSchema = true;
|
|
73
|
+
for (;;) {
|
|
74
|
+
// Keyset, not OFFSET: rows deleted or changed while the loop runs must not shift the window.
|
|
75
|
+
const afterLastId = lastId === undefined ? "" : `AND ${quoteIdent("id")} > $3`;
|
|
76
|
+
const rows = await readBatchWithoutStatementTimeout(db, `SELECT * FROM ${quoteIdent(tableName)}
|
|
65
77
|
WHERE ${quoteIdent("tenant_id")} = $1 ${deletedFilter} ${afterLastId}
|
|
66
78
|
ORDER BY ${quoteIdent("id")} ASC
|
|
67
79
|
LIMIT $2`, lastId === undefined ? [tenantId, batchSize] : [tenantId, batchSize, lastId]);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
const docs = [];
|
|
81
|
-
for (const row of rows) {
|
|
82
|
-
result.scannedRows++;
|
|
83
|
-
const entityId = String(row["id"]);
|
|
84
|
-
try {
|
|
85
|
-
const rawState = rowToState(row, fieldNames);
|
|
86
|
-
// `pii + searchable` fields hold ciphertext on the read-table row —
|
|
87
|
-
// decrypt the same way the live write-path consumer does. An
|
|
88
|
-
// erased subject key doesn't throw, it swaps the value for
|
|
89
|
-
// PII_ERASED_SENTINEL (see decryptSearchableSubjectFields) — check
|
|
90
|
-
// for that AFTER decrypting, mirroring the softDelete filter above:
|
|
91
|
-
// resurrecting a crypto-shredded row here would undo
|
|
92
|
-
// purgeSearchDocumentsForSubject and make it findable again.
|
|
93
|
-
const state = await decryptSearchableSubjectFields(entityName, rawState, registry);
|
|
94
|
-
if (hasErasedSearchableSubjectField(entityName, state, registry))
|
|
95
|
-
continue;
|
|
96
|
-
const doc = await buildSearchDocument(entityName, entityId, state, registry);
|
|
97
|
-
if (doc)
|
|
98
|
-
docs.push({ entityId, doc });
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
|
|
80
|
+
const [firstRow] = rows;
|
|
81
|
+
if (firstRow === undefined)
|
|
82
|
+
break;
|
|
83
|
+
if (uncheckedSchema) {
|
|
84
|
+
uncheckedSchema = false;
|
|
85
|
+
const sampleState = rowToState(firstRow, fieldNames);
|
|
86
|
+
const unmappedField = searchableFields.find((fieldName) => !(fieldName in sampleState));
|
|
87
|
+
if (unmappedField !== undefined) {
|
|
88
|
+
throw new Error(`reindexEntity: searchable field "${unmappedField}" is not mappable from read-table ` +
|
|
89
|
+
`column ${quoteIdent(tableName)} — likely a dropped/never-migrated column.`);
|
|
90
|
+
}
|
|
102
91
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
92
|
+
const docs = [];
|
|
93
|
+
for (const row of rows) {
|
|
94
|
+
result.scannedRows++;
|
|
95
|
+
const entityId = String(row["id"]);
|
|
106
96
|
try {
|
|
107
|
-
|
|
108
|
-
|
|
97
|
+
const rawState = rowToState(row, fieldNames);
|
|
98
|
+
// `pii + searchable` fields hold ciphertext on the read-table row —
|
|
99
|
+
// decrypt the same way the live write-path consumer does. An
|
|
100
|
+
// erased subject key doesn't throw, it swaps the value for
|
|
101
|
+
// PII_ERASED_SENTINEL (see decryptSearchableSubjectFields) — check
|
|
102
|
+
// for that AFTER decrypting, mirroring the softDelete filter above:
|
|
103
|
+
// resurrecting a crypto-shredded row here would undo
|
|
104
|
+
// purgeSearchDocumentsForSubject and make it findable again.
|
|
105
|
+
const state = await decryptSearchableSubjectFields(entityName, rawState, registry);
|
|
106
|
+
if (hasErasedSearchableSubjectField(entityName, state, registry))
|
|
107
|
+
continue;
|
|
108
|
+
const doc = await buildSearchDocument(entityName, entityId, state, registry);
|
|
109
|
+
if (doc)
|
|
110
|
+
docs.push({ entityId, doc });
|
|
109
111
|
}
|
|
110
112
|
catch (e) {
|
|
111
|
-
|
|
112
|
-
for (const { entityId } of docs)
|
|
113
|
-
result.failures.push({ entityId, reason });
|
|
113
|
+
result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
if (!options.dryRun && docs.length > 0) {
|
|
117
|
+
if (searchAdapter.indexBatch) {
|
|
118
118
|
try {
|
|
119
|
-
await searchAdapter.
|
|
120
|
-
result.indexedRows
|
|
119
|
+
await searchAdapter.indexBatch(tenantId, docs.map((d) => d.doc));
|
|
120
|
+
result.indexedRows += docs.length;
|
|
121
121
|
}
|
|
122
122
|
catch (e) {
|
|
123
|
-
|
|
123
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
124
|
+
for (const { entityId } of docs)
|
|
125
|
+
result.failures.push({ entityId, reason });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
for (const { entityId, doc } of docs) {
|
|
130
|
+
try {
|
|
131
|
+
await searchAdapter.index(tenantId, doc);
|
|
132
|
+
result.indexedRows++;
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
result.failures.push({
|
|
136
|
+
entityId,
|
|
137
|
+
reason: e instanceof Error ? e.message : String(e),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
124
140
|
}
|
|
125
141
|
}
|
|
126
142
|
}
|
|
143
|
+
else if (options.dryRun) {
|
|
144
|
+
result.wouldIndexRows += docs.length;
|
|
145
|
+
}
|
|
146
|
+
lastId = rows[rows.length - 1]?.["id"];
|
|
147
|
+
if (rows.length < batchSize)
|
|
148
|
+
break;
|
|
127
149
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
lastId = rows[rows.length - 1]?.["id"];
|
|
132
|
-
if (rows.length < batchSize)
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
return result;
|
|
150
|
+
return result;
|
|
151
|
+
});
|
|
136
152
|
}
|
package/dist/secrets/index.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
export { createDekCache, type DekCache,
|
|
1
|
+
export { createDekCache, type DekCache, withDekCache } from "./dek-cache.ts";
|
|
2
2
|
export { derivePurposeSecret } from "./derive-purpose-secret.ts";
|
|
3
|
-
export { createEnvMasterKeyProvider
|
|
3
|
+
export { createEnvMasterKeyProvider } from "./env-master-key-provider.ts";
|
|
4
4
|
export { decryptValue, encryptValue } from "./envelope.ts";
|
|
5
5
|
export { createEnvelopeCipher, type EnvelopeCipher, type EnvelopeCipherOptions, } from "./envelope-cipher.ts";
|
|
6
|
-
export { assertNoSecretLeak } from "./leak-guard.ts";
|
|
7
6
|
export { rewrapDek } from "./rotation.ts";
|
|
8
7
|
export { decodeStoredEnvelope, encodeStoredEnvelope, isStoredEnvelope, type StoredEnvelope, } from "./stored-envelope.ts";
|
|
9
|
-
export {
|
|
8
|
+
export { createSecret, type MasterKeyProvider, type Secret, type SecretsContext, } from "./types.ts";
|
package/dist/secrets/index.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
export { createDekCache, withDekCache } from "./dek-cache.js";
|
|
2
2
|
export { derivePurposeSecret } from "./derive-purpose-secret.js";
|
|
3
|
-
export { createEnvMasterKeyProvider
|
|
3
|
+
export { createEnvMasterKeyProvider } from "./env-master-key-provider.js";
|
|
4
4
|
export { decryptValue, encryptValue } from "./envelope.js";
|
|
5
5
|
export { createEnvelopeCipher, } from "./envelope-cipher.js";
|
|
6
|
-
export { assertNoSecretLeak } from "./leak-guard.js";
|
|
7
6
|
export { rewrapDek } from "./rotation.js";
|
|
8
7
|
export { decodeStoredEnvelope, encodeStoredEnvelope, isStoredEnvelope, } from "./stored-envelope.js";
|
|
9
|
-
export { createSecret,
|
|
8
|
+
export { createSecret, } from "./types.js";
|
package/dist/seeding/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { runEventStoreSeed } from "./entity-seed.ts";
|
|
2
2
|
export { createTestUser, TestUsers, testTenantId, testUserId } from "./seed-users.ts";
|
|
3
|
-
export {
|
|
3
|
+
export type { SeedIfExists } from "./types.ts";
|
package/dist/seeding/index.js
CHANGED
package/dist/time/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { warnIfNonUtcServerTimeZone } from "./boot-tz-warning.ts";
|
|
2
|
-
export type {
|
|
2
|
+
export type { GeoTzProvider } from "./geo-tz.ts";
|
|
3
3
|
export { isValidIanaTimeZone } from "./iana.ts";
|
|
4
4
|
export { instantToLegacyDate, legacyDateToInstant } from "./legacy-date.ts";
|
|
5
5
|
export { ensureTemporalPolyfill, getTemporal } from "./polyfill.ts";
|
|
6
|
-
export {
|
|
6
|
+
export { createTzContext, type TzContext, } from "./tz-context.ts";
|
package/dist/time/index.js
CHANGED
|
@@ -12,4 +12,4 @@ export { warnIfNonUtcServerTimeZone } from "./boot-tz-warning.js";
|
|
|
12
12
|
export { isValidIanaTimeZone } from "./iana.js";
|
|
13
13
|
export { instantToLegacyDate, legacyDateToInstant } from "./legacy-date.js";
|
|
14
14
|
export { ensureTemporalPolyfill, getTemporal } from "./polyfill.js";
|
|
15
|
-
export { createTzContext,
|
|
15
|
+
export { createTzContext, } from "./tz-context.js";
|
|
@@ -6,8 +6,3 @@ export type { Clock, LocatedTimestampJson, TzContext, TzContextOptions, } from "
|
|
|
6
6
|
* buildHandlerContext stays ambient-free.
|
|
7
7
|
*/
|
|
8
8
|
export declare function createTzContext(options?: TzContextOptions): TzContext;
|
|
9
|
-
/**
|
|
10
|
-
* Convenience: ensures the polyfill is loaded AND creates the TzContext in
|
|
11
|
-
* one await. Prefer this in boot code.
|
|
12
|
-
*/
|
|
13
|
-
export declare function createTzContextAsync(options?: TzContextOptions): Promise<TzContext>;
|
package/dist/time/tz-context.js
CHANGED
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
// The pure type contracts (TzContext, TzContextOptions, LocatedTimestampJson)
|
|
19
19
|
// live in @cosmicdrift/kumiko-types/tz-context — only the factories are here.
|
|
20
20
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
21
|
-
import { ensureTemporalPolyfill } from "./polyfill.js";
|
|
22
21
|
const SYSTEM_CLOCK = {
|
|
23
22
|
now: () => Temporal.Now.instant(), // @wrapper-known semantic-alias
|
|
24
23
|
};
|
|
@@ -72,11 +71,3 @@ export function createTzContext(options = {}) {
|
|
|
72
71
|
},
|
|
73
72
|
};
|
|
74
73
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Convenience: ensures the polyfill is loaded AND creates the TzContext in
|
|
77
|
-
* one await. Prefer this in boot code.
|
|
78
|
-
*/
|
|
79
|
-
export async function createTzContextAsync(options) {
|
|
80
|
-
await ensureTemporalPolyfill();
|
|
81
|
-
return createTzContext(options);
|
|
82
|
-
}
|
package/dist/ui-types/index.d.ts
CHANGED
|
@@ -5,22 +5,19 @@ export type { FormDerivationScreen } from "../engine/form-derivations.ts";
|
|
|
5
5
|
export { applyFormDerivations, isFormDerivationInputMode, isUnusedFallbackOperand, } from "../engine/form-derivations.ts";
|
|
6
6
|
export type { ParsedRefTarget } from "../engine/parse-ref-target.ts";
|
|
7
7
|
export { parseRefTarget } from "../engine/parse-ref-target.ts";
|
|
8
|
-
export
|
|
9
|
-
export {
|
|
10
|
-
export type {
|
|
11
|
-
export type { AccessRule, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, RoleAccessPersonalData, RoleAccessRule, } from "../engine/types/handlers.ts";
|
|
8
|
+
export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.ts";
|
|
9
|
+
export type { EmbeddedDerivedCellDef, EntityDefinition, FieldDefinition, OptionsQueryPayload, SelectOptionTone, TextFieldDef, } from "../engine/types/fields.ts";
|
|
10
|
+
export type { AccessRule } from "../engine/types/handlers.ts";
|
|
12
11
|
export { isOpenToAllGranted, isUiAccessGranted } from "../engine/types/handlers.ts";
|
|
13
12
|
export type { IconKey, NavDefinition, NavIconKey } from "../engine/types/nav.ts";
|
|
14
|
-
export type { ActionFormFooterAction, ActionFormLoad, ActionFormRedirect, ActionFormScreenDefinition, ActionFormSuccessFact, ActionFormSuccessLink, ConfigEditScreenDefinition, CustomScreenDefinition,
|
|
15
|
-
export {
|
|
13
|
+
export type { ActionFormFooterAction, ActionFormLoad, ActionFormRedirect, ActionFormScreenDefinition, ActionFormSuccessFact, ActionFormSuccessLink, ConfigEditScreenDefinition, CustomScreenDefinition, DashboardChartMarkerKind, DashboardChartPanel, DashboardCurrencyFormat, DashboardCustomPanel, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardI18nText, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRefresh, DashboardRelativeTimeParam, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardTimeRangeDefinition, EditExtensionSection, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedListEditSpec, EntityEditAction, EntityEditScreenDefinition, EntityListFacetConfig, EntityListScreenDefinition, FieldAffix, FieldCondition, FieldFillAction, FieldIconKey, FieldRenderer, FormWidth, ListBulkAction, ListColumnSpec, ListEmptyStateSpec, ListFacetSpec, ListSortSpec, ListTableOptions, MetricNavigate, PlatformComponent, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSubtitlePart, RelatedListRowTone, RelatedListToolbarAction, RowAction, RowActionClientAction, RowActionDisplay, RowActionDrawer, RowActionMode, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ScreenDefinition, ScreenSlots, SecretMintConfirmStep, SecretMintScreenDefinition, SecretsEditScreenDefinition, ToolbarAction, } from "../engine/types/screen.ts";
|
|
14
|
+
export { MAX_BULK_SELECTION } from "../engine/types/screen.ts";
|
|
16
15
|
export type { TargetRef } from "../engine/types/target-ref.ts";
|
|
17
|
-
export type { TreeAction
|
|
16
|
+
export type { TreeAction } from "../engine/types/tree-node.ts";
|
|
18
17
|
export type { WorkspaceDefinition } from "../engine/types/workspace.ts";
|
|
19
18
|
export { ACTION_FORM_ENTITY, handlerFieldLabelKey, handlerTitleKey, PROJECTION_DETAIL_ENTITY, WRITE_FORM_SECTION_ENTITY, } from "../i18n/required-surface-keys.ts";
|
|
20
19
|
export type { AppSchema, FeatureSchema, QualifiedContentCollection, WorkspaceSchema, } from "./app-schema.ts";
|
|
21
|
-
export
|
|
22
|
-
export { CARD_META_MAX, cardColumnRoles, cardFileDisplayKind } from "./card-column-roles.ts";
|
|
20
|
+
export { CARD_META_MAX, cardColumnRoles } from "./card-column-roles.ts";
|
|
23
21
|
export { type Formality, formalLocaleTag } from "./formality.ts";
|
|
24
|
-
export type { ListRowMetaColumnType, ListRowMetaReference, ReferenceLookupSource, SystemReferenceLabel, } from "./list-row-meta.ts";
|
|
25
22
|
export { LIST_ROW_META_COLUMNS, LIST_ROW_META_REFERENCES, REFERENCE_LOOKUP_SOURCES, SYSTEM_REFERENCE_LABELS, UNRESOLVED_REFERENCE_LABEL_KEYS, } from "./list-row-meta.ts";
|
|
26
|
-
export {
|
|
23
|
+
export { resolveTranslationValue, type TranslationValue, translationValueOtherText, } from "./plural.ts";
|
package/dist/ui-types/index.js
CHANGED
|
@@ -23,11 +23,11 @@ export { NO_WIDGET_FIELD_TYPES } from "@cosmicdrift/kumiko-types/fields";
|
|
|
23
23
|
export { computeDerivedCellValue, roundDerivedCellValue } from "../engine/embedded-derived.js";
|
|
24
24
|
export { applyFormDerivations, isFormDerivationInputMode, isUnusedFallbackOperand, } from "../engine/form-derivations.js";
|
|
25
25
|
export { parseRefTarget } from "../engine/parse-ref-target.js";
|
|
26
|
-
export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition,
|
|
26
|
+
export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.js";
|
|
27
27
|
export { isOpenToAllGranted, isUiAccessGranted } from "../engine/types/handlers.js";
|
|
28
|
-
export {
|
|
28
|
+
export { MAX_BULK_SELECTION } from "../engine/types/screen.js";
|
|
29
29
|
export { ACTION_FORM_ENTITY, handlerFieldLabelKey, handlerTitleKey, PROJECTION_DETAIL_ENTITY, WRITE_FORM_SECTION_ENTITY, } from "../i18n/required-surface-keys.js";
|
|
30
|
-
export { CARD_META_MAX, cardColumnRoles
|
|
30
|
+
export { CARD_META_MAX, cardColumnRoles } from "./card-column-roles.js";
|
|
31
31
|
export { formalLocaleTag } from "./formality.js";
|
|
32
32
|
export { LIST_ROW_META_COLUMNS, LIST_ROW_META_REFERENCES, REFERENCE_LOOKUP_SOURCES, SYSTEM_REFERENCE_LABELS, UNRESOLVED_REFERENCE_LABEL_KEYS, } from "./list-row-meta.js";
|
|
33
33
|
export { resolveTranslationValue, translationValueOtherText, } from "./plural.js";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { UpgradeMarkerResolvedManual } from "./upgrade-marker-parse.ts";
|
|
1
2
|
export type UpgradeChangelogManual = {
|
|
2
3
|
readonly id: string;
|
|
3
4
|
readonly version: string;
|
|
@@ -23,3 +24,5 @@ export type UpgradeChangelogSection = {
|
|
|
23
24
|
export declare function renderUpgradeSection(section: UpgradeChangelogSection): string;
|
|
24
25
|
/** Puts the section on top; a section for the same target version is replaced, so a re-run stays idempotent. */
|
|
25
26
|
export declare function mergeUpgradeSection(existing: string | undefined, section: UpgradeChangelogSection): string;
|
|
27
|
+
/** Pure string match on the rendered `- [open] <id> · ` prefix, in every section; each id gets its own resolution. */
|
|
28
|
+
export declare function syncResolvedManualStatuses(content: string, resolved: readonly Pick<UpgradeMarkerResolvedManual, "id" | "resolution">[]): string;
|