@cosmicdrift/kumiko-framework 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/README.md +9 -38
  2. package/package.json +21 -2
  3. package/src/__tests__/anonymous-access.integration.test.ts +185 -0
  4. package/src/__tests__/consumer-cli.integration.test.ts +172 -0
  5. package/src/__tests__/entity-permalink-open.integration.test.ts +94 -0
  6. package/src/__tests__/full-stack.integration.test.ts +1 -1
  7. package/src/__tests__/schema-cli-temporal-polyfill.test.ts +48 -0
  8. package/src/__tests__/schema-cli.integration.test.ts +50 -0
  9. package/src/__tests__/store-table.integration.test.ts +93 -0
  10. package/src/api/__tests__/api.test.ts +373 -0
  11. package/src/api/__tests__/auth-middleware-anonymous-access-boot.test.ts +40 -0
  12. package/src/api/__tests__/auth-routes-cookie.test.ts +17 -1
  13. package/src/api/__tests__/auth-routes-invalid-body-invite.test.ts +253 -0
  14. package/src/api/__tests__/auth-routes-mfa-preauth-confirm.test.ts +222 -0
  15. package/src/api/__tests__/auth-routes-mfa-preauth-enable-start.test.ts +249 -0
  16. package/src/api/__tests__/auth-routes-mfa-verify.test.ts +202 -0
  17. package/src/api/__tests__/auth-routes-trusted-proxy.test.ts +135 -0
  18. package/src/api/__tests__/batch.integration.test.ts +101 -11
  19. package/src/api/__tests__/csrf-constants-sync.test.ts +20 -0
  20. package/src/api/__tests__/dispatcher-live.integration.test.ts +74 -0
  21. package/src/api/__tests__/jwt.test.ts +200 -1
  22. package/src/api/__tests__/login-rate-limiter-sweep.test.ts +50 -0
  23. package/src/api/__tests__/pat-scope.test.ts +36 -0
  24. package/src/api/__tests__/pii-leak-guard.integration.test.ts +103 -0
  25. package/src/api/__tests__/redis-login-rate-limiter.integration.test.ts +138 -0
  26. package/src/api/__tests__/request-id-middleware.test.ts +51 -0
  27. package/src/api/__tests__/server-boot-guards.test.ts +71 -0
  28. package/src/api/__tests__/server-jwt-ttl.test.ts +58 -0
  29. package/src/api/__tests__/sse-broker.test.ts +57 -0
  30. package/src/api/__tests__/sse-route.test.ts +4 -0
  31. package/src/api/api-constants.ts +11 -0
  32. package/src/api/auth-middleware.ts +248 -40
  33. package/src/api/auth-routes.ts +576 -95
  34. package/src/api/index.ts +13 -4
  35. package/src/api/jwt.ts +170 -11
  36. package/src/api/pat-scope.ts +14 -0
  37. package/src/api/pii-leak-guard.ts +47 -0
  38. package/src/api/request-context.ts +3 -0
  39. package/src/api/request-id-middleware.ts +2 -0
  40. package/src/api/routes.ts +169 -2
  41. package/src/api/server.ts +112 -16
  42. package/src/api/sse-broker.ts +39 -0
  43. package/src/bun-db/__tests__/PATTERN.md +0 -1
  44. package/src/bun-db/__tests__/coerce-row-temporal.test.ts +41 -0
  45. package/src/bun-db/__tests__/select-many-retry.test.ts +79 -0
  46. package/src/bun-db/__tests__/write-brand.test.ts +21 -0
  47. package/src/bun-db/connection.ts +3 -3
  48. package/src/bun-db/index.ts +2 -0
  49. package/src/bun-db/query.ts +105 -32
  50. package/src/consumer-cli.ts +134 -0
  51. package/src/crypto/__tests__/blind-index.test.ts +130 -0
  52. package/src/crypto/__tests__/event-pii.test.ts +161 -0
  53. package/src/crypto/__tests__/kek-rotation.integration.test.ts +180 -0
  54. package/src/crypto/__tests__/kms-adapter-contract.ts +134 -0
  55. package/src/crypto/__tests__/kms-adapter.contract.test.ts +4 -0
  56. package/src/crypto/__tests__/pg-kms-adapter.integration.test.ts +117 -0
  57. package/src/crypto/__tests__/pii-field-encryption.test.ts +376 -0
  58. package/src/crypto/__tests__/request-kms-cache.test.ts +74 -0
  59. package/src/crypto/__tests__/subject-resolver.test.ts +108 -0
  60. package/src/crypto/blind-index.ts +118 -0
  61. package/src/crypto/event-pii.ts +70 -0
  62. package/src/crypto/in-memory-kms-adapter.ts +50 -0
  63. package/src/crypto/index.ts +67 -0
  64. package/src/crypto/kms-adapter.ts +2 -0
  65. package/src/crypto/pg-kms-adapter.ts +295 -0
  66. package/src/crypto/pii-field-encryption.ts +248 -0
  67. package/src/crypto/request-kms-cache.ts +38 -0
  68. package/src/crypto/subject-resolver.ts +91 -0
  69. package/src/db/__tests__/assert-no-unreachable-live-rows.integration.test.ts +191 -0
  70. package/src/db/__tests__/blind-index.integration.test.ts +248 -0
  71. package/src/db/__tests__/build-filter-where.test.ts +34 -0
  72. package/src/db/__tests__/collect-table-metas.test.ts +10 -10
  73. package/src/db/__tests__/config-seed.integration.test.ts +13 -5
  74. package/src/db/__tests__/dialect-instant.test.ts +1 -4
  75. package/src/db/__tests__/entity-field-encryption.test.ts +7 -7
  76. package/src/db/__tests__/entity-table-meta-source.test.ts +50 -0
  77. package/src/db/__tests__/event-store-executor-context.pii-roundtrip.test.ts +67 -0
  78. package/src/db/__tests__/event-store-executor-write-verbs.integration.test.ts +402 -0
  79. package/src/db/__tests__/event-store-executor.integration.test.ts +299 -29
  80. package/src/db/__tests__/feature-table-sources.test.ts +34 -0
  81. package/src/db/__tests__/implicit-projection-equivalence.integration.test.ts +118 -39
  82. package/src/db/__tests__/instant-to-driver-temporal.test.ts +21 -0
  83. package/src/db/__tests__/located-timestamp.test.ts +19 -0
  84. package/src/db/__tests__/migrate-generator.test.ts +21 -0
  85. package/src/db/__tests__/migrate-runner.test.ts +61 -0
  86. package/src/db/__tests__/number-field-fractional.integration.test.ts +58 -0
  87. package/src/db/__tests__/rebuild-marker.test.ts +13 -3
  88. package/src/db/__tests__/replay-migration-sql.test.ts +384 -0
  89. package/src/db/__tests__/schema-inspection.test.ts +7 -0
  90. package/src/db/__tests__/schema-migration.integration.test.ts +1 -1
  91. package/src/db/__tests__/table-builder-meta-lockstep.test.ts +39 -0
  92. package/src/db/__tests__/tenant-db-where-merge.test.ts +49 -3
  93. package/src/db/__tests__/tenant-db.integration.test.ts +6 -2
  94. package/src/db/api.ts +2 -2
  95. package/src/db/apply-entity-event.ts +18 -14
  96. package/src/db/blind-index-cleanup.ts +55 -0
  97. package/src/db/bun-provider.ts +2 -2
  98. package/src/db/collect-table-metas.ts +6 -7
  99. package/src/db/config-seed.ts +9 -9
  100. package/src/db/connection.ts +7 -12
  101. package/src/db/cursor.ts +1 -18
  102. package/src/db/dialect.ts +20 -26
  103. package/src/db/entity-field-encryption.ts +81 -24
  104. package/src/db/entity-table-meta-types.ts +2 -0
  105. package/src/db/entity-table-meta.ts +63 -90
  106. package/src/db/event-store-executor-context.ts +404 -0
  107. package/src/db/event-store-executor-read.ts +275 -0
  108. package/src/db/event-store-executor-write.ts +644 -0
  109. package/src/db/event-store-executor.ts +28 -1155
  110. package/src/db/feature-table-sources.ts +6 -5
  111. package/src/db/index.ts +20 -3
  112. package/src/db/located-timestamp.ts +4 -0
  113. package/src/db/migrate-generator.ts +39 -6
  114. package/src/db/migrate-runner.ts +107 -11
  115. package/src/db/pg-error.ts +9 -1
  116. package/src/db/postgres-provider.ts +2 -2
  117. package/src/db/queries/__tests__/event-store-idempotency-index.integration.test.ts +80 -0
  118. package/src/db/queries/backfill-pii.ts +277 -0
  119. package/src/db/queries/ddl.ts +45 -0
  120. package/src/db/queries/event-consumer.ts +35 -2
  121. package/src/db/queries/event-store.ts +126 -19
  122. package/src/db/queries/projection-rebuild.ts +22 -8
  123. package/src/db/queries/shadow-swap.ts +183 -0
  124. package/src/db/queries/test-stack.ts +4 -30
  125. package/src/db/query-api.ts +1 -0
  126. package/src/db/query.ts +1 -0
  127. package/src/db/rebuild-marker.ts +18 -2
  128. package/src/db/reference-data.ts +2 -3
  129. package/src/db/replay-migration-sql.ts +257 -0
  130. package/src/db/schema-inspection.ts +1 -1
  131. package/src/db/table-builder.ts +102 -71
  132. package/src/db/tenant-db.ts +15 -53
  133. package/src/engine/__tests__/boot-validator-action-wiring.test.ts +242 -0
  134. package/src/engine/__tests__/boot-validator-boot-check.test.ts +99 -0
  135. package/src/engine/__tests__/boot-validator-dashboard.test.ts +237 -0
  136. package/src/engine/__tests__/boot-validator-entity-list.test.ts +104 -0
  137. package/src/engine/__tests__/boot-validator-gdpr-storage.test.ts +7 -69
  138. package/src/engine/__tests__/boot-validator-i18n-keys.test.ts +26 -5
  139. package/src/engine/__tests__/boot-validator-located-timestamps.test.ts +3 -19
  140. package/src/engine/__tests__/boot-validator-pii-retention.test.ts +246 -4
  141. package/src/engine/__tests__/boot-validator.test.ts +219 -15
  142. package/src/engine/__tests__/build-app-schema.test.ts +82 -0
  143. package/src/engine/__tests__/build-config-feature-schema.test.ts +125 -0
  144. package/src/engine/__tests__/build-target.test.ts +3 -11
  145. package/src/engine/__tests__/codemod-pipeline.test.ts +152 -21
  146. package/src/engine/__tests__/config-helpers.test.ts +16 -0
  147. package/src/engine/__tests__/define-feature-entity-mapping.test.ts +6 -0
  148. package/src/engine/__tests__/define-roles.test.ts +21 -0
  149. package/src/engine/__tests__/engine.test.ts +163 -1
  150. package/src/engine/__tests__/entity-handlers.test.ts +80 -0
  151. package/src/engine/__tests__/event-migration-declarative.test.ts +65 -0
  152. package/src/engine/__tests__/event-type-map-augmentation.test.ts +24 -0
  153. package/src/engine/__tests__/extend-entity-projection.test.ts +123 -0
  154. package/src/engine/__tests__/factories-time.test.ts +2 -66
  155. package/src/engine/__tests__/feature-crud-shorthand.test.ts +28 -0
  156. package/src/engine/__tests__/feature-manifest.test.ts +31 -1
  157. package/src/engine/__tests__/field-access.test.ts +23 -1
  158. package/src/engine/__tests__/hook-phases.test.ts +5 -5
  159. package/src/engine/__tests__/membership-roles.test.ts +4 -10
  160. package/src/engine/__tests__/nav.test.ts +86 -1
  161. package/src/engine/__tests__/pipeline-engine.test.ts +9 -9
  162. package/src/engine/__tests__/pipeline-handler.integration.test.ts +18 -18
  163. package/src/engine/__tests__/pipeline-observability.integration.test.ts +2 -2
  164. package/src/engine/__tests__/pipeline-performance.integration.test.ts +3 -3
  165. package/src/engine/__tests__/pipeline-sub-pipelines.test.ts +9 -9
  166. package/src/engine/__tests__/post-query-hook.test.ts +7 -7
  167. package/src/engine/__tests__/registrar-object-form.test.ts +141 -0
  168. package/src/engine/__tests__/registry.test.ts +144 -0
  169. package/src/engine/__tests__/schema-builder.test.ts +18 -0
  170. package/src/engine/__tests__/screen.test.ts +147 -1
  171. package/src/engine/__tests__/soft-delete-cleanup.test.ts +3 -0
  172. package/src/engine/__tests__/store-table.test.ts +229 -0
  173. package/src/engine/__tests__/tier-resolver-extension.test.ts +19 -1
  174. package/src/engine/__tests__/{visual-tree-patterns.test.ts → tree-actions-patterns.test.ts} +7 -95
  175. package/src/engine/__tests__/validate-projection-allowlist.test.ts +15 -15
  176. package/src/engine/boot-validator/__tests__/config-deps.test.ts +92 -0
  177. package/src/engine/boot-validator/action-wiring.ts +149 -0
  178. package/src/engine/boot-validator/boot-check.ts +21 -0
  179. package/src/engine/boot-validator/config-deps.ts +40 -4
  180. package/src/engine/boot-validator/entity-handler.ts +20 -21
  181. package/src/engine/boot-validator/entity-list-screens.ts +88 -0
  182. package/src/engine/boot-validator/gdpr-storage.ts +0 -20
  183. package/src/engine/boot-validator/i18n-keys.ts +58 -4
  184. package/src/engine/boot-validator/index.ts +33 -12
  185. package/src/engine/boot-validator/nav.ts +125 -0
  186. package/src/engine/boot-validator/pii-retention.ts +95 -10
  187. package/src/engine/boot-validator/{screens-nav.ts → screens.ts} +214 -191
  188. package/src/engine/boot-validator/workspaces.ts +68 -0
  189. package/src/engine/build-app-schema.ts +16 -0
  190. package/src/engine/build-config-feature-schema.ts +44 -7
  191. package/src/engine/codemod/pipeline-codemod.ts +5 -5
  192. package/src/engine/config-helpers.ts +15 -0
  193. package/src/engine/constants.ts +32 -6
  194. package/src/engine/create-app.ts +11 -0
  195. package/src/engine/define-feature.ts +95 -947
  196. package/src/engine/define-handler.ts +28 -94
  197. package/src/engine/define-workflow.ts +1 -1
  198. package/src/engine/effective-features.ts +12 -2
  199. package/src/engine/entity-handlers.ts +76 -11
  200. package/src/engine/extensions/tenant-data.ts +19 -0
  201. package/src/engine/extensions/user-data.ts +29 -2
  202. package/src/engine/factories.ts +8 -49
  203. package/src/engine/feature-ast/__tests__/canonical-form.test.ts +26 -29
  204. package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/feature.ts +9 -0
  205. package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/screens.ts +4 -0
  206. package/src/engine/feature-ast/__tests__/parse-happy-path.test.ts +1 -2
  207. package/src/engine/feature-ast/__tests__/parse-real-features.test.ts +18 -8
  208. package/src/engine/feature-ast/__tests__/parse.test.ts +1640 -160
  209. package/src/engine/feature-ast/__tests__/patch.test.ts +206 -12
  210. package/src/engine/feature-ast/__tests__/patcher.test.ts +20 -23
  211. package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +380 -5
  212. package/src/engine/feature-ast/extractors/events.ts +322 -0
  213. package/src/engine/feature-ast/extractors/handlers.ts +234 -0
  214. package/src/engine/feature-ast/extractors/hooks.ts +243 -0
  215. package/src/engine/feature-ast/extractors/index.ts +34 -31
  216. package/src/engine/feature-ast/extractors/jobs-routes.ts +221 -0
  217. package/src/engine/feature-ast/extractors/projections-screens.ts +269 -0
  218. package/src/engine/feature-ast/extractors/round1.ts +3 -3
  219. package/src/engine/feature-ast/extractors/round5.ts +3 -3
  220. package/src/engine/feature-ast/extractors/round6.ts +2 -36
  221. package/src/engine/feature-ast/extractors/shared.ts +64 -6
  222. package/src/engine/feature-ast/index.ts +2 -4
  223. package/src/engine/feature-ast/parse.ts +130 -23
  224. package/src/engine/feature-ast/patch.ts +39 -50
  225. package/src/engine/feature-ast/patcher.ts +37 -38
  226. package/src/engine/feature-ast/patterns.ts +50 -62
  227. package/src/engine/feature-ast/render.ts +67 -44
  228. package/src/engine/feature-builder-state.ts +168 -0
  229. package/src/engine/feature-config-events-jobs.ts +403 -0
  230. package/src/engine/feature-entity-handlers.ts +208 -0
  231. package/src/engine/feature-manifest.ts +2 -1
  232. package/src/engine/feature-ui-extensions.ts +500 -0
  233. package/src/engine/field-access.ts +13 -2
  234. package/src/engine/field-helpers.ts +31 -0
  235. package/src/engine/handler-helpers.ts +26 -0
  236. package/src/engine/hook-helpers.ts +16 -0
  237. package/src/engine/index.ts +23 -7
  238. package/src/engine/membership-roles.ts +13 -0
  239. package/src/engine/object-form.ts +27 -0
  240. package/src/engine/ownership.ts +26 -79
  241. package/src/engine/pattern-library/__tests__/library.test.ts +7 -20
  242. package/src/engine/pattern-library/library.ts +44 -1152
  243. package/src/engine/pattern-library/mixed-schemas.ts +450 -0
  244. package/src/engine/pattern-library/opaque-schemas.ts +124 -0
  245. package/src/engine/pattern-library/shared-fields.ts +75 -0
  246. package/src/engine/pattern-library/static-schemas.ts +456 -0
  247. package/src/engine/pipeline.ts +6 -11
  248. package/src/engine/registry-facade.ts +362 -0
  249. package/src/engine/registry-ingest.ts +478 -0
  250. package/src/engine/registry-state.ts +388 -0
  251. package/src/engine/registry-validate.ts +642 -0
  252. package/src/engine/registry.ts +78 -1658
  253. package/src/engine/run-pipeline.ts +1 -1
  254. package/src/engine/schema-builder.ts +1 -0
  255. package/src/engine/screen-helpers.ts +54 -0
  256. package/src/engine/soft-delete-cleanup.ts +6 -2
  257. package/src/engine/steps/__tests__/duration-utils.test.ts +20 -0
  258. package/src/engine/steps/_duration-utils.ts +2 -0
  259. package/src/engine/steps/unsafe-projection-upsert.ts +1 -4
  260. package/src/engine/tier-resolver-extension.ts +3 -2
  261. package/src/engine/types/config.ts +2 -482
  262. package/src/engine/types/define-handler.ts +2 -0
  263. package/src/engine/types/entity-handlers.ts +2 -0
  264. package/src/engine/types/event-type-map.ts +1 -37
  265. package/src/engine/types/feature.ts +2 -972
  266. package/src/engine/types/fields.ts +2 -675
  267. package/src/engine/types/handlers.ts +2 -774
  268. package/src/engine/types/hooks.ts +2 -184
  269. package/src/engine/types/http-route.ts +1 -54
  270. package/src/engine/types/identifiers.ts +1 -47
  271. package/src/engine/types/index.ts +86 -40
  272. package/src/engine/types/nav.ts +2 -63
  273. package/src/engine/types/ownership.ts +2 -0
  274. package/src/engine/types/projection.ts +2 -138
  275. package/src/engine/types/relations.ts +1 -51
  276. package/src/engine/types/screen.ts +2 -574
  277. package/src/engine/types/step.ts +2 -334
  278. package/src/engine/types/target-ref.ts +1 -21
  279. package/src/engine/types/tree-node.ts +1 -132
  280. package/src/engine/types/workspace.ts +2 -49
  281. package/src/engine/validate-projection-allowlist.ts +6 -6
  282. package/src/entrypoint/__tests__/entrypoint-job-wiring.integration.test.ts +120 -1
  283. package/src/entrypoint/index.ts +49 -6
  284. package/src/errors/classes.ts +22 -1
  285. package/src/errors/field-issue.ts +0 -3
  286. package/src/errors/index.ts +1 -1
  287. package/src/errors/write-error-info.ts +10 -22
  288. package/src/es-ops/README.md +1 -1
  289. package/src/es-ops/__tests__/runner.integration.test.ts +74 -0
  290. package/src/es-ops/context.ts +4 -2
  291. package/src/es-ops/types.ts +8 -1
  292. package/src/event-store/__tests__/admin-api.integration.test.ts +27 -1
  293. package/src/event-store/__tests__/backfill-pii.integration.test.ts +279 -0
  294. package/src/event-store/__tests__/event-store.integration.test.ts +201 -0
  295. package/src/event-store/__tests__/row-to-stored-event.test.ts +2 -2
  296. package/src/event-store/__tests__/snapshot.integration.test.ts +86 -0
  297. package/src/event-store/__tests__/unscoped-stream-primitives.guard.test.ts +58 -0
  298. package/src/event-store/__tests__/upcaster.integration.test.ts +77 -45
  299. package/src/event-store/admin-api.ts +11 -4
  300. package/src/event-store/errors.ts +2 -35
  301. package/src/event-store/event-store.ts +64 -78
  302. package/src/event-store/events-schema.ts +11 -13
  303. package/src/event-store/index.ts +18 -3
  304. package/src/event-store/rebuild-dead-letter.ts +111 -0
  305. package/src/event-store/snapshot.ts +63 -40
  306. package/src/event-store/types.ts +2 -0
  307. package/src/files/__tests__/build-storage-key.test.ts +28 -0
  308. package/src/files/__tests__/file-ref-entity.test.ts +8 -0
  309. package/src/files/__tests__/files.integration.test.ts +24 -0
  310. package/src/files/__tests__/in-memory-provider.contract.test.ts +4 -0
  311. package/src/files/__tests__/local-provider.test.ts +31 -0
  312. package/src/files/__tests__/provider-resolver.test.ts +70 -0
  313. package/src/files/__tests__/write-stream.test.ts +13 -0
  314. package/src/files/file-handle.ts +2 -19
  315. package/src/files/file-ref-entity.ts +2 -2
  316. package/src/files/file-routes.ts +13 -0
  317. package/src/files/index.ts +1 -1
  318. package/src/files/local-provider.ts +27 -8
  319. package/src/files/provider-resolver.ts +31 -20
  320. package/src/files/types.ts +13 -55
  321. package/src/i18n/__tests__/required-surface-keys.test.ts +17 -0
  322. package/src/i18n/required-surface-keys.ts +120 -1
  323. package/src/jobs/__tests__/job-queue-depth.integration.test.ts +82 -0
  324. package/src/jobs/__tests__/jobs.integration.test.ts +329 -3
  325. package/src/jobs/job-runner.ts +82 -12
  326. package/src/logging/types.ts +1 -7
  327. package/src/migrations/pending-rebuilds.ts +1 -1
  328. package/src/observability/__tests__/observability.integration.test.ts +4 -1
  329. package/src/observability/__tests__/recording-tracer.test.ts +6 -4
  330. package/src/observability/index.ts +2 -0
  331. package/src/observability/noop-provider.ts +0 -9
  332. package/src/observability/recording-tracer.ts +0 -12
  333. package/src/observability/standard-metrics.ts +64 -2
  334. package/src/observability/types/index.ts +1 -29
  335. package/src/observability/types/metric.ts +1 -56
  336. package/src/observability/types/provider.ts +1 -32
  337. package/src/observability/types/span.ts +1 -64
  338. package/src/pipeline/__tests__/ctx-bridge.integration.test.ts +2 -2
  339. package/src/pipeline/__tests__/dispatcher.test.ts +366 -1
  340. package/src/pipeline/__tests__/event-consumer-state.integration.test.ts +31 -0
  341. package/src/pipeline/__tests__/event-dispatcher-delivery-max-attempts.test.ts +126 -0
  342. package/src/pipeline/__tests__/event-dispatcher-rearm.integration.test.ts +263 -0
  343. package/src/pipeline/__tests__/event-dispatcher.integration.test.ts +10 -0
  344. package/src/pipeline/__tests__/job-trigger-consumer.integration.test.ts +106 -0
  345. package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +308 -77
  346. package/src/pipeline/__tests__/load-aggregate-query.integration.test.ts +16 -8
  347. package/src/pipeline/__tests__/post-query-hook.integration.test.ts +3 -3
  348. package/src/pipeline/__tests__/projection-rebuild.integration.test.ts +80 -2
  349. package/src/pipeline/__tests__/rebuild-poison-quarantine.integration.test.ts +274 -0
  350. package/src/pipeline/__tests__/try-append-event.integration.test.ts +166 -0
  351. package/src/pipeline/dispatch-batch.ts +187 -0
  352. package/src/pipeline/dispatch-query.ts +165 -0
  353. package/src/pipeline/dispatch-shared.ts +826 -0
  354. package/src/pipeline/dispatch-stream.ts +90 -0
  355. package/src/pipeline/dispatch-write.ts +451 -0
  356. package/src/pipeline/dispatcher-utils.ts +1 -1
  357. package/src/pipeline/dispatcher.ts +44 -1372
  358. package/src/pipeline/entity-cache.ts +2 -33
  359. package/src/pipeline/event-consumer-state.ts +30 -2
  360. package/src/pipeline/event-dispatcher-admin.ts +293 -0
  361. package/src/pipeline/event-dispatcher-delivery.ts +305 -0
  362. package/src/pipeline/event-dispatcher.ts +85 -542
  363. package/src/pipeline/index.ts +2 -0
  364. package/src/pipeline/msp-rebuild.ts +42 -3
  365. package/src/pipeline/multi-stream-apply-context.ts +4 -42
  366. package/src/pipeline/projection-rebuild.ts +105 -3
  367. package/src/pipeline/system-hooks.ts +144 -1
  368. package/src/rate-limit/__tests__/resolver.integration.test.ts +18 -0
  369. package/src/rate-limit/resolver.ts +16 -32
  370. package/src/schema-cli.ts +76 -16
  371. package/src/search/__tests__/meilisearch-adapter.integration.test.ts +207 -185
  372. package/src/search/__tests__/meilisearch-ids.test.ts +30 -0
  373. package/src/search/__tests__/reindex-entity.integration.test.ts +144 -0
  374. package/src/search/index.ts +6 -0
  375. package/src/search/meilisearch-adapter.ts +13 -12
  376. package/src/search/reindex-entity.ts +177 -0
  377. package/src/search/types.ts +1 -39
  378. package/src/secrets/__tests__/contains-secret.test.ts +34 -0
  379. package/src/secrets/__tests__/envelope-cipher.test.ts +59 -0
  380. package/src/secrets/__tests__/envelope.test.ts +1 -1
  381. package/src/secrets/dek-cache.ts +26 -5
  382. package/src/secrets/envelope-cipher.ts +53 -0
  383. package/src/secrets/envelope.ts +5 -3
  384. package/src/secrets/index.ts +13 -1
  385. package/src/secrets/stored-envelope.ts +46 -0
  386. package/src/secrets/types.ts +2 -162
  387. package/src/stack/__tests__/event-collector.test.ts +42 -0
  388. package/src/stack/__tests__/setup-test-stack-jobs.integration.test.ts +125 -0
  389. package/src/stack/db.ts +2 -1
  390. package/src/stack/push-entity-projection-tables.ts +4 -3
  391. package/src/stack/redis.ts +8 -0
  392. package/src/stack/request-helper.ts +38 -2
  393. package/src/stack/table-helpers.ts +6 -4
  394. package/src/stack/test-stack.ts +249 -131
  395. package/src/testing/__tests__/late-bound.test.ts +32 -0
  396. package/src/testing/__tests__/wait-for.test.ts +59 -0
  397. package/src/testing/boot-validator-fixture.ts +121 -0
  398. package/src/testing/e2e-generator.ts +8 -0
  399. package/src/testing/file-provider-contract.ts +104 -0
  400. package/src/testing/handler-context.ts +3 -1
  401. package/src/testing/index.ts +5 -0
  402. package/src/testing/late-bound.ts +5 -3
  403. package/src/testing/mutable-master-key-provider.ts +29 -3
  404. package/src/testing/wait-for.ts +3 -0
  405. package/src/testing/without-ambient-temporal.ts +14 -0
  406. package/src/time/__tests__/tz-dateline.test.ts +8 -10
  407. package/src/time/geo-tz.ts +1 -32
  408. package/src/time/index.ts +1 -0
  409. package/src/time/legacy-date.ts +18 -0
  410. package/src/time/polyfill.ts +21 -38
  411. package/src/time/tz-context.ts +44 -85
  412. package/src/ui-types/app-schema.ts +12 -0
  413. package/src/ui-types/index.ts +20 -7
  414. package/src/utils/__tests__/safe-json-temporal.test.ts +18 -0
  415. package/src/utils/safe-json.ts +13 -1
  416. package/src/__tests__/raw-table.integration.test.ts +0 -116
  417. package/src/bun-db/__tests__/bun-test-stack.ts +0 -6
  418. package/src/db/__tests__/encryption.test.ts +0 -39
  419. package/src/db/encryption.ts +0 -39
  420. package/src/db/row-helpers.ts +0 -4
  421. package/src/engine/__tests__/raw-table.test.ts +0 -150
  422. package/src/engine/__tests__/unmanaged-table.test.ts +0 -127
  423. package/src/engine/feature-ast/__tests__/visual-tree-parse.test.ts +0 -184
  424. package/src/engine/feature-ast/extractors/round4.ts +0 -1366
@@ -6,7 +6,6 @@ export {
6
6
  validateAppCustomScreenWriteQns,
7
7
  validateBoot,
8
8
  } from "./boot-validator";
9
- export { validateExtensionPreSaveWiring } from "./boot-validator/entity-handler";
10
9
  export { type BuildAppSchemaOptions, buildAppSchema } from "./build-app-schema";
11
10
  export type { ConfigFeatureSchema } from "./build-config-feature-schema";
12
11
  export {
@@ -24,6 +23,7 @@ export {
24
23
  createTenantSeed,
25
24
  createUserConfig,
26
25
  createUserSeed,
26
+ isEncryptedAtRest,
27
27
  } from "./config-helpers";
28
28
  export type { SystemHookName } from "./constants";
29
29
  export {
@@ -42,6 +42,7 @@ export { crossTenantOverrideDenied } from "./cross-tenant";
42
42
  export { defineFeature } from "./define-feature";
43
43
  export type {
44
44
  QueryHandlerDefinition,
45
+ StreamHandlerDefinition,
45
46
  WriteHandlerDefinition,
46
47
  WriteHandlerInput,
47
48
  } from "./define-handler";
@@ -51,7 +52,7 @@ export { defineStep, getStep, listStepKinds } from "./define-step";
51
52
  export type { WorkflowDefinition, WorkflowInput, WorkflowTrigger } from "./define-workflow";
52
53
  export { computeDefinitionFingerprint, defineWorkflow } from "./define-workflow";
53
54
  export type { ToggleReader } from "./effective-features";
54
- export { computeEffectiveFeatures } from "./effective-features";
55
+ export { computeEffectiveFeatures, isToggleableFeature } from "./effective-features";
55
56
  export {
56
57
  createEntityExecutor,
57
58
  defineEntityCreateHandler,
@@ -67,6 +68,9 @@ export {
67
68
  defineEntityUpdateHandler,
68
69
  defineEntityWriteHandler,
69
70
  defineProjectionQueryHandler,
71
+ type EntityCrudRegistrar,
72
+ type RegisterEntityCrudOptions,
73
+ registerEntityCrud,
70
74
  } from "./entity-handlers";
71
75
  export type { EmitCtx } from "./event-helpers";
72
76
  export { emitEvent, typedPayload } from "./event-helpers";
@@ -82,6 +86,11 @@ export {
82
86
  EXT_USER_DATA_ORDER,
83
87
  FILE_PROVIDER_CONFIG_KEY,
84
88
  } from "./extension-names";
89
+ export type {
90
+ TenantDataDestroyHook,
91
+ TenantDataExtensionHooks,
92
+ TenantDataHookCtx,
93
+ } from "./extensions/tenant-data";
85
94
  export type {
86
95
  TenantUserModel,
87
96
  UserDataDeleteHook,
@@ -114,7 +123,6 @@ export {
114
123
  createTextField,
115
124
  createTimestampField,
116
125
  createTzField,
117
- locatedTimestamp,
118
126
  } from "./factories";
119
127
  // AST inspection + patching pipeline — used by the CLI scaffolder, the
120
128
  // Designer (C5/C6), and the AI-Builder (L2). See feature-ast/index.ts
@@ -170,15 +178,22 @@ export {
170
178
  checkWriteFieldRoles,
171
179
  filterReadFields,
172
180
  } from "./field-access";
181
+ export { resolveName, withResponseData } from "./handler-helpers";
182
+ // findForbiddenMembershipRole/isForbiddenMembershipRole/
183
+ // stripForbiddenMembershipRoles/buildSessionRoles are Public API for host
184
+ // apps that build their own membership handlers. FORBIDDEN_MEMBERSHIP_ROLES
185
+ // itself stays internal (637/3) — exporting the raw Set would make its
186
+ // representation a semver promise; the predicate functions are the intended
187
+ // surface.
173
188
  export {
174
- FORBIDDEN_MEMBERSHIP_ROLES,
189
+ buildSessionRoles,
175
190
  findForbiddenMembershipRole,
176
191
  isForbiddenMembershipRole,
177
192
  stripForbiddenMembershipRoles,
178
193
  } from "./membership-roles";
179
194
  export type { OwnershipClause, OwnershipMap, OwnershipRef, OwnershipRule } from "./ownership";
180
195
  export { from } from "./ownership";
181
- export { buildPipelineSteps, pipeline } from "./pipeline";
196
+ export { buildPipelineSteps, stepsPipeline } from "./pipeline";
182
197
  export { defineApply, defineMspApply, setFields } from "./projection-helpers";
183
198
  export type { BuiltinQnType, ParsedQn, QnType } from "./qualified-name";
184
199
  export { isValidQn, parseQn, QnTypes, qn, toKebab } from "./qualified-name";
@@ -190,6 +205,7 @@ export { runsInLane } from "./run-in";
190
205
  export type { StepListOutcome } from "./run-pipeline";
191
206
  export { runPipeline, runStepList } from "./run-pipeline";
192
207
  export { buildInsertSchema, buildUpdateSchema, fieldToZod } from "./schema-builder";
208
+ export { isExtensionEditSection, normalizeEditField, normalizeListColumn } from "./screen-helpers";
193
209
  export type { TransitionGraph } from "./state-machine";
194
210
  export { defineTransitions, guardTransition } from "./state-machine";
195
211
  export {
@@ -349,6 +365,8 @@ export type {
349
365
  SecretKeyHandle,
350
366
  SelectFieldDef,
351
367
  SessionUser,
368
+ StreamHandlerDef,
369
+ StreamHandlerFn,
352
370
  Subscribe,
353
371
  TargetRef,
354
372
  TenantId,
@@ -372,9 +390,7 @@ export type {
372
390
  WriteResult,
373
391
  } from "./types";
374
392
  export { DEFAULT_CURRENCIES, HookPhases } from "./types";
375
- export { resolveName, withResponseData } from "./types/handlers";
376
393
  export { isSystemTenant, parseTenantId, SYSTEM_TENANT_ID } from "./types/identifiers";
377
- export { isExtensionEditSection, normalizeEditField, normalizeListColumn } from "./types/screen";
378
394
  export type {
379
395
  PipelineBuildCtx,
380
396
  PipelineCtx,
@@ -30,3 +30,16 @@ export function findForbiddenMembershipRole(roles: readonly string[]): string |
30
30
  export function stripForbiddenMembershipRoles(roles: readonly string[]): readonly string[] {
31
31
  return roles.filter((role) => !isForbiddenMembershipRole(role));
32
32
  }
33
+
34
+ // Single mint path for session roles: merges globalRoles with the stripped
35
+ // membership portion and dedupes. Every place that builds a session's roles
36
+ // from a membership should go through this instead of repeating
37
+ // `new Set([...globalRoles, ...stripForbiddenMembershipRoles(x)])` — a new
38
+ // mint site that forgets the strip is exactly the bug class this guards
39
+ // against.
40
+ export function buildSessionRoles(
41
+ globalRoles: readonly string[],
42
+ membershipRoles: readonly string[],
43
+ ): readonly string[] {
44
+ return Array.from(new Set([...globalRoles, ...stripForbiddenMembershipRoles(membershipRoles)]));
45
+ }
@@ -0,0 +1,27 @@
1
+ // Shared helper for registrar methods that accept an Object-Form call
2
+ // (`r.entity({ name: "item", ... })`) alongside the classic positional form
3
+ // (`r.entity("item", { ... })`). Object-Form is the shape the feature-ast
4
+ // renderer emits for Designer/AI-generated code — a single object argument
5
+ // with named fields is easier to generate correctly than positional args
6
+ // whose count/order vary per method.
7
+ export function splitNamedDefinition<T extends { readonly name: string }>(
8
+ definition: T,
9
+ ): [string, Omit<T, "name">] {
10
+ const { name, ...rest } = definition;
11
+ return [name, rest];
12
+ }
13
+
14
+ // Shared helper for registrar methods that accept either variadic strings
15
+ // (hand-written call sites) or a single Object-Form object wrapping the
16
+ // same string array under `key` (the feature-ast renderer's canonical
17
+ // shape for Designer/AI-generated code).
18
+ export function unwrapArrayForm<K extends string>(
19
+ args: readonly [Record<K, readonly string[]>] | readonly string[],
20
+ key: K,
21
+ ): readonly string[] {
22
+ const [first] = args;
23
+ if (typeof first === "object" && first !== null && key in first) {
24
+ return (first as Record<K, readonly string[]>)[key];
25
+ }
26
+ return args as readonly string[];
27
+ }
@@ -17,67 +17,35 @@
17
17
  // Construction: use the `from(ref, column?)` helper. It returns a FromRule
18
18
  // ready to drop into an access map.
19
19
 
20
+ import {
21
+ KUMIKO_COLUMNS_SYMBOL,
22
+ KUMIKO_NAME_SYMBOL,
23
+ } from "@cosmicdrift/kumiko-types/schema-table-types";
20
24
  import { toSnakeCase } from "../db/table-builder";
21
25
  import type { SessionUser } from "./types";
22
26
 
23
- // Parameterised SQL fragment produced by buildOwnershipClause + by the
24
- // WhereRule escape-hatch. Caller weaves `sqlText` into a larger statement,
25
- // renumbering placeholders if needed (FragmentBuilder below).
26
- export type SqlFragment = {
27
- readonly sqlText: string;
28
- readonly params: readonly unknown[];
29
- };
30
-
31
- // Reference spec supported by `from()`:
32
- // "user:id" → user.id
33
- // "user:tenantId" → user.tenantId (rarely needed — TenantDb scopes anyway)
34
- // "claim:<featureName>:<key>" → user.claims["<featureName>:<key>"]
35
- //
36
- // The string form is keyed so the framework can look up the referenced
37
- // Registry entry at boot (Claim-QN exists? Column type compatible?). A typed
38
- // object form would force features to import each other's handles — the
39
- // whole point of H.2's unified path is string-based references, no imports.
40
- export type OwnershipRef = string;
41
-
42
- // Resolved during `from()` — the parser eagerly splits the prefix so the
43
- // runtime evaluator avoids string-parsing on every row. `kind` drives the
44
- // evaluator branch; the rest is the resolved metadata.
45
- export type FromRuleKind = "user" | "claim";
46
-
47
- export type FromRule = {
48
- readonly kind: "from";
49
- readonly refKind: FromRuleKind;
50
- // For "user:id" → "id"; for "user:tenantId" → "tenantId".
51
- // For "claim:<featureName>:<key>" → "<featureName>:<key>" (the full QN,
52
- // which is exactly the key under which the JWT stores the value).
53
- readonly refPath: string;
54
- // Row-column to match against. For claim rules defaults to the claim's
55
- // shortName (second segment of the claim QN). For user-rules the column
56
- // is always explicit.
57
- readonly column: string;
58
- };
59
-
60
- // Context passed to a WhereRule escape-hatch. The author returns a SqlFragment
61
- // whose placeholders start at `paramStart` ($N, $N+1, ...); the framework
62
- // concatenates the fragment into the larger query.
63
- export type WhereRuleContext<TTable = unknown> = {
64
- readonly table: TTable;
65
- readonly tableName: string;
66
- readonly paramStart: number;
67
- };
68
-
69
- export type WhereRule<TTable = unknown> = {
70
- readonly kind: "where";
71
- readonly where: (user: SessionUser, ctx: WhereRuleContext<TTable>) => SqlFragment;
72
- };
73
-
74
- // "all" collapses to a primitive so map authors can write `Admin: "all"`
75
- // without importing a helper.
76
- export type OwnershipRule = "all" | FromRule | WhereRule;
77
-
78
- // Per-role map: every key is a role name, value is the rule that role
79
- // satisfies to pass the access check.
80
- export type OwnershipMap = Readonly<Record<string, OwnershipRule>>;
27
+ // Types live in engine/types/ownership.ts (no runtime dependency); re-exported
28
+ // here for backwards compatibility with existing importers of this file.
29
+ export type {
30
+ FromRule,
31
+ FromRuleKind,
32
+ OwnershipClause,
33
+ OwnershipMap,
34
+ OwnershipRef,
35
+ OwnershipRule,
36
+ SqlFragment,
37
+ WhereRule,
38
+ WhereRuleContext,
39
+ } from "./types/ownership";
40
+
41
+ import type {
42
+ FromRule,
43
+ OwnershipClause,
44
+ OwnershipMap,
45
+ OwnershipRef,
46
+ OwnershipRule,
47
+ SqlFragment,
48
+ } from "./types/ownership";
81
49
 
82
50
  // Parse an OwnershipRef into kind + resolved path + default column.
83
51
  // Throws on malformed input so the error surfaces at `from()`-call-site (in
@@ -254,30 +222,9 @@ export function userCanCreateFieldRow(
254
222
  return false;
255
223
  }
256
224
 
257
- // Result of buildOwnershipClause. The discriminant lets the caller handle
258
- // the three outcomes without inspecting SQL internals:
259
- //
260
- // "pass" → user is unrestricted. Run the query as-is.
261
- // "empty" → user has a role mapped but no rule accepts any row (missing
262
- // claim, empty array, role not in map). Skip the DB call entirely
263
- // — returning [] is equivalent and avoids a pointless roundtrip.
264
- // "sql" → apply the parameterised fragment as an AND on the query.
265
- // Caller is responsible for renumbering placeholders when
266
- // concatenating with other fragments (see `shiftParams` below).
267
- //
268
- // "empty" vs. "pass" is the critical distinction for a safe default:
269
- // undefined/pass = allow, empty = deny-by-construction.
270
- export type OwnershipClause =
271
- | { readonly kind: "pass" }
272
- | { readonly kind: "empty" }
273
- | { readonly kind: "sql"; readonly sqlText: string; readonly params: readonly unknown[] };
274
-
275
225
  const PASS_CLAUSE: OwnershipClause = { kind: "pass" };
276
226
  const EMPTY_CLAUSE: OwnershipClause = { kind: "empty" };
277
227
 
278
- const KUMIKO_NAME_SYMBOL = Symbol.for("kumiko:schema:Name");
279
- const KUMIKO_COLUMNS_SYMBOL = Symbol.for("kumiko:schema:Columns");
280
-
281
228
  function tableNameOf(table: unknown): string {
282
229
  if (table !== null && typeof table === "object") {
283
230
  const sym = (table as Record<symbol, unknown>)[KUMIKO_NAME_SYMBOL];
@@ -46,8 +46,8 @@ const ALL_KINDS: FeaturePatternKind[] = [
46
46
  "screen",
47
47
  "writeHandler",
48
48
  "queryHandler",
49
+ "streamHandler",
49
50
  "hook",
50
- "entityHook",
51
51
  "job",
52
52
  "notification",
53
53
  "authClaims",
@@ -55,12 +55,10 @@ const ALL_KINDS: FeaturePatternKind[] = [
55
55
  "projection",
56
56
  "multiStreamProjection",
57
57
  "defineEvent",
58
- "eventMigration",
59
58
  "extendsRegistrar",
60
59
  "usesApi",
61
60
  "exposesApi",
62
61
  "treeActions",
63
- "tree",
64
62
  "envSchema",
65
63
  "unknown",
66
64
  ];
@@ -273,20 +271,20 @@ function makePlaceholderPattern(kind: FeaturePatternKind): FeaturePattern {
273
271
  schemaSource: PLACEHOLDER_BODY_LOC,
274
272
  handlerBody: PLACEHOLDER_BODY_LOC,
275
273
  };
276
- case "hook":
274
+ case "streamHandler":
277
275
  return {
278
276
  kind,
279
277
  source: PLACEHOLDER_LOC,
280
- hookType: "postSave",
281
- target: "x",
282
- fnBody: PLACEHOLDER_BODY_LOC,
278
+ handlerName: "x",
279
+ schemaSource: PLACEHOLDER_BODY_LOC,
280
+ handlerBody: PLACEHOLDER_BODY_LOC,
283
281
  };
284
- case "entityHook":
282
+ case "hook":
285
283
  return {
286
284
  kind,
287
285
  source: PLACEHOLDER_LOC,
288
286
  hookType: "postSave",
289
- entityName: "x",
287
+ target: "x",
290
288
  fnBody: PLACEHOLDER_BODY_LOC,
291
289
  };
292
290
  case "job":
@@ -333,15 +331,6 @@ function makePlaceholderPattern(kind: FeaturePatternKind): FeaturePattern {
333
331
  eventName: "x",
334
332
  schemaSource: PLACEHOLDER_BODY_LOC,
335
333
  };
336
- case "eventMigration":
337
- return {
338
- kind,
339
- source: PLACEHOLDER_LOC,
340
- eventName: "x",
341
- fromVersion: 1,
342
- toVersion: 2,
343
- transformBody: PLACEHOLDER_BODY_LOC,
344
- };
345
334
  case "extendsRegistrar":
346
335
  return {
347
336
  kind,
@@ -351,8 +340,6 @@ function makePlaceholderPattern(kind: FeaturePatternKind): FeaturePattern {
351
340
  };
352
341
  case "treeActions":
353
342
  return { kind, source: PLACEHOLDER_LOC, definitions: {} };
354
- case "tree":
355
- return { kind, source: PLACEHOLDER_LOC, providerBody: PLACEHOLDER_BODY_LOC };
356
343
  case "envSchema":
357
344
  return { kind, source: PLACEHOLDER_LOC, schemaBody: PLACEHOLDER_BODY_LOC };
358
345
  case "unknown":