@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1

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