@cosmicdrift/kumiko-framework 0.388.0 → 0.390.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. package/AGENTS.md +12 -4
  2. package/README.md +1 -1
  3. package/agents/examples/apex-surface-auth.md +2 -3
  4. package/agents/examples/api-worker-split.md +9 -2
  5. package/agents/examples/auth-claims.md +1 -1
  6. package/agents/examples/cross-feature-events.md +12 -12
  7. package/agents/examples/crypto-shredding-hr.md +2 -2
  8. package/agents/examples/encrypted-tenant-config.md +1 -1
  9. package/agents/examples/error-contract.md +12 -7
  10. package/agents/examples/event-sourcing.md +29 -29
  11. package/agents/examples/files-post-processing.md +10 -8
  12. package/agents/examples/golden-path.md +13 -1
  13. package/agents/examples/inbound-mail-triage.md +1 -0
  14. package/agents/examples/lane-routing.md +2 -1
  15. package/agents/examples/legal-pages.md +2 -2
  16. package/agents/examples/lifecycle-hooks.md +55 -2
  17. package/agents/examples/list-table-options.md +466 -0
  18. package/agents/examples/managed-config.md +4 -4
  19. package/agents/examples/managed-pages.md +1 -1
  20. package/agents/examples/pdf-audit-export.md +4 -2
  21. package/agents/examples/relations.md +19 -4
  22. package/agents/examples/search.md +4 -4
  23. package/agents/examples/secrets-demo.md +9 -6
  24. package/agents/examples/state-machine.md +5 -4
  25. package/agents/examples/tenant-isolation.md +73 -1
  26. package/agents/examples/tenant-settings.md +1 -1
  27. package/agents/examples/user-data-rights.md +3 -6
  28. package/agents/examples/workflow-engine.md +53 -47
  29. package/agents/examples.md +5 -4
  30. package/agents/features.md +1 -1
  31. package/agents/widgets.md +1 -0
  32. package/dist/api/api-constants.d.ts +1 -0
  33. package/dist/api/api-constants.js +2 -0
  34. package/dist/api/auth-middleware.js +1 -1
  35. package/dist/api/auth-routes-invite.js +2 -1
  36. package/dist/api/auth-routes-shared.d.ts +2 -0
  37. package/dist/api/auth-routes-shared.js +5 -0
  38. package/dist/api/client-error-route.js +2 -3
  39. package/dist/api/entity-read-access.d.ts +4 -1
  40. package/dist/api/entity-read-access.js +14 -0
  41. package/dist/api/export/export-cells-reference.d.ts +9 -0
  42. package/dist/api/export/export-cells-reference.js +21 -0
  43. package/dist/api/export/export-cells.d.ts +11 -0
  44. package/dist/api/export/export-cells.js +136 -0
  45. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  46. package/dist/api/export/export-ciphertext-guard.js +27 -0
  47. package/dist/api/export/export-columns.d.ts +31 -0
  48. package/dist/api/export/export-columns.js +85 -0
  49. package/dist/api/export/export-errors.d.ts +4 -0
  50. package/dist/api/export/export-errors.js +14 -0
  51. package/dist/api/export/export-route.d.ts +4 -0
  52. package/dist/api/export/export-route.js +75 -0
  53. package/dist/api/export/export-rows.d.ts +13 -0
  54. package/dist/api/export/export-rows.js +62 -0
  55. package/dist/api/export/export-screen.d.ts +13 -0
  56. package/dist/api/export/export-screen.js +47 -0
  57. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  58. package/dist/api/export/export-xlsx-writer.js +21 -0
  59. package/dist/api/extra-route.d.ts +7 -1
  60. package/dist/api/index.d.ts +23 -27
  61. package/dist/api/index.js +13 -15
  62. package/dist/api/jwt.js +1 -1
  63. package/dist/api/observability-middleware.d.ts +1 -1
  64. package/dist/api/observability-middleware.js +2 -1
  65. package/dist/api/pii-leak-guard.d.ts +3 -0
  66. package/dist/api/pii-leak-guard.js +3 -2
  67. package/dist/api/request-context-internals.d.ts +31 -0
  68. package/dist/api/request-context-internals.js +11 -0
  69. package/dist/api/request-context-scopes.d.ts +14 -0
  70. package/dist/api/request-context-scopes.js +69 -0
  71. package/dist/api/request-context.d.ts +1 -40
  72. package/dist/api/request-context.js +22 -51
  73. package/dist/api/request-id-middleware.d.ts +1 -1
  74. package/dist/api/route-registrars.d.ts +2 -1
  75. package/dist/api/route-registrars.js +1 -1
  76. package/dist/api/routes.d.ts +16 -0
  77. package/dist/api/routes.js +9 -5
  78. package/dist/api/server-boot-checks.d.ts +1 -1
  79. package/dist/api/server-boot-checks.js +2 -2
  80. package/dist/api/server-event-dispatcher.d.ts +6 -1
  81. package/dist/api/server-event-dispatcher.js +3 -4
  82. package/dist/api/server-extra-routes.d.ts +1 -1
  83. package/dist/api/server-extra-routes.js +5 -1
  84. package/dist/api/server-middleware.js +3 -1
  85. package/dist/api/server-routes.d.ts +3 -2
  86. package/dist/api/server-routes.js +8 -2
  87. package/dist/api/server-wiring.js +8 -4
  88. package/dist/api/server.d.ts +2 -1
  89. package/dist/api/sse-route.d.ts +3 -1
  90. package/dist/api/sse-route.js +11 -1
  91. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  92. package/dist/api/tenant-scoped-secrets.js +13 -0
  93. package/dist/api/websocket-route.d.ts +1 -1
  94. package/dist/auth/index.d.ts +0 -1
  95. package/dist/auth/roles.d.ts +0 -5
  96. package/dist/compliance/duration-spec.d.ts +0 -1
  97. package/dist/compliance/duration-spec.js +0 -5
  98. package/dist/compliance/index.d.ts +4 -4
  99. package/dist/compliance/index.js +2 -2
  100. package/dist/compliance/profiles.d.ts +0 -15
  101. package/dist/compliance/profiles.js +0 -23
  102. package/dist/config/index.d.ts +11 -9
  103. package/dist/config/index.js +13 -1
  104. package/dist/config/internals.d.ts +9 -0
  105. package/dist/config/internals.js +1 -0
  106. package/dist/consumer-cli-internals.d.ts +4 -0
  107. package/dist/consumer-cli-internals.js +1 -0
  108. package/dist/consumer-cli.d.ts +1 -4
  109. package/dist/consumer-cli.js +5 -1
  110. package/dist/crypto/event-pii.js +1 -1
  111. package/dist/crypto/index.d.ts +8 -9
  112. package/dist/crypto/index.js +7 -8
  113. package/dist/crypto/pg-kms-adapter.d.ts +1 -0
  114. package/dist/crypto/pg-kms-adapter.js +17 -18
  115. package/dist/db/aggregate-sql.d.ts +2 -0
  116. package/dist/db/aggregate-sql.js +10 -0
  117. package/dist/db/apply-entity-event.d.ts +1 -1
  118. package/dist/db/apply-entity-event.js +15 -47
  119. package/dist/db/blind-index-cleanup.js +91 -77
  120. package/dist/db/closed-connection.js +12 -19
  121. package/dist/db/collect-table-metas.js +1 -1
  122. package/dist/db/compound-types.d.ts +1 -1
  123. package/dist/db/compound-types.js +0 -7
  124. package/dist/db/config-seed.d.ts +2 -1
  125. package/dist/db/config-seed.js +6 -1
  126. package/dist/db/connection.d.ts +7 -6
  127. package/dist/db/connection.js +43 -24
  128. package/dist/db/cross-tenant-reads.d.ts +1 -1
  129. package/dist/db/cross-tenant-reads.js +1 -1
  130. package/dist/db/dialect.d.ts +0 -5
  131. package/dist/db/dialect.js +0 -3
  132. package/dist/db/driver-row-coercion.js +4 -4
  133. package/dist/db/driver-value-preparation.js +6 -4
  134. package/dist/db/eagerload.d.ts +2 -1
  135. package/dist/db/entity-field-encryption.d.ts +1 -1
  136. package/dist/db/entity-table-meta.d.ts +1 -1
  137. package/dist/db/event-store-executor-context.d.ts +3 -1
  138. package/dist/db/event-store-executor-context.js +4 -3
  139. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  140. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  141. package/dist/db/event-store-executor-read-aggregate.js +36 -5
  142. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  143. package/dist/db/event-store-executor-read-filter.js +6 -3
  144. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  145. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  146. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  147. package/dist/db/event-store-executor-read.js +2 -2
  148. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  149. package/dist/db/event-store-executor-write-atomic.js +42 -0
  150. package/dist/db/event-store-executor-write-steps.d.ts +3 -5
  151. package/dist/db/event-store-executor-write-steps.js +0 -5
  152. package/dist/db/event-store-executor-write.js +22 -19
  153. package/dist/db/event-store-executor.d.ts +1 -1
  154. package/dist/db/event-store-executor.js +2 -1
  155. package/dist/db/executor-managed-tables.d.ts +7 -1
  156. package/dist/db/executor-managed-tables.js +12 -3
  157. package/dist/db/index.d.ts +29 -28
  158. package/dist/db/index.js +22 -20
  159. package/dist/db/known-table-names.d.ts +6 -0
  160. package/dist/db/known-table-names.js +21 -0
  161. package/dist/db/list-aggregate-labels.d.ts +1 -1
  162. package/dist/db/located-timestamp.d.ts +1 -1
  163. package/dist/db/located-timestamp.js +0 -5
  164. package/dist/db/migrate-generator.d.ts +17 -1
  165. package/dist/db/migrate-generator.js +50 -20
  166. package/dist/db/migrate-primary-key.d.ts +12 -0
  167. package/dist/db/migrate-primary-key.js +45 -0
  168. package/dist/db/migrate-rls-diff.d.ts +20 -0
  169. package/dist/db/migrate-rls-diff.js +61 -0
  170. package/dist/db/migrate-runner.js +7 -3
  171. package/dist/db/money.d.ts +1 -1
  172. package/dist/db/money.js +1 -1
  173. package/dist/db/parent-ref-clause.d.ts +2 -1
  174. package/dist/db/pg-error.d.ts +2 -0
  175. package/dist/db/pg-error.js +37 -21
  176. package/dist/db/queries/backfill-pii.js +3 -6
  177. package/dist/db/queries/database-now.js +2 -1
  178. package/dist/db/queries/ddl.d.ts +3 -0
  179. package/dist/db/queries/ddl.js +34 -1
  180. package/dist/db/queries/event-store.js +4 -2
  181. package/dist/db/queries/event-tenants.d.ts +2 -0
  182. package/dist/db/queries/event-tenants.js +17 -0
  183. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  184. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  185. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  186. package/dist/db/queries/rls-boot-catalog.js +39 -0
  187. package/dist/db/queries/rls-catalog.d.ts +6 -0
  188. package/dist/db/queries/rls-catalog.js +82 -0
  189. package/dist/db/queries/rls-scope.d.ts +3 -0
  190. package/dist/db/queries/rls-scope.js +17 -0
  191. package/dist/db/queries/rls-shape.d.ts +10 -0
  192. package/dist/db/queries/rls-shape.js +42 -0
  193. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  194. package/dist/db/queries/session-advisory-lock.js +23 -0
  195. package/dist/db/queries/shadow-swap.d.ts +1 -2
  196. package/dist/db/queries/shadow-swap.js +11 -28
  197. package/dist/db/queries/test-stack.d.ts +4 -1
  198. package/dist/db/queries/test-stack.js +83 -2
  199. package/dist/db/query.d.ts +14 -0
  200. package/dist/db/query.js +77 -48
  201. package/dist/db/reference-data.d.ts +1 -1
  202. package/dist/db/reference-data.js +20 -3
  203. package/dist/db/render-ddl.d.ts +6 -2
  204. package/dist/db/render-ddl.js +7 -7
  205. package/dist/db/render-rls-ddl.d.ts +35 -0
  206. package/dist/db/render-rls-ddl.js +127 -0
  207. package/dist/db/replay-migration-sql.d.ts +3 -1
  208. package/dist/db/replay-migration-sql.js +22 -5
  209. package/dist/db/replay-rls.d.ts +25 -0
  210. package/dist/db/replay-rls.js +156 -0
  211. package/dist/db/row-level-security-boot-check.d.ts +5 -0
  212. package/dist/db/row-level-security-boot-check.js +85 -0
  213. package/dist/db/row-level-security-connection.d.ts +3 -0
  214. package/dist/db/row-level-security-connection.js +213 -0
  215. package/dist/db/row-level-security-scope.d.ts +33 -0
  216. package/dist/db/row-level-security-scope.js +127 -0
  217. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  218. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  219. package/dist/db/sql-identifier.d.ts +1 -0
  220. package/dist/db/sql-identifier.js +3 -0
  221. package/dist/db/statement-timeout.js +2 -1
  222. package/dist/db/table-builder.d.ts +2 -1
  223. package/dist/db/table-builder.js +1 -1
  224. package/dist/db/table-info.js +1 -1
  225. package/dist/db/table-push.d.ts +11 -2
  226. package/dist/db/table-push.js +15 -2
  227. package/dist/db/tenant-db-runner.d.ts +3 -1
  228. package/dist/db/tenant-db-runner.js +4 -3
  229. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  230. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  231. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  232. package/dist/db/tenant-db-statement-runner.js +48 -0
  233. package/dist/db/tenant-db-upsert.d.ts +5 -0
  234. package/dist/db/tenant-db-upsert.js +91 -0
  235. package/dist/db/tenant-db.d.ts +17 -12
  236. package/dist/db/tenant-db.js +60 -121
  237. package/dist/db/tenant-id-filter.d.ts +3 -0
  238. package/dist/db/tenant-id-filter.js +30 -0
  239. package/dist/db/transaction-serialization.d.ts +6 -0
  240. package/dist/db/transaction-serialization.js +60 -0
  241. package/dist/derivatives/delete-stored-file.js +1 -1
  242. package/dist/derivatives/index.d.ts +2 -5
  243. package/dist/derivatives/index.js +2 -3
  244. package/dist/engine/access.d.ts +2 -1
  245. package/dist/engine/access.js +1 -1
  246. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  247. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  248. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  249. package/dist/engine/boot-validator/entity-handler.js +1 -1
  250. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  251. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  252. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  253. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  254. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  255. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  256. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  257. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  258. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
  259. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  260. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  261. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  262. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  263. package/dist/engine/boot-validator/list-table-options.js +77 -0
  264. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  265. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  266. package/dist/engine/boot-validator/nav.d.ts +3 -1
  267. package/dist/engine/boot-validator/nav.js +1 -1
  268. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  269. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  270. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  271. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  272. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  273. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  274. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  275. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  276. package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
  277. package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
  278. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  279. package/dist/engine/boot-validator/screens-lists.js +12 -2
  280. package/dist/engine/boot-validator/screens.d.ts +2 -1
  281. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  282. package/dist/engine/bridge-stub.d.ts +5 -2
  283. package/dist/engine/bridge-stub.js +39 -24
  284. package/dist/engine/build-app-schema.d.ts +2 -1
  285. package/dist/engine/build-app-schema.js +9 -1
  286. package/dist/engine/build-config-feature-schema.js +6 -1
  287. package/dist/engine/config-helpers.d.ts +2 -2
  288. package/dist/engine/config-helpers.js +0 -9
  289. package/dist/engine/constants.d.ts +0 -10
  290. package/dist/engine/constants.js +0 -8
  291. package/dist/engine/create-app.js +1 -1
  292. package/dist/engine/define-feature.d.ts +2 -1
  293. package/dist/engine/define-feature.js +5 -2
  294. package/dist/engine/define-handler.d.ts +1 -1
  295. package/dist/engine/define-step.d.ts +0 -1
  296. package/dist/engine/define-step.js +0 -3
  297. package/dist/engine/embedded-derived.d.ts +1 -1
  298. package/dist/engine/entity-handlers.d.ts +2 -1
  299. package/dist/engine/entity-handlers.js +7 -7
  300. package/dist/engine/entity-list-runtime-options.js +3 -1
  301. package/dist/engine/entity-list-searchability.d.ts +2 -1
  302. package/dist/engine/event-def.d.ts +2 -1
  303. package/dist/engine/event-helpers.d.ts +3 -1
  304. package/dist/engine/event-helpers.js +3 -3
  305. package/dist/engine/extension-names.d.ts +2 -8
  306. package/dist/engine/extension-names.js +2 -2
  307. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  308. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  309. package/dist/engine/extensions/user-data.d.ts +0 -8
  310. package/dist/engine/factories.d.ts +2 -1
  311. package/dist/engine/feature-builder-state.d.ts +9 -1
  312. package/dist/engine/feature-builder-state.js +1 -0
  313. package/dist/engine/feature-changelog.d.ts +1 -1
  314. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  315. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  316. package/dist/engine/feature-manifest.d.ts +1 -0
  317. package/dist/engine/feature-manifest.js +2 -1
  318. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  319. package/dist/engine/feature-ui-extensions.js +6 -4
  320. package/dist/engine/field-access.d.ts +3 -1
  321. package/dist/engine/field-access.js +12 -0
  322. package/dist/engine/handler-field-references.d.ts +0 -4
  323. package/dist/engine/index.d.ts +58 -55
  324. package/dist/engine/index.js +23 -28
  325. package/dist/engine/instruction-fields.d.ts +1 -1
  326. package/dist/engine/personal-data-fields.d.ts +1 -1
  327. package/dist/engine/qualified-name.d.ts +0 -1
  328. package/dist/engine/read-claim.d.ts +2 -1
  329. package/dist/engine/registry-facade.js +0 -3
  330. package/dist/engine/registry-ingest.d.ts +2 -1
  331. package/dist/engine/registry-ingest.js +1 -2
  332. package/dist/engine/registry-state.d.ts +12 -2
  333. package/dist/engine/registry-state.js +2 -3
  334. package/dist/engine/registry-validate.d.ts +3 -1
  335. package/dist/engine/registry-validate.js +7 -7
  336. package/dist/engine/run-in.d.ts +1 -1
  337. package/dist/engine/run-in.js +0 -1
  338. package/dist/engine/schema-builder.d.ts +1 -1
  339. package/dist/engine/schema-builder.js +1 -1
  340. package/dist/engine/screen-filter-ops.d.ts +2 -1
  341. package/dist/engine/screen-filter-ops.js +2 -5
  342. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  343. package/dist/engine/soft-delete-cleanup.js +4 -4
  344. package/dist/engine/state-machine.js +2 -1
  345. package/dist/engine/steps/_read-source.js +1 -1
  346. package/dist/engine/steps/aggregate-append-event.js +2 -2
  347. package/dist/engine/steps/call-feature.js +2 -2
  348. package/dist/engine/steps/mail-send.js +1 -1
  349. package/dist/engine/steps/retry.js +1 -1
  350. package/dist/engine/steps/wait-for-event.js +1 -1
  351. package/dist/engine/steps/wait.js +1 -1
  352. package/dist/engine/steps/webhook-send.js +1 -1
  353. package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
  354. package/dist/engine/template-variables.d.ts +2 -1
  355. package/dist/engine/transfer-adjacency.d.ts +1 -1
  356. package/dist/engine/types/feature.d.ts +1 -0
  357. package/dist/engine/types/index.d.ts +8 -30
  358. package/dist/engine/types/index.js +2 -10
  359. package/dist/engine/types/screen.d.ts +1 -1
  360. package/dist/engine/types/screen.js +1 -1
  361. package/dist/engine/validation.d.ts +2 -1
  362. package/dist/entrypoint/index.d.ts +9 -35
  363. package/dist/entrypoint/index.js +10 -1
  364. package/dist/entrypoint/internals.d.ts +40 -0
  365. package/dist/entrypoint/internals.js +1 -0
  366. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  367. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  368. package/dist/env/dry-run-internals.d.ts +10 -0
  369. package/dist/env/dry-run-internals.js +1 -0
  370. package/dist/env/dry-run.d.ts +1 -10
  371. package/dist/env/dry-run.js +2 -1
  372. package/dist/env/index.d.ts +1 -85
  373. package/dist/env/index.js +6 -50
  374. package/dist/env/internals.d.ts +87 -0
  375. package/dist/env/internals.js +53 -0
  376. package/dist/errors/classes.js +2 -2
  377. package/dist/errors/index.d.ts +5 -14
  378. package/dist/errors/index.js +4 -9
  379. package/dist/errors/member-resolution.js +1 -1
  380. package/dist/errors/reasons.d.ts +0 -1
  381. package/dist/errors/reasons.js +7 -7
  382. package/dist/errors/serialize.d.ts +0 -18
  383. package/dist/errors/serialize.js +0 -27
  384. package/dist/es-ops/index.d.ts +4 -4
  385. package/dist/es-ops/index.js +2 -2
  386. package/dist/es-ops/operations-schema.d.ts +1 -1
  387. package/dist/es-ops/types.d.ts +4 -5
  388. package/dist/event-store/admin-api-internals.d.ts +14 -0
  389. package/dist/event-store/admin-api-internals.js +1 -0
  390. package/dist/event-store/admin-api.d.ts +1 -14
  391. package/dist/event-store/admin-api.js +11 -6
  392. package/dist/event-store/archive.js +4 -2
  393. package/dist/event-store/errors.js +2 -2
  394. package/dist/event-store/event-store.d.ts +1 -0
  395. package/dist/event-store/event-store.js +42 -32
  396. package/dist/event-store/events-schema.js +4 -1
  397. package/dist/event-store/index.d.ts +11 -13
  398. package/dist/event-store/index.js +7 -9
  399. package/dist/event-store/provenance-append.js +1 -1
  400. package/dist/event-store/rebuild-dead-letter.js +4 -2
  401. package/dist/event-store/snapshot.js +4 -3
  402. package/dist/event-store/stream-scope.d.ts +2 -0
  403. package/dist/event-store/stream-scope.js +6 -0
  404. package/dist/event-store/upcaster-dead-letter.js +4 -2
  405. package/dist/event-store/upcaster.d.ts +2 -1
  406. package/dist/files/action-form-upload.d.ts +2 -1
  407. package/dist/files/action-form-upload.js +1 -1
  408. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  409. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  410. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  411. package/dist/files/bind-pending-file-refs.js +2 -1
  412. package/dist/files/bind-referenced-files.write.js +1 -1
  413. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  414. package/dist/files/create-file-ref-from-bytes.js +6 -3
  415. package/dist/files/create-file-ref.d.ts +6 -2
  416. package/dist/files/create-file-ref.js +13 -4
  417. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  418. package/dist/files/dispose-removed-file-refs.js +1 -1
  419. package/dist/files/feature.js +2 -2
  420. package/dist/files/file-handle.js +1 -1
  421. package/dist/files/file-routes.d.ts +3 -1
  422. package/dist/files/file-routes.js +41 -4
  423. package/dist/files/index.d.ts +11 -13
  424. package/dist/files/index.js +5 -7
  425. package/dist/files/load-save-file-refs.d.ts +2 -1
  426. package/dist/files/load-save-file-refs.js +1 -1
  427. package/dist/files/provider-resolver.d.ts +6 -4
  428. package/dist/files/provider-resolver.js +5 -5
  429. package/dist/files/record-write-check.d.ts +6 -0
  430. package/dist/files/record-write-check.js +13 -0
  431. package/dist/files/storage-tracking.js +4 -2
  432. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  433. package/dist/files/sweep-orphaned-uploads.js +1 -1
  434. package/dist/files/upload-ledger.d.ts +2 -2
  435. package/dist/files/upload-ledger.js +4 -4
  436. package/dist/i18n/index.d.ts +2 -8
  437. package/dist/i18n/index.js +1 -1
  438. package/dist/i18n/internals.d.ts +7 -0
  439. package/dist/i18n/internals.js +1 -0
  440. package/dist/i18n/required-surface-keys.d.ts +4 -1
  441. package/dist/i18n/required-surface-keys.js +7 -2
  442. package/dist/internal/row-level-security.d.ts +3 -0
  443. package/dist/internal/row-level-security.js +3 -0
  444. package/dist/internal/stack-support.d.ts +1 -1
  445. package/dist/internal/stack-support.js +1 -1
  446. package/dist/internal/testing.d.ts +1 -0
  447. package/dist/internal/testing.js +10 -6
  448. package/dist/jobs/index.d.ts +1 -1
  449. package/dist/jobs/job-append-event.d.ts +12 -0
  450. package/dist/jobs/job-append-event.js +30 -0
  451. package/dist/jobs/job-runner-context.d.ts +2 -2
  452. package/dist/jobs/job-runner-context.js +46 -16
  453. package/dist/jobs/job-runner-execution.d.ts +1 -1
  454. package/dist/jobs/job-runner-execution.js +6 -4
  455. package/dist/jobs/job-runner-gates.d.ts +1 -1
  456. package/dist/jobs/job-runner-gates.js +0 -1
  457. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  458. package/dist/jobs/job-runner-helpers.js +10 -1
  459. package/dist/jobs/job-runner-scope.d.ts +5 -2
  460. package/dist/jobs/job-runner-scope.js +6 -6
  461. package/dist/jobs/job-runner-types.d.ts +2 -1
  462. package/dist/jobs/job-runner.js +22 -6
  463. package/dist/jobs/max-per-tenant.d.ts +1 -1
  464. package/dist/logging/index.d.ts +1 -2
  465. package/dist/logging/index.js +1 -1
  466. package/dist/logging/pino-logger.js +1 -1
  467. package/dist/logging/utils.d.ts +1 -0
  468. package/dist/logging/utils.js +6 -0
  469. package/dist/migrations/index.d.ts +3 -3
  470. package/dist/migrations/index.js +3 -3
  471. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  472. package/dist/migrations/pending-rebuilds.js +1 -1
  473. package/dist/migrations/pii-event-backfill.js +4 -1
  474. package/dist/observability/escape-hatch-report.d.ts +2 -1
  475. package/dist/observability/escape-hatch-report.js +9 -2
  476. package/dist/observability/index.d.ts +7 -15
  477. package/dist/observability/index.js +4 -12
  478. package/dist/observability/metric-validator.js +1 -1
  479. package/dist/observability/metrics-handle.d.ts +0 -1
  480. package/dist/observability/metrics-handle.js +2 -15
  481. package/dist/observability/recording-tracer.d.ts +1 -2
  482. package/dist/observability/recording-tracer.js +0 -6
  483. package/dist/observability/sensitive-filter.d.ts +0 -2
  484. package/dist/observability/sensitive-filter.js +0 -29
  485. package/dist/pipeline/active-membership.d.ts +2 -1
  486. package/dist/pipeline/active-membership.js +6 -2
  487. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  488. package/dist/pipeline/after-rollback-sink.js +32 -0
  489. package/dist/pipeline/append-event-core.d.ts +2 -1
  490. package/dist/pipeline/append-event-core.js +2 -2
  491. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  492. package/dist/pipeline/attach-outside-transaction.js +13 -0
  493. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  494. package/dist/pipeline/cascade-handler.d.ts +2 -1
  495. package/dist/pipeline/cascade-handler.js +3 -2
  496. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  497. package/dist/pipeline/config-accessor-factory.js +1 -1
  498. package/dist/pipeline/context-services.d.ts +56 -0
  499. package/dist/pipeline/context-services.js +73 -0
  500. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  501. package/dist/pipeline/dispatch-batch.js +39 -19
  502. package/dist/pipeline/dispatch-query.js +5 -4
  503. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  504. package/dist/pipeline/dispatch-scope.js +27 -0
  505. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  506. package/dist/pipeline/dispatch-shared.js +75 -194
  507. package/dist/pipeline/dispatch-stream.js +8 -4
  508. package/dist/pipeline/dispatch-write.d.ts +2 -1
  509. package/dist/pipeline/dispatch-write.js +10 -8
  510. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  511. package/dist/pipeline/dispatcher-utils.js +8 -2
  512. package/dist/pipeline/dispatcher.d.ts +3 -2
  513. package/dist/pipeline/dispatcher.js +4 -3
  514. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  515. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  516. package/dist/pipeline/event-dispatcher-delivery.js +7 -3
  517. package/dist/pipeline/event-dispatcher.d.ts +3 -2
  518. package/dist/pipeline/event-dispatcher.js +13 -12
  519. package/dist/pipeline/event-retention.js +59 -56
  520. package/dist/pipeline/handler-access-error.js +2 -1
  521. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  522. package/dist/pipeline/handler-context-auth.js +7 -4
  523. package/dist/pipeline/handler-context-config.d.ts +2 -5
  524. package/dist/pipeline/handler-context-config.js +2 -2
  525. package/dist/pipeline/handler-context-db.d.ts +32 -7
  526. package/dist/pipeline/handler-context-db.js +26 -17
  527. package/dist/pipeline/handler-context-dispatch.d.ts +14 -6
  528. package/dist/pipeline/handler-context-dispatch.js +18 -5
  529. package/dist/pipeline/handler-context-events.d.ts +22 -38
  530. package/dist/pipeline/handler-context-events.js +42 -35
  531. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  532. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  533. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  534. package/dist/pipeline/handler-context-notify.js +1 -1
  535. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  536. package/dist/pipeline/handler-context-observability.js +7 -5
  537. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  538. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  539. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  540. package/dist/pipeline/handler-context-scope.js +18 -20
  541. package/dist/pipeline/index.d.ts +9 -21
  542. package/dist/pipeline/index.js +5 -7
  543. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  544. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  545. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  546. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  547. package/dist/pipeline/member-read-only-transaction.js +11 -3
  548. package/dist/pipeline/member-reader.d.ts +1 -1
  549. package/dist/pipeline/member-reader.js +2 -2
  550. package/dist/pipeline/msp-rebuild.js +5 -3
  551. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  552. package/dist/pipeline/notify-scope.d.ts +2 -1
  553. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  554. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  555. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  556. package/dist/pipeline/projection-rebuild.js +12 -5
  557. package/dist/pipeline/projection-state.d.ts +0 -6
  558. package/dist/pipeline/projection-state.js +0 -5
  559. package/dist/pipeline/projections-runner.d.ts +2 -1
  560. package/dist/pipeline/projections-runner.js +10 -6
  561. package/dist/pipeline/system-hooks.d.ts +6 -2
  562. package/dist/pipeline/system-hooks.js +61 -10
  563. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  564. package/dist/pipeline/system-identity-switch.js +51 -36
  565. package/dist/pipeline/typed-append-event.d.ts +2 -0
  566. package/dist/pipeline/typed-append-event.js +4 -0
  567. package/dist/pipeline/write-origin.js +2 -2
  568. package/dist/pipeline/write-result-masking.d.ts +1 -1
  569. package/dist/pipeline/write-result-masking.js +13 -10
  570. package/dist/random/index.d.ts +1 -2
  571. package/dist/random/index.js +1 -2
  572. package/dist/rate-limit/bucket.d.ts +2 -1
  573. package/dist/rate-limit/middleware.js +2 -1
  574. package/dist/redis/index.d.ts +3 -4
  575. package/dist/redis/index.js +2 -2
  576. package/dist/schema-cli/apply-command.js +5 -2
  577. package/dist/schema-cli/baseline-command.js +7 -2
  578. package/dist/schema-cli/generate-command.js +7 -9
  579. package/dist/schema-cli/shared.d.ts +4 -0
  580. package/dist/schema-cli/shared.js +21 -2
  581. package/dist/schema-cli/status-command.js +8 -2
  582. package/dist/schema-cli/validate-command.js +52 -4
  583. package/dist/schema-cli.d.ts +0 -1
  584. package/dist/search/configure-tenant-index.d.ts +1 -3
  585. package/dist/search/configure-tenant-index.js +0 -4
  586. package/dist/search/index.d.ts +1 -4
  587. package/dist/search/index.js +0 -2
  588. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  589. package/dist/search/meilisearch-adapter-internals.js +9 -0
  590. package/dist/search/meilisearch-adapter.d.ts +1 -8
  591. package/dist/search/meilisearch-adapter.js +6 -7
  592. package/dist/search/meilisearch-peer.d.ts +2 -0
  593. package/dist/search/meilisearch-peer.js +5 -0
  594. package/dist/search/reindex-entity.js +107 -91
  595. package/dist/secrets/index.d.ts +3 -4
  596. package/dist/secrets/index.js +2 -3
  597. package/dist/seeding/index.d.ts +2 -2
  598. package/dist/seeding/index.js +1 -2
  599. package/dist/time/index.d.ts +2 -2
  600. package/dist/time/index.js +1 -1
  601. package/dist/time/tz-context.d.ts +0 -5
  602. package/dist/time/tz-context.js +0 -9
  603. package/dist/ui-types/index.d.ts +8 -11
  604. package/dist/ui-types/index.js +3 -3
  605. package/dist/upgrade-changelog.d.ts +3 -0
  606. package/dist/upgrade-changelog.js +18 -0
  607. package/dist/upgrade-cli-internals.d.ts +8 -0
  608. package/dist/upgrade-cli-internals.js +63 -0
  609. package/dist/upgrade-cli.d.ts +1 -18
  610. package/dist/upgrade-cli.js +29 -137
  611. package/dist/upgrade-marker-parse.d.ts +32 -0
  612. package/dist/upgrade-marker-parse.js +73 -0
  613. package/dist/utils/import-optional-peer.d.ts +6 -0
  614. package/dist/utils/import-optional-peer.js +19 -0
  615. package/dist/utils/index.d.ts +1 -4
  616. package/dist/utils/index.js +1 -4
  617. package/package.json +27 -20
  618. package/src/changes.json +451 -0
  619. package/dist/crypto/request-kms-cache.d.ts +0 -8
  620. package/dist/crypto/request-kms-cache.js +0 -21
  621. package/dist/engine/codemod/index.d.ts +0 -2
  622. package/dist/engine/codemod/index.js +0 -1
  623. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  624. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  625. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  626. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  627. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  628. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  629. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  630. package/dist/engine/feature-ast/extractors/events.js +0 -275
  631. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  632. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  633. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  634. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  635. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  636. package/dist/engine/feature-ast/extractors/index.js +0 -13
  637. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  638. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  639. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  640. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  641. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  642. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  643. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -10
  644. package/dist/engine/feature-ast/extractors/round1.js +0 -81
  645. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  646. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  647. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  648. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  649. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  650. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  651. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  652. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  653. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  654. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  655. package/dist/engine/feature-ast/index.d.ts +0 -16
  656. package/dist/engine/feature-ast/index.js +0 -10
  657. package/dist/engine/feature-ast/parse.d.ts +0 -31
  658. package/dist/engine/feature-ast/parse.js +0 -483
  659. package/dist/engine/feature-ast/patch.d.ts +0 -210
  660. package/dist/engine/feature-ast/patch.js +0 -610
  661. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  662. package/dist/engine/feature-ast/patcher.js +0 -281
  663. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1476
  664. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
  665. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  666. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
  667. package/dist/engine/feature-ast/patterns.d.ts +0 -318
  668. package/dist/engine/feature-ast/patterns.js +0 -106
  669. package/dist/engine/feature-ast/render.d.ts +0 -47
  670. package/dist/engine/feature-ast/render.js +0 -662
  671. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  672. package/dist/engine/feature-ast/source-location.js +0 -27
  673. package/dist/engine/pattern-library/index.d.ts +0 -2
  674. package/dist/engine/pattern-library/index.js +0 -3
  675. package/dist/engine/pattern-library/library.d.ts +0 -14
  676. package/dist/engine/pattern-library/library.js +0 -93
  677. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  678. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  679. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  680. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  681. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  682. package/dist/engine/pattern-library/shared-fields.js +0 -88
  683. package/dist/engine/pattern-library/static-schemas.d.ts +0 -20
  684. package/dist/engine/pattern-library/static-schemas.js +0 -478
  685. package/dist/engine/pattern-library/types.d.ts +0 -158
  686. package/dist/engine/pattern-library/types.js +0 -36
  687. package/dist/engine/provider-plugin-context.d.ts +0 -3
  688. package/dist/engine/provider-plugin-context.js +0 -28
  689. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  690. package/dist/engine/resolve-config-or-param.js +0 -76
  691. package/src/scripts/codemod/README.md +0 -187
  692. package/src/scripts/codemod/codemod-support.ts +0 -334
  693. package/src/scripts/codemod/collect-source-files.ts +0 -48
  694. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  695. package/src/scripts/codemod/db-factory.ts +0 -810
  696. package/src/scripts/codemod/feature-factory.ts +0 -429
  697. package/src/scripts/codemod/feature-layout.ts +0 -424
  698. package/src/scripts/codemod/import-extensions.ts +0 -118
  699. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  700. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  701. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  702. package/src/scripts/codemod/object-form.ts +0 -746
  703. package/src/scripts/codemod/package-merge.ts +0 -299
  704. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  705. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  706. package/src/scripts/codemod/s3-imports.ts +0 -236
  707. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  708. package/src/scripts/codemod/testing-injection.ts +0 -215
  709. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  710. package/src/scripts/codemod/testing-move.ts +0 -542
  711. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -1,6 +1,9 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { diffReplayAgainstSnapshot, generateMigration, readMigrationSqlTexts, replayMigrationsDir, } from "../db/index.js";
3
+ import { assertRowLevelSecurityTableState, createDbConnection, generateMigration, } from "../db/index.js";
4
+ import { knownTablesOf } from "../db/known-table-names.js";
5
+ import { readMigrationSqlTexts } from "../db/migrate-runner.js";
6
+ import { diffReplayAgainstSnapshot, replayMigrationsDir } from "../db/replay-migration-sql.js";
4
7
  import { validateBoot } from "../engine/boot-validator.js";
5
8
  import { describeThrown, loadPreviousSnapshot, loadSchemaModOrReport, nextSequenceNumber, SNAPSHOT_FILENAME, } from "./shared.js";
6
9
  import { featureDefinitionsOf, parseValidateBootOptions, withFileStoragePresence, } from "./validate-boot-input.js";
@@ -9,6 +12,7 @@ function checkSchemaDrift(ctx, schemaMod, prevSnapshot) {
9
12
  const { out, migrationsDir } = ctx;
10
13
  const drift = generateMigration({
11
14
  metas: schemaMod.entityMetas,
15
+ rowLevelSecurity: schemaMod.rowLevelSecurity,
12
16
  prevSnapshot,
13
17
  name: "validate",
14
18
  sequenceNumber: nextSequenceNumber(migrationsDir),
@@ -19,13 +23,14 @@ function checkSchemaDrift(ctx, schemaMod, prevSnapshot) {
19
23
  ...drift.diff.changedTables.map((t) => t.tableName),
20
24
  ...drift.diff.droppedTables,
21
25
  ...drift.retiredDrops.map((t) => t.tableName),
26
+ ...drift.rowLevelSecurityChanges.map((c) => c.tableName),
22
27
  ];
23
28
  if (pendingTables.length === 0) {
24
29
  out.log(" ✓ schema: migrations match the entity definitions");
25
30
  return true;
26
31
  }
27
32
  out.err(" ✗ schema drift: entity definitions are ahead of kumiko/migrations.");
28
- out.err(` pending — new: ${drift.diff.newTables.length}, changed: ${drift.diff.changedTables.length}, dropped: ${drift.diff.droppedTables.length}`);
33
+ out.err(` pending — new: ${drift.diff.newTables.length}, changed: ${drift.diff.changedTables.length}, dropped: ${drift.diff.droppedTables.length}, row level security: ${drift.rowLevelSecurityChanges.length}`);
29
34
  out.err(` tables: ${pendingTables.join(", ")}`);
30
35
  out.err(" Fix: `kumiko-schema generate <name>`, then commit the migration.");
31
36
  return false;
@@ -57,6 +62,46 @@ function checkBootValidity(out, schemaMod) {
57
62
  return false;
58
63
  }
59
64
  }
65
+ // 4. Live row-level security table state — the table half of the boot check. Only with a DATABASE_URL;
66
+ // without one the command stays database-free.
67
+ async function checkLiveRowLevelSecurity(out, schemaMod) {
68
+ const dbUrl = process.env["DATABASE_URL"];
69
+ if (!dbUrl) {
70
+ out.log(" · row-level security: skipped — set DATABASE_URL to check the live database.");
71
+ return true;
72
+ }
73
+ let features;
74
+ try {
75
+ features = featureDefinitionsOf(schemaMod.features);
76
+ }
77
+ catch {
78
+ // skip: the boot check already reported the unreadable FEATURES export
79
+ return true;
80
+ }
81
+ const knownTables = features === undefined ? { has: () => true } : knownTablesOf(features);
82
+ const { db, close } = createDbConnection({
83
+ url: dbUrl,
84
+ maxConnections: 1,
85
+ rowLevelSecurity: schemaMod.rowLevelSecurity,
86
+ });
87
+ try {
88
+ await assertRowLevelSecurityTableState(db, schemaMod.rowLevelSecurity, knownTables);
89
+ out.log(" ✓ row-level security: live database matches the configured mode");
90
+ return true;
91
+ }
92
+ catch (e) {
93
+ out.err(` ✗ row-level security: ${describeThrown(e)}`);
94
+ return false;
95
+ }
96
+ finally {
97
+ try {
98
+ await close();
99
+ }
100
+ catch {
101
+ // The check result is already reported; a failing close must not hide it.
102
+ }
103
+ }
104
+ }
60
105
  function reportMigrationContentMismatches(out, mismatches) {
61
106
  out.err(" ✗ migration-content drift: committed *.sql files don't produce .snapshot.json.");
62
107
  for (const m of mismatches) {
@@ -72,7 +117,7 @@ function reportMigrationContentMismatches(out, mismatches) {
72
117
  "job-run-log store table for the pattern.");
73
118
  }
74
119
  if (mismatches.some((m) => m.kind !== "unexpected-table")) {
75
- out.err(" Fix (missing-table/column-drift): a migration file's body doesn't match " +
120
+ out.err(" Fix (missing-table/column-drift/row-level-security-drift): a migration file's body doesn't match " +
76
121
  "what it (or the snapshot) claims — hand-fix the file, or ship a corrective " +
77
122
  "migration if it's already applied in prod.");
78
123
  }
@@ -117,6 +162,8 @@ function checkMigrationContentDrift(ctx, prevSnapshot) {
117
162
  // Layer 1 alone misses this: it only compares ENTITY_METAS to the
118
163
  // snapshot, never the snapshot to the SQL that's supposed to have
119
164
  // produced it.
165
+ // 4. live row-level security (only with DATABASE_URL): the boot's
166
+ // table-state check against the real database (not the role: that is a boot-time property).
120
167
  // The DB-level gate (assertKumikoSchemaCurrent) stays at boot/deploy.
121
168
  export async function runValidateCommand(ctx) {
122
169
  const schemaMod = await loadSchemaModOrReport(ctx);
@@ -126,5 +173,6 @@ export async function runValidateCommand(ctx) {
126
173
  const schemaOk = checkSchemaDrift(ctx, schemaMod, prevSnapshot);
127
174
  const bootOk = checkBootValidity(ctx.out, schemaMod);
128
175
  const migrationsOk = checkMigrationContentDrift(ctx, prevSnapshot);
129
- return schemaOk && bootOk && migrationsOk ? 0 : 1;
176
+ const rowLevelSecurityOk = await checkLiveRowLevelSecurity(ctx.out, schemaMod);
177
+ return schemaOk && bootOk && migrationsOk && rowLevelSecurityOk ? 0 : 1;
130
178
  }
@@ -1,5 +1,4 @@
1
1
  import type { RunSchemaCliOptions, SchemaCliOut } from "./schema-cli/shared.ts";
2
- export type { RunSchemaCliOptions, SchemaCliOut } from "./schema-cli/shared.ts";
3
2
  /**
4
3
  * Runs a schema-CLI subcommand. `appCwd` is the app workspace root (where
5
4
  * `kumiko/schema.ts` + `kumiko/migrations/` live). Returns a process exit code.
@@ -1,4 +1,2 @@
1
- import type { Registry, TenantId } from "../engine/types/index.ts";
2
- import type { SearchAdapter } from "./types.ts";
1
+ import type { Registry } from "../engine/types/index.ts";
3
2
  export declare function collectSearchableFieldNames(registry: Registry): readonly string[];
4
- export declare function configureTenantSearchIndex(searchAdapter: SearchAdapter, registry: Registry, tenantId: TenantId): Promise<void>;
@@ -2,7 +2,3 @@ import { deriveSearchAdapterConfig } from "./derive-search-adapter-config.js";
2
2
  export function collectSearchableFieldNames(registry) {
3
3
  return deriveSearchAdapterConfig(registry)?.searchableFields ?? [];
4
4
  }
5
- export async function configureTenantSearchIndex(searchAdapter, registry, tenantId) {
6
- const fields = collectSearchableFieldNames(registry);
7
- await searchAdapter.configure(tenantId, { searchableFields: fields, rankingFields: fields });
8
- }
@@ -1,7 +1,4 @@
1
- export { collectSearchableFieldNames, configureTenantSearchIndex, } from "./configure-tenant-index.ts";
2
- export { deriveSearchAdapterConfig } from "./derive-search-adapter-config.ts";
3
1
  export { createInMemorySearchAdapter } from "./in-memory-adapter.ts";
4
2
  export { purgeSearchDocumentsForSubject } from "./purge-subject.ts";
5
- export type { ReindexEntityFailure, ReindexEntityOptions, ReindexEntityResult, } from "./reindex-entity.ts";
6
3
  export { reindexEntity } from "./reindex-entity.ts";
7
- export type { SearchAdapter, SearchAdapterConfig, SearchDocument, SearchOptions, SearchResult, } from "./types.ts";
4
+ export type { SearchAdapter, SearchAdapterConfig, } from "./types.ts";
@@ -2,8 +2,6 @@
2
2
  // `@cosmicdrift/kumiko-framework/search/meilisearch`. This keeps the main barrel from loading a
3
3
  // Meilisearch client when consumers only use SearchAdapter types, so apps that do not use
4
4
  // Meilisearch do not pull in the client code.
5
- export { collectSearchableFieldNames, configureTenantSearchIndex, } from "./configure-tenant-index.js";
6
- export { deriveSearchAdapterConfig } from "./derive-search-adapter-config.js";
7
5
  export { createInMemorySearchAdapter } from "./in-memory-adapter.js";
8
6
  export { purgeSearchDocumentsForSubject } from "./purge-subject.js";
9
7
  export { reindexEntity } from "./reindex-entity.js";
@@ -0,0 +1,8 @@
1
+ import type { EntityId, TenantId } from "../engine/types/identifiers.ts";
2
+ export type MeilisearchAdapterOptions = {
3
+ url: string;
4
+ apiKey: string;
5
+ indexPrefix?: string;
6
+ };
7
+ export declare function meilisearchTenantIndex(prefix: string, tenantId: TenantId): string;
8
+ export declare function meilisearchDocId(entityType: string, entityId: EntityId): string;
@@ -0,0 +1,9 @@
1
+ // Exported for unit tests (index-name / primary-key shape) without a live Meili.
2
+ export function meilisearchTenantIndex(prefix, tenantId) {
3
+ return `${prefix}t${tenantId}`;
4
+ }
5
+ // Meilisearch primary-key-ids: alphanumerics, `-`, `_`. UUIDs contain `-` —
6
+ // legal. Replace anything else just in case callers pass unexpected shapes.
7
+ export function meilisearchDocId(entityType, entityId) {
8
+ return `${entityType}_${String(entityId).replace(/[^0-9A-Za-z_-]/g, "_")}`;
9
+ }
@@ -1,10 +1,3 @@
1
- import type { EntityId, TenantId } from "../engine/types/identifiers.ts";
1
+ import { type MeilisearchAdapterOptions } from "./meilisearch-adapter-internals.ts";
2
2
  import type { SearchAdapter } from "./types.ts";
3
- export type MeilisearchAdapterOptions = {
4
- url: string;
5
- apiKey: string;
6
- indexPrefix?: string;
7
- };
8
- export declare function meilisearchTenantIndex(prefix: string, tenantId: TenantId): string;
9
- export declare function meilisearchDocId(entityType: string, entityId: EntityId): string;
10
3
  export declare function createMeilisearchAdapter(options: MeilisearchAdapterOptions): SearchAdapter;
@@ -1,5 +1,10 @@
1
1
  import { errorCodeOf } from "@cosmicdrift/kumiko-types/type-guards";
2
- import { ErrorStatusCode, Meilisearch } from "meilisearch";
2
+ import { importOptionalPeer } from "../utils/import-optional-peer.js";
3
+ import { meilisearchDocId, meilisearchTenantIndex, } from "./meilisearch-adapter-internals.js";
4
+ import { MEILISEARCH_PEER } from "./meilisearch-peer.js";
5
+ // meilisearch is an optional peer; a static import would fail with the runtime's bare
6
+ // "Cannot find package" error instead of naming the peer and how to install it.
7
+ const { ErrorStatusCode, Meilisearch } = await importOptionalPeer(MEILISEARCH_PEER, () => import("meilisearch"));
3
8
  // meilisearch's waitTask() RESOLVES (never rejects) once the server task
4
9
  // reaches a terminal state, even "failed" — a rejected doc (e.g. an id over
5
10
  // Meili's 511-byte limit) otherwise fails silently and the caller thinks
@@ -50,14 +55,8 @@ function isIndexNotFound(err) {
50
55
  return errorCodeOf(cause) === ErrorStatusCode.INDEX_NOT_FOUND;
51
56
  }
52
57
  // Exported for unit tests (index-name / primary-key shape) without a live Meili.
53
- export function meilisearchTenantIndex(prefix, tenantId) {
54
- return `${prefix}t${tenantId}`;
55
- }
56
58
  // Meilisearch primary-key-ids: alphanumerics, `-`, `_`. UUIDs contain `-` —
57
59
  // legal. Replace anything else just in case callers pass unexpected shapes.
58
- export function meilisearchDocId(entityType, entityId) {
59
- return `${entityType}_${String(entityId).replace(/[^0-9A-Za-z_-]/g, "_")}`;
60
- }
61
60
  export function createMeilisearchAdapter(options) {
62
61
  const client = new Meilisearch({ host: options.url, apiKey: options.apiKey });
63
62
  const prefix = options.indexPrefix ?? "kumiko_";
@@ -0,0 +1,2 @@
1
+ import type { OptionalPeer } from "../utils/import-optional-peer.ts";
2
+ export declare const MEILISEARCH_PEER: OptionalPeer;
@@ -0,0 +1,5 @@
1
+ export const MEILISEARCH_PEER = {
2
+ name: "meilisearch",
3
+ range: "^0.58.0",
4
+ requiredBy: "@cosmicdrift/kumiko-framework/search/meilisearch",
5
+ };
@@ -6,7 +6,8 @@
6
6
  // existing row and indexes it, same as a live write would.
7
7
  import { resolveTableName } from "../db/entity-table-meta.js";
8
8
  import { executeRawQueryRead } from "../db/queries/raw-sql.js";
9
- import { withoutStatementTimeout } from "../db/statement-timeout.js";
9
+ import { runInNewTransaction, runnerCanBeginTransaction } from "../db/query.js";
10
+ import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
10
11
  import { buildSearchDocument, decryptSearchableSubjectFields, hasErasedSearchableSubjectField, } from "../pipeline/system-hooks.js";
11
12
  import { toSnakeCase } from "../utils/case.js";
12
13
  function quoteIdent(name) {
@@ -26,111 +27,126 @@ function rowToState(row, fieldNames) {
26
27
  }
27
28
  return state;
28
29
  }
29
- export function reindexEntity(db, registry, searchAdapter, entityName, tenantId, options = {}) {
30
- return withoutStatementTimeout(db, (unboundedDb) => scanAndIndexEntity(unboundedDb, registry, searchAdapter, entityName, tenantId, options));
31
- }
32
- async function scanAndIndexEntity(db, registry, searchAdapter, entityName, tenantId, options) {
33
- const entity = registry.getEntity(entityName);
34
- if (!entity) {
35
- throw new Error(`reindexEntity: unknown entity "${entityName}"`);
36
- }
37
- const searchableFields = registry.getSearchableFields(entityName);
38
- const extensions = registry.getSearchPayloadExtensions(entityName);
39
- if (searchableFields.length === 0 && extensions.length === 0) {
40
- throw new Error(`reindexEntity: entity "${entityName}" has no searchable fields and no search-payload ` +
41
- `extensions — nothing to index.`);
30
+ // Server pools cap statement_timeout, and a batch scan over a large table can outlast it. The caller's
31
+ // runner (often a gated proxy around the pool) is used as is, so the cap is lifted per batch
32
+ // with a transaction-local set_config instead of moving the scan to an ungated sibling pool. A runner already inside a
33
+ // transaction keeps the caller's setting rather than leaking ours into its remaining statements.
34
+ async function readBatchWithoutStatementTimeout(db, sqlText, params) {
35
+ if (!runnerCanBeginTransaction(db)) {
36
+ return executeRawQueryRead(db, sqlText, params);
42
37
  }
43
- const batchSize = options.batchSize ?? 500;
44
- const tableName = resolveTableName(entityName, entity, undefined);
45
- const fieldNames = Object.keys(entity.fields);
46
- // Soft-deleted rows already left the live index (the .deleted consumer
47
- // calls searchAdapter.remove()) — resurrecting them here would make
48
- // erased entities findable again.
49
- const deletedFilter = entity.softDelete === true ? `AND ${quoteIdent("is_deleted")} IS NOT TRUE` : "";
50
- const failures = [];
51
- const result = { scannedRows: 0, indexedRows: 0, wouldIndexRows: 0, failures };
52
- let lastId;
53
- // Whether a searchable field lacks a matching read-table column depends
54
- // only on the table's column set (rowToState/Object.hasOwn), not on any
55
- // particular row's data — every row from the same SELECT * has the same
56
- // columns. Check once against the first row instead of every row, so a
57
- // dropped/never-migrated column fails fast with one clear error instead
58
- // of one identical failures[] entry per scanned row (1M rows → 1M
59
- // entries, and the real schema problem is buried in "x failed").
60
- let uncheckedSchema = true;
61
- for (;;) {
62
- // Keyset, not OFFSET: rows deleted or changed while the loop runs must not shift the window.
63
- const afterLastId = lastId === undefined ? "" : `AND ${quoteIdent("id")} > $3`;
64
- const rows = await executeRawQueryRead(db, `SELECT * FROM ${quoteIdent(tableName)}
38
+ return runInNewTransaction(db, async (tx) => {
39
+ await executeRawQueryRead(tx, "SELECT set_config('statement_timeout', '0', true)", []);
40
+ return executeRawQueryRead(tx, sqlText, params);
41
+ });
42
+ }
43
+ export async function reindexEntity(db, registry, searchAdapter, entityName, tenantId, options = {}) {
44
+ return runInSystemRowLevelSecurityScope("search reindex reads entity rows of all tenants", async () => {
45
+ const entity = registry.getEntity(entityName);
46
+ if (!entity) {
47
+ throw new Error(`reindexEntity: unknown entity "${entityName}"`);
48
+ }
49
+ const searchableFields = registry.getSearchableFields(entityName);
50
+ const extensions = registry.getSearchPayloadExtensions(entityName);
51
+ if (searchableFields.length === 0 && extensions.length === 0) {
52
+ throw new Error(`reindexEntity: entity "${entityName}" has no searchable fields and no search-payload ` +
53
+ `extensions — nothing to index.`);
54
+ }
55
+ const batchSize = options.batchSize ?? 500;
56
+ const tableName = resolveTableName(entityName, entity, undefined);
57
+ const fieldNames = Object.keys(entity.fields);
58
+ // Soft-deleted rows already left the live index (the .deleted consumer
59
+ // calls searchAdapter.remove()) — resurrecting them here would make
60
+ // erased entities findable again.
61
+ const deletedFilter = entity.softDelete === true ? `AND ${quoteIdent("is_deleted")} IS NOT TRUE` : "";
62
+ const failures = [];
63
+ const result = { scannedRows: 0, indexedRows: 0, wouldIndexRows: 0, failures };
64
+ let lastId;
65
+ // Whether a searchable field lacks a matching read-table column depends
66
+ // only on the table's column set (rowToState/Object.hasOwn), not on any
67
+ // particular row's data — every row from the same SELECT * has the same
68
+ // columns. Check once against the first row instead of every row, so a
69
+ // dropped/never-migrated column fails fast with one clear error instead
70
+ // of one identical failures[] entry per scanned row (1M rows → 1M
71
+ // entries, and the real schema problem is buried in "x failed").
72
+ let uncheckedSchema = true;
73
+ for (;;) {
74
+ // Keyset, not OFFSET: rows deleted or changed while the loop runs must not shift the window.
75
+ const afterLastId = lastId === undefined ? "" : `AND ${quoteIdent("id")} > $3`;
76
+ const rows = await readBatchWithoutStatementTimeout(db, `SELECT * FROM ${quoteIdent(tableName)}
65
77
  WHERE ${quoteIdent("tenant_id")} = $1 ${deletedFilter} ${afterLastId}
66
78
  ORDER BY ${quoteIdent("id")} ASC
67
79
  LIMIT $2`, lastId === undefined ? [tenantId, batchSize] : [tenantId, batchSize, lastId]);
68
- const [firstRow] = rows;
69
- if (firstRow === undefined)
70
- break;
71
- if (uncheckedSchema) {
72
- uncheckedSchema = false;
73
- const sampleState = rowToState(firstRow, fieldNames);
74
- const unmappedField = searchableFields.find((fieldName) => !(fieldName in sampleState));
75
- if (unmappedField !== undefined) {
76
- throw new Error(`reindexEntity: searchable field "${unmappedField}" is not mappable from read-table ` +
77
- `column ${quoteIdent(tableName)} — likely a dropped/never-migrated column.`);
78
- }
79
- }
80
- const docs = [];
81
- for (const row of rows) {
82
- result.scannedRows++;
83
- const entityId = String(row["id"]);
84
- try {
85
- const rawState = rowToState(row, fieldNames);
86
- // `pii + searchable` fields hold ciphertext on the read-table row —
87
- // decrypt the same way the live write-path consumer does. An
88
- // erased subject key doesn't throw, it swaps the value for
89
- // PII_ERASED_SENTINEL (see decryptSearchableSubjectFields) — check
90
- // for that AFTER decrypting, mirroring the softDelete filter above:
91
- // resurrecting a crypto-shredded row here would undo
92
- // purgeSearchDocumentsForSubject and make it findable again.
93
- const state = await decryptSearchableSubjectFields(entityName, rawState, registry);
94
- if (hasErasedSearchableSubjectField(entityName, state, registry))
95
- continue;
96
- const doc = await buildSearchDocument(entityName, entityId, state, registry);
97
- if (doc)
98
- docs.push({ entityId, doc });
99
- }
100
- catch (e) {
101
- result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
80
+ const [firstRow] = rows;
81
+ if (firstRow === undefined)
82
+ break;
83
+ if (uncheckedSchema) {
84
+ uncheckedSchema = false;
85
+ const sampleState = rowToState(firstRow, fieldNames);
86
+ const unmappedField = searchableFields.find((fieldName) => !(fieldName in sampleState));
87
+ if (unmappedField !== undefined) {
88
+ throw new Error(`reindexEntity: searchable field "${unmappedField}" is not mappable from read-table ` +
89
+ `column ${quoteIdent(tableName)} — likely a dropped/never-migrated column.`);
90
+ }
102
91
  }
103
- }
104
- if (!options.dryRun && docs.length > 0) {
105
- if (searchAdapter.indexBatch) {
92
+ const docs = [];
93
+ for (const row of rows) {
94
+ result.scannedRows++;
95
+ const entityId = String(row["id"]);
106
96
  try {
107
- await searchAdapter.indexBatch(tenantId, docs.map((d) => d.doc));
108
- result.indexedRows += docs.length;
97
+ const rawState = rowToState(row, fieldNames);
98
+ // `pii + searchable` fields hold ciphertext on the read-table row —
99
+ // decrypt the same way the live write-path consumer does. An
100
+ // erased subject key doesn't throw, it swaps the value for
101
+ // PII_ERASED_SENTINEL (see decryptSearchableSubjectFields) — check
102
+ // for that AFTER decrypting, mirroring the softDelete filter above:
103
+ // resurrecting a crypto-shredded row here would undo
104
+ // purgeSearchDocumentsForSubject and make it findable again.
105
+ const state = await decryptSearchableSubjectFields(entityName, rawState, registry);
106
+ if (hasErasedSearchableSubjectField(entityName, state, registry))
107
+ continue;
108
+ const doc = await buildSearchDocument(entityName, entityId, state, registry);
109
+ if (doc)
110
+ docs.push({ entityId, doc });
109
111
  }
110
112
  catch (e) {
111
- const reason = e instanceof Error ? e.message : String(e);
112
- for (const { entityId } of docs)
113
- result.failures.push({ entityId, reason });
113
+ result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
114
114
  }
115
115
  }
116
- else {
117
- for (const { entityId, doc } of docs) {
116
+ if (!options.dryRun && docs.length > 0) {
117
+ if (searchAdapter.indexBatch) {
118
118
  try {
119
- await searchAdapter.index(tenantId, doc);
120
- result.indexedRows++;
119
+ await searchAdapter.indexBatch(tenantId, docs.map((d) => d.doc));
120
+ result.indexedRows += docs.length;
121
121
  }
122
122
  catch (e) {
123
- result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
123
+ const reason = e instanceof Error ? e.message : String(e);
124
+ for (const { entityId } of docs)
125
+ result.failures.push({ entityId, reason });
126
+ }
127
+ }
128
+ else {
129
+ for (const { entityId, doc } of docs) {
130
+ try {
131
+ await searchAdapter.index(tenantId, doc);
132
+ result.indexedRows++;
133
+ }
134
+ catch (e) {
135
+ result.failures.push({
136
+ entityId,
137
+ reason: e instanceof Error ? e.message : String(e),
138
+ });
139
+ }
124
140
  }
125
141
  }
126
142
  }
143
+ else if (options.dryRun) {
144
+ result.wouldIndexRows += docs.length;
145
+ }
146
+ lastId = rows[rows.length - 1]?.["id"];
147
+ if (rows.length < batchSize)
148
+ break;
127
149
  }
128
- else if (options.dryRun) {
129
- result.wouldIndexRows += docs.length;
130
- }
131
- lastId = rows[rows.length - 1]?.["id"];
132
- if (rows.length < batchSize)
133
- break;
134
- }
135
- return result;
150
+ return result;
151
+ });
136
152
  }
@@ -1,9 +1,8 @@
1
- export { createDekCache, type DekCache, type DekCacheOptions, withDekCache } from "./dek-cache.ts";
1
+ export { createDekCache, type DekCache, withDekCache } from "./dek-cache.ts";
2
2
  export { derivePurposeSecret } from "./derive-purpose-secret.ts";
3
- export { createEnvMasterKeyProvider, type EnvMasterKeyProviderOptions, type Keyring, } from "./env-master-key-provider.ts";
3
+ export { createEnvMasterKeyProvider } from "./env-master-key-provider.ts";
4
4
  export { decryptValue, encryptValue } from "./envelope.ts";
5
5
  export { createEnvelopeCipher, type EnvelopeCipher, type EnvelopeCipherOptions, } from "./envelope-cipher.ts";
6
- export { assertNoSecretLeak } from "./leak-guard.ts";
7
6
  export { rewrapDek } from "./rotation.ts";
8
7
  export { decodeStoredEnvelope, encodeStoredEnvelope, isStoredEnvelope, type StoredEnvelope, } from "./stored-envelope.ts";
9
- export { type ContainsSecret, createSecret, type Envelope, isSecret, type KeyScope, type MasterKeyProvider, type Secret, type SecretAuditContext, type SecretKeyRef, type SecretsContext, } from "./types.ts";
8
+ export { createSecret, type MasterKeyProvider, type Secret, type SecretsContext, } from "./types.ts";
@@ -1,9 +1,8 @@
1
1
  export { createDekCache, withDekCache } from "./dek-cache.js";
2
2
  export { derivePurposeSecret } from "./derive-purpose-secret.js";
3
- export { createEnvMasterKeyProvider, } from "./env-master-key-provider.js";
3
+ export { createEnvMasterKeyProvider } from "./env-master-key-provider.js";
4
4
  export { decryptValue, encryptValue } from "./envelope.js";
5
5
  export { createEnvelopeCipher, } from "./envelope-cipher.js";
6
- export { assertNoSecretLeak } from "./leak-guard.js";
7
6
  export { rewrapDek } from "./rotation.js";
8
7
  export { decodeStoredEnvelope, encodeStoredEnvelope, isStoredEnvelope, } from "./stored-envelope.js";
9
- export { createSecret, isSecret, } from "./types.js";
8
+ export { createSecret, } from "./types.js";
@@ -1,3 +1,3 @@
1
- export { type EventStoreSeedExisting, type RunEventStoreSeedOptions, runEventStoreSeed, } from "./entity-seed.ts";
1
+ export { runEventStoreSeed } from "./entity-seed.ts";
2
2
  export { createTestUser, TestUsers, testTenantId, testUserId } from "./seed-users.ts";
3
- export { DEFAULT_SEED_IF_EXISTS, type SeedIfExists } from "./types.ts";
3
+ export type { SeedIfExists } from "./types.ts";
@@ -1,3 +1,2 @@
1
- export { runEventStoreSeed, } from "./entity-seed.js";
1
+ export { runEventStoreSeed } from "./entity-seed.js";
2
2
  export { createTestUser, TestUsers, testTenantId, testUserId } from "./seed-users.js";
3
- export { DEFAULT_SEED_IF_EXISTS } from "./types.js";
@@ -1,6 +1,6 @@
1
1
  export { warnIfNonUtcServerTimeZone } from "./boot-tz-warning.ts";
2
- export type { GeoAddress, GeoCoordinates, GeoTzProvider } from "./geo-tz.ts";
2
+ export type { GeoTzProvider } from "./geo-tz.ts";
3
3
  export { isValidIanaTimeZone } from "./iana.ts";
4
4
  export { instantToLegacyDate, legacyDateToInstant } from "./legacy-date.ts";
5
5
  export { ensureTemporalPolyfill, getTemporal } from "./polyfill.ts";
6
- export { type Clock, createTzContext, createTzContextAsync, type LocatedTimestampJson, type TzContext, type TzContextOptions, } from "./tz-context.ts";
6
+ export { createTzContext, type TzContext, } from "./tz-context.ts";
@@ -12,4 +12,4 @@ export { warnIfNonUtcServerTimeZone } from "./boot-tz-warning.js";
12
12
  export { isValidIanaTimeZone } from "./iana.js";
13
13
  export { instantToLegacyDate, legacyDateToInstant } from "./legacy-date.js";
14
14
  export { ensureTemporalPolyfill, getTemporal } from "./polyfill.js";
15
- export { createTzContext, createTzContextAsync, } from "./tz-context.js";
15
+ export { createTzContext, } from "./tz-context.js";
@@ -6,8 +6,3 @@ export type { Clock, LocatedTimestampJson, TzContext, TzContextOptions, } from "
6
6
  * buildHandlerContext stays ambient-free.
7
7
  */
8
8
  export declare function createTzContext(options?: TzContextOptions): TzContext;
9
- /**
10
- * Convenience: ensures the polyfill is loaded AND creates the TzContext in
11
- * one await. Prefer this in boot code.
12
- */
13
- export declare function createTzContextAsync(options?: TzContextOptions): Promise<TzContext>;
@@ -18,7 +18,6 @@
18
18
  // The pure type contracts (TzContext, TzContextOptions, LocatedTimestampJson)
19
19
  // live in @cosmicdrift/kumiko-types/tz-context — only the factories are here.
20
20
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
21
- import { ensureTemporalPolyfill } from "./polyfill.js";
22
21
  const SYSTEM_CLOCK = {
23
22
  now: () => Temporal.Now.instant(), // @wrapper-known semantic-alias
24
23
  };
@@ -72,11 +71,3 @@ export function createTzContext(options = {}) {
72
71
  },
73
72
  };
74
73
  }
75
- /**
76
- * Convenience: ensures the polyfill is loaded AND creates the TzContext in
77
- * one await. Prefer this in boot code.
78
- */
79
- export async function createTzContextAsync(options) {
80
- await ensureTemporalPolyfill();
81
- return createTzContext(options);
82
- }
@@ -5,22 +5,19 @@ export type { FormDerivationScreen } from "../engine/form-derivations.ts";
5
5
  export { applyFormDerivations, isFormDerivationInputMode, isUnusedFallbackOperand, } from "../engine/form-derivations.ts";
6
6
  export type { ParsedRefTarget } from "../engine/parse-ref-target.ts";
7
7
  export { parseRefTarget } from "../engine/parse-ref-target.ts";
8
- export type { FieldsOrGroupsSection, UnavailableSelectOption } from "../engine/screen-helpers.ts";
9
- export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, explicitListScreenId, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.ts";
10
- export type { BooleanFieldDef, DateFieldDef, EmbeddedDerivedCellDef, EntityDefinition, FieldDefinition, FileFieldDef, FilesFieldDef, ImageFieldDef, ImagesFieldDef, NumberFieldDef, OptionsQueryPayload, OptionsQueryPayloadValue, SelectFieldDef, SelectOptionTone, TextFieldDef, } from "../engine/types/fields.ts";
11
- export type { AccessRule, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, RoleAccessPersonalData, RoleAccessRule, } from "../engine/types/handlers.ts";
8
+ export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.ts";
9
+ export type { EmbeddedDerivedCellDef, EntityDefinition, FieldDefinition, OptionsQueryPayload, SelectOptionTone, TextFieldDef, } from "../engine/types/fields.ts";
10
+ export type { AccessRule } from "../engine/types/handlers.ts";
12
11
  export { isOpenToAllGranted, isUiAccessGranted } from "../engine/types/handlers.ts";
13
12
  export type { IconKey, NavDefinition, NavIconKey } from "../engine/types/nav.ts";
14
- export type { ActionFormFooterAction, ActionFormLoad, ActionFormRedirect, ActionFormScreenDefinition, ActionFormSuccessFact, ActionFormSuccessLink, ConfigEditScreenDefinition, CustomScreenDefinition, CustomScreenRoute, DashboardChartKind, DashboardChartMarkerKind, DashboardChartPanel, DashboardChartRangeOption, DashboardChartRanges, DashboardChartTone, DashboardCurrencyFormat, DashboardCustomPanel, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardI18nText, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelGate, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRecordBinding, DashboardRefresh, DashboardRelativeTimeFormat, DashboardRelativeTimeParam, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardTimeRangeDefinition, DashboardValueFormat, EditExtensionSection, EditFieldPrefill, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedListEditSpec, EntityEditAction, EntityEditActionPlacement, EntityEditScreenDefinition, EntityListExpandableRow, EntityListFacetConfig, EntityListFacetExtraOption, EntityListScreenDefinition, EntityWriteExcludedFields, FieldAffix, FieldCondition, FieldFillAction, FieldIconKey, FieldRenderer, FormWidth, ListBadgeTone, ListColumnDisplay, ListColumnSpec, ListEmptyStateSpec, ListFacetSpec, ListSortSpec, MetricNavigate, MetricSpec, PlatformComponent, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSubtitlePart, RelatedListGroupBy, RelatedListRowTone, RelatedListToolbarAction, RowAction, RowActionClientAction, RowActionDisplay, RowActionDrawer, RowActionMode, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ScreenDefinition, ScreenFilter, ScreenFilterOp, ScreenSlots, SecretMintConfirmStep, SecretMintScreenDefinition, SecretReveal, SecretRevealField, SecretsEditScreenDefinition, SecretsEditSection, ToolbarAction, } from "../engine/types/screen.ts";
15
- export { relatedListGroupHeaderLabel, relatedListGroupKey, } from "../engine/types/screen.ts";
13
+ export type { ActionFormFooterAction, ActionFormLoad, ActionFormRedirect, ActionFormScreenDefinition, ActionFormSuccessFact, ActionFormSuccessLink, ConfigEditScreenDefinition, CustomScreenDefinition, DashboardChartMarkerKind, DashboardChartPanel, DashboardCurrencyFormat, DashboardCustomPanel, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardI18nText, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRefresh, DashboardRelativeTimeParam, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardTimeRangeDefinition, EditExtensionSection, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedListEditSpec, EntityEditAction, EntityEditScreenDefinition, EntityListFacetConfig, EntityListScreenDefinition, FieldAffix, FieldCondition, FieldFillAction, FieldIconKey, FieldRenderer, FormWidth, ListBulkAction, ListColumnSpec, ListEmptyStateSpec, ListFacetSpec, ListSortSpec, ListTableOptions, MetricNavigate, PlatformComponent, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSubtitlePart, RelatedListRowTone, RelatedListToolbarAction, RowAction, RowActionClientAction, RowActionDisplay, RowActionDrawer, RowActionMode, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ScreenDefinition, ScreenSlots, SecretMintConfirmStep, SecretMintScreenDefinition, SecretsEditScreenDefinition, ToolbarAction, } from "../engine/types/screen.ts";
14
+ export { MAX_BULK_SELECTION } from "../engine/types/screen.ts";
16
15
  export type { TargetRef } from "../engine/types/target-ref.ts";
17
- export type { TreeAction, TreeNode, TreeNodeState } from "../engine/types/tree-node.ts";
16
+ export type { TreeAction } from "../engine/types/tree-node.ts";
18
17
  export type { WorkspaceDefinition } from "../engine/types/workspace.ts";
19
18
  export { ACTION_FORM_ENTITY, handlerFieldLabelKey, handlerTitleKey, PROJECTION_DETAIL_ENTITY, WRITE_FORM_SECTION_ENTITY, } from "../i18n/required-surface-keys.ts";
20
19
  export type { AppSchema, FeatureSchema, QualifiedContentCollection, WorkspaceSchema, } from "./app-schema.ts";
21
- export type { CardColumnRoles, CardRoleColumn } from "./card-column-roles.ts";
22
- export { CARD_META_MAX, cardColumnRoles, cardFileDisplayKind } from "./card-column-roles.ts";
20
+ export { CARD_META_MAX, cardColumnRoles } from "./card-column-roles.ts";
23
21
  export { type Formality, formalLocaleTag } from "./formality.ts";
24
- export type { ListRowMetaColumnType, ListRowMetaReference, ReferenceLookupSource, SystemReferenceLabel, } from "./list-row-meta.ts";
25
22
  export { LIST_ROW_META_COLUMNS, LIST_ROW_META_REFERENCES, REFERENCE_LOOKUP_SOURCES, SYSTEM_REFERENCE_LABELS, UNRESOLVED_REFERENCE_LABEL_KEYS, } from "./list-row-meta.ts";
26
- export { type PluralForms, resolveTranslationValue, type TranslationValue, translationValueOtherText, } from "./plural.ts";
23
+ export { resolveTranslationValue, type TranslationValue, translationValueOtherText, } from "./plural.ts";
@@ -23,11 +23,11 @@ export { NO_WIDGET_FIELD_TYPES } from "@cosmicdrift/kumiko-types/fields";
23
23
  export { computeDerivedCellValue, roundDerivedCellValue } from "../engine/embedded-derived.js";
24
24
  export { applyFormDerivations, isFormDerivationInputMode, isUnusedFallbackOperand, } from "../engine/form-derivations.js";
25
25
  export { parseRefTarget } from "../engine/parse-ref-target.js";
26
- export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, explicitListScreenId, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.js";
26
+ export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.js";
27
27
  export { isOpenToAllGranted, isUiAccessGranted } from "../engine/types/handlers.js";
28
- export { relatedListGroupHeaderLabel, relatedListGroupKey, } from "../engine/types/screen.js";
28
+ export { MAX_BULK_SELECTION } from "../engine/types/screen.js";
29
29
  export { ACTION_FORM_ENTITY, handlerFieldLabelKey, handlerTitleKey, PROJECTION_DETAIL_ENTITY, WRITE_FORM_SECTION_ENTITY, } from "../i18n/required-surface-keys.js";
30
- export { CARD_META_MAX, cardColumnRoles, cardFileDisplayKind } from "./card-column-roles.js";
30
+ export { CARD_META_MAX, cardColumnRoles } from "./card-column-roles.js";
31
31
  export { formalLocaleTag } from "./formality.js";
32
32
  export { LIST_ROW_META_COLUMNS, LIST_ROW_META_REFERENCES, REFERENCE_LOOKUP_SOURCES, SYSTEM_REFERENCE_LABELS, UNRESOLVED_REFERENCE_LABEL_KEYS, } from "./list-row-meta.js";
33
33
  export { resolveTranslationValue, translationValueOtherText, } from "./plural.js";
@@ -1,3 +1,4 @@
1
+ import type { UpgradeMarkerResolvedManual } from "./upgrade-marker-parse.ts";
1
2
  export type UpgradeChangelogManual = {
2
3
  readonly id: string;
3
4
  readonly version: string;
@@ -23,3 +24,5 @@ export type UpgradeChangelogSection = {
23
24
  export declare function renderUpgradeSection(section: UpgradeChangelogSection): string;
24
25
  /** Puts the section on top; a section for the same target version is replaced, so a re-run stays idempotent. */
25
26
  export declare function mergeUpgradeSection(existing: string | undefined, section: UpgradeChangelogSection): string;
27
+ /** Pure string match on the rendered `- [open] <id> · ` prefix, in every section; each id gets its own resolution. */
28
+ export declare function syncResolvedManualStatuses(content: string, resolved: readonly Pick<UpgradeMarkerResolvedManual, "id" | "resolution">[]): string;