@cosmicdrift/kumiko-framework 0.388.0 → 0.390.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. package/AGENTS.md +12 -4
  2. package/README.md +1 -1
  3. package/agents/examples/apex-surface-auth.md +2 -3
  4. package/agents/examples/api-worker-split.md +9 -2
  5. package/agents/examples/auth-claims.md +1 -1
  6. package/agents/examples/cross-feature-events.md +12 -12
  7. package/agents/examples/crypto-shredding-hr.md +2 -2
  8. package/agents/examples/encrypted-tenant-config.md +1 -1
  9. package/agents/examples/error-contract.md +12 -7
  10. package/agents/examples/event-sourcing.md +29 -29
  11. package/agents/examples/files-post-processing.md +10 -8
  12. package/agents/examples/golden-path.md +13 -1
  13. package/agents/examples/inbound-mail-triage.md +1 -0
  14. package/agents/examples/lane-routing.md +2 -1
  15. package/agents/examples/legal-pages.md +2 -2
  16. package/agents/examples/lifecycle-hooks.md +55 -2
  17. package/agents/examples/list-table-options.md +466 -0
  18. package/agents/examples/managed-config.md +4 -4
  19. package/agents/examples/managed-pages.md +1 -1
  20. package/agents/examples/pdf-audit-export.md +4 -2
  21. package/agents/examples/relations.md +19 -4
  22. package/agents/examples/search.md +4 -4
  23. package/agents/examples/secrets-demo.md +9 -6
  24. package/agents/examples/state-machine.md +5 -4
  25. package/agents/examples/tenant-isolation.md +73 -1
  26. package/agents/examples/tenant-settings.md +1 -1
  27. package/agents/examples/user-data-rights.md +3 -6
  28. package/agents/examples/workflow-engine.md +53 -47
  29. package/agents/examples.md +5 -4
  30. package/agents/features.md +1 -1
  31. package/agents/widgets.md +1 -0
  32. package/dist/api/api-constants.d.ts +1 -0
  33. package/dist/api/api-constants.js +2 -0
  34. package/dist/api/auth-middleware.js +1 -1
  35. package/dist/api/auth-routes-invite.js +2 -1
  36. package/dist/api/auth-routes-shared.d.ts +2 -0
  37. package/dist/api/auth-routes-shared.js +5 -0
  38. package/dist/api/client-error-route.js +2 -3
  39. package/dist/api/entity-read-access.d.ts +4 -1
  40. package/dist/api/entity-read-access.js +14 -0
  41. package/dist/api/export/export-cells-reference.d.ts +9 -0
  42. package/dist/api/export/export-cells-reference.js +21 -0
  43. package/dist/api/export/export-cells.d.ts +11 -0
  44. package/dist/api/export/export-cells.js +136 -0
  45. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  46. package/dist/api/export/export-ciphertext-guard.js +27 -0
  47. package/dist/api/export/export-columns.d.ts +31 -0
  48. package/dist/api/export/export-columns.js +85 -0
  49. package/dist/api/export/export-errors.d.ts +4 -0
  50. package/dist/api/export/export-errors.js +14 -0
  51. package/dist/api/export/export-route.d.ts +4 -0
  52. package/dist/api/export/export-route.js +75 -0
  53. package/dist/api/export/export-rows.d.ts +13 -0
  54. package/dist/api/export/export-rows.js +62 -0
  55. package/dist/api/export/export-screen.d.ts +13 -0
  56. package/dist/api/export/export-screen.js +47 -0
  57. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  58. package/dist/api/export/export-xlsx-writer.js +21 -0
  59. package/dist/api/extra-route.d.ts +7 -1
  60. package/dist/api/index.d.ts +23 -27
  61. package/dist/api/index.js +13 -15
  62. package/dist/api/jwt.js +1 -1
  63. package/dist/api/observability-middleware.d.ts +1 -1
  64. package/dist/api/observability-middleware.js +2 -1
  65. package/dist/api/pii-leak-guard.d.ts +3 -0
  66. package/dist/api/pii-leak-guard.js +3 -2
  67. package/dist/api/request-context-internals.d.ts +31 -0
  68. package/dist/api/request-context-internals.js +11 -0
  69. package/dist/api/request-context-scopes.d.ts +14 -0
  70. package/dist/api/request-context-scopes.js +69 -0
  71. package/dist/api/request-context.d.ts +1 -40
  72. package/dist/api/request-context.js +22 -51
  73. package/dist/api/request-id-middleware.d.ts +1 -1
  74. package/dist/api/route-registrars.d.ts +2 -1
  75. package/dist/api/route-registrars.js +1 -1
  76. package/dist/api/routes.d.ts +16 -0
  77. package/dist/api/routes.js +9 -5
  78. package/dist/api/server-boot-checks.d.ts +1 -1
  79. package/dist/api/server-boot-checks.js +2 -2
  80. package/dist/api/server-event-dispatcher.d.ts +6 -1
  81. package/dist/api/server-event-dispatcher.js +3 -4
  82. package/dist/api/server-extra-routes.d.ts +1 -1
  83. package/dist/api/server-extra-routes.js +5 -1
  84. package/dist/api/server-middleware.js +3 -1
  85. package/dist/api/server-routes.d.ts +3 -2
  86. package/dist/api/server-routes.js +8 -2
  87. package/dist/api/server-wiring.js +8 -4
  88. package/dist/api/server.d.ts +2 -1
  89. package/dist/api/sse-route.d.ts +3 -1
  90. package/dist/api/sse-route.js +11 -1
  91. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  92. package/dist/api/tenant-scoped-secrets.js +13 -0
  93. package/dist/api/websocket-route.d.ts +1 -1
  94. package/dist/auth/index.d.ts +0 -1
  95. package/dist/auth/roles.d.ts +0 -5
  96. package/dist/compliance/duration-spec.d.ts +0 -1
  97. package/dist/compliance/duration-spec.js +0 -5
  98. package/dist/compliance/index.d.ts +4 -4
  99. package/dist/compliance/index.js +2 -2
  100. package/dist/compliance/profiles.d.ts +0 -15
  101. package/dist/compliance/profiles.js +0 -23
  102. package/dist/config/index.d.ts +11 -9
  103. package/dist/config/index.js +13 -1
  104. package/dist/config/internals.d.ts +9 -0
  105. package/dist/config/internals.js +1 -0
  106. package/dist/consumer-cli-internals.d.ts +4 -0
  107. package/dist/consumer-cli-internals.js +1 -0
  108. package/dist/consumer-cli.d.ts +1 -4
  109. package/dist/consumer-cli.js +5 -1
  110. package/dist/crypto/event-pii.js +1 -1
  111. package/dist/crypto/index.d.ts +8 -9
  112. package/dist/crypto/index.js +7 -8
  113. package/dist/crypto/pg-kms-adapter.d.ts +1 -0
  114. package/dist/crypto/pg-kms-adapter.js +17 -18
  115. package/dist/db/aggregate-sql.d.ts +2 -0
  116. package/dist/db/aggregate-sql.js +10 -0
  117. package/dist/db/apply-entity-event.d.ts +1 -1
  118. package/dist/db/apply-entity-event.js +15 -47
  119. package/dist/db/blind-index-cleanup.js +91 -77
  120. package/dist/db/closed-connection.js +12 -19
  121. package/dist/db/collect-table-metas.js +1 -1
  122. package/dist/db/compound-types.d.ts +1 -1
  123. package/dist/db/compound-types.js +0 -7
  124. package/dist/db/config-seed.d.ts +2 -1
  125. package/dist/db/config-seed.js +6 -1
  126. package/dist/db/connection.d.ts +7 -6
  127. package/dist/db/connection.js +43 -24
  128. package/dist/db/cross-tenant-reads.d.ts +1 -1
  129. package/dist/db/cross-tenant-reads.js +1 -1
  130. package/dist/db/dialect.d.ts +0 -5
  131. package/dist/db/dialect.js +0 -3
  132. package/dist/db/driver-row-coercion.js +4 -4
  133. package/dist/db/driver-value-preparation.js +6 -4
  134. package/dist/db/eagerload.d.ts +2 -1
  135. package/dist/db/entity-field-encryption.d.ts +1 -1
  136. package/dist/db/entity-table-meta.d.ts +1 -1
  137. package/dist/db/event-store-executor-context.d.ts +3 -1
  138. package/dist/db/event-store-executor-context.js +4 -3
  139. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  140. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  141. package/dist/db/event-store-executor-read-aggregate.js +36 -5
  142. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  143. package/dist/db/event-store-executor-read-filter.js +6 -3
  144. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  145. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  146. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  147. package/dist/db/event-store-executor-read.js +2 -2
  148. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  149. package/dist/db/event-store-executor-write-atomic.js +42 -0
  150. package/dist/db/event-store-executor-write-steps.d.ts +3 -5
  151. package/dist/db/event-store-executor-write-steps.js +0 -5
  152. package/dist/db/event-store-executor-write.js +22 -19
  153. package/dist/db/event-store-executor.d.ts +1 -1
  154. package/dist/db/event-store-executor.js +2 -1
  155. package/dist/db/executor-managed-tables.d.ts +7 -1
  156. package/dist/db/executor-managed-tables.js +12 -3
  157. package/dist/db/index.d.ts +29 -28
  158. package/dist/db/index.js +22 -20
  159. package/dist/db/known-table-names.d.ts +6 -0
  160. package/dist/db/known-table-names.js +21 -0
  161. package/dist/db/list-aggregate-labels.d.ts +1 -1
  162. package/dist/db/located-timestamp.d.ts +1 -1
  163. package/dist/db/located-timestamp.js +0 -5
  164. package/dist/db/migrate-generator.d.ts +17 -1
  165. package/dist/db/migrate-generator.js +50 -20
  166. package/dist/db/migrate-primary-key.d.ts +12 -0
  167. package/dist/db/migrate-primary-key.js +45 -0
  168. package/dist/db/migrate-rls-diff.d.ts +20 -0
  169. package/dist/db/migrate-rls-diff.js +61 -0
  170. package/dist/db/migrate-runner.js +7 -3
  171. package/dist/db/money.d.ts +1 -1
  172. package/dist/db/money.js +1 -1
  173. package/dist/db/parent-ref-clause.d.ts +2 -1
  174. package/dist/db/pg-error.d.ts +2 -0
  175. package/dist/db/pg-error.js +37 -21
  176. package/dist/db/queries/backfill-pii.js +3 -6
  177. package/dist/db/queries/database-now.js +2 -1
  178. package/dist/db/queries/ddl.d.ts +3 -0
  179. package/dist/db/queries/ddl.js +34 -1
  180. package/dist/db/queries/event-store.js +4 -2
  181. package/dist/db/queries/event-tenants.d.ts +2 -0
  182. package/dist/db/queries/event-tenants.js +17 -0
  183. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  184. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  185. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  186. package/dist/db/queries/rls-boot-catalog.js +39 -0
  187. package/dist/db/queries/rls-catalog.d.ts +6 -0
  188. package/dist/db/queries/rls-catalog.js +82 -0
  189. package/dist/db/queries/rls-scope.d.ts +3 -0
  190. package/dist/db/queries/rls-scope.js +17 -0
  191. package/dist/db/queries/rls-shape.d.ts +10 -0
  192. package/dist/db/queries/rls-shape.js +42 -0
  193. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  194. package/dist/db/queries/session-advisory-lock.js +23 -0
  195. package/dist/db/queries/shadow-swap.d.ts +1 -2
  196. package/dist/db/queries/shadow-swap.js +11 -28
  197. package/dist/db/queries/test-stack.d.ts +4 -1
  198. package/dist/db/queries/test-stack.js +83 -2
  199. package/dist/db/query.d.ts +14 -0
  200. package/dist/db/query.js +77 -48
  201. package/dist/db/reference-data.d.ts +1 -1
  202. package/dist/db/reference-data.js +20 -3
  203. package/dist/db/render-ddl.d.ts +6 -2
  204. package/dist/db/render-ddl.js +7 -7
  205. package/dist/db/render-rls-ddl.d.ts +35 -0
  206. package/dist/db/render-rls-ddl.js +127 -0
  207. package/dist/db/replay-migration-sql.d.ts +3 -1
  208. package/dist/db/replay-migration-sql.js +22 -5
  209. package/dist/db/replay-rls.d.ts +25 -0
  210. package/dist/db/replay-rls.js +156 -0
  211. package/dist/db/row-level-security-boot-check.d.ts +5 -0
  212. package/dist/db/row-level-security-boot-check.js +85 -0
  213. package/dist/db/row-level-security-connection.d.ts +3 -0
  214. package/dist/db/row-level-security-connection.js +213 -0
  215. package/dist/db/row-level-security-scope.d.ts +33 -0
  216. package/dist/db/row-level-security-scope.js +127 -0
  217. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  218. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  219. package/dist/db/sql-identifier.d.ts +1 -0
  220. package/dist/db/sql-identifier.js +3 -0
  221. package/dist/db/statement-timeout.js +2 -1
  222. package/dist/db/table-builder.d.ts +2 -1
  223. package/dist/db/table-builder.js +1 -1
  224. package/dist/db/table-info.js +1 -1
  225. package/dist/db/table-push.d.ts +11 -2
  226. package/dist/db/table-push.js +15 -2
  227. package/dist/db/tenant-db-runner.d.ts +3 -1
  228. package/dist/db/tenant-db-runner.js +4 -3
  229. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  230. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  231. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  232. package/dist/db/tenant-db-statement-runner.js +48 -0
  233. package/dist/db/tenant-db-upsert.d.ts +5 -0
  234. package/dist/db/tenant-db-upsert.js +91 -0
  235. package/dist/db/tenant-db.d.ts +17 -12
  236. package/dist/db/tenant-db.js +60 -121
  237. package/dist/db/tenant-id-filter.d.ts +3 -0
  238. package/dist/db/tenant-id-filter.js +30 -0
  239. package/dist/db/transaction-serialization.d.ts +6 -0
  240. package/dist/db/transaction-serialization.js +60 -0
  241. package/dist/derivatives/delete-stored-file.js +1 -1
  242. package/dist/derivatives/index.d.ts +2 -5
  243. package/dist/derivatives/index.js +2 -3
  244. package/dist/engine/access.d.ts +2 -1
  245. package/dist/engine/access.js +1 -1
  246. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  247. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  248. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  249. package/dist/engine/boot-validator/entity-handler.js +1 -1
  250. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  251. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  252. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  253. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  254. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  255. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  256. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  257. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  258. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
  259. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  260. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  261. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  262. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  263. package/dist/engine/boot-validator/list-table-options.js +77 -0
  264. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  265. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  266. package/dist/engine/boot-validator/nav.d.ts +3 -1
  267. package/dist/engine/boot-validator/nav.js +1 -1
  268. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  269. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  270. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  271. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  272. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  273. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  274. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  275. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  276. package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
  277. package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
  278. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  279. package/dist/engine/boot-validator/screens-lists.js +12 -2
  280. package/dist/engine/boot-validator/screens.d.ts +2 -1
  281. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  282. package/dist/engine/bridge-stub.d.ts +5 -2
  283. package/dist/engine/bridge-stub.js +39 -24
  284. package/dist/engine/build-app-schema.d.ts +2 -1
  285. package/dist/engine/build-app-schema.js +9 -1
  286. package/dist/engine/build-config-feature-schema.js +6 -1
  287. package/dist/engine/config-helpers.d.ts +2 -2
  288. package/dist/engine/config-helpers.js +0 -9
  289. package/dist/engine/constants.d.ts +0 -10
  290. package/dist/engine/constants.js +0 -8
  291. package/dist/engine/create-app.js +1 -1
  292. package/dist/engine/define-feature.d.ts +2 -1
  293. package/dist/engine/define-feature.js +5 -2
  294. package/dist/engine/define-handler.d.ts +1 -1
  295. package/dist/engine/define-step.d.ts +0 -1
  296. package/dist/engine/define-step.js +0 -3
  297. package/dist/engine/embedded-derived.d.ts +1 -1
  298. package/dist/engine/entity-handlers.d.ts +2 -1
  299. package/dist/engine/entity-handlers.js +7 -7
  300. package/dist/engine/entity-list-runtime-options.js +3 -1
  301. package/dist/engine/entity-list-searchability.d.ts +2 -1
  302. package/dist/engine/event-def.d.ts +2 -1
  303. package/dist/engine/event-helpers.d.ts +3 -1
  304. package/dist/engine/event-helpers.js +3 -3
  305. package/dist/engine/extension-names.d.ts +2 -8
  306. package/dist/engine/extension-names.js +2 -2
  307. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  308. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  309. package/dist/engine/extensions/user-data.d.ts +0 -8
  310. package/dist/engine/factories.d.ts +2 -1
  311. package/dist/engine/feature-builder-state.d.ts +9 -1
  312. package/dist/engine/feature-builder-state.js +1 -0
  313. package/dist/engine/feature-changelog.d.ts +1 -1
  314. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  315. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  316. package/dist/engine/feature-manifest.d.ts +1 -0
  317. package/dist/engine/feature-manifest.js +2 -1
  318. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  319. package/dist/engine/feature-ui-extensions.js +6 -4
  320. package/dist/engine/field-access.d.ts +3 -1
  321. package/dist/engine/field-access.js +12 -0
  322. package/dist/engine/handler-field-references.d.ts +0 -4
  323. package/dist/engine/index.d.ts +58 -55
  324. package/dist/engine/index.js +23 -28
  325. package/dist/engine/instruction-fields.d.ts +1 -1
  326. package/dist/engine/personal-data-fields.d.ts +1 -1
  327. package/dist/engine/qualified-name.d.ts +0 -1
  328. package/dist/engine/read-claim.d.ts +2 -1
  329. package/dist/engine/registry-facade.js +0 -3
  330. package/dist/engine/registry-ingest.d.ts +2 -1
  331. package/dist/engine/registry-ingest.js +1 -2
  332. package/dist/engine/registry-state.d.ts +12 -2
  333. package/dist/engine/registry-state.js +2 -3
  334. package/dist/engine/registry-validate.d.ts +3 -1
  335. package/dist/engine/registry-validate.js +7 -7
  336. package/dist/engine/run-in.d.ts +1 -1
  337. package/dist/engine/run-in.js +0 -1
  338. package/dist/engine/schema-builder.d.ts +1 -1
  339. package/dist/engine/schema-builder.js +1 -1
  340. package/dist/engine/screen-filter-ops.d.ts +2 -1
  341. package/dist/engine/screen-filter-ops.js +2 -5
  342. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  343. package/dist/engine/soft-delete-cleanup.js +4 -4
  344. package/dist/engine/state-machine.js +2 -1
  345. package/dist/engine/steps/_read-source.js +1 -1
  346. package/dist/engine/steps/aggregate-append-event.js +2 -2
  347. package/dist/engine/steps/call-feature.js +2 -2
  348. package/dist/engine/steps/mail-send.js +1 -1
  349. package/dist/engine/steps/retry.js +1 -1
  350. package/dist/engine/steps/wait-for-event.js +1 -1
  351. package/dist/engine/steps/wait.js +1 -1
  352. package/dist/engine/steps/webhook-send.js +1 -1
  353. package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
  354. package/dist/engine/template-variables.d.ts +2 -1
  355. package/dist/engine/transfer-adjacency.d.ts +1 -1
  356. package/dist/engine/types/feature.d.ts +1 -0
  357. package/dist/engine/types/index.d.ts +8 -30
  358. package/dist/engine/types/index.js +2 -10
  359. package/dist/engine/types/screen.d.ts +1 -1
  360. package/dist/engine/types/screen.js +1 -1
  361. package/dist/engine/validation.d.ts +2 -1
  362. package/dist/entrypoint/index.d.ts +9 -35
  363. package/dist/entrypoint/index.js +10 -1
  364. package/dist/entrypoint/internals.d.ts +40 -0
  365. package/dist/entrypoint/internals.js +1 -0
  366. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  367. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  368. package/dist/env/dry-run-internals.d.ts +10 -0
  369. package/dist/env/dry-run-internals.js +1 -0
  370. package/dist/env/dry-run.d.ts +1 -10
  371. package/dist/env/dry-run.js +2 -1
  372. package/dist/env/index.d.ts +1 -85
  373. package/dist/env/index.js +6 -50
  374. package/dist/env/internals.d.ts +87 -0
  375. package/dist/env/internals.js +53 -0
  376. package/dist/errors/classes.js +2 -2
  377. package/dist/errors/index.d.ts +5 -14
  378. package/dist/errors/index.js +4 -9
  379. package/dist/errors/member-resolution.js +1 -1
  380. package/dist/errors/reasons.d.ts +0 -1
  381. package/dist/errors/reasons.js +7 -7
  382. package/dist/errors/serialize.d.ts +0 -18
  383. package/dist/errors/serialize.js +0 -27
  384. package/dist/es-ops/index.d.ts +4 -4
  385. package/dist/es-ops/index.js +2 -2
  386. package/dist/es-ops/operations-schema.d.ts +1 -1
  387. package/dist/es-ops/types.d.ts +4 -5
  388. package/dist/event-store/admin-api-internals.d.ts +14 -0
  389. package/dist/event-store/admin-api-internals.js +1 -0
  390. package/dist/event-store/admin-api.d.ts +1 -14
  391. package/dist/event-store/admin-api.js +11 -6
  392. package/dist/event-store/archive.js +4 -2
  393. package/dist/event-store/errors.js +2 -2
  394. package/dist/event-store/event-store.d.ts +1 -0
  395. package/dist/event-store/event-store.js +42 -32
  396. package/dist/event-store/events-schema.js +4 -1
  397. package/dist/event-store/index.d.ts +11 -13
  398. package/dist/event-store/index.js +7 -9
  399. package/dist/event-store/provenance-append.js +1 -1
  400. package/dist/event-store/rebuild-dead-letter.js +4 -2
  401. package/dist/event-store/snapshot.js +4 -3
  402. package/dist/event-store/stream-scope.d.ts +2 -0
  403. package/dist/event-store/stream-scope.js +6 -0
  404. package/dist/event-store/upcaster-dead-letter.js +4 -2
  405. package/dist/event-store/upcaster.d.ts +2 -1
  406. package/dist/files/action-form-upload.d.ts +2 -1
  407. package/dist/files/action-form-upload.js +1 -1
  408. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  409. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  410. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  411. package/dist/files/bind-pending-file-refs.js +2 -1
  412. package/dist/files/bind-referenced-files.write.js +1 -1
  413. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  414. package/dist/files/create-file-ref-from-bytes.js +6 -3
  415. package/dist/files/create-file-ref.d.ts +6 -2
  416. package/dist/files/create-file-ref.js +13 -4
  417. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  418. package/dist/files/dispose-removed-file-refs.js +1 -1
  419. package/dist/files/feature.js +2 -2
  420. package/dist/files/file-handle.js +1 -1
  421. package/dist/files/file-routes.d.ts +3 -1
  422. package/dist/files/file-routes.js +41 -4
  423. package/dist/files/index.d.ts +11 -13
  424. package/dist/files/index.js +5 -7
  425. package/dist/files/load-save-file-refs.d.ts +2 -1
  426. package/dist/files/load-save-file-refs.js +1 -1
  427. package/dist/files/provider-resolver.d.ts +6 -4
  428. package/dist/files/provider-resolver.js +5 -5
  429. package/dist/files/record-write-check.d.ts +6 -0
  430. package/dist/files/record-write-check.js +13 -0
  431. package/dist/files/storage-tracking.js +4 -2
  432. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  433. package/dist/files/sweep-orphaned-uploads.js +1 -1
  434. package/dist/files/upload-ledger.d.ts +2 -2
  435. package/dist/files/upload-ledger.js +4 -4
  436. package/dist/i18n/index.d.ts +2 -8
  437. package/dist/i18n/index.js +1 -1
  438. package/dist/i18n/internals.d.ts +7 -0
  439. package/dist/i18n/internals.js +1 -0
  440. package/dist/i18n/required-surface-keys.d.ts +4 -1
  441. package/dist/i18n/required-surface-keys.js +7 -2
  442. package/dist/internal/row-level-security.d.ts +3 -0
  443. package/dist/internal/row-level-security.js +3 -0
  444. package/dist/internal/stack-support.d.ts +1 -1
  445. package/dist/internal/stack-support.js +1 -1
  446. package/dist/internal/testing.d.ts +1 -0
  447. package/dist/internal/testing.js +10 -6
  448. package/dist/jobs/index.d.ts +1 -1
  449. package/dist/jobs/job-append-event.d.ts +12 -0
  450. package/dist/jobs/job-append-event.js +30 -0
  451. package/dist/jobs/job-runner-context.d.ts +2 -2
  452. package/dist/jobs/job-runner-context.js +46 -16
  453. package/dist/jobs/job-runner-execution.d.ts +1 -1
  454. package/dist/jobs/job-runner-execution.js +6 -4
  455. package/dist/jobs/job-runner-gates.d.ts +1 -1
  456. package/dist/jobs/job-runner-gates.js +0 -1
  457. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  458. package/dist/jobs/job-runner-helpers.js +10 -1
  459. package/dist/jobs/job-runner-scope.d.ts +5 -2
  460. package/dist/jobs/job-runner-scope.js +6 -6
  461. package/dist/jobs/job-runner-types.d.ts +2 -1
  462. package/dist/jobs/job-runner.js +22 -6
  463. package/dist/jobs/max-per-tenant.d.ts +1 -1
  464. package/dist/logging/index.d.ts +1 -2
  465. package/dist/logging/index.js +1 -1
  466. package/dist/logging/pino-logger.js +1 -1
  467. package/dist/logging/utils.d.ts +1 -0
  468. package/dist/logging/utils.js +6 -0
  469. package/dist/migrations/index.d.ts +3 -3
  470. package/dist/migrations/index.js +3 -3
  471. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  472. package/dist/migrations/pending-rebuilds.js +1 -1
  473. package/dist/migrations/pii-event-backfill.js +4 -1
  474. package/dist/observability/escape-hatch-report.d.ts +2 -1
  475. package/dist/observability/escape-hatch-report.js +9 -2
  476. package/dist/observability/index.d.ts +7 -15
  477. package/dist/observability/index.js +4 -12
  478. package/dist/observability/metric-validator.js +1 -1
  479. package/dist/observability/metrics-handle.d.ts +0 -1
  480. package/dist/observability/metrics-handle.js +2 -15
  481. package/dist/observability/recording-tracer.d.ts +1 -2
  482. package/dist/observability/recording-tracer.js +0 -6
  483. package/dist/observability/sensitive-filter.d.ts +0 -2
  484. package/dist/observability/sensitive-filter.js +0 -29
  485. package/dist/pipeline/active-membership.d.ts +2 -1
  486. package/dist/pipeline/active-membership.js +6 -2
  487. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  488. package/dist/pipeline/after-rollback-sink.js +32 -0
  489. package/dist/pipeline/append-event-core.d.ts +2 -1
  490. package/dist/pipeline/append-event-core.js +2 -2
  491. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  492. package/dist/pipeline/attach-outside-transaction.js +13 -0
  493. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  494. package/dist/pipeline/cascade-handler.d.ts +2 -1
  495. package/dist/pipeline/cascade-handler.js +3 -2
  496. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  497. package/dist/pipeline/config-accessor-factory.js +1 -1
  498. package/dist/pipeline/context-services.d.ts +56 -0
  499. package/dist/pipeline/context-services.js +73 -0
  500. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  501. package/dist/pipeline/dispatch-batch.js +39 -19
  502. package/dist/pipeline/dispatch-query.js +5 -4
  503. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  504. package/dist/pipeline/dispatch-scope.js +27 -0
  505. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  506. package/dist/pipeline/dispatch-shared.js +75 -194
  507. package/dist/pipeline/dispatch-stream.js +8 -4
  508. package/dist/pipeline/dispatch-write.d.ts +2 -1
  509. package/dist/pipeline/dispatch-write.js +10 -8
  510. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  511. package/dist/pipeline/dispatcher-utils.js +8 -2
  512. package/dist/pipeline/dispatcher.d.ts +3 -2
  513. package/dist/pipeline/dispatcher.js +4 -3
  514. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  515. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  516. package/dist/pipeline/event-dispatcher-delivery.js +7 -3
  517. package/dist/pipeline/event-dispatcher.d.ts +3 -2
  518. package/dist/pipeline/event-dispatcher.js +13 -12
  519. package/dist/pipeline/event-retention.js +59 -56
  520. package/dist/pipeline/handler-access-error.js +2 -1
  521. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  522. package/dist/pipeline/handler-context-auth.js +7 -4
  523. package/dist/pipeline/handler-context-config.d.ts +2 -5
  524. package/dist/pipeline/handler-context-config.js +2 -2
  525. package/dist/pipeline/handler-context-db.d.ts +32 -7
  526. package/dist/pipeline/handler-context-db.js +26 -17
  527. package/dist/pipeline/handler-context-dispatch.d.ts +14 -6
  528. package/dist/pipeline/handler-context-dispatch.js +18 -5
  529. package/dist/pipeline/handler-context-events.d.ts +22 -38
  530. package/dist/pipeline/handler-context-events.js +42 -35
  531. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  532. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  533. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  534. package/dist/pipeline/handler-context-notify.js +1 -1
  535. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  536. package/dist/pipeline/handler-context-observability.js +7 -5
  537. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  538. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  539. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  540. package/dist/pipeline/handler-context-scope.js +18 -20
  541. package/dist/pipeline/index.d.ts +9 -21
  542. package/dist/pipeline/index.js +5 -7
  543. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  544. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  545. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  546. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  547. package/dist/pipeline/member-read-only-transaction.js +11 -3
  548. package/dist/pipeline/member-reader.d.ts +1 -1
  549. package/dist/pipeline/member-reader.js +2 -2
  550. package/dist/pipeline/msp-rebuild.js +5 -3
  551. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  552. package/dist/pipeline/notify-scope.d.ts +2 -1
  553. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  554. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  555. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  556. package/dist/pipeline/projection-rebuild.js +12 -5
  557. package/dist/pipeline/projection-state.d.ts +0 -6
  558. package/dist/pipeline/projection-state.js +0 -5
  559. package/dist/pipeline/projections-runner.d.ts +2 -1
  560. package/dist/pipeline/projections-runner.js +10 -6
  561. package/dist/pipeline/system-hooks.d.ts +6 -2
  562. package/dist/pipeline/system-hooks.js +61 -10
  563. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  564. package/dist/pipeline/system-identity-switch.js +51 -36
  565. package/dist/pipeline/typed-append-event.d.ts +2 -0
  566. package/dist/pipeline/typed-append-event.js +4 -0
  567. package/dist/pipeline/write-origin.js +2 -2
  568. package/dist/pipeline/write-result-masking.d.ts +1 -1
  569. package/dist/pipeline/write-result-masking.js +13 -10
  570. package/dist/random/index.d.ts +1 -2
  571. package/dist/random/index.js +1 -2
  572. package/dist/rate-limit/bucket.d.ts +2 -1
  573. package/dist/rate-limit/middleware.js +2 -1
  574. package/dist/redis/index.d.ts +3 -4
  575. package/dist/redis/index.js +2 -2
  576. package/dist/schema-cli/apply-command.js +5 -2
  577. package/dist/schema-cli/baseline-command.js +7 -2
  578. package/dist/schema-cli/generate-command.js +7 -9
  579. package/dist/schema-cli/shared.d.ts +4 -0
  580. package/dist/schema-cli/shared.js +21 -2
  581. package/dist/schema-cli/status-command.js +8 -2
  582. package/dist/schema-cli/validate-command.js +52 -4
  583. package/dist/schema-cli.d.ts +0 -1
  584. package/dist/search/configure-tenant-index.d.ts +1 -3
  585. package/dist/search/configure-tenant-index.js +0 -4
  586. package/dist/search/index.d.ts +1 -4
  587. package/dist/search/index.js +0 -2
  588. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  589. package/dist/search/meilisearch-adapter-internals.js +9 -0
  590. package/dist/search/meilisearch-adapter.d.ts +1 -8
  591. package/dist/search/meilisearch-adapter.js +6 -7
  592. package/dist/search/meilisearch-peer.d.ts +2 -0
  593. package/dist/search/meilisearch-peer.js +5 -0
  594. package/dist/search/reindex-entity.js +107 -91
  595. package/dist/secrets/index.d.ts +3 -4
  596. package/dist/secrets/index.js +2 -3
  597. package/dist/seeding/index.d.ts +2 -2
  598. package/dist/seeding/index.js +1 -2
  599. package/dist/time/index.d.ts +2 -2
  600. package/dist/time/index.js +1 -1
  601. package/dist/time/tz-context.d.ts +0 -5
  602. package/dist/time/tz-context.js +0 -9
  603. package/dist/ui-types/index.d.ts +8 -11
  604. package/dist/ui-types/index.js +3 -3
  605. package/dist/upgrade-changelog.d.ts +3 -0
  606. package/dist/upgrade-changelog.js +18 -0
  607. package/dist/upgrade-cli-internals.d.ts +8 -0
  608. package/dist/upgrade-cli-internals.js +63 -0
  609. package/dist/upgrade-cli.d.ts +1 -18
  610. package/dist/upgrade-cli.js +29 -137
  611. package/dist/upgrade-marker-parse.d.ts +32 -0
  612. package/dist/upgrade-marker-parse.js +73 -0
  613. package/dist/utils/import-optional-peer.d.ts +6 -0
  614. package/dist/utils/import-optional-peer.js +19 -0
  615. package/dist/utils/index.d.ts +1 -4
  616. package/dist/utils/index.js +1 -4
  617. package/package.json +27 -20
  618. package/src/changes.json +451 -0
  619. package/dist/crypto/request-kms-cache.d.ts +0 -8
  620. package/dist/crypto/request-kms-cache.js +0 -21
  621. package/dist/engine/codemod/index.d.ts +0 -2
  622. package/dist/engine/codemod/index.js +0 -1
  623. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  624. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  625. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  626. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  627. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  628. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  629. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  630. package/dist/engine/feature-ast/extractors/events.js +0 -275
  631. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  632. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  633. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  634. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  635. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  636. package/dist/engine/feature-ast/extractors/index.js +0 -13
  637. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  638. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  639. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  640. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  641. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  642. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  643. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -10
  644. package/dist/engine/feature-ast/extractors/round1.js +0 -81
  645. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  646. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  647. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  648. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  649. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  650. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  651. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  652. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  653. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  654. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  655. package/dist/engine/feature-ast/index.d.ts +0 -16
  656. package/dist/engine/feature-ast/index.js +0 -10
  657. package/dist/engine/feature-ast/parse.d.ts +0 -31
  658. package/dist/engine/feature-ast/parse.js +0 -483
  659. package/dist/engine/feature-ast/patch.d.ts +0 -210
  660. package/dist/engine/feature-ast/patch.js +0 -610
  661. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  662. package/dist/engine/feature-ast/patcher.js +0 -281
  663. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1476
  664. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
  665. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  666. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
  667. package/dist/engine/feature-ast/patterns.d.ts +0 -318
  668. package/dist/engine/feature-ast/patterns.js +0 -106
  669. package/dist/engine/feature-ast/render.d.ts +0 -47
  670. package/dist/engine/feature-ast/render.js +0 -662
  671. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  672. package/dist/engine/feature-ast/source-location.js +0 -27
  673. package/dist/engine/pattern-library/index.d.ts +0 -2
  674. package/dist/engine/pattern-library/index.js +0 -3
  675. package/dist/engine/pattern-library/library.d.ts +0 -14
  676. package/dist/engine/pattern-library/library.js +0 -93
  677. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  678. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  679. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  680. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  681. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  682. package/dist/engine/pattern-library/shared-fields.js +0 -88
  683. package/dist/engine/pattern-library/static-schemas.d.ts +0 -20
  684. package/dist/engine/pattern-library/static-schemas.js +0 -478
  685. package/dist/engine/pattern-library/types.d.ts +0 -158
  686. package/dist/engine/pattern-library/types.js +0 -36
  687. package/dist/engine/provider-plugin-context.d.ts +0 -3
  688. package/dist/engine/provider-plugin-context.js +0 -28
  689. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  690. package/dist/engine/resolve-config-or-param.js +0 -76
  691. package/src/scripts/codemod/README.md +0 -187
  692. package/src/scripts/codemod/codemod-support.ts +0 -334
  693. package/src/scripts/codemod/collect-source-files.ts +0 -48
  694. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  695. package/src/scripts/codemod/db-factory.ts +0 -810
  696. package/src/scripts/codemod/feature-factory.ts +0 -429
  697. package/src/scripts/codemod/feature-layout.ts +0 -424
  698. package/src/scripts/codemod/import-extensions.ts +0 -118
  699. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  700. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  701. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  702. package/src/scripts/codemod/object-form.ts +0 -746
  703. package/src/scripts/codemod/package-merge.ts +0 -299
  704. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  705. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  706. package/src/scripts/codemod/s3-imports.ts +0 -236
  707. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  708. package/src/scripts/codemod/testing-injection.ts +0 -215
  709. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  710. package/src/scripts/codemod/testing-move.ts +0 -542
  711. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
package/src/changes.json CHANGED
@@ -1,4 +1,455 @@
1
1
  [
2
+ {
3
+ "version": "0.390.0",
4
+ "type": "fix",
5
+ "title": "Parallel writes in one handler no longer abort the transaction",
6
+ "detail": "Bun.SQL does not serialize savepoints on a transaction. A handler that started several executor writes on ctx.db with Promise.all opened overlapping savepoints, the first RELEASE also released its neighbours, and the next one aborted the whole transaction with a 500. runInSavepoint and runInSavepointIfSupported now queue savepoints per transaction (proxy runners over the same transaction share one queue, savepoints opened from inside a running one still nest), and an executor verb on a handler transaction now runs in its own savepoint: when it fails, its event append, projection and hooks roll back together, also when the handler catches the failure, so no event without projection is left behind and a rebuild replays cleanly. Postgres errors 22007 and 22008 (a date or time value the column rejects, such as 2026-02-30) now map to a 400 validation_error instead of a 500, on writes and on query filters."
7
+ },
8
+ {
9
+ "version": "0.390.0",
10
+ "type": "breaking",
11
+ "title": "HandlerContext without wiring, hooks receive the HandlerContext",
12
+ "detail": "HandlerContext has 19 members and no longer carries the AppContext wiring. ctx.services holds redis, cacheSync, jobRunner, searchAdapter, entityCache, secrets, kms, files, derivatives, configResolver, configEncryption, rateLimit, effectiveFeatures and masterKeyProvider; every key of an app's extraContext that the framework does not know now lives in ctx.services.extensions (it used to sit flat on the context through a spread, invisible to tsc). ctx.lifecycle holds afterCommit and afterRollback (replacing scheduleAfterCommit and scheduleAfterRollback), signal and runPreSave. ctx.tenants holds config (replacing configFor) and writeTarget (replacing forTenant). ctx.obs gains meter, and the flat log, tracer, _tenantId, systemUser and triggeredBy are gone; read ctx.user.tenantId and ctx.obs.log. JobContext no longer extends the shared wiring fields; it gets services and lifecycle.signal and keeps systemUser, triggeredBy and its job fields. All hooks (preSave, postSave, postSaveBatch, preDelete, postDelete, postDeleteBatch, preQuery, postQuery) and the system hook definitions receive the HandlerContext instead of the AppContext, and the batch hooks run on a real handler context built per flush. AppContext stays the flat boot wiring and declares services as never, so a handler or job context can no longer be passed to a function that takes an AppContext. The context of beforeTransaction no longer exposes ctx.systemDb.outsideTransaction, which was a hole next to the denied ctx.db.outsideTransaction. The member-resolution and pre-transaction contexts also drop the notify factories from ctx.services, and member resolution drops _fileProviderResolver, so neither can rebuild the denied notify or file storage. Helpers that took a structural context with an optional flat member read undefined once a handler context stopped carrying it; their shapes now make that a type error: requireSecretsContext, FileProviderContext (createFileProviderForTenant) and MailTransportContext (createTransportForTenant) take a required secrets key (handlers pass { secrets: ctx.services.secrets, user: ctx.user }), and CreateFileRefContext/UploadFileBytesContext read services.files, so a handler or job context passes straight in. bridgeStub accepts a services option.",
13
+ "migration": "Run kumiko-upgrade --apply; it runs the ctx-namespaces codemod. It rewrites ctx.redis, cacheSync, jobRunner, searchAdapter, entityCache, secrets, kms, files, derivatives, configResolver, effectiveFeatures and the other service members to ctx.services.*, scheduleAfterCommit and scheduleAfterRollback to ctx.lifecycle.afterCommit and afterRollback, signal to ctx.lifecycle.signal, configFor and forTenant to ctx.tenants.config and writeTarget, and hook parameters annotated AppContext to HandlerContext, including context.log to context.obs.log in the hook body. Keys of your extraContext that you read through a cast move to ctx.services.extensions. Listed for manual review: ctx.systemUser, ctx.triggeredBy and ctx._tenantId on a HandlerContext (read ctx.user), a handler or job context passed to a function that takes an AppContext (narrow that parameter to the members it reads), spread literals next to moved members, and a handler or job context passed to a parameter whose structural type reads a moved member (it would read undefined without a type error). Hand-built test contexts take services, lifecycle and tenants from bridgeStub({ services }).",
14
+ "codemod": "scripts/codemod/ctx-namespaces.ts"
15
+ },
16
+ {
17
+ "version": "0.390.0",
18
+ "type": "breaking",
19
+ "title": "HandlerContext and JobContext use namespaces instead of flat members",
20
+ "detail": "The roughly 40 flat members of HandlerContext are grouped by purpose, with no deprecated aliases. ctx.db.outsideTransaction replaces ctx.dbOutsideTransaction and ctx.outsideTransaction (the property is non-enumerable and sits on the same db object, so TenantDb identity stays intact; it is undefined in the member-resolution and before-transaction phases and in platform-metering tenant mode). ctx.events holds append, unsafeAppend, tryAppend, fetchForWriting, load, archive, restore, isArchived, snapshot and loadWithSnapshot. ctx.dispatch holds query, queryAs, write, writeAs, queryAsMember and queryProjection. ctx.auth holds resolveClaims and resolveActiveMembership. ctx.obs holds log, tracer, metrics and metricsFor, and ctx.obs.log is now always a Logger. JobContext gets the subsets events.append, dispatch.write/writeAs/queryAs/queryAsMember and obs.log/metricsFor. reserveBeforeTransaction and beforeTransaction receive the new ReservationContext and BeforeTransactionContext types, so the surfaces they deny no longer exist on the type. The deprecated _configAccessorFactory alias is removed; use configAccessorFactory. The cap-counter resolvers and the template-resolver PrepareContext now take ReservationContext instead of HandlerContext (type-level break for callers passing a full HandlerContext-typed value to a narrower position, and for wrappers declaring the old type). attachOutsideTransaction(db, outsideDb) from @cosmicdrift/kumiko-framework/engine gives hand-built contexts a db.outsideTransaction; it mutates the passed db with a non-enumerable property (Object.defineProperty) and returns the same object. bridgeStub now accepts log and dispatch options. AppContext stays flat, and the context handed to postSave, preDelete, postDelete and postQuery hooks still reads context.log; a separate hook context follows in a later release.",
21
+ "migration": "Run kumiko-upgrade --apply; it runs the ctx-namespaces codemod. It rewrites ctx.dbOutsideTransaction and ctx.outsideTransaction to ctx.db.outsideTransaction, ctx.appendEvent/unsafeAppendEvent/tryAppendEvent/fetchForWriting/loadAggregate/archiveStream/restoreStream/isStreamArchived/snapshotAggregate/loadAggregateWithSnapshot to ctx.events.append/unsafeAppend/tryAppend/fetchForWriting/load/archive/restore/isArchived/snapshot/loadWithSnapshot, ctx.query/queryAs/write/writeAs/queryAsMember/queryProjection to ctx.dispatch.*, ctx.resolveAuthClaims/resolveActiveMembership to ctx.auth.resolveClaims/resolveActiveMembership, and ctx.log/tracer/metrics/metricsFor to ctx.obs.*. Object literals typed as HandlerContext or JobContext (test mocks) are nested the same way. Sites the codemod cannot resolve are listed for manual review: spread literals, untyped receivers, and AppContext reads such as context.log in hooks, which stay as they are. Manual pattern { db: someDb, dbOutsideTransaction: x } becomes db: attachOutsideTransaction(someDb, x). Spread calls such as ...bridgeStub() next to moved members are reworked by hand; pass log/dispatch as bridgeStub options. Rename _configAccessorFactory to configAccessorFactory where you set it on an AppContext.",
22
+ "codemod": "scripts/codemod/ctx-namespaces.ts"
23
+ },
24
+ {
25
+ "version": "0.390.0",
26
+ "type": "breaking",
27
+ "title": "Feature AST, pattern library and codemods moved to @cosmicdrift/kumiko-feature-ast",
28
+ "detail": "Feature AST, pattern library and codemods moved to the new package @cosmicdrift/kumiko-feature-ast; kumiko-upgrade heals stale open lines in CHANGELOG.md",
29
+ "migration": "Import these names from @cosmicdrift/kumiko-feature-ast instead of @cosmicdrift/kumiko-framework/engine: AddEntityArgs, AddHookArgs, AddRelationArgs, AddWriteHandlerArgs, FeaturePatcher, FeaturePattern, FeaturePatternKind, FormFieldLabel, FormFieldSpec, FormInputType, HandlerHeaderUpdate, ParseError, ParseResult, PatternCategory, PatternChange, PatternChangeIssue, PatternChangesParseResult, PatternFormSchema, PatternId, RenderFeatureFileInput, SourceLocation, PATTERN_LIBRARY, VERSION_HEADER, addPattern, applyChanges, createFeaturePatcher, getPatternSchema, groupByCategory, parseFeatureFile, parsePatternChanges, parseSourceFile, removePattern, renderFeatureFile, renderPattern, replacePattern, updatePattern. Import CodemodOptions, CodemodReport, CodemodResult, FileAnalysis, ParsedHandlerInfo, analyzeFile, analyzeHandlerArrow, convertFile, generatePerformBlock, runCodemod, scanForCandidates from @cosmicdrift/kumiko-feature-ast/codemod instead of @cosmicdrift/kumiko-framework/engine/codemod. Add @cosmicdrift/kumiko-feature-ast to the dependencies of the importing package; the codemod does both. @cosmicdrift/kumiko-framework no longer installs ts-morph.",
30
+ "codemod": "scripts/codemod/feature-ast-package.ts"
31
+ },
32
+ {
33
+ "version": "0.390.0",
34
+ "type": "fix",
35
+ "title": "kumiko-upgrade --apply and --resolve heal stale open lines in CHANGELOG.md",
36
+ "migration": "Every manual migration the upgrade marker lists as resolved gets its status in CHANGELOG.md, including `- [open]` lines in older sections left behind by a resolve with an older CLI."
37
+ },
38
+ {
39
+ "version": "0.390.0",
40
+ "type": "improvement",
41
+ "title": "allAppFeatures documents that its list is raw",
42
+ "detail": "The JSDoc of allAppFeatures says the list has no bundled foundation and that tooling such as runSchemaCli takes FEATURES from kumiko/schema. Behavior is unchanged."
43
+ },
44
+ {
45
+ "version": "0.390.0",
46
+ "type": "breaking",
47
+ "title": "Jobs append their own events with ctx.events.append",
48
+ "detail": "Jobs no longer need escapeHatch or unsafeRaw plus the low-level event-store API to append their own feature's events. The same ownership and schema rules apply as in write handlers, and the append runs in its own transaction together with the inline projections.",
49
+ "migration": "JobContext has a new required field events.append. Code that builds a JobContext object by hand (boot seeds, test fixtures) and does not spread bridgeStub() adds an events.append that throws when the code under test never appends. Jobs that appended their own feature's events through escapeHatch or unsafeRaw switch to ctx.events.append({ type, aggregateId, aggregateType, payload })."
50
+ },
51
+ {
52
+ "version": "0.390.0",
53
+ "type": "breaking",
54
+ "title": "Jobs see whether they can still defer (ctx.canDefer)",
55
+ "detail": "ctx.canDefer is false when the run is inline or the maxDefers budget is used up, so a handler can write its terminal state instead of deferring into an UnrecoverableError. Behaviour of ctx.defer and the maxDefers failure is unchanged.",
56
+ "migration": "JobContext has a new required field canDefer. Code that builds a JobContext object by hand (boot seeds, test fixtures) adds `canDefer: false` unless the context really supports ctx.defer. Contexts built by the job runner or cast with `as unknown as JobContext` need no change."
57
+ },
58
+ {
59
+ "version": "0.390.0",
60
+ "type": "breaking",
61
+ "title": "meilisearch is an optional peer dependency",
62
+ "migration": "Apps that import @cosmicdrift/kumiko-framework/search/meilisearch add meilisearch to their own dependencies (bun add meilisearch@^0.58.0); without it that import fails at boot with a message that names the package. Apps without the Meilisearch adapter need nothing."
63
+ },
64
+ {
65
+ "version": "0.390.0",
66
+ "type": "breaking",
67
+ "title": "Framework subpaths no longer export names without a user",
68
+ "detail": "A name stays exported from a subpath of @cosmicdrift/kumiko-framework only if at least one consumer outside packages/framework imports it from that subpath (other Kumiko packages, samples, the framework docs, kumiko-enterprise, kumiko-platform, kumiko-studio and the seven apps). Names added since 0.389.0 stay public. 1236 names had no user and are removed from their subpath; 30 of them are deleted together with their code and tests, the rest stay inside the framework as internal modules without a public export. The public-exports baseline keeps the new, smaller surface. Removed names per subpath:\n./compliance: AuthorityNotificationDeadline, BundleTier, OVERRIDABLE_PROFILE_KEYS, RetentionSpec, UserNotificationRequiredPolicy, describeDurationSpec, durationSpecToMs\n./config: AppClientConfig, AppPortEntry\n./es-ops: CreateSeedMigrationContextArgs, EsOperationAppliedBy, EsOperationType, RunPendingSeedMigrationsArgs, RunPendingSeedMigrationsResult, SeedMembershipRow, SeedTemplateResourceFilter, SeedTemplateResourceRow, SeedTenantRow, SeedUserRow\n./engine: ActiveMembership, ActiveMembershipRejection, ActiveMembershipResult, AgentExposure, App, AppConfig, AppendEventArgs, AppendEventFn, AssignableFromRole, AuthClaimsFn, AuthClaimsHookDef, BeforeTransactionPhase, BelongsToRelation, BigIntFieldDef, BooleanFieldDef, BuildAppSchemaOptions, BuildManifestOptions, BuiltinQnType, CamelToKebab, CardMetaOverflow, ChangelogType, ClaimKeyDefinition, ClaimKeyHandle, ClaimKeyJsType, ClampInfo, ConcurrencyMode, ConcurrencyModes, ConfigBacking, ConfigDefinition, ConfigFeatureSchema, ConfigKeyAccess, ConfigMask, ConfigSeedDef, ConfigStoredRow, ConfigStoredRowWithSource, ConfigValidateContext, CreateEventDefOptions, CreateSeedOptions, CreateTenantSeedOptions, CreateUserSeedOptions, CustomScreenDefinition, CustomScreenRoute, DashboardChartPanel, DashboardCurrencyFormat, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRecordBinding, DashboardRefresh, DashboardRelativeTimeFormat, DashboardRelativeTimeParam, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardValueFormat, DateFieldDef, DecimalFieldDef, DerivedFieldDef, DerivedFieldsMap, DerivedValueType, EXTENSION_SELECTOR_HINT_KEY, EditExtensionSection, EditFieldPrefill, EditFieldsSection, EditLayout, EmbeddedListEditSpec, EmitCtx, EntityCrudRegistrar, EntityEditAction, EntityEditActionPlacement, EntityListExpandableRow, EntityObjectDefinition, EntityRef, EntityRelations, EscapeHatchReporter, EscapeHatchTarget, ExpandableRowGrouping, FeatureChangelog, FieldAccess, FieldIconKey, FieldRenderer, FileFieldDef, FilesFieldDef, Findability, FormDerivationScreen, FormWidth, FormatSpec, HANDLER_FIELD_REFERENCES_META_KEY, HandlerFieldPathSegment, HandlerFieldReference, HandlerFieldReferenceAtPath, HandlerFieldReferenceMeta, HasManyRelation, HookDefinition, HookMap, ImageFieldDef, ImagesFieldDef, JobBackoff, JobBackoffStrategy, JobTriggerEvent, KumikoEntityTypeMap, KumikoExtensionName, KumikoHandlerPayloadMap, KumikoHandlerResultMap, ListPaginationMode, ListSortDir, ListSortSpec, LongTextFindability, ManyToManyRelation, MaxPerTenantOptions, MemberReader, MessageKind, MetricSpec, MspErrorPolicy, MultiSelectFieldDef, NameOrRef, NotificationDataFn, NotificationRecipientFn, NotificationTemplateFn, NotifyDeferred, NumberFieldDef, OnDeleteStrategies, OnDeleteStrategy, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, OwnershipClause, OwnershipRef, OwnershipRule, PagedListRequest, PagedListRowValue, ParentRefDef, ParsedQn, ParsedRefTarget, PersonalAnnotations, PersonalAnnotationsLongText, PersonalAnnotationsNoFind, PersonalSubject, PipelineBuildCtx, PipelineDef, PlatformComponent, PluralForms, PreQueryHookFn, PreparedWriteEvent, ProjectionTable, QnType, QualifiedEventName, QueryHandlerFn, RecordHeaderSpec, RecordHeaderSubtitlePart, RegisterEntityCrudOptions, ResolveOptions, RowActionNavigate, RowActionNavigateBase, RowFieldExtractor, SETTINGS_HUB_WORKSPACE, SUSPEND_SENTINEL, ScreenFilter, ScreenFilterOp, ScreenNavSugar, ScreenSlots, SecretMintConfirmStep, SecretReveal, SecretRevealField, SecretsEditScreenDefinition, SecretsEditSection, SelectFieldDef, SessionUserOrigin, StackBootRequirement, StepBuilder, StepDef, StepFailureStrategy, StepKind, StepListOutcome, StepNamespace, StorageProviderExtensionHooks, StreamHandlerDefinition, StreamHandlerFn, Subscribe, SystemHookName, SystemHookNames, SystemHookPriorities, TENANT_TEARDOWN_STATUSES, TemplateImagesVariableDef, TenantDataExtensionHooks, TenantResourceExtensionHooks, TextFieldDef, TranslationValue, TranslationsDef, TreeActionsHandle, TreeNodeState, UnavailableSelectOption, UnsafeAppendEventFn, UserDataExtensionHooks, UserDataExtensionOptions, WorkflowInput, WorkflowTrigger, applyFormDerivations, availableSelectOptions, buildOwnershipClause, buildTarget, checkWriteFieldOwnership, checkWriteFieldRoles, combineClauses, createApp, createEventDef, createUserSeed, findUnavailableSelectOptions, formDerivationsOfSchema, handlerFieldReferences, isExtensionEditSection, isForbiddenMembershipRole, isFormDerivationInputMode, isPagedQueryHandler, isPrincipalStatusPlugin, isTenantLifecycleStatusPlugin, isWriteFormEditSection, listStepKinds, qualifyTranslationKey, readHandlerFieldReferences, resolveConfigOrParam, resolveName, runValidation, runsInLane, sortEntries, stripForbiddenMembershipRoles, tenantOverrideDenied, userCanCreateFieldRow, userCanReadFieldRow, userCanWriteFieldRow, validateChangelog\n./engine/types: AccessRule, ActionFormScreenDefinition, ActiveMembership, ActiveMembershipRejection, ActiveMembershipResult, AgentExposure, AgentHandlerHints, AgentRisk, AggregateStreamHandle, AnyFileFieldDef, AppendEventArgs, AppendEventFn, AuthClaimsContext, AuthClaimsFn, AuthClaimsHookDef, BeforeTransactionPhase, BeforeTransactionResult, BelongsToRelation, BigIntFieldDef, BooleanFieldDef, BootCheckContext, BootCheckFn, BootOptionName, BundledListsOptions, CamelToKebab, ChatSendFailureCode, ClaimKeyDefinition, ClaimKeyHandle, ClaimKeyJsType, ClaimKeyType, ClientDerivedFieldDef, ConcurrencyMode, ConfigAccessor, ConfigAccessorFactory, ConfigBacking, ConfigBounds, ConfigCascade, ConfigCascadeLevel, ConfigComputedContext, ConfigComputedFn, ConfigDefinition, ConfigEditScreenDefinition, ConfigKeyAccess, ConfigKeyDefinition, ConfigKeyHandle, ConfigKeyType, ConfigMask, ConfigResolver, ConfigScope, ConfigSecretsReader, ConfigSeedDef, ConfigStoredRow, ConfigStoredRowWithSource, ConfigValidateContext, ConfigValidateFn, ConfigValue, ConfigValueSource, ConfigValueWithSource, ContentCollectionDefinition, CreateSeedOptions, CreateTenantSeedOptions, CreateUserSeedOptions, CustomScreenDefinition, CustomScreenRoute, DEFAULT_CURRENCIES, DEFAULT_LOCALES, DELIVERY_FAILURE_CODES, DELIVERY_SKIP_REASONS, DashboardChartMarkerKind, DashboardChartPanel, DashboardChartRangeOption, DashboardChartRanges, DashboardCurrencyFormat, DashboardCustomPanel, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardI18nText, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelGate, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRecordBinding, DashboardRefresh, DashboardRelativeTimeFormat, DashboardRelativeTimeParam, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardValueFormat, DateFieldDef, DecimalFieldDef, DeclarativeEventMigration, DefaultCurrency, DeleteContext, DeliveryErrorCode, DeliveryFailureCode, DeliverySkipReason, DeriveContext, DerivedFieldDef, DerivedFieldsMap, DerivedValueType, DispatchWriteRef, EditExtensionSection, EditFieldPrefill, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedDerivedCellDef, EmbeddedFieldDef, EmbeddedListEditSpec, EmbeddedSubFieldDef, EntityCrudRegistrar, EntityCrudVerb, EntityDefinition, EntityEditAction, EntityEditActionPlacement, EntityEditScreenDefinition, EntityEventMigration, EntityFieldDefinition, EntityHandlerOptions, EntityHookMap, EntityId, EntityIndexDef, EntityListExpandableRow, EntityListScreenDefinition, EntityLongTextFieldDef, EntityObjectDefinition, EntityProjectionExtension, EntityQueryHandlerOptions, EntityRef, EntityRelations, EntityTextFieldDef, EntityWriteHandlerOptions, EscapeHatchAuditSink, EscapeHatchDeclaration, EscapeHatchKind, EscapeHatchReporter, EscapeHatchTarget, EscapeHatchUseEvent, EventDef, EventMigrationDef, EventPiiFields, EventUpcastCtx, EventUpcastFn, ExpandableRowGrouping, ExtensionOptionsArgs, ExtensionOptionsFor, ExtensionSelectorDef, ExtensionSelectorPanel, FeatureMetricDef, FeatureMetricType, FeatureRegistrar, FetchForWritingArgs, FieldAccess, FieldCondition, FieldDefinition, FieldFormatRegistry, FieldIconKey, FieldRenderer, FieldsMap, FileFieldDef, FilesFieldDef, Findability, FormFieldDerivation, FormWidth, FormatSpec, FromRule, FromRuleKind, HTTP_ERROR_CODE_PATTERN, HandlerRef, HasManyRelation, HookDefinition, HookMap, HookOwner, HookPhase, HookPhases, HttpRouteDefinition, HttpRouteHandler, HttpRouteHandlerDeps, HttpRouteMethod, ImageFieldDef, ImagesFieldDef, JobBackoff, JobBackoffStrategy, JobContext, JobDeferral, JobDefinition, JobHandlerFn, JobRunnerRef, JobTrigger, JobTriggerEvent, JsonbFieldDef, KumikoEntityTypeMap, KumikoEventTypeMap, KumikoExtensionOptionsMap, KumikoHandlerPayloadMap, KumikoHandlerResultMap, LifecycleHookFn, LifecycleHookType, LifecycleResult, ListColumnSpec, ListEmptyStateSpec, ListFacetSpec, ListPaginationMode, ListSortDir, ListSortSpec, ListTableOptions, LocatedTimestampFieldDef, LongTextFieldDef, LongTextFindability, ManyToManyRelation, MaxPerTenantOptions, MemberReader, MetricNavigate, MetricOptions, MetricSpec, MoneyCurrencySource, MoneyFieldDef, MspErrorMode, MspErrorPolicy, MultiSelectFieldDef, MultiStreamApplyFn, MultiStreamProjectionDefinition, NameOrRef, NavDefinition, NavIconKey, NotificationDataFn, NotificationDefinition, NotificationLocalizedTemplate, NotificationRecipientFn, NotificationRecordMapping, NotificationTemplateBody, NotificationTemplateFn, NotificationTemplateMeta, NotifyDeferred, NotifyDelivery, NotifyDeliveryStatus, NotifyDispatched, NotifyFactory, NotifyFn, NotifyJobDispatcher, NotifyOptions, NotifyPriority, NotifyResult, NumberFieldDef, OnDeleteStrategy, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, OptionsQueryPayload, OptionsQueryPayloadValue, OwnedFn, OwnershipClause, OwnershipMap, OwnershipRef, OwnershipRule, ParentRefDef, PayloadBucketNormalization, PayloadRateLimitOption, PersonalAnnotations, PersonalAnnotationsLongText, PersonalAnnotationsNoFind, PersonalSubject, PhasedHook, PlatformComponent, PluralForms, PostDeleteBatchHookFn, PostDeleteHookFn, PostQueryHookFn, PostSaveBatchHookFn, PostSaveHookFn, PreDeleteHookFn, PreQueryHookFn, PreSaveHookFn, PreparedWriteEvent, ProjectionDefinition, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, ProjectionRowIdOf, ProjectionTable, QualifiedEventName, QueryHandlerDef, QueryHandlerDefinition, QueryHandlerFn, RateLimitDeclaration, RateLimitDisabled, RateLimitOption, RateLimitOptions, RateLimitPer, RecordHeaderSpec, RecordHeaderSubtitlePart, ReferenceDataDef, RegisterEntityCrudOptions, RegistrarExtensionDef, RegistrarExtensionHooks, RegistrarExtensionRegistration, RelationDefinition, ResolvedPiiFlags, ResolvedPiiStance, RetentionDef, RoleAccessPersonalData, RoleAccessRule, RowAction, RowActionNavigate, RowActionNavigateBase, RowActionWriteHandler, RowFieldExtractor, RunIn, SaveContext, ScreenDefinition, ScreenFilter, ScreenFilterOp, ScreenNavSugar, ScreenSlots, SearchPayloadContributorFn, SecretKeyDefinition, SecretKeyHandle, SecretMintConfirmStep, SecretMintScreenDefinition, SecretNamespaceDefinition, SecretNamespaceHandle, SecretNamespaceOptions, SecretOptions, SecretReveal, SecretRevealField, SecretsEditScreenDefinition, SecretsEditSection, SelectFieldDef, SelectOptionTone, SessionUserOrigin, SingleStreamApplyFn, SqlFragment, StackBootRequirement, StoreTableDef, StoreTableEntry, StoreTableOptions, StreamHandlerDef, StreamHandlerDefinition, StreamHandlerFn, Subscribe, TargetRef, TemplateImagesVariableDef, TemplateListVariableDef, TemplateScalarVariableDef, TemplateVariableDef, TemplateVariables, TenantWriteTarget, TimestampFieldDef, ToolbarAction, TransitionMap, TranslationEntry, TranslationKeys, TranslationValue, TranslationsDef, TreeAction, TreeActionDef, TreeActionsHandle, TreeChildrenSubscribe, TreeNode, TreeNodeState, TryAppendEventFn, TryAppendEventResult, TzFieldDef, UiExtensionDef, UiHintOption, UiHints, UnitKey, UnsafeAppendEventFn, ValidationError, ValidationHookFn, WebSocketMessageData, WebSocketRouteConnectDeps, WebSocketSessionHandlers, WhereRuleContext, WorkspaceDefinition, WriteEvent, WriteHandlerDef, WriteHandlerDefinition, WriteHandlerFn, WriteHandlerInput, WriteResult, declaredRateLimitOptions, isAgentVisibleScreen, isDeliveryErrorCode, isExtensionEditSection, isFileField, isFormatSpec, isOpenToAllGranted, isRateLimitDisabled, isRateLimitOption, isSystemTenant, isUiAccessGranted, isUuid, normalizeEditField, normalizeListColumn, parseTenantId, relatedListGroupHeaderLabel, relatedListGroupKey, resolveAgentExposure, resolveName, withResponseData\n./env: ComposeEnvSchemaOptions, ComposedEnvShape, EnvError, EnvErrorKind, EnvFieldClass, EnvFieldStatus, KumikoEnvMeta, ParseEnvOptions, buildPulumiSuggestion, camelCase, getDefaultValue, getFieldDescription, pulumiConfigKey\n./env/dry-run: DryRunOptions\n./errors: AgentReason, AgentReasons, ErrorCtorInput, ErrorLogEntry, ErrorOpts, ErrorResponseBody, FeatureDisabledDetails, FrameworkReason, IdempotentReplayError, InvalidTransitionDetails, MemberReadTimeoutError, NotFoundDetails, PreconditionFailedDetails, PreconditionFailedError, RateLimitDetails, RateLimitUnavailableError, RecordLockedError, UnauthenticatedError, UnconfiguredDetails, UniqueViolationDetails, UnprocessableOpts, ValidationDetails, VersionConflictDetails, buildErrorLog, buildInvalidTransitionDetails, isSubjectErasedConflict, memberResolutionReadOnlyDenied, resolveErrorDocsUrl, serializeError, toKumikoError, toWriteErrorInfo\n./db: AppliedMigration, ApplyResult, BaselineResult, BuildEntityTableMetaOptions, CompositePrimaryKeyMeta, CreateDbConnectionOptions, CreateTenantDbOptions, CursorQueryOptions, CursorResult, DbConnectionHandle, DbConnectionOptions, DecodedKeysetCursor, DeleteManyBatchedOptions, DeleteManyBatchedResult, EagerLoadEntityResolver, EagerLoadViewer, EagerloadedRow, EntityLifecycleVerb, EntityRow, EventStoreExecutorOptions, ExecutorManagedWriteCapability, FeatureTableSource, GenerateMigrationInput, GenerateMigrationOutput, IncrementCounterOptions, IndexMeta, InnerJoinRow, InnerJoinSpec, InsertOnConflictDoNothingOptions, JoinColumnPair, LocatedTimestampRead, LockGuardOption, Migration, MigrationChecksumMismatchError, OutsideTransactionContext, PgErrorInfo, PgType, ReplayMismatch, ReplayedSchema, ReplayedTable, RetiredFrameworkTable, SYSTEM_SCOPE_CHECK_BRAND, SchemaDiff, SelectQuery, Snapshot, TableColumns, TenantDbGrants, TenantDbMode, UnmanagedTableInput, UpsertOnConflictOptions, WhereOperator, WhereValue, Writable, assertUniqueTableNames, assertValidMigrationName, baselineMigrations, bigint, bigserial, collectReferenceFields, constraintOf, diffReplayAgainstSnapshot, diffSnapshots, encryptEntityFieldValues, enrichRowWithReferences, enrichWithReferences, executeRawQueryRead, fetchAppliedMigrations, findCommentedDropTables, flattenCompoundTypes, flattenLocatedTimestamp, flattenMoney, hasOutsideTransactionDb, instantToDriver, isRetiredFrameworkTable, isTableAlreadyExists, labelListAggregateGroups, loadMigrationsFromDir, moneyAmount, moneyPayloadToMinorUnits, numeric, readMigrationSqlTexts, readRebuildMarker, rebuildTablesFromDiff, rehydrateCompoundTypes, rehydrateLocatedTimestamp, renderMigrationSql, renderTableDdl, replayMigrationsDir, requireOutsideTransactionDb, retiredFrameworkTables, runInSavepoint, runMigrations, snapshotFromMetas, splitSqlStatements, toSnakeCase, toTableName, withoutStatementTimeout, writeRebuildMarker\n./event-store: AppendEventInTenantDbOptions, ArchiveStreamArgs, ArchivedStreamError, DeadLetterRow, DeleteRowsWithoutReplayableStreamArgs, EVENTS_PUBSUB_CHANNEL, EventToAppend, EventUpcasters, IdempotentAppendConflictError, LoadAggregateWithSnapshotOptions, LoadAggregateWithSnapshotResult, PiiBackfillBatchOptions, PiiBackfillBatchResult, PiiBackfillFailure, PiiBackfillOptions, PiiBackfillResult, PiiBackfillScanCache, ProvenanceEventInput, RebuildDeadLetterRow, SaveSnapshotArgs, SkippedApply, Snapshot, SnapshotReducer, TransferAggregateStreamsArgs, UpcastOptions, UpcasterErrorPolicy, createRebuildDeadLetterTable, createSnapshotsTable, createUpcasterDeadLetterTable, listDeadLetters, listRebuildDeadLetters, loadAggregateAsOf, loadAggregateWithSnapshot, loadEventsAfterVersion, loadLatestSnapshot, rebuildDeadLetterTable, recordRebuildDeadLetters, recordUpcasterDeadLetter, restoreStream, saveSnapshot, toStoredEvent, upcastStoredEvents\n./event-store/admin-api: RawEventToAppend\n./pipeline: ACCESS_INVALIDATION_CONSUMER_NAME, AppendDomainEventCoreDeps, ConsumerCursor, ConsumerStatus, ConsumerTransitionRejection, DispatcherPassResult, EntityCache, EntityCacheOptions, EscapeHatchReportWindow, EventConsumer, EventConsumerBatchHandler, EventConsumerHandler, EventDispatcherOptions, FailedWriteResult, LifecycleHooks, MspRebuildDeps, MultiStreamApplyContextDeps, PendingGapEntry, ProjectionProgress, ProjectionStatus, ProjectionStatuses, PruneEventsResult, RebuildResult, ResolveAuthClaimsArgs, SystemHookDef, assertInstructionFieldWriteAllowed, createAccessInvalidationEventConsumer, createEscapeHatchReportWindow, createEventDispatcher, createSearchEventConsumer, createSseBroadcastEventConsumer, fallbackEscapeHatchReporter, isFailedWriteResult, isIrreversibleEntityVerb, reportEscapeHatchUse, selectConsumerCursorForUpdate, withEscapeHatchAuditScope\n./api: AuthMiddlewareOptions, AuthSessionChecker, AuthSessionStatus, CachedResponseInit, ClientIpHeaderSource, ExtraRouteEntries, ExtraRouteEntry, ExtraRouteRejectionOptions, ExtraRouteRejectionStatus, HOST_COOKIE_PREFIX, JwtKeyring, JwtPayload, KumikoServer, KumikoServerWebSocket, PostAuthLandingFlow, RedisSseBrokerOptions, RequestContextData, ResolvedSessionCookies, SessionCookieBase, SessionCookieNames, SetTenantCookieOptions, SignatureExtraRoute, SignatureExtraRouteVerifyDeps, SseClient, SseRouteOptions, TENANT_COOKIE_BASE, TenantExists, TenantLifecycleStatusResolver, TenantResolver, UserExtraRoute, WEBSOCKET_DEFAULT_MAX_CONNECTIONS_PER_USER, WEBSOCKET_REVALIDATION_FAILURE_LIMIT, WebSocketUpgradeServer, assertValidTrustedProxyHops, authMiddleware, clientIpSourceFromHonoContext, createApiRoutes, createAuthRoutes, createJwtHelper, createSseRoute, deleteTenantCookie, extractSocketAddress, getUser, isHostPrefixedCookieName, isSafeLandingPath, kumikoWebSocketHandler, parseIfNoneMatch, patAllows, qnMatches, requestIdMiddleware, resolveSessionCookieNames, resolveSessionCookies, sessionCheckStatus, sessionCookiesMiddleware\n./i18n: DEFAULT_LOCALE, I18n, I18nOptions, pickAcceptLanguage, rankAcceptLanguage, resolveHeaderLocale\n./auth: Role\n./files: BindPendingFileRefOutcome, CreateFileRefContext, DEFAULT_UPLOAD_SWEEP_GRACE_HOURS, FileAccessDecision, FileContentValidationResult, FileHandle, FileMetadata, FileProviderResolverDeps, FileRef, FileRoutesOptions, FileValidationOptions, MIN_UPLOAD_SWEEP_GRACE_HOURS, PendingFileRefBindTarget, UploadFileBytesContext, UploadMimeTypeResolution, WriteStreamOptions, createFileRoutes, createFileUploadLedger, fileRefStorageDelta, makeFileProviderResolver, parseMaxSize, resolveContentType, resolveUploadMimeType, sweepOrphanedUploads, validateFileContent\n./derivatives: DerivativesContextDeps, StoredFileStore, VARIANT_NAME_PATTERN, canonicalJson, createDerivativesContext, isDerivativeKeyOf, listDerivativeKeys, resolveRenderer, specHash\n./jobs: JobSubjectValue\n./observability: ConsoleProviderOptions, Counter, ESCAPE_HATCH_USED_SIGNAL, EscapeHatchProcessDedup, EscapeHatchReportWindow, Gauge, Histogram, Meter, MetricDefinition, MetricEventHandler, MetricLabels, MetricType, ObservabilityWiring, PrometheusMeter, PrometheusMeterSnapshot, REDACTED, RecordingTracerOptions, STANDARD_METRIC_DEFS, SamplingConfig, SensitiveFilterConfig, SerializedTraceContext, Span, SpanAttributeValue, SpanAttributes, SpanKind, SpanStatus, StartSpanOptions, Tracer, UNATTRIBUTED_ACTOR, buildMetricName, createConsoleProvider, createEscapeHatchProcessDedup, createEscapeHatchReportWindow, createEscapeHatchReporter, createUnboundMetricsHandle, emitDbQuery, emitDispatcherError, emitDispatcherHandler, emitEscapeHatchUse, emitEventConsumerLag, emitEventConsumerPassOutcome, emitEventConsumerPassSkipped, emitEventConsumerPendingGaps, emitEventConsumerRearmExhausted, emitEventDispatcherListenConnected, emitHttpRequest, emitJobLastSuccess, emitJobQueueDepth, fallbackEscapeHatchReporter, flushEscapeHatchAudits, generateSpanId, generateTraceId, getFallbackMeter, getFallbackProvider, getFallbackTracer, observabilityContext, redactAttributes, redactHeaders, redactQueryString, redactValue, registerStandardMetrics, reportEscapeHatchUse, serializeOpenMetrics, serializeSpanContext, shouldRedactAttribute, validateLabelKey, validateMetricName, withEscapeHatchAuditScope, wrapRedisClient\n./migrations: ChecksumMismatch, EnqueueProjectionRebuildDeps, EnqueueProjectionRebuildResult, KumikoDriftReport, PendingRebuildRun, PiiEventBackfillOptions, PiiEventBackfillResult, PiiRebuildRun, RunPendingRebuildsOptions, createPendingRebuildsTable, createPiiBackfillStateTable, detectKumikoDrift, formatKumikoDriftReport, pendingRebuildsTable, piiAnnotationFingerprint, piiBackfillStateTable\n./entrypoint: AllInOneEntrypointOptions, BaseEntrypointOptions, PgClient, PgListenClient, WorkerEntrypointOptions\n./random: ADJECTIVES, AdjNounNameOptions, GenerateUniqueNameOptions, NOUNS, generateAdjNounName, generateNoConfusableId\n./redis: CacheSyncBusOverSignalOptions, PubSubSignal, PubSubSignalOptions, RedisCacheSyncBusOptions, ResolvedCacheSyncBus, createCacheSyncBusOverSignal, isTenantConfigSyncMessage, resolveCacheSyncBus\n./search: ReindexEntityFailure, ReindexEntityOptions, ReindexEntityResult, SearchDocument, SearchOptions, SearchResult, collectSearchableFieldNames, configureTenantSearchIndex, deriveSearchAdapterConfig\n./search/meilisearch: MeilisearchAdapterOptions, meilisearchDocId, meilisearchTenantIndex\n./seeding: DEFAULT_SEED_IF_EXISTS, EventStoreSeedExisting, RunEventStoreSeedOptions\n./secrets: ContainsSecret, DekCacheOptions, EnvMasterKeyProviderOptions, Envelope, KeyScope, Keyring, SecretAuditContext, SecretKeyRef, assertNoSecretLeak, isSecret\n./crypto: ActiveKmsWiring, EncryptPiiOptions, EventPiiCatalog, KekSourceEnv, KekSourceOptions, KeyNotFoundError, KmsHealth, KmsWiringEnv, KmsWiringOptions, KmsWiringRelease, PII_CIPHERTEXT_PREFIX_JSON, PgKmsAdapter, PgKmsAdapterOptions, PgKmsRotationEnv, PlaintextPiiWiring, RECORD_ENTITY_PATTERN, RemoteCryptoKmsAdapter, RequestKmsCache, ResolveSubjectOptions, RewrapOptions, RewrapResult, SubjectDek, SubjectKey, blindIndexFieldName, buildPgKmsOptions, collectSearchableSubjectFields, computeBlindIndexValues, configureEventPiiCatalog, createRequestKmsCache, encryptEventPayloadPii, isLocalKeyKmsAdapter, subjectIdFromKey, subjectKeyForTenant\n./logging: LoggerOptions, scrubLogValue\n./schema-cli: RunSchemaCliOptions, SchemaCliOut\n./consumer-cli: ConsumerCliOut\n./upgrade-cli: ManualResolution, UpgradeCliOut, UpgradeMarkerManual, UpgradeMarkerResolvedManual, findCodemodScriptsRoot, findFeatureChangelogFiles, manualEntryId\n./internal/request-context: RequestContextData, isAgentToolCallScope, readonlyRequestContext, runWithOrigin, runWithWriteOrigin, setRequestIdentity\n./time: Clock, GeoAddress, GeoCoordinates, LocatedTimestampJson, TzContextOptions, createTzContextAsync\n./ui-types: BooleanFieldDef, CardColumnRoles, CardRoleColumn, CustomScreenRoute, DashboardChartKind, DashboardChartRangeOption, DashboardChartRanges, DashboardChartTone, DashboardPanelGate, DashboardRecordBinding, DashboardRelativeTimeFormat, DashboardValueFormat, DateFieldDef, EditFieldPrefill, EntityEditActionPlacement, EntityListExpandableRow, EntityListFacetExtraOption, EntityWriteExcludedFields, ExpandableRowGrouping, FieldsOrGroupsSection, FileFieldDef, FilesFieldDef, ImageFieldDef, ImagesFieldDef, ListBadgeTone, ListColumnDisplay, ListRowMetaColumnType, ListRowMetaReference, ListTableDensity, MetricSpec, NumberFieldDef, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, OptionsQueryPayloadValue, PluralForms, ReferenceLookupSource, RoleAccessPersonalData, RoleAccessRule, ScreenFilter, ScreenFilterOp, SecretReveal, SecretRevealField, SecretsEditSection, SelectFieldDef, SystemReferenceLabel, TreeNode, TreeNodeState, UnavailableSelectOption, cardFileDisplayKind, explicitListScreenId, relatedListGroupHeaderLabel, relatedListGroupKey\n./utils: compareByCodepoint, readPositiveIntEnv, stringifyJson, toSnakeCase\nDeleted with their code (no internal replacement): ./auth Role; ./compliance describeDurationSpec, OVERRIDABLE_PROFILE_KEYS; ./crypto createRequestKmsCache, RequestKmsCache; ./db numeric, SelectQuery; ./engine BuiltinQnType, createUserSeed, HandlerFieldReferenceMeta, KumikoExtensionName, listStepKinds, MessageKind, resolveConfigOrParam, ResolveOptions, StorageProviderExtensionHooks, SystemHookName, UserDataExtensionHooks; ./errors AgentReason, buildErrorLog, ErrorLogEntry; ./observability createUnboundMetricsHandle, redactHeaders, redactQueryString, serializeSpanContext; ./pipeline ConsumerStatus, ProjectionStatus, ProjectionStatuses; ./search configureTenantSearchIndex; ./time createTzContextAsync.",
69
+ "migration": "None of the removed names had a user in any Kumiko repository, so no migration is expected. Internal names have no public replacement. The deleted names listed above are gone without a replacement; code that still imports one fails to compile and has to inline the few lines it needs. If you need one back, open an issue."
70
+ },
71
+ {
72
+ "version": "0.390.0",
73
+ "type": "fix",
74
+ "title": "Job runner connects to a password-protected Redis",
75
+ "detail": "parseRedisOpts kept only host, port and db of REDIS_URL, so BullMQ queues and the sequential lock connected without the password and the app stopped at boot with \"Redis not reachable\" against a Redis that requires auth. Username, URL-encoded password and rediss:// TLS are now carried over."
76
+ },
77
+ {
78
+ "version": "0.390.0",
79
+ "type": "breaking",
80
+ "title": "preQuery hooks removed",
81
+ "detail": "`r.hook({ type: \"preQuery\", … })` registered a hook that the query pipeline never called. The `preQuery` hook type, `PreQueryHookFn`, the `preQuery` slot of the hook maps and registrar extension hooks, and `registry.getPreQueryHooks` are removed. A `type: \"preQuery\"` registration is now a type error and throws at feature registration instead of being silently ignored.",
82
+ "migration": "No known users. Remove `r.hook({ type: \"preQuery\", … })` registrations; they never ran. To change a query payload, validate or transform it inside the query handler."
83
+ },
84
+ {
85
+ "version": "0.390.0",
86
+ "type": "improvement",
87
+ "title": "Row level security policy DDL behind a rowLevelSecurity parameter",
88
+ "detail": "renderTableDdl, renderTablesDdl and unsafePushTables accept rowLevelSecurity \"off\" or \"on\" (default \"off\", output unchanged). With \"on\", every table that has a tenant_id column gets ENABLE and FORCE ROW LEVEL SECURITY plus the policies kumiko_tenant_isolation and kumiko_system_tenant_read, driven by the kumiko.tenant_id and kumiko.scope settings. Tables without tenant_id are left alone."
89
+ },
90
+ {
91
+ "version": "0.390.0",
92
+ "type": "improvement",
93
+ "title": "The migration generator writes a row level security section",
94
+ "detail": "With rowLevelSecurity \"on\", generateMigration adds a Row level security section for new, changed and recreated tables and a rowLevelSecurity field to the snapshot; switching back to \"off\" emits the matching DISABLE statements with a warning. Without the option the generated SQL and snapshot are byte-identical to before."
95
+ },
96
+ {
97
+ "version": "0.390.0",
98
+ "type": "improvement",
99
+ "title": "Migration replay understands CREATE, ALTER and DROP POLICY",
100
+ "detail": "The replay behind kumiko-schema validate tracks ENABLE and FORCE ROW LEVEL SECURITY and policy definitions per table, follows table renames, and reports row-level-security-drift when the committed SQL does not produce the policies the snapshot expects (missing, extra, altered or hand-edited) or turns on row level security for a table the snapshot has no spec for. An unparsable policy statement, or a policy or row level security change inside a DO block, fails loudly."
101
+ },
102
+ {
103
+ "version": "0.390.0",
104
+ "type": "fix",
105
+ "title": "Projection and multi-stream rebuilds no longer abort on tables with row level security",
106
+ "detail": "The shadow swap used to refuse a live table with RLS flags or policies. It now reads them from the catalog under the swap lock, re-applies them to the swapped-in table and fails the rebuild transaction if the result differs. Before the first read, the rebuild checks that the table's policies let its system scope see every row, so the guards never see too few rows and the swap never drops hidden ones."
107
+ },
108
+ {
109
+ "version": "0.390.0",
110
+ "type": "fix",
111
+ "title": "Migration replay parses ALTER TABLE ONLY, IF EXISTS and public. prefixes",
112
+ "detail": "kumiko-schema validate read `ALTER TABLE ONLY \"t\"` as a change to a table named ONLY and ignored IF EXISTS and a public. prefix; the statement now applies to the named table."
113
+ },
114
+ {
115
+ "version": "0.390.0",
116
+ "type": "breaking",
117
+ "title": "createTenantDb mode system requires a reason",
118
+ "detail": "The system scope a TenantDb opens for its statements now carries that reason, so a scope leak assertion names the call site. Tenant mode takes no reason.",
119
+ "migration": "Add `reason: \"<why this access spans tenants>\"` to every createTenantDb({ mode: \"system\" }) call. The reason must be a non-empty string literal: an empty reason throws InternalError at construction, and the internal-subpath-imports guard rejects a missing, empty or non-literal reason."
120
+ },
121
+ {
122
+ "version": "0.390.0",
123
+ "type": "improvement",
124
+ "title": "Signature routes read and write secrets in a system scope",
125
+ "detail": "With row level security on, verify() and the handler of a signature route (subscription webhooks, mail connect callbacks) read the secrets of a tenant named by the signed request before any tenant scope exists, and failed. deps.secrets now opens the system scope for each secret access only, so plugin code that parses the unauthenticated body stays unscoped."
126
+ },
127
+ {
128
+ "version": "0.390.0",
129
+ "type": "breaking",
130
+ "title": "RLS boot check tells known tables from orphaned ones",
131
+ "detail": "With rowLevelSecurity on, the boot check lists tenant tables without row-level security in two groups. Tables the app schema knows point to kumiko schema generate. Tables no feature declares anymore, including retired framework tables, are named as orphaned and point to dropping them by migration. The check itself stays strict.",
132
+ "migration": "assertRowLevelSecurityBootState takes the known tables as a required third argument: pass knownTablesOf(features), both exported from the db subpath."
133
+ },
134
+ {
135
+ "version": "0.390.0",
136
+ "type": "fix",
137
+ "title": "schema apply heals row-level security on existing framework tables",
138
+ "detail": "Existing databases got no policies on kumiko_events, kumiko_archived_streams and kumiko_snapshots, so boot failed while schema validate stayed green."
139
+ },
140
+ {
141
+ "version": "0.390.0",
142
+ "type": "improvement",
143
+ "title": "Connections set the row level security scope in every transaction",
144
+ "detail": "createDbConnection takes rowLevelSecurity \"off\" or \"on\" (default \"off\", the connection is unchanged). With \"on\", every statement and transaction sets kumiko.tenant_id and kumiko.scope transaction-locally from the ambient scope. TenantDb sets its tenant, and the system scope for system-mode TenantDbs, global tables and a granted unsafeRaw. Dispatch sets the user's tenant per command, or the system scope for a system-scoped handler. Event store reads and writes use the stream's tenant. Jobs, the event dispatcher, member resolution, migrations, boot seeds, retention, reindex, blind-index cleanup, the PII backfill, projection apply, auth providers and the tenant lifecycle check run in system scope. A statement without a scope sees no tenant rows. The functions that set a scope (runInRowLevelSecurityScope, runInSystemRowLevelSecurityScope, tenantRowLevelSecurityScope, systemScopedRunner) are not part of the public db subpath; framework packages import them from @cosmicdrift/kumiko-framework/internal/row-level-security, which no guard closes to apps yet. App code reaches the system scope through a system-scoped handler, a job or a granted unsafeRaw."
145
+ },
146
+ {
147
+ "version": "0.390.0",
148
+ "type": "improvement",
149
+ "title": "One rowLevelSecurity value in kumiko.config.ts for schema tooling and runners",
150
+ "detail": "AppConfig.rowLevelSecurity (\"off\" by default) is exported by the managed kumiko/schema.ts as ROW_LEVEL_SECURITY. kumiko-schema generate and validate render and check the policies from it, and apply opens its connection in that mode; the CLI has no flag of its own. The API, worker and all-in-one entrypoints take the same option and refuse a context whose connection runs in another mode. unsafePushTables with \"on\" reads the catalog first and runs no lock and no DDL for a table that already has ENABLE, FORCE and both kumiko policies."
151
+ },
152
+ {
153
+ "version": "0.390.0",
154
+ "type": "fix",
155
+ "title": "Projection rebuilds run in system scope under row level security",
156
+ "detail": "The rebuild transaction no longer turns row_security off, so a rebuild works as a NOSUPERUSER NOBYPASSRLS table owner under FORCE. Before the first guard read it locks the live table in SHARE UPDATE EXCLUSIVE mode, which blocks policy DDL and a second rebuild of the same table, and reads the catalog. When row level security is enabled, kumiko_tenant_isolation must exist as a PERMISSIVE policy for ALL commands and PUBLIC and no RESTRICTIVE policy may exist; otherwise the rebuild fails with the table and its policies and leaves the live table untouched. Other permissive policies carry over to the swapped-in table. Multi-stream rebuilds follow the same rule."
157
+ },
158
+ {
159
+ "version": "0.390.0",
160
+ "type": "breaking",
161
+ "title": "rowLevelSecurity defaults to \"on\"",
162
+ "detail": "Postgres row level security is on by default, system scopes carry a mandatory reason, and the event write path keeps the caller's tenant scope.",
163
+ "migration": "In the app repo, once with the bump: run `kumiko sync-managed --write` (the managed kumiko/schema.ts now reads `export const ROW_LEVEL_SECURITY = appConfig.rowLevelSecurity;`), then `kumiko schema generate` and commit the migration. It contains ENABLE and FORCE ROW LEVEL SECURITY plus the policies `kumiko_tenant_isolation` and `kumiko_system_tenant_read` for every tenant table. The schema apply (the migrate init container in production) creates them; there is no manual database step. Without the migration, boot at \"on\" refuses to start and names the unprotected tables.\nThe app's database role must not skip policies; boot refuses it otherwise. Check it as that role with `SELECT rolsuper, rolbypassrls FROM pg_roles WHERE rolname = current_user` (both must be false). Callers of createDbConnection without a mode now get \"on\"; tools that touch no tenant rows (schema baseline/status, the KMS key store) pass \"off\" explicitly, and the operator commands backfill-pii, waitlist-migrate, project and consumer run on an enforcing connection in system scope, so they work against both modes.\nWay back: set `rowLevelSecurity: \"off\"` in kumiko.config.ts and run `kumiko schema generate`; the generated migration contains DISABLE ROW LEVEL SECURITY and drops the policies. At \"off\" runProdApp and runWorkerApp log a boot warning."
164
+ },
165
+ {
166
+ "version": "0.390.0",
167
+ "type": "breaking",
168
+ "title": "Boot hooks with a db dependency get a system-scoped db at rowLevelSecurity \"on\"",
169
+ "migration": "No action unless a hook relied on the unscoped pool. The anonymousAccess factory, enrichAnonymousAccess, the runProdApp `wire` hook and runWorkerApp `wireComponents` now receive a system-scoped db, the same in prod, dev and the test stack, so tenant resolution and boot reads see rows across tenants. Anything the anonymousAccess factory builds keeps that db at request time and therefore reads across tenants for anonymous callers: filter by the resolved tenant yourself. In prod, extraContext factories keep the ambient request scope; the test stack and dev still hand them a system-scoped db, so a service that needs cross-tenant reads at request time must scope itself."
170
+ },
171
+ {
172
+ "version": "0.390.0",
173
+ "type": "breaking",
174
+ "title": "runInSystemRowLevelSecurityScope and systemScopedRunner take a reason",
175
+ "migration": "Call runInSystemRowLevelSecurityScope(\"<why this access spans tenants>\", fn) and systemScopedRunner(runner, \"<reason>\"). An empty or whitespace reason throws InternalError; the scope leak assertion names the reason."
176
+ },
177
+ {
178
+ "version": "0.390.0",
179
+ "type": "breaking",
180
+ "title": "A projection write under a tenant scope can no longer land in another tenant",
181
+ "detail": "applyEntityEvent keeps an ambient tenant scope instead of wrapping every write in a system scope. Writes for other tenants go through ctx.systemDb.acknowledgeCrossTenant in an r.systemScope() feature. Replays, rebuilds and global entities still write system scoped.",
182
+ "migration": "A command that writes an entity row for another tenant through ctx.db now fails with SQLSTATE 42501; move that write to ctx.systemDb.acknowledgeCrossTenant in an r.systemScope() feature."
183
+ },
184
+ {
185
+ "version": "0.390.0",
186
+ "type": "fix",
187
+ "title": "composeFeatures no longer warns about its own bundled copies",
188
+ "detail": "Composing the output of a first composeFeatures pass again drops the earlier bundled instances silently; only copies the app supplied itself still warn."
189
+ },
190
+ {
191
+ "version": "0.390.0",
192
+ "type": "improvement",
193
+ "title": "Scoped pool statements pipeline their transaction",
194
+ "detail": "A pool statement under a row level security scope sends BEGIN, the transaction-local scope, the statement and COMMIT pipelined on one reserved connection instead of waiting for each, which cuts its roundtrips roughly in half. The connection returns to the pool only after COMMIT settled."
195
+ },
196
+ {
197
+ "version": "0.390.0",
198
+ "type": "fix",
199
+ "title": "Schema generator emits primary-key changes",
200
+ "detail": "A changed primary key (single to composite, reordered columns, renamed constraint) previously produced no migration. The generator now emits DROP CONSTRAINT plus ADD CONSTRAINT with a WARN comment, and managed projections are recreated and replayed."
201
+ },
202
+ {
203
+ "version": "0.390.0",
204
+ "type": "improvement",
205
+ "title": "Tests seed and reset event-sourced tables through the event store",
206
+ "detail": "Seeds of user, membership, tenant and other entity rows use seedRowViaEventStore instead of seedRow, so their created events exist. Setup and teardown hooks in the integration tests clear event-sourced tables through resetTestTables instead of raw DELETE statements, and clear the events table in the same call, so a test no longer starts with events whose projection rows are gone. Nothing changes for apps; the packages are only republished."
207
+ },
208
+ {
209
+ "version": "0.389.0",
210
+ "type": "breaking",
211
+ "title": "Bun.SQL replaces postgres-js as the only Postgres driver",
212
+ "detail": "createDbConnection opens a Bun.SQL pool and needs Bun 1.4.4 or newer, the first release that drops a cached statement plan after DDL on the same connection. The handle gains listenClient for LISTEN/NOTIFY. Server errors carry the code ERR_POSTGRES_SERVER_ERROR with the SQLSTATE in errno and the constraint name in constraint; connection failures carry ERR_POSTGRES_CONNECTION_CLOSED, ERR_POSTGRES_CONNECTION_REFUSED, ERR_POSTGRES_CONNECTION_TIMEOUT or ERR_POSTGRES_CONNECTION_FAILED. extractPgError, isUniqueViolation, isTableAlreadyExists, constraintOf and the newly exported isUndefinedTable read that shape. The onNotice option is removed, because Bun.SQL has no notice hook and drops server notices. The ssl option takes Bun's tls value (a boolean, \"disable\", \"prefer\", \"require\", \"verify-ca\", \"verify-full\" or a TLS options object); ssl true and a TLS object without rejectUnauthorized still verify the server certificate, as they did with postgres-js. DB_PROVIDER is refused at boot for every non-empty value, \"postgres\" included.",
213
+ "migration": "Read SQLSTATE and constraint only through extractPgError or the is* helpers from @cosmicdrift/kumiko-framework/db; a direct err.code === \"23505\" check or an err.constraint_name read no longer matches. Replace checks for CONNECTION_CLOSED, CONNECTION_ENDED, CONNECTION_DESTROYED or CONNECT_TIMEOUT with the ERR_POSTGRES_CONNECTION_* codes. Drop onNotice from createDbConnection calls. Remove DB_PROVIDER from every environment. Run on Bun 1.4.4 or newer in engines, CI and images. Code that imports postgres itself must declare its own dependency or move to Bun.SQL, since the framework no longer installs it. Manual migration, there is no codemod."
214
+ },
215
+ {
216
+ "version": "0.389.0",
217
+ "type": "improvement",
218
+ "title": "schema status and baseline use one connection, bun-types is a peer dependency",
219
+ "detail": "kumiko schema status and baseline open a pool of one connection instead of the default size, because Bun.SQL dials every pool connection on the first query. bun-types is now a peer dependency (^1.4.4) of framework, types, server-runtime and dev-server instead of a regular dependency, so install it next to the framework."
220
+ },
221
+ {
222
+ "version": "0.389.0",
223
+ "type": "improvement",
224
+ "title": "validateBundledListsOptions and the BundledListsOptions type",
225
+ "detail": "BundledListsOptions is exported from the types package and the engine barrel. validateBundledListsOptions rejects unknown keys, grouping, totals and pinFirstColumn without table.pinning with a message that names the key, and checks the remaining keys like a screen's own table block."
226
+ },
227
+ {
228
+ "version": "0.389.0",
229
+ "type": "improvement",
230
+ "title": "r.adoptsBundledLists() marks features that take the bundledLists block",
231
+ "detail": "The registrar method r.adoptsBundledLists() marks a feature whose list screens take the app-wide bundledLists block; the flag appears as FeatureDefinition.adoptsBundledLists and in feature-manifest.json, and the feature-ast parser knows the call as an opaque singleton pattern."
232
+ },
233
+ {
234
+ "version": "0.389.0",
235
+ "type": "improvement",
236
+ "title": "table block on entityList, projectionList and relatedList",
237
+ "detail": "The new optional table block (rememberState, resetAll, columnPicker, density with default and userChoice) is validated at boot; unknown keys, hidden columns without columnPicker and invalid density values are rejected. Columns accept hidden: true. Remembered state lives in sessionStorage per tenant and user and is cleared on logout or identity change."
238
+ },
239
+ {
240
+ "version": "0.389.0",
241
+ "type": "improvement",
242
+ "title": "table.pinning, table.resizing and table.keyboardNavigation, column pinned, width and minWidth",
243
+ "detail": "The boot validator rejects pinned without table.pinning, a pinned value other than left or right, width or minWidth without table.resizing, values that are not finite numbers above 0, and a minWidth above the width."
244
+ },
245
+ {
246
+ "version": "0.389.0",
247
+ "type": "breaking",
248
+ "title": "Money list aggregates answer one value per currency",
249
+ "detail": "A sum, avg, min or max measure over a money field in a list aggregate now answers [{ currency, value }] with value in minor units, one entry per currency in the matching rows, and never adds amounts of different currencies. Before, it answered one plain number over all currencies.",
250
+ "migration": "code reading measures of a money field from a list aggregate answer (executor.aggregate, answerListAggregate or the list query with aggregate) reads an array of { currency, value } instead of a number; take the entry of the wanted currency, value stays in minor units"
251
+ },
252
+ {
253
+ "version": "0.389.0",
254
+ "type": "improvement",
255
+ "title": "table.grouping, table.totals and range facets validated at boot",
256
+ "detail": "The table block takes grouping ({ field, label?, labels?, collapsedWhen?, userChoice?, fields? }) and totals ([{ field, kind }]). The boot validator checks the fields against the entity or the columns, rejects measures a field type cannot carry and requires the list query to accept aggregate (entityListSchema does; hand-written queries answer it with answerListAggregate). facets.<field>.display \"range\" needs a filterable number, decimal, money or bigInt field."
257
+ },
258
+ {
259
+ "version": "0.389.0",
260
+ "type": "improvement",
261
+ "title": "bulkActions on entityList, projectionList and relatedList",
262
+ "detail": "Each entry is { id, rowAction, confirm? } and points at a writeHandler entry of the same screen's rowActions. The boot validator rejects unknown keys, a non-kebab or duplicate id, an unknown rowAction and a rowAction of kind clientAction, navigate or drawer."
263
+ },
264
+ {
265
+ "version": "0.389.0",
266
+ "type": "improvement",
267
+ "title": "XLSX export for entityList and projectionList via table.export",
268
+ "detail": "The new table.export block ({ xlsx: true, maxRows? }) is validated at boot and is only accepted on entityList and projectionList. POST /api/export/xlsx runs the list query again with the caller's session, pages through the whole filtered list and answers 413 above maxRows (default 10000, hard cap 100000). Encrypted, sensitive, write-only and unreadable fields and virtual columns are left out of the sheet. Reference columns export the label of the target (joined with commas for multiple references), not the id. Timestamp cells use the browser time zone sent with the request, else the profile zone, else UTC. Personal access tokens are rejected. A projectionList query must honor offset or return nextCursor. Adds the write-excel-file dependency."
269
+ },
270
+ {
271
+ "version": "0.389.0",
272
+ "type": "fix",
273
+ "title": "Executor writes on a pool runner are atomic",
274
+ "detail": "executor.create/update/delete/forget/restore on a TenantDb that is not inside a transaction used to run append, projection and custom projections as separate autocommit statements, so a failing projection left an event without its row. They now run in their own transaction, and a returned failure such as version_conflict rolls it back too. Calls inside a handler transaction keep their savepoint behavior. Callers that wrapped executor writes in runInOwnTransaction as a workaround can drop it."
275
+ },
276
+ {
277
+ "version": "0.389.0",
278
+ "type": "breaking",
279
+ "title": "FeatureRegistrar types moved to @cosmicdrift/kumiko-types/feature-registrar",
280
+ "migration": "Import FeatureRegistrar, HookDefinition, EntityObjectDefinition and RequiresApi from @cosmicdrift/kumiko-types/feature-registrar or from the engine barrel of @cosmicdrift/kumiko-framework; @cosmicdrift/kumiko-types/feature no longer exports them."
281
+ },
282
+ {
283
+ "version": "0.389.0",
284
+ "type": "fix",
285
+ "title": "maxPerTenant counts active and waiting jobs in one snapshot",
286
+ "detail": "The guard read the active and the waiting list with separate Redis calls, so a job that moved from waiting to active between them was missing from both and a dispatch over the cap got through. It now reads both lists with one getJobs snapshot per queue. The integration tests hold the cap jobs on a release gate instead of sleeping."
287
+ },
288
+ {
289
+ "version": "0.389.0",
290
+ "type": "breaking",
291
+ "title": "relatedList groupBy replaced by table.grouping",
292
+ "detail": "The groupBy key on a relatedList section and an entityList expandableRow is removed together with the RelatedListGroupBy type. Both group through table.grouping ({ field, label?, labels?, collapsedWhen? }): groups, counts and header measures come from one aggregate query over all matching rows instead of the loaded page, and each open group loads its own rows. An expandableRow takes only table.grouping with a fixed field; userChoice, fields and every other table option stay boot errors there. The boot validator reports a leftover groupBy with a pointer to table.grouping. ExpandableRowGrouping is the new type of an expandableRow's grouping.",
293
+ "migration": "move groupBy { field, collapsedWhen, label, labels } to table: { grouping: { field, collapsedWhen, label, labels } }; the bound query must accept aggregate (entityListSchema does, a hand-written query answers it with answerListAggregate). dateField and the {lastDate} placeholder have no replacement on an expandableRow, where totals stay off; on a relatedList a max measure in table.totals shows the latest date. Every group now gets a header: a group without label or labels entry shows its value instead of rendering headerless."
294
+ },
295
+ {
296
+ "version": "0.389.0",
297
+ "type": "improvement",
298
+ "title": "ctx.loadAggregate can read a single event by version",
299
+ "detail": "The new atVersion option returns the event at that version of the stream (or nothing), with upcasting and the tenant filter. It cannot be combined with asOf. Workflow resume uses it for event references."
300
+ },
301
+ {
302
+ "version": "0.389.0",
303
+ "type": "fix",
304
+ "title": "Access invalidation survives a Redis outage",
305
+ "detail": "The consumer that pushes session, token and membership revocations to open streams does not count failed publishes towards the attempt limit and backs off between them, instead of dying after 10 failed deliveries and silently dropping later revocations. Other failures keep the limit. New EventConsumerErrorPolicy.isTransientError."
306
+ },
307
+ {
308
+ "version": "0.389.0",
309
+ "type": "fix",
310
+ "title": "file upload rechecks the record lock when inserting the row",
311
+ "detail": "POST /files with an entityId reads the stored row again through the inserting transaction and refuses with 409 record_locked when lockedWhen holds. The window between that read and the commit stays open, like for any other write that checks the lock before its own commit."
312
+ },
313
+ {
314
+ "version": "0.389.0",
315
+ "type": "fix",
316
+ "title": "Meilisearch default upgrade cannot tell a narrowed configure() from an older default",
317
+ "detail": "A tenant that called configure() with a strict subset of the default attributes gets the full default back after the next process restart, because Meilisearch stores no marker for an explicit configure(). Configure the full attribute set, or a set that contains an attribute outside the default, to keep it."
318
+ },
319
+ {
320
+ "version": "0.389.0",
321
+ "type": "fix",
322
+ "title": "Cross-tenant-read crons audit once per day, not once per foreign row",
323
+ "detail": "The process dedup key of a declared system cron hatch includes the target only for global-write (a table). Row targets of cross-tenant-read no longer grow the in-memory map or write one audit event per row."
324
+ },
325
+ {
326
+ "version": "0.389.0",
327
+ "type": "fix",
328
+ "title": "Failed job-runner start waits for the timed-out boot gate",
329
+ "detail": "start() now waits a bounded time for an abandoned boot gate before throwing, instead of leaving that to stop(). The scheduler-seen timer is only started after every step that can fail, so no timer outlives a failed start."
330
+ },
331
+ {
332
+ "version": "0.389.0",
333
+ "type": "fix",
334
+ "title": "disabled feature no longer removes another feature's workspace with the same id",
335
+ "detail": "buildAppSchema records which feature owns each workspace and the feature strip removes only the workspaces of the disabled features. Two features that use the same short workspace id keep their own entries."
336
+ },
337
+ {
338
+ "version": "0.389.0",
339
+ "type": "fix",
340
+ "title": "upload ledger uses the injected clock",
341
+ "detail": "createFileUploadLedger and withUploadLedger take an optional now function, and the file provider resolver wires AppContext.clock into it. Without a clock the system time is used as before."
342
+ },
343
+ {
344
+ "version": "0.389.0",
345
+ "type": "fix",
346
+ "title": "anonymous save leaves foreign pending uploads unbound",
347
+ "detail": "Integration test through the real write route with anonymous access, covering the save pipeline path of the pending-upload ownership check."
348
+ },
349
+ {
350
+ "version": "0.389.0",
351
+ "type": "breaking",
352
+ "title": "Unused ProviderPluginContext helpers removed",
353
+ "detail": "ProviderPluginContext, providerPluginContextFromHandler and providerPluginContextFromJob are gone. No plugin type or resolver used them, and the type exposed db handles without an audit user. Provider contexts stay the narrow FileProviderContext, MailTransportContext and InboundMailContext.",
354
+ "migration": "no known callers; use FileProviderContext, MailTransportContext or InboundMailContext"
355
+ },
356
+ {
357
+ "version": "0.389.0",
358
+ "type": "breaking",
359
+ "title": "provider selector option labels are unique per owner",
360
+ "detail": "The selector field id of a provider form is qualified with its owner feature, so the translation keys of its option labels change.",
361
+ "migration": "move app translation overrides from config:entity:__config-edit__:field:provider:option:<value> to the owner-qualified field id, field:mail-foundation-provider:option:<value> or field:file-foundation-provider:option:<value>"
362
+ },
363
+ {
364
+ "version": "0.389.0",
365
+ "type": "fix",
366
+ "title": "live signals hide row ids from row-filtered roles",
367
+ "detail": "createSseRoute takes an optional entityRowReadMaps option, built from entity access.read by the server routes. A signed-in connection receives id and version only if the entity has no read ownership map or one of its roles is mapped to all; otherwise the signal carries just the entity and event type so the client refetches."
368
+ },
369
+ {
370
+ "version": "0.389.0",
371
+ "type": "fix",
372
+ "title": "write handlers that spread the executor result keep projections and postSave hooks",
373
+ "detail": "The event is stripped from lifecycle results when the dispatcher masks the response, no longer made non-enumerable on the result, so copying the result does not lose it. Responses still carry no event."
374
+ },
375
+ {
376
+ "version": "0.389.0",
377
+ "type": "improvement",
378
+ "title": "event-free write results proven for non-HTTP entry points",
379
+ "detail": "Integration tests assert that dispatcher.write, dispatcher.batch and the agent tool dispatch return no event. No runtime change: all of them already pass through the dispatcher masking."
380
+ },
381
+ {
382
+ "version": "0.389.0",
383
+ "type": "fix",
384
+ "title": "reference-data seed adopts rows that have no event stream",
385
+ "detail": "Rows from installs that seeded reference data by direct insert are re-created under the same id through the executor on the next boot, so updates apply and the rows survive a rebuild. No action is needed; the row id is unchanged, only its version restarts at 1."
386
+ },
387
+ {
388
+ "version": "0.389.0",
389
+ "type": "fix",
390
+ "title": "client-errors route keeps an in-memory floor limit",
391
+ "detail": "The in-memory per-IP limiter now runs in front of the Redis-backed limiter instead of only when no resolver is wired, so a failing resolver can no longer lift the limit on the public client-errors endpoint."
392
+ },
393
+ {
394
+ "version": "0.389.0",
395
+ "type": "fix",
396
+ "title": "reindex job batches are no longer cut off by the server statement timeout",
397
+ "detail": "reindexEntity reads each batch in its own transaction with statement_timeout lifted for that transaction, on the caller's own runner, so the job path through ctx.systemDb.unsafeRaw() keeps its gates."
398
+ },
399
+ {
400
+ "version": "0.389.0",
401
+ "type": "fix",
402
+ "title": "files meta batch route is rate limited by id count",
403
+ "detail": "createFileRoutes takes an optional metaBatchRateLimitResolver, wired by the server from the rate-limit resolver or Redis. A user over 1000 requested ids per minute gets 429 rate_limited; a failing limiter fails open and is reported like the other limiters."
404
+ },
405
+ {
406
+ "version": "0.389.0",
407
+ "type": "fix",
408
+ "title": "kumiko-upgrade explains that --apply writes the CHANGELOG",
409
+ "detail": "The preview run never wrote the upgrade CHANGELOG or the marker, and consumers running it without --apply got no entry and no explanation. It now prints a hint; the exit code is unchanged."
410
+ },
411
+ {
412
+ "version": "0.389.0",
413
+ "type": "fix",
414
+ "title": "Codemod imports no longer land inside header comments",
415
+ "detail": "ensureNamedImport appends the new import after the last existing import, so a file with a header comment block keeps the comment intact."
416
+ },
417
+ {
418
+ "version": "0.389.0",
419
+ "type": "fix",
420
+ "title": "Database now is rounded to milliseconds",
421
+ "detail": "The Postgres clock read behind readDatabaseNow is cast to timestamptz(3), the precision of events.created_at, so a comparison with a stored event time is exact."
422
+ },
423
+ {
424
+ "version": "0.389.0",
425
+ "type": "improvement",
426
+ "title": "E2E seeders and signature routes can write with explicit roles",
427
+ "detail": "dispatchWriteAs on signature route deps and writeAs on the E2E seeder context run a write as the tenant's system user with the \"system\" role plus the given roles, without SystemAdmin. write() keeps running as SystemAdmin."
428
+ },
429
+ {
430
+ "version": "0.389.0",
431
+ "type": "fix",
432
+ "title": "List filter on multiple references matches array contents",
433
+ "detail": "eq, ne and in on a multi-reference field now check jsonb containment instead of scalar equality, and screen filters on such fields allow the equality operators. Consumers no longer need a full scan."
434
+ },
435
+ {
436
+ "version": "0.389.0",
437
+ "type": "fix",
438
+ "title": "kumiko-upgrade --resolve updates CHANGELOG.md",
439
+ "detail": "The Manual migrations lines of every CHANGELOG.md section change from [open] to the chosen resolution for the resolved ids; other entries and files without a CHANGELOG.md are left alone."
440
+ },
441
+ {
442
+ "version": "0.389.0",
443
+ "type": "improvement",
444
+ "title": "ctx.scheduleAfterRollback for outside-transaction compensation",
445
+ "detail": "ctx.scheduleAfterRollback(fn) runs fn when the handler transaction does not commit, or when the enclosing savepoint of a nested ctx.write rolls back (after the outer transaction ends). It never runs on commit, errors are logged and do not change the write result, and it is absent outside a transaction scope (perCommand, post-commit, beforeTransaction, member resolution). A failed COMMIT also triggers it, so callbacks must be idempotent and outcome-safe, for example releasing a reservation row that may already be gone."
446
+ },
447
+ {
448
+ "version": "0.389.0",
449
+ "type": "improvement",
450
+ "title": "Tenant-safe upsert on ctx.db",
451
+ "detail": "ctx.db.upsert(table, values, { conflictTarget, update? }) requires tenantId in conflictTarget and the target to match a declared unique index or primary key. The update only touches the row of the inserted tenant, update may not set tenantId, and the default update leaves conflict, primary-key and tenant columns alone. Event-fed tables are rejected. Replaces unsafeRaw plus upsertOnConflict for tenant-scoped upserts."
452
+ },
2
453
  {
3
454
  "version": "0.388.0",
4
455
  "type": "fix",
@@ -1,8 +0,0 @@
1
- import type { KmsContext, LocalKeyKmsAdapter, SubjectDek, SubjectId } from "./kms-adapter.ts";
2
- export interface RequestKmsCache {
3
- getKey(subject: SubjectId, ctx: KmsContext): Promise<SubjectDek>;
4
- /** Drops one subject's cached DEK — called when its key is shredded mid-request. */
5
- invalidate(subject: SubjectId): void;
6
- clear(): void;
7
- }
8
- export declare function createRequestKmsCache(adapter: LocalKeyKmsAdapter): RequestKmsCache;
@@ -1,21 +0,0 @@
1
- import { subjectIdToKey } from "./kms-adapter.js";
2
- export function createRequestKmsCache(adapter) {
3
- const cache = new Map();
4
- return {
5
- async getKey(subject, ctx) {
6
- const subjectKey = subjectIdToKey(subject);
7
- const hit = cache.get(subjectKey);
8
- if (hit !== undefined)
9
- return hit;
10
- const dek = await adapter.getKey(subject, ctx);
11
- cache.set(subjectKey, dek);
12
- return dek;
13
- },
14
- invalidate(subject) {
15
- cache.delete(subjectIdToKey(subject));
16
- },
17
- clear() {
18
- cache.clear();
19
- },
20
- };
21
- }
@@ -1,2 +0,0 @@
1
- export type { CodemodOptions, CodemodReport, CodemodResult, FileAnalysis, ParsedHandlerInfo, } from "./pipeline-codemod.ts";
2
- export { analyzeFile, analyzeHandlerArrow, convertFile, generatePerformBlock, runCodemod, scanForCandidates, } from "./pipeline-codemod.ts";
@@ -1 +0,0 @@
1
- export { analyzeFile, analyzeHandlerArrow, convertFile, generatePerformBlock, runCodemod, scanForCandidates, } from "./pipeline-codemod.js";