@cosmicdrift/kumiko-framework 0.388.0 → 0.390.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. package/AGENTS.md +12 -4
  2. package/README.md +1 -1
  3. package/agents/examples/apex-surface-auth.md +2 -3
  4. package/agents/examples/api-worker-split.md +9 -2
  5. package/agents/examples/auth-claims.md +1 -1
  6. package/agents/examples/cross-feature-events.md +12 -12
  7. package/agents/examples/crypto-shredding-hr.md +2 -2
  8. package/agents/examples/encrypted-tenant-config.md +1 -1
  9. package/agents/examples/error-contract.md +12 -7
  10. package/agents/examples/event-sourcing.md +29 -29
  11. package/agents/examples/files-post-processing.md +10 -8
  12. package/agents/examples/golden-path.md +13 -1
  13. package/agents/examples/inbound-mail-triage.md +1 -0
  14. package/agents/examples/lane-routing.md +2 -1
  15. package/agents/examples/legal-pages.md +2 -2
  16. package/agents/examples/lifecycle-hooks.md +55 -2
  17. package/agents/examples/list-table-options.md +466 -0
  18. package/agents/examples/managed-config.md +4 -4
  19. package/agents/examples/managed-pages.md +1 -1
  20. package/agents/examples/pdf-audit-export.md +4 -2
  21. package/agents/examples/relations.md +19 -4
  22. package/agents/examples/search.md +4 -4
  23. package/agents/examples/secrets-demo.md +9 -6
  24. package/agents/examples/state-machine.md +5 -4
  25. package/agents/examples/tenant-isolation.md +73 -1
  26. package/agents/examples/tenant-settings.md +1 -1
  27. package/agents/examples/user-data-rights.md +3 -6
  28. package/agents/examples/workflow-engine.md +53 -47
  29. package/agents/examples.md +5 -4
  30. package/agents/features.md +1 -1
  31. package/agents/widgets.md +1 -0
  32. package/dist/api/api-constants.d.ts +1 -0
  33. package/dist/api/api-constants.js +2 -0
  34. package/dist/api/auth-middleware.js +1 -1
  35. package/dist/api/auth-routes-invite.js +2 -1
  36. package/dist/api/auth-routes-shared.d.ts +2 -0
  37. package/dist/api/auth-routes-shared.js +5 -0
  38. package/dist/api/client-error-route.js +2 -3
  39. package/dist/api/entity-read-access.d.ts +4 -1
  40. package/dist/api/entity-read-access.js +14 -0
  41. package/dist/api/export/export-cells-reference.d.ts +9 -0
  42. package/dist/api/export/export-cells-reference.js +21 -0
  43. package/dist/api/export/export-cells.d.ts +11 -0
  44. package/dist/api/export/export-cells.js +136 -0
  45. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  46. package/dist/api/export/export-ciphertext-guard.js +27 -0
  47. package/dist/api/export/export-columns.d.ts +31 -0
  48. package/dist/api/export/export-columns.js +85 -0
  49. package/dist/api/export/export-errors.d.ts +4 -0
  50. package/dist/api/export/export-errors.js +14 -0
  51. package/dist/api/export/export-route.d.ts +4 -0
  52. package/dist/api/export/export-route.js +75 -0
  53. package/dist/api/export/export-rows.d.ts +13 -0
  54. package/dist/api/export/export-rows.js +62 -0
  55. package/dist/api/export/export-screen.d.ts +13 -0
  56. package/dist/api/export/export-screen.js +47 -0
  57. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  58. package/dist/api/export/export-xlsx-writer.js +21 -0
  59. package/dist/api/extra-route.d.ts +7 -1
  60. package/dist/api/index.d.ts +23 -27
  61. package/dist/api/index.js +13 -15
  62. package/dist/api/jwt.js +1 -1
  63. package/dist/api/observability-middleware.d.ts +1 -1
  64. package/dist/api/observability-middleware.js +2 -1
  65. package/dist/api/pii-leak-guard.d.ts +3 -0
  66. package/dist/api/pii-leak-guard.js +3 -2
  67. package/dist/api/request-context-internals.d.ts +31 -0
  68. package/dist/api/request-context-internals.js +11 -0
  69. package/dist/api/request-context-scopes.d.ts +14 -0
  70. package/dist/api/request-context-scopes.js +69 -0
  71. package/dist/api/request-context.d.ts +1 -40
  72. package/dist/api/request-context.js +22 -51
  73. package/dist/api/request-id-middleware.d.ts +1 -1
  74. package/dist/api/route-registrars.d.ts +2 -1
  75. package/dist/api/route-registrars.js +1 -1
  76. package/dist/api/routes.d.ts +16 -0
  77. package/dist/api/routes.js +9 -5
  78. package/dist/api/server-boot-checks.d.ts +1 -1
  79. package/dist/api/server-boot-checks.js +2 -2
  80. package/dist/api/server-event-dispatcher.d.ts +6 -1
  81. package/dist/api/server-event-dispatcher.js +3 -4
  82. package/dist/api/server-extra-routes.d.ts +1 -1
  83. package/dist/api/server-extra-routes.js +5 -1
  84. package/dist/api/server-middleware.js +3 -1
  85. package/dist/api/server-routes.d.ts +3 -2
  86. package/dist/api/server-routes.js +8 -2
  87. package/dist/api/server-wiring.js +8 -4
  88. package/dist/api/server.d.ts +2 -1
  89. package/dist/api/sse-route.d.ts +3 -1
  90. package/dist/api/sse-route.js +11 -1
  91. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  92. package/dist/api/tenant-scoped-secrets.js +13 -0
  93. package/dist/api/websocket-route.d.ts +1 -1
  94. package/dist/auth/index.d.ts +0 -1
  95. package/dist/auth/roles.d.ts +0 -5
  96. package/dist/compliance/duration-spec.d.ts +0 -1
  97. package/dist/compliance/duration-spec.js +0 -5
  98. package/dist/compliance/index.d.ts +4 -4
  99. package/dist/compliance/index.js +2 -2
  100. package/dist/compliance/profiles.d.ts +0 -15
  101. package/dist/compliance/profiles.js +0 -23
  102. package/dist/config/index.d.ts +11 -9
  103. package/dist/config/index.js +13 -1
  104. package/dist/config/internals.d.ts +9 -0
  105. package/dist/config/internals.js +1 -0
  106. package/dist/consumer-cli-internals.d.ts +4 -0
  107. package/dist/consumer-cli-internals.js +1 -0
  108. package/dist/consumer-cli.d.ts +1 -4
  109. package/dist/consumer-cli.js +5 -1
  110. package/dist/crypto/event-pii.js +1 -1
  111. package/dist/crypto/index.d.ts +8 -9
  112. package/dist/crypto/index.js +7 -8
  113. package/dist/crypto/pg-kms-adapter.d.ts +1 -0
  114. package/dist/crypto/pg-kms-adapter.js +17 -18
  115. package/dist/db/aggregate-sql.d.ts +2 -0
  116. package/dist/db/aggregate-sql.js +10 -0
  117. package/dist/db/apply-entity-event.d.ts +1 -1
  118. package/dist/db/apply-entity-event.js +15 -47
  119. package/dist/db/blind-index-cleanup.js +91 -77
  120. package/dist/db/closed-connection.js +12 -19
  121. package/dist/db/collect-table-metas.js +1 -1
  122. package/dist/db/compound-types.d.ts +1 -1
  123. package/dist/db/compound-types.js +0 -7
  124. package/dist/db/config-seed.d.ts +2 -1
  125. package/dist/db/config-seed.js +6 -1
  126. package/dist/db/connection.d.ts +7 -6
  127. package/dist/db/connection.js +43 -24
  128. package/dist/db/cross-tenant-reads.d.ts +1 -1
  129. package/dist/db/cross-tenant-reads.js +1 -1
  130. package/dist/db/dialect.d.ts +0 -5
  131. package/dist/db/dialect.js +0 -3
  132. package/dist/db/driver-row-coercion.js +4 -4
  133. package/dist/db/driver-value-preparation.js +6 -4
  134. package/dist/db/eagerload.d.ts +2 -1
  135. package/dist/db/entity-field-encryption.d.ts +1 -1
  136. package/dist/db/entity-table-meta.d.ts +1 -1
  137. package/dist/db/event-store-executor-context.d.ts +3 -1
  138. package/dist/db/event-store-executor-context.js +4 -3
  139. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  140. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  141. package/dist/db/event-store-executor-read-aggregate.js +36 -5
  142. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  143. package/dist/db/event-store-executor-read-filter.js +6 -3
  144. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  145. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  146. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  147. package/dist/db/event-store-executor-read.js +2 -2
  148. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  149. package/dist/db/event-store-executor-write-atomic.js +42 -0
  150. package/dist/db/event-store-executor-write-steps.d.ts +3 -5
  151. package/dist/db/event-store-executor-write-steps.js +0 -5
  152. package/dist/db/event-store-executor-write.js +22 -19
  153. package/dist/db/event-store-executor.d.ts +1 -1
  154. package/dist/db/event-store-executor.js +2 -1
  155. package/dist/db/executor-managed-tables.d.ts +7 -1
  156. package/dist/db/executor-managed-tables.js +12 -3
  157. package/dist/db/index.d.ts +29 -28
  158. package/dist/db/index.js +22 -20
  159. package/dist/db/known-table-names.d.ts +6 -0
  160. package/dist/db/known-table-names.js +21 -0
  161. package/dist/db/list-aggregate-labels.d.ts +1 -1
  162. package/dist/db/located-timestamp.d.ts +1 -1
  163. package/dist/db/located-timestamp.js +0 -5
  164. package/dist/db/migrate-generator.d.ts +17 -1
  165. package/dist/db/migrate-generator.js +50 -20
  166. package/dist/db/migrate-primary-key.d.ts +12 -0
  167. package/dist/db/migrate-primary-key.js +45 -0
  168. package/dist/db/migrate-rls-diff.d.ts +20 -0
  169. package/dist/db/migrate-rls-diff.js +61 -0
  170. package/dist/db/migrate-runner.js +7 -3
  171. package/dist/db/money.d.ts +1 -1
  172. package/dist/db/money.js +1 -1
  173. package/dist/db/parent-ref-clause.d.ts +2 -1
  174. package/dist/db/pg-error.d.ts +2 -0
  175. package/dist/db/pg-error.js +37 -21
  176. package/dist/db/queries/backfill-pii.js +3 -6
  177. package/dist/db/queries/database-now.js +2 -1
  178. package/dist/db/queries/ddl.d.ts +3 -0
  179. package/dist/db/queries/ddl.js +34 -1
  180. package/dist/db/queries/event-store.js +4 -2
  181. package/dist/db/queries/event-tenants.d.ts +2 -0
  182. package/dist/db/queries/event-tenants.js +17 -0
  183. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  184. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  185. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  186. package/dist/db/queries/rls-boot-catalog.js +39 -0
  187. package/dist/db/queries/rls-catalog.d.ts +6 -0
  188. package/dist/db/queries/rls-catalog.js +82 -0
  189. package/dist/db/queries/rls-scope.d.ts +3 -0
  190. package/dist/db/queries/rls-scope.js +17 -0
  191. package/dist/db/queries/rls-shape.d.ts +10 -0
  192. package/dist/db/queries/rls-shape.js +42 -0
  193. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  194. package/dist/db/queries/session-advisory-lock.js +23 -0
  195. package/dist/db/queries/shadow-swap.d.ts +1 -2
  196. package/dist/db/queries/shadow-swap.js +11 -28
  197. package/dist/db/queries/test-stack.d.ts +4 -1
  198. package/dist/db/queries/test-stack.js +83 -2
  199. package/dist/db/query.d.ts +14 -0
  200. package/dist/db/query.js +77 -48
  201. package/dist/db/reference-data.d.ts +1 -1
  202. package/dist/db/reference-data.js +20 -3
  203. package/dist/db/render-ddl.d.ts +6 -2
  204. package/dist/db/render-ddl.js +7 -7
  205. package/dist/db/render-rls-ddl.d.ts +35 -0
  206. package/dist/db/render-rls-ddl.js +127 -0
  207. package/dist/db/replay-migration-sql.d.ts +3 -1
  208. package/dist/db/replay-migration-sql.js +22 -5
  209. package/dist/db/replay-rls.d.ts +25 -0
  210. package/dist/db/replay-rls.js +156 -0
  211. package/dist/db/row-level-security-boot-check.d.ts +5 -0
  212. package/dist/db/row-level-security-boot-check.js +85 -0
  213. package/dist/db/row-level-security-connection.d.ts +3 -0
  214. package/dist/db/row-level-security-connection.js +213 -0
  215. package/dist/db/row-level-security-scope.d.ts +33 -0
  216. package/dist/db/row-level-security-scope.js +127 -0
  217. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  218. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  219. package/dist/db/sql-identifier.d.ts +1 -0
  220. package/dist/db/sql-identifier.js +3 -0
  221. package/dist/db/statement-timeout.js +2 -1
  222. package/dist/db/table-builder.d.ts +2 -1
  223. package/dist/db/table-builder.js +1 -1
  224. package/dist/db/table-info.js +1 -1
  225. package/dist/db/table-push.d.ts +11 -2
  226. package/dist/db/table-push.js +15 -2
  227. package/dist/db/tenant-db-runner.d.ts +3 -1
  228. package/dist/db/tenant-db-runner.js +4 -3
  229. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  230. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  231. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  232. package/dist/db/tenant-db-statement-runner.js +48 -0
  233. package/dist/db/tenant-db-upsert.d.ts +5 -0
  234. package/dist/db/tenant-db-upsert.js +91 -0
  235. package/dist/db/tenant-db.d.ts +17 -12
  236. package/dist/db/tenant-db.js +60 -121
  237. package/dist/db/tenant-id-filter.d.ts +3 -0
  238. package/dist/db/tenant-id-filter.js +30 -0
  239. package/dist/db/transaction-serialization.d.ts +6 -0
  240. package/dist/db/transaction-serialization.js +60 -0
  241. package/dist/derivatives/delete-stored-file.js +1 -1
  242. package/dist/derivatives/index.d.ts +2 -5
  243. package/dist/derivatives/index.js +2 -3
  244. package/dist/engine/access.d.ts +2 -1
  245. package/dist/engine/access.js +1 -1
  246. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  247. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  248. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  249. package/dist/engine/boot-validator/entity-handler.js +1 -1
  250. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  251. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  252. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  253. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  254. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  255. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  256. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  257. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  258. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
  259. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  260. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  261. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  262. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  263. package/dist/engine/boot-validator/list-table-options.js +77 -0
  264. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  265. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  266. package/dist/engine/boot-validator/nav.d.ts +3 -1
  267. package/dist/engine/boot-validator/nav.js +1 -1
  268. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  269. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  270. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  271. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  272. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  273. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  274. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  275. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  276. package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
  277. package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
  278. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  279. package/dist/engine/boot-validator/screens-lists.js +12 -2
  280. package/dist/engine/boot-validator/screens.d.ts +2 -1
  281. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  282. package/dist/engine/bridge-stub.d.ts +5 -2
  283. package/dist/engine/bridge-stub.js +39 -24
  284. package/dist/engine/build-app-schema.d.ts +2 -1
  285. package/dist/engine/build-app-schema.js +9 -1
  286. package/dist/engine/build-config-feature-schema.js +6 -1
  287. package/dist/engine/config-helpers.d.ts +2 -2
  288. package/dist/engine/config-helpers.js +0 -9
  289. package/dist/engine/constants.d.ts +0 -10
  290. package/dist/engine/constants.js +0 -8
  291. package/dist/engine/create-app.js +1 -1
  292. package/dist/engine/define-feature.d.ts +2 -1
  293. package/dist/engine/define-feature.js +5 -2
  294. package/dist/engine/define-handler.d.ts +1 -1
  295. package/dist/engine/define-step.d.ts +0 -1
  296. package/dist/engine/define-step.js +0 -3
  297. package/dist/engine/embedded-derived.d.ts +1 -1
  298. package/dist/engine/entity-handlers.d.ts +2 -1
  299. package/dist/engine/entity-handlers.js +7 -7
  300. package/dist/engine/entity-list-runtime-options.js +3 -1
  301. package/dist/engine/entity-list-searchability.d.ts +2 -1
  302. package/dist/engine/event-def.d.ts +2 -1
  303. package/dist/engine/event-helpers.d.ts +3 -1
  304. package/dist/engine/event-helpers.js +3 -3
  305. package/dist/engine/extension-names.d.ts +2 -8
  306. package/dist/engine/extension-names.js +2 -2
  307. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  308. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  309. package/dist/engine/extensions/user-data.d.ts +0 -8
  310. package/dist/engine/factories.d.ts +2 -1
  311. package/dist/engine/feature-builder-state.d.ts +9 -1
  312. package/dist/engine/feature-builder-state.js +1 -0
  313. package/dist/engine/feature-changelog.d.ts +1 -1
  314. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  315. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  316. package/dist/engine/feature-manifest.d.ts +1 -0
  317. package/dist/engine/feature-manifest.js +2 -1
  318. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  319. package/dist/engine/feature-ui-extensions.js +6 -4
  320. package/dist/engine/field-access.d.ts +3 -1
  321. package/dist/engine/field-access.js +12 -0
  322. package/dist/engine/handler-field-references.d.ts +0 -4
  323. package/dist/engine/index.d.ts +58 -55
  324. package/dist/engine/index.js +23 -28
  325. package/dist/engine/instruction-fields.d.ts +1 -1
  326. package/dist/engine/personal-data-fields.d.ts +1 -1
  327. package/dist/engine/qualified-name.d.ts +0 -1
  328. package/dist/engine/read-claim.d.ts +2 -1
  329. package/dist/engine/registry-facade.js +0 -3
  330. package/dist/engine/registry-ingest.d.ts +2 -1
  331. package/dist/engine/registry-ingest.js +1 -2
  332. package/dist/engine/registry-state.d.ts +12 -2
  333. package/dist/engine/registry-state.js +2 -3
  334. package/dist/engine/registry-validate.d.ts +3 -1
  335. package/dist/engine/registry-validate.js +7 -7
  336. package/dist/engine/run-in.d.ts +1 -1
  337. package/dist/engine/run-in.js +0 -1
  338. package/dist/engine/schema-builder.d.ts +1 -1
  339. package/dist/engine/schema-builder.js +1 -1
  340. package/dist/engine/screen-filter-ops.d.ts +2 -1
  341. package/dist/engine/screen-filter-ops.js +2 -5
  342. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  343. package/dist/engine/soft-delete-cleanup.js +4 -4
  344. package/dist/engine/state-machine.js +2 -1
  345. package/dist/engine/steps/_read-source.js +1 -1
  346. package/dist/engine/steps/aggregate-append-event.js +2 -2
  347. package/dist/engine/steps/call-feature.js +2 -2
  348. package/dist/engine/steps/mail-send.js +1 -1
  349. package/dist/engine/steps/retry.js +1 -1
  350. package/dist/engine/steps/wait-for-event.js +1 -1
  351. package/dist/engine/steps/wait.js +1 -1
  352. package/dist/engine/steps/webhook-send.js +1 -1
  353. package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
  354. package/dist/engine/template-variables.d.ts +2 -1
  355. package/dist/engine/transfer-adjacency.d.ts +1 -1
  356. package/dist/engine/types/feature.d.ts +1 -0
  357. package/dist/engine/types/index.d.ts +8 -30
  358. package/dist/engine/types/index.js +2 -10
  359. package/dist/engine/types/screen.d.ts +1 -1
  360. package/dist/engine/types/screen.js +1 -1
  361. package/dist/engine/validation.d.ts +2 -1
  362. package/dist/entrypoint/index.d.ts +9 -35
  363. package/dist/entrypoint/index.js +10 -1
  364. package/dist/entrypoint/internals.d.ts +40 -0
  365. package/dist/entrypoint/internals.js +1 -0
  366. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  367. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  368. package/dist/env/dry-run-internals.d.ts +10 -0
  369. package/dist/env/dry-run-internals.js +1 -0
  370. package/dist/env/dry-run.d.ts +1 -10
  371. package/dist/env/dry-run.js +2 -1
  372. package/dist/env/index.d.ts +1 -85
  373. package/dist/env/index.js +6 -50
  374. package/dist/env/internals.d.ts +87 -0
  375. package/dist/env/internals.js +53 -0
  376. package/dist/errors/classes.js +2 -2
  377. package/dist/errors/index.d.ts +5 -14
  378. package/dist/errors/index.js +4 -9
  379. package/dist/errors/member-resolution.js +1 -1
  380. package/dist/errors/reasons.d.ts +0 -1
  381. package/dist/errors/reasons.js +7 -7
  382. package/dist/errors/serialize.d.ts +0 -18
  383. package/dist/errors/serialize.js +0 -27
  384. package/dist/es-ops/index.d.ts +4 -4
  385. package/dist/es-ops/index.js +2 -2
  386. package/dist/es-ops/operations-schema.d.ts +1 -1
  387. package/dist/es-ops/types.d.ts +4 -5
  388. package/dist/event-store/admin-api-internals.d.ts +14 -0
  389. package/dist/event-store/admin-api-internals.js +1 -0
  390. package/dist/event-store/admin-api.d.ts +1 -14
  391. package/dist/event-store/admin-api.js +11 -6
  392. package/dist/event-store/archive.js +4 -2
  393. package/dist/event-store/errors.js +2 -2
  394. package/dist/event-store/event-store.d.ts +1 -0
  395. package/dist/event-store/event-store.js +42 -32
  396. package/dist/event-store/events-schema.js +4 -1
  397. package/dist/event-store/index.d.ts +11 -13
  398. package/dist/event-store/index.js +7 -9
  399. package/dist/event-store/provenance-append.js +1 -1
  400. package/dist/event-store/rebuild-dead-letter.js +4 -2
  401. package/dist/event-store/snapshot.js +4 -3
  402. package/dist/event-store/stream-scope.d.ts +2 -0
  403. package/dist/event-store/stream-scope.js +6 -0
  404. package/dist/event-store/upcaster-dead-letter.js +4 -2
  405. package/dist/event-store/upcaster.d.ts +2 -1
  406. package/dist/files/action-form-upload.d.ts +2 -1
  407. package/dist/files/action-form-upload.js +1 -1
  408. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  409. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  410. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  411. package/dist/files/bind-pending-file-refs.js +2 -1
  412. package/dist/files/bind-referenced-files.write.js +1 -1
  413. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  414. package/dist/files/create-file-ref-from-bytes.js +6 -3
  415. package/dist/files/create-file-ref.d.ts +6 -2
  416. package/dist/files/create-file-ref.js +13 -4
  417. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  418. package/dist/files/dispose-removed-file-refs.js +1 -1
  419. package/dist/files/feature.js +2 -2
  420. package/dist/files/file-handle.js +1 -1
  421. package/dist/files/file-routes.d.ts +3 -1
  422. package/dist/files/file-routes.js +41 -4
  423. package/dist/files/index.d.ts +11 -13
  424. package/dist/files/index.js +5 -7
  425. package/dist/files/load-save-file-refs.d.ts +2 -1
  426. package/dist/files/load-save-file-refs.js +1 -1
  427. package/dist/files/provider-resolver.d.ts +6 -4
  428. package/dist/files/provider-resolver.js +5 -5
  429. package/dist/files/record-write-check.d.ts +6 -0
  430. package/dist/files/record-write-check.js +13 -0
  431. package/dist/files/storage-tracking.js +4 -2
  432. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  433. package/dist/files/sweep-orphaned-uploads.js +1 -1
  434. package/dist/files/upload-ledger.d.ts +2 -2
  435. package/dist/files/upload-ledger.js +4 -4
  436. package/dist/i18n/index.d.ts +2 -8
  437. package/dist/i18n/index.js +1 -1
  438. package/dist/i18n/internals.d.ts +7 -0
  439. package/dist/i18n/internals.js +1 -0
  440. package/dist/i18n/required-surface-keys.d.ts +4 -1
  441. package/dist/i18n/required-surface-keys.js +7 -2
  442. package/dist/internal/row-level-security.d.ts +3 -0
  443. package/dist/internal/row-level-security.js +3 -0
  444. package/dist/internal/stack-support.d.ts +1 -1
  445. package/dist/internal/stack-support.js +1 -1
  446. package/dist/internal/testing.d.ts +1 -0
  447. package/dist/internal/testing.js +10 -6
  448. package/dist/jobs/index.d.ts +1 -1
  449. package/dist/jobs/job-append-event.d.ts +12 -0
  450. package/dist/jobs/job-append-event.js +30 -0
  451. package/dist/jobs/job-runner-context.d.ts +2 -2
  452. package/dist/jobs/job-runner-context.js +46 -16
  453. package/dist/jobs/job-runner-execution.d.ts +1 -1
  454. package/dist/jobs/job-runner-execution.js +6 -4
  455. package/dist/jobs/job-runner-gates.d.ts +1 -1
  456. package/dist/jobs/job-runner-gates.js +0 -1
  457. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  458. package/dist/jobs/job-runner-helpers.js +10 -1
  459. package/dist/jobs/job-runner-scope.d.ts +5 -2
  460. package/dist/jobs/job-runner-scope.js +6 -6
  461. package/dist/jobs/job-runner-types.d.ts +2 -1
  462. package/dist/jobs/job-runner.js +22 -6
  463. package/dist/jobs/max-per-tenant.d.ts +1 -1
  464. package/dist/logging/index.d.ts +1 -2
  465. package/dist/logging/index.js +1 -1
  466. package/dist/logging/pino-logger.js +1 -1
  467. package/dist/logging/utils.d.ts +1 -0
  468. package/dist/logging/utils.js +6 -0
  469. package/dist/migrations/index.d.ts +3 -3
  470. package/dist/migrations/index.js +3 -3
  471. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  472. package/dist/migrations/pending-rebuilds.js +1 -1
  473. package/dist/migrations/pii-event-backfill.js +4 -1
  474. package/dist/observability/escape-hatch-report.d.ts +2 -1
  475. package/dist/observability/escape-hatch-report.js +9 -2
  476. package/dist/observability/index.d.ts +7 -15
  477. package/dist/observability/index.js +4 -12
  478. package/dist/observability/metric-validator.js +1 -1
  479. package/dist/observability/metrics-handle.d.ts +0 -1
  480. package/dist/observability/metrics-handle.js +2 -15
  481. package/dist/observability/recording-tracer.d.ts +1 -2
  482. package/dist/observability/recording-tracer.js +0 -6
  483. package/dist/observability/sensitive-filter.d.ts +0 -2
  484. package/dist/observability/sensitive-filter.js +0 -29
  485. package/dist/pipeline/active-membership.d.ts +2 -1
  486. package/dist/pipeline/active-membership.js +6 -2
  487. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  488. package/dist/pipeline/after-rollback-sink.js +32 -0
  489. package/dist/pipeline/append-event-core.d.ts +2 -1
  490. package/dist/pipeline/append-event-core.js +2 -2
  491. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  492. package/dist/pipeline/attach-outside-transaction.js +13 -0
  493. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  494. package/dist/pipeline/cascade-handler.d.ts +2 -1
  495. package/dist/pipeline/cascade-handler.js +3 -2
  496. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  497. package/dist/pipeline/config-accessor-factory.js +1 -1
  498. package/dist/pipeline/context-services.d.ts +56 -0
  499. package/dist/pipeline/context-services.js +73 -0
  500. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  501. package/dist/pipeline/dispatch-batch.js +39 -19
  502. package/dist/pipeline/dispatch-query.js +5 -4
  503. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  504. package/dist/pipeline/dispatch-scope.js +27 -0
  505. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  506. package/dist/pipeline/dispatch-shared.js +75 -194
  507. package/dist/pipeline/dispatch-stream.js +8 -4
  508. package/dist/pipeline/dispatch-write.d.ts +2 -1
  509. package/dist/pipeline/dispatch-write.js +10 -8
  510. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  511. package/dist/pipeline/dispatcher-utils.js +8 -2
  512. package/dist/pipeline/dispatcher.d.ts +3 -2
  513. package/dist/pipeline/dispatcher.js +4 -3
  514. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  515. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  516. package/dist/pipeline/event-dispatcher-delivery.js +7 -3
  517. package/dist/pipeline/event-dispatcher.d.ts +3 -2
  518. package/dist/pipeline/event-dispatcher.js +13 -12
  519. package/dist/pipeline/event-retention.js +59 -56
  520. package/dist/pipeline/handler-access-error.js +2 -1
  521. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  522. package/dist/pipeline/handler-context-auth.js +7 -4
  523. package/dist/pipeline/handler-context-config.d.ts +2 -5
  524. package/dist/pipeline/handler-context-config.js +2 -2
  525. package/dist/pipeline/handler-context-db.d.ts +32 -7
  526. package/dist/pipeline/handler-context-db.js +26 -17
  527. package/dist/pipeline/handler-context-dispatch.d.ts +14 -6
  528. package/dist/pipeline/handler-context-dispatch.js +18 -5
  529. package/dist/pipeline/handler-context-events.d.ts +22 -38
  530. package/dist/pipeline/handler-context-events.js +42 -35
  531. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  532. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  533. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  534. package/dist/pipeline/handler-context-notify.js +1 -1
  535. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  536. package/dist/pipeline/handler-context-observability.js +7 -5
  537. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  538. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  539. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  540. package/dist/pipeline/handler-context-scope.js +18 -20
  541. package/dist/pipeline/index.d.ts +9 -21
  542. package/dist/pipeline/index.js +5 -7
  543. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  544. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  545. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  546. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  547. package/dist/pipeline/member-read-only-transaction.js +11 -3
  548. package/dist/pipeline/member-reader.d.ts +1 -1
  549. package/dist/pipeline/member-reader.js +2 -2
  550. package/dist/pipeline/msp-rebuild.js +5 -3
  551. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  552. package/dist/pipeline/notify-scope.d.ts +2 -1
  553. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  554. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  555. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  556. package/dist/pipeline/projection-rebuild.js +12 -5
  557. package/dist/pipeline/projection-state.d.ts +0 -6
  558. package/dist/pipeline/projection-state.js +0 -5
  559. package/dist/pipeline/projections-runner.d.ts +2 -1
  560. package/dist/pipeline/projections-runner.js +10 -6
  561. package/dist/pipeline/system-hooks.d.ts +6 -2
  562. package/dist/pipeline/system-hooks.js +61 -10
  563. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  564. package/dist/pipeline/system-identity-switch.js +51 -36
  565. package/dist/pipeline/typed-append-event.d.ts +2 -0
  566. package/dist/pipeline/typed-append-event.js +4 -0
  567. package/dist/pipeline/write-origin.js +2 -2
  568. package/dist/pipeline/write-result-masking.d.ts +1 -1
  569. package/dist/pipeline/write-result-masking.js +13 -10
  570. package/dist/random/index.d.ts +1 -2
  571. package/dist/random/index.js +1 -2
  572. package/dist/rate-limit/bucket.d.ts +2 -1
  573. package/dist/rate-limit/middleware.js +2 -1
  574. package/dist/redis/index.d.ts +3 -4
  575. package/dist/redis/index.js +2 -2
  576. package/dist/schema-cli/apply-command.js +5 -2
  577. package/dist/schema-cli/baseline-command.js +7 -2
  578. package/dist/schema-cli/generate-command.js +7 -9
  579. package/dist/schema-cli/shared.d.ts +4 -0
  580. package/dist/schema-cli/shared.js +21 -2
  581. package/dist/schema-cli/status-command.js +8 -2
  582. package/dist/schema-cli/validate-command.js +52 -4
  583. package/dist/schema-cli.d.ts +0 -1
  584. package/dist/search/configure-tenant-index.d.ts +1 -3
  585. package/dist/search/configure-tenant-index.js +0 -4
  586. package/dist/search/index.d.ts +1 -4
  587. package/dist/search/index.js +0 -2
  588. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  589. package/dist/search/meilisearch-adapter-internals.js +9 -0
  590. package/dist/search/meilisearch-adapter.d.ts +1 -8
  591. package/dist/search/meilisearch-adapter.js +6 -7
  592. package/dist/search/meilisearch-peer.d.ts +2 -0
  593. package/dist/search/meilisearch-peer.js +5 -0
  594. package/dist/search/reindex-entity.js +107 -91
  595. package/dist/secrets/index.d.ts +3 -4
  596. package/dist/secrets/index.js +2 -3
  597. package/dist/seeding/index.d.ts +2 -2
  598. package/dist/seeding/index.js +1 -2
  599. package/dist/time/index.d.ts +2 -2
  600. package/dist/time/index.js +1 -1
  601. package/dist/time/tz-context.d.ts +0 -5
  602. package/dist/time/tz-context.js +0 -9
  603. package/dist/ui-types/index.d.ts +8 -11
  604. package/dist/ui-types/index.js +3 -3
  605. package/dist/upgrade-changelog.d.ts +3 -0
  606. package/dist/upgrade-changelog.js +18 -0
  607. package/dist/upgrade-cli-internals.d.ts +8 -0
  608. package/dist/upgrade-cli-internals.js +63 -0
  609. package/dist/upgrade-cli.d.ts +1 -18
  610. package/dist/upgrade-cli.js +29 -137
  611. package/dist/upgrade-marker-parse.d.ts +32 -0
  612. package/dist/upgrade-marker-parse.js +73 -0
  613. package/dist/utils/import-optional-peer.d.ts +6 -0
  614. package/dist/utils/import-optional-peer.js +19 -0
  615. package/dist/utils/index.d.ts +1 -4
  616. package/dist/utils/index.js +1 -4
  617. package/package.json +27 -20
  618. package/src/changes.json +451 -0
  619. package/dist/crypto/request-kms-cache.d.ts +0 -8
  620. package/dist/crypto/request-kms-cache.js +0 -21
  621. package/dist/engine/codemod/index.d.ts +0 -2
  622. package/dist/engine/codemod/index.js +0 -1
  623. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  624. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  625. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  626. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  627. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  628. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  629. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  630. package/dist/engine/feature-ast/extractors/events.js +0 -275
  631. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  632. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  633. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  634. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  635. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  636. package/dist/engine/feature-ast/extractors/index.js +0 -13
  637. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  638. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  639. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  640. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  641. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  642. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  643. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -10
  644. package/dist/engine/feature-ast/extractors/round1.js +0 -81
  645. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  646. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  647. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  648. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  649. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  650. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  651. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  652. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  653. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  654. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  655. package/dist/engine/feature-ast/index.d.ts +0 -16
  656. package/dist/engine/feature-ast/index.js +0 -10
  657. package/dist/engine/feature-ast/parse.d.ts +0 -31
  658. package/dist/engine/feature-ast/parse.js +0 -483
  659. package/dist/engine/feature-ast/patch.d.ts +0 -210
  660. package/dist/engine/feature-ast/patch.js +0 -610
  661. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  662. package/dist/engine/feature-ast/patcher.js +0 -281
  663. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1476
  664. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
  665. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  666. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
  667. package/dist/engine/feature-ast/patterns.d.ts +0 -318
  668. package/dist/engine/feature-ast/patterns.js +0 -106
  669. package/dist/engine/feature-ast/render.d.ts +0 -47
  670. package/dist/engine/feature-ast/render.js +0 -662
  671. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  672. package/dist/engine/feature-ast/source-location.js +0 -27
  673. package/dist/engine/pattern-library/index.d.ts +0 -2
  674. package/dist/engine/pattern-library/index.js +0 -3
  675. package/dist/engine/pattern-library/library.d.ts +0 -14
  676. package/dist/engine/pattern-library/library.js +0 -93
  677. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  678. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  679. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  680. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  681. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  682. package/dist/engine/pattern-library/shared-fields.js +0 -88
  683. package/dist/engine/pattern-library/static-schemas.d.ts +0 -20
  684. package/dist/engine/pattern-library/static-schemas.js +0 -478
  685. package/dist/engine/pattern-library/types.d.ts +0 -158
  686. package/dist/engine/pattern-library/types.js +0 -36
  687. package/dist/engine/provider-plugin-context.d.ts +0 -3
  688. package/dist/engine/provider-plugin-context.js +0 -28
  689. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  690. package/dist/engine/resolve-config-or-param.js +0 -76
  691. package/src/scripts/codemod/README.md +0 -187
  692. package/src/scripts/codemod/codemod-support.ts +0 -334
  693. package/src/scripts/codemod/collect-source-files.ts +0 -48
  694. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  695. package/src/scripts/codemod/db-factory.ts +0 -810
  696. package/src/scripts/codemod/feature-factory.ts +0 -429
  697. package/src/scripts/codemod/feature-layout.ts +0 -424
  698. package/src/scripts/codemod/import-extensions.ts +0 -118
  699. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  700. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  701. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  702. package/src/scripts/codemod/object-form.ts +0 -746
  703. package/src/scripts/codemod/package-merge.ts +0 -299
  704. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  705. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  706. package/src/scripts/codemod/s3-imports.ts +0 -236
  707. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  708. package/src/scripts/codemod/testing-injection.ts +0 -215
  709. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  710. package/src/scripts/codemod/testing-move.ts +0 -542
  711. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -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";
@@ -1,11 +1,12 @@
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
+ import type { JobDeferral, JobTriggerEvent } from "@cosmicdrift/kumiko-types/handlers";
4
+ import type { Meter, SerializedTraceContext, Tracer } from "@cosmicdrift/kumiko-types/observability";
3
5
  import type { TzContext } from "@cosmicdrift/kumiko-types/tz-context";
4
6
  import type { JobsOptions, Queue } from "bullmq";
5
7
  import type { TenantDb } from "../db/tenant-db.ts";
6
- import type { AppContext, JobDeferral, JobDefinition, JobRunIn, JobTriggerEvent } from "../engine/types/index.ts";
8
+ import type { AppContext, JobRunIn } from "../engine/types/index.ts";
7
9
  import type { Logger } from "../logging/types.ts";
8
- import type { Meter, SerializedTraceContext, Tracer } from "../observability/index.ts";
9
10
  import type { JobInvocation, JobLogEntry, JobSubjectValue } from "./job-runner-types.ts";
10
11
  export declare function isJobTriggerEvent(value: unknown): value is JobTriggerEvent;
11
12
  export declare function stampGatedWriteOrigin(data: Record<string, unknown>): void;
@@ -27,11 +28,15 @@ export declare const DEFER_BACKOFF_MAX_DOUBLINGS = 5;
27
28
  export declare function readTraceContext(data: Record<string, unknown>): SerializedTraceContext | undefined;
28
29
  export declare function captureTraceContext(tracer: Tracer): SerializedTraceContext | undefined;
29
30
  export declare function startQueueDepthPolling(queue: Queue, lane: JobRunIn, meter: Meter): Promise<ReturnType<typeof setInterval>>;
30
- export declare function parseRedisOpts(url: string): {
31
+ type RedisConnectionOptions = {
31
32
  host: string;
32
33
  port: number;
33
34
  db?: number | undefined;
35
+ username?: string | undefined;
36
+ password?: string | undefined;
37
+ tls?: Record<string, never> | undefined;
34
38
  };
39
+ export declare function parseRedisOpts(url: string): RedisConnectionOptions;
35
40
  export declare const BOOT_REDIS_TIMEOUT_MS = 10000;
36
41
  export declare const STOP_QUEUE_READY_TIMEOUT_MS = 1000;
37
42
  export declare const BOOT_GATE_SLOW_WARN_MS = 60000;
@@ -46,6 +51,7 @@ export declare const FAILED_JOB_RETENTION_AGE_SEC = 604800;
46
51
  export declare function maxRetryWindowMs(jobDef: JobDefinition): number;
47
52
  export declare function isJobDeferral(value: unknown): value is JobDeferral;
48
53
  export declare function priorDeferCountOf(data: Record<string, unknown>, key: string): number;
54
+ export declare function hasDeferBudgetLeft(data: Record<string, unknown>, maxDefers: number | undefined): boolean;
49
55
  export declare function handlerPayloadOf(data: Record<string, unknown>): Record<string, unknown>;
50
56
  export declare function tenantIdOfJobData(data: Record<string, unknown>): string;
51
57
  export declare function deferDelayMs(deferMs: number, deferCount: number): number;
@@ -56,3 +62,4 @@ export declare function isActiveBefore(other: {
56
62
  readonly id: string | undefined;
57
63
  readonly processedOn: number | undefined;
58
64
  }): boolean;
65
+ export {};
@@ -5,7 +5,7 @@ import { SYSTEM_TENANT_ID } from "../engine/types/index.js";
5
5
  import { InternalError } from "../errors/index.js";
6
6
  import { isKumikoError } from "../errors/kumiko-error.js";
7
7
  import { createFallbackLogger, scrubLogText } from "../logging/index.js";
8
- import { emitJobQueueDepth } from "../observability/index.js";
8
+ import { emitJobQueueDepth } from "../observability/standard-metrics.js";
9
9
  import { TENANT_TIMEZONE_CONFIG_KEY } from "../pipeline/tenant-timezone-config-key.js";
10
10
  import { isPersonalDataGated } from "../pipeline/write-origin.js";
11
11
  import { createTzContext, isValidIanaTimeZone } from "../time/index.js";
@@ -210,6 +210,12 @@ export function parseRedisOpts(url) {
210
210
  if (parsed.pathname.length > 1) {
211
211
  result.db = Number(parsed.pathname.slice(1));
212
212
  }
213
+ if (parsed.username)
214
+ result.username = decodeURIComponent(parsed.username);
215
+ if (parsed.password)
216
+ result.password = decodeURIComponent(parsed.password);
217
+ if (parsed.protocol === "rediss:")
218
+ result.tls = {};
213
219
  return result;
214
220
  }
215
221
  // redisOpts carries no connectTimeout/retry cap, so an unreachable Redis
@@ -299,6 +305,9 @@ export function priorDeferCountOf(data, key) {
299
305
  const prior = data[key];
300
306
  return typeof prior === "number" ? prior : 0;
301
307
  }
308
+ export function hasDeferBudgetLeft(data, maxDefers) {
309
+ return priorDeferCountOf(data, HANDLER_DEFER_COUNT_KEY) < (maxDefers ?? DEFAULT_MAX_DEFERS);
310
+ }
302
311
  export function handlerPayloadOf(data) {
303
312
  const payload = {};
304
313
  for (const [k, v] of Object.entries(data)) {
@@ -1,7 +1,10 @@
1
+ import type { JobDefinition } from "@cosmicdrift/kumiko-types/config";
2
+ import type { DispatchWriteRef } from "@cosmicdrift/kumiko-types/handlers";
3
+ import type { Tracer } from "@cosmicdrift/kumiko-types/observability";
1
4
  import type { Queue } from "bullmq";
2
- import type { AppContext, DispatchWriteRef, JobDefinition, JobRunIn, Registry, TenantId } from "../engine/types/index.ts";
5
+ import type { AppContext, JobRunIn, Registry, TenantId } from "../engine/types/index.ts";
3
6
  import type { createFallbackLogger } from "../logging/index.ts";
4
- import type { EscapeHatchProcessDedup, EscapeHatchReportWindow, Tracer } from "../observability/index.ts";
7
+ import type { EscapeHatchProcessDedup, EscapeHatchReportWindow } from "../observability/escape-hatch-report.ts";
5
8
  import type { DistributedLock } from "../pipeline/distributed-lock.ts";
6
9
  import type { JobRunner, JobRunnerOptions } from "./job-runner-types.ts";
7
10
  export type JobRunnerScope = {
@@ -13,21 +13,21 @@ export function laneForJob(def) {
13
13
  // lane (jobDef.runIn is static), but walking both is cheap and avoids
14
14
  // a subtle bug if someone ever reassigns a job to a different lane
15
15
  // between deploys while old queue contents are still draining.
16
+ // One getJobs per queue reads the requested lists in a single Lua script, so a job
17
+ // moving from waiting to active between two separate reads can no longer vanish
18
+ // from the count; that gap let a third dispatch pass the cap in CI.
16
19
  // `activeOnly` + `self` serve the defer check, which runs inside the job being
17
20
  // counted: it must not see waiting jobs or itself, and only counts jobs that
18
21
  // became active before it. Without that order, workers that fetch a burst of
19
22
  // jobs together all see each other as active and all defer, again and again.
20
23
  export async function isOverPerTenantLimit(scope, jobName, tenantId, max, countFilter = {}) {
21
24
  const { queues } = scope;
22
- const results = await Promise.all([
23
- queues.api.getActive(),
24
- queues.worker.getActive(),
25
- ...(countFilter.activeOnly ? [] : [queues.api.getWaiting(), queues.worker.getWaiting()]),
26
- ]);
25
+ const types = countFilter.activeOnly ? ["active"] : ["active", "waiting"];
26
+ const results = await Promise.all([queues.api.getJobs(types), queues.worker.getJobs(types)]);
27
27
  let count = 0;
28
28
  for (const list of results) {
29
29
  for (const j of list) {
30
- if (j.name !== jobName)
30
+ if (j === undefined || j.name !== jobName)
31
31
  continue;
32
32
  if (countFilter.self && !isActiveBefore(j, countFilter.self))
33
33
  continue;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
- import type { AppContext, DispatchWriteRef, JobRunIn, JobTriggerEvent, Registry, SessionUser, TenantId } from "../engine/types/index.ts";
2
+ import type { DispatchWriteRef, JobTriggerEvent } from "@cosmicdrift/kumiko-types/handlers";
3
+ import type { AppContext, JobRunIn, Registry, SessionUser, TenantId } from "../engine/types/index.ts";
3
4
  export type JobLogEntry = {
4
5
  level: "info" | "warn" | "error";
5
6
  message: string;
@@ -1,13 +1,17 @@
1
1
  import { DelayedError, Queue, Worker } from "bullmq";
2
2
  import { Redis } from "ioredis";
3
3
  import { requestContext } from "../api/request-context.js";
4
+ import { assertNoActiveRowLevelSecurityScope, runInSystemRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
4
5
  import { createTenantDb, createUncheckedSystemDb } from "../db/tenant-db.js";
5
6
  import { bridgeStub } from "../engine/bridge-stub.js";
6
7
  import { createSystemUser } from "../engine/system-user.js";
7
8
  import { SYSTEM_TENANT_ID } from "../engine/types/index.js";
8
9
  import { InternalError } from "../errors/index.js";
9
10
  import { createFallbackLogger } from "../logging/index.js";
10
- import { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, flushEscapeHatchAudits, getFallbackTracer, registerStandardMetrics, } from "../observability/index.js";
11
+ import { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, flushEscapeHatchAudits, } from "../observability/escape-hatch-report.js";
12
+ import { getFallbackTracer } from "../observability/fallback.js";
13
+ import { registerStandardMetrics } from "../observability/standard-metrics.js";
14
+ import { attachOutsideTransaction } from "../pipeline/attach-outside-transaction.js";
11
15
  import { createDistributedLock } from "../pipeline/distributed-lock.js";
12
16
  import { RedisKeys } from "../pipeline/redis-keys.js";
13
17
  import { cronRepeatOptions } from "./cron-repeat-options.js";
@@ -61,7 +65,12 @@ export function createJobRunner(options) {
61
65
  return undefined;
62
66
  return async () => {
63
67
  const systemUser = createSystemUser(SYSTEM_TENANT_ID);
64
- const systemModeDb = createTenantDb({ db, tenantId: SYSTEM_TENANT_ID, mode: "system" });
68
+ const systemModeDb = createTenantDb({
69
+ db,
70
+ tenantId: SYSTEM_TENANT_ID,
71
+ mode: "system",
72
+ reason: "system jobs run without tenant scope and read across tenants by design",
73
+ });
65
74
  const reportEscapeHatch = createEscapeHatchReporter({
66
75
  handler: ACTIVE_TENANT_IDS_QUERY_NAME,
67
76
  tenantId: SYSTEM_TENANT_ID,
@@ -71,8 +80,7 @@ export function createJobRunner(options) {
71
80
  window: escapeHatchReportWindow,
72
81
  });
73
82
  const result = await handler.handler({ type: ACTIVE_TENANT_IDS_QUERY_NAME, payload: {}, user: systemUser }, {
74
- db: systemModeDb,
75
- dbOutsideTransaction: systemModeDb,
83
+ db: attachOutsideTransaction(systemModeDb, systemModeDb),
76
84
  systemDb: createUncheckedSystemDb(systemModeDb, undefined, reportEscapeHatch),
77
85
  registry,
78
86
  ...bridgeStub(),
@@ -198,7 +206,11 @@ export function createJobRunner(options) {
198
206
  getSelfRunner: () => selfRunner,
199
207
  getDispatchWriteRef: () => dispatchWriteRef,
200
208
  };
201
- async function handleJob(bullJob, token) {
209
+ // Per invocation, never around the worker loop: the loop itself must stay outside any scope.
210
+ function handleJob(bullJob, token) {
211
+ return runInSystemRowLevelSecurityScope("job runner executes jobs of every tenant", () => handleJobInScope(bullJob, token));
212
+ }
213
+ async function handleJobInScope(bullJob, token) {
202
214
  const perTenantTarget = perTenantTargetOf(bullJob.name);
203
215
  if (perTenantTarget !== undefined) {
204
216
  await fanOutPerTenantJob(scope, bullJob, perTenantTarget);
@@ -264,6 +276,9 @@ export function createJobRunner(options) {
264
276
  // a hanging process instead of a non-zero exit.
265
277
  await worker?.close();
266
278
  worker = null;
279
+ // A failed start() may never be followed by stop(); the abandoned gate must not keep
280
+ // writing to DB/Redis while the process shuts down.
281
+ await settleAbandonedBootGates(Math.min(bootRedisTimeoutMs, STOP_QUEUE_READY_TIMEOUT_MS));
267
282
  throw err;
268
283
  }
269
284
  finally {
@@ -343,6 +358,7 @@ export function createJobRunner(options) {
343
358
  }
344
359
  const runnerApi = {
345
360
  async start() {
361
+ assertNoActiveRowLevelSecurityScope("JobRunner worker");
346
362
  // skip: enqueuer-only runner — no BullMQ worker, no cron schedules,
347
363
  // no boot jobs. The API-process (runLocalJobs=false) lands here; it
348
364
  // still holds the queue-clients so dispatch()/handleEvent() can
@@ -572,7 +588,7 @@ export function createJobRunner(options) {
572
588
  data[TRACE_CONTEXT_KEY] = traceCtx;
573
589
  // Propagate correlation from the scheduling request into the job
574
590
  // execution context. The worker re-enters requestContext.run with
575
- // this value so ctx.appendEvent / executor writes during the job
591
+ // this value so ctx.events.append / executor writes during the job
576
592
  // stamp the same correlation as the HTTP request that scheduled it.
577
593
  const reqCtx = requestContext.get();
578
594
  if (reqCtx?.correlationId)
@@ -1,4 +1,4 @@
1
- import type { JobDefinition } from "../engine/types/index.ts";
1
+ import type { JobDefinition } from "@cosmicdrift/kumiko-types/config";
2
2
  export declare const DEFAULT_MAX_PER_TENANT_DEFER_MS = 1000;
3
3
  export type ResolvedMaxPerTenant = {
4
4
  readonly limit: number;
@@ -1,5 +1,4 @@
1
- export type { LoggerOptions } from "./pino-logger.ts";
2
1
  export { createLogger } from "./pino-logger.ts";
3
- export { scrubLogText, scrubLogValue } from "./scrub.ts";
2
+ export { scrubLogText } from "./scrub.ts";
4
3
  export type { Logger } from "./types.ts";
5
4
  export { createFallbackLogger, setProcessLogger } from "./utils.ts";
@@ -1,3 +1,3 @@
1
1
  export { createLogger } from "./pino-logger.js";
2
- export { scrubLogText, scrubLogValue } from "./scrub.js";
2
+ export { scrubLogText } from "./scrub.js";
3
3
  export { createFallbackLogger, setProcessLogger } from "./utils.js";
@@ -1,5 +1,5 @@
1
1
  import pino, {} from "pino";
2
- import { observabilityContext } from "../observability/index.js";
2
+ import { observabilityContext } from "../observability/context.js";
3
3
  import { requestLogFields } from "./request-log-fields.js";
4
4
  const REDACTED_KEYS = [
5
5
  "password",
@@ -7,4 +7,5 @@ type FallbackLogger = {
7
7
  };
8
8
  export declare function setProcessLogger(logger: Logger | null): void;
9
9
  export declare function createFallbackLogger(namespace: string, logger?: (Pick<Logger, "error"> & Partial<Pick<Logger, "info" | "warn" | "debug" | "child">>) | undefined): FallbackLogger;
10
+ export declare function createFallbackFullLogger(namespace: string): Logger;
10
11
  export {};
@@ -101,3 +101,9 @@ export function createFallbackLogger(namespace, logger) {
101
101
  },
102
102
  };
103
103
  }
104
+ // A full Logger for contexts whose typed surface promises one (ctx.obs.log) but that have no
105
+ // app logger wired; child() returns the same instance because there is no sink to scope.
106
+ export function createFallbackFullLogger(namespace) {
107
+ const logger = { ...createFallbackLogger(namespace), child: () => logger };
108
+ return logger;
109
+ }
@@ -1,4 +1,4 @@
1
- export { assertKumikoSchemaCurrent, type ChecksumMismatch, detectKumikoDrift, formatKumikoDriftReport, type KumikoDriftReport, SchemaDriftError, } from "./kumiko-drift.ts";
2
- export { createPendingRebuildsTable, type EnqueueProjectionRebuildDeps, type EnqueueProjectionRebuildResult, enqueueProjectionRebuild, listPendingRebuilds, type PendingRebuildRun, PROJECTION_REBUILD_JOB, pendingRebuildsTable, queueRebuildsFromMarkers, type RunPendingRebuildsOptions, rebuildProjectionOrMultiStream, reportPendingRebuildRun, runPendingRebuilds, } from "./pending-rebuilds.ts";
3
- export { createPiiBackfillStateTable, type PiiEventBackfillOptions, type PiiEventBackfillResult, type PiiRebuildRun, piiAnnotationFingerprint, piiBackfillStateTable, runPiiEventBackfill, } from "./pii-event-backfill.ts";
1
+ export { assertKumikoSchemaCurrent, SchemaDriftError, } from "./kumiko-drift.ts";
2
+ export { enqueueProjectionRebuild, listPendingRebuilds, PROJECTION_REBUILD_JOB, queueRebuildsFromMarkers, rebuildProjectionOrMultiStream, reportPendingRebuildRun, runPendingRebuilds, } from "./pending-rebuilds.ts";
3
+ export { runPiiEventBackfill } from "./pii-event-backfill.ts";
4
4
  export { buildProjectionTableIndex } from "./projection-table-index.ts";
@@ -1,8 +1,8 @@
1
1
  // Drizzle-free gate (kumiko/migrations system) — the canonical boot-gate.
2
- export { assertKumikoSchemaCurrent, detectKumikoDrift, formatKumikoDriftReport, SchemaDriftError, } from "./kumiko-drift.js";
2
+ export { assertKumikoSchemaCurrent, SchemaDriftError, } from "./kumiko-drift.js";
3
3
  // Persistente Pending-Rebuild-Queue (survives Rebuild-Failures + Crashes).
4
- export { createPendingRebuildsTable, enqueueProjectionRebuild, listPendingRebuilds, PROJECTION_REBUILD_JOB, pendingRebuildsTable, queueRebuildsFromMarkers, rebuildProjectionOrMultiStream, reportPendingRebuildRun, runPendingRebuilds, } from "./pending-rebuilds.js";
4
+ export { enqueueProjectionRebuild, listPendingRebuilds, PROJECTION_REBUILD_JOB, queueRebuildsFromMarkers, rebuildProjectionOrMultiStream, reportPendingRebuildRun, runPendingRebuilds, } from "./pending-rebuilds.js";
5
5
  // Boot-time backfill: re-encrypts plaintext events after a PII annotation was added.
6
- export { createPiiBackfillStateTable, piiAnnotationFingerprint, piiBackfillStateTable, runPiiEventBackfill, } from "./pii-event-backfill.js";
6
+ export { runPiiEventBackfill } from "./pii-event-backfill.js";
7
7
  // tableName → projection-name, for application-side projection rebuilds.
8
8
  export { buildProjectionTableIndex } from "./projection-table-index.js";
@@ -2,7 +2,7 @@ import type { DbConnection } from "../db/connection.ts";
2
2
  import type { Registry } from "../engine/types/index.ts";
3
3
  import type { JobRunner } from "../jobs/index.ts";
4
4
  import type { Logger } from "../logging/types.ts";
5
- import { type RebuildResult } from "../pipeline/index.ts";
5
+ import type { RebuildResult } from "../pipeline/projection-rebuild.ts";
6
6
  export declare const pendingRebuildsTable: import("@cosmicdrift/kumiko-types/executor-brand").WritableSchemaTable;
7
7
  export declare function createPendingRebuildsTable(db: DbConnection): Promise<void>;
8
8
  /** Reads rebuild markers from freshly applied migrations and queues the
@@ -16,7 +16,7 @@ import { readRebuildMarker } from "../db/rebuild-marker.js";
16
16
  import { tableExists } from "../db/schema-inspection.js";
17
17
  import { unsafePushTables } from "../db/table-push.js";
18
18
  import { createFallbackLogger } from "../logging/utils.js";
19
- import { rebuildMultiStreamProjection, rebuildProjection, } from "../pipeline/index.js";
19
+ import { rebuildMultiStreamProjection, rebuildProjection } from "../pipeline/index.js";
20
20
  import { buildProjectionTableIndex } from "./projection-table-index.js";
21
21
  export const pendingRebuildsTable = pgTable("kumiko_pending_rebuilds", {
22
22
  tableName: text("table_name").primaryKey(),
@@ -17,6 +17,7 @@ import { backfillEventPiiEncryptionBatch, } from "../db/queries/backfill-pii.js"
17
17
  import { alterTableAddColumn } from "../db/queries/ddl.js";
18
18
  import { persistPiiBackfillState, readPiiBackfillState, } from "../db/queries/pii-backfill-state.js";
19
19
  import { upsertOnConflict } from "../db/query.js";
20
+ import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
20
21
  import { tableExists } from "../db/schema-inspection.js";
21
22
  import { withoutStatementTimeout } from "../db/statement-timeout.js";
22
23
  import { unsafePushTables } from "../db/table-push.js";
@@ -209,7 +210,9 @@ function reportRunOutcome(log, progress) {
209
210
  }
210
211
  }
211
212
  export function runPiiEventBackfill(db, registry, options = {}) {
212
- return withoutStatementTimeout(db, (unboundedDb) => backfillPiiEvents(unboundedDb, registry, options));
213
+ return runInSystemRowLevelSecurityScope("PII event backfill rewrites events across all tenants", () => {
214
+ return withoutStatementTimeout(db, (unboundedDb) => backfillPiiEvents(unboundedDb, registry, options));
215
+ });
213
216
  }
214
217
  async function backfillPiiEvents(db, registry, options) {
215
218
  const log = createFallbackLogger("pii-event-backfill", options.logger);
@@ -1,4 +1,5 @@
1
- import type { EscapeHatchAuditSink, EscapeHatchKind, EscapeHatchReporter, EscapeHatchUseEvent, TenantId } from "../engine/types/index.ts";
1
+ import type { EscapeHatchAuditSink, EscapeHatchKind, EscapeHatchReporter, EscapeHatchUseEvent } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { TenantId } from "../engine/types/index.ts";
2
3
  import type { Logger } from "../logging/types.ts";
3
4
  import type { Meter } from "./types/index.ts";
4
5
  export declare const ESCAPE_HATCH_USED_SIGNAL = "security:escape-hatch-used";
@@ -40,6 +40,12 @@ const READ_WINDOW_KINDS = new Set([
40
40
  // A long-lived worker must leave an audit event inside every retention window
41
41
  // (90 days), or its crons vanish from the log once the first event is pruned.
42
42
  const PROCESS_REAUDIT_INTERVAL_MS = 24 * 60 * 60 * 1000;
43
+ // Declared escape hatches of system crons are audited once per day and process for each
44
+ // (handler, kind, tenant, target): the declaration, the system actor and the reason are
45
+ // identical on every run, so repeats carry no information. The target is part of the
46
+ // key only where it names a table (one run can write several global tables); a row target
47
+ // would add a key and an audit event per touched foreign row.
48
+ const TABLE_TARGET_KINDS = new Set(["global-write"]);
43
49
  // Row-level targets add a key per touched row; without a sweep a long-lived worker keeps them all.
44
50
  function sweepExpiredProcessDedup(dedup, nowMs) {
45
51
  if (nowMs - dedup.lastSweep.atMs >= PROCESS_REAUDIT_INTERVAL_MS) {
@@ -157,12 +163,13 @@ export function createEscapeHatchReporter(opts) {
157
163
  emitEscapeHatchUse(opts.meter, opts.handler, kind);
158
164
  const { processDedup } = opts;
159
165
  if (processDedup?.kinds.has(kind)) {
166
+ const keyTarget = TABLE_TARGET_KINDS.has(kind) ? target : undefined;
160
167
  const processKey = JSON.stringify([
161
168
  opts.handler,
162
169
  kind,
163
170
  opts.tenantId,
164
- target?.id ?? null,
165
- target?.tenantId ?? null,
171
+ keyTarget?.id ?? null,
172
+ keyTarget?.tenantId ?? null,
166
173
  ]);
167
174
  const nowMs = now();
168
175
  const lastAuditedAt = processDedup.lastAuditedAt.get(processKey);
@@ -1,16 +1,8 @@
1
- export { type ConsoleProviderOptions, createConsoleProvider } from "./console-provider.ts";
2
- export { observabilityContext } from "./context.ts";
3
- export { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, ESCAPE_HATCH_USED_SIGNAL, type EscapeHatchProcessDedup, type EscapeHatchReportWindow, fallbackEscapeHatchReporter, flushEscapeHatchAudits, reportEscapeHatchUse, UNATTRIBUTED_ACTOR, withEscapeHatchAuditScope, } from "./escape-hatch-report.ts";
4
- export { getFallbackMeter, getFallbackProvider, getFallbackTracer } from "./fallback.ts";
5
- export { generateSpanId, generateTraceId } from "./ids.ts";
6
- export { buildMetricName, validateLabelKey, validateMetricName, } from "./metric-validator.ts";
7
- export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, createUnboundMetricsHandle, } from "./metrics-handle.ts";
8
- export { type ObservabilityWiring, prometheusMetricsEnvSchema, resolveObservabilityWiring, } from "./metrics-wiring.ts";
1
+ export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, } from "./metrics-handle.ts";
2
+ export { prometheusMetricsEnvSchema, resolveObservabilityWiring, } from "./metrics-wiring.ts";
9
3
  export { createNoopProvider } from "./noop-provider.ts";
10
- export { createPrometheusMeter, type PrometheusMeter, type PrometheusMeterSnapshot, serializeOpenMetrics, } from "./prometheus-meter.ts";
11
- export { type MetricEvent, type MetricEventHandler, RecordingMeter, } from "./recording-meter.ts";
12
- export { type RecordedSpan, RecordingTracer, type RecordingTracerOptions, serializeSpanContext, } from "./recording-tracer.ts";
13
- export { wrapRedisClient } from "./redis-wrapper.ts";
14
- export { DEFAULT_SENSITIVE_CONFIG, mergeSensitiveConfig, REDACTED, redactAttributes, redactHeaders, redactQueryString, redactValue, shouldRedactAttribute, } from "./sensitive-filter.ts";
15
- export { emitDbQuery, emitDispatcherError, emitDispatcherHandler, emitEscapeHatchUse, emitEventConsumerLag, emitEventConsumerPassOutcome, emitEventConsumerPassSkipped, emitEventConsumerPendingGaps, emitEventConsumerRearmExhausted, emitEventDispatcherListenConnected, emitHttpRequest, emitJobLastSuccess, emitJobQueueDepth, registerStandardMetrics, STANDARD_METRIC_DEFS, } from "./standard-metrics.ts";
16
- export type { Counter, Gauge, Histogram, Meter, MetricDefinition, MetricLabels, MetricsHandle, MetricType, ObservabilityOptions, ObservabilityProvider, SamplingConfig, SensitiveFilterConfig, SerializedTraceContext, Span, SpanAttributes, SpanAttributeValue, SpanKind, SpanStatus, StartSpanOptions, Tracer, } from "./types/index.ts";
4
+ export { createPrometheusMeter } from "./prometheus-meter.ts";
5
+ export { type MetricEvent, RecordingMeter, } from "./recording-meter.ts";
6
+ export { type RecordedSpan, RecordingTracer, } from "./recording-tracer.ts";
7
+ export { DEFAULT_SENSITIVE_CONFIG, mergeSensitiveConfig, } from "./sensitive-filter.ts";
8
+ export type { MetricsHandle, ObservabilityOptions, ObservabilityProvider, } from "./types/index.ts";
@@ -1,16 +1,8 @@
1
1
  // Public surface of the observability module.
2
- export { createConsoleProvider } from "./console-provider.js";
3
- export { observabilityContext } from "./context.js";
4
- export { createEscapeHatchProcessDedup, createEscapeHatchReporter, createEscapeHatchReportWindow, ESCAPE_HATCH_USED_SIGNAL, fallbackEscapeHatchReporter, flushEscapeHatchAudits, reportEscapeHatchUse, UNATTRIBUTED_ACTOR, withEscapeHatchAuditScope, } from "./escape-hatch-report.js";
5
- export { getFallbackMeter, getFallbackProvider, getFallbackTracer } from "./fallback.js";
6
- export { generateSpanId, generateTraceId } from "./ids.js";
7
- export { buildMetricName, validateLabelKey, validateMetricName, } from "./metric-validator.js";
8
- export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, createUnboundMetricsHandle, } from "./metrics-handle.js";
2
+ export { createMetricsForFactory, createMetricsHandle, createNoopMetricsHandle, createSafeMetricsHandle, } from "./metrics-handle.js";
9
3
  export { prometheusMetricsEnvSchema, resolveObservabilityWiring, } from "./metrics-wiring.js";
10
4
  export { createNoopProvider } from "./noop-provider.js";
11
- export { createPrometheusMeter, serializeOpenMetrics, } from "./prometheus-meter.js";
5
+ export { createPrometheusMeter } from "./prometheus-meter.js";
12
6
  export { RecordingMeter, } from "./recording-meter.js";
13
- export { RecordingTracer, serializeSpanContext, } from "./recording-tracer.js";
14
- export { wrapRedisClient } from "./redis-wrapper.js";
15
- export { DEFAULT_SENSITIVE_CONFIG, mergeSensitiveConfig, REDACTED, redactAttributes, redactHeaders, redactQueryString, redactValue, shouldRedactAttribute, } from "./sensitive-filter.js";
16
- export { emitDbQuery, emitDispatcherError, emitDispatcherHandler, emitEscapeHatchUse, emitEventConsumerLag, emitEventConsumerPassOutcome, emitEventConsumerPassSkipped, emitEventConsumerPendingGaps, emitEventConsumerRearmExhausted, emitEventDispatcherListenConnected, emitHttpRequest, emitJobLastSuccess, emitJobQueueDepth, registerStandardMetrics, STANDARD_METRIC_DEFS, } from "./standard-metrics.js";
7
+ export { RecordingTracer, } from "./recording-tracer.js";
8
+ export { DEFAULT_SENSITIVE_CONFIG, mergeSensitiveConfig, } from "./sensitive-filter.js";
@@ -51,7 +51,7 @@ export function validateMetricName(name, type) {
51
51
  // r.metric() is called with `feature.name` as registered at defineFeature
52
52
  // time) — normalize "-" to "_" here so a feature like "ai-foundation"
53
53
  // resolves to the same "kumiko_ai_foundation_x" on both the registration
54
- // path (registry-ingest.ts) and the read path (ctx.metrics / ctx.metricsFor),
54
+ // path (registry-ingest.ts) and the read path (ctx.obs.metrics / ctx.obs.metricsFor),
55
55
  // instead of the kebab form being rejected outright.
56
56
  export function buildMetricName(featureName, shortName) {
57
57
  const normalizedFeatureName = toKebab(featureName).replace(/-/g, "_");