@cosmicdrift/kumiko-framework 0.389.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 (616) 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/eagerload.d.ts +2 -1
  98. package/dist/db/entity-field-encryption.d.ts +1 -1
  99. package/dist/db/entity-table-meta.d.ts +1 -1
  100. package/dist/db/event-store-executor-context.d.ts +3 -1
  101. package/dist/db/event-store-executor-context.js +4 -3
  102. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  103. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  104. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  105. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  106. package/dist/db/event-store-executor-read.js +2 -2
  107. package/dist/db/event-store-executor-write-atomic.js +8 -7
  108. package/dist/db/event-store-executor-write-steps.d.ts +3 -2
  109. package/dist/db/event-store-executor-write.js +7 -4
  110. package/dist/db/event-store-executor.d.ts +1 -1
  111. package/dist/db/executor-managed-tables.d.ts +7 -1
  112. package/dist/db/executor-managed-tables.js +11 -2
  113. package/dist/db/index.d.ts +29 -28
  114. package/dist/db/index.js +22 -20
  115. package/dist/db/known-table-names.d.ts +6 -0
  116. package/dist/db/known-table-names.js +21 -0
  117. package/dist/db/list-aggregate-labels.d.ts +1 -1
  118. package/dist/db/located-timestamp.d.ts +1 -1
  119. package/dist/db/located-timestamp.js +0 -5
  120. package/dist/db/migrate-generator.d.ts +17 -1
  121. package/dist/db/migrate-generator.js +50 -20
  122. package/dist/db/migrate-primary-key.d.ts +12 -0
  123. package/dist/db/migrate-primary-key.js +45 -0
  124. package/dist/db/migrate-rls-diff.d.ts +20 -0
  125. package/dist/db/migrate-rls-diff.js +61 -0
  126. package/dist/db/migrate-runner.js +4 -0
  127. package/dist/db/money.d.ts +1 -1
  128. package/dist/db/money.js +1 -1
  129. package/dist/db/parent-ref-clause.d.ts +2 -1
  130. package/dist/db/pg-error.d.ts +2 -0
  131. package/dist/db/pg-error.js +11 -0
  132. package/dist/db/queries/ddl.d.ts +3 -0
  133. package/dist/db/queries/ddl.js +34 -1
  134. package/dist/db/queries/event-store.js +4 -2
  135. package/dist/db/queries/event-tenants.d.ts +2 -0
  136. package/dist/db/queries/event-tenants.js +17 -0
  137. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  138. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  139. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  140. package/dist/db/queries/rls-boot-catalog.js +39 -0
  141. package/dist/db/queries/rls-catalog.d.ts +6 -0
  142. package/dist/db/queries/rls-catalog.js +82 -0
  143. package/dist/db/queries/rls-scope.d.ts +3 -0
  144. package/dist/db/queries/rls-scope.js +17 -0
  145. package/dist/db/queries/rls-shape.d.ts +10 -0
  146. package/dist/db/queries/rls-shape.js +42 -0
  147. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  148. package/dist/db/queries/session-advisory-lock.js +23 -0
  149. package/dist/db/queries/shadow-swap.d.ts +1 -2
  150. package/dist/db/queries/shadow-swap.js +9 -25
  151. package/dist/db/queries/test-stack.d.ts +4 -1
  152. package/dist/db/queries/test-stack.js +83 -2
  153. package/dist/db/query.js +11 -7
  154. package/dist/db/reference-data.d.ts +1 -1
  155. package/dist/db/reference-data.js +6 -1
  156. package/dist/db/render-ddl.d.ts +6 -2
  157. package/dist/db/render-ddl.js +7 -7
  158. package/dist/db/render-rls-ddl.d.ts +35 -0
  159. package/dist/db/render-rls-ddl.js +127 -0
  160. package/dist/db/replay-migration-sql.d.ts +3 -1
  161. package/dist/db/replay-migration-sql.js +22 -5
  162. package/dist/db/replay-rls.d.ts +25 -0
  163. package/dist/db/replay-rls.js +156 -0
  164. package/dist/db/row-level-security-boot-check.d.ts +5 -0
  165. package/dist/db/row-level-security-boot-check.js +85 -0
  166. package/dist/db/row-level-security-connection.d.ts +3 -0
  167. package/dist/db/row-level-security-connection.js +213 -0
  168. package/dist/db/row-level-security-scope.d.ts +33 -0
  169. package/dist/db/row-level-security-scope.js +127 -0
  170. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  171. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  172. package/dist/db/sql-identifier.d.ts +1 -0
  173. package/dist/db/sql-identifier.js +3 -0
  174. package/dist/db/table-builder.d.ts +2 -1
  175. package/dist/db/table-builder.js +1 -1
  176. package/dist/db/table-info.js +1 -1
  177. package/dist/db/table-push.d.ts +11 -2
  178. package/dist/db/table-push.js +15 -2
  179. package/dist/db/tenant-db-runner.d.ts +3 -1
  180. package/dist/db/tenant-db-runner.js +4 -3
  181. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  182. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  183. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  184. package/dist/db/tenant-db-statement-runner.js +48 -0
  185. package/dist/db/tenant-db.d.ts +17 -12
  186. package/dist/db/tenant-db.js +49 -120
  187. package/dist/db/tenant-id-filter.d.ts +3 -0
  188. package/dist/db/tenant-id-filter.js +30 -0
  189. package/dist/db/transaction-serialization.d.ts +6 -0
  190. package/dist/db/transaction-serialization.js +60 -0
  191. package/dist/derivatives/delete-stored-file.js +1 -1
  192. package/dist/derivatives/index.d.ts +2 -5
  193. package/dist/derivatives/index.js +2 -3
  194. package/dist/engine/access.d.ts +2 -1
  195. package/dist/engine/access.js +1 -1
  196. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  197. package/dist/engine/boot-validator/entity-handler.js +1 -1
  198. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
  199. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
  200. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
  201. package/dist/engine/boot-validator/nav.d.ts +3 -1
  202. package/dist/engine/boot-validator/nav.js +1 -1
  203. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  204. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  205. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  206. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  207. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  209. package/dist/engine/boot-validator/screens.d.ts +2 -1
  210. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  211. package/dist/engine/bridge-stub.d.ts +5 -2
  212. package/dist/engine/bridge-stub.js +39 -24
  213. package/dist/engine/config-helpers.d.ts +2 -2
  214. package/dist/engine/config-helpers.js +0 -9
  215. package/dist/engine/constants.d.ts +0 -10
  216. package/dist/engine/constants.js +0 -8
  217. package/dist/engine/create-app.js +1 -1
  218. package/dist/engine/define-feature.d.ts +2 -1
  219. package/dist/engine/define-feature.js +1 -2
  220. package/dist/engine/define-handler.d.ts +1 -1
  221. package/dist/engine/define-step.d.ts +0 -1
  222. package/dist/engine/define-step.js +0 -3
  223. package/dist/engine/embedded-derived.d.ts +1 -1
  224. package/dist/engine/entity-handlers.d.ts +2 -1
  225. package/dist/engine/entity-handlers.js +7 -7
  226. package/dist/engine/entity-list-runtime-options.js +3 -1
  227. package/dist/engine/entity-list-searchability.d.ts +2 -1
  228. package/dist/engine/event-def.d.ts +2 -1
  229. package/dist/engine/event-helpers.d.ts +3 -1
  230. package/dist/engine/event-helpers.js +3 -3
  231. package/dist/engine/extension-names.d.ts +2 -8
  232. package/dist/engine/extension-names.js +2 -2
  233. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  234. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  235. package/dist/engine/extensions/user-data.d.ts +0 -8
  236. package/dist/engine/factories.d.ts +2 -1
  237. package/dist/engine/feature-builder-state.d.ts +8 -1
  238. package/dist/engine/feature-changelog.d.ts +1 -1
  239. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  240. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  241. package/dist/engine/feature-manifest.js +1 -1
  242. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  243. package/dist/engine/feature-ui-extensions.js +6 -4
  244. package/dist/engine/field-access.d.ts +2 -1
  245. package/dist/engine/handler-field-references.d.ts +0 -4
  246. package/dist/engine/index.d.ts +57 -54
  247. package/dist/engine/index.js +22 -27
  248. package/dist/engine/instruction-fields.d.ts +1 -1
  249. package/dist/engine/personal-data-fields.d.ts +1 -1
  250. package/dist/engine/qualified-name.d.ts +0 -1
  251. package/dist/engine/read-claim.d.ts +2 -1
  252. package/dist/engine/registry-facade.js +0 -3
  253. package/dist/engine/registry-ingest.d.ts +2 -1
  254. package/dist/engine/registry-ingest.js +1 -2
  255. package/dist/engine/registry-state.d.ts +12 -2
  256. package/dist/engine/registry-state.js +2 -3
  257. package/dist/engine/registry-validate.d.ts +3 -1
  258. package/dist/engine/registry-validate.js +7 -7
  259. package/dist/engine/run-in.d.ts +1 -1
  260. package/dist/engine/run-in.js +0 -1
  261. package/dist/engine/schema-builder.d.ts +1 -1
  262. package/dist/engine/schema-builder.js +1 -1
  263. package/dist/engine/screen-filter-ops.d.ts +2 -1
  264. package/dist/engine/screen-filter-ops.js +0 -5
  265. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  266. package/dist/engine/soft-delete-cleanup.js +4 -4
  267. package/dist/engine/state-machine.js +2 -1
  268. package/dist/engine/steps/_read-source.js +1 -1
  269. package/dist/engine/steps/aggregate-append-event.js +2 -2
  270. package/dist/engine/steps/call-feature.js +2 -2
  271. package/dist/engine/steps/mail-send.js +1 -1
  272. package/dist/engine/steps/retry.js +1 -1
  273. package/dist/engine/steps/wait-for-event.js +1 -1
  274. package/dist/engine/steps/wait.js +1 -1
  275. package/dist/engine/steps/webhook-send.js +1 -1
  276. package/dist/engine/template-variables.d.ts +2 -1
  277. package/dist/engine/transfer-adjacency.d.ts +1 -1
  278. package/dist/engine/types/index.d.ts +8 -31
  279. package/dist/engine/types/index.js +2 -10
  280. package/dist/engine/validation.d.ts +2 -1
  281. package/dist/entrypoint/index.d.ts +7 -35
  282. package/dist/entrypoint/index.js +7 -1
  283. package/dist/entrypoint/internals.d.ts +40 -0
  284. package/dist/entrypoint/internals.js +1 -0
  285. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  286. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  287. package/dist/env/dry-run-internals.d.ts +10 -0
  288. package/dist/env/dry-run-internals.js +1 -0
  289. package/dist/env/dry-run.d.ts +1 -10
  290. package/dist/env/dry-run.js +2 -1
  291. package/dist/env/index.d.ts +1 -85
  292. package/dist/env/index.js +6 -50
  293. package/dist/env/internals.d.ts +87 -0
  294. package/dist/env/internals.js +53 -0
  295. package/dist/errors/classes.js +2 -2
  296. package/dist/errors/index.d.ts +5 -14
  297. package/dist/errors/index.js +4 -9
  298. package/dist/errors/member-resolution.js +1 -1
  299. package/dist/errors/reasons.d.ts +0 -1
  300. package/dist/errors/reasons.js +7 -7
  301. package/dist/errors/serialize.d.ts +0 -18
  302. package/dist/errors/serialize.js +0 -27
  303. package/dist/es-ops/index.d.ts +4 -4
  304. package/dist/es-ops/index.js +2 -2
  305. package/dist/es-ops/operations-schema.d.ts +1 -1
  306. package/dist/es-ops/types.d.ts +4 -5
  307. package/dist/event-store/admin-api-internals.d.ts +14 -0
  308. package/dist/event-store/admin-api-internals.js +1 -0
  309. package/dist/event-store/admin-api.d.ts +1 -14
  310. package/dist/event-store/admin-api.js +11 -6
  311. package/dist/event-store/archive.js +4 -2
  312. package/dist/event-store/errors.js +2 -2
  313. package/dist/event-store/event-store.js +41 -34
  314. package/dist/event-store/events-schema.js +4 -1
  315. package/dist/event-store/index.d.ts +11 -13
  316. package/dist/event-store/index.js +7 -9
  317. package/dist/event-store/rebuild-dead-letter.js +4 -2
  318. package/dist/event-store/snapshot.js +4 -3
  319. package/dist/event-store/stream-scope.d.ts +2 -0
  320. package/dist/event-store/stream-scope.js +6 -0
  321. package/dist/event-store/upcaster-dead-letter.js +4 -2
  322. package/dist/event-store/upcaster.d.ts +2 -1
  323. package/dist/files/action-form-upload.d.ts +2 -1
  324. package/dist/files/action-form-upload.js +1 -1
  325. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  326. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  327. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  328. package/dist/files/bind-pending-file-refs.js +2 -1
  329. package/dist/files/bind-referenced-files.write.js +1 -1
  330. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  331. package/dist/files/create-file-ref-from-bytes.js +3 -3
  332. package/dist/files/create-file-ref.d.ts +3 -2
  333. package/dist/files/create-file-ref.js +2 -2
  334. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  335. package/dist/files/dispose-removed-file-refs.js +1 -1
  336. package/dist/files/feature.js +2 -2
  337. package/dist/files/file-handle.js +1 -1
  338. package/dist/files/file-routes.d.ts +1 -1
  339. package/dist/files/file-routes.js +12 -2
  340. package/dist/files/index.d.ts +11 -13
  341. package/dist/files/index.js +5 -7
  342. package/dist/files/load-save-file-refs.d.ts +2 -1
  343. package/dist/files/load-save-file-refs.js +1 -1
  344. package/dist/files/provider-resolver.d.ts +5 -4
  345. package/dist/files/provider-resolver.js +4 -4
  346. package/dist/files/storage-tracking.js +4 -2
  347. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  348. package/dist/files/sweep-orphaned-uploads.js +1 -1
  349. package/dist/i18n/index.d.ts +2 -8
  350. package/dist/i18n/index.js +1 -1
  351. package/dist/i18n/internals.d.ts +7 -0
  352. package/dist/i18n/internals.js +1 -0
  353. package/dist/i18n/required-surface-keys.d.ts +4 -1
  354. package/dist/internal/row-level-security.d.ts +3 -0
  355. package/dist/internal/row-level-security.js +3 -0
  356. package/dist/internal/stack-support.d.ts +1 -1
  357. package/dist/internal/stack-support.js +1 -1
  358. package/dist/internal/testing.d.ts +1 -0
  359. package/dist/internal/testing.js +9 -5
  360. package/dist/jobs/index.d.ts +1 -1
  361. package/dist/jobs/job-append-event.d.ts +12 -0
  362. package/dist/jobs/job-append-event.js +30 -0
  363. package/dist/jobs/job-runner-context.d.ts +2 -2
  364. package/dist/jobs/job-runner-context.js +46 -16
  365. package/dist/jobs/job-runner-execution.d.ts +1 -1
  366. package/dist/jobs/job-runner-execution.js +6 -4
  367. package/dist/jobs/job-runner-gates.d.ts +1 -1
  368. package/dist/jobs/job-runner-gates.js +0 -1
  369. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  370. package/dist/jobs/job-runner-helpers.js +10 -1
  371. package/dist/jobs/job-runner-scope.d.ts +5 -2
  372. package/dist/jobs/job-runner-types.d.ts +2 -1
  373. package/dist/jobs/job-runner.js +19 -6
  374. package/dist/jobs/max-per-tenant.d.ts +1 -1
  375. package/dist/logging/index.d.ts +1 -2
  376. package/dist/logging/index.js +1 -1
  377. package/dist/logging/pino-logger.js +1 -1
  378. package/dist/logging/utils.d.ts +1 -0
  379. package/dist/logging/utils.js +6 -0
  380. package/dist/migrations/index.d.ts +3 -3
  381. package/dist/migrations/index.js +3 -3
  382. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  383. package/dist/migrations/pending-rebuilds.js +1 -1
  384. package/dist/migrations/pii-event-backfill.js +4 -1
  385. package/dist/observability/escape-hatch-report.d.ts +2 -1
  386. package/dist/observability/index.d.ts +7 -15
  387. package/dist/observability/index.js +4 -12
  388. package/dist/observability/metric-validator.js +1 -1
  389. package/dist/observability/metrics-handle.d.ts +0 -1
  390. package/dist/observability/metrics-handle.js +2 -15
  391. package/dist/observability/recording-tracer.d.ts +1 -2
  392. package/dist/observability/recording-tracer.js +0 -6
  393. package/dist/observability/sensitive-filter.d.ts +0 -2
  394. package/dist/observability/sensitive-filter.js +0 -29
  395. package/dist/pipeline/active-membership.d.ts +2 -1
  396. package/dist/pipeline/active-membership.js +6 -2
  397. package/dist/pipeline/append-event-core.d.ts +2 -1
  398. package/dist/pipeline/append-event-core.js +2 -2
  399. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  400. package/dist/pipeline/attach-outside-transaction.js +13 -0
  401. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  402. package/dist/pipeline/cascade-handler.d.ts +2 -1
  403. package/dist/pipeline/cascade-handler.js +3 -2
  404. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  405. package/dist/pipeline/config-accessor-factory.js +1 -1
  406. package/dist/pipeline/context-services.d.ts +56 -0
  407. package/dist/pipeline/context-services.js +73 -0
  408. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  409. package/dist/pipeline/dispatch-batch.js +31 -18
  410. package/dist/pipeline/dispatch-query.js +5 -4
  411. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  412. package/dist/pipeline/dispatch-scope.js +27 -0
  413. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  414. package/dist/pipeline/dispatch-shared.js +75 -198
  415. package/dist/pipeline/dispatch-stream.js +8 -4
  416. package/dist/pipeline/dispatch-write.d.ts +2 -1
  417. package/dist/pipeline/dispatch-write.js +10 -8
  418. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  419. package/dist/pipeline/dispatcher-utils.js +8 -2
  420. package/dist/pipeline/dispatcher.d.ts +3 -2
  421. package/dist/pipeline/dispatcher.js +4 -3
  422. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  423. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  424. package/dist/pipeline/event-dispatcher-delivery.js +4 -2
  425. package/dist/pipeline/event-dispatcher.d.ts +2 -2
  426. package/dist/pipeline/event-dispatcher.js +7 -3
  427. package/dist/pipeline/event-retention.js +59 -56
  428. package/dist/pipeline/handler-access-error.js +2 -1
  429. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  430. package/dist/pipeline/handler-context-auth.js +7 -4
  431. package/dist/pipeline/handler-context-config.d.ts +2 -5
  432. package/dist/pipeline/handler-context-config.js +2 -2
  433. package/dist/pipeline/handler-context-db.d.ts +32 -7
  434. package/dist/pipeline/handler-context-db.js +26 -17
  435. package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
  436. package/dist/pipeline/handler-context-dispatch.js +9 -8
  437. package/dist/pipeline/handler-context-events.d.ts +22 -36
  438. package/dist/pipeline/handler-context-events.js +36 -31
  439. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  440. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  441. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  442. package/dist/pipeline/handler-context-notify.js +1 -1
  443. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  444. package/dist/pipeline/handler-context-observability.js +7 -5
  445. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  446. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  447. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  448. package/dist/pipeline/handler-context-scope.js +18 -20
  449. package/dist/pipeline/index.d.ts +9 -21
  450. package/dist/pipeline/index.js +5 -7
  451. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  452. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  453. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  454. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  455. package/dist/pipeline/member-read-only-transaction.js +11 -3
  456. package/dist/pipeline/member-reader.d.ts +1 -1
  457. package/dist/pipeline/member-reader.js +2 -2
  458. package/dist/pipeline/msp-rebuild.js +5 -3
  459. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  460. package/dist/pipeline/notify-scope.d.ts +2 -1
  461. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  462. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  463. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  464. package/dist/pipeline/projection-rebuild.js +12 -5
  465. package/dist/pipeline/projection-state.d.ts +0 -6
  466. package/dist/pipeline/projection-state.js +0 -5
  467. package/dist/pipeline/projections-runner.d.ts +2 -1
  468. package/dist/pipeline/projections-runner.js +10 -6
  469. package/dist/pipeline/system-hooks.d.ts +3 -1
  470. package/dist/pipeline/system-hooks.js +6 -4
  471. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  472. package/dist/pipeline/system-identity-switch.js +51 -36
  473. package/dist/pipeline/typed-append-event.d.ts +2 -0
  474. package/dist/pipeline/typed-append-event.js +4 -0
  475. package/dist/pipeline/write-origin.js +2 -2
  476. package/dist/pipeline/write-result-masking.d.ts +1 -1
  477. package/dist/random/index.d.ts +1 -2
  478. package/dist/random/index.js +1 -2
  479. package/dist/rate-limit/bucket.d.ts +2 -1
  480. package/dist/rate-limit/middleware.js +2 -1
  481. package/dist/redis/index.d.ts +3 -4
  482. package/dist/redis/index.js +2 -2
  483. package/dist/schema-cli/apply-command.js +5 -2
  484. package/dist/schema-cli/baseline-command.js +7 -2
  485. package/dist/schema-cli/generate-command.js +7 -9
  486. package/dist/schema-cli/shared.d.ts +4 -0
  487. package/dist/schema-cli/shared.js +21 -2
  488. package/dist/schema-cli/status-command.js +8 -2
  489. package/dist/schema-cli/validate-command.js +52 -4
  490. package/dist/schema-cli.d.ts +0 -1
  491. package/dist/search/configure-tenant-index.d.ts +1 -3
  492. package/dist/search/configure-tenant-index.js +0 -4
  493. package/dist/search/index.d.ts +1 -4
  494. package/dist/search/index.js +0 -2
  495. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  496. package/dist/search/meilisearch-adapter-internals.js +9 -0
  497. package/dist/search/meilisearch-adapter.d.ts +1 -8
  498. package/dist/search/meilisearch-adapter.js +6 -7
  499. package/dist/search/meilisearch-peer.d.ts +2 -0
  500. package/dist/search/meilisearch-peer.js +5 -0
  501. package/dist/search/reindex-entity.js +93 -87
  502. package/dist/secrets/index.d.ts +3 -4
  503. package/dist/secrets/index.js +2 -3
  504. package/dist/seeding/index.d.ts +2 -2
  505. package/dist/seeding/index.js +1 -2
  506. package/dist/time/index.d.ts +2 -2
  507. package/dist/time/index.js +1 -1
  508. package/dist/time/tz-context.d.ts +0 -5
  509. package/dist/time/tz-context.js +0 -9
  510. package/dist/ui-types/index.d.ts +8 -11
  511. package/dist/ui-types/index.js +3 -3
  512. package/dist/upgrade-changelog.d.ts +3 -2
  513. package/dist/upgrade-changelog.js +12 -8
  514. package/dist/upgrade-cli-internals.d.ts +8 -0
  515. package/dist/upgrade-cli-internals.js +63 -0
  516. package/dist/upgrade-cli.d.ts +1 -9
  517. package/dist/upgrade-cli.js +10 -64
  518. package/dist/utils/import-optional-peer.d.ts +6 -0
  519. package/dist/utils/import-optional-peer.js +19 -0
  520. package/dist/utils/index.d.ts +1 -4
  521. package/dist/utils/index.js +1 -4
  522. package/package.json +22 -18
  523. package/src/changes.json +206 -0
  524. package/dist/crypto/request-kms-cache.d.ts +0 -8
  525. package/dist/crypto/request-kms-cache.js +0 -21
  526. package/dist/engine/codemod/index.d.ts +0 -2
  527. package/dist/engine/codemod/index.js +0 -1
  528. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  529. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  530. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  531. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  532. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  533. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  534. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  535. package/dist/engine/feature-ast/extractors/events.js +0 -275
  536. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  537. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  538. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  539. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  540. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  541. package/dist/engine/feature-ast/extractors/index.js +0 -13
  542. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  543. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  544. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  545. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  546. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  547. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  548. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
  549. package/dist/engine/feature-ast/extractors/round1.js +0 -87
  550. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  551. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  552. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  553. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  554. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  555. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  556. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  557. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  558. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  559. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  560. package/dist/engine/feature-ast/index.d.ts +0 -16
  561. package/dist/engine/feature-ast/index.js +0 -10
  562. package/dist/engine/feature-ast/parse.d.ts +0 -31
  563. package/dist/engine/feature-ast/parse.js +0 -485
  564. package/dist/engine/feature-ast/patch.d.ts +0 -212
  565. package/dist/engine/feature-ast/patch.js +0 -611
  566. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  567. package/dist/engine/feature-ast/patcher.js +0 -281
  568. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
  569. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
  570. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  571. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
  572. package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
  573. package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
  574. package/dist/engine/feature-ast/patterns.d.ts +0 -322
  575. package/dist/engine/feature-ast/patterns.js +0 -107
  576. package/dist/engine/feature-ast/render.d.ts +0 -47
  577. package/dist/engine/feature-ast/render.js +0 -666
  578. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  579. package/dist/engine/feature-ast/source-location.js +0 -27
  580. package/dist/engine/pattern-library/index.d.ts +0 -2
  581. package/dist/engine/pattern-library/index.js +0 -3
  582. package/dist/engine/pattern-library/library.d.ts +0 -14
  583. package/dist/engine/pattern-library/library.js +0 -94
  584. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  585. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  586. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  587. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  588. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  589. package/dist/engine/pattern-library/shared-fields.js +0 -88
  590. package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
  591. package/dist/engine/pattern-library/static-schemas.js +0 -487
  592. package/dist/engine/pattern-library/types.d.ts +0 -158
  593. package/dist/engine/pattern-library/types.js +0 -36
  594. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  595. package/dist/engine/resolve-config-or-param.js +0 -76
  596. package/src/scripts/codemod/README.md +0 -187
  597. package/src/scripts/codemod/codemod-support.ts +0 -334
  598. package/src/scripts/codemod/collect-source-files.ts +0 -48
  599. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  600. package/src/scripts/codemod/db-factory.ts +0 -810
  601. package/src/scripts/codemod/feature-factory.ts +0 -429
  602. package/src/scripts/codemod/feature-layout.ts +0 -424
  603. package/src/scripts/codemod/import-extensions.ts +0 -118
  604. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  605. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  606. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  607. package/src/scripts/codemod/object-form.ts +0 -746
  608. package/src/scripts/codemod/package-merge.ts +0 -299
  609. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  610. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  611. package/src/scripts/codemod/s3-imports.ts +0 -236
  612. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  613. package/src/scripts/codemod/testing-injection.ts +0 -215
  614. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  615. package/src/scripts/codemod/testing-move.ts +0 -542
  616. 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 {};