@cosmicdrift/kumiko-framework 0.386.0 → 0.388.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 +6 -1
- package/LICENSE +21 -57
- package/README.md +2 -2
- package/agents/examples/anonymous-access.md +1 -1
- package/agents/examples/apex-landing.md +204 -0
- package/agents/examples/api-worker-split.md +64 -0
- package/agents/examples/app-config.md +14 -0
- package/agents/examples/auth-mfa.md +115 -0
- package/agents/examples/env-composition.md +28 -1
- package/agents/examples/legal-pages.md +1 -1
- package/agents/examples/prod-boot-options.md +16 -0
- package/agents/examples/rate-limiting.md +48 -0
- package/agents/examples/record-detail-layout.md +692 -0
- package/agents/examples/seed-migration.md +212 -0
- package/agents/examples/wizard-form.md +941 -0
- package/agents/examples/writeform-section.md +548 -0
- package/agents/features.md +19 -2
- package/agents/widgets.md +40 -39
- package/dist/api/api-constants.js +2 -2
- package/dist/api/auth-middleware.js +7 -7
- package/dist/api/auth-rate-limiters.js +7 -3
- package/dist/api/auth-routes-mfa.js +1 -1
- package/dist/api/auth-routes-session.js +1 -1
- package/dist/api/auth-routes-shared.js +7 -3
- package/dist/api/auth-routes-signup.js +1 -1
- package/dist/api/client-error-route.js +8 -2
- package/dist/api/client-ip.js +3 -1
- package/dist/api/extra-route.js +1 -1
- package/dist/api/index.d.ts +3 -1
- package/dist/api/index.js +3 -1
- package/dist/api/pii-leak-guard.js +4 -2
- package/dist/api/readiness.js +5 -5
- package/dist/api/redis-sse-broker.js +8 -6
- package/dist/api/request-context.d.ts +1 -1
- package/dist/api/request-context.js +1 -1
- package/dist/api/routes.js +2 -2
- package/dist/api/server-boot-checks.d.ts +10 -0
- package/dist/api/server-boot-checks.js +157 -0
- package/dist/api/server-event-dispatcher.d.ts +26 -0
- package/dist/api/server-event-dispatcher.js +208 -0
- package/dist/api/server-extra-routes.d.ts +11 -0
- package/dist/api/server-extra-routes.js +203 -0
- package/dist/api/server-middleware.d.ts +20 -0
- package/dist/api/server-middleware.js +211 -0
- package/dist/api/server-routes.d.ts +19 -0
- package/dist/api/server-routes.js +293 -0
- package/dist/api/server-websocket-routes.d.ts +4 -0
- package/dist/api/server-websocket-routes.js +108 -0
- package/dist/api/server-wiring.d.ts +32 -0
- package/dist/api/server-wiring.js +236 -0
- package/dist/api/server.d.ts +10 -15
- package/dist/api/server.js +48 -1250
- package/dist/api/session-cookies.js +4 -4
- package/dist/api/sse-broker.js +1 -1
- package/dist/api/sse-route.d.ts +13 -13
- package/dist/api/sse-route.js +31 -27
- package/dist/auth/index.js +4 -4
- package/dist/auth/roles.d.ts +4 -4
- package/dist/auth/roles.js +24 -24
- package/dist/compliance/duration-spec.js +18 -20
- package/dist/compliance/index.js +2 -3
- package/dist/compliance/override-schema.d.ts +4 -4
- package/dist/compliance/override-schema.js +19 -22
- package/dist/compliance/profiles.d.ts +26 -29
- package/dist/compliance/profiles.js +62 -69
- package/dist/compliance/sub-processors.d.ts +28 -30
- package/dist/compliance/sub-processors.js +17 -21
- package/dist/consumer-cli.js +4 -4
- package/dist/crypto/blind-index.js +18 -17
- package/dist/crypto/ciphertext-pattern.js +1 -1
- package/dist/crypto/event-pii.js +3 -3
- package/dist/crypto/kek-source.d.ts +1 -1
- package/dist/crypto/kek-source.js +3 -2
- package/dist/crypto/kms-adapter.d.ts +1 -1
- package/dist/crypto/kms-adapter.js +4 -6
- package/dist/crypto/kms-wiring.d.ts +1 -2
- package/dist/crypto/kms-wiring.js +2 -2
- package/dist/crypto/owner-transition-rekey.d.ts +5 -1
- package/dist/crypto/owner-transition-rekey.js +1 -1
- package/dist/crypto/pg-kms-adapter.js +2 -6
- package/dist/crypto/pii-field-encryption.d.ts +5 -1
- package/dist/crypto/pii-field-encryption.js +7 -5
- package/dist/crypto/subject-resolver.d.ts +1 -1
- package/dist/crypto/subject-resolver.js +2 -2
- package/dist/db/aggregate-sql.d.ts +21 -0
- package/dist/db/aggregate-sql.js +155 -0
- package/dist/db/apply-entity-event.d.ts +6 -6
- package/dist/db/apply-entity-event.js +55 -55
- package/dist/db/blind-index-cleanup.js +7 -7
- package/dist/db/closed-connection.d.ts +9 -0
- package/dist/db/closed-connection.js +95 -0
- package/dist/db/collect-table-metas.js +10 -11
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/compound-types.js +12 -12
- package/dist/db/cursor.js +3 -4
- package/dist/db/dialect.d.ts +2 -2
- package/dist/db/dialect.js +3 -3
- package/dist/db/distinct-on.d.ts +1 -1
- package/dist/db/driver-row-coercion.d.ts +2 -0
- package/dist/db/driver-row-coercion.js +186 -0
- package/dist/db/driver-value-preparation.d.ts +16 -0
- package/dist/db/driver-value-preparation.js +99 -0
- package/dist/db/eagerload.d.ts +3 -3
- package/dist/db/eagerload.js +21 -12
- package/dist/db/entity-field-encryption.d.ts +1 -0
- package/dist/db/entity-field-encryption.js +1 -1
- package/dist/db/entity-table-meta.d.ts +2 -2
- package/dist/db/entity-table-meta.js +105 -112
- package/dist/db/event-store-executor-context.d.ts +3 -2
- package/dist/db/event-store-executor-context.js +13 -13
- package/dist/db/event-store-executor-read-aggregate.d.ts +8 -0
- package/dist/db/event-store-executor-read-aggregate.js +112 -0
- package/dist/db/event-store-executor-read-filter.d.ts +31 -0
- package/dist/db/event-store-executor-read-filter.js +203 -0
- package/dist/db/event-store-executor-read-paging.d.ts +14 -0
- package/dist/db/event-store-executor-read-paging.js +99 -0
- package/dist/db/event-store-executor-read-rows.d.ts +6 -0
- package/dist/db/event-store-executor-read-rows.js +32 -0
- package/dist/db/event-store-executor-read-search.d.ts +28 -0
- package/dist/db/event-store-executor-read-search.js +221 -0
- package/dist/db/event-store-executor-read-sort.d.ts +41 -0
- package/dist/db/event-store-executor-read-sort.js +130 -0
- package/dist/db/event-store-executor-read-where.d.ts +24 -0
- package/dist/db/event-store-executor-read-where.js +81 -0
- package/dist/db/event-store-executor-read.d.ts +2 -9
- package/dist/db/event-store-executor-read.js +50 -704
- package/dist/db/event-store-executor-write-steps.d.ts +20 -0
- package/dist/db/event-store-executor-write-steps.js +100 -0
- package/dist/db/event-store-executor-write.js +401 -510
- package/dist/db/index.d.ts +6 -2
- package/dist/db/index.js +5 -1
- package/dist/db/list-aggregate-labels.d.ts +14 -0
- package/dist/db/list-aggregate-labels.js +26 -0
- package/dist/db/located-timestamp.d.ts +11 -11
- package/dist/db/located-timestamp.js +29 -30
- package/dist/db/migrate-generator.d.ts +1 -1
- package/dist/db/migrate-generator.js +97 -105
- package/dist/db/migrate-runner.js +29 -26
- package/dist/db/money.d.ts +6 -6
- package/dist/db/money.js +29 -27
- package/dist/db/queries/backfill-pii.js +5 -5
- package/dist/db/queries/ddl.js +1 -1
- package/dist/db/queries/es-ops.d.ts +1 -1
- package/dist/db/queries/es-ops.js +1 -1
- package/dist/db/queries/event-consumer.js +3 -3
- package/dist/db/queries/event-store.js +4 -2
- package/dist/db/queries/projection-rebuild.js +3 -3
- package/dist/db/queries/raw-sql.d.ts +2 -2
- package/dist/db/queries/raw-sql.js +2 -2
- package/dist/db/queries/shadow-swap.js +19 -19
- package/dist/db/query.d.ts +3 -16
- package/dist/db/query.js +8 -761
- package/dist/db/rebuild-marker.js +20 -21
- package/dist/db/reference-data.js +6 -1
- package/dist/db/replay-migration-sql.js +2 -2
- package/dist/db/schema-inspection.js +4 -5
- package/dist/db/table-builder.d.ts +1 -2
- package/dist/db/table-builder.js +137 -190
- package/dist/db/table-info.d.ts +10 -0
- package/dist/db/table-info.js +45 -0
- package/dist/db/temporal-value-guards.d.ts +6 -0
- package/dist/db/temporal-value-guards.js +15 -0
- package/dist/db/tenant-db-runner.d.ts +1 -0
- package/dist/db/tenant-db-runner.js +3 -0
- package/dist/db/tenant-db.d.ts +2 -2
- package/dist/db/tenant-db.js +48 -11
- package/dist/db/where-clause.d.ts +6 -0
- package/dist/db/where-clause.js +236 -0
- package/dist/derivatives/delete-stored-file.js +6 -2
- package/dist/derivatives/derivatives-context.js +1 -1
- package/dist/engine/boot-validator/access-roles.js +4 -3
- package/dist/engine/boot-validator/api-ext.js +14 -14
- package/dist/engine/boot-validator/boot-check.js +1 -1
- package/dist/engine/boot-validator/config-deps.js +7 -6
- package/dist/engine/boot-validator/detail-screens.js +4 -4
- package/dist/engine/boot-validator/entity-handler.d.ts +1 -0
- package/dist/engine/boot-validator/entity-handler.js +77 -61
- package/dist/engine/boot-validator/form-derivations.js +35 -1
- package/dist/engine/boot-validator/gdpr-storage.js +4 -4
- package/dist/engine/boot-validator/i18n-keys.js +6 -4
- package/dist/engine/boot-validator/index.d.ts +2 -2
- package/dist/engine/boot-validator/index.js +22 -20
- package/dist/engine/boot-validator/nav.js +5 -5
- package/dist/engine/boot-validator/ownership.js +12 -9
- package/dist/engine/boot-validator/parent-ref.js +1 -1
- package/dist/engine/boot-validator/pii-retention.js +258 -187
- package/dist/engine/boot-validator/projection-list-screens.js +7 -7
- package/dist/engine/boot-validator/query-refs.js +1 -1
- package/dist/engine/boot-validator/screens-actions.d.ts +1 -0
- package/dist/engine/boot-validator/screens-actions.js +23 -17
- package/dist/engine/boot-validator/screens-dashboard.js +2 -5
- package/dist/engine/boot-validator/screens-forms.js +12 -17
- package/dist/engine/boot-validator/screens-kind-config-edit.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-config-edit.js +88 -0
- package/dist/engine/boot-validator/screens-kind-entity-edit.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-entity-edit.js +55 -0
- package/dist/engine/boot-validator/screens-kind-entity-list.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-entity-list.js +228 -0
- package/dist/engine/boot-validator/screens-kind-projection-detail.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-projection-detail.js +235 -0
- package/dist/engine/boot-validator/screens-kind-projection-list.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-projection-list.js +52 -0
- package/dist/engine/boot-validator/screens-kind-secret-mint.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-secret-mint.js +28 -0
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +37 -0
- package/dist/engine/boot-validator/screens-kind-shared.js +142 -0
- package/dist/engine/boot-validator/screens-lists.d.ts +2 -1
- package/dist/engine/boot-validator/screens-lists.js +26 -24
- package/dist/engine/boot-validator/screens.d.ts +0 -2
- package/dist/engine/boot-validator/screens.js +102 -869
- package/dist/engine/boot-validator/security-baseline.js +3 -2
- package/dist/engine/boot-validator/transfer-graph.js +2 -2
- package/dist/engine/boot-validator/workspaces.js +3 -3
- package/dist/engine/bridge-stub.js +3 -4
- package/dist/engine/build-app-schema.js +130 -170
- package/dist/engine/build-config-feature-schema.js +50 -50
- package/dist/engine/build-target.js +20 -23
- package/dist/engine/codemod/pipeline-codemod.js +20 -13
- package/dist/engine/config-helpers.js +4 -4
- package/dist/engine/constants.js +2 -2
- package/dist/engine/create-app.js +2 -2
- package/dist/engine/define-feature.js +21 -13
- package/dist/engine/define-handler.js +13 -11
- package/dist/engine/define-step.js +1 -1
- package/dist/engine/define-workflow.d.ts +5 -5
- package/dist/engine/define-workflow.js +6 -6
- package/dist/engine/entity-handlers.d.ts +13 -0
- package/dist/engine/entity-handlers.js +22 -34
- package/dist/engine/entity-list-runtime-options.d.ts +8 -0
- package/dist/engine/entity-list-runtime-options.js +18 -0
- package/dist/engine/event-def.js +2 -2
- package/dist/engine/extension-names.d.ts +16 -17
- package/dist/engine/extension-names.js +37 -38
- package/dist/engine/extensions/escape-hatch-usage.js +1 -1
- package/dist/engine/extensions/tenant-data.js +2 -2
- package/dist/engine/extensions/user-data.d.ts +23 -24
- package/dist/engine/factories.d.ts +14 -13
- package/dist/engine/factories.js +38 -37
- package/dist/engine/feature-ast/entity-field-types.js +1 -1
- package/dist/engine/feature-ast/extractors/handlers.js +2 -1
- package/dist/engine/feature-ast/extractors/hooks.js +1 -1
- package/dist/engine/feature-ast/extractors/round2.js +25 -6
- package/dist/engine/feature-ast/extractors/shared.d.ts +2 -3
- package/dist/engine/feature-ast/extractors/shared.js +2 -3
- package/dist/engine/feature-ast/parse.js +13 -13
- package/dist/engine/feature-ast/patch.js +4 -182
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +3 -0
- package/dist/engine/feature-ast/pattern-change-schema.js +2 -1
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +7 -0
- package/dist/engine/feature-ast/pattern-id-matchers.js +210 -0
- package/dist/engine/feature-ast/patterns.d.ts +11 -2
- package/dist/engine/feature-ast/patterns.js +43 -51
- package/dist/engine/feature-ast/render.js +50 -89
- package/dist/engine/feature-config-events-jobs.js +15 -12
- package/dist/engine/feature-entity-handlers.js +12 -5
- package/dist/engine/feature-manifest.d.ts +9 -9
- package/dist/engine/feature-manifest.js +6 -7
- package/dist/engine/feature-ui-extensions.d.ts +3 -3
- package/dist/engine/feature-ui-extensions.js +30 -22
- package/dist/engine/field-access.js +5 -6
- package/dist/engine/form-derivations.js +18 -7
- package/dist/engine/handler-field-references.js +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.js +4 -4
- package/dist/engine/object-form.d.ts +1 -0
- package/dist/engine/object-form.js +14 -4
- package/dist/engine/ownership.js +3 -3
- package/dist/engine/parse-ref-target.js +5 -7
- package/dist/engine/pattern-library/index.js +2 -2
- package/dist/engine/pattern-library/library.js +2 -2
- package/dist/engine/pattern-library/types.js +3 -3
- package/dist/engine/pipeline.js +2 -2
- package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
- package/dist/engine/project-app-schema-for-roles.js +7 -5
- package/dist/engine/projection-helpers.js +9 -9
- package/dist/engine/qualified-name.js +2 -2
- package/dist/engine/registry-facade.js +1 -1
- package/dist/engine/registry-ingest.js +13 -13
- package/dist/engine/registry-state.js +17 -19
- package/dist/engine/registry-validate.js +12 -12
- package/dist/engine/run-in.js +2 -2
- package/dist/engine/run-pipeline.js +7 -0
- package/dist/engine/schema-builder.js +251 -233
- package/dist/engine/screen-filter-ops.js +17 -20
- package/dist/engine/screen-helpers.js +4 -3
- package/dist/engine/screen-kind.d.ts +7 -0
- package/dist/engine/screen-kind.js +1 -0
- package/dist/engine/state-machine.d.ts +12 -12
- package/dist/engine/state-machine.js +7 -7
- package/dist/engine/steps/_resolver-utils.js +4 -3
- package/dist/engine/steps/for-each.js +4 -4
- package/dist/engine/steps/unsafe-projection-delete.js +1 -1
- package/dist/engine/steps/unsafe-projection-upsert.js +4 -4
- package/dist/engine/steps/wait-for-event.js +4 -4
- package/dist/engine/steps/workflow-system-events.js +3 -3
- package/dist/engine/strip-disabled-features-from-app-schema.js +51 -14
- package/dist/engine/tier-resolver-extension.d.ts +29 -27
- package/dist/engine/tier-resolver-extension.js +26 -26
- package/dist/engine/transfer-adjacency.js +2 -2
- package/dist/engine/validate-projection-allowlist.js +9 -28
- package/dist/engine/walk-step-instances.d.ts +2 -0
- package/dist/engine/walk-step-instances.js +38 -0
- package/dist/engine/where-rule-lint.js +1 -1
- package/dist/engine/write-handler-qn-extract.js +1 -1
- package/dist/entrypoint/index.d.ts +4 -1
- package/dist/entrypoint/index.js +10 -4
- package/dist/env/index.d.ts +7 -6
- package/dist/env/index.js +10 -9
- package/dist/errors/docs-url.d.ts +1 -1
- package/dist/errors/docs-url.js +22 -2
- package/dist/errors/transition-details.js +7 -7
- package/dist/errors/write-error-info.d.ts +6 -6
- package/dist/errors/write-error-info.js +6 -6
- package/dist/es-ops/context.d.ts +9 -9
- package/dist/es-ops/context.js +29 -29
- package/dist/es-ops/index.js +7 -9
- package/dist/es-ops/operations-schema.js +4 -10
- package/dist/es-ops/runner.d.ts +11 -11
- package/dist/es-ops/runner.js +49 -53
- package/dist/es-ops/types.d.ts +55 -55
- package/dist/es-ops/types.js +11 -11
- package/dist/event-store/admin-api.js +7 -8
- package/dist/event-store/errors.js +1 -1
- package/dist/event-store/event-store.js +12 -6
- package/dist/event-store/rebuild-dead-letter.js +1 -1
- package/dist/files/bind-pending-file-refs.js +3 -3
- package/dist/files/create-file-ref-from-bytes.js +4 -1
- package/dist/files/feature.js +9 -10
- package/dist/files/file-handle.js +7 -9
- package/dist/files/file-ref-entity.js +15 -15
- package/dist/files/file-ref-table.js +7 -8
- package/dist/files/file-routes.d.ts +7 -0
- package/dist/files/file-routes.js +22 -13
- package/dist/files/in-memory-provider.js +8 -9
- package/dist/files/local-provider.js +18 -25
- package/dist/files/provider-resolver.d.ts +7 -7
- package/dist/files/resolve-content-type.js +43 -0
- package/dist/files/storage-tracking.js +2 -2
- package/dist/files/upload-ledger.js +7 -0
- package/dist/files/zip-stream.d.ts +12 -19
- package/dist/files/zip-stream.js +44 -63
- package/dist/i18n/required-surface-keys.d.ts +1 -1
- package/dist/i18n/required-surface-keys.js +188 -212
- package/dist/internal/stack-support.d.ts +2 -1
- package/dist/internal/stack-support.js +1 -1
- package/dist/jobs/job-runner-context.d.ts +32 -0
- package/dist/jobs/job-runner-context.js +305 -0
- package/dist/jobs/job-runner-execution.d.ts +7 -0
- package/dist/jobs/job-runner-execution.js +160 -0
- package/dist/jobs/job-runner-gates.d.ts +19 -0
- package/dist/jobs/job-runner-gates.js +198 -0
- package/dist/jobs/job-runner-helpers.d.ts +17 -3
- package/dist/jobs/job-runner-helpers.js +69 -4
- package/dist/jobs/job-runner-schedulers.d.ts +1 -1
- package/dist/jobs/job-runner-schedulers.js +3 -4
- package/dist/jobs/job-runner-scope.d.ts +44 -0
- package/dist/jobs/job-runner-scope.js +102 -0
- package/dist/jobs/job-runner-types.d.ts +12 -0
- package/dist/jobs/job-runner.d.ts +0 -1
- package/dist/jobs/job-runner.js +57 -669
- package/dist/lifecycle/lifecycle.js +3 -5
- package/dist/lifecycle/signal-handlers.js +5 -4
- package/dist/logging/utils.d.ts +2 -1
- package/dist/logging/utils.js +38 -10
- package/dist/migrations/index.js +1 -1
- package/dist/migrations/kumiko-drift.js +14 -13
- package/dist/migrations/pending-rebuilds.d.ts +21 -20
- package/dist/migrations/pending-rebuilds.js +27 -27
- package/dist/migrations/projection-table-index.d.ts +3 -3
- package/dist/migrations/projection-table-index.js +8 -8
- package/dist/observability/escape-hatch-report.d.ts +3 -0
- package/dist/observability/escape-hatch-report.js +12 -1
- package/dist/observability/metric-validator.js +1 -1
- package/dist/observability/metrics-handle.js +3 -3
- package/dist/pipeline/append-event-core.js +11 -2
- package/dist/pipeline/cascade-handler.d.ts +1 -1
- package/dist/pipeline/cascade-handler.js +165 -138
- package/dist/pipeline/dispatch-batch.js +2 -2
- package/dist/pipeline/dispatch-query.js +20 -13
- package/dist/pipeline/dispatch-shared.d.ts +14 -3
- package/dist/pipeline/dispatch-shared.js +67 -721
- package/dist/pipeline/dispatch-stream.js +1 -1
- package/dist/pipeline/dispatch-write.js +297 -190
- package/dist/pipeline/dispatcher-utils.d.ts +1 -1
- package/dist/pipeline/dispatcher-utils.js +1 -1
- package/dist/pipeline/event-consumer-state.js +2 -2
- package/dist/pipeline/event-dispatcher-admin.js +2 -1
- package/dist/pipeline/event-dispatcher-delivery.js +4 -6
- package/dist/pipeline/event-dispatcher.js +17 -28
- package/dist/pipeline/handler-context-auth.d.ts +9 -0
- package/dist/pipeline/handler-context-auth.js +54 -0
- package/dist/pipeline/handler-context-config.d.ts +14 -0
- package/dist/pipeline/handler-context-config.js +113 -0
- package/dist/pipeline/handler-context-db.d.ts +24 -0
- package/dist/pipeline/handler-context-db.js +149 -0
- package/dist/pipeline/handler-context-dispatch.d.ts +21 -0
- package/dist/pipeline/handler-context-dispatch.js +89 -0
- package/dist/pipeline/handler-context-events.d.ts +43 -0
- package/dist/pipeline/handler-context-events.js +237 -0
- package/dist/pipeline/handler-context-notify.d.ts +12 -0
- package/dist/pipeline/handler-context-notify.js +55 -0
- package/dist/pipeline/handler-context-observability.d.ts +7 -0
- package/dist/pipeline/handler-context-observability.js +21 -0
- package/dist/pipeline/handler-context-scope.d.ts +48 -0
- package/dist/pipeline/handler-context-scope.js +88 -0
- package/dist/pipeline/irreversible-operation-gate.js +1 -1
- package/dist/pipeline/lifecycle-pipeline.js +9 -9
- package/dist/pipeline/member-read-only-transaction.js +1 -3
- package/dist/pipeline/msp-rebuild.js +1 -1
- package/dist/pipeline/notify-scope.js +12 -1
- package/dist/pipeline/pre-handler-gates.js +20 -4
- package/dist/pipeline/pre-transaction-reservations.d.ts +1 -0
- package/dist/pipeline/pre-transaction-reservations.js +9 -3
- package/dist/pipeline/projection-rebuild.js +15 -13
- package/dist/pipeline/system-hooks.js +39 -41
- package/dist/pipeline/system-identity-switch.js +1 -3
- package/dist/pipeline/tenant-timezone-cache.js +1 -1
- package/dist/random/generate.d.ts +29 -29
- package/dist/random/generate.js +30 -30
- package/dist/random/words.js +20 -20
- package/dist/rate-limit/middleware.js +9 -5
- package/dist/redis/client.js +2 -2
- package/dist/redis/pubsub-signal.js +14 -17
- package/dist/schema-cli/apply-command.d.ts +2 -0
- package/dist/schema-cli/apply-command.js +97 -0
- package/dist/schema-cli/baseline-command.d.ts +2 -0
- package/dist/schema-cli/baseline-command.js +33 -0
- package/dist/schema-cli/generate-command.d.ts +2 -0
- package/dist/schema-cli/generate-command.js +90 -0
- package/dist/schema-cli/shared.d.ts +39 -0
- package/dist/schema-cli/shared.js +95 -0
- package/dist/schema-cli/status-command.d.ts +2 -0
- package/dist/schema-cli/status-command.js +73 -0
- package/dist/schema-cli/validate-boot-input.d.ts +5 -0
- package/dist/schema-cli/validate-boot-input.js +130 -0
- package/dist/schema-cli/validate-command.d.ts +2 -0
- package/dist/schema-cli/validate-command.js +130 -0
- package/dist/schema-cli.d.ts +2 -18
- package/dist/schema-cli.js +47 -510
- package/dist/search/index.js +4 -4
- package/dist/search/meilisearch-adapter.js +2 -1
- package/dist/search/purge-subject.js +4 -5
- package/dist/search/reindex-entity.js +6 -9
- package/dist/time/boot-tz-warning.d.ts +2 -2
- package/dist/time/boot-tz-warning.js +8 -8
- package/dist/time/iana.js +10 -10
- package/dist/time/index.js +9 -9
- package/dist/time/legacy-date.d.ts +2 -2
- package/dist/time/legacy-date.js +6 -8
- package/dist/time/polyfill.js +1 -1
- package/dist/time/tz-context.d.ts +1 -1
- package/dist/time/tz-context.js +1 -1
- package/dist/ui-types/app-schema.js +7 -7
- package/dist/ui-types/list-row-meta.js +4 -4
- package/dist/upgrade-cli.js +159 -130
- package/dist/utils/compare.js +1 -1
- package/package.json +5 -5
- package/src/changes.json +358 -0
- package/src/scripts/codemod/crypto-shredding-testing-move.ts +2 -2
- package/src/scripts/codemod/feature-layout.ts +10 -2
- package/src/scripts/codemod/migrate-cross-tenant.ts +1 -1
- package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
- package/src/scripts/codemod/object-form.ts +41 -4
- package/src/scripts/codemod/package-merge.ts +58 -8
- package/src/scripts/codemod/pii-personal-migration.ts +192 -153
- package/src/scripts/codemod/testing-injection.ts +122 -42
- package/src/scripts/codemod/testing-move.ts +29 -7
- package/src/scripts/codemod/unprocessable-error-details-reason.ts +2 -2
|
@@ -53,10 +53,10 @@ export function expireLegacySessionCookieVariants(c, cookies) {
|
|
|
53
53
|
// skip: the unprefixed names are the only legacy variant when the config writes __Host- names.
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
56
|
+
// Sent even with secureCookies:false: TLS may still terminate at a proxy, and over plain HTTP the
|
|
57
|
+
// browser drops the Secure delete without effect.
|
|
58
|
+
deleteCookie(c, sessionCookieName(AUTH_COOKIE_BASE, { secure: true }), hostPrefixedDelete);
|
|
59
|
+
deleteCookie(c, sessionCookieName(CSRF_COOKIE_BASE, { secure: true }), hostPrefixedDelete);
|
|
60
60
|
}
|
|
61
61
|
const hostPrefixedDelete = { path: "/", secure: true };
|
|
62
62
|
// Expire every variant: the Domain cookie (current) and the host-only one
|
package/dist/api/sse-broker.js
CHANGED
|
@@ -37,7 +37,7 @@ export function shouldInvalidateListener(credential, scope) {
|
|
|
37
37
|
}
|
|
38
38
|
export function createSseBroker() {
|
|
39
39
|
// Purely local: no cross-replica fanout. buildServer wraps this in
|
|
40
|
-
// createRedisSseBroker
|
|
40
|
+
// createRedisSseBroker whenever REDIS_URL is set, which is what
|
|
41
41
|
// makes pushToChannel/publishAccessInvalidation reach every replica's
|
|
42
42
|
// clients — this reference implementation stays single-process only.
|
|
43
43
|
const channels = new Map();
|
package/dist/api/sse-route.d.ts
CHANGED
|
@@ -2,24 +2,24 @@ import { Hono } from "hono";
|
|
|
2
2
|
import type { AccessRule } from "../engine/types/index.ts";
|
|
3
3
|
import { type SseBroker } from "./sse-broker.ts";
|
|
4
4
|
/**
|
|
5
|
-
* Heartbeat
|
|
5
|
+
* Heartbeat cadence for SSE streams.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* ERR_HTTP2_PROTOCOL_ERROR.
|
|
10
|
-
* - Bun.serve default: 10 s (
|
|
11
|
-
*
|
|
12
|
-
* - Caddy reverse_proxy:
|
|
13
|
-
* via Content-Type),
|
|
14
|
-
*
|
|
7
|
+
* Must stay below every realistic idle timeout in the hop-by-hop layers;
|
|
8
|
+
* otherwise one of them terminates the connection and the browser reports
|
|
9
|
+
* ERR_HTTP2_PROTOCOL_ERROR. Known limits:
|
|
10
|
+
* - Bun.serve default: 10 s (disabled locally via idleTimeout: 0,
|
|
11
|
+
* but the cadence also conforms without that override)
|
|
12
|
+
* - Caddy reverse_proxy: no default timeout for SSE (auto-detects
|
|
13
|
+
* via Content-Type), but long-lived idle streams may be closed by
|
|
14
|
+
* connection tracking
|
|
15
15
|
* - Cloudflare Edge: 100 s
|
|
16
16
|
* - AWS ALB: 60 s
|
|
17
17
|
*
|
|
18
|
-
* 15 s
|
|
19
|
-
*
|
|
18
|
+
* 15 s is comfortably below all of these. The server-side cost is marginal
|
|
19
|
+
* (1 frame per client every 15 s).
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* The spec test in __tests__/sse-route-spec.test.ts pins this value to
|
|
22
|
+
* prevent accidentally increasing it.
|
|
23
23
|
*/
|
|
24
24
|
export declare const SSE_HEARTBEAT_INTERVAL_MS = 15000;
|
|
25
25
|
export declare const SSE_STALLED_CLIENT_TIMEOUT_MS = 15000;
|
package/dist/api/sse-route.js
CHANGED
|
@@ -9,24 +9,24 @@ import { clearSessionCookies, getSessionCookies } from "./session-cookies.js";
|
|
|
9
9
|
import { accessInvalidationCredentialFor } from "./sse-broker.js";
|
|
10
10
|
import { scheduleTokenExpiry } from "./token-expiry-timer.js";
|
|
11
11
|
/**
|
|
12
|
-
* Heartbeat
|
|
12
|
+
* Heartbeat cadence for SSE streams.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* ERR_HTTP2_PROTOCOL_ERROR.
|
|
17
|
-
* - Bun.serve default: 10 s (
|
|
18
|
-
*
|
|
19
|
-
* - Caddy reverse_proxy:
|
|
20
|
-
* via Content-Type),
|
|
21
|
-
*
|
|
14
|
+
* Must stay below every realistic idle timeout in the hop-by-hop layers;
|
|
15
|
+
* otherwise one of them terminates the connection and the browser reports
|
|
16
|
+
* ERR_HTTP2_PROTOCOL_ERROR. Known limits:
|
|
17
|
+
* - Bun.serve default: 10 s (disabled locally via idleTimeout: 0,
|
|
18
|
+
* but the cadence also conforms without that override)
|
|
19
|
+
* - Caddy reverse_proxy: no default timeout for SSE (auto-detects
|
|
20
|
+
* via Content-Type), but long-lived idle streams may be closed by
|
|
21
|
+
* connection tracking
|
|
22
22
|
* - Cloudflare Edge: 100 s
|
|
23
23
|
* - AWS ALB: 60 s
|
|
24
24
|
*
|
|
25
|
-
* 15 s
|
|
26
|
-
*
|
|
25
|
+
* 15 s is comfortably below all of these. The server-side cost is marginal
|
|
26
|
+
* (1 frame per client every 15 s).
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
28
|
+
* The spec test in __tests__/sse-route-spec.test.ts pins this value to
|
|
29
|
+
* prevent accidentally increasing it.
|
|
30
30
|
*/
|
|
31
31
|
export const SSE_HEARTBEAT_INTERVAL_MS = 15_000;
|
|
32
32
|
// Entity events carry aggregateType in data (system-hooks.ts's SSE-broadcast
|
|
@@ -136,6 +136,20 @@ export function createSseRoute(broker, options) {
|
|
|
136
136
|
let pendingWrites = 0;
|
|
137
137
|
let lastProgressAt = now();
|
|
138
138
|
const isStalled = () => pendingWrites > 0 && now() - lastProgressAt > SSE_STALLED_CLIENT_TIMEOUT_MS;
|
|
139
|
+
// Pings go through the same accounting: an awaited ping would block on a client that
|
|
140
|
+
// stopped reading, and the stall check below would never run again.
|
|
141
|
+
const writeTracked = (event, data) => {
|
|
142
|
+
if (pendingWrites === 0)
|
|
143
|
+
lastProgressAt = now();
|
|
144
|
+
pendingWrites += 1;
|
|
145
|
+
stream
|
|
146
|
+
.writeSSE({ event, data })
|
|
147
|
+
.catch(closeStream)
|
|
148
|
+
.finally(() => {
|
|
149
|
+
pendingWrites -= 1;
|
|
150
|
+
lastProgressAt = now();
|
|
151
|
+
});
|
|
152
|
+
};
|
|
139
153
|
const clientId = broker.addClient(channel, (event) => {
|
|
140
154
|
// skip: the stream is already being torn down
|
|
141
155
|
if (stream.aborted || stream.closed)
|
|
@@ -152,17 +166,7 @@ export function createSseRoute(broker, options) {
|
|
|
152
166
|
// skip: this client is gone, the frame has no audience
|
|
153
167
|
return;
|
|
154
168
|
}
|
|
155
|
-
|
|
156
|
-
if (pendingWrites === 0)
|
|
157
|
-
lastProgressAt = now();
|
|
158
|
-
pendingWrites += 1;
|
|
159
|
-
stream
|
|
160
|
-
.writeSSE({ event: frame.name, data })
|
|
161
|
-
.catch(closeStream)
|
|
162
|
-
.finally(() => {
|
|
163
|
-
pendingWrites -= 1;
|
|
164
|
-
lastProgressAt = now();
|
|
165
|
-
});
|
|
169
|
+
writeTracked(frame.name, JSON.stringify(frame.data));
|
|
166
170
|
}
|
|
167
171
|
catch {
|
|
168
172
|
// skip: an unserializable frame ends this client's stream, not the broadcast
|
|
@@ -184,15 +188,15 @@ export function createSseRoute(broker, options) {
|
|
|
184
188
|
unsubscribeAccessInvalidation();
|
|
185
189
|
};
|
|
186
190
|
stream.onAbort(release);
|
|
187
|
-
// Keep connection alive with heartbeat —
|
|
188
|
-
//
|
|
191
|
+
// Keep the connection alive with a heartbeat — see SSE_HEARTBEAT_INTERVAL_MS
|
|
192
|
+
// for the layer-by-layer rationale for the 15 s cadence.
|
|
189
193
|
try {
|
|
190
194
|
while (!stream.closed && !stream.aborted) {
|
|
191
195
|
if (isStalled()) {
|
|
192
196
|
stream.abort();
|
|
193
197
|
break;
|
|
194
198
|
}
|
|
195
|
-
|
|
199
|
+
writeTracked("ping", "");
|
|
196
200
|
await Promise.race([stream.sleep(SSE_HEARTBEAT_INTERVAL_MS), ended]);
|
|
197
201
|
}
|
|
198
202
|
}
|
package/dist/auth/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// `@cosmicdrift/kumiko-framework/auth` — Auth
|
|
2
|
-
//
|
|
3
|
-
// tenant, user)
|
|
4
|
-
// lifecycle,
|
|
1
|
+
// `@cosmicdrift/kumiko-framework/auth` — Auth foundation (roles, token-
|
|
2
|
+
// helpers, session types). Used by bundled features (auth-email-password,
|
|
3
|
+
// tenant, user) and data-protection features (user-data-rights, tenant-
|
|
4
|
+
// lifecycle, legal-hold).
|
|
5
5
|
export { ROLES } from "./roles.js";
|
package/dist/auth/roles.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Platform-wide standardized role names. All privacy-related code uses
|
|
3
|
+
* these constants exclusively instead of string literals.
|
|
4
4
|
*/
|
|
5
5
|
export declare const ROLES: {
|
|
6
6
|
readonly TenantOwner: "TenantOwner";
|
|
@@ -10,7 +10,7 @@ export declare const ROLES: {
|
|
|
10
10
|
readonly Member: "Member";
|
|
11
11
|
};
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* Union of all known role names for compile-time checks of
|
|
14
|
+
* handler access rules and ownership maps.
|
|
15
15
|
*/
|
|
16
16
|
export type Role = (typeof ROLES)[keyof typeof ROLES];
|
package/dist/auth/roles.js
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Central role constants for the platform.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// secrets, ai-foundation, file-provider-s3)
|
|
5
|
-
// handler, publicstatus, platform)
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
3
|
+
// Background: Bundled features have drifted between "Admin" (text-content,
|
|
4
|
+
// secrets, ai-foundation, file-provider-s3) and "TenantAdmin" (tenant-
|
|
5
|
+
// handler, publicstatus, platform), which can trap app builders.
|
|
6
|
+
// This file is the single source of truth. Bundled features are migrated
|
|
7
|
+
// gradually to the ROLES constants at touchpoints where they are already
|
|
8
|
+
// being changed.
|
|
9
9
|
//
|
|
10
|
-
// Canonical
|
|
11
|
-
// TenantOwner —
|
|
12
|
-
//
|
|
13
|
-
// TenantAdmin — Tenant
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// DataProtectionOfficer — DPO;
|
|
17
|
-
//
|
|
18
|
-
// SystemAdmin —
|
|
19
|
-
// Authority
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
// Member — Standard
|
|
24
|
-
//
|
|
10
|
+
// Canonical names:
|
|
11
|
+
// TenantOwner — Full tenant authority; the only role allowed
|
|
12
|
+
// to trigger tenant destruction.
|
|
13
|
+
// TenantAdmin — Tenant configuration and user management.
|
|
14
|
+
// The existing "Admin" string is migrated
|
|
15
|
+
// to this role.
|
|
16
|
+
// DataProtectionOfficer — DPO; sets legal holds and can view the
|
|
17
|
+
// authority audit stream even in silentMode.
|
|
18
|
+
// SystemAdmin — Platform operator (NOT tenant-scoped).
|
|
19
|
+
// Authority export, KMS recovery, cross-tenant
|
|
20
|
+
// setup. Matches the existing "SystemAdmin"
|
|
21
|
+
// string in text-content, secrets,
|
|
22
|
+
// auth-email-password, etc.
|
|
23
|
+
// Member — Standard tenant member without
|
|
24
|
+
// administrative rights.
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* Platform-wide standardized role names. All privacy-related code uses
|
|
27
|
+
* these constants exclusively instead of string literals.
|
|
28
28
|
*/
|
|
29
29
|
export const ROLES = {
|
|
30
30
|
TenantOwner: "TenantOwner",
|
|
@@ -1,35 +1,33 @@
|
|
|
1
|
-
// DurationSpec
|
|
1
|
+
// Converts between DurationSpec, SQL intervals, and Temporal.Duration.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// `{ days: number } | { hours: number }` (
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// `{ hours: 6 }`-Override stillschweigend auf einen days-Default.
|
|
3
|
+
// `ComplianceProfile.userRights.gracePeriod` is
|
|
4
|
+
// `{ days: number } | { hours: number }` (a discriminated union). Callers
|
|
5
|
+
// inserting it into a Postgres `interval` need one trusted conversion point;
|
|
6
|
+
// otherwise an `{ hours: 6 }` override could silently use a days default.
|
|
8
7
|
//
|
|
9
|
-
//
|
|
10
|
-
// retention
|
|
11
|
-
//
|
|
12
|
-
// Renderung total.
|
|
8
|
+
// This is the single source of truth. Other spec forms (months/years) in the
|
|
9
|
+
// retention path use the broader `keep-for` parser and are deliberately not
|
|
10
|
+
// supported here, keeping the type narrow and SQL rendering total.
|
|
13
11
|
import { getTemporal } from "../time/index.js";
|
|
14
|
-
//
|
|
15
|
-
//
|
|
12
|
+
// Millisecond representation of the spec. All conversions use this source
|
|
13
|
+
// of truth, including Instant addition and optional JavaScript date handling.
|
|
16
14
|
export function durationSpecToMs(spec) {
|
|
17
15
|
if ("days" in spec)
|
|
18
16
|
return spec.days * 24 * 60 * 60 * 1000;
|
|
19
17
|
return spec.hours * 60 * 60 * 1000;
|
|
20
18
|
}
|
|
21
|
-
//
|
|
22
|
-
// authoritative.
|
|
23
|
-
// where
|
|
24
|
-
//
|
|
19
|
+
// Computes the deadline without DB-now(); the app server clock is
|
|
20
|
+
// authoritative. This is used for Forget-Grace, token TTLs, and deadline
|
|
21
|
+
// assignments where a difference of a few milliseconds between the app and
|
|
22
|
+
// database is irrelevant (grace periods >= 6h, tokens >= minutes).
|
|
25
23
|
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
24
|
+
// Writes directly to `instant()` custom-type columns—no interval SQL
|
|
25
|
+
// fragment or codec bypass.
|
|
28
26
|
export function addDurationSpec(now, spec) {
|
|
29
27
|
return getTemporal().Instant.fromEpochMilliseconds(now.epochMilliseconds + durationSpecToMs(spec));
|
|
30
28
|
}
|
|
31
|
-
//
|
|
32
|
-
// English-only
|
|
29
|
+
// Human-readable descriptions for logs and error messages. Not localized;
|
|
30
|
+
// operator output is English-only.
|
|
33
31
|
export function describeDurationSpec(spec) {
|
|
34
32
|
if ("days" in spec)
|
|
35
33
|
return `${spec.days} day${spec.days === 1 ? "" : "s"}`;
|
package/dist/compliance/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
// `@cosmicdrift/kumiko-framework/compliance` —
|
|
2
|
-
//
|
|
3
|
-
// data-retention, user-data-rights, ...).
|
|
1
|
+
// `@cosmicdrift/kumiko-framework/compliance` — Data protection and compliance foundation.
|
|
2
|
+
// Used by compliance-profiles, data-retention, user-data-rights, and related features.
|
|
4
3
|
export { addDurationSpec, describeDurationSpec, durationSpecToMs, subtractRetentionSpec, } from "./duration-spec.js";
|
|
5
4
|
export { complianceProfileOverrideSchema } from "./override-schema.js";
|
|
6
5
|
export { COMPLIANCE_PROFILES, OVERRIDABLE_PROFILE_KEYS, resolveComplianceProfile, SELECTABLE_PROFILE_KEYS, } from "./profiles.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Complete schema for ComplianceProfileOverride. All top-level and
|
|
4
|
+
* sub-level keys are whitelisted with `.strict()`, so typos throw
|
|
5
|
+
* immediately. The set-profile handler validates the override against
|
|
6
|
+
* this schema before persisting it.
|
|
7
7
|
*/
|
|
8
8
|
export declare const complianceProfileOverrideSchema: z.ZodObject<{
|
|
9
9
|
userRights: z.ZodOptional<z.ZodObject<{
|
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
// Zod
|
|
2
|
-
// Sprint 1.9 Z3.
|
|
1
|
+
// Zod schema for ComplianceProfileOverride with recursive `.strict()` validation.
|
|
3
2
|
//
|
|
4
|
-
//
|
|
5
|
-
// OVERRIDABLE_PROFILE_KEYS. Sub-
|
|
6
|
-
// `{ userRights: { weeks: 3 } }`
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// crashed
|
|
3
|
+
// Previously, set-profile.write.ts checked only top-level keys against
|
|
4
|
+
// OVERRIDABLE_PROFILE_KEYS. Sub-level typos (for example,
|
|
5
|
+
// `{ userRights: { weeks: 3 } }` instead of
|
|
6
|
+
// `{ userRights: { gracePeriod: { days: 30 } } }`) passed through —
|
|
7
|
+
// deepMerge spliced the nonsense into the effective profile, and a caller
|
|
8
|
+
// reading `userRights.gracePeriod.days` crashed with `undefined`.
|
|
10
9
|
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// Sub-Level-Coverage.
|
|
10
|
+
// The schema maps the ComplianceProfile structure to DeepPartial form and
|
|
11
|
+
// uses `.strict()` on every object so unknown keys throw. It is a single
|
|
12
|
+
// source of truth like OVERRIDABLE_PROFILE_KEYS, with sub-level coverage.
|
|
15
13
|
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
// zerstören.
|
|
14
|
+
// Identification fields (`key`, `region`, `label`, `extends`) are excluded
|
|
15
|
+
// from the schema because overriding them would destroy profile identity.
|
|
19
16
|
import * as z from "zod";
|
|
20
17
|
// DurationSpec: { days } | { hours } — strict bedeutet beide Forms
|
|
21
18
|
// muessen exakt 1 property haben (kein "{ days: 30, hours: 1 }").
|
|
@@ -23,8 +20,8 @@ const durationSpecSchema = z.union([
|
|
|
23
20
|
z.object({ days: z.number().int().nonnegative() }).strict(),
|
|
24
21
|
z.object({ hours: z.number().int().nonnegative() }).strict(),
|
|
25
22
|
]);
|
|
26
|
-
// retention.*
|
|
27
|
-
//
|
|
23
|
+
// retention.* additionally allows `"months"` and `"years"`; this remains
|
|
24
|
+
// a strict disjunction.
|
|
28
25
|
const auditRetentionSchema = z.union([
|
|
29
26
|
durationSpecSchema,
|
|
30
27
|
z.object({ months: z.number().int().nonnegative() }).strict(),
|
|
@@ -54,7 +51,7 @@ const userRightsOverrideSchema = z
|
|
|
54
51
|
employeeAccessRight: z.boolean().optional(),
|
|
55
52
|
explicitConsentForAutomatedDecision: z.boolean().optional(),
|
|
56
53
|
doNotSellRequired: z.boolean().optional(),
|
|
57
|
-
// Async-Export-Pipeline
|
|
54
|
+
// Async-Export-Pipeline — TTL Compliance-relevant,
|
|
58
55
|
// Stale/Cleanup Operations-Settings.
|
|
59
56
|
exportDownloadTtl: durationSpecSchema.optional(),
|
|
60
57
|
exportStaleTimeoutMinutes: z.number().int().nonnegative().optional(),
|
|
@@ -106,10 +103,10 @@ const forgetDiscoveryOverrideSchema = z
|
|
|
106
103
|
})
|
|
107
104
|
.strict();
|
|
108
105
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
106
|
+
* Complete schema for ComplianceProfileOverride. All top-level and
|
|
107
|
+
* sub-level keys are whitelisted with `.strict()`, so typos throw
|
|
108
|
+
* immediately. The set-profile handler validates the override against
|
|
109
|
+
* this schema before persisting it.
|
|
113
110
|
*/
|
|
114
111
|
export const complianceProfileOverrideSchema = z
|
|
115
112
|
.object({
|
|
@@ -64,27 +64,25 @@ export interface ComplianceProfile {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
/**
|
|
67
|
-
* Profile
|
|
68
|
-
* `minimal-no-region`
|
|
69
|
-
*
|
|
70
|
-
*
|
|
67
|
+
* Profile keys that the tenant admin may select during onboarding.
|
|
68
|
+
* `minimal-no-region` is intentionally excluded: it is the default fallback
|
|
69
|
+
* for "no choice made yet" and produces a visible warning. Production
|
|
70
|
+
* tenants must select an actual profile.
|
|
71
71
|
*/
|
|
72
72
|
export declare const SELECTABLE_PROFILE_KEYS: readonly ["eu-dsgvo", "swiss-dsg", "de-hr-dsgvo-hgb"];
|
|
73
73
|
/**
|
|
74
|
-
* Top-
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* würde die Profile-Identität zerstoeren.
|
|
74
|
+
* Top-level `ComplianceProfile` properties that a tenant override may modify.
|
|
75
|
+
* Identity fields (key, region, label, extends) are excluded because
|
|
76
|
+
* overriding them would destroy the profile's identity.
|
|
78
77
|
*
|
|
79
|
-
*
|
|
80
|
-
* - set-profile
|
|
81
|
-
* -
|
|
78
|
+
* This is the single source of truth for:
|
|
79
|
+
* - the set-profile handler whitelist, which rejects typos
|
|
80
|
+
* - the snapshot test that guards against drift from the profile's top level
|
|
82
81
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* Richtungen.
|
|
82
|
+
* When a new top-level property is added to `ComplianceProfile` (for example,
|
|
83
|
+
* `dataSubjectRights` or `crossBorderTransferRules`), it must be added here;
|
|
84
|
+
* otherwise set-profile rejects valid overrides. The snapshot test in
|
|
85
|
+
* profiles.test.ts detects drift in either direction.
|
|
88
86
|
*/
|
|
89
87
|
export declare const OVERRIDABLE_PROFILE_KEYS: ReadonlySet<string>;
|
|
90
88
|
type DeepReadonly<T> = T extends object ? {
|
|
@@ -95,9 +93,9 @@ type DeepPartial<T> = T extends object ? {
|
|
|
95
93
|
[K in keyof T]?: DeepPartial<T[K]>;
|
|
96
94
|
} : T;
|
|
97
95
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
96
|
+
* Precomputed profile list with `extends` already resolved. It is computed
|
|
97
|
+
* once when the module loads, so definition errors (cycles or missing
|
|
98
|
+
* targets) are thrown immediately rather than on the first resolver call.
|
|
101
99
|
*/
|
|
102
100
|
export declare const COMPLIANCE_PROFILES: Readonly<Record<ComplianceProfileKey, ComplianceProfile>>;
|
|
103
101
|
export interface EffectiveComplianceProfile {
|
|
@@ -105,19 +103,18 @@ export interface EffectiveComplianceProfile {
|
|
|
105
103
|
readonly warning?: "no-profile-selected";
|
|
106
104
|
}
|
|
107
105
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
106
|
+
* Returns the effective compliance profile for a tenant, including its
|
|
107
|
+
* tenant override.
|
|
110
108
|
*
|
|
111
|
-
* Edge-
|
|
109
|
+
* Edge-case behavior:
|
|
112
110
|
* - selection=undefined → minimal-no-region + warning="no-profile-selected"
|
|
113
|
-
* - selection=valid + override=undefined → effective profile,
|
|
114
|
-
* - selection=valid + override → deep-merged effective,
|
|
111
|
+
* - selection=valid + override=undefined → effective profile, no warning
|
|
112
|
+
* - selection=valid + override → deep-merged effective profile, no warning
|
|
115
113
|
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
* bei Bedarf.
|
|
114
|
+
* The former "minimal-in-production" warning was removed because
|
|
115
|
+
* set-profile no longer accepts minimal-no-region as a tenant selection.
|
|
116
|
+
* Production-specific behavior, such as blocking the default, can be added
|
|
117
|
+
* later if needed.
|
|
121
118
|
*/
|
|
122
119
|
export declare function resolveComplianceProfile(args: {
|
|
123
120
|
readonly selection?: ComplianceProfileKey;
|