@cosmicdrift/kumiko-framework 0.327.0 → 0.328.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 (2086) hide show
  1. package/dist/api/anonymous-cookie.d.ts +8 -0
  2. package/dist/api/anonymous-cookie.js +40 -0
  3. package/dist/api/api-constants.d.ts +47 -0
  4. package/dist/api/api-constants.js +136 -0
  5. package/dist/api/auth-middleware.d.ts +42 -0
  6. package/dist/api/auth-middleware.js +450 -0
  7. package/dist/api/auth-routes.d.ts +83 -0
  8. package/dist/api/auth-routes.js +1003 -0
  9. package/dist/api/client-ip.d.ts +15 -0
  10. package/dist/api/client-ip.js +101 -0
  11. package/dist/api/csrf-middleware.d.ts +9 -0
  12. package/dist/api/csrf-middleware.js +67 -0
  13. package/dist/api/extra-route.d.ts +99 -0
  14. package/dist/api/extra-route.js +48 -0
  15. package/dist/api/http-cache.d.ts +31 -0
  16. package/dist/api/http-cache.js +102 -0
  17. package/dist/api/index.d.ts +32 -0
  18. package/dist/api/index.js +20 -0
  19. package/dist/api/jwt.d.ts +22 -0
  20. package/dist/api/jwt.js +199 -0
  21. package/dist/api/observability-middleware.d.ts +8 -0
  22. package/dist/api/observability-middleware.js +68 -0
  23. package/dist/api/origin-middleware.d.ts +12 -0
  24. package/dist/api/origin-middleware.js +120 -0
  25. package/dist/api/pat-route-guard.d.ts +2 -0
  26. package/dist/api/pat-route-guard.js +43 -0
  27. package/dist/api/pat-scope.d.ts +2 -0
  28. package/dist/api/pat-scope.js +13 -0
  29. package/dist/api/pii-leak-guard.d.ts +2 -0
  30. package/dist/api/pii-leak-guard.js +40 -0
  31. package/dist/api/post-auth-landing.d.ts +14 -0
  32. package/dist/api/post-auth-landing.js +92 -0
  33. package/dist/api/readiness.d.ts +23 -0
  34. package/dist/api/readiness.js +98 -0
  35. package/dist/api/redis-sse-broker.d.ts +13 -0
  36. package/dist/api/redis-sse-broker.js +138 -0
  37. package/dist/api/request-context.d.ts +34 -0
  38. package/dist/api/request-context.js +60 -0
  39. package/dist/api/request-id-middleware.d.ts +37 -0
  40. package/dist/api/request-id-middleware.js +112 -0
  41. package/dist/api/route-registrars.d.ts +24 -0
  42. package/dist/api/route-registrars.js +133 -0
  43. package/dist/api/routes.d.ts +20 -0
  44. package/dist/api/routes.js +373 -0
  45. package/dist/api/server.d.ts +81 -0
  46. package/dist/api/server.js +1068 -0
  47. package/dist/api/sse-broker.d.ts +36 -0
  48. package/dist/api/sse-broker.js +112 -0
  49. package/dist/api/sse-route.d.ts +24 -0
  50. package/dist/api/sse-route.js +61 -0
  51. package/dist/api/tokens.d.ts +1 -0
  52. package/dist/api/tokens.js +15 -0
  53. package/dist/api/websocket-route.d.ts +59 -0
  54. package/dist/api/websocket-route.js +239 -0
  55. package/dist/arg-parser.d.ts +8 -0
  56. package/dist/arg-parser.js +59 -0
  57. package/dist/auth/index.d.ts +2 -0
  58. package/dist/auth/index.js +5 -0
  59. package/dist/auth/roles.d.ts +16 -0
  60. package/dist/auth/roles.js +35 -0
  61. package/dist/bun-db/connection.d.ts +16 -0
  62. package/dist/bun-db/connection.js +54 -0
  63. package/dist/bun-db/index.d.ts +4 -0
  64. package/dist/bun-db/index.js +4 -0
  65. package/dist/bun-db/query.d.ts +64 -0
  66. package/dist/bun-db/query.js +1145 -0
  67. package/dist/compliance/duration-spec.d.ts +7 -0
  68. package/dist/compliance/duration-spec.js +37 -0
  69. package/dist/compliance/index.d.ts +6 -0
  70. package/dist/compliance/index.js +7 -0
  71. package/dist/compliance/override-schema.d.ts +78 -0
  72. package/dist/compliance/override-schema.js +124 -0
  73. package/dist/compliance/profiles.d.ts +125 -0
  74. package/dist/compliance/profiles.js +284 -0
  75. package/dist/compliance/sub-processors.d.ts +69 -0
  76. package/dist/compliance/sub-processors.js +109 -0
  77. package/dist/consumer-cli.d.ts +5 -0
  78. package/dist/consumer-cli.js +116 -0
  79. package/dist/crypto/blind-index.d.ts +10 -0
  80. package/dist/crypto/blind-index.js +97 -0
  81. package/dist/crypto/ciphertext-pattern.d.ts +3 -0
  82. package/dist/crypto/ciphertext-pattern.js +16 -0
  83. package/dist/crypto/event-pii.d.ts +8 -0
  84. package/dist/crypto/event-pii.js +79 -0
  85. package/dist/crypto/in-memory-kms-adapter.d.ts +11 -0
  86. package/dist/crypto/in-memory-kms-adapter.js +33 -0
  87. package/dist/crypto/index.d.ts +11 -0
  88. package/dist/crypto/index.js +11 -0
  89. package/dist/crypto/is-self-pii-field.d.ts +5 -0
  90. package/dist/crypto/is-self-pii-field.js +4 -0
  91. package/dist/crypto/kek-source.d.ts +23 -0
  92. package/dist/crypto/kek-source.js +122 -0
  93. package/dist/crypto/kms-adapter.d.ts +26 -0
  94. package/dist/crypto/kms-adapter.js +46 -0
  95. package/dist/crypto/kms-wiring.d.ts +67 -0
  96. package/dist/crypto/kms-wiring.js +125 -0
  97. package/dist/crypto/pg-kms-adapter.d.ts +55 -0
  98. package/dist/crypto/pg-kms-adapter.js +232 -0
  99. package/dist/crypto/pii-field-encryption.d.ts +20 -0
  100. package/dist/crypto/pii-field-encryption.js +201 -0
  101. package/dist/crypto/request-kms-cache.d.ts +8 -0
  102. package/dist/crypto/request-kms-cache.js +21 -0
  103. package/dist/crypto/subject-resolver.d.ts +30 -0
  104. package/dist/crypto/subject-resolver.js +153 -0
  105. package/dist/crypto/system-event-pii.d.ts +4 -0
  106. package/dist/crypto/system-event-pii.js +37 -0
  107. package/dist/db/api.d.ts +18 -0
  108. package/dist/db/api.js +23 -0
  109. package/dist/db/apply-entity-event.d.ts +21 -0
  110. package/dist/db/apply-entity-event.js +175 -0
  111. package/dist/db/assert-exists-in.d.ts +23 -0
  112. package/dist/db/assert-exists-in.js +34 -0
  113. package/dist/db/blind-index-cleanup.d.ts +5 -0
  114. package/dist/db/blind-index-cleanup.js +112 -0
  115. package/dist/db/bun-provider.d.ts +2 -0
  116. package/dist/db/bun-provider.js +37 -0
  117. package/dist/db/collect-table-metas.d.ts +3 -0
  118. package/dist/db/collect-table-metas.js +76 -0
  119. package/dist/db/compound-types.d.ts +9 -0
  120. package/dist/db/compound-types.js +31 -0
  121. package/dist/db/config-seed.d.ts +19 -0
  122. package/dist/db/config-seed.js +75 -0
  123. package/dist/db/connection.d.ts +10 -0
  124. package/dist/db/connection.js +35 -0
  125. package/dist/db/cursor.d.ts +9 -0
  126. package/dist/db/cursor.js +39 -0
  127. package/dist/db/dialect.d.ts +100 -0
  128. package/dist/db/dialect.js +386 -0
  129. package/dist/db/eagerload.d.ts +18 -0
  130. package/dist/db/eagerload.js +191 -0
  131. package/dist/db/entity-field-encryption.d.ts +15 -0
  132. package/dist/db/entity-field-encryption.js +127 -0
  133. package/dist/db/entity-table-from-registry.d.ts +4 -0
  134. package/dist/db/entity-table-from-registry.js +25 -0
  135. package/dist/db/entity-table-meta-types.d.ts +1 -0
  136. package/dist/db/entity-table-meta-types.js +1 -0
  137. package/dist/db/entity-table-meta.d.ts +30 -0
  138. package/dist/db/entity-table-meta.js +423 -0
  139. package/dist/db/event-store-executor-context.d.ts +49 -0
  140. package/dist/db/event-store-executor-context.js +368 -0
  141. package/dist/db/event-store-executor-read.d.ts +10 -0
  142. package/dist/db/event-store-executor-read.js +683 -0
  143. package/dist/db/event-store-executor-write.d.ts +3 -0
  144. package/dist/db/event-store-executor-write.js +705 -0
  145. package/dist/db/event-store-executor.d.ts +20 -0
  146. package/dist/db/event-store-executor.js +11 -0
  147. package/dist/db/feature-table-sources.d.ts +6 -0
  148. package/dist/db/feature-table-sources.js +24 -0
  149. package/dist/db/index.d.ts +37 -0
  150. package/dist/db/index.js +29 -0
  151. package/dist/db/located-timestamp.d.ts +22 -0
  152. package/dist/db/located-timestamp.js +100 -0
  153. package/dist/db/migrate-generator.d.ts +81 -0
  154. package/dist/db/migrate-generator.js +428 -0
  155. package/dist/db/migrate-runner.d.ts +30 -0
  156. package/dist/db/migrate-runner.js +273 -0
  157. package/dist/db/money.d.ts +30 -0
  158. package/dist/db/money.js +153 -0
  159. package/dist/db/parent-ref-clause.d.ts +10 -0
  160. package/dist/db/parent-ref-clause.js +124 -0
  161. package/dist/db/pg-error.d.ts +10 -0
  162. package/dist/db/pg-error.js +63 -0
  163. package/dist/db/postgres-provider.d.ts +2 -0
  164. package/dist/db/postgres-provider.js +21 -0
  165. package/dist/db/queries/advisory-lock.d.ts +3 -0
  166. package/dist/db/queries/advisory-lock.js +5 -0
  167. package/dist/db/queries/backfill-pii.d.ts +38 -0
  168. package/dist/db/queries/backfill-pii.js +433 -0
  169. package/dist/db/queries/ddl.d.ts +4 -0
  170. package/dist/db/queries/ddl.js +22 -0
  171. package/dist/db/queries/entity-read.d.ts +2 -0
  172. package/dist/db/queries/entity-read.js +5 -0
  173. package/dist/db/queries/es-ops.d.ts +5 -0
  174. package/dist/db/queries/es-ops.js +10 -0
  175. package/dist/db/queries/event-consumer.d.ts +36 -0
  176. package/dist/db/queries/event-consumer.js +261 -0
  177. package/dist/db/queries/event-store-admin.d.ts +24 -0
  178. package/dist/db/queries/event-store-admin.js +71 -0
  179. package/dist/db/queries/event-store-transfer.d.ts +20 -0
  180. package/dist/db/queries/event-store-transfer.js +31 -0
  181. package/dist/db/queries/event-store.d.ts +54 -0
  182. package/dist/db/queries/event-store.js +231 -0
  183. package/dist/db/queries/pii-backfill-state.d.ts +7 -0
  184. package/dist/db/queries/pii-backfill-state.js +14 -0
  185. package/dist/db/queries/projection-rebuild.d.ts +6 -0
  186. package/dist/db/queries/projection-rebuild.js +65 -0
  187. package/dist/db/queries/raw-sql.d.ts +9 -0
  188. package/dist/db/queries/raw-sql.js +16 -0
  189. package/dist/db/queries/seed-context.d.ts +20 -0
  190. package/dist/db/queries/seed-context.js +25 -0
  191. package/dist/db/queries/shadow-swap.d.ts +18 -0
  192. package/dist/db/queries/shadow-swap.js +307 -0
  193. package/dist/db/queries/table-ops.d.ts +4 -0
  194. package/dist/db/queries/table-ops.js +8 -0
  195. package/dist/db/queries/test-stack.d.ts +6 -0
  196. package/dist/db/queries/test-stack.js +20 -0
  197. package/dist/db/query-api.d.ts +2 -0
  198. package/dist/db/query-api.js +6 -0
  199. package/dist/db/query.d.ts +1 -0
  200. package/dist/db/query.js +3 -0
  201. package/dist/db/rebuild-marker.d.ts +4 -0
  202. package/dist/db/rebuild-marker.js +96 -0
  203. package/dist/db/reference-data.d.ts +14 -0
  204. package/dist/db/reference-data.js +66 -0
  205. package/dist/db/render-ddl.d.ts +4 -0
  206. package/dist/db/render-ddl.js +55 -0
  207. package/dist/db/replay-migration-sql.d.ts +12 -0
  208. package/dist/db/replay-migration-sql.js +223 -0
  209. package/dist/db/schema-inspection.d.ts +3 -0
  210. package/dist/db/schema-inspection.js +60 -0
  211. package/dist/db/table-builder.d.ts +194 -0
  212. package/dist/db/table-builder.js +430 -0
  213. package/dist/db/tenant-db-runner.d.ts +4 -0
  214. package/dist/db/tenant-db-runner.js +17 -0
  215. package/dist/db/tenant-db.d.ts +32 -0
  216. package/dist/db/tenant-db.js +501 -0
  217. package/dist/derivatives/delete-stored-file.d.ts +6 -0
  218. package/dist/derivatives/delete-stored-file.js +70 -0
  219. package/dist/derivatives/derivatives-context.d.ts +21 -0
  220. package/dist/derivatives/derivatives-context.js +212 -0
  221. package/dist/derivatives/field-variants.d.ts +3 -0
  222. package/dist/derivatives/field-variants.js +16 -0
  223. package/dist/derivatives/index.d.ts +6 -0
  224. package/dist/derivatives/index.js +4 -0
  225. package/dist/derivatives/variant-key.d.ts +10 -0
  226. package/dist/derivatives/variant-key.js +100 -0
  227. package/dist/engine/access.d.ts +2 -0
  228. package/dist/engine/access.js +25 -0
  229. package/dist/engine/active-membership.d.ts +26 -0
  230. package/dist/engine/active-membership.js +25 -0
  231. package/dist/engine/boot-validator/access-declarations.d.ts +2 -0
  232. package/dist/engine/boot-validator/access-declarations.js +148 -0
  233. package/dist/engine/boot-validator/access-roles.d.ts +2 -0
  234. package/dist/engine/boot-validator/access-roles.js +76 -0
  235. package/dist/engine/boot-validator/action-wiring.d.ts +3 -0
  236. package/dist/engine/boot-validator/action-wiring.js +104 -0
  237. package/dist/engine/boot-validator/api-ext.d.ts +3 -0
  238. package/dist/engine/boot-validator/api-ext.js +54 -0
  239. package/dist/engine/boot-validator/boot-check.d.ts +2 -0
  240. package/dist/engine/boot-validator/boot-check.js +20 -0
  241. package/dist/engine/boot-validator/config-deps.d.ts +10 -0
  242. package/dist/engine/boot-validator/config-deps.js +180 -0
  243. package/dist/engine/boot-validator/custom-screen-write-qns.d.ts +8 -0
  244. package/dist/engine/boot-validator/custom-screen-write-qns.js +75 -0
  245. package/dist/engine/boot-validator/detail-screens.d.ts +6 -0
  246. package/dist/engine/boot-validator/detail-screens.js +31 -0
  247. package/dist/engine/boot-validator/entity-handler.d.ts +23 -0
  248. package/dist/engine/boot-validator/entity-handler.js +754 -0
  249. package/dist/engine/boot-validator/entity-list-screens.d.ts +4 -0
  250. package/dist/engine/boot-validator/entity-list-screens.js +75 -0
  251. package/dist/engine/boot-validator/gdpr-storage.d.ts +2 -0
  252. package/dist/engine/boot-validator/gdpr-storage.js +48 -0
  253. package/dist/engine/boot-validator/global-tenancy.d.ts +2 -0
  254. package/dist/engine/boot-validator/global-tenancy.js +24 -0
  255. package/dist/engine/boot-validator/i18n-keys.d.ts +2 -0
  256. package/dist/engine/boot-validator/i18n-keys.js +88 -0
  257. package/dist/engine/boot-validator/index.d.ts +34 -0
  258. package/dist/engine/boot-validator/index.js +196 -0
  259. package/dist/engine/boot-validator/nav.d.ts +20 -0
  260. package/dist/engine/boot-validator/nav.js +202 -0
  261. package/dist/engine/boot-validator/ownership.d.ts +36 -0
  262. package/dist/engine/boot-validator/ownership.js +268 -0
  263. package/dist/engine/boot-validator/parent-ref.d.ts +3 -0
  264. package/dist/engine/boot-validator/parent-ref.js +73 -0
  265. package/dist/engine/boot-validator/pii-retention.d.ts +2 -0
  266. package/dist/engine/boot-validator/pii-retention.js +204 -0
  267. package/dist/engine/boot-validator/projection-list-screens.d.ts +4 -0
  268. package/dist/engine/boot-validator/projection-list-screens.js +219 -0
  269. package/dist/engine/boot-validator/query-output-columns.d.ts +2 -0
  270. package/dist/engine/boot-validator/query-output-columns.js +160 -0
  271. package/dist/engine/boot-validator/query-refs.d.ts +2 -0
  272. package/dist/engine/boot-validator/query-refs.js +72 -0
  273. package/dist/engine/boot-validator/record-owned.d.ts +2 -0
  274. package/dist/engine/boot-validator/record-owned.js +16 -0
  275. package/dist/engine/boot-validator/screens.d.ts +34 -0
  276. package/dist/engine/boot-validator/screens.js +1665 -0
  277. package/dist/engine/boot-validator/security-baseline.d.ts +3 -0
  278. package/dist/engine/boot-validator/security-baseline.js +18 -0
  279. package/dist/engine/boot-validator/transfer-graph.d.ts +3 -0
  280. package/dist/engine/boot-validator/transfer-graph.js +120 -0
  281. package/dist/engine/boot-validator/url-prefill-fields.d.ts +2 -0
  282. package/dist/engine/boot-validator/url-prefill-fields.js +106 -0
  283. package/dist/engine/boot-validator/workspaces.d.ts +20 -0
  284. package/dist/engine/boot-validator/workspaces.js +81 -0
  285. package/dist/engine/boot-validator/zod-shape.d.ts +5 -0
  286. package/dist/engine/boot-validator/zod-shape.js +110 -0
  287. package/dist/engine/boot-validator.d.ts +1 -0
  288. package/dist/engine/boot-validator.js +1 -0
  289. package/dist/engine/build-app-schema.d.ts +14 -0
  290. package/dist/engine/build-app-schema.js +494 -0
  291. package/dist/engine/build-config-feature-schema.d.ts +15 -0
  292. package/dist/engine/build-config-feature-schema.js +582 -0
  293. package/dist/engine/build-target.d.ts +28 -0
  294. package/dist/engine/build-target.js +43 -0
  295. package/dist/engine/changeset-changes.d.ts +12 -0
  296. package/dist/engine/changeset-changes.js +104 -0
  297. package/dist/engine/codemod/index.d.ts +2 -0
  298. package/dist/engine/codemod/index.js +1 -0
  299. package/dist/engine/codemod/pipeline-codemod.d.ts +50 -0
  300. package/dist/engine/codemod/pipeline-codemod.js +529 -0
  301. package/dist/engine/config-helpers.d.ts +42 -0
  302. package/dist/engine/config-helpers.js +115 -0
  303. package/dist/engine/constants.d.ts +52 -0
  304. package/dist/engine/constants.js +79 -0
  305. package/dist/engine/create-app.d.ts +17 -0
  306. package/dist/engine/create-app.js +119 -0
  307. package/dist/engine/cross-tenant.d.ts +3 -0
  308. package/dist/engine/cross-tenant.js +18 -0
  309. package/dist/engine/dedupe-features.d.ts +2 -0
  310. package/dist/engine/dedupe-features.js +36 -0
  311. package/dist/engine/define-feature.d.ts +7 -0
  312. package/dist/engine/define-feature.js +143 -0
  313. package/dist/engine/define-handler.d.ts +21 -0
  314. package/dist/engine/define-handler.js +117 -0
  315. package/dist/engine/define-roles.d.ts +5 -0
  316. package/dist/engine/define-roles.js +14 -0
  317. package/dist/engine/define-step.d.ts +4 -0
  318. package/dist/engine/define-step.js +22 -0
  319. package/dist/engine/define-workflow.d.ts +89 -0
  320. package/dist/engine/define-workflow.js +70 -0
  321. package/dist/engine/effective-features.d.ts +6 -0
  322. package/dist/engine/effective-features.js +73 -0
  323. package/dist/engine/embedded-derived.d.ts +29 -0
  324. package/dist/engine/embedded-derived.js +82 -0
  325. package/dist/engine/entity-handlers.d.ts +67 -0
  326. package/dist/engine/entity-handlers.js +567 -0
  327. package/dist/engine/escape-hatch-declaration.d.ts +2 -0
  328. package/dist/engine/escape-hatch-declaration.js +5 -0
  329. package/dist/engine/event-helpers.d.ts +11 -0
  330. package/dist/engine/event-helpers.js +47 -0
  331. package/dist/engine/extension-names.d.ts +164 -0
  332. package/dist/engine/extension-names.js +172 -0
  333. package/dist/engine/extension-selector-plugins.d.ts +5 -0
  334. package/dist/engine/extension-selector-plugins.js +14 -0
  335. package/dist/engine/extensions/escape-hatch-usage.d.ts +2 -0
  336. package/dist/engine/extensions/escape-hatch-usage.js +12 -0
  337. package/dist/engine/extensions/storage-provider.d.ts +4 -0
  338. package/dist/engine/extensions/storage-provider.js +1 -0
  339. package/dist/engine/extensions/tenant-data.d.ts +15 -0
  340. package/dist/engine/extensions/tenant-data.js +7 -0
  341. package/dist/engine/extensions/tenant-resource.d.ts +14 -0
  342. package/dist/engine/extensions/tenant-resource.js +6 -0
  343. package/dist/engine/extensions/user-data.d.ts +152 -0
  344. package/dist/engine/extensions/user-data.js +12 -0
  345. package/dist/engine/factories.d.ts +195 -0
  346. package/dist/engine/factories.js +387 -0
  347. package/dist/engine/feature-ast/entity-field-types.d.ts +13 -0
  348. package/dist/engine/feature-ast/entity-field-types.js +35 -0
  349. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +6 -0
  350. package/dist/engine/feature-ast/extractors/ai-steps.js +254 -0
  351. package/dist/engine/feature-ast/extractors/events.d.ts +5 -0
  352. package/dist/engine/feature-ast/extractors/events.js +262 -0
  353. package/dist/engine/feature-ast/extractors/handlers.d.ts +23 -0
  354. package/dist/engine/feature-ast/extractors/handlers.js +319 -0
  355. package/dist/engine/feature-ast/extractors/hooks.d.ts +23 -0
  356. package/dist/engine/feature-ast/extractors/hooks.js +228 -0
  357. package/dist/engine/feature-ast/extractors/index.d.ts +14 -0
  358. package/dist/engine/feature-ast/extractors/index.js +13 -0
  359. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +7 -0
  360. package/dist/engine/feature-ast/extractors/jobs-routes.js +141 -0
  361. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +10 -0
  362. package/dist/engine/feature-ast/extractors/projections-screens.js +195 -0
  363. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +14 -0
  364. package/dist/engine/feature-ast/extractors/resolve-import.js +152 -0
  365. package/dist/engine/feature-ast/extractors/round1.d.ts +10 -0
  366. package/dist/engine/feature-ast/extractors/round1.js +81 -0
  367. package/dist/engine/feature-ast/extractors/round2.d.ts +7 -0
  368. package/dist/engine/feature-ast/extractors/round2.js +158 -0
  369. package/dist/engine/feature-ast/extractors/round3.d.ts +22 -0
  370. package/dist/engine/feature-ast/extractors/round3.js +280 -0
  371. package/dist/engine/feature-ast/extractors/round5.d.ts +8 -0
  372. package/dist/engine/feature-ast/extractors/round5.js +63 -0
  373. package/dist/engine/feature-ast/extractors/round6.d.ts +4 -0
  374. package/dist/engine/feature-ast/extractors/round6.js +17 -0
  375. package/dist/engine/feature-ast/extractors/shared.d.ts +85 -0
  376. package/dist/engine/feature-ast/extractors/shared.js +326 -0
  377. package/dist/engine/feature-ast/index.d.ts +16 -0
  378. package/dist/engine/feature-ast/index.js +10 -0
  379. package/dist/engine/feature-ast/parse.d.ts +30 -0
  380. package/dist/engine/feature-ast/parse.js +464 -0
  381. package/dist/engine/feature-ast/patch.d.ts +207 -0
  382. package/dist/engine/feature-ast/patch.js +771 -0
  383. package/dist/engine/feature-ast/patcher.d.ts +211 -0
  384. package/dist/engine/feature-ast/patcher.js +277 -0
  385. package/dist/engine/feature-ast/pattern-change-schema.d.ts +670 -0
  386. package/dist/engine/feature-ast/pattern-change-schema.js +1196 -0
  387. package/dist/engine/feature-ast/patterns.d.ts +302 -0
  388. package/dist/engine/feature-ast/patterns.js +113 -0
  389. package/dist/engine/feature-ast/render.d.ts +47 -0
  390. package/dist/engine/feature-ast/render.js +681 -0
  391. package/dist/engine/feature-ast/source-location.d.ts +17 -0
  392. package/dist/engine/feature-ast/source-location.js +27 -0
  393. package/dist/engine/feature-builder-state.d.ts +69 -0
  394. package/dist/engine/feature-builder-state.js +64 -0
  395. package/dist/engine/feature-changelog.d.ts +21 -0
  396. package/dist/engine/feature-changelog.js +76 -0
  397. package/dist/engine/feature-config-events-jobs.d.ts +58 -0
  398. package/dist/engine/feature-config-events-jobs.js +318 -0
  399. package/dist/engine/feature-entity-handlers.d.ts +38 -0
  400. package/dist/engine/feature-entity-handlers.js +185 -0
  401. package/dist/engine/feature-manifest.d.ts +73 -0
  402. package/dist/engine/feature-manifest.js +87 -0
  403. package/dist/engine/feature-ui-extensions.d.ts +68 -0
  404. package/dist/engine/feature-ui-extensions.js +488 -0
  405. package/dist/engine/field-access.d.ts +4 -0
  406. package/dist/engine/field-access.js +119 -0
  407. package/dist/engine/field-helpers.d.ts +4 -0
  408. package/dist/engine/field-helpers.js +28 -0
  409. package/dist/engine/handler-helpers.d.ts +19 -0
  410. package/dist/engine/handler-helpers.js +24 -0
  411. package/dist/engine/hook-helpers.d.ts +4 -0
  412. package/dist/engine/hook-helpers.js +13 -0
  413. package/dist/engine/i18n-key.d.ts +2 -0
  414. package/dist/engine/i18n-key.js +10 -0
  415. package/dist/engine/index.d.ts +77 -0
  416. package/dist/engine/index.js +70 -0
  417. package/dist/engine/instruction-fields.d.ts +2 -0
  418. package/dist/engine/instruction-fields.js +9 -0
  419. package/dist/engine/membership-roles.d.ts +5 -0
  420. package/dist/engine/membership-roles.js +48 -0
  421. package/dist/engine/object-form.d.ts +4 -0
  422. package/dist/engine/object-form.js +21 -0
  423. package/dist/engine/ownership.d.ts +12 -0
  424. package/dist/engine/ownership.js +339 -0
  425. package/dist/engine/parse-ref-target.d.ts +6 -0
  426. package/dist/engine/parse-ref-target.js +21 -0
  427. package/dist/engine/pattern-library/index.d.ts +2 -0
  428. package/dist/engine/pattern-library/index.js +3 -0
  429. package/dist/engine/pattern-library/library.d.ts +14 -0
  430. package/dist/engine/pattern-library/library.js +92 -0
  431. package/dist/engine/pattern-library/mixed-schemas.d.ts +16 -0
  432. package/dist/engine/pattern-library/mixed-schemas.js +569 -0
  433. package/dist/engine/pattern-library/opaque-schemas.d.ts +7 -0
  434. package/dist/engine/pattern-library/opaque-schemas.js +115 -0
  435. package/dist/engine/pattern-library/shared-fields.d.ts +120 -0
  436. package/dist/engine/pattern-library/shared-fields.js +71 -0
  437. package/dist/engine/pattern-library/static-schemas.d.ts +19 -0
  438. package/dist/engine/pattern-library/static-schemas.js +435 -0
  439. package/dist/engine/pattern-library/types.d.ts +158 -0
  440. package/dist/engine/pattern-library/types.js +36 -0
  441. package/dist/engine/personal-data-fields.d.ts +5 -0
  442. package/dist/engine/personal-data-fields.js +56 -0
  443. package/dist/engine/pipeline.d.ts +4 -0
  444. package/dist/engine/pipeline.js +87 -0
  445. package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
  446. package/dist/engine/project-app-schema-for-roles.js +679 -0
  447. package/dist/engine/projection-helpers.d.ts +7 -0
  448. package/dist/engine/projection-helpers.js +61 -0
  449. package/dist/engine/qualified-name.d.ts +27 -0
  450. package/dist/engine/qualified-name.js +137 -0
  451. package/dist/engine/read-claim.d.ts +2 -0
  452. package/dist/engine/read-claim.js +28 -0
  453. package/dist/engine/registry-facade.d.ts +3 -0
  454. package/dist/engine/registry-facade.js +231 -0
  455. package/dist/engine/registry-ingest.d.ts +14 -0
  456. package/dist/engine/registry-ingest.js +415 -0
  457. package/dist/engine/registry-state.d.ts +93 -0
  458. package/dist/engine/registry-state.js +233 -0
  459. package/dist/engine/registry-validate.d.ts +25 -0
  460. package/dist/engine/registry-validate.js +669 -0
  461. package/dist/engine/registry.d.ts +2 -0
  462. package/dist/engine/registry.js +52 -0
  463. package/dist/engine/resolve-config-or-param.d.ts +18 -0
  464. package/dist/engine/resolve-config-or-param.js +76 -0
  465. package/dist/engine/role-assignment.d.ts +1 -0
  466. package/dist/engine/role-assignment.js +58 -0
  467. package/dist/engine/run-in.d.ts +2 -0
  468. package/dist/engine/run-in.js +28 -0
  469. package/dist/engine/run-pipeline.d.ts +25 -0
  470. package/dist/engine/run-pipeline.js +111 -0
  471. package/dist/engine/schema-builder.d.ts +8 -0
  472. package/dist/engine/schema-builder.js +406 -0
  473. package/dist/engine/screen-filter-ops.d.ts +3 -0
  474. package/dist/engine/screen-filter-ops.js +55 -0
  475. package/dist/engine/screen-helpers.d.ts +27 -0
  476. package/dist/engine/screen-helpers.js +100 -0
  477. package/dist/engine/soft-delete-cleanup.d.ts +10 -0
  478. package/dist/engine/soft-delete-cleanup.js +114 -0
  479. package/dist/engine/state-machine.d.ts +34 -0
  480. package/dist/engine/state-machine.js +44 -0
  481. package/dist/engine/steps/_duration-utils.d.ts +1 -0
  482. package/dist/engine/steps/_duration-utils.js +28 -0
  483. package/dist/engine/steps/_event-match.d.ts +2 -0
  484. package/dist/engine/steps/_event-match.js +88 -0
  485. package/dist/engine/steps/_no-return-guard.d.ts +2 -0
  486. package/dist/engine/steps/_no-return-guard.js +16 -0
  487. package/dist/engine/steps/_read-source.d.ts +6 -0
  488. package/dist/engine/steps/_read-source.js +7 -0
  489. package/dist/engine/steps/_resolver-utils.d.ts +11 -0
  490. package/dist/engine/steps/_resolver-utils.js +36 -0
  491. package/dist/engine/steps/_step-dispatch-constants.d.ts +13 -0
  492. package/dist/engine/steps/_step-dispatch-constants.js +32 -0
  493. package/dist/engine/steps/aggregate-append-event.d.ts +10 -0
  494. package/dist/engine/steps/aggregate-append-event.js +43 -0
  495. package/dist/engine/steps/aggregate-create.d.ts +6 -0
  496. package/dist/engine/steps/aggregate-create.js +38 -0
  497. package/dist/engine/steps/aggregate-update.d.ts +10 -0
  498. package/dist/engine/steps/aggregate-update.js +38 -0
  499. package/dist/engine/steps/branch.d.ts +8 -0
  500. package/dist/engine/steps/branch.js +66 -0
  501. package/dist/engine/steps/call-feature.d.ts +7 -0
  502. package/dist/engine/steps/call-feature.js +30 -0
  503. package/dist/engine/steps/compute.d.ts +2 -0
  504. package/dist/engine/steps/compute.js +29 -0
  505. package/dist/engine/steps/describe-workflow-step-error.d.ts +1 -0
  506. package/dist/engine/steps/describe-workflow-step-error.js +6 -0
  507. package/dist/engine/steps/for-each.d.ts +9 -0
  508. package/dist/engine/steps/for-each.js +88 -0
  509. package/dist/engine/steps/mail-send.d.ts +10 -0
  510. package/dist/engine/steps/mail-send.js +33 -0
  511. package/dist/engine/steps/read-find-many.d.ts +10 -0
  512. package/dist/engine/steps/read-find-many.js +32 -0
  513. package/dist/engine/steps/read-find-one.d.ts +9 -0
  514. package/dist/engine/steps/read-find-one.js +41 -0
  515. package/dist/engine/steps/retry.d.ts +9 -0
  516. package/dist/engine/steps/retry.js +76 -0
  517. package/dist/engine/steps/return.d.ts +4 -0
  518. package/dist/engine/steps/return.js +25 -0
  519. package/dist/engine/steps/unsafe-projection-delete.d.ts +8 -0
  520. package/dist/engine/steps/unsafe-projection-delete.js +35 -0
  521. package/dist/engine/steps/unsafe-projection-upsert.d.ts +8 -0
  522. package/dist/engine/steps/unsafe-projection-upsert.js +73 -0
  523. package/dist/engine/steps/wait-for-event.d.ts +8 -0
  524. package/dist/engine/steps/wait-for-event.js +63 -0
  525. package/dist/engine/steps/wait.d.ts +6 -0
  526. package/dist/engine/steps/wait.js +50 -0
  527. package/dist/engine/steps/webhook-send.d.ts +24 -0
  528. package/dist/engine/steps/webhook-send.js +38 -0
  529. package/dist/engine/system-user.d.ts +8 -0
  530. package/dist/engine/system-user.js +29 -0
  531. package/dist/engine/tier-resolver-extension.d.ts +62 -0
  532. package/dist/engine/tier-resolver-extension.js +55 -0
  533. package/dist/engine/types/config.d.ts +1 -0
  534. package/dist/engine/types/config.js +1 -0
  535. package/dist/engine/types/define-handler.d.ts +1 -0
  536. package/dist/engine/types/define-handler.js +1 -0
  537. package/dist/engine/types/entity-handlers.d.ts +1 -0
  538. package/dist/engine/types/entity-handlers.js +1 -0
  539. package/dist/engine/types/event-type-map.js +1 -0
  540. package/dist/engine/types/extension-options-map.js +1 -0
  541. package/dist/engine/types/feature.d.ts +1 -0
  542. package/dist/engine/types/feature.js +1 -0
  543. package/dist/engine/types/fields.d.ts +1 -0
  544. package/dist/engine/types/fields.js +1 -0
  545. package/dist/engine/types/handlers.d.ts +2 -0
  546. package/dist/engine/types/handlers.js +1 -0
  547. package/dist/engine/types/hooks.d.ts +1 -0
  548. package/dist/engine/types/hooks.js +1 -0
  549. package/dist/engine/types/http-route.js +1 -0
  550. package/dist/engine/types/identifiers.js +1 -0
  551. package/dist/engine/types/index.d.ts +30 -0
  552. package/dist/engine/types/index.js +10 -0
  553. package/dist/engine/types/nav.d.ts +1 -0
  554. package/dist/engine/types/nav.js +1 -0
  555. package/dist/engine/types/ownership.d.ts +1 -0
  556. package/dist/engine/types/ownership.js +1 -0
  557. package/dist/engine/types/projection.d.ts +1 -0
  558. package/dist/engine/types/projection.js +1 -0
  559. package/dist/engine/types/relations.js +1 -0
  560. package/dist/engine/types/screen.d.ts +2 -0
  561. package/dist/engine/types/screen.js +1 -0
  562. package/dist/engine/types/step.d.ts +1 -0
  563. package/dist/engine/types/step.js +1 -0
  564. package/dist/engine/types/target-ref.js +1 -0
  565. package/dist/engine/types/tree-node.js +1 -0
  566. package/dist/engine/types/workspace.d.ts +1 -0
  567. package/dist/engine/types/workspace.js +1 -0
  568. package/dist/engine/validate-projection-allowlist.d.ts +10 -0
  569. package/dist/engine/validate-projection-allowlist.js +164 -0
  570. package/dist/engine/validation.d.ts +3 -0
  571. package/dist/engine/validation.js +23 -0
  572. package/dist/engine/where-rule-lint.d.ts +2 -0
  573. package/dist/engine/where-rule-lint.js +171 -0
  574. package/dist/engine/write-handler-qn-extract.d.ts +15 -0
  575. package/dist/engine/write-handler-qn-extract.js +36 -0
  576. package/dist/entrypoint/index.d.ts +83 -0
  577. package/dist/entrypoint/index.js +312 -0
  578. package/dist/env/_zod-introspect.d.ts +17 -0
  579. package/dist/env/_zod-introspect.js +35 -0
  580. package/dist/env/dry-run.d.ts +13 -0
  581. package/dist/env/dry-run.js +158 -0
  582. package/dist/env/index.d.ts +98 -0
  583. package/dist/env/index.js +313 -0
  584. package/dist/errors/classes.d.ts +109 -0
  585. package/dist/errors/classes.js +190 -0
  586. package/dist/errors/field-issue.d.ts +6 -0
  587. package/dist/errors/field-issue.js +1 -0
  588. package/dist/errors/index.d.ts +15 -0
  589. package/dist/errors/index.js +9 -0
  590. package/dist/errors/kumiko-error.d.ts +25 -0
  591. package/dist/errors/kumiko-error.js +43 -0
  592. package/dist/errors/member-resolution.d.ts +2 -0
  593. package/dist/errors/member-resolution.js +10 -0
  594. package/dist/errors/reasons.d.ts +23 -0
  595. package/dist/errors/reasons.js +81 -0
  596. package/dist/errors/serialize.d.ts +32 -0
  597. package/dist/errors/serialize.js +76 -0
  598. package/dist/errors/to-kumiko-error.d.ts +2 -0
  599. package/dist/errors/to-kumiko-error.js +9 -0
  600. package/dist/errors/transition-details.d.ts +7 -0
  601. package/dist/errors/transition-details.js +16 -0
  602. package/dist/errors/write-error-info.d.ts +20 -0
  603. package/dist/errors/write-error-info.js +99 -0
  604. package/dist/errors/zod-bridge.d.ts +3 -0
  605. package/dist/errors/zod-bridge.js +58 -0
  606. package/dist/es-ops/context.d.ts +19 -0
  607. package/dist/es-ops/context.js +70 -0
  608. package/dist/es-ops/index.d.ts +4 -0
  609. package/dist/es-ops/index.js +14 -0
  610. package/dist/es-ops/operations-schema.d.ts +5 -0
  611. package/dist/es-ops/operations-schema.js +40 -0
  612. package/dist/es-ops/runner.d.ts +29 -0
  613. package/dist/es-ops/runner.js +195 -0
  614. package/dist/es-ops/types.d.ts +92 -0
  615. package/dist/es-ops/types.js +14 -0
  616. package/dist/event-store/admin-api.d.ts +17 -0
  617. package/dist/event-store/admin-api.js +173 -0
  618. package/dist/event-store/archive.d.ts +14 -0
  619. package/dist/event-store/archive.js +55 -0
  620. package/dist/event-store/errors.d.ts +15 -0
  621. package/dist/event-store/errors.js +49 -0
  622. package/dist/event-store/event-store.d.ts +38 -0
  623. package/dist/event-store/event-store.js +310 -0
  624. package/dist/event-store/events-schema.d.ts +3 -0
  625. package/dist/event-store/events-schema.js +66 -0
  626. package/dist/event-store/index.d.ts +12 -0
  627. package/dist/event-store/index.js +12 -0
  628. package/dist/event-store/provenance-append.d.ts +13 -0
  629. package/dist/event-store/provenance-append.js +49 -0
  630. package/dist/event-store/rebuild-dead-letter.d.ts +25 -0
  631. package/dist/event-store/rebuild-dead-letter.js +71 -0
  632. package/dist/event-store/row-to-stored-event.d.ts +17 -0
  633. package/dist/event-store/row-to-stored-event.js +15 -0
  634. package/dist/event-store/snapshot.d.ts +26 -0
  635. package/dist/event-store/snapshot.js +155 -0
  636. package/dist/event-store/transfer.d.ts +13 -0
  637. package/dist/event-store/transfer.js +62 -0
  638. package/dist/event-store/types.d.ts +1 -0
  639. package/dist/event-store/types.js +1 -0
  640. package/dist/event-store/upcaster-dead-letter.d.ts +27 -0
  641. package/dist/event-store/upcaster-dead-letter.js +76 -0
  642. package/dist/event-store/upcaster.d.ts +14 -0
  643. package/dist/event-store/upcaster.js +86 -0
  644. package/dist/files/content-disposition.d.ts +3 -0
  645. package/dist/files/content-disposition.js +50 -0
  646. package/dist/files/feature.d.ts +9 -0
  647. package/dist/files/feature.js +26 -0
  648. package/dist/files/file-handle.d.ts +7 -0
  649. package/dist/files/file-handle.js +71 -0
  650. package/dist/files/file-ref-entity.d.ts +134 -0
  651. package/dist/files/file-ref-entity.js +32 -0
  652. package/dist/files/file-ref-table.d.ts +134 -0
  653. package/dist/files/file-ref-table.js +12 -0
  654. package/dist/files/file-routes.d.ts +34 -0
  655. package/dist/files/file-routes.js +433 -0
  656. package/dist/files/in-memory-provider.d.ts +7 -0
  657. package/dist/files/in-memory-provider.js +82 -0
  658. package/dist/files/index.d.ts +17 -0
  659. package/dist/files/index.js +13 -0
  660. package/dist/files/local-provider.d.ts +2 -0
  661. package/dist/files/local-provider.js +128 -0
  662. package/dist/files/provider-resolver.d.ts +58 -0
  663. package/dist/files/provider-resolver.js +87 -0
  664. package/dist/files/storage-tracking.d.ts +20 -0
  665. package/dist/files/storage-tracking.js +179 -0
  666. package/dist/files/types.d.ts +59 -0
  667. package/dist/files/types.js +276 -0
  668. package/dist/files/zip-stream.d.ts +31 -0
  669. package/dist/files/zip-stream.js +207 -0
  670. package/dist/http/index.d.ts +2 -0
  671. package/dist/http/index.js +1 -0
  672. package/dist/i18n/index.d.ts +12 -0
  673. package/dist/i18n/index.js +27 -0
  674. package/dist/i18n/mail-registry.d.ts +7 -0
  675. package/dist/i18n/mail-registry.js +34 -0
  676. package/dist/i18n/request-locale.d.ts +22 -0
  677. package/dist/i18n/request-locale.js +62 -0
  678. package/dist/i18n/required-surface-keys.d.ts +33 -0
  679. package/dist/i18n/required-surface-keys.js +416 -0
  680. package/dist/i18n/settings-hub-keys.d.ts +14 -0
  681. package/dist/i18n/settings-hub-keys.js +29 -0
  682. package/dist/jobs/index.d.ts +2 -0
  683. package/dist/jobs/index.js +1 -0
  684. package/dist/jobs/job-runner.d.ts +54 -0
  685. package/dist/jobs/job-runner.js +1110 -0
  686. package/dist/lifecycle/index.d.ts +2 -0
  687. package/dist/lifecycle/index.js +2 -0
  688. package/dist/lifecycle/lifecycle.d.ts +23 -0
  689. package/dist/lifecycle/lifecycle.js +111 -0
  690. package/dist/lifecycle/signal-handlers.d.ts +10 -0
  691. package/dist/lifecycle/signal-handlers.js +40 -0
  692. package/dist/logging/index.d.ts +4 -0
  693. package/dist/logging/index.js +2 -0
  694. package/dist/logging/pino-logger.d.ts +9 -0
  695. package/dist/logging/pino-logger.js +61 -0
  696. package/dist/logging/types.js +1 -0
  697. package/dist/logging/utils.d.ts +8 -0
  698. package/dist/logging/utils.js +41 -0
  699. package/dist/migrations/index.d.ts +4 -0
  700. package/dist/migrations/index.js +8 -0
  701. package/dist/migrations/kumiko-drift.d.ts +26 -0
  702. package/dist/migrations/kumiko-drift.js +151 -0
  703. package/dist/migrations/pending-rebuilds.d.ts +81 -0
  704. package/dist/migrations/pending-rebuilds.js +163 -0
  705. package/dist/migrations/pii-event-backfill.d.ts +40 -0
  706. package/dist/migrations/pii-event-backfill.js +275 -0
  707. package/dist/migrations/projection-table-index.d.ts +5 -0
  708. package/dist/migrations/projection-table-index.js +21 -0
  709. package/dist/observability/console-provider.d.ts +10 -0
  710. package/dist/observability/console-provider.js +101 -0
  711. package/dist/observability/context.d.ts +10 -0
  712. package/dist/observability/context.js +13 -0
  713. package/dist/observability/escape-hatch-report.d.ts +23 -0
  714. package/dist/observability/escape-hatch-report.js +92 -0
  715. package/dist/observability/fallback.d.ts +4 -0
  716. package/dist/observability/fallback.js +28 -0
  717. package/dist/observability/ids.d.ts +2 -0
  718. package/dist/observability/ids.js +22 -0
  719. package/dist/observability/index.d.ts +15 -0
  720. package/dist/observability/index.js +15 -0
  721. package/dist/observability/metric-validator.d.ts +4 -0
  722. package/dist/observability/metric-validator.js +73 -0
  723. package/dist/observability/metrics-handle.d.ts +5 -0
  724. package/dist/observability/metrics-handle.js +102 -0
  725. package/dist/observability/metrics-wiring.d.ts +18 -0
  726. package/dist/observability/metrics-wiring.js +21 -0
  727. package/dist/observability/noop-provider.d.ts +2 -0
  728. package/dist/observability/noop-provider.js +105 -0
  729. package/dist/observability/prometheus-meter.d.ts +26 -0
  730. package/dist/observability/prometheus-meter.js +257 -0
  731. package/dist/observability/recording-meter.d.ts +31 -0
  732. package/dist/observability/recording-meter.js +127 -0
  733. package/dist/observability/recording-tracer.d.ts +32 -0
  734. package/dist/observability/recording-tracer.js +135 -0
  735. package/dist/observability/redis-wrapper.d.ts +3 -0
  736. package/dist/observability/redis-wrapper.js +121 -0
  737. package/dist/observability/sensitive-filter.d.ts +9 -0
  738. package/dist/observability/sensitive-filter.js +92 -0
  739. package/dist/observability/standard-metrics.d.ts +41 -0
  740. package/dist/observability/standard-metrics.js +237 -0
  741. package/dist/observability/types/index.js +1 -0
  742. package/dist/observability/types/metric.js +1 -0
  743. package/dist/observability/types/provider.js +1 -0
  744. package/dist/observability/types/span.js +1 -0
  745. package/dist/pipeline/active-membership.d.ts +12 -0
  746. package/dist/pipeline/active-membership.js +124 -0
  747. package/dist/pipeline/append-event-core.d.ts +12 -0
  748. package/dist/pipeline/append-event-core.js +84 -0
  749. package/dist/pipeline/auth-claims-resolver.d.ts +9 -0
  750. package/dist/pipeline/auth-claims-resolver.js +76 -0
  751. package/dist/pipeline/cascade-handler.d.ts +6 -0
  752. package/dist/pipeline/cascade-handler.js +85 -0
  753. package/dist/pipeline/dispatch-batch.d.ts +5 -0
  754. package/dist/pipeline/dispatch-batch.js +217 -0
  755. package/dist/pipeline/dispatch-query.d.ts +4 -0
  756. package/dist/pipeline/dispatch-query.js +141 -0
  757. package/dist/pipeline/dispatch-shared.d.ts +58 -0
  758. package/dist/pipeline/dispatch-shared.js +924 -0
  759. package/dist/pipeline/dispatch-stream.d.ts +3 -0
  760. package/dist/pipeline/dispatch-stream.js +89 -0
  761. package/dist/pipeline/dispatch-write.d.ts +6 -0
  762. package/dist/pipeline/dispatch-write.js +428 -0
  763. package/dist/pipeline/dispatcher-utils.d.ts +36 -0
  764. package/dist/pipeline/dispatcher-utils.js +139 -0
  765. package/dist/pipeline/dispatcher.d.ts +30 -0
  766. package/dist/pipeline/dispatcher.js +131 -0
  767. package/dist/pipeline/distributed-lock.d.ts +13 -0
  768. package/dist/pipeline/distributed-lock.js +42 -0
  769. package/dist/pipeline/entity-cache.d.ts +7 -0
  770. package/dist/pipeline/entity-cache.js +68 -0
  771. package/dist/pipeline/event-consumer-state.d.ts +16 -0
  772. package/dist/pipeline/event-consumer-state.js +96 -0
  773. package/dist/pipeline/event-dedup.d.ts +11 -0
  774. package/dist/pipeline/event-dedup.js +12 -0
  775. package/dist/pipeline/event-dispatcher-admin.d.ts +46 -0
  776. package/dist/pipeline/event-dispatcher-admin.js +196 -0
  777. package/dist/pipeline/event-dispatcher-delivery.d.ts +68 -0
  778. package/dist/pipeline/event-dispatcher-delivery.js +310 -0
  779. package/dist/pipeline/event-dispatcher.d.ts +52 -0
  780. package/dist/pipeline/event-dispatcher.js +523 -0
  781. package/dist/pipeline/event-retention.d.ts +20 -0
  782. package/dist/pipeline/event-retention.js +78 -0
  783. package/dist/pipeline/idempotency.d.ts +19 -0
  784. package/dist/pipeline/idempotency.js +115 -0
  785. package/dist/pipeline/index.d.ts +34 -0
  786. package/dist/pipeline/index.js +19 -0
  787. package/dist/pipeline/irreversible-operation-gate.d.ts +4 -0
  788. package/dist/pipeline/irreversible-operation-gate.js +57 -0
  789. package/dist/pipeline/lifecycle-pipeline.d.ts +29 -0
  790. package/dist/pipeline/lifecycle-pipeline.js +266 -0
  791. package/dist/pipeline/member-read-only-transaction.d.ts +3 -0
  792. package/dist/pipeline/member-read-only-transaction.js +68 -0
  793. package/dist/pipeline/member-reader.d.ts +7 -0
  794. package/dist/pipeline/member-reader.js +87 -0
  795. package/dist/pipeline/msp-rebuild.d.ts +12 -0
  796. package/dist/pipeline/msp-rebuild.js +163 -0
  797. package/dist/pipeline/multi-stream-apply-context.d.ts +18 -0
  798. package/dist/pipeline/multi-stream-apply-context.js +40 -0
  799. package/dist/pipeline/pending-gap-ranges.d.ts +12 -0
  800. package/dist/pipeline/pending-gap-ranges.js +99 -0
  801. package/dist/pipeline/projection-rebuild.d.ts +55 -0
  802. package/dist/pipeline/projection-rebuild.js +285 -0
  803. package/dist/pipeline/projection-state.d.ts +9 -0
  804. package/dist/pipeline/projection-state.js +51 -0
  805. package/dist/pipeline/projections-runner.d.ts +5 -0
  806. package/dist/pipeline/projections-runner.js +57 -0
  807. package/dist/pipeline/redis-keys.d.ts +8 -0
  808. package/dist/pipeline/redis-keys.js +10 -0
  809. package/dist/pipeline/system-hooks.d.ts +25 -0
  810. package/dist/pipeline/system-hooks.js +590 -0
  811. package/dist/pipeline/system-identity-switch.d.ts +30 -0
  812. package/dist/pipeline/system-identity-switch.js +248 -0
  813. package/dist/pipeline/tenant-timezone-cache.d.ts +17 -0
  814. package/dist/pipeline/tenant-timezone-cache.js +55 -0
  815. package/dist/pipeline/write-origin.d.ts +10 -0
  816. package/dist/pipeline/write-origin.js +110 -0
  817. package/dist/random/generate.d.ts +56 -0
  818. package/dist/random/generate.js +92 -0
  819. package/dist/random/index.d.ts +2 -0
  820. package/dist/random/index.js +2 -0
  821. package/dist/random/words.d.ts +2 -0
  822. package/dist/random/words.js +391 -0
  823. package/dist/rate-limit/bucket.d.ts +14 -0
  824. package/dist/rate-limit/bucket.js +20 -0
  825. package/dist/rate-limit/index.d.ts +3 -0
  826. package/dist/rate-limit/index.js +3 -0
  827. package/dist/rate-limit/middleware.d.ts +24 -0
  828. package/dist/rate-limit/middleware.js +101 -0
  829. package/dist/rate-limit/resolver.d.ts +9 -0
  830. package/dist/rate-limit/resolver.js +177 -0
  831. package/dist/redis/client.d.ts +9 -0
  832. package/dist/redis/client.js +44 -0
  833. package/dist/redis/index.d.ts +4 -0
  834. package/dist/redis/index.js +2 -0
  835. package/dist/redis/pubsub-signal.d.ts +11 -0
  836. package/dist/redis/pubsub-signal.js +79 -0
  837. package/dist/schema-cli.d.ts +21 -0
  838. package/dist/schema-cli.js +438 -0
  839. package/dist/scripts/codemod/crypto-shredding-testing-move.d.ts +2 -0
  840. package/dist/scripts/codemod/crypto-shredding-testing-move.js +109 -0
  841. package/dist/scripts/codemod/migrate-cross-tenant.d.ts +19 -0
  842. package/dist/scripts/codemod/migrate-cross-tenant.js +266 -0
  843. package/dist/scripts/codemod/migrate-db-raw.d.ts +23 -0
  844. package/dist/scripts/codemod/migrate-db-raw.js +345 -0
  845. package/dist/scripts/codemod/migrate-open-to-all.d.ts +22 -0
  846. package/dist/scripts/codemod/migrate-open-to-all.js +194 -0
  847. package/dist/scripts/codemod/pii-personal-migration.d.ts +11 -0
  848. package/dist/scripts/codemod/pii-personal-migration.js +615 -0
  849. package/dist/scripts/codemod/unprocessable-error-details-reason.d.ts +2 -0
  850. package/dist/scripts/codemod/unprocessable-error-details-reason.js +235 -0
  851. package/dist/search/derive-search-adapter-config.d.ts +3 -0
  852. package/dist/search/derive-search-adapter-config.js +23 -0
  853. package/dist/search/in-memory-adapter.d.ts +2 -0
  854. package/dist/search/in-memory-adapter.js +96 -0
  855. package/dist/search/index.d.ts +6 -0
  856. package/dist/search/index.js +8 -0
  857. package/dist/search/meilisearch-adapter.d.ts +10 -0
  858. package/dist/search/meilisearch-adapter.js +175 -0
  859. package/dist/search/purge-subject.d.ts +7 -0
  860. package/dist/search/purge-subject.js +178 -0
  861. package/dist/search/reindex-entity.d.ts +18 -0
  862. package/dist/search/reindex-entity.js +139 -0
  863. package/dist/search/types.js +1 -0
  864. package/dist/secrets/dek-cache.d.ts +13 -0
  865. package/dist/secrets/dek-cache.js +97 -0
  866. package/dist/secrets/derive-purpose-secret.d.ts +1 -0
  867. package/dist/secrets/derive-purpose-secret.js +16 -0
  868. package/dist/secrets/env-master-key-provider.d.ts +6 -0
  869. package/dist/secrets/env-master-key-provider.js +134 -0
  870. package/dist/secrets/envelope-cipher.d.ts +8 -0
  871. package/dist/secrets/envelope-cipher.js +36 -0
  872. package/dist/secrets/envelope.d.ts +3 -0
  873. package/dist/secrets/envelope.js +44 -0
  874. package/dist/secrets/index.d.ts +9 -0
  875. package/dist/secrets/index.js +9 -0
  876. package/dist/secrets/leak-guard.d.ts +1 -0
  877. package/dist/secrets/leak-guard.js +79 -0
  878. package/dist/secrets/rotation.d.ts +2 -0
  879. package/dist/secrets/rotation.js +29 -0
  880. package/dist/secrets/stored-envelope.d.ts +11 -0
  881. package/dist/secrets/stored-envelope.js +32 -0
  882. package/dist/secrets/types.d.ts +1 -0
  883. package/dist/seeding/entity-seed.d.ts +19 -0
  884. package/dist/seeding/entity-seed.js +12 -0
  885. package/dist/seeding/index.d.ts +2 -0
  886. package/dist/seeding/index.js +2 -0
  887. package/dist/seeding/types.d.ts +7 -0
  888. package/dist/seeding/types.js +1 -0
  889. package/dist/stack/db.d.ts +19 -0
  890. package/dist/stack/db.js +61 -0
  891. package/dist/stack/drain-event-consumers.d.ts +4 -0
  892. package/dist/stack/drain-event-consumers.js +48 -0
  893. package/dist/stack/drain-jobs.d.ts +20 -0
  894. package/dist/stack/drain-jobs.js +99 -0
  895. package/dist/stack/event-collector.d.ts +9 -0
  896. package/dist/stack/event-collector.js +12 -0
  897. package/dist/stack/index.d.ts +9 -0
  898. package/dist/stack/index.js +19 -0
  899. package/dist/stack/push-entity-projection-tables.d.ts +24 -0
  900. package/dist/stack/push-entity-projection-tables.js +73 -0
  901. package/dist/stack/redis.d.ts +11 -0
  902. package/dist/stack/redis.js +38 -0
  903. package/dist/stack/request-helper.d.ts +35 -0
  904. package/dist/stack/request-helper.js +144 -0
  905. package/dist/stack/table-helpers.d.ts +32 -0
  906. package/dist/stack/table-helpers.js +138 -0
  907. package/dist/stack/test-stack.d.ts +161 -0
  908. package/dist/stack/test-stack.js +398 -0
  909. package/dist/stack/test-users.d.ts +33 -0
  910. package/dist/stack/test-users.js +29 -0
  911. package/dist/testing/access-assertions.d.ts +2 -0
  912. package/dist/testing/access-assertions.js +13 -0
  913. package/dist/testing/assertions.d.ts +10 -0
  914. package/dist/testing/assertions.js +22 -0
  915. package/dist/testing/boot-validator-fixture.d.ts +3 -0
  916. package/dist/testing/boot-validator-fixture.js +101 -0
  917. package/dist/testing/closed-connection-error.d.ts +7 -0
  918. package/dist/testing/closed-connection-error.js +47 -0
  919. package/dist/testing/db-cleanup.d.ts +9 -0
  920. package/dist/testing/db-cleanup.js +31 -0
  921. package/dist/testing/e2e-generator.d.ts +49 -0
  922. package/dist/testing/e2e-generator.js +377 -0
  923. package/dist/testing/expect-error.d.ts +2 -0
  924. package/dist/testing/expect-error.js +22 -0
  925. package/dist/testing/file-provider-contract.d.ts +2 -0
  926. package/dist/testing/file-provider-contract.js +102 -0
  927. package/dist/testing/handler-context.d.ts +4 -0
  928. package/dist/testing/handler-context.js +72 -0
  929. package/dist/testing/http-cookies.d.ts +7 -0
  930. package/dist/testing/http-cookies.js +47 -0
  931. package/dist/testing/index.d.ts +24 -0
  932. package/dist/testing/index.js +32 -0
  933. package/dist/testing/late-bound.d.ts +9 -0
  934. package/dist/testing/late-bound.js +31 -0
  935. package/dist/testing/multipart-helper.d.ts +22 -0
  936. package/dist/testing/multipart-helper.js +77 -0
  937. package/dist/testing/mutable-master-key-provider.d.ts +7 -0
  938. package/dist/testing/mutable-master-key-provider.js +35 -0
  939. package/dist/testing/observability-recorder.d.ts +9 -0
  940. package/dist/testing/observability-recorder.js +29 -0
  941. package/dist/testing/real-providers.d.ts +3 -0
  942. package/dist/testing/real-providers.js +21 -0
  943. package/dist/testing/seed.d.ts +9 -0
  944. package/dist/testing/seed.js +21 -0
  945. package/dist/testing/shared-entities.d.ts +256 -0
  946. package/dist/testing/shared-entities.js +56 -0
  947. package/dist/testing/utils.d.ts +1 -0
  948. package/dist/testing/utils.js +1 -0
  949. package/dist/testing/wait-for.d.ts +20 -0
  950. package/dist/testing/wait-for.js +46 -0
  951. package/dist/testing/without-ambient-temporal.d.ts +5 -0
  952. package/dist/testing/without-ambient-temporal.js +17 -0
  953. package/dist/time/boot-tz-warning.d.ts +5 -0
  954. package/dist/time/boot-tz-warning.js +24 -0
  955. package/dist/time/geo-tz.js +1 -0
  956. package/dist/time/iana.d.ts +1 -0
  957. package/dist/time/iana.js +18 -0
  958. package/dist/time/index.d.ts +6 -0
  959. package/dist/time/index.js +15 -0
  960. package/dist/time/legacy-date.d.ts +5 -0
  961. package/dist/time/legacy-date.js +15 -0
  962. package/dist/time/polyfill.d.ts +9 -0
  963. package/dist/time/polyfill.js +52 -0
  964. package/dist/time/tz-context.d.ts +13 -0
  965. package/dist/time/tz-context.js +80 -0
  966. package/dist/ui-types/app-schema.d.ts +26 -0
  967. package/dist/ui-types/app-schema.js +9 -0
  968. package/dist/ui-types/formality.d.ts +2 -0
  969. package/dist/ui-types/formality.js +5 -0
  970. package/dist/ui-types/index.d.ts +22 -0
  971. package/dist/ui-types/index.js +31 -0
  972. package/dist/ui-types/list-row-meta.d.ts +18 -0
  973. package/dist/ui-types/list-row-meta.js +65 -0
  974. package/dist/ui-types/plural.d.ts +12 -0
  975. package/dist/ui-types/plural.js +57 -0
  976. package/dist/upgrade-cli.d.ts +11 -0
  977. package/dist/upgrade-cli.js +532 -0
  978. package/dist/utils/assert.d.ts +1 -0
  979. package/dist/utils/assert.js +18 -0
  980. package/dist/utils/case.d.ts +1 -0
  981. package/dist/utils/case.js +6 -0
  982. package/dist/utils/compare.d.ts +1 -0
  983. package/dist/utils/compare.js +10 -0
  984. package/dist/utils/env-parse.d.ts +1 -0
  985. package/dist/utils/env-parse.js +13 -0
  986. package/dist/utils/ids.d.ts +2 -0
  987. package/dist/utils/ids.js +23 -0
  988. package/dist/utils/index.d.ts +9 -0
  989. package/dist/utils/index.js +9 -0
  990. package/dist/utils/is-plain-object.d.ts +2 -0
  991. package/dist/utils/is-plain-object.js +4 -0
  992. package/dist/utils/parse-string-array-json.d.ts +2 -0
  993. package/dist/utils/parse-string-array-json.js +11 -0
  994. package/dist/utils/safe-json.d.ts +17 -0
  995. package/dist/utils/safe-json.js +47 -0
  996. package/dist/utils/serialization.d.ts +1 -0
  997. package/dist/utils/serialization.js +13 -0
  998. package/package.json +274 -93
  999. package/src/changes.json +42 -0
  1000. package/src/scripts/codemod/pii-personal-migration.ts +5 -5
  1001. package/src/__tests__/anonymous-access.integration.test.ts +0 -513
  1002. package/src/__tests__/consumer-cli.integration.test.ts +0 -172
  1003. package/src/__tests__/derived-fields.integration.test.ts +0 -126
  1004. package/src/__tests__/entity-list-limits.integration.test.ts +0 -84
  1005. package/src/__tests__/entity-permalink-open.integration.test.ts +0 -99
  1006. package/src/__tests__/error-contract.integration.test.ts +0 -436
  1007. package/src/__tests__/field-access.integration.test.ts +0 -273
  1008. package/src/__tests__/fixtures/migrate-cross-tenant/manual-only.expected.ts +0 -44
  1009. package/src/__tests__/fixtures/migrate-cross-tenant/manual-only.input.ts +0 -44
  1010. package/src/__tests__/fixtures/migrate-cross-tenant/rewrite.expected.ts +0 -41
  1011. package/src/__tests__/fixtures/migrate-cross-tenant/rewrite.input.ts +0 -41
  1012. package/src/__tests__/fixtures/migrate-db-raw/global-fetch.expected.ts +0 -9
  1013. package/src/__tests__/fixtures/migrate-db-raw/global-fetch.input.ts +0 -10
  1014. package/src/__tests__/fixtures/migrate-db-raw/global-select.expected.ts +0 -6
  1015. package/src/__tests__/fixtures/migrate-db-raw/global-select.input.ts +0 -12
  1016. package/src/__tests__/fixtures/migrate-db-raw/import-pruning.expected.ts +0 -12
  1017. package/src/__tests__/fixtures/migrate-db-raw/import-pruning.input.ts +0 -12
  1018. package/src/__tests__/fixtures/migrate-db-raw/manual-only.expected.ts +0 -26
  1019. package/src/__tests__/fixtures/migrate-db-raw/manual-only.input.ts +0 -26
  1020. package/src/__tests__/fixtures/migrate-db-raw/own-tenant-const-shorthand.expected.ts +0 -10
  1021. package/src/__tests__/fixtures/migrate-db-raw/own-tenant-const-shorthand.input.ts +0 -11
  1022. package/src/__tests__/fixtures/migrate-db-raw/own-tenant-event.expected.ts +0 -9
  1023. package/src/__tests__/fixtures/migrate-db-raw/own-tenant-event.input.ts +0 -15
  1024. package/src/__tests__/fixtures/migrate-open-to-all/manual-only.expected.ts +0 -16
  1025. package/src/__tests__/fixtures/migrate-open-to-all/manual-only.input.ts +0 -16
  1026. package/src/__tests__/fixtures/migrate-open-to-all/test-nested-shorthand.expected.ts +0 -12
  1027. package/src/__tests__/fixtures/migrate-open-to-all/test-nested-shorthand.input.ts +0 -12
  1028. package/src/__tests__/fixtures/migrate-open-to-all/test-simple.expected.ts +0 -7
  1029. package/src/__tests__/fixtures/migrate-open-to-all/test-simple.input.ts +0 -7
  1030. package/src/__tests__/full-stack.integration.test.ts +0 -924
  1031. package/src/__tests__/migrate-cross-tenant-codemod.test.ts +0 -106
  1032. package/src/__tests__/migrate-db-raw-codemod.test.ts +0 -132
  1033. package/src/__tests__/migrate-open-to-all-codemod.test.ts +0 -84
  1034. package/src/__tests__/ownership-where-write-path.integration.test.ts +0 -147
  1035. package/src/__tests__/ownership.integration.test.ts +0 -454
  1036. package/src/__tests__/pii-personal-migration-report-codemod.test.ts +0 -160
  1037. package/src/__tests__/reference-data.integration.test.ts +0 -243
  1038. package/src/__tests__/related-list-parent-filter.integration.test.ts +0 -103
  1039. package/src/__tests__/schema-cli-kms-slots.integration.test.ts +0 -172
  1040. package/src/__tests__/schema-cli-rebuild.integration.test.ts +0 -189
  1041. package/src/__tests__/schema-cli-status.integration.test.ts +0 -96
  1042. package/src/__tests__/schema-cli-temporal-polyfill.test.ts +0 -48
  1043. package/src/__tests__/schema-cli.integration.test.ts +0 -485
  1044. package/src/__tests__/store-table.integration.test.ts +0 -94
  1045. package/src/__tests__/transition-guard.integration.test.ts +0 -342
  1046. package/src/__tests__/unprocessable-error-details-reason-codemod.test.ts +0 -205
  1047. package/src/__tests__/upgrade-cli.test.ts +0 -723
  1048. package/src/api/__tests__/api-constants-completeness.test.ts +0 -63
  1049. package/src/api/__tests__/api.test.ts +0 -869
  1050. package/src/api/__tests__/auth-middleware-anonymous-access-boot.test.ts +0 -40
  1051. package/src/api/__tests__/auth-middleware-transport.test.ts +0 -102
  1052. package/src/api/__tests__/auth-routes-cookie.test.ts +0 -330
  1053. package/src/api/__tests__/auth-routes-invalid-body-invite.test.ts +0 -263
  1054. package/src/api/__tests__/auth-routes-mfa-preauth-confirm.test.ts +0 -230
  1055. package/src/api/__tests__/auth-routes-mfa-preauth-enable-start.test.ts +0 -263
  1056. package/src/api/__tests__/auth-routes-mfa-verify.test.ts +0 -221
  1057. package/src/api/__tests__/auth-routes-trusted-proxy.test.ts +0 -164
  1058. package/src/api/__tests__/batch.integration.test.ts +0 -548
  1059. package/src/api/__tests__/body-limit.test.ts +0 -184
  1060. package/src/api/__tests__/client-ip.test.ts +0 -184
  1061. package/src/api/__tests__/csrf-constants-sync.test.ts +0 -20
  1062. package/src/api/__tests__/csrf-middleware.test.ts +0 -97
  1063. package/src/api/__tests__/dispatcher-live.integration.test.ts +0 -292
  1064. package/src/api/__tests__/extra-route-rejection.test.ts +0 -38
  1065. package/src/api/__tests__/extra-routes.integration.test.ts +0 -663
  1066. package/src/api/__tests__/http-cache.test.ts +0 -173
  1067. package/src/api/__tests__/http-route-entry.integration.test.ts +0 -114
  1068. package/src/api/__tests__/http-route-rate-limit.integration.test.ts +0 -148
  1069. package/src/api/__tests__/jwt.test.ts +0 -316
  1070. package/src/api/__tests__/login-rate-limiter-sweep.test.ts +0 -50
  1071. package/src/api/__tests__/metrics-endpoint.test.ts +0 -132
  1072. package/src/api/__tests__/nested-write-ownership.integration.test.ts +0 -268
  1073. package/src/api/__tests__/nested-write.integration.test.ts +0 -210
  1074. package/src/api/__tests__/origin-middleware.integration.test.ts +0 -273
  1075. package/src/api/__tests__/origin-middleware.test.ts +0 -279
  1076. package/src/api/__tests__/pat-route-guard.integration.test.ts +0 -126
  1077. package/src/api/__tests__/pat-scope.test.ts +0 -36
  1078. package/src/api/__tests__/pii-leak-guard.integration.test.ts +0 -112
  1079. package/src/api/__tests__/post-auth-landing.test.ts +0 -100
  1080. package/src/api/__tests__/readiness.test.ts +0 -76
  1081. package/src/api/__tests__/redis-login-rate-limiter.integration.test.ts +0 -138
  1082. package/src/api/__tests__/redis-sse-broker.integration.test.ts +0 -321
  1083. package/src/api/__tests__/request-id-middleware.test.ts +0 -229
  1084. package/src/api/__tests__/request-locale.integration.test.ts +0 -146
  1085. package/src/api/__tests__/schema-route.integration.test.ts +0 -157
  1086. package/src/api/__tests__/server-boot-guards.test.ts +0 -308
  1087. package/src/api/__tests__/server-error-logging.test.ts +0 -342
  1088. package/src/api/__tests__/server-jwt-ttl.test.ts +0 -58
  1089. package/src/api/__tests__/sse-broker.test.ts +0 -267
  1090. package/src/api/__tests__/sse-route.test.ts +0 -245
  1091. package/src/api/__tests__/stream-escape-hatch.integration.test.ts +0 -203
  1092. package/src/api/__tests__/websocket-route.test.ts +0 -552
  1093. package/src/api/anonymous-cookie.ts +0 -61
  1094. package/src/api/api-constants.ts +0 -153
  1095. package/src/api/auth-middleware.ts +0 -694
  1096. package/src/api/auth-routes.ts +0 -1590
  1097. package/src/api/client-ip.ts +0 -131
  1098. package/src/api/csrf-middleware.ts +0 -74
  1099. package/src/api/extra-route.ts +0 -178
  1100. package/src/api/http-cache.ts +0 -122
  1101. package/src/api/index.ts +0 -117
  1102. package/src/api/jwt.ts +0 -277
  1103. package/src/api/observability-middleware.ts +0 -89
  1104. package/src/api/origin-middleware.ts +0 -137
  1105. package/src/api/pat-route-guard.ts +0 -51
  1106. package/src/api/pat-scope.ts +0 -14
  1107. package/src/api/pii-leak-guard.ts +0 -46
  1108. package/src/api/post-auth-landing.ts +0 -105
  1109. package/src/api/readiness.ts +0 -132
  1110. package/src/api/redis-sse-broker.ts +0 -171
  1111. package/src/api/request-context.ts +0 -137
  1112. package/src/api/request-id-middleware.ts +0 -138
  1113. package/src/api/route-registrars.ts +0 -193
  1114. package/src/api/routes.ts +0 -432
  1115. package/src/api/server.ts +0 -1550
  1116. package/src/api/sse-broker.ts +0 -175
  1117. package/src/api/sse-route.ts +0 -74
  1118. package/src/api/tokens.ts +0 -16
  1119. package/src/api/websocket-route.ts +0 -327
  1120. package/src/arg-parser.ts +0 -66
  1121. package/src/auth/__tests__/roles.test.ts +0 -24
  1122. package/src/auth/index.ts +0 -7
  1123. package/src/auth/roles.ts +0 -42
  1124. package/src/bun-db/__tests__/PATTERN.md +0 -72
  1125. package/src/bun-db/__tests__/_helpers.ts +0 -104
  1126. package/src/bun-db/__tests__/batch-methods.integration.test.ts +0 -143
  1127. package/src/bun-db/__tests__/batch-methods.test.ts +0 -21
  1128. package/src/bun-db/__tests__/bun-test-db.ts +0 -19
  1129. package/src/bun-db/__tests__/closed-connection-retry.integration.test.ts +0 -159
  1130. package/src/bun-db/__tests__/coerce-row-plain-date.test.ts +0 -70
  1131. package/src/bun-db/__tests__/coerce-row-temporal.test.ts +0 -41
  1132. package/src/bun-db/__tests__/column-types.integration.test.ts +0 -132
  1133. package/src/bun-db/__tests__/compound-types.integration.test.ts +0 -134
  1134. package/src/bun-db/__tests__/decimal-field.integration.test.ts +0 -81
  1135. package/src/bun-db/__tests__/extract-table-info.test.ts +0 -71
  1136. package/src/bun-db/__tests__/jsonb-edge-cases.integration.test.ts +0 -235
  1137. package/src/bun-db/__tests__/postgres-closed-socket-write.integration.test.ts +0 -87
  1138. package/src/bun-db/__tests__/query-guards.test.ts +0 -111
  1139. package/src/bun-db/__tests__/run-in-savepoint-if-supported.integration.test.ts +0 -47
  1140. package/src/bun-db/__tests__/select-many-retry.integration.test.ts +0 -138
  1141. package/src/bun-db/__tests__/smoke.integration.test.ts +0 -43
  1142. package/src/bun-db/__tests__/sql-expr-brand.test.ts +0 -115
  1143. package/src/bun-db/__tests__/sql-methods.integration.test.ts +0 -231
  1144. package/src/bun-db/__tests__/where-patterns.integration.test.ts +0 -213
  1145. package/src/bun-db/__tests__/write-brand.test.ts +0 -72
  1146. package/src/bun-db/connection.ts +0 -87
  1147. package/src/bun-db/index.ts +0 -36
  1148. package/src/bun-db/query.ts +0 -1259
  1149. package/src/compliance/__tests__/duration-spec.test.ts +0 -72
  1150. package/src/compliance/__tests__/profiles.test.ts +0 -308
  1151. package/src/compliance/__tests__/sub-processors.test.ts +0 -149
  1152. package/src/compliance/duration-spec.ts +0 -44
  1153. package/src/compliance/index.ts +0 -31
  1154. package/src/compliance/override-schema.ts +0 -136
  1155. package/src/compliance/profiles.ts +0 -424
  1156. package/src/compliance/sub-processors.ts +0 -165
  1157. package/src/consumer-cli.ts +0 -134
  1158. package/src/crypto/__tests__/blind-index.test.ts +0 -132
  1159. package/src/crypto/__tests__/event-pii.test.ts +0 -417
  1160. package/src/crypto/__tests__/kek-rotation.integration.test.ts +0 -180
  1161. package/src/crypto/__tests__/kek-source.test.ts +0 -441
  1162. package/src/crypto/__tests__/kms-adapter-contract.ts +0 -134
  1163. package/src/crypto/__tests__/kms-adapter.contract.test.ts +0 -4
  1164. package/src/crypto/__tests__/kms-wiring.test.ts +0 -203
  1165. package/src/crypto/__tests__/pg-kms-adapter.integration.test.ts +0 -154
  1166. package/src/crypto/__tests__/pii-field-encryption.test.ts +0 -403
  1167. package/src/crypto/__tests__/request-kms-cache.test.ts +0 -74
  1168. package/src/crypto/__tests__/subject-id-schema.test.ts +0 -60
  1169. package/src/crypto/__tests__/subject-key-record.test.ts +0 -109
  1170. package/src/crypto/__tests__/subject-resolver.test.ts +0 -250
  1171. package/src/crypto/__tests__/system-event-pii.test.ts +0 -77
  1172. package/src/crypto/blind-index.ts +0 -118
  1173. package/src/crypto/ciphertext-pattern.ts +0 -19
  1174. package/src/crypto/event-pii.ts +0 -99
  1175. package/src/crypto/in-memory-kms-adapter.ts +0 -50
  1176. package/src/crypto/index.ts +0 -84
  1177. package/src/crypto/is-self-pii-field.ts +0 -8
  1178. package/src/crypto/kek-source.ts +0 -180
  1179. package/src/crypto/kms-adapter.ts +0 -51
  1180. package/src/crypto/kms-wiring.ts +0 -208
  1181. package/src/crypto/pg-kms-adapter.ts +0 -303
  1182. package/src/crypto/pii-field-encryption.ts +0 -266
  1183. package/src/crypto/request-kms-cache.ts +0 -38
  1184. package/src/crypto/subject-resolver.ts +0 -232
  1185. package/src/crypto/system-event-pii.ts +0 -57
  1186. package/src/db/__tests__/apply-entity-event-removed-column.integration.test.ts +0 -109
  1187. package/src/db/__tests__/apply-entity-event-tenant.integration.test.ts +0 -159
  1188. package/src/db/__tests__/assert-exists-in.integration.test.ts +0 -120
  1189. package/src/db/__tests__/assert-no-unreachable-live-rows.integration.test.ts +0 -190
  1190. package/src/db/__tests__/big-int-field.test.ts +0 -132
  1191. package/src/db/__tests__/blind-index.integration.test.ts +0 -280
  1192. package/src/db/__tests__/build-filter-where.test.ts +0 -50
  1193. package/src/db/__tests__/collect-table-metas.test.ts +0 -188
  1194. package/src/db/__tests__/column-ddl.integration.test.ts +0 -122
  1195. package/src/db/__tests__/compound-types.test.ts +0 -126
  1196. package/src/db/__tests__/config-seed.integration.test.ts +0 -292
  1197. package/src/db/__tests__/connection-close-outage.integration.test.ts +0 -110
  1198. package/src/db/__tests__/connection-options.test.ts +0 -68
  1199. package/src/db/__tests__/cursor.test.ts +0 -42
  1200. package/src/db/__tests__/decimal-field.test.ts +0 -109
  1201. package/src/db/__tests__/dialect-instant.test.ts +0 -47
  1202. package/src/db/__tests__/eagerload.integration.test.ts +0 -374
  1203. package/src/db/__tests__/entity-field-encryption.test.ts +0 -74
  1204. package/src/db/__tests__/entity-table-from-registry.test.ts +0 -79
  1205. package/src/db/__tests__/entity-table-meta-source.test.ts +0 -92
  1206. package/src/db/__tests__/entity-table-types.test.ts +0 -162
  1207. package/src/db/__tests__/event-store-executor-context.pii-roundtrip.test.ts +0 -67
  1208. package/src/db/__tests__/event-store-executor-global-tenancy.integration.test.ts +0 -73
  1209. package/src/db/__tests__/event-store-executor-list.integration.test.ts +0 -791
  1210. package/src/db/__tests__/event-store-executor-money-rehydrate.integration.test.ts +0 -153
  1211. package/src/db/__tests__/event-store-executor-reference-search.integration.test.ts +0 -643
  1212. package/src/db/__tests__/event-store-executor-reference-sort.integration.test.ts +0 -256
  1213. package/src/db/__tests__/event-store-executor-write-verbs.integration.test.ts +0 -788
  1214. package/src/db/__tests__/event-store-executor.integration.test.ts +0 -844
  1215. package/src/db/__tests__/event-store-system-stream.integration.test.ts +0 -96
  1216. package/src/db/__tests__/feature-table-sources.test.ts +0 -34
  1217. package/src/db/__tests__/implicit-projection-equivalence.integration.test.ts +0 -393
  1218. package/src/db/__tests__/instant-to-driver-temporal.test.ts +0 -21
  1219. package/src/db/__tests__/list-filter-field-access.integration.test.ts +0 -218
  1220. package/src/db/__tests__/list-pagination.test.ts +0 -28
  1221. package/src/db/__tests__/list-row-meta-drift.test.ts +0 -15
  1222. package/src/db/__tests__/located-timestamp.test.ts +0 -203
  1223. package/src/db/__tests__/managed-recreate.integration.test.ts +0 -78
  1224. package/src/db/__tests__/migrate-generator.test.ts +0 -383
  1225. package/src/db/__tests__/migrate-runner.test.ts +0 -118
  1226. package/src/db/__tests__/money.test.ts +0 -291
  1227. package/src/db/__tests__/multi-row-insert.integration.test.ts +0 -88
  1228. package/src/db/__tests__/number-field-fractional.integration.test.ts +0 -58
  1229. package/src/db/__tests__/parent-ref-clause.test.ts +0 -213
  1230. package/src/db/__tests__/parse-auto-verb.test.ts +0 -70
  1231. package/src/db/__tests__/pg-error.test.ts +0 -57
  1232. package/src/db/__tests__/rebuild-marker.test.ts +0 -180
  1233. package/src/db/__tests__/replay-migration-sql.test.ts +0 -401
  1234. package/src/db/__tests__/required-not-null-migration-safety.integration.test.ts +0 -109
  1235. package/src/db/__tests__/run-in-own-transaction.integration.test.ts +0 -166
  1236. package/src/db/__tests__/schema-inspection.test.ts +0 -27
  1237. package/src/db/__tests__/schema-migration.integration.test.ts +0 -354
  1238. package/src/db/__tests__/source-shadow-create.integration.test.ts +0 -59
  1239. package/src/db/__tests__/system-db-view-export.test.ts +0 -107
  1240. package/src/db/__tests__/table-builder-indexes.test.ts +0 -189
  1241. package/src/db/__tests__/table-builder-meta-lockstep.test.ts +0 -224
  1242. package/src/db/__tests__/table-builder-required.test.ts +0 -214
  1243. package/src/db/__tests__/tenant-db-convention-cross-tenant.test.ts +0 -72
  1244. package/src/db/__tests__/tenant-db-count.integration.test.ts +0 -92
  1245. package/src/db/__tests__/tenant-db-declared-unsafe-raw.test.ts +0 -163
  1246. package/src/db/__tests__/tenant-db-global.integration.test.ts +0 -134
  1247. package/src/db/__tests__/tenant-db-global.test.ts +0 -352
  1248. package/src/db/__tests__/tenant-db-no-raw.test.ts +0 -85
  1249. package/src/db/__tests__/tenant-db-where-merge.integration.test.ts +0 -123
  1250. package/src/db/__tests__/tenant-db-where-merge.test.ts +0 -164
  1251. package/src/db/__tests__/tenant-db.integration.test.ts +0 -575
  1252. package/src/db/__tests__/unchecked-system-db.test.ts +0 -259
  1253. package/src/db/__tests__/unique-violation-mapping.integration.test.ts +0 -200
  1254. package/src/db/__tests__/with-systemdb-unsafe-raw-grant.test.ts +0 -71
  1255. package/src/db/api.ts +0 -52
  1256. package/src/db/apply-entity-event.ts +0 -211
  1257. package/src/db/assert-exists-in.ts +0 -52
  1258. package/src/db/blind-index-cleanup.ts +0 -145
  1259. package/src/db/bun-provider.ts +0 -42
  1260. package/src/db/collect-table-metas.ts +0 -98
  1261. package/src/db/compound-types.ts +0 -47
  1262. package/src/db/config-seed.ts +0 -104
  1263. package/src/db/connection.ts +0 -57
  1264. package/src/db/cursor.ts +0 -47
  1265. package/src/db/dialect.ts +0 -544
  1266. package/src/db/eagerload.ts +0 -260
  1267. package/src/db/entity-field-encryption.ts +0 -158
  1268. package/src/db/entity-table-from-registry.ts +0 -31
  1269. package/src/db/entity-table-meta-types.ts +0 -2
  1270. package/src/db/entity-table-meta.ts +0 -491
  1271. package/src/db/event-store-executor-context.ts +0 -510
  1272. package/src/db/event-store-executor-read.ts +0 -916
  1273. package/src/db/event-store-executor-write.ts +0 -920
  1274. package/src/db/event-store-executor.ts +0 -50
  1275. package/src/db/feature-table-sources.ts +0 -35
  1276. package/src/db/index.ts +0 -162
  1277. package/src/db/located-timestamp.ts +0 -118
  1278. package/src/db/migrate-generator.ts +0 -549
  1279. package/src/db/migrate-runner.ts +0 -348
  1280. package/src/db/money.ts +0 -211
  1281. package/src/db/parent-ref-clause.ts +0 -182
  1282. package/src/db/pg-error.ts +0 -74
  1283. package/src/db/postgres-provider.ts +0 -28
  1284. package/src/db/queries/__tests__/event-store-idempotency-index.integration.test.ts +0 -78
  1285. package/src/db/queries/__tests__/shadow-swap.test.ts +0 -43
  1286. package/src/db/queries/__tests__/unsafe-read-retrying.integration.test.ts +0 -115
  1287. package/src/db/queries/advisory-lock.ts +0 -11
  1288. package/src/db/queries/backfill-pii.ts +0 -479
  1289. package/src/db/queries/ddl.ts +0 -45
  1290. package/src/db/queries/entity-read.ts +0 -15
  1291. package/src/db/queries/es-ops.ts +0 -17
  1292. package/src/db/queries/event-consumer.ts +0 -418
  1293. package/src/db/queries/event-store-admin.ts +0 -130
  1294. package/src/db/queries/event-store-transfer.ts +0 -73
  1295. package/src/db/queries/event-store.ts +0 -354
  1296. package/src/db/queries/projection-rebuild.ts +0 -104
  1297. package/src/db/queries/raw-sql.ts +0 -28
  1298. package/src/db/queries/seed-context.ts +0 -62
  1299. package/src/db/queries/shadow-swap.ts +0 -378
  1300. package/src/db/queries/table-ops.ts +0 -11
  1301. package/src/db/queries/test-stack.ts +0 -32
  1302. package/src/db/query-api.ts +0 -24
  1303. package/src/db/query.ts +0 -35
  1304. package/src/db/rebuild-marker.ts +0 -103
  1305. package/src/db/reference-data.ts +0 -73
  1306. package/src/db/render-ddl.ts +0 -57
  1307. package/src/db/replay-migration-sql.ts +0 -257
  1308. package/src/db/schema-inspection.ts +0 -81
  1309. package/src/db/table-builder.ts +0 -692
  1310. package/src/db/tenant-db-runner.ts +0 -23
  1311. package/src/db/tenant-db.ts +0 -727
  1312. package/src/derivatives/__tests__/derivatives-context.integration.test.ts +0 -231
  1313. package/src/derivatives/__tests__/derivatives-context.test.ts +0 -369
  1314. package/src/derivatives/__tests__/field-variants.test.ts +0 -62
  1315. package/src/derivatives/__tests__/variant-key.test.ts +0 -183
  1316. package/src/derivatives/__tests__/variant-route.integration.test.ts +0 -268
  1317. package/src/derivatives/delete-stored-file.ts +0 -86
  1318. package/src/derivatives/derivatives-context.ts +0 -314
  1319. package/src/derivatives/field-variants.ts +0 -20
  1320. package/src/derivatives/index.ts +0 -14
  1321. package/src/derivatives/variant-key.ts +0 -108
  1322. package/src/engine/__tests__/_pipeline-test-utils.ts +0 -23
  1323. package/src/engine/__tests__/auth-claims-registrar.test.ts +0 -74
  1324. package/src/engine/__tests__/boot-validator-action-wiring.test.ts +0 -362
  1325. package/src/engine/__tests__/boot-validator-api-exposure.test.ts +0 -142
  1326. package/src/engine/__tests__/boot-validator-boot-check.test.ts +0 -104
  1327. package/src/engine/__tests__/boot-validator-dashboard.test.ts +0 -381
  1328. package/src/engine/__tests__/boot-validator-detail-for.test.ts +0 -106
  1329. package/src/engine/__tests__/boot-validator-entity-list.test.ts +0 -120
  1330. package/src/engine/__tests__/boot-validator-gdpr-storage.test.ts +0 -85
  1331. package/src/engine/__tests__/boot-validator-i18n-keys.test.ts +0 -153
  1332. package/src/engine/__tests__/boot-validator-located-timestamps.test.ts +0 -92
  1333. package/src/engine/__tests__/boot-validator-nav-area.test.ts +0 -116
  1334. package/src/engine/__tests__/boot-validator-pii-retention.test.ts +0 -994
  1335. package/src/engine/__tests__/boot-validator-projection-list.test.ts +0 -629
  1336. package/src/engine/__tests__/boot-validator-query-output-schema.test.ts +0 -578
  1337. package/src/engine/__tests__/boot-validator-query-refs.test.ts +0 -151
  1338. package/src/engine/__tests__/boot-validator-ref-entity.test.ts +0 -196
  1339. package/src/engine/__tests__/boot-validator-s0-integration.test.ts +0 -172
  1340. package/src/engine/__tests__/boot-validator.test.ts +0 -5984
  1341. package/src/engine/__tests__/build-app-schema-settings-hub.test.ts +0 -246
  1342. package/src/engine/__tests__/build-app-schema-url-prefill.test.ts +0 -222
  1343. package/src/engine/__tests__/build-app-schema.test.ts +0 -1141
  1344. package/src/engine/__tests__/build-config-feature-schema-extension-selector.test.ts +0 -395
  1345. package/src/engine/__tests__/build-config-feature-schema-secrets.test.ts +0 -188
  1346. package/src/engine/__tests__/build-config-feature-schema.test.ts +0 -511
  1347. package/src/engine/__tests__/build-target.test.ts +0 -127
  1348. package/src/engine/__tests__/changeset-changes.test.ts +0 -64
  1349. package/src/engine/__tests__/claim-keys.test.ts +0 -274
  1350. package/src/engine/__tests__/codemod-pipeline.test.ts +0 -682
  1351. package/src/engine/__tests__/config-helpers.test.ts +0 -309
  1352. package/src/engine/__tests__/content-collection.test.ts +0 -307
  1353. package/src/engine/__tests__/decimal-field.test.ts +0 -59
  1354. package/src/engine/__tests__/dedupe-features.test.ts +0 -85
  1355. package/src/engine/__tests__/define-feature-entity-mapping.test.ts +0 -53
  1356. package/src/engine/__tests__/define-roles.test.ts +0 -21
  1357. package/src/engine/__tests__/define-workflow.test.ts +0 -79
  1358. package/src/engine/__tests__/describe-workflow-step-error.test.ts +0 -17
  1359. package/src/engine/__tests__/duration-utils.test.ts +0 -16
  1360. package/src/engine/__tests__/effective-features.test.ts +0 -86
  1361. package/src/engine/__tests__/embedded-derived.test.ts +0 -35
  1362. package/src/engine/__tests__/engine.test.ts +0 -2406
  1363. package/src/engine/__tests__/entity-create-caller-id.integration.test.ts +0 -87
  1364. package/src/engine/__tests__/entity-exclude-fields.integration.test.ts +0 -134
  1365. package/src/engine/__tests__/entity-handlers-escape-hatch.test.ts +0 -91
  1366. package/src/engine/__tests__/entity-handlers.test.ts +0 -562
  1367. package/src/engine/__tests__/entity-presave-wiring.integration.test.ts +0 -153
  1368. package/src/engine/__tests__/entity-restore-tenant-isolation.integration.test.ts +0 -168
  1369. package/src/engine/__tests__/entity-write-crosstenant.integration.test.ts +0 -317
  1370. package/src/engine/__tests__/event-helpers.test.ts +0 -68
  1371. package/src/engine/__tests__/event-migration-declarative.test.ts +0 -67
  1372. package/src/engine/__tests__/event-type-map-augmentation.test.ts +0 -24
  1373. package/src/engine/__tests__/extend-entity-projection.test.ts +0 -133
  1374. package/src/engine/__tests__/extends-registrar.test.ts +0 -279
  1375. package/src/engine/__tests__/factories-long-text.test.ts +0 -95
  1376. package/src/engine/__tests__/factories-number-unit.test.ts +0 -23
  1377. package/src/engine/__tests__/factories-personal.test.ts +0 -216
  1378. package/src/engine/__tests__/factories-time.test.ts +0 -94
  1379. package/src/engine/__tests__/feature-crud-shorthand.test.ts +0 -73
  1380. package/src/engine/__tests__/feature-crud-verb-access.integration.test.ts +0 -83
  1381. package/src/engine/__tests__/feature-manifest.test.ts +0 -137
  1382. package/src/engine/__tests__/field-access.test.ts +0 -65
  1383. package/src/engine/__tests__/field-predicates.test.ts +0 -48
  1384. package/src/engine/__tests__/form-money-currency-types.test.ts +0 -90
  1385. package/src/engine/__tests__/hook-identity-switch-grant.test.ts +0 -188
  1386. package/src/engine/__tests__/hook-phases.test.ts +0 -172
  1387. package/src/engine/__tests__/http-route-anonymous-required.test.ts +0 -43
  1388. package/src/engine/__tests__/identifiers.test.ts +0 -35
  1389. package/src/engine/__tests__/lifecycle-hooks.test.ts +0 -243
  1390. package/src/engine/__tests__/membership-roles.test.ts +0 -67
  1391. package/src/engine/__tests__/metric-navigate-tab.test.ts +0 -167
  1392. package/src/engine/__tests__/multiselect-filter.integration.test.ts +0 -141
  1393. package/src/engine/__tests__/nav.test.ts +0 -497
  1394. package/src/engine/__tests__/no-return-guard.test.ts +0 -17
  1395. package/src/engine/__tests__/ownership.test.ts +0 -475
  1396. package/src/engine/__tests__/parse-ref-target.test.ts +0 -43
  1397. package/src/engine/__tests__/pipeline-engine.test.ts +0 -215
  1398. package/src/engine/__tests__/pipeline-handler.integration.test.ts +0 -880
  1399. package/src/engine/__tests__/pipeline-observability.integration.test.ts +0 -142
  1400. package/src/engine/__tests__/pipeline-performance.integration.test.ts +0 -152
  1401. package/src/engine/__tests__/pipeline-sub-pipelines.test.ts +0 -288
  1402. package/src/engine/__tests__/post-query-hook.test.ts +0 -144
  1403. package/src/engine/__tests__/project-app-schema-for-roles.test.ts +0 -500
  1404. package/src/engine/__tests__/projection-detail-actions.test.ts +0 -145
  1405. package/src/engine/__tests__/projection-detail-singleton.test.ts +0 -86
  1406. package/src/engine/__tests__/projection-detail-tabs.test.ts +0 -314
  1407. package/src/engine/__tests__/projection-helpers.test.ts +0 -75
  1408. package/src/engine/__tests__/projection-list-filter.integration.test.ts +0 -115
  1409. package/src/engine/__tests__/projection.test.ts +0 -191
  1410. package/src/engine/__tests__/qualified-name.test.ts +0 -306
  1411. package/src/engine/__tests__/read-steps-tenant-filter.integration.test.ts +0 -215
  1412. package/src/engine/__tests__/registrar-object-form.test.ts +0 -141
  1413. package/src/engine/__tests__/registry.test.ts +0 -326
  1414. package/src/engine/__tests__/required-surface-keys.test.ts +0 -477
  1415. package/src/engine/__tests__/resolve-config-or-param.test.ts +0 -315
  1416. package/src/engine/__tests__/role-assignment.test.ts +0 -71
  1417. package/src/engine/__tests__/row-action-navigate-tab.test.ts +0 -107
  1418. package/src/engine/__tests__/run-in.test.ts +0 -38
  1419. package/src/engine/__tests__/schema-builder-date-bounds.test.ts +0 -47
  1420. package/src/engine/__tests__/schema-builder.test.ts +0 -1211
  1421. package/src/engine/__tests__/screen-definition-exports.test.ts +0 -102
  1422. package/src/engine/__tests__/screen-filter-ops.test.ts +0 -31
  1423. package/src/engine/__tests__/screen-helpers.test.ts +0 -52
  1424. package/src/engine/__tests__/screen.test.ts +0 -1684
  1425. package/src/engine/__tests__/search-payload-extension.test.ts +0 -288
  1426. package/src/engine/__tests__/soft-delete-cleanup-job-tenant-db.integration.test.ts +0 -82
  1427. package/src/engine/__tests__/soft-delete-cleanup.test.ts +0 -167
  1428. package/src/engine/__tests__/state-machine.test.ts +0 -148
  1429. package/src/engine/__tests__/steps-aggregate-append-event.test.ts +0 -115
  1430. package/src/engine/__tests__/steps-aggregate-create.test.ts +0 -92
  1431. package/src/engine/__tests__/steps-aggregate-update.test.ts +0 -127
  1432. package/src/engine/__tests__/steps-call-feature.test.ts +0 -123
  1433. package/src/engine/__tests__/steps-mail-send.test.ts +0 -137
  1434. package/src/engine/__tests__/steps-read.test.ts +0 -332
  1435. package/src/engine/__tests__/steps-resolver-utils.test.ts +0 -50
  1436. package/src/engine/__tests__/steps-unsafe-projection-delete.test.ts +0 -77
  1437. package/src/engine/__tests__/steps-unsafe-projection-upsert.test.ts +0 -131
  1438. package/src/engine/__tests__/steps-webhook-send.test.ts +0 -143
  1439. package/src/engine/__tests__/steps-workflow.test.ts +0 -353
  1440. package/src/engine/__tests__/store-table.test.ts +0 -247
  1441. package/src/engine/__tests__/system-user.test.ts +0 -57
  1442. package/src/engine/__tests__/tier-resolver-extension.test.ts +0 -69
  1443. package/src/engine/__tests__/toolbar-navigate-tab.test.ts +0 -233
  1444. package/src/engine/__tests__/tree-actions-patterns.test.ts +0 -163
  1445. package/src/engine/__tests__/validate-custom-screen-write-qns.test.ts +0 -43
  1446. package/src/engine/__tests__/validate-projection-allowlist.test.ts +0 -498
  1447. package/src/engine/__tests__/validation-hooks.test.ts +0 -77
  1448. package/src/engine/__tests__/where-rule-lint.test.ts +0 -79
  1449. package/src/engine/__tests__/write-handler-qn-extract.test.ts +0 -50
  1450. package/src/engine/access.ts +0 -27
  1451. package/src/engine/active-membership.ts +0 -70
  1452. package/src/engine/boot-validator/__tests__/access-declarations.test.ts +0 -707
  1453. package/src/engine/boot-validator/__tests__/access-roles.test.ts +0 -84
  1454. package/src/engine/boot-validator/__tests__/action-icon.test.ts +0 -81
  1455. package/src/engine/boot-validator/__tests__/anonymous-rate-limit-required.test.ts +0 -63
  1456. package/src/engine/boot-validator/__tests__/config-deps.test.ts +0 -92
  1457. package/src/engine/boot-validator/__tests__/global-tenancy.test.ts +0 -73
  1458. package/src/engine/boot-validator/__tests__/i18n-keys.test.ts +0 -340
  1459. package/src/engine/boot-validator/__tests__/nav.test.ts +0 -290
  1460. package/src/engine/boot-validator/__tests__/no-all-role-in-handler-access.test.ts +0 -77
  1461. package/src/engine/boot-validator/__tests__/ownership.test.ts +0 -87
  1462. package/src/engine/boot-validator/__tests__/parent-ref.test.ts +0 -161
  1463. package/src/engine/boot-validator/__tests__/rate-limit-disabled-reason.test.ts +0 -45
  1464. package/src/engine/boot-validator/__tests__/record-owned.test.ts +0 -65
  1465. package/src/engine/boot-validator/__tests__/security-baseline.test.ts +0 -107
  1466. package/src/engine/boot-validator/__tests__/transfer-graph.test.ts +0 -138
  1467. package/src/engine/boot-validator/access-declarations.ts +0 -211
  1468. package/src/engine/boot-validator/access-roles.ts +0 -85
  1469. package/src/engine/boot-validator/action-wiring.ts +0 -163
  1470. package/src/engine/boot-validator/api-ext.ts +0 -81
  1471. package/src/engine/boot-validator/boot-check.ts +0 -21
  1472. package/src/engine/boot-validator/config-deps.ts +0 -246
  1473. package/src/engine/boot-validator/custom-screen-write-qns.ts +0 -87
  1474. package/src/engine/boot-validator/detail-screens.ts +0 -49
  1475. package/src/engine/boot-validator/entity-handler.ts +0 -1011
  1476. package/src/engine/boot-validator/entity-list-screens.ts +0 -100
  1477. package/src/engine/boot-validator/gdpr-storage.ts +0 -59
  1478. package/src/engine/boot-validator/global-tenancy.ts +0 -29
  1479. package/src/engine/boot-validator/i18n-keys.ts +0 -101
  1480. package/src/engine/boot-validator/index.ts +0 -301
  1481. package/src/engine/boot-validator/nav.ts +0 -241
  1482. package/src/engine/boot-validator/ownership.ts +0 -352
  1483. package/src/engine/boot-validator/parent-ref.ts +0 -96
  1484. package/src/engine/boot-validator/pii-retention.ts +0 -272
  1485. package/src/engine/boot-validator/projection-list-screens.ts +0 -293
  1486. package/src/engine/boot-validator/query-output-columns.ts +0 -273
  1487. package/src/engine/boot-validator/query-refs.ts +0 -141
  1488. package/src/engine/boot-validator/record-owned.ts +0 -21
  1489. package/src/engine/boot-validator/screens.ts +0 -2604
  1490. package/src/engine/boot-validator/security-baseline.ts +0 -26
  1491. package/src/engine/boot-validator/transfer-graph.ts +0 -135
  1492. package/src/engine/boot-validator/url-prefill-fields.ts +0 -178
  1493. package/src/engine/boot-validator/workspaces.ts +0 -106
  1494. package/src/engine/boot-validator/zod-shape.ts +0 -142
  1495. package/src/engine/boot-validator.ts +0 -8
  1496. package/src/engine/build-app-schema.ts +0 -540
  1497. package/src/engine/build-config-feature-schema.ts +0 -815
  1498. package/src/engine/build-target.ts +0 -99
  1499. package/src/engine/changeset-changes.ts +0 -117
  1500. package/src/engine/codemod/index.ts +0 -15
  1501. package/src/engine/codemod/pipeline-codemod.ts +0 -641
  1502. package/src/engine/config-helpers.ts +0 -217
  1503. package/src/engine/constants.ts +0 -117
  1504. package/src/engine/create-app.ts +0 -177
  1505. package/src/engine/cross-tenant.test.ts +0 -32
  1506. package/src/engine/cross-tenant.ts +0 -22
  1507. package/src/engine/dedupe-features.ts +0 -46
  1508. package/src/engine/define-feature.ts +0 -169
  1509. package/src/engine/define-handler.ts +0 -194
  1510. package/src/engine/define-roles.ts +0 -19
  1511. package/src/engine/define-step.ts +0 -28
  1512. package/src/engine/define-workflow.ts +0 -147
  1513. package/src/engine/effective-features.ts +0 -97
  1514. package/src/engine/embedded-derived.ts +0 -93
  1515. package/src/engine/entity-handlers.ts +0 -782
  1516. package/src/engine/escape-hatch-declaration.ts +0 -7
  1517. package/src/engine/event-helpers.ts +0 -73
  1518. package/src/engine/extension-names.ts +0 -242
  1519. package/src/engine/extension-selector-plugins.ts +0 -24
  1520. package/src/engine/extensions/__tests__/hook-ctx-db-tenant-scoped.test.ts +0 -76
  1521. package/src/engine/extensions/escape-hatch-usage.ts +0 -16
  1522. package/src/engine/extensions/storage-provider.ts +0 -16
  1523. package/src/engine/extensions/tenant-data.ts +0 -34
  1524. package/src/engine/extensions/tenant-resource.ts +0 -40
  1525. package/src/engine/extensions/user-data.ts +0 -181
  1526. package/src/engine/factories.ts +0 -559
  1527. package/src/engine/feature-ast/__tests__/canonical-form.test.ts +0 -416
  1528. package/src/engine/feature-ast/__tests__/fixtures/cross-file-name-const/constants.ts +0 -1
  1529. package/src/engine/feature-ast/__tests__/fixtures/cross-file-name-const/feature.ts +0 -8
  1530. package/src/engine/feature-ast/__tests__/fixtures/cross-file-patch-const/constants.ts +0 -2
  1531. package/src/engine/feature-ast/__tests__/fixtures/cross-file-patch-const/feature.ts +0 -8
  1532. package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/feature.ts +0 -9
  1533. package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/screens.ts +0 -4
  1534. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/alias-reexport.ts +0 -1
  1535. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/cycle-a.ts +0 -1
  1536. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/cycle-b.ts +0 -1
  1537. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/entry.ts +0 -3
  1538. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/local-rebind.ts +0 -3
  1539. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/origin.ts +0 -1
  1540. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/star-barrel.ts +0 -1
  1541. package/src/engine/feature-ast/__tests__/handler-header-roundtrip.test.ts +0 -669
  1542. package/src/engine/feature-ast/__tests__/parse-happy-path.test.ts +0 -196
  1543. package/src/engine/feature-ast/__tests__/parse-real-features.test.ts +0 -138
  1544. package/src/engine/feature-ast/__tests__/parse.test.ts +0 -2841
  1545. package/src/engine/feature-ast/__tests__/patch-update.test.ts +0 -718
  1546. package/src/engine/feature-ast/__tests__/patch.test.ts +0 -780
  1547. package/src/engine/feature-ast/__tests__/patcher.test.ts +0 -468
  1548. package/src/engine/feature-ast/__tests__/pattern-change-schema.test.ts +0 -819
  1549. package/src/engine/feature-ast/__tests__/read-optional-access-rule.test.ts +0 -42
  1550. package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +0 -947
  1551. package/src/engine/feature-ast/__tests__/resolve-import.test.ts +0 -138
  1552. package/src/engine/feature-ast/entity-field-types.ts +0 -41
  1553. package/src/engine/feature-ast/extractors/ai-steps.ts +0 -352
  1554. package/src/engine/feature-ast/extractors/events.ts +0 -349
  1555. package/src/engine/feature-ast/extractors/handlers.ts +0 -459
  1556. package/src/engine/feature-ast/extractors/hooks.ts +0 -331
  1557. package/src/engine/feature-ast/extractors/index.ts +0 -92
  1558. package/src/engine/feature-ast/extractors/jobs-routes.ts +0 -225
  1559. package/src/engine/feature-ast/extractors/projections-screens.ts +0 -269
  1560. package/src/engine/feature-ast/extractors/resolve-import.ts +0 -187
  1561. package/src/engine/feature-ast/extractors/round1.ts +0 -150
  1562. package/src/engine/feature-ast/extractors/round2.ts +0 -276
  1563. package/src/engine/feature-ast/extractors/round3.ts +0 -474
  1564. package/src/engine/feature-ast/extractors/round5.ts +0 -114
  1565. package/src/engine/feature-ast/extractors/round6.ts +0 -32
  1566. package/src/engine/feature-ast/extractors/shared.ts +0 -356
  1567. package/src/engine/feature-ast/index.ts +0 -113
  1568. package/src/engine/feature-ast/parse.ts +0 -615
  1569. package/src/engine/feature-ast/patch.ts +0 -979
  1570. package/src/engine/feature-ast/patcher.ts +0 -546
  1571. package/src/engine/feature-ast/pattern-change-schema.ts +0 -1411
  1572. package/src/engine/feature-ast/patterns.ts +0 -803
  1573. package/src/engine/feature-ast/render.ts +0 -767
  1574. package/src/engine/feature-ast/source-location.ts +0 -45
  1575. package/src/engine/feature-builder-state.ts +0 -174
  1576. package/src/engine/feature-changelog.ts +0 -95
  1577. package/src/engine/feature-config-events-jobs.ts +0 -472
  1578. package/src/engine/feature-entity-handlers.ts +0 -269
  1579. package/src/engine/feature-manifest.ts +0 -173
  1580. package/src/engine/feature-ui-extensions.ts +0 -648
  1581. package/src/engine/field-access.ts +0 -140
  1582. package/src/engine/field-helpers.ts +0 -35
  1583. package/src/engine/handler-helpers.ts +0 -26
  1584. package/src/engine/hook-helpers.ts +0 -16
  1585. package/src/engine/i18n-key.ts +0 -12
  1586. package/src/engine/index.ts +0 -585
  1587. package/src/engine/instruction-fields.ts +0 -11
  1588. package/src/engine/membership-roles.ts +0 -61
  1589. package/src/engine/object-form.ts +0 -27
  1590. package/src/engine/ownership.ts +0 -404
  1591. package/src/engine/parse-ref-target.ts +0 -28
  1592. package/src/engine/pattern-library/__tests__/library.test.ts +0 -399
  1593. package/src/engine/pattern-library/index.ts +0 -24
  1594. package/src/engine/pattern-library/library.ts +0 -140
  1595. package/src/engine/pattern-library/mixed-schemas.ts +0 -588
  1596. package/src/engine/pattern-library/opaque-schemas.ts +0 -124
  1597. package/src/engine/pattern-library/shared-fields.ts +0 -79
  1598. package/src/engine/pattern-library/static-schemas.ts +0 -456
  1599. package/src/engine/pattern-library/types.ts +0 -255
  1600. package/src/engine/personal-data-fields.ts +0 -66
  1601. package/src/engine/pipeline.ts +0 -111
  1602. package/src/engine/project-app-schema-for-roles.ts +0 -950
  1603. package/src/engine/projection-helpers.ts +0 -79
  1604. package/src/engine/qualified-name.ts +0 -165
  1605. package/src/engine/read-claim.ts +0 -31
  1606. package/src/engine/registry-facade.ts +0 -381
  1607. package/src/engine/registry-ingest.ts +0 -479
  1608. package/src/engine/registry-state.ts +0 -410
  1609. package/src/engine/registry-validate.ts +0 -810
  1610. package/src/engine/registry.ts +0 -94
  1611. package/src/engine/resolve-config-or-param.ts +0 -157
  1612. package/src/engine/role-assignment.ts +0 -63
  1613. package/src/engine/run-in.ts +0 -29
  1614. package/src/engine/run-pipeline.ts +0 -162
  1615. package/src/engine/schema-builder.ts +0 -428
  1616. package/src/engine/screen-filter-ops.ts +0 -60
  1617. package/src/engine/screen-helpers.ts +0 -161
  1618. package/src/engine/soft-delete-cleanup.ts +0 -126
  1619. package/src/engine/state-machine.ts +0 -71
  1620. package/src/engine/steps/__tests__/duration-utils.test.ts +0 -20
  1621. package/src/engine/steps/_duration-utils.ts +0 -35
  1622. package/src/engine/steps/_event-match.ts +0 -98
  1623. package/src/engine/steps/_no-return-guard.ts +0 -21
  1624. package/src/engine/steps/_read-source.ts +0 -12
  1625. package/src/engine/steps/_resolver-utils.ts +0 -42
  1626. package/src/engine/steps/_step-dispatch-constants.ts +0 -38
  1627. package/src/engine/steps/aggregate-append-event.ts +0 -56
  1628. package/src/engine/steps/aggregate-create.ts +0 -56
  1629. package/src/engine/steps/aggregate-update.ts +0 -68
  1630. package/src/engine/steps/branch.ts +0 -84
  1631. package/src/engine/steps/call-feature.ts +0 -49
  1632. package/src/engine/steps/compute.ts +0 -41
  1633. package/src/engine/steps/describe-workflow-step-error.ts +0 -6
  1634. package/src/engine/steps/for-each.ts +0 -111
  1635. package/src/engine/steps/mail-send.ts +0 -48
  1636. package/src/engine/steps/read-find-many.ts +0 -57
  1637. package/src/engine/steps/read-find-one.ts +0 -59
  1638. package/src/engine/steps/retry.ts +0 -99
  1639. package/src/engine/steps/return.ts +0 -35
  1640. package/src/engine/steps/unsafe-projection-delete.ts +0 -50
  1641. package/src/engine/steps/unsafe-projection-upsert.ts +0 -88
  1642. package/src/engine/steps/wait-for-event.ts +0 -90
  1643. package/src/engine/steps/wait.ts +0 -69
  1644. package/src/engine/steps/webhook-send.ts +0 -63
  1645. package/src/engine/system-user.ts +0 -38
  1646. package/src/engine/tier-resolver-extension.ts +0 -107
  1647. package/src/engine/types/config.ts +0 -2
  1648. package/src/engine/types/define-handler.ts +0 -2
  1649. package/src/engine/types/entity-handlers.ts +0 -2
  1650. package/src/engine/types/feature.ts +0 -2
  1651. package/src/engine/types/fields.ts +0 -2
  1652. package/src/engine/types/handlers.ts +0 -3
  1653. package/src/engine/types/hooks.ts +0 -2
  1654. package/src/engine/types/index.ts +0 -393
  1655. package/src/engine/types/nav.ts +0 -2
  1656. package/src/engine/types/ownership.ts +0 -2
  1657. package/src/engine/types/projection.ts +0 -2
  1658. package/src/engine/types/screen.ts +0 -3
  1659. package/src/engine/types/step.ts +0 -2
  1660. package/src/engine/types/workspace.ts +0 -2
  1661. package/src/engine/validate-projection-allowlist.ts +0 -191
  1662. package/src/engine/validation.ts +0 -33
  1663. package/src/engine/where-rule-lint.ts +0 -196
  1664. package/src/engine/write-handler-qn-extract.ts +0 -47
  1665. package/src/entrypoint/__tests__/entrypoint-attach-dispatcher.integration.test.ts +0 -140
  1666. package/src/entrypoint/__tests__/entrypoint-job-wiring.integration.test.ts +0 -292
  1667. package/src/entrypoint/__tests__/split-deploy.integration.test.ts +0 -467
  1668. package/src/entrypoint/index.ts +0 -541
  1669. package/src/env/__tests__/compose-env-schema.test.ts +0 -410
  1670. package/src/env/__tests__/dry-run.test.ts +0 -161
  1671. package/src/env/__tests__/parse-env-dry-run.test.ts +0 -40
  1672. package/src/env/_zod-introspect.ts +0 -51
  1673. package/src/env/dry-run.ts +0 -204
  1674. package/src/env/index.ts +0 -435
  1675. package/src/errors/__tests__/classes.test.ts +0 -442
  1676. package/src/errors/__tests__/error-helpers.test.ts +0 -58
  1677. package/src/errors/__tests__/reason-i18n.test.ts +0 -46
  1678. package/src/errors/__tests__/write-failures.test.ts +0 -167
  1679. package/src/errors/classes.ts +0 -311
  1680. package/src/errors/field-issue.ts +0 -8
  1681. package/src/errors/i18n/de.yaml +0 -244
  1682. package/src/errors/i18n/en.yaml +0 -234
  1683. package/src/errors/index.ts +0 -47
  1684. package/src/errors/kumiko-error.ts +0 -67
  1685. package/src/errors/member-resolution.ts +0 -12
  1686. package/src/errors/reasons.ts +0 -102
  1687. package/src/errors/serialize.ts +0 -136
  1688. package/src/errors/to-kumiko-error.ts +0 -8
  1689. package/src/errors/transition-details.ts +0 -30
  1690. package/src/errors/write-error-info.ts +0 -124
  1691. package/src/errors/zod-bridge.ts +0 -62
  1692. package/src/es-ops/README.md +0 -179
  1693. package/src/es-ops/__tests__/context.integration.test.ts +0 -378
  1694. package/src/es-ops/__tests__/runner.integration.test.ts +0 -483
  1695. package/src/es-ops/__tests__/runner.test.ts +0 -202
  1696. package/src/es-ops/context.ts +0 -98
  1697. package/src/es-ops/index.ts +0 -34
  1698. package/src/es-ops/operations-schema.ts +0 -57
  1699. package/src/es-ops/runner.ts +0 -253
  1700. package/src/es-ops/types.ts +0 -124
  1701. package/src/event-store/__tests__/admin-api.integration.test.ts +0 -412
  1702. package/src/event-store/__tests__/backfill-pii.integration.test.ts +0 -880
  1703. package/src/event-store/__tests__/event-attribution.integration.test.ts +0 -236
  1704. package/src/event-store/__tests__/event-store.integration.test.ts +0 -932
  1705. package/src/event-store/__tests__/get-stream-version-perf.integration.test.ts +0 -87
  1706. package/src/event-store/__tests__/perf.integration.test.ts +0 -283
  1707. package/src/event-store/__tests__/provenance-append.integration.test.ts +0 -140
  1708. package/src/event-store/__tests__/row-to-stored-event.test.ts +0 -68
  1709. package/src/event-store/__tests__/snapshot.integration.test.ts +0 -328
  1710. package/src/event-store/__tests__/transfer.integration.test.ts +0 -236
  1711. package/src/event-store/__tests__/unscoped-stream-primitives.guard.test.ts +0 -62
  1712. package/src/event-store/__tests__/upcaster-dead-letter.integration.test.ts +0 -202
  1713. package/src/event-store/__tests__/upcaster.integration.test.ts +0 -491
  1714. package/src/event-store/admin-api.ts +0 -241
  1715. package/src/event-store/archive.ts +0 -83
  1716. package/src/event-store/errors.ts +0 -58
  1717. package/src/event-store/event-store.ts +0 -449
  1718. package/src/event-store/events-schema.ts +0 -89
  1719. package/src/event-store/index.ts +0 -76
  1720. package/src/event-store/provenance-append.ts +0 -67
  1721. package/src/event-store/rebuild-dead-letter.ts +0 -111
  1722. package/src/event-store/row-to-stored-event.ts +0 -34
  1723. package/src/event-store/snapshot.ts +0 -235
  1724. package/src/event-store/transfer.ts +0 -84
  1725. package/src/event-store/types.ts +0 -2
  1726. package/src/event-store/upcaster-dead-letter.ts +0 -120
  1727. package/src/event-store/upcaster.ts +0 -147
  1728. package/src/files/__tests__/build-storage-key.test.ts +0 -28
  1729. package/src/files/__tests__/content-disposition.test.ts +0 -123
  1730. package/src/files/__tests__/file-field-pipeline.integration.test.ts +0 -229
  1731. package/src/files/__tests__/file-handle.test.ts +0 -175
  1732. package/src/files/__tests__/file-ref-entity.test.ts +0 -42
  1733. package/src/files/__tests__/files.integration.test.ts +0 -1749
  1734. package/src/files/__tests__/in-memory-provider.contract.test.ts +0 -4
  1735. package/src/files/__tests__/in-memory-provider.test.ts +0 -94
  1736. package/src/files/__tests__/local-provider.contract.test.ts +0 -14
  1737. package/src/files/__tests__/local-provider.test.ts +0 -31
  1738. package/src/files/__tests__/provider-resolver.test.ts +0 -70
  1739. package/src/files/__tests__/read-stream.test.ts +0 -105
  1740. package/src/files/__tests__/storage-tracking.integration.test.ts +0 -238
  1741. package/src/files/__tests__/storage-tracking.test.ts +0 -46
  1742. package/src/files/__tests__/write-stream.test.ts +0 -250
  1743. package/src/files/__tests__/zip-stream.test.ts +0 -357
  1744. package/src/files/content-disposition.ts +0 -55
  1745. package/src/files/feature.ts +0 -44
  1746. package/src/files/file-handle.ts +0 -83
  1747. package/src/files/file-ref-entity.ts +0 -33
  1748. package/src/files/file-ref-table.ts +0 -13
  1749. package/src/files/file-routes.ts +0 -579
  1750. package/src/files/in-memory-provider.ts +0 -113
  1751. package/src/files/index.ts +0 -57
  1752. package/src/files/local-provider.ts +0 -132
  1753. package/src/files/provider-resolver.ts +0 -176
  1754. package/src/files/storage-tracking.ts +0 -245
  1755. package/src/files/types.ts +0 -336
  1756. package/src/files/zip-stream.ts +0 -251
  1757. package/src/http/index.ts +0 -10
  1758. package/src/i18n/__tests__/i18n.test.ts +0 -113
  1759. package/src/i18n/__tests__/mail-registry.test.ts +0 -54
  1760. package/src/i18n/__tests__/request-locale.test.ts +0 -19
  1761. package/src/i18n/__tests__/required-surface-keys.test.ts +0 -17
  1762. package/src/i18n/index.ts +0 -51
  1763. package/src/i18n/mail-registry.ts +0 -42
  1764. package/src/i18n/request-locale.ts +0 -72
  1765. package/src/i18n/required-surface-keys.ts +0 -451
  1766. package/src/i18n/settings-hub-keys.ts +0 -31
  1767. package/src/jobs/__tests__/job-attempt-context.integration.test.ts +0 -76
  1768. package/src/jobs/__tests__/job-backoff.integration.test.ts +0 -147
  1769. package/src/jobs/__tests__/job-event-trigger.integration.test.ts +0 -175
  1770. package/src/jobs/__tests__/job-last-success.integration.test.ts +0 -135
  1771. package/src/jobs/__tests__/job-multi-trigger.integration.test.ts +0 -147
  1772. package/src/jobs/__tests__/job-public-intake-origin.integration.test.ts +0 -536
  1773. package/src/jobs/__tests__/job-queue-depth.integration.test.ts +0 -82
  1774. package/src/jobs/__tests__/job-retention.integration.test.ts +0 -316
  1775. package/src/jobs/__tests__/job-retry-enqueue-paths.integration.test.ts +0 -309
  1776. package/src/jobs/__tests__/job-runner-boot-timeout.test.ts +0 -55
  1777. package/src/jobs/__tests__/job-systemdb.integration.test.ts +0 -153
  1778. package/src/jobs/__tests__/job-tenant-db.integration.test.ts +0 -162
  1779. package/src/jobs/__tests__/job-write-as.integration.test.ts +0 -251
  1780. package/src/jobs/__tests__/jobs.integration.test.ts +0 -1563
  1781. package/src/jobs/__tests__/scheduler-id.test.ts +0 -30
  1782. package/src/jobs/index.ts +0 -8
  1783. package/src/jobs/job-runner.ts +0 -1390
  1784. package/src/lifecycle/__tests__/create-test-lifecycle.ts +0 -19
  1785. package/src/lifecycle/__tests__/lifecycle-server.integration.test.ts +0 -108
  1786. package/src/lifecycle/__tests__/lifecycle.test.ts +0 -212
  1787. package/src/lifecycle/__tests__/signal-handlers.test.ts +0 -98
  1788. package/src/lifecycle/index.ts +0 -13
  1789. package/src/lifecycle/lifecycle.ts +0 -157
  1790. package/src/lifecycle/signal-handlers.ts +0 -64
  1791. package/src/logging/__tests__/fallback-logger.test.ts +0 -90
  1792. package/src/logging/__tests__/pino-trace-bridge.test.ts +0 -50
  1793. package/src/logging/index.ts +0 -4
  1794. package/src/logging/pino-logger.ts +0 -68
  1795. package/src/logging/utils.ts +0 -50
  1796. package/src/migrations/__tests__/kumiko-drift.integration.test.ts +0 -238
  1797. package/src/migrations/__tests__/kumiko-drift.report.test.ts +0 -105
  1798. package/src/migrations/__tests__/pending-rebuilds.integration.test.ts +0 -370
  1799. package/src/migrations/index.ts +0 -25
  1800. package/src/migrations/kumiko-drift.ts +0 -187
  1801. package/src/migrations/pending-rebuilds.ts +0 -225
  1802. package/src/migrations/projection-table-index.ts +0 -23
  1803. package/src/observability/__tests__/console-provider.test.ts +0 -67
  1804. package/src/observability/__tests__/escape-hatch-report.test.ts +0 -149
  1805. package/src/observability/__tests__/metric-validator.test.ts +0 -95
  1806. package/src/observability/__tests__/metrics-handle.test.ts +0 -30
  1807. package/src/observability/__tests__/metrics-wiring.test.ts +0 -61
  1808. package/src/observability/__tests__/noop-provider.test.ts +0 -82
  1809. package/src/observability/__tests__/observability.integration.test.ts +0 -639
  1810. package/src/observability/__tests__/prometheus-meter.test.ts +0 -144
  1811. package/src/observability/__tests__/recording-meter.test.ts +0 -101
  1812. package/src/observability/__tests__/recording-tracer.test.ts +0 -112
  1813. package/src/observability/__tests__/sensitive-filter.test.ts +0 -98
  1814. package/src/observability/console-provider.ts +0 -130
  1815. package/src/observability/context.ts +0 -26
  1816. package/src/observability/escape-hatch-report.ts +0 -129
  1817. package/src/observability/fallback.ts +0 -34
  1818. package/src/observability/ids.ts +0 -25
  1819. package/src/observability/index.ts +0 -88
  1820. package/src/observability/metric-validator.ts +0 -98
  1821. package/src/observability/metrics-handle.ts +0 -105
  1822. package/src/observability/metrics-wiring.ts +0 -32
  1823. package/src/observability/noop-provider.ts +0 -137
  1824. package/src/observability/prometheus-meter.ts +0 -286
  1825. package/src/observability/recording-meter.ts +0 -156
  1826. package/src/observability/recording-tracer.ts +0 -186
  1827. package/src/observability/redis-wrapper.ts +0 -132
  1828. package/src/observability/sensitive-filter.ts +0 -108
  1829. package/src/observability/standard-metrics.ts +0 -295
  1830. package/src/pipeline/__tests__/archive-stream.integration.test.ts +0 -299
  1831. package/src/pipeline/__tests__/auth-claims-resolver.test.ts +0 -279
  1832. package/src/pipeline/__tests__/blind-index-rebuild-guard.integration.test.ts +0 -94
  1833. package/src/pipeline/__tests__/cascade-handler.integration.test.ts +0 -435
  1834. package/src/pipeline/__tests__/cascade-handler.test.ts +0 -67
  1835. package/src/pipeline/__tests__/causation-chain.integration.test.ts +0 -207
  1836. package/src/pipeline/__tests__/ctx-bridge.integration.test.ts +0 -507
  1837. package/src/pipeline/__tests__/ctx-systemdb.integration.test.ts +0 -120
  1838. package/src/pipeline/__tests__/dispatcher-utils.test.ts +0 -132
  1839. package/src/pipeline/__tests__/dispatcher.test.ts +0 -1091
  1840. package/src/pipeline/__tests__/distributed-lock.integration.test.ts +0 -110
  1841. package/src/pipeline/__tests__/domain-events-projections.integration.test.ts +0 -323
  1842. package/src/pipeline/__tests__/escape-hatch-audit.integration.test.ts +0 -254
  1843. package/src/pipeline/__tests__/escape-hatch.integration.test.ts +0 -90
  1844. package/src/pipeline/__tests__/event-consumer-state.integration.test.ts +0 -81
  1845. package/src/pipeline/__tests__/event-dedup.integration.test.ts +0 -153
  1846. package/src/pipeline/__tests__/event-define-event-strict.integration.test.ts +0 -196
  1847. package/src/pipeline/__tests__/event-dispatcher-batch-delivery.test.ts +0 -178
  1848. package/src/pipeline/__tests__/event-dispatcher-batch-handler.integration.test.ts +0 -143
  1849. package/src/pipeline/__tests__/event-dispatcher-commit-order.integration.test.ts +0 -278
  1850. package/src/pipeline/__tests__/event-dispatcher-db-outage.integration.test.ts +0 -224
  1851. package/src/pipeline/__tests__/event-dispatcher-delivery-max-attempts.test.ts +0 -127
  1852. package/src/pipeline/__tests__/event-dispatcher-idle.integration.test.ts +0 -94
  1853. package/src/pipeline/__tests__/event-dispatcher-lifecycle.integration.test.ts +0 -209
  1854. package/src/pipeline/__tests__/event-dispatcher-multi-instance.integration.test.ts +0 -424
  1855. package/src/pipeline/__tests__/event-dispatcher-pass-failure.integration.test.ts +0 -266
  1856. package/src/pipeline/__tests__/event-dispatcher-per-consumer-turns.integration.test.ts +0 -126
  1857. package/src/pipeline/__tests__/event-dispatcher-pg-listen.integration.test.ts +0 -106
  1858. package/src/pipeline/__tests__/event-dispatcher-rearm.integration.test.ts +0 -263
  1859. package/src/pipeline/__tests__/event-dispatcher-recovery.integration.test.ts +0 -202
  1860. package/src/pipeline/__tests__/event-dispatcher-second-audit.integration.test.ts +0 -282
  1861. package/src/pipeline/__tests__/event-dispatcher-start-from.integration.test.ts +0 -276
  1862. package/src/pipeline/__tests__/event-dispatcher-strict.test.ts +0 -67
  1863. package/src/pipeline/__tests__/event-dispatcher.integration.test.ts +0 -290
  1864. package/src/pipeline/__tests__/event-retention.integration.test.ts +0 -242
  1865. package/src/pipeline/__tests__/fetch-for-writing.integration.test.ts +0 -364
  1866. package/src/pipeline/__tests__/hook-systemdb-escape-hatch.integration.test.ts +0 -246
  1867. package/src/pipeline/__tests__/idempotency-transient-failure.integration.test.ts +0 -198
  1868. package/src/pipeline/__tests__/instruction-field-gate.integration.test.ts +0 -213
  1869. package/src/pipeline/__tests__/irreversible-operation-gate.integration.test.ts +0 -249
  1870. package/src/pipeline/__tests__/job-trigger-consumer.integration.test.ts +0 -235
  1871. package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +0 -800
  1872. package/src/pipeline/__tests__/load-aggregate-query.integration.test.ts +0 -281
  1873. package/src/pipeline/__tests__/member-resolution-read-only.test.ts +0 -79
  1874. package/src/pipeline/__tests__/msp-error-mode.integration.test.ts +0 -149
  1875. package/src/pipeline/__tests__/msp-multi-hop.integration.test.ts +0 -231
  1876. package/src/pipeline/__tests__/msp-rebuild.integration.test.ts +0 -510
  1877. package/src/pipeline/__tests__/multi-stream-projection.integration.test.ts +0 -313
  1878. package/src/pipeline/__tests__/pending-gap-ranges.test.ts +0 -94
  1879. package/src/pipeline/__tests__/perf-rebuild.integration.test.ts +0 -147
  1880. package/src/pipeline/__tests__/post-query-hook.integration.test.ts +0 -165
  1881. package/src/pipeline/__tests__/projection-rebuild.integration.test.ts +0 -1033
  1882. package/src/pipeline/__tests__/projections-runner-systemscope.integration.test.ts +0 -101
  1883. package/src/pipeline/__tests__/public-intake-runtime-gate.integration.test.ts +0 -684
  1884. package/src/pipeline/__tests__/query-projection.integration.test.ts +0 -357
  1885. package/src/pipeline/__tests__/rate-limit-default.integration.test.ts +0 -118
  1886. package/src/pipeline/__tests__/rate-limit-default.test.ts +0 -117
  1887. package/src/pipeline/__tests__/rebuild-poison-quarantine.integration.test.ts +0 -275
  1888. package/src/pipeline/__tests__/redis-keys.test.ts +0 -12
  1889. package/src/pipeline/__tests__/redis-pipeline.integration.test.ts +0 -490
  1890. package/src/pipeline/__tests__/search-consumer-named-events.integration.test.ts +0 -274
  1891. package/src/pipeline/__tests__/system-identity-switch.integration.test.ts +0 -583
  1892. package/src/pipeline/__tests__/system-identity-switch.test.ts +0 -645
  1893. package/src/pipeline/__tests__/tenant-timezone-cache.test.ts +0 -89
  1894. package/src/pipeline/__tests__/try-append-event.integration.test.ts +0 -168
  1895. package/src/pipeline/__tests__/unsafe-raw-escape-hatch.integration.test.ts +0 -103
  1896. package/src/pipeline/active-membership.ts +0 -190
  1897. package/src/pipeline/append-event-core.ts +0 -117
  1898. package/src/pipeline/auth-claims-resolver.ts +0 -103
  1899. package/src/pipeline/cascade-handler.ts +0 -109
  1900. package/src/pipeline/dispatch-batch.ts +0 -269
  1901. package/src/pipeline/dispatch-query.ts +0 -195
  1902. package/src/pipeline/dispatch-shared.ts +0 -1242
  1903. package/src/pipeline/dispatch-stream.ts +0 -129
  1904. package/src/pipeline/dispatch-write.ts +0 -599
  1905. package/src/pipeline/dispatcher-utils.ts +0 -199
  1906. package/src/pipeline/dispatcher.ts +0 -278
  1907. package/src/pipeline/distributed-lock.ts +0 -66
  1908. package/src/pipeline/entity-cache.ts +0 -82
  1909. package/src/pipeline/event-consumer-state.ts +0 -190
  1910. package/src/pipeline/event-dedup.ts +0 -23
  1911. package/src/pipeline/event-dispatcher-admin.ts +0 -320
  1912. package/src/pipeline/event-dispatcher-delivery.ts +0 -499
  1913. package/src/pipeline/event-dispatcher.ts +0 -817
  1914. package/src/pipeline/event-retention.ts +0 -144
  1915. package/src/pipeline/idempotency.ts +0 -158
  1916. package/src/pipeline/index.ts +0 -83
  1917. package/src/pipeline/irreversible-operation-gate.ts +0 -76
  1918. package/src/pipeline/lifecycle-pipeline.ts +0 -421
  1919. package/src/pipeline/member-read-only-transaction.ts +0 -71
  1920. package/src/pipeline/member-reader.ts +0 -110
  1921. package/src/pipeline/msp-rebuild.ts +0 -306
  1922. package/src/pipeline/multi-stream-apply-context.ts +0 -85
  1923. package/src/pipeline/pending-gap-ranges.ts +0 -120
  1924. package/src/pipeline/projection-rebuild.ts +0 -539
  1925. package/src/pipeline/projection-state.ts +0 -60
  1926. package/src/pipeline/projections-runner.ts +0 -66
  1927. package/src/pipeline/redis-keys.ts +0 -11
  1928. package/src/pipeline/system-hooks.ts +0 -695
  1929. package/src/pipeline/system-identity-switch.ts +0 -401
  1930. package/src/pipeline/tenant-timezone-cache.ts +0 -92
  1931. package/src/pipeline/write-origin.ts +0 -128
  1932. package/src/random/__tests__/generate.test.ts +0 -149
  1933. package/src/random/__tests__/words.test.ts +0 -44
  1934. package/src/random/generate.ts +0 -141
  1935. package/src/random/index.ts +0 -8
  1936. package/src/random/words.ts +0 -393
  1937. package/src/rate-limit/__tests__/dispatcher-l3.integration.test.ts +0 -111
  1938. package/src/rate-limit/__tests__/middleware.integration.test.ts +0 -246
  1939. package/src/rate-limit/__tests__/resolver.integration.test.ts +0 -211
  1940. package/src/rate-limit/bucket.ts +0 -36
  1941. package/src/rate-limit/index.ts +0 -14
  1942. package/src/rate-limit/middleware.ts +0 -179
  1943. package/src/rate-limit/resolver.ts +0 -251
  1944. package/src/redis/__tests__/redis-options.test.ts +0 -54
  1945. package/src/redis/client.ts +0 -77
  1946. package/src/redis/index.ts +0 -4
  1947. package/src/redis/pubsub-signal.ts +0 -107
  1948. package/src/schema-cli.ts +0 -510
  1949. package/src/search/__tests__/derive-search-adapter-config.test.ts +0 -65
  1950. package/src/search/__tests__/meilisearch-adapter.integration.test.ts +0 -348
  1951. package/src/search/__tests__/meilisearch-ids.test.ts +0 -30
  1952. package/src/search/__tests__/reindex-entity.integration.test.ts +0 -243
  1953. package/src/search/__tests__/search-adapter.test.ts +0 -256
  1954. package/src/search/__tests__/search-consumer-batch.integration.test.ts +0 -306
  1955. package/src/search/__tests__/search-pii-derived-index.integration.test.ts +0 -208
  1956. package/src/search/derive-search-adapter-config.ts +0 -27
  1957. package/src/search/in-memory-adapter.ts +0 -123
  1958. package/src/search/index.ts +0 -20
  1959. package/src/search/meilisearch-adapter.ts +0 -189
  1960. package/src/search/purge-subject.ts +0 -253
  1961. package/src/search/reindex-entity.ts +0 -190
  1962. package/src/secrets/__tests__/contains-secret.test.ts +0 -108
  1963. package/src/secrets/__tests__/dek-cache.test.ts +0 -211
  1964. package/src/secrets/__tests__/derive-purpose-secret.test.ts +0 -52
  1965. package/src/secrets/__tests__/env-master-key-provider.test.ts +0 -119
  1966. package/src/secrets/__tests__/envelope-cipher.test.ts +0 -59
  1967. package/src/secrets/__tests__/envelope.test.ts +0 -74
  1968. package/src/secrets/__tests__/leak-guard.test.ts +0 -104
  1969. package/src/secrets/__tests__/rotation.test.ts +0 -149
  1970. package/src/secrets/dek-cache.ts +0 -137
  1971. package/src/secrets/derive-purpose-secret.ts +0 -17
  1972. package/src/secrets/env-master-key-provider.ts +0 -162
  1973. package/src/secrets/envelope-cipher.ts +0 -53
  1974. package/src/secrets/envelope.ts +0 -57
  1975. package/src/secrets/index.ts +0 -33
  1976. package/src/secrets/leak-guard.ts +0 -87
  1977. package/src/secrets/rotation.ts +0 -34
  1978. package/src/secrets/stored-envelope.ts +0 -46
  1979. package/src/seeding/__tests__/entity-seed.test.ts +0 -70
  1980. package/src/seeding/entity-seed.ts +0 -31
  1981. package/src/seeding/index.ts +0 -6
  1982. package/src/seeding/types.ts +0 -8
  1983. package/src/stack/__tests__/drain-event-consumers.integration.test.ts +0 -166
  1984. package/src/stack/__tests__/drain-jobs.integration.test.ts +0 -159
  1985. package/src/stack/__tests__/event-collector.test.ts +0 -42
  1986. package/src/stack/__tests__/ownership-boot-guard.integration.test.ts +0 -108
  1987. package/src/stack/__tests__/push-entity-projection-tables-column-sync.integration.test.ts +0 -107
  1988. package/src/stack/__tests__/request-helper.integration.test.ts +0 -140
  1989. package/src/stack/__tests__/request-helper.test.ts +0 -159
  1990. package/src/stack/__tests__/setup-test-stack-entity-tables.integration.test.ts +0 -65
  1991. package/src/stack/__tests__/setup-test-stack-jobs.integration.test.ts +0 -185
  1992. package/src/stack/__tests__/setup-test-stack-metrics.integration.test.ts +0 -79
  1993. package/src/stack/db.ts +0 -82
  1994. package/src/stack/drain-event-consumers.ts +0 -74
  1995. package/src/stack/drain-jobs.ts +0 -129
  1996. package/src/stack/event-collector.ts +0 -23
  1997. package/src/stack/index.ts +0 -34
  1998. package/src/stack/push-entity-projection-tables.ts +0 -95
  1999. package/src/stack/redis.ts +0 -55
  2000. package/src/stack/request-helper.ts +0 -298
  2001. package/src/stack/table-helpers.ts +0 -175
  2002. package/src/stack/test-stack.ts +0 -596
  2003. package/src/stack/test-users.ts +0 -37
  2004. package/src/testing/__tests__/db-cleanup.test.ts +0 -40
  2005. package/src/testing/__tests__/e2e-generator.test.ts +0 -349
  2006. package/src/testing/__tests__/ensure-entity-table.integration.test.ts +0 -52
  2007. package/src/testing/__tests__/late-bound.test.ts +0 -32
  2008. package/src/testing/__tests__/multipart-helper.test.ts +0 -49
  2009. package/src/testing/__tests__/real-providers.test.ts +0 -62
  2010. package/src/testing/__tests__/wait-for.test.ts +0 -104
  2011. package/src/testing/access-assertions.ts +0 -15
  2012. package/src/testing/assertions.ts +0 -35
  2013. package/src/testing/boot-validator-fixture.ts +0 -124
  2014. package/src/testing/closed-connection-error.ts +0 -62
  2015. package/src/testing/db-cleanup.ts +0 -45
  2016. package/src/testing/e2e-generator.ts +0 -494
  2017. package/src/testing/expect-error.ts +0 -25
  2018. package/src/testing/file-provider-contract.ts +0 -123
  2019. package/src/testing/handler-context.ts +0 -143
  2020. package/src/testing/http-cookies.ts +0 -52
  2021. package/src/testing/index.ts +0 -60
  2022. package/src/testing/late-bound.ts +0 -41
  2023. package/src/testing/multipart-helper.ts +0 -94
  2024. package/src/testing/mutable-master-key-provider.ts +0 -57
  2025. package/src/testing/observability-recorder.ts +0 -54
  2026. package/src/testing/real-providers.ts +0 -30
  2027. package/src/testing/seed.ts +0 -50
  2028. package/src/testing/shared-entities.ts +0 -65
  2029. package/src/testing/utils.ts +0 -1
  2030. package/src/testing/wait-for.ts +0 -49
  2031. package/src/testing/without-ambient-temporal.ts +0 -14
  2032. package/src/time/__tests__/boot-tz-warning.test.ts +0 -46
  2033. package/src/time/__tests__/geo-tz.test.ts +0 -71
  2034. package/src/time/__tests__/iana.test.ts +0 -35
  2035. package/src/time/__tests__/polyfill-reinstall.test.ts +0 -17
  2036. package/src/time/__tests__/polyfill.test.ts +0 -73
  2037. package/src/time/__tests__/tz-context.test.ts +0 -121
  2038. package/src/time/__tests__/tz-dateline.test.ts +0 -34
  2039. package/src/time/boot-tz-warning.ts +0 -30
  2040. package/src/time/iana.ts +0 -19
  2041. package/src/time/index.ts +0 -23
  2042. package/src/time/legacy-date.ts +0 -18
  2043. package/src/time/polyfill.ts +0 -59
  2044. package/src/time/tz-context.ts +0 -100
  2045. package/src/ui-types/__tests__/plural.test.ts +0 -108
  2046. package/src/ui-types/app-schema.ts +0 -91
  2047. package/src/ui-types/formality.ts +0 -7
  2048. package/src/ui-types/index.ts +0 -158
  2049. package/src/ui-types/list-row-meta.ts +0 -87
  2050. package/src/ui-types/plural.ts +0 -69
  2051. package/src/upgrade-cli.ts +0 -651
  2052. package/src/utils/__tests__/assert.test.ts +0 -17
  2053. package/src/utils/__tests__/case.test.ts +0 -16
  2054. package/src/utils/__tests__/compare.test.ts +0 -20
  2055. package/src/utils/__tests__/env-parse.test.ts +0 -54
  2056. package/src/utils/__tests__/ids.test.ts +0 -52
  2057. package/src/utils/__tests__/is-plain-object.test.ts +0 -16
  2058. package/src/utils/__tests__/parse-string-array-json.test.ts +0 -16
  2059. package/src/utils/__tests__/safe-json-temporal.test.ts +0 -28
  2060. package/src/utils/__tests__/safe-json.test.ts +0 -22
  2061. package/src/utils/__tests__/serialization.test.ts +0 -30
  2062. package/src/utils/assert.ts +0 -18
  2063. package/src/utils/case.ts +0 -6
  2064. package/src/utils/compare.ts +0 -10
  2065. package/src/utils/env-parse.ts +0 -16
  2066. package/src/utils/ids.ts +0 -26
  2067. package/src/utils/index.ts +0 -9
  2068. package/src/utils/is-plain-object.ts +0 -4
  2069. package/src/utils/parse-string-array-json.ts +0 -14
  2070. package/src/utils/safe-json.ts +0 -50
  2071. package/src/utils/serialization.ts +0 -14
  2072. /package/{src/engine/types/event-type-map.ts → dist/engine/types/event-type-map.d.ts} +0 -0
  2073. /package/{src/engine/types/extension-options-map.ts → dist/engine/types/extension-options-map.d.ts} +0 -0
  2074. /package/{src/engine/types/http-route.ts → dist/engine/types/http-route.d.ts} +0 -0
  2075. /package/{src/engine/types/identifiers.ts → dist/engine/types/identifiers.d.ts} +0 -0
  2076. /package/{src/engine/types/relations.ts → dist/engine/types/relations.d.ts} +0 -0
  2077. /package/{src/engine/types/target-ref.ts → dist/engine/types/target-ref.d.ts} +0 -0
  2078. /package/{src/engine/types/tree-node.ts → dist/engine/types/tree-node.d.ts} +0 -0
  2079. /package/{src/logging/types.ts → dist/logging/types.d.ts} +0 -0
  2080. /package/{src/observability/types/index.ts → dist/observability/types/index.d.ts} +0 -0
  2081. /package/{src/observability/types/metric.ts → dist/observability/types/metric.d.ts} +0 -0
  2082. /package/{src/observability/types/provider.ts → dist/observability/types/provider.d.ts} +0 -0
  2083. /package/{src/observability/types/span.ts → dist/observability/types/span.d.ts} +0 -0
  2084. /package/{src/search/types.ts → dist/search/types.d.ts} +0 -0
  2085. /package/{src/secrets/types.ts → dist/secrets/types.js} +0 -0
  2086. /package/{src/time/geo-tz.ts → dist/time/geo-tz.d.ts} +0 -0
@@ -1,1563 +0,0 @@
1
- import { afterAll, beforeAll, describe, expect, test } from "bun:test";
2
- import { Queue } from "bullmq";
3
- import { Redis } from "ioredis";
4
- import * as z from "zod";
5
- import { requestContext } from "../../api/request-context";
6
- import { tenantDbRunner } from "../../db/tenant-db-runner";
7
- import { createRegistry, defineFeature } from "../../engine";
8
- import type {
9
- AppContext,
10
- ConfigAccessor,
11
- ConfigAccessorFactory,
12
- NotifyFactory,
13
- Registry,
14
- TenantId,
15
- } from "../../engine/types";
16
- import { createInMemoryFileProvider } from "../../files/in-memory-provider";
17
- import { RedisKeys } from "../../pipeline/redis-keys";
18
- import { createTestRedis, type TestRedis, TestUsers } from "../../stack";
19
- import { sleep, waitFor } from "../../testing";
20
- import {
21
- bootJobIdForJobName,
22
- createJobRunner,
23
- type JobLogEntry,
24
- type JobMeta,
25
- type JobRunner,
26
- type JobRunnerOptions,
27
- } from "../job-runner";
28
-
29
- // --- Shared state ---
30
-
31
- let testRedis: TestRedis;
32
- let redisUrl: string;
33
-
34
- // Track which jobs ran and when
35
- const jobLog: Array<{ name: string; payload: Record<string, unknown>; timestamp: number }> = [];
36
-
37
- // Counts eventRetrySucceeds' own attempts — throws once on attempt 1, then
38
- // succeeds, so a real retry must have happened for the job to ever reach 2.
39
- let eventRetryAttemptCount = 0;
40
-
41
- function clearLog() {
42
- jobLog.length = 0;
43
- }
44
-
45
- // --- Feature with test jobs ---
46
-
47
- const testFeature = defineFeature("test", (r) => {
48
- // Scenario 1: Boot job
49
- r.job("bootSync", { trigger: { manual: true }, runOnBoot: true }, async (payload) => {
50
- jobLog.push({ name: "test:job:boot-sync", payload, timestamp: Date.now() });
51
- });
52
-
53
- // Scenario 2: Scheduled job (cron every second for testing)
54
- r.job("scheduled", { trigger: { cron: "* * * * * *" } }, async (payload) => {
55
- jobLog.push({ name: "test:job:scheduled", payload, timestamp: Date.now() });
56
- });
57
-
58
- // Scenario 3: Manual trigger
59
- r.job("manualReport", { trigger: { manual: true } }, async (payload) => {
60
- jobLog.push({ name: "test:job:manual-report", payload, timestamp: Date.now() });
61
- });
62
-
63
- // Concurrency: skip — if running, skip new
64
- r.job("skipJob", { trigger: { manual: true }, concurrency: "skip" }, async (payload) => {
65
- jobLog.push({ name: "test:job:skip-job", payload, timestamp: Date.now() });
66
- await sleep(500); // Simulate long-running job
67
- });
68
-
69
- // Concurrency: parallel — multiple can run
70
- r.job("parallelJob", { trigger: { manual: true }, concurrency: "parallel" }, async (payload) => {
71
- jobLog.push({ name: "test:job:parallel-job", payload, timestamp: Date.now() });
72
- });
73
-
74
- // Concurrency: replace — cancel old, start new
75
- r.job("replaceJob", { trigger: { manual: true }, concurrency: "replace" }, async (payload) => {
76
- jobLog.push({ name: "test:job:replace-job", payload, timestamp: Date.now() });
77
- await sleep(200);
78
- });
79
-
80
- // Concurrency: debounce — wait until quiet, then run once
81
- r.job(
82
- "debounceJob",
83
- { trigger: { manual: true }, concurrency: "debounce", debounceMs: 300 },
84
- async (payload) => {
85
- jobLog.push({ name: "test:job:debounce-job", payload, timestamp: Date.now() });
86
- },
87
- );
88
-
89
- // Concurrency: sequential — same-name dispatches must serialise via the
90
- // per-name Redis SETNX-lock. Sleep duration sets the gap the assertions
91
- // measure: parallel mode lands all entries within ~50ms; sequential
92
- // spaces them by ≥sleep-duration each. If you tweak the sleep here,
93
- // bump the timestamp deltas in the assertion to match.
94
- r.job(
95
- "sequentialJob",
96
- { trigger: { manual: true }, concurrency: "sequential" },
97
- async (payload) => {
98
- jobLog.push({ name: "test:job:sequential-job", payload, timestamp: Date.now() });
99
- await sleep(300);
100
- },
101
- );
102
-
103
- // Sequential variant that throws. Used to assert the lock is released in
104
- // the finally-path (next dispatch must still acquire it). retries=0 so
105
- // the failure doesn't replay and pollute the log.
106
- r.job(
107
- "sequentialFailJob",
108
- { trigger: { manual: true }, concurrency: "sequential", retries: 0 },
109
- async (payload) => {
110
- jobLog.push({ name: "test:job:sequential-fail-job", payload, timestamp: Date.now() });
111
- throw new Error("sequential boom");
112
- },
113
- );
114
-
115
- // maxPerTenant: cap concurrent + waiting jobs per tenant. Long sleep so
116
- // the dispatcher checks ALL queued counts (including waiting ones).
117
- r.job(
118
- "perTenantLimited",
119
- { trigger: { manual: true }, concurrency: "parallel", maxPerTenant: 2 },
120
- async (payload) => {
121
- jobLog.push({ name: "test:job:per-tenant-limited", payload, timestamp: Date.now() });
122
- await sleep(500);
123
- },
124
- );
125
- r.writeHandler(
126
- "capped-event",
127
- z.object({ n: z.number() }),
128
- async (event) => ({ isSuccess: true, data: { n: event.payload.n } }),
129
- { access: { openToAll: { reason: "test handler callable by any signed-in test user" } } },
130
- );
131
- // Event-triggered twin — exercises handleEvent's maxPerTenant guard
132
- // (dispatch and handleEvent share isOverPerTenantLimit).
133
- r.job(
134
- "perTenantLimitedEvent",
135
- {
136
- trigger: { on: "test:write:capped-event" },
137
- concurrency: "parallel",
138
- maxPerTenant: 2,
139
- },
140
- async (payload) => {
141
- jobLog.push({
142
- name: "test:job:per-tenant-limited-event",
143
- payload,
144
- timestamp: Date.now(),
145
- });
146
- await sleep(500);
147
- },
148
- );
149
-
150
- r.writeHandler(
151
- "retry-event-trigger",
152
- z.object({ n: z.number() }),
153
- async (event) => ({ isSuccess: true, data: { n: event.payload.n } }),
154
- { access: { openToAll: { reason: "test handler callable by any signed-in test user" } } },
155
- );
156
- // Event-triggered job with retries — proves handleEvent passes
157
- // retries/backoff to the queue the same way dispatch() does (fw
158
- // job-runner retries regression, solon).
159
- r.job(
160
- "eventRetrySucceeds",
161
- { trigger: { on: "test:write:retry-event-trigger" }, retries: 2 },
162
- async (payload) => {
163
- eventRetryAttemptCount += 1;
164
- jobLog.push({ name: "test:job:event-retry-succeeds", payload, timestamp: Date.now() });
165
- if (eventRetryAttemptCount === 1) throw new Error("fails on first attempt");
166
- },
167
- );
168
-
169
- // Job that fails
170
- r.job("failingJob", { trigger: { manual: true }, retries: 1 }, async () => {
171
- throw new Error("intentional failure");
172
- });
173
-
174
- // perTenant fan-out — used to assert missing getActiveTenantIds fails
175
- // the wrapper job without killing the worker.
176
- r.job("perTenantFanout", { trigger: { manual: true }, perTenant: true }, async (payload) => {
177
- jobLog.push({ name: "test:job:per-tenant-fanout", payload, timestamp: Date.now() });
178
- });
179
-
180
- // Correlation propagation probe — records the requestContext it sees at
181
- // handler-time so tests can assert the scheduling request's correlationId
182
- // made it through BullMQ into the worker process.
183
- r.job("correlationProbe", { trigger: { manual: true } }, async (payload) => {
184
- const seen = requestContext.get();
185
- jobLog.push({
186
- name: "test:job:correlation-probe",
187
- payload: {
188
- ...payload,
189
- observedCorrelationId: seen?.correlationId ?? null,
190
- observedRequestId: seen?.requestId ?? null,
191
- },
192
- timestamp: Date.now(),
193
- });
194
- });
195
- // Exercises createJobLogger (info/warn/error/debug/child) — otherwise those
196
- // one-liners stay uncovered even though every job builds a logger.
197
- r.job("logProbe", { trigger: { manual: true } }, async (payload, ctx) => {
198
- expect(ctx.log).toBeDefined();
199
- const log = ctx.log!;
200
- log.info("log-probe-info", { n: payload["n"] });
201
- log.warn("log-probe-warn");
202
- log.error("log-probe-error", { ok: false });
203
- log.debug("log-probe-debug");
204
- log.child({ probe: true }).info("log-probe-child");
205
- jobLog.push({ name: "test:job:log-probe", payload, timestamp: Date.now() });
206
- });
207
- // job-runner must build ctx.files the same way dispatch-shared.ts does for
208
- // write-handlers/MSPs — regression guard for #1520 (ctx.files was never
209
- // materialized for jobs, so ctx.files.ref(...).read() threw for every job).
210
- r.job("filesProbe", { trigger: { manual: true } }, async (payload, ctx) => {
211
- const content = await ctx.files!.ref(payload["key"] as string).read();
212
- jobLog.push({
213
- name: "test:job:files-probe",
214
- payload: { text: new TextDecoder().decode(content) },
215
- timestamp: Date.now(),
216
- });
217
- });
218
-
219
- // job-runner must build ctx.notify/ctx.config the same way dispatch-shared.ts
220
- // does for write-handlers — regression guard for #1532 (only ctx.files got
221
- // the same fix; ctx.notify/ctx.config stayed undefined for every job).
222
- r.job("notifyProbe", { trigger: { manual: true } }, async (payload, ctx) => {
223
- await ctx.notify!("test-notification", { to: payload["toUserId"] as string });
224
- jobLog.push({ name: "test:job:notify-probe", payload, timestamp: Date.now() });
225
- });
226
-
227
- r.job("configProbe", { trigger: { manual: true } }, async (_payload, ctx) => {
228
- const value = await ctx.config!("test:config:probe-key");
229
- jobLog.push({ name: "test:job:config-probe", payload: { value }, timestamp: Date.now() });
230
- });
231
-
232
- // ctx.write/queryAs throw until JobRunner.attachDispatcher() has run —
233
- // regression guard for framework#2043. No test runner here ever calls
234
- // attachDispatcher(), so this always hits the stub.
235
- r.job("writeProbe", { trigger: { manual: true }, retries: 0 }, async (_payload, ctx) => {
236
- await ctx.write("test:write:probe", {});
237
- });
238
- });
239
-
240
- beforeAll(async () => {
241
- testRedis = await createTestRedis();
242
- redisUrl = `redis://${testRedis.redis.options.host}:${testRedis.redis.options.port}/${testRedis.redis.options.db}`;
243
- });
244
-
245
- afterAll(async () => {
246
- await testRedis.cleanup();
247
- });
248
-
249
- // Helper to create a runner, run tests, then stop
250
- async function withRunner(
251
- fn: (runner: JobRunner, registry: Registry) => Promise<void>,
252
- opts?: Partial<JobRunnerOptions>,
253
- ): Promise<void> {
254
- const registry = createRegistry([testFeature]);
255
- const context: AppContext = {};
256
- // Date.now() alone collided when two tests ran in the same millisecond;
257
- // adding a random suffix keeps queue names unique across the whole run.
258
- const queueNamePrefix = `kumiko-test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
259
- const runner = createJobRunner({
260
- registry,
261
- context,
262
- redisUrl,
263
- consumerLane: "worker",
264
- queueNamePrefix,
265
- ...opts,
266
- });
267
-
268
- try {
269
- await runner.start();
270
- await fn(runner, registry);
271
- } finally {
272
- await runner.stop();
273
- // Purge any lingering scheduler/repeat keys the worker-lane queue left
274
- // behind. BullMQ stores them under <queueName>:* — orphaned schedulers
275
- // from a previous test run would otherwise fire into a now-stopped
276
- // worker. Only the worker lane is queried because these tests run jobs
277
- // with the default runIn, which resolves to "worker".
278
- const keys = await testRedis.redis.keys(`bull:${queueNamePrefix}-worker:*`);
279
- if (keys.length > 0) await testRedis.redis.del(...keys);
280
- }
281
- }
282
-
283
- // --- Scenario 1: Boot job runs on startup ---
284
-
285
- describe("scenario 1: boot job", () => {
286
- test("runOnBoot job executes when runner starts", async () => {
287
- clearLog();
288
- await withRunner(async () => {
289
- await waitFor(() => {
290
- const bootEntries = jobLog.filter((e) => e.name === "test:job:boot-sync");
291
- expect(bootEntries.length).toBeGreaterThanOrEqual(1);
292
- });
293
- });
294
- });
295
- });
296
-
297
- // --- Scenario 2: Scheduled (cron) job ---
298
-
299
- describe("scenario 2: scheduled job", () => {
300
- test("cron job is registered in registry", () => {
301
- const registry = createRegistry([testFeature]);
302
- const job = registry.getJob("test:job:scheduled");
303
- expect(job).toBeDefined();
304
- if (job && "cron" in job.trigger) {
305
- expect(job.trigger.cron).toBe("* * * * * *");
306
- } else {
307
- expect.unreachable("Expected cron trigger");
308
- }
309
- });
310
-
311
- // BullMQ's repeatable scheduler needs a second or two to register its
312
- // first tick — a generous delay schedule covers the startup window.
313
- test("cron job fires via BullMQ scheduler", async () => {
314
- clearLog();
315
- await withRunner(async () => {
316
- await waitFor(
317
- () => {
318
- const entries = jobLog.filter((e) => e.name === "test:job:scheduled");
319
- expect(entries.length).toBeGreaterThanOrEqual(1);
320
- },
321
- { delays: [2000, 3000, 5000] },
322
- );
323
- });
324
- });
325
- });
326
-
327
- // --- Scenario 3: Manual trigger ---
328
-
329
- describe("scenario 3: manual trigger", () => {
330
- test("dispatch runs the job with payload", async () => {
331
- clearLog();
332
- await withRunner(async (runner) => {
333
- await runner.dispatch("test:job:manual-report", { reportId: 42 });
334
- await waitFor(() => {
335
- const entries = jobLog.filter((e) => e.name === "test:job:manual-report");
336
- expect(entries.length).toBe(1);
337
- expect(entries[0]?.payload).toEqual({ reportId: 42 });
338
- });
339
- });
340
- });
341
-
342
- test("dispatch unknown job throws", async () => {
343
- await withRunner(async (runner) => {
344
- await expect(runner.dispatch("nonexistent:job:missing")).rejects.toThrow("Unknown job");
345
- });
346
- });
347
- });
348
-
349
- describe("scenario 3b: ctx.files resolves through the file provider", () => {
350
- test("job handler can read back a file via ctx.files.ref(key)", async () => {
351
- clearLog();
352
- const provider = createInMemoryFileProvider();
353
- await provider.write("probe/hello.txt", new TextEncoder().encode("hello from files probe"));
354
-
355
- await withRunner(
356
- async (runner) => {
357
- await runner.dispatch("test:job:files-probe", { key: "probe/hello.txt" });
358
- await waitFor(() => {
359
- const entries = jobLog.filter((e) => e.name === "test:job:files-probe");
360
- expect(entries.length).toBe(1);
361
- expect(entries[0]?.payload["text"]).toBe("hello from files probe");
362
- });
363
- },
364
- { context: { _fileProviderResolver: () => Promise.resolve(provider) } },
365
- );
366
- });
367
- });
368
-
369
- describe("scenario 3c: ctx.notify resolves through the notify factory (#1532)", () => {
370
- test("job handler can call ctx.notify and the factory is bound to the job's system user + tenant", async () => {
371
- clearLog();
372
- const calls: Array<{ readonly notifierTenantId: string; readonly notificationType: string }> =
373
- [];
374
- const notifyFactory: NotifyFactory = (_user, tenantId) => async (notificationType) => {
375
- calls.push({ notifierTenantId: tenantId, notificationType });
376
- };
377
-
378
- await withRunner(
379
- async (runner) => {
380
- await runner.dispatch("test:job:notify-probe", { toUserId: "u1" });
381
- await waitFor(() => {
382
- const entries = jobLog.filter((e) => e.name === "test:job:notify-probe");
383
- expect(entries.length).toBe(1);
384
- });
385
- expect(calls).toHaveLength(1);
386
- expect(calls[0]?.notificationType).toBe("test-notification");
387
- },
388
- { context: { _notifyFactory: notifyFactory } },
389
- );
390
- });
391
- });
392
-
393
- describe("scenario 3d: ctx.config resolves through the config accessor factory (#1532)", () => {
394
- test("job handler can call ctx.config and the factory receives a tenant-scoped db", async () => {
395
- clearLog();
396
- let receivedDb: unknown;
397
- const configAccessorFactory: ConfigAccessorFactory = (deps) => {
398
- receivedDb = deps.db;
399
- // Stub accessor: only the string-key overload is exercised here.
400
- return (async () => "probe-value") as ConfigAccessor;
401
- };
402
-
403
- await withRunner(
404
- async (runner) => {
405
- await runner.dispatch("test:job:config-probe", {});
406
- await waitFor(() => {
407
- const entries = jobLog.filter((e) => e.name === "test:job:config-probe");
408
- expect(entries.length).toBe(1);
409
- expect(entries[0]?.payload["value"]).toBe("probe-value");
410
- });
411
- expect(receivedDb).toBeDefined();
412
- },
413
- { context: { _configAccessorFactory: configAccessorFactory, db: {} as AppContext["db"] } },
414
- );
415
- });
416
- });
417
-
418
- // --- Concurrency modes ---
419
-
420
- describe("concurrency: parallel", () => {
421
- test("multiple parallel jobs all run", async () => {
422
- clearLog();
423
- await withRunner(async (runner) => {
424
- await runner.dispatch("test:job:parallel-job", { n: 1 });
425
- await runner.dispatch("test:job:parallel-job", { n: 2 });
426
- await runner.dispatch("test:job:parallel-job", { n: 3 });
427
- await waitFor(() => {
428
- const entries = jobLog.filter((e) => e.name === "test:job:parallel-job");
429
- expect(entries.length).toBe(3);
430
- });
431
- });
432
- });
433
- });
434
-
435
- describe("concurrency: skip", () => {
436
- test("skip mode prevents duplicate execution", async () => {
437
- clearLog();
438
- await withRunner(async (runner) => {
439
- // First job takes 500ms
440
- await runner.dispatch("test:job:skip-job", { n: 1 });
441
-
442
- // Try dispatching multiple times while first is running
443
- let skippedCount = 0;
444
- // @timeout-exception: #3118 paces repeated dispatch attempts, nothing to poll for
445
- for (let i = 0; i < 5; i++) {
446
- await sleep(50);
447
- const id = await runner.dispatch("test:job:skip-job", { n: i + 2 });
448
- if (id === "skipped") skippedCount++;
449
- }
450
-
451
- // Wait until the first (running) job finishes so its log entry lands.
452
- // Skip-mode guarantees max one job at a time, so we only ever need to
453
- // see a single entry to know the run settled.
454
- await waitFor(() => {
455
- const entries = jobLog.filter((e) => e.name === "test:job:skip-job");
456
- expect(entries.length).toBeGreaterThanOrEqual(1);
457
- });
458
-
459
- // At least some should have been skipped
460
- expect(skippedCount).toBeGreaterThan(0);
461
- // Should not have run all 6 times
462
- const entries = jobLog.filter((e) => e.name === "test:job:skip-job");
463
- expect(entries.length).toBeLessThan(6);
464
- });
465
- });
466
- });
467
-
468
- describe("concurrency: sequential", () => {
469
- test("same-name dispatches run strictly one after the other", async () => {
470
- clearLog();
471
- await withRunner(async (runner) => {
472
- // Three rapid dispatches. Parallel mode would land all entries
473
- // within a single poll cycle (~50ms apart). The SETNX lock in the
474
- // job-runner forces them to wait — each picks up only after the
475
- // previous releases its lock at the end of its 300ms sleep.
476
- await runner.dispatch("test:job:sequential-job", { n: 1 });
477
- await runner.dispatch("test:job:sequential-job", { n: 2 });
478
- await runner.dispatch("test:job:sequential-job", { n: 3 });
479
-
480
- // Generous polling — re-enqueue with delay 200ms means the third
481
- // job needs at least ~600ms total to land. Worst case allows for
482
- // some BullMQ poll overhead.
483
- await waitFor(
484
- () => {
485
- const entries = jobLog.filter((e) => e.name === "test:job:sequential-job");
486
- expect(entries.length).toBe(3);
487
- },
488
- { delays: [400, 800, 1500, 3000] },
489
- );
490
-
491
- const entries = jobLog
492
- .filter((e) => e.name === "test:job:sequential-job")
493
- .sort((a, b) => a.timestamp - b.timestamp);
494
- // Each entry must start at least ~250ms after the previous —
495
- // sleep is 300ms, with slack for poll overhead. If sequential
496
- // breaks (lock never acquired, group ignored), the deltas
497
- // collapse to single-digit milliseconds.
498
- const delta12 = (entries[1]?.timestamp ?? 0) - (entries[0]?.timestamp ?? 0);
499
- const delta23 = (entries[2]?.timestamp ?? 0) - (entries[1]?.timestamp ?? 0);
500
- expect(delta12).toBeGreaterThanOrEqual(250);
501
- expect(delta23).toBeGreaterThanOrEqual(250);
502
-
503
- // NOT dispatch order: "sequential" is mutual exclusion, not a FIFO
504
- // queue. A re-enqueued lock loser goes to the back of its
505
- // queue, so it can still win the next race. What's guaranteed, and
506
- // already asserted above via delta12/delta23, is that runs never
507
- // overlap. Assert the complete set instead of a specific order.
508
- expect(entries.map((e) => e.payload)).toEqual(
509
- expect.arrayContaining([{ n: 1 }, { n: 2 }, { n: 3 }]),
510
- );
511
- });
512
- });
513
-
514
- test("runners with distinct queueNamePrefix do not share the sequential lock", async () => {
515
- clearLog();
516
- // Regression guard: the lock key used to omit queueNamePrefix, so two
517
- // isolated runners sharing a Redis collided on the same lock.
518
- const prefixA = `kumiko-test-lockscope-a-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
519
- const prefixB = `kumiko-test-lockscope-b-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
520
- const runnerA = createJobRunner({
521
- registry: createRegistry([testFeature]),
522
- context: {},
523
- redisUrl,
524
- consumerLane: "worker",
525
- queueNamePrefix: prefixA,
526
- });
527
- const runnerB = createJobRunner({
528
- registry: createRegistry([testFeature]),
529
- context: {},
530
- redisUrl,
531
- consumerLane: "worker",
532
- queueNamePrefix: prefixB,
533
- });
534
- // Own client, no keyPrefix — testRedis.redis auto-prefixes SET/DEL and
535
- // would write a different key than the runner's own lock connection.
536
- const lockKeyA = `${RedisKeys.lock}seq:${prefixA}:worker:test:job:sequential-job`;
537
- const rawRedis = new Redis(redisUrl);
538
- rawRedis.on("error", () => {});
539
- const queueA = new Queue(`${prefixA}-worker`, {
540
- connection: { host: testRedis.redis.options.host, port: testRedis.redis.options.port },
541
- });
542
- // A post-close 'error' here is otherwise unhandled and bun:test
543
- // attributes it to whichever test runs next (fw#1805).
544
- queueA.on("error", () => {});
545
-
546
- try {
547
- await rawRedis.set(lockKeyA, "held-by-test", "EX", 30, "NX");
548
-
549
- await runnerA.start();
550
- await runnerB.start();
551
-
552
- await runnerA.dispatch("test:job:sequential-job", { n: 100 });
553
-
554
- // A's handler returns successfully on a lock loss (re-enqueue, not a
555
- // throw) — BullMQ records the dropped attempt as completed even
556
- // though the job body never ran. Filtered by name+payload so unrelated
557
- // boot/cron jobs on the same worker queue don't false-positive this.
558
- await waitFor(
559
- async () => {
560
- const completed = await queueA.getCompleted();
561
- const lostAttempts = completed.filter(
562
- (job) => job.name === "test:job:sequential-job" && job.data.n === 100,
563
- );
564
- expect(lostAttempts.length).toBeGreaterThanOrEqual(1);
565
- },
566
- { delays: [400, 800, 1500, 3000] },
567
- );
568
- expect(
569
- jobLog.some((e) => e.name === "test:job:sequential-job" && e.payload["n"] === 100),
570
- ).toBe(false);
571
-
572
- // B shares no lock scope with the externally held A-key, so it must
573
- // run despite A being blocked.
574
- await runnerB.dispatch("test:job:sequential-job", { n: 200 });
575
- await waitFor(
576
- () => {
577
- const entries = jobLog.filter(
578
- (e) => e.name === "test:job:sequential-job" && e.payload["n"] === 200,
579
- );
580
- expect(entries.length).toBeGreaterThanOrEqual(1);
581
- },
582
- { delays: [400, 800, 1500, 3000] },
583
- );
584
-
585
- // Releasing the externally held key unblocks A's own dispatch.
586
- await rawRedis.del(lockKeyA);
587
- await waitFor(
588
- () => {
589
- const entries = jobLog.filter(
590
- (e) => e.name === "test:job:sequential-job" && e.payload["n"] === 100,
591
- );
592
- expect(entries.length).toBeGreaterThanOrEqual(1);
593
- },
594
- { delays: [400, 800, 1500, 3000] },
595
- );
596
- } finally {
597
- await runnerA.stop();
598
- await runnerB.stop();
599
- await queueA.close();
600
- await rawRedis.del(lockKeyA);
601
- rawRedis.disconnect();
602
- const keysA = await testRedis.redis.keys(`bull:${prefixA}-worker:*`);
603
- if (keysA.length > 0) await testRedis.redis.del(...keysA);
604
- const keysB = await testRedis.redis.keys(`bull:${prefixB}-worker:*`);
605
- if (keysB.length > 0) await testRedis.redis.del(...keysB);
606
- }
607
- });
608
-
609
- test("lock is released even when the handler throws", async () => {
610
- clearLog();
611
- await withRunner(async (runner) => {
612
- // First dispatch fails. If the finally-path didn't release the lock,
613
- // the second dispatch couldn't acquire it and would loop forever in
614
- // the re-enqueue path until BullMQ gave up.
615
- await runner.dispatch("test:job:sequential-fail-job", { n: 1 });
616
- await waitFor(
617
- () => {
618
- const entries = jobLog.filter((e) => e.name === "test:job:sequential-fail-job");
619
- expect(entries.length).toBeGreaterThanOrEqual(1);
620
- },
621
- { delays: [200, 400, 800] },
622
- );
623
- // Tiny grace so BullMQ marks the failed job done and our finally
624
- // ran — otherwise the lock-release race could outlast the next
625
- // dispatch's acquire attempt.
626
- await sleep(150);
627
-
628
- // No surviving lock for this job-name in Redis — the value-matched
629
- // DEL ran in finally.
630
- const surviving = await testRedis.redis.keys("kumiko:lock:seq:*sequential-fail-job");
631
- expect(surviving.length).toBe(0);
632
-
633
- // Fresh dispatch must run — proves the lock isn't blocking new
634
- // arrivals after the throw.
635
- await runner.dispatch("test:job:sequential-fail-job", { n: 2 });
636
- await waitFor(
637
- () => {
638
- const entries = jobLog.filter((e) => e.name === "test:job:sequential-fail-job");
639
- expect(entries.length).toBeGreaterThanOrEqual(2);
640
- },
641
- { delays: [200, 400, 800] },
642
- );
643
- });
644
- });
645
-
646
- test("lock release is value-matched: foreign tokens survive expiration races", async () => {
647
- // Pin the contract that distributed-lock's release script enforces:
648
- // a release call from a worker whose token has already expired and
649
- // been claimed by someone else must NOT delete the new owner's lock.
650
- // Tested at the lock layer because we can't reliably race a TTL
651
- // expiration inside the job-runner inside a 5s test budget.
652
- const { createDistributedLock } = await import("../../pipeline/distributed-lock");
653
- const prefix = "kumiko:lock:seq:test-vmd:";
654
- const lock = createDistributedLock(testRedis.redis, prefix);
655
-
656
- const tokenA = await lock.acquire("contract-key", { ttlSeconds: 10 });
657
- expect(tokenA).not.toBeNull();
658
- // Forcibly take it away — simulates the TTL-expired-and-reclaimed
659
- // sequence without waiting 10s.
660
- await testRedis.redis.set(`${prefix}contract-key`, "different-token");
661
-
662
- // Worker A (now stale) tries to release: must be a no-op.
663
- const releasedByStale = await lock.release("contract-key", tokenA as string);
664
- expect(releasedByStale).toBe(false);
665
- const stillHeld = await testRedis.redis.get(`${prefix}contract-key`);
666
- expect(stillHeld).toBe("different-token");
667
-
668
- await testRedis.redis.del(`${prefix}contract-key`);
669
- });
670
- });
671
-
672
- describe("concurrency: debounce", () => {
673
- test("rapid dispatches result in fewer executions than dispatches", async () => {
674
- clearLog();
675
- await withRunner(async (runner) => {
676
- // Rapid fire 5 times — debounce should collapse some
677
- await runner.dispatch("test:job:debounce-job", { n: 1 });
678
- await runner.dispatch("test:job:debounce-job", { n: 2 });
679
- await runner.dispatch("test:job:debounce-job", { n: 3 });
680
- await runner.dispatch("test:job:debounce-job", { n: 4 });
681
- await runner.dispatch("test:job:debounce-job", { n: 5 });
682
-
683
- // Debounce (300ms) fires after the last rapid dispatch, then BullMQ
684
- // picks the job up — first successful poll usually lands around 500ms.
685
- await waitFor(
686
- () => {
687
- const entries = jobLog.filter((e) => e.name === "test:job:debounce-job");
688
- expect(entries.length).toBeGreaterThanOrEqual(1);
689
- },
690
- { delays: [500, 1000, 2000] },
691
- );
692
-
693
- const entries = jobLog.filter((e) => e.name === "test:job:debounce-job");
694
- // Debounce should result in fewer executions than dispatches
695
- expect(entries.length).toBeLessThan(5);
696
- expect(entries.length).toBeGreaterThanOrEqual(1);
697
- });
698
- });
699
- });
700
-
701
- describe("concurrency: replace", () => {
702
- test("enqueuer-only: each dispatch removes prior waiting peers", async () => {
703
- // No consumer → jobs stay waiting. The replace branch walks getWaiting()
704
- // and removes same-name peers before add — so three dispatches leave one.
705
- const queueNamePrefix = `kumiko-test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
706
- await withRunner(
707
- async (runner) => {
708
- const id1 = await runner.dispatch("test:job:replace-job", { n: 1 });
709
- const id2 = await runner.dispatch("test:job:replace-job", { n: 2 });
710
- const id3 = await runner.dispatch("test:job:replace-job", { n: 3 });
711
- expect(id1).toBeDefined();
712
- expect(id2).toBeDefined();
713
- expect(id3).toBeDefined();
714
- expect(id1).not.toBe("skipped");
715
- expect(id3).not.toBe(id1);
716
-
717
- const queue = new Queue(`${queueNamePrefix}-worker`, {
718
- connection: { host: testRedis.redis.options.host, port: testRedis.redis.options.port },
719
- });
720
- // A post-close 'error' here is otherwise unhandled and bun:test
721
- // attributes it to whichever test runs next (fw#1805).
722
- queue.on("error", () => {});
723
- try {
724
- const waiting = (await queue.getWaiting()).filter(
725
- (job) => job.name === "test:job:replace-job",
726
- );
727
- expect(waiting).toHaveLength(1);
728
- expect(waiting[0]?.data.n).toBe(3);
729
- } finally {
730
- await queue.close();
731
- }
732
- },
733
- { consumerLane: undefined, queueNamePrefix },
734
- );
735
- });
736
- });
737
-
738
- describe("concurrency: maxPerTenant", () => {
739
- test("max=2: third dispatch for same tenant returns skipped, other tenant unaffected", async () => {
740
- clearLog();
741
- await withRunner(async (runner) => {
742
- const tenantA = "tenant-a";
743
- const tenantB = "tenant-b";
744
-
745
- // First two for tenantA fill the bucket — both should accept.
746
- const idA1 = await runner.dispatch("test:job:per-tenant-limited", {
747
- n: 1,
748
- _tenantId: tenantA,
749
- });
750
- const idA2 = await runner.dispatch("test:job:per-tenant-limited", {
751
- n: 2,
752
- _tenantId: tenantA,
753
- });
754
- expect(idA1).not.toBe("skipped:max-per-tenant");
755
- expect(idA2).not.toBe("skipped:max-per-tenant");
756
-
757
- // Third for tenantA hits the cap before BullMQ drains the first.
758
- // Small sleep so we don't race the queue.add of the first two.
759
- await sleep(50);
760
- const idA3 = await runner.dispatch("test:job:per-tenant-limited", {
761
- n: 3,
762
- _tenantId: tenantA,
763
- });
764
- expect(idA3).toBe("skipped:max-per-tenant");
765
-
766
- // tenantB has its own bucket — accepted.
767
- const idB1 = await runner.dispatch("test:job:per-tenant-limited", {
768
- n: 4,
769
- _tenantId: tenantB,
770
- });
771
- expect(idB1).not.toBe("skipped:max-per-tenant");
772
-
773
- // After the 500ms-handlers settle the bucket empties. jobLog.push runs
774
- // at handler START, so a log entry doesn't mean the job is "done" —
775
- // it's still in `active` for the rest of the sleep. Wait long enough
776
- // that the slowest 500ms handler has returned, then a fresh tenantA
777
- // dispatch lands again.
778
- await sleep(900);
779
- const idA4 = await runner.dispatch("test:job:per-tenant-limited", {
780
- n: 5,
781
- _tenantId: tenantA,
782
- });
783
- expect(idA4).not.toBe("skipped:max-per-tenant");
784
- });
785
- });
786
-
787
- test("missing _tenantId disables the guard (backwards-compatible)", async () => {
788
- clearLog();
789
- await withRunner(async (runner) => {
790
- // No _tenantId in payload — guard inactive, all 4 accepted regardless of cap.
791
- for (let i = 0; i < 4; i++) {
792
- const id = await runner.dispatch("test:job:per-tenant-limited", { n: i });
793
- expect(id).not.toBe("skipped:max-per-tenant");
794
- }
795
- });
796
- });
797
- });
798
-
799
- // --- Correlation propagation ---
800
-
801
- describe("job logger", () => {
802
- test("handler can call info/warn/error/debug/child without throw", async () => {
803
- clearLog();
804
- await withRunner(async (runner) => {
805
- await runner.dispatch("test:job:log-probe", { n: 1 });
806
- await waitFor(() => {
807
- expect(jobLog.some((e) => e.name === "test:job:log-probe")).toBe(true);
808
- });
809
- });
810
- });
811
-
812
- // Inspects the actual createJobLogger output instead of only asserting the
813
- // handler ran — a child() that drops its context or a warn() mapped to
814
- // debug would previously stay green.
815
- test("info/warn/error land with the right level; debug is dropped; child merges its context", async () => {
816
- clearLog();
817
- let capturedLogs: JobLogEntry[] = [];
818
- await withRunner(
819
- async (runner) => {
820
- await runner.dispatch("test:job:log-probe", { n: 1 });
821
- await waitFor(() => {
822
- expect(capturedLogs.length).toBeGreaterThan(0);
823
- });
824
- },
825
- {
826
- onJobComplete: (jobName, _id, _duration, logs) => {
827
- if (jobName === "test:job:log-probe") capturedLogs = logs;
828
- },
829
- },
830
- );
831
-
832
- // debug() is a no-op by design (JobLogEntry.level has no "debug" slot) —
833
- // info/warn/error from the handler body, plus one from child().info(...).
834
- expect(capturedLogs).toHaveLength(4);
835
- expect(capturedLogs.map((l) => l.level)).toEqual(["info", "warn", "error", "info"]);
836
- expect(capturedLogs[0]?.message).toContain("log-probe-info");
837
- expect(capturedLogs[3]?.message).toContain("log-probe-child");
838
- expect(capturedLogs[3]?.message).toContain("probe");
839
- expect(capturedLogs[3]?.message).toContain("true");
840
- });
841
- });
842
-
843
- describe("correlation propagation", () => {
844
- test("dispatch inside requestContext.run passes correlationId into the job", async () => {
845
- clearLog();
846
- await withRunner(async (runner) => {
847
- // Enter a synthetic request-context, dispatch → the scheduler should
848
- // pack the correlationId into the job data; the worker reads it back
849
- // and re-enters requestContext.run.
850
- await requestContext.run(
851
- { requestId: "req-outer", correlationId: "carry-me-across-bullmq" },
852
- async () => {
853
- await runner.dispatch("test:job:correlation-probe", { n: 1 });
854
- },
855
- );
856
- await waitFor(() => {
857
- const entries = jobLog.filter((e) => e.name === "test:job:correlation-probe");
858
- expect(entries.length).toBe(1);
859
- });
860
- const entry = jobLog.find((e) => e.name === "test:job:correlation-probe");
861
- expect(entry?.payload["observedCorrelationId"]).toBe("carry-me-across-bullmq");
862
- // requestId is fresh per job run, NOT the scheduler's requestId.
863
- expect(entry?.payload["observedRequestId"]).not.toBe("req-outer");
864
- expect(typeof entry?.payload["observedRequestId"]).toBe("string");
865
- });
866
- });
867
-
868
- test("dispatch outside any request-context: job gets a fresh correlationId (not null)", async () => {
869
- clearLog();
870
- await withRunner(async (runner) => {
871
- await runner.dispatch("test:job:correlation-probe", { n: 2 });
872
- await waitFor(() => {
873
- const entries = jobLog.filter((e) => e.name === "test:job:correlation-probe");
874
- expect(entries.length).toBe(1);
875
- });
876
- const entry = jobLog.find((e) => e.name === "test:job:correlation-probe");
877
- // Fresh correlationId — new requestId mirrored onto correlationId
878
- // when no parent-context provided one.
879
- expect(typeof entry?.payload["observedCorrelationId"]).toBe("string");
880
- expect(entry?.payload["observedCorrelationId"]).toBe(entry?.payload["observedRequestId"]);
881
- });
882
- });
883
- });
884
-
885
- // --- Error handling ---
886
-
887
- describe("error handling", () => {
888
- test("failing job is caught, does not crash worker", async () => {
889
- clearLog();
890
- await withRunner(async (runner) => {
891
- const id = await runner.dispatch("test:job:failing-job");
892
- expect(id).toBeDefined();
893
-
894
- // No fixed sleep needed — the follow-up dispatch + waitFor below prove
895
- // the worker is still alive. If the failing job had crashed the worker,
896
- // the manual-report would never land and waitFor would time out.
897
- await runner.dispatch("test:job:manual-report", { after: "failure" });
898
- await waitFor(() => {
899
- const entries = jobLog.filter((e) => e.name === "test:job:manual-report");
900
- expect(entries.length).toBeGreaterThanOrEqual(1);
901
- });
902
- });
903
- });
904
-
905
- test("onJobFailed receives the handler error on each attempt", async () => {
906
- clearLog();
907
- const failures: Array<{ jobName: string; error: string }> = [];
908
- const starts: JobMeta[] = [];
909
- await withRunner(
910
- async (runner) => {
911
- await runner.dispatch("test:job:failing-job");
912
- // retries: 1 → attempts = 2 (initial + one retry)
913
- await waitFor(() => {
914
- expect(failures.length).toBeGreaterThanOrEqual(2);
915
- });
916
- expect(failures.every((f) => f.jobName === "test:job:failing-job")).toBe(true);
917
- expect(failures.every((f) => f.error === "intentional failure")).toBe(true);
918
- expect(starts.map((s) => s.attempt)).toEqual([1, 2]);
919
-
920
- // Worker still alive after exhausted retries
921
- await runner.dispatch("test:job:manual-report", { after: "retries" });
922
- await waitFor(() => {
923
- expect(
924
- jobLog.some(
925
- (e) => e.name === "test:job:manual-report" && e.payload["after"] === "retries",
926
- ),
927
- ).toBe(true);
928
- });
929
- },
930
- {
931
- onJobStart: (name, _id, meta) => {
932
- if (name === "test:job:failing-job") starts.push(meta);
933
- },
934
- onJobFailed: (jobName, _id, error) => {
935
- if (jobName === "test:job:failing-job") failures.push({ jobName, error });
936
- },
937
- },
938
- );
939
- });
940
-
941
- test("ctx.write throws before attachDispatcher() has run (framework#2043)", async () => {
942
- clearLog();
943
- const failures: string[] = [];
944
- await withRunner(
945
- async (runner) => {
946
- await runner.dispatch("test:job:write-probe");
947
- await waitFor(() => {
948
- expect(failures.length).toBeGreaterThanOrEqual(1);
949
- });
950
- expect(failures[0]).toContain(
951
- "JobContext.write called before dispatcher attached — call attachDispatcher() first",
952
- );
953
- },
954
- {
955
- onJobFailed: (jobName, _id, error) => {
956
- if (jobName === "test:job:write-probe") failures.push(error);
957
- },
958
- },
959
- );
960
- });
961
-
962
- test("perTenant without getActiveTenantIds fails wrapper; worker stays alive", async () => {
963
- clearLog();
964
- await withRunner(async (runner) => {
965
- await runner.dispatch("test:job:per-tenant-fanout", { n: 1 });
966
- // Wrapper throws before fan-out (and before onJobFailed) — settle, then
967
- // prove the worker still consumes.
968
- await sleep(300);
969
- expect(jobLog.filter((e) => e.name === "test:job:per-tenant-fanout")).toHaveLength(0);
970
-
971
- await runner.dispatch("test:job:manual-report", { after: "perTenant-miss" });
972
- await waitFor(() => {
973
- expect(jobLog.some((e) => e.name === "test:job:manual-report")).toBe(true);
974
- });
975
- });
976
- });
977
-
978
- test("perTenant with getActiveTenantIds fans out one run per tenant", async () => {
979
- clearLog();
980
- // @cast-boundary test fixture: TenantId is a branded string.
981
- const tenants = ["per-tenant-fanout-a", "per-tenant-fanout-b"] as TenantId[];
982
- await withRunner(
983
- async (runner) => {
984
- await runner.dispatch("test:job:per-tenant-fanout", { n: 7 });
985
- await waitFor(() => {
986
- const runs = jobLog.filter((e) => e.name === "test:job:per-tenant-fanout");
987
- expect(runs.length).toBe(2);
988
- expect(runs.every((e) => e.payload["n"] === 7)).toBe(true);
989
- });
990
- },
991
- { getActiveTenantIds: async () => tenants },
992
- );
993
- });
994
- });
995
-
996
- // --- Multiple runner instances against the same Redis (prod runs N replicas
997
- // of the worker process) — proves the scheduler dedups across instances and
998
- // that per-tenant children distribute across whichever worker picks them up,
999
- // not just the instance that ran the fan-out. Own registries/log per test,
1000
- // not the shared testFeature/jobLog — a per-second cron must not tick
1001
- // during every other test in this file, and the two scenarios below must
1002
- // not observe each other's fan-outs. Job handlers tag their entry with
1003
- // `ctx.db`, which each runner instance sets to a literal string instead of
1004
- // a real DbConnection — a cheap already-typed, already-threaded channel for
1005
- // "which runner instance ran this" (mirrors the `ctx["systemUser"] as
1006
- // SessionUser` cast the multi-tenant.integration.test.ts billing job uses).
1007
- describe("perTenant across multiple runner instances", () => {
1008
- test("a cron tick fires the perTenant wrapper exactly once, not once per runner instance", async () => {
1009
- const log: Array<{ tenantId: string; runnerTag: string }> = [];
1010
- const cronFeature = defineFeature("multicron", (r) => {
1011
- r.job(
1012
- "fanout",
1013
- { trigger: { cron: "* * * * * *" }, perTenant: true },
1014
- async (_payload, ctx) => {
1015
- log.push({
1016
- tenantId: String(ctx.systemUser.tenantId),
1017
- runnerTag: tenantDbRunner(ctx.db) as unknown as string, // @cast-boundary test fixture — runner context db is a tag string
1018
- });
1019
- },
1020
- );
1021
- });
1022
-
1023
- const tenants = ["multi-cron-a", "multi-cron-b"] as TenantId[];
1024
- let wrapperCalls = 0;
1025
- const getActiveTenantIds = async () => {
1026
- wrapperCalls++;
1027
- return tenants;
1028
- };
1029
- const registry = createRegistry([cronFeature]);
1030
- const queueNamePrefix = `kumiko-test-multi-cron-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1031
- const runnerA = createJobRunner({
1032
- registry,
1033
- context: { db: "runner-a" as unknown as AppContext["db"] },
1034
- redisUrl,
1035
- consumerLane: "worker",
1036
- queueNamePrefix,
1037
- getActiveTenantIds,
1038
- });
1039
- const runnerB = createJobRunner({
1040
- registry,
1041
- context: { db: "runner-b" as unknown as AppContext["db"] },
1042
- redisUrl,
1043
- consumerLane: "worker",
1044
- queueNamePrefix,
1045
- getActiveTenantIds,
1046
- });
1047
- // Query BullMQ directly rather than inferring dedup from log ratios —
1048
- // wrapperCalls is incremented by every wrapper run, so a ratio against
1049
- // it stays constant whether the wrapper fired once or twice per tick.
1050
- const rawQueue = new Queue(`${queueNamePrefix}-worker`, {
1051
- connection: { host: testRedis.redis.options.host, port: testRedis.redis.options.port },
1052
- });
1053
- // A post-close 'error' here is otherwise unhandled and bun:test
1054
- // attributes it to whichever test runs next (fw#1805).
1055
- rawQueue.on("error", () => {});
1056
- // Snapshot of completed wrapper runs — declared outside try so the
1057
- // post-finally fan-out check can read it.
1058
- let drainedCalls = 0;
1059
- try {
1060
- // Both instances call start() → both call upsertJobScheduler() with
1061
- // the SAME schedulerId against the SAME Redis. If that didn't dedup,
1062
- // there would be two scheduler entries and two independent repeat
1063
- // timers driving the tick below.
1064
- await runnerA.start();
1065
- await runnerB.start();
1066
- // The actual once-per-tick proof: exactly one scheduler entry exists
1067
- // for this job in Redis, regardless of how many runner instances
1068
- // called upsertJobScheduler() against it. Two entries here means two
1069
- // independent repeat timers, which would double-fire every tick.
1070
- expect(await rawQueue.getJobSchedulersCount()).toBe(1);
1071
- // Wait for the asserted drain state while workers are still up —
1072
- // stop() tears down consumers, so a post-finally sleep/assert races
1073
- // on unprocessed children (fw#2556: expected 4, got 2). Snapshot
1074
- // drainedCalls inside the predicate; do not assert a post-stop
1075
- // log-length ceiling — in-flight children (and sequential multi-
1076
- // runner stop) can still append after the snapshot.
1077
- await waitFor(
1078
- () => {
1079
- expect(wrapperCalls).toBeGreaterThanOrEqual(1);
1080
- expect(log.length).toBe(wrapperCalls * tenants.length);
1081
- drainedCalls = wrapperCalls;
1082
- },
1083
- { delays: [2000, 3000, 5000] },
1084
- );
1085
- } finally {
1086
- await runnerA.stop();
1087
- await runnerB.stop();
1088
- await rawQueue.close();
1089
- }
1090
-
1091
- // Secondary sanity check only — this ratio holds whether the wrapper
1092
- // fired once or twice per tick (wrapperCalls scales with it either
1093
- // way), so it does not by itself prove the once-per-tick invariant.
1094
- // It only confirms each wrapper run that did happen fanned out to
1095
- // every tenant exactly once. Slice to the drained prefix so a late
1096
- // tick that lands during stop() cannot break the multiset check.
1097
- expect(log.length).toBeGreaterThanOrEqual(drainedCalls * tenants.length);
1098
- const seenTenants = log
1099
- .slice(0, drainedCalls * tenants.length)
1100
- .map((e) => e.tenantId)
1101
- .sort();
1102
- const expectedTenants = Array.from({ length: drainedCalls }, () => tenants)
1103
- .flat()
1104
- .sort();
1105
- expect(seenTenants).toEqual(expectedTenants);
1106
- });
1107
-
1108
- test("manual per-tenant fan-out distributes children across both worker instances", async () => {
1109
- const log: Array<{ tenantId: string; runnerTag: string }> = [];
1110
- const manualFeature = defineFeature("multiworker", (r) => {
1111
- r.job("fanout", { trigger: { manual: true }, perTenant: true }, async (_payload, ctx) => {
1112
- // Widen the window both worker instances are actively racing for
1113
- // children in — without it, a fast single worker could drain a
1114
- // small batch before the other instance's blocking queue-pop even
1115
- // wakes up, which would prove nothing either way.
1116
- await sleep(80);
1117
- log.push({
1118
- tenantId: String(ctx.systemUser.tenantId),
1119
- runnerTag: tenantDbRunner(ctx.db) as unknown as string, // @cast-boundary test fixture — runner context db is a tag string
1120
- });
1121
- });
1122
- });
1123
-
1124
- // 12 > a single worker's hardcoded concurrency (5) — with both
1125
- // instances already polling before dispatch, the overflow past one
1126
- // worker's cap can only be served by the other.
1127
- const tenants = Array.from({ length: 12 }, (_, i) => `multi-worker-${i}`) as TenantId[];
1128
- const getActiveTenantIds = async () => tenants;
1129
- const registry = createRegistry([manualFeature]);
1130
- const queueNamePrefix = `kumiko-test-multi-worker-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1131
- const runnerA = createJobRunner({
1132
- registry,
1133
- context: { db: "runner-a" as unknown as AppContext["db"] },
1134
- redisUrl,
1135
- consumerLane: "worker",
1136
- queueNamePrefix,
1137
- getActiveTenantIds,
1138
- });
1139
- const runnerB = createJobRunner({
1140
- registry,
1141
- context: { db: "runner-b" as unknown as AppContext["db"] },
1142
- redisUrl,
1143
- consumerLane: "worker",
1144
- queueNamePrefix,
1145
- getActiveTenantIds,
1146
- });
1147
- try {
1148
- await runnerA.start();
1149
- await runnerB.start();
1150
- await runnerA.dispatch("multiworker:job:fanout");
1151
- await waitFor(
1152
- () => {
1153
- expect(log.length).toBe(tenants.length);
1154
- },
1155
- { delays: [200, 300, 500, 1000] },
1156
- );
1157
- } finally {
1158
- await runnerA.stop();
1159
- await runnerB.stop();
1160
- }
1161
-
1162
- // Every tenant ran exactly once — no duplicate fan-out.
1163
- expect(log.map((e) => e.tenantId).sort()).toEqual([...tenants].sort());
1164
- // Both worker instances actually processed children, not just the one
1165
- // that happened to run the fan-out.
1166
- const tagsUsed = new Set(log.map((e) => e.runnerTag));
1167
- expect(tagsUsed.has("runner-a")).toBe(true);
1168
- expect(tagsUsed.has("runner-b")).toBe(true);
1169
- });
1170
- });
1171
-
1172
- // A perTenant wrapper's own BullMQ job id is reused to derive each child's
1173
- // job id (see perTenantChildJobId in job-runner.ts) — a wrapper that runs
1174
- // twice for the SAME trigger (retry after failure, a Redis drop, an
1175
- // instance restarting mid-run) must not double the fan-out, while two
1176
- // DIFFERENT triggers (e.g. two cron ticks) must each still fan out fully.
1177
- // These are the two failure modes on either side of that invariant.
1178
- describe("perTenant wrapper re-run for the same trigger", () => {
1179
- test("a wrapper that fires twice for the same trigger still enqueues exactly one child per tenant", async () => {
1180
- const log: Array<{ tenantId: string }> = [];
1181
- const dedupFeature = defineFeature("multidedup", (r) => {
1182
- r.job("fanout", { trigger: { manual: true }, perTenant: true }, async (_payload, ctx) => {
1183
- log.push({ tenantId: String(ctx.systemUser.tenantId) });
1184
- });
1185
- });
1186
-
1187
- const tenants = ["dedup-a", "dedup-b", "dedup-c"] as TenantId[];
1188
- const getActiveTenantIds = async () => tenants;
1189
- const registry = createRegistry([dedupFeature]);
1190
- const queueNamePrefix = `kumiko-test-dedup-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1191
- const runner = createJobRunner({
1192
- registry,
1193
- context: {},
1194
- redisUrl,
1195
- consumerLane: "worker",
1196
- queueNamePrefix,
1197
- getActiveTenantIds,
1198
- });
1199
- const rawQueue = new Queue(`${queueNamePrefix}-worker`, {
1200
- connection: { host: testRedis.redis.options.host, port: testRedis.redis.options.port },
1201
- });
1202
- // A post-close 'error' here is otherwise unhandled and bun:test
1203
- // attributes it to whichever test runs next (fw#1805).
1204
- rawQueue.on("error", () => {});
1205
-
1206
- const wrapperJobId = "fixed-wrapper-run";
1207
- try {
1208
- await runner.start();
1209
-
1210
- // First run of the wrapper for this trigger — the real Worker picks
1211
- // it up and fans out one child per tenant.
1212
- await rawQueue.add("_perTenant:multidedup:job:fanout", {}, { jobId: wrapperJobId });
1213
- await waitFor(() => expect(log.length).toBe(tenants.length), {
1214
- delays: [200, 300, 500, 1000],
1215
- });
1216
-
1217
- // Simulate the SAME trigger firing the wrapper a second time. Remove
1218
- // the now-completed wrapper's bookkeeping and re-add a genuinely
1219
- // separate Job with the SAME id, so handleJob() runs again with the
1220
- // identical bullJob.id — the actual "wrapper ran twice" scenario the
1221
- // deterministic child id is meant to cover.
1222
- const completedWrapper = await rawQueue.getJob(wrapperJobId);
1223
- await completedWrapper?.remove();
1224
- await rawQueue.add("_perTenant:multidedup:job:fanout", {}, { jobId: wrapperJobId });
1225
-
1226
- // Give the second run's fan-out a chance to land. It re-derives the
1227
- // SAME child ids as the first run, so BullMQ's existing-jobId add()
1228
- // should return the already-completed children rather than re-run
1229
- // the handler.
1230
- await sleep(500);
1231
- } finally {
1232
- await runner.stop();
1233
- await rawQueue.close();
1234
- }
1235
-
1236
- expect(log.length).toBe(tenants.length);
1237
- expect(log.map((e) => e.tenantId).sort()).toEqual([...tenants].sort());
1238
- });
1239
-
1240
- test("two consecutive cron ticks each still enqueue one child per tenant", async () => {
1241
- const log: Array<{ tenantId: string }> = [];
1242
- const cronFeature = defineFeature("multidedupcron", (r) => {
1243
- r.job(
1244
- "fanout",
1245
- { trigger: { cron: "* * * * * *" }, perTenant: true },
1246
- async (_payload, ctx) => {
1247
- log.push({ tenantId: String(ctx.systemUser.tenantId) });
1248
- },
1249
- );
1250
- });
1251
-
1252
- const tenants = ["dedup-cron-a", "dedup-cron-b"] as TenantId[];
1253
- let wrapperCalls = 0;
1254
- const getActiveTenantIds = async () => {
1255
- wrapperCalls++;
1256
- return tenants;
1257
- };
1258
- const registry = createRegistry([cronFeature]);
1259
- const queueNamePrefix = `kumiko-test-dedup-cron-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1260
- const runner = createJobRunner({
1261
- registry,
1262
- context: {},
1263
- redisUrl,
1264
- consumerLane: "worker",
1265
- queueNamePrefix,
1266
- getActiveTenantIds,
1267
- });
1268
- let drainedCalls = 0;
1269
- try {
1270
- await runner.start();
1271
- // Two distinct ticks get two distinct repeat-job ids (different
1272
- // millis) — each must still produce its own full batch of children;
1273
- // a wrongly cross-tick dedup would collapse the second tick's log
1274
- // entries into the first.
1275
- await waitFor(
1276
- () => {
1277
- expect(wrapperCalls).toBeGreaterThanOrEqual(2);
1278
- expect(log.length).toBe(wrapperCalls * tenants.length);
1279
- drainedCalls = wrapperCalls;
1280
- },
1281
- { delays: [1500, 2000, 3000] },
1282
- );
1283
- } finally {
1284
- await runner.stop();
1285
- }
1286
-
1287
- expect(log.length).toBeGreaterThanOrEqual(drainedCalls * tenants.length);
1288
- const seenTenants = log
1289
- .slice(0, drainedCalls * tenants.length)
1290
- .map((e) => e.tenantId)
1291
- .sort();
1292
- const expectedTenants = Array.from({ length: drainedCalls }, () => tenants)
1293
- .flat()
1294
- .sort();
1295
- expect(seenTenants).toEqual(expectedTenants);
1296
- });
1297
- });
1298
-
1299
- describe("handleEvent maxPerTenant", () => {
1300
- test("skips enqueue when tenant is already at the cap", async () => {
1301
- clearLog();
1302
- await withRunner(async (runner) => {
1303
- const user = { ...TestUsers.admin, tenantId: "cap-tenant-evt" };
1304
- await runner.handleEvent("test:write:capped-event", { n: 1 }, user);
1305
- await runner.handleEvent("test:write:capped-event", { n: 2 }, user);
1306
- await waitFor(() => {
1307
- const started = jobLog.filter((e) => e.name === "test:job:per-tenant-limited-event");
1308
- expect(started.length).toBe(2);
1309
- });
1310
- // Third must be skipped by the maxPerTenant guard. handleEvent's cap
1311
- // check runs synchronously before this call resolves, but a wrongly
1312
- // enqueued job still needs the worker to pick it up and push its
1313
- // jobLog entry — polling several times (failing at the first sign of
1314
- // a 3rd start) is more CI-load-tolerant than a single fixed sleep(200)
1315
- // racing against the handler's own 500ms sleep, which could land
1316
- // outside the window on a starved runner and silently pass.
1317
- await runner.handleEvent("test:write:capped-event", { n: 3 }, user);
1318
- // @timeout-exception: #3118 asserts a negative (stays capped) at each checkpoint
1319
- for (const delayMs of [50, 100, 200, 400]) {
1320
- await sleep(delayMs);
1321
- const startedNow = jobLog.filter((e) => e.name === "test:job:per-tenant-limited-event");
1322
- expect(startedNow.length).toBe(2);
1323
- }
1324
- });
1325
- });
1326
- });
1327
-
1328
- describe("handleEvent retries", () => {
1329
- test("an event-triggered job with retries retries on failure and eventually succeeds", async () => {
1330
- clearLog();
1331
- eventRetryAttemptCount = 0;
1332
- await withRunner(async (runner) => {
1333
- const user = { ...TestUsers.admin, tenantId: "retry-tenant-evt" };
1334
- await runner.handleEvent("test:write:retry-event-trigger", { n: 1 }, user);
1335
- // Without retries/backoff reaching the queue, the job fails on
1336
- // attempt 1 and BullMQ never retries — this would time out.
1337
- await waitFor(() => {
1338
- const entries = jobLog.filter((e) => e.name === "test:job:event-retry-succeeds");
1339
- expect(entries.length).toBe(2);
1340
- });
1341
- });
1342
- expect(eventRetryAttemptCount).toBe(2);
1343
- });
1344
- });
1345
-
1346
- // --- Registry ---
1347
-
1348
- describe("job registry", () => {
1349
- test("getAllJobs returns all registered jobs with feature prefix", () => {
1350
- const registry = createRegistry([testFeature]);
1351
- const jobs = registry.getAllJobs();
1352
- expect(jobs.has("test:job:boot-sync")).toBe(true);
1353
- expect(jobs.has("test:job:scheduled")).toBe(true);
1354
- expect(jobs.has("test:job:manual-report")).toBe(true);
1355
- expect(jobs.has("test:job:skip-job")).toBe(true);
1356
- });
1357
-
1358
- test("getJob returns job definition", () => {
1359
- const registry = createRegistry([testFeature]);
1360
- const job = registry.getJob("test:job:skip-job");
1361
- expect(job).toBeDefined();
1362
- expect(job?.concurrency).toBe("skip");
1363
- });
1364
-
1365
- test("boot job has runOnBoot flag", () => {
1366
- const registry = createRegistry([testFeature]);
1367
- const job = registry.getJob("test:job:boot-sync");
1368
- expect(job).toBeDefined();
1369
- expect(job?.runOnBoot).toBe(true);
1370
- });
1371
- });
1372
-
1373
- // --- Boot gates: only an inline gate can abort a boot (fw#2590) ---
1374
-
1375
- describe("boot gates", () => {
1376
- const gateLog: string[] = [];
1377
- const GATE_FAILURE = "required legal blocks are not seeded";
1378
-
1379
- function uniquePrefix(): string {
1380
- return `kumiko-gate-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1381
- }
1382
-
1383
- function createGateRunner(
1384
- feature: ReturnType<typeof defineFeature>,
1385
- queueNamePrefix: string,
1386
- ): JobRunner {
1387
- const context: AppContext = {};
1388
- return createJobRunner({
1389
- registry: createRegistry([feature]),
1390
- context,
1391
- redisUrl,
1392
- consumerLane: "worker",
1393
- queueNamePrefix,
1394
- });
1395
- }
1396
-
1397
- async function purge(queueNamePrefix: string): Promise<void> {
1398
- const keys = await testRedis.redis.keys(`bull:${queueNamePrefix}-worker:*`);
1399
- if (keys.length > 0) await testRedis.redis.del(...keys);
1400
- }
1401
-
1402
- test("a throwing gate rejects start() and stops the remaining boot wiring", async () => {
1403
- const feature = defineFeature("failgate", (r) => {
1404
- r.job("check", { trigger: { manual: true }, bootGate: true }, async () => {
1405
- throw new Error(GATE_FAILURE);
1406
- });
1407
- r.job("afterGate", { trigger: { manual: true }, runOnBoot: true }, async () => {
1408
- gateLog.push("after-gate");
1409
- });
1410
- });
1411
- const prefix = uniquePrefix();
1412
- const runner = createGateRunner(feature, prefix);
1413
- gateLog.length = 0;
1414
-
1415
- // Pin the qualified name the boot-job-id assertion below is built on —
1416
- // a typo there would make that assertion pass vacuously.
1417
- const afterGateName = "failgate:job:after-gate";
1418
- expect(createRegistry([feature]).getJob(afterGateName)).toBeDefined();
1419
-
1420
- const queue = new Queue(`${prefix}-worker`, {
1421
- connection: { host: testRedis.redis.options.host, port: testRedis.redis.options.port },
1422
- });
1423
- // A post-close 'error' here is otherwise unhandled and bun:test
1424
- // attributes it to whichever test runs next (fw#1805).
1425
- queue.on("error", () => {});
1426
-
1427
- try {
1428
- // The gate's own message must survive — which blocks are missing is the
1429
- // entire operational value, and onJobFailed runs before the re-throw.
1430
- await expect(runner.start()).rejects.toThrow(GATE_FAILURE);
1431
- await sleep(300);
1432
- // The gate aborted start() before any further boot wiring ran: the
1433
- // runOnBoot job was never even enqueued, and never executed.
1434
- const bootJob = await queue.getJob(bootJobIdForJobName(afterGateName));
1435
- expect(bootJob).toBeUndefined();
1436
- expect(gateLog).toEqual([]);
1437
- } finally {
1438
- await queue.close();
1439
- await runner.stop();
1440
- await purge(prefix);
1441
- }
1442
- });
1443
-
1444
- test("a gate runs on every start, unlike a deduped runOnBoot job", async () => {
1445
- const feature = defineFeature("everygate", (r) => {
1446
- r.job("check", { trigger: { manual: true }, bootGate: true }, async () => {
1447
- gateLog.push("gate");
1448
- });
1449
- r.job("once", { trigger: { manual: true }, runOnBoot: true }, async () => {
1450
- gateLog.push("boot");
1451
- });
1452
- });
1453
- const prefix = uniquePrefix();
1454
- gateLog.length = 0;
1455
-
1456
- const first = createGateRunner(feature, prefix);
1457
- await first.start();
1458
- await waitFor(() => {
1459
- expect(gateLog.filter((e) => e === "boot").length).toBe(1);
1460
- });
1461
- await first.stop();
1462
-
1463
- const second = createGateRunner(feature, prefix);
1464
- try {
1465
- await second.start();
1466
- await sleep(300);
1467
- expect(gateLog.filter((e) => e === "gate").length).toBe(2);
1468
- // The persistent boot-enqueued marker set from the first start is
1469
- // still present in Redis, so the second start skips re-enqueueing —
1470
- // that dedup is why runOnBoot cannot gate a deploy.
1471
- expect(gateLog.filter((e) => e === "boot").length).toBe(1);
1472
- } finally {
1473
- await second.stop();
1474
- await purge(prefix);
1475
- }
1476
- });
1477
-
1478
- test("bootGate is rejected for perTenant and sequential jobs", () => {
1479
- const perTenantGate = defineFeature("pergate", (r) => {
1480
- r.job("check", { trigger: { manual: true }, bootGate: true, perTenant: true }, async () => {
1481
- gateLog.push("never");
1482
- });
1483
- });
1484
- expect(() => createRegistry([perTenantGate])).toThrow(/bootGate with perTenant/);
1485
-
1486
- const sequentialGate = defineFeature("seqgate", (r) => {
1487
- r.job(
1488
- "check",
1489
- { trigger: { manual: true }, bootGate: true, concurrency: "sequential" },
1490
- async () => {
1491
- gateLog.push("never");
1492
- },
1493
- );
1494
- });
1495
- expect(() => createRegistry([sequentialGate])).toThrow(/bootGate with concurrency/);
1496
- });
1497
-
1498
- test("object-form backoff.delayMs must be a positive integer", () => {
1499
- for (const badDelayMs of [0, -5, 1.5]) {
1500
- const feature = defineFeature("badbackoff", (r) => {
1501
- r.job(
1502
- "check",
1503
- { trigger: { manual: true }, backoff: { type: "fixed", delayMs: badDelayMs } },
1504
- async () => {
1505
- gateLog.push("never");
1506
- },
1507
- );
1508
- });
1509
- expect(() => createRegistry([feature])).toThrow(
1510
- /backoff\.delayMs must be a positive integer/,
1511
- );
1512
- }
1513
-
1514
- const validObjectForm = defineFeature("goodbackoffobject", (r) => {
1515
- r.job(
1516
- "check",
1517
- { trigger: { manual: true }, backoff: { type: "exponential", delayMs: 100 } },
1518
- async () => {
1519
- gateLog.push("never");
1520
- },
1521
- );
1522
- });
1523
- expect(() => createRegistry([validObjectForm])).not.toThrow();
1524
-
1525
- const validStringForm = defineFeature("goodbackoffstring", (r) => {
1526
- r.job("check", { trigger: { manual: true }, backoff: "fixed" }, async () => {
1527
- gateLog.push("never");
1528
- });
1529
- });
1530
- expect(() => createRegistry([validStringForm])).not.toThrow();
1531
- });
1532
- });
1533
-
1534
- describe("runner lifecycle: immediate stop (fw#1805)", () => {
1535
- test("stop() right after construction leaves no unhandled rejection", async () => {
1536
- const unhandled: unknown[] = [];
1537
- const onUnhandled = (reason: unknown) => {
1538
- unhandled.push(reason);
1539
- };
1540
- process.on("unhandledRejection", onUnhandled);
1541
- try {
1542
- // @timeout-exception: #1805 the 0-4ms delay is the variable under test (stop during connect), nothing to poll for
1543
- for (let i = 0; i < 20; i++) {
1544
- const runner = createJobRunner({
1545
- registry: createRegistry([testFeature]),
1546
- context: {},
1547
- redisUrl,
1548
- consumerLane: "worker",
1549
- queueNamePrefix: `kumiko-test-stop-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`,
1550
- });
1551
- // Deterministic 0-4ms delays hit the window where the Queue
1552
- // connection is still 'initializing'.
1553
- await sleep(i % 5);
1554
- await runner.stop();
1555
- }
1556
- // Rejections surface on a later tick.
1557
- await sleep(200);
1558
- } finally {
1559
- process.off("unhandledRejection", onUnhandled);
1560
- }
1561
- expect(unhandled).toEqual([]);
1562
- });
1563
- });