@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. package/AGENTS.md +9 -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/inbound-mail-triage.md +1 -0
  13. package/agents/examples/lane-routing.md +2 -1
  14. package/agents/examples/legal-pages.md +2 -2
  15. package/agents/examples/lifecycle-hooks.md +3 -3
  16. package/agents/examples/managed-config.md +4 -4
  17. package/agents/examples/managed-pages.md +1 -1
  18. package/agents/examples/relations.md +19 -4
  19. package/agents/examples/search.md +4 -4
  20. package/agents/examples/secrets-demo.md +9 -6
  21. package/agents/examples/state-machine.md +2 -2
  22. package/agents/examples/tenant-settings.md +1 -1
  23. package/agents/examples/user-data-rights.md +3 -6
  24. package/agents/examples/workflow-engine.md +53 -47
  25. package/agents/examples.md +4 -4
  26. package/agents/features.md +1 -1
  27. package/dist/api/auth-middleware.js +1 -1
  28. package/dist/api/auth-routes-invite.js +2 -1
  29. package/dist/api/entity-read-access.d.ts +3 -1
  30. package/dist/api/export/export-columns.d.ts +3 -1
  31. package/dist/api/export/export-route.js +3 -2
  32. package/dist/api/export/export-screen.d.ts +2 -1
  33. package/dist/api/extra-route.d.ts +3 -1
  34. package/dist/api/index.d.ts +23 -27
  35. package/dist/api/index.js +13 -15
  36. package/dist/api/jwt.js +1 -1
  37. package/dist/api/observability-middleware.d.ts +1 -1
  38. package/dist/api/observability-middleware.js +2 -1
  39. package/dist/api/request-context-internals.d.ts +31 -0
  40. package/dist/api/request-context-internals.js +11 -0
  41. package/dist/api/request-context-scopes.d.ts +14 -0
  42. package/dist/api/request-context-scopes.js +69 -0
  43. package/dist/api/request-context.d.ts +1 -40
  44. package/dist/api/request-context.js +22 -51
  45. package/dist/api/request-id-middleware.d.ts +1 -1
  46. package/dist/api/route-registrars.d.ts +2 -1
  47. package/dist/api/route-registrars.js +1 -1
  48. package/dist/api/routes.js +7 -3
  49. package/dist/api/server-boot-checks.d.ts +1 -1
  50. package/dist/api/server-boot-checks.js +2 -2
  51. package/dist/api/server-event-dispatcher.d.ts +6 -1
  52. package/dist/api/server-event-dispatcher.js +3 -4
  53. package/dist/api/server-extra-routes.d.ts +1 -1
  54. package/dist/api/server-extra-routes.js +2 -1
  55. package/dist/api/server-middleware.js +3 -1
  56. package/dist/api/server-routes.d.ts +2 -1
  57. package/dist/api/server-wiring.js +6 -4
  58. package/dist/api/server.d.ts +2 -1
  59. package/dist/api/sse-route.d.ts +2 -1
  60. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  61. package/dist/api/tenant-scoped-secrets.js +13 -0
  62. package/dist/api/websocket-route.d.ts +1 -1
  63. package/dist/auth/index.d.ts +0 -1
  64. package/dist/auth/roles.d.ts +0 -5
  65. package/dist/compliance/duration-spec.d.ts +0 -1
  66. package/dist/compliance/duration-spec.js +0 -5
  67. package/dist/compliance/index.d.ts +4 -4
  68. package/dist/compliance/index.js +2 -2
  69. package/dist/compliance/profiles.d.ts +0 -15
  70. package/dist/compliance/profiles.js +0 -23
  71. package/dist/config/index.d.ts +10 -10
  72. package/dist/config/index.js +13 -1
  73. package/dist/config/internals.d.ts +9 -0
  74. package/dist/config/internals.js +1 -0
  75. package/dist/consumer-cli-internals.d.ts +4 -0
  76. package/dist/consumer-cli-internals.js +1 -0
  77. package/dist/consumer-cli.d.ts +1 -4
  78. package/dist/consumer-cli.js +5 -1
  79. package/dist/crypto/event-pii.js +1 -1
  80. package/dist/crypto/index.d.ts +8 -9
  81. package/dist/crypto/index.js +7 -8
  82. package/dist/crypto/pg-kms-adapter.js +6 -1
  83. package/dist/db/apply-entity-event.d.ts +1 -1
  84. package/dist/db/apply-entity-event.js +15 -47
  85. package/dist/db/blind-index-cleanup.js +91 -77
  86. package/dist/db/collect-table-metas.js +1 -1
  87. package/dist/db/compound-types.d.ts +1 -1
  88. package/dist/db/compound-types.js +0 -7
  89. package/dist/db/config-seed.d.ts +2 -1
  90. package/dist/db/config-seed.js +6 -1
  91. package/dist/db/connection.d.ts +3 -1
  92. package/dist/db/connection.js +15 -5
  93. package/dist/db/cross-tenant-reads.d.ts +1 -1
  94. package/dist/db/cross-tenant-reads.js +1 -1
  95. package/dist/db/dialect.d.ts +0 -5
  96. package/dist/db/dialect.js +0 -3
  97. package/dist/db/driver-value-preparation.js +23 -2
  98. package/dist/db/eagerload.d.ts +2 -1
  99. package/dist/db/entity-field-encryption.d.ts +1 -1
  100. package/dist/db/entity-table-meta.d.ts +1 -1
  101. package/dist/db/event-store-executor-context.d.ts +3 -1
  102. package/dist/db/event-store-executor-context.js +4 -3
  103. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  104. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  105. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  106. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  107. package/dist/db/event-store-executor-read.js +2 -2
  108. package/dist/db/event-store-executor-write-atomic.js +8 -7
  109. package/dist/db/event-store-executor-write-steps.d.ts +3 -2
  110. package/dist/db/event-store-executor-write.js +7 -4
  111. package/dist/db/event-store-executor.d.ts +1 -1
  112. package/dist/db/executor-managed-tables.d.ts +7 -1
  113. package/dist/db/executor-managed-tables.js +11 -2
  114. package/dist/db/index.d.ts +29 -28
  115. package/dist/db/index.js +22 -20
  116. package/dist/db/known-table-names.d.ts +6 -0
  117. package/dist/db/known-table-names.js +21 -0
  118. package/dist/db/list-aggregate-labels.d.ts +1 -1
  119. package/dist/db/located-timestamp.d.ts +1 -1
  120. package/dist/db/located-timestamp.js +0 -5
  121. package/dist/db/migrate-generator.d.ts +17 -1
  122. package/dist/db/migrate-generator.js +50 -20
  123. package/dist/db/migrate-primary-key.d.ts +12 -0
  124. package/dist/db/migrate-primary-key.js +45 -0
  125. package/dist/db/migrate-rls-diff.d.ts +20 -0
  126. package/dist/db/migrate-rls-diff.js +61 -0
  127. package/dist/db/migrate-runner.js +4 -0
  128. package/dist/db/money.d.ts +1 -1
  129. package/dist/db/money.js +1 -1
  130. package/dist/db/parent-ref-clause.d.ts +2 -1
  131. package/dist/db/pg-error.d.ts +2 -0
  132. package/dist/db/pg-error.js +11 -0
  133. package/dist/db/queries/ddl.d.ts +3 -0
  134. package/dist/db/queries/ddl.js +34 -1
  135. package/dist/db/queries/event-store.js +4 -2
  136. package/dist/db/queries/event-tenants.d.ts +2 -0
  137. package/dist/db/queries/event-tenants.js +17 -0
  138. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  139. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  140. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  141. package/dist/db/queries/rls-boot-catalog.js +39 -0
  142. package/dist/db/queries/rls-catalog.d.ts +6 -0
  143. package/dist/db/queries/rls-catalog.js +82 -0
  144. package/dist/db/queries/rls-scope.d.ts +3 -0
  145. package/dist/db/queries/rls-scope.js +17 -0
  146. package/dist/db/queries/rls-shape.d.ts +10 -0
  147. package/dist/db/queries/rls-shape.js +42 -0
  148. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  149. package/dist/db/queries/session-advisory-lock.js +23 -0
  150. package/dist/db/queries/shadow-swap.d.ts +1 -2
  151. package/dist/db/queries/shadow-swap.js +9 -25
  152. package/dist/db/queries/test-stack.d.ts +4 -1
  153. package/dist/db/queries/test-stack.js +84 -2
  154. package/dist/db/query.js +11 -7
  155. package/dist/db/reference-data.d.ts +1 -1
  156. package/dist/db/reference-data.js +6 -1
  157. package/dist/db/render-ddl.d.ts +6 -2
  158. package/dist/db/render-ddl.js +7 -7
  159. package/dist/db/render-rls-ddl.d.ts +35 -0
  160. package/dist/db/render-rls-ddl.js +127 -0
  161. package/dist/db/replay-migration-sql.d.ts +3 -1
  162. package/dist/db/replay-migration-sql.js +22 -5
  163. package/dist/db/replay-rls.d.ts +25 -0
  164. package/dist/db/replay-rls.js +156 -0
  165. package/dist/db/row-level-security-boot-check.d.ts +6 -0
  166. package/dist/db/row-level-security-boot-check.js +86 -0
  167. package/dist/db/row-level-security-connection.d.ts +3 -0
  168. package/dist/db/row-level-security-connection.js +213 -0
  169. package/dist/db/row-level-security-scope.d.ts +33 -0
  170. package/dist/db/row-level-security-scope.js +127 -0
  171. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  172. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  173. package/dist/db/sql-identifier.d.ts +1 -0
  174. package/dist/db/sql-identifier.js +3 -0
  175. package/dist/db/table-builder.d.ts +2 -1
  176. package/dist/db/table-builder.js +1 -1
  177. package/dist/db/table-info.js +1 -1
  178. package/dist/db/table-push.d.ts +11 -2
  179. package/dist/db/table-push.js +15 -2
  180. package/dist/db/tenant-db-runner.d.ts +3 -1
  181. package/dist/db/tenant-db-runner.js +4 -3
  182. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  183. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  184. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  185. package/dist/db/tenant-db-statement-runner.js +48 -0
  186. package/dist/db/tenant-db.d.ts +17 -12
  187. package/dist/db/tenant-db.js +49 -120
  188. package/dist/db/tenant-id-filter.d.ts +3 -0
  189. package/dist/db/tenant-id-filter.js +30 -0
  190. package/dist/db/transaction-serialization.d.ts +6 -0
  191. package/dist/db/transaction-serialization.js +60 -0
  192. package/dist/derivatives/delete-stored-file.js +1 -1
  193. package/dist/derivatives/index.d.ts +2 -5
  194. package/dist/derivatives/index.js +2 -3
  195. package/dist/engine/access.d.ts +2 -1
  196. package/dist/engine/access.js +1 -1
  197. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  198. package/dist/engine/boot-validator/entity-handler.js +1 -1
  199. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
  200. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
  201. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
  202. package/dist/engine/boot-validator/nav.d.ts +3 -1
  203. package/dist/engine/boot-validator/nav.js +1 -1
  204. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  205. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  206. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  207. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  209. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  210. package/dist/engine/boot-validator/screens.d.ts +2 -1
  211. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  212. package/dist/engine/bridge-stub.d.ts +5 -2
  213. package/dist/engine/bridge-stub.js +39 -24
  214. package/dist/engine/config-helpers.d.ts +2 -2
  215. package/dist/engine/config-helpers.js +0 -9
  216. package/dist/engine/constants.d.ts +0 -10
  217. package/dist/engine/constants.js +0 -8
  218. package/dist/engine/create-app.js +1 -1
  219. package/dist/engine/define-feature.d.ts +2 -1
  220. package/dist/engine/define-feature.js +1 -2
  221. package/dist/engine/define-handler.d.ts +1 -1
  222. package/dist/engine/define-step.d.ts +0 -1
  223. package/dist/engine/define-step.js +0 -3
  224. package/dist/engine/embedded-derived.d.ts +1 -1
  225. package/dist/engine/entity-handlers.d.ts +2 -1
  226. package/dist/engine/entity-handlers.js +7 -7
  227. package/dist/engine/entity-list-runtime-options.js +3 -1
  228. package/dist/engine/entity-list-searchability.d.ts +2 -1
  229. package/dist/engine/event-def.d.ts +2 -1
  230. package/dist/engine/event-helpers.d.ts +3 -1
  231. package/dist/engine/event-helpers.js +3 -3
  232. package/dist/engine/extension-names.d.ts +2 -8
  233. package/dist/engine/extension-names.js +2 -2
  234. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  235. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  236. package/dist/engine/extensions/user-data.d.ts +0 -8
  237. package/dist/engine/factories.d.ts +2 -1
  238. package/dist/engine/feature-builder-state.d.ts +8 -1
  239. package/dist/engine/feature-changelog.d.ts +1 -1
  240. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  241. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  242. package/dist/engine/feature-manifest.js +1 -1
  243. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  244. package/dist/engine/feature-ui-extensions.js +6 -4
  245. package/dist/engine/field-access.d.ts +2 -1
  246. package/dist/engine/handler-field-references.d.ts +0 -4
  247. package/dist/engine/index.d.ts +57 -54
  248. package/dist/engine/index.js +22 -27
  249. package/dist/engine/instruction-fields.d.ts +1 -1
  250. package/dist/engine/personal-data-fields.d.ts +1 -1
  251. package/dist/engine/qualified-name.d.ts +0 -1
  252. package/dist/engine/read-claim.d.ts +2 -1
  253. package/dist/engine/registry-facade.js +0 -3
  254. package/dist/engine/registry-ingest.d.ts +2 -1
  255. package/dist/engine/registry-ingest.js +1 -2
  256. package/dist/engine/registry-state.d.ts +12 -2
  257. package/dist/engine/registry-state.js +2 -3
  258. package/dist/engine/registry-validate.d.ts +3 -1
  259. package/dist/engine/registry-validate.js +7 -7
  260. package/dist/engine/run-in.d.ts +1 -1
  261. package/dist/engine/run-in.js +0 -1
  262. package/dist/engine/schema-builder.d.ts +1 -1
  263. package/dist/engine/schema-builder.js +1 -1
  264. package/dist/engine/screen-filter-ops.d.ts +2 -1
  265. package/dist/engine/screen-filter-ops.js +0 -5
  266. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  267. package/dist/engine/soft-delete-cleanup.js +4 -4
  268. package/dist/engine/state-machine.js +2 -1
  269. package/dist/engine/steps/_read-source.js +1 -1
  270. package/dist/engine/steps/aggregate-append-event.js +2 -2
  271. package/dist/engine/steps/call-feature.js +2 -2
  272. package/dist/engine/steps/mail-send.js +1 -1
  273. package/dist/engine/steps/retry.js +1 -1
  274. package/dist/engine/steps/wait-for-event.js +1 -1
  275. package/dist/engine/steps/wait.js +1 -1
  276. package/dist/engine/steps/webhook-send.js +1 -1
  277. package/dist/engine/template-variables.d.ts +2 -1
  278. package/dist/engine/transfer-adjacency.d.ts +1 -1
  279. package/dist/engine/types/index.d.ts +8 -31
  280. package/dist/engine/types/index.js +2 -10
  281. package/dist/engine/validation.d.ts +2 -1
  282. package/dist/entrypoint/index.d.ts +7 -35
  283. package/dist/entrypoint/index.js +7 -1
  284. package/dist/entrypoint/internals.d.ts +40 -0
  285. package/dist/entrypoint/internals.js +1 -0
  286. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  287. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  288. package/dist/env/dry-run-internals.d.ts +10 -0
  289. package/dist/env/dry-run-internals.js +1 -0
  290. package/dist/env/dry-run.d.ts +1 -10
  291. package/dist/env/dry-run.js +2 -1
  292. package/dist/env/index.d.ts +1 -85
  293. package/dist/env/index.js +6 -50
  294. package/dist/env/internals.d.ts +87 -0
  295. package/dist/env/internals.js +53 -0
  296. package/dist/errors/classes.js +2 -2
  297. package/dist/errors/index.d.ts +5 -14
  298. package/dist/errors/index.js +4 -9
  299. package/dist/errors/member-resolution.js +1 -1
  300. package/dist/errors/reasons.d.ts +0 -1
  301. package/dist/errors/reasons.js +7 -7
  302. package/dist/errors/serialize.d.ts +0 -18
  303. package/dist/errors/serialize.js +0 -27
  304. package/dist/es-ops/index.d.ts +4 -4
  305. package/dist/es-ops/index.js +2 -2
  306. package/dist/es-ops/operations-schema.d.ts +1 -1
  307. package/dist/es-ops/types.d.ts +4 -5
  308. package/dist/event-store/admin-api-internals.d.ts +14 -0
  309. package/dist/event-store/admin-api-internals.js +1 -0
  310. package/dist/event-store/admin-api.d.ts +1 -14
  311. package/dist/event-store/admin-api.js +11 -6
  312. package/dist/event-store/archive.js +4 -2
  313. package/dist/event-store/errors.js +2 -2
  314. package/dist/event-store/event-store.js +41 -34
  315. package/dist/event-store/events-schema.js +4 -1
  316. package/dist/event-store/index.d.ts +11 -13
  317. package/dist/event-store/index.js +7 -9
  318. package/dist/event-store/rebuild-dead-letter.js +4 -2
  319. package/dist/event-store/snapshot.js +4 -3
  320. package/dist/event-store/stream-scope.d.ts +2 -0
  321. package/dist/event-store/stream-scope.js +6 -0
  322. package/dist/event-store/upcaster-dead-letter.js +4 -2
  323. package/dist/event-store/upcaster.d.ts +2 -1
  324. package/dist/files/action-form-upload.d.ts +2 -1
  325. package/dist/files/action-form-upload.js +1 -1
  326. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  327. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  328. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  329. package/dist/files/bind-pending-file-refs.js +2 -1
  330. package/dist/files/bind-referenced-files.write.js +1 -1
  331. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  332. package/dist/files/create-file-ref-from-bytes.js +3 -3
  333. package/dist/files/create-file-ref.d.ts +3 -2
  334. package/dist/files/create-file-ref.js +2 -2
  335. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  336. package/dist/files/dispose-removed-file-refs.js +1 -1
  337. package/dist/files/feature.js +2 -2
  338. package/dist/files/file-handle.js +1 -1
  339. package/dist/files/file-routes.d.ts +1 -1
  340. package/dist/files/file-routes.js +12 -2
  341. package/dist/files/index.d.ts +11 -13
  342. package/dist/files/index.js +5 -7
  343. package/dist/files/load-save-file-refs.d.ts +2 -1
  344. package/dist/files/load-save-file-refs.js +1 -1
  345. package/dist/files/provider-resolver.d.ts +5 -4
  346. package/dist/files/provider-resolver.js +4 -4
  347. package/dist/files/storage-tracking.js +4 -2
  348. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  349. package/dist/files/sweep-orphaned-uploads.js +1 -1
  350. package/dist/i18n/index.d.ts +2 -8
  351. package/dist/i18n/index.js +1 -1
  352. package/dist/i18n/internals.d.ts +7 -0
  353. package/dist/i18n/internals.js +1 -0
  354. package/dist/i18n/required-surface-keys.d.ts +4 -1
  355. package/dist/internal/row-level-security.d.ts +3 -0
  356. package/dist/internal/row-level-security.js +3 -0
  357. package/dist/internal/stack-support.d.ts +1 -1
  358. package/dist/internal/stack-support.js +1 -1
  359. package/dist/internal/testing.d.ts +1 -0
  360. package/dist/internal/testing.js +9 -5
  361. package/dist/jobs/index.d.ts +1 -1
  362. package/dist/jobs/job-append-event.d.ts +12 -0
  363. package/dist/jobs/job-append-event.js +30 -0
  364. package/dist/jobs/job-runner-context.d.ts +2 -2
  365. package/dist/jobs/job-runner-context.js +46 -16
  366. package/dist/jobs/job-runner-execution.d.ts +1 -1
  367. package/dist/jobs/job-runner-execution.js +6 -4
  368. package/dist/jobs/job-runner-gates.d.ts +1 -1
  369. package/dist/jobs/job-runner-gates.js +0 -1
  370. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  371. package/dist/jobs/job-runner-helpers.js +10 -1
  372. package/dist/jobs/job-runner-scope.d.ts +5 -2
  373. package/dist/jobs/job-runner-types.d.ts +2 -1
  374. package/dist/jobs/job-runner.js +19 -6
  375. package/dist/jobs/max-per-tenant.d.ts +1 -1
  376. package/dist/logging/index.d.ts +1 -2
  377. package/dist/logging/index.js +1 -1
  378. package/dist/logging/pino-logger.js +1 -1
  379. package/dist/logging/utils.d.ts +1 -0
  380. package/dist/logging/utils.js +6 -0
  381. package/dist/migrations/index.d.ts +3 -3
  382. package/dist/migrations/index.js +3 -3
  383. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  384. package/dist/migrations/pending-rebuilds.js +1 -1
  385. package/dist/migrations/pii-event-backfill.js +4 -1
  386. package/dist/observability/escape-hatch-report.d.ts +2 -1
  387. package/dist/observability/index.d.ts +7 -15
  388. package/dist/observability/index.js +4 -12
  389. package/dist/observability/metric-validator.js +1 -1
  390. package/dist/observability/metrics-handle.d.ts +0 -1
  391. package/dist/observability/metrics-handle.js +2 -15
  392. package/dist/observability/recording-tracer.d.ts +1 -2
  393. package/dist/observability/recording-tracer.js +0 -6
  394. package/dist/observability/sensitive-filter.d.ts +0 -2
  395. package/dist/observability/sensitive-filter.js +0 -29
  396. package/dist/pipeline/active-membership.d.ts +2 -1
  397. package/dist/pipeline/active-membership.js +6 -2
  398. package/dist/pipeline/append-event-core.d.ts +2 -1
  399. package/dist/pipeline/append-event-core.js +2 -2
  400. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  401. package/dist/pipeline/attach-outside-transaction.js +13 -0
  402. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  403. package/dist/pipeline/cascade-handler.d.ts +2 -1
  404. package/dist/pipeline/cascade-handler.js +3 -2
  405. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  406. package/dist/pipeline/config-accessor-factory.js +1 -1
  407. package/dist/pipeline/context-services.d.ts +56 -0
  408. package/dist/pipeline/context-services.js +73 -0
  409. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  410. package/dist/pipeline/dispatch-batch.js +31 -18
  411. package/dist/pipeline/dispatch-query.js +5 -4
  412. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  413. package/dist/pipeline/dispatch-scope.js +27 -0
  414. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  415. package/dist/pipeline/dispatch-shared.js +75 -198
  416. package/dist/pipeline/dispatch-stream.js +8 -4
  417. package/dist/pipeline/dispatch-write.d.ts +2 -1
  418. package/dist/pipeline/dispatch-write.js +10 -8
  419. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  420. package/dist/pipeline/dispatcher-utils.js +8 -2
  421. package/dist/pipeline/dispatcher.d.ts +3 -2
  422. package/dist/pipeline/dispatcher.js +4 -3
  423. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  424. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  425. package/dist/pipeline/event-dispatcher-delivery.js +4 -2
  426. package/dist/pipeline/event-dispatcher.d.ts +2 -2
  427. package/dist/pipeline/event-dispatcher.js +7 -3
  428. package/dist/pipeline/event-retention.js +59 -56
  429. package/dist/pipeline/handler-access-error.js +2 -1
  430. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  431. package/dist/pipeline/handler-context-auth.js +7 -4
  432. package/dist/pipeline/handler-context-config.d.ts +2 -5
  433. package/dist/pipeline/handler-context-config.js +2 -2
  434. package/dist/pipeline/handler-context-db.d.ts +32 -7
  435. package/dist/pipeline/handler-context-db.js +26 -17
  436. package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
  437. package/dist/pipeline/handler-context-dispatch.js +9 -8
  438. package/dist/pipeline/handler-context-events.d.ts +22 -36
  439. package/dist/pipeline/handler-context-events.js +36 -31
  440. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  441. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  442. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  443. package/dist/pipeline/handler-context-notify.js +1 -1
  444. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  445. package/dist/pipeline/handler-context-observability.js +7 -5
  446. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  447. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  448. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  449. package/dist/pipeline/handler-context-scope.js +18 -20
  450. package/dist/pipeline/index.d.ts +9 -21
  451. package/dist/pipeline/index.js +5 -7
  452. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  453. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  454. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  455. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  456. package/dist/pipeline/member-read-only-transaction.js +11 -3
  457. package/dist/pipeline/member-reader.d.ts +1 -1
  458. package/dist/pipeline/member-reader.js +2 -2
  459. package/dist/pipeline/msp-rebuild.js +5 -3
  460. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  461. package/dist/pipeline/notify-scope.d.ts +2 -1
  462. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  463. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  464. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  465. package/dist/pipeline/projection-rebuild.js +12 -5
  466. package/dist/pipeline/projection-state.d.ts +0 -6
  467. package/dist/pipeline/projection-state.js +0 -5
  468. package/dist/pipeline/projections-runner.d.ts +2 -1
  469. package/dist/pipeline/projections-runner.js +10 -6
  470. package/dist/pipeline/system-hooks.d.ts +3 -1
  471. package/dist/pipeline/system-hooks.js +6 -4
  472. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  473. package/dist/pipeline/system-identity-switch.js +51 -36
  474. package/dist/pipeline/typed-append-event.d.ts +2 -0
  475. package/dist/pipeline/typed-append-event.js +4 -0
  476. package/dist/pipeline/write-origin.js +2 -2
  477. package/dist/pipeline/write-result-masking.d.ts +1 -1
  478. package/dist/random/index.d.ts +1 -2
  479. package/dist/random/index.js +1 -2
  480. package/dist/rate-limit/bucket.d.ts +2 -1
  481. package/dist/rate-limit/middleware.js +2 -1
  482. package/dist/redis/index.d.ts +3 -4
  483. package/dist/redis/index.js +2 -2
  484. package/dist/schema-cli/apply-command.js +5 -2
  485. package/dist/schema-cli/baseline-command.js +7 -2
  486. package/dist/schema-cli/generate-command.js +7 -9
  487. package/dist/schema-cli/shared.d.ts +12 -2
  488. package/dist/schema-cli/shared.js +24 -2
  489. package/dist/schema-cli/status-command.js +8 -2
  490. package/dist/schema-cli/validate-command.js +48 -4
  491. package/dist/schema-cli.d.ts +0 -1
  492. package/dist/search/configure-tenant-index.d.ts +1 -3
  493. package/dist/search/configure-tenant-index.js +0 -4
  494. package/dist/search/index.d.ts +1 -4
  495. package/dist/search/index.js +0 -2
  496. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  497. package/dist/search/meilisearch-adapter-internals.js +9 -0
  498. package/dist/search/meilisearch-adapter.d.ts +1 -8
  499. package/dist/search/meilisearch-adapter.js +6 -7
  500. package/dist/search/meilisearch-peer.d.ts +2 -0
  501. package/dist/search/meilisearch-peer.js +5 -0
  502. package/dist/search/reindex-entity.js +93 -87
  503. package/dist/secrets/index.d.ts +3 -4
  504. package/dist/secrets/index.js +2 -3
  505. package/dist/seeding/index.d.ts +2 -2
  506. package/dist/seeding/index.js +1 -2
  507. package/dist/time/index.d.ts +2 -2
  508. package/dist/time/index.js +1 -1
  509. package/dist/time/tz-context.d.ts +0 -5
  510. package/dist/time/tz-context.js +0 -9
  511. package/dist/ui-types/index.d.ts +8 -11
  512. package/dist/ui-types/index.js +3 -3
  513. package/dist/upgrade-changelog.d.ts +3 -2
  514. package/dist/upgrade-changelog.js +12 -8
  515. package/dist/upgrade-cli-internals.d.ts +8 -0
  516. package/dist/upgrade-cli-internals.js +63 -0
  517. package/dist/upgrade-cli.d.ts +2 -9
  518. package/dist/upgrade-cli.js +28 -70
  519. package/dist/utils/import-optional-peer.d.ts +6 -0
  520. package/dist/utils/import-optional-peer.js +19 -0
  521. package/dist/utils/index.d.ts +1 -4
  522. package/dist/utils/index.js +1 -4
  523. package/package.json +23 -19
  524. package/src/changes.json +236 -0
  525. package/dist/crypto/request-kms-cache.d.ts +0 -8
  526. package/dist/crypto/request-kms-cache.js +0 -21
  527. package/dist/engine/codemod/index.d.ts +0 -2
  528. package/dist/engine/codemod/index.js +0 -1
  529. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  530. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  531. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  532. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  533. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  534. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  535. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  536. package/dist/engine/feature-ast/extractors/events.js +0 -275
  537. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  538. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  539. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  540. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  541. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  542. package/dist/engine/feature-ast/extractors/index.js +0 -13
  543. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  544. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  545. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  546. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  547. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  548. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  549. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
  550. package/dist/engine/feature-ast/extractors/round1.js +0 -87
  551. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  552. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  553. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  554. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  555. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  556. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  557. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  558. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  559. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  560. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  561. package/dist/engine/feature-ast/index.d.ts +0 -16
  562. package/dist/engine/feature-ast/index.js +0 -10
  563. package/dist/engine/feature-ast/parse.d.ts +0 -31
  564. package/dist/engine/feature-ast/parse.js +0 -485
  565. package/dist/engine/feature-ast/patch.d.ts +0 -212
  566. package/dist/engine/feature-ast/patch.js +0 -611
  567. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  568. package/dist/engine/feature-ast/patcher.js +0 -281
  569. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
  570. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
  571. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  572. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
  573. package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
  574. package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
  575. package/dist/engine/feature-ast/patterns.d.ts +0 -322
  576. package/dist/engine/feature-ast/patterns.js +0 -107
  577. package/dist/engine/feature-ast/render.d.ts +0 -47
  578. package/dist/engine/feature-ast/render.js +0 -666
  579. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  580. package/dist/engine/feature-ast/source-location.js +0 -27
  581. package/dist/engine/pattern-library/index.d.ts +0 -2
  582. package/dist/engine/pattern-library/index.js +0 -3
  583. package/dist/engine/pattern-library/library.d.ts +0 -14
  584. package/dist/engine/pattern-library/library.js +0 -94
  585. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  586. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  587. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  588. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  589. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  590. package/dist/engine/pattern-library/shared-fields.js +0 -88
  591. package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
  592. package/dist/engine/pattern-library/static-schemas.js +0 -487
  593. package/dist/engine/pattern-library/types.d.ts +0 -158
  594. package/dist/engine/pattern-library/types.js +0 -36
  595. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  596. package/dist/engine/resolve-config-or-param.js +0 -76
  597. package/src/scripts/codemod/README.md +0 -187
  598. package/src/scripts/codemod/codemod-support.ts +0 -334
  599. package/src/scripts/codemod/collect-source-files.ts +0 -48
  600. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  601. package/src/scripts/codemod/db-factory.ts +0 -810
  602. package/src/scripts/codemod/feature-factory.ts +0 -429
  603. package/src/scripts/codemod/feature-layout.ts +0 -424
  604. package/src/scripts/codemod/import-extensions.ts +0 -118
  605. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  606. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  607. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  608. package/src/scripts/codemod/object-form.ts +0 -746
  609. package/src/scripts/codemod/package-merge.ts +0 -299
  610. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  611. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  612. package/src/scripts/codemod/s3-imports.ts +0 -236
  613. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  614. package/src/scripts/codemod/testing-injection.ts +0 -215
  615. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  616. package/src/scripts/codemod/testing-move.ts +0 -542
  617. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -0,0 +1,19 @@
1
+ import { DEFAULT_ROW_LEVEL_SECURITY_MODE, } from "../db/render-rls-ddl.js";
2
+ import { rowLevelSecurityModeOf } from "../db/row-level-security-connection.js";
3
+ import { InternalError } from "../errors/index.js";
4
+ // The mode lives on the connection; the option states what the app config declared.
5
+ // A mismatch means the pools were opened for a different mode than the one the
6
+ // schema was applied for, which silently drops or over-applies tenant isolation.
7
+ export function assertEntrypointRowLevelSecurityMode(context, declared) {
8
+ // skip: entrypoint has no db to check
9
+ if (context.db === undefined)
10
+ return;
11
+ const expected = declared ?? DEFAULT_ROW_LEVEL_SECURITY_MODE;
12
+ const actual = rowLevelSecurityModeOf(context.db);
13
+ if (actual !== expected) {
14
+ throw new InternalError({
15
+ message: `Entrypoint rowLevelSecurity is "${expected}" but the database connection runs in "${actual}" mode; open the pools with the same mode`,
16
+ details: { expected, actual },
17
+ });
18
+ }
19
+ }
@@ -0,0 +1,10 @@
1
+ export type DryRunOptions = {
2
+ /** From composeEnvSchema. Drives the per-row feature-attribution. */
3
+ readonly sources?: Readonly<Record<string, string>>;
4
+ /** Prefix for `pulumi config set <prefix>…` keys. Default "". */
5
+ readonly pulumiPrefix?: string;
6
+ /** k8s Secret name. Default "kumiko-env". */
7
+ readonly k8sName?: string;
8
+ /** k8s namespace. Default "default". */
9
+ readonly k8sNamespace?: string;
10
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,4 @@
1
+ import type { DryRunOptions } from "./dry-run-internals.ts";
1
2
  import { type ComposedEnvSchema, type EnvFieldInspection } from "./index.ts";
2
3
  export type DryRunMode = "human" | "json" | "pulumi" | "k8s";
3
4
  /** `boot` runs the boot validators without connecting anywhere; the other
@@ -10,16 +11,6 @@ export declare function parseDryRunEnvMode(raw: string | undefined): DryRunEnvMo
10
11
  /** True while any dry-run mode is requested, for code that runs at module
11
12
  * load (key providers, secret derivation) and must not throw on missing env. */
12
13
  export declare function isDryRunEnvActive(env: Readonly<Record<string, string | undefined>>): boolean;
13
- export type DryRunOptions = {
14
- /** From composeEnvSchema. Drives the per-row feature-attribution. */
15
- readonly sources?: Readonly<Record<string, string>>;
16
- /** Prefix for `pulumi config set <prefix>…` keys. Default "". */
17
- readonly pulumiPrefix?: string;
18
- /** k8s Secret name. Default "kumiko-env". */
19
- readonly k8sName?: string;
20
- /** k8s namespace. Default "default". */
21
- readonly k8sNamespace?: string;
22
- };
23
14
  export declare function renderDryRun(composed: ComposedEnvSchema, mode: DryRunMode, options?: DryRunOptions): string;
24
15
  /** Table for `KUMIKO_DRY_RUN_ENV=boot`: one row per variable with its source,
25
16
  * whether it is required, and whether it is set. Values are never printed. */
@@ -8,7 +8,8 @@
8
8
  // The same schema introspection (`classifyField`, `readKumikoMeta`) used
9
9
  // by parseEnv drives the output here — single source of truth.
10
10
  import { zodShape } from "./_zod-introspect.js";
11
- import { classifyField, getDefaultValue, getFieldDescription, pulumiConfigKey, readKumikoMeta, } from "./index.js";
11
+ import { classifyField, readKumikoMeta, } from "./index.js";
12
+ import { getDefaultValue, getFieldDescription, pulumiConfigKey } from "./internals.js";
12
13
  export const DRY_RUN_ENV_VAR = "KUMIKO_DRY_RUN_ENV";
13
14
  /** Reads `KUMIKO_DRY_RUN_ENV`. `1` and `true` mean `human`; an unknown value
14
15
  * returns undefined, so the caller decides whether to warn or boot. */
@@ -1,33 +1,11 @@
1
1
  import * as z from "zod";
2
2
  import type { FeatureDefinition } from "../engine/types/feature.ts";
3
- export type KumikoEnvMeta = {
4
- readonly pulumi?: {
5
- /** Override the auto-derived camelCase Pulumi-config-key name. Apps
6
- * setting `pulumiPrefix: "studio"` and authoring `STUDIO_ADMIN_EMAIL`
7
- * would otherwise get `studioStudioAdminEmail` — set
8
- * `.meta({ kumiko: { pulumi: { name: "adminEmail" } } })` to drop the
9
- * duplicated prefix. */
10
- readonly name?: string;
11
- /** Shell expression that generates a value, e.g. `openssl rand -base64 32`.
12
- * Without this, dry-run-pulumi emits `<set-me>` as the placeholder. */
13
- readonly generator?: string;
14
- /** Force the `--secret` flag in `pulumi config set`. Default false. */
15
- readonly secret?: boolean;
16
- };
17
- /** The value may be delivered as a Scaleway Key Manager ciphertext in
18
- * `<NAME>_CIPHERTEXT`. `runProdApp` decrypts it at boot when `<NAME>` itself
19
- * is unset; a set plaintext always wins. A flag, not an object: every slot
20
- * uses the same `_CIPHERTEXT` twin and one shared key (`PLATFORM_KEK_KMS_*`). */
21
- readonly kms?: true;
22
- };
3
+ import { type ComposedEnvShape, type ComposeEnvSchemaOptions, type EmptyShape, type EnvError, type EnvFieldClass, type EnvFieldStatus, type KumikoEnvMeta, type ParseEnvOptions } from "./internals.ts";
23
4
  export declare function readKumikoMeta(field: z.ZodType): KumikoEnvMeta;
24
5
  /** Env names whose schema field declares `kms: true` — the slots
25
6
  * `resolvePlatformKeks` resolves from a ciphertext. */
26
7
  export declare function kmsSlotsOf(schema: z.ZodObject<z.ZodRawShape>): readonly string[];
27
- export type EnvFieldClass = "required" | "optional" | "withDefault";
28
8
  export declare function classifyField(field: z.ZodType): EnvFieldClass;
29
- export declare function getDefaultValue(field: z.ZodType): unknown;
30
- export declare function getFieldDescription(field: z.ZodType): string | undefined;
31
9
  /** A feature whose registered env schema is visible in its type, so
32
10
  * `composeEnvSchema` can type the merged schema from the feature list. */
33
11
  export type FeatureWithEnvSchema<TFeature extends FeatureDefinition, TShape extends z.ZodRawShape> = TFeature & {
@@ -37,41 +15,6 @@ export type FeatureWithEnvSchema<TFeature extends FeatureDefinition, TShape exte
37
15
  * `r.envSchema(schema)`. Throws when the feature registered another
38
16
  * instance, so the type never claims fields the runtime schema lacks. */
39
17
  export declare function featureWithEnvSchema<TFeature extends FeatureDefinition, TShape extends z.ZodRawShape>(feature: TFeature, schema: z.ZodObject<TShape>): FeatureWithEnvSchema<TFeature, TShape>;
40
- type EmptyShape = Record<never, never>;
41
- type DeclaredEnvShape<TFeature> = TFeature extends {
42
- readonly envSchema: z.ZodObject<infer TShape extends z.ZodRawShape>;
43
- } ? string extends keyof TShape ? EmptyShape : TShape : EmptyShape;
44
- type UnionToIntersection<TUnion> = (TUnion extends unknown ? (value: TUnion) => void : never) extends (value: infer TIntersection) => void ? TIntersection : never;
45
- type OptionalShape<TShape extends z.ZodRawShape> = {
46
- [Key in keyof TShape]: z.ZodOptional<TShape[Key]>;
47
- };
48
- type FeaturesEnvShape<TFeatures extends readonly FeatureDefinition[]> = UnionToIntersection<DeclaredEnvShape<TFeatures[number]>>;
49
- type FlattenShape<TShape> = {
50
- [Key in keyof TShape]: TShape[Key];
51
- } & {};
52
- type KnownShape<TShape extends z.ZodRawShape> = string extends keyof TShape ? EmptyShape : TShape;
53
- /** The merged shape `composeEnvSchema` returns. With `optionalFeatures`
54
- * every feature field is typed optional: the type cannot tell which feature
55
- * a name refers to, and over-reporting `undefined` is the safe side. */
56
- export type ComposedEnvShape<TFeatures extends readonly FeatureDefinition[], TCore extends z.ZodRawShape, TExtend extends z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined> = Extract<FlattenShape<KnownShape<TCore> & (TOptionalFeatures extends readonly string[] ? OptionalShape<FeaturesEnvShape<TFeatures> & z.ZodRawShape> : FeaturesEnvShape<TFeatures>) & KnownShape<TExtend>>, z.ZodRawShape>;
57
- export type ComposeEnvSchemaOptions<TFeatures extends readonly FeatureDefinition[] = readonly FeatureDefinition[], TCore extends z.ZodRawShape = z.ZodRawShape, TExtend extends z.ZodRawShape = z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined = readonly string[] | undefined> = {
58
- /** All features whose envSchemas should be merged. Bundled features type
59
- * their fragment, so passing the list inline types the merged schema. */
60
- readonly features: TFeatures;
61
- /** App-specific env-vars (e.g. `STUDIO_ADMIN_EMAIL`). Keys here are
62
- * tagged as source "app" in the resulting sources map. */
63
- readonly extend?: z.ZodObject<TExtend>;
64
- /** Feature-names whose env-vars should be auto-`.optional()`-wrapped.
65
- * Lets an app opt out of e.g. `channel-email-smtp`'s vars without
66
- * manually `.partial()`-ing each shape at the call-site. */
67
- readonly optionalFeatures?: TOptionalFeatures;
68
- /** Framework-core env-vars (PORT, DATABASE_URL, REDIS_URL, …) from
69
- * `@cosmicdrift/kumiko-dev-server`. Keys here are tagged as source
70
- * "framework-core" in error output. Conflict-detection runs across
71
- * core/features/extend as one merged pool — same key declared in two
72
- * layers throws KumikoBootError at compose-time. */
73
- readonly core?: z.ZodObject<TCore>;
74
- };
75
18
  export type ComposedEnvSchema<TShape extends z.ZodRawShape = z.ZodRawShape> = {
76
19
  /** The merged Zod schema, typed from core, the typed feature fragments and
77
20
  * extend; `parseEnv(composed.schema, env)` returns the typed env. */
@@ -84,33 +27,11 @@ export type ComposedEnvSchema<TShape extends z.ZodRawShape = z.ZodRawShape> = {
84
27
  * missing from the schema shape are ignored. */
85
28
  export declare function withOptionalEnvKeys(schema: z.ZodObject<z.ZodRawShape>, keys: readonly string[]): z.ZodObject<z.ZodRawShape>;
86
29
  export declare function composeEnvSchema<const TFeatures extends readonly FeatureDefinition[], TCore extends z.ZodRawShape = EmptyShape, TExtend extends z.ZodRawShape = EmptyShape, const TOptionalFeatures extends readonly string[] | undefined = undefined>(options: ComposeEnvSchemaOptions<TFeatures, TCore, TExtend, TOptionalFeatures>): ComposedEnvSchema<ComposedEnvShape<TFeatures, TCore, TExtend, TOptionalFeatures>>;
87
- export type EnvErrorKind = "missing" | "invalid";
88
- export type EnvError = {
89
- readonly name: string;
90
- readonly kind: EnvErrorKind;
91
- readonly message: string;
92
- /** Declaring source-name from `composeEnvSchema`'s sources map:
93
- * feature-name, "app" from `extend`, or "framework-core" from `core`.
94
- * Populated when parseEnv received `options.sources`. Surfaced by
95
- * `KumikoBootError.format()` so operators see WHICH source wants the
96
- * missing var, not just the var name. */
97
- readonly source?: string;
98
- /** "Set via: pulumi config set ..." line. Computed when pulumiPrefix is
99
- * passed to parseEnv. */
100
- readonly suggestion?: string;
101
- };
102
30
  export declare class KumikoBootError extends Error {
103
31
  readonly errors: readonly EnvError[];
104
32
  constructor(errors: readonly EnvError[]);
105
33
  format(): string;
106
34
  }
107
- export type ParseEnvOptions = {
108
- /** From composeEnvSchema's return — enables per-var feature-source
109
- * attribution in suggestions. */
110
- readonly sources?: Readonly<Record<string, string>>;
111
- /** When set, error suggestions include `pulumi config set <prefix>...`. */
112
- readonly pulumiPrefix?: string;
113
- };
114
35
  /** Validates `env` against `schema` and throws KumikoBootError on any issue.
115
36
  * A `kms: true` field delivered only as `<NAME>_CIPHERTEXT` passes validation but
116
37
  * is `undefined` in the result despite its `string` type — it is only set once
@@ -124,7 +45,6 @@ export declare function parseEnv<S extends z.ZodObject<z.ZodRawShape>>(schema: S
124
45
  * every access silently returned undefined and the compiler could not detect
125
46
  * it. */
126
47
  export declare function parseEnvDryRun<S extends z.ZodObject<z.ZodRawShape>>(schema: S, env: Record<string, string | undefined>): Partial<z.infer<S>>;
127
- export type EnvFieldStatus = "set" | "unset" | "missing" | "invalid";
128
48
  export type EnvFieldInspection = {
129
49
  readonly name: string;
130
50
  readonly klass: EnvFieldClass;
@@ -138,7 +58,3 @@ export type EnvFieldInspection = {
138
58
  * renders on an empty env. Object-level refinements do not run here; once
139
59
  * nothing is missing or invalid, parseEnv validates the whole object. */
140
60
  export declare function inspectEnv(schema: z.ZodObject<z.ZodRawShape>, env: Readonly<Record<string, string | undefined>>, options?: Pick<ParseEnvOptions, "sources">): readonly EnvFieldInspection[];
141
- export declare function camelCase(snakeShout: string): string;
142
- export declare function pulumiConfigKey(envName: string, field: z.ZodType | undefined, prefix: string | undefined): string;
143
- export declare function buildPulumiSuggestion(envName: string, field: z.ZodType, prefix: string | undefined): string | undefined;
144
- export {};
package/dist/env/index.js CHANGED
@@ -14,7 +14,9 @@
14
14
  // Without meta, defaults: `camelCase(envVarName)` for the Pulumi key,
15
15
  // `<set-me>` placeholder for the value, no `--secret` flag.
16
16
  import * as z from "zod";
17
- import { zodDef, zodDescription, zodMeta, zodShape, zodShapeField } from "./_zod-introspect.js";
17
+ import { zodDef, zodMeta, zodShape, zodShapeField } from "./_zod-introspect.js";
18
+ import { buildPulumiSuggestion, getFieldDescription, } from "./internals.js";
19
+ // --- Per-env-var metadata (attach via Zod's `.meta()`) ---
18
20
  function isKumikoMeta(value) {
19
21
  if (value === null || typeof value !== "object")
20
22
  return false;
@@ -70,6 +72,7 @@ function relaxCiphertextOnlySlots(schema, env) {
70
72
  }
71
73
  return Object.keys(relaxed).length === 0 ? schema : schema.safeExtend(relaxed);
72
74
  }
75
+ // --- Field-classification helpers (Zod v4 introspection) ---
73
76
  export function classifyField(field) {
74
77
  // Drill through ZodEffects/ZodPipe wrappers to find the inner kind.
75
78
  let current = field;
@@ -104,29 +107,6 @@ export function classifyField(field) {
104
107
  }
105
108
  return "required";
106
109
  }
107
- export function getDefaultValue(field) {
108
- let current = field;
109
- for (let i = 0; i < 8; i++) {
110
- if (current instanceof z.ZodDefault) {
111
- // Zod v4: defaultValue is the raw value (v3 was a factory function).
112
- // Support both shapes for forward/backward safety.
113
- const raw = zodDef(current)?.defaultValue;
114
- // @cast-boundary schema-walk — Zod v3 stored a thunk, v4 a raw value
115
- return typeof raw === "function" ? raw() : raw;
116
- }
117
- const inner = zodDef(current);
118
- if (inner?.innerType) {
119
- current = inner.innerType;
120
- continue;
121
- }
122
- break;
123
- }
124
- return undefined;
125
- }
126
- // @wrapper-known semantic-alias
127
- export function getFieldDescription(field) {
128
- return zodDescription(field);
129
- }
130
110
  function registersEnvSchema(feature, schema) {
131
111
  return feature.envSchema === schema;
132
112
  }
@@ -262,6 +242,7 @@ export function composeEnvSchema(options) {
262
242
  const schema = z.object(merged);
263
243
  return { schema, sources };
264
244
  }
245
+ // --- Errors ---
265
246
  function formatBootError(errors) {
266
247
  const lines = [
267
248
  `Boot failed: ${errors.length} env-var problem${errors.length === 1 ? "" : "s"}`,
@@ -291,6 +272,7 @@ export class KumikoBootError extends Error {
291
272
  return formatBootError(this.errors);
292
273
  }
293
274
  }
275
+ // --- Parse ---
294
276
  // safeParse does not catch exceptions thrown inside refinements; a refinement
295
277
  // reading a ciphertext-only slot (undefined here) would otherwise escape as a raw
296
278
  // TypeError past the KumikoBootError mapping.
@@ -353,9 +335,6 @@ export function parseEnv(schema, env, options = {}) {
353
335
  throw new KumikoBootError(errors);
354
336
  }
355
337
  // --- Pulumi-suggestion ---
356
- function ucfirst(s) {
357
- return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1);
358
- }
359
338
  /** Dry-run counterpart to parseEnv (KUMIKO_DRY_RUN_ENV path): parses each
360
339
  * field individually and returns an honest Partial — present values pass
361
340
  * through with their types (coerced), while missing or invalid values are
@@ -416,26 +395,3 @@ function firstFieldIssue(field, raw) {
416
395
  return "a field refinement threw while checking the value";
417
396
  }
418
397
  }
419
- export function camelCase(snakeShout) {
420
- const parts = snakeShout.toLowerCase().split("_").filter(Boolean);
421
- if (parts.length === 0)
422
- return snakeShout.toLowerCase();
423
- return parts[0] + parts.slice(1).map(ucfirst).join("");
424
- }
425
- export function pulumiConfigKey(envName, field, prefix) {
426
- const meta = field ? readKumikoMeta(field) : {};
427
- if (meta.pulumi?.name) {
428
- return prefix ? prefix + ucfirst(meta.pulumi.name) : meta.pulumi.name;
429
- }
430
- const camel = camelCase(envName);
431
- return prefix ? prefix + ucfirst(camel) : camel;
432
- }
433
- export function buildPulumiSuggestion(envName, field, prefix) {
434
- if (!prefix)
435
- return undefined;
436
- const meta = readKumikoMeta(field);
437
- const key = pulumiConfigKey(envName, field, prefix);
438
- const secretFlag = meta.pulumi?.secret ? " --secret" : "";
439
- const value = meta.pulumi?.generator ? `"$(${meta.pulumi.generator})"` : `"<set-me>"`;
440
- return `Set via: pulumi config set${secretFlag} ${key} ${value}`;
441
- }
@@ -0,0 +1,87 @@
1
+ import * as z from "zod";
2
+ import type { FeatureDefinition } from "../engine/types/feature.ts";
3
+ export type KumikoEnvMeta = {
4
+ readonly pulumi?: {
5
+ /** Override the auto-derived camelCase Pulumi-config-key name. Apps
6
+ * setting `pulumiPrefix: "studio"` and authoring `STUDIO_ADMIN_EMAIL`
7
+ * would otherwise get `studioStudioAdminEmail` — set
8
+ * `.meta({ kumiko: { pulumi: { name: "adminEmail" } } })` to drop the
9
+ * duplicated prefix. */
10
+ readonly name?: string;
11
+ /** Shell expression that generates a value, e.g. `openssl rand -base64 32`.
12
+ * Without this, dry-run-pulumi emits `<set-me>` as the placeholder. */
13
+ readonly generator?: string;
14
+ /** Force the `--secret` flag in `pulumi config set`. Default false. */
15
+ readonly secret?: boolean;
16
+ };
17
+ /** The value may be delivered as a Scaleway Key Manager ciphertext in
18
+ * `<NAME>_CIPHERTEXT`. `runProdApp` decrypts it at boot when `<NAME>` itself
19
+ * is unset; a set plaintext always wins. A flag, not an object: every slot
20
+ * uses the same `_CIPHERTEXT` twin and one shared key (`PLATFORM_KEK_KMS_*`). */
21
+ readonly kms?: true;
22
+ };
23
+ export type EnvFieldClass = "required" | "optional" | "withDefault";
24
+ export declare function getDefaultValue(field: z.ZodType): unknown;
25
+ export declare function getFieldDescription(field: z.ZodType): string | undefined;
26
+ export type EmptyShape = Record<never, never>;
27
+ export type DeclaredEnvShape<TFeature> = TFeature extends {
28
+ readonly envSchema: z.ZodObject<infer TShape extends z.ZodRawShape>;
29
+ } ? string extends keyof TShape ? EmptyShape : TShape : EmptyShape;
30
+ export type UnionToIntersection<TUnion> = (TUnion extends unknown ? (value: TUnion) => void : never) extends (value: infer TIntersection) => void ? TIntersection : never;
31
+ export type OptionalShape<TShape extends z.ZodRawShape> = {
32
+ [Key in keyof TShape]: z.ZodOptional<TShape[Key]>;
33
+ };
34
+ export type FeaturesEnvShape<TFeatures extends readonly FeatureDefinition[]> = UnionToIntersection<DeclaredEnvShape<TFeatures[number]>>;
35
+ export type FlattenShape<TShape> = {
36
+ [Key in keyof TShape]: TShape[Key];
37
+ } & {};
38
+ export type KnownShape<TShape extends z.ZodRawShape> = string extends keyof TShape ? EmptyShape : TShape;
39
+ /** The merged shape `composeEnvSchema` returns. With `optionalFeatures`
40
+ * every feature field is typed optional: the type cannot tell which feature
41
+ * a name refers to, and over-reporting `undefined` is the safe side. */
42
+ export type ComposedEnvShape<TFeatures extends readonly FeatureDefinition[], TCore extends z.ZodRawShape, TExtend extends z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined> = Extract<FlattenShape<KnownShape<TCore> & (TOptionalFeatures extends readonly string[] ? OptionalShape<FeaturesEnvShape<TFeatures> & z.ZodRawShape> : FeaturesEnvShape<TFeatures>) & KnownShape<TExtend>>, z.ZodRawShape>;
43
+ export type ComposeEnvSchemaOptions<TFeatures extends readonly FeatureDefinition[] = readonly FeatureDefinition[], TCore extends z.ZodRawShape = z.ZodRawShape, TExtend extends z.ZodRawShape = z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined = readonly string[] | undefined> = {
44
+ /** All features whose envSchemas should be merged. Bundled features type
45
+ * their fragment, so passing the list inline types the merged schema. */
46
+ readonly features: TFeatures;
47
+ /** App-specific env-vars (e.g. `STUDIO_ADMIN_EMAIL`). Keys here are
48
+ * tagged as source "app" in the resulting sources map. */
49
+ readonly extend?: z.ZodObject<TExtend>;
50
+ /** Feature-names whose env-vars should be auto-`.optional()`-wrapped.
51
+ * Lets an app opt out of e.g. `channel-email-smtp`'s vars without
52
+ * manually `.partial()`-ing each shape at the call-site. */
53
+ readonly optionalFeatures?: TOptionalFeatures;
54
+ /** Framework-core env-vars (PORT, DATABASE_URL, REDIS_URL, …) from
55
+ * `@cosmicdrift/kumiko-dev-server`. Keys here are tagged as source
56
+ * "framework-core" in error output. Conflict-detection runs across
57
+ * core/features/extend as one merged pool — same key declared in two
58
+ * layers throws KumikoBootError at compose-time. */
59
+ readonly core?: z.ZodObject<TCore>;
60
+ };
61
+ export type EnvErrorKind = "missing" | "invalid";
62
+ export type EnvError = {
63
+ readonly name: string;
64
+ readonly kind: EnvErrorKind;
65
+ readonly message: string;
66
+ /** Declaring source-name from `composeEnvSchema`'s sources map:
67
+ * feature-name, "app" from `extend`, or "framework-core" from `core`.
68
+ * Populated when parseEnv received `options.sources`. Surfaced by
69
+ * `KumikoBootError.format()` so operators see WHICH source wants the
70
+ * missing var, not just the var name. */
71
+ readonly source?: string;
72
+ /** "Set via: pulumi config set ..." line. Computed when pulumiPrefix is
73
+ * passed to parseEnv. */
74
+ readonly suggestion?: string;
75
+ };
76
+ export type ParseEnvOptions = {
77
+ /** From composeEnvSchema's return — enables per-var feature-source
78
+ * attribution in suggestions. */
79
+ readonly sources?: Readonly<Record<string, string>>;
80
+ /** When set, error suggestions include `pulumi config set <prefix>...`. */
81
+ readonly pulumiPrefix?: string;
82
+ };
83
+ export declare function ucfirst(s: string): string;
84
+ export type EnvFieldStatus = "set" | "unset" | "missing" | "invalid";
85
+ export declare function camelCase(snakeShout: string): string;
86
+ export declare function pulumiConfigKey(envName: string, field: z.ZodType | undefined, prefix: string | undefined): string;
87
+ export declare function buildPulumiSuggestion(envName: string, field: z.ZodType, prefix: string | undefined): string | undefined;
@@ -0,0 +1,53 @@
1
+ import * as z from "zod";
2
+ import { zodDef, zodDescription } from "./_zod-introspect.js";
3
+ import { readKumikoMeta } from "./index.js";
4
+ export function getDefaultValue(field) {
5
+ let current = field;
6
+ for (let i = 0; i < 8; i++) {
7
+ if (current instanceof z.ZodDefault) {
8
+ // Zod v4: defaultValue is the raw value (v3 was a factory function).
9
+ // Support both shapes for forward/backward safety.
10
+ const raw = zodDef(current)?.defaultValue;
11
+ // @cast-boundary schema-walk — Zod v3 stored a thunk, v4 a raw value
12
+ return typeof raw === "function" ? raw() : raw;
13
+ }
14
+ const inner = zodDef(current);
15
+ if (inner?.innerType) {
16
+ current = inner.innerType;
17
+ continue;
18
+ }
19
+ break;
20
+ }
21
+ return undefined;
22
+ }
23
+ // @wrapper-known semantic-alias
24
+ export function getFieldDescription(field) {
25
+ return zodDescription(field);
26
+ }
27
+ // --- Pulumi-suggestion ---
28
+ export function ucfirst(s) {
29
+ return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1);
30
+ }
31
+ export function camelCase(snakeShout) {
32
+ const parts = snakeShout.toLowerCase().split("_").filter(Boolean);
33
+ if (parts.length === 0)
34
+ return snakeShout.toLowerCase();
35
+ return parts[0] + parts.slice(1).map(ucfirst).join("");
36
+ }
37
+ export function pulumiConfigKey(envName, field, prefix) {
38
+ const meta = field ? readKumikoMeta(field) : {};
39
+ if (meta.pulumi?.name) {
40
+ return prefix ? prefix + ucfirst(meta.pulumi.name) : meta.pulumi.name;
41
+ }
42
+ const camel = camelCase(envName);
43
+ return prefix ? prefix + ucfirst(camel) : camel;
44
+ }
45
+ export function buildPulumiSuggestion(envName, field, prefix) {
46
+ if (!prefix)
47
+ return undefined;
48
+ const meta = readKumikoMeta(field);
49
+ const key = pulumiConfigKey(envName, field, prefix);
50
+ const secretFlag = meta.pulumi?.secret ? " --secret" : "";
51
+ const value = meta.pulumi?.generator ? `"$(${meta.pulumi.generator})"` : `"<set-me>"`;
52
+ return `Set via: pulumi config set${secretFlag} ${key} ${value}`;
53
+ }
@@ -201,14 +201,14 @@ export class InternalError extends KumikoError {
201
201
  });
202
202
  }
203
203
  }
204
- // A ctx.queryAsMember read ran into its statement timeout (SQLSTATE 57014). Reuses the generic
204
+ // A ctx.dispatch.queryAsMember read ran into its statement timeout (SQLSTATE 57014). Reuses the generic
205
205
  // errors.internal i18n key: the client can do nothing but retry, and the code is for log/alert routing.
206
206
  export class MemberReadTimeoutError extends KumikoError {
207
207
  code = "member_read_timeout";
208
208
  httpStatus = 504;
209
209
  constructor(opts) {
210
210
  super({
211
- message: `ctx.queryAsMember read exceeded its ${opts.timeoutMs}ms statement timeout`,
211
+ message: `ctx.dispatch.queryAsMember read exceeded its ${opts.timeoutMs}ms statement timeout`,
212
212
  i18nKey: "errors.internal",
213
213
  ...(opts.cause && { cause: opts.cause }),
214
214
  });
@@ -1,18 +1,9 @@
1
- export type { FeatureDisabledDetails, FieldIssue, NotFoundDetails, PreconditionFailedDetails, RateLimitDetails, UnconfiguredDetails, UniqueViolationDetails, UnprocessableOpts, ValidationDetails, VersionConflictDetails, } from "./classes.ts";
2
- export { AccessDeniedError, ConflictError, FeatureDisabledError, IdempotentReplayError, InternalError, MemberReadTimeoutError, NotFoundError, PreconditionFailedError, RateLimitError, RateLimitUnavailableError, RecordLockedError, UnauthenticatedError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.ts";
1
+ export type { FieldIssue } from "./classes.ts";
2
+ export { AccessDeniedError, ConflictError, FeatureDisabledError, InternalError, NotFoundError, RateLimitError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.ts";
3
3
  export type { ErrorDocsConfig } from "./docs-url.ts";
4
- export { resolveErrorDocsUrl } from "./docs-url.ts";
5
- export type { ErrorCtorInput, ErrorOpts } from "./kumiko-error.ts";
6
4
  export { isKumikoError, KumikoError } from "./kumiko-error.ts";
7
- export { memberResolutionReadOnlyDenied } from "./member-resolution.ts";
8
- export type { AgentReason, FrameworkReason } from "./reasons.ts";
9
- export { AgentReasons, FrameworkReasons } from "./reasons.ts";
10
- export type { ErrorLogEntry, ErrorResponseBody } from "./serialize.ts";
11
- export { buildErrorLog, serializeError } from "./serialize.ts";
12
- export { isSubjectErasedConflict, subjectErasedConflict } from "./subject-erased.ts";
13
- export { toKumikoError } from "./to-kumiko-error.ts";
14
- export type { InvalidTransitionDetails } from "./transition-details.ts";
15
- export { buildInvalidTransitionDetails } from "./transition-details.ts";
5
+ export { FrameworkReasons } from "./reasons.ts";
6
+ export { subjectErasedConflict } from "./subject-erased.ts";
16
7
  export type { WriteErrorInfo, WriteFailure } from "./write-error-info.ts";
17
- export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, toWriteErrorInfo, writeFailure, } from "./write-error-info.ts";
8
+ export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, writeFailure, } from "./write-error-info.ts";
18
9
  export { validationErrorFromZod } from "./zod-bridge.ts";
@@ -1,11 +1,6 @@
1
- export { AccessDeniedError, ConflictError, FeatureDisabledError, IdempotentReplayError, InternalError, MemberReadTimeoutError, NotFoundError, PreconditionFailedError, RateLimitError, RateLimitUnavailableError, RecordLockedError, UnauthenticatedError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.js";
2
- export { resolveErrorDocsUrl } from "./docs-url.js";
1
+ export { AccessDeniedError, ConflictError, FeatureDisabledError, InternalError, NotFoundError, RateLimitError, UnconfiguredError, UniqueViolationError, UnprocessableError, ValidationError, VersionConflictError, } from "./classes.js";
3
2
  export { isKumikoError, KumikoError } from "./kumiko-error.js";
4
- export { memberResolutionReadOnlyDenied } from "./member-resolution.js";
5
- export { AgentReasons, FrameworkReasons } from "./reasons.js";
6
- export { buildErrorLog, serializeError } from "./serialize.js";
7
- export { isSubjectErasedConflict, subjectErasedConflict } from "./subject-erased.js";
8
- export { toKumikoError } from "./to-kumiko-error.js";
9
- export { buildInvalidTransitionDetails } from "./transition-details.js";
10
- export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, toWriteErrorInfo, writeFailure, } from "./write-error-info.js";
3
+ export { FrameworkReasons } from "./reasons.js";
4
+ export { subjectErasedConflict } from "./subject-erased.js";
5
+ export { failNotFound, failTransition, failUnprocessable, reraiseAsKumikoError, writeFailure, } from "./write-error-info.js";
11
6
  export { validationErrorFromZod } from "./zod-bridge.js";
@@ -3,7 +3,7 @@ import { FrameworkReasons } from "./reasons.js";
3
3
  // Lives in errors/ (not pipeline/) so db/tenant-db.ts can throw it without importing pipeline.
4
4
  export function memberResolutionReadOnlyDenied(cause) {
5
5
  return new AccessDeniedError({
6
- message: "a resolved member principal (ctx.queryAsMember) cannot write or reach raw SQL — read-only",
6
+ message: "a resolved member principal (ctx.dispatch.queryAsMember) cannot write or reach raw SQL — read-only",
7
7
  details: { reason: FrameworkReasons.memberResolutionReadOnly },
8
8
  ...(cause instanceof Error && { cause }),
9
9
  });
@@ -24,4 +24,3 @@ export declare const AgentReasons: {
24
24
  readonly iterationLimit: "agent.iteration_limit";
25
25
  readonly highRiskNoAlways: "agent.high_risk_no_always";
26
26
  };
27
- export type AgentReason = (typeof AgentReasons)[keyof typeof AgentReasons];
@@ -33,10 +33,10 @@ export const FrameworkReasons = {
33
33
  // Distinct from access-denied — clients should surface "feature X is
34
34
  // currently unavailable" not "you don't have permission".
35
35
  featureDisabled: "feature_disabled",
36
- // AccessDeniedError: a handler/hook called ctx.queryAs/ctx.writeAs with a
36
+ // AccessDeniedError: a handler/hook called ctx.dispatch.queryAs/ctx.dispatch.writeAs with a
37
37
  // SYSTEM identity without an r.systemScope() feature or a declared escapeHatch.
38
38
  systemIdentitySwitchDenied: "system_identity_switch_denied",
39
- // AccessDeniedError: a handler/hook called ctx.queryAs/ctx.writeAs with a
39
+ // AccessDeniedError: a handler/hook called ctx.dispatch.queryAs/ctx.dispatch.writeAs with a
40
40
  // non-SYSTEM identity other than its own caller (different user, tenant,
41
41
  // claims, origin or extra roles) without r.systemScope() or escapeHatch.
42
42
  identitySwitchDenied: "identity_switch_denied",
@@ -44,13 +44,13 @@ export const FrameworkReasons = {
44
44
  tenantOverrideRequiresSystemAdmin: "tenant_override_requires_system_admin",
45
45
  // AccessDeniedError: ctx.notify was called with `to: { tenant }` naming a tenant other than the caller's.
46
46
  notifyForeignTenantBroadcast: "notify_foreign_tenant_broadcast",
47
- // AccessDeniedError: a handler/hook called ctx.queryProjection(..., { unsafeAllTenants: true })
47
+ // AccessDeniedError: a handler/hook called ctx.dispatch.queryProjection(..., { unsafeAllTenants: true })
48
48
  // without an r.systemScope() feature or a declared escapeHatch.
49
49
  unsafeAllTenantsDenied: "unsafe_all_tenants_denied",
50
- // AccessDeniedError: ctx.queryAsMember's userId is not an active member of
50
+ // AccessDeniedError: ctx.dispatch.queryAsMember's userId is not an active member of
51
51
  // ctx's tenant. Deliberately generic — a caller can't probe which check failed.
52
52
  memberResolutionDenied: "member_resolution_denied",
53
- // AccessDeniedError: a query handler invoked via ctx.queryAsMember tried to
53
+ // AccessDeniedError: a query handler invoked via ctx.dispatch.queryAsMember tried to
54
54
  // write — a resolved member principal is read-only by construction.
55
55
  memberResolutionReadOnly: "member_resolution_read_only",
56
56
  // AccessDeniedError: a write under an anonymous root touched a personal-data field
@@ -58,11 +58,11 @@ export const FrameworkReasons = {
58
58
  publicIntakeRequired: "public_intake_required",
59
59
  // AccessDeniedError: the directly-dispatched entry handler performs a hard
60
60
  // delete/forget but its agent.risk resolves below "high" — delegation via
61
- // ctx.write/writeAs from a lower-risk handler does not inherit the gate.
61
+ // ctx.dispatch.write/writeAs from a lower-risk handler does not inherit the gate.
62
62
  irreversibleOperationRequiresHighRisk: "irreversible_operation_requires_high_risk",
63
63
  // AccessDeniedError: the directly-dispatched entry handler writes a field
64
64
  // flagged readAsInstruction: true but its agent.risk resolves below "high" —
65
- // delegation via ctx.write/writeAs from a lower-risk handler does not
65
+ // delegation via ctx.dispatch.write/writeAs from a lower-risk handler does not
66
66
  // inherit the gate.
67
67
  instructionFieldWriteRequiresHighRisk: "instruction_field_write_requires_high_risk",
68
68
  // ConflictError: a write touched a personal-data field of a data subject whose
@@ -14,21 +14,3 @@ export type ErrorResponseBody = {
14
14
  };
15
15
  export declare const exposesCauseDetails: () => boolean;
16
16
  export declare function serializeError(err: KumikoError, requestId?: string, errorDocs?: ErrorDocsConfig): ErrorResponseBody;
17
- export type ErrorLogEntry = {
18
- readonly name: string;
19
- readonly code: string;
20
- readonly httpStatus: number;
21
- readonly message: string;
22
- readonly i18nKey: string;
23
- readonly details?: unknown;
24
- readonly stack?: string;
25
- readonly cause?: CauseSnapshot;
26
- };
27
- export declare function buildErrorLog(err: KumikoError): ErrorLogEntry;
28
- type CauseSnapshot = {
29
- readonly name: string;
30
- readonly message: string;
31
- readonly stack?: string;
32
- readonly cause?: CauseSnapshot;
33
- };
34
- export {};
@@ -53,30 +53,3 @@ export function serializeError(err, requestId, errorDocs) {
53
53
  },
54
54
  };
55
55
  }
56
- export function buildErrorLog(err) {
57
- return {
58
- name: err.name,
59
- code: err.code,
60
- httpStatus: err.httpStatus,
61
- message: err.message,
62
- i18nKey: err.i18nKey,
63
- ...(err.details !== undefined && { details: err.details }),
64
- ...(err.stack && { stack: err.stack }),
65
- ...(err.cause !== undefined && { cause: serializeCause(err.cause) }),
66
- };
67
- }
68
- const MAX_CAUSE_DEPTH = 10;
69
- function serializeCause(cause, depth = 0) {
70
- if (depth >= MAX_CAUSE_DEPTH) {
71
- return { name: "CauseChainTruncated", message: `depth >= ${MAX_CAUSE_DEPTH}` };
72
- }
73
- if (cause instanceof Error) {
74
- return {
75
- name: cause.name,
76
- message: cause.message,
77
- ...(cause.stack && { stack: cause.stack }),
78
- ...(cause.cause !== undefined && { cause: serializeCause(cause.cause, depth + 1) }),
79
- };
80
- }
81
- return { name: "NonError", message: String(cause) };
82
- }
@@ -1,4 +1,4 @@
1
- export { type CreateSeedMigrationContextArgs, createSeedMigrationContext, } from "./context.ts";
2
- export { createEsOperationsTable, type EsOperationAppliedBy, type EsOperationType, esOperationsTable, } from "./operations-schema.ts";
3
- export { type RunPendingSeedMigrationsArgs, type RunPendingSeedMigrationsResult, runPendingSeedMigrations, } from "./runner.ts";
4
- export type { SeedMembershipRow, SeedMigration, SeedMigrationContext, SeedTemplateResourceFilter, SeedTemplateResourceRow, SeedTenantRow, SeedUserRow, } from "./types.ts";
1
+ export { createSeedMigrationContext } from "./context.ts";
2
+ export { createEsOperationsTable, esOperationsTable, } from "./operations-schema.ts";
3
+ export { runPendingSeedMigrations } from "./runner.ts";
4
+ export type { SeedMigration, SeedMigrationContext, } from "./types.ts";
@@ -7,6 +7,6 @@
7
7
  // - `SeedMigration`: default export type of a seed file
8
8
  // - `runProdApp({ seedsDir })`: the framework runs pending migrations at boot
9
9
  // - `bunx kumiko ops seed:new|status|apply` (CLI)
10
- export { createSeedMigrationContext, } from "./context.js";
10
+ export { createSeedMigrationContext } from "./context.js";
11
11
  export { createEsOperationsTable, esOperationsTable, } from "./operations-schema.js";
12
- export { runPendingSeedMigrations, } from "./runner.js";
12
+ export { runPendingSeedMigrations } from "./runner.js";