@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1

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 (617) hide show
  1. package/AGENTS.md +9 -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/inbound-mail-triage.md +1 -0
  13. package/agents/examples/lane-routing.md +2 -1
  14. package/agents/examples/legal-pages.md +2 -2
  15. package/agents/examples/lifecycle-hooks.md +3 -3
  16. package/agents/examples/managed-config.md +4 -4
  17. package/agents/examples/managed-pages.md +1 -1
  18. package/agents/examples/relations.md +19 -4
  19. package/agents/examples/search.md +4 -4
  20. package/agents/examples/secrets-demo.md +9 -6
  21. package/agents/examples/state-machine.md +2 -2
  22. package/agents/examples/tenant-settings.md +1 -1
  23. package/agents/examples/user-data-rights.md +3 -6
  24. package/agents/examples/workflow-engine.md +53 -47
  25. package/agents/examples.md +4 -4
  26. package/agents/features.md +1 -1
  27. package/dist/api/auth-middleware.js +1 -1
  28. package/dist/api/auth-routes-invite.js +2 -1
  29. package/dist/api/entity-read-access.d.ts +3 -1
  30. package/dist/api/export/export-columns.d.ts +3 -1
  31. package/dist/api/export/export-route.js +3 -2
  32. package/dist/api/export/export-screen.d.ts +2 -1
  33. package/dist/api/extra-route.d.ts +3 -1
  34. package/dist/api/index.d.ts +23 -27
  35. package/dist/api/index.js +13 -15
  36. package/dist/api/jwt.js +1 -1
  37. package/dist/api/observability-middleware.d.ts +1 -1
  38. package/dist/api/observability-middleware.js +2 -1
  39. package/dist/api/request-context-internals.d.ts +31 -0
  40. package/dist/api/request-context-internals.js +11 -0
  41. package/dist/api/request-context-scopes.d.ts +14 -0
  42. package/dist/api/request-context-scopes.js +69 -0
  43. package/dist/api/request-context.d.ts +1 -40
  44. package/dist/api/request-context.js +22 -51
  45. package/dist/api/request-id-middleware.d.ts +1 -1
  46. package/dist/api/route-registrars.d.ts +2 -1
  47. package/dist/api/route-registrars.js +1 -1
  48. package/dist/api/routes.js +7 -3
  49. package/dist/api/server-boot-checks.d.ts +1 -1
  50. package/dist/api/server-boot-checks.js +2 -2
  51. package/dist/api/server-event-dispatcher.d.ts +6 -1
  52. package/dist/api/server-event-dispatcher.js +3 -4
  53. package/dist/api/server-extra-routes.d.ts +1 -1
  54. package/dist/api/server-extra-routes.js +2 -1
  55. package/dist/api/server-middleware.js +3 -1
  56. package/dist/api/server-routes.d.ts +2 -1
  57. package/dist/api/server-wiring.js +6 -4
  58. package/dist/api/server.d.ts +2 -1
  59. package/dist/api/sse-route.d.ts +2 -1
  60. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  61. package/dist/api/tenant-scoped-secrets.js +13 -0
  62. package/dist/api/websocket-route.d.ts +1 -1
  63. package/dist/auth/index.d.ts +0 -1
  64. package/dist/auth/roles.d.ts +0 -5
  65. package/dist/compliance/duration-spec.d.ts +0 -1
  66. package/dist/compliance/duration-spec.js +0 -5
  67. package/dist/compliance/index.d.ts +4 -4
  68. package/dist/compliance/index.js +2 -2
  69. package/dist/compliance/profiles.d.ts +0 -15
  70. package/dist/compliance/profiles.js +0 -23
  71. package/dist/config/index.d.ts +10 -10
  72. package/dist/config/index.js +13 -1
  73. package/dist/config/internals.d.ts +9 -0
  74. package/dist/config/internals.js +1 -0
  75. package/dist/consumer-cli-internals.d.ts +4 -0
  76. package/dist/consumer-cli-internals.js +1 -0
  77. package/dist/consumer-cli.d.ts +1 -4
  78. package/dist/consumer-cli.js +5 -1
  79. package/dist/crypto/event-pii.js +1 -1
  80. package/dist/crypto/index.d.ts +8 -9
  81. package/dist/crypto/index.js +7 -8
  82. package/dist/crypto/pg-kms-adapter.js +6 -1
  83. package/dist/db/apply-entity-event.d.ts +1 -1
  84. package/dist/db/apply-entity-event.js +15 -47
  85. package/dist/db/blind-index-cleanup.js +91 -77
  86. package/dist/db/collect-table-metas.js +1 -1
  87. package/dist/db/compound-types.d.ts +1 -1
  88. package/dist/db/compound-types.js +0 -7
  89. package/dist/db/config-seed.d.ts +2 -1
  90. package/dist/db/config-seed.js +6 -1
  91. package/dist/db/connection.d.ts +3 -1
  92. package/dist/db/connection.js +15 -5
  93. package/dist/db/cross-tenant-reads.d.ts +1 -1
  94. package/dist/db/cross-tenant-reads.js +1 -1
  95. package/dist/db/dialect.d.ts +0 -5
  96. package/dist/db/dialect.js +0 -3
  97. package/dist/db/driver-value-preparation.js +23 -2
  98. package/dist/db/eagerload.d.ts +2 -1
  99. package/dist/db/entity-field-encryption.d.ts +1 -1
  100. package/dist/db/entity-table-meta.d.ts +1 -1
  101. package/dist/db/event-store-executor-context.d.ts +3 -1
  102. package/dist/db/event-store-executor-context.js +4 -3
  103. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  104. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  105. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  106. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  107. package/dist/db/event-store-executor-read.js +2 -2
  108. package/dist/db/event-store-executor-write-atomic.js +8 -7
  109. package/dist/db/event-store-executor-write-steps.d.ts +3 -2
  110. package/dist/db/event-store-executor-write.js +7 -4
  111. package/dist/db/event-store-executor.d.ts +1 -1
  112. package/dist/db/executor-managed-tables.d.ts +7 -1
  113. package/dist/db/executor-managed-tables.js +11 -2
  114. package/dist/db/index.d.ts +29 -28
  115. package/dist/db/index.js +22 -20
  116. package/dist/db/known-table-names.d.ts +6 -0
  117. package/dist/db/known-table-names.js +21 -0
  118. package/dist/db/list-aggregate-labels.d.ts +1 -1
  119. package/dist/db/located-timestamp.d.ts +1 -1
  120. package/dist/db/located-timestamp.js +0 -5
  121. package/dist/db/migrate-generator.d.ts +17 -1
  122. package/dist/db/migrate-generator.js +50 -20
  123. package/dist/db/migrate-primary-key.d.ts +12 -0
  124. package/dist/db/migrate-primary-key.js +45 -0
  125. package/dist/db/migrate-rls-diff.d.ts +20 -0
  126. package/dist/db/migrate-rls-diff.js +61 -0
  127. package/dist/db/migrate-runner.js +4 -0
  128. package/dist/db/money.d.ts +1 -1
  129. package/dist/db/money.js +1 -1
  130. package/dist/db/parent-ref-clause.d.ts +2 -1
  131. package/dist/db/pg-error.d.ts +2 -0
  132. package/dist/db/pg-error.js +11 -0
  133. package/dist/db/queries/ddl.d.ts +3 -0
  134. package/dist/db/queries/ddl.js +34 -1
  135. package/dist/db/queries/event-store.js +4 -2
  136. package/dist/db/queries/event-tenants.d.ts +2 -0
  137. package/dist/db/queries/event-tenants.js +17 -0
  138. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  139. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  140. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  141. package/dist/db/queries/rls-boot-catalog.js +39 -0
  142. package/dist/db/queries/rls-catalog.d.ts +6 -0
  143. package/dist/db/queries/rls-catalog.js +82 -0
  144. package/dist/db/queries/rls-scope.d.ts +3 -0
  145. package/dist/db/queries/rls-scope.js +17 -0
  146. package/dist/db/queries/rls-shape.d.ts +10 -0
  147. package/dist/db/queries/rls-shape.js +42 -0
  148. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  149. package/dist/db/queries/session-advisory-lock.js +23 -0
  150. package/dist/db/queries/shadow-swap.d.ts +1 -2
  151. package/dist/db/queries/shadow-swap.js +9 -25
  152. package/dist/db/queries/test-stack.d.ts +4 -1
  153. package/dist/db/queries/test-stack.js +84 -2
  154. package/dist/db/query.js +11 -7
  155. package/dist/db/reference-data.d.ts +1 -1
  156. package/dist/db/reference-data.js +6 -1
  157. package/dist/db/render-ddl.d.ts +6 -2
  158. package/dist/db/render-ddl.js +7 -7
  159. package/dist/db/render-rls-ddl.d.ts +35 -0
  160. package/dist/db/render-rls-ddl.js +127 -0
  161. package/dist/db/replay-migration-sql.d.ts +3 -1
  162. package/dist/db/replay-migration-sql.js +22 -5
  163. package/dist/db/replay-rls.d.ts +25 -0
  164. package/dist/db/replay-rls.js +156 -0
  165. package/dist/db/row-level-security-boot-check.d.ts +6 -0
  166. package/dist/db/row-level-security-boot-check.js +86 -0
  167. package/dist/db/row-level-security-connection.d.ts +3 -0
  168. package/dist/db/row-level-security-connection.js +213 -0
  169. package/dist/db/row-level-security-scope.d.ts +33 -0
  170. package/dist/db/row-level-security-scope.js +127 -0
  171. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  172. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  173. package/dist/db/sql-identifier.d.ts +1 -0
  174. package/dist/db/sql-identifier.js +3 -0
  175. package/dist/db/table-builder.d.ts +2 -1
  176. package/dist/db/table-builder.js +1 -1
  177. package/dist/db/table-info.js +1 -1
  178. package/dist/db/table-push.d.ts +11 -2
  179. package/dist/db/table-push.js +15 -2
  180. package/dist/db/tenant-db-runner.d.ts +3 -1
  181. package/dist/db/tenant-db-runner.js +4 -3
  182. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  183. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  184. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  185. package/dist/db/tenant-db-statement-runner.js +48 -0
  186. package/dist/db/tenant-db.d.ts +17 -12
  187. package/dist/db/tenant-db.js +49 -120
  188. package/dist/db/tenant-id-filter.d.ts +3 -0
  189. package/dist/db/tenant-id-filter.js +30 -0
  190. package/dist/db/transaction-serialization.d.ts +6 -0
  191. package/dist/db/transaction-serialization.js +60 -0
  192. package/dist/derivatives/delete-stored-file.js +1 -1
  193. package/dist/derivatives/index.d.ts +2 -5
  194. package/dist/derivatives/index.js +2 -3
  195. package/dist/engine/access.d.ts +2 -1
  196. package/dist/engine/access.js +1 -1
  197. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  198. package/dist/engine/boot-validator/entity-handler.js +1 -1
  199. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
  200. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
  201. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
  202. package/dist/engine/boot-validator/nav.d.ts +3 -1
  203. package/dist/engine/boot-validator/nav.js +1 -1
  204. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  205. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  206. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  207. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  209. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  210. package/dist/engine/boot-validator/screens.d.ts +2 -1
  211. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  212. package/dist/engine/bridge-stub.d.ts +5 -2
  213. package/dist/engine/bridge-stub.js +39 -24
  214. package/dist/engine/config-helpers.d.ts +2 -2
  215. package/dist/engine/config-helpers.js +0 -9
  216. package/dist/engine/constants.d.ts +0 -10
  217. package/dist/engine/constants.js +0 -8
  218. package/dist/engine/create-app.js +1 -1
  219. package/dist/engine/define-feature.d.ts +2 -1
  220. package/dist/engine/define-feature.js +1 -2
  221. package/dist/engine/define-handler.d.ts +1 -1
  222. package/dist/engine/define-step.d.ts +0 -1
  223. package/dist/engine/define-step.js +0 -3
  224. package/dist/engine/embedded-derived.d.ts +1 -1
  225. package/dist/engine/entity-handlers.d.ts +2 -1
  226. package/dist/engine/entity-handlers.js +7 -7
  227. package/dist/engine/entity-list-runtime-options.js +3 -1
  228. package/dist/engine/entity-list-searchability.d.ts +2 -1
  229. package/dist/engine/event-def.d.ts +2 -1
  230. package/dist/engine/event-helpers.d.ts +3 -1
  231. package/dist/engine/event-helpers.js +3 -3
  232. package/dist/engine/extension-names.d.ts +2 -8
  233. package/dist/engine/extension-names.js +2 -2
  234. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  235. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  236. package/dist/engine/extensions/user-data.d.ts +0 -8
  237. package/dist/engine/factories.d.ts +2 -1
  238. package/dist/engine/feature-builder-state.d.ts +8 -1
  239. package/dist/engine/feature-changelog.d.ts +1 -1
  240. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  241. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  242. package/dist/engine/feature-manifest.js +1 -1
  243. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  244. package/dist/engine/feature-ui-extensions.js +6 -4
  245. package/dist/engine/field-access.d.ts +2 -1
  246. package/dist/engine/handler-field-references.d.ts +0 -4
  247. package/dist/engine/index.d.ts +57 -54
  248. package/dist/engine/index.js +22 -27
  249. package/dist/engine/instruction-fields.d.ts +1 -1
  250. package/dist/engine/personal-data-fields.d.ts +1 -1
  251. package/dist/engine/qualified-name.d.ts +0 -1
  252. package/dist/engine/read-claim.d.ts +2 -1
  253. package/dist/engine/registry-facade.js +0 -3
  254. package/dist/engine/registry-ingest.d.ts +2 -1
  255. package/dist/engine/registry-ingest.js +1 -2
  256. package/dist/engine/registry-state.d.ts +12 -2
  257. package/dist/engine/registry-state.js +2 -3
  258. package/dist/engine/registry-validate.d.ts +3 -1
  259. package/dist/engine/registry-validate.js +7 -7
  260. package/dist/engine/run-in.d.ts +1 -1
  261. package/dist/engine/run-in.js +0 -1
  262. package/dist/engine/schema-builder.d.ts +1 -1
  263. package/dist/engine/schema-builder.js +1 -1
  264. package/dist/engine/screen-filter-ops.d.ts +2 -1
  265. package/dist/engine/screen-filter-ops.js +0 -5
  266. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  267. package/dist/engine/soft-delete-cleanup.js +4 -4
  268. package/dist/engine/state-machine.js +2 -1
  269. package/dist/engine/steps/_read-source.js +1 -1
  270. package/dist/engine/steps/aggregate-append-event.js +2 -2
  271. package/dist/engine/steps/call-feature.js +2 -2
  272. package/dist/engine/steps/mail-send.js +1 -1
  273. package/dist/engine/steps/retry.js +1 -1
  274. package/dist/engine/steps/wait-for-event.js +1 -1
  275. package/dist/engine/steps/wait.js +1 -1
  276. package/dist/engine/steps/webhook-send.js +1 -1
  277. package/dist/engine/template-variables.d.ts +2 -1
  278. package/dist/engine/transfer-adjacency.d.ts +1 -1
  279. package/dist/engine/types/index.d.ts +8 -31
  280. package/dist/engine/types/index.js +2 -10
  281. package/dist/engine/validation.d.ts +2 -1
  282. package/dist/entrypoint/index.d.ts +7 -35
  283. package/dist/entrypoint/index.js +7 -1
  284. package/dist/entrypoint/internals.d.ts +40 -0
  285. package/dist/entrypoint/internals.js +1 -0
  286. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  287. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  288. package/dist/env/dry-run-internals.d.ts +10 -0
  289. package/dist/env/dry-run-internals.js +1 -0
  290. package/dist/env/dry-run.d.ts +1 -10
  291. package/dist/env/dry-run.js +2 -1
  292. package/dist/env/index.d.ts +1 -85
  293. package/dist/env/index.js +6 -50
  294. package/dist/env/internals.d.ts +87 -0
  295. package/dist/env/internals.js +53 -0
  296. package/dist/errors/classes.js +2 -2
  297. package/dist/errors/index.d.ts +5 -14
  298. package/dist/errors/index.js +4 -9
  299. package/dist/errors/member-resolution.js +1 -1
  300. package/dist/errors/reasons.d.ts +0 -1
  301. package/dist/errors/reasons.js +7 -7
  302. package/dist/errors/serialize.d.ts +0 -18
  303. package/dist/errors/serialize.js +0 -27
  304. package/dist/es-ops/index.d.ts +4 -4
  305. package/dist/es-ops/index.js +2 -2
  306. package/dist/es-ops/operations-schema.d.ts +1 -1
  307. package/dist/es-ops/types.d.ts +4 -5
  308. package/dist/event-store/admin-api-internals.d.ts +14 -0
  309. package/dist/event-store/admin-api-internals.js +1 -0
  310. package/dist/event-store/admin-api.d.ts +1 -14
  311. package/dist/event-store/admin-api.js +11 -6
  312. package/dist/event-store/archive.js +4 -2
  313. package/dist/event-store/errors.js +2 -2
  314. package/dist/event-store/event-store.js +41 -34
  315. package/dist/event-store/events-schema.js +4 -1
  316. package/dist/event-store/index.d.ts +11 -13
  317. package/dist/event-store/index.js +7 -9
  318. package/dist/event-store/rebuild-dead-letter.js +4 -2
  319. package/dist/event-store/snapshot.js +4 -3
  320. package/dist/event-store/stream-scope.d.ts +2 -0
  321. package/dist/event-store/stream-scope.js +6 -0
  322. package/dist/event-store/upcaster-dead-letter.js +4 -2
  323. package/dist/event-store/upcaster.d.ts +2 -1
  324. package/dist/files/action-form-upload.d.ts +2 -1
  325. package/dist/files/action-form-upload.js +1 -1
  326. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  327. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  328. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  329. package/dist/files/bind-pending-file-refs.js +2 -1
  330. package/dist/files/bind-referenced-files.write.js +1 -1
  331. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  332. package/dist/files/create-file-ref-from-bytes.js +3 -3
  333. package/dist/files/create-file-ref.d.ts +3 -2
  334. package/dist/files/create-file-ref.js +2 -2
  335. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  336. package/dist/files/dispose-removed-file-refs.js +1 -1
  337. package/dist/files/feature.js +2 -2
  338. package/dist/files/file-handle.js +1 -1
  339. package/dist/files/file-routes.d.ts +1 -1
  340. package/dist/files/file-routes.js +12 -2
  341. package/dist/files/index.d.ts +11 -13
  342. package/dist/files/index.js +5 -7
  343. package/dist/files/load-save-file-refs.d.ts +2 -1
  344. package/dist/files/load-save-file-refs.js +1 -1
  345. package/dist/files/provider-resolver.d.ts +5 -4
  346. package/dist/files/provider-resolver.js +4 -4
  347. package/dist/files/storage-tracking.js +4 -2
  348. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  349. package/dist/files/sweep-orphaned-uploads.js +1 -1
  350. package/dist/i18n/index.d.ts +2 -8
  351. package/dist/i18n/index.js +1 -1
  352. package/dist/i18n/internals.d.ts +7 -0
  353. package/dist/i18n/internals.js +1 -0
  354. package/dist/i18n/required-surface-keys.d.ts +4 -1
  355. package/dist/internal/row-level-security.d.ts +3 -0
  356. package/dist/internal/row-level-security.js +3 -0
  357. package/dist/internal/stack-support.d.ts +1 -1
  358. package/dist/internal/stack-support.js +1 -1
  359. package/dist/internal/testing.d.ts +1 -0
  360. package/dist/internal/testing.js +9 -5
  361. package/dist/jobs/index.d.ts +1 -1
  362. package/dist/jobs/job-append-event.d.ts +12 -0
  363. package/dist/jobs/job-append-event.js +30 -0
  364. package/dist/jobs/job-runner-context.d.ts +2 -2
  365. package/dist/jobs/job-runner-context.js +46 -16
  366. package/dist/jobs/job-runner-execution.d.ts +1 -1
  367. package/dist/jobs/job-runner-execution.js +6 -4
  368. package/dist/jobs/job-runner-gates.d.ts +1 -1
  369. package/dist/jobs/job-runner-gates.js +0 -1
  370. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  371. package/dist/jobs/job-runner-helpers.js +10 -1
  372. package/dist/jobs/job-runner-scope.d.ts +5 -2
  373. package/dist/jobs/job-runner-types.d.ts +2 -1
  374. package/dist/jobs/job-runner.js +19 -6
  375. package/dist/jobs/max-per-tenant.d.ts +1 -1
  376. package/dist/logging/index.d.ts +1 -2
  377. package/dist/logging/index.js +1 -1
  378. package/dist/logging/pino-logger.js +1 -1
  379. package/dist/logging/utils.d.ts +1 -0
  380. package/dist/logging/utils.js +6 -0
  381. package/dist/migrations/index.d.ts +3 -3
  382. package/dist/migrations/index.js +3 -3
  383. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  384. package/dist/migrations/pending-rebuilds.js +1 -1
  385. package/dist/migrations/pii-event-backfill.js +4 -1
  386. package/dist/observability/escape-hatch-report.d.ts +2 -1
  387. package/dist/observability/index.d.ts +7 -15
  388. package/dist/observability/index.js +4 -12
  389. package/dist/observability/metric-validator.js +1 -1
  390. package/dist/observability/metrics-handle.d.ts +0 -1
  391. package/dist/observability/metrics-handle.js +2 -15
  392. package/dist/observability/recording-tracer.d.ts +1 -2
  393. package/dist/observability/recording-tracer.js +0 -6
  394. package/dist/observability/sensitive-filter.d.ts +0 -2
  395. package/dist/observability/sensitive-filter.js +0 -29
  396. package/dist/pipeline/active-membership.d.ts +2 -1
  397. package/dist/pipeline/active-membership.js +6 -2
  398. package/dist/pipeline/append-event-core.d.ts +2 -1
  399. package/dist/pipeline/append-event-core.js +2 -2
  400. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  401. package/dist/pipeline/attach-outside-transaction.js +13 -0
  402. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  403. package/dist/pipeline/cascade-handler.d.ts +2 -1
  404. package/dist/pipeline/cascade-handler.js +3 -2
  405. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  406. package/dist/pipeline/config-accessor-factory.js +1 -1
  407. package/dist/pipeline/context-services.d.ts +56 -0
  408. package/dist/pipeline/context-services.js +73 -0
  409. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  410. package/dist/pipeline/dispatch-batch.js +31 -18
  411. package/dist/pipeline/dispatch-query.js +5 -4
  412. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  413. package/dist/pipeline/dispatch-scope.js +27 -0
  414. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  415. package/dist/pipeline/dispatch-shared.js +75 -198
  416. package/dist/pipeline/dispatch-stream.js +8 -4
  417. package/dist/pipeline/dispatch-write.d.ts +2 -1
  418. package/dist/pipeline/dispatch-write.js +10 -8
  419. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  420. package/dist/pipeline/dispatcher-utils.js +8 -2
  421. package/dist/pipeline/dispatcher.d.ts +3 -2
  422. package/dist/pipeline/dispatcher.js +4 -3
  423. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  424. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  425. package/dist/pipeline/event-dispatcher-delivery.js +4 -2
  426. package/dist/pipeline/event-dispatcher.d.ts +2 -2
  427. package/dist/pipeline/event-dispatcher.js +7 -3
  428. package/dist/pipeline/event-retention.js +59 -56
  429. package/dist/pipeline/handler-access-error.js +2 -1
  430. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  431. package/dist/pipeline/handler-context-auth.js +7 -4
  432. package/dist/pipeline/handler-context-config.d.ts +2 -5
  433. package/dist/pipeline/handler-context-config.js +2 -2
  434. package/dist/pipeline/handler-context-db.d.ts +32 -7
  435. package/dist/pipeline/handler-context-db.js +26 -17
  436. package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
  437. package/dist/pipeline/handler-context-dispatch.js +9 -8
  438. package/dist/pipeline/handler-context-events.d.ts +22 -36
  439. package/dist/pipeline/handler-context-events.js +36 -31
  440. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  441. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  442. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  443. package/dist/pipeline/handler-context-notify.js +1 -1
  444. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  445. package/dist/pipeline/handler-context-observability.js +7 -5
  446. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  447. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  448. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  449. package/dist/pipeline/handler-context-scope.js +18 -20
  450. package/dist/pipeline/index.d.ts +9 -21
  451. package/dist/pipeline/index.js +5 -7
  452. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  453. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  454. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  455. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  456. package/dist/pipeline/member-read-only-transaction.js +11 -3
  457. package/dist/pipeline/member-reader.d.ts +1 -1
  458. package/dist/pipeline/member-reader.js +2 -2
  459. package/dist/pipeline/msp-rebuild.js +5 -3
  460. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  461. package/dist/pipeline/notify-scope.d.ts +2 -1
  462. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  463. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  464. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  465. package/dist/pipeline/projection-rebuild.js +12 -5
  466. package/dist/pipeline/projection-state.d.ts +0 -6
  467. package/dist/pipeline/projection-state.js +0 -5
  468. package/dist/pipeline/projections-runner.d.ts +2 -1
  469. package/dist/pipeline/projections-runner.js +10 -6
  470. package/dist/pipeline/system-hooks.d.ts +3 -1
  471. package/dist/pipeline/system-hooks.js +6 -4
  472. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  473. package/dist/pipeline/system-identity-switch.js +51 -36
  474. package/dist/pipeline/typed-append-event.d.ts +2 -0
  475. package/dist/pipeline/typed-append-event.js +4 -0
  476. package/dist/pipeline/write-origin.js +2 -2
  477. package/dist/pipeline/write-result-masking.d.ts +1 -1
  478. package/dist/random/index.d.ts +1 -2
  479. package/dist/random/index.js +1 -2
  480. package/dist/rate-limit/bucket.d.ts +2 -1
  481. package/dist/rate-limit/middleware.js +2 -1
  482. package/dist/redis/index.d.ts +3 -4
  483. package/dist/redis/index.js +2 -2
  484. package/dist/schema-cli/apply-command.js +5 -2
  485. package/dist/schema-cli/baseline-command.js +7 -2
  486. package/dist/schema-cli/generate-command.js +7 -9
  487. package/dist/schema-cli/shared.d.ts +12 -2
  488. package/dist/schema-cli/shared.js +24 -2
  489. package/dist/schema-cli/status-command.js +8 -2
  490. package/dist/schema-cli/validate-command.js +48 -4
  491. package/dist/schema-cli.d.ts +0 -1
  492. package/dist/search/configure-tenant-index.d.ts +1 -3
  493. package/dist/search/configure-tenant-index.js +0 -4
  494. package/dist/search/index.d.ts +1 -4
  495. package/dist/search/index.js +0 -2
  496. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  497. package/dist/search/meilisearch-adapter-internals.js +9 -0
  498. package/dist/search/meilisearch-adapter.d.ts +1 -8
  499. package/dist/search/meilisearch-adapter.js +6 -7
  500. package/dist/search/meilisearch-peer.d.ts +2 -0
  501. package/dist/search/meilisearch-peer.js +5 -0
  502. package/dist/search/reindex-entity.js +93 -87
  503. package/dist/secrets/index.d.ts +3 -4
  504. package/dist/secrets/index.js +2 -3
  505. package/dist/seeding/index.d.ts +2 -2
  506. package/dist/seeding/index.js +1 -2
  507. package/dist/time/index.d.ts +2 -2
  508. package/dist/time/index.js +1 -1
  509. package/dist/time/tz-context.d.ts +0 -5
  510. package/dist/time/tz-context.js +0 -9
  511. package/dist/ui-types/index.d.ts +8 -11
  512. package/dist/ui-types/index.js +3 -3
  513. package/dist/upgrade-changelog.d.ts +3 -2
  514. package/dist/upgrade-changelog.js +12 -8
  515. package/dist/upgrade-cli-internals.d.ts +8 -0
  516. package/dist/upgrade-cli-internals.js +63 -0
  517. package/dist/upgrade-cli.d.ts +2 -9
  518. package/dist/upgrade-cli.js +28 -70
  519. package/dist/utils/import-optional-peer.d.ts +6 -0
  520. package/dist/utils/import-optional-peer.js +19 -0
  521. package/dist/utils/index.d.ts +1 -4
  522. package/dist/utils/index.js +1 -4
  523. package/package.json +23 -19
  524. package/src/changes.json +236 -0
  525. package/dist/crypto/request-kms-cache.d.ts +0 -8
  526. package/dist/crypto/request-kms-cache.js +0 -21
  527. package/dist/engine/codemod/index.d.ts +0 -2
  528. package/dist/engine/codemod/index.js +0 -1
  529. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  530. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  531. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  532. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  533. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  534. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  535. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  536. package/dist/engine/feature-ast/extractors/events.js +0 -275
  537. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  538. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  539. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  540. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  541. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  542. package/dist/engine/feature-ast/extractors/index.js +0 -13
  543. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  544. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  545. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  546. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  547. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  548. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  549. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
  550. package/dist/engine/feature-ast/extractors/round1.js +0 -87
  551. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  552. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  553. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  554. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  555. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  556. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  557. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  558. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  559. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  560. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  561. package/dist/engine/feature-ast/index.d.ts +0 -16
  562. package/dist/engine/feature-ast/index.js +0 -10
  563. package/dist/engine/feature-ast/parse.d.ts +0 -31
  564. package/dist/engine/feature-ast/parse.js +0 -485
  565. package/dist/engine/feature-ast/patch.d.ts +0 -212
  566. package/dist/engine/feature-ast/patch.js +0 -611
  567. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  568. package/dist/engine/feature-ast/patcher.js +0 -281
  569. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
  570. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
  571. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  572. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
  573. package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
  574. package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
  575. package/dist/engine/feature-ast/patterns.d.ts +0 -322
  576. package/dist/engine/feature-ast/patterns.js +0 -107
  577. package/dist/engine/feature-ast/render.d.ts +0 -47
  578. package/dist/engine/feature-ast/render.js +0 -666
  579. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  580. package/dist/engine/feature-ast/source-location.js +0 -27
  581. package/dist/engine/pattern-library/index.d.ts +0 -2
  582. package/dist/engine/pattern-library/index.js +0 -3
  583. package/dist/engine/pattern-library/library.d.ts +0 -14
  584. package/dist/engine/pattern-library/library.js +0 -94
  585. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  586. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  587. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  588. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  589. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  590. package/dist/engine/pattern-library/shared-fields.js +0 -88
  591. package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
  592. package/dist/engine/pattern-library/static-schemas.js +0 -487
  593. package/dist/engine/pattern-library/types.d.ts +0 -158
  594. package/dist/engine/pattern-library/types.js +0 -36
  595. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  596. package/dist/engine/resolve-config-or-param.js +0 -76
  597. package/src/scripts/codemod/README.md +0 -187
  598. package/src/scripts/codemod/codemod-support.ts +0 -334
  599. package/src/scripts/codemod/collect-source-files.ts +0 -48
  600. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  601. package/src/scripts/codemod/db-factory.ts +0 -810
  602. package/src/scripts/codemod/feature-factory.ts +0 -429
  603. package/src/scripts/codemod/feature-layout.ts +0 -424
  604. package/src/scripts/codemod/import-extensions.ts +0 -118
  605. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  606. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  607. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  608. package/src/scripts/codemod/object-form.ts +0 -746
  609. package/src/scripts/codemod/package-merge.ts +0 -299
  610. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  611. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  612. package/src/scripts/codemod/s3-imports.ts +0 -236
  613. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  614. package/src/scripts/codemod/testing-injection.ts +0 -215
  615. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  616. package/src/scripts/codemod/testing-move.ts +0 -542
  617. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -1,6 +1,7 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
2
  import { lockEventConsumersShareMode } from "../db/queries/event-consumer.js";
3
3
  import { deleteMany, selectMany, transaction } from "../db/query.js";
4
+ import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
4
5
  import { eventsTable } from "../event-store/index.js";
5
6
  import { eventConsumerStateTable } from "./event-consumer-state.js";
6
7
  export class ConsumerLagError extends Error {
@@ -27,64 +28,66 @@ function resolveCutoff(opts) {
27
28
  return Temporal.Now.instant().subtract({ hours: days * 24 });
28
29
  }
29
30
  export async function pruneEvents(db, options) {
30
- const cutoff = resolveCutoff(options);
31
- if (!options.aggregateTypes || options.aggregateTypes.length === 0) {
32
- throw new Error("pruneEvents: aggregateTypes is required and must be non-empty. Pruning the event log is destructive — name the aggregate types to delete explicitly.");
33
- }
34
- if (options.aggregateIds !== undefined && options.aggregateIds.length === 0) {
35
- throw new Error("pruneEvents: aggregateIds must be non-empty when set.");
36
- }
37
- if (options.batchSize !== undefined &&
38
- (!Number.isInteger(options.batchSize) || options.batchSize < 1)) {
39
- throw new Error("pruneEvents: batchSize must be a positive integer.");
40
- }
41
- const aggregateTypes = options.aggregateTypes;
42
- const aggregateIds = options.aggregateIds;
43
- const dryRun = options.dryRun === true;
44
- return transaction(db, async (tx) => {
45
- // Serialise against consumer-bootstrap INSERTs. Without this, the race
46
- // is: prune reads consumers (snapshot misses a consumer bootstrapping
47
- // in a parallel tx) → consumer commits its row with
48
- // lastProcessedEventId=0 → prune deletes events below its new cursor
49
- // → first pass of the new consumer silently skips the deleted events.
50
- //
51
- // SHARE is the lightest table-mode that conflicts with ROW EXCLUSIVE
52
- // (the mode INSERT/UPDATE/DELETE take). Concurrent INSERTs on the
53
- // consumer table queue until this TX commits; concurrent UPDATEs
54
- // (cursor advances) do too, but prune is measured in milliseconds and
55
- // pausing cursor advances for that window is cheap insurance against
56
- // a silent data-loss bug.
57
- await lockEventConsumersShareMode(tx);
58
- // Step 1 — collect candidate event ids.
59
- const candidates = await selectMany(tx, eventsTable, {
60
- aggregateType: [...aggregateTypes],
61
- ...(aggregateIds ? { aggregateId: [...aggregateIds] } : {}),
62
- createdAt: { lt: cutoff },
63
- }, options.batchSize === undefined
64
- ? undefined
65
- : { orderBy: { col: "id", direction: "asc" }, limit: options.batchSize });
66
- if (candidates.length === 0) {
67
- return { deletedCount: 0, cutoff, aggregateTypes, dryRun };
31
+ return runInSystemRowLevelSecurityScope("event retention pruning deletes expired events of all tenants", async () => {
32
+ const cutoff = resolveCutoff(options);
33
+ if (!options.aggregateTypes || options.aggregateTypes.length === 0) {
34
+ throw new Error("pruneEvents: aggregateTypes is required and must be non-empty. Pruning the event log is destructive — name the aggregate types to delete explicitly.");
68
35
  }
69
- const maxCandidateId = candidates.reduce((acc, row) => (row.id > acc ? row.id : acc), candidates[0]?.id ?? 0n);
70
- // Step 2 — safety guard: check every ACTIVE consumer has moved past
71
- // the candidate set. Disabled consumers are intentionally excluded —
72
- // ops disables them precisely to park them while pruning happens.
73
- // The SHARE lock above guarantees this SELECT sees a complete view:
74
- // no new consumer can INSERT a fresh-cursor row between here and the
75
- // DELETE below.
76
- const activeConsumers = await selectMany(tx, eventConsumerStateTable, { status: { ne: "disabled" } });
77
- for (const consumer of activeConsumers) {
78
- if (consumer.lastProcessedEventId < maxCandidateId) {
79
- throw new ConsumerLagError(consumer.name, consumer.lastProcessedEventId, maxCandidateId);
80
- }
36
+ if (options.aggregateIds !== undefined && options.aggregateIds.length === 0) {
37
+ throw new Error("pruneEvents: aggregateIds must be non-empty when set.");
81
38
  }
82
- if (dryRun) {
83
- return { deletedCount: candidates.length, cutoff, aggregateTypes, dryRun: true };
39
+ if (options.batchSize !== undefined &&
40
+ (!Number.isInteger(options.batchSize) || options.batchSize < 1)) {
41
+ throw new Error("pruneEvents: batchSize must be a positive integer.");
84
42
  }
85
- // Step 3 — actual delete, bounded to the candidate set.
86
- const candidateIds = candidates.map((c) => c.id);
87
- await deleteMany(tx, eventsTable, { id: candidateIds });
88
- return { deletedCount: candidateIds.length, cutoff, aggregateTypes, dryRun: false };
43
+ const aggregateTypes = options.aggregateTypes;
44
+ const aggregateIds = options.aggregateIds;
45
+ const dryRun = options.dryRun === true;
46
+ return transaction(db, async (tx) => {
47
+ // Serialise against consumer-bootstrap INSERTs. Without this, the race
48
+ // is: prune reads consumers (snapshot misses a consumer bootstrapping
49
+ // in a parallel tx) → consumer commits its row with
50
+ // lastProcessedEventId=0 → prune deletes events below its new cursor
51
+ // → first pass of the new consumer silently skips the deleted events.
52
+ //
53
+ // SHARE is the lightest table-mode that conflicts with ROW EXCLUSIVE
54
+ // (the mode INSERT/UPDATE/DELETE take). Concurrent INSERTs on the
55
+ // consumer table queue until this TX commits; concurrent UPDATEs
56
+ // (cursor advances) do too, but prune is measured in milliseconds and
57
+ // pausing cursor advances for that window is cheap insurance against
58
+ // a silent data-loss bug.
59
+ await lockEventConsumersShareMode(tx);
60
+ // Step 1 — collect candidate event ids.
61
+ const candidates = await selectMany(tx, eventsTable, {
62
+ aggregateType: [...aggregateTypes],
63
+ ...(aggregateIds ? { aggregateId: [...aggregateIds] } : {}),
64
+ createdAt: { lt: cutoff },
65
+ }, options.batchSize === undefined
66
+ ? undefined
67
+ : { orderBy: { col: "id", direction: "asc" }, limit: options.batchSize });
68
+ if (candidates.length === 0) {
69
+ return { deletedCount: 0, cutoff, aggregateTypes, dryRun };
70
+ }
71
+ const maxCandidateId = candidates.reduce((acc, row) => (row.id > acc ? row.id : acc), candidates[0]?.id ?? 0n);
72
+ // Step 2 — safety guard: check every ACTIVE consumer has moved past
73
+ // the candidate set. Disabled consumers are intentionally excluded —
74
+ // ops disables them precisely to park them while pruning happens.
75
+ // The SHARE lock above guarantees this SELECT sees a complete view:
76
+ // no new consumer can INSERT a fresh-cursor row between here and the
77
+ // DELETE below.
78
+ const activeConsumers = await selectMany(tx, eventConsumerStateTable, { status: { ne: "disabled" } });
79
+ for (const consumer of activeConsumers) {
80
+ if (consumer.lastProcessedEventId < maxCandidateId) {
81
+ throw new ConsumerLagError(consumer.name, consumer.lastProcessedEventId, maxCandidateId);
82
+ }
83
+ }
84
+ if (dryRun) {
85
+ return { deletedCount: candidates.length, cutoff, aggregateTypes, dryRun: true };
86
+ }
87
+ // Step 3 — actual delete, bounded to the candidate set.
88
+ const candidateIds = candidates.map((c) => c.id);
89
+ await deleteMany(tx, eventsTable, { id: candidateIds });
90
+ return { deletedCount: candidateIds.length, cutoff, aggregateTypes, dryRun: false };
91
+ });
89
92
  });
90
93
  }
@@ -1,5 +1,6 @@
1
1
  import { isAnonymousSessionUser } from "../engine/system-user.js";
2
- import { AccessDeniedError, UnauthenticatedError } from "../errors/index.js";
2
+ import { UnauthenticatedError } from "../errors/classes.js";
3
+ import { AccessDeniedError } from "../errors/index.js";
3
4
  // Anonymous callers get 401 so a client whose session lapsed (browser dropped
4
5
  // the expired auth cookie) can tell "sign in again" apart from "signed in but
5
6
  // not allowed", which stays 403.
@@ -1,9 +1,8 @@
1
- import type { TenantId } from "../engine/types/identifiers.ts";
2
- import type { MemberReader, SessionUser } from "../engine/types/index.ts";
1
+ import type { MemberReader } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { HandlerAuth } from "../engine/types/index.ts";
3
3
  import type { HandlerContextScope } from "./handler-context-scope.ts";
4
4
  export declare function buildAuthFacet(scope: HandlerContextScope): {
5
- resolveAuthClaims: (claimsUser: SessionUser) => Promise<Record<string, unknown>>;
6
- resolveActiveMembership: (userId: string, tenantId: TenantId) => Promise<import("@cosmicdrift/kumiko-types/handlers").ActiveMembershipResult>;
7
- queryAsMember: MemberReader;
8
- hasFeature: (featureName: string) => Promise<boolean>;
5
+ readonly auth: HandlerAuth;
6
+ readonly queryAsMember: MemberReader;
7
+ readonly hasFeature: (featureName: string) => Promise<boolean>;
9
8
  };
@@ -12,13 +12,13 @@ export function buildAuthFacet(scope) {
12
12
  ungatedMemberReader ??= createMemberReaderFn(ctx, user.tenantId, tx);
13
13
  return ungatedMemberReader(userId, qn, payload);
14
14
  }, { ...identitySwitchAudit, tenantId: user.tenantId });
15
- return {
15
+ const auth = {
16
16
  // Thin pass-through: one resolve impl lives on the dispatcher, the
17
17
  // handler surface just forwards the call so both entry points (login
18
- // handler via ctx.resolveAuthClaims, switch-tenant route via
18
+ // handler via ctx.auth.resolveClaims, switch-tenant route via
19
19
  // dispatcher.resolveAuthClaims) cannot drift.
20
- resolveAuthClaims: (claimsUser) => resolveAuthClaimsFn(ctx, claimsUser), // @wrapper-known semantic-alias
21
- // Thin pass-through, same reasoning as resolveAuthClaims above — one
20
+ resolveClaims: (claimsUser) => resolveAuthClaimsFn(ctx, claimsUser), // @wrapper-known semantic-alias
21
+ // Thin pass-through, same reasoning as resolveClaims above — one
22
22
  // resolve impl lives on the dispatcher so callers can't drift apart.
23
23
  // Internally queries memberships as SYSTEM, so it needs the same grant
24
24
  // as a SYSTEM queryAs/writeAs (r.systemScope() or escapeHatch).
@@ -27,6 +27,9 @@ export function buildAuthFacet(scope) {
27
27
  throw systemIdentitySwitchDenied(`handler "${type}"`);
28
28
  return resolveActiveMembershipFn(ctx, userId, tenantId, INTERACTIVE_SIGN_IN_POLICY); // @wrapper-known semantic-alias
29
29
  },
30
+ };
31
+ return {
32
+ auth,
30
33
  // Needs the same grant as a SYSTEM queryAs.
31
34
  queryAsMember,
32
35
  // Feature-effective check for in-handler opt-in logic. Scope:
@@ -1,14 +1,11 @@
1
+ import type { ConfigAccessor } from "@cosmicdrift/kumiko-types/config";
1
2
  import { type TenantDb } from "../db/tenant-db.ts";
2
3
  import type { TenantId } from "../engine/types/identifiers.ts";
3
- import type { ConfigAccessor } from "../engine/types/index.ts";
4
4
  import { createTzContext } from "../time/index.ts";
5
5
  import type { HandlerContextScope } from "./handler-context-scope.ts";
6
6
  export declare function buildConfigFacet(scope: HandlerContextScope, db: TenantDb | undefined): {
7
7
  config: ConfigAccessor | undefined;
8
- fragment: {
9
- config?: ConfigAccessor | undefined;
10
- configFor?: ((targetTenantId: TenantId) => ConfigAccessor) | undefined;
11
- };
8
+ configFor: ((targetTenantId: TenantId) => ConfigAccessor) | undefined;
12
9
  };
13
10
  export declare function resolveHandlerTz(scope: HandlerContextScope, config: ConfigAccessor | undefined): Promise<ReturnType<typeof createTzContext>>;
14
11
  export declare function resolveHandlerLocale(scope: HandlerContextScope): string;
@@ -18,7 +18,7 @@ function buildConfigFor(scope, configFactory, config) {
18
18
  return config;
19
19
  if (!isSystemIdentity(user) && !user.roles.includes("SystemAdmin")) {
20
20
  throw new AccessDeniedError({
21
- message: "ctx.configFor(otherTenant) requires the system role or SystemAdmin",
21
+ message: "ctx.tenants.config(otherTenant) requires the system role or SystemAdmin",
22
22
  details: { reason: "config_for_requires_system_admin" },
23
23
  });
24
24
  }
@@ -50,7 +50,7 @@ export function buildConfigFacet(scope, db) {
50
50
  })
51
51
  : undefined;
52
52
  const configFor = buildConfigFor(scope, configFactory, config);
53
- return { config, fragment: { ...(config && { config }), ...(configFor && { configFor }) } };
53
+ return { config, configFor };
54
54
  }
55
55
  async function readTenantTimezone(scope, config) {
56
56
  const { ctx, user, tx } = scope;
@@ -1,23 +1,48 @@
1
+ import type { TenantWriteTarget } from "@cosmicdrift/kumiko-types/handlers";
1
2
  import type { DbConnection, DbTx } from "../db/connection.ts";
2
3
  import { type TenantDb } from "../db/tenant-db.ts";
3
4
  import type { TenantId } from "../engine/types/identifiers.ts";
4
- import type { TenantWriteTarget } from "../engine/types/index.ts";
5
5
  import type { HandlerContextScope } from "./handler-context-scope.ts";
6
6
  export declare function buildTenantScopedDb(scope: HandlerContextScope, source: DbConnection | DbTx, signal: AbortSignal | undefined, foreignTenantId?: TenantId, denyWrites?: boolean): TenantDb;
7
7
  export declare function buildHandlerDbFacet(scope: HandlerContextScope): {
8
8
  db: TenantDb | undefined;
9
- exposedDb: TenantDb | undefined;
9
+ exposedDb: ({
10
+ readonly tenantId: TenantId;
11
+ readonly mode: import("@cosmicdrift/kumiko-types/tenant-db-types").TenantDbMode;
12
+ unsafeRaw(): import("@cosmicdrift/kumiko-types/db-connection").DbRunner;
13
+ global<TTable extends (import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta) & import("@cosmicdrift/kumiko-types/tenancy-brand").TenancyBrand<"global">>(table: TTable): import("@cosmicdrift/kumiko-types/tenant-db-types").GlobalTableDb<TTable>;
14
+ selectMany<T = Record<string, unknown>>(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, where?: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject, options?: import("@cosmicdrift/kumiko-types/where-clause-types").SelectOptions): Promise<readonly T[]>;
15
+ fetchOne<T = Record<string, unknown>>(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, where: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject): Promise<T | undefined>;
16
+ count(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, where?: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject): Promise<number>;
17
+ advisoryXactLock(namespace: number, key: string): Promise<void>;
18
+ databaseNow(): Promise<Date>;
19
+ aggregate(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, spec: import("@cosmicdrift/kumiko-types/aggregate-types").AggregateSpec, where?: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject): Promise<readonly import("@cosmicdrift/kumiko-types/aggregate-types").AggregateRow[]>;
20
+ upsert<T = Record<string, unknown>>(table: import("@cosmicdrift/kumiko-types/executor-brand").WritableTable, values: Record<string, unknown>, options: import("@cosmicdrift/kumiko-types/tenant-db-types").TenantDbUpsertOptions): Promise<T | undefined>;
21
+ } & import("@cosmicdrift/kumiko-types/tenant-db-types").TenantDbWrites<import("@cosmicdrift/kumiko-types/executor-brand").WritableTable> & {
22
+ readonly outsideTransaction: TenantDb | undefined;
23
+ }) | undefined;
10
24
  outsideTxSource: DbConnection | undefined;
11
25
  fragment: {
12
- db: TenantDb | undefined;
13
- dbOutsideTransaction: TenantDb | undefined;
26
+ db: ({
27
+ readonly tenantId: TenantId;
28
+ readonly mode: import("@cosmicdrift/kumiko-types/tenant-db-types").TenantDbMode;
29
+ unsafeRaw(): import("@cosmicdrift/kumiko-types/db-connection").DbRunner;
30
+ global<TTable extends (import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta) & import("@cosmicdrift/kumiko-types/tenancy-brand").TenancyBrand<"global">>(table: TTable): import("@cosmicdrift/kumiko-types/tenant-db-types").GlobalTableDb<TTable>;
31
+ selectMany<T = Record<string, unknown>>(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, where?: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject, options?: import("@cosmicdrift/kumiko-types/where-clause-types").SelectOptions): Promise<readonly T[]>;
32
+ fetchOne<T = Record<string, unknown>>(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, where: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject): Promise<T | undefined>;
33
+ count(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, where?: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject): Promise<number>;
34
+ advisoryXactLock(namespace: number, key: string): Promise<void>;
35
+ databaseNow(): Promise<Date>;
36
+ aggregate(table: import("@cosmicdrift/kumiko-types/schema-table-types").SchemaTable | import("@cosmicdrift/kumiko-types/entity-table-meta-types").EntityTableMeta, spec: import("@cosmicdrift/kumiko-types/aggregate-types").AggregateSpec, where?: import("@cosmicdrift/kumiko-types/where-clause-types").WhereObject): Promise<readonly import("@cosmicdrift/kumiko-types/aggregate-types").AggregateRow[]>;
37
+ upsert<T = Record<string, unknown>>(table: import("@cosmicdrift/kumiko-types/executor-brand").WritableTable, values: Record<string, unknown>, options: import("@cosmicdrift/kumiko-types/tenant-db-types").TenantDbUpsertOptions): Promise<T | undefined>;
38
+ } & import("@cosmicdrift/kumiko-types/tenant-db-types").TenantDbWrites<import("@cosmicdrift/kumiko-types/executor-brand").WritableTable> & {
39
+ readonly outsideTransaction: TenantDb | undefined;
40
+ }) | undefined;
14
41
  systemDb?: import("@cosmicdrift/kumiko-types/tenant-db-types").UncheckedSystemDb | undefined;
15
42
  crossTenantReads?: import("@cosmicdrift/kumiko-types/tenant-db-types").CrossTenantReads | undefined;
16
43
  };
17
44
  };
18
- export declare function buildForTenantFragment(scope: HandlerContextScope, exposedDb: TenantDb | undefined, readOnlyForTenant: boolean): {
19
- forTenant?: ((targetTenantId: TenantId) => TenantWriteTarget) | undefined;
20
- };
45
+ export declare function buildWriteTarget(scope: HandlerContextScope, exposedDb: TenantDb | undefined, readOnlyForTenant: boolean): ((targetTenantId: TenantId) => TenantWriteTarget) | undefined;
21
46
  export declare function buildFileFragment(scope: HandlerContextScope, db: TenantDb | undefined): {
22
47
  files?: import("@cosmicdrift/kumiko-types/file-handle-types").FileContext | undefined;
23
48
  derivatives?: import("@cosmicdrift/kumiko-types/derivatives-types").DerivativesContext | undefined;
@@ -1,19 +1,19 @@
1
1
  import { crossTenantReadsGrantFor, escapeHatchFor } from "@cosmicdrift/kumiko-types/handlers";
2
- import { isAgentToolCallScope } from "../api/request-context.js";
2
+ import { isAgentToolCallScope } from "../api/request-context-scopes.js";
3
3
  import { createHandlerCrossTenantReads } from "../db/cross-tenant-reads.js";
4
4
  import { createTenantDb, createUncheckedSystemDb } from "../db/tenant-db.js";
5
5
  import { createDerivativesContext } from "../derivatives/derivatives-context.js";
6
6
  import { mayOverrideTenant } from "../engine/cross-tenant.js";
7
7
  import { AccessDeniedError, FrameworkReasons } from "../errors/index.js";
8
8
  import { createTenantFileContext } from "../files/file-handle.js";
9
+ import { attachOutsideTransaction } from "./attach-outside-transaction.js";
9
10
  import { createSystemScopedDbGuard, isMemberResolutionPrincipal, resolveAppPoolDb, } from "./dispatch-shared.js";
10
11
  import { buildPersonalDataGate } from "./write-origin.js";
11
12
  export function buildTenantScopedDb(scope, source, signal, foreignTenantId, denyWrites = false) {
12
13
  const { user, context, registry, origin, isSystem, writeEscapeHatch, handlerEscapeHatch } = scope;
13
- return createTenantDb({
14
+ const options = {
14
15
  db: source,
15
16
  tenantId: foreignTenantId ?? user.tenantId,
16
- mode: isSystem && foreignTenantId === undefined ? "system" : "tenant",
17
17
  tracer: context.tracer,
18
18
  meter: context.meter,
19
19
  signal,
@@ -28,7 +28,14 @@ export function buildTenantScopedDb(scope, source, signal, foreignTenantId, deny
28
28
  projectionRegistry: registry,
29
29
  ...(denyWrites && { writesDeniedReason: "without an open transaction" }),
30
30
  },
31
- });
31
+ };
32
+ return isSystem && foreignTenantId === undefined
33
+ ? createTenantDb({
34
+ ...options,
35
+ mode: "system",
36
+ reason: "system-scope handler dispatch reads and writes across tenants by design",
37
+ })
38
+ : createTenantDb(options);
32
39
  }
33
40
  function buildHandlerCrossTenantReads(scope) {
34
41
  const { user, context, registry, origin, dbSource, reqCtx, handlerEscapeHatch } = scope;
@@ -77,26 +84,28 @@ export function buildHandlerDbFacet(scope) {
77
84
  ? createUncheckedSystemDb(db, rawDbOutsideTransaction, scope.reportEscapeHatch)
78
85
  : undefined;
79
86
  const crossTenantReads = buildHandlerCrossTenantReads(scope);
87
+ // Same fail-closed treatment as `exposedDb` — a system handler reaching
88
+ // ctx.db.outsideTransaction directly would be a second, unguarded door to
89
+ // the same cross-tenant access ctx.db closes off.
90
+ const dbOutsideTransaction = isSystem && rawDbOutsideTransaction
91
+ ? createSystemScopedDbGuard(type, "db.outsideTransaction", "ctx.systemDb.outsideTransaction.assertTenantMatch(...) or " +
92
+ "ctx.systemDb.outsideTransaction.acknowledgeCrossTenant(...)")
93
+ : rawDbOutsideTransaction;
80
94
  // Exposed as ctx.db below — the internal `db` above stays the real,
81
95
  // working TenantDb for config/derivatives accessors and systemDb
82
96
  // construction.
83
- const exposedDb = isSystem && db
97
+ const unattachedExposedDb = isSystem && db
84
98
  ? createSystemScopedDbGuard(type, "db", "ctx.systemDb.assertTenantMatch(...) or ctx.systemDb.acknowledgeCrossTenant(...)")
85
99
  : db;
86
- // Same fail-closed treatment as `exposedDb` — a system handler reaching
87
- // ctx.dbOutsideTransaction directly would be a second, unguarded door to
88
- // the same cross-tenant access ctx.db closes off above.
89
- const dbOutsideTransaction = isSystem && rawDbOutsideTransaction
90
- ? createSystemScopedDbGuard(type, "dbOutsideTransaction", "ctx.systemDb.outsideTransaction.assertTenantMatch(...) or " +
91
- "ctx.systemDb.outsideTransaction.acknowledgeCrossTenant(...)")
92
- : rawDbOutsideTransaction;
100
+ const exposedDb = unattachedExposedDb
101
+ ? attachOutsideTransaction(unattachedExposedDb, dbOutsideTransaction)
102
+ : undefined;
93
103
  return {
94
104
  db,
95
105
  exposedDb,
96
106
  outsideTxSource,
97
107
  fragment: {
98
108
  db: exposedDb,
99
- dbOutsideTransaction,
100
109
  ...(systemDb && { systemDb }),
101
110
  ...(crossTenantReads && { crossTenantReads }),
102
111
  },
@@ -106,7 +115,7 @@ export function buildHandlerDbFacet(scope) {
106
115
  // dispatcher's tenantIdOverride predicate, so no caller reaches more than it could via
107
116
  // tenantIdOverride. The foreign db carries no unsafeRaw/globalWrites grant and is tenant mode
108
117
  // bound to the target; the executor accepts streamTenantId only on a db bound to that tenant.
109
- export function buildForTenantFragment(scope, exposedDb, readOnlyForTenant) {
118
+ export function buildWriteTarget(scope, exposedDb, readOnlyForTenant) {
110
119
  const { user, isSystem, dbSource, isWriteHandler, reqCtx, denyDbWrites, isPerCommand } = scope;
111
120
  const forTenant = !isSystem && dbSource && isWriteHandler
112
121
  ? (targetTenantId) => {
@@ -128,9 +137,9 @@ export function buildForTenantFragment(scope, exposedDb, readOnlyForTenant) {
128
137
  };
129
138
  }
130
139
  : undefined;
131
- return { ...(forTenant && { forTenant }) };
140
+ return forTenant;
132
141
  }
133
- // ctx.files resolved per-tenant through file-foundation (lazy — the
142
+ // ctx.services.files resolved per-tenant through file-foundation (lazy — the
134
143
  // provider is only resolved when a handle actually does I/O). Boot wires
135
144
  // _fileProviderResolver when a file-provider plugin is mounted; falls back
136
145
  // to a statically-injected context.files (tests).
@@ -138,7 +147,7 @@ export function buildFileFragment(scope, db) {
138
147
  const { context, registry, user } = scope;
139
148
  const fileResolver = context._fileProviderResolver;
140
149
  const files = fileResolver ? createTenantFileContext(fileResolver, user.tenantId) : context.files;
141
- // ctx.derivatives builds on ctx.files (needs a FileContext to read the
150
+ // ctx.services.derivatives builds on ctx.services.files (needs a FileContext to read the
142
151
  // original + write the variant) plus db (to look up the FileRef row) — so
143
152
  // it can only be constructed exactly when files+db both resolved; falls
144
153
  // back to a statically-injected context.derivatives otherwise (tests).
@@ -1,6 +1,7 @@
1
- import type { WriteResult } from "../engine/types/index.ts";
1
+ import type { WriteResult } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { HandlerDispatch } from "../engine/types/index.ts";
2
3
  import { type AfterRollbackHook } from "./after-rollback-sink.ts";
3
- import { type HandlerTransactionScope } from "./dispatch-shared.ts";
4
+ import type { HandlerTransactionScope } from "./dispatch-shared.ts";
4
5
  import { type AfterCommitHook } from "./dispatcher-utils.ts";
5
6
  import type { HandlerContextScope } from "./handler-context-scope.ts";
6
7
  export type CommitSinks = {
@@ -9,15 +10,20 @@ export type CommitSinks = {
9
10
  readonly notifyCommitSink: AfterCommitHook[] | undefined;
10
11
  };
11
12
  export declare function createCommitSinks(afterCommitHooks: AfterCommitHook[] | undefined, transactionScope: HandlerTransactionScope, outerNotifySink: AfterCommitHook[] | undefined): CommitSinks;
12
- export declare function buildDispatchFacet(scope: HandlerContextScope, sinks: CommitSinks): {
13
- bridge: {
13
+ export type DispatchFacetInput = Pick<HandlerDispatch, "queryAsMember" | "queryProjection">;
14
+ export declare function buildDispatchFacet(scope: HandlerContextScope, sinks: CommitSinks, readers: DispatchFacetInput): {
15
+ dispatch: {
16
+ queryAsMember: import("@cosmicdrift/kumiko-types/handlers").MemberReader;
17
+ queryProjection: <T = Record<string, unknown>>(qualifiedName: string, options?: {
18
+ readonly unsafeAllTenants?: boolean;
19
+ }) => Promise<readonly T[]>;
14
20
  query: (targetType: string, payload: unknown) => Promise<unknown>;
15
21
  queryAs: import("./system-identity-switch.ts").QueryAsFn;
16
22
  write: (targetType: string, payload: unknown) => Promise<WriteResult>;
17
23
  writeAs: import("./system-identity-switch.ts").WriteAsFn;
18
24
  };
19
- scheduleFragment: {
20
- scheduleAfterCommit?: ((hook: AfterCommitHook) => void) | undefined;
21
- scheduleAfterRollback?: ((hook: AfterRollbackHook) => void) | undefined;
25
+ commitHooks: {
26
+ afterCommit?: ((hook: AfterCommitHook) => void) | undefined;
27
+ afterRollback?: ((hook: AfterRollbackHook) => void) | undefined;
22
28
  };
23
29
  };
@@ -1,15 +1,15 @@
1
- import { runWithWriteOrigin } from "../api/request-context.js";
1
+ import { runWithWriteOrigin } from "../api/request-context-scopes.js";
2
2
  import { runInSavepoint } from "../db/query.js";
3
3
  import { writeFailure } from "../errors/index.js";
4
4
  import { afterRollbackHooksOf, carrySavepointRollbackHooks, } from "./after-rollback-sink.js";
5
5
  import { runBatch, unwrapSingle } from "./dispatch-batch.js";
6
6
  import { executeQuery } from "./dispatch-query.js";
7
- import { perCommandNestedDenied } from "./dispatch-shared.js";
8
7
  import { executeWrite } from "./dispatch-write.js";
9
8
  import { isFailedWriteResult, NestedWriteRollback, } from "./dispatcher-utils.js";
9
+ import { perCommandNestedDenied } from "./handler-context-phase-denials.js";
10
10
  import { createGatedIdentitySwitch } from "./system-identity-switch.js";
11
11
  export function createCommitSinks(afterCommitHooks, transactionScope, outerNotifySink) {
12
- // Cross-feature bridge: ctx.query/write share the current tx + afterCommitHooks sink.
12
+ // Cross-feature bridge: ctx.dispatch.query/write share the current tx + afterCommitHooks sink.
13
13
  // queryAs/writeAs to anyone but the caller itself needs r.systemScope() or { escapeHatch } (system-identity-switch.ts).
14
14
  const bridgeSink = afterCommitHooks ?? [];
15
15
  // Query bridges and post-commit contexts get a throwaway sink: hooks pushed there never run.
@@ -63,7 +63,7 @@ function createSerializedNestedWriter(scope, sinks) {
63
63
  return run;
64
64
  };
65
65
  }
66
- export function buildDispatchFacet(scope, sinks) {
66
+ export function buildDispatchFacet(scope, sinks, readers) {
67
67
  const { ctx, type, user, origin, tx, transactionScope, hasIdentitySwitchGrant, identitySwitchAudit, } = scope;
68
68
  const scheduleAfterCommit = (hook) => {
69
69
  sinks.bridgeSink.push(hook);
@@ -85,17 +85,18 @@ export function buildDispatchFacet(scope, sinks) {
85
85
  writeAs: writeAsUser,
86
86
  }, identitySwitchAudit);
87
87
  return {
88
- bridge: {
88
+ dispatch: {
89
+ ...readers,
89
90
  query: (targetType, payload) => executeQuery(ctx, targetType, payload, user, origin, tx, sinks.notifyCommitSink), // @wrapper-known semantic-alias
90
91
  queryAs: identitySwitch.queryAs,
91
92
  write: (targetType, payload) => writeAsUser(user, targetType, payload),
92
93
  writeAs: identitySwitch.writeAs,
93
94
  },
94
- scheduleFragment: {
95
- ...(sinks.hasLiveCommitSink && { scheduleAfterCommit }),
95
+ commitHooks: {
96
+ ...(sinks.hasLiveCommitSink && { afterCommit: scheduleAfterCommit }),
96
97
  // perCommand and no-tx paths have earlier commands already committed: nothing to compensate on rollback.
97
98
  ...(sinks.hasLiveCommitSink &&
98
- transactionScope === "inTransaction" && { scheduleAfterRollback }),
99
+ transactionScope === "inTransaction" && { afterRollback: scheduleAfterRollback }),
99
100
  },
100
101
  };
101
102
  }
@@ -1,41 +1,27 @@
1
- import type { AggregateStreamHandle, AppendEventArgs, AppendEventFn, FetchForWritingArgs, HandlerContext } from "../engine/types/index.ts";
1
+ import type { AppendEventArgs } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { HandlerEvents } from "../engine/types/index.ts";
2
3
  import { IdempotentAppendConflictError as EventStoreIdempotentAppendConflictError, VersionConflictError as EventStoreVersionConflictError } from "../event-store/errors.ts";
3
4
  import { type StoredEvent } from "../event-store/event-store.ts";
4
- import { type LoadAggregateWithSnapshotOptions, type LoadAggregateWithSnapshotResult, type SnapshotReducer } from "../event-store/snapshot.ts";
5
5
  import type { HandlerContextScope } from "./handler-context-scope.ts";
6
+ import { type ProjectionReader } from "./system-identity-switch.ts";
7
+ declare function buildTryAppendEvent(scope: HandlerContextScope): (args: AppendEventArgs) => Promise<{
8
+ ok: true;
9
+ event: StoredEvent;
10
+ conflict?: undefined;
11
+ } | {
12
+ event?: undefined;
13
+ ok: false;
14
+ conflict: EventStoreVersionConflictError;
15
+ } | {
16
+ event?: undefined;
17
+ ok: false;
18
+ conflict: EventStoreIdempotentAppendConflictError;
19
+ }>;
20
+ type EventsFacet = Omit<HandlerEvents, "tryAppend"> & {
21
+ readonly tryAppend: ReturnType<typeof buildTryAppendEvent>;
22
+ };
6
23
  export declare function buildEventStoreFacet(scope: HandlerContextScope): {
7
- appendEvent: AppendEventFn;
8
- unsafeAppendEvent: (args: AppendEventArgs) => Promise<void>;
9
- tryAppendEvent: (args: AppendEventArgs) => Promise<{
10
- ok: true;
11
- event: StoredEvent;
12
- conflict?: undefined;
13
- } | {
14
- event?: undefined;
15
- ok: false;
16
- conflict: EventStoreVersionConflictError;
17
- } | {
18
- event?: undefined;
19
- ok: false;
20
- conflict: EventStoreIdempotentAppendConflictError;
21
- }>;
22
- fetchForWriting: (args: FetchForWritingArgs) => Promise<AggregateStreamHandle>;
23
- loadAggregate: (aggregateId: string, loadOptions?: Parameters<HandlerContext["loadAggregate"]>[1]) => Promise<readonly StoredEvent[]>;
24
- archiveStream: (aggregateId: string, archiveArgs: {
25
- readonly aggregateType: string;
26
- readonly reason?: string;
27
- }) => Promise<void>;
28
- restoreStream: (aggregateId: string) => Promise<void>;
29
- isStreamArchived: (aggregateId: string) => Promise<boolean>;
30
- snapshotAggregate: (snapshotArgs: {
31
- readonly aggregateId: string;
32
- readonly aggregateType: string;
33
- readonly version: number;
34
- readonly state: Record<string, unknown>;
35
- readonly snapshotVersion?: number;
36
- }) => Promise<void>;
37
- loadAggregateWithSnapshot: <TState extends Record<string, unknown>>(aggregateId: string, reducer: SnapshotReducer<TState>, initial: TState, loadOptions?: Omit<LoadAggregateWithSnapshotOptions, "upcastEvent" | "entityEventVersionOf">) => Promise<LoadAggregateWithSnapshotResult<TState>>;
38
- queryProjection: <T = Record<string, unknown>>(qualifiedName: string, options?: {
39
- readonly unsafeAllTenants?: boolean;
40
- }) => Promise<readonly T[]>;
24
+ readonly events: EventsFacet;
25
+ readonly queryProjection: ProjectionReader;
41
26
  };
27
+ export {};