@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,3 +1,4 @@
1
+ import { isUuid } from "@cosmicdrift/kumiko-types/identifiers";
1
2
  import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
2
3
  import { Hono } from "hono";
3
4
  import { bodyLimit } from "hono/body-limit";
@@ -5,10 +6,12 @@ import { getUser } from "../api/auth-middleware.js";
5
6
  import { requestContext } from "../api/request-context.js";
6
7
  import { collectPiiSubjectFields, configuredPiiSubjectKms, decryptPiiFieldValues, isPiiCiphertext, PII_ERASED_SENTINEL, } from "../crypto/index.js";
7
8
  import { selectMany } from "../db/query.js";
9
+ import { runInRowLevelSecurityScope, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
8
10
  import { createProjectingTenantDb } from "../db/tenant-db.js";
9
- import { createDerivativesContext, resolveFieldVariant, resolveRenderer, } from "../derivatives/index.js";
11
+ import { createDerivativesContext, resolveRenderer } from "../derivatives/derivatives-context.js";
12
+ import { resolveFieldVariant } from "../derivatives/index.js";
13
+ import { isFileField } from "../engine/field-helpers.js";
10
14
  import { isAnonymousSessionUser, SYSTEM_USER_ID } from "../engine/system-user.js";
11
- import { isFileField, isUuid, } from "../engine/types/index.js";
12
15
  import { createFailOpenReporter, respondRateLimited } from "../rate-limit/middleware.js";
13
16
  import { listActionFormFileFields, mayUseActionForm } from "./action-form-upload.js";
14
17
  import { buildContentDispositionHeader } from "./content-disposition.js";
@@ -116,6 +119,13 @@ export function createFileRoutes(options) {
116
119
  const executor = getFileRefExecutor();
117
120
  const piiSubjectFields = collectPiiSubjectFields(fileRefEntity);
118
121
  const api = new Hono();
122
+ // These routes read the file table on the root connection, outside the dispatcher, so the caller's tenant scope is opened here.
123
+ api.use("*", async (c, next) => {
124
+ const user = getUser(c);
125
+ if (user === undefined)
126
+ return next();
127
+ return runInRowLevelSecurityScope(tenantRowLevelSecurityScope(user.tenantId), next);
128
+ });
119
129
  const tenantDbFor = (tenantId) => createProjectingTenantDb(db, tenantId, options.registry);
120
130
  const fileNameIsPersonal = piiSubjectFields.includes("fileName");
121
131
  function kmsContextFor() {
@@ -1,25 +1,23 @@
1
1
  export { listActionFormFileFields, resolveActionFormFileField } from "./action-form-upload.ts";
2
- export type { BindPendingFileRefOutcome, PendingFileRef, PendingFileRefBindTarget, } from "./bind-pending-file-refs.ts";
2
+ export type { PendingFileRef } from "./bind-pending-file-refs.ts";
3
3
  export { bindPendingFileRef, loadPendingFileRef } from "./bind-pending-file-refs.ts";
4
- export type { CreatedFileRef, CreateFileRefContext, CreateFileRefInput, UploadedFileBytes, UploadFileBytesContext, } from "./create-file-ref-from-bytes.ts";
4
+ export type { CreatedFileRef, CreateFileRefInput, UploadedFileBytes, } from "./create-file-ref-from-bytes.ts";
5
5
  export { createFileRefFromBytes, createFileRefFromUploadedBytes, uploadFileBytesBeforeTransaction, } from "./create-file-ref-from-bytes.ts";
6
6
  export { createFilesFeature, FILES_FEATURE } from "./feature.ts";
7
- export type { FileContext, FileHandle } from "./file-handle.ts";
7
+ export type { FileContext } from "./file-handle.ts";
8
8
  export { createFileContext, createTenantFileContext, deriveKey, storageKeyStemPrefix, } from "./file-handle.ts";
9
9
  export { FILE_REF_ENTITY_NAME, fileRefEntity } from "./file-ref-entity.ts";
10
10
  export { fileRefsTable } from "./file-ref-table.ts";
11
- export type { FileAccessDecision, FileAccessGuard, FileRef, FileRoutesOptions, } from "./file-routes.ts";
12
- export { createFileRoutes, readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.ts";
11
+ export type { FileAccessGuard } from "./file-routes.ts";
12
+ export { readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.ts";
13
13
  export type { InMemoryFileProvider } from "./in-memory-provider.ts";
14
14
  export { createInMemoryFileProvider } from "./in-memory-provider.ts";
15
15
  export { createLocalProvider } from "./local-provider.ts";
16
- export type { FileProviderContext, FileProviderPlugin, FileProviderResolver, FileProviderResolverDeps, } from "./provider-resolver.ts";
17
- export { createFileProviderForTenant, isFileProviderPlugin, makeFileProviderResolver, } from "./provider-resolver.ts";
18
- export { resolveContentType } from "./resolve-content-type.ts";
19
- export { fileRefStorageDelta, filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.ts";
20
- export { DEFAULT_UPLOAD_SWEEP_GRACE_HOURS, MIN_UPLOAD_SWEEP_GRACE_HOURS, sweepOrphanedUploads, } from "./sweep-orphaned-uploads.ts";
21
- export type { FileContentValidationResult, FileMetadata, FileStorageProvider, FileValidationOptions, SignedUrlOptions, UploadMimeTypeResolution, WriteStreamOptions, } from "./types.ts";
22
- export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, parseMaxSize, resolveUploadMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, validateFileContent, } from "./types.ts";
23
- export { createFileUploadLedger, fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.ts";
16
+ export type { FileProviderContext, FileProviderPlugin, FileProviderResolver, } from "./provider-resolver.ts";
17
+ export { createFileProviderForTenant, isFileProviderPlugin, } from "./provider-resolver.ts";
18
+ export { filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.ts";
19
+ export type { FileStorageProvider, SignedUrlOptions, } from "./types.ts";
20
+ export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, } from "./types.ts";
21
+ export { fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.ts";
24
22
  export type { ZipEntry } from "./zip-stream.ts";
25
23
  export { createZipStream } from "./zip-stream.ts";
@@ -7,13 +7,11 @@ export { createFilesFeature, FILES_FEATURE } from "./feature.js";
7
7
  export { createFileContext, createTenantFileContext, deriveKey, storageKeyStemPrefix, } from "./file-handle.js";
8
8
  export { FILE_REF_ENTITY_NAME, fileRefEntity } from "./file-ref-entity.js";
9
9
  export { fileRefsTable } from "./file-ref-table.js";
10
- export { createFileRoutes, readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.js";
10
+ export { readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.js";
11
11
  export { createInMemoryFileProvider } from "./in-memory-provider.js";
12
12
  export { createLocalProvider } from "./local-provider.js";
13
- export { createFileProviderForTenant, isFileProviderPlugin, makeFileProviderResolver, } from "./provider-resolver.js";
14
- export { resolveContentType } from "./resolve-content-type.js";
15
- export { fileRefStorageDelta, filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.js";
16
- export { DEFAULT_UPLOAD_SWEEP_GRACE_HOURS, MIN_UPLOAD_SWEEP_GRACE_HOURS, sweepOrphanedUploads, } from "./sweep-orphaned-uploads.js";
17
- export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, parseMaxSize, resolveUploadMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, validateFileContent, } from "./types.js";
18
- export { createFileUploadLedger, fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.js";
13
+ export { createFileProviderForTenant, isFileProviderPlugin, } from "./provider-resolver.js";
14
+ export { filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.js";
15
+ export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, } from "./types.js";
16
+ export { fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.js";
19
17
  export { createZipStream } from "./zip-stream.js";
@@ -1,5 +1,6 @@
1
+ import type { SaveContext } from "@cosmicdrift/kumiko-types/hooks";
1
2
  import type { TenantDb } from "../db/tenant-db.ts";
2
- import { type Registry, type SaveContext, type SessionUser } from "../engine/types/index.ts";
3
+ import type { Registry, SessionUser } from "../engine/types/index.ts";
3
4
  export type FileRefRows = ReadonlyMap<string, Readonly<Record<string, unknown>>>;
4
5
  export declare function loadSaveFileRefs(args: {
5
6
  readonly registry: Registry;
@@ -1,6 +1,6 @@
1
1
  import { selectMany } from "../db/query.js";
2
2
  import { tenantDbRunner } from "../db/tenant-db-runner.js";
3
- import { isFileField, } from "../engine/types/index.js";
3
+ import { isFileField } from "../engine/field-helpers.js";
4
4
  import { getStreamVersions } from "../event-store/event-store.js";
5
5
  import { fileRefIdsOf } from "./bind-pending-file-refs.js";
6
6
  import { FILE_REF_ENTITY_NAME } from "./file-ref-entity.js";
@@ -1,8 +1,9 @@
1
1
  import type { CacheSyncBus } from "@cosmicdrift/kumiko-types/cache-sync-types";
2
+ import type { ConfigAccessor, ConfigAccessorFactory } from "@cosmicdrift/kumiko-types/config";
2
3
  import type { FileProviderResolver } from "@cosmicdrift/kumiko-types/file-provider-resolver-types";
3
4
  import type { DbConnection } from "../db/connection.ts";
4
5
  import type { TenantDb } from "../db/tenant-db.ts";
5
- import type { ConfigAccessor, ConfigAccessorFactory, Registry } from "../engine/types/index.ts";
6
+ import type { Registry } from "../engine/types/index.ts";
6
7
  import type { SecretsContext } from "../secrets/index.ts";
7
8
  import type { FileStorageProvider } from "./types.ts";
8
9
  /**
@@ -28,7 +29,7 @@ import type { FileStorageProvider } from "./types.ts";
28
29
  export type FileProviderContext = {
29
30
  readonly config?: ConfigAccessor;
30
31
  readonly registry?: Registry;
31
- readonly secrets?: SecretsContext;
32
+ readonly secrets: SecretsContext | undefined;
32
33
  readonly auditUserId?: string | undefined;
33
34
  };
34
35
  /**
@@ -38,7 +39,7 @@ export type FileProviderContext = {
38
39
  *
39
40
  * **Plugin-Author-Warning:** `ctx` is EXPLICITLY a FileProviderContext, not
40
41
  * a full HandlerContext. Fields outside the narrow surface (e.g.
41
- * `ctx.tx`, `ctx.actor`, `ctx.signal`) are NOT available on the worker path.
42
+ * `ctx.tx`, `ctx.actor`, `ctx.lifecycle.signal`) are NOT available on the worker path.
42
43
  * Casting `ctx as unknown as HandlerContext` fails at runtime on the worker —
43
44
  * the crash only appears in production with the first S3 tenant. If a plugin
44
45
  * needs fields outside FileProviderContext, extend FileProviderContext
@@ -52,7 +53,7 @@ export declare function createFileProviderForTenant(ctx: FileProviderContext, te
52
53
  export type { FileProviderResolver } from "@cosmicdrift/kumiko-types/file-provider-resolver-types";
53
54
  export type FileProviderResolverDeps = {
54
55
  readonly registry?: Registry;
55
- readonly _configAccessorFactory?: ConfigAccessorFactory;
56
+ readonly configAccessorFactory?: ConfigAccessorFactory;
56
57
  readonly secrets?: SecretsContext;
57
58
  readonly db?: DbConnection | TenantDb;
58
59
  readonly cacheSync?: CacheSyncBus;
@@ -1,5 +1,5 @@
1
1
  // File-provider resolution — lives in the framework so the upload routes,
2
- // `ctx.files`, AND the GDPR export/forget jobs resolve their FileStorageProvider
2
+ // `ctx.services.files`, AND the GDPR export/forget jobs resolve their FileStorageProvider
3
3
  // through ONE path. Divergence (uploads writing one store, erasure deleting
4
4
  // another) is structurally impossible: there is a single resolver.
5
5
  //
@@ -101,11 +101,11 @@ export function makeFileProviderResolver(deps) {
101
101
  if (cached)
102
102
  return cached;
103
103
  const built = (async () => {
104
- if (!deps.registry || !deps._configAccessorFactory || !deps.db) {
105
- throw new Error("makeFileProviderResolver: registry/_configAccessorFactory/db missing — " +
104
+ if (!deps.registry || !deps.configAccessorFactory || !deps.db) {
105
+ throw new Error("makeFileProviderResolver: registry/configAccessorFactory/db missing — " +
106
106
  "mount the config + file-foundation features and wire context.db");
107
107
  }
108
- const config = deps._configAccessorFactory({
108
+ const config = deps.configAccessorFactory({
109
109
  user: { id: SYSTEM_USER_ID, tenantId },
110
110
  db: deps.db,
111
111
  secrets: deps.secrets,
@@ -11,11 +11,13 @@
11
11
  // consumer-cursor row. Apps that want it pass filesStorageTrackingFeature
12
12
  // into createApp / setupTestStack alongside their domain features.
13
13
  import { bigint, instant, integer, table as pgTable, sql, uuid } from "../db/dialect.js";
14
- import { entityEventName, executeRawQueryRead } from "../db/index.js";
14
+ import { entityEventName } from "../db/index.js";
15
15
  import { toPostgresArrayLiteral } from "../db/queries/postgres-array-literal.js";
16
+ import { executeRawQueryRead } from "../db/queries/raw-sql.js";
16
17
  import { incrementCounter } from "../db/query.js";
17
18
  import { defineFeature, qn, toKebab } from "../engine/index.js";
18
- import { SHARED_INSTANCE_SENTINEL, selectConsumerCursorForUpdate, } from "../pipeline/index.js";
19
+ import { selectConsumerCursorForUpdate } from "../pipeline/event-dispatcher-delivery.js";
20
+ import { SHARED_INSTANCE_SENTINEL } from "../pipeline/index.js";
19
21
  import { parseJsonOrThrow } from "../utils/index.js";
20
22
  const FILE_REF_AGGREGATE_TYPE = "fileRef";
21
23
  const STORAGE_TRACKING_FEATURE_NAME = "files-storage-tracking";
@@ -1,6 +1,6 @@
1
1
  import type { FileContext } from "@cosmicdrift/kumiko-types/file-handle-types";
2
2
  import type { Logger } from "@cosmicdrift/kumiko-types/logger";
3
- import { type TenantDb } from "../db/tenant-db.ts";
3
+ import type { TenantDb } from "../db/tenant-db.ts";
4
4
  export declare const ORPHANED_UPLOAD_SWEEP_BATCH = 500;
5
5
  export declare const DEFAULT_UPLOAD_SWEEP_GRACE_HOURS = 24;
6
6
  export declare const MIN_UPLOAD_SWEEP_GRACE_HOURS = 1;
@@ -1,5 +1,5 @@
1
1
  import { selectMany } from "../db/query.js";
2
- import { runInOwnTransaction } from "../db/tenant-db.js";
2
+ import { runInOwnTransaction } from "../db/tenant-db-scoped-rebind.js";
3
3
  import { deleteFileRefBytes } from "../derivatives/delete-stored-file.js";
4
4
  import { fileRefsTable } from "./file-ref-table.js";
5
5
  import { fileUploadLedgerTable, takeUploadLedgerEntry } from "./upload-ledger.js";
@@ -1,12 +1,6 @@
1
1
  import type { Registry } from "../engine/types/index.ts";
2
+ import type { I18n, I18nOptions } from "./internals.ts";
2
3
  export { hasMailTranslationKey, hasMailTranslations, listMailLocales, mailT, registerMailTranslations, resolveMailLocale, } from "./mail-registry.ts";
3
- export { canonicalizeLocaleTag, DEFAULT_LOCALE, isValidLocaleTag, pickAcceptLanguage, rankAcceptLanguage, rankPreferredLocales, resolveHeaderLocale, } from "./request-locale.ts";
4
+ export { canonicalizeLocaleTag, isValidLocaleTag, rankPreferredLocales, } from "./request-locale.ts";
4
5
  export { SETTINGS_HUB_I18N } from "./settings-hub-keys.ts";
5
- export type I18nOptions = {
6
- defaultLocale: string;
7
- };
8
- export type I18n = {
9
- t(key: string, locale?: string, params?: Readonly<Record<string, unknown>>): string;
10
- getAllKeys(): string[];
11
- };
12
6
  export declare function createI18n(registry: Registry, options: I18nOptions): I18n;
@@ -1,6 +1,6 @@
1
1
  import { resolveTranslationValue } from "../ui-types/plural.js";
2
2
  export { hasMailTranslationKey, hasMailTranslations, listMailLocales, mailT, registerMailTranslations, resolveMailLocale, } from "./mail-registry.js";
3
- export { canonicalizeLocaleTag, DEFAULT_LOCALE, isValidLocaleTag, pickAcceptLanguage, rankAcceptLanguage, rankPreferredLocales, resolveHeaderLocale, } from "./request-locale.js";
3
+ export { canonicalizeLocaleTag, isValidLocaleTag, rankPreferredLocales, } from "./request-locale.js";
4
4
  export { SETTINGS_HUB_I18N } from "./settings-hub-keys.js";
5
5
  export function createI18n(registry, options) {
6
6
  const translations = registry.getAllTranslations();
@@ -0,0 +1,7 @@
1
+ export type I18nOptions = {
2
+ defaultLocale: string;
3
+ };
4
+ export type I18n = {
5
+ t(key: string, locale?: string, params?: Readonly<Record<string, unknown>>): string;
6
+ getAllKeys(): string[];
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,7 @@
1
- import type { FeatureDefinition, NavDefinition, ScreenDefinition, WorkspaceDefinition } from "../engine/types/index.ts";
1
+ import type { NavDefinition } from "@cosmicdrift/kumiko-types/nav";
2
+ import type { ScreenDefinition } from "@cosmicdrift/kumiko-types/screen";
3
+ import type { WorkspaceDefinition } from "@cosmicdrift/kumiko-types/workspace";
4
+ import type { FeatureDefinition } from "../engine/types/index.ts";
2
5
  /** Pseudo-entity for actionForm field labels (renderer action-form-shim). */
3
6
  export declare const ACTION_FORM_ENTITY = "__action-form__";
4
7
  /** Pseudo-entity for configEdit field labels (renderer config-edit-shim). */
@@ -0,0 +1,3 @@
1
+ export { isRowLevelSecurityViolation } from "../db/pg-error.ts";
2
+ export { DEFAULT_ROW_LEVEL_SECURITY_MODE } from "../db/render-rls-ddl.ts";
3
+ export { appHookScopedRunner, runInRowLevelSecurityScope, runInSystemRowLevelSecurityScope, systemScopedRunner, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.ts";
@@ -0,0 +1,3 @@
1
+ export { isRowLevelSecurityViolation } from "../db/pg-error.js";
2
+ export { DEFAULT_ROW_LEVEL_SECURITY_MODE } from "../db/render-rls-ddl.js";
3
+ export { appHookScopedRunner, runInRowLevelSecurityScope, runInSystemRowLevelSecurityScope, systemScopedRunner, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
@@ -1,6 +1,6 @@
1
1
  export { isClosedConnectionError } from "../db/closed-connection.ts";
2
2
  export { createDbConnection } from "../db/connection.ts";
3
- export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
3
+ export { acquireSessionAdvisoryLock, createApplicationRole, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, transferDatabaseOwnership, transferPublicSchemaOwnership, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
4
4
  export type { AnyDb } from "../db/query.ts";
5
5
  export { columnNamesOf } from "../db/schema-inspection.ts";
6
6
  export { schemaTableName } from "../db/table-introspection.ts";
@@ -1,7 +1,7 @@
1
1
  // @runtime dev
2
2
  export { isClosedConnectionError } from "../db/closed-connection.js";
3
3
  export { createDbConnection } from "../db/connection.js";
4
- export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
4
+ export { acquireSessionAdvisoryLock, createApplicationRole, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, transferDatabaseOwnership, transferPublicSchemaOwnership, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
5
5
  export { columnNamesOf } from "../db/schema-inspection.js";
6
6
  export { schemaTableName } from "../db/table-introspection.js";
7
7
  export { addMissingColumns, addMissingIndexes, tableToMeta, unsafeCreateEntityTable, unsafeEnsureEntityTable, unsafePushTables, } from "../db/table-push.js";
@@ -6,6 +6,7 @@ export { resetBlindIndexKeyForTests } from "../crypto/blind-index.ts";
6
6
  export { resetEventPiiCatalogForTests } from "../crypto/event-pii.ts";
7
7
  export { resetPiiSubjectKmsForTests } from "../crypto/pii-field-encryption.ts";
8
8
  export { resetEntityFieldEncryptionCacheForTests } from "../db/entity-field-encryption.ts";
9
+ export { type ExecutorManagedEntitySource, executorManagedEntitySourceOf, } from "../db/executor-managed-tables.ts";
9
10
  export declare function withExecutorManagedWritesForTests(db: TenantDb): ExecutorManagedTenantDb;
10
11
  export declare function withExecutorManagedWritesForTests(db: DbRunner): ExecutorManagedRunner;
11
12
  export declare function withExecutorManagedWritesForTests(db: AnyDb): ExecutorManagedTenantDb | ExecutorManagedRunner;
@@ -4,13 +4,17 @@ export { resetBlindIndexKeyForTests } from "../crypto/blind-index.js";
4
4
  export { resetEventPiiCatalogForTests } from "../crypto/event-pii.js";
5
5
  export { resetPiiSubjectKmsForTests } from "../crypto/pii-field-encryption.js";
6
6
  export { resetEntityFieldEncryptionCacheForTests } from "../db/entity-field-encryption.js";
7
+ export { executorManagedEntitySourceOf, } from "../db/executor-managed-tables.js";
7
8
  export function withExecutorManagedWritesForTests(db) {
8
9
  if (isBoundTenantDb(db)) {
9
- return createTenantDb({
10
- db: withExecutorManagedWrites(tenantDbRunner(db)),
11
- tenantId: db.tenantId,
12
- mode: db.mode,
13
- });
10
+ const options = { db: withExecutorManagedWrites(tenantDbRunner(db)), tenantId: db.tenantId };
11
+ return db.mode === "system"
12
+ ? createTenantDb({
13
+ ...options,
14
+ mode: "system",
15
+ reason: "test seeding mirrors a system-mode TenantDb",
16
+ })
17
+ : createTenantDb(options);
14
18
  }
15
19
  if (isDbRunner(db))
16
20
  return withExecutorManagedWrites(db);
@@ -1,2 +1,2 @@
1
- export type { JobDroppedMeta, JobLogEntry, JobMeta, JobOutcomeMeta, JobQueuedMeta, JobRunner, JobRunnerOptions, JobSubjectValue, } from "./job-runner.ts";
1
+ export type { JobDroppedMeta, JobLogEntry, JobMeta, JobOutcomeMeta, JobQueuedMeta, JobRunner, JobRunnerOptions, } from "./job-runner.ts";
2
2
  export { createJobRunner, serializeJobSubject } from "./job-runner.ts";
@@ -0,0 +1,12 @@
1
+ import type { AppendEventFn } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { TenantDb } from "../db/tenant-db.ts";
3
+ import type { Registry, SessionUser } from "../engine/types/index.ts";
4
+ type JobAppendEventInput = {
5
+ readonly registry: Registry;
6
+ readonly jobDb: TenantDb | undefined;
7
+ readonly tenantId: string;
8
+ readonly systemUser: SessionUser;
9
+ readonly jobName: string;
10
+ };
11
+ export declare function createJobAppendEvent(input: JobAppendEventInput): AppendEventFn;
12
+ export {};
@@ -0,0 +1,30 @@
1
+ import { tenantDbWriteRunner } from "../db/tenant-db-runner.js";
2
+ import { runInOwnTransaction } from "../db/tenant-db-scoped-rebind.js";
3
+ import { InternalError } from "../errors/index.js";
4
+ import { appendDomainEventCore } from "../pipeline/append-event-core.js";
5
+ import { asTypedAppendEventFn } from "../pipeline/typed-append-event.js";
6
+ const CALL_SITE_LABEL = "job ctx.events.append";
7
+ export function createJobAppendEvent(input) {
8
+ const { registry, jobDb, tenantId, systemUser, jobName } = input;
9
+ return asTypedAppendEventFn(async (args) => {
10
+ if (jobDb === undefined) {
11
+ throw new InternalError({
12
+ message: `Job ${jobName}: ctx.events.append needs a tenant db`,
13
+ });
14
+ }
15
+ const callerFeature = registry.getJobFeature(jobName);
16
+ if (callerFeature === undefined) {
17
+ throw new InternalError({
18
+ message: `Job ${jobName}: ctx.events.append needs an owning feature, none is registered for this job`,
19
+ });
20
+ }
21
+ await runInOwnTransaction(jobDb, (txDb) => appendDomainEventCore({
22
+ registry,
23
+ db: tenantDbWriteRunner(txDb, CALL_SITE_LABEL),
24
+ tenantId,
25
+ userId: String(systemUser.id),
26
+ callSiteLabel: CALL_SITE_LABEL,
27
+ callerFeature,
28
+ }, args));
29
+ });
30
+ }
@@ -1,8 +1,8 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
- import type { ConfigAccessor } from "@cosmicdrift/kumiko-types/config";
2
+ import type { ConfigAccessor, JobDefinition } from "@cosmicdrift/kumiko-types/config";
3
3
  import type { WriteOrigin } from "@cosmicdrift/kumiko-types/event-store-types";
4
+ import type { JobContext } from "@cosmicdrift/kumiko-types/handlers";
4
5
  import type { DbRow } from "../db/connection.ts";
5
- import type { JobContext, JobDefinition } from "../engine/types/index.ts";
6
6
  import type { JobRunnerScope } from "./job-runner-scope.ts";
7
7
  import type { JobInvocation, JobLogEntry, JobMeta } from "./job-runner-types.ts";
8
8
  export type TenantVisibleSubjects = {
@@ -6,11 +6,14 @@ import { createDerivativesContext } from "../derivatives/derivatives-context.js"
6
6
  import { createSystemUser } from "../engine/system-user.js";
7
7
  import { InternalError } from "../errors/index.js";
8
8
  import { createTenantFileContext } from "../files/file-handle.js";
9
- import { createEscapeHatchReporter, createMetricsForFactory } from "../observability/index.js";
9
+ import { createEscapeHatchReporter } from "../observability/escape-hatch-report.js";
10
+ import { createMetricsForFactory } from "../observability/index.js";
10
11
  import { configAccessorFactoryOf } from "../pipeline/config-accessor-factory.js";
12
+ import { buildContextServices } from "../pipeline/context-services.js";
11
13
  import { createGatedIdentitySwitch } from "../pipeline/system-identity-switch.js";
12
14
  import { buildPersonalDataGate, parseWriteOrigin } from "../pipeline/write-origin.js";
13
- import { attemptNumberOf, createJobLogger, handlerPayloadOf, isFinalAttempt, isJobTriggerEvent, jobSubjectKey, missingDbProxy, tenantIdOfJobData, } from "./job-runner-helpers.js";
15
+ import { createJobAppendEvent } from "./job-append-event.js";
16
+ import { attemptNumberOf, createJobLogger, handlerPayloadOf, hasDeferBudgetLeft, isFinalAttempt, isJobTriggerEvent, jobSubjectKey, missingDbProxy, tenantIdOfJobData, } from "./job-runner-helpers.js";
14
17
  // Tenant-visible failure record (JobDefinition.tenantVisibleFailure). The
15
18
  // subject is read from the handler payload, so it is resolved where the
16
19
  // payload is built, not in the callbacks.
@@ -72,7 +75,7 @@ function buildJobDbFacets(scope, facetInput) {
72
75
  const { jobDef, tenantId, writeOrigin } = input;
73
76
  const personalDataGate = writeOrigin ? buildPersonalDataGate(registry, writeOrigin) : undefined;
74
77
  const configDb = context.db; // @cast-boundary db-operator
75
- // Shared by the config accessor and ctx.derivatives below — both need the
78
+ // Shared by the config accessor and ctx.services.derivatives below — both need the
76
79
  // same tenant-scoped db, and building it twice would let the two calls
77
80
  // drift apart. Always "system" mode regardless of the job's own
78
81
  // systemScope() status (pre-existing, not something this change alters)
@@ -85,6 +88,7 @@ function buildJobDbFacets(scope, facetInput) {
85
88
  db: configDb,
86
89
  tenantId,
87
90
  mode: "system",
91
+ reason: "job context db for cross-tenant jobs, ctx.systemDb exposure is gated by isSystemJob",
88
92
  grants: {
89
93
  projectionRegistry: registry,
90
94
  ...(personalDataGate && { personalDataGate }),
@@ -120,12 +124,12 @@ function buildJobServiceFacets(scope, facetInput, tenantScopedDb) {
120
124
  const { context, registry } = scope;
121
125
  const { input, systemUser } = facetInput;
122
126
  const { tenantId } = input;
123
- // Mirror dispatch-shared.ts buildHandlerContext: ctx.files must resolve
127
+ // Mirror dispatch-shared.ts buildHandlerContext: ctx.services.files must resolve
124
128
  // through the same _fileProviderResolver for jobs as for write-handlers,
125
- // otherwise event-triggered jobs silently get an unresolved ctx.files.
129
+ // otherwise event-triggered jobs silently get an unresolved ctx.services.files.
126
130
  const fileResolver = context._fileProviderResolver;
127
131
  const files = fileResolver ? createTenantFileContext(fileResolver, tenantId) : context.files;
128
- // Same buildHandlerContext parity as ctx.files above: ctx.notify/ctx.config
132
+ // Same buildHandlerContext parity as ctx.services.files above: ctx.notify/ctx.config
129
133
  // must resolve for jobs the same way they do for write-handlers, or an
130
134
  // app-author job calling ctx.notify(...)/ctx.config(...) hits a TypeError
131
135
  // at runtime the write-handler path never would.
@@ -138,7 +142,7 @@ function buildJobServiceFacets(scope, facetInput, tenantScopedDb) {
138
142
  secrets: context.secrets,
139
143
  })
140
144
  : undefined;
141
- // Mirror dispatch-shared.ts: ctx.derivatives needs files+db, same
145
+ // Mirror dispatch-shared.ts: ctx.services.derivatives needs files+db, same
142
146
  // tenant-scoped db the config accessor above uses.
143
147
  const derivatives = files && tenantScopedDb
144
148
  ? createDerivativesContext({ files, registry, db: tenantScopedDb, tenantId })
@@ -190,6 +194,24 @@ function createJobDefer(jobName, bullJob, token) {
190
194
  return { kind: "job-deferral", delayMs };
191
195
  };
192
196
  }
197
+ function buildJobServices(scope, parts) {
198
+ const { files, derivatives, selfRunner } = parts;
199
+ return buildContextServices(scope.context, {
200
+ ...(files && { files }),
201
+ ...(derivatives && { derivatives }),
202
+ // Expose the runner so handlers can chain a follow-up job. Symmetric with
203
+ // how the command-dispatcher hands write-handlers their jobRunner.
204
+ ...(selfRunner !== undefined && { jobRunner: selfRunner }),
205
+ });
206
+ }
207
+ function buildJobObservability(scope, log) {
208
+ const { meter } = scope.context;
209
+ return {
210
+ log,
211
+ metricsFor: createMetricsForFactory(meter),
212
+ ...(meter && { meter }),
213
+ };
214
+ }
193
215
  function buildJobContext(scope, input) {
194
216
  const { jobName, bullJob, token, rawData, tenantId, triggeredById, attempt, finalAttempt } = input;
195
217
  const systemUser = createSystemUser(tenantId);
@@ -212,12 +234,24 @@ function buildJobContext(scope, input) {
212
234
  // this run (see createJobTriggerEventConsumer).
213
235
  const rawTriggerEvent = rawData["_triggerEvent"];
214
236
  const triggerEvent = isJobTriggerEvent(rawTriggerEvent) ? rawTriggerEvent : undefined;
237
+ const jobLogger = createJobLogger(input.logs);
215
238
  const jobContext = {
216
239
  defer: createJobDefer(jobName, bullJob, token),
217
- ...scope.context,
240
+ canDefer: token !== undefined &&
241
+ bullJob.moveToDelayed !== undefined &&
242
+ hasDeferBudgetLeft(rawData, input.jobDef.maxDefers),
218
243
  db: jobDb ?? missingDbProxy(jobName),
219
- files,
220
- derivatives,
244
+ events: {
245
+ append: createJobAppendEvent({
246
+ registry: scope.registry,
247
+ jobDb,
248
+ tenantId,
249
+ systemUser,
250
+ jobName,
251
+ }),
252
+ },
253
+ services: buildJobServices(scope, { files, derivatives, selfRunner }),
254
+ lifecycle: scope.context.signal ? { signal: scope.context.signal } : {},
221
255
  ...(notify !== undefined && { notify }),
222
256
  ...(config !== undefined && { config }),
223
257
  ...(systemDb && { systemDb }),
@@ -226,18 +260,14 @@ function buildJobContext(scope, input) {
226
260
  // workers can reach projections/jobs without the app author duplicating
227
261
  // it into `context` (the JobContext contract guarantees `registry`).
228
262
  registry: scope.registry,
229
- // Expose the runner so handlers can chain a follow-up job. Symmetric with
230
- // how the command-dispatcher hands write-handlers their jobRunner.
231
- ...(selfRunner !== undefined && { jobRunner: selfRunner }),
232
263
  systemUser,
233
264
  triggeredBy: triggeredById !== null ? { id: triggeredById, tenantId } : null,
234
265
  attempt,
235
266
  finalAttempt,
236
- log: createJobLogger(input.logs),
237
- metricsFor: createMetricsForFactory(scope.context.meter),
267
+ obs: buildJobObservability(scope, jobLogger),
238
268
  ...(triggerName !== undefined && { triggerName }),
239
269
  ...(triggerEvent !== undefined && { triggerEvent }),
240
- ...dispatchFacets,
270
+ dispatch: dispatchFacets,
241
271
  };
242
272
  return { jobContext, config };
243
273
  }
@@ -1,5 +1,5 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
- import type { JobDeferral } from "../engine/types/index.ts";
2
+ import type { JobDeferral } from "@cosmicdrift/kumiko-types/handlers";
3
3
  import type { JobRun } from "./job-runner-context.ts";
4
4
  import { type JobRunnerScope } from "./job-runner-scope.ts";
5
5
  import type { JobInvocation } from "./job-runner-types.ts";
@@ -1,11 +1,13 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
2
  import { UnrecoverableError } from "bullmq";
3
3
  import { requestContext } from "../api/request-context.js";
4
+ import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
4
5
  import { qnScope } from "../engine/qualified-name.js";
5
6
  import { InternalError } from "../errors/index.js";
6
7
  import { scrubLogText } from "../logging/index.js";
7
- import { emitJobLastSuccess, withEscapeHatchAuditScope } from "../observability/index.js";
8
- import { DEFAULT_MAX_DEFERS, HANDLER_DEFER_COUNT_KEY, isJobDeferral, priorDeferCountOf, readTraceContext, resolveJobTz, tenantFailureMessageKey, } from "./job-runner-helpers.js";
8
+ import { withEscapeHatchAuditScope } from "../observability/escape-hatch-report.js";
9
+ import { emitJobLastSuccess } from "../observability/standard-metrics.js";
10
+ import { DEFAULT_MAX_DEFERS, HANDLER_DEFER_COUNT_KEY, hasDeferBudgetLeft, isJobDeferral, priorDeferCountOf, readTraceContext, resolveJobTz, tenantFailureMessageKey, } from "./job-runner-helpers.js";
9
11
  import { laneForJob, logFailedAttempt } from "./job-runner-scope.js";
10
12
  function buildOutcomeMeta(run, messageKey, unrecoverable = false) {
11
13
  const { jobDef, subjects } = run;
@@ -48,7 +50,7 @@ async function runJobHandler(scope, run, correlation) {
48
50
  }
49
51
  function assertDeferBudget(run) {
50
52
  const maxDefers = run.jobDef.maxDefers ?? DEFAULT_MAX_DEFERS;
51
- if (priorDeferCountOf(run.rawData, HANDLER_DEFER_COUNT_KEY) >= maxDefers) {
53
+ if (!hasDeferBudgetLeft(run.rawData, run.jobDef.maxDefers)) {
52
54
  // The counter never resets, so a retry would hit the cap again.
53
55
  throw new UnrecoverableError(`Job "${run.jobName}" was deferred ${maxDefers} times (maxDefers); giving up.`);
54
56
  }
@@ -135,7 +137,7 @@ export async function executeJobInSpan(scope, run) {
135
137
  : {}),
136
138
  },
137
139
  ...(parentContext ? { parent: parentContext } : {}),
138
- }, () => runAndRecordJob(scope, run, { requestId, correlationId })));
140
+ }, () => runInSystemRowLevelSecurityScope("job execution span reads job rows of every tenant", () => runAndRecordJob(scope, run, { requestId, correlationId }))));
139
141
  }
140
142
  export async function applyHandlerDeferral(scope, run, bullJob, deferral, token) {
141
143
  if (!deferral || token === undefined || !bullJob.moveToDelayed)
@@ -1,5 +1,5 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
- import type { JobDefinition } from "../engine/types/index.ts";
2
+ import type { JobDefinition } from "@cosmicdrift/kumiko-types/config";
3
3
  import { type JobRun } from "./job-runner-context.ts";
4
4
  import { type JobRunnerScope } from "./job-runner-scope.ts";
5
5
  import type { JobInvocation } from "./job-runner-types.ts";
@@ -1,4 +1,3 @@
1
- /// <reference types="temporal-polyfill/global" preserve="true" />
2
1
  import { prepareJobRun } from "./job-runner-context.js";
3
2
  import { attemptNumberOf, buildRetryBullOpts, DEFER_COUNT_KEY, deferDelayMs, isFinalAttempt, priorAttemptsOf, priorDeferCountOf, } from "./job-runner-helpers.js";
4
3
  import { ACTIVE_TENANT_IDS_QUERY_NAME, perTenantChildJobId } from "./job-runner-schedulers.js";