@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.
Files changed (468) hide show
  1. package/AGENTS.md +6 -1
  2. package/LICENSE +21 -57
  3. package/README.md +2 -2
  4. package/agents/examples/anonymous-access.md +1 -1
  5. package/agents/examples/apex-landing.md +204 -0
  6. package/agents/examples/api-worker-split.md +64 -0
  7. package/agents/examples/app-config.md +14 -0
  8. package/agents/examples/auth-mfa.md +115 -0
  9. package/agents/examples/env-composition.md +28 -1
  10. package/agents/examples/legal-pages.md +1 -1
  11. package/agents/examples/prod-boot-options.md +16 -0
  12. package/agents/examples/rate-limiting.md +48 -0
  13. package/agents/examples/record-detail-layout.md +692 -0
  14. package/agents/examples/seed-migration.md +212 -0
  15. package/agents/examples/wizard-form.md +941 -0
  16. package/agents/examples/writeform-section.md +548 -0
  17. package/agents/features.md +19 -2
  18. package/agents/widgets.md +40 -39
  19. package/dist/api/api-constants.js +2 -2
  20. package/dist/api/auth-middleware.js +7 -7
  21. package/dist/api/auth-rate-limiters.js +7 -3
  22. package/dist/api/auth-routes-mfa.js +1 -1
  23. package/dist/api/auth-routes-session.js +1 -1
  24. package/dist/api/auth-routes-shared.js +7 -3
  25. package/dist/api/auth-routes-signup.js +1 -1
  26. package/dist/api/client-error-route.js +8 -2
  27. package/dist/api/client-ip.js +3 -1
  28. package/dist/api/extra-route.js +1 -1
  29. package/dist/api/index.d.ts +3 -1
  30. package/dist/api/index.js +3 -1
  31. package/dist/api/pii-leak-guard.js +4 -2
  32. package/dist/api/readiness.js +5 -5
  33. package/dist/api/redis-sse-broker.js +8 -6
  34. package/dist/api/request-context.d.ts +1 -1
  35. package/dist/api/request-context.js +1 -1
  36. package/dist/api/routes.js +2 -2
  37. package/dist/api/server-boot-checks.d.ts +10 -0
  38. package/dist/api/server-boot-checks.js +157 -0
  39. package/dist/api/server-event-dispatcher.d.ts +26 -0
  40. package/dist/api/server-event-dispatcher.js +208 -0
  41. package/dist/api/server-extra-routes.d.ts +11 -0
  42. package/dist/api/server-extra-routes.js +203 -0
  43. package/dist/api/server-middleware.d.ts +20 -0
  44. package/dist/api/server-middleware.js +211 -0
  45. package/dist/api/server-routes.d.ts +19 -0
  46. package/dist/api/server-routes.js +293 -0
  47. package/dist/api/server-websocket-routes.d.ts +4 -0
  48. package/dist/api/server-websocket-routes.js +108 -0
  49. package/dist/api/server-wiring.d.ts +32 -0
  50. package/dist/api/server-wiring.js +236 -0
  51. package/dist/api/server.d.ts +10 -15
  52. package/dist/api/server.js +48 -1250
  53. package/dist/api/session-cookies.js +4 -4
  54. package/dist/api/sse-broker.js +1 -1
  55. package/dist/api/sse-route.d.ts +13 -13
  56. package/dist/api/sse-route.js +31 -27
  57. package/dist/auth/index.js +4 -4
  58. package/dist/auth/roles.d.ts +4 -4
  59. package/dist/auth/roles.js +24 -24
  60. package/dist/compliance/duration-spec.js +18 -20
  61. package/dist/compliance/index.js +2 -3
  62. package/dist/compliance/override-schema.d.ts +4 -4
  63. package/dist/compliance/override-schema.js +19 -22
  64. package/dist/compliance/profiles.d.ts +26 -29
  65. package/dist/compliance/profiles.js +62 -69
  66. package/dist/compliance/sub-processors.d.ts +28 -30
  67. package/dist/compliance/sub-processors.js +17 -21
  68. package/dist/consumer-cli.js +4 -4
  69. package/dist/crypto/blind-index.js +18 -17
  70. package/dist/crypto/ciphertext-pattern.js +1 -1
  71. package/dist/crypto/event-pii.js +3 -3
  72. package/dist/crypto/kek-source.d.ts +1 -1
  73. package/dist/crypto/kek-source.js +3 -2
  74. package/dist/crypto/kms-adapter.d.ts +1 -1
  75. package/dist/crypto/kms-adapter.js +4 -6
  76. package/dist/crypto/kms-wiring.d.ts +1 -2
  77. package/dist/crypto/kms-wiring.js +2 -2
  78. package/dist/crypto/owner-transition-rekey.d.ts +5 -1
  79. package/dist/crypto/owner-transition-rekey.js +1 -1
  80. package/dist/crypto/pg-kms-adapter.js +2 -6
  81. package/dist/crypto/pii-field-encryption.d.ts +5 -1
  82. package/dist/crypto/pii-field-encryption.js +7 -5
  83. package/dist/crypto/subject-resolver.d.ts +1 -1
  84. package/dist/crypto/subject-resolver.js +2 -2
  85. package/dist/db/aggregate-sql.d.ts +21 -0
  86. package/dist/db/aggregate-sql.js +155 -0
  87. package/dist/db/apply-entity-event.d.ts +6 -6
  88. package/dist/db/apply-entity-event.js +55 -55
  89. package/dist/db/blind-index-cleanup.js +7 -7
  90. package/dist/db/closed-connection.d.ts +9 -0
  91. package/dist/db/closed-connection.js +95 -0
  92. package/dist/db/collect-table-metas.js +10 -11
  93. package/dist/db/compound-types.d.ts +1 -1
  94. package/dist/db/compound-types.js +12 -12
  95. package/dist/db/cursor.js +3 -4
  96. package/dist/db/dialect.d.ts +2 -2
  97. package/dist/db/dialect.js +3 -3
  98. package/dist/db/distinct-on.d.ts +1 -1
  99. package/dist/db/driver-row-coercion.d.ts +2 -0
  100. package/dist/db/driver-row-coercion.js +186 -0
  101. package/dist/db/driver-value-preparation.d.ts +16 -0
  102. package/dist/db/driver-value-preparation.js +99 -0
  103. package/dist/db/eagerload.d.ts +3 -3
  104. package/dist/db/eagerload.js +21 -12
  105. package/dist/db/entity-field-encryption.d.ts +1 -0
  106. package/dist/db/entity-field-encryption.js +1 -1
  107. package/dist/db/entity-table-meta.d.ts +2 -2
  108. package/dist/db/entity-table-meta.js +105 -112
  109. package/dist/db/event-store-executor-context.d.ts +3 -2
  110. package/dist/db/event-store-executor-context.js +13 -13
  111. package/dist/db/event-store-executor-read-aggregate.d.ts +8 -0
  112. package/dist/db/event-store-executor-read-aggregate.js +112 -0
  113. package/dist/db/event-store-executor-read-filter.d.ts +31 -0
  114. package/dist/db/event-store-executor-read-filter.js +203 -0
  115. package/dist/db/event-store-executor-read-paging.d.ts +14 -0
  116. package/dist/db/event-store-executor-read-paging.js +99 -0
  117. package/dist/db/event-store-executor-read-rows.d.ts +6 -0
  118. package/dist/db/event-store-executor-read-rows.js +32 -0
  119. package/dist/db/event-store-executor-read-search.d.ts +28 -0
  120. package/dist/db/event-store-executor-read-search.js +221 -0
  121. package/dist/db/event-store-executor-read-sort.d.ts +41 -0
  122. package/dist/db/event-store-executor-read-sort.js +130 -0
  123. package/dist/db/event-store-executor-read-where.d.ts +24 -0
  124. package/dist/db/event-store-executor-read-where.js +81 -0
  125. package/dist/db/event-store-executor-read.d.ts +2 -9
  126. package/dist/db/event-store-executor-read.js +50 -704
  127. package/dist/db/event-store-executor-write-steps.d.ts +20 -0
  128. package/dist/db/event-store-executor-write-steps.js +100 -0
  129. package/dist/db/event-store-executor-write.js +401 -510
  130. package/dist/db/index.d.ts +6 -2
  131. package/dist/db/index.js +5 -1
  132. package/dist/db/list-aggregate-labels.d.ts +14 -0
  133. package/dist/db/list-aggregate-labels.js +26 -0
  134. package/dist/db/located-timestamp.d.ts +11 -11
  135. package/dist/db/located-timestamp.js +29 -30
  136. package/dist/db/migrate-generator.d.ts +1 -1
  137. package/dist/db/migrate-generator.js +97 -105
  138. package/dist/db/migrate-runner.js +29 -26
  139. package/dist/db/money.d.ts +6 -6
  140. package/dist/db/money.js +29 -27
  141. package/dist/db/queries/backfill-pii.js +5 -5
  142. package/dist/db/queries/ddl.js +1 -1
  143. package/dist/db/queries/es-ops.d.ts +1 -1
  144. package/dist/db/queries/es-ops.js +1 -1
  145. package/dist/db/queries/event-consumer.js +3 -3
  146. package/dist/db/queries/event-store.js +4 -2
  147. package/dist/db/queries/projection-rebuild.js +3 -3
  148. package/dist/db/queries/raw-sql.d.ts +2 -2
  149. package/dist/db/queries/raw-sql.js +2 -2
  150. package/dist/db/queries/shadow-swap.js +19 -19
  151. package/dist/db/query.d.ts +3 -16
  152. package/dist/db/query.js +8 -761
  153. package/dist/db/rebuild-marker.js +20 -21
  154. package/dist/db/reference-data.js +6 -1
  155. package/dist/db/replay-migration-sql.js +2 -2
  156. package/dist/db/schema-inspection.js +4 -5
  157. package/dist/db/table-builder.d.ts +1 -2
  158. package/dist/db/table-builder.js +137 -190
  159. package/dist/db/table-info.d.ts +10 -0
  160. package/dist/db/table-info.js +45 -0
  161. package/dist/db/temporal-value-guards.d.ts +6 -0
  162. package/dist/db/temporal-value-guards.js +15 -0
  163. package/dist/db/tenant-db-runner.d.ts +1 -0
  164. package/dist/db/tenant-db-runner.js +3 -0
  165. package/dist/db/tenant-db.d.ts +2 -2
  166. package/dist/db/tenant-db.js +48 -11
  167. package/dist/db/where-clause.d.ts +6 -0
  168. package/dist/db/where-clause.js +236 -0
  169. package/dist/derivatives/delete-stored-file.js +6 -2
  170. package/dist/derivatives/derivatives-context.js +1 -1
  171. package/dist/engine/boot-validator/access-roles.js +4 -3
  172. package/dist/engine/boot-validator/api-ext.js +14 -14
  173. package/dist/engine/boot-validator/boot-check.js +1 -1
  174. package/dist/engine/boot-validator/config-deps.js +7 -6
  175. package/dist/engine/boot-validator/detail-screens.js +4 -4
  176. package/dist/engine/boot-validator/entity-handler.d.ts +1 -0
  177. package/dist/engine/boot-validator/entity-handler.js +77 -61
  178. package/dist/engine/boot-validator/form-derivations.js +35 -1
  179. package/dist/engine/boot-validator/gdpr-storage.js +4 -4
  180. package/dist/engine/boot-validator/i18n-keys.js +6 -4
  181. package/dist/engine/boot-validator/index.d.ts +2 -2
  182. package/dist/engine/boot-validator/index.js +22 -20
  183. package/dist/engine/boot-validator/nav.js +5 -5
  184. package/dist/engine/boot-validator/ownership.js +12 -9
  185. package/dist/engine/boot-validator/parent-ref.js +1 -1
  186. package/dist/engine/boot-validator/pii-retention.js +258 -187
  187. package/dist/engine/boot-validator/projection-list-screens.js +7 -7
  188. package/dist/engine/boot-validator/query-refs.js +1 -1
  189. package/dist/engine/boot-validator/screens-actions.d.ts +1 -0
  190. package/dist/engine/boot-validator/screens-actions.js +23 -17
  191. package/dist/engine/boot-validator/screens-dashboard.js +2 -5
  192. package/dist/engine/boot-validator/screens-forms.js +12 -17
  193. package/dist/engine/boot-validator/screens-kind-config-edit.d.ts +3 -0
  194. package/dist/engine/boot-validator/screens-kind-config-edit.js +88 -0
  195. package/dist/engine/boot-validator/screens-kind-entity-edit.d.ts +3 -0
  196. package/dist/engine/boot-validator/screens-kind-entity-edit.js +55 -0
  197. package/dist/engine/boot-validator/screens-kind-entity-list.d.ts +3 -0
  198. package/dist/engine/boot-validator/screens-kind-entity-list.js +228 -0
  199. package/dist/engine/boot-validator/screens-kind-projection-detail.d.ts +3 -0
  200. package/dist/engine/boot-validator/screens-kind-projection-detail.js +235 -0
  201. package/dist/engine/boot-validator/screens-kind-projection-list.d.ts +3 -0
  202. package/dist/engine/boot-validator/screens-kind-projection-list.js +52 -0
  203. package/dist/engine/boot-validator/screens-kind-secret-mint.d.ts +3 -0
  204. package/dist/engine/boot-validator/screens-kind-secret-mint.js +28 -0
  205. package/dist/engine/boot-validator/screens-kind-shared.d.ts +37 -0
  206. package/dist/engine/boot-validator/screens-kind-shared.js +142 -0
  207. package/dist/engine/boot-validator/screens-lists.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-lists.js +26 -24
  209. package/dist/engine/boot-validator/screens.d.ts +0 -2
  210. package/dist/engine/boot-validator/screens.js +102 -869
  211. package/dist/engine/boot-validator/security-baseline.js +3 -2
  212. package/dist/engine/boot-validator/transfer-graph.js +2 -2
  213. package/dist/engine/boot-validator/workspaces.js +3 -3
  214. package/dist/engine/bridge-stub.js +3 -4
  215. package/dist/engine/build-app-schema.js +130 -170
  216. package/dist/engine/build-config-feature-schema.js +50 -50
  217. package/dist/engine/build-target.js +20 -23
  218. package/dist/engine/codemod/pipeline-codemod.js +20 -13
  219. package/dist/engine/config-helpers.js +4 -4
  220. package/dist/engine/constants.js +2 -2
  221. package/dist/engine/create-app.js +2 -2
  222. package/dist/engine/define-feature.js +21 -13
  223. package/dist/engine/define-handler.js +13 -11
  224. package/dist/engine/define-step.js +1 -1
  225. package/dist/engine/define-workflow.d.ts +5 -5
  226. package/dist/engine/define-workflow.js +6 -6
  227. package/dist/engine/entity-handlers.d.ts +13 -0
  228. package/dist/engine/entity-handlers.js +22 -34
  229. package/dist/engine/entity-list-runtime-options.d.ts +8 -0
  230. package/dist/engine/entity-list-runtime-options.js +18 -0
  231. package/dist/engine/event-def.js +2 -2
  232. package/dist/engine/extension-names.d.ts +16 -17
  233. package/dist/engine/extension-names.js +37 -38
  234. package/dist/engine/extensions/escape-hatch-usage.js +1 -1
  235. package/dist/engine/extensions/tenant-data.js +2 -2
  236. package/dist/engine/extensions/user-data.d.ts +23 -24
  237. package/dist/engine/factories.d.ts +14 -13
  238. package/dist/engine/factories.js +38 -37
  239. package/dist/engine/feature-ast/entity-field-types.js +1 -1
  240. package/dist/engine/feature-ast/extractors/handlers.js +2 -1
  241. package/dist/engine/feature-ast/extractors/hooks.js +1 -1
  242. package/dist/engine/feature-ast/extractors/round2.js +25 -6
  243. package/dist/engine/feature-ast/extractors/shared.d.ts +2 -3
  244. package/dist/engine/feature-ast/extractors/shared.js +2 -3
  245. package/dist/engine/feature-ast/parse.js +13 -13
  246. package/dist/engine/feature-ast/patch.js +4 -182
  247. package/dist/engine/feature-ast/pattern-change-schema.d.ts +3 -0
  248. package/dist/engine/feature-ast/pattern-change-schema.js +2 -1
  249. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +7 -0
  250. package/dist/engine/feature-ast/pattern-id-matchers.js +210 -0
  251. package/dist/engine/feature-ast/patterns.d.ts +11 -2
  252. package/dist/engine/feature-ast/patterns.js +43 -51
  253. package/dist/engine/feature-ast/render.js +50 -89
  254. package/dist/engine/feature-config-events-jobs.js +15 -12
  255. package/dist/engine/feature-entity-handlers.js +12 -5
  256. package/dist/engine/feature-manifest.d.ts +9 -9
  257. package/dist/engine/feature-manifest.js +6 -7
  258. package/dist/engine/feature-ui-extensions.d.ts +3 -3
  259. package/dist/engine/feature-ui-extensions.js +30 -22
  260. package/dist/engine/field-access.js +5 -6
  261. package/dist/engine/form-derivations.js +18 -7
  262. package/dist/engine/handler-field-references.js +1 -1
  263. package/dist/engine/index.d.ts +1 -0
  264. package/dist/engine/index.js +4 -4
  265. package/dist/engine/object-form.d.ts +1 -0
  266. package/dist/engine/object-form.js +14 -4
  267. package/dist/engine/ownership.js +3 -3
  268. package/dist/engine/parse-ref-target.js +5 -7
  269. package/dist/engine/pattern-library/index.js +2 -2
  270. package/dist/engine/pattern-library/library.js +2 -2
  271. package/dist/engine/pattern-library/types.js +3 -3
  272. package/dist/engine/pipeline.js +2 -2
  273. package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
  274. package/dist/engine/project-app-schema-for-roles.js +7 -5
  275. package/dist/engine/projection-helpers.js +9 -9
  276. package/dist/engine/qualified-name.js +2 -2
  277. package/dist/engine/registry-facade.js +1 -1
  278. package/dist/engine/registry-ingest.js +13 -13
  279. package/dist/engine/registry-state.js +17 -19
  280. package/dist/engine/registry-validate.js +12 -12
  281. package/dist/engine/run-in.js +2 -2
  282. package/dist/engine/run-pipeline.js +7 -0
  283. package/dist/engine/schema-builder.js +251 -233
  284. package/dist/engine/screen-filter-ops.js +17 -20
  285. package/dist/engine/screen-helpers.js +4 -3
  286. package/dist/engine/screen-kind.d.ts +7 -0
  287. package/dist/engine/screen-kind.js +1 -0
  288. package/dist/engine/state-machine.d.ts +12 -12
  289. package/dist/engine/state-machine.js +7 -7
  290. package/dist/engine/steps/_resolver-utils.js +4 -3
  291. package/dist/engine/steps/for-each.js +4 -4
  292. package/dist/engine/steps/unsafe-projection-delete.js +1 -1
  293. package/dist/engine/steps/unsafe-projection-upsert.js +4 -4
  294. package/dist/engine/steps/wait-for-event.js +4 -4
  295. package/dist/engine/steps/workflow-system-events.js +3 -3
  296. package/dist/engine/strip-disabled-features-from-app-schema.js +51 -14
  297. package/dist/engine/tier-resolver-extension.d.ts +29 -27
  298. package/dist/engine/tier-resolver-extension.js +26 -26
  299. package/dist/engine/transfer-adjacency.js +2 -2
  300. package/dist/engine/validate-projection-allowlist.js +9 -28
  301. package/dist/engine/walk-step-instances.d.ts +2 -0
  302. package/dist/engine/walk-step-instances.js +38 -0
  303. package/dist/engine/where-rule-lint.js +1 -1
  304. package/dist/engine/write-handler-qn-extract.js +1 -1
  305. package/dist/entrypoint/index.d.ts +4 -1
  306. package/dist/entrypoint/index.js +10 -4
  307. package/dist/env/index.d.ts +7 -6
  308. package/dist/env/index.js +10 -9
  309. package/dist/errors/docs-url.d.ts +1 -1
  310. package/dist/errors/docs-url.js +22 -2
  311. package/dist/errors/transition-details.js +7 -7
  312. package/dist/errors/write-error-info.d.ts +6 -6
  313. package/dist/errors/write-error-info.js +6 -6
  314. package/dist/es-ops/context.d.ts +9 -9
  315. package/dist/es-ops/context.js +29 -29
  316. package/dist/es-ops/index.js +7 -9
  317. package/dist/es-ops/operations-schema.js +4 -10
  318. package/dist/es-ops/runner.d.ts +11 -11
  319. package/dist/es-ops/runner.js +49 -53
  320. package/dist/es-ops/types.d.ts +55 -55
  321. package/dist/es-ops/types.js +11 -11
  322. package/dist/event-store/admin-api.js +7 -8
  323. package/dist/event-store/errors.js +1 -1
  324. package/dist/event-store/event-store.js +12 -6
  325. package/dist/event-store/rebuild-dead-letter.js +1 -1
  326. package/dist/files/bind-pending-file-refs.js +3 -3
  327. package/dist/files/create-file-ref-from-bytes.js +4 -1
  328. package/dist/files/feature.js +9 -10
  329. package/dist/files/file-handle.js +7 -9
  330. package/dist/files/file-ref-entity.js +15 -15
  331. package/dist/files/file-ref-table.js +7 -8
  332. package/dist/files/file-routes.d.ts +7 -0
  333. package/dist/files/file-routes.js +22 -13
  334. package/dist/files/in-memory-provider.js +8 -9
  335. package/dist/files/local-provider.js +18 -25
  336. package/dist/files/provider-resolver.d.ts +7 -7
  337. package/dist/files/resolve-content-type.js +43 -0
  338. package/dist/files/storage-tracking.js +2 -2
  339. package/dist/files/upload-ledger.js +7 -0
  340. package/dist/files/zip-stream.d.ts +12 -19
  341. package/dist/files/zip-stream.js +44 -63
  342. package/dist/i18n/required-surface-keys.d.ts +1 -1
  343. package/dist/i18n/required-surface-keys.js +188 -212
  344. package/dist/internal/stack-support.d.ts +2 -1
  345. package/dist/internal/stack-support.js +1 -1
  346. package/dist/jobs/job-runner-context.d.ts +32 -0
  347. package/dist/jobs/job-runner-context.js +305 -0
  348. package/dist/jobs/job-runner-execution.d.ts +7 -0
  349. package/dist/jobs/job-runner-execution.js +160 -0
  350. package/dist/jobs/job-runner-gates.d.ts +19 -0
  351. package/dist/jobs/job-runner-gates.js +198 -0
  352. package/dist/jobs/job-runner-helpers.d.ts +17 -3
  353. package/dist/jobs/job-runner-helpers.js +69 -4
  354. package/dist/jobs/job-runner-schedulers.d.ts +1 -1
  355. package/dist/jobs/job-runner-schedulers.js +3 -4
  356. package/dist/jobs/job-runner-scope.d.ts +44 -0
  357. package/dist/jobs/job-runner-scope.js +102 -0
  358. package/dist/jobs/job-runner-types.d.ts +12 -0
  359. package/dist/jobs/job-runner.d.ts +0 -1
  360. package/dist/jobs/job-runner.js +57 -669
  361. package/dist/lifecycle/lifecycle.js +3 -5
  362. package/dist/lifecycle/signal-handlers.js +5 -4
  363. package/dist/logging/utils.d.ts +2 -1
  364. package/dist/logging/utils.js +38 -10
  365. package/dist/migrations/index.js +1 -1
  366. package/dist/migrations/kumiko-drift.js +14 -13
  367. package/dist/migrations/pending-rebuilds.d.ts +21 -20
  368. package/dist/migrations/pending-rebuilds.js +27 -27
  369. package/dist/migrations/projection-table-index.d.ts +3 -3
  370. package/dist/migrations/projection-table-index.js +8 -8
  371. package/dist/observability/escape-hatch-report.d.ts +3 -0
  372. package/dist/observability/escape-hatch-report.js +12 -1
  373. package/dist/observability/metric-validator.js +1 -1
  374. package/dist/observability/metrics-handle.js +3 -3
  375. package/dist/pipeline/append-event-core.js +11 -2
  376. package/dist/pipeline/cascade-handler.d.ts +1 -1
  377. package/dist/pipeline/cascade-handler.js +165 -138
  378. package/dist/pipeline/dispatch-batch.js +2 -2
  379. package/dist/pipeline/dispatch-query.js +20 -13
  380. package/dist/pipeline/dispatch-shared.d.ts +14 -3
  381. package/dist/pipeline/dispatch-shared.js +67 -721
  382. package/dist/pipeline/dispatch-stream.js +1 -1
  383. package/dist/pipeline/dispatch-write.js +297 -190
  384. package/dist/pipeline/dispatcher-utils.d.ts +1 -1
  385. package/dist/pipeline/dispatcher-utils.js +1 -1
  386. package/dist/pipeline/event-consumer-state.js +2 -2
  387. package/dist/pipeline/event-dispatcher-admin.js +2 -1
  388. package/dist/pipeline/event-dispatcher-delivery.js +4 -6
  389. package/dist/pipeline/event-dispatcher.js +17 -28
  390. package/dist/pipeline/handler-context-auth.d.ts +9 -0
  391. package/dist/pipeline/handler-context-auth.js +54 -0
  392. package/dist/pipeline/handler-context-config.d.ts +14 -0
  393. package/dist/pipeline/handler-context-config.js +113 -0
  394. package/dist/pipeline/handler-context-db.d.ts +24 -0
  395. package/dist/pipeline/handler-context-db.js +149 -0
  396. package/dist/pipeline/handler-context-dispatch.d.ts +21 -0
  397. package/dist/pipeline/handler-context-dispatch.js +89 -0
  398. package/dist/pipeline/handler-context-events.d.ts +43 -0
  399. package/dist/pipeline/handler-context-events.js +237 -0
  400. package/dist/pipeline/handler-context-notify.d.ts +12 -0
  401. package/dist/pipeline/handler-context-notify.js +55 -0
  402. package/dist/pipeline/handler-context-observability.d.ts +7 -0
  403. package/dist/pipeline/handler-context-observability.js +21 -0
  404. package/dist/pipeline/handler-context-scope.d.ts +48 -0
  405. package/dist/pipeline/handler-context-scope.js +88 -0
  406. package/dist/pipeline/irreversible-operation-gate.js +1 -1
  407. package/dist/pipeline/lifecycle-pipeline.js +9 -9
  408. package/dist/pipeline/member-read-only-transaction.js +1 -3
  409. package/dist/pipeline/msp-rebuild.js +1 -1
  410. package/dist/pipeline/notify-scope.js +12 -1
  411. package/dist/pipeline/pre-handler-gates.js +20 -4
  412. package/dist/pipeline/pre-transaction-reservations.d.ts +1 -0
  413. package/dist/pipeline/pre-transaction-reservations.js +9 -3
  414. package/dist/pipeline/projection-rebuild.js +15 -13
  415. package/dist/pipeline/system-hooks.js +39 -41
  416. package/dist/pipeline/system-identity-switch.js +1 -3
  417. package/dist/pipeline/tenant-timezone-cache.js +1 -1
  418. package/dist/random/generate.d.ts +29 -29
  419. package/dist/random/generate.js +30 -30
  420. package/dist/random/words.js +20 -20
  421. package/dist/rate-limit/middleware.js +9 -5
  422. package/dist/redis/client.js +2 -2
  423. package/dist/redis/pubsub-signal.js +14 -17
  424. package/dist/schema-cli/apply-command.d.ts +2 -0
  425. package/dist/schema-cli/apply-command.js +97 -0
  426. package/dist/schema-cli/baseline-command.d.ts +2 -0
  427. package/dist/schema-cli/baseline-command.js +33 -0
  428. package/dist/schema-cli/generate-command.d.ts +2 -0
  429. package/dist/schema-cli/generate-command.js +90 -0
  430. package/dist/schema-cli/shared.d.ts +39 -0
  431. package/dist/schema-cli/shared.js +95 -0
  432. package/dist/schema-cli/status-command.d.ts +2 -0
  433. package/dist/schema-cli/status-command.js +73 -0
  434. package/dist/schema-cli/validate-boot-input.d.ts +5 -0
  435. package/dist/schema-cli/validate-boot-input.js +130 -0
  436. package/dist/schema-cli/validate-command.d.ts +2 -0
  437. package/dist/schema-cli/validate-command.js +130 -0
  438. package/dist/schema-cli.d.ts +2 -18
  439. package/dist/schema-cli.js +47 -510
  440. package/dist/search/index.js +4 -4
  441. package/dist/search/meilisearch-adapter.js +2 -1
  442. package/dist/search/purge-subject.js +4 -5
  443. package/dist/search/reindex-entity.js +6 -9
  444. package/dist/time/boot-tz-warning.d.ts +2 -2
  445. package/dist/time/boot-tz-warning.js +8 -8
  446. package/dist/time/iana.js +10 -10
  447. package/dist/time/index.js +9 -9
  448. package/dist/time/legacy-date.d.ts +2 -2
  449. package/dist/time/legacy-date.js +6 -8
  450. package/dist/time/polyfill.js +1 -1
  451. package/dist/time/tz-context.d.ts +1 -1
  452. package/dist/time/tz-context.js +1 -1
  453. package/dist/ui-types/app-schema.js +7 -7
  454. package/dist/ui-types/list-row-meta.js +4 -4
  455. package/dist/upgrade-cli.js +159 -130
  456. package/dist/utils/compare.js +1 -1
  457. package/package.json +5 -5
  458. package/src/changes.json +358 -0
  459. package/src/scripts/codemod/crypto-shredding-testing-move.ts +2 -2
  460. package/src/scripts/codemod/feature-layout.ts +10 -2
  461. package/src/scripts/codemod/migrate-cross-tenant.ts +1 -1
  462. package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
  463. package/src/scripts/codemod/object-form.ts +41 -4
  464. package/src/scripts/codemod/package-merge.ts +58 -8
  465. package/src/scripts/codemod/pii-personal-migration.ts +192 -153
  466. package/src/scripts/codemod/testing-injection.ts +122 -42
  467. package/src/scripts/codemod/testing-move.ts +29 -7
  468. 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
- if (cookies.secure) {
57
- deleteCookie(c, sessionCookieName(AUTH_COOKIE_BASE, { secure: true }), hostPrefixedDelete);
58
- deleteCookie(c, sessionCookieName(CSRF_COOKIE_BASE, { secure: true }), hostPrefixedDelete);
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
@@ -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 (fw#2625) whenever REDIS_URL is set, which is what
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();
@@ -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-Cadence für SSE-Streams.
5
+ * Heartbeat cadence for SSE streams.
6
6
  *
7
- * Spec: muss UNTER jedem realistischen Idle-Timeout der Hop-by-Hop-Layer
8
- * liegen, sonst killt einer davon die Connection und der Browser sieht
9
- * ERR_HTTP2_PROTOCOL_ERROR. Bekannte Limits:
10
- * - Bun.serve default: 10 s (lokal disabled via idleTimeout: 0,
11
- * aber Spec-konform auch ohne Override)
12
- * - Caddy reverse_proxy: kein default-Timeout für SSE (auto-detect
13
- * via Content-Type), aber langlebige idle Streams können von
14
- * Connection-Tracking dichtgemacht werden
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 liegt komfortabel unter allen davon. Server-side Cost ist
19
- * marginal (1 Frame pro Client alle 15 s).
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
- * Spec-Test in __tests__/sse-route-spec.test.ts pinst diesen Wert
22
- * gegen versehentliches Hochsetzen.
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;
@@ -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-Cadence für SSE-Streams.
12
+ * Heartbeat cadence for SSE streams.
13
13
  *
14
- * Spec: muss UNTER jedem realistischen Idle-Timeout der Hop-by-Hop-Layer
15
- * liegen, sonst killt einer davon die Connection und der Browser sieht
16
- * ERR_HTTP2_PROTOCOL_ERROR. Bekannte Limits:
17
- * - Bun.serve default: 10 s (lokal disabled via idleTimeout: 0,
18
- * aber Spec-konform auch ohne Override)
19
- * - Caddy reverse_proxy: kein default-Timeout für SSE (auto-detect
20
- * via Content-Type), aber langlebige idle Streams können von
21
- * Connection-Tracking dichtgemacht werden
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 liegt komfortabel unter allen davon. Server-side Cost ist
26
- * marginal (1 Frame pro Client alle 15 s).
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
- * Spec-Test in __tests__/sse-route-spec.test.ts pinst diesen Wert
29
- * gegen versehentliches Hochsetzen.
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
- const data = JSON.stringify(frame.data);
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 — siehe SSE_HEARTBEAT_INTERVAL_MS
188
- // header für die Layer-für-Layer-Begründung der 15s-Cadence.
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
- await stream.writeSSE({ event: "ping", data: "" });
199
+ writeTracked("ping", "");
196
200
  await Promise.race([stream.sleep(SSE_HEARTBEAT_INTERVAL_MS), ended]);
197
201
  }
198
202
  }
@@ -1,5 +1,5 @@
1
- // `@cosmicdrift/kumiko-framework/auth` — Auth-Foundation (Roles, Token-
2
- // Helpers, Session-Types). Wird von Bundled-Features (auth-email-password,
3
- // tenant, user) und Datenschutz-Sprints (S1+ user-data-rights, S5 tenant-
4
- // lifecycle, S6 legal-hold) genutzt.
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";
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Plattform-weit standardisierte Role-Namen. Alle Datenschutz-Sprints
3
- * (1+) nutzen ausschliesslich diese Constants statt String-Literale.
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
- * Type-Union aller bekannten Role-Namen (Compile-Time-Check fuer
14
- * Handler-Access-Rules + Ownership-Maps).
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];
@@ -1,30 +1,30 @@
1
- // Zentrale Role-Konstanten der Plattform.
1
+ // Central role constants for the platform.
2
2
  //
3
- // Hintergrund: Bundled-Features driften zwischen "Admin" (text-content,
4
- // secrets, ai-foundation, file-provider-s3) und "TenantAdmin" (tenant-
5
- // handler, publicstatus, platform). App-Builder fallen in diese Falle.
6
- // Diese Datei ist die Single Source of Truth — Bundled-Features
7
- // migrieren schrittweise auf die ROLES-Constants in den Sprint-
8
- // Touchpoints, an denen sie ohnehin angefasst werden.
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-Names:
11
- // TenantOwner — Volle Tenant-Hoheit, einzige Rolle die
12
- // Tenant-Destroy triggern darf.
13
- // TenantAdmin — Tenant-Konfiguration + User-Management.
14
- // Bestehender String "Admin" wird hierauf
15
- // migriert.
16
- // DataProtectionOfficer — DPO; setzt Legal-Holds, sieht Authority-
17
- // Audit-Stream auch im silentMode (Sprint 6).
18
- // SystemAdmin — Plattform-Operator (NICHT Tenant-scoped).
19
- // Authority-Export, KMS-Recovery, Cross-
20
- // Tenant-Setup. Matched den bestehenden
21
- // "SystemAdmin"-String in text-content,
22
- // secrets, auth-email-password, etc.
23
- // Member — Standard-Mitglied eines Tenants ohne
24
- // Admin-Rechte.
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
- * Plattform-weit standardisierte Role-Namen. Alle Datenschutz-Sprints
27
- * (1+) nutzen ausschliesslich diese Constants statt String-Literale.
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 ↔ SQL-Interval ↔ Temporal.Duration converter.
1
+ // Converts between DurationSpec, SQL intervals, and Temporal.Duration.
2
2
  //
3
- // Hintergrund: ComplianceProfile.userRights.gracePeriod ist
4
- // `{ days: number } | { hours: number }` (Discriminated Union). Caller
5
- // die das in eine Postgres-`interval`-SQL einsetzen brauchen einen
6
- // einzigen vertrauenswuerdigen Punkt, sonst springt ein
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
- // Single source of truth: hier. Andere Spec-Forms (months/years) im
10
- // retention-Pfad gehen ueber den breiteren `keep-for`-Parser, sind hier
11
- // bewusst nicht abgedeckt — das engt den Type ein und macht die SQL-
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
- // Spec in Millisekunden. Source of truth fuer alle Konvertierungen
15
- // (Instant-add, optional fuer JS-Datumsrechnung).
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
- // Frist berechnen ohne DB-now() — der App-Server-Clock ist
22
- // authoritative. Fuer Forget-Grace, Token-TTLs und Frist-Setzungen
23
- // where eine Toleranz von wenigen ms zwischen App und DB irrelevant
24
- // ist (Grace-Periods >= 6h, Tokens >= Minuten).
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
- // Schreibt direkt in `instant()`-customType-Spalten — kein interval-
27
- // SQL-Fragment, kein Codec-Bypass.
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
- // Lesbare Beschreibung fuer Logs / Error-Messages. Nicht i18n —
32
- // English-only-Operator-Output.
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"}`;
@@ -1,6 +1,5 @@
1
- // `@cosmicdrift/kumiko-framework/compliance` — Datenschutz/Compliance-
2
- // Foundation. Wird von Sprint-1+ Features genutzt (compliance-profiles,
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
- * Komplett-Schema fuer ComplianceProfileOverride. Alle Top-Level- UND
4
- * Sub-Level-Keys sind gewhitelisted via .strict() — Tippfehler werfen
5
- * sofort. Set-profile-Handler (Sprint 1.9 Z3) validiert das Override
6
- * gegen dieses Schema vor dem Persist.
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-Schema fuer ComplianceProfileOverride mit .strict() rekursiv —
2
- // Sprint 1.9 Z3.
1
+ // Zod schema for ComplianceProfileOverride with recursive `.strict()` validation.
3
2
  //
4
- // Vorher: set-profile.write.ts pruefte nur Top-Level-Keys gegen
5
- // OVERRIDABLE_PROFILE_KEYS. Sub-Level-Tippfehler (z.B.
6
- // `{ userRights: { weeks: 3 } }` statt `{ userRights: { gracePeriod: { days: 30 } } }`)
7
- // kamen durch — der deepMerge spliced das nonsense ins effektive
8
- // Profile, und ein Caller der `userRights.gracePeriod.days` liest
9
- // crashed mit `undefined`.
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
- // Lösung: Zod-Schema das die ComplianceProfile-Struktur in DeepPartial-
12
- // Form abbildet, mit .strict() auf jedem Object damit unbekannte Keys
13
- // werfen. Single source of truth wie OVERRIDABLE_PROFILE_KEYS, plus
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
- // Identifikations-Felder (key, region, label, extends) sind NICHT im
17
- // Schema — wer die overriden will, würde die Profile-Identitaet
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.* erlaubt zusaetzlich "months" und "years". Wieder eine
27
- // strikte Disjunktion.
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 (S2.U3+U4) — TTL Compliance-relevant,
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
- * Komplett-Schema fuer ComplianceProfileOverride. Alle Top-Level- UND
110
- * Sub-Level-Keys sind gewhitelisted via .strict() — Tippfehler werfen
111
- * sofort. Set-profile-Handler (Sprint 1.9 Z3) validiert das Override
112
- * gegen dieses Schema vor dem Persist.
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-Schluessel die der Tenant-Admin im Onboarding waehlen darf.
68
- * `minimal-no-region` ist bewusst NICHT in der Liste — es ist der
69
- * Default-Fallback fuer "noch keine Wahl getroffen", mit sichtbarer
70
- * Warning. Production-Tenants sollen ein echtes Profile waehlen.
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-Level-Properties des `ComplianceProfile`-Type, die ein Tenant-
75
- * Override modifizieren darf. Identifikations-Felder (key, region,
76
- * label, extends) sind ausgeschlossen — wer die overriden wuerde,
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
- * Single source of truth fuer:
80
- * - set-profile-Handler-Whitelist (Tippfehler-Reject)
81
- * - Snapshot-Test gegen Profile-Top-Level (Drift-Guard)
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
- * Wenn ein neues Top-Level-Property zu `ComplianceProfile` kommt
84
- * (z.B. `dataSubjectRights` oder `crossBorderTransferRules`), MUSS es
85
- * hier ergaenzt werden — sonst lehnt set-profile valide Overrides ab.
86
- * Der Snapshot-Test in profiles.test.ts faengt Drift in beide
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
- * Pre-baked Profile-Liste (extends bereits aufgelöst). Beim Modul-Load
99
- * einmal berechnet — wirft bei Definition-Fehlern (Cycle, missing target)
100
- * sofort, nicht erst beim ersten Resolver-Call.
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
- * Liefert das effektive Compliance-Profile fuer einen Tenant inklusive
109
- * Tenant-Override.
106
+ * Returns the effective compliance profile for a tenant, including its
107
+ * tenant override.
110
108
  *
111
- * Edge-Case-Verhalten (gepinnt):
109
+ * Edge-case behavior:
112
110
  * - selection=undefined → minimal-no-region + warning="no-profile-selected"
113
- * - selection=valid + override=undefined → effective profile, kein warning
114
- * - selection=valid + override → deep-merged effective, kein warning
111
+ * - selection=valid + override=undefined → effective profile, no warning
112
+ * - selection=valid + override → deep-merged effective profile, no warning
115
113
  *
116
- * Production-Marker: das frueher hier vorgesehene "minimal-in-production"-
117
- * warning ist entfallen weil set-profile (Sprint 1.7 X1) minimal-no-region
118
- * nicht mehr als Tenant-Wahl akzeptiert. Wer Production-spezifisches
119
- * Verhalten braucht (z.B. Block-bei-Default), addiert den Marker spaeter
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;