@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,3 +1,4 @@
1
+ import { isUuid } from "@cosmicdrift/kumiko-types/identifiers";
1
2
  import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
2
3
  import { Hono } from "hono";
3
4
  import { bodyLimit } from "hono/body-limit";
@@ -5,17 +6,20 @@ import { getUser } from "../api/auth-middleware.js";
5
6
  import { requestContext } from "../api/request-context.js";
6
7
  import { collectPiiSubjectFields, configuredPiiSubjectKms, decryptPiiFieldValues, isPiiCiphertext, PII_ERASED_SENTINEL, } from "../crypto/index.js";
7
8
  import { selectMany } from "../db/query.js";
9
+ import { runInRowLevelSecurityScope, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
8
10
  import { createProjectingTenantDb } from "../db/tenant-db.js";
9
- import { createDerivativesContext, resolveFieldVariant, resolveRenderer, } from "../derivatives/index.js";
11
+ import { createDerivativesContext, resolveRenderer } from "../derivatives/derivatives-context.js";
12
+ import { resolveFieldVariant } from "../derivatives/index.js";
13
+ import { isFileField } from "../engine/field-helpers.js";
10
14
  import { isAnonymousSessionUser, SYSTEM_USER_ID } from "../engine/system-user.js";
11
- import { isFileField, isUuid, } from "../engine/types/index.js";
15
+ import { createFailOpenReporter, respondRateLimited } from "../rate-limit/middleware.js";
12
16
  import { listActionFormFileFields, mayUseActionForm } from "./action-form-upload.js";
13
17
  import { buildContentDispositionHeader } from "./content-disposition.js";
14
18
  import { DEFAULT_MAX_UPLOAD_SIZE, getFileRefExecutor, storeFileAsFileRef, } from "./create-file-ref.js";
15
19
  import { createFileContext, createTenantFileContext } from "./file-handle.js";
16
20
  import { fileRefEntity } from "./file-ref-entity.js";
17
21
  import { fileRefsTable } from "./file-ref-table.js";
18
- import { RecordWriteDecisions } from "./record-write-check.js";
22
+ import { isStoredRecordLocked, RecordWriteDecisions, } from "./record-write-check.js";
19
23
  import { neutralFileNameForMimeType } from "./resolve-content-type.js";
20
24
  import { parseMaxSize, resolveServedContentType } from "./types.js";
21
25
  import { withUploadLedger } from "./upload-ledger.js";
@@ -31,6 +35,8 @@ const DEFAULT_PRIVILEGED_ROLES = ["Admin", "SystemAdmin"];
31
35
  // credential (see "Signed-URL default expiry" in core-files.md).
32
36
  const SIGNED_URL_DEFAULT_EXPIRY_SECONDS = 15 * 60;
33
37
  const MAX_BATCH_META_IDS = 100;
38
+ const META_BATCH_IDS_PER_WINDOW = 1_000;
39
+ const META_BATCH_WINDOW_SECONDS = 60;
34
40
  // Each detail() read decrypts through the KMS pool; a bounded chunk keeps one batch from hogging it.
35
41
  const BATCH_META_CONCURRENCY = 10;
36
42
  // Default guard: on attached files, allow the uploader or a privileged role,
@@ -101,7 +107,8 @@ export function readFilesRouteOptions(registry) {
101
107
  return {};
102
108
  }
103
109
  export function createFileRoutes(options) {
104
- const { db } = options;
110
+ const { db, metaBatchRateLimitResolver } = options;
111
+ const reportMetaBatchLimiterFailOpen = createFailOpenReporter("files-meta-batch");
105
112
  // Plain resolvers (not built via withFileProviderResolver) get the ledger on the route's own root connection.
106
113
  const resolveProvider = options.resolveProvider.uploadLedgerFor
107
114
  ? options.resolveProvider
@@ -112,6 +119,13 @@ export function createFileRoutes(options) {
112
119
  const executor = getFileRefExecutor();
113
120
  const piiSubjectFields = collectPiiSubjectFields(fileRefEntity);
114
121
  const api = new Hono();
122
+ // These routes read the file table on the root connection, outside the dispatcher, so the caller's tenant scope is opened here.
123
+ api.use("*", async (c, next) => {
124
+ const user = getUser(c);
125
+ if (user === undefined)
126
+ return next();
127
+ return runInRowLevelSecurityScope(tenantRowLevelSecurityScope(user.tenantId), next);
128
+ });
115
129
  const tenantDbFor = (tenantId) => createProjectingTenantDb(db, tenantId, options.registry);
116
130
  const fileNameIsPersonal = piiSubjectFields.includes("fileName");
117
131
  function kmsContextFor() {
@@ -205,6 +219,10 @@ export function createFileRoutes(options) {
205
219
  }
206
220
  const data = new Uint8Array(await file.arrayBuffer());
207
221
  const files = createTenantFileContext(resolveProvider, user.tenantId);
222
+ const { registry } = options;
223
+ const isAttachTargetLocked = registry !== undefined && entityType !== undefined && entityId !== undefined
224
+ ? (rowDb) => isStoredRecordLocked({ registry, db: rowDb, entityType, entityId })
225
+ : undefined;
208
226
  const outcome = await storeFileAsFileRef({
209
227
  user,
210
228
  tenantDb: tenantDbFor(user.tenantId),
@@ -216,6 +234,7 @@ export function createFileRoutes(options) {
216
234
  await files.ref(key).delete();
217
235
  await files.forgetUploadBytes(key);
218
236
  },
237
+ ...(isAttachTargetLocked ? { isAttachTargetLocked } : {}),
219
238
  }, {
220
239
  fileName: file.name,
221
240
  declaredMimeType: file.type,
@@ -227,6 +246,9 @@ export function createFileRoutes(options) {
227
246
  });
228
247
  if (outcome.kind === "rejected")
229
248
  return c.json({ error: outcome.error }, 400);
249
+ if (outcome.kind === "target-locked") {
250
+ return c.json({ error: "record_locked: the record is locked" }, 409);
251
+ }
230
252
  if (outcome.kind === "failed")
231
253
  return c.json({ error: "upload_failed" }, 500);
232
254
  return c.json(outcome.fileRef, 201);
@@ -240,6 +262,21 @@ export function createFileRoutes(options) {
240
262
  const ids = [...new Set((c.req.query("ids") ?? "").split(",").filter((id) => isUuid(id)))];
241
263
  if (ids.length > MAX_BATCH_META_IDS)
242
264
  return c.json({ error: "too_many_ids" }, 400);
265
+ if (metaBatchRateLimitResolver && ids.length > 0) {
266
+ const bucket = `files-meta:${user.tenantId}:${user.id}`;
267
+ try {
268
+ const decision = await metaBatchRateLimitResolver.check(bucket, {
269
+ limit: META_BATCH_IDS_PER_WINDOW,
270
+ windowSeconds: META_BATCH_WINDOW_SECONDS,
271
+ cost: ids.length,
272
+ });
273
+ if (!decision.allowed)
274
+ return respondRateLimited(c, decision, bucket);
275
+ }
276
+ catch (e) {
277
+ reportMetaBatchLimiterFailOpen(e);
278
+ }
279
+ }
243
280
  const files = [];
244
281
  for (let start = 0; start < ids.length; start += BATCH_META_CONCURRENCY) {
245
282
  const chunk = ids.slice(start, start + BATCH_META_CONCURRENCY);
@@ -1,25 +1,23 @@
1
1
  export { listActionFormFileFields, resolveActionFormFileField } from "./action-form-upload.ts";
2
- export type { BindPendingFileRefOutcome, PendingFileRef, PendingFileRefBindTarget, } from "./bind-pending-file-refs.ts";
2
+ export type { PendingFileRef } from "./bind-pending-file-refs.ts";
3
3
  export { bindPendingFileRef, loadPendingFileRef } from "./bind-pending-file-refs.ts";
4
- export type { CreatedFileRef, CreateFileRefContext, CreateFileRefInput, UploadedFileBytes, UploadFileBytesContext, } from "./create-file-ref-from-bytes.ts";
4
+ export type { CreatedFileRef, CreateFileRefInput, UploadedFileBytes, } from "./create-file-ref-from-bytes.ts";
5
5
  export { createFileRefFromBytes, createFileRefFromUploadedBytes, uploadFileBytesBeforeTransaction, } from "./create-file-ref-from-bytes.ts";
6
6
  export { createFilesFeature, FILES_FEATURE } from "./feature.ts";
7
- export type { FileContext, FileHandle } from "./file-handle.ts";
7
+ export type { FileContext } from "./file-handle.ts";
8
8
  export { createFileContext, createTenantFileContext, deriveKey, storageKeyStemPrefix, } from "./file-handle.ts";
9
9
  export { FILE_REF_ENTITY_NAME, fileRefEntity } from "./file-ref-entity.ts";
10
10
  export { fileRefsTable } from "./file-ref-table.ts";
11
- export type { FileAccessDecision, FileAccessGuard, FileRef, FileRoutesOptions, } from "./file-routes.ts";
12
- export { createFileRoutes, readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.ts";
11
+ export type { FileAccessGuard } from "./file-routes.ts";
12
+ export { readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.ts";
13
13
  export type { InMemoryFileProvider } from "./in-memory-provider.ts";
14
14
  export { createInMemoryFileProvider } from "./in-memory-provider.ts";
15
15
  export { createLocalProvider } from "./local-provider.ts";
16
- export type { FileProviderContext, FileProviderPlugin, FileProviderResolver, FileProviderResolverDeps, } from "./provider-resolver.ts";
17
- export { createFileProviderForTenant, isFileProviderPlugin, makeFileProviderResolver, } from "./provider-resolver.ts";
18
- export { resolveContentType } from "./resolve-content-type.ts";
19
- export { fileRefStorageDelta, filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.ts";
20
- export { DEFAULT_UPLOAD_SWEEP_GRACE_HOURS, MIN_UPLOAD_SWEEP_GRACE_HOURS, sweepOrphanedUploads, } from "./sweep-orphaned-uploads.ts";
21
- export type { FileContentValidationResult, FileMetadata, FileStorageProvider, FileValidationOptions, SignedUrlOptions, UploadMimeTypeResolution, WriteStreamOptions, } from "./types.ts";
22
- export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, parseMaxSize, resolveUploadMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, validateFileContent, } from "./types.ts";
23
- export { createFileUploadLedger, fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.ts";
16
+ export type { FileProviderContext, FileProviderPlugin, FileProviderResolver, } from "./provider-resolver.ts";
17
+ export { createFileProviderForTenant, isFileProviderPlugin, } from "./provider-resolver.ts";
18
+ export { filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.ts";
19
+ export type { FileStorageProvider, SignedUrlOptions, } from "./types.ts";
20
+ export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, } from "./types.ts";
21
+ export { fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.ts";
24
22
  export type { ZipEntry } from "./zip-stream.ts";
25
23
  export { createZipStream } from "./zip-stream.ts";
@@ -7,13 +7,11 @@ export { createFilesFeature, FILES_FEATURE } from "./feature.js";
7
7
  export { createFileContext, createTenantFileContext, deriveKey, storageKeyStemPrefix, } from "./file-handle.js";
8
8
  export { FILE_REF_ENTITY_NAME, fileRefEntity } from "./file-ref-entity.js";
9
9
  export { fileRefsTable } from "./file-ref-table.js";
10
- export { createFileRoutes, readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.js";
10
+ export { readFilesRouteOptions, resolveMaxUploadBodyBytes, } from "./file-routes.js";
11
11
  export { createInMemoryFileProvider } from "./in-memory-provider.js";
12
12
  export { createLocalProvider } from "./local-provider.js";
13
- export { createFileProviderForTenant, isFileProviderPlugin, makeFileProviderResolver, } from "./provider-resolver.js";
14
- export { resolveContentType } from "./resolve-content-type.js";
15
- export { fileRefStorageDelta, filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.js";
16
- export { DEFAULT_UPLOAD_SWEEP_GRACE_HOURS, MIN_UPLOAD_SWEEP_GRACE_HOURS, sweepOrphanedUploads, } from "./sweep-orphaned-uploads.js";
17
- export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, parseMaxSize, resolveUploadMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, validateFileContent, } from "./types.js";
18
- export { createFileUploadLedger, fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.js";
13
+ export { createFileProviderForTenant, isFileProviderPlugin, } from "./provider-resolver.js";
14
+ export { filesStorageTrackingFeature, tenantStorageUsageTable, transferTenantStorageUsage, } from "./storage-tracking.js";
15
+ export { assertSafeStorageKey, buildStorageKey, normalizeMimeType, sniffMimeType, tenantExportPrefix, tenantStoragePrefixes, validateFile, } from "./types.js";
16
+ export { fileUploadLedgerTable, withUploadLedger, } from "./upload-ledger.js";
19
17
  export { createZipStream } from "./zip-stream.js";
@@ -1,5 +1,6 @@
1
+ import type { SaveContext } from "@cosmicdrift/kumiko-types/hooks";
1
2
  import type { TenantDb } from "../db/tenant-db.ts";
2
- import { type Registry, type SaveContext, type SessionUser } from "../engine/types/index.ts";
3
+ import type { Registry, SessionUser } from "../engine/types/index.ts";
3
4
  export type FileRefRows = ReadonlyMap<string, Readonly<Record<string, unknown>>>;
4
5
  export declare function loadSaveFileRefs(args: {
5
6
  readonly registry: Registry;
@@ -1,6 +1,6 @@
1
1
  import { selectMany } from "../db/query.js";
2
2
  import { tenantDbRunner } from "../db/tenant-db-runner.js";
3
- import { isFileField, } from "../engine/types/index.js";
3
+ import { isFileField } from "../engine/field-helpers.js";
4
4
  import { getStreamVersions } from "../event-store/event-store.js";
5
5
  import { fileRefIdsOf } from "./bind-pending-file-refs.js";
6
6
  import { FILE_REF_ENTITY_NAME } from "./file-ref-entity.js";
@@ -1,8 +1,9 @@
1
1
  import type { CacheSyncBus } from "@cosmicdrift/kumiko-types/cache-sync-types";
2
+ import type { ConfigAccessor, ConfigAccessorFactory } from "@cosmicdrift/kumiko-types/config";
2
3
  import type { FileProviderResolver } from "@cosmicdrift/kumiko-types/file-provider-resolver-types";
3
4
  import type { DbConnection } from "../db/connection.ts";
4
5
  import type { TenantDb } from "../db/tenant-db.ts";
5
- import type { ConfigAccessor, ConfigAccessorFactory, Registry } from "../engine/types/index.ts";
6
+ import type { Registry } from "../engine/types/index.ts";
6
7
  import type { SecretsContext } from "../secrets/index.ts";
7
8
  import type { FileStorageProvider } from "./types.ts";
8
9
  /**
@@ -28,7 +29,7 @@ import type { FileStorageProvider } from "./types.ts";
28
29
  export type FileProviderContext = {
29
30
  readonly config?: ConfigAccessor;
30
31
  readonly registry?: Registry;
31
- readonly secrets?: SecretsContext;
32
+ readonly secrets: SecretsContext | undefined;
32
33
  readonly auditUserId?: string | undefined;
33
34
  };
34
35
  /**
@@ -38,7 +39,7 @@ export type FileProviderContext = {
38
39
  *
39
40
  * **Plugin-Author-Warning:** `ctx` is EXPLICITLY a FileProviderContext, not
40
41
  * a full HandlerContext. Fields outside the narrow surface (e.g.
41
- * `ctx.tx`, `ctx.actor`, `ctx.signal`) are NOT available on the worker path.
42
+ * `ctx.tx`, `ctx.actor`, `ctx.lifecycle.signal`) are NOT available on the worker path.
42
43
  * Casting `ctx as unknown as HandlerContext` fails at runtime on the worker —
43
44
  * the crash only appears in production with the first S3 tenant. If a plugin
44
45
  * needs fields outside FileProviderContext, extend FileProviderContext
@@ -52,9 +53,10 @@ export declare function createFileProviderForTenant(ctx: FileProviderContext, te
52
53
  export type { FileProviderResolver } from "@cosmicdrift/kumiko-types/file-provider-resolver-types";
53
54
  export type FileProviderResolverDeps = {
54
55
  readonly registry?: Registry;
55
- readonly _configAccessorFactory?: ConfigAccessorFactory;
56
+ readonly configAccessorFactory?: ConfigAccessorFactory;
56
57
  readonly secrets?: SecretsContext;
57
58
  readonly db?: DbConnection | TenantDb;
58
59
  readonly cacheSync?: CacheSyncBus;
60
+ readonly now?: () => Temporal.Instant;
59
61
  };
60
62
  export declare function makeFileProviderResolver(deps: FileProviderResolverDeps): FileProviderResolver;
@@ -1,5 +1,5 @@
1
1
  // File-provider resolution — lives in the framework so the upload routes,
2
- // `ctx.files`, AND the GDPR export/forget jobs resolve their FileStorageProvider
2
+ // `ctx.services.files`, AND the GDPR export/forget jobs resolve their FileStorageProvider
3
3
  // through ONE path. Divergence (uploads writing one store, erasure deleting
4
4
  // another) is structurally impossible: there is a single resolver.
5
5
  //
@@ -101,11 +101,11 @@ export function makeFileProviderResolver(deps) {
101
101
  if (cached)
102
102
  return cached;
103
103
  const built = (async () => {
104
- if (!deps.registry || !deps._configAccessorFactory || !deps.db) {
105
- throw new Error("makeFileProviderResolver: registry/_configAccessorFactory/db missing — " +
104
+ if (!deps.registry || !deps.configAccessorFactory || !deps.db) {
105
+ throw new Error("makeFileProviderResolver: registry/configAccessorFactory/db missing — " +
106
106
  "mount the config + file-foundation features and wire context.db");
107
107
  }
108
- const config = deps._configAccessorFactory({
108
+ const config = deps.configAccessorFactory({
109
109
  user: { id: SYSTEM_USER_ID, tenantId },
110
110
  db: deps.db,
111
111
  secrets: deps.secrets,
@@ -119,5 +119,5 @@ export function makeFileProviderResolver(deps) {
119
119
  cache.set(tenantId, built);
120
120
  return built;
121
121
  };
122
- return deps.db ? withUploadLedger(resolveProvider, deps.db) : resolveProvider;
122
+ return deps.db ? withUploadLedger(resolveProvider, deps.db, deps.now) : resolveProvider;
123
123
  }
@@ -20,3 +20,9 @@ export declare function createRecordWriteCheck(args: {
20
20
  readonly canReadRecord: RecordReadCheck;
21
21
  readonly tenantDbFor: (tenantId: TenantId) => TenantDb;
22
22
  }): RecordWriteCheck;
23
+ export declare function isStoredRecordLocked(args: {
24
+ readonly registry: Registry;
25
+ readonly db: TenantDb;
26
+ readonly entityType: string;
27
+ readonly entityId: string;
28
+ }): Promise<boolean>;
@@ -62,3 +62,16 @@ export function createRecordWriteCheck(args) {
62
62
  return RecordWriteDecisions.writable;
63
63
  };
64
64
  }
65
+ // The stored row, read through the given db so a transaction sees the lock state it commits against.
66
+ export async function isStoredRecordLocked(args) {
67
+ const { registry, db, entityType, entityId } = args;
68
+ const entity = registry.getEntity(entityType);
69
+ const table = findImplicitEntityTable(registry, entityType);
70
+ if (!entity || !table || entity.lockedWhen === undefined)
71
+ return false;
72
+ const row = await db.fetchOne(table, {
73
+ id: entityId,
74
+ ...(entity.softDelete === true && { isDeleted: false }),
75
+ });
76
+ return row !== undefined && isRecordLocked(entity.lockedWhen, row);
77
+ }
@@ -11,11 +11,13 @@
11
11
  // consumer-cursor row. Apps that want it pass filesStorageTrackingFeature
12
12
  // into createApp / setupTestStack alongside their domain features.
13
13
  import { bigint, instant, integer, table as pgTable, sql, uuid } from "../db/dialect.js";
14
- import { entityEventName, executeRawQueryRead } from "../db/index.js";
14
+ import { entityEventName } from "../db/index.js";
15
15
  import { toPostgresArrayLiteral } from "../db/queries/postgres-array-literal.js";
16
+ import { executeRawQueryRead } from "../db/queries/raw-sql.js";
16
17
  import { incrementCounter } from "../db/query.js";
17
18
  import { defineFeature, qn, toKebab } from "../engine/index.js";
18
- import { SHARED_INSTANCE_SENTINEL, selectConsumerCursorForUpdate, } from "../pipeline/index.js";
19
+ import { selectConsumerCursorForUpdate } from "../pipeline/event-dispatcher-delivery.js";
20
+ import { SHARED_INSTANCE_SENTINEL } from "../pipeline/index.js";
19
21
  import { parseJsonOrThrow } from "../utils/index.js";
20
22
  const FILE_REF_AGGREGATE_TYPE = "fileRef";
21
23
  const STORAGE_TRACKING_FEATURE_NAME = "files-storage-tracking";
@@ -1,6 +1,6 @@
1
1
  import type { FileContext } from "@cosmicdrift/kumiko-types/file-handle-types";
2
2
  import type { Logger } from "@cosmicdrift/kumiko-types/logger";
3
- import { type TenantDb } from "../db/tenant-db.ts";
3
+ import type { TenantDb } from "../db/tenant-db.ts";
4
4
  export declare const ORPHANED_UPLOAD_SWEEP_BATCH = 500;
5
5
  export declare const DEFAULT_UPLOAD_SWEEP_GRACE_HOURS = 24;
6
6
  export declare const MIN_UPLOAD_SWEEP_GRACE_HOURS = 1;
@@ -1,5 +1,5 @@
1
1
  import { selectMany } from "../db/query.js";
2
- import { runInOwnTransaction } from "../db/tenant-db.js";
2
+ import { runInOwnTransaction } from "../db/tenant-db-scoped-rebind.js";
3
3
  import { deleteFileRefBytes } from "../derivatives/delete-stored-file.js";
4
4
  import { fileRefsTable } from "./file-ref-table.js";
5
5
  import { fileUploadLedgerTable, takeUploadLedgerEntry } from "./upload-ledger.js";
@@ -5,6 +5,6 @@ import type { TenantId } from "@cosmicdrift/kumiko-types/identifiers";
5
5
  import type { DbConnection } from "../db/connection.ts";
6
6
  import { type TenantDb } from "../db/tenant-db.ts";
7
7
  export declare const fileUploadLedgerTable: WritableTable;
8
- export declare function createFileUploadLedger(db: DbConnection | TenantDb, tenantId: TenantId): FileUploadLedger;
9
- export declare function withUploadLedger(resolver: (tenantId: TenantId) => Promise<FileStorageProvider>, db: DbConnection | TenantDb): FileProviderResolver;
8
+ export declare function createFileUploadLedger(db: DbConnection | TenantDb, tenantId: TenantId, now?: () => Temporal.Instant): FileUploadLedger;
9
+ export declare function withUploadLedger(resolver: (tenantId: TenantId) => Promise<FileStorageProvider>, db: DbConnection | TenantDb, now?: () => Temporal.Instant): FileProviderResolver;
10
10
  export declare function takeUploadLedgerEntry(txDb: TenantDb, storageKey: string): Promise<boolean>;
@@ -21,7 +21,7 @@ function isTenantDb(db) {
21
21
  }
22
22
  // The ledger writes on a connection of its own, never on a handler transaction: a rollback of the
23
23
  // handler must not take the row with it, or the bytes it uploaded would be unfindable.
24
- export function createFileUploadLedger(db, tenantId) {
24
+ export function createFileUploadLedger(db, tenantId, now = () => Temporal.Now.instant()) {
25
25
  const runner = isTenantDb(db) ? tenantDbRunner(db) : db;
26
26
  if (!runnerCanBeginTransaction(runner)) {
27
27
  throw new InternalError({
@@ -34,7 +34,7 @@ export function createFileUploadLedger(db, tenantId) {
34
34
  await ledgerDb.insertOne(fileUploadLedgerTable, {
35
35
  storageKey,
36
36
  tenantId,
37
- createdAt: Temporal.Now.instant(),
37
+ createdAt: now(),
38
38
  });
39
39
  },
40
40
  forget: async (storageKey) => {
@@ -42,9 +42,9 @@ export function createFileUploadLedger(db, tenantId) {
42
42
  },
43
43
  };
44
44
  }
45
- export function withUploadLedger(resolver, db) {
45
+ export function withUploadLedger(resolver, db, now) {
46
46
  return Object.assign(resolver, {
47
- uploadLedgerFor: (tenantId) => createFileUploadLedger(db, tenantId),
47
+ uploadLedgerFor: (tenantId) => createFileUploadLedger(db, tenantId, now),
48
48
  });
49
49
  }
50
50
  // Runs inside the transaction that creates the fileRef row. False means no ledger row was left to
@@ -1,12 +1,6 @@
1
1
  import type { Registry } from "../engine/types/index.ts";
2
+ import type { I18n, I18nOptions } from "./internals.ts";
2
3
  export { hasMailTranslationKey, hasMailTranslations, listMailLocales, mailT, registerMailTranslations, resolveMailLocale, } from "./mail-registry.ts";
3
- export { canonicalizeLocaleTag, DEFAULT_LOCALE, isValidLocaleTag, pickAcceptLanguage, rankAcceptLanguage, rankPreferredLocales, resolveHeaderLocale, } from "./request-locale.ts";
4
+ export { canonicalizeLocaleTag, isValidLocaleTag, rankPreferredLocales, } from "./request-locale.ts";
4
5
  export { SETTINGS_HUB_I18N } from "./settings-hub-keys.ts";
5
- export type I18nOptions = {
6
- defaultLocale: string;
7
- };
8
- export type I18n = {
9
- t(key: string, locale?: string, params?: Readonly<Record<string, unknown>>): string;
10
- getAllKeys(): string[];
11
- };
12
6
  export declare function createI18n(registry: Registry, options: I18nOptions): I18n;
@@ -1,6 +1,6 @@
1
1
  import { resolveTranslationValue } from "../ui-types/plural.js";
2
2
  export { hasMailTranslationKey, hasMailTranslations, listMailLocales, mailT, registerMailTranslations, resolveMailLocale, } from "./mail-registry.js";
3
- export { canonicalizeLocaleTag, DEFAULT_LOCALE, isValidLocaleTag, pickAcceptLanguage, rankAcceptLanguage, rankPreferredLocales, resolveHeaderLocale, } from "./request-locale.js";
3
+ export { canonicalizeLocaleTag, isValidLocaleTag, rankPreferredLocales, } from "./request-locale.js";
4
4
  export { SETTINGS_HUB_I18N } from "./settings-hub-keys.js";
5
5
  export function createI18n(registry, options) {
6
6
  const translations = registry.getAllTranslations();
@@ -0,0 +1,7 @@
1
+ export type I18nOptions = {
2
+ defaultLocale: string;
3
+ };
4
+ export type I18n = {
5
+ t(key: string, locale?: string, params?: Readonly<Record<string, unknown>>): string;
6
+ getAllKeys(): string[];
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,7 @@
1
- import type { FeatureDefinition, NavDefinition, ScreenDefinition, WorkspaceDefinition } from "../engine/types/index.ts";
1
+ import type { NavDefinition } from "@cosmicdrift/kumiko-types/nav";
2
+ import type { ScreenDefinition } from "@cosmicdrift/kumiko-types/screen";
3
+ import type { WorkspaceDefinition } from "@cosmicdrift/kumiko-types/workspace";
4
+ import type { FeatureDefinition } from "../engine/types/index.ts";
2
5
  /** Pseudo-entity for actionForm field labels (renderer action-form-shim). */
3
6
  export declare const ACTION_FORM_ENTITY = "__action-form__";
4
7
  /** Pseudo-entity for configEdit field labels (renderer config-edit-shim). */
@@ -199,8 +199,9 @@ function pushRelatedListSectionKeys(out, section) {
199
199
  }
200
200
  for (const action of section.rowActions ?? [])
201
201
  pushRowActionKeys(out, action);
202
- pushKey(out, section.groupBy?.label);
203
- for (const label of Object.values(section.groupBy?.labels ?? {}))
202
+ const grouping = section.table?.grouping;
203
+ pushKey(out, grouping?.label);
204
+ for (const label of Object.values(grouping?.labels ?? {}))
204
205
  pushKey(out, label);
205
206
  }
206
207
  function pushListEmptyStateKeys(out, emptyState) {
@@ -237,6 +238,8 @@ function pushListChromeKeys(out, list) {
237
238
  pushRowActionKeys(out, action);
238
239
  for (const action of list.toolbarActions ?? [])
239
240
  pushToolbarActionKeys(out, action);
241
+ for (const bulk of list.bulkActions ?? [])
242
+ pushKey(out, bulk.confirm);
240
243
  }
241
244
  function collectEntityListKeys(ctx, list) {
242
245
  for (const col of list.columns) {
@@ -372,6 +375,8 @@ function collectProjectionDetailKeys(ctx, detail) {
372
375
  }
373
376
  if (section.kind === "relatedList") {
374
377
  pushRelatedListSectionKeys(ctx.out, section);
378
+ for (const bulk of section.bulkActions ?? [])
379
+ pushKey(ctx.out, bulk.confirm);
375
380
  continue;
376
381
  }
377
382
  if (isWriteFormEditSection(section)) {
@@ -0,0 +1,3 @@
1
+ export { isRowLevelSecurityViolation } from "../db/pg-error.ts";
2
+ export { DEFAULT_ROW_LEVEL_SECURITY_MODE } from "../db/render-rls-ddl.ts";
3
+ export { appHookScopedRunner, runInRowLevelSecurityScope, runInSystemRowLevelSecurityScope, systemScopedRunner, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.ts";
@@ -0,0 +1,3 @@
1
+ export { isRowLevelSecurityViolation } from "../db/pg-error.js";
2
+ export { DEFAULT_ROW_LEVEL_SECURITY_MODE } from "../db/render-rls-ddl.js";
3
+ export { appHookScopedRunner, runInRowLevelSecurityScope, runInSystemRowLevelSecurityScope, systemScopedRunner, tenantRowLevelSecurityScope, } from "../db/row-level-security-scope.js";
@@ -1,6 +1,6 @@
1
1
  export { isClosedConnectionError } from "../db/closed-connection.ts";
2
2
  export { createDbConnection } from "../db/connection.ts";
3
- export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
3
+ export { acquireSessionAdvisoryLock, createApplicationRole, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, transferDatabaseOwnership, transferPublicSchemaOwnership, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
4
4
  export type { AnyDb } from "../db/query.ts";
5
5
  export { columnNamesOf } from "../db/schema-inspection.ts";
6
6
  export { schemaTableName } from "../db/table-introspection.ts";
@@ -1,7 +1,7 @@
1
1
  // @runtime dev
2
2
  export { isClosedConnectionError } from "../db/closed-connection.js";
3
3
  export { createDbConnection } from "../db/connection.js";
4
- export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
4
+ export { acquireSessionAdvisoryLock, createApplicationRole, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, transferDatabaseOwnership, transferPublicSchemaOwnership, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
5
5
  export { columnNamesOf } from "../db/schema-inspection.js";
6
6
  export { schemaTableName } from "../db/table-introspection.js";
7
7
  export { addMissingColumns, addMissingIndexes, tableToMeta, unsafeCreateEntityTable, unsafeEnsureEntityTable, unsafePushTables, } from "../db/table-push.js";
@@ -6,6 +6,7 @@ export { resetBlindIndexKeyForTests } from "../crypto/blind-index.ts";
6
6
  export { resetEventPiiCatalogForTests } from "../crypto/event-pii.ts";
7
7
  export { resetPiiSubjectKmsForTests } from "../crypto/pii-field-encryption.ts";
8
8
  export { resetEntityFieldEncryptionCacheForTests } from "../db/entity-field-encryption.ts";
9
+ export { type ExecutorManagedEntitySource, executorManagedEntitySourceOf, } from "../db/executor-managed-tables.ts";
9
10
  export declare function withExecutorManagedWritesForTests(db: TenantDb): ExecutorManagedTenantDb;
10
11
  export declare function withExecutorManagedWritesForTests(db: DbRunner): ExecutorManagedRunner;
11
12
  export declare function withExecutorManagedWritesForTests(db: AnyDb): ExecutorManagedTenantDb | ExecutorManagedRunner;
@@ -4,15 +4,19 @@ export { resetBlindIndexKeyForTests } from "../crypto/blind-index.js";
4
4
  export { resetEventPiiCatalogForTests } from "../crypto/event-pii.js";
5
5
  export { resetPiiSubjectKmsForTests } from "../crypto/pii-field-encryption.js";
6
6
  export { resetEntityFieldEncryptionCacheForTests } from "../db/entity-field-encryption.js";
7
+ export { executorManagedEntitySourceOf, } from "../db/executor-managed-tables.js";
7
8
  export function withExecutorManagedWritesForTests(db) {
8
9
  if (isBoundTenantDb(db)) {
9
- return createTenantDb({
10
- db: withExecutorManagedWrites(tenantDbRunner(db)),
11
- tenantId: db.tenantId,
12
- mode: db.mode,
13
- });
10
+ const options = { db: withExecutorManagedWrites(tenantDbRunner(db)), tenantId: db.tenantId };
11
+ return db.mode === "system"
12
+ ? createTenantDb({
13
+ ...options,
14
+ mode: "system",
15
+ reason: "test seeding mirrors a system-mode TenantDb",
16
+ })
17
+ : createTenantDb(options);
14
18
  }
15
19
  if (isDbRunner(db))
16
20
  return withExecutorManagedWrites(db);
17
- throw new Error("withExecutorManagedWritesForTests: expected a TenantDb or a postgres-js runner");
21
+ throw new Error("withExecutorManagedWritesForTests: expected a TenantDb or a Bun.SQL runner");
18
22
  }
@@ -1,2 +1,2 @@
1
- export type { JobDroppedMeta, JobLogEntry, JobMeta, JobOutcomeMeta, JobQueuedMeta, JobRunner, JobRunnerOptions, JobSubjectValue, } from "./job-runner.ts";
1
+ export type { JobDroppedMeta, JobLogEntry, JobMeta, JobOutcomeMeta, JobQueuedMeta, JobRunner, JobRunnerOptions, } from "./job-runner.ts";
2
2
  export { createJobRunner, serializeJobSubject } from "./job-runner.ts";
@@ -0,0 +1,12 @@
1
+ import type { AppendEventFn } from "@cosmicdrift/kumiko-types/handlers";
2
+ import type { TenantDb } from "../db/tenant-db.ts";
3
+ import type { Registry, SessionUser } from "../engine/types/index.ts";
4
+ type JobAppendEventInput = {
5
+ readonly registry: Registry;
6
+ readonly jobDb: TenantDb | undefined;
7
+ readonly tenantId: string;
8
+ readonly systemUser: SessionUser;
9
+ readonly jobName: string;
10
+ };
11
+ export declare function createJobAppendEvent(input: JobAppendEventInput): AppendEventFn;
12
+ export {};
@@ -0,0 +1,30 @@
1
+ import { tenantDbWriteRunner } from "../db/tenant-db-runner.js";
2
+ import { runInOwnTransaction } from "../db/tenant-db-scoped-rebind.js";
3
+ import { InternalError } from "../errors/index.js";
4
+ import { appendDomainEventCore } from "../pipeline/append-event-core.js";
5
+ import { asTypedAppendEventFn } from "../pipeline/typed-append-event.js";
6
+ const CALL_SITE_LABEL = "job ctx.events.append";
7
+ export function createJobAppendEvent(input) {
8
+ const { registry, jobDb, tenantId, systemUser, jobName } = input;
9
+ return asTypedAppendEventFn(async (args) => {
10
+ if (jobDb === undefined) {
11
+ throw new InternalError({
12
+ message: `Job ${jobName}: ctx.events.append needs a tenant db`,
13
+ });
14
+ }
15
+ const callerFeature = registry.getJobFeature(jobName);
16
+ if (callerFeature === undefined) {
17
+ throw new InternalError({
18
+ message: `Job ${jobName}: ctx.events.append needs an owning feature, none is registered for this job`,
19
+ });
20
+ }
21
+ await runInOwnTransaction(jobDb, (txDb) => appendDomainEventCore({
22
+ registry,
23
+ db: tenantDbWriteRunner(txDb, CALL_SITE_LABEL),
24
+ tenantId,
25
+ userId: String(systemUser.id),
26
+ callSiteLabel: CALL_SITE_LABEL,
27
+ callerFeature,
28
+ }, args));
29
+ });
30
+ }
@@ -1,8 +1,8 @@
1
1
  /// <reference types="temporal-polyfill/global" preserve="true" />
2
- import type { ConfigAccessor } from "@cosmicdrift/kumiko-types/config";
2
+ import type { ConfigAccessor, JobDefinition } from "@cosmicdrift/kumiko-types/config";
3
3
  import type { WriteOrigin } from "@cosmicdrift/kumiko-types/event-store-types";
4
+ import type { JobContext } from "@cosmicdrift/kumiko-types/handlers";
4
5
  import type { DbRow } from "../db/connection.ts";
5
- import type { JobContext, JobDefinition } from "../engine/types/index.ts";
6
6
  import type { JobRunnerScope } from "./job-runner-scope.ts";
7
7
  import type { JobInvocation, JobLogEntry, JobMeta } from "./job-runner-types.ts";
8
8
  export type TenantVisibleSubjects = {