@cosmicdrift/kumiko-framework 0.328.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 (2089) 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 +6 -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 -252
  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 -1394
  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 -578
  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/pii-backfill-state.ts +0 -33
  1297. package/src/db/queries/projection-rebuild.ts +0 -104
  1298. package/src/db/queries/raw-sql.ts +0 -28
  1299. package/src/db/queries/seed-context.ts +0 -62
  1300. package/src/db/queries/shadow-swap.ts +0 -378
  1301. package/src/db/queries/table-ops.ts +0 -11
  1302. package/src/db/queries/test-stack.ts +0 -32
  1303. package/src/db/query-api.ts +0 -24
  1304. package/src/db/query.ts +0 -35
  1305. package/src/db/rebuild-marker.ts +0 -103
  1306. package/src/db/reference-data.ts +0 -73
  1307. package/src/db/render-ddl.ts +0 -57
  1308. package/src/db/replay-migration-sql.ts +0 -257
  1309. package/src/db/schema-inspection.ts +0 -81
  1310. package/src/db/table-builder.ts +0 -692
  1311. package/src/db/tenant-db-runner.ts +0 -23
  1312. package/src/db/tenant-db.ts +0 -727
  1313. package/src/derivatives/__tests__/derivatives-context.integration.test.ts +0 -231
  1314. package/src/derivatives/__tests__/derivatives-context.test.ts +0 -369
  1315. package/src/derivatives/__tests__/field-variants.test.ts +0 -62
  1316. package/src/derivatives/__tests__/variant-key.test.ts +0 -183
  1317. package/src/derivatives/__tests__/variant-route.integration.test.ts +0 -268
  1318. package/src/derivatives/delete-stored-file.ts +0 -86
  1319. package/src/derivatives/derivatives-context.ts +0 -314
  1320. package/src/derivatives/field-variants.ts +0 -20
  1321. package/src/derivatives/index.ts +0 -14
  1322. package/src/derivatives/variant-key.ts +0 -108
  1323. package/src/engine/__tests__/_pipeline-test-utils.ts +0 -23
  1324. package/src/engine/__tests__/auth-claims-registrar.test.ts +0 -74
  1325. package/src/engine/__tests__/boot-validator-action-wiring.test.ts +0 -362
  1326. package/src/engine/__tests__/boot-validator-api-exposure.test.ts +0 -142
  1327. package/src/engine/__tests__/boot-validator-boot-check.test.ts +0 -104
  1328. package/src/engine/__tests__/boot-validator-dashboard.test.ts +0 -381
  1329. package/src/engine/__tests__/boot-validator-detail-for.test.ts +0 -106
  1330. package/src/engine/__tests__/boot-validator-entity-list.test.ts +0 -120
  1331. package/src/engine/__tests__/boot-validator-gdpr-storage.test.ts +0 -85
  1332. package/src/engine/__tests__/boot-validator-i18n-keys.test.ts +0 -153
  1333. package/src/engine/__tests__/boot-validator-located-timestamps.test.ts +0 -92
  1334. package/src/engine/__tests__/boot-validator-nav-area.test.ts +0 -116
  1335. package/src/engine/__tests__/boot-validator-pii-retention.test.ts +0 -994
  1336. package/src/engine/__tests__/boot-validator-projection-list.test.ts +0 -629
  1337. package/src/engine/__tests__/boot-validator-query-output-schema.test.ts +0 -578
  1338. package/src/engine/__tests__/boot-validator-query-refs.test.ts +0 -151
  1339. package/src/engine/__tests__/boot-validator-ref-entity.test.ts +0 -196
  1340. package/src/engine/__tests__/boot-validator-s0-integration.test.ts +0 -172
  1341. package/src/engine/__tests__/boot-validator.test.ts +0 -5984
  1342. package/src/engine/__tests__/build-app-schema-settings-hub.test.ts +0 -246
  1343. package/src/engine/__tests__/build-app-schema-url-prefill.test.ts +0 -222
  1344. package/src/engine/__tests__/build-app-schema.test.ts +0 -1167
  1345. package/src/engine/__tests__/build-config-feature-schema-extension-selector.test.ts +0 -395
  1346. package/src/engine/__tests__/build-config-feature-schema-secrets.test.ts +0 -188
  1347. package/src/engine/__tests__/build-config-feature-schema.test.ts +0 -511
  1348. package/src/engine/__tests__/build-target.test.ts +0 -127
  1349. package/src/engine/__tests__/changeset-changes.test.ts +0 -64
  1350. package/src/engine/__tests__/claim-keys.test.ts +0 -274
  1351. package/src/engine/__tests__/codemod-pipeline.test.ts +0 -682
  1352. package/src/engine/__tests__/config-helpers.test.ts +0 -309
  1353. package/src/engine/__tests__/content-collection.test.ts +0 -307
  1354. package/src/engine/__tests__/decimal-field.test.ts +0 -59
  1355. package/src/engine/__tests__/dedupe-features.test.ts +0 -85
  1356. package/src/engine/__tests__/define-feature-entity-mapping.test.ts +0 -53
  1357. package/src/engine/__tests__/define-roles.test.ts +0 -21
  1358. package/src/engine/__tests__/define-workflow.test.ts +0 -79
  1359. package/src/engine/__tests__/describe-workflow-step-error.test.ts +0 -17
  1360. package/src/engine/__tests__/duration-utils.test.ts +0 -16
  1361. package/src/engine/__tests__/effective-features.test.ts +0 -86
  1362. package/src/engine/__tests__/embedded-derived.test.ts +0 -35
  1363. package/src/engine/__tests__/engine.test.ts +0 -2406
  1364. package/src/engine/__tests__/entity-create-caller-id.integration.test.ts +0 -87
  1365. package/src/engine/__tests__/entity-exclude-fields.integration.test.ts +0 -134
  1366. package/src/engine/__tests__/entity-handlers-escape-hatch.test.ts +0 -91
  1367. package/src/engine/__tests__/entity-handlers.test.ts +0 -562
  1368. package/src/engine/__tests__/entity-presave-wiring.integration.test.ts +0 -153
  1369. package/src/engine/__tests__/entity-restore-tenant-isolation.integration.test.ts +0 -168
  1370. package/src/engine/__tests__/entity-write-crosstenant.integration.test.ts +0 -317
  1371. package/src/engine/__tests__/event-helpers.test.ts +0 -68
  1372. package/src/engine/__tests__/event-migration-declarative.test.ts +0 -67
  1373. package/src/engine/__tests__/event-type-map-augmentation.test.ts +0 -24
  1374. package/src/engine/__tests__/extend-entity-projection.test.ts +0 -133
  1375. package/src/engine/__tests__/extends-registrar.test.ts +0 -279
  1376. package/src/engine/__tests__/factories-long-text.test.ts +0 -95
  1377. package/src/engine/__tests__/factories-number-unit.test.ts +0 -23
  1378. package/src/engine/__tests__/factories-personal.test.ts +0 -216
  1379. package/src/engine/__tests__/factories-time.test.ts +0 -94
  1380. package/src/engine/__tests__/feature-crud-shorthand.test.ts +0 -73
  1381. package/src/engine/__tests__/feature-crud-verb-access.integration.test.ts +0 -83
  1382. package/src/engine/__tests__/feature-manifest.test.ts +0 -137
  1383. package/src/engine/__tests__/field-access.test.ts +0 -65
  1384. package/src/engine/__tests__/field-predicates.test.ts +0 -48
  1385. package/src/engine/__tests__/form-money-currency-types.test.ts +0 -90
  1386. package/src/engine/__tests__/hook-identity-switch-grant.test.ts +0 -188
  1387. package/src/engine/__tests__/hook-phases.test.ts +0 -172
  1388. package/src/engine/__tests__/http-route-anonymous-required.test.ts +0 -43
  1389. package/src/engine/__tests__/identifiers.test.ts +0 -35
  1390. package/src/engine/__tests__/lifecycle-hooks.test.ts +0 -243
  1391. package/src/engine/__tests__/membership-roles.test.ts +0 -67
  1392. package/src/engine/__tests__/metric-navigate-tab.test.ts +0 -167
  1393. package/src/engine/__tests__/multiselect-filter.integration.test.ts +0 -141
  1394. package/src/engine/__tests__/nav.test.ts +0 -497
  1395. package/src/engine/__tests__/no-return-guard.test.ts +0 -17
  1396. package/src/engine/__tests__/ownership.test.ts +0 -475
  1397. package/src/engine/__tests__/parse-ref-target.test.ts +0 -43
  1398. package/src/engine/__tests__/pipeline-engine.test.ts +0 -215
  1399. package/src/engine/__tests__/pipeline-handler.integration.test.ts +0 -880
  1400. package/src/engine/__tests__/pipeline-observability.integration.test.ts +0 -142
  1401. package/src/engine/__tests__/pipeline-performance.integration.test.ts +0 -152
  1402. package/src/engine/__tests__/pipeline-sub-pipelines.test.ts +0 -288
  1403. package/src/engine/__tests__/post-query-hook.test.ts +0 -144
  1404. package/src/engine/__tests__/project-app-schema-for-roles.test.ts +0 -500
  1405. package/src/engine/__tests__/projection-detail-actions.test.ts +0 -145
  1406. package/src/engine/__tests__/projection-detail-singleton.test.ts +0 -86
  1407. package/src/engine/__tests__/projection-detail-tabs.test.ts +0 -314
  1408. package/src/engine/__tests__/projection-helpers.test.ts +0 -75
  1409. package/src/engine/__tests__/projection-list-filter.integration.test.ts +0 -115
  1410. package/src/engine/__tests__/projection.test.ts +0 -191
  1411. package/src/engine/__tests__/qualified-name.test.ts +0 -306
  1412. package/src/engine/__tests__/read-steps-tenant-filter.integration.test.ts +0 -215
  1413. package/src/engine/__tests__/registrar-object-form.test.ts +0 -141
  1414. package/src/engine/__tests__/registry.test.ts +0 -326
  1415. package/src/engine/__tests__/required-surface-keys.test.ts +0 -477
  1416. package/src/engine/__tests__/resolve-config-or-param.test.ts +0 -315
  1417. package/src/engine/__tests__/role-assignment.test.ts +0 -71
  1418. package/src/engine/__tests__/row-action-navigate-tab.test.ts +0 -107
  1419. package/src/engine/__tests__/run-in.test.ts +0 -38
  1420. package/src/engine/__tests__/schema-builder-date-bounds.test.ts +0 -47
  1421. package/src/engine/__tests__/schema-builder.test.ts +0 -1211
  1422. package/src/engine/__tests__/screen-definition-exports.test.ts +0 -102
  1423. package/src/engine/__tests__/screen-filter-ops.test.ts +0 -31
  1424. package/src/engine/__tests__/screen-helpers.test.ts +0 -52
  1425. package/src/engine/__tests__/screen.test.ts +0 -1684
  1426. package/src/engine/__tests__/search-payload-extension.test.ts +0 -288
  1427. package/src/engine/__tests__/soft-delete-cleanup-job-tenant-db.integration.test.ts +0 -82
  1428. package/src/engine/__tests__/soft-delete-cleanup.test.ts +0 -167
  1429. package/src/engine/__tests__/state-machine.test.ts +0 -148
  1430. package/src/engine/__tests__/steps-aggregate-append-event.test.ts +0 -115
  1431. package/src/engine/__tests__/steps-aggregate-create.test.ts +0 -92
  1432. package/src/engine/__tests__/steps-aggregate-update.test.ts +0 -127
  1433. package/src/engine/__tests__/steps-call-feature.test.ts +0 -123
  1434. package/src/engine/__tests__/steps-mail-send.test.ts +0 -137
  1435. package/src/engine/__tests__/steps-read.test.ts +0 -332
  1436. package/src/engine/__tests__/steps-resolver-utils.test.ts +0 -50
  1437. package/src/engine/__tests__/steps-unsafe-projection-delete.test.ts +0 -77
  1438. package/src/engine/__tests__/steps-unsafe-projection-upsert.test.ts +0 -131
  1439. package/src/engine/__tests__/steps-webhook-send.test.ts +0 -143
  1440. package/src/engine/__tests__/steps-workflow.test.ts +0 -353
  1441. package/src/engine/__tests__/store-table.test.ts +0 -247
  1442. package/src/engine/__tests__/system-user.test.ts +0 -57
  1443. package/src/engine/__tests__/tier-resolver-extension.test.ts +0 -69
  1444. package/src/engine/__tests__/toolbar-navigate-tab.test.ts +0 -233
  1445. package/src/engine/__tests__/tree-actions-patterns.test.ts +0 -163
  1446. package/src/engine/__tests__/validate-custom-screen-write-qns.test.ts +0 -43
  1447. package/src/engine/__tests__/validate-projection-allowlist.test.ts +0 -498
  1448. package/src/engine/__tests__/validation-hooks.test.ts +0 -77
  1449. package/src/engine/__tests__/where-rule-lint.test.ts +0 -79
  1450. package/src/engine/__tests__/write-handler-qn-extract.test.ts +0 -50
  1451. package/src/engine/access.ts +0 -27
  1452. package/src/engine/active-membership.ts +0 -70
  1453. package/src/engine/boot-validator/__tests__/access-declarations.test.ts +0 -707
  1454. package/src/engine/boot-validator/__tests__/access-roles.test.ts +0 -84
  1455. package/src/engine/boot-validator/__tests__/action-icon.test.ts +0 -81
  1456. package/src/engine/boot-validator/__tests__/anonymous-rate-limit-required.test.ts +0 -63
  1457. package/src/engine/boot-validator/__tests__/config-deps.test.ts +0 -92
  1458. package/src/engine/boot-validator/__tests__/global-tenancy.test.ts +0 -73
  1459. package/src/engine/boot-validator/__tests__/i18n-keys.test.ts +0 -340
  1460. package/src/engine/boot-validator/__tests__/nav.test.ts +0 -290
  1461. package/src/engine/boot-validator/__tests__/no-all-role-in-handler-access.test.ts +0 -77
  1462. package/src/engine/boot-validator/__tests__/ownership.test.ts +0 -87
  1463. package/src/engine/boot-validator/__tests__/parent-ref.test.ts +0 -161
  1464. package/src/engine/boot-validator/__tests__/rate-limit-disabled-reason.test.ts +0 -45
  1465. package/src/engine/boot-validator/__tests__/record-owned.test.ts +0 -65
  1466. package/src/engine/boot-validator/__tests__/security-baseline.test.ts +0 -107
  1467. package/src/engine/boot-validator/__tests__/transfer-graph.test.ts +0 -138
  1468. package/src/engine/boot-validator/access-declarations.ts +0 -211
  1469. package/src/engine/boot-validator/access-roles.ts +0 -85
  1470. package/src/engine/boot-validator/action-wiring.ts +0 -163
  1471. package/src/engine/boot-validator/api-ext.ts +0 -81
  1472. package/src/engine/boot-validator/boot-check.ts +0 -21
  1473. package/src/engine/boot-validator/config-deps.ts +0 -246
  1474. package/src/engine/boot-validator/custom-screen-write-qns.ts +0 -87
  1475. package/src/engine/boot-validator/detail-screens.ts +0 -49
  1476. package/src/engine/boot-validator/entity-handler.ts +0 -1011
  1477. package/src/engine/boot-validator/entity-list-screens.ts +0 -100
  1478. package/src/engine/boot-validator/gdpr-storage.ts +0 -59
  1479. package/src/engine/boot-validator/global-tenancy.ts +0 -29
  1480. package/src/engine/boot-validator/i18n-keys.ts +0 -101
  1481. package/src/engine/boot-validator/index.ts +0 -301
  1482. package/src/engine/boot-validator/nav.ts +0 -241
  1483. package/src/engine/boot-validator/ownership.ts +0 -352
  1484. package/src/engine/boot-validator/parent-ref.ts +0 -96
  1485. package/src/engine/boot-validator/pii-retention.ts +0 -272
  1486. package/src/engine/boot-validator/projection-list-screens.ts +0 -293
  1487. package/src/engine/boot-validator/query-output-columns.ts +0 -273
  1488. package/src/engine/boot-validator/query-refs.ts +0 -141
  1489. package/src/engine/boot-validator/record-owned.ts +0 -21
  1490. package/src/engine/boot-validator/screens.ts +0 -2604
  1491. package/src/engine/boot-validator/security-baseline.ts +0 -26
  1492. package/src/engine/boot-validator/transfer-graph.ts +0 -135
  1493. package/src/engine/boot-validator/url-prefill-fields.ts +0 -178
  1494. package/src/engine/boot-validator/workspaces.ts +0 -106
  1495. package/src/engine/boot-validator/zod-shape.ts +0 -142
  1496. package/src/engine/boot-validator.ts +0 -8
  1497. package/src/engine/build-app-schema.ts +0 -542
  1498. package/src/engine/build-config-feature-schema.ts +0 -815
  1499. package/src/engine/build-target.ts +0 -99
  1500. package/src/engine/changeset-changes.ts +0 -117
  1501. package/src/engine/codemod/index.ts +0 -15
  1502. package/src/engine/codemod/pipeline-codemod.ts +0 -641
  1503. package/src/engine/config-helpers.ts +0 -217
  1504. package/src/engine/constants.ts +0 -117
  1505. package/src/engine/create-app.ts +0 -177
  1506. package/src/engine/cross-tenant.test.ts +0 -32
  1507. package/src/engine/cross-tenant.ts +0 -22
  1508. package/src/engine/dedupe-features.ts +0 -46
  1509. package/src/engine/define-feature.ts +0 -169
  1510. package/src/engine/define-handler.ts +0 -194
  1511. package/src/engine/define-roles.ts +0 -19
  1512. package/src/engine/define-step.ts +0 -28
  1513. package/src/engine/define-workflow.ts +0 -147
  1514. package/src/engine/effective-features.ts +0 -97
  1515. package/src/engine/embedded-derived.ts +0 -93
  1516. package/src/engine/entity-handlers.ts +0 -782
  1517. package/src/engine/escape-hatch-declaration.ts +0 -7
  1518. package/src/engine/event-helpers.ts +0 -73
  1519. package/src/engine/extension-names.ts +0 -242
  1520. package/src/engine/extension-selector-plugins.ts +0 -24
  1521. package/src/engine/extensions/__tests__/hook-ctx-db-tenant-scoped.test.ts +0 -76
  1522. package/src/engine/extensions/escape-hatch-usage.ts +0 -16
  1523. package/src/engine/extensions/storage-provider.ts +0 -16
  1524. package/src/engine/extensions/tenant-data.ts +0 -34
  1525. package/src/engine/extensions/tenant-resource.ts +0 -40
  1526. package/src/engine/extensions/user-data.ts +0 -181
  1527. package/src/engine/factories.ts +0 -559
  1528. package/src/engine/feature-ast/__tests__/canonical-form.test.ts +0 -416
  1529. package/src/engine/feature-ast/__tests__/fixtures/cross-file-name-const/constants.ts +0 -1
  1530. package/src/engine/feature-ast/__tests__/fixtures/cross-file-name-const/feature.ts +0 -8
  1531. package/src/engine/feature-ast/__tests__/fixtures/cross-file-patch-const/constants.ts +0 -2
  1532. package/src/engine/feature-ast/__tests__/fixtures/cross-file-patch-const/feature.ts +0 -8
  1533. package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/feature.ts +0 -9
  1534. package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/screens.ts +0 -4
  1535. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/alias-reexport.ts +0 -1
  1536. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/cycle-a.ts +0 -1
  1537. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/cycle-b.ts +0 -1
  1538. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/entry.ts +0 -3
  1539. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/local-rebind.ts +0 -3
  1540. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/origin.ts +0 -1
  1541. package/src/engine/feature-ast/__tests__/fixtures/resolve-import/star-barrel.ts +0 -1
  1542. package/src/engine/feature-ast/__tests__/handler-header-roundtrip.test.ts +0 -669
  1543. package/src/engine/feature-ast/__tests__/parse-happy-path.test.ts +0 -196
  1544. package/src/engine/feature-ast/__tests__/parse-real-features.test.ts +0 -138
  1545. package/src/engine/feature-ast/__tests__/parse.test.ts +0 -2841
  1546. package/src/engine/feature-ast/__tests__/patch-update.test.ts +0 -718
  1547. package/src/engine/feature-ast/__tests__/patch.test.ts +0 -780
  1548. package/src/engine/feature-ast/__tests__/patcher.test.ts +0 -468
  1549. package/src/engine/feature-ast/__tests__/pattern-change-schema.test.ts +0 -819
  1550. package/src/engine/feature-ast/__tests__/read-optional-access-rule.test.ts +0 -42
  1551. package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +0 -947
  1552. package/src/engine/feature-ast/__tests__/resolve-import.test.ts +0 -138
  1553. package/src/engine/feature-ast/entity-field-types.ts +0 -41
  1554. package/src/engine/feature-ast/extractors/ai-steps.ts +0 -352
  1555. package/src/engine/feature-ast/extractors/events.ts +0 -349
  1556. package/src/engine/feature-ast/extractors/handlers.ts +0 -459
  1557. package/src/engine/feature-ast/extractors/hooks.ts +0 -331
  1558. package/src/engine/feature-ast/extractors/index.ts +0 -92
  1559. package/src/engine/feature-ast/extractors/jobs-routes.ts +0 -225
  1560. package/src/engine/feature-ast/extractors/projections-screens.ts +0 -269
  1561. package/src/engine/feature-ast/extractors/resolve-import.ts +0 -187
  1562. package/src/engine/feature-ast/extractors/round1.ts +0 -150
  1563. package/src/engine/feature-ast/extractors/round2.ts +0 -276
  1564. package/src/engine/feature-ast/extractors/round3.ts +0 -474
  1565. package/src/engine/feature-ast/extractors/round5.ts +0 -114
  1566. package/src/engine/feature-ast/extractors/round6.ts +0 -32
  1567. package/src/engine/feature-ast/extractors/shared.ts +0 -356
  1568. package/src/engine/feature-ast/index.ts +0 -113
  1569. package/src/engine/feature-ast/parse.ts +0 -615
  1570. package/src/engine/feature-ast/patch.ts +0 -979
  1571. package/src/engine/feature-ast/patcher.ts +0 -546
  1572. package/src/engine/feature-ast/pattern-change-schema.ts +0 -1411
  1573. package/src/engine/feature-ast/patterns.ts +0 -803
  1574. package/src/engine/feature-ast/render.ts +0 -767
  1575. package/src/engine/feature-ast/source-location.ts +0 -45
  1576. package/src/engine/feature-builder-state.ts +0 -174
  1577. package/src/engine/feature-changelog.ts +0 -95
  1578. package/src/engine/feature-config-events-jobs.ts +0 -472
  1579. package/src/engine/feature-entity-handlers.ts +0 -269
  1580. package/src/engine/feature-manifest.ts +0 -173
  1581. package/src/engine/feature-ui-extensions.ts +0 -648
  1582. package/src/engine/field-access.ts +0 -140
  1583. package/src/engine/field-helpers.ts +0 -35
  1584. package/src/engine/handler-helpers.ts +0 -26
  1585. package/src/engine/hook-helpers.ts +0 -16
  1586. package/src/engine/i18n-key.ts +0 -12
  1587. package/src/engine/index.ts +0 -585
  1588. package/src/engine/instruction-fields.ts +0 -11
  1589. package/src/engine/membership-roles.ts +0 -61
  1590. package/src/engine/object-form.ts +0 -27
  1591. package/src/engine/ownership.ts +0 -404
  1592. package/src/engine/parse-ref-target.ts +0 -28
  1593. package/src/engine/pattern-library/__tests__/library.test.ts +0 -399
  1594. package/src/engine/pattern-library/index.ts +0 -24
  1595. package/src/engine/pattern-library/library.ts +0 -140
  1596. package/src/engine/pattern-library/mixed-schemas.ts +0 -588
  1597. package/src/engine/pattern-library/opaque-schemas.ts +0 -124
  1598. package/src/engine/pattern-library/shared-fields.ts +0 -79
  1599. package/src/engine/pattern-library/static-schemas.ts +0 -456
  1600. package/src/engine/pattern-library/types.ts +0 -255
  1601. package/src/engine/personal-data-fields.ts +0 -66
  1602. package/src/engine/pipeline.ts +0 -111
  1603. package/src/engine/project-app-schema-for-roles.ts +0 -950
  1604. package/src/engine/projection-helpers.ts +0 -79
  1605. package/src/engine/qualified-name.ts +0 -165
  1606. package/src/engine/read-claim.ts +0 -31
  1607. package/src/engine/registry-facade.ts +0 -381
  1608. package/src/engine/registry-ingest.ts +0 -479
  1609. package/src/engine/registry-state.ts +0 -410
  1610. package/src/engine/registry-validate.ts +0 -810
  1611. package/src/engine/registry.ts +0 -94
  1612. package/src/engine/resolve-config-or-param.ts +0 -157
  1613. package/src/engine/role-assignment.ts +0 -63
  1614. package/src/engine/run-in.ts +0 -29
  1615. package/src/engine/run-pipeline.ts +0 -162
  1616. package/src/engine/schema-builder.ts +0 -428
  1617. package/src/engine/screen-filter-ops.ts +0 -60
  1618. package/src/engine/screen-helpers.ts +0 -161
  1619. package/src/engine/soft-delete-cleanup.ts +0 -126
  1620. package/src/engine/state-machine.ts +0 -71
  1621. package/src/engine/steps/__tests__/duration-utils.test.ts +0 -20
  1622. package/src/engine/steps/_duration-utils.ts +0 -35
  1623. package/src/engine/steps/_event-match.ts +0 -98
  1624. package/src/engine/steps/_no-return-guard.ts +0 -21
  1625. package/src/engine/steps/_read-source.ts +0 -12
  1626. package/src/engine/steps/_resolver-utils.ts +0 -42
  1627. package/src/engine/steps/_step-dispatch-constants.ts +0 -38
  1628. package/src/engine/steps/aggregate-append-event.ts +0 -56
  1629. package/src/engine/steps/aggregate-create.ts +0 -56
  1630. package/src/engine/steps/aggregate-update.ts +0 -68
  1631. package/src/engine/steps/branch.ts +0 -84
  1632. package/src/engine/steps/call-feature.ts +0 -49
  1633. package/src/engine/steps/compute.ts +0 -41
  1634. package/src/engine/steps/describe-workflow-step-error.ts +0 -6
  1635. package/src/engine/steps/for-each.ts +0 -111
  1636. package/src/engine/steps/mail-send.ts +0 -48
  1637. package/src/engine/steps/read-find-many.ts +0 -57
  1638. package/src/engine/steps/read-find-one.ts +0 -59
  1639. package/src/engine/steps/retry.ts +0 -99
  1640. package/src/engine/steps/return.ts +0 -35
  1641. package/src/engine/steps/unsafe-projection-delete.ts +0 -50
  1642. package/src/engine/steps/unsafe-projection-upsert.ts +0 -88
  1643. package/src/engine/steps/wait-for-event.ts +0 -90
  1644. package/src/engine/steps/wait.ts +0 -69
  1645. package/src/engine/steps/webhook-send.ts +0 -63
  1646. package/src/engine/system-user.ts +0 -38
  1647. package/src/engine/tier-resolver-extension.ts +0 -107
  1648. package/src/engine/types/config.ts +0 -2
  1649. package/src/engine/types/define-handler.ts +0 -2
  1650. package/src/engine/types/entity-handlers.ts +0 -2
  1651. package/src/engine/types/feature.ts +0 -2
  1652. package/src/engine/types/fields.ts +0 -2
  1653. package/src/engine/types/handlers.ts +0 -3
  1654. package/src/engine/types/hooks.ts +0 -2
  1655. package/src/engine/types/index.ts +0 -394
  1656. package/src/engine/types/nav.ts +0 -2
  1657. package/src/engine/types/ownership.ts +0 -2
  1658. package/src/engine/types/projection.ts +0 -2
  1659. package/src/engine/types/screen.ts +0 -3
  1660. package/src/engine/types/step.ts +0 -2
  1661. package/src/engine/types/workspace.ts +0 -2
  1662. package/src/engine/validate-projection-allowlist.ts +0 -191
  1663. package/src/engine/validation.ts +0 -33
  1664. package/src/engine/where-rule-lint.ts +0 -196
  1665. package/src/engine/write-handler-qn-extract.ts +0 -47
  1666. package/src/entrypoint/__tests__/entrypoint-attach-dispatcher.integration.test.ts +0 -140
  1667. package/src/entrypoint/__tests__/entrypoint-job-wiring.integration.test.ts +0 -292
  1668. package/src/entrypoint/__tests__/split-deploy.integration.test.ts +0 -467
  1669. package/src/entrypoint/index.ts +0 -541
  1670. package/src/env/__tests__/compose-env-schema.test.ts +0 -410
  1671. package/src/env/__tests__/dry-run.test.ts +0 -161
  1672. package/src/env/__tests__/parse-env-dry-run.test.ts +0 -40
  1673. package/src/env/_zod-introspect.ts +0 -51
  1674. package/src/env/dry-run.ts +0 -204
  1675. package/src/env/index.ts +0 -435
  1676. package/src/errors/__tests__/classes.test.ts +0 -442
  1677. package/src/errors/__tests__/error-helpers.test.ts +0 -58
  1678. package/src/errors/__tests__/reason-i18n.test.ts +0 -46
  1679. package/src/errors/__tests__/write-failures.test.ts +0 -167
  1680. package/src/errors/classes.ts +0 -311
  1681. package/src/errors/field-issue.ts +0 -8
  1682. package/src/errors/i18n/de.yaml +0 -244
  1683. package/src/errors/i18n/en.yaml +0 -234
  1684. package/src/errors/index.ts +0 -47
  1685. package/src/errors/kumiko-error.ts +0 -67
  1686. package/src/errors/member-resolution.ts +0 -12
  1687. package/src/errors/reasons.ts +0 -102
  1688. package/src/errors/serialize.ts +0 -136
  1689. package/src/errors/to-kumiko-error.ts +0 -8
  1690. package/src/errors/transition-details.ts +0 -30
  1691. package/src/errors/write-error-info.ts +0 -124
  1692. package/src/errors/zod-bridge.ts +0 -62
  1693. package/src/es-ops/README.md +0 -179
  1694. package/src/es-ops/__tests__/context.integration.test.ts +0 -378
  1695. package/src/es-ops/__tests__/runner.integration.test.ts +0 -483
  1696. package/src/es-ops/__tests__/runner.test.ts +0 -202
  1697. package/src/es-ops/context.ts +0 -98
  1698. package/src/es-ops/index.ts +0 -34
  1699. package/src/es-ops/operations-schema.ts +0 -57
  1700. package/src/es-ops/runner.ts +0 -253
  1701. package/src/es-ops/types.ts +0 -124
  1702. package/src/event-store/__tests__/admin-api.integration.test.ts +0 -412
  1703. package/src/event-store/__tests__/backfill-pii.integration.test.ts +0 -880
  1704. package/src/event-store/__tests__/event-attribution.integration.test.ts +0 -236
  1705. package/src/event-store/__tests__/event-store.integration.test.ts +0 -932
  1706. package/src/event-store/__tests__/get-stream-version-perf.integration.test.ts +0 -87
  1707. package/src/event-store/__tests__/perf.integration.test.ts +0 -283
  1708. package/src/event-store/__tests__/provenance-append.integration.test.ts +0 -140
  1709. package/src/event-store/__tests__/row-to-stored-event.test.ts +0 -68
  1710. package/src/event-store/__tests__/snapshot.integration.test.ts +0 -328
  1711. package/src/event-store/__tests__/transfer.integration.test.ts +0 -236
  1712. package/src/event-store/__tests__/unscoped-stream-primitives.guard.test.ts +0 -62
  1713. package/src/event-store/__tests__/upcaster-dead-letter.integration.test.ts +0 -202
  1714. package/src/event-store/__tests__/upcaster.integration.test.ts +0 -491
  1715. package/src/event-store/admin-api.ts +0 -241
  1716. package/src/event-store/archive.ts +0 -83
  1717. package/src/event-store/errors.ts +0 -58
  1718. package/src/event-store/event-store.ts +0 -449
  1719. package/src/event-store/events-schema.ts +0 -89
  1720. package/src/event-store/index.ts +0 -80
  1721. package/src/event-store/provenance-append.ts +0 -67
  1722. package/src/event-store/rebuild-dead-letter.ts +0 -111
  1723. package/src/event-store/row-to-stored-event.ts +0 -34
  1724. package/src/event-store/snapshot.ts +0 -235
  1725. package/src/event-store/transfer.ts +0 -84
  1726. package/src/event-store/types.ts +0 -2
  1727. package/src/event-store/upcaster-dead-letter.ts +0 -120
  1728. package/src/event-store/upcaster.ts +0 -147
  1729. package/src/files/__tests__/build-storage-key.test.ts +0 -28
  1730. package/src/files/__tests__/content-disposition.test.ts +0 -123
  1731. package/src/files/__tests__/file-field-pipeline.integration.test.ts +0 -229
  1732. package/src/files/__tests__/file-handle.test.ts +0 -175
  1733. package/src/files/__tests__/file-ref-entity.test.ts +0 -42
  1734. package/src/files/__tests__/files.integration.test.ts +0 -1749
  1735. package/src/files/__tests__/in-memory-provider.contract.test.ts +0 -4
  1736. package/src/files/__tests__/in-memory-provider.test.ts +0 -94
  1737. package/src/files/__tests__/local-provider.contract.test.ts +0 -14
  1738. package/src/files/__tests__/local-provider.test.ts +0 -31
  1739. package/src/files/__tests__/provider-resolver.test.ts +0 -70
  1740. package/src/files/__tests__/read-stream.test.ts +0 -105
  1741. package/src/files/__tests__/storage-tracking.integration.test.ts +0 -238
  1742. package/src/files/__tests__/storage-tracking.test.ts +0 -46
  1743. package/src/files/__tests__/write-stream.test.ts +0 -250
  1744. package/src/files/__tests__/zip-stream.test.ts +0 -357
  1745. package/src/files/content-disposition.ts +0 -55
  1746. package/src/files/feature.ts +0 -44
  1747. package/src/files/file-handle.ts +0 -83
  1748. package/src/files/file-ref-entity.ts +0 -33
  1749. package/src/files/file-ref-table.ts +0 -13
  1750. package/src/files/file-routes.ts +0 -579
  1751. package/src/files/in-memory-provider.ts +0 -113
  1752. package/src/files/index.ts +0 -57
  1753. package/src/files/local-provider.ts +0 -132
  1754. package/src/files/provider-resolver.ts +0 -176
  1755. package/src/files/storage-tracking.ts +0 -245
  1756. package/src/files/types.ts +0 -336
  1757. package/src/files/zip-stream.ts +0 -251
  1758. package/src/http/index.ts +0 -10
  1759. package/src/i18n/__tests__/i18n.test.ts +0 -113
  1760. package/src/i18n/__tests__/mail-registry.test.ts +0 -54
  1761. package/src/i18n/__tests__/request-locale.test.ts +0 -19
  1762. package/src/i18n/__tests__/required-surface-keys.test.ts +0 -17
  1763. package/src/i18n/index.ts +0 -51
  1764. package/src/i18n/mail-registry.ts +0 -42
  1765. package/src/i18n/request-locale.ts +0 -72
  1766. package/src/i18n/required-surface-keys.ts +0 -459
  1767. package/src/i18n/settings-hub-keys.ts +0 -31
  1768. package/src/jobs/__tests__/job-attempt-context.integration.test.ts +0 -76
  1769. package/src/jobs/__tests__/job-backoff.integration.test.ts +0 -147
  1770. package/src/jobs/__tests__/job-event-trigger.integration.test.ts +0 -175
  1771. package/src/jobs/__tests__/job-last-success.integration.test.ts +0 -135
  1772. package/src/jobs/__tests__/job-multi-trigger.integration.test.ts +0 -147
  1773. package/src/jobs/__tests__/job-public-intake-origin.integration.test.ts +0 -536
  1774. package/src/jobs/__tests__/job-queue-depth.integration.test.ts +0 -82
  1775. package/src/jobs/__tests__/job-retention.integration.test.ts +0 -316
  1776. package/src/jobs/__tests__/job-retry-enqueue-paths.integration.test.ts +0 -309
  1777. package/src/jobs/__tests__/job-runner-boot-timeout.test.ts +0 -55
  1778. package/src/jobs/__tests__/job-systemdb.integration.test.ts +0 -153
  1779. package/src/jobs/__tests__/job-tenant-db.integration.test.ts +0 -162
  1780. package/src/jobs/__tests__/job-write-as.integration.test.ts +0 -251
  1781. package/src/jobs/__tests__/jobs.integration.test.ts +0 -1563
  1782. package/src/jobs/__tests__/scheduler-id.test.ts +0 -30
  1783. package/src/jobs/index.ts +0 -8
  1784. package/src/jobs/job-runner.ts +0 -1390
  1785. package/src/lifecycle/__tests__/create-test-lifecycle.ts +0 -19
  1786. package/src/lifecycle/__tests__/lifecycle-server.integration.test.ts +0 -108
  1787. package/src/lifecycle/__tests__/lifecycle.test.ts +0 -212
  1788. package/src/lifecycle/__tests__/signal-handlers.test.ts +0 -98
  1789. package/src/lifecycle/index.ts +0 -13
  1790. package/src/lifecycle/lifecycle.ts +0 -157
  1791. package/src/lifecycle/signal-handlers.ts +0 -64
  1792. package/src/logging/__tests__/fallback-logger.test.ts +0 -90
  1793. package/src/logging/__tests__/pino-trace-bridge.test.ts +0 -50
  1794. package/src/logging/index.ts +0 -4
  1795. package/src/logging/pino-logger.ts +0 -68
  1796. package/src/logging/utils.ts +0 -50
  1797. package/src/migrations/__tests__/kumiko-drift.integration.test.ts +0 -238
  1798. package/src/migrations/__tests__/kumiko-drift.report.test.ts +0 -105
  1799. package/src/migrations/__tests__/pending-rebuilds.integration.test.ts +0 -412
  1800. package/src/migrations/__tests__/pii-event-backfill.integration.test.ts +0 -457
  1801. package/src/migrations/index.ts +0 -36
  1802. package/src/migrations/kumiko-drift.ts +0 -187
  1803. package/src/migrations/pending-rebuilds.ts +0 -251
  1804. package/src/migrations/pii-event-backfill.ts +0 -422
  1805. package/src/migrations/projection-table-index.ts +0 -23
  1806. package/src/observability/__tests__/console-provider.test.ts +0 -67
  1807. package/src/observability/__tests__/escape-hatch-report.test.ts +0 -149
  1808. package/src/observability/__tests__/metric-validator.test.ts +0 -95
  1809. package/src/observability/__tests__/metrics-handle.test.ts +0 -30
  1810. package/src/observability/__tests__/metrics-wiring.test.ts +0 -61
  1811. package/src/observability/__tests__/noop-provider.test.ts +0 -82
  1812. package/src/observability/__tests__/observability.integration.test.ts +0 -639
  1813. package/src/observability/__tests__/prometheus-meter.test.ts +0 -144
  1814. package/src/observability/__tests__/recording-meter.test.ts +0 -101
  1815. package/src/observability/__tests__/recording-tracer.test.ts +0 -112
  1816. package/src/observability/__tests__/sensitive-filter.test.ts +0 -98
  1817. package/src/observability/console-provider.ts +0 -130
  1818. package/src/observability/context.ts +0 -26
  1819. package/src/observability/escape-hatch-report.ts +0 -129
  1820. package/src/observability/fallback.ts +0 -34
  1821. package/src/observability/ids.ts +0 -25
  1822. package/src/observability/index.ts +0 -88
  1823. package/src/observability/metric-validator.ts +0 -98
  1824. package/src/observability/metrics-handle.ts +0 -105
  1825. package/src/observability/metrics-wiring.ts +0 -32
  1826. package/src/observability/noop-provider.ts +0 -137
  1827. package/src/observability/prometheus-meter.ts +0 -286
  1828. package/src/observability/recording-meter.ts +0 -156
  1829. package/src/observability/recording-tracer.ts +0 -186
  1830. package/src/observability/redis-wrapper.ts +0 -132
  1831. package/src/observability/sensitive-filter.ts +0 -108
  1832. package/src/observability/standard-metrics.ts +0 -295
  1833. package/src/pipeline/__tests__/archive-stream.integration.test.ts +0 -299
  1834. package/src/pipeline/__tests__/auth-claims-resolver.test.ts +0 -279
  1835. package/src/pipeline/__tests__/blind-index-rebuild-guard.integration.test.ts +0 -94
  1836. package/src/pipeline/__tests__/cascade-handler.integration.test.ts +0 -435
  1837. package/src/pipeline/__tests__/cascade-handler.test.ts +0 -67
  1838. package/src/pipeline/__tests__/causation-chain.integration.test.ts +0 -207
  1839. package/src/pipeline/__tests__/ctx-bridge.integration.test.ts +0 -507
  1840. package/src/pipeline/__tests__/ctx-systemdb.integration.test.ts +0 -120
  1841. package/src/pipeline/__tests__/dispatcher-utils.test.ts +0 -132
  1842. package/src/pipeline/__tests__/dispatcher.test.ts +0 -1091
  1843. package/src/pipeline/__tests__/distributed-lock.integration.test.ts +0 -110
  1844. package/src/pipeline/__tests__/domain-events-projections.integration.test.ts +0 -323
  1845. package/src/pipeline/__tests__/escape-hatch-audit.integration.test.ts +0 -254
  1846. package/src/pipeline/__tests__/escape-hatch.integration.test.ts +0 -90
  1847. package/src/pipeline/__tests__/event-consumer-state.integration.test.ts +0 -81
  1848. package/src/pipeline/__tests__/event-dedup.integration.test.ts +0 -153
  1849. package/src/pipeline/__tests__/event-define-event-strict.integration.test.ts +0 -196
  1850. package/src/pipeline/__tests__/event-dispatcher-batch-delivery.test.ts +0 -178
  1851. package/src/pipeline/__tests__/event-dispatcher-batch-handler.integration.test.ts +0 -143
  1852. package/src/pipeline/__tests__/event-dispatcher-commit-order.integration.test.ts +0 -278
  1853. package/src/pipeline/__tests__/event-dispatcher-db-outage.integration.test.ts +0 -224
  1854. package/src/pipeline/__tests__/event-dispatcher-delivery-max-attempts.test.ts +0 -127
  1855. package/src/pipeline/__tests__/event-dispatcher-idle.integration.test.ts +0 -94
  1856. package/src/pipeline/__tests__/event-dispatcher-lifecycle.integration.test.ts +0 -209
  1857. package/src/pipeline/__tests__/event-dispatcher-multi-instance.integration.test.ts +0 -424
  1858. package/src/pipeline/__tests__/event-dispatcher-pass-failure.integration.test.ts +0 -266
  1859. package/src/pipeline/__tests__/event-dispatcher-per-consumer-turns.integration.test.ts +0 -126
  1860. package/src/pipeline/__tests__/event-dispatcher-pg-listen.integration.test.ts +0 -106
  1861. package/src/pipeline/__tests__/event-dispatcher-rearm.integration.test.ts +0 -263
  1862. package/src/pipeline/__tests__/event-dispatcher-recovery.integration.test.ts +0 -202
  1863. package/src/pipeline/__tests__/event-dispatcher-second-audit.integration.test.ts +0 -282
  1864. package/src/pipeline/__tests__/event-dispatcher-start-from.integration.test.ts +0 -276
  1865. package/src/pipeline/__tests__/event-dispatcher-strict.test.ts +0 -67
  1866. package/src/pipeline/__tests__/event-dispatcher.integration.test.ts +0 -290
  1867. package/src/pipeline/__tests__/event-retention.integration.test.ts +0 -242
  1868. package/src/pipeline/__tests__/fetch-for-writing.integration.test.ts +0 -364
  1869. package/src/pipeline/__tests__/hook-systemdb-escape-hatch.integration.test.ts +0 -246
  1870. package/src/pipeline/__tests__/idempotency-transient-failure.integration.test.ts +0 -198
  1871. package/src/pipeline/__tests__/instruction-field-gate.integration.test.ts +0 -213
  1872. package/src/pipeline/__tests__/irreversible-operation-gate.integration.test.ts +0 -249
  1873. package/src/pipeline/__tests__/job-trigger-consumer.integration.test.ts +0 -235
  1874. package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +0 -800
  1875. package/src/pipeline/__tests__/load-aggregate-query.integration.test.ts +0 -281
  1876. package/src/pipeline/__tests__/member-resolution-read-only.test.ts +0 -79
  1877. package/src/pipeline/__tests__/msp-error-mode.integration.test.ts +0 -149
  1878. package/src/pipeline/__tests__/msp-multi-hop.integration.test.ts +0 -231
  1879. package/src/pipeline/__tests__/msp-rebuild.integration.test.ts +0 -510
  1880. package/src/pipeline/__tests__/multi-stream-projection.integration.test.ts +0 -313
  1881. package/src/pipeline/__tests__/pending-gap-ranges.test.ts +0 -94
  1882. package/src/pipeline/__tests__/perf-rebuild.integration.test.ts +0 -147
  1883. package/src/pipeline/__tests__/post-query-hook.integration.test.ts +0 -165
  1884. package/src/pipeline/__tests__/projection-rebuild.integration.test.ts +0 -1033
  1885. package/src/pipeline/__tests__/projections-runner-systemscope.integration.test.ts +0 -101
  1886. package/src/pipeline/__tests__/public-intake-runtime-gate.integration.test.ts +0 -684
  1887. package/src/pipeline/__tests__/query-projection.integration.test.ts +0 -357
  1888. package/src/pipeline/__tests__/rate-limit-default.integration.test.ts +0 -118
  1889. package/src/pipeline/__tests__/rate-limit-default.test.ts +0 -117
  1890. package/src/pipeline/__tests__/rebuild-poison-quarantine.integration.test.ts +0 -275
  1891. package/src/pipeline/__tests__/redis-keys.test.ts +0 -12
  1892. package/src/pipeline/__tests__/redis-pipeline.integration.test.ts +0 -490
  1893. package/src/pipeline/__tests__/search-consumer-named-events.integration.test.ts +0 -274
  1894. package/src/pipeline/__tests__/system-identity-switch.integration.test.ts +0 -583
  1895. package/src/pipeline/__tests__/system-identity-switch.test.ts +0 -645
  1896. package/src/pipeline/__tests__/tenant-timezone-cache.test.ts +0 -89
  1897. package/src/pipeline/__tests__/try-append-event.integration.test.ts +0 -168
  1898. package/src/pipeline/__tests__/unsafe-raw-escape-hatch.integration.test.ts +0 -103
  1899. package/src/pipeline/active-membership.ts +0 -190
  1900. package/src/pipeline/append-event-core.ts +0 -117
  1901. package/src/pipeline/auth-claims-resolver.ts +0 -103
  1902. package/src/pipeline/cascade-handler.ts +0 -109
  1903. package/src/pipeline/dispatch-batch.ts +0 -269
  1904. package/src/pipeline/dispatch-query.ts +0 -195
  1905. package/src/pipeline/dispatch-shared.ts +0 -1242
  1906. package/src/pipeline/dispatch-stream.ts +0 -129
  1907. package/src/pipeline/dispatch-write.ts +0 -599
  1908. package/src/pipeline/dispatcher-utils.ts +0 -199
  1909. package/src/pipeline/dispatcher.ts +0 -278
  1910. package/src/pipeline/distributed-lock.ts +0 -66
  1911. package/src/pipeline/entity-cache.ts +0 -82
  1912. package/src/pipeline/event-consumer-state.ts +0 -190
  1913. package/src/pipeline/event-dedup.ts +0 -23
  1914. package/src/pipeline/event-dispatcher-admin.ts +0 -320
  1915. package/src/pipeline/event-dispatcher-delivery.ts +0 -499
  1916. package/src/pipeline/event-dispatcher.ts +0 -817
  1917. package/src/pipeline/event-retention.ts +0 -144
  1918. package/src/pipeline/idempotency.ts +0 -158
  1919. package/src/pipeline/index.ts +0 -83
  1920. package/src/pipeline/irreversible-operation-gate.ts +0 -76
  1921. package/src/pipeline/lifecycle-pipeline.ts +0 -421
  1922. package/src/pipeline/member-read-only-transaction.ts +0 -71
  1923. package/src/pipeline/member-reader.ts +0 -110
  1924. package/src/pipeline/msp-rebuild.ts +0 -312
  1925. package/src/pipeline/multi-stream-apply-context.ts +0 -85
  1926. package/src/pipeline/pending-gap-ranges.ts +0 -120
  1927. package/src/pipeline/projection-rebuild.ts +0 -539
  1928. package/src/pipeline/projection-state.ts +0 -60
  1929. package/src/pipeline/projections-runner.ts +0 -66
  1930. package/src/pipeline/redis-keys.ts +0 -11
  1931. package/src/pipeline/system-hooks.ts +0 -695
  1932. package/src/pipeline/system-identity-switch.ts +0 -401
  1933. package/src/pipeline/tenant-timezone-cache.ts +0 -92
  1934. package/src/pipeline/write-origin.ts +0 -128
  1935. package/src/random/__tests__/generate.test.ts +0 -149
  1936. package/src/random/__tests__/words.test.ts +0 -44
  1937. package/src/random/generate.ts +0 -141
  1938. package/src/random/index.ts +0 -8
  1939. package/src/random/words.ts +0 -393
  1940. package/src/rate-limit/__tests__/dispatcher-l3.integration.test.ts +0 -111
  1941. package/src/rate-limit/__tests__/middleware.integration.test.ts +0 -246
  1942. package/src/rate-limit/__tests__/resolver.integration.test.ts +0 -211
  1943. package/src/rate-limit/bucket.ts +0 -36
  1944. package/src/rate-limit/index.ts +0 -14
  1945. package/src/rate-limit/middleware.ts +0 -179
  1946. package/src/rate-limit/resolver.ts +0 -251
  1947. package/src/redis/__tests__/redis-options.test.ts +0 -54
  1948. package/src/redis/client.ts +0 -77
  1949. package/src/redis/index.ts +0 -4
  1950. package/src/redis/pubsub-signal.ts +0 -107
  1951. package/src/schema-cli.ts +0 -510
  1952. package/src/search/__tests__/derive-search-adapter-config.test.ts +0 -65
  1953. package/src/search/__tests__/meilisearch-adapter.integration.test.ts +0 -413
  1954. package/src/search/__tests__/meilisearch-ids.test.ts +0 -30
  1955. package/src/search/__tests__/reindex-entity.integration.test.ts +0 -243
  1956. package/src/search/__tests__/search-adapter.test.ts +0 -271
  1957. package/src/search/__tests__/search-consumer-batch.integration.test.ts +0 -306
  1958. package/src/search/__tests__/search-pii-derived-index.integration.test.ts +0 -208
  1959. package/src/search/derive-search-adapter-config.ts +0 -27
  1960. package/src/search/in-memory-adapter.ts +0 -129
  1961. package/src/search/index.ts +0 -20
  1962. package/src/search/meilisearch-adapter.ts +0 -213
  1963. package/src/search/purge-subject.ts +0 -253
  1964. package/src/search/reindex-entity.ts +0 -190
  1965. package/src/secrets/__tests__/contains-secret.test.ts +0 -108
  1966. package/src/secrets/__tests__/dek-cache.test.ts +0 -211
  1967. package/src/secrets/__tests__/derive-purpose-secret.test.ts +0 -52
  1968. package/src/secrets/__tests__/env-master-key-provider.test.ts +0 -119
  1969. package/src/secrets/__tests__/envelope-cipher.test.ts +0 -59
  1970. package/src/secrets/__tests__/envelope.test.ts +0 -74
  1971. package/src/secrets/__tests__/leak-guard.test.ts +0 -104
  1972. package/src/secrets/__tests__/rotation.test.ts +0 -149
  1973. package/src/secrets/dek-cache.ts +0 -137
  1974. package/src/secrets/derive-purpose-secret.ts +0 -17
  1975. package/src/secrets/env-master-key-provider.ts +0 -162
  1976. package/src/secrets/envelope-cipher.ts +0 -53
  1977. package/src/secrets/envelope.ts +0 -57
  1978. package/src/secrets/index.ts +0 -33
  1979. package/src/secrets/leak-guard.ts +0 -87
  1980. package/src/secrets/rotation.ts +0 -34
  1981. package/src/secrets/stored-envelope.ts +0 -46
  1982. package/src/seeding/__tests__/entity-seed.test.ts +0 -70
  1983. package/src/seeding/entity-seed.ts +0 -31
  1984. package/src/seeding/index.ts +0 -6
  1985. package/src/seeding/types.ts +0 -8
  1986. package/src/stack/__tests__/drain-event-consumers.integration.test.ts +0 -166
  1987. package/src/stack/__tests__/drain-jobs.integration.test.ts +0 -159
  1988. package/src/stack/__tests__/event-collector.test.ts +0 -42
  1989. package/src/stack/__tests__/ownership-boot-guard.integration.test.ts +0 -108
  1990. package/src/stack/__tests__/push-entity-projection-tables-column-sync.integration.test.ts +0 -107
  1991. package/src/stack/__tests__/request-helper.integration.test.ts +0 -140
  1992. package/src/stack/__tests__/request-helper.test.ts +0 -159
  1993. package/src/stack/__tests__/setup-test-stack-entity-tables.integration.test.ts +0 -65
  1994. package/src/stack/__tests__/setup-test-stack-jobs.integration.test.ts +0 -185
  1995. package/src/stack/__tests__/setup-test-stack-metrics.integration.test.ts +0 -79
  1996. package/src/stack/db.ts +0 -82
  1997. package/src/stack/drain-event-consumers.ts +0 -74
  1998. package/src/stack/drain-jobs.ts +0 -129
  1999. package/src/stack/event-collector.ts +0 -23
  2000. package/src/stack/index.ts +0 -34
  2001. package/src/stack/push-entity-projection-tables.ts +0 -95
  2002. package/src/stack/redis.ts +0 -55
  2003. package/src/stack/request-helper.ts +0 -298
  2004. package/src/stack/table-helpers.ts +0 -175
  2005. package/src/stack/test-stack.ts +0 -620
  2006. package/src/stack/test-users.ts +0 -37
  2007. package/src/testing/__tests__/db-cleanup.test.ts +0 -40
  2008. package/src/testing/__tests__/e2e-generator.test.ts +0 -349
  2009. package/src/testing/__tests__/ensure-entity-table.integration.test.ts +0 -52
  2010. package/src/testing/__tests__/late-bound.test.ts +0 -32
  2011. package/src/testing/__tests__/multipart-helper.test.ts +0 -49
  2012. package/src/testing/__tests__/real-providers.test.ts +0 -62
  2013. package/src/testing/__tests__/wait-for.test.ts +0 -104
  2014. package/src/testing/access-assertions.ts +0 -15
  2015. package/src/testing/assertions.ts +0 -35
  2016. package/src/testing/boot-validator-fixture.ts +0 -124
  2017. package/src/testing/closed-connection-error.ts +0 -62
  2018. package/src/testing/db-cleanup.ts +0 -45
  2019. package/src/testing/e2e-generator.ts +0 -494
  2020. package/src/testing/expect-error.ts +0 -25
  2021. package/src/testing/file-provider-contract.ts +0 -123
  2022. package/src/testing/handler-context.ts +0 -143
  2023. package/src/testing/http-cookies.ts +0 -52
  2024. package/src/testing/index.ts +0 -60
  2025. package/src/testing/late-bound.ts +0 -41
  2026. package/src/testing/multipart-helper.ts +0 -94
  2027. package/src/testing/mutable-master-key-provider.ts +0 -57
  2028. package/src/testing/observability-recorder.ts +0 -54
  2029. package/src/testing/real-providers.ts +0 -30
  2030. package/src/testing/seed.ts +0 -50
  2031. package/src/testing/shared-entities.ts +0 -65
  2032. package/src/testing/utils.ts +0 -1
  2033. package/src/testing/wait-for.ts +0 -49
  2034. package/src/testing/without-ambient-temporal.ts +0 -14
  2035. package/src/time/__tests__/boot-tz-warning.test.ts +0 -46
  2036. package/src/time/__tests__/geo-tz.test.ts +0 -71
  2037. package/src/time/__tests__/iana.test.ts +0 -35
  2038. package/src/time/__tests__/polyfill-reinstall.test.ts +0 -17
  2039. package/src/time/__tests__/polyfill.test.ts +0 -73
  2040. package/src/time/__tests__/tz-context.test.ts +0 -121
  2041. package/src/time/__tests__/tz-dateline.test.ts +0 -34
  2042. package/src/time/boot-tz-warning.ts +0 -30
  2043. package/src/time/iana.ts +0 -19
  2044. package/src/time/index.ts +0 -23
  2045. package/src/time/legacy-date.ts +0 -18
  2046. package/src/time/polyfill.ts +0 -59
  2047. package/src/time/tz-context.ts +0 -100
  2048. package/src/ui-types/__tests__/plural.test.ts +0 -108
  2049. package/src/ui-types/app-schema.ts +0 -91
  2050. package/src/ui-types/formality.ts +0 -7
  2051. package/src/ui-types/index.ts +0 -159
  2052. package/src/ui-types/list-row-meta.ts +0 -87
  2053. package/src/ui-types/plural.ts +0 -69
  2054. package/src/upgrade-cli.ts +0 -651
  2055. package/src/utils/__tests__/assert.test.ts +0 -17
  2056. package/src/utils/__tests__/case.test.ts +0 -16
  2057. package/src/utils/__tests__/compare.test.ts +0 -20
  2058. package/src/utils/__tests__/env-parse.test.ts +0 -54
  2059. package/src/utils/__tests__/ids.test.ts +0 -52
  2060. package/src/utils/__tests__/is-plain-object.test.ts +0 -16
  2061. package/src/utils/__tests__/parse-string-array-json.test.ts +0 -16
  2062. package/src/utils/__tests__/safe-json-temporal.test.ts +0 -28
  2063. package/src/utils/__tests__/safe-json.test.ts +0 -22
  2064. package/src/utils/__tests__/serialization.test.ts +0 -30
  2065. package/src/utils/assert.ts +0 -18
  2066. package/src/utils/case.ts +0 -6
  2067. package/src/utils/compare.ts +0 -10
  2068. package/src/utils/env-parse.ts +0 -16
  2069. package/src/utils/ids.ts +0 -26
  2070. package/src/utils/index.ts +0 -9
  2071. package/src/utils/is-plain-object.ts +0 -4
  2072. package/src/utils/parse-string-array-json.ts +0 -14
  2073. package/src/utils/safe-json.ts +0 -50
  2074. package/src/utils/serialization.ts +0 -14
  2075. /package/{src/engine/types/event-type-map.ts → dist/engine/types/event-type-map.d.ts} +0 -0
  2076. /package/{src/engine/types/extension-options-map.ts → dist/engine/types/extension-options-map.d.ts} +0 -0
  2077. /package/{src/engine/types/http-route.ts → dist/engine/types/http-route.d.ts} +0 -0
  2078. /package/{src/engine/types/identifiers.ts → dist/engine/types/identifiers.d.ts} +0 -0
  2079. /package/{src/engine/types/relations.ts → dist/engine/types/relations.d.ts} +0 -0
  2080. /package/{src/engine/types/target-ref.ts → dist/engine/types/target-ref.d.ts} +0 -0
  2081. /package/{src/engine/types/tree-node.ts → dist/engine/types/tree-node.d.ts} +0 -0
  2082. /package/{src/logging/types.ts → dist/logging/types.d.ts} +0 -0
  2083. /package/{src/observability/types/index.ts → dist/observability/types/index.d.ts} +0 -0
  2084. /package/{src/observability/types/metric.ts → dist/observability/types/metric.d.ts} +0 -0
  2085. /package/{src/observability/types/provider.ts → dist/observability/types/provider.d.ts} +0 -0
  2086. /package/{src/observability/types/span.ts → dist/observability/types/span.d.ts} +0 -0
  2087. /package/{src/search/types.ts → dist/search/types.d.ts} +0 -0
  2088. /package/{src/secrets/types.ts → dist/secrets/types.js} +0 -0
  2089. /package/{src/time/geo-tz.ts → dist/time/geo-tz.d.ts} +0 -0
package/src/api/server.ts DELETED
@@ -1,1550 +0,0 @@
1
- import { Hono, type MiddlewareHandler } from "hono";
2
- import { ROLES } from "../auth/roles";
3
- import type { DbConnection, PgClient } from "../db/connection";
4
- import { createDerivativesContext } from "../derivatives/derivatives-context";
5
- import { buildAppSchema } from "../engine/build-app-schema";
6
- import { EXT_FILE_PROVIDER, EXT_PRINCIPAL_STATUS } from "../engine/extension-names";
7
- import { projectAppSchemaForRoles } from "../engine/project-app-schema-for-roles";
8
- import { runsInLane } from "../engine/run-in";
9
- import { ANONYMOUS_ROLE, createAnonymousUser, createSystemUser } from "../engine/system-user";
10
- import {
11
- type AppContext,
12
- type HttpRouteMethod,
13
- isFileField,
14
- type Registry,
15
- type RunIn,
16
- type SessionUser,
17
- type TenantId,
18
- type WebSocketRouteDefinition,
19
- type WriteResult,
20
- } from "../engine/types";
21
- import { createFileContext } from "../files/file-handle";
22
- import type { FileRoutesOptions } from "../files/file-routes";
23
- import { createFileRoutes, readFilesRouteOptions } from "../files/file-routes";
24
- import { makeFileProviderResolver } from "../files/provider-resolver";
25
- import type { Lifecycle } from "../lifecycle";
26
- import { createFallbackLogger } from "../logging";
27
- import {
28
- createNoopProvider,
29
- DEFAULT_SENSITIVE_CONFIG,
30
- mergeSensitiveConfig,
31
- type ObservabilityOptions,
32
- type ObservabilityProvider,
33
- registerStandardMetrics,
34
- wrapRedisClient,
35
- } from "../observability";
36
- import { resolveTenantLifecyclePlugin } from "../pipeline/active-membership";
37
- import type { DispatcherOptions } from "../pipeline/dispatcher";
38
- import { createDispatcher, type Dispatcher } from "../pipeline/dispatcher";
39
- import { SHARED_INSTANCE_SENTINEL } from "../pipeline/event-consumer-state";
40
- import type { EventDedup } from "../pipeline/event-dedup";
41
- import type { EventConsumer, EventDispatcher } from "../pipeline/event-dispatcher";
42
- import { createEventDispatcher } from "../pipeline/event-dispatcher";
43
- import { createLifecycleHooks, type SystemHooks } from "../pipeline/lifecycle-pipeline";
44
- import { createMultiStreamApplyContext } from "../pipeline/multi-stream-apply-context";
45
- import {
46
- createAccessInvalidationEventConsumer,
47
- createJobTriggerEventConsumer,
48
- createSearchEventConsumer,
49
- createSseBroadcastEventConsumer,
50
- } from "../pipeline/system-hooks";
51
- import {
52
- type AuthEndpointRateLimitOptions,
53
- authEndpointRateLimit,
54
- createRateLimitResolver,
55
- type GlobalIpRateLimitOptions,
56
- globalIpRateLimit,
57
- } from "../rate-limit";
58
- import { deriveSearchAdapterConfig } from "../search/derive-search-adapter-config";
59
- import type { SearchAdapter } from "../search/types";
60
- import type { AppSchema } from "../ui-types/app-schema";
61
- import { assertUnreachable, generateId } from "../utils";
62
- import { NO_ROUTE_MATCH_HEADER_NAME, PUBLIC_API_PATHS, Routes } from "./api-constants";
63
- import {
64
- type AnonymousAccessResolved,
65
- type AuthSessionChecker,
66
- authMiddleware,
67
- getAuthTokenExpiry,
68
- getUser,
69
- type TenantLifecycleStatusResolver,
70
- } from "./auth-middleware";
71
- import { type AuthRoutesConfig, createAuthRoutes, type LoginRateLimiter } from "./auth-routes";
72
- import {
73
- assertValidTrustedProxyHops,
74
- type ClientIpResolver,
75
- clientIpSourceFromHonoContext,
76
- createClientIpResolver,
77
- } from "./client-ip";
78
- import { csrfMiddleware } from "./csrf-middleware";
79
- import {
80
- type ExtraRouteDefinition,
81
- ExtraRouteEntries,
82
- type ExtraRouteEntry,
83
- ExtraRouteRejection,
84
- type SystemDispatchArgs,
85
- } from "./extra-route";
86
- import { computeStrongEtag, etagMatches } from "./http-cache";
87
- import { createJwtHelper, type JwtHelper, type JwtKeyring } from "./jwt";
88
- import { observabilityMiddleware } from "./observability-middleware";
89
- import {
90
- assertOriginGuardConfig,
91
- isWebSocketOriginAllowed,
92
- normalizeOrigin,
93
- originMiddleware,
94
- rejectOrigin,
95
- } from "./origin-middleware";
96
- import { patRouteGuard } from "./pat-route-guard";
97
- import { piiCiphertextResponseGuard } from "./pii-leak-guard";
98
- import { createDefaultSseBroker, type RedisSseBroker } from "./redis-sse-broker";
99
- import { type RequestContextData, requestContext } from "./request-context";
100
- import { buildRequestContextData, requestIdMiddleware } from "./request-id-middleware";
101
- import {
102
- DEFAULT_MAX_REQUEST_BYTES,
103
- registerBodyLimit,
104
- registerHealthRoutes,
105
- registerMetricsRoute,
106
- registerVersionRoute,
107
- } from "./route-registrars";
108
- import { createApiRoutes } from "./routes";
109
- import type { SseBroker } from "./sse-broker";
110
- import { createSseRoute } from "./sse-route";
111
- import {
112
- buildWebSocketSessionRevalidator,
113
- createWebSocketConnectionLimiter,
114
- hasWebSocketUpgradeServer,
115
- isWebSocketUpgradeRequest,
116
- WEBSOCKET_DEFAULT_MAX_CONNECTIONS_PER_USER,
117
- WEBSOCKET_DEFAULT_MAX_MESSAGE_BYTES,
118
- type WebSocketConnectionLimiter,
119
- } from "./websocket-route";
120
-
121
- export type ServerOptions = {
122
- registry: Registry;
123
- context: AppContext;
124
- jwtSecret: string | JwtKeyring;
125
- jwtIssuer?: string;
126
- // JWT lifetime in seconds. Explicit always wins. When omitted, the default
127
- // depends on `auth.sessionChecker`: wired (revocation possible) keeps the
128
- // long-lived 24h default; unwired (stateless JWTs, no revocation) drops to
129
- // 1h so a leaked stateless token has a much smaller exposure window.
130
- jwtTtl?: number;
131
- dispatcherOptions?: Omit<DispatcherOptions, "lifecycle">;
132
- systemHooks?: SystemHooks;
133
- eventDedup?: EventDedup;
134
- sseBroker?: SseBroker;
135
- auth?: AuthRoutesConfig;
136
- // Number of trusted reverse-proxy hops for client-IP resolution — feeds
137
- // requestIdMiddleware's `ip`, the L1/L2
138
- // rate-limit middleware below, and createAuthRoutes. Wins over the
139
- // deprecated `auth.trustedProxyHops`. Default 0 = trust no proxy header,
140
- // only the socket address (or "unknown") counts — see client-ip.ts.
141
- trustedProxyHops?: number;
142
- // No `files` option: file-storage is wired by mounting `file-foundation` +
143
- // a `file-provider-*` feature. Upload routes, ctx.files and the GDPR jobs
144
- // resolve the provider per-tenant through that single source (issue #608).
145
- // Upload-route policy (accessGuard/privilegedRoles/maxUploadSize) lives on
146
- // `createFilesFeature(opts?)`.
147
- // Async event-dispatcher config. The dispatcher is created automatically
148
- // when (a) context.db is a DbConnection AND (b) at least one consumer is
149
- // wired — SSE (iff sseBroker), Search (iff context.searchAdapter), or
150
- // feature-level r.multiStreamProjection consumers.
151
- //
152
- // Mirrors the old outboxPoller contract: `KumikoServer.eventDispatcher` is
153
- // created but NOT auto-started. Production boot must call `.start()`;
154
- // shutdown must call `.stop()`. Tests prefer `.runOnce()` for determinism
155
- // and skip `.start()` entirely.
156
- eventDispatcher?: {
157
- pollIntervalMs?: number;
158
- batchSize?: number;
159
- maxAttempts?: number;
160
- rearmCooldownMs?: number;
161
- maxRearmCount?: number;
162
- // Opt out of building the dispatcher even if consumers exist — e.g. ops
163
- // runs a dedicated dispatcher process, or a test needs to control the
164
- // consumer lifecycle manually.
165
- disabled?: boolean;
166
- // Opt out of the auto-built system consumers (SSE, Search, Job-Trigger)
167
- // while still running feature r.multiStreamProjection consumers. Useful
168
- // for tests that assert only on subscriber behaviour, or for a
169
- // deployment that routes SSE via a different transport. Default: sse/
170
- // search enabled when the respective dependency (sseBroker /
171
- // context.searchAdapter) is available; jobTrigger enabled when a
172
- // jobRunner is wired via dispatcherOptions.
173
- systemConsumers?: {
174
- sse?: boolean;
175
- search?: boolean;
176
- jobTrigger?: boolean;
177
- accessInvalidation?: boolean;
178
- };
179
- // Raw postgres.js client for LISTEN/NOTIFY wake-up (Sprint E.4). When
180
- // present, `.start()` subscribes to EVENTS_PUBSUB_CHANNEL — delivery
181
- // latency drops from pollIntervalMs to TCP-round-trip. The poll timer
182
- // stays on as a safety net. Typically wired from
183
- // `createDbConnection(url).client` so both Drizzle-queries and the
184
- // dispatcher share the same underlying postgres.js pool.
185
- pgClient?: PgClient;
186
- };
187
- // Observability: tracer + meter used for auto-instrumentation across
188
- // HTTP, dispatcher, pipeline, DB. Omitted => NoopProvider (zero overhead,
189
- // no spans or metrics emitted). Typically set to a ConsoleProvider in dev,
190
- // OTLPProvider in prod.
191
- observability?: ObservabilityProvider;
192
- observabilityOptions?: ObservabilityOptions;
193
- // L1/L2 rate-limit middleware. Both layers share the auto-wired
194
- // resolver (or `context.rateLimit` if you provided one). Layers are
195
- // independent — wire only what you need:
196
- // - `global`: gates every /api/* request by client IP. Use behind
197
- // Cloudflare-less deployments to absorb naive floods at the edge
198
- // of the app process.
199
- // - `auth`: gates a single path-pattern (default `/api/auth/*`)
200
- // with tighter limits. Typically `limit: 5, windowSeconds: 60`
201
- // to slow brute-force without breaking real users. GET /api/auth/tenants
202
- // (session read, called on every page load) is always exempt — see
203
- // AUTH_RATE_LIMIT_EXEMPT_ROUTES in api-constants.ts.
204
- // Both omitted → no L1/L2 wired and no resolver auto-built unless an
205
- // L3 handler declared `rateLimit:`. This keeps zero-cost when unused.
206
- rateLimit?: {
207
- readonly global?: Omit<GlobalIpRateLimitOptions, "resolver">;
208
- readonly auth?: Omit<AuthEndpointRateLimitOptions, "resolver"> & {
209
- // Path-pattern the L2 middleware applies to. Default `/api/auth/*`.
210
- // Override for apps with a different auth route layout. The
211
- // GET /api/auth/tenants exemption above applies regardless of `path`.
212
- readonly path?: string;
213
- };
214
- };
215
- // Hard cap on JSON request bodies in bytes. Applied to /api/write,
216
- // /api/batch, /api/query, /api/command and /api/auth/*. File uploads
217
- // (/api/files) are excluded — those have their own per-field maxSize.
218
- // `undefined` → 1 MB default. `0` disables the limit entirely (tests
219
- // or bespoke deployments with a reverse-proxy that caps upstream).
220
- maxRequestBytes?: number;
221
- // SSE heartbeat interval for POST /api/stream (ms). Omit → framework default.
222
- // Tune down behind proxies with aggressive idle timeouts.
223
- sseHeartbeatMs?: number;
224
- // Process lifecycle. When present:
225
- // - GET /health/ready reflects lifecycle.state() (200 ready / 503 else)
226
- // - eventDispatcher.stop() is auto-registered as a shutdown hook, so
227
- // lifecycle.drain() tears the poller down without the caller wiring it
228
- // Production main.ts passes `createLifecycle()`; tests that don't care
229
- // about drain() orchestration omit this and /health/ready stays absent.
230
- lifecycle?: Lifecycle;
231
- // Prometheus-scrape endpoint. When set, `/metrics` returns the current
232
- // accumulated metric state in OpenMetrics text format. Requires the
233
- // configured `observability` to use a PrometheusMeter (duck-typed via
234
- // the `snapshot` method) — otherwise the route returns 503 with a
235
- // note about misconfiguration. The optional `token` enforces
236
- // `Authorization: Bearer <token>`; without a token set the endpoint
237
- // is open (fine inside a private cluster, dangerous on the public
238
- // internet). Omit this option entirely to skip the route.
239
- metrics?: {
240
- readonly token?: string;
241
- readonly path?: string; // default "/metrics"
242
- };
243
- // /health/ready depth. When lifecycle is wired, the readiness handler
244
- // ALSO runs dependency checks before returning 200:
245
- // - DB ping (auto-wired when context.db is a DbConnection)
246
- // - Redis PING (auto-wired when context.redis is set)
247
- // - Dispatcher consumer-lag (opt-in via maxDispatcherLag — off by default
248
- // because a default threshold would false-503 small deployments that
249
- // legitimately lag during bursts)
250
- // Checks run in parallel with a per-check timeout; any failed check drops
251
- // the probe to 503 with a JSON body listing which check failed.
252
- readiness?: {
253
- readonly timeoutMs?: number;
254
- readonly maxDispatcherLag?: bigint;
255
- };
256
- // Which deploy-lane this process runs — drives MSP-consumer filtering.
257
- // "api": picks up MSPs with runIn in {api, both}.
258
- // "worker": picks up MSPs with runIn in {worker, both, undefined (default)}.
259
- // "both": all-in-one, no filtering — every MSP runs here.
260
- // When omitted, defaults to "worker" — preserves pre-Welle-2.6 behaviour
261
- // (every MSP runs on the single dispatcher, wherever it lives).
262
- processLane?: RunIn;
263
- // Stable identifier for THIS process in the event-consumer state table.
264
- // Used as the `instance_id` on every per-instance consumer's cursor row
265
- // (Welle 2.7). Shared consumers ignore this and always write the reserved
266
- // sentinel. Default: `process.env.KUMIKO_INSTANCE_ID ?? generateId()`
267
- // — a fresh UUID at boot is fine for single-process deploys, but
268
- // multi-instance deploys SHOULD set KUMIKO_INSTANCE_ID to a stable
269
- // identifier (pod name, hostname) so ops can correlate lag metrics to
270
- // specific instances and can DELETE stale rows on scale-down. Must never
271
- // equal the sentinel; validator fails boot if it does.
272
- instanceId?: string;
273
- // Opt-in: serve unauthenticated requests on handlers that allow
274
- // roles=["anonymous"]. When omitted, every /api/* request still requires
275
- // a valid JWT (status quo). App-facing config is AnonymousAccessConfig
276
- // (defaultTenantId only); run{Prod,Dev}App merge auth-foundation tenant
277
- // providers into AnonymousAccessResolved before calling buildServer.
278
- anonymousAccess?: AnonymousAccessResolved;
279
- // Declarative HTTP routes outside the /api/write|query|batch pipeline that
280
- // still need the framework's dispatcher (webhooks, OAuth callbacks, admin
281
- // escape-hatches). Each entry declares its access tier (`entry`) up
282
- // front — buildServer wires the matching guard + deps, no handler gets a
283
- // raw db/redis. Mounted right after the r.httpRoute loop, before
284
- // registerVersionRoute (kumiko-framework#3050).
285
- extraRoutes?: readonly ExtraRouteDefinition[];
286
- };
287
-
288
- export type KumikoServer = {
289
- app: Hono;
290
- jwt: JwtHelper;
291
- sseBroker: SseBroker;
292
- observability: ObservabilityProvider;
293
- // The command-dispatcher behind /api/* — same idempotency/jobRunner/
294
- // lifecycle wiring as HTTP-dispatched writes. For dispatching outside
295
- // the HTTP pipeline, e.g. provider-webhook routes that authenticate
296
- // via signature instead of JWT (subscription-stripe et al.).
297
- dispatcher: Dispatcher;
298
- // Present when at least one consumer is wired and context.db is a
299
- // DbConnection. Caller owns the lifecycle: `.start()` in boot, `.stop()`
300
- // in shutdown. Tests drain via `.runOnce()` instead.
301
- eventDispatcher?: EventDispatcher;
302
- // Echoed back so the caller has a single handle for both the app and the
303
- // lifecycle. Only set when the caller passed one in.
304
- lifecycle?: Lifecycle;
305
- // The AppContext every handler on this server sees — options.context plus
306
- // what buildServer wires onto it (_fileProviderResolver, rateLimit, the
307
- // observability tracer/meter). Callers that build a second consumer of the
308
- // same registry outside this server (a dev-server's job-runners) must pass
309
- // THIS, not their own pre-buildServer literal, or that consumer reaches for
310
- // fields only the request path has (#1232).
311
- context: AppContext;
312
- };
313
-
314
- // The per-tenant file-provider resolver, built once for a registry+context so
315
- // a job-runner and the server it runs beside share one instance (and one
316
- // per-tenant provider cache). Mirrors buildServer's own resolution exactly —
317
- // including NOT inventing a resolver when no `file-provider-*` plugin is
318
- // mounted, which is what keeps buildServer's boot-guard below able to fire.
319
- export function withFileProviderResolver(registry: Registry, context: AppContext): AppContext {
320
- if (context._fileProviderResolver !== undefined) return context;
321
- if (registry.getExtensionUsages(EXT_FILE_PROVIDER).length === 0) return context;
322
- return {
323
- ...context,
324
- _fileProviderResolver: makeFileProviderResolver({
325
- registry,
326
- _configAccessorFactory: context._configAccessorFactory,
327
- secrets: context.secrets,
328
- db: context.db,
329
- }),
330
- };
331
- }
332
-
333
- export function buildServer(options: ServerOptions): KumikoServer {
334
- // Single effective hop-count for every IP-derived rate-limit + requestMeta
335
- // below — the top-level option wins over the deprecated
336
- // `auth.trustedProxyHops` fallback.
337
- const trustedProxyHops = options.trustedProxyHops ?? options.auth?.trustedProxyHops ?? 0;
338
- assertValidTrustedProxyHops(trustedProxyHops, "buildServer");
339
- // Exactly ONE resolver for the whole server — the warn-once flag must fire
340
- // once per boot, not once per consumer (requestIdMiddleware, L1, L2,
341
- // auth-routes each sharing this same instance rather than building a
342
- // private one).
343
- const clientIpResolver = createClientIpResolver(trustedProxyHops, "buildServer");
344
-
345
- // File-storage is resolved per-tenant through file-foundation: a mounted
346
- // `file-provider-*` plugin (inmemory/s3/s3-env) is the single source for
347
- // uploads, ctx.files and the GDPR jobs.
348
- const hasFileProvider = options.registry.getExtensionUsages(EXT_FILE_PROVIDER).length > 0;
349
- // A test/advanced caller may inject the resolver directly on the context
350
- // (e.g. a static in-memory provider) instead of mounting a provider plugin.
351
- const hasInjectedResolver = options.context._fileProviderResolver !== undefined;
352
- // Hard-fail when the registry declares file/image fields but no provider
353
- // plugin is mounted — uploads would otherwise fail at the first request
354
- // instead of at boot. Proves a plugin is mounted, not that each tenant
355
- // selected one; per-tenant misconfig surfaces via createFileProviderForTenant.
356
- if (registryDeclaresFileFields(options.registry) && !hasFileProvider && !hasInjectedResolver) {
357
- throw new Error(
358
- "Features declare file/image fields but no file-storage provider is mounted — " +
359
- "mount `file-foundation` + a `file-provider-*` feature (inmemory/s3/s3-env) and " +
360
- "select one per tenant via the 'file-foundation:config:provider' config-key.",
361
- );
362
- }
363
-
364
- // #2051 — a screen whose search box renders (kumiko-screen.tsx gates it on
365
- // `screen.searchable ?? entity-has-searchable-field`, the same condition
366
- // used below) sends `payload.search` on every query. Without a
367
- // context.searchAdapter that throws UnprocessableError at request time
368
- // (#2032) — surface the misconfig at boot instead of on the first search.
369
- // Warn, not throw: unlike missing file-storage (uploads always fail),
370
- // list screens still work without search: only the search box is broken.
371
- // Several deployed apps (offlot-app, publicstatus, kumiko-studio,
372
- // kumiko-enterprise) currently run in exactly this state.
373
- if (!options.context.searchAdapter) {
374
- const unwiredEntities = entitiesWithSearchableScreen(options.registry);
375
- if (unwiredEntities.length > 0) {
376
- console.warn(
377
- `[kumiko:boot] ${unwiredEntities.length} entit${unwiredEntities.length === 1 ? "y" : "ies"} ` +
378
- `have a searchable list screen but no SearchAdapter is wired on context.searchAdapter: ` +
379
- `${unwiredEntities.join(", ")}. Search requests against ${unwiredEntities.length === 1 ? "it" : "them"} will fail with a 422 (search_adapter_not_wired) at runtime. ` +
380
- "Wire a SearchAdapter (e.g. createMeilisearchAdapter) on context.searchAdapter, or remove `searchable: true` from the affected fields.",
381
- );
382
- }
383
- }
384
-
385
- // Stateless JWTs (no sessionChecker → no revocation) default to a shorter
386
- // TTL than session-backed ones, since a leaked stateless token can't be
387
- // revoked and stays valid until it expires. Explicit jwtTtl always wins.
388
- const defaultJwtTtl = options.auth?.sessionChecker ? 8 * 60 * 60 : 60 * 60;
389
- const jwt = createJwtHelper(
390
- options.jwtSecret,
391
- options.jwtIssuer,
392
- options.jwtTtl ?? defaultJwtTtl,
393
- );
394
- // An explicit ServerOptions.sseBroker always wins (caller owns its
395
- // lifecycle) — createDefaultSseBroker is the single decision point every
396
- // other caller must funnel through instead of picking a broker on its
397
- // own, so the REDIS_URL-gated cross-replica default (fw#2625) can't be
398
- // silently bypassed the way runProdApp bypassed it before this existed.
399
- let sseBroker: SseBroker;
400
- let ownedRedisSseBroker: RedisSseBroker | undefined;
401
- if (options.sseBroker) {
402
- sseBroker = options.sseBroker;
403
- } else {
404
- const defaults = createDefaultSseBroker();
405
- sseBroker = defaults.sseBroker;
406
- ownedRedisSseBroker = defaults.ownedRedisSseBroker;
407
- }
408
-
409
- // Resolve the per-process instance identifier. Prefer explicit
410
- // ServerOptions.instanceId (tests, deliberate wiring), fall back to the
411
- // deploy-env variable, finally a boot-time UUID. Validator rejects the
412
- // sentinel — a deliberate collision attempt would silently merge this
413
- // instance's per-instance cursors with the shared-row cursors and
414
- // deliver events twice to one shard while starving the other.
415
- const resolvedInstanceId =
416
- options.instanceId ?? process.env["KUMIKO_INSTANCE_ID"] ?? generateId();
417
- if (resolvedInstanceId === SHARED_INSTANCE_SENTINEL) {
418
- throw new Error(
419
- `ServerOptions.instanceId / KUMIKO_INSTANCE_ID cannot equal the reserved sentinel "${SHARED_INSTANCE_SENTINEL}" — ` +
420
- `pick any other stable string.`,
421
- );
422
- }
423
- // Warn when we fell back to a random UUID: the default SSE system-consumer
424
- // is delivery="per-instance", so every boot gets a fresh cursor-row in
425
- // kumiko_event_consumers. The previous boot's row stays behind on its last
426
- // cursor and pins pruneEvents (retention-guard uses MIN(lastProcessedEventId)
427
- // across all shards). Without a stable KUMIKO_INSTANCE_ID this accumulates
428
- // on every restart, not just scale-down. Silent when options.instanceId or
429
- // KUMIKO_INSTANCE_ID is explicit — those are deliberate choices (the test
430
- // suite sets KUMIKO_INSTANCE_ID="test-instance" in vitest config).
431
- const instanceIdWasRandom =
432
- options.instanceId === undefined && !process.env["KUMIKO_INSTANCE_ID"];
433
- if (instanceIdWasRandom) {
434
- console.warn(
435
- `[kumiko:boot] No ServerOptions.instanceId / KUMIKO_INSTANCE_ID set — generated a random UUID (${resolvedInstanceId}). ` +
436
- `Per-instance consumers (SSE by default) write one cursor-row per instance; without a stable id, each restart leaves an orphaned row behind and pins events-retention on its last cursor. ` +
437
- `Set KUMIKO_INSTANCE_ID to a stable value (e.g. hostname, pod name) in production.`,
438
- );
439
- }
440
-
441
- // Observability — Noop by default so no call-site needs to null-check.
442
- // Every handler/middleware that reaches for ctx.tracer / ctx.metrics gets
443
- // a working, zero-cost fallback when no provider is configured.
444
- const observability = options.observability ?? createNoopProvider();
445
-
446
- // Register framework + feature metrics once on this meter. Standard
447
- // metrics (HTTP, dispatcher, DB) are used by Auto-Instrumentation; feature
448
- // metrics come from r.metric(...) declarations collected in the registry.
449
- registerStandardMetrics(observability.meter);
450
- for (const [name, def] of options.registry.getAllMetrics()) {
451
- if (observability.meter.definitions().has(name)) continue;
452
- observability.meter.registerMetric({
453
- name,
454
- type: def.type,
455
- description: def.description,
456
- labels: def.labels,
457
- buckets: def.buckets,
458
- unit: def.unit,
459
- tenantLabel: def.tenantLabel,
460
- });
461
- }
462
-
463
- // When a non-default provider is configured, wrap the injected Redis clients
464
- // so `redis.cmd` spans attach to every command. For the default NoopProvider
465
- // we skip the proxy to keep zero runtime overhead when observability is off.
466
- const shouldWrapRedis = options.observability !== undefined;
467
- const redisCtx = options.context.redis;
468
- const wrappedRedis =
469
- shouldWrapRedis && redisCtx ? wrapRedisClient(redisCtx, observability.tracer) : redisCtx;
470
-
471
- // Inject tracer + meter into the AppContext so the dispatcher can propagate
472
- // them into every HandlerContext it builds. Build the per-tenant file-provider
473
- // resolver once (when a provider plugin is mounted) — the dispatcher uses it
474
- // to materialise `ctx.files`, the upload routes + MSP-applies share it. The
475
- // resolver reads config + the s3.secretAccessKey secret under SYSTEM identity.
476
- const contextWithFiles = withFileProviderResolver(options.registry, options.context);
477
- const fileProviderResolver = contextWithFiles._fileProviderResolver;
478
- // Auto-wire the rate-limit resolver, but ONLY when at least one
479
- // handler actually declared a rateLimit option. Apps that don't use
480
- // L3 pay zero cost: no resolver instance, no Lua-script registration
481
- // on Redis, no AppContext field. Apps that wire L1/L2 middleware can
482
- // pass `context.rateLimit` explicitly — that takes precedence over
483
- // the auto-wire (e.g. middleware-only setup without any L3 handler).
484
- // Auto-build the resolver when L3 handlers declared rateLimit OR when
485
- // the caller asked for L1/L2 middleware. Either path needs a resolver;
486
- // both share the same instance to avoid duplicate Lua-script registration.
487
- const wantsL3 = options.registry.hasRateLimitedHandler();
488
- const wantsL1L2 =
489
- options.rateLimit?.global !== undefined || options.rateLimit?.auth !== undefined;
490
- const wantsResolver = wantsL3 || wantsL1L2;
491
- const rateLimitResolver =
492
- options.context.rateLimit ??
493
- (wrappedRedis && wantsResolver ? createRateLimitResolver({ redis: wrappedRedis }) : undefined);
494
- const contextWithObservability: AppContext = {
495
- ...contextWithFiles,
496
- ...(wrappedRedis ? { redis: wrappedRedis } : {}),
497
- ...(rateLimitResolver ? { rateLimit: rateLimitResolver } : {}),
498
- // Propagate the feature-toggle resolver to the context so the event-
499
- // dispatcher (and any future context-reading consumer) sees the same
500
- // source as the command dispatcher's handler-gate. Options take
501
- // precedence over whatever was already on context — the
502
- // dispatcher-options arg is the authoritative wire-up point.
503
- ...(options.dispatcherOptions?.effectiveFeatures
504
- ? { effectiveFeatures: options.dispatcherOptions.effectiveFeatures }
505
- : {}),
506
- tracer: observability.tracer,
507
- meter: observability.meter,
508
- };
509
-
510
- const lifecycle = createLifecycleHooks(
511
- options.registry,
512
- options.systemHooks,
513
- options.eventDedup ? { eventDedup: options.eventDedup } : undefined,
514
- );
515
-
516
- const dispatcher = createDispatcher(options.registry, contextWithObservability, {
517
- ...options.dispatcherOptions,
518
- lifecycle,
519
- sseBroker,
520
- ...(options.auth ? { membershipQuery: options.auth.membershipQuery } : {}),
521
- });
522
-
523
- // Async event-dispatcher — the replacement for the old transactional
524
- // outbox. Consumer sources:
525
- // 1. System: SSE broadcast (iff sseBroker), Search index (iff
526
- // context.searchAdapter).
527
- // 2. Features: every r.multiStreamProjection registered in the registry
528
- // becomes its own consumer row with an independent cursor. The MSP
529
- // apply map is routed by event.type; apply receives the raw DbRunner
530
- // of a TX-scoped, tenant-bound DB handle so per-tenant writes stay
531
- // isolated.
532
- //
533
- // The dispatcher is built but NOT started here. Production boot code
534
- // must call `.start()`; test code typically calls `.runOnce()`.
535
- // @cast-boundary engine-bridge — context.db union narrows to DbConnection here
536
- const baseDb = contextWithObservability.db as DbConnection | undefined;
537
- // @cast-boundary engine-bridge — searchAdapter is an optional context-extension
538
- const searchAdapter = (contextWithObservability as { searchAdapter?: SearchAdapter })
539
- .searchAdapter;
540
- // Adapter is built before the registry exists (app boot order) — hand it
541
- // the registry-derived default config here so it can lazily configure
542
- // each tenant index on first access instead of requiring per-tenant app
543
- // wiring.
544
- const derivedSearchConfig = searchAdapter
545
- ? deriveSearchAdapterConfig(options.registry)
546
- : undefined;
547
- if (searchAdapter && derivedSearchConfig) {
548
- searchAdapter.setDefaultConfig?.(derivedSearchConfig);
549
- }
550
-
551
- const sseConsumerEnabled = options.eventDispatcher?.systemConsumers?.sse ?? true;
552
- const searchConsumerEnabled = options.eventDispatcher?.systemConsumers?.search ?? true;
553
- const jobTriggerConsumerEnabled = options.eventDispatcher?.systemConsumers?.jobTrigger ?? true;
554
- const jobRunnerForTriggers = options.dispatcherOptions?.jobRunner;
555
-
556
- const systemConsumers: EventConsumer[] = [];
557
- if (sseConsumerEnabled) {
558
- systemConsumers.push(createSseBroadcastEventConsumer(sseBroker));
559
- }
560
- if (searchConsumerEnabled && searchAdapter) {
561
- systemConsumers.push(createSearchEventConsumer(searchAdapter, options.registry));
562
- }
563
- if (jobTriggerConsumerEnabled && jobRunnerForTriggers) {
564
- systemConsumers.push(createJobTriggerEventConsumer(jobRunnerForTriggers, options.registry));
565
- }
566
- // Default ON (#1524 global-by-default). Tests that opt out of SSE via
567
- // systemConsumers.accessInvalidation=false (test-stack mirrors sse off)
568
- // skip the row so retention prune suites are not blocked by a lagging
569
- // cursor=0 consumer they never drain.
570
- const accessInvalidationEnabled =
571
- options.eventDispatcher?.systemConsumers?.accessInvalidation ?? true;
572
- if (accessInvalidationEnabled) {
573
- systemConsumers.push(createAccessInvalidationEventConsumer(sseBroker));
574
- }
575
-
576
- // MultiStreamProjections: one EventConsumer per MSP. Handler routes by
577
- // event.type into the MSP's apply map. MSPs aggregate cross-aggregate but
578
- // still within one tenant by default — the applier receives the plain
579
- // baseDb DbRunner; tenant consistency comes from the triggering event's
580
- // own tenantId, not a per-event TenantDb scope.
581
- //
582
- // Lane-filter (Welle 2.6.b): MSPs declare `runIn` to pin them to a
583
- // deploy-lane. An MSP with `runIn: "api"` won't be wired into the
584
- // worker-process dispatcher (and vice versa). `runIn: "both"` (or the
585
- // legacy undefined default of "worker") runs wherever a dispatcher is
586
- // started — SKIP LOCKED on the consumer-cursor handles the race between
587
- // processes that both want the same event.
588
- const processLane: RunIn = options.processLane ?? "worker";
589
- const mspDefs = [...options.registry.getAllMultiStreamProjections().values()].filter((msp) =>
590
- runsInLane(msp.runIn, processLane),
591
- );
592
- const mspConsumers: EventConsumer[] = mspDefs.map((msp) => ({
593
- name: msp.name,
594
- // Feature-toggle gating: carry the owning feature so the event-dispatcher
595
- // can pause this consumer when the feature is globally disabled. Events
596
- // queue up in the store and replay cleanly from the same cursor on resume.
597
- ...(options.registry.getMultiStreamProjectionFeature(msp.name) && {
598
- featureName: options.registry.getMultiStreamProjectionFeature(msp.name) as string, // @cast-boundary engine-bridge
599
- }),
600
- // Copy the continuous-lifecycle error policy straight onto the consumer.
601
- // Rebuild uses its own policy (rebuildProjection reads msp.errorMode.rebuild
602
- // directly); steady-state delivery runs through this consumer.
603
- ...(msp.errorMode?.continuous && { errorPolicy: msp.errorMode.continuous }),
604
- // Carry the MSP's declared delivery semantic through to the consumer.
605
- // Default (shared) is applied inside event-dispatcher, so omitting when
606
- // the MSP didn't declare one keeps the existing behaviour.
607
- ...(msp.delivery && { delivery: msp.delivery }),
608
- // Carry the MSP's declared cursor-seed through to the consumer. Default
609
- // (beginning) is applied inside insertConsumerIfAbsent.
610
- ...(msp.startFrom && { startFrom: msp.startFrom }),
611
- handler: async (event, ctx) => {
612
- const applyFn = msp.apply[event.type];
613
- // skip: this MSP doesn't care about this event type — fast path,
614
- // every event type passes through every MSP consumer exactly once.
615
- if (!applyFn) return;
616
- if (!baseDb) {
617
- // skip: no baseDb wired — allConsumers.length > 0 + baseDb check
618
- // above gates dispatcher creation, so we won't reach here in
619
- // production. Defensive return for the type-narrowing path.
620
- return;
621
- }
622
- // Saga/process-manager ctx: apply can call ctx.appendEvent to cascade
623
- // a follow-up event onto another aggregate. Uses the triggering event's
624
- // tenantId + userId so the causal chain stays tenant-consistent.
625
- // MSP qualified names are "<feature>:projection:<short>" — the
626
- // prefix before the first ":" owns the MSP. Used to reject
627
- // cross-feature ctx.appendEvent calls at emit-site.
628
- const mspOwner = msp.name.split(":")[0];
629
- const mspFiles = fileProviderResolver
630
- ? createFileContext(() => fileProviderResolver(event.tenantId))
631
- : undefined;
632
- const applyCtx = createMultiStreamApplyContext({
633
- registry: options.registry,
634
- db: baseDb,
635
- tenantId: event.tenantId,
636
- userId: event.metadata.userId,
637
- ...(mspOwner && { callerFeature: mspOwner }),
638
- ...(mspFiles && { files: mspFiles }),
639
- ...(contextWithObservability.secrets && { secrets: contextWithObservability.secrets }),
640
- ...(mspFiles && {
641
- derivatives: createDerivativesContext({
642
- files: mspFiles,
643
- registry: options.registry,
644
- db: baseDb,
645
- tenantId: event.tenantId,
646
- }),
647
- }),
648
- });
649
- await applyFn(event, baseDb, applyCtx);
650
- // Keep ctx reachable to satisfy the EventConsumerHandler signature.
651
- void ctx;
652
- },
653
- }));
654
-
655
- const allConsumers = [...systemConsumers, ...mspConsumers];
656
- const {
657
- disabled: dispatcherDisabled,
658
- systemConsumers: _systemConsumersOpt,
659
- ...dispatcherTunables
660
- } = options.eventDispatcher ?? {};
661
- let eventDispatcher: EventDispatcher | undefined;
662
- if (allConsumers.length > 0 && baseDb && !dispatcherDisabled) {
663
- eventDispatcher = createEventDispatcher({
664
- db: baseDb,
665
- consumers: allConsumers,
666
- context: contextWithObservability,
667
- tracer: observability.tracer,
668
- meter: observability.meter,
669
- instanceId: resolvedInstanceId,
670
- ...dispatcherTunables,
671
- });
672
- }
673
-
674
- // Wire the event-dispatcher shutdown into the lifecycle so the caller
675
- // doesn't have to know the dispatcher exists. Hooks drain LIFO, so this
676
- // runs before anything registered later by the caller (e.g. DB pool close).
677
- if (options.lifecycle && eventDispatcher) {
678
- const dispatcher = eventDispatcher;
679
- options.lifecycle.registerShutdownHook("eventDispatcher", async () => {
680
- await dispatcher.stop();
681
- });
682
- }
683
-
684
- // Same reasoning, scoped to the broker this function created itself — an
685
- // app-injected sseBroker (options.sseBroker) owns its own teardown.
686
- if (options.lifecycle && ownedRedisSseBroker) {
687
- const broker = ownedRedisSseBroker;
688
- options.lifecycle.registerShutdownHook("redisSseBroker", async () => {
689
- await broker.close();
690
- });
691
- }
692
-
693
- const app = new Hono();
694
-
695
- // Only entry:"signature" bypasses jwtGuard (verify() authenticates
696
- // itself); entry:"anonymous" still needs the anonymousAccess fallthrough
697
- // (tenant-by-host), entry:"user" needs c.get("user") populated.
698
- const extraRoutePublicMatchers = compileExtraRoutePublicMatchers(options.extraRoutes);
699
- const isExtraRoutePublicPath = (c: import("hono").Context): boolean =>
700
- extraRoutePublicMatchers.some((m) => m.method === c.req.method && m.pattern.test(c.req.path));
701
-
702
- const sensitiveConfig = mergeSensitiveConfig(
703
- options.observabilityOptions?.sensitiveFilter ?? DEFAULT_SENSITIVE_CONFIG,
704
- );
705
-
706
- registerHealthRoutes(app, {
707
- lifecycle: options.lifecycle,
708
- readiness: {
709
- db: baseDb,
710
- redis: options.context.redis,
711
- consumers: allConsumers,
712
- ...(options.readiness ?? {}),
713
- },
714
- });
715
-
716
- if (options.metrics) {
717
- registerMetricsRoute(app, observability.meter, options.metrics);
718
- }
719
-
720
- app.use("/api/*", requestIdMiddleware({ resolver: clientIpResolver }));
721
-
722
- // Cap JSON bodies before rate-limit/auth/observability even run. Header-
723
- // check is O(1); oversized requests never allocate memory for a full body
724
- // parse. Upload route keeps its own per-field maxSize.
725
- registerBodyLimit(app, options.maxRequestBytes ?? DEFAULT_MAX_REQUEST_BYTES);
726
-
727
- // L1/L2 rate-limit middleware run BEFORE auth so an unauthenticated
728
- // flood can't even reach the JWT-verify code path. Wired only when
729
- // the caller passed `rateLimit.global` or `rateLimit.auth`. The
730
- // resolver is the auto-wired one (or `context.rateLimit` if set);
731
- // boot-fails loudly when the caller asked for middleware without a
732
- // working Redis to back it.
733
- if (wantsL1L2) {
734
- if (!rateLimitResolver) {
735
- throw new Error(
736
- "rateLimit middleware requested but no resolver available — pass `context.redis` " +
737
- "or `context.rateLimit` so the resolver can be built.",
738
- );
739
- }
740
- if (options.rateLimit?.global) {
741
- app.use(
742
- "/api/*",
743
- globalIpRateLimit({
744
- ...options.rateLimit.global,
745
- resolver: rateLimitResolver,
746
- clientIpResolver,
747
- }),
748
- );
749
- }
750
- if (options.rateLimit?.auth) {
751
- const { path: l2Path = "/api/auth/*", ...l2Opts } = options.rateLimit.auth;
752
- app.use(
753
- l2Path,
754
- authEndpointRateLimit({ ...l2Opts, resolver: rateLimitResolver, clientIpResolver }),
755
- );
756
- }
757
- }
758
- // Observability span wraps everything that follows (auth, routes).
759
- // Must come AFTER request-id (so span can carry the id) and BEFORE auth
760
- // (so auth-verify can be a child span once we instrument it in v2).
761
- app.use(
762
- "/api/*",
763
- observabilityMiddleware({
764
- tracer: observability.tracer,
765
- meter: observability.meter,
766
- sensitiveConfig,
767
- }),
768
- );
769
-
770
- // Tripwire: a kumiko-pii: ciphertext in a JSON response is always a bug
771
- // (raw read leaked past a decrypt) — dev fails loud, prod redacts (#820).
772
- app.use("/api/*", piiCiphertextResponseGuard());
773
-
774
- // Auth middleware skips public paths (login, health) — those routes need
775
- // to be callable without a valid JWT. Every other /api/* request requires
776
- // a token (or, when anonymousAccess is wired, falls through as anonymous).
777
- // A session-checker is forwarded when the auth-config wires one, so the
778
- // middleware can reject revoked sids on every request.
779
- // Mounting a tenantLifecycleStatus provider is what turns the 410 on, so no
780
- // entrypoint can forget the wiring; `??` short-circuits, so an explicit
781
- // auth.resolveTenantLifecycleStatus remains the override.
782
- const tenantLifecycleResolver =
783
- options.auth?.resolveTenantLifecycleStatus ??
784
- deriveTenantLifecycleResolver(options.registry, baseDb);
785
- // sessionOnlyGuard deliberately does NOT get this — its callers have no
786
- // anonymousAccess fallback, so a foreign-origin cookie there must keep
787
- // failing through the sibling originMiddleware 403.
788
- const normalizedForeignCookieOrigins = options.auth?.allowedOrigins?.length
789
- ? new Set(options.auth.allowedOrigins.map(normalizeOrigin))
790
- : undefined;
791
- const jwtGuard = authMiddleware(jwt, {
792
- ...(options.auth?.sessionChecker ? { sessionChecker: options.auth.sessionChecker } : {}),
793
- ...(options.auth?.tokenVerifier ? { tokenVerifier: options.auth.tokenVerifier } : {}),
794
- ...(tenantLifecycleResolver ? { resolveTenantLifecycleStatus: tenantLifecycleResolver } : {}),
795
- ...(options.anonymousAccess ? { anonymousAccess: options.anonymousAccess } : {}),
796
- ...(normalizedForeignCookieOrigins
797
- ? { foreignCookieOrigins: normalizedForeignCookieOrigins }
798
- : {}),
799
- });
800
- app.use("/api/*", async (c, next) => {
801
- if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
802
- return jwtGuard(c, next);
803
- });
804
-
805
- // Fail-closed PAT scoping: a PAT-authenticated caller (user.pat set by
806
- // jwtGuard's tokenVerifier above) may only reach the dispatcher routes —
807
- // everywhere else on /api/* is off-limits regardless of granted scopes.
808
- const patRouteGuardMiddleware = patRouteGuard();
809
- app.use("/api/*", async (c, next) => {
810
- if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
811
- return patRouteGuardMiddleware(c, next);
812
- });
813
-
814
- // Without anonymousAccess a missing token 401s instead of falling through as anonymous.
815
- const sessionOnlyGuard = authMiddleware(jwt, {
816
- ...(options.auth?.sessionChecker ? { sessionChecker: options.auth.sessionChecker } : {}),
817
- ...(options.auth?.tokenVerifier ? { tokenVerifier: options.auth.tokenVerifier } : {}),
818
- ...(tenantLifecycleResolver ? { resolveTenantLifecycleStatus: tenantLifecycleResolver } : {}),
819
- });
820
-
821
- // PAT rate limiting — runs AFTER the auth guard so the resolved principal is
822
- // available. Only PAT-authenticated requests are counted (keyed by token id);
823
- // cookie/JWT users pass through untouched. In-memory limiter is per-instance
824
- // (see run-prod-app) — a multi-node deployment wanting a shared counter swaps
825
- // in a Redis-backed LoginRateLimiter.
826
- const patRateLimiter = options.auth?.patRateLimiter;
827
- const patRateLimitGuard = patRateLimiter ? buildPatRateLimitGuard(patRateLimiter) : undefined;
828
- if (patRateLimitGuard) {
829
- app.use("/api/*", async (c, next) => {
830
- if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
831
- return patRateLimitGuard(c, next);
832
- });
833
- }
834
-
835
- // Origin-allowlist guard — additional CSRF-hardening for deployments that
836
- // widen the auth cookie across subdomains (auth.cookieDomain). Registered
837
- // only when allowedOrigins is non-empty, with the same /api/* + public-skip
838
- // scope as the CSRF guard and BEFORE it, so a disallowed cross-site POST
839
- // surfaces as `origin_not_allowed` rather than `csrf_token_mismatch`. Fails
840
- // closed (assertOriginGuardConfig throws) when a wide cookieDomain is set
841
- // without an allowlist and without an explicit opt-out — that config is the
842
- // unguarded-subdomain-XSS footgun, not a warn-and-continue case.
843
- assertOriginGuardConfig(options.auth);
844
- const allowedOrigins = options.auth?.allowedOrigins;
845
- const originGuard =
846
- allowedOrigins && allowedOrigins.length > 0 ? originMiddleware(allowedOrigins) : undefined;
847
- if (originGuard) {
848
- app.use("/api/*", async (c, next) => {
849
- if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
850
- return originGuard(c, next);
851
- });
852
- }
853
-
854
- // Double-submit CSRF guard — runs only on cookie-authenticated,
855
- // state-changing requests (POST/PUT/PATCH/DELETE). The guard reads the
856
- // authTransport flag set by authMiddleware, so public paths (no auth)
857
- // and bearer-authenticated paths (no cookie vector) fall straight
858
- // through. Must be registered AFTER the auth middleware above so the
859
- // flag is populated; registered for the same scope so /api/* routes
860
- // are covered uniformly.
861
- const csrfGuard = csrfMiddleware();
862
- app.use("/api/*", async (c, next) => {
863
- if (PUBLIC_API_PATHS.has(c.req.path) || isExtraRoutePublicPath(c)) return next();
864
- return csrfGuard(c, next);
865
- });
866
-
867
- // Same order as /api/* above: auth → PAT route scope → PAT rate-limit → origin → CSRF.
868
- const sessionOnlyHttpRouteGuards: readonly MiddlewareHandler[] = [
869
- sessionOnlyGuard,
870
- patRouteGuardMiddleware,
871
- ...(patRateLimitGuard ? [patRateLimitGuard] : []),
872
- ...(originGuard ? [originGuard] : []),
873
- csrfGuard,
874
- ];
875
-
876
- // Public auth routes (login) need to be registered BEFORE the generic
877
- // api routes so Hono matches them first.
878
- if (options.auth) {
879
- // A membershipQuery handler is registered but nothing fulfils
880
- // principalStatus — surface that misconfig at boot instead of an InternalError on first login/switch-tenant.
881
- if (
882
- options.registry.getQueryHandler(options.auth.membershipQuery) &&
883
- options.registry.getExtensionUsages(EXT_PRINCIPAL_STATUS).length === 0
884
- ) {
885
- throw new Error(
886
- `[kumiko] auth membershipQuery "${options.auth.membershipQuery}" is registered but no feature ` +
887
- 'provides the "principalStatus" contract — mount the user feature (tenant switch and sign-in ' +
888
- "need it to reject blocked principals).",
889
- );
890
- }
891
- app.route(
892
- "/api",
893
- createAuthRoutes(dispatcher, jwt, { ...options.auth, resolver: clientIpResolver }),
894
- );
895
- }
896
- app.route(
897
- "/api",
898
- createApiRoutes(dispatcher, {
899
- ...(options.sseHeartbeatMs !== undefined ? { sseHeartbeatMs: options.sseHeartbeatMs } : {}),
900
- }),
901
- );
902
- app.route("/api", createSseRoute(sseBroker));
903
-
904
- // GET /api/schema — the only way a client obtains the AppSchema. Behind
905
- // jwtGuard (NON_PUBLIC_API_PATHS), so anonymousAccess's synthesised user
906
- // also gets rejected below — the schema never reaches an unauthenticated
907
- // caller. The FULL schema is built lazily once — the registry is
908
- // immutable for this server's lifetime, so it's the same on every
909
- // request — then projected per caller-role-set (fw#3314: a role only
910
- // sees the screens/navs/workspaces/content-collections it may reach,
911
- // not the whole app's schema) and cached per role key. Tenant is
912
- // deliberately NOT part of the key: the projection depends only on
913
- // roles, and per-tenant caching would grow unboundedly across tenants
914
- // that share the same role set.
915
- let fullSchema: AppSchema | undefined;
916
- const projectedSchemaCache = new Map<string, { readonly json: string; readonly etag: string }>();
917
- app.get(`/api${Routes.schema}`, (c) => {
918
- const user = getUser(c);
919
- if (isMissingOrAnonymousUser(user)) {
920
- return unauthenticatedResponse(c);
921
- }
922
- const roleKey = JSON.stringify([...new Set(user?.roles ?? [])].sort());
923
- let cached = projectedSchemaCache.get(roleKey);
924
- if (cached === undefined) {
925
- if (fullSchema === undefined) {
926
- fullSchema = buildAppSchema(options.registry, {
927
- searchAdapterMissing: !options.context.searchAdapter,
928
- });
929
- }
930
- const projected = projectAppSchemaForRoles(fullSchema, user?.roles ?? []);
931
- const json = JSON.stringify(projected);
932
- cached = { json, etag: computeStrongEtag(json) };
933
- projectedSchemaCache.set(roleKey, cached);
934
- }
935
- const cacheHeaders = { "Cache-Control": "private, no-cache", ETag: cached.etag };
936
- if (etagMatches(c.req.header("If-None-Match") ?? null, cached.etag)) {
937
- return c.body(null, 304, cacheHeaders);
938
- }
939
- return c.body(cached.json, 200, {
940
- "Content-Type": "application/json; charset=utf-8",
941
- ...cacheHeaders,
942
- });
943
- });
944
-
945
- // Mount upload/download routes whenever a file provider is resolvable (a
946
- // file-provider plugin is mounted, or a resolver was injected). They resolve
947
- // the provider per-tenant through file-foundation — no `files` option; route
948
- // policy comes from createFilesFeature(opts?). Gating on the resolver (not on
949
- // declared file fields) keeps unattached uploads working and matches the old
950
- // "files option present → routes" behavior.
951
- if (fileProviderResolver) {
952
- const fileDb = options.context.db as FileRoutesOptions["db"]; // @cast-boundary engine-bridge
953
- if (!fileDb) throw new Error("file routes require db in context");
954
- const routeOptions = readFilesRouteOptions(options.registry);
955
- app.route(
956
- "/api",
957
- createFileRoutes({
958
- db: fileDb,
959
- registry: options.registry,
960
- resolveProvider: fileProviderResolver,
961
- ...(routeOptions.accessGuard ? { accessGuard: routeOptions.accessGuard } : {}),
962
- ...(routeOptions.privilegedRoles ? { privilegedRoles: routeOptions.privilegedRoles } : {}),
963
- ...(routeOptions.maxUploadSize ? { maxUploadSize: routeOptions.maxUploadSize } : {}),
964
- }),
965
- );
966
- }
967
-
968
- // Feature-deklarierte HTTP-Routes (r.httpRoute). Mount nach /api/* damit
969
- // /api/* immer Vorrang hat — feature-Routes liegen ohnehin außerhalb
970
- // (Boot-Validator blockt /api-Prefix). deps.app ist die Outer-App, sodass
971
- // der Handler /api/query intern via app.fetch(...) nutzen kann (gleicher
972
- // Auth-Pfad wie ein echter HTTP-Call). deps.systemQuery umgeht diesen
973
- // Pfad bewusst — für Routes die einen FESTEN Tenant erzwingen müssen
974
- // (z.B. legal-pages → immer SYSTEM_TENANT_ID), statt ihn per X-Tenant-
975
- // Header vorzutäuschen (das sieht für die anonymousAccess-Auflösung
976
- // wie ein normaler Client-Header aus und wird von resolverTrust:
977
- // "authoritative"-Configs zurecht als Tenant-Override abgelehnt).
978
- for (const feature of options.registry.features.values()) {
979
- for (const route of Object.values(feature.httpRoutes)) {
980
- // @wrapper-known semantic-alias
981
- const honoHandler = async (c: import("hono").Context): Promise<Response> =>
982
- route.handler(c, {
983
- app,
984
- // createAnonymousUser, NOT createSystemUser: systemQuery's
985
- // synthesized user must clear the SAME access gate a real
986
- // anonymous visitor would, no more — regardless of the route's
987
- // own `anonymous` mode. The system role would ALSO satisfy that
988
- // gate here, but it can read fields gated to "system" that
989
- // "anonymous" can't (filterReadFields is a plain role-in-map
990
- // check) — a systemQuery caller reading a system-gated field
991
- // would leak it into the response. The forced tenant already
992
- // comes from bypassing the HTTP layer entirely; no elevated
993
- // role is needed or wanted on top of that.
994
- systemQuery: makeSystemQuery(c, dispatcher, clientIpResolver),
995
- clientIp: clientIpResolver.resolve(clientIpSourceFromHonoContext(c)),
996
- });
997
- mountHonoRoute(
998
- app,
999
- route.method,
1000
- route.path,
1001
- honoHandler,
1002
- route.anonymous ? [] : sessionOnlyHttpRouteGuards,
1003
- );
1004
- }
1005
- }
1006
-
1007
- // r.webSocketRoute — GET routes under /api/ws/*, so the jwt/pat/rate-limit
1008
- // chain above already ran. Origin/CSRF guards skip GETs, hence the own check.
1009
- const webSocketOriginAllowlist = allowedOrigins?.length
1010
- ? new Set(allowedOrigins.map(normalizeOrigin))
1011
- : undefined;
1012
- const webSocketRoutePaths = new Map<string, string>();
1013
- const webSocketConnectionLimiter = createWebSocketConnectionLimiter();
1014
- for (const feature of options.registry.features.values()) {
1015
- for (const route of Object.values(feature.webSocketRoutes)) {
1016
- const owner = webSocketRoutePaths.get(route.path);
1017
- if (owner !== undefined) {
1018
- throw new Error(
1019
- `[kumiko] WebSocket route "${route.path}" is declared by both feature "${owner}" and ` +
1020
- `"${feature.name}" — paths must be unique across features.`,
1021
- );
1022
- }
1023
- webSocketRoutePaths.set(route.path, feature.name);
1024
- app.get(
1025
- route.path,
1026
- buildWebSocketRouteHandler(route, {
1027
- dispatcher,
1028
- clientIpResolver,
1029
- originAllowlist: webSocketOriginAllowlist,
1030
- ...(options.auth?.sessionChecker ? { sessionChecker: options.auth.sessionChecker } : {}),
1031
- ...(tenantLifecycleResolver
1032
- ? { resolveTenantLifecycleStatus: tenantLifecycleResolver }
1033
- : {}),
1034
- connectionLimiter: webSocketConnectionLimiter,
1035
- }),
1036
- );
1037
- }
1038
- }
1039
-
1040
- // extraRoutes (kumiko-framework#3050) — declarative HTTP-routes with a
1041
- // Pflicht `entry` tier. Mounted after r.httpRoute for the same reason: an
1042
- // extraRoute dispatching through `dispatcher` builds Hono's matcher, so
1043
- // this must run before any seed that also dispatches (runProdApp/
1044
- // createKumikoServer call buildServer before seeding).
1045
- if (options.extraRoutes) {
1046
- // Boot-time validation for the whole list BEFORE mounting anything —
1047
- // an app with one bad route should fail loud at boot, not mount N-1
1048
- // routes and then throw on route N.
1049
- for (const route of options.extraRoutes) {
1050
- if (!isKnownExtraRouteEntry(route.entry)) {
1051
- throw new Error(
1052
- `[kumiko] extraRoutes: unknown entry "${String(route.entry)}" on ` +
1053
- `"${route.method} ${route.path}" — expected "anonymous" | "user" | "signature". ` +
1054
- "A JS caller without the ExtraRouteDefinition type can hit this at boot.",
1055
- );
1056
- }
1057
- if (route.entry === ExtraRouteEntries.user && !route.path.startsWith("/api/")) {
1058
- throw new Error(
1059
- `[kumiko] extraRoutes: entry:"user" route "${route.method} ${route.path}" must be ` +
1060
- "mounted under \"/api/\" — that's the only path prefix that rides the framework's " +
1061
- "jwtGuard chain, which is what populates deps.user.",
1062
- );
1063
- }
1064
- // A signature route under /api/ skips jwtGuard/origin/csrf for every
1065
- // path its pattern matches — a wildcard would switch off auth for
1066
- // unrelated /api/* handlers (e.g. "/api/*" swallows /api/write).
1067
- if (
1068
- route.entry === ExtraRouteEntries.signature &&
1069
- route.path.startsWith("/api/") &&
1070
- route.path.includes("*")
1071
- ) {
1072
- throw new Error(
1073
- `[kumiko] extraRoutes: entry:"signature" route "${route.method} ${route.path}" must not ` +
1074
- 'use a wildcard under "/api/" — it would bypass the auth chain for every matching path.',
1075
- );
1076
- }
1077
- }
1078
- const dispatchSystemWrite = makeDispatchSystemWrite(dispatcher);
1079
- const dispatchSystemQuery = makeDispatchSystemQuery(dispatcher);
1080
- for (const route of options.extraRoutes) {
1081
- const honoHandler = buildExtraRouteHonoHandler(route, {
1082
- app,
1083
- dispatcher,
1084
- registry: options.registry,
1085
- secrets: contextWithObservability.secrets,
1086
- dispatchSystemWrite,
1087
- dispatchSystemQuery,
1088
- clientIpResolver,
1089
- });
1090
- mountHonoRoute(app, route.method, route.path, honoHandler);
1091
- }
1092
- }
1093
-
1094
- // /version-Default registriert NACH feature-routes — Hono "first match
1095
- // wins", also gewinnt feature-deklariertes /version (z.B. App-spezifisches
1096
- // version-format mit Tenant-Stats) wenn vorhanden, sonst greift der
1097
- // Default-Handler aus BUILD_VERSION/BUILD_TIME-env-vars.
1098
- registerVersionRoute(app);
1099
-
1100
- // Marks "no route matched this path" so tryHonoFirst (server-runtime)
1101
- // can tell it apart from a matched route's OWN deliberate 404 (e.g.
1102
- // default-deny reads like file-derivatives' public-variant route) —
1103
- // without this, tryHonoFirst's only signal was the status code, and a
1104
- // matched route answering 404 got silently rewritten to the SPA shell
1105
- // with status 200 (kumiko-framework#2435). Must be the LAST thing wired
1106
- // on `app`: this only fires when the router found no handler at all, so
1107
- // a route's own `c.text(..., 404)` never passes through here. A handler
1108
- // that calls `c.notFound()` instead of building its own Response DOES
1109
- // route through this same handler and stays indistinguishable from a
1110
- // routing miss — pre-existing Hono semantics, not something this fix
1111
- // changes; deliberate 404s must build their own Response.
1112
- // The header is an internal signal only — tryHonoFirst and every direct
1113
- // app.fetch() passthrough strip it before a response reaches a client.
1114
- app.notFound((c) => c.text("Not Found", 404, { [NO_ROUTE_MATCH_HEADER_NAME]: "1" }));
1115
-
1116
- return {
1117
- app,
1118
- jwt,
1119
- sseBroker,
1120
- observability,
1121
- dispatcher,
1122
- context: contextWithObservability,
1123
- ...(eventDispatcher ? { eventDispatcher } : {}),
1124
- ...(options.lifecycle ? { lifecycle: options.lifecycle } : {}),
1125
- };
1126
- }
1127
-
1128
- // Method-switch shared by r.httpRoute and extraRoutes — one place to keep
1129
- // the two mounting paths from drifting on which Hono methods get a
1130
- // convenience-call vs. app.on().
1131
- function mountHonoRoute(
1132
- app: Hono,
1133
- method: HttpRouteMethod,
1134
- path: string,
1135
- // biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
1136
- handler: (c: import("hono").Context<any, any>) => Response | Promise<Response>,
1137
- middlewares: readonly MiddlewareHandler[] = [],
1138
- ): void {
1139
- // Guards go into the route's own handler chain, never a method-gated
1140
- // app.use: Hono serves HEAD through the GET route with c.req.method still
1141
- // "HEAD", so a `method === c.req.method` gate would skip them for HEAD.
1142
- if (middlewares.length > 0) {
1143
- // [path]: only Hono's array-path overload accepts a variable-length handler spread.
1144
- app.on(method, [path], ...middlewares, handler);
1145
- // skip: guarded route already mounted with its guard chain
1146
- return;
1147
- }
1148
- switch (method) {
1149
- case "GET":
1150
- app.get(path, handler);
1151
- break;
1152
- case "POST":
1153
- app.post(path, handler);
1154
- break;
1155
- case "PUT":
1156
- app.put(path, handler);
1157
- break;
1158
- case "PATCH":
1159
- app.patch(path, handler);
1160
- break;
1161
- case "DELETE":
1162
- app.delete(path, handler);
1163
- break;
1164
- case "OPTIONS":
1165
- case "HEAD":
1166
- // Hono's on() for the methods without a convenience method.
1167
- app.on(method, path, handler);
1168
- break;
1169
- default:
1170
- assertUnreachable(method, "http method");
1171
- }
1172
- }
1173
-
1174
- // Must run after the auth guard so getUser(c) carries the PAT.
1175
- function buildPatRateLimitGuard(patRateLimiter: LoginRateLimiter): MiddlewareHandler {
1176
- return async (c, next) => {
1177
- const pat = getUser(c)?.pat;
1178
- if (pat && !(await patRateLimiter.check(pat.tokenId))) {
1179
- return c.json(
1180
- {
1181
- error: {
1182
- code: "pat_rate_limited",
1183
- httpStatus: 429,
1184
- message: "personal access token rate limit exceeded",
1185
- i18nKey: "auth.errors.patRateLimited",
1186
- },
1187
- },
1188
- 429,
1189
- );
1190
- }
1191
- return next();
1192
- };
1193
- }
1194
-
1195
- // Shared systemQuery builder for r.httpRoute and extraRoutes (anonymous +
1196
- // signature entries). requestContext.run must wrap the dispatcher call —
1197
- // both route kinds run outside the requestIdMiddleware chain that normally
1198
- // populates it, and `rateLimit: {per: "ip", ...}` on a handler invoked
1199
- // through systemQuery is otherwise silent dead-code (enforceRateLimit reads
1200
- // requestContext.get()?.ip, undefined without this wrap).
1201
- function makeSystemQuery(
1202
- // biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
1203
- c: import("hono").Context<any, any>,
1204
- dispatcher: Dispatcher,
1205
- clientIpResolver?: ClientIpResolver,
1206
- ): (type: string, payload: unknown, tenantId: TenantId) => Promise<unknown> {
1207
- return (type, payload, tenantId) =>
1208
- requestContext.run(requestContext.get() ?? buildRequestContextData(c, clientIpResolver), () =>
1209
- dispatcher.query(type, payload, createAnonymousUser(tenantId)),
1210
- );
1211
- }
1212
-
1213
- // SystemAdmin write/query builders shared by buildServer's `extraRoutes`
1214
- // mount and server-runtime's `wire` hook (runProdApp/createKumikoServer,
1215
- // after buildServer). Privilege-scope: SystemAdmin is the highest
1216
- // non-tenant-scoped role — reaches ANY SystemAdmin-gated handler on ANY
1217
- // tenant. Only safe for callers that already proved their own authenticity
1218
- // (signature verify(), HMAC state, ...), never exposed to a raw request.
1219
- export function makeDispatchSystemWrite(
1220
- dispatcher: Dispatcher,
1221
- ): (args: SystemDispatchArgs) => Promise<WriteResult> {
1222
- return ({ handlerQn, payload, tenantId }) =>
1223
- dispatcher.write(handlerQn, payload, createSystemUser(tenantId, [ROLES.SystemAdmin]));
1224
- }
1225
-
1226
- export function makeDispatchSystemQuery(
1227
- dispatcher: Dispatcher,
1228
- ): (args: SystemDispatchArgs) => Promise<unknown> {
1229
- return ({ handlerQn, payload, tenantId }) =>
1230
- dispatcher.query(handlerQn, payload, createSystemUser(tenantId, [ROLES.SystemAdmin]));
1231
- }
1232
-
1233
- // Same dispatcher.write(...) as entry:"user", but the user is getUser(c) —
1234
- // see AnonymousExtraRouteDeps.write for the privilege/tenant contract.
1235
- function makeAnonymousWrite(
1236
- // biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
1237
- c: import("hono").Context<any, any>,
1238
- dispatcher: Dispatcher,
1239
- ): (type: string, payload: unknown) => Promise<WriteResult> {
1240
- return (type, payload) => {
1241
- const user = getUser(c);
1242
- if (!user) {
1243
- throw new Error(
1244
- '[kumiko] extraRoutes: entry:"anonymous" deps.write requires this route to be mounted ' +
1245
- 'under "/api/" with anonymousAccess wired — no request-resolved session user was found.',
1246
- );
1247
- }
1248
- return dispatcher.write(type, payload, user);
1249
- };
1250
- }
1251
-
1252
- // Shared by entry:"user" extra routes and GET /api/schema — both require a
1253
- // real, signed-in principal and reject the synthesised anonymousAccess user
1254
- // (SessionUser.roles includes ANONYMOUS_ROLE) the same way.
1255
- function isMissingOrAnonymousUser(user: SessionUser | undefined): boolean {
1256
- return !user || user.roles.includes(ANONYMOUS_ROLE);
1257
- }
1258
-
1259
- function unauthenticatedResponse(c: import("hono").Context): Response {
1260
- return c.json(
1261
- {
1262
- error: {
1263
- code: "unauthenticated",
1264
- httpStatus: 401,
1265
- message: "this route requires a signed-in user",
1266
- i18nKey: "auth.errors.missingToken",
1267
- },
1268
- },
1269
- 401,
1270
- );
1271
- }
1272
-
1273
- type WebSocketRouteHandlerDeps = {
1274
- readonly dispatcher: Dispatcher;
1275
- readonly clientIpResolver: ClientIpResolver;
1276
- readonly originAllowlist: ReadonlySet<string> | undefined;
1277
- readonly sessionChecker?: AuthSessionChecker;
1278
- readonly resolveTenantLifecycleStatus?: TenantLifecycleStatusResolver;
1279
- readonly connectionLimiter: WebSocketConnectionLimiter;
1280
- };
1281
-
1282
- const webSocketLog = createFallbackLogger("websocket");
1283
-
1284
- function webSocketErrorResponse(
1285
- c: import("hono").Context,
1286
- status: 400 | 426 | 429 | 501,
1287
- code: string,
1288
- message: string,
1289
- ): Response {
1290
- return c.json({ error: { code, httpStatus: status, message } }, status);
1291
- }
1292
-
1293
- function buildWebSocketRouteHandler(
1294
- route: WebSocketRouteDefinition,
1295
- shared: WebSocketRouteHandlerDeps,
1296
- // biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
1297
- ): (c: import("hono").Context<any, any>) => Promise<Response> {
1298
- return async (c) => {
1299
- if (!isWebSocketOriginAllowed(c, shared.originAllowlist)) return rejectOrigin(c);
1300
- const user = getUser(c);
1301
- if (isMissingOrAnonymousUser(user)) return unauthenticatedResponse(c);
1302
- if (!isWebSocketUpgradeRequest(c.req.raw)) {
1303
- return webSocketErrorResponse(
1304
- c,
1305
- 426,
1306
- "websocket_upgrade_required",
1307
- "this route only accepts WebSocket upgrade requests",
1308
- );
1309
- }
1310
- const honoEnv: unknown = c.env;
1311
- if (!hasWebSocketUpgradeServer(honoEnv)) {
1312
- const message = "webSocketUpgradeFetch not wired: pass it to buildBunServeOptions";
1313
- webSocketLog.error(message, { path: route.path });
1314
- return webSocketErrorResponse(c, 501, "websocket_upgrade_not_wired", message);
1315
- }
1316
- // The slot is taken before connect (a refused attempt must not run it) and stays synchronous with
1317
- // the check, so concurrent upgrades can't overshoot the cap. Every path without a live socket frees it.
1318
- const releaseConnectionSlot = shared.connectionLimiter.tryAcquire(
1319
- `${route.path}\n${user.tenantId}\n${user.id}`,
1320
- route.maxConnectionsPerUser ?? WEBSOCKET_DEFAULT_MAX_CONNECTIONS_PER_USER,
1321
- );
1322
- if (!releaseConnectionSlot) {
1323
- return webSocketErrorResponse(
1324
- c,
1325
- 429,
1326
- "websocket_connection_limit",
1327
- "too many open WebSocket connections for this user",
1328
- );
1329
- }
1330
- let upgraded = false;
1331
- try {
1332
- const handlers = await route.connect(c, {
1333
- user,
1334
- query: (type, payload) => shared.dispatcher.query(type, payload, user),
1335
- write: (type, payload) => shared.dispatcher.write(type, payload, user),
1336
- clientIp: shared.clientIpResolver.resolve(clientIpSourceFromHonoContext(c)),
1337
- });
1338
- if (handlers instanceof Response) return handlers;
1339
-
1340
- const captured = requestContext.get();
1341
- const requestContextData = captured ? withoutAbortSignal(captured) : undefined;
1342
- const revalidateSession = buildWebSocketSessionRevalidator({
1343
- user,
1344
- sessionChecker: shared.sessionChecker,
1345
- resolveTenantLifecycleStatus: shared.resolveTenantLifecycleStatus,
1346
- tokenExpiresAtSec: getAuthTokenExpiry(c),
1347
- });
1348
- upgraded = honoEnv.server.upgrade(c.req.raw, {
1349
- data: {
1350
- handlers,
1351
- maxMessageBytes: route.maxMessageBytes ?? WEBSOCKET_DEFAULT_MAX_MESSAGE_BYTES,
1352
- requestContextData,
1353
- revalidateSession,
1354
- releaseConnectionSlot,
1355
- },
1356
- });
1357
- if (!upgraded) {
1358
- return webSocketErrorResponse(
1359
- c,
1360
- 400,
1361
- "websocket_upgrade_failed",
1362
- "the WebSocket upgrade was rejected",
1363
- );
1364
- }
1365
- // Bun ignores the returned Response after a successful upgrade.
1366
- return new Response(null);
1367
- } finally {
1368
- if (!upgraded) releaseConnectionSlot();
1369
- }
1370
- };
1371
- }
1372
-
1373
- // The request's AbortSignal fires when the upgrade request ends, which would
1374
- // abort every later handler running under the captured context.
1375
- function withoutAbortSignal(data: RequestContextData): RequestContextData {
1376
- const { signal: _signal, ...rest } = data;
1377
- return rest;
1378
- }
1379
-
1380
- function isKnownExtraRouteEntry(entry: unknown): entry is ExtraRouteEntry {
1381
- return (
1382
- entry === ExtraRouteEntries.anonymous ||
1383
- entry === ExtraRouteEntries.user ||
1384
- entry === ExtraRouteEntries.signature
1385
- );
1386
- }
1387
-
1388
- // Hono path pattern ("/api/foo/:bar", "/api/foo/*") → RegExp. Only the
1389
- // subset extraRoutes actually uses (static segments, `:param`, trailing
1390
- // `*`) — no inline `:param{regex}` constraints, no optional `:param?`.
1391
- function honoPathToRegex(path: string): RegExp {
1392
- const segments = path
1393
- .split("/")
1394
- .map((segment) => {
1395
- if (segment.startsWith(":")) return "[^/]+";
1396
- if (segment === "*") return ".*";
1397
- return segment.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1398
- })
1399
- .join("/");
1400
- return new RegExp(`^${segments}$`);
1401
- }
1402
-
1403
- type ExtraRoutePublicMatcher = { readonly method: string; readonly pattern: RegExp };
1404
-
1405
- // See the bypass comment at the jwtGuard mount above — only signature
1406
- // routes are public here.
1407
- function compileExtraRoutePublicMatchers(
1408
- extraRoutes: readonly ExtraRouteDefinition[] | undefined,
1409
- ): readonly ExtraRoutePublicMatcher[] {
1410
- if (!extraRoutes) return [];
1411
- return extraRoutes
1412
- .filter((route) => route.entry === ExtraRouteEntries.signature)
1413
- .map((route) => ({ method: route.method, pattern: honoPathToRegex(route.path) }));
1414
- }
1415
-
1416
- type ExtraRouteHonoHandlerDeps = {
1417
- readonly app: Hono;
1418
- readonly dispatcher: Dispatcher;
1419
- readonly registry: Registry;
1420
- readonly secrets: import("../secrets").SecretsContext | undefined;
1421
- readonly dispatchSystemWrite: (args: SystemDispatchArgs) => Promise<WriteResult>;
1422
- readonly dispatchSystemQuery: (args: SystemDispatchArgs) => Promise<unknown>;
1423
- readonly clientIpResolver: ClientIpResolver;
1424
- };
1425
-
1426
- function buildExtraRouteHonoHandler(
1427
- route: ExtraRouteDefinition,
1428
- shared: ExtraRouteHonoHandlerDeps,
1429
- // biome-ignore lint/suspicious/noExplicitAny: Hono context generics are invisible at the framework boundary
1430
- ): (c: import("hono").Context<any, any>) => Promise<Response> {
1431
- switch (route.entry) {
1432
- case ExtraRouteEntries.anonymous:
1433
- return async (c) =>
1434
- route.handler(c, {
1435
- app: shared.app,
1436
- registry: shared.registry,
1437
- systemQuery: makeSystemQuery(c, shared.dispatcher, shared.clientIpResolver),
1438
- write: makeAnonymousWrite(c, shared.dispatcher),
1439
- clientIp: shared.clientIpResolver.resolve(clientIpSourceFromHonoContext(c)),
1440
- });
1441
- case ExtraRouteEntries.user:
1442
- return async (c) => {
1443
- const user = getUser(c);
1444
- if (isMissingOrAnonymousUser(user)) {
1445
- return unauthenticatedResponse(c);
1446
- }
1447
- return route.handler(c, {
1448
- app: shared.app,
1449
- registry: shared.registry,
1450
- user,
1451
- query: (type, payload) => shared.dispatcher.query(type, payload, user),
1452
- write: (type, payload) => shared.dispatcher.write(type, payload, user),
1453
- });
1454
- };
1455
- case ExtraRouteEntries.signature:
1456
- return async (c) => {
1457
- const rawBody = await c.req.text();
1458
- const headers: Record<string, string> = {};
1459
- c.req.raw.headers.forEach((value, key) => {
1460
- headers[key.toLowerCase()] = value;
1461
- });
1462
- let verified: unknown;
1463
- try {
1464
- verified = await route.verify(
1465
- { rawBody, headers, params: c.req.param(), query: c.req.query() },
1466
- { registry: shared.registry, secrets: shared.secrets },
1467
- );
1468
- } catch (e) {
1469
- if (e instanceof ExtraRouteRejection) {
1470
- if (e.retryAfterSeconds !== undefined) {
1471
- return c.json(e.body, e.status, { "Retry-After": String(e.retryAfterSeconds) });
1472
- }
1473
- return c.json(e.body, e.status);
1474
- }
1475
- return c.json(
1476
- {
1477
- error: {
1478
- code: "extra_route_signature_invalid",
1479
- message: e instanceof Error ? e.message : String(e),
1480
- },
1481
- },
1482
- 401,
1483
- );
1484
- }
1485
- return route.handler(c, verified, {
1486
- app: shared.app,
1487
- registry: shared.registry,
1488
- secrets: shared.secrets,
1489
- systemQuery: makeSystemQuery(c, shared.dispatcher, shared.clientIpResolver),
1490
- dispatchSystemWrite: shared.dispatchSystemWrite,
1491
- dispatchSystemQuery: shared.dispatchSystemQuery,
1492
- });
1493
- };
1494
- default:
1495
- return assertUnreachable(route, "extra route entry");
1496
- }
1497
- }
1498
-
1499
- function deriveTenantLifecycleResolver(
1500
- registry: Registry,
1501
- db: DbConnection | undefined,
1502
- ): TenantLifecycleStatusResolver | undefined {
1503
- const plugin = resolveTenantLifecyclePlugin(registry, "buildServer");
1504
- if (!plugin) return undefined;
1505
- if (!db) {
1506
- throw new Error(
1507
- "[kumiko] a tenantLifecycleStatus provider is mounted (tenant-lifecycle) but context.db is " +
1508
- "missing — the request-level teardown gate needs a DbConnection. Pass context.db, or wire " +
1509
- "auth.resolveTenantLifecycleStatus explicitly.",
1510
- );
1511
- }
1512
- return (tenantId) => plugin.resolveStatus(tenantId, { db });
1513
- }
1514
-
1515
- // Scans every feature's entities for a file/image/files/images field. Short-
1516
- // circuits on the first hit — no need to build a full inventory, we only want
1517
- // the yes/no answer for the boot check.
1518
- function registryDeclaresFileFields(registry: Registry): boolean {
1519
- for (const feature of registry.features.values()) {
1520
- for (const entity of Object.values(feature.entities ?? {})) {
1521
- for (const field of Object.values(entity.fields)) {
1522
- if (isFileField(field)) return true;
1523
- }
1524
- }
1525
- }
1526
- return false;
1527
- }
1528
-
1529
- // Entities whose entityList screen WOULD render a search box based on
1530
- // screen/field config alone: `screen.searchable` wins when set, otherwise
1531
- // the box shows iff the entity has ≥1 searchable field. `screen.searchable
1532
- // === false` is excluded — the boot-validator (entity-list-screens.ts) only
1533
- // allows that on the whitelisted download-attempt-list-style screens, which
1534
- // never render the box. This is the config-only half of the rule; the
1535
- // client additionally gates on FeatureSchema.searchAdapterMissing (#2062,
1536
- // set from the same `!options.context.searchAdapter` check below) so the
1537
- // box is actually suppressed once this function finds a hit.
1538
- function entitiesWithSearchableScreen(registry: Registry): readonly string[] {
1539
- const entities = new Set<string>();
1540
- for (const feature of registry.features.values()) {
1541
- for (const screen of Object.values(feature.screens)) {
1542
- if (screen.type !== "entityList") continue;
1543
- const isSearchable =
1544
- screen.searchable === true ||
1545
- (screen.searchable === undefined && registry.getSearchableFields(screen.entity).length > 0);
1546
- if (isSearchable) entities.add(screen.entity);
1547
- }
1548
- }
1549
- return [...entities];
1550
- }