@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
@@ -14,7 +14,8 @@ import { getUser, identifyOptionalSession } from "./auth-middleware.js";
14
14
  import { createAuthRoutes } from "./auth-routes.js";
15
15
  import { createClientErrorRoute } from "./client-error-route.js";
16
16
  import { clientIpSourceFromHonoContext } from "./client-ip.js";
17
- import { collectEntityReadAccess } from "./entity-read-access.js";
17
+ import { collectEntityReadAccess, collectEntityRowReadMaps } from "./entity-read-access.js";
18
+ import { createExportRoutes } from "./export/export-route.js";
18
19
  import { computeStrongEtag, etagMatches } from "./http-cache.js";
19
20
  import { requestContext } from "./request-context.js";
20
21
  import { buildRequestContextData } from "./request-id-middleware.js";
@@ -67,9 +68,11 @@ export function mountDispatcherRoutes(app, wiring) {
67
68
  app.route("/api", createApiRoutes(dispatcher, {
68
69
  ...(options.sseHeartbeatMs !== undefined ? { sseHeartbeatMs: options.sseHeartbeatMs } : {}),
69
70
  }));
71
+ app.route("/api", createExportRoutes(dispatcher, options.registry));
70
72
  app.route("/api", createSseRoute(sseBroker, {
71
73
  anonymousLiveEntities: collectAnonymousLiveEntities(options.registry),
72
74
  entityReadAccess: collectEntityReadAccess(options.registry),
75
+ entityRowReadMaps: collectEntityRowReadMaps(options.registry),
73
76
  }));
74
77
  }
75
78
  export function mountSchemaRoute(app, options) {
@@ -122,7 +125,9 @@ export function mountSchemaRoute(app, options) {
122
125
  });
123
126
  }
124
127
  export function mountFileRoutes(app, wiring) {
125
- const { options, dispatcher, fileProviderResolver } = wiring;
128
+ const { options, dispatcher, fileProviderResolver, rateLimitResolver, tracedRedis } = wiring;
129
+ const metaBatchRateLimitResolver = rateLimitResolver ??
130
+ (tracedRedis ? createRateLimitResolver({ redis: tracedRedis }) : undefined);
126
131
  // Mount upload/download routes whenever a file provider is resolvable (a
127
132
  // file-provider plugin is mounted, or a resolver was injected). They resolve
128
133
  // the provider per-tenant through file-foundation — no `files` option; route
@@ -139,6 +144,7 @@ export function mountFileRoutes(app, wiring) {
139
144
  db: fileDb,
140
145
  registry: options.registry,
141
146
  resolveProvider: fileProviderResolver,
147
+ ...(metaBatchRateLimitResolver ? { metaBatchRateLimitResolver } : {}),
142
148
  canReadRecord,
143
149
  canWriteRecord: createRecordWriteCheck({
144
150
  registry: options.registry,
@@ -2,7 +2,9 @@ import { EXT_FILE_PROVIDER } from "../engine/extension-names.js";
2
2
  import { assertSeedModeNotInProduction } from "../event-store/seed-clock.js";
3
3
  import { makeFileProviderResolver } from "../files/provider-resolver.js";
4
4
  import { createFallbackLogger } from "../logging/index.js";
5
- import { createNoopProvider, registerStandardMetrics, wrapRedisClient, } from "../observability/index.js";
5
+ import { createNoopProvider } from "../observability/index.js";
6
+ import { wrapRedisClient } from "../observability/redis-wrapper.js";
7
+ import { registerStandardMetrics } from "../observability/standard-metrics.js";
6
8
  import { configAccessorFactoryOf } from "../pipeline/config-accessor-factory.js";
7
9
  import { createDispatcher } from "../pipeline/dispatcher.js";
8
10
  import { createLifecycleHooks } from "../pipeline/lifecycle-pipeline.js";
@@ -23,13 +25,15 @@ export function withFileProviderResolver(registry, context, cacheSync) {
23
25
  return context;
24
26
  if (registry.getExtensionUsages(EXT_FILE_PROVIDER).length === 0)
25
27
  return context;
28
+ const { clock } = context;
26
29
  return {
27
30
  ...context,
28
31
  _fileProviderResolver: makeFileProviderResolver({
29
32
  registry,
30
- _configAccessorFactory: configAccessorFactoryOf(context),
33
+ configAccessorFactory: configAccessorFactoryOf(context),
31
34
  secrets: context.secrets,
32
35
  db: context.db,
36
+ ...(clock ? { now: () => clock.now() } : {}),
33
37
  ...(cacheSync ? { cacheSync } : {}),
34
38
  }),
35
39
  };
@@ -52,7 +56,7 @@ export function resolveServerWiring(options) {
52
56
  // Inject tracer + meter into the AppContext so the dispatcher can propagate
53
57
  // them into every HandlerContext it builds. Build the per-tenant file-provider
54
58
  // resolver once (when a provider plugin is mounted) — the dispatcher uses it
55
- // to materialise `ctx.files`, the upload routes + MSP-applies share it. The
59
+ // to materialise `ctx.services.files`, the upload routes + MSP-applies share it. The
56
60
  // resolver reads config + the s3.secretAccessKey secret under SYSTEM identity.
57
61
  const contextWithFiles = withFileProviderResolver(options.registry, options.context, cacheSync);
58
62
  const fileProviderResolver = contextWithFiles._fileProviderResolver;
@@ -140,7 +144,7 @@ function resolveServerSseBroker(explicitSseBroker, bootLog) {
140
144
  }
141
145
  function resolveServerObservability(explicitObservability, registry) {
142
146
  // Observability — Noop by default so no call-site needs to null-check.
143
- // Every handler/middleware that reaches for ctx.tracer / ctx.metrics gets
147
+ // Every handler/middleware that reaches for ctx.obs.tracer / ctx.obs.metrics gets
144
148
  // a working, zero-cost fallback when no provider is configured.
145
149
  const observability = explicitObservability ?? createNoopProvider();
146
150
  // Register framework + feature metrics once on this meter. Standard
@@ -1,6 +1,7 @@
1
+ import type { RunIn } from "@cosmicdrift/kumiko-types/config";
1
2
  import { Hono } from "hono";
2
3
  import type { PgListenClient } from "../db/connection.ts";
3
- import type { AppContext, Registry, RunIn } from "../engine/types/index.ts";
4
+ import type { AppContext, Registry } from "../engine/types/index.ts";
4
5
  import type { ErrorDocsConfig } from "../errors/docs-url.ts";
5
6
  import type { Lifecycle } from "../lifecycle/index.ts";
6
7
  import type { ObservabilityProvider } from "../observability/index.ts";
@@ -1,5 +1,6 @@
1
+ import type { AccessRule } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { OwnershipMap } from "@cosmicdrift/kumiko-types/ownership";
1
3
  import { Hono } from "hono";
2
- import type { AccessRule } from "../engine/types/index.ts";
3
4
  import { type SseBroker } from "./sse-broker.ts";
4
5
  /**
5
6
  * Heartbeat cadence for SSE streams.
@@ -27,6 +28,7 @@ export declare const SSE_MAX_PENDING_WRITES_PER_CLIENT = 10000;
27
28
  export type SseRouteOptions = {
28
29
  readonly anonymousLiveEntities: ReadonlySet<string>;
29
30
  readonly entityReadAccess: ReadonlyMap<string, readonly AccessRule[]>;
31
+ readonly entityRowReadMaps?: ReadonlyMap<string, OwnershipMap>;
30
32
  readonly now?: () => number;
31
33
  };
32
34
  export declare function createSseRoute(broker: SseBroker, options: SseRouteOptions): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
@@ -84,7 +84,17 @@ function entitySignalDetail(user, aggregateType, options) {
84
84
  const granting = (options.entityReadAccess.get(aggregateType) ?? []).filter((rule) => hasAccess(user, rule));
85
85
  if (granting.length === 0)
86
86
  return "none";
87
- return granting.some((rule) => "roles" in rule) ? "identified" : "anonymous";
87
+ if (!granting.some((rule) => "roles" in rule))
88
+ return "anonymous";
89
+ return readsEveryRow(user, options.entityRowReadMaps?.get(aggregateType))
90
+ ? "identified"
91
+ : "anonymous";
92
+ }
93
+ // Mirrors buildOwnershipClause: without a map every row is visible, otherwise only a role mapped to "all" sees them all.
94
+ function readsEveryRow(user, rowReadMap) {
95
+ if (rowReadMap === undefined)
96
+ return true;
97
+ return user.roles.some((role) => rowReadMap[role] === "all");
88
98
  }
89
99
  function decideWireFrame(event, user, options) {
90
100
  const data = event.data;
@@ -0,0 +1,2 @@
1
+ import type { SecretsContext } from "../secrets/index.ts";
2
+ export declare function tenantScopedSecrets(secrets: SecretsContext): SecretsContext;
@@ -0,0 +1,13 @@
1
+ import { runInRowLevelSecurityScope, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
2
+ // Signature routes run before any tenant scope exists, and plugin code parses unauthenticated bytes,
3
+ // so only the secret accesses themselves open a scope, and only for the tenant the call names.
4
+ export function tenantScopedSecrets(secrets) {
5
+ const scoped = (tenantId, run) => runInRowLevelSecurityScope(tenantRowLevelSecurityScope(tenantId), run);
6
+ return {
7
+ withRunner: (runner) => tenantScopedSecrets(secrets.withRunner(runner)),
8
+ get: (tenantId, ...rest) => scoped(tenantId, () => secrets.get(tenantId, ...rest)),
9
+ has: (tenantId, ...rest) => scoped(tenantId, () => secrets.has(tenantId, ...rest)),
10
+ set: (tenantId, ...rest) => scoped(tenantId, () => secrets.set(tenantId, ...rest)),
11
+ delete: (tenantId, ...rest) => scoped(tenantId, () => secrets.delete(tenantId, ...rest)),
12
+ };
13
+ }
@@ -1,7 +1,7 @@
1
1
  import { WEBSOCKET_BACKPRESSURE_LIMIT_BYTES, WEBSOCKET_DEFAULT_MAX_CONNECTIONS_PER_USER, WEBSOCKET_DEFAULT_MAX_MESSAGE_BYTES, WEBSOCKET_MAX_PAYLOAD_BYTES, WEBSOCKET_ROUTE_PATH_PREFIX, type WebSocketMessageData, type WebSocketSessionHandlers } from "@cosmicdrift/kumiko-types/websocket-route";
2
2
  import type { SessionUser } from "../engine/types/index.ts";
3
3
  import { type AuthSessionChecker, type TenantLifecycleStatusResolver } from "./auth-middleware.ts";
4
- import { type RequestContextData } from "./request-context.ts";
4
+ import type { RequestContextData } from "./request-context-internals.ts";
5
5
  export { WEBSOCKET_BACKPRESSURE_LIMIT_BYTES, WEBSOCKET_DEFAULT_MAX_CONNECTIONS_PER_USER, WEBSOCKET_DEFAULT_MAX_MESSAGE_BYTES, WEBSOCKET_MAX_PAYLOAD_BYTES, WEBSOCKET_ROUTE_PATH_PREFIX, };
6
6
  export declare const WEBSOCKET_HEARTBEAT_INTERVAL_MS = 25000;
7
7
  export declare const WEBSOCKET_PENDING_BUFFER_LIMIT_BYTES: number;
@@ -1,2 +1 @@
1
- export type { Role } from "./roles.ts";
2
1
  export { ROLES } from "./roles.ts";
@@ -9,8 +9,3 @@ export declare const ROLES: {
9
9
  readonly SystemAdmin: "SystemAdmin";
10
10
  readonly Member: "Member";
11
11
  };
12
- /**
13
- * Union of all known role names for compile-time checks of
14
- * handler access rules and ownership maps.
15
- */
16
- export type Role = (typeof ROLES)[keyof typeof ROLES];
@@ -3,6 +3,5 @@ import type { DurationSpec, RetentionSpec } from "./profiles.ts";
3
3
  type Instant = InstanceType<ReturnType<typeof getTemporal>["Instant"]>;
4
4
  export declare function durationSpecToMs(spec: DurationSpec): number;
5
5
  export declare function addDurationSpec(now: Instant, spec: DurationSpec): Instant;
6
- export declare function describeDurationSpec(spec: DurationSpec): string;
7
6
  export declare function subtractRetentionSpec(now: Instant, spec: RetentionSpec): Instant;
8
7
  export {};
@@ -28,11 +28,6 @@ export function addDurationSpec(now, spec) {
28
28
  }
29
29
  // Human-readable descriptions for logs and error messages. Not localized;
30
30
  // operator output is English-only.
31
- export function describeDurationSpec(spec) {
32
- if ("days" in spec)
33
- return `${spec.days} day${spec.days === 1 ? "" : "s"}`;
34
- return `${spec.hours} hour${spec.hours === 1 ? "" : "s"}`;
35
- }
36
31
  // Calendar-aware cutoff: months/years are subtracted on a UTC calendar so
37
32
  // "24 months" is not approximated as 730 fixed days (leap years, month ends).
38
33
  export function subtractRetentionSpec(now, spec) {
@@ -1,6 +1,6 @@
1
- export { addDurationSpec, describeDurationSpec, durationSpecToMs, subtractRetentionSpec, } from "./duration-spec.ts";
1
+ export { addDurationSpec, subtractRetentionSpec, } from "./duration-spec.ts";
2
2
  export { complianceProfileOverrideSchema } from "./override-schema.ts";
3
- export type { AuthorityNotificationDeadline, ComplianceProfile, ComplianceProfileKey, ComplianceProfileOverride, DurationSpec, EffectiveComplianceProfile, RetentionSpec, UserNotificationRequiredPolicy, } from "./profiles.ts";
4
- export { COMPLIANCE_PROFILES, OVERRIDABLE_PROFILE_KEYS, resolveComplianceProfile, SELECTABLE_PROFILE_KEYS, } from "./profiles.ts";
5
- export type { BundleTier, SubProcessor } from "./sub-processors.ts";
3
+ export type { ComplianceProfile, ComplianceProfileKey, ComplianceProfileOverride, DurationSpec, EffectiveComplianceProfile, } from "./profiles.ts";
4
+ export { COMPLIANCE_PROFILES, resolveComplianceProfile, SELECTABLE_PROFILE_KEYS, } from "./profiles.ts";
5
+ export type { SubProcessor } from "./sub-processors.ts";
6
6
  export { getActiveSubProcessors, getPlannedSubProcessors, KUMIKO_SUB_PROCESSORS, } from "./sub-processors.ts";
@@ -1,6 +1,6 @@
1
1
  // `@cosmicdrift/kumiko-framework/compliance` — Data protection and compliance foundation.
2
2
  // Used by compliance-profiles, data-retention, user-data-rights, and related features.
3
- export { addDurationSpec, describeDurationSpec, durationSpecToMs, subtractRetentionSpec, } from "./duration-spec.js";
3
+ export { addDurationSpec, subtractRetentionSpec, } from "./duration-spec.js";
4
4
  export { complianceProfileOverrideSchema } from "./override-schema.js";
5
- export { COMPLIANCE_PROFILES, OVERRIDABLE_PROFILE_KEYS, resolveComplianceProfile, SELECTABLE_PROFILE_KEYS, } from "./profiles.js";
5
+ export { COMPLIANCE_PROFILES, resolveComplianceProfile, SELECTABLE_PROFILE_KEYS, } from "./profiles.js";
6
6
  export { getActiveSubProcessors, getPlannedSubProcessors, KUMIKO_SUB_PROCESSORS, } from "./sub-processors.js";
@@ -70,21 +70,6 @@ export interface ComplianceProfile {
70
70
  * tenants must select an actual profile.
71
71
  */
72
72
  export declare const SELECTABLE_PROFILE_KEYS: readonly ["eu-dsgvo", "swiss-dsg", "de-hr-dsgvo-hgb"];
73
- /**
74
- * Top-level `ComplianceProfile` properties that a tenant override may modify.
75
- * Identity fields (key, region, label, extends) are excluded because
76
- * overriding them would destroy the profile's identity.
77
- *
78
- * This is the single source of truth for:
79
- * - the set-profile handler whitelist, which rejects typos
80
- * - the snapshot test that guards against drift from the profile's top level
81
- *
82
- * When a new top-level property is added to `ComplianceProfile` (for example,
83
- * `dataSubjectRights` or `crossBorderTransferRules`), it must be added here;
84
- * otherwise set-profile rejects valid overrides. The snapshot test in
85
- * profiles.test.ts detects drift in either direction.
86
- */
87
- export declare const OVERRIDABLE_PROFILE_KEYS: ReadonlySet<string>;
88
73
  type DeepReadonly<T> = T extends object ? {
89
74
  readonly [K in keyof T]: DeepReadonly<T[K]>;
90
75
  } : T;
@@ -164,29 +164,6 @@ export const SELECTABLE_PROFILE_KEYS = [
164
164
  "swiss-dsg",
165
165
  "de-hr-dsgvo-hgb",
166
166
  ];
167
- /**
168
- * Top-level `ComplianceProfile` properties that a tenant override may modify.
169
- * Identity fields (key, region, label, extends) are excluded because
170
- * overriding them would destroy the profile's identity.
171
- *
172
- * This is the single source of truth for:
173
- * - the set-profile handler whitelist, which rejects typos
174
- * - the snapshot test that guards against drift from the profile's top level
175
- *
176
- * When a new top-level property is added to `ComplianceProfile` (for example,
177
- * `dataSubjectRights` or `crossBorderTransferRules`), it must be added here;
178
- * otherwise set-profile rejects valid overrides. The snapshot test in
179
- * profiles.test.ts detects drift in either direction.
180
- */
181
- export const OVERRIDABLE_PROFILE_KEYS = new Set([
182
- "userRights",
183
- "notifications",
184
- "breach",
185
- "auditLog",
186
- "subProcessor",
187
- "tenantDestroyGracePeriod",
188
- "forgetDiscovery",
189
- ]);
190
167
  // These paths are replaced as atomic values rather than merged recursively.
191
168
  // This is required for discriminated unions, where a patch may provide a
192
169
  // sibling property instead of an override; for example, changing retention
@@ -1,5 +1,8 @@
1
+ import type { BundledListsOptions } from "@cosmicdrift/kumiko-types/screen";
2
+ import { type RowLevelSecurityMode } from "../db/render-rls-ddl.ts";
1
3
  import type { ValidateBootOptions } from "../engine/boot-validator.ts";
2
4
  import type { FeatureDefinition } from "../engine/types/index.ts";
5
+ import type { AppClientConfig, AppPortEntry } from "./internals.ts";
3
6
  export type AppInfraPorts = {
4
7
  readonly postgres?: number;
5
8
  readonly redis?: number;
@@ -16,10 +19,6 @@ export type AppPorts = {
16
19
  * of several apps never share a Meilisearch or Postgres. */
17
20
  readonly infra?: AppInfraPorts;
18
21
  };
19
- export type AppClientConfig = {
20
- /** Client bundle entry files, relative to the app root (e.g. "src/client.tsx"). */
21
- readonly entries: readonly string[];
22
- };
23
22
  /** The boot-validator options an app owns; `env` and the cipher are injected by the runners. */
24
23
  export type AppValidateBootOptions = Pick<ValidateBootOptions, "navAllowlist" | "navAllowlistExempt" | "requiredLocales" | "warnOnUniqueAccessRoles">;
25
24
  export type AppConfig = {
@@ -35,19 +34,22 @@ export type AppConfig = {
35
34
  readonly ports: AppPorts;
36
35
  /** Passed to validateBoot by `kumiko check` and, via the app's bin files, by the runners. */
37
36
  readonly validateBootOptions?: AppValidateBootOptions;
37
+ /** One table block for every list of the bundled features. kumiko/schema.ts passes it to composeFeatures; the app's bin files pass it to the runners, like validateBootOptions. */
38
+ readonly bundledLists?: BundledListsOptions;
39
+ /** "on" enforces tenant isolation in Postgres via row level security; schema tooling and every runner read this one value. Default "on". */
40
+ readonly rowLevelSecurity?: RowLevelSecurityMode;
38
41
  };
39
42
  export declare const APP_CONFIG_FILE = "kumiko.config.ts";
40
43
  declare const INFRA_PORT_NAMES: readonly ["postgres", "redis", "meilisearch", "s3"];
41
44
  export type AppPortRole = "dev" | "e2e" | (typeof INFRA_PORT_NAMES)[number];
42
- export type AppPortEntry = {
43
- readonly role: AppPortRole;
44
- readonly port: number;
45
- };
46
45
  /** Every port the app claims, in a stable order. */
47
46
  export declare function listAppPorts(ports: AppPorts): readonly AppPortEntry[];
48
47
  /** Problems with the declared ports: out of range or claimed twice by this app. */
49
48
  export declare function findAppPortProblems(ports: AppPorts): readonly string[];
50
49
  export declare function defineAppConfig(config: AppConfig): AppConfig;
51
- /** The full feature list prod boots with: `features` plus `prodFeatures`. */
50
+ /**
51
+ * Raw `features` plus `prodFeatures`, without the bundled foundation: the runners compose it,
52
+ * tooling such as `runSchemaCli` takes `FEATURES` from `kumiko/schema`.
53
+ */
52
54
  export declare function allAppFeatures(config: Pick<AppConfig, "features" | "prodFeatures">): readonly FeatureDefinition[];
53
55
  export {};
@@ -1,3 +1,8 @@
1
+ // The app's single config file (kumiko.config.ts). Type-only imports keep it
2
+ // loadable by tooling (kumiko check, agent lint, port registry) without
3
+ // pulling the engine runtime.
4
+ import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
5
+ import { ROW_LEVEL_SECURITY_MODES } from "../db/render-rls-ddl.js";
1
6
  export const APP_CONFIG_FILE = "kumiko.config.ts";
2
7
  const INFRA_PORT_NAMES = [
3
8
  "postgres",
@@ -50,12 +55,19 @@ export function defineAppConfig(config) {
50
55
  problems.push(`client.entries: "${entry}" must be a relative .ts/.tsx path inside the app`);
51
56
  }
52
57
  }
58
+ if (config.rowLevelSecurity !== undefined &&
59
+ !isOneOf(ROW_LEVEL_SECURITY_MODES, config.rowLevelSecurity)) {
60
+ problems.push(`rowLevelSecurity must be one of ${ROW_LEVEL_SECURITY_MODES.join(", ")}, got ${String(config.rowLevelSecurity)}`);
61
+ }
53
62
  if (problems.length > 0) {
54
63
  throw new Error(`defineAppConfig: ${problems.join("; ")}`);
55
64
  }
56
65
  return config;
57
66
  }
58
- /** The full feature list prod boots with: `features` plus `prodFeatures`. */
67
+ /**
68
+ * Raw `features` plus `prodFeatures`, without the bundled foundation: the runners compose it,
69
+ * tooling such as `runSchemaCli` takes `FEATURES` from `kumiko/schema`.
70
+ */
59
71
  export function allAppFeatures(config) {
60
72
  return [...config.features, ...(config.prodFeatures ?? [])];
61
73
  }
@@ -0,0 +1,9 @@
1
+ import type { AppPortRole } from "./index.ts";
2
+ export type AppClientConfig = {
3
+ /** Client bundle entry files, relative to the app root (e.g. "src/client.tsx"). */
4
+ readonly entries: readonly string[];
5
+ };
6
+ export type AppPortEntry = {
7
+ readonly role: AppPortRole;
8
+ readonly port: number;
9
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export type ConsumerCliOut = {
2
+ readonly log: (line: string) => void;
3
+ readonly err: (line: string) => void;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,2 @@
1
- export type ConsumerCliOut = {
2
- readonly log: (line: string) => void;
3
- readonly err: (line: string) => void;
4
- };
1
+ import type { ConsumerCliOut } from "./consumer-cli-internals.ts";
5
2
  export declare function runConsumerCli(argv: readonly string[], out: ConsumerCliOut): Promise<number>;
@@ -79,7 +79,11 @@ export async function runConsumerCli(argv, out) {
79
79
  out.err(" DATABASE_URL not set.");
80
80
  return 1;
81
81
  }
82
- const { db, close } = createDbConnection({ url: dbUrl, ...dbConnectionOptionsFromEnv() });
82
+ const { db, close } = createDbConnection({
83
+ url: dbUrl,
84
+ rowLevelSecurity: "off", // consumer state tables carry no tenant_id
85
+ ...dbConnectionOptionsFromEnv(),
86
+ });
83
87
  try {
84
88
  if (sub === "status") {
85
89
  const state = await getConsumerState(db, name, instanceId);
@@ -1,5 +1,5 @@
1
1
  // PII on custom-event payloads. Entity CRUD events get their PII
2
- // encrypted by the executor; events written via ctx.appendEvent / MSP-apply /
2
+ // encrypted by the executor; events written via ctx.events.append / MSP-apply /
3
3
  // low-level append() (delivery attempt-log, jobs run-logger) had no encrypt
4
4
  // path at all. `r.defineEvent(name, schema, { piiFields })` declares which
5
5
  // payload fields are PII and which payload field names the owning user;
@@ -1,11 +1,10 @@
1
- export { blindIndexFieldName, collectLookupableFields, computeBlindIndex, computeBlindIndexValues, configureBlindIndexKey, configuredBlindIndexKey, decodeBlindIndexKey, } from "./blind-index.ts";
2
- export { configuredEventPiiCatalog, configureEventPiiCatalog, type EventPiiCatalog, encryptEventPayloadPii, } from "./event-pii.ts";
1
+ export { collectLookupableFields, computeBlindIndex, configureBlindIndexKey, configuredBlindIndexKey, decodeBlindIndexKey, } from "./blind-index.ts";
2
+ export { configuredEventPiiCatalog } from "./event-pii.ts";
3
3
  export { InMemoryKmsAdapter } from "./in-memory-kms-adapter.ts";
4
4
  export { isSelfPiiField } from "./is-self-pii-field.ts";
5
- export { type KekSourceEnv, type KekSourceOptions, resolvePlatformKeks } from "./kek-source.ts";
6
- export { isLocalKeyKmsAdapter, KeyAlreadyExistsError, KeyErasedError, KeyNotFoundError, type KmsAdapter, type KmsContext, type KmsHealth, type LocalKeyKmsAdapter, RECORD_ENTITY_PATTERN, type RemoteCryptoKmsAdapter, type SubjectDek, type SubjectId, type SubjectKey, subjectIdFromKey, subjectIdSchema, subjectIdToKey, subjectKeyForRecord, subjectKeyForTenant, subjectKeyForUser, } from "./kms-adapter.ts";
7
- export { type ActiveKmsWiring, buildPgKmsOptions, type KmsWiring, type KmsWiringEnv, type KmsWiringOptions, type KmsWiringRelease, type PgKmsRotationEnv, type PlaintextPiiWiring, requireKmsWiring, requireKmsWiringAsync, resolveKmsWiring, resolveKmsWiringAsync, } from "./kms-wiring.ts";
8
- export { createPgKmsAdapter, PgKmsAdapter, type PgKmsAdapterOptions, type RewrapOptions, type RewrapResult, rewrapSubjectKeys, } from "./pg-kms-adapter.ts";
9
- export { configuredPiiSubjectKms, configurePiiSubjectKms, decryptPiiFieldValues, decryptPiiValueForSubject, type EncryptPiiOptions, encryptPiiFieldValues, encryptPiiJsonValueForSubject, encryptPiiValueForSubject, isPiiCiphertext, PII_CIPHERTEXT_PREFIX, PII_CIPHERTEXT_PREFIX_JSON, PII_ERASED_SENTINEL, } from "./pii-field-encryption.ts";
10
- export { createRequestKmsCache, type RequestKmsCache, } from "./request-kms-cache.ts";
11
- export { collectPiiEncryptedFields, collectPiiSubjectFields, collectSearchableSubjectFields, isRecordKeyedField, type ResolveSubjectOptions, resolveSubjectForField, SubjectResolutionError, } from "./subject-resolver.ts";
5
+ export { resolvePlatformKeks } from "./kek-source.ts";
6
+ export { KeyAlreadyExistsError, KeyErasedError, type KmsAdapter, type KmsContext, type LocalKeyKmsAdapter, type SubjectId, subjectIdSchema, subjectIdToKey, subjectKeyForRecord, subjectKeyForUser, } from "./kms-adapter.ts";
7
+ export { type KmsWiring, requireKmsWiring, requireKmsWiringAsync, resolveKmsWiring, resolveKmsWiringAsync, } from "./kms-wiring.ts";
8
+ export { createPgKmsAdapter, rewrapSubjectKeys, } from "./pg-kms-adapter.ts";
9
+ export { configuredPiiSubjectKms, configurePiiSubjectKms, decryptPiiFieldValues, decryptPiiValueForSubject, encryptPiiFieldValues, encryptPiiJsonValueForSubject, encryptPiiValueForSubject, isPiiCiphertext, PII_CIPHERTEXT_PREFIX, PII_ERASED_SENTINEL, } from "./pii-field-encryption.ts";
10
+ export { collectPiiEncryptedFields, collectPiiSubjectFields, isRecordKeyedField, resolveSubjectForField, SubjectResolutionError, } from "./subject-resolver.ts";
@@ -1,11 +1,10 @@
1
- export { blindIndexFieldName, collectLookupableFields, computeBlindIndex, computeBlindIndexValues, configureBlindIndexKey, configuredBlindIndexKey, decodeBlindIndexKey, } from "./blind-index.js";
2
- export { configuredEventPiiCatalog, configureEventPiiCatalog, encryptEventPayloadPii, } from "./event-pii.js";
1
+ export { collectLookupableFields, computeBlindIndex, configureBlindIndexKey, configuredBlindIndexKey, decodeBlindIndexKey, } from "./blind-index.js";
2
+ export { configuredEventPiiCatalog } from "./event-pii.js";
3
3
  export { InMemoryKmsAdapter } from "./in-memory-kms-adapter.js";
4
4
  export { isSelfPiiField } from "./is-self-pii-field.js";
5
5
  export { resolvePlatformKeks } from "./kek-source.js";
6
- export { isLocalKeyKmsAdapter, KeyAlreadyExistsError, KeyErasedError, KeyNotFoundError, RECORD_ENTITY_PATTERN, subjectIdFromKey, subjectIdSchema, subjectIdToKey, subjectKeyForRecord, subjectKeyForTenant, subjectKeyForUser, } from "./kms-adapter.js";
7
- export { buildPgKmsOptions, requireKmsWiring, requireKmsWiringAsync, resolveKmsWiring, resolveKmsWiringAsync, } from "./kms-wiring.js";
8
- export { createPgKmsAdapter, PgKmsAdapter, rewrapSubjectKeys, } from "./pg-kms-adapter.js";
9
- export { configuredPiiSubjectKms, configurePiiSubjectKms, decryptPiiFieldValues, decryptPiiValueForSubject, encryptPiiFieldValues, encryptPiiJsonValueForSubject, encryptPiiValueForSubject, isPiiCiphertext, PII_CIPHERTEXT_PREFIX, PII_CIPHERTEXT_PREFIX_JSON, PII_ERASED_SENTINEL, } from "./pii-field-encryption.js";
10
- export { createRequestKmsCache, } from "./request-kms-cache.js";
11
- export { collectPiiEncryptedFields, collectPiiSubjectFields, collectSearchableSubjectFields, isRecordKeyedField, resolveSubjectForField, SubjectResolutionError, } from "./subject-resolver.js";
6
+ export { KeyAlreadyExistsError, KeyErasedError, subjectIdSchema, subjectIdToKey, subjectKeyForRecord, subjectKeyForUser, } from "./kms-adapter.js";
7
+ export { requireKmsWiring, requireKmsWiringAsync, resolveKmsWiring, resolveKmsWiringAsync, } from "./kms-wiring.js";
8
+ export { createPgKmsAdapter, rewrapSubjectKeys, } from "./pg-kms-adapter.js";
9
+ export { configuredPiiSubjectKms, configurePiiSubjectKms, decryptPiiFieldValues, decryptPiiValueForSubject, encryptPiiFieldValues, encryptPiiJsonValueForSubject, encryptPiiValueForSubject, isPiiCiphertext, PII_CIPHERTEXT_PREFIX, PII_ERASED_SENTINEL, } from "./pii-field-encryption.js";
10
+ export { collectPiiEncryptedFields, collectPiiSubjectFields, isRecordKeyedField, resolveSubjectForField, SubjectResolutionError, } from "./subject-resolver.js";
@@ -17,6 +17,7 @@ export declare class PgKmsAdapter implements LocalKeyKmsAdapter {
17
17
  readonly capabilities: {
18
18
  readonly mode: "local-key";
19
19
  };
20
+ private readonly connection;
20
21
  private readonly sql;
21
22
  private readonly kek;
22
23
  private readonly kekVersion;
@@ -1,6 +1,6 @@
1
1
  import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
2
- import postgres from "postgres";
3
- import { DEFAULT_DB_CLOSE_TIMEOUT_SECONDS } from "../db/connection.js";
2
+ import { createDbConnection } from "../db/connection.js";
3
+ import { isUniqueViolation } from "../db/pg-error.js";
4
4
  import { KeyAlreadyExistsError, KeyErasedError, KeyNotFoundError, subjectIdToKey, } from "./kms-adapter.js";
5
5
  const IV_LENGTH = 12;
6
6
  const TAG_LENGTH = 16;
@@ -28,21 +28,15 @@ function decodePlatformKek(base64) {
28
28
  }
29
29
  return kek;
30
30
  }
31
- const PG_UNIQUE_VIOLATION = "23505";
32
31
  // pg_advisory_xact_lock key for createSchema — serializes concurrent cold-start
33
32
  // DDL across processes sharing one subject-keys DB.
34
33
  const SCHEMA_ADVISORY_LOCK_KEY = 0x6b_6d_73_31; // 'kms1'
35
- function isPgUniqueViolation(error) {
36
- return (typeof error === "object" &&
37
- error !== null &&
38
- "code" in error &&
39
- error.code === PG_UNIQUE_VIOLATION);
40
- }
41
34
  // Default production adapter: DEKs live in a separate Postgres cluster,
42
35
  // KEK-wrapped at rest. Schema is created lazily on first use — the
43
36
  // subject-keys cluster has no drizzle migration pipeline of its own.
44
37
  export class PgKmsAdapter {
45
38
  capabilities = { mode: "local-key" };
39
+ connection;
46
40
  sql;
47
41
  kek;
48
42
  kekVersion;
@@ -60,12 +54,12 @@ export class PgKmsAdapter {
60
54
  previous.set(v, decodePlatformKek(kek));
61
55
  }
62
56
  this.previousKeks = previous;
63
- this.sql = postgres(options.databaseUrl, {
64
- max: options.maxConnections ?? 4,
65
- // The connection is exclusive to this adapter and its only DDL is
66
- // idempotent IF NOT EXISTS — notices are pure boot-log noise.
67
- onnotice: () => { },
57
+ this.connection = createDbConnection({
58
+ url: options.databaseUrl,
59
+ maxConnections: options.maxConnections ?? 4,
60
+ rowLevelSecurity: "off", // key tables carry no tenant_id
68
61
  });
62
+ this.sql = this.connection.client;
69
63
  }
70
64
  async createKey(subject, ctx) {
71
65
  await this.ensureSchema();
@@ -76,7 +70,7 @@ export class PgKmsAdapter {
76
70
  VALUES (${subjectIdToKey(subject)}, ${wrapped}, ${this.kekVersion}, ${ctx.userId ?? null})`;
77
71
  }
78
72
  catch (error) {
79
- if (isPgUniqueViolation(error))
73
+ if (isUniqueViolation(error))
80
74
  throw new KeyAlreadyExistsError(subject);
81
75
  throw error;
82
76
  }
@@ -128,7 +122,7 @@ export class PgKmsAdapter {
128
122
  return { ok: true, latencyMs: Date.now() - start };
129
123
  }
130
124
  async close() {
131
- await this.sql.end({ timeout: DEFAULT_DB_CLOSE_TIMEOUT_SECONDS });
125
+ await this.connection.close();
132
126
  }
133
127
  ensureSchema() {
134
128
  // A failed attempt resets the memo so a transient DB outage does not
@@ -178,7 +172,12 @@ export async function rewrapSubjectKeys(options) {
178
172
  fromKeks.set(Number(version), decodePlatformKek(kek));
179
173
  }
180
174
  const batchSize = options.batchSize ?? 200;
181
- const sql = postgres(options.databaseUrl, { max: 2, onnotice: () => { } });
175
+ const connection = createDbConnection({
176
+ url: options.databaseUrl,
177
+ maxConnections: 2,
178
+ rowLevelSecurity: "off", // key tables carry no tenant_id
179
+ });
180
+ const sql = connection.client;
182
181
  const failures = [];
183
182
  const result = { scanned: 0, rewrapped: 0, skippedErased: 0, failures };
184
183
  try {
@@ -226,7 +225,7 @@ export async function rewrapSubjectKeys(options) {
226
225
  }
227
226
  }
228
227
  finally {
229
- await sql.end();
228
+ await connection.close();
230
229
  }
231
230
  return result;
232
231
  }
@@ -12,6 +12,8 @@ export declare function isListAggregateMeasureSupported(kind: ListAggregateMeasu
12
12
  export declare function isListAggregateGroupable(fieldType: FieldType, multiple: boolean): boolean;
13
13
  export declare function listAggregateKeySql(fieldType: FieldType, columnSql: string, alias: string): string;
14
14
  export declare function listAggregateMeasureSql(kind: ListAggregateMeasureKind, fieldType: FieldType, columnSql: string, filterSql?: string): string;
15
+ export declare function isPerCurrencyMeasure(kind: ListAggregateMeasureKind, fieldType: FieldType): boolean;
16
+ export declare function listCurrencyMeasureSql(kind: ListAggregateMeasureKind, columnSql: string, filterSql: string): string;
15
17
  export declare function groupedKeyOrderLimitSql(limit: number): string;
16
18
  export declare function decodeListAggregateValue(raw: unknown): ListAggregateValue;
17
19
  export declare function emptyListAggregateValue(kind: ListAggregateMeasureKind): ListAggregateValue;
@@ -95,6 +95,16 @@ export function listAggregateMeasureSql(kind, fieldType, columnSql, filterSql) {
95
95
  return `ROUND(${fn})::float8`;
96
96
  return `(${fn})::float8`;
97
97
  }
98
+ export function isPerCurrencyMeasure(kind, fieldType) {
99
+ return fieldType === "money" && kind !== "count";
100
+ }
101
+ // No COALESCE on SUM: a currency absent from a group must read NULL so it can be left out.
102
+ export function listCurrencyMeasureSql(kind, columnSql, filterSql) {
103
+ const fn = kind === "sum"
104
+ ? `SUM(${columnSql}) FILTER (WHERE ${filterSql})`
105
+ : aggregateFunctionSql(kind, columnSql, filterSql);
106
+ return kind === "avg" ? `ROUND(${fn})::float8` : `(${fn})::float8`;
107
+ }
98
108
  export function groupedKeyOrderLimitSql(limit) {
99
109
  return ` GROUP BY 1 ORDER BY 1 ASC NULLS LAST LIMIT ${limit}`;
100
110
  }
@@ -1,5 +1,5 @@
1
+ import type { EntityDefinition } from "@cosmicdrift/kumiko-types/fields";
1
2
  import type { ExecutorManagedRunner } from "@cosmicdrift/kumiko-types/executor-brand";
2
- import type { EntityDefinition } from "../engine/types/index.ts";
3
3
  import type { StoredEvent } from "../event-store/index.ts";
4
4
  import type { DbRow } from "./connection.ts";
5
5
  import type { TableColumns } from "./dialect.ts";