@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
@@ -0,0 +1,87 @@
1
+ import * as z from "zod";
2
+ import type { FeatureDefinition } from "../engine/types/feature.ts";
3
+ export type KumikoEnvMeta = {
4
+ readonly pulumi?: {
5
+ /** Override the auto-derived camelCase Pulumi-config-key name. Apps
6
+ * setting `pulumiPrefix: "studio"` and authoring `STUDIO_ADMIN_EMAIL`
7
+ * would otherwise get `studioStudioAdminEmail` — set
8
+ * `.meta({ kumiko: { pulumi: { name: "adminEmail" } } })` to drop the
9
+ * duplicated prefix. */
10
+ readonly name?: string;
11
+ /** Shell expression that generates a value, e.g. `openssl rand -base64 32`.
12
+ * Without this, dry-run-pulumi emits `<set-me>` as the placeholder. */
13
+ readonly generator?: string;
14
+ /** Force the `--secret` flag in `pulumi config set`. Default false. */
15
+ readonly secret?: boolean;
16
+ };
17
+ /** The value may be delivered as a Scaleway Key Manager ciphertext in
18
+ * `<NAME>_CIPHERTEXT`. `runProdApp` decrypts it at boot when `<NAME>` itself
19
+ * is unset; a set plaintext always wins. A flag, not an object: every slot
20
+ * uses the same `_CIPHERTEXT` twin and one shared key (`PLATFORM_KEK_KMS_*`). */
21
+ readonly kms?: true;
22
+ };
23
+ export type EnvFieldClass = "required" | "optional" | "withDefault";
24
+ export declare function getDefaultValue(field: z.ZodType): unknown;
25
+ export declare function getFieldDescription(field: z.ZodType): string | undefined;
26
+ export type EmptyShape = Record<never, never>;
27
+ export type DeclaredEnvShape<TFeature> = TFeature extends {
28
+ readonly envSchema: z.ZodObject<infer TShape extends z.ZodRawShape>;
29
+ } ? string extends keyof TShape ? EmptyShape : TShape : EmptyShape;
30
+ export type UnionToIntersection<TUnion> = (TUnion extends unknown ? (value: TUnion) => void : never) extends (value: infer TIntersection) => void ? TIntersection : never;
31
+ export type OptionalShape<TShape extends z.ZodRawShape> = {
32
+ [Key in keyof TShape]: z.ZodOptional<TShape[Key]>;
33
+ };
34
+ export type FeaturesEnvShape<TFeatures extends readonly FeatureDefinition[]> = UnionToIntersection<DeclaredEnvShape<TFeatures[number]>>;
35
+ export type FlattenShape<TShape> = {
36
+ [Key in keyof TShape]: TShape[Key];
37
+ } & {};
38
+ export type KnownShape<TShape extends z.ZodRawShape> = string extends keyof TShape ? EmptyShape : TShape;
39
+ /** The merged shape `composeEnvSchema` returns. With `optionalFeatures`
40
+ * every feature field is typed optional: the type cannot tell which feature
41
+ * a name refers to, and over-reporting `undefined` is the safe side. */
42
+ export type ComposedEnvShape<TFeatures extends readonly FeatureDefinition[], TCore extends z.ZodRawShape, TExtend extends z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined> = Extract<FlattenShape<KnownShape<TCore> & (TOptionalFeatures extends readonly string[] ? OptionalShape<FeaturesEnvShape<TFeatures> & z.ZodRawShape> : FeaturesEnvShape<TFeatures>) & KnownShape<TExtend>>, z.ZodRawShape>;
43
+ export type ComposeEnvSchemaOptions<TFeatures extends readonly FeatureDefinition[] = readonly FeatureDefinition[], TCore extends z.ZodRawShape = z.ZodRawShape, TExtend extends z.ZodRawShape = z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined = readonly string[] | undefined> = {
44
+ /** All features whose envSchemas should be merged. Bundled features type
45
+ * their fragment, so passing the list inline types the merged schema. */
46
+ readonly features: TFeatures;
47
+ /** App-specific env-vars (e.g. `STUDIO_ADMIN_EMAIL`). Keys here are
48
+ * tagged as source "app" in the resulting sources map. */
49
+ readonly extend?: z.ZodObject<TExtend>;
50
+ /** Feature-names whose env-vars should be auto-`.optional()`-wrapped.
51
+ * Lets an app opt out of e.g. `channel-email-smtp`'s vars without
52
+ * manually `.partial()`-ing each shape at the call-site. */
53
+ readonly optionalFeatures?: TOptionalFeatures;
54
+ /** Framework-core env-vars (PORT, DATABASE_URL, REDIS_URL, …) from
55
+ * `@cosmicdrift/kumiko-dev-server`. Keys here are tagged as source
56
+ * "framework-core" in error output. Conflict-detection runs across
57
+ * core/features/extend as one merged pool — same key declared in two
58
+ * layers throws KumikoBootError at compose-time. */
59
+ readonly core?: z.ZodObject<TCore>;
60
+ };
61
+ export type EnvErrorKind = "missing" | "invalid";
62
+ export type EnvError = {
63
+ readonly name: string;
64
+ readonly kind: EnvErrorKind;
65
+ readonly message: string;
66
+ /** Declaring source-name from `composeEnvSchema`'s sources map:
67
+ * feature-name, "app" from `extend`, or "framework-core" from `core`.
68
+ * Populated when parseEnv received `options.sources`. Surfaced by
69
+ * `KumikoBootError.format()` so operators see WHICH source wants the
70
+ * missing var, not just the var name. */
71
+ readonly source?: string;
72
+ /** "Set via: pulumi config set ..." line. Computed when pulumiPrefix is
73
+ * passed to parseEnv. */
74
+ readonly suggestion?: string;
75
+ };
76
+ export type ParseEnvOptions = {
77
+ /** From composeEnvSchema's return — enables per-var feature-source
78
+ * attribution in suggestions. */
79
+ readonly sources?: Readonly<Record<string, string>>;
80
+ /** When set, error suggestions include `pulumi config set <prefix>...`. */
81
+ readonly pulumiPrefix?: string;
82
+ };
83
+ export declare function ucfirst(s: string): string;
84
+ export type EnvFieldStatus = "set" | "unset" | "missing" | "invalid";
85
+ export declare function camelCase(snakeShout: string): string;
86
+ export declare function pulumiConfigKey(envName: string, field: z.ZodType | undefined, prefix: string | undefined): string;
87
+ export declare function buildPulumiSuggestion(envName: string, field: z.ZodType, prefix: string | undefined): string | undefined;
@@ -0,0 +1,53 @@
1
+ import * as z from "zod";
2
+ import { zodDef, zodDescription } from "./_zod-introspect.js";
3
+ import { readKumikoMeta } from "./index.js";
4
+ export function getDefaultValue(field) {
5
+ let current = field;
6
+ for (let i = 0; i < 8; i++) {
7
+ if (current instanceof z.ZodDefault) {
8
+ // Zod v4: defaultValue is the raw value (v3 was a factory function).
9
+ // Support both shapes for forward/backward safety.
10
+ const raw = zodDef(current)?.defaultValue;
11
+ // @cast-boundary schema-walk — Zod v3 stored a thunk, v4 a raw value
12
+ return typeof raw === "function" ? raw() : raw;
13
+ }
14
+ const inner = zodDef(current);
15
+ if (inner?.innerType) {
16
+ current = inner.innerType;
17
+ continue;
18
+ }
19
+ break;
20
+ }
21
+ return undefined;
22
+ }
23
+ // @wrapper-known semantic-alias
24
+ export function getFieldDescription(field) {
25
+ return zodDescription(field);
26
+ }
27
+ // --- Pulumi-suggestion ---
28
+ export function ucfirst(s) {
29
+ return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1);
30
+ }
31
+ export function camelCase(snakeShout) {
32
+ const parts = snakeShout.toLowerCase().split("_").filter(Boolean);
33
+ if (parts.length === 0)
34
+ return snakeShout.toLowerCase();
35
+ return parts[0] + parts.slice(1).map(ucfirst).join("");
36
+ }
37
+ export function pulumiConfigKey(envName, field, prefix) {
38
+ const meta = field ? readKumikoMeta(field) : {};
39
+ if (meta.pulumi?.name) {
40
+ return prefix ? prefix + ucfirst(meta.pulumi.name) : meta.pulumi.name;
41
+ }
42
+ const camel = camelCase(envName);
43
+ return prefix ? prefix + ucfirst(camel) : camel;
44
+ }
45
+ export function buildPulumiSuggestion(envName, field, prefix) {
46
+ if (!prefix)
47
+ return undefined;
48
+ const meta = readKumikoMeta(field);
49
+ const key = pulumiConfigKey(envName, field, prefix);
50
+ const secretFlag = meta.pulumi?.secret ? " --secret" : "";
51
+ const value = meta.pulumi?.generator ? `"$(${meta.pulumi.generator})"` : `"<set-me>"`;
52
+ return `Set via: pulumi config set${secretFlag} ${key} ${value}`;
53
+ }
@@ -201,14 +201,14 @@ export class InternalError extends KumikoError {
201
201
  });
202
202
  }
203
203
  }
204
- // A ctx.queryAsMember read ran into its statement timeout (SQLSTATE 57014). Reuses the generic
204
+ // A ctx.dispatch.queryAsMember read ran into its statement timeout (SQLSTATE 57014). Reuses the generic
205
205
  // errors.internal i18n key: the client can do nothing but retry, and the code is for log/alert routing.
206
206
  export class MemberReadTimeoutError extends KumikoError {
207
207
  code = "member_read_timeout";
208
208
  httpStatus = 504;
209
209
  constructor(opts) {
210
210
  super({
211
- message: `ctx.queryAsMember read exceeded its ${opts.timeoutMs}ms statement timeout`,
211
+ message: `ctx.dispatch.queryAsMember read exceeded its ${opts.timeoutMs}ms statement timeout`,
212
212
  i18nKey: "errors.internal",
213
213
  ...(opts.cause && { cause: opts.cause }),
214
214
  });
@@ -1,18 +1,9 @@
1
- export type { FeatureDisabledDetails, FieldIssue, NotFoundDetails, PreconditionFailedDetails, RateLimitDetails, UnconfiguredDetails, UniqueViolationDetails, UnprocessableOpts, ValidationDetails, VersionConflictDetails, } from "./classes.ts";
2
- export { AccessDeniedError, ConflictError, FeatureDisabledError, IdempotentReplayError, InternalError, MemberReadTimeoutError, NotFoundError, PreconditionFailedError, RateLimitError, RateLimitUnavailableError, RecordLockedError, UnauthenticatedError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.ts";
1
+ export type { FieldIssue } from "./classes.ts";
2
+ export { AccessDeniedError, ConflictError, FeatureDisabledError, InternalError, NotFoundError, RateLimitError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.ts";
3
3
  export type { ErrorDocsConfig } from "./docs-url.ts";
4
- export { resolveErrorDocsUrl } from "./docs-url.ts";
5
- export type { ErrorCtorInput, ErrorOpts } from "./kumiko-error.ts";
6
4
  export { isKumikoError, KumikoError } from "./kumiko-error.ts";
7
- export { memberResolutionReadOnlyDenied } from "./member-resolution.ts";
8
- export type { AgentReason, FrameworkReason } from "./reasons.ts";
9
- export { AgentReasons, FrameworkReasons } from "./reasons.ts";
10
- export type { ErrorLogEntry, ErrorResponseBody } from "./serialize.ts";
11
- export { buildErrorLog, serializeError } from "./serialize.ts";
12
- export { isSubjectErasedConflict, subjectErasedConflict } from "./subject-erased.ts";
13
- export { toKumikoError } from "./to-kumiko-error.ts";
14
- export type { InvalidTransitionDetails } from "./transition-details.ts";
15
- export { buildInvalidTransitionDetails } from "./transition-details.ts";
5
+ export { FrameworkReasons } from "./reasons.ts";
6
+ export { subjectErasedConflict } from "./subject-erased.ts";
16
7
  export type { WriteErrorInfo, WriteFailure } from "./write-error-info.ts";
17
- export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, toWriteErrorInfo, writeFailure, } from "./write-error-info.ts";
8
+ export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, writeFailure, } from "./write-error-info.ts";
18
9
  export { validationErrorFromZod } from "./zod-bridge.ts";
@@ -1,11 +1,6 @@
1
- export { AccessDeniedError, ConflictError, FeatureDisabledError, IdempotentReplayError, InternalError, MemberReadTimeoutError, NotFoundError, PreconditionFailedError, RateLimitError, RateLimitUnavailableError, RecordLockedError, UnauthenticatedError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.js";
2
- export { resolveErrorDocsUrl } from "./docs-url.js";
1
+ export { AccessDeniedError, ConflictError, FeatureDisabledError, InternalError, NotFoundError, RateLimitError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.js";
3
2
  export { isKumikoError, KumikoError } from "./kumiko-error.js";
4
- export { memberResolutionReadOnlyDenied } from "./member-resolution.js";
5
- export { AgentReasons, FrameworkReasons } from "./reasons.js";
6
- export { buildErrorLog, serializeError } from "./serialize.js";
7
- export { isSubjectErasedConflict, subjectErasedConflict } from "./subject-erased.js";
8
- export { toKumikoError } from "./to-kumiko-error.js";
9
- export { buildInvalidTransitionDetails } from "./transition-details.js";
10
- export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, toWriteErrorInfo, writeFailure, } from "./write-error-info.js";
3
+ export { FrameworkReasons } from "./reasons.js";
4
+ export { subjectErasedConflict } from "./subject-erased.js";
5
+ export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, writeFailure, } from "./write-error-info.js";
11
6
  export { validationErrorFromZod } from "./zod-bridge.js";
@@ -3,7 +3,7 @@ import { FrameworkReasons } from "./reasons.js";
3
3
  // Lives in errors/ (not pipeline/) so db/tenant-db.ts can throw it without importing pipeline.
4
4
  export function memberResolutionReadOnlyDenied(cause) {
5
5
  return new AccessDeniedError({
6
- message: "a resolved member principal (ctx.queryAsMember) cannot write or reach raw SQL — read-only",
6
+ message: "a resolved member principal (ctx.dispatch.queryAsMember) cannot write or reach raw SQL — read-only",
7
7
  details: { reason: FrameworkReasons.memberResolutionReadOnly },
8
8
  ...(cause instanceof Error && { cause }),
9
9
  });
@@ -24,4 +24,3 @@ export declare const AgentReasons: {
24
24
  readonly iterationLimit: "agent.iteration_limit";
25
25
  readonly highRiskNoAlways: "agent.high_risk_no_always";
26
26
  };
27
- export type AgentReason = (typeof AgentReasons)[keyof typeof AgentReasons];
@@ -33,10 +33,10 @@ export const FrameworkReasons = {
33
33
  // Distinct from access-denied — clients should surface "feature X is
34
34
  // currently unavailable" not "you don't have permission".
35
35
  featureDisabled: "feature_disabled",
36
- // AccessDeniedError: a handler/hook called ctx.queryAs/ctx.writeAs with a
36
+ // AccessDeniedError: a handler/hook called ctx.dispatch.queryAs/ctx.dispatch.writeAs with a
37
37
  // SYSTEM identity without an r.systemScope() feature or a declared escapeHatch.
38
38
  systemIdentitySwitchDenied: "system_identity_switch_denied",
39
- // AccessDeniedError: a handler/hook called ctx.queryAs/ctx.writeAs with a
39
+ // AccessDeniedError: a handler/hook called ctx.dispatch.queryAs/ctx.dispatch.writeAs with a
40
40
  // non-SYSTEM identity other than its own caller (different user, tenant,
41
41
  // claims, origin or extra roles) without r.systemScope() or escapeHatch.
42
42
  identitySwitchDenied: "identity_switch_denied",
@@ -44,13 +44,13 @@ export const FrameworkReasons = {
44
44
  tenantOverrideRequiresSystemAdmin: "tenant_override_requires_system_admin",
45
45
  // AccessDeniedError: ctx.notify was called with `to: { tenant }` naming a tenant other than the caller's.
46
46
  notifyForeignTenantBroadcast: "notify_foreign_tenant_broadcast",
47
- // AccessDeniedError: a handler/hook called ctx.queryProjection(..., { unsafeAllTenants: true })
47
+ // AccessDeniedError: a handler/hook called ctx.dispatch.queryProjection(..., { unsafeAllTenants: true })
48
48
  // without an r.systemScope() feature or a declared escapeHatch.
49
49
  unsafeAllTenantsDenied: "unsafe_all_tenants_denied",
50
- // AccessDeniedError: ctx.queryAsMember's userId is not an active member of
50
+ // AccessDeniedError: ctx.dispatch.queryAsMember's userId is not an active member of
51
51
  // ctx's tenant. Deliberately generic — a caller can't probe which check failed.
52
52
  memberResolutionDenied: "member_resolution_denied",
53
- // AccessDeniedError: a query handler invoked via ctx.queryAsMember tried to
53
+ // AccessDeniedError: a query handler invoked via ctx.dispatch.queryAsMember tried to
54
54
  // write — a resolved member principal is read-only by construction.
55
55
  memberResolutionReadOnly: "member_resolution_read_only",
56
56
  // AccessDeniedError: a write under an anonymous root touched a personal-data field
@@ -58,11 +58,11 @@ export const FrameworkReasons = {
58
58
  publicIntakeRequired: "public_intake_required",
59
59
  // AccessDeniedError: the directly-dispatched entry handler performs a hard
60
60
  // delete/forget but its agent.risk resolves below "high" — delegation via
61
- // ctx.write/writeAs from a lower-risk handler does not inherit the gate.
61
+ // ctx.dispatch.write/writeAs from a lower-risk handler does not inherit the gate.
62
62
  irreversibleOperationRequiresHighRisk: "irreversible_operation_requires_high_risk",
63
63
  // AccessDeniedError: the directly-dispatched entry handler writes a field
64
64
  // flagged readAsInstruction: true but its agent.risk resolves below "high" —
65
- // delegation via ctx.write/writeAs from a lower-risk handler does not
65
+ // delegation via ctx.dispatch.write/writeAs from a lower-risk handler does not
66
66
  // inherit the gate.
67
67
  instructionFieldWriteRequiresHighRisk: "instruction_field_write_requires_high_risk",
68
68
  // ConflictError: a write touched a personal-data field of a data subject whose
@@ -14,21 +14,3 @@ export type ErrorResponseBody = {
14
14
  };
15
15
  export declare const exposesCauseDetails: () => boolean;
16
16
  export declare function serializeError(err: KumikoError, requestId?: string, errorDocs?: ErrorDocsConfig): ErrorResponseBody;
17
- export type ErrorLogEntry = {
18
- readonly name: string;
19
- readonly code: string;
20
- readonly httpStatus: number;
21
- readonly message: string;
22
- readonly i18nKey: string;
23
- readonly details?: unknown;
24
- readonly stack?: string;
25
- readonly cause?: CauseSnapshot;
26
- };
27
- export declare function buildErrorLog(err: KumikoError): ErrorLogEntry;
28
- type CauseSnapshot = {
29
- readonly name: string;
30
- readonly message: string;
31
- readonly stack?: string;
32
- readonly cause?: CauseSnapshot;
33
- };
34
- export {};
@@ -53,30 +53,3 @@ export function serializeError(err, requestId, errorDocs) {
53
53
  },
54
54
  };
55
55
  }
56
- export function buildErrorLog(err) {
57
- return {
58
- name: err.name,
59
- code: err.code,
60
- httpStatus: err.httpStatus,
61
- message: err.message,
62
- i18nKey: err.i18nKey,
63
- ...(err.details !== undefined && { details: err.details }),
64
- ...(err.stack && { stack: err.stack }),
65
- ...(err.cause !== undefined && { cause: serializeCause(err.cause) }),
66
- };
67
- }
68
- const MAX_CAUSE_DEPTH = 10;
69
- function serializeCause(cause, depth = 0) {
70
- if (depth >= MAX_CAUSE_DEPTH) {
71
- return { name: "CauseChainTruncated", message: `depth >= ${MAX_CAUSE_DEPTH}` };
72
- }
73
- if (cause instanceof Error) {
74
- return {
75
- name: cause.name,
76
- message: cause.message,
77
- ...(cause.stack && { stack: cause.stack }),
78
- ...(cause.cause !== undefined && { cause: serializeCause(cause.cause, depth + 1) }),
79
- };
80
- }
81
- return { name: "NonError", message: String(cause) };
82
- }
@@ -1,4 +1,4 @@
1
- export { type CreateSeedMigrationContextArgs, createSeedMigrationContext, } from "./context.ts";
2
- export { createEsOperationsTable, type EsOperationAppliedBy, type EsOperationType, esOperationsTable, } from "./operations-schema.ts";
3
- export { type RunPendingSeedMigrationsArgs, type RunPendingSeedMigrationsResult, runPendingSeedMigrations, } from "./runner.ts";
4
- export type { SeedMembershipRow, SeedMigration, SeedMigrationContext, SeedTemplateResourceFilter, SeedTemplateResourceRow, SeedTenantRow, SeedUserRow, } from "./types.ts";
1
+ export { createSeedMigrationContext } from "./context.ts";
2
+ export { createEsOperationsTable, esOperationsTable, } from "./operations-schema.ts";
3
+ export { runPendingSeedMigrations } from "./runner.ts";
4
+ export type { SeedMigration, SeedMigrationContext, } from "./types.ts";
@@ -7,6 +7,6 @@
7
7
  // - `SeedMigration`: default export type of a seed file
8
8
  // - `runProdApp({ seedsDir })`: the framework runs pending migrations at boot
9
9
  // - `bunx kumiko ops seed:new|status|apply` (CLI)
10
- export { createSeedMigrationContext, } from "./context.js";
10
+ export { createSeedMigrationContext } from "./context.js";
11
11
  export { createEsOperationsTable, esOperationsTable, } from "./operations-schema.js";
12
- export { runPendingSeedMigrations, } from "./runner.js";
12
+ export { runPendingSeedMigrations } from "./runner.js";
@@ -1,5 +1,5 @@
1
1
  import { type DbConnection } from "../db/index.ts";
2
- export type EsOperationType = "seed-migration";
2
+ export type EsOperationType = "seed-migration" | "stream-migration";
3
3
  export type EsOperationAppliedBy = "boot" | "cli" | "ci-pipeline";
4
4
  export declare const esOperationsTable: import("@cosmicdrift/kumiko-types/executor-brand").WritableSchemaTable;
5
5
  export declare function createEsOperationsTable(db: DbConnection): Promise<void>;
@@ -30,10 +30,9 @@ export type SeedUserRow = {
30
30
  /** Read shape of a membership entry exposed to seed helpers.
31
31
  * Distinguishes two tenantIds: the logical one from the read projection
32
32
  * (`tenantId`) and the physical one from the aggregate stream
33
- * (`streamTenantId`). They differ when the aggregate was created by an
34
- * executor with a different tenantId (for example,
35
- * seedTenantMembership-by=systemAdmin), which is a typical
36
- * publicstatus driver use case. */
33
+ * (`streamTenantId`). They only differ for memberships written by an admin
34
+ * of another tenant before `backfillTenantStreamTenants` ran; afterwards
35
+ * `streamTenantId = tenantId`. */
37
36
  export type SeedMembershipRow = {
38
37
  readonly userId: string;
39
38
  /** Payload tenant from `read_tenant_memberships.tenant_id`; it is used
@@ -74,7 +73,7 @@ export type SeedMigrationContext = {
74
73
  * user executes it while bypassing access checks. Events have
75
74
  * inserted_by_id = SYSTEM_TENANT_ID-user, making them auditable.
76
75
  *
77
- * The type signature follows existing ctx.writeAs (with payload as unknown).
76
+ * The type signature follows existing ctx.dispatch.writeAs (with payload as unknown).
78
77
  * Type safety comes from handler-specific wrappers in the caller; do not
79
78
  * attempt generic magic.
80
79
  *
@@ -0,0 +1,14 @@
1
+ import type { TenantId } from "../engine/types/index.ts";
2
+ import type { EventMetadata } from "./event-store.ts";
3
+ export type RawEventToAppend = {
4
+ readonly aggregateId: string;
5
+ readonly aggregateType: string;
6
+ readonly tenantId: TenantId;
7
+ readonly expectedVersion: number;
8
+ readonly type: string;
9
+ readonly eventVersion?: number;
10
+ readonly payload: Record<string, unknown>;
11
+ readonly metadata: EventMetadata;
12
+ readonly createdAt: Temporal.Instant;
13
+ readonly createdBy: string;
14
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,18 +1,5 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
2
  import type { DbRunner } from "../db/index.ts";
3
- import type { TenantId } from "../engine/types/index.ts";
4
- import type { EventMetadata } from "./event-store.ts";
5
- export type RawEventToAppend = {
6
- readonly aggregateId: string;
7
- readonly aggregateType: string;
8
- readonly tenantId: TenantId;
9
- readonly expectedVersion: number;
10
- readonly type: string;
11
- readonly eventVersion?: number;
12
- readonly payload: Record<string, unknown>;
13
- readonly metadata: EventMetadata;
14
- readonly createdAt: Temporal.Instant;
15
- readonly createdBy: string;
16
- };
3
+ import type { RawEventToAppend } from "./admin-api-internals.ts";
17
4
  export declare function appendRaw(runner: DbRunner, event: RawEventToAppend): Promise<void>;
18
5
  export declare function appendRawBatch(runner: DbRunner, events: readonly RawEventToAppend[]): Promise<void>;
@@ -10,7 +10,9 @@ import { instantToTimestamptzParam } from "../db/driver-value-preparation.js";
10
10
  import { constraintOf, isUniqueViolation } from "../db/pg-error.js";
11
11
  import { claimXactId, runAtomicEventWrite } from "../db/queries/event-store.js";
12
12
  import { eventPredecessorExists, findExistingEventVersion, insertRawEventBatch, insertRawFirstEvent, insertRawSubsequentEvent, } from "../db/queries/event-store-admin.js";
13
+ import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
13
14
  import { IdempotentAppendConflictError, VersionConflictError } from "./errors.js";
15
+ import { inEventStreamScope } from "./stream-scope.js";
14
16
  function mapEventUniqueViolation(e, event) {
15
17
  if (constraintOf(e) === "events_idempotency_uq" && event.metadata.idempotencyKey) {
16
18
  return new IdempotentAppendConflictError(event.tenantId, event.metadata.idempotencyKey);
@@ -26,7 +28,7 @@ export async function appendRaw(runner, event) {
26
28
  try {
27
29
  // See db/queries/event-store.ts's claimXactId — gap-finality needs a
28
30
  // real xact id assigned before this holder's insert.
29
- await runAtomicEventWrite(runner, async (tx) => {
31
+ await inEventStreamScope(event.tenantId, () => runAtomicEventWrite(runner, async (tx) => {
30
32
  await claimXactId(tx);
31
33
  if (event.expectedVersion === 0) {
32
34
  await insertRawFirst(tx, event, newVersion, eventVersion);
@@ -34,7 +36,7 @@ export async function appendRaw(runner, event) {
34
36
  else {
35
37
  await insertRawSubsequent(tx, event, newVersion, eventVersion);
36
38
  }
37
- });
39
+ }));
38
40
  }
39
41
  catch (e) {
40
42
  if (isUniqueViolation(e)) {
@@ -81,8 +83,11 @@ export async function appendRawBatch(runner, events) {
81
83
  if (!firstEvent)
82
84
  return;
83
85
  verifyContiguousWithinBatch(events);
84
- await verifyPredecessors(runner, events);
85
- await verifyNoDuplicates(runner, events);
86
+ // A batch may span tenants (replay, transfer), so its pre-flight reads and the insert are system scoped.
87
+ await runInSystemRowLevelSecurityScope("raw event batch append writes events for arbitrary tenants", async () => {
88
+ await verifyPredecessors(runner, events);
89
+ await verifyNoDuplicates(runner, events);
90
+ });
86
91
  const params = [];
87
92
  const valuesClauses = events.map((e) => {
88
93
  const newVersion = e.expectedVersion + 1;
@@ -92,10 +97,10 @@ export async function appendRawBatch(runner, events) {
92
97
  return `($${baseIdx + 1}::uuid, $${baseIdx + 2}, $${baseIdx + 3}::uuid, $${baseIdx + 4}, $${baseIdx + 5}, $${baseIdx + 6}, $${baseIdx + 7}::jsonb, $${baseIdx + 8}::jsonb, $${baseIdx + 9}::timestamptz, $${baseIdx + 10})`;
93
98
  });
94
99
  try {
95
- await runAtomicEventWrite(runner, async (tx) => {
100
+ await runInSystemRowLevelSecurityScope("raw event batch append refreshes stream state across tenants", () => runAtomicEventWrite(runner, async (tx) => {
96
101
  await claimXactId(tx);
97
102
  await insertRawEventBatch(tx, valuesClauses.join(", "), params);
98
- });
103
+ }));
99
104
  }
100
105
  catch (e) {
101
106
  if (isUniqueViolation(e)) {
@@ -3,7 +3,7 @@ import { instant, table as pgTable, sql, text, uniqueIndex, uuid } from "../db/d
3
3
  import { upsertArchivedStream } from "../db/queries/event-store.js";
4
4
  import { deleteMany, fetchOne } from "../db/query.js";
5
5
  import { tableExists } from "../db/schema-inspection.js";
6
- import { unsafePushTables } from "../db/table-push.js";
6
+ import { ensureTableRowLevelSecurity, unsafePushTables } from "../db/table-push.js";
7
7
  // Marten-aligned stream archival. Archived streams become read-only: fresh
8
8
  // appendEvent on an archived aggregate throws, and loadAggregate returns
9
9
  // an empty slice unless the caller passes { includeArchived: true }.
@@ -24,8 +24,10 @@ export const archivedStreamsTable = pgTable("kumiko_archived_streams", {
24
24
  // guard:dup-ok — intentionale Parallele zu createSnapshotsTable; verschiedene Tabellen-Schemas by design
25
25
  export async function createArchivedStreamsTable(db) {
26
26
  // skip: table already exists — idempotent boot + test-setup call
27
- if (await tableExists(db, "public.kumiko_archived_streams"))
27
+ if (await tableExists(db, "public.kumiko_archived_streams")) {
28
+ await ensureTableRowLevelSecurity(db, archivedStreamsTable);
28
29
  return;
30
+ }
29
31
  await unsafePushTables(db, { kumikoArchivedStreams: archivedStreamsTable });
30
32
  }
31
33
  // Mark a stream as archived. Idempotent — re-archiving (same tenant +
@@ -55,11 +55,11 @@ export class SeedTimeOrderError extends Error {
55
55
  this.predecessorCreatedAt = predecessorCreatedAt;
56
56
  }
57
57
  }
58
- // Thrown when ctx.appendEvent targets an archived stream. Archived aggregates
58
+ // Thrown when ctx.events.append targets an archived stream. Archived aggregates
59
59
  // are read-only — restoreStream() makes them writable again. The archive
60
60
  // state is not carried on the events themselves; it lives on the sparse
61
61
  // kumiko_archived_streams table. Handlers that need to branch on archive
62
- // state should call ctx.isStreamArchived(id) first.
62
+ // state should call ctx.events.isArchived(id) first.
63
63
  export class ArchivedStreamError extends Error {
64
64
  tenantId;
65
65
  aggregateId;
@@ -19,6 +19,7 @@ export declare function append(db: DbRunner, event: EventToAppend): Promise<Stor
19
19
  export declare function loadAggregate(db: DbRunner, aggregateId: string, tenantId: TenantId, options?: {
20
20
  readonly includeArchived?: boolean;
21
21
  readonly aggregateType?: string;
22
+ readonly atVersion?: number;
22
23
  }): Promise<readonly StoredEvent[]>;
23
24
  export declare function loadAggregateForWriting(db: DbRunner, aggregateId: string, tenantId: TenantId, options: {
24
25
  readonly aggregateType: string;