@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
@@ -35,8 +35,8 @@ function isI18nKey(value) {
35
35
  /**
36
36
  * `treatAsKey` bypasses the colon-only `isI18nKey` check — used by the Settings-Hub
37
37
  * generator's dot-form labels (`${feature}.settings`, mask titles), which are
38
- * always i18n references by construction, never literal display text (fw#2260).
39
- * `isI18nKey` itself also accepts dot-form labels explicitly marked via `i18nKey()` (fw#2313).
38
+ * always i18n references by construction, never literal display text.
39
+ * `isI18nKey` itself also accepts dot-form labels explicitly marked via `i18nKey()`.
40
40
  */
41
41
  function pushKey(out, value, treatAsKey = false) {
42
42
  if (value !== undefined && (treatAsKey || isI18nKey(value)))
@@ -112,7 +112,7 @@ function pushDashboardScreenKeys(out, dashboard) {
112
112
  pushRowActionKeys(out, action);
113
113
  }
114
114
  function pushDashboardPanelKeys(out, panel) {
115
- // skip: custom-Panel übersetzt sich selbst, kein Key hier
115
+ // skip: custom panels translate themselves, so no key is collected here
116
116
  if (panel.kind === "custom")
117
117
  return;
118
118
  pushKey(out, panel.label);
@@ -221,221 +221,198 @@ function pushExpandableRowKeys(out, section) {
221
221
  pushRowActionKeys(out, section.emptyState.action);
222
222
  }
223
223
  }
224
- export function requiredKeysFromScreen(featureName, screen, options = {}) {
225
- const { treatDotFormAsKey = false } = options;
226
- const out = new Set();
227
- pushKey(out, screenTitleKey(screen.id));
228
- switch (screen.type) {
229
- case "entityList": {
230
- const list = screen;
231
- for (const col of list.columns) {
232
- const normalized = normalizeListColumn(col);
233
- if (normalized.label !== undefined) {
234
- pushKey(out, normalized.label);
235
- }
236
- else {
237
- out.add(fieldLabelKey(featureName, list.entity, normalized.field));
238
- }
239
- }
240
- pushKey(out, list.createLabel);
241
- pushKey(out, list.searchPlaceholder);
242
- pushKey(out, list.description);
243
- pushListEmptyStateKeys(out, list.emptyState);
244
- for (const action of list.rowActions ?? [])
245
- pushRowActionKeys(out, action);
246
- for (const action of list.toolbarActions ?? [])
247
- pushToolbarActionKeys(out, action);
248
- if (list.expandableRow !== undefined)
249
- pushExpandableRowKeys(out, list.expandableRow);
250
- break;
224
+ function pushFieldLabelOrOverrideKey(ctx, labelEntity, fieldName, fieldLabels, treatAsKey = false) {
225
+ const override = fieldLabels?.[fieldName];
226
+ if (override !== undefined)
227
+ pushKey(ctx.out, override, treatAsKey);
228
+ else
229
+ ctx.out.add(fieldLabelKey(ctx.featureName, labelEntity, fieldName));
230
+ }
231
+ function pushListChromeKeys(out, list) {
232
+ pushKey(out, list.createLabel);
233
+ pushKey(out, list.searchPlaceholder);
234
+ pushKey(out, list.description);
235
+ pushListEmptyStateKeys(out, list.emptyState);
236
+ for (const action of list.rowActions ?? [])
237
+ pushRowActionKeys(out, action);
238
+ for (const action of list.toolbarActions ?? [])
239
+ pushToolbarActionKeys(out, action);
240
+ }
241
+ function collectEntityListKeys(ctx, list) {
242
+ for (const col of list.columns) {
243
+ const normalized = normalizeListColumn(col);
244
+ if (normalized.label !== undefined) {
245
+ pushKey(ctx.out, normalized.label);
251
246
  }
252
- case "projectionList": {
253
- const list = screen;
254
- // Keine Entity → keine field-label-Fallbacks; nur explizite Column-Labels.
255
- for (const col of list.columns) {
256
- const normalized = normalizeListColumn(col);
257
- if (normalized.label !== undefined)
258
- pushKey(out, normalized.label);
259
- }
260
- pushKey(out, list.createLabel);
261
- pushKey(out, list.searchPlaceholder);
262
- pushKey(out, list.description);
263
- pushListEmptyStateKeys(out, list.emptyState);
264
- for (const action of list.rowActions ?? [])
265
- pushRowActionKeys(out, action);
266
- for (const action of list.toolbarActions ?? [])
267
- pushToolbarActionKeys(out, action);
268
- break;
247
+ else {
248
+ ctx.out.add(fieldLabelKey(ctx.featureName, list.entity, normalized.field));
269
249
  }
270
- case "dashboard": {
271
- pushDashboardScreenKeys(out, screen);
272
- break;
250
+ }
251
+ pushListChromeKeys(ctx.out, list);
252
+ if (list.expandableRow !== undefined)
253
+ pushExpandableRowKeys(ctx.out, list.expandableRow);
254
+ }
255
+ function collectProjectionListKeys(ctx, list) {
256
+ // No entity means there are no field-label fallbacks; only explicit column labels are
257
+ // collected.
258
+ for (const col of list.columns) {
259
+ const normalized = normalizeListColumn(col);
260
+ if (normalized.label !== undefined)
261
+ pushKey(ctx.out, normalized.label);
262
+ }
263
+ pushListChromeKeys(ctx.out, list);
264
+ }
265
+ function pushEditLayoutSectionKeys(ctx, sections, labelEntity, fieldLabels) {
266
+ for (const section of sections) {
267
+ if (isExtensionEditSection(section)) {
268
+ pushKey(ctx.out, section.title);
269
+ continue;
273
270
  }
274
- case "entityEdit": {
275
- const edit = screen;
276
- pushKey(out, edit.submitLabel);
277
- pushKey(out, edit.titleTemplate);
278
- for (const section of edit.layout.sections) {
279
- if (isExtensionEditSection(section)) {
280
- pushKey(out, section.title);
281
- continue;
282
- }
283
- if (section.kind === "relatedList")
284
- continue; // rejected at boot, unreachable here
285
- pushSectionTitles(out, section);
286
- for (const f of sectionFieldSpecs(section)) {
287
- pushEditFieldTextKeys(out, f);
288
- const fieldName = editFieldName(f);
289
- const override = edit.fieldLabels?.[fieldName];
290
- if (override !== undefined)
291
- pushKey(out, override);
292
- else
293
- out.add(fieldLabelKey(featureName, edit.entity, fieldName));
294
- }
295
- }
296
- break;
271
+ if (section.kind === "relatedList")
272
+ continue; // rejected at boot, unreachable here
273
+ pushSectionTitles(ctx.out, section);
274
+ for (const f of sectionFieldSpecs(section)) {
275
+ pushEditFieldTextKeys(ctx.out, f);
276
+ pushFieldLabelOrOverrideKey(ctx, labelEntity, editFieldName(f), fieldLabels);
297
277
  }
298
- case "actionForm": {
299
- const form = screen;
300
- pushKey(out, form.submitLabel);
301
- pushKey(out, form.summary?.title);
302
- pushKey(out, form.summary?.subtitle);
303
- for (const action of form.footerActions ?? [])
304
- pushKey(out, action.label);
305
- for (const link of form.successLinks ?? [])
306
- pushKey(out, link.label);
307
- for (const fact of form.successFacts ?? [])
308
- pushKey(out, fact.label);
309
- for (const fieldName of Object.keys(form.fields)) {
310
- const override = form.fieldLabels?.[fieldName];
311
- if (override !== undefined)
312
- pushKey(out, override);
313
- else
314
- out.add(fieldLabelKey(featureName, ACTION_FORM_ENTITY, fieldName));
315
- }
316
- for (const section of form.layout.sections) {
317
- if (isExtensionEditSection(section)) {
318
- pushKey(out, section.title);
319
- continue;
320
- }
321
- if (section.kind === "relatedList")
322
- continue; // rejected at boot, unreachable here
323
- pushSectionTitles(out, section);
324
- for (const f of sectionFieldSpecs(section)) {
325
- pushEditFieldTextKeys(out, f);
326
- const fieldName = editFieldName(f);
327
- const override = form.fieldLabels?.[fieldName];
328
- if (override !== undefined)
329
- pushKey(out, override);
330
- else
331
- out.add(fieldLabelKey(featureName, ACTION_FORM_ENTITY, fieldName));
332
- }
333
- }
334
- break;
278
+ }
279
+ }
280
+ function collectEntityEditKeys(ctx, edit) {
281
+ pushKey(ctx.out, edit.submitLabel);
282
+ pushKey(ctx.out, edit.titleTemplate);
283
+ pushEditLayoutSectionKeys(ctx, edit.layout.sections, edit.entity, edit.fieldLabels);
284
+ }
285
+ function collectActionFormKeys(ctx, form) {
286
+ pushKey(ctx.out, form.submitLabel);
287
+ pushKey(ctx.out, form.summary?.title);
288
+ pushKey(ctx.out, form.summary?.subtitle);
289
+ for (const action of form.footerActions ?? [])
290
+ pushKey(ctx.out, action.label);
291
+ for (const link of form.successLinks ?? [])
292
+ pushKey(ctx.out, link.label);
293
+ for (const fact of form.successFacts ?? [])
294
+ pushKey(ctx.out, fact.label);
295
+ for (const fieldName of Object.keys(form.fields)) {
296
+ pushFieldLabelOrOverrideKey(ctx, ACTION_FORM_ENTITY, fieldName, form.fieldLabels);
297
+ }
298
+ pushEditLayoutSectionKeys(ctx, form.layout.sections, ACTION_FORM_ENTITY, form.fieldLabels);
299
+ }
300
+ function collectSecretMintKeys(ctx, mint) {
301
+ const { out, featureName } = ctx;
302
+ pushKey(out, mint.submitLabel);
303
+ pushActionFormShapedKeys(out, featureName, mint);
304
+ pushKey(out, mint.reveal.title);
305
+ pushKey(out, mint.reveal.warning);
306
+ pushKey(out, mint.reveal.confirmLabel);
307
+ pushKey(out, mint.reveal.acknowledge);
308
+ for (const revealField of mint.reveal.fields) {
309
+ pushKey(out, revealField.label);
310
+ }
311
+ if (mint.confirm !== undefined) {
312
+ pushKey(out, mint.confirm.submitLabel);
313
+ pushKey(out, mint.confirm.doneMessage);
314
+ pushActionFormShapedKeys(out, featureName, mint.confirm);
315
+ }
316
+ }
317
+ function pushConfigEditSectionKeys(ctx, config) {
318
+ const { out, treatDotFormAsKey } = ctx;
319
+ for (const section of config.layout.sections) {
320
+ if (isExtensionEditSection(section)) {
321
+ pushKey(out, section.title);
322
+ continue;
335
323
  }
336
- case "secretMint": {
337
- const mint = screen;
338
- pushKey(out, mint.submitLabel);
339
- pushActionFormShapedKeys(out, featureName, mint);
340
- pushKey(out, mint.reveal.title);
341
- pushKey(out, mint.reveal.warning);
342
- pushKey(out, mint.reveal.confirmLabel);
343
- pushKey(out, mint.reveal.acknowledge);
344
- for (const revealField of mint.reveal.fields) {
345
- pushKey(out, revealField.label);
346
- }
347
- if (mint.confirm !== undefined) {
348
- pushKey(out, mint.confirm.submitLabel);
349
- pushKey(out, mint.confirm.doneMessage);
350
- pushActionFormShapedKeys(out, featureName, mint.confirm);
351
- }
352
- break;
324
+ if (section.kind === "relatedList")
325
+ continue; // rejected at boot, unreachable here
326
+ pushSectionTitles(out, section, treatDotFormAsKey);
327
+ pushKey(out, section.description, treatDotFormAsKey);
328
+ for (const f of sectionFieldSpecs(section)) {
329
+ pushEditFieldTextKeys(out, f, treatDotFormAsKey);
330
+ pushFieldLabelOrOverrideKey(ctx, CONFIG_EDIT_ENTITY, editFieldName(f), config.fieldLabels, treatDotFormAsKey);
353
331
  }
354
- case "configEdit": {
355
- const config = screen;
356
- pushKey(out, config.submitLabel);
357
- pushKey(out, config.description, treatDotFormAsKey);
358
- for (const key of Object.values(config.fieldDescriptions ?? {})) {
359
- pushKey(out, key, treatDotFormAsKey);
360
- }
361
- for (const fieldName of Object.keys(config.fields)) {
362
- const override = config.fieldLabels?.[fieldName];
363
- if (override !== undefined)
364
- pushKey(out, override, treatDotFormAsKey);
365
- else
366
- out.add(fieldLabelKey(featureName, CONFIG_EDIT_ENTITY, fieldName));
367
- }
368
- for (const section of config.layout.sections) {
369
- if (isExtensionEditSection(section)) {
370
- pushKey(out, section.title);
371
- continue;
372
- }
373
- if (section.kind === "relatedList")
374
- continue; // rejected at boot, unreachable here
375
- pushSectionTitles(out, section, treatDotFormAsKey);
376
- pushKey(out, section.description, treatDotFormAsKey);
377
- for (const f of sectionFieldSpecs(section)) {
378
- pushEditFieldTextKeys(out, f, treatDotFormAsKey);
379
- const fieldName = editFieldName(f);
380
- const override = config.fieldLabels?.[fieldName];
381
- if (override !== undefined)
382
- pushKey(out, override, treatDotFormAsKey);
383
- else
384
- out.add(fieldLabelKey(featureName, CONFIG_EDIT_ENTITY, fieldName));
385
- }
386
- }
387
- break;
332
+ }
333
+ }
334
+ function collectConfigEditKeys(ctx, config) {
335
+ const { out, treatDotFormAsKey } = ctx;
336
+ pushKey(out, config.submitLabel);
337
+ pushKey(out, config.description, treatDotFormAsKey);
338
+ for (const key of Object.values(config.fieldDescriptions ?? {})) {
339
+ pushKey(out, key, treatDotFormAsKey);
340
+ }
341
+ for (const fieldName of Object.keys(config.fields)) {
342
+ pushFieldLabelOrOverrideKey(ctx, CONFIG_EDIT_ENTITY, fieldName, config.fieldLabels, treatDotFormAsKey);
343
+ }
344
+ pushConfigEditSectionKeys(ctx, config);
345
+ }
346
+ function collectSecretsEditKeys(ctx, secretsEdit) {
347
+ const { out, treatDotFormAsKey } = ctx;
348
+ for (const key of Object.values(secretsEdit.fieldLabels))
349
+ pushKey(out, key, treatDotFormAsKey);
350
+ for (const key of Object.values(secretsEdit.fieldHints ?? {})) {
351
+ pushKey(out, key, treatDotFormAsKey);
352
+ }
353
+ for (const section of secretsEdit.sections)
354
+ pushKey(out, section.title, treatDotFormAsKey);
355
+ }
356
+ function pushWriteFormSectionKeys(ctx, section) {
357
+ pushKey(ctx.out, section.title);
358
+ pushKey(ctx.out, section.description);
359
+ pushKey(ctx.out, section.submitLabel);
360
+ for (const f of section.fields) {
361
+ pushEditFieldTextKeys(ctx.out, f);
362
+ ctx.out.add(fieldLabelKey(ctx.featureName, WRITE_FORM_SECTION_ENTITY, editFieldName(f)));
363
+ }
364
+ }
365
+ function collectProjectionDetailKeys(ctx, detail) {
366
+ for (const metric of detail.metrics ?? [])
367
+ pushKey(ctx.out, metric.label);
368
+ for (const section of detail.layout.sections) {
369
+ if (isExtensionEditSection(section)) {
370
+ pushKey(ctx.out, section.title);
371
+ continue;
388
372
  }
389
- case "secretsEdit": {
390
- const secretsEdit = screen;
391
- for (const key of Object.values(secretsEdit.fieldLabels))
392
- pushKey(out, key, treatDotFormAsKey);
393
- for (const key of Object.values(secretsEdit.fieldHints ?? {})) {
394
- pushKey(out, key, treatDotFormAsKey);
395
- }
396
- for (const section of secretsEdit.sections)
397
- pushKey(out, section.title, treatDotFormAsKey);
398
- break;
373
+ if (section.kind === "relatedList") {
374
+ pushRelatedListSectionKeys(ctx.out, section);
375
+ continue;
399
376
  }
400
- case "projectionDetail": {
401
- const detail = screen;
402
- for (const section of detail.layout.sections) {
403
- if (isExtensionEditSection(section)) {
404
- pushKey(out, section.title);
405
- continue;
406
- }
407
- if (section.kind === "relatedList") {
408
- pushRelatedListSectionKeys(out, section);
409
- continue;
410
- }
411
- if (isWriteFormEditSection(section)) {
412
- pushKey(out, section.title);
413
- pushKey(out, section.description);
414
- pushKey(out, section.submitLabel);
415
- for (const f of section.fields) {
416
- pushEditFieldTextKeys(out, f);
417
- const fieldName = editFieldName(f);
418
- out.add(fieldLabelKey(featureName, WRITE_FORM_SECTION_ENTITY, fieldName));
419
- }
420
- continue;
421
- }
422
- pushSectionTitles(out, section);
423
- for (const f of sectionFieldSpecs(section)) {
424
- pushEditFieldTextKeys(out, f);
425
- const fieldName = editFieldName(f);
426
- const override = detail.fieldLabels?.[fieldName];
427
- if (override !== undefined)
428
- pushKey(out, override);
429
- else
430
- out.add(fieldLabelKey(featureName, PROJECTION_DETAIL_ENTITY, fieldName));
431
- }
432
- }
433
- break;
377
+ if (isWriteFormEditSection(section)) {
378
+ pushWriteFormSectionKeys(ctx, section);
379
+ continue;
380
+ }
381
+ pushSectionTitles(ctx.out, section);
382
+ for (const f of sectionFieldSpecs(section)) {
383
+ pushEditFieldTextKeys(ctx.out, f);
384
+ pushFieldLabelOrOverrideKey(ctx, PROJECTION_DETAIL_ENTITY, editFieldName(f), detail.fieldLabels);
434
385
  }
435
- case "custom":
436
- break;
437
386
  }
438
- return [...out];
387
+ }
388
+ const SCREEN_KEY_COLLECTORS = {
389
+ entityList: collectEntityListKeys,
390
+ projectionList: collectProjectionListKeys,
391
+ entityEdit: collectEntityEditKeys,
392
+ actionForm: collectActionFormKeys,
393
+ secretMint: collectSecretMintKeys,
394
+ configEdit: collectConfigEditKeys,
395
+ secretsEdit: collectSecretsEditKeys,
396
+ projectionDetail: collectProjectionDetailKeys,
397
+ dashboard: (ctx, screen) => pushDashboardScreenKeys(ctx.out, screen),
398
+ // Custom screens translate their own texts.
399
+ custom: () => { },
400
+ };
401
+ function collectScreenKeysOfKind(ctx, kind, screen) {
402
+ SCREEN_KEY_COLLECTORS[kind](ctx, screen);
403
+ }
404
+ export function requiredKeysFromScreen(featureName, screen, options = {}) {
405
+ const ctx = {
406
+ out: new Set(),
407
+ featureName,
408
+ treatDotFormAsKey: options.treatDotFormAsKey ?? false,
409
+ };
410
+ pushKey(ctx.out, screenTitleKey(screen.id));
411
+ // An unknown type is only reachable by casting past ScreenDefinition and yields the title key alone.
412
+ if (Object.hasOwn(SCREEN_KEY_COLLECTORS, screen.type)) {
413
+ collectScreenKeysOfKind(ctx, screen.type, screen);
414
+ }
415
+ return [...ctx.out];
439
416
  }
440
417
  export function requiredKeysFromNav(nav, options = {}) {
441
418
  const out = new Set();
@@ -454,9 +431,8 @@ function collectEntityListFilterKeys(feature, out) {
454
431
  const entity = feature.entities?.[screen.entity];
455
432
  if (!entity)
456
433
  continue;
457
- for (const [fieldName, rawDef] of Object.entries(entity.fields)) {
458
- const def = rawDef;
459
- if (def.filterable !== true)
434
+ for (const [fieldName, def] of Object.entries(entity.fields)) {
435
+ if (!("filterable" in def) || def.filterable !== true)
460
436
  continue;
461
437
  if (def.type === "boolean") {
462
438
  for (const key of booleanFacetOptionKeys(feature.name, screen.entity, fieldName)) {
@@ -513,7 +489,7 @@ export function buildEffectiveTranslationKeys(features) {
513
489
  for (const key of Object.keys(feature.translations ?? {})) {
514
490
  out.add(`${feature.name}:${key}`);
515
491
  // Blank form too — Settings-Hub group namespaces (`group: "tenant-settings"`)
516
- // require `${group}.settings` which is not `${feature}:${key}` (fw#2314).
492
+ // require `${group}.settings` which is not `${feature}:${key}`.
517
493
  out.add(key);
518
494
  }
519
495
  }
@@ -1,6 +1,7 @@
1
+ export { isClosedConnectionError } from "../db/closed-connection.ts";
1
2
  export { createDbConnection } from "../db/connection.ts";
2
3
  export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
3
- export { type AnyDb, isClosedConnectionError } from "../db/query.ts";
4
+ export type { AnyDb } from "../db/query.ts";
4
5
  export { columnNamesOf } from "../db/schema-inspection.ts";
5
6
  export { schemaTableName } from "../db/table-introspection.ts";
6
7
  export { addMissingColumns, addMissingIndexes, tableToMeta, unsafeCreateEntityTable, unsafeEnsureEntityTable, unsafePushTables, } from "../db/table-push.ts";
@@ -1,7 +1,7 @@
1
1
  // @runtime dev
2
+ export { isClosedConnectionError } from "../db/closed-connection.js";
2
3
  export { createDbConnection } from "../db/connection.js";
3
4
  export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
4
- export { isClosedConnectionError } from "../db/query.js";
5
5
  export { columnNamesOf } from "../db/schema-inspection.js";
6
6
  export { schemaTableName } from "../db/table-introspection.js";
7
7
  export { addMissingColumns, addMissingIndexes, tableToMeta, unsafeCreateEntityTable, unsafeEnsureEntityTable, unsafePushTables, } from "../db/table-push.js";
@@ -0,0 +1,32 @@
1
+ /// <reference types="temporal-polyfill/global" preserve="true" />
2
+ import type { ConfigAccessor } from "@cosmicdrift/kumiko-types/config";
3
+ import type { WriteOrigin } from "@cosmicdrift/kumiko-types/event-store-types";
4
+ import type { DbRow } from "../db/connection.ts";
5
+ import type { JobContext, JobDefinition } from "../engine/types/index.ts";
6
+ import type { JobRunnerScope } from "./job-runner-scope.ts";
7
+ import type { JobInvocation, JobLogEntry, JobMeta } from "./job-runner-types.ts";
8
+ export type TenantVisibleSubjects = {
9
+ readonly failureSubject: string | null;
10
+ readonly runSubject: string | null;
11
+ readonly configError: Error | undefined;
12
+ };
13
+ export type JobRun = {
14
+ readonly jobName: string;
15
+ readonly jobDef: JobDefinition;
16
+ readonly jobId: string;
17
+ readonly startTime: number;
18
+ readonly logs: JobLogEntry[];
19
+ readonly rawData: DbRow;
20
+ readonly attempt: number;
21
+ readonly finalAttempt: boolean;
22
+ readonly meta: JobMeta;
23
+ readonly payload: Record<string, unknown>;
24
+ readonly tenantId: string;
25
+ readonly triggeredById: string | null;
26
+ readonly subjects: TenantVisibleSubjects;
27
+ readonly writeOrigin: WriteOrigin | undefined;
28
+ readonly writeOriginInvalid: boolean;
29
+ readonly config: ConfigAccessor | undefined;
30
+ readonly jobContext: Omit<JobContext, "tz">;
31
+ };
32
+ export declare function prepareJobRun(scope: JobRunnerScope, jobDef: JobDefinition, bullJob: JobInvocation, token: string | undefined): JobRun;