@cosmicdrift/kumiko-framework 0.387.0 → 0.389.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 (375) hide show
  1. package/AGENTS.md +9 -1
  2. package/agents/examples/anonymous-access.md +1 -1
  3. package/agents/examples/apex-landing.md +204 -0
  4. package/agents/examples/api-worker-split.md +64 -0
  5. package/agents/examples/app-config.md +14 -0
  6. package/agents/examples/auth-mfa.md +115 -0
  7. package/agents/examples/env-composition.md +28 -1
  8. package/agents/examples/golden-path.md +13 -1
  9. package/agents/examples/legal-pages.md +1 -1
  10. package/agents/examples/lifecycle-hooks.md +55 -2
  11. package/agents/examples/list-table-options.md +466 -0
  12. package/agents/examples/pdf-audit-export.md +4 -2
  13. package/agents/examples/prod-boot-options.md +16 -0
  14. package/agents/examples/rate-limiting.md +48 -0
  15. package/agents/examples/record-detail-layout.md +692 -0
  16. package/agents/examples/seed-migration.md +212 -0
  17. package/agents/examples/state-machine.md +3 -2
  18. package/agents/examples/tenant-isolation.md +73 -1
  19. package/agents/examples/wizard-form.md +941 -0
  20. package/agents/examples/writeform-section.md +548 -0
  21. package/agents/examples.md +1 -0
  22. package/agents/features.md +19 -2
  23. package/agents/widgets.md +2 -0
  24. package/dist/api/api-constants.d.ts +1 -0
  25. package/dist/api/api-constants.js +2 -0
  26. package/dist/api/auth-routes-shared.d.ts +2 -0
  27. package/dist/api/auth-routes-shared.js +5 -0
  28. package/dist/api/client-error-route.js +10 -5
  29. package/dist/api/entity-read-access.d.ts +2 -1
  30. package/dist/api/entity-read-access.js +14 -0
  31. package/dist/api/export/export-cells-reference.d.ts +9 -0
  32. package/dist/api/export/export-cells-reference.js +21 -0
  33. package/dist/api/export/export-cells.d.ts +11 -0
  34. package/dist/api/export/export-cells.js +136 -0
  35. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  36. package/dist/api/export/export-ciphertext-guard.js +27 -0
  37. package/dist/api/export/export-columns.d.ts +29 -0
  38. package/dist/api/export/export-columns.js +85 -0
  39. package/dist/api/export/export-errors.d.ts +4 -0
  40. package/dist/api/export/export-errors.js +14 -0
  41. package/dist/api/export/export-route.d.ts +4 -0
  42. package/dist/api/export/export-route.js +74 -0
  43. package/dist/api/export/export-rows.d.ts +13 -0
  44. package/dist/api/export/export-rows.js +62 -0
  45. package/dist/api/export/export-screen.d.ts +12 -0
  46. package/dist/api/export/export-screen.js +47 -0
  47. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  48. package/dist/api/export/export-xlsx-writer.js +21 -0
  49. package/dist/api/extra-route.d.ts +4 -0
  50. package/dist/api/index.d.ts +3 -1
  51. package/dist/api/index.js +3 -1
  52. package/dist/api/pii-leak-guard.d.ts +3 -0
  53. package/dist/api/pii-leak-guard.js +3 -2
  54. package/dist/api/request-context.d.ts +1 -1
  55. package/dist/api/request-context.js +1 -1
  56. package/dist/api/routes.d.ts +16 -0
  57. package/dist/api/routes.js +2 -2
  58. package/dist/api/server-boot-checks.d.ts +10 -0
  59. package/dist/api/server-boot-checks.js +157 -0
  60. package/dist/api/server-event-dispatcher.d.ts +26 -0
  61. package/dist/api/server-event-dispatcher.js +208 -0
  62. package/dist/api/server-extra-routes.d.ts +11 -0
  63. package/dist/api/server-extra-routes.js +206 -0
  64. package/dist/api/server-middleware.d.ts +20 -0
  65. package/dist/api/server-middleware.js +211 -0
  66. package/dist/api/server-routes.d.ts +19 -0
  67. package/dist/api/server-routes.js +299 -0
  68. package/dist/api/server-websocket-routes.d.ts +4 -0
  69. package/dist/api/server-websocket-routes.js +108 -0
  70. package/dist/api/server-wiring.d.ts +32 -0
  71. package/dist/api/server-wiring.js +238 -0
  72. package/dist/api/server.d.ts +10 -15
  73. package/dist/api/server.js +48 -1251
  74. package/dist/api/session-cookies.js +4 -4
  75. package/dist/api/sse-route.d.ts +2 -1
  76. package/dist/api/sse-route.js +27 -13
  77. package/dist/config/index.d.ts +3 -1
  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.d.ts +1 -0
  81. package/dist/crypto/pg-kms-adapter.js +12 -18
  82. package/dist/crypto/pii-field-encryption.d.ts +5 -1
  83. package/dist/crypto/pii-field-encryption.js +3 -1
  84. package/dist/db/aggregate-sql.d.ts +23 -0
  85. package/dist/db/aggregate-sql.js +165 -0
  86. package/dist/db/closed-connection.d.ts +9 -0
  87. package/dist/db/closed-connection.js +88 -0
  88. package/dist/db/connection.d.ts +4 -5
  89. package/dist/db/connection.js +29 -20
  90. package/dist/db/dialect.js +1 -1
  91. package/dist/db/distinct-on.d.ts +1 -1
  92. package/dist/db/driver-row-coercion.d.ts +2 -0
  93. package/dist/db/driver-row-coercion.js +186 -0
  94. package/dist/db/driver-value-preparation.d.ts +16 -0
  95. package/dist/db/driver-value-preparation.js +101 -0
  96. package/dist/db/entity-field-encryption.d.ts +1 -0
  97. package/dist/db/entity-field-encryption.js +1 -1
  98. package/dist/db/entity-table-meta.js +103 -110
  99. package/dist/db/event-store-executor-context.d.ts +2 -1
  100. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  101. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  102. package/dist/db/event-store-executor-read-aggregate.d.ts +8 -0
  103. package/dist/db/event-store-executor-read-aggregate.js +143 -0
  104. package/dist/db/event-store-executor-read-filter.d.ts +31 -0
  105. package/dist/db/event-store-executor-read-filter.js +206 -0
  106. package/dist/db/event-store-executor-read-paging.d.ts +14 -0
  107. package/dist/db/event-store-executor-read-paging.js +99 -0
  108. package/dist/db/event-store-executor-read-rows.d.ts +6 -0
  109. package/dist/db/event-store-executor-read-rows.js +32 -0
  110. package/dist/db/event-store-executor-read-search.d.ts +28 -0
  111. package/dist/db/event-store-executor-read-search.js +221 -0
  112. package/dist/db/event-store-executor-read-sort.d.ts +41 -0
  113. package/dist/db/event-store-executor-read-sort.js +130 -0
  114. package/dist/db/event-store-executor-read-where.d.ts +24 -0
  115. package/dist/db/event-store-executor-read-where.js +81 -0
  116. package/dist/db/event-store-executor-read.d.ts +2 -9
  117. package/dist/db/event-store-executor-read.js +48 -701
  118. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  119. package/dist/db/event-store-executor-write-atomic.js +41 -0
  120. package/dist/db/event-store-executor-write-steps.d.ts +17 -0
  121. package/dist/db/event-store-executor-write-steps.js +95 -0
  122. package/dist/db/event-store-executor-write.js +405 -509
  123. package/dist/db/event-store-executor.js +2 -1
  124. package/dist/db/executor-managed-tables.js +1 -1
  125. package/dist/db/index.d.ts +7 -3
  126. package/dist/db/index.js +6 -2
  127. package/dist/db/list-aggregate-labels.d.ts +14 -0
  128. package/dist/db/list-aggregate-labels.js +26 -0
  129. package/dist/db/migrate-generator.js +71 -86
  130. package/dist/db/migrate-runner.js +7 -4
  131. package/dist/db/pg-error.js +26 -21
  132. package/dist/db/queries/backfill-pii.js +3 -6
  133. package/dist/db/queries/database-now.js +2 -1
  134. package/dist/db/queries/shadow-swap.js +2 -3
  135. package/dist/db/query.d.ts +16 -15
  136. package/dist/db/query.js +76 -804
  137. package/dist/db/reference-data.js +19 -2
  138. package/dist/db/statement-timeout.js +2 -1
  139. package/dist/db/table-builder.js +113 -166
  140. package/dist/db/table-info.d.ts +10 -0
  141. package/dist/db/table-info.js +45 -0
  142. package/dist/db/temporal-value-guards.d.ts +6 -0
  143. package/dist/db/temporal-value-guards.js +15 -0
  144. package/dist/db/tenant-db-runner.d.ts +1 -0
  145. package/dist/db/tenant-db-runner.js +3 -0
  146. package/dist/db/tenant-db-upsert.d.ts +5 -0
  147. package/dist/db/tenant-db-upsert.js +91 -0
  148. package/dist/db/tenant-db.js +50 -10
  149. package/dist/db/where-clause.d.ts +6 -0
  150. package/dist/db/where-clause.js +236 -0
  151. package/dist/derivatives/delete-stored-file.js +2 -1
  152. package/dist/engine/boot-validator/boot-check.js +1 -1
  153. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  154. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  155. package/dist/engine/boot-validator/detail-screens.js +2 -2
  156. package/dist/engine/boot-validator/entity-handler.d.ts +1 -0
  157. package/dist/engine/boot-validator/entity-handler.js +17 -0
  158. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  159. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  160. package/dist/engine/boot-validator/form-derivations.js +35 -1
  161. package/dist/engine/boot-validator/i18n-keys.js +5 -3
  162. package/dist/engine/boot-validator/index.js +2 -0
  163. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  164. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  165. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  166. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  167. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  168. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  169. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +10 -0
  170. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  171. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  172. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  173. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  174. package/dist/engine/boot-validator/list-table-options.js +77 -0
  175. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  176. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  177. package/dist/engine/boot-validator/pii-retention.js +233 -155
  178. package/dist/engine/boot-validator/projection-list-screens.d.ts +1 -1
  179. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  180. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  181. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  182. package/dist/engine/boot-validator/screens-actions.d.ts +1 -0
  183. package/dist/engine/boot-validator/screens-actions.js +8 -1
  184. package/dist/engine/boot-validator/screens-dashboard.js +2 -5
  185. package/dist/engine/boot-validator/screens-forms.js +2 -6
  186. package/dist/engine/boot-validator/screens-kind-config-edit.d.ts +3 -0
  187. package/dist/engine/boot-validator/screens-kind-config-edit.js +88 -0
  188. package/dist/engine/boot-validator/screens-kind-entity-edit.d.ts +3 -0
  189. package/dist/engine/boot-validator/screens-kind-entity-edit.js +55 -0
  190. package/dist/engine/boot-validator/screens-kind-entity-list.d.ts +3 -0
  191. package/dist/engine/boot-validator/screens-kind-entity-list.js +235 -0
  192. package/dist/engine/boot-validator/screens-kind-projection-detail.d.ts +3 -0
  193. package/dist/engine/boot-validator/screens-kind-projection-detail.js +235 -0
  194. package/dist/engine/boot-validator/screens-kind-projection-list.d.ts +3 -0
  195. package/dist/engine/boot-validator/screens-kind-projection-list.js +56 -0
  196. package/dist/engine/boot-validator/screens-kind-secret-mint.d.ts +3 -0
  197. package/dist/engine/boot-validator/screens-kind-secret-mint.js +28 -0
  198. package/dist/engine/boot-validator/screens-kind-shared.d.ts +37 -0
  199. package/dist/engine/boot-validator/screens-kind-shared.js +142 -0
  200. package/dist/engine/boot-validator/screens-lists.d.ts +2 -1
  201. package/dist/engine/boot-validator/screens-lists.js +24 -11
  202. package/dist/engine/boot-validator/screens.d.ts +0 -2
  203. package/dist/engine/boot-validator/screens.js +99 -860
  204. package/dist/engine/build-app-schema.d.ts +2 -1
  205. package/dist/engine/build-app-schema.js +65 -97
  206. package/dist/engine/build-config-feature-schema.js +6 -1
  207. package/dist/engine/define-feature.js +13 -2
  208. package/dist/engine/define-handler.js +1 -0
  209. package/dist/engine/entity-handlers.d.ts +13 -0
  210. package/dist/engine/entity-handlers.js +10 -21
  211. package/dist/engine/entity-list-runtime-options.d.ts +8 -0
  212. package/dist/engine/entity-list-runtime-options.js +18 -0
  213. package/dist/engine/feature-ast/extractors/handlers.js +1 -0
  214. package/dist/engine/feature-ast/extractors/index.d.ts +1 -1
  215. package/dist/engine/feature-ast/extractors/index.js +1 -1
  216. package/dist/engine/feature-ast/extractors/round1.d.ts +2 -1
  217. package/dist/engine/feature-ast/extractors/round1.js +6 -0
  218. package/dist/engine/feature-ast/extractors/round2.js +25 -6
  219. package/dist/engine/feature-ast/index.d.ts +1 -1
  220. package/dist/engine/feature-ast/parse.js +3 -1
  221. package/dist/engine/feature-ast/patch.d.ts +2 -0
  222. package/dist/engine/feature-ast/patch.js +5 -182
  223. package/dist/engine/feature-ast/pattern-change-schema.d.ts +10 -245
  224. package/dist/engine/feature-ast/pattern-change-schema.js +10 -163
  225. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +7 -0
  226. package/dist/engine/feature-ast/pattern-id-matchers.js +211 -0
  227. package/dist/engine/feature-ast/pattern-id-schema.d.ts +251 -0
  228. package/dist/engine/feature-ast/pattern-id-schema.js +166 -0
  229. package/dist/engine/feature-ast/patterns.d.ts +14 -1
  230. package/dist/engine/feature-ast/patterns.js +44 -51
  231. package/dist/engine/feature-ast/render.js +52 -87
  232. package/dist/engine/feature-builder-state.d.ts +1 -0
  233. package/dist/engine/feature-builder-state.js +1 -0
  234. package/dist/engine/feature-entity-handlers.js +3 -0
  235. package/dist/engine/feature-manifest.d.ts +1 -0
  236. package/dist/engine/feature-manifest.js +1 -0
  237. package/dist/engine/field-access.d.ts +1 -0
  238. package/dist/engine/field-access.js +12 -0
  239. package/dist/engine/form-derivations.js +18 -7
  240. package/dist/engine/handler-field-references.js +1 -1
  241. package/dist/engine/index.d.ts +2 -2
  242. package/dist/engine/index.js +1 -1
  243. package/dist/engine/pattern-library/library.js +2 -1
  244. package/dist/engine/pattern-library/static-schemas.d.ts +1 -0
  245. package/dist/engine/pattern-library/static-schemas.js +9 -0
  246. package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
  247. package/dist/engine/project-app-schema-for-roles.js +6 -4
  248. package/dist/engine/registry-ingest.js +1 -1
  249. package/dist/engine/schema-builder.js +228 -212
  250. package/dist/engine/screen-filter-ops.js +2 -0
  251. package/dist/engine/screen-helpers.js +1 -1
  252. package/dist/engine/screen-kind.d.ts +7 -0
  253. package/dist/engine/screen-kind.js +1 -0
  254. package/dist/engine/strip-disabled-features-from-app-schema.js +58 -17
  255. package/dist/engine/types/feature.d.ts +1 -0
  256. package/dist/engine/types/index.d.ts +4 -3
  257. package/dist/engine/types/screen.d.ts +1 -1
  258. package/dist/engine/types/screen.js +1 -1
  259. package/dist/engine/validate-projection-allowlist.js +2 -1
  260. package/dist/entrypoint/index.d.ts +6 -1
  261. package/dist/entrypoint/index.js +10 -1
  262. package/dist/errors/docs-url.d.ts +1 -1
  263. package/dist/errors/docs-url.js +22 -2
  264. package/dist/es-ops/context.js +1 -1
  265. package/dist/event-store/admin-api.js +1 -1
  266. package/dist/event-store/event-store.d.ts +1 -0
  267. package/dist/event-store/event-store.js +17 -8
  268. package/dist/event-store/provenance-append.js +1 -1
  269. package/dist/files/bind-pending-file-refs.js +3 -3
  270. package/dist/files/create-file-ref-from-bytes.js +7 -1
  271. package/dist/files/create-file-ref.d.ts +3 -0
  272. package/dist/files/create-file-ref.js +11 -2
  273. package/dist/files/file-handle.js +2 -3
  274. package/dist/files/file-routes.d.ts +2 -0
  275. package/dist/files/file-routes.js +40 -10
  276. package/dist/files/provider-resolver.d.ts +1 -0
  277. package/dist/files/provider-resolver.js +1 -1
  278. package/dist/files/record-write-check.d.ts +6 -0
  279. package/dist/files/record-write-check.js +13 -0
  280. package/dist/files/resolve-content-type.js +43 -0
  281. package/dist/files/upload-ledger.d.ts +2 -2
  282. package/dist/files/upload-ledger.js +11 -4
  283. package/dist/i18n/required-surface-keys.js +189 -208
  284. package/dist/internal/stack-support.d.ts +2 -1
  285. package/dist/internal/stack-support.js +1 -1
  286. package/dist/internal/testing.js +1 -1
  287. package/dist/jobs/job-runner-context.d.ts +32 -0
  288. package/dist/jobs/job-runner-context.js +305 -0
  289. package/dist/jobs/job-runner-execution.d.ts +7 -0
  290. package/dist/jobs/job-runner-execution.js +160 -0
  291. package/dist/jobs/job-runner-gates.d.ts +19 -0
  292. package/dist/jobs/job-runner-gates.js +198 -0
  293. package/dist/jobs/job-runner-helpers.d.ts +17 -3
  294. package/dist/jobs/job-runner-helpers.js +61 -2
  295. package/dist/jobs/job-runner-scope.d.ts +44 -0
  296. package/dist/jobs/job-runner-scope.js +102 -0
  297. package/dist/jobs/job-runner-types.d.ts +12 -0
  298. package/dist/jobs/job-runner.d.ts +0 -1
  299. package/dist/jobs/job-runner.js +50 -657
  300. package/dist/observability/escape-hatch-report.d.ts +3 -0
  301. package/dist/observability/escape-hatch-report.js +21 -3
  302. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  303. package/dist/pipeline/after-rollback-sink.js +32 -0
  304. package/dist/pipeline/cascade-handler.js +165 -138
  305. package/dist/pipeline/dispatch-batch.js +8 -1
  306. package/dist/pipeline/dispatch-query.js +10 -3
  307. package/dist/pipeline/dispatch-shared.d.ts +13 -3
  308. package/dist/pipeline/dispatch-shared.js +62 -710
  309. package/dist/pipeline/dispatch-write.js +296 -189
  310. package/dist/pipeline/event-dispatcher-admin.js +2 -1
  311. package/dist/pipeline/event-dispatcher-delivery.js +6 -6
  312. package/dist/pipeline/event-dispatcher.d.ts +1 -0
  313. package/dist/pipeline/event-dispatcher.js +6 -9
  314. package/dist/pipeline/handler-context-auth.d.ts +9 -0
  315. package/dist/pipeline/handler-context-auth.js +54 -0
  316. package/dist/pipeline/handler-context-config.d.ts +14 -0
  317. package/dist/pipeline/handler-context-config.js +113 -0
  318. package/dist/pipeline/handler-context-db.d.ts +24 -0
  319. package/dist/pipeline/handler-context-db.js +149 -0
  320. package/dist/pipeline/handler-context-dispatch.d.ts +23 -0
  321. package/dist/pipeline/handler-context-dispatch.js +101 -0
  322. package/dist/pipeline/handler-context-events.d.ts +41 -0
  323. package/dist/pipeline/handler-context-events.js +239 -0
  324. package/dist/pipeline/handler-context-notify.d.ts +12 -0
  325. package/dist/pipeline/handler-context-notify.js +55 -0
  326. package/dist/pipeline/handler-context-observability.d.ts +7 -0
  327. package/dist/pipeline/handler-context-observability.js +21 -0
  328. package/dist/pipeline/handler-context-scope.d.ts +48 -0
  329. package/dist/pipeline/handler-context-scope.js +88 -0
  330. package/dist/pipeline/notify-scope.js +12 -1
  331. package/dist/pipeline/pre-handler-gates.js +20 -4
  332. package/dist/pipeline/pre-transaction-reservations.d.ts +1 -0
  333. package/dist/pipeline/pre-transaction-reservations.js +9 -3
  334. package/dist/pipeline/projection-rebuild.js +2 -1
  335. package/dist/pipeline/system-hooks.d.ts +3 -1
  336. package/dist/pipeline/system-hooks.js +55 -6
  337. package/dist/pipeline/write-result-masking.js +13 -10
  338. package/dist/schema-cli/apply-command.d.ts +2 -0
  339. package/dist/schema-cli/apply-command.js +97 -0
  340. package/dist/schema-cli/baseline-command.d.ts +2 -0
  341. package/dist/schema-cli/baseline-command.js +33 -0
  342. package/dist/schema-cli/generate-command.d.ts +2 -0
  343. package/dist/schema-cli/generate-command.js +90 -0
  344. package/dist/schema-cli/shared.d.ts +39 -0
  345. package/dist/schema-cli/shared.js +95 -0
  346. package/dist/schema-cli/status-command.d.ts +2 -0
  347. package/dist/schema-cli/status-command.js +73 -0
  348. package/dist/schema-cli/validate-boot-input.d.ts +5 -0
  349. package/dist/schema-cli/validate-boot-input.js +130 -0
  350. package/dist/schema-cli/validate-command.d.ts +2 -0
  351. package/dist/schema-cli/validate-command.js +130 -0
  352. package/dist/schema-cli.d.ts +2 -18
  353. package/dist/schema-cli.js +47 -604
  354. package/dist/search/meilisearch-adapter.js +2 -1
  355. package/dist/search/reindex-entity.js +15 -5
  356. package/dist/ui-types/index.d.ts +2 -2
  357. package/dist/ui-types/index.js +1 -1
  358. package/dist/upgrade-changelog.d.ts +2 -0
  359. package/dist/upgrade-changelog.js +14 -0
  360. package/dist/upgrade-cli.d.ts +3 -12
  361. package/dist/upgrade-cli.js +171 -197
  362. package/dist/upgrade-marker-parse.d.ts +32 -0
  363. package/dist/upgrade-marker-parse.js +73 -0
  364. package/package.json +9 -6
  365. package/src/changes.json +555 -0
  366. package/src/scripts/codemod/codemod-support.ts +1 -1
  367. package/src/scripts/codemod/db-factory.ts +1 -1
  368. package/src/scripts/codemod/feature-layout.ts +10 -2
  369. package/src/scripts/codemod/object-form.ts +41 -4
  370. package/src/scripts/codemod/package-merge.ts +58 -8
  371. package/src/scripts/codemod/pii-personal-migration.ts +175 -145
  372. package/src/scripts/codemod/testing-injection.ts +122 -42
  373. package/src/scripts/codemod/testing-move.ts +29 -7
  374. package/dist/engine/provider-plugin-context.d.ts +0 -3
  375. package/dist/engine/provider-plugin-context.js +0 -28
@@ -0,0 +1,238 @@
1
+ import { EXT_FILE_PROVIDER } from "../engine/extension-names.js";
2
+ import { assertSeedModeNotInProduction } from "../event-store/seed-clock.js";
3
+ import { makeFileProviderResolver } from "../files/provider-resolver.js";
4
+ import { createFallbackLogger } from "../logging/index.js";
5
+ import { createNoopProvider, registerStandardMetrics, wrapRedisClient, } from "../observability/index.js";
6
+ import { configAccessorFactoryOf } from "../pipeline/config-accessor-factory.js";
7
+ import { createDispatcher } from "../pipeline/dispatcher.js";
8
+ import { createLifecycleHooks } from "../pipeline/lifecycle-pipeline.js";
9
+ import { createPayloadDigest, createRateLimitResolver } from "../rate-limit/index.js";
10
+ import { resolveCacheSyncBus } from "../redis/cache-sync-bus.js";
11
+ import { assertValidTrustedProxyHops, createClientIpResolver, } from "./client-ip.js";
12
+ import { createJwtHelper } from "./jwt.js";
13
+ import { createDefaultSseBroker } from "./redis-sse-broker.js";
14
+ import { assertFileStorageProviderForFileFields, assertNoPayloadRateLimitsWithoutResolver, resolveServerInstanceId, warnSearchableScreensWithoutSearchAdapter, warnUnlimitedSystemScopeFeatures, } from "./server-boot-checks.js";
15
+ import { createServerEventDispatcher, registerOwnedShutdownHooks, } from "./server-event-dispatcher.js";
16
+ // The per-tenant file-provider resolver, built once for a registry+context so
17
+ // a job-runner and the server it runs beside share one instance (and one
18
+ // per-tenant provider cache). Mirrors buildServer's own resolution exactly —
19
+ // including NOT inventing a resolver when no `file-provider-*` plugin is
20
+ // mounted, which is what keeps assertFileStorageProviderForFileFields able to fire.
21
+ export function withFileProviderResolver(registry, context, cacheSync) {
22
+ if (context._fileProviderResolver !== undefined)
23
+ return context;
24
+ if (registry.getExtensionUsages(EXT_FILE_PROVIDER).length === 0)
25
+ return context;
26
+ const { clock } = context;
27
+ return {
28
+ ...context,
29
+ _fileProviderResolver: makeFileProviderResolver({
30
+ registry,
31
+ _configAccessorFactory: configAccessorFactoryOf(context),
32
+ secrets: context.secrets,
33
+ db: context.db,
34
+ ...(clock ? { now: () => clock.now() } : {}),
35
+ ...(cacheSync ? { cacheSync } : {}),
36
+ }),
37
+ };
38
+ }
39
+ export function resolveServerWiring(options) {
40
+ assertSeedModeNotInProduction();
41
+ const bootLog = createFallbackLogger("kumiko:boot", options.context.log);
42
+ const clientIpResolver = resolveServerClientIpResolver(options);
43
+ assertFileStorageProviderForFileFields(options.registry, options.context);
44
+ warnSearchableScreensWithoutSearchAdapter(options.registry, options.context, bootLog);
45
+ const jwt = createServerJwtHelper(options);
46
+ const { sseBroker, ownedRedisSseBroker } = resolveServerSseBroker(options.sseBroker, bootLog);
47
+ // Same decision as the SSE broker: an explicit dispatcherOptions value
48
+ // (incl. null = opt out) wins, otherwise REDIS_URL turns on cross-replica
49
+ // cache invalidation (no REDIS_URL = process-local bus).
50
+ const { bus: cacheSync, owned: ownedCacheSync } = resolveCacheSyncBus(options.dispatcherOptions?.cacheSync);
51
+ const instanceId = resolveServerInstanceId(options.instanceId, bootLog);
52
+ const observability = resolveServerObservability(options.observability, options.registry);
53
+ const tracedRedis = resolveTracedRedis(options, observability);
54
+ // Inject tracer + meter into the AppContext so the dispatcher can propagate
55
+ // them into every HandlerContext it builds. Build the per-tenant file-provider
56
+ // resolver once (when a provider plugin is mounted) — the dispatcher uses it
57
+ // to materialise `ctx.files`, the upload routes + MSP-applies share it. The
58
+ // resolver reads config + the s3.secretAccessKey secret under SYSTEM identity.
59
+ const contextWithFiles = withFileProviderResolver(options.registry, options.context, cacheSync);
60
+ const fileProviderResolver = contextWithFiles._fileProviderResolver;
61
+ const rateLimit = resolveServerRateLimit(options, tracedRedis, bootLog);
62
+ const context = buildServerAppContext(options, {
63
+ contextWithFiles,
64
+ tracedRedis,
65
+ rateLimit,
66
+ cacheSync,
67
+ observability,
68
+ });
69
+ const lifecycleHooks = createLifecycleHooks(options.registry, options.systemHooks, options.eventDedup ? { eventDedup: options.eventDedup } : undefined);
70
+ const dispatcher = createServerDispatcher(options, context, lifecycleHooks, sseBroker, cacheSync);
71
+ const events = createServerEventDispatcher({
72
+ options,
73
+ context,
74
+ sseBroker,
75
+ observability,
76
+ fileProviderResolver,
77
+ instanceId,
78
+ });
79
+ registerOwnedShutdownHooks(options.lifecycle, {
80
+ eventDispatcher: events.eventDispatcher,
81
+ ownedRedisSseBroker,
82
+ ownedCacheSync,
83
+ });
84
+ return {
85
+ options,
86
+ bootLog,
87
+ clientIpResolver,
88
+ jwt,
89
+ sseBroker,
90
+ observability,
91
+ tracedRedis,
92
+ rateLimitResolver: rateLimit.resolver,
93
+ rateLimitMiddlewareRequested: rateLimit.middlewareRequested,
94
+ context,
95
+ fileProviderResolver,
96
+ dispatcher,
97
+ lifecycleHooks,
98
+ baseDb: events.baseDb,
99
+ eventConsumers: events.consumers,
100
+ eventDispatcher: events.eventDispatcher,
101
+ };
102
+ }
103
+ function resolveServerClientIpResolver(options) {
104
+ // Single effective hop-count for every IP-derived rate-limit + requestMeta
105
+ // consumer — the top-level option wins over the deprecated
106
+ // `auth.trustedProxyHops` fallback.
107
+ const trustedProxyHops = options.trustedProxyHops ?? options.auth?.trustedProxyHops ?? 0;
108
+ assertValidTrustedProxyHops(trustedProxyHops, "buildServer");
109
+ // Exactly ONE resolver for the whole server — the warn-once flag must fire
110
+ // once per boot, not once per consumer (requestIdMiddleware, L1, L2,
111
+ // auth-routes each sharing this same instance rather than building a
112
+ // private one).
113
+ return createClientIpResolver(trustedProxyHops, "buildServer");
114
+ }
115
+ function createServerJwtHelper(options) {
116
+ // Stateless JWTs (no sessionChecker → no revocation) default to a shorter
117
+ // TTL than session-backed ones, since a leaked stateless token can't be
118
+ // revoked and stays valid until it expires. Explicit jwtTtl always wins.
119
+ const defaultJwtTtl = options.auth?.sessionChecker ? 8 * 60 * 60 : 60 * 60;
120
+ return createJwtHelper(options.jwtSecret, options.jwtIssuer, options.jwtTtl ?? defaultJwtTtl);
121
+ }
122
+ function resolveServerSseBroker(explicitSseBroker, bootLog) {
123
+ // An explicit ServerOptions.sseBroker always wins (caller owns its
124
+ // lifecycle) — createDefaultSseBroker is the single decision point every
125
+ // other caller must funnel through instead of picking a broker on its
126
+ // own, so the REDIS_URL-gated cross-replica default can't be silently
127
+ // bypassed the way runProdApp bypassed it before this existed.
128
+ let sseBroker;
129
+ let ownedRedisSseBroker;
130
+ if (explicitSseBroker) {
131
+ sseBroker = explicitSseBroker;
132
+ }
133
+ else {
134
+ const defaults = createDefaultSseBroker();
135
+ sseBroker = defaults.sseBroker;
136
+ ownedRedisSseBroker = defaults.ownedRedisSseBroker;
137
+ if (!ownedRedisSseBroker) {
138
+ bootLog.warn("REDIS_URL is not set: cross-replica fanout disabled. SSE, access-invalidation and toggle-sync reach only the cursor-owning process, so with more than one replica clients on the other replicas miss events and revoked sessions stay open there.");
139
+ }
140
+ }
141
+ return { sseBroker, ownedRedisSseBroker };
142
+ }
143
+ function resolveServerObservability(explicitObservability, registry) {
144
+ // Observability — Noop by default so no call-site needs to null-check.
145
+ // Every handler/middleware that reaches for ctx.tracer / ctx.metrics gets
146
+ // a working, zero-cost fallback when no provider is configured.
147
+ const observability = explicitObservability ?? createNoopProvider();
148
+ // Register framework + feature metrics once on this meter. Standard
149
+ // metrics (HTTP, dispatcher, DB) are used by Auto-Instrumentation; feature
150
+ // metrics come from r.metric(...) declarations collected in the registry.
151
+ registerStandardMetrics(observability.meter);
152
+ for (const [name, def] of registry.getAllMetrics()) {
153
+ if (observability.meter.definitions().has(name))
154
+ continue;
155
+ observability.meter.registerMetric({
156
+ name,
157
+ type: def.type,
158
+ description: def.description,
159
+ labels: def.labels,
160
+ buckets: def.buckets,
161
+ unit: def.unit,
162
+ tenantLabel: def.tenantLabel,
163
+ });
164
+ }
165
+ return observability;
166
+ }
167
+ function resolveTracedRedis(options, observability) {
168
+ // When a non-default provider is configured, wrap the injected Redis clients
169
+ // so `redis.cmd` spans attach to every command. For the default NoopProvider
170
+ // we skip the proxy to keep zero runtime overhead when observability is off.
171
+ const shouldWrapRedis = options.observability !== undefined;
172
+ const redisCtx = options.context.redis;
173
+ return shouldWrapRedis && redisCtx ? wrapRedisClient(redisCtx, observability.tracer) : redisCtx;
174
+ }
175
+ function resolveServerRateLimit(options, tracedRedis, bootLog) {
176
+ // Auto-wire the rate-limit resolver, but ONLY when at least one
177
+ // handler actually declared a rateLimit option. Apps that don't use
178
+ // L3 pay zero cost: no resolver instance, no Lua-script registration
179
+ // on Redis, no AppContext field. Apps that wire L1/L2 middleware can
180
+ // pass `context.rateLimit` explicitly — that takes precedence over
181
+ // the auto-wire (e.g. middleware-only setup without any L3 handler).
182
+ // Auto-build the resolver when L3 handlers declared rateLimit OR when
183
+ // the caller asked for L1/L2 middleware. Either path needs a resolver;
184
+ // both share the same instance to avoid duplicate Lua-script registration.
185
+ const wantsL3 = options.registry.hasRateLimitedHandler();
186
+ const wantsL1L2 = options.rateLimit?.global !== undefined || options.rateLimit?.auth !== undefined;
187
+ const wantsHttpRouteLimit = [...options.registry.features.values()].some((feature) => Object.values(feature.httpRoutes).some((route) => route.rateLimit !== undefined));
188
+ const wantsResolver = wantsL3 || wantsL1L2 || wantsHttpRouteLimit;
189
+ // Master for the payload-bucket HMAC: the current signing secret (the
190
+ // keyring's signKid for rotation setups). buildServer always has one, so
191
+ // the digest is available whenever a handler declares additionalRateLimits.
192
+ const payloadDigest = createPayloadDigest(payloadDigestMasterSecret(options.jwtSecret));
193
+ const rateLimitResolver = options.context.rateLimit ??
194
+ (tracedRedis && wantsResolver ? createRateLimitResolver({ redis: tracedRedis }) : undefined);
195
+ if (!rateLimitResolver) {
196
+ assertNoPayloadRateLimitsWithoutResolver(options.registry);
197
+ warnUnlimitedSystemScopeFeatures(options.registry, bootLog);
198
+ }
199
+ return { resolver: rateLimitResolver, middlewareRequested: wantsL1L2, payloadDigest };
200
+ }
201
+ function buildServerAppContext(options, parts) {
202
+ const { contextWithFiles, tracedRedis, rateLimit, cacheSync, observability } = parts;
203
+ return {
204
+ ...contextWithFiles,
205
+ ...(tracedRedis ? { redis: tracedRedis } : {}),
206
+ ...(rateLimit.resolver ? { rateLimit: rateLimit.resolver } : {}),
207
+ _rateLimitPayloadDigest: rateLimit.payloadDigest,
208
+ ...(cacheSync ? { cacheSync } : {}),
209
+ // Propagate the feature-toggle resolver to the context so the event-
210
+ // dispatcher (and any future context-reading consumer) sees the same
211
+ // source as the command dispatcher's handler-gate. Options take
212
+ // precedence over whatever was already on context — the
213
+ // dispatcher-options arg is the authoritative wire-up point.
214
+ ...(options.dispatcherOptions?.effectiveFeatures
215
+ ? { effectiveFeatures: options.dispatcherOptions.effectiveFeatures }
216
+ : {}),
217
+ tracer: observability.tracer,
218
+ meter: observability.meter,
219
+ };
220
+ }
221
+ function createServerDispatcher(options, context, lifecycle, sseBroker, cacheSync) {
222
+ return createDispatcher(options.registry, context, {
223
+ ...options.dispatcherOptions,
224
+ lifecycle,
225
+ sseBroker,
226
+ cacheSync: cacheSync ?? null,
227
+ ...(options.auth ? { membershipQuery: options.auth.membershipQuery } : {}),
228
+ });
229
+ }
230
+ function payloadDigestMasterSecret(jwtSecret) {
231
+ if (typeof jwtSecret === "string")
232
+ return jwtSecret;
233
+ const signingSecret = jwtSecret.keys[jwtSecret.signKid];
234
+ if (signingSecret === undefined) {
235
+ throw new Error(`[kumiko] jwtSecret.signKid "${jwtSecret.signKid}" not found in jwtSecret.keys`);
236
+ }
237
+ return signingSecret;
238
+ }
@@ -1,20 +1,18 @@
1
- import type { CacheSyncBus } from "@cosmicdrift/kumiko-types/cache-sync-types";
2
1
  import { Hono } from "hono";
3
2
  import type { PgListenClient } from "../db/connection.ts";
4
- import { type AppContext, type Registry, type RunIn, type WriteResult } from "../engine/types/index.ts";
3
+ import type { AppContext, Registry, RunIn } from "../engine/types/index.ts";
5
4
  import type { ErrorDocsConfig } from "../errors/docs-url.ts";
6
5
  import type { Lifecycle } from "../lifecycle/index.ts";
7
- import { type ObservabilityProvider } from "../observability/index.ts";
8
- import type { DispatcherOptions } from "../pipeline/dispatcher.ts";
9
- import { type Dispatcher } from "../pipeline/dispatcher.ts";
6
+ import type { ObservabilityProvider } from "../observability/index.ts";
7
+ import type { Dispatcher, DispatcherOptions } from "../pipeline/dispatcher.ts";
10
8
  import type { EventDedup } from "../pipeline/event-dedup.ts";
11
9
  import type { EventDispatcher } from "../pipeline/event-dispatcher.ts";
12
- import { type SystemHooks } from "../pipeline/lifecycle-pipeline.ts";
13
- import { type AuthEndpointRateLimitOptions, type GlobalIpRateLimitOptions } from "../rate-limit/index.ts";
14
- import { type AnonymousAccessResolved } from "./auth-middleware.ts";
15
- import { type AuthRoutesConfig } from "./auth-routes.ts";
16
- import { type ExtraRouteDefinition, type RoleDispatchArgs, type SystemDispatchArgs } from "./extra-route.ts";
17
- import { type JwtHelper, type JwtKeyring } from "./jwt.ts";
10
+ import type { LifecycleHooks, SystemHooks } from "../pipeline/lifecycle-pipeline.ts";
11
+ import type { AuthEndpointRateLimitOptions, GlobalIpRateLimitOptions } from "../rate-limit/index.ts";
12
+ import type { AnonymousAccessResolved } from "./auth-middleware.ts";
13
+ import type { AuthRoutesConfig } from "./auth-routes.ts";
14
+ import type { ExtraRouteDefinition } from "./extra-route.ts";
15
+ import type { JwtHelper, JwtKeyring } from "./jwt.ts";
18
16
  import type { SseBroker } from "./sse-broker.ts";
19
17
  export type ServerOptions = {
20
18
  registry: Registry;
@@ -74,12 +72,9 @@ export type KumikoServer = {
74
72
  sseBroker: SseBroker;
75
73
  observability: ObservabilityProvider;
76
74
  dispatcher: Dispatcher;
75
+ lifecycleHooks: LifecycleHooks;
77
76
  eventDispatcher?: EventDispatcher;
78
77
  lifecycle?: Lifecycle;
79
78
  context: AppContext;
80
79
  };
81
- export declare function withFileProviderResolver(registry: Registry, context: AppContext, cacheSync?: CacheSyncBus): AppContext;
82
80
  export declare function buildServer(options: ServerOptions): KumikoServer;
83
- export declare function makeDispatchSystemWrite(dispatcher: Dispatcher): (args: SystemDispatchArgs) => Promise<WriteResult>;
84
- export declare function makeDispatchWriteAs(dispatcher: Dispatcher): (args: RoleDispatchArgs) => Promise<WriteResult>;
85
- export declare function makeDispatchSystemQuery(dispatcher: Dispatcher): (args: SystemDispatchArgs) => Promise<unknown>;