@cosmicdrift/kumiko-framework 0.369.0 → 0.370.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 (449) hide show
  1. package/AGENTS.md +14 -1
  2. package/agents/examples/apex-surface-auth.md +2 -1
  3. package/agents/examples/app-config.md +98 -0
  4. package/agents/examples/auth-mfa.md +72 -0
  5. package/agents/examples/compose-stacks.md +188 -0
  6. package/agents/examples/env-composition.md +268 -0
  7. package/agents/examples/host-routing.md +181 -0
  8. package/agents/examples/legal-pages.md +52 -3
  9. package/agents/examples/managed-config.md +1 -0
  10. package/agents/examples/managed-pages.md +1 -0
  11. package/agents/examples/prod-boot-options.md +180 -0
  12. package/agents/examples/relations.md +4 -0
  13. package/agents/examples/secrets-demo.md +4 -2
  14. package/agents/examples/security-baseline.md +20 -17
  15. package/agents/examples.md +6 -1
  16. package/agents/features.md +14 -2
  17. package/dist/api/anonymous-cookie.d.ts +1 -1
  18. package/dist/api/anonymous-live-entities.d.ts +1 -1
  19. package/dist/api/auth-middleware.d.ts +2 -2
  20. package/dist/api/auth-routes.d.ts +7 -7
  21. package/dist/api/extra-route.d.ts +2 -2
  22. package/dist/api/index.d.ts +37 -37
  23. package/dist/api/jwt.d.ts +1 -1
  24. package/dist/api/observability-middleware.d.ts +1 -1
  25. package/dist/api/readiness.d.ts +1 -1
  26. package/dist/api/redis-sse-broker.d.ts +2 -2
  27. package/dist/api/request-context.d.ts +1 -1
  28. package/dist/api/request-id-middleware.d.ts +3 -3
  29. package/dist/api/route-registrars.d.ts +4 -4
  30. package/dist/api/routes.d.ts +1 -1
  31. package/dist/api/server.d.ts +16 -16
  32. package/dist/api/sse-broker.d.ts +1 -1
  33. package/dist/api/sse-route.d.ts +1 -1
  34. package/dist/api/websocket-route.d.ts +3 -3
  35. package/dist/auth/index.d.ts +2 -2
  36. package/dist/compliance/duration-spec.d.ts +2 -2
  37. package/dist/compliance/index.d.ts +6 -6
  38. package/dist/compliance/profiles.d.ts +1 -1
  39. package/dist/config/index.d.ts +44 -0
  40. package/dist/config/index.js +61 -0
  41. package/dist/crypto/blind-index.d.ts +1 -1
  42. package/dist/crypto/event-pii.d.ts +1 -1
  43. package/dist/crypto/in-memory-kms-adapter.d.ts +1 -1
  44. package/dist/crypto/index.d.ts +11 -11
  45. package/dist/crypto/is-self-pii-field.d.ts +1 -1
  46. package/dist/crypto/kms-wiring.d.ts +2 -2
  47. package/dist/crypto/owner-transition-rekey.d.ts +1 -1
  48. package/dist/crypto/pg-kms-adapter.d.ts +1 -1
  49. package/dist/crypto/pii-field-encryption.d.ts +4 -4
  50. package/dist/crypto/request-kms-cache.d.ts +1 -1
  51. package/dist/crypto/subject-resolver.d.ts +3 -3
  52. package/dist/db/apply-entity-event.d.ts +4 -4
  53. package/dist/db/assert-exists-in.d.ts +4 -4
  54. package/dist/db/blind-index-cleanup.d.ts +2 -2
  55. package/dist/db/collect-table-metas.d.ts +2 -2
  56. package/dist/db/compound-types.d.ts +1 -1
  57. package/dist/db/config-seed.d.ts +5 -5
  58. package/dist/db/connection.d.ts +1 -6
  59. package/dist/db/connection.js +15 -4
  60. package/dist/db/dialect.d.ts +1 -1
  61. package/dist/db/eagerload.d.ts +3 -3
  62. package/dist/db/entity-field-encryption.d.ts +3 -3
  63. package/dist/db/entity-field-encryption.js +3 -1
  64. package/dist/db/entity-table-from-registry.d.ts +3 -3
  65. package/dist/db/entity-table-meta.d.ts +3 -3
  66. package/dist/db/event-store-executor-context.d.ts +9 -9
  67. package/dist/db/event-store-executor-read.d.ts +2 -2
  68. package/dist/db/event-store-executor-write.d.ts +2 -2
  69. package/dist/db/event-store-executor.d.ts +8 -8
  70. package/dist/db/feature-table-sources.d.ts +1 -1
  71. package/dist/db/index.d.ts +39 -39
  72. package/dist/db/located-timestamp.d.ts +1 -1
  73. package/dist/db/lock-guard.d.ts +2 -2
  74. package/dist/db/migrate-generator.d.ts +2 -2
  75. package/dist/db/migrate-runner.d.ts +1 -1
  76. package/dist/db/money.d.ts +1 -1
  77. package/dist/db/parent-ref-clause.d.ts +4 -4
  78. package/dist/db/projection-registry-binding.d.ts +1 -1
  79. package/dist/db/queries/advisory-lock.d.ts +1 -1
  80. package/dist/db/queries/backfill-pii.d.ts +2 -2
  81. package/dist/db/queries/ddl.d.ts +1 -1
  82. package/dist/db/queries/entity-read.d.ts +1 -1
  83. package/dist/db/queries/es-ops.d.ts +1 -1
  84. package/dist/db/queries/event-consumer.d.ts +2 -2
  85. package/dist/db/queries/event-store-admin.d.ts +1 -1
  86. package/dist/db/queries/event-store-transfer.d.ts +1 -1
  87. package/dist/db/queries/event-store.d.ts +1 -1
  88. package/dist/db/queries/pii-backfill-state.d.ts +1 -1
  89. package/dist/db/queries/projection-rebuild.d.ts +1 -1
  90. package/dist/db/queries/raw-sql.d.ts +1 -1
  91. package/dist/db/queries/seed-context.d.ts +2 -2
  92. package/dist/db/queries/shadow-swap.d.ts +3 -3
  93. package/dist/db/queries/table-ops.d.ts +1 -1
  94. package/dist/db/queries/test-stack.d.ts +2 -2
  95. package/dist/db/query.d.ts +3 -3
  96. package/dist/db/rebuild-marker.d.ts +1 -1
  97. package/dist/db/reference-data.d.ts +3 -3
  98. package/dist/db/render-ddl.d.ts +1 -1
  99. package/dist/db/replay-migration-sql.d.ts +1 -1
  100. package/dist/db/retired-framework-tables.d.ts +1 -1
  101. package/dist/db/schema-inspection.d.ts +1 -1
  102. package/dist/db/table-builder.d.ts +4 -4
  103. package/dist/db/table-push.d.ts +3 -3
  104. package/dist/db/tenant-db-runner.d.ts +2 -2
  105. package/dist/db/tenant-db.d.ts +7 -9
  106. package/dist/db/tenant-db.js +2 -12
  107. package/dist/derivatives/derivatives-context.d.ts +3 -3
  108. package/dist/derivatives/field-variants.d.ts +1 -1
  109. package/dist/derivatives/index.d.ts +6 -6
  110. package/dist/engine/access.d.ts +1 -1
  111. package/dist/engine/active-membership.d.ts +2 -2
  112. package/dist/engine/boot-validator/access-declarations.d.ts +1 -1
  113. package/dist/engine/boot-validator/access-roles.d.ts +1 -1
  114. package/dist/engine/boot-validator/action-wiring.d.ts +1 -1
  115. package/dist/engine/boot-validator/api-ext.d.ts +1 -1
  116. package/dist/engine/boot-validator/boot-check.d.ts +1 -1
  117. package/dist/engine/boot-validator/card-meta-overflow.d.ts +1 -1
  118. package/dist/engine/boot-validator/config-deps.d.ts +1 -1
  119. package/dist/engine/boot-validator/detail-screens.d.ts +2 -2
  120. package/dist/engine/boot-validator/entity-handler.d.ts +1 -1
  121. package/dist/engine/boot-validator/entity-list-screens.d.ts +1 -1
  122. package/dist/engine/boot-validator/gdpr-storage.d.ts +1 -1
  123. package/dist/engine/boot-validator/global-tenancy.d.ts +1 -1
  124. package/dist/engine/boot-validator/handler-field-references.d.ts +1 -1
  125. package/dist/engine/boot-validator/i18n-keys.d.ts +1 -1
  126. package/dist/engine/boot-validator/index.d.ts +7 -7
  127. package/dist/engine/boot-validator/nav.d.ts +1 -1
  128. package/dist/engine/boot-validator/ownership.d.ts +2 -2
  129. package/dist/engine/boot-validator/parent-ref.d.ts +1 -1
  130. package/dist/engine/boot-validator/pii-retention.d.ts +2 -2
  131. package/dist/engine/boot-validator/projection-list-screens.d.ts +1 -1
  132. package/dist/engine/boot-validator/query-output-columns.d.ts +1 -1
  133. package/dist/engine/boot-validator/query-refs.d.ts +1 -1
  134. package/dist/engine/boot-validator/record-owned.d.ts +1 -1
  135. package/dist/engine/boot-validator/screens.d.ts +2 -2
  136. package/dist/engine/boot-validator/security-baseline.d.ts +1 -1
  137. package/dist/engine/boot-validator/selector-owner-panels.d.ts +1 -1
  138. package/dist/engine/boot-validator/transfer-graph.d.ts +2 -2
  139. package/dist/engine/boot-validator/url-prefill-fields.d.ts +1 -1
  140. package/dist/engine/boot-validator/workspaces.d.ts +1 -1
  141. package/dist/engine/boot-validator.d.ts +1 -1
  142. package/dist/engine/bridge-stub.d.ts +1 -1
  143. package/dist/engine/build-app-schema.d.ts +2 -2
  144. package/dist/engine/build-config-feature-schema.d.ts +5 -5
  145. package/dist/engine/build-target.d.ts +2 -2
  146. package/dist/engine/changeset-changes.d.ts +1 -1
  147. package/dist/engine/codemod/index.d.ts +2 -2
  148. package/dist/engine/config-helpers.d.ts +1 -1
  149. package/dist/engine/constants.d.ts +1 -1
  150. package/dist/engine/create-app.d.ts +2 -2
  151. package/dist/engine/cross-tenant.d.ts +2 -2
  152. package/dist/engine/dedupe-features.d.ts +1 -1
  153. package/dist/engine/define-feature.d.ts +1 -1
  154. package/dist/engine/define-feature.js +2 -2
  155. package/dist/engine/define-handler.d.ts +4 -4
  156. package/dist/engine/define-step.d.ts +1 -1
  157. package/dist/engine/define-workflow.d.ts +2 -2
  158. package/dist/engine/effective-features.d.ts +1 -1
  159. package/dist/engine/embedded-derived.d.ts +1 -1
  160. package/dist/engine/entity-handlers.d.ts +6 -5
  161. package/dist/engine/entity-handlers.js +6 -3
  162. package/dist/engine/event-def.d.ts +15 -0
  163. package/dist/engine/event-def.js +123 -0
  164. package/dist/engine/event-helpers.d.ts +1 -1
  165. package/dist/engine/extension-names.d.ts +8 -8
  166. package/dist/engine/extension-selector-plugins.d.ts +2 -2
  167. package/dist/engine/extensions/escape-hatch-usage.d.ts +1 -1
  168. package/dist/engine/extensions/storage-provider.d.ts +1 -1
  169. package/dist/engine/extensions/tenant-data.d.ts +3 -3
  170. package/dist/engine/extensions/tenant-resource.d.ts +2 -2
  171. package/dist/engine/extensions/user-data.d.ts +2 -2
  172. package/dist/engine/factories.d.ts +1 -1
  173. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +2 -2
  174. package/dist/engine/feature-ast/extractors/events.d.ts +2 -2
  175. package/dist/engine/feature-ast/extractors/handlers.d.ts +4 -4
  176. package/dist/engine/feature-ast/extractors/hooks.d.ts +5 -5
  177. package/dist/engine/feature-ast/extractors/index.d.ts +14 -14
  178. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +3 -3
  179. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +3 -3
  180. package/dist/engine/feature-ast/extractors/round1.d.ts +2 -2
  181. package/dist/engine/feature-ast/extractors/round2.d.ts +2 -2
  182. package/dist/engine/feature-ast/extractors/round3.d.ts +4 -4
  183. package/dist/engine/feature-ast/extractors/round5.d.ts +2 -2
  184. package/dist/engine/feature-ast/extractors/round6.d.ts +2 -2
  185. package/dist/engine/feature-ast/extractors/shared.d.ts +2 -2
  186. package/dist/engine/feature-ast/index.d.ts +16 -16
  187. package/dist/engine/feature-ast/parse.d.ts +2 -2
  188. package/dist/engine/feature-ast/patch.d.ts +1 -1
  189. package/dist/engine/feature-ast/patcher.d.ts +15 -15
  190. package/dist/engine/feature-ast/pattern-change-schema.d.ts +10 -10
  191. package/dist/engine/feature-ast/patterns.d.ts +15 -15
  192. package/dist/engine/feature-ast/render.d.ts +1 -1
  193. package/dist/engine/feature-builder-state.d.ts +5 -5
  194. package/dist/engine/feature-config-events-jobs.d.ts +3 -3
  195. package/dist/engine/feature-config-events-jobs.js +8 -130
  196. package/dist/engine/feature-entity-handlers.d.ts +4 -4
  197. package/dist/engine/feature-entity-handlers.js +11 -5
  198. package/dist/engine/feature-manifest.d.ts +1 -1
  199. package/dist/engine/feature-ui-extensions.d.ts +7 -7
  200. package/dist/engine/feature-ui-extensions.js +2 -2
  201. package/dist/engine/field-access.d.ts +1 -1
  202. package/dist/engine/field-helpers.d.ts +1 -1
  203. package/dist/engine/handler-helpers.d.ts +1 -1
  204. package/dist/engine/index.d.ts +89 -88
  205. package/dist/engine/index.js +1 -0
  206. package/dist/engine/instruction-fields.d.ts +1 -1
  207. package/dist/engine/object-form.d.ts +1 -1
  208. package/dist/engine/object-form.js +5 -6
  209. package/dist/engine/ownership.d.ts +3 -3
  210. package/dist/engine/pattern-library/index.d.ts +2 -2
  211. package/dist/engine/pattern-library/library.d.ts +2 -2
  212. package/dist/engine/pattern-library/mixed-schemas.d.ts +1 -1
  213. package/dist/engine/pattern-library/opaque-schemas.d.ts +1 -1
  214. package/dist/engine/pattern-library/shared-fields.d.ts +1 -1
  215. package/dist/engine/pattern-library/static-schemas.d.ts +1 -1
  216. package/dist/engine/pattern-library/types.d.ts +1 -1
  217. package/dist/engine/personal-data-fields.d.ts +2 -2
  218. package/dist/engine/pipeline.d.ts +2 -2
  219. package/dist/engine/project-app-schema-for-roles.d.ts +1 -1
  220. package/dist/engine/projection-helpers.d.ts +4 -4
  221. package/dist/engine/read-claim.d.ts +1 -1
  222. package/dist/engine/registry-facade.d.ts +2 -2
  223. package/dist/engine/registry-ingest.d.ts +2 -2
  224. package/dist/engine/registry-state.d.ts +2 -2
  225. package/dist/engine/registry-validate.d.ts +3 -3
  226. package/dist/engine/registry.d.ts +1 -1
  227. package/dist/engine/resolve-config-or-param.d.ts +2 -2
  228. package/dist/engine/role-assignment.d.ts +1 -1
  229. package/dist/engine/run-in.d.ts +1 -1
  230. package/dist/engine/run-pipeline.d.ts +3 -3
  231. package/dist/engine/schema-builder.d.ts +1 -1
  232. package/dist/engine/screen-filter-ops.d.ts +1 -1
  233. package/dist/engine/screen-helpers.d.ts +2 -2
  234. package/dist/engine/soft-delete-cleanup.d.ts +2 -2
  235. package/dist/engine/steps/_event-match.d.ts +1 -1
  236. package/dist/engine/steps/_no-return-guard.d.ts +1 -1
  237. package/dist/engine/steps/_read-source.d.ts +4 -4
  238. package/dist/engine/steps/_resolver-utils.d.ts +1 -1
  239. package/dist/engine/steps/aggregate-append-event.d.ts +1 -1
  240. package/dist/engine/steps/aggregate-create.d.ts +2 -2
  241. package/dist/engine/steps/aggregate-update.d.ts +3 -3
  242. package/dist/engine/steps/branch.d.ts +1 -1
  243. package/dist/engine/steps/call-feature.d.ts +2 -2
  244. package/dist/engine/steps/compute.d.ts +1 -1
  245. package/dist/engine/steps/for-each.d.ts +1 -1
  246. package/dist/engine/steps/mail-send.d.ts +1 -1
  247. package/dist/engine/steps/read-find-many.d.ts +2 -2
  248. package/dist/engine/steps/read-find-one.d.ts +2 -2
  249. package/dist/engine/steps/retry.d.ts +1 -1
  250. package/dist/engine/steps/return.d.ts +2 -2
  251. package/dist/engine/steps/unsafe-projection-delete.d.ts +2 -2
  252. package/dist/engine/steps/unsafe-projection-upsert.d.ts +1 -1
  253. package/dist/engine/steps/wait-for-event.d.ts +1 -1
  254. package/dist/engine/steps/wait.d.ts +1 -1
  255. package/dist/engine/steps/webhook-send.d.ts +1 -1
  256. package/dist/engine/strip-disabled-features-from-app-schema.d.ts +4 -4
  257. package/dist/engine/system-user.d.ts +2 -2
  258. package/dist/engine/template-variables.d.ts +1 -1
  259. package/dist/engine/tier-resolver-extension.d.ts +4 -4
  260. package/dist/engine/transfer-adjacency.d.ts +1 -1
  261. package/dist/engine/types/index.d.ts +6 -6
  262. package/dist/engine/validate-projection-allowlist.d.ts +1 -1
  263. package/dist/engine/validation.d.ts +1 -1
  264. package/dist/entrypoint/index.d.ts +12 -12
  265. package/dist/env/dry-run.d.ts +14 -1
  266. package/dist/env/dry-run.js +50 -0
  267. package/dist/env/index.d.ts +54 -16
  268. package/dist/env/index.js +60 -6
  269. package/dist/errors/classes.d.ts +3 -3
  270. package/dist/errors/docs-url.d.ts +1 -1
  271. package/dist/errors/index.d.ts +18 -18
  272. package/dist/errors/member-resolution.d.ts +1 -1
  273. package/dist/errors/serialize.d.ts +2 -2
  274. package/dist/errors/subject-erased.d.ts +1 -1
  275. package/dist/errors/to-kumiko-error.d.ts +1 -1
  276. package/dist/errors/write-error-info.d.ts +1 -1
  277. package/dist/errors/zod-bridge.d.ts +1 -1
  278. package/dist/es-ops/context.d.ts +4 -4
  279. package/dist/es-ops/index.d.ts +4 -4
  280. package/dist/es-ops/operations-schema.d.ts +1 -1
  281. package/dist/es-ops/runner.d.ts +3 -3
  282. package/dist/es-ops/runner.js +9 -1
  283. package/dist/es-ops/types.d.ts +2 -2
  284. package/dist/event-store/admin-api.d.ts +3 -3
  285. package/dist/event-store/archive.d.ts +2 -2
  286. package/dist/event-store/event-store.d.ts +2 -2
  287. package/dist/event-store/events-schema.d.ts +1 -1
  288. package/dist/event-store/index.d.ts +15 -15
  289. package/dist/event-store/provenance-append.d.ts +3 -3
  290. package/dist/event-store/rebuild-dead-letter.d.ts +2 -2
  291. package/dist/event-store/row-to-stored-event.d.ts +2 -2
  292. package/dist/event-store/snapshot.d.ts +2 -2
  293. package/dist/event-store/tenant-db-append.d.ts +2 -2
  294. package/dist/event-store/transfer.d.ts +3 -3
  295. package/dist/event-store/upcaster-dead-letter.d.ts +2 -2
  296. package/dist/event-store/upcaster.d.ts +3 -3
  297. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -2
  298. package/dist/files/bind-pending-file-refs.d.ts +3 -3
  299. package/dist/files/create-file-ref-from-bytes.d.ts +4 -4
  300. package/dist/files/create-file-ref.d.ts +3 -3
  301. package/dist/files/dispose-removed-file-refs.d.ts +2 -2
  302. package/dist/files/feature.d.ts +3 -3
  303. package/dist/files/file-handle.d.ts +1 -1
  304. package/dist/files/file-ref-entity.d.ts +1 -1
  305. package/dist/files/file-ref-table.d.ts +1 -1
  306. package/dist/files/file-routes.d.ts +5 -5
  307. package/dist/files/in-memory-provider.d.ts +1 -1
  308. package/dist/files/index.d.ts +20 -20
  309. package/dist/files/load-save-file-refs.d.ts +2 -2
  310. package/dist/files/local-provider.d.ts +1 -1
  311. package/dist/files/provider-resolver.d.ts +5 -5
  312. package/dist/files/purge-expired-file-ref-bytes.d.ts +2 -2
  313. package/dist/files/record-read-check.d.ts +1 -1
  314. package/dist/files/record-write-check.d.ts +3 -3
  315. package/dist/files/storage-tracking.d.ts +2 -2
  316. package/dist/files/types.d.ts +1 -1
  317. package/dist/files/zip-stream.d.ts +1 -1
  318. package/dist/i18n/index.d.ts +4 -4
  319. package/dist/i18n/mail-registry.d.ts +1 -1
  320. package/dist/i18n/required-surface-keys.d.ts +1 -1
  321. package/dist/i18n/settings-hub-keys.d.ts +1 -1
  322. package/dist/internal/stack-support.d.ts +12 -12
  323. package/dist/internal/testing.d.ts +4 -4
  324. package/dist/jobs/index.d.ts +2 -2
  325. package/dist/jobs/job-runner.d.ts +1 -1
  326. package/dist/jobs/max-per-tenant.d.ts +1 -1
  327. package/dist/lifecycle/index.d.ts +2 -2
  328. package/dist/lifecycle/lifecycle.d.ts +1 -1
  329. package/dist/lifecycle/signal-handlers.d.ts +1 -1
  330. package/dist/logging/index.d.ts +4 -4
  331. package/dist/logging/pino-logger.d.ts +1 -1
  332. package/dist/logging/utils.d.ts +1 -1
  333. package/dist/migrations/index.d.ts +4 -4
  334. package/dist/migrations/kumiko-drift.d.ts +1 -1
  335. package/dist/migrations/pending-rebuilds.d.ts +5 -5
  336. package/dist/migrations/pii-event-backfill.d.ts +4 -4
  337. package/dist/migrations/projection-table-index.d.ts +1 -1
  338. package/dist/observability/console-provider.d.ts +1 -1
  339. package/dist/observability/context.d.ts +1 -1
  340. package/dist/observability/escape-hatch-report.d.ts +3 -3
  341. package/dist/observability/fallback.d.ts +1 -1
  342. package/dist/observability/index.d.ts +16 -16
  343. package/dist/observability/metric-validator.d.ts +1 -1
  344. package/dist/observability/metrics-handle.d.ts +1 -1
  345. package/dist/observability/metrics-wiring.d.ts +2 -2
  346. package/dist/observability/noop-provider.d.ts +1 -1
  347. package/dist/observability/prometheus-meter.d.ts +1 -1
  348. package/dist/observability/recording-meter.d.ts +1 -1
  349. package/dist/observability/recording-tracer.d.ts +1 -1
  350. package/dist/observability/redis-wrapper.d.ts +1 -1
  351. package/dist/observability/sensitive-filter.d.ts +1 -1
  352. package/dist/observability/standard-metrics.d.ts +1 -1
  353. package/dist/pipeline/active-membership.d.ts +4 -4
  354. package/dist/pipeline/append-event-core.d.ts +3 -3
  355. package/dist/pipeline/auth-claims-resolver.d.ts +2 -2
  356. package/dist/pipeline/cascade-handler.d.ts +3 -3
  357. package/dist/pipeline/dispatch-batch.d.ts +2 -2
  358. package/dist/pipeline/dispatch-query.d.ts +4 -4
  359. package/dist/pipeline/dispatch-shared.d.ts +17 -17
  360. package/dist/pipeline/dispatch-stream.d.ts +2 -2
  361. package/dist/pipeline/dispatch-write.d.ts +4 -4
  362. package/dist/pipeline/dispatcher-utils.d.ts +2 -2
  363. package/dist/pipeline/dispatcher.d.ts +12 -12
  364. package/dist/pipeline/event-consumer-state.d.ts +1 -1
  365. package/dist/pipeline/event-dispatcher-admin.d.ts +1 -1
  366. package/dist/pipeline/event-dispatcher-delivery.d.ts +7 -7
  367. package/dist/pipeline/event-dispatcher.d.ts +7 -7
  368. package/dist/pipeline/event-retention.d.ts +1 -1
  369. package/dist/pipeline/handler-access-error.d.ts +2 -2
  370. package/dist/pipeline/index.d.ts +42 -42
  371. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  372. package/dist/pipeline/lifecycle-pipeline.d.ts +2 -2
  373. package/dist/pipeline/member-read-only-transaction.d.ts +2 -2
  374. package/dist/pipeline/member-reader.d.ts +5 -5
  375. package/dist/pipeline/msp-rebuild.d.ts +4 -4
  376. package/dist/pipeline/multi-stream-apply-context.d.ts +3 -3
  377. package/dist/pipeline/notify-scope.d.ts +3 -3
  378. package/dist/pipeline/pending-gap-ranges.d.ts +2 -2
  379. package/dist/pipeline/pre-handler-gates.d.ts +3 -3
  380. package/dist/pipeline/pre-transaction-reservations.d.ts +4 -4
  381. package/dist/pipeline/projection-rebuild.d.ts +3 -3
  382. package/dist/pipeline/projection-state.d.ts +1 -1
  383. package/dist/pipeline/projections-runner.d.ts +3 -3
  384. package/dist/pipeline/projections-runner.js +3 -4
  385. package/dist/pipeline/system-hooks.d.ts +4 -4
  386. package/dist/pipeline/system-identity-switch.d.ts +3 -3
  387. package/dist/pipeline/tenant-timezone-cache.d.ts +1 -1
  388. package/dist/pipeline/write-origin.d.ts +3 -3
  389. package/dist/pipeline/write-result-masking.d.ts +2 -2
  390. package/dist/random/index.d.ts +2 -2
  391. package/dist/rate-limit/bucket.d.ts +1 -1
  392. package/dist/rate-limit/index.d.ts +3 -3
  393. package/dist/rate-limit/middleware.d.ts +3 -3
  394. package/dist/redis/cache-sync-bus.d.ts +2 -2
  395. package/dist/redis/cache-sync-topics.d.ts +1 -1
  396. package/dist/redis/index.d.ts +8 -8
  397. package/dist/redis/pubsub-signal.d.ts +1 -1
  398. package/dist/schema-cli.d.ts +1 -1
  399. package/dist/schema-cli.js +9 -1
  400. package/dist/search/derive-search-adapter-config.d.ts +2 -2
  401. package/dist/search/in-memory-adapter.d.ts +1 -1
  402. package/dist/search/index.d.ts +6 -6
  403. package/dist/search/meilisearch-adapter.d.ts +2 -2
  404. package/dist/search/purge-subject.d.ts +4 -4
  405. package/dist/search/reindex-entity.d.ts +3 -3
  406. package/dist/secrets/dek-cache.d.ts +1 -1
  407. package/dist/secrets/env-master-key-provider.d.ts +1 -1
  408. package/dist/secrets/env-master-key-provider.js +26 -11
  409. package/dist/secrets/envelope-cipher.d.ts +2 -2
  410. package/dist/secrets/envelope.d.ts +1 -1
  411. package/dist/secrets/index.d.ts +9 -9
  412. package/dist/secrets/rotation.d.ts +1 -1
  413. package/dist/secrets/stored-envelope.d.ts +1 -1
  414. package/dist/seeding/entity-seed.d.ts +1 -1
  415. package/dist/seeding/index.d.ts +3 -3
  416. package/dist/seeding/seed-users.d.ts +1 -1
  417. package/dist/time/index.d.ts +6 -6
  418. package/dist/ui-types/app-schema.d.ts +5 -5
  419. package/dist/ui-types/index.d.ts +23 -23
  420. package/dist/upgrade-cli.js +13 -3
  421. package/dist/utils/index.d.ts +9 -9
  422. package/package.json +19 -66
  423. package/presets/biome-app.json +80 -0
  424. package/presets/tsconfig.app.json +19 -0
  425. package/src/changes.json +78 -2
  426. package/src/scripts/codemod/README.md +18 -0
  427. package/src/scripts/codemod/codemod-support.ts +1 -1
  428. package/src/scripts/codemod/db-factory.ts +1 -1
  429. package/src/scripts/codemod/feature-factory.ts +1 -1
  430. package/src/scripts/codemod/import-extensions.ts +118 -0
  431. package/src/scripts/codemod/migrate-cross-tenant.ts +2 -2
  432. package/src/scripts/codemod/migrate-db-raw.ts +1 -1
  433. package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
  434. package/src/scripts/codemod/object-form.ts +1 -1
  435. package/src/scripts/codemod/s3-imports.ts +1 -1
  436. package/src/scripts/codemod/tenant-db-options.ts +1 -1
  437. package/src/scripts/codemod/testing-move.ts +2 -2
  438. package/dist/db/bun-db-deprecated.d.ts +0 -10
  439. package/dist/db/bun-db-deprecated.js +0 -5
  440. package/dist/stack/index.d.ts +0 -10
  441. package/dist/stack/index.js +0 -11
  442. package/dist/testing/e2e-generator.d.ts +0 -5
  443. package/dist/testing/e2e-generator.js +0 -5
  444. package/dist/testing/handler-context.d.ts +0 -5
  445. package/dist/testing/handler-context.js +0 -5
  446. package/dist/testing/index.d.ts +0 -10
  447. package/dist/testing/index.js +0 -10
  448. package/dist/testing/real-providers.d.ts +0 -5
  449. package/dist/testing/real-providers.js +0 -5
@@ -1,7 +1,7 @@
1
- import type { DbRunner } from "../../db/connection.js";
2
- import type { WhereObject } from "../../db/query.js";
3
- import { type TenantDb } from "../../db/tenant-db.js";
4
- import type { PipelineCtx } from "../types/step.js";
1
+ import type { DbRunner } from "../../db/connection.ts";
2
+ import type { WhereObject } from "../../db/query.ts";
3
+ import { type TenantDb } from "../../db/tenant-db.ts";
4
+ import type { PipelineCtx } from "../types/step.ts";
5
5
  export declare function readSourceFor(ctx: PipelineCtx, unsafeAllTenants: {
6
6
  readonly reason: string;
7
7
  } | undefined): TenantDb | DbRunner;
@@ -1,4 +1,4 @@
1
- import type { PipelineCtx, StepResolver } from "../types/step.js";
1
+ import type { PipelineCtx, StepResolver } from "../types/step.ts";
2
2
  /**
3
3
  * Resolve a required StepResolver — either a static value or a function.
4
4
  * Throws if `arg` is undefined; caller must guarantee presence.
@@ -1,4 +1,4 @@
1
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { StepInstance, StepResolver } from "../types/step.ts";
2
2
  type AggregateAppendEventArgs = {
3
3
  readonly aggregateId: StepResolver<string>;
4
4
  readonly aggregateType: string;
@@ -1,5 +1,5 @@
1
- import type { EventStoreExecutor } from "../../db/event-store-executor.js";
2
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { EventStoreExecutor } from "../../db/event-store-executor.ts";
2
+ import type { StepInstance, StepResolver } from "../types/step.ts";
3
3
  export declare function buildAggregateCreateStep(name: string, opts: {
4
4
  readonly executor: EventStoreExecutor;
5
5
  readonly data: StepResolver<Record<string, unknown>>;
@@ -1,6 +1,6 @@
1
- import type { EventStoreExecutor } from "../../db/event-store-executor.js";
2
- import type { EntityId } from "../types/identifiers.js";
3
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { EventStoreExecutor } from "../../db/event-store-executor.ts";
2
+ import type { EntityId } from "../types/identifiers.ts";
3
+ import type { StepInstance, StepResolver } from "../types/step.ts";
4
4
  export declare function buildAggregateUpdateStep(name: string, opts: {
5
5
  readonly executor: EventStoreExecutor;
6
6
  readonly id: StepResolver<EntityId>;
@@ -1,4 +1,4 @@
1
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { StepInstance, StepResolver } from "../types/step.ts";
2
2
  type BranchArgs = {
3
3
  readonly if: StepResolver<boolean>;
4
4
  readonly onTrue: readonly StepInstance[];
@@ -1,5 +1,5 @@
1
- import type { SessionUser } from "../types/index.js";
2
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { SessionUser } from "../types/index.ts";
2
+ import type { StepInstance, StepResolver } from "../types/step.ts";
3
3
  export declare function buildCallFeatureStep(name: string, opts: {
4
4
  readonly handler: string;
5
5
  readonly payload: StepResolver<unknown>;
@@ -1,2 +1,2 @@
1
- import type { PipelineCtx, StepInstance } from "../types/step.js";
1
+ import type { PipelineCtx, StepInstance } from "../types/step.ts";
2
2
  export declare function buildComputeStep<TResult>(name: string, fn: (ctx: PipelineCtx) => TResult): StepInstance;
@@ -1,4 +1,4 @@
1
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { StepInstance, StepResolver } from "../types/step.ts";
2
2
  type ForEachArgs<TItem = unknown> = {
3
3
  readonly over: StepResolver<readonly TItem[]>;
4
4
  readonly as: string;
@@ -1,4 +1,4 @@
1
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { StepInstance, StepResolver } from "../types/step.ts";
2
2
  type MailSendArgs = {
3
3
  readonly to: StepResolver<string | readonly string[]>;
4
4
  readonly subject: StepResolver<string>;
@@ -1,5 +1,5 @@
1
- import { type WhereObject } from "../../db/query.js";
2
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import { type WhereObject } from "../../db/query.ts";
2
+ import type { StepInstance, StepResolver } from "../types/step.ts";
3
3
  export declare function buildReadFindManyStep(name: string, opts: {
4
4
  readonly table: unknown;
5
5
  readonly where?: StepResolver<WhereObject | undefined>;
@@ -1,5 +1,5 @@
1
- import { type WhereObject } from "../../db/query.js";
2
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import { type WhereObject } from "../../db/query.ts";
2
+ import type { StepInstance, StepResolver } from "../types/step.ts";
3
3
  export declare function buildReadFindOneStep(name: string, opts: {
4
4
  readonly table: unknown;
5
5
  readonly where: StepResolver<WhereObject | undefined>;
@@ -1,4 +1,4 @@
1
- import type { StepInstance } from "../types/step.js";
1
+ import type { StepInstance } from "../types/step.ts";
2
2
  type RetryStepArgs = {
3
3
  readonly times: number;
4
4
  readonly backoff: "exponential" | "linear";
@@ -1,4 +1,4 @@
1
- import type { WriteResult } from "../types/handlers.js";
2
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { WriteResult } from "../types/handlers.ts";
2
+ import type { StepInstance, StepResolver } from "../types/step.ts";
3
3
  export declare const RETURN_RESULT_KEY = "__return";
4
4
  export declare function buildReturnStep<TData>(resolver: StepResolver<WriteResult<TData>>): StepInstance;
@@ -1,5 +1,5 @@
1
- import { type WhereObject } from "../../db/query.js";
2
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import { type WhereObject } from "../../db/query.ts";
2
+ import type { StepInstance, StepResolver } from "../types/step.ts";
3
3
  type UnsafeProjectionDeleteArgs = {
4
4
  readonly table: unknown;
5
5
  readonly where: StepResolver<WhereObject>;
@@ -1,4 +1,4 @@
1
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { StepInstance, StepResolver } from "../types/step.ts";
2
2
  type UnsafeProjectionUpsertArgs = {
3
3
  readonly table: unknown;
4
4
  readonly on: readonly string[];
@@ -1,4 +1,4 @@
1
- import type { AwaitedEventType, EventMatch, StepInstance, StepResolver } from "../types/step.js";
1
+ import type { AwaitedEventType, EventMatch, StepInstance, StepResolver } from "../types/step.ts";
2
2
  type WaitForEventArgs = {
3
3
  readonly event: AwaitedEventType;
4
4
  readonly match?: StepResolver<EventMatch>;
@@ -1,4 +1,4 @@
1
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { StepInstance, StepResolver } from "../types/step.ts";
2
2
  type WaitStepArgs = {
3
3
  readonly for: StepResolver<string>;
4
4
  };
@@ -1,4 +1,4 @@
1
- import type { StepInstance, StepResolver } from "../types/step.js";
1
+ import type { StepInstance, StepResolver } from "../types/step.ts";
2
2
  type WebhookHttpMethod = "POST" | "PUT" | "PATCH";
3
3
  type WebhookAuth = {
4
4
  readonly kind: "bearer";
@@ -1,6 +1,6 @@
1
- import type { AppSchema } from "../ui-types/app-schema.js";
2
- import type { EffectiveFeaturesResolver } from "./tier-resolver-extension.js";
3
- import type { Registry } from "./types/feature.js";
4
- import type { TenantId } from "./types/identifiers.js";
1
+ import type { AppSchema } from "../ui-types/app-schema.ts";
2
+ import type { EffectiveFeaturesResolver } from "./tier-resolver-extension.ts";
3
+ import type { Registry } from "./types/feature.ts";
4
+ import type { TenantId } from "./types/identifiers.ts";
5
5
  export declare function resolveDisabledFeatureNames(registry: Registry, effectiveFeatures: EffectiveFeaturesResolver, tenantId: TenantId): Promise<readonly string[]>;
6
6
  export declare function stripDisabledFeaturesFromAppSchema(schema: AppSchema, registry: Registry, disabledFeatureNames: readonly string[]): AppSchema;
@@ -1,5 +1,5 @@
1
- import { SYSTEM_USER_ID, type TenantId } from "./types/identifiers.js";
2
- import type { SessionUser } from "./types/index.js";
1
+ import { SYSTEM_USER_ID, type TenantId } from "./types/identifiers.ts";
2
+ import type { SessionUser } from "./types/index.ts";
3
3
  export { SYSTEM_USER_ID };
4
4
  export declare const SYSTEM_ROLE: "system";
5
5
  export declare function createSystemUser(tenantId: TenantId, extraRoles?: readonly string[]): SessionUser;
@@ -1,5 +1,5 @@
1
1
  import * as z from "zod";
2
- import type { Registry, TemplateListVariableDef, TemplateScalarVariableDef, TemplateVariables } from "./types/index.js";
2
+ import type { Registry, TemplateListVariableDef, TemplateScalarVariableDef, TemplateVariables } from "./types/index.ts";
3
3
  type CommonOptions = {
4
4
  readonly label?: string;
5
5
  readonly required?: boolean;
@@ -1,8 +1,8 @@
1
1
  import type { CacheSyncBus } from "@cosmicdrift/kumiko-types/cache-sync-types";
2
- import type { DbConnection } from "../db/connection.js";
3
- import type { RegistrarExtensionRegistration } from "./types/config.js";
4
- import type { FeatureDefinition, Registry } from "./types/feature.js";
5
- import type { TenantId } from "./types/identifiers.js";
2
+ import type { DbConnection } from "../db/connection.ts";
3
+ import type { RegistrarExtensionRegistration } from "./types/config.ts";
4
+ import type { FeatureDefinition, Registry } from "./types/feature.ts";
5
+ import type { TenantId } from "./types/identifiers.ts";
6
6
  /**
7
7
  * Extension-name unter dem ein tier-resolver-plugin im registry registriert
8
8
  * werden muss. Konstante damit `r.useExtension(TENANT_TIER_RESOLVER_EXT, ...)`
@@ -1,4 +1,4 @@
1
- import type { EntityDefinition } from "./types/index.js";
1
+ import type { EntityDefinition } from "./types/index.ts";
2
2
  export declare const MAX_TRANSFER_DEPTH = 5;
3
3
  export type TransferEdgeLink = {
4
4
  readonly kind: "parentRef";
@@ -4,7 +4,7 @@ export type { QueryHandlerDefinition, StreamHandlerDefinition, WriteHandlerDefin
4
4
  export type { EntityCrudRegistrar, EntityCrudVerb, EntityHandlerOptions, EntityQueryHandlerOptions, EntityWriteHandlerOptions, RegisterEntityCrudOptions, } from "@cosmicdrift/kumiko-types/entity-handlers";
5
5
  export type { KumikoEntityTypeMap, KumikoEventTypeMap, KumikoHandlerPayloadMap, KumikoHandlerResultMap, } from "@cosmicdrift/kumiko-types/event-type-map";
6
6
  export type { ExtensionOptionsArgs, ExtensionOptionsFor, KumikoExtensionOptionsMap, } from "@cosmicdrift/kumiko-types/extension-options-map";
7
- export type { BootCheckContext, BootCheckFn, EntityObjectDefinition, FeatureDefinition, FeatureMetricDef, FeatureMetricType, FeatureRegistrar, HookDefinition, MetricOptions, Registry, SecretKeyDefinition, SecretKeyHandle, SecretNamespaceDefinition, SecretNamespaceHandle, SecretNamespaceOptions, SecretOptions, StoreTableDef, StoreTableEntry, StoreTableOptions, UiHintOption, UiHints, } from "@cosmicdrift/kumiko-types/feature";
7
+ export type { BootCheckContext, BootCheckFn, BootOptionName, EntityObjectDefinition, FeatureDefinition, FeatureMetricDef, FeatureMetricType, FeatureRegistrar, HookDefinition, MetricOptions, Registry, SecretKeyDefinition, SecretKeyHandle, SecretNamespaceDefinition, SecretNamespaceHandle, SecretNamespaceOptions, SecretOptions, StackBootRequirement, StoreTableDef, StoreTableEntry, StoreTableOptions, UiHintOption, UiHints, } from "@cosmicdrift/kumiko-types/feature";
8
8
  export type { FieldIconKey } from "@cosmicdrift/kumiko-types/field-icon";
9
9
  export type { AnyFileFieldDef, BigIntFieldDef, BooleanFieldDef, ClientDerivedFieldDef, DateFieldDef, DecimalFieldDef, DefaultCurrency, DeriveContext, DerivedFieldDef, DerivedFieldsMap, DerivedValueType, EmbeddedDerivedCellDef, EmbeddedFieldDef, EmbeddedSubFieldDef, EntityDefinition, EntityEventMigration, EntityIndexDef, FieldAccess, FieldDefinition, FieldsMap, FileFieldDef, FilesFieldDef, Findability, ImageFieldDef, ImagesFieldDef, JsonbFieldDef, LocatedTimestampFieldDef, LongTextFieldDef, LongTextFindability, MoneyCurrencySource, MoneyFieldDef, MultiSelectFieldDef, NumberFieldDef, OptionsQueryPayload, OptionsQueryPayloadValue, ParentRefDef, PersonalAnnotations, PersonalAnnotationsLongText, PersonalAnnotationsNoFind, PersonalSubject, ReferenceFieldDef, ResolvedPiiFlags, RetentionDef, SelectFieldDef, SelectOptionTone, TextFieldDef, TimestampFieldDef, TransitionMap, TzFieldDef, } from "@cosmicdrift/kumiko-types/fields";
10
10
  export type { AccessRule, ActiveMembership, ActiveMembershipRejection, ActiveMembershipResult, AgentExposure, AgentHandlerHints, AgentRisk, AggregateStreamHandle, AppContext, AppendEventArgs, AppendEventFn, AuthClaimsContext, AuthClaimsFn, AuthClaimsHookDef, BeforeTransactionPhase, BeforeTransactionResult, CamelToKebab, ChatSendFailureCode, ClaimKeyDefinition, ClaimKeyHandle, ClaimKeyJsType, ClaimKeyType, DeclarativeEventMigration, DeliveryErrorCode, DeliveryFailureCode, DeliverySkipReason, DispatchWriteRef, EntityRef, EscapeHatchAuditSink, EscapeHatchDeclaration, EscapeHatchKind, EscapeHatchReporter, EscapeHatchTarget, EscapeHatchUseEvent, EventDef, EventMigrationDef, EventPiiFields, EventPiiStance, EventUpcastCtx, EventUpcastFn, FetchForWritingArgs, HandlerContext, HandlerRef, JobContext, JobRunnerRef, JobTriggerEvent, MemberReader, NameOrRef, NotifyDeferred, NotifyDelivery, NotifyDeliveryStatus, NotifyDispatched, NotifyFactory, NotifyFn, NotifyJobDispatcher, NotifyOptions, NotifyPriority, NotifyResult, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, PayloadBucketNormalization, PayloadRateLimitOption, PreparedWriteEvent, QualifiedEventName, QueryEvent, QueryHandlerDef, QueryHandlerFn, RateLimitDeclaration, RateLimitDisabled, RateLimitOption, RateLimitPer, RoleAccessPersonalData, RoleAccessRule, SessionUser, SessionUserOrigin, StreamHandlerDef, StreamHandlerFn, TenantWriteTarget, TryAppendEventFn, TryAppendEventResult, UnsafeAppendEventFn, WriteEvent, WriteHandlerDef, WriteHandlerFn, WriteResult, } from "@cosmicdrift/kumiko-types/handlers";
@@ -23,8 +23,8 @@ export type { TargetRef } from "@cosmicdrift/kumiko-types/target-ref";
23
23
  export type { Subscribe, TreeAction, TreeActionDef, TreeActionsHandle, TreeChildrenSubscribe, TreeNode, TreeNodeState, } from "@cosmicdrift/kumiko-types/tree-node";
24
24
  export type { WebSocketConnection, WebSocketMessageData, WebSocketRouteConnectDeps, WebSocketRouteDefinition, WebSocketSessionHandlers, } from "@cosmicdrift/kumiko-types/websocket-route";
25
25
  export type { WorkspaceDefinition } from "@cosmicdrift/kumiko-types/workspace";
26
- export type { ConcurrencyMode, ConfigScope, LifecycleHookType, OnDeleteStrategy, } from "../constants.js";
27
- export { DEFAULT_CURRENCIES, DEFAULT_LOCALES, isFileField } from "../field-helpers.js";
28
- export { resolveName, withResponseData } from "../handler-helpers.js";
29
- export { HookPhases } from "../hook-helpers.js";
30
- export { isExtensionEditSection, isFormatSpec, normalizeEditField, normalizeListColumn, } from "../screen-helpers.js";
26
+ export type { ConcurrencyMode, ConfigScope, LifecycleHookType, OnDeleteStrategy, } from "../constants.ts";
27
+ export { DEFAULT_CURRENCIES, DEFAULT_LOCALES, isFileField } from "../field-helpers.ts";
28
+ export { resolveName, withResponseData } from "../handler-helpers.ts";
29
+ export { HookPhases } from "../hook-helpers.ts";
30
+ export { isExtensionEditSection, isFormatSpec, normalizeEditField, normalizeListColumn, } from "../screen-helpers.ts";
@@ -1,4 +1,4 @@
1
- import type { FeatureDefinition } from "./types/index.js";
1
+ import type { FeatureDefinition } from "./types/index.ts";
2
2
  /**
3
3
  * Validate every feature's pipeline-form writeHandlers against:
4
4
  * 1. the owning feature's r.requires.projection allowlist
@@ -1,3 +1,3 @@
1
- import type { Registry, ValidationError } from "./types/index.js";
1
+ import type { Registry, ValidationError } from "./types/index.ts";
2
2
  export type { ValidationError };
3
3
  export declare function runValidation(registry: Registry, hookName: string, data: Readonly<Record<string, unknown>>): readonly ValidationError[] | null;
@@ -1,16 +1,16 @@
1
1
  import type { Hono } from "hono";
2
- import type { AuthRoutesConfig } from "../api/auth-routes.js";
3
- import type { JwtHelper, JwtKeyring } from "../api/jwt.js";
4
- import type { ServerOptions } from "../api/server.js";
5
- import type { SseBroker } from "../api/sse-broker.js";
6
- import type { PgClient, PgListenClient } from "../db/connection.js";
7
- import type { AppContext, Registry } from "../engine/types/index.js";
8
- import type { JobRunner, JobRunnerOptions } from "../jobs/job-runner.js";
9
- import type { Lifecycle } from "../lifecycle/index.js";
10
- import type { ObservabilityOptions, ObservabilityProvider } from "../observability/index.js";
11
- import type { Dispatcher, DispatcherOptions } from "../pipeline/dispatcher.js";
12
- import type { EventDedup, EventDispatcher } from "../pipeline/index.js";
13
- import type { SystemHooks } from "../pipeline/lifecycle-pipeline.js";
2
+ import type { AuthRoutesConfig } from "../api/auth-routes.ts";
3
+ import type { JwtHelper, JwtKeyring } from "../api/jwt.ts";
4
+ import type { ServerOptions } from "../api/server.ts";
5
+ import type { SseBroker } from "../api/sse-broker.ts";
6
+ import type { PgClient, PgListenClient } from "../db/connection.ts";
7
+ import type { AppContext, Registry } from "../engine/types/index.ts";
8
+ import type { JobRunner, JobRunnerOptions } from "../jobs/job-runner.ts";
9
+ import type { Lifecycle } from "../lifecycle/index.ts";
10
+ import type { ObservabilityOptions, ObservabilityProvider } from "../observability/index.ts";
11
+ import type { Dispatcher, DispatcherOptions } from "../pipeline/dispatcher.ts";
12
+ import type { EventDedup, EventDispatcher } from "../pipeline/index.ts";
13
+ import type { SystemHooks } from "../pipeline/lifecycle-pipeline.ts";
14
14
  export type BaseEntrypointOptions = {
15
15
  readonly registry: Registry;
16
16
  readonly context: AppContext;
@@ -1,5 +1,15 @@
1
- import { type ComposedEnvSchema } from "./index.js";
1
+ import { type ComposedEnvSchema, type EnvFieldInspection } from "./index.ts";
2
2
  export type DryRunMode = "human" | "json" | "pulumi" | "k8s";
3
+ /** `boot` runs the boot validators without connecting anywhere; the other
4
+ * modes only render the env inventory. */
5
+ export type DryRunEnvMode = DryRunMode | "boot";
6
+ export declare const DRY_RUN_ENV_VAR = "KUMIKO_DRY_RUN_ENV";
7
+ /** Reads `KUMIKO_DRY_RUN_ENV`. `1` and `true` mean `human`; an unknown value
8
+ * returns undefined, so the caller decides whether to warn or boot. */
9
+ export declare function parseDryRunEnvMode(raw: string | undefined): DryRunEnvMode | undefined;
10
+ /** True while any dry-run mode is requested, for code that runs at module
11
+ * load (key providers, secret derivation) and must not throw on missing env. */
12
+ export declare function isDryRunEnvActive(env: Readonly<Record<string, string | undefined>>): boolean;
3
13
  export type DryRunOptions = {
4
14
  /** From composeEnvSchema. Drives the per-row feature-attribution. */
5
15
  readonly sources?: Readonly<Record<string, string>>;
@@ -11,3 +21,6 @@ export type DryRunOptions = {
11
21
  readonly k8sNamespace?: string;
12
22
  };
13
23
  export declare function renderDryRun(composed: ComposedEnvSchema, mode: DryRunMode, options?: DryRunOptions): string;
24
+ /** Table for `KUMIKO_DRY_RUN_ENV=boot`: one row per variable with its source,
25
+ * whether it is required, and whether it is set. Values are never printed. */
26
+ export declare function renderEnvInspection(rows: readonly EnvFieldInspection[]): string;
@@ -9,6 +9,24 @@
9
9
  // by parseEnv drives the output here — single source of truth.
10
10
  import { zodShape } from "./_zod-introspect.js";
11
11
  import { classifyField, getDefaultValue, getFieldDescription, pulumiConfigKey, readKumikoMeta, } from "./index.js";
12
+ export const DRY_RUN_ENV_VAR = "KUMIKO_DRY_RUN_ENV";
13
+ /** Reads `KUMIKO_DRY_RUN_ENV`. `1` and `true` mean `human`; an unknown value
14
+ * returns undefined, so the caller decides whether to warn or boot. */
15
+ export function parseDryRunEnvMode(raw) {
16
+ if (!raw)
17
+ return undefined;
18
+ const value = raw.toLowerCase();
19
+ if (value === "1" || value === "true" || value === "human")
20
+ return "human";
21
+ if (value === "json" || value === "pulumi" || value === "k8s" || value === "boot")
22
+ return value;
23
+ return undefined;
24
+ }
25
+ /** True while any dry-run mode is requested, for code that runs at module
26
+ * load (key providers, secret derivation) and must not throw on missing env. */
27
+ export function isDryRunEnvActive(env) {
28
+ return parseDryRunEnvMode(env[DRY_RUN_ENV_VAR]) !== undefined;
29
+ }
12
30
  function collectFields(schema, sources) {
13
31
  const out = [];
14
32
  for (const [name, field] of Object.entries(zodShape(schema))) {
@@ -163,3 +181,35 @@ function renderK8s(fields, options) {
163
181
  }
164
182
  return `${lines.join("\n")}\n`;
165
183
  }
184
+ function inspectionStatus(row) {
185
+ return row.status === "invalid" ? `invalid: ${row.message ?? "invalid value"}` : row.status;
186
+ }
187
+ /** Table for `KUMIKO_DRY_RUN_ENV=boot`: one row per variable with its source,
188
+ * whether it is required, and whether it is set. Values are never printed. */
189
+ export function renderEnvInspection(rows) {
190
+ const header = { name: "VARIABLE", source: "SOURCE", klass: "KIND" };
191
+ const nameWidth = Math.max(header.name.length, ...rows.map((r) => r.name.length));
192
+ const sourceWidth = Math.max(header.source.length, ...rows.map((r) => r.source.length));
193
+ const klassWidth = Math.max(header.klass.length, ...rows.map((r) => r.klass.length));
194
+ const line = (name, source, klass, status) => ` ${name.padEnd(nameWidth)} ${source.padEnd(sourceWidth)} ${klass.padEnd(klassWidth)} ${status}`;
195
+ const order = { required: 0, optional: 1, withDefault: 2 };
196
+ const sorted = [...rows].sort((a, b) => order[a.klass] - order[b.klass] ||
197
+ a.source.localeCompare(b.source) ||
198
+ a.name.localeCompare(b.name));
199
+ const missing = rows.filter((r) => r.status === "missing").length;
200
+ const invalid = rows.filter((r) => r.status === "invalid").length;
201
+ const lines = [
202
+ "Env check (values are not printed):",
203
+ line(header.name, header.source, header.klass, "STATUS"),
204
+ ...sorted.map((r) => line(r.name, r.source, r.klass, inspectionStatus(r))),
205
+ "",
206
+ ];
207
+ if (invalid > 0)
208
+ lines.push(`${invalid} variable(s) invalid.`);
209
+ if (missing > 0) {
210
+ lines.push(`${missing} required variable(s) missing. Feature wiring was NOT validated; set them and rerun to check it.`);
211
+ }
212
+ if (invalid === 0 && missing === 0)
213
+ lines.push("All variables present.");
214
+ return `${lines.join("\n")}\n`;
215
+ }
@@ -1,5 +1,5 @@
1
1
  import * as z from "zod";
2
- import type { FeatureDefinition } from "../engine/types/feature.js";
2
+ import type { FeatureDefinition } from "../engine/types/feature.ts";
3
3
  export type KumikoEnvMeta = {
4
4
  readonly pulumi?: {
5
5
  /** Override the auto-derived camelCase Pulumi-config-key name. Apps
@@ -28,31 +28,54 @@ export type EnvFieldClass = "required" | "optional" | "withDefault";
28
28
  export declare function classifyField(field: z.ZodType): EnvFieldClass;
29
29
  export declare function getDefaultValue(field: z.ZodType): unknown;
30
30
  export declare function getFieldDescription(field: z.ZodType): string | undefined;
31
- export type ComposeEnvSchemaOptions = {
32
- /** All features whose envSchemas should be merged. */
33
- readonly features: readonly FeatureDefinition[];
31
+ /** A feature whose registered env schema is visible in its type, so
32
+ * `composeEnvSchema` can type the merged schema from the feature list. */
33
+ export type FeatureWithEnvSchema<TFeature extends FeatureDefinition, TShape extends z.ZodRawShape> = TFeature & {
34
+ readonly envSchema: z.ZodObject<TShape>;
35
+ };
36
+ /** Returns `feature` typed with the env schema it registered via
37
+ * `r.envSchema(schema)`. Throws when the feature registered another
38
+ * instance, so the type never claims fields the runtime schema lacks. */
39
+ 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;
34
61
  /** App-specific env-vars (e.g. `STUDIO_ADMIN_EMAIL`). Keys here are
35
62
  * tagged as source "app" in the resulting sources map. */
36
- readonly extend?: z.ZodObject<z.ZodRawShape>;
63
+ readonly extend?: z.ZodObject<TExtend>;
37
64
  /** Feature-names whose env-vars should be auto-`.optional()`-wrapped.
38
65
  * Lets an app opt out of e.g. `channel-email-smtp`'s vars without
39
66
  * manually `.partial()`-ing each shape at the call-site. */
40
- readonly optionalFeatures?: readonly string[];
67
+ readonly optionalFeatures?: TOptionalFeatures;
41
68
  /** Framework-core env-vars (PORT, DATABASE_URL, REDIS_URL, …) from
42
69
  * `@cosmicdrift/kumiko-dev-server`. Keys here are tagged as source
43
70
  * "framework-core" in error output. Conflict-detection runs across
44
71
  * core/features/extend as one merged pool — same key declared in two
45
72
  * layers throws KumikoBootError at compose-time. */
46
- readonly core?: z.ZodObject<z.ZodRawShape>;
73
+ readonly core?: z.ZodObject<TCore>;
47
74
  };
48
- export type ComposedEnvSchema = {
49
- /** The merged Zod schema. Type-erased to `ZodObject<ZodRawShape>` — TS
50
- * can't variadic-merge N generic feature schemas without tuple gymnastics
51
- * that hurt readability. For type-safe `z.infer` in app code, build a
52
- * parallel typed schema manually (see Plan-Doc
53
- * `kumiko-studio/docs/plans/sprint-9-env-schemas.md` → API-Design)
54
- * and only pass `composed.schema` to `runProdApp` for validation. */
55
- readonly schema: z.ZodObject<z.ZodRawShape>;
75
+ export type ComposedEnvSchema<TShape extends z.ZodRawShape = z.ZodRawShape> = {
76
+ /** The merged Zod schema, typed from core, the typed feature fragments and
77
+ * extend; `parseEnv(composed.schema, env)` returns the typed env. */
78
+ readonly schema: z.ZodObject<TShape>;
56
79
  /** env-var-name → declaring source-name: feature-name from `r.envSchema()`,
57
80
  * "app" from `extend`, or "framework-core" from `core`. */
58
81
  readonly sources: Readonly<Record<string, string>>;
@@ -60,7 +83,7 @@ export type ComposedEnvSchema = {
60
83
  /** Makes the named env keys optional while keeping their `kms` meta. Keys
61
84
  * missing from the schema shape are ignored. */
62
85
  export declare function withOptionalEnvKeys(schema: z.ZodObject<z.ZodRawShape>, keys: readonly string[]): z.ZodObject<z.ZodRawShape>;
63
- export declare function composeEnvSchema(options: ComposeEnvSchemaOptions): ComposedEnvSchema;
86
+ 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>>;
64
87
  export type EnvErrorKind = "missing" | "invalid";
65
88
  export type EnvError = {
66
89
  readonly name: string;
@@ -100,6 +123,21 @@ export declare function parseEnv<S extends z.ZodObject<z.ZodRawShape>>(schema: S
100
123
  * scheitern. Ersetzt das `({} as Shape)`-Muster, bei dem JEDER Zugriff
101
124
  * silent undefined war und das Compile-Level nichts davon wusste. */
102
125
  export declare function parseEnvDryRun<S extends z.ZodObject<z.ZodRawShape>>(schema: S, env: Record<string, string | undefined>): Partial<z.infer<S>>;
126
+ export type EnvFieldStatus = "set" | "unset" | "missing" | "invalid";
127
+ export type EnvFieldInspection = {
128
+ readonly name: string;
129
+ readonly klass: EnvFieldClass;
130
+ readonly source: string;
131
+ readonly status: EnvFieldStatus;
132
+ /** Zod's issue text for an invalid value; never the value itself. */
133
+ readonly message?: string;
134
+ };
135
+ /** Checks every field of `schema` on its own against `env`, for the boot dry
136
+ * run: a missing required value is reported, not thrown, so the inventory
137
+ * renders on an empty env. Object-level refinements do not run here; once
138
+ * nothing is missing or invalid, parseEnv validates the whole object. */
139
+ export declare function inspectEnv(schema: z.ZodObject<z.ZodRawShape>, env: Readonly<Record<string, string | undefined>>, options?: Pick<ParseEnvOptions, "sources">): readonly EnvFieldInspection[];
103
140
  export declare function camelCase(snakeShout: string): string;
104
141
  export declare function pulumiConfigKey(envName: string, field: z.ZodType | undefined, prefix: string | undefined): string;
105
142
  export declare function buildPulumiSuggestion(envName: string, field: z.ZodType, prefix: string | undefined): string | undefined;
143
+ export {};
package/dist/env/index.js CHANGED
@@ -115,6 +115,18 @@ export function getDefaultValue(field) {
115
115
  export function getFieldDescription(field) {
116
116
  return zodDescription(field);
117
117
  }
118
+ function registersEnvSchema(feature, schema) {
119
+ return feature.envSchema === schema;
120
+ }
121
+ /** Returns `feature` typed with the env schema it registered via
122
+ * `r.envSchema(schema)`. Throws when the feature registered another
123
+ * instance, so the type never claims fields the runtime schema lacks. */
124
+ export function featureWithEnvSchema(feature, schema) {
125
+ if (!registersEnvSchema(feature, schema)) {
126
+ throw new Error(`[Feature ${feature.name}] featureWithEnvSchema: the feature did not register this schema instance via r.envSchema().`);
127
+ }
128
+ return feature;
129
+ }
118
130
  // `.optional()` returns a new Zod instance that drops `.meta()`, which would
119
131
  // hide the slot from `kmsSlotsOf` on the composed schema.
120
132
  function optionalKeepingKmsMeta(field) {
@@ -214,13 +226,17 @@ export function composeEnvSchema(options) {
214
226
  }
215
227
  if (options.extend) {
216
228
  for (const [key, field] of Object.entries(zodShape(options.extend))) {
229
+ // An app spreading a feature's own fragment into extend re-declares the
230
+ // same instance; that is the feature's variable, not a second owner.
231
+ if (featureFields.get(key) === field)
232
+ continue;
217
233
  if (merged[key] !== undefined) {
218
234
  throw new KumikoBootError([
219
235
  {
220
236
  name: key,
221
237
  kind: "invalid",
222
- message: `env-var conflict: "${key}" declared by both "${sources[key]}" ` +
223
- `and the app's extend block — rename one.`,
238
+ message: `env-var conflict: "${key}" is declared by "${sources[key]}" and again in the app's extend block — ` +
239
+ `drop it from extend, the declaring source already owns it.`,
224
240
  },
225
241
  ]);
226
242
  }
@@ -230,10 +246,9 @@ export function composeEnvSchema(options) {
230
246
  }
231
247
  }
232
248
  declareKmsCiphertextTwins(merged, sources, kmsFields);
233
- return {
234
- schema: z.object(merged),
235
- sources,
236
- };
249
+ // @cast-boundary schema-walk — the loops above merge exactly the core, feature and extend shapes the type names; a key clash throws instead of overwriting.
250
+ const schema = z.object(merged);
251
+ return { schema, sources };
237
252
  }
238
253
  function formatBootError(errors) {
239
254
  const lines = [
@@ -346,6 +361,45 @@ export function parseEnvDryRun(schema, env) {
346
361
  // per-Feld-safeParse; jeder enthaltene Wert hat seinen Feld-Parse bestanden.
347
362
  return out;
348
363
  }
364
+ /** Checks every field of `schema` on its own against `env`, for the boot dry
365
+ * run: a missing required value is reported, not thrown, so the inventory
366
+ * renders on an empty env. Object-level refinements do not run here; once
367
+ * nothing is missing or invalid, parseEnv validates the whole object. */
368
+ export function inspectEnv(schema, env, options = {}) {
369
+ const cleaned = {};
370
+ for (const [k, v] of Object.entries(env)) {
371
+ if (v !== undefined)
372
+ cleaned[k] = v;
373
+ }
374
+ const relaxed = relaxCiphertextOnlySlots(schema, cleaned);
375
+ return Object.entries(zodShape(relaxed)).map(([name, field]) => {
376
+ const klass = classifyField(field);
377
+ const source = options.sources?.[name] ?? "unknown";
378
+ const raw = cleaned[name];
379
+ if (raw === undefined) {
380
+ return { name, klass, source, status: klass === "required" ? "missing" : "unset" };
381
+ }
382
+ const issue = firstFieldIssue(field, raw);
383
+ return issue === undefined
384
+ ? { name, klass, source, status: "set" }
385
+ : { name, klass, source, status: "invalid", message: issue };
386
+ });
387
+ }
388
+ function firstFieldIssue(field, raw) {
389
+ try {
390
+ const result = field.safeParse(raw);
391
+ if (result.success)
392
+ return undefined;
393
+ const message = result.error.issues[0]?.message ?? "invalid value";
394
+ // A custom refine message may interpolate the input; the table must not
395
+ // carry it, so such a message is replaced as a whole.
396
+ return raw.length > 0 && message.includes(raw) ? "invalid value" : message;
397
+ }
398
+ catch {
399
+ // The thrown message may quote the value, so it is not passed on.
400
+ return "a field refinement threw while checking the value";
401
+ }
402
+ }
349
403
  export function camelCase(snakeShout) {
350
404
  const parts = snakeShout.toLowerCase().split("_").filter(Boolean);
351
405
  if (parts.length === 0)
@@ -1,6 +1,6 @@
1
- import type { FieldIssue } from "./field-issue.js";
2
- import { type ErrorOpts, KumikoError } from "./kumiko-error.js";
3
- export type { FieldIssue } from "./field-issue.js";
1
+ import type { FieldIssue } from "./field-issue.ts";
2
+ import { type ErrorOpts, KumikoError } from "./kumiko-error.ts";
3
+ export type { FieldIssue } from "./field-issue.ts";
4
4
  export type ValidationDetails = {
5
5
  readonly fields: readonly FieldIssue[];
6
6
  };
@@ -1,4 +1,4 @@
1
- import type { KumikoError } from "./kumiko-error.js";
1
+ import type { KumikoError } from "./kumiko-error.ts";
2
2
  /** Links an app's own error reasons to its own docs; without it only framework reasons carry a docsUrl. */
3
3
  export type ErrorDocsConfig = {
4
4
  readonly baseUrl: string;