@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,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 = {
@@ -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);
@@ -346,6 +358,7 @@ export function createJobRunner(options) {
346
358
  }
347
359
  const runnerApi = {
348
360
  async start() {
361
+ assertNoActiveRowLevelSecurityScope("JobRunner worker");
349
362
  // skip: enqueuer-only runner — no BullMQ worker, no cron schedules,
350
363
  // no boot jobs. The API-process (runLocalJobs=false) lands here; it
351
364
  // still holds the queue-clients so dispatch()/handleEvent() can
@@ -575,7 +588,7 @@ export function createJobRunner(options) {
575
588
  data[TRACE_CONTEXT_KEY] = traceCtx;
576
589
  // Propagate correlation from the scheduling request into the job
577
590
  // execution context. The worker re-enters requestContext.run with
578
- // this value so ctx.appendEvent / executor writes during the job
591
+ // this value so ctx.events.append / executor writes during the job
579
592
  // stamp the same correlation as the HTTP request that scheduled it.
580
593
  const reqCtx = requestContext.get();
581
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";
@@ -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, "_");
@@ -1,6 +1,5 @@
1
1
  import type { Meter, MetricsHandle } from "./types/index.ts";
2
2
  export declare function createMetricsHandle(meter: Meter, featureName: string): MetricsHandle;
3
3
  export declare function createSafeMetricsHandle(meter: Meter, featureName: string): MetricsHandle;
4
- export declare function createUnboundMetricsHandle(meter: Meter): MetricsHandle;
5
4
  export declare function createNoopMetricsHandle(): MetricsHandle;
6
5
  export declare function createMetricsForFactory(meter: Meter | undefined): (featureName: string) => MetricsHandle;
@@ -26,7 +26,7 @@ export function createMetricsHandle(meter, featureName) {
26
26
  // Same feature-bound resolution as createMetricsHandle, but for an
27
27
  // explicit `featureName` chosen by the caller rather than the dispatching
28
28
  // handler's own feature. Meant for shared/library code
29
- // invoked from many features' HandlerContext (ctx.metricsFor) — the
29
+ // invoked from many features' HandlerContext (ctx.obs.metricsFor) — the
30
30
  // library owns one stable metric name instead of splintering into
31
31
  // kumiko_<caller>_x per consumer.
32
32
  //
@@ -77,19 +77,6 @@ export function createSafeMetricsHandle(meter, featureName) {
77
77
  // Fallback for contexts where the feature is unknown (e.g. system-hooks,
78
78
  // internal pipeline code). Short names are used verbatim — useful for
79
79
  // framework-level usage, but rejected by the Meter unless pre-registered.
80
- export function createUnboundMetricsHandle(meter) {
81
- return {
82
- inc(name, labels, value) {
83
- meter.counter(name).inc(value, labels);
84
- },
85
- observe(name, value, labels) {
86
- meter.histogram(name).observe(value, labels);
87
- },
88
- set(name, value, labels) {
89
- meter.gauge(name).set(value, labels);
90
- },
91
- };
92
- }
93
80
  // Noop fallback used when no provider is configured and for safety in
94
81
  // contexts where we can't determine the feature. Every call is a no-op —
95
82
  // tests and non-observability-aware features never crash.
@@ -100,7 +87,7 @@ export function createNoopMetricsHandle() {
100
87
  set(_name, _value, _labels) { },
101
88
  };
102
89
  }
103
- // Shared factory behind ctx.metricsFor for handler and job contexts, so both
90
+ // Shared factory behind ctx.obs.metricsFor for handler and job contexts, so both
104
91
  // keep the same no-op-on-unregistered contract.
105
92
  export function createMetricsForFactory(meter) {
106
93
  return meter
@@ -1,4 +1,4 @@
1
- import type { SensitiveFilterConfig, SerializedTraceContext, Span, SpanAttributeValue, SpanKind, SpanStatus, StartSpanOptions, Tracer } from "./types/index.ts";
1
+ import type { SensitiveFilterConfig, Span, SpanAttributeValue, SpanKind, SpanStatus, StartSpanOptions, Tracer } from "./types/index.ts";
2
2
  export type RecordedSpan = {
3
3
  readonly traceId: string;
4
4
  readonly spanId: string;
@@ -28,5 +28,4 @@ export declare class RecordingTracer implements Tracer {
28
28
  withSpan<T>(name: string, optionsOrFn: StartSpanOptions | ((span: Span) => Promise<T>), fn?: (span: Span) => Promise<T>): Promise<T>;
29
29
  getActiveSpan(): Span | undefined;
30
30
  }
31
- export declare function serializeSpanContext(span: Span): SerializedTraceContext;
32
31
  export {};
@@ -127,9 +127,3 @@ export class RecordingTracer {
127
127
  }
128
128
  }
129
129
  // Helper to serialize an active Span into the cross-process format.
130
- export function serializeSpanContext(span) {
131
- return {
132
- traceId: span.traceId,
133
- spanId: span.spanId,
134
- };
135
- }
@@ -2,8 +2,6 @@ import type { SensitiveFilterConfig, SpanAttributeValue } from "./types/index.ts
2
2
  export declare const REDACTED = "[REDACTED]";
3
3
  export declare const DEFAULT_SENSITIVE_CONFIG: SensitiveFilterConfig;
4
4
  export declare function mergeSensitiveConfig(override: Partial<SensitiveFilterConfig> | undefined): SensitiveFilterConfig;
5
- export declare function redactHeaders(headers: Readonly<Record<string, string>>, config: SensitiveFilterConfig): Record<string, string>;
6
- export declare function redactQueryString(input: string, config: SensitiveFilterConfig): string;
7
5
  export declare function shouldRedactAttribute(key: string, config: SensitiveFilterConfig): boolean;
8
6
  export declare function redactValue(value: SpanAttributeValue): SpanAttributeValue;
9
7
  export declare function redactAttributes(attrs: Readonly<Record<string, SpanAttributeValue>>, config: SensitiveFilterConfig): Record<string, SpanAttributeValue>;
@@ -32,35 +32,6 @@ export function mergeSensitiveConfig(override) {
32
32
  DEFAULT_SENSITIVE_CONFIG.redactedAttributeKeyPatterns,
33
33
  };
34
34
  }
35
- function lowercaseSet(names) {
36
- return new Set(names.map((n) => n.toLowerCase()));
37
- }
38
- export function redactHeaders(headers, config) {
39
- const redacted = lowercaseSet(config.redactedHeaders);
40
- const out = {};
41
- for (const [key, value] of Object.entries(headers)) {
42
- out[key] = redacted.has(key.toLowerCase()) ? REDACTED : value;
43
- }
44
- return out;
45
- }
46
- // Redact sensitive query params in a URL or query string. Returns a new URL
47
- // string with the same shape — path, fragment, and ordering preserved.
48
- export function redactQueryString(input, config) {
49
- const redacted = lowercaseSet(config.redactedQueryParams);
50
- // URL wants absolute; handle both absolute and path-only forms.
51
- const hasScheme = /^[a-z][a-z0-9+\-.]*:/i.test(input);
52
- const base = hasScheme ? undefined : "http://_internal";
53
- const url = base ? new URL(input, base) : new URL(input);
54
- for (const key of Array.from(url.searchParams.keys())) {
55
- if (redacted.has(key.toLowerCase())) {
56
- url.searchParams.set(key, REDACTED);
57
- }
58
- }
59
- if (!hasScheme) {
60
- return `${url.pathname}${url.search}${url.hash}`;
61
- }
62
- return url.toString();
63
- }
64
35
  // Check a single attribute key against the redaction patterns.
65
36
  // Used by the Span implementation when setAttribute is called.
66
37
  export function shouldRedactAttribute(key, config) {
@@ -1,6 +1,7 @@
1
+ import type { ActiveMembershipResult } from "@cosmicdrift/kumiko-types/handlers";
1
2
  import { type PrincipalStatusPlugin, type TenantLifecycleStatusPlugin } from "../engine/active-membership.ts";
2
3
  import type { TenantId } from "../engine/types/identifiers.ts";
3
- import type { ActiveMembershipResult, Registry } from "../engine/types/index.ts";
4
+ import type { Registry } from "../engine/types/index.ts";
4
5
  import { type DispatchContext } from "./dispatch-shared.ts";
5
6
  export type ActiveMembershipPolicy = {
6
7
  readonly allowPendingDestruction: boolean;
@@ -1,5 +1,6 @@
1
1
  // One framework-owned composition of membership / principal-status /
2
2
  // tenant-lifecycle checks so login, switch-tenant and MFA completion can't independently drift.
3
+ import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
3
4
  import { isPrincipalStatusPlugin, isTenantLifecycleStatusPlugin, TENANT_TEARDOWN_STATUSES, } from "../engine/active-membership.js";
4
5
  import { EXT_PRINCIPAL_STATUS, EXT_TENANT_LIFECYCLE_STATUS } from "../engine/extension-names.js";
5
6
  import { createSystemUser } from "../engine/system-user.js";
@@ -41,7 +42,7 @@ async function findMembership(ctx, userId, tenantId) {
41
42
  }
42
43
  return rawMemberships.find((m) => m.tenantId === tenantId);
43
44
  }
44
- // Exported so member-reader.ts (ctx.queryAsMember) can reach the registered
45
+ // Exported so member-reader.ts (ctx.dispatch.queryAsMember) can reach the registered
45
46
  // PrincipalStatusPlugin's resolveProfile without duplicating this lookup.
46
47
  export function resolvePrincipalPlugin(registry) {
47
48
  const usages = registry.getExtensionUsages(EXT_PRINCIPAL_STATUS);
@@ -84,7 +85,10 @@ function isTeardownRejected(status, policy) {
84
85
  }
85
86
  // Order is load-bearing: a non-member must never learn a foreign tenant's
86
87
  // lifecycle/blocked state, so membership is resolved and checked FIRST.
87
- export async function resolveActiveMembershipFn(ctx, userId, tenantId, policy) {
88
+ export function resolveActiveMembershipFn(ctx, userId, tenantId, policy) {
89
+ return runInSystemRowLevelSecurityScope("active membership lookup runs before the request tenant is established", () => resolveActiveMembershipInScope(ctx, userId, tenantId, policy));
90
+ }
91
+ async function resolveActiveMembershipInScope(ctx, userId, tenantId, policy) {
88
92
  const { registry } = ctx;
89
93
  const membership = await findMembership(ctx, userId, tenantId);
90
94
  if (!membership) {
@@ -1,5 +1,6 @@
1
+ import type { AppendEventArgs } from "@cosmicdrift/kumiko-types/handlers";
1
2
  import type { DbRunner } from "../db/connection.ts";
2
- import type { AppendEventArgs, Registry, TenantId } from "../engine/types/index.ts";
3
+ import type { Registry, TenantId } from "../engine/types/index.ts";
3
4
  import { type StoredEvent } from "../event-store/event-store.ts";
4
5
  export type AppendDomainEventCoreDeps = {
5
6
  readonly registry: Registry;
@@ -63,7 +63,7 @@ export async function appendDomainEventCore(deps, args) {
63
63
  throw new ArchivedStreamError(deps.tenantId, args.aggregateId);
64
64
  }
65
65
  // Stream-version authoritative. See Block 0 / getStreamVersion doc for
66
- // why row.version isn't sufficient once ctx.appendEvent enters the picture.
66
+ // why row.version isn't sufficient once ctx.events.append enters the picture.
67
67
  // A caller-pinned version (fetchForWriting handles) must reach append() so a
68
68
  // write landing between fetch and append conflicts instead of being re-read.
69
69
  const expectedVersion = args.expectedVersion ?? (await getStreamVersion(deps.db, args.aggregateId, deps.tenantId));
@@ -91,7 +91,7 @@ export async function appendDomainEventCore(deps, args) {
91
91
  });
92
92
  // Inline projections fire in the same tx — a throw rolls everything back
93
93
  // together. Same semantics regardless of which call-site triggered the
94
- // append (write-handler ctx.appendEvent vs. MSP-apply ctx.appendEvent).
94
+ // append (write-handler ctx.events.append vs. MSP-apply ctx.appendEvent).
95
95
  await runProjectionsForEvent(stored, deps.registry, deps.db);
96
96
  return stored;
97
97
  }
@@ -0,0 +1,3 @@
1
+ export declare function attachOutsideTransaction<T extends object, O extends object | undefined>(db: T, outsideTransaction: O): T & {
2
+ readonly outsideTransaction: O;
3
+ };
@@ -0,0 +1,13 @@
1
+ // TenantDb identity keys WeakMaps (rebinders, personal-data gates), so the exposed db is never
2
+ // wrapped or spread; the non-enumerable property keeps spreads and logging of the db unchanged.
3
+ function defineOutsideTransaction(db, outsideTransaction) {
4
+ Object.defineProperty(db, "outsideTransaction", {
5
+ value: outsideTransaction,
6
+ enumerable: false,
7
+ configurable: true,
8
+ });
9
+ }
10
+ export function attachOutsideTransaction(db, outsideTransaction) {
11
+ defineOutsideTransaction(db, outsideTransaction);
12
+ return db;
13
+ }
@@ -1,4 +1,5 @@
1
- import type { AuthClaimsContext, AuthClaimsHookDef, SessionUser } from "../engine/types/index.ts";
1
+ import type { AuthClaimsContext, AuthClaimsHookDef } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { SessionUser } from "../engine/types/index.ts";
2
3
  import type { Logger } from "../logging/types.ts";
3
4
  export type ResolveAuthClaimsArgs = {
4
5
  readonly user: SessionUser;
@@ -1,5 +1,6 @@
1
+ import type { PreDeleteHookFn } from "@cosmicdrift/kumiko-types/hooks";
1
2
  import type { TableColumns } from "../db/dialect.ts";
2
- import type { PreDeleteHookFn, Registry } from "../engine/types/index.ts";
3
+ import type { Registry } from "../engine/types/index.ts";
3
4
  import type { SystemHookDef } from "./lifecycle-pipeline.ts";
4
5
  type TableMap = ReadonlyMap<string, TableColumns>;
5
6
  export declare function createCascadeDeleteHook(registry: Registry, tables: TableMap): SystemHookDef<PreDeleteHookFn>;
@@ -4,7 +4,8 @@ import { isBoundTenantDb } from "../db/tenant-db-runner.js";
4
4
  import { OnDeleteStrategies, SystemHookNames, SystemHookPriorities } from "../engine/constants.js";
5
5
  import { isRecordLocked } from "../engine/screen-helpers.js";
6
6
  import { createSystemUser } from "../engine/system-user.js";
7
- import { ConflictError, FrameworkReasons, InternalError, RecordLockedError, reraiseAsKumikoError, } from "../errors/index.js";
7
+ import { RecordLockedError } from "../errors/classes.js";
8
+ import { ConflictError, FrameworkReasons, InternalError, reraiseAsKumikoError, } from "../errors/index.js";
8
9
  // The cascade is a consequence of the parent delete the caller was already authorized for, so the
9
10
  // children are written as the framework system user and the lock decision is taken once, up front.
10
11
  const CASCADE_CHILD_WRITE_OPTIONS = { unsafeSkipLockGuard: true };
@@ -18,7 +19,7 @@ export function createCascadeDeleteHook(registry, tables) {
18
19
  ? ctx.systemDb.acknowledgeCrossTenant(`cascade delete for r.systemScope() write handler (${entityName ?? "unknown"})`)
19
20
  : ctx.db;
20
21
  if (!entityName || !db) {
21
- ctx.log?.debug(`cascadeDelete: skipping — ${!entityName ? "no entityName" : "no db"} on payload ${payload.id}`);
22
+ ctx.obs.log?.debug(`cascadeDelete: skipping — ${!entityName ? "no entityName" : "no db"} on payload ${payload.id}`);
22
23
  return;
23
24
  }
24
25
  const writeDb = isBoundTenantDb(db) ? db : undefined;