@cosmicdrift/kumiko-framework 0.369.0 → 0.371.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 (451) 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/chat-channels.md +1 -1
  6. package/agents/examples/compose-stacks.md +188 -0
  7. package/agents/examples/env-composition.md +278 -0
  8. package/agents/examples/host-routing.md +181 -0
  9. package/agents/examples/inbound-mail-triage.md +1 -1
  10. package/agents/examples/legal-pages.md +52 -3
  11. package/agents/examples/managed-config.md +1 -0
  12. package/agents/examples/managed-pages.md +1 -0
  13. package/agents/examples/prod-boot-options.md +180 -0
  14. package/agents/examples/relations.md +4 -0
  15. package/agents/examples/secrets-demo.md +4 -2
  16. package/agents/examples/security-baseline.md +20 -17
  17. package/agents/examples.md +6 -1
  18. package/agents/features.md +14 -2
  19. package/dist/api/anonymous-cookie.d.ts +1 -1
  20. package/dist/api/anonymous-live-entities.d.ts +1 -1
  21. package/dist/api/auth-middleware.d.ts +2 -2
  22. package/dist/api/auth-routes.d.ts +7 -7
  23. package/dist/api/extra-route.d.ts +2 -2
  24. package/dist/api/index.d.ts +37 -37
  25. package/dist/api/jwt.d.ts +1 -1
  26. package/dist/api/observability-middleware.d.ts +1 -1
  27. package/dist/api/readiness.d.ts +1 -1
  28. package/dist/api/redis-sse-broker.d.ts +2 -2
  29. package/dist/api/request-context.d.ts +1 -1
  30. package/dist/api/request-id-middleware.d.ts +3 -3
  31. package/dist/api/route-registrars.d.ts +4 -4
  32. package/dist/api/routes.d.ts +1 -1
  33. package/dist/api/server.d.ts +16 -16
  34. package/dist/api/sse-broker.d.ts +1 -1
  35. package/dist/api/sse-route.d.ts +1 -1
  36. package/dist/api/websocket-route.d.ts +3 -3
  37. package/dist/auth/index.d.ts +2 -2
  38. package/dist/compliance/duration-spec.d.ts +2 -2
  39. package/dist/compliance/index.d.ts +6 -6
  40. package/dist/compliance/profiles.d.ts +1 -1
  41. package/dist/config/index.d.ts +44 -0
  42. package/dist/config/index.js +61 -0
  43. package/dist/crypto/blind-index.d.ts +1 -1
  44. package/dist/crypto/event-pii.d.ts +1 -1
  45. package/dist/crypto/in-memory-kms-adapter.d.ts +1 -1
  46. package/dist/crypto/index.d.ts +11 -11
  47. package/dist/crypto/is-self-pii-field.d.ts +1 -1
  48. package/dist/crypto/kms-wiring.d.ts +2 -2
  49. package/dist/crypto/owner-transition-rekey.d.ts +1 -1
  50. package/dist/crypto/pg-kms-adapter.d.ts +1 -1
  51. package/dist/crypto/pii-field-encryption.d.ts +4 -4
  52. package/dist/crypto/request-kms-cache.d.ts +1 -1
  53. package/dist/crypto/subject-resolver.d.ts +3 -3
  54. package/dist/db/apply-entity-event.d.ts +4 -4
  55. package/dist/db/assert-exists-in.d.ts +4 -4
  56. package/dist/db/blind-index-cleanup.d.ts +2 -2
  57. package/dist/db/collect-table-metas.d.ts +2 -2
  58. package/dist/db/compound-types.d.ts +1 -1
  59. package/dist/db/config-seed.d.ts +5 -5
  60. package/dist/db/connection.d.ts +1 -6
  61. package/dist/db/connection.js +15 -4
  62. package/dist/db/dialect.d.ts +1 -1
  63. package/dist/db/eagerload.d.ts +3 -3
  64. package/dist/db/entity-field-encryption.d.ts +3 -3
  65. package/dist/db/entity-field-encryption.js +3 -1
  66. package/dist/db/entity-table-from-registry.d.ts +3 -3
  67. package/dist/db/entity-table-meta.d.ts +3 -3
  68. package/dist/db/event-store-executor-context.d.ts +9 -9
  69. package/dist/db/event-store-executor-read.d.ts +2 -2
  70. package/dist/db/event-store-executor-write.d.ts +2 -2
  71. package/dist/db/event-store-executor.d.ts +8 -8
  72. package/dist/db/feature-table-sources.d.ts +1 -1
  73. package/dist/db/index.d.ts +39 -39
  74. package/dist/db/located-timestamp.d.ts +1 -1
  75. package/dist/db/lock-guard.d.ts +2 -2
  76. package/dist/db/migrate-generator.d.ts +2 -2
  77. package/dist/db/migrate-runner.d.ts +1 -1
  78. package/dist/db/money.d.ts +1 -1
  79. package/dist/db/parent-ref-clause.d.ts +4 -4
  80. package/dist/db/projection-registry-binding.d.ts +1 -1
  81. package/dist/db/queries/advisory-lock.d.ts +1 -1
  82. package/dist/db/queries/backfill-pii.d.ts +2 -2
  83. package/dist/db/queries/ddl.d.ts +1 -1
  84. package/dist/db/queries/entity-read.d.ts +1 -1
  85. package/dist/db/queries/es-ops.d.ts +1 -1
  86. package/dist/db/queries/event-consumer.d.ts +2 -2
  87. package/dist/db/queries/event-store-admin.d.ts +1 -1
  88. package/dist/db/queries/event-store-transfer.d.ts +1 -1
  89. package/dist/db/queries/event-store.d.ts +1 -1
  90. package/dist/db/queries/pii-backfill-state.d.ts +1 -1
  91. package/dist/db/queries/projection-rebuild.d.ts +1 -1
  92. package/dist/db/queries/raw-sql.d.ts +1 -1
  93. package/dist/db/queries/seed-context.d.ts +2 -2
  94. package/dist/db/queries/shadow-swap.d.ts +3 -3
  95. package/dist/db/queries/table-ops.d.ts +1 -1
  96. package/dist/db/queries/test-stack.d.ts +2 -2
  97. package/dist/db/query.d.ts +3 -3
  98. package/dist/db/rebuild-marker.d.ts +1 -1
  99. package/dist/db/reference-data.d.ts +3 -3
  100. package/dist/db/render-ddl.d.ts +1 -1
  101. package/dist/db/replay-migration-sql.d.ts +1 -1
  102. package/dist/db/retired-framework-tables.d.ts +1 -1
  103. package/dist/db/schema-inspection.d.ts +1 -1
  104. package/dist/db/table-builder.d.ts +4 -4
  105. package/dist/db/table-push.d.ts +3 -3
  106. package/dist/db/tenant-db-runner.d.ts +2 -2
  107. package/dist/db/tenant-db.d.ts +7 -9
  108. package/dist/db/tenant-db.js +2 -12
  109. package/dist/derivatives/derivatives-context.d.ts +3 -3
  110. package/dist/derivatives/field-variants.d.ts +1 -1
  111. package/dist/derivatives/index.d.ts +6 -6
  112. package/dist/engine/access.d.ts +1 -1
  113. package/dist/engine/active-membership.d.ts +2 -2
  114. package/dist/engine/boot-validator/access-declarations.d.ts +1 -1
  115. package/dist/engine/boot-validator/access-roles.d.ts +1 -1
  116. package/dist/engine/boot-validator/action-wiring.d.ts +1 -1
  117. package/dist/engine/boot-validator/api-ext.d.ts +1 -1
  118. package/dist/engine/boot-validator/boot-check.d.ts +1 -1
  119. package/dist/engine/boot-validator/card-meta-overflow.d.ts +1 -1
  120. package/dist/engine/boot-validator/config-deps.d.ts +1 -1
  121. package/dist/engine/boot-validator/detail-screens.d.ts +2 -2
  122. package/dist/engine/boot-validator/entity-handler.d.ts +1 -1
  123. package/dist/engine/boot-validator/entity-list-screens.d.ts +1 -1
  124. package/dist/engine/boot-validator/gdpr-storage.d.ts +1 -1
  125. package/dist/engine/boot-validator/global-tenancy.d.ts +1 -1
  126. package/dist/engine/boot-validator/handler-field-references.d.ts +1 -1
  127. package/dist/engine/boot-validator/i18n-keys.d.ts +1 -1
  128. package/dist/engine/boot-validator/index.d.ts +7 -7
  129. package/dist/engine/boot-validator/nav.d.ts +1 -1
  130. package/dist/engine/boot-validator/ownership.d.ts +2 -2
  131. package/dist/engine/boot-validator/parent-ref.d.ts +1 -1
  132. package/dist/engine/boot-validator/pii-retention.d.ts +2 -2
  133. package/dist/engine/boot-validator/projection-list-screens.d.ts +1 -1
  134. package/dist/engine/boot-validator/query-output-columns.d.ts +1 -1
  135. package/dist/engine/boot-validator/query-refs.d.ts +1 -1
  136. package/dist/engine/boot-validator/record-owned.d.ts +1 -1
  137. package/dist/engine/boot-validator/screens.d.ts +2 -2
  138. package/dist/engine/boot-validator/security-baseline.d.ts +1 -1
  139. package/dist/engine/boot-validator/selector-owner-panels.d.ts +1 -1
  140. package/dist/engine/boot-validator/transfer-graph.d.ts +2 -2
  141. package/dist/engine/boot-validator/url-prefill-fields.d.ts +1 -1
  142. package/dist/engine/boot-validator/workspaces.d.ts +1 -1
  143. package/dist/engine/boot-validator.d.ts +1 -1
  144. package/dist/engine/bridge-stub.d.ts +1 -1
  145. package/dist/engine/build-app-schema.d.ts +2 -2
  146. package/dist/engine/build-config-feature-schema.d.ts +5 -5
  147. package/dist/engine/build-target.d.ts +2 -2
  148. package/dist/engine/changeset-changes.d.ts +1 -1
  149. package/dist/engine/codemod/index.d.ts +2 -2
  150. package/dist/engine/config-helpers.d.ts +1 -1
  151. package/dist/engine/constants.d.ts +1 -1
  152. package/dist/engine/create-app.d.ts +2 -2
  153. package/dist/engine/cross-tenant.d.ts +2 -2
  154. package/dist/engine/dedupe-features.d.ts +1 -1
  155. package/dist/engine/define-feature.d.ts +1 -1
  156. package/dist/engine/define-feature.js +2 -2
  157. package/dist/engine/define-handler.d.ts +4 -4
  158. package/dist/engine/define-step.d.ts +1 -1
  159. package/dist/engine/define-workflow.d.ts +2 -2
  160. package/dist/engine/effective-features.d.ts +1 -1
  161. package/dist/engine/embedded-derived.d.ts +1 -1
  162. package/dist/engine/entity-handlers.d.ts +6 -5
  163. package/dist/engine/entity-handlers.js +6 -3
  164. package/dist/engine/event-def.d.ts +15 -0
  165. package/dist/engine/event-def.js +123 -0
  166. package/dist/engine/event-helpers.d.ts +1 -1
  167. package/dist/engine/extension-names.d.ts +8 -8
  168. package/dist/engine/extension-selector-plugins.d.ts +2 -2
  169. package/dist/engine/extensions/escape-hatch-usage.d.ts +1 -1
  170. package/dist/engine/extensions/storage-provider.d.ts +1 -1
  171. package/dist/engine/extensions/tenant-data.d.ts +3 -3
  172. package/dist/engine/extensions/tenant-resource.d.ts +2 -2
  173. package/dist/engine/extensions/user-data.d.ts +2 -2
  174. package/dist/engine/factories.d.ts +1 -1
  175. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +2 -2
  176. package/dist/engine/feature-ast/extractors/events.d.ts +2 -2
  177. package/dist/engine/feature-ast/extractors/handlers.d.ts +4 -4
  178. package/dist/engine/feature-ast/extractors/hooks.d.ts +5 -5
  179. package/dist/engine/feature-ast/extractors/index.d.ts +14 -14
  180. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +3 -3
  181. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +3 -3
  182. package/dist/engine/feature-ast/extractors/round1.d.ts +2 -2
  183. package/dist/engine/feature-ast/extractors/round2.d.ts +2 -2
  184. package/dist/engine/feature-ast/extractors/round3.d.ts +4 -4
  185. package/dist/engine/feature-ast/extractors/round5.d.ts +2 -2
  186. package/dist/engine/feature-ast/extractors/round6.d.ts +2 -2
  187. package/dist/engine/feature-ast/extractors/shared.d.ts +2 -2
  188. package/dist/engine/feature-ast/index.d.ts +16 -16
  189. package/dist/engine/feature-ast/parse.d.ts +2 -2
  190. package/dist/engine/feature-ast/patch.d.ts +1 -1
  191. package/dist/engine/feature-ast/patcher.d.ts +15 -15
  192. package/dist/engine/feature-ast/pattern-change-schema.d.ts +10 -10
  193. package/dist/engine/feature-ast/patterns.d.ts +15 -15
  194. package/dist/engine/feature-ast/render.d.ts +1 -1
  195. package/dist/engine/feature-builder-state.d.ts +5 -5
  196. package/dist/engine/feature-config-events-jobs.d.ts +3 -3
  197. package/dist/engine/feature-config-events-jobs.js +8 -130
  198. package/dist/engine/feature-entity-handlers.d.ts +4 -4
  199. package/dist/engine/feature-entity-handlers.js +11 -5
  200. package/dist/engine/feature-manifest.d.ts +1 -1
  201. package/dist/engine/feature-ui-extensions.d.ts +7 -7
  202. package/dist/engine/feature-ui-extensions.js +2 -2
  203. package/dist/engine/field-access.d.ts +1 -1
  204. package/dist/engine/field-helpers.d.ts +1 -1
  205. package/dist/engine/handler-helpers.d.ts +1 -1
  206. package/dist/engine/index.d.ts +89 -88
  207. package/dist/engine/index.js +1 -0
  208. package/dist/engine/instruction-fields.d.ts +1 -1
  209. package/dist/engine/object-form.d.ts +1 -1
  210. package/dist/engine/object-form.js +5 -6
  211. package/dist/engine/ownership.d.ts +3 -3
  212. package/dist/engine/pattern-library/index.d.ts +2 -2
  213. package/dist/engine/pattern-library/library.d.ts +2 -2
  214. package/dist/engine/pattern-library/mixed-schemas.d.ts +1 -1
  215. package/dist/engine/pattern-library/opaque-schemas.d.ts +1 -1
  216. package/dist/engine/pattern-library/shared-fields.d.ts +1 -1
  217. package/dist/engine/pattern-library/static-schemas.d.ts +1 -1
  218. package/dist/engine/pattern-library/types.d.ts +1 -1
  219. package/dist/engine/personal-data-fields.d.ts +2 -2
  220. package/dist/engine/pipeline.d.ts +2 -2
  221. package/dist/engine/project-app-schema-for-roles.d.ts +1 -1
  222. package/dist/engine/projection-helpers.d.ts +4 -4
  223. package/dist/engine/read-claim.d.ts +1 -1
  224. package/dist/engine/registry-facade.d.ts +2 -2
  225. package/dist/engine/registry-ingest.d.ts +2 -2
  226. package/dist/engine/registry-state.d.ts +2 -2
  227. package/dist/engine/registry-validate.d.ts +3 -3
  228. package/dist/engine/registry.d.ts +1 -1
  229. package/dist/engine/resolve-config-or-param.d.ts +2 -2
  230. package/dist/engine/role-assignment.d.ts +1 -1
  231. package/dist/engine/run-in.d.ts +1 -1
  232. package/dist/engine/run-pipeline.d.ts +3 -3
  233. package/dist/engine/schema-builder.d.ts +1 -1
  234. package/dist/engine/screen-filter-ops.d.ts +1 -1
  235. package/dist/engine/screen-helpers.d.ts +2 -2
  236. package/dist/engine/soft-delete-cleanup.d.ts +2 -2
  237. package/dist/engine/steps/_event-match.d.ts +1 -1
  238. package/dist/engine/steps/_no-return-guard.d.ts +1 -1
  239. package/dist/engine/steps/_read-source.d.ts +4 -4
  240. package/dist/engine/steps/_resolver-utils.d.ts +1 -1
  241. package/dist/engine/steps/aggregate-append-event.d.ts +1 -1
  242. package/dist/engine/steps/aggregate-create.d.ts +2 -2
  243. package/dist/engine/steps/aggregate-update.d.ts +3 -3
  244. package/dist/engine/steps/branch.d.ts +1 -1
  245. package/dist/engine/steps/call-feature.d.ts +2 -2
  246. package/dist/engine/steps/compute.d.ts +1 -1
  247. package/dist/engine/steps/for-each.d.ts +1 -1
  248. package/dist/engine/steps/mail-send.d.ts +1 -1
  249. package/dist/engine/steps/read-find-many.d.ts +2 -2
  250. package/dist/engine/steps/read-find-one.d.ts +2 -2
  251. package/dist/engine/steps/retry.d.ts +1 -1
  252. package/dist/engine/steps/return.d.ts +2 -2
  253. package/dist/engine/steps/unsafe-projection-delete.d.ts +2 -2
  254. package/dist/engine/steps/unsafe-projection-upsert.d.ts +1 -1
  255. package/dist/engine/steps/wait-for-event.d.ts +1 -1
  256. package/dist/engine/steps/wait.d.ts +1 -1
  257. package/dist/engine/steps/webhook-send.d.ts +1 -1
  258. package/dist/engine/strip-disabled-features-from-app-schema.d.ts +4 -4
  259. package/dist/engine/system-user.d.ts +2 -2
  260. package/dist/engine/template-variables.d.ts +1 -1
  261. package/dist/engine/tier-resolver-extension.d.ts +4 -4
  262. package/dist/engine/transfer-adjacency.d.ts +1 -1
  263. package/dist/engine/types/index.d.ts +6 -6
  264. package/dist/engine/validate-projection-allowlist.d.ts +1 -1
  265. package/dist/engine/validation.d.ts +1 -1
  266. package/dist/entrypoint/index.d.ts +12 -12
  267. package/dist/env/dry-run.d.ts +14 -1
  268. package/dist/env/dry-run.js +50 -0
  269. package/dist/env/index.d.ts +54 -16
  270. package/dist/env/index.js +76 -7
  271. package/dist/errors/classes.d.ts +3 -3
  272. package/dist/errors/docs-url.d.ts +1 -1
  273. package/dist/errors/index.d.ts +18 -18
  274. package/dist/errors/member-resolution.d.ts +1 -1
  275. package/dist/errors/serialize.d.ts +2 -2
  276. package/dist/errors/subject-erased.d.ts +1 -1
  277. package/dist/errors/to-kumiko-error.d.ts +1 -1
  278. package/dist/errors/write-error-info.d.ts +1 -1
  279. package/dist/errors/zod-bridge.d.ts +1 -1
  280. package/dist/es-ops/context.d.ts +4 -4
  281. package/dist/es-ops/index.d.ts +4 -4
  282. package/dist/es-ops/operations-schema.d.ts +1 -1
  283. package/dist/es-ops/runner.d.ts +3 -3
  284. package/dist/es-ops/runner.js +9 -1
  285. package/dist/es-ops/types.d.ts +2 -2
  286. package/dist/event-store/admin-api.d.ts +3 -3
  287. package/dist/event-store/archive.d.ts +2 -2
  288. package/dist/event-store/event-store.d.ts +2 -2
  289. package/dist/event-store/events-schema.d.ts +1 -1
  290. package/dist/event-store/index.d.ts +15 -15
  291. package/dist/event-store/provenance-append.d.ts +3 -3
  292. package/dist/event-store/rebuild-dead-letter.d.ts +2 -2
  293. package/dist/event-store/row-to-stored-event.d.ts +2 -2
  294. package/dist/event-store/snapshot.d.ts +2 -2
  295. package/dist/event-store/tenant-db-append.d.ts +2 -2
  296. package/dist/event-store/transfer.d.ts +3 -3
  297. package/dist/event-store/upcaster-dead-letter.d.ts +2 -2
  298. package/dist/event-store/upcaster.d.ts +3 -3
  299. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -2
  300. package/dist/files/bind-pending-file-refs.d.ts +3 -3
  301. package/dist/files/create-file-ref-from-bytes.d.ts +4 -4
  302. package/dist/files/create-file-ref.d.ts +3 -3
  303. package/dist/files/dispose-removed-file-refs.d.ts +2 -2
  304. package/dist/files/feature.d.ts +3 -3
  305. package/dist/files/file-handle.d.ts +1 -1
  306. package/dist/files/file-ref-entity.d.ts +1 -1
  307. package/dist/files/file-ref-table.d.ts +1 -1
  308. package/dist/files/file-routes.d.ts +5 -5
  309. package/dist/files/in-memory-provider.d.ts +1 -1
  310. package/dist/files/index.d.ts +20 -20
  311. package/dist/files/load-save-file-refs.d.ts +2 -2
  312. package/dist/files/local-provider.d.ts +1 -1
  313. package/dist/files/provider-resolver.d.ts +5 -5
  314. package/dist/files/purge-expired-file-ref-bytes.d.ts +2 -2
  315. package/dist/files/record-read-check.d.ts +1 -1
  316. package/dist/files/record-write-check.d.ts +3 -3
  317. package/dist/files/storage-tracking.d.ts +2 -2
  318. package/dist/files/types.d.ts +1 -1
  319. package/dist/files/zip-stream.d.ts +1 -1
  320. package/dist/i18n/index.d.ts +4 -4
  321. package/dist/i18n/mail-registry.d.ts +1 -1
  322. package/dist/i18n/required-surface-keys.d.ts +1 -1
  323. package/dist/i18n/settings-hub-keys.d.ts +1 -1
  324. package/dist/internal/stack-support.d.ts +12 -12
  325. package/dist/internal/testing.d.ts +4 -4
  326. package/dist/jobs/index.d.ts +2 -2
  327. package/dist/jobs/job-runner.d.ts +1 -1
  328. package/dist/jobs/max-per-tenant.d.ts +1 -1
  329. package/dist/lifecycle/index.d.ts +2 -2
  330. package/dist/lifecycle/lifecycle.d.ts +1 -1
  331. package/dist/lifecycle/signal-handlers.d.ts +1 -1
  332. package/dist/logging/index.d.ts +4 -4
  333. package/dist/logging/pino-logger.d.ts +1 -1
  334. package/dist/logging/utils.d.ts +1 -1
  335. package/dist/migrations/index.d.ts +4 -4
  336. package/dist/migrations/kumiko-drift.d.ts +1 -1
  337. package/dist/migrations/pending-rebuilds.d.ts +5 -5
  338. package/dist/migrations/pii-event-backfill.d.ts +4 -4
  339. package/dist/migrations/projection-table-index.d.ts +1 -1
  340. package/dist/observability/console-provider.d.ts +1 -1
  341. package/dist/observability/context.d.ts +1 -1
  342. package/dist/observability/escape-hatch-report.d.ts +3 -3
  343. package/dist/observability/fallback.d.ts +1 -1
  344. package/dist/observability/index.d.ts +16 -16
  345. package/dist/observability/metric-validator.d.ts +1 -1
  346. package/dist/observability/metrics-handle.d.ts +1 -1
  347. package/dist/observability/metrics-wiring.d.ts +2 -2
  348. package/dist/observability/noop-provider.d.ts +1 -1
  349. package/dist/observability/prometheus-meter.d.ts +1 -1
  350. package/dist/observability/recording-meter.d.ts +1 -1
  351. package/dist/observability/recording-tracer.d.ts +1 -1
  352. package/dist/observability/redis-wrapper.d.ts +1 -1
  353. package/dist/observability/sensitive-filter.d.ts +1 -1
  354. package/dist/observability/standard-metrics.d.ts +1 -1
  355. package/dist/pipeline/active-membership.d.ts +4 -4
  356. package/dist/pipeline/append-event-core.d.ts +3 -3
  357. package/dist/pipeline/auth-claims-resolver.d.ts +2 -2
  358. package/dist/pipeline/cascade-handler.d.ts +3 -3
  359. package/dist/pipeline/dispatch-batch.d.ts +2 -2
  360. package/dist/pipeline/dispatch-query.d.ts +4 -4
  361. package/dist/pipeline/dispatch-shared.d.ts +17 -17
  362. package/dist/pipeline/dispatch-stream.d.ts +2 -2
  363. package/dist/pipeline/dispatch-write.d.ts +4 -4
  364. package/dist/pipeline/dispatcher-utils.d.ts +2 -2
  365. package/dist/pipeline/dispatcher.d.ts +12 -12
  366. package/dist/pipeline/event-consumer-state.d.ts +1 -1
  367. package/dist/pipeline/event-dispatcher-admin.d.ts +1 -1
  368. package/dist/pipeline/event-dispatcher-delivery.d.ts +7 -7
  369. package/dist/pipeline/event-dispatcher.d.ts +7 -7
  370. package/dist/pipeline/event-retention.d.ts +1 -1
  371. package/dist/pipeline/handler-access-error.d.ts +2 -2
  372. package/dist/pipeline/index.d.ts +42 -42
  373. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  374. package/dist/pipeline/lifecycle-pipeline.d.ts +2 -2
  375. package/dist/pipeline/member-read-only-transaction.d.ts +2 -2
  376. package/dist/pipeline/member-reader.d.ts +5 -5
  377. package/dist/pipeline/msp-rebuild.d.ts +4 -4
  378. package/dist/pipeline/multi-stream-apply-context.d.ts +3 -3
  379. package/dist/pipeline/notify-scope.d.ts +3 -3
  380. package/dist/pipeline/pending-gap-ranges.d.ts +2 -2
  381. package/dist/pipeline/pre-handler-gates.d.ts +3 -3
  382. package/dist/pipeline/pre-transaction-reservations.d.ts +4 -4
  383. package/dist/pipeline/projection-rebuild.d.ts +3 -3
  384. package/dist/pipeline/projection-state.d.ts +1 -1
  385. package/dist/pipeline/projections-runner.d.ts +3 -3
  386. package/dist/pipeline/projections-runner.js +3 -4
  387. package/dist/pipeline/system-hooks.d.ts +4 -4
  388. package/dist/pipeline/system-identity-switch.d.ts +3 -3
  389. package/dist/pipeline/tenant-timezone-cache.d.ts +1 -1
  390. package/dist/pipeline/write-origin.d.ts +3 -3
  391. package/dist/pipeline/write-result-masking.d.ts +2 -2
  392. package/dist/random/index.d.ts +2 -2
  393. package/dist/rate-limit/bucket.d.ts +1 -1
  394. package/dist/rate-limit/index.d.ts +3 -3
  395. package/dist/rate-limit/middleware.d.ts +3 -3
  396. package/dist/redis/cache-sync-bus.d.ts +2 -2
  397. package/dist/redis/cache-sync-topics.d.ts +1 -1
  398. package/dist/redis/index.d.ts +8 -8
  399. package/dist/redis/pubsub-signal.d.ts +1 -1
  400. package/dist/schema-cli.d.ts +1 -1
  401. package/dist/schema-cli.js +21 -2
  402. package/dist/search/derive-search-adapter-config.d.ts +2 -2
  403. package/dist/search/in-memory-adapter.d.ts +1 -1
  404. package/dist/search/index.d.ts +6 -6
  405. package/dist/search/meilisearch-adapter.d.ts +2 -2
  406. package/dist/search/purge-subject.d.ts +4 -4
  407. package/dist/search/reindex-entity.d.ts +3 -3
  408. package/dist/secrets/dek-cache.d.ts +1 -1
  409. package/dist/secrets/env-master-key-provider.d.ts +1 -1
  410. package/dist/secrets/env-master-key-provider.js +26 -11
  411. package/dist/secrets/envelope-cipher.d.ts +2 -2
  412. package/dist/secrets/envelope.d.ts +1 -1
  413. package/dist/secrets/index.d.ts +9 -9
  414. package/dist/secrets/rotation.d.ts +1 -1
  415. package/dist/secrets/stored-envelope.d.ts +1 -1
  416. package/dist/seeding/entity-seed.d.ts +1 -1
  417. package/dist/seeding/index.d.ts +3 -3
  418. package/dist/seeding/seed-users.d.ts +1 -1
  419. package/dist/time/index.d.ts +6 -6
  420. package/dist/ui-types/app-schema.d.ts +5 -5
  421. package/dist/ui-types/index.d.ts +23 -23
  422. package/dist/upgrade-cli.js +13 -3
  423. package/dist/utils/index.d.ts +9 -9
  424. package/package.json +19 -66
  425. package/presets/biome-app.json +80 -0
  426. package/presets/tsconfig.app.json +19 -0
  427. package/src/changes.json +84 -2
  428. package/src/scripts/codemod/README.md +18 -0
  429. package/src/scripts/codemod/codemod-support.ts +1 -1
  430. package/src/scripts/codemod/db-factory.ts +1 -1
  431. package/src/scripts/codemod/feature-factory.ts +1 -1
  432. package/src/scripts/codemod/import-extensions.ts +118 -0
  433. package/src/scripts/codemod/migrate-cross-tenant.ts +2 -2
  434. package/src/scripts/codemod/migrate-db-raw.ts +1 -1
  435. package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
  436. package/src/scripts/codemod/object-form.ts +1 -1
  437. package/src/scripts/codemod/s3-imports.ts +1 -1
  438. package/src/scripts/codemod/tenant-db-options.ts +1 -1
  439. package/src/scripts/codemod/testing-move.ts +2 -2
  440. package/dist/db/bun-db-deprecated.d.ts +0 -10
  441. package/dist/db/bun-db-deprecated.js +0 -5
  442. package/dist/stack/index.d.ts +0 -10
  443. package/dist/stack/index.js +0 -11
  444. package/dist/testing/e2e-generator.d.ts +0 -5
  445. package/dist/testing/e2e-generator.js +0 -5
  446. package/dist/testing/handler-context.d.ts +0 -5
  447. package/dist/testing/handler-context.js +0 -5
  448. package/dist/testing/index.d.ts +0 -10
  449. package/dist/testing/index.js +0 -10
  450. package/dist/testing/real-providers.d.ts +0 -5
  451. package/dist/testing/real-providers.js +0 -5
@@ -1,8 +1,8 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { AccessRule, AgentHandlerHints, AgentRisk, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../../types/handlers.js";
3
- import type { QueryHandlerPattern, StreamHandlerPattern, WriteHandlerPattern } from "../patterns.js";
4
- import type { SourceLocation } from "../source-location.js";
5
- import { type ExtractOutput, type RawRefSentinel } from "./shared.js";
2
+ import type { AccessRule, AgentHandlerHints, AgentRisk, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../../types/handlers.ts";
3
+ import type { QueryHandlerPattern, StreamHandlerPattern, WriteHandlerPattern } from "../patterns.ts";
4
+ import type { SourceLocation } from "../source-location.ts";
5
+ import { type ExtractOutput, type RawRefSentinel } from "./shared.ts";
6
6
  export type ParsedHandlerCall = {
7
7
  readonly source: SourceLocation;
8
8
  readonly handlerName?: string;
@@ -1,9 +1,9 @@
1
1
  import type { CallExpression, Node, SourceFile } from "ts-morph";
2
- import type { LifecycleHookType } from "../../constants.js";
3
- import type { AccessRule, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../../types/handlers.js";
4
- import type { HookPhase } from "../../types/hooks.js";
5
- import type { AuthClaimsPattern, HookPattern } from "../patterns.js";
6
- import { type ExtractOutput, type RawRefSentinel } from "./shared.js";
2
+ import type { LifecycleHookType } from "../../constants.ts";
3
+ import type { AccessRule, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../../types/handlers.ts";
4
+ import type { HookPhase } from "../../types/hooks.ts";
5
+ import type { AuthClaimsPattern, HookPattern } from "../patterns.ts";
6
+ import { type ExtractOutput, type RawRefSentinel } from "./shared.ts";
7
7
  export type HeaderReadResult<T> = {
8
8
  readonly kind: "value";
9
9
  readonly value: T;
@@ -1,14 +1,14 @@
1
- export { extractAiClassify, extractAiExtract, extractAiGenerate, } from "./ai-steps.js";
2
- export { extractDefineEvent, extractNotification, } from "./events.js";
3
- export { extractQueryHandler, extractStreamHandler, extractWriteHandler, type ParsedHandlerCall, parseHandlerCall, } from "./handlers.js";
4
- export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalPhase, readOptionalRateLimit, } from "./hooks.js";
5
- export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.js";
6
- export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.js";
7
- export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.js";
8
- export { extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.js";
9
- export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.js";
10
- export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, type NamedOptionsResult, readNamedOptions, } from "./round3.js";
11
- export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.js";
12
- export { extractTreeActions } from "./round6.js";
13
- export type { ExtractOutput } from "./shared.js";
14
- export { fail, findFunctionLiteral, isPlainObject, ok, readBooleanProperty, readDataLiteralNode, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, readPropertyKey, readStringLiteralArgs, readVarargsOrArrayProp, resolveSameFileObjectLiteral, } from "./shared.js";
1
+ export { extractAiClassify, extractAiExtract, extractAiGenerate, } from "./ai-steps.ts";
2
+ export { extractDefineEvent, extractNotification, } from "./events.ts";
3
+ export { extractQueryHandler, extractStreamHandler, extractWriteHandler, type ParsedHandlerCall, parseHandlerCall, } from "./handlers.ts";
4
+ export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalPhase, readOptionalRateLimit, } from "./hooks.ts";
5
+ export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.ts";
6
+ export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.ts";
7
+ export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.ts";
8
+ export { extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.ts";
9
+ export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.ts";
10
+ export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, type NamedOptionsResult, readNamedOptions, } from "./round3.ts";
11
+ export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.ts";
12
+ export { extractTreeActions } from "./round6.ts";
13
+ export type { ExtractOutput } from "./shared.ts";
14
+ export { fail, findFunctionLiteral, isPlainObject, ok, readBooleanProperty, readDataLiteralNode, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, readPropertyKey, readStringLiteralArgs, readVarargsOrArrayProp, resolveSameFileObjectLiteral, } from "./shared.ts";
@@ -1,7 +1,7 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { HttpRouteMethod } from "../../types/http-route.js";
3
- import type { HttpRoutePattern, JobPattern } from "../patterns.js";
4
- import { type ExtractOutput } from "./shared.js";
2
+ import type { HttpRouteMethod } from "../../types/http-route.ts";
3
+ import type { HttpRoutePattern, JobPattern } from "../patterns.ts";
4
+ import { type ExtractOutput } from "./shared.ts";
5
5
  export declare function isHttpRouteMethod(value: string): value is HttpRouteMethod;
6
6
  export declare function extractJob(call: CallExpression, sourceFile: SourceFile): ExtractOutput<JobPattern>;
7
7
  export declare function extractHttpRoute(call: CallExpression, sourceFile: SourceFile): ExtractOutput<HttpRoutePattern>;
@@ -1,7 +1,7 @@
1
1
  import type { CallExpression, Node, SourceFile } from "ts-morph";
2
- import type { MultiStreamProjectionPattern, ProjectionPattern, ScreenPattern } from "../patterns.js";
3
- import type { SourceLocation } from "../source-location.js";
4
- import { type ExtractOutput } from "./shared.js";
2
+ import type { MultiStreamProjectionPattern, ProjectionPattern, ScreenPattern } from "../patterns.ts";
3
+ import type { SourceLocation } from "../source-location.ts";
4
+ import { type ExtractOutput } from "./shared.ts";
5
5
  export declare function readApplyBodies(defObj: ReturnType<Node["asKind"]>, sourceFile: SourceFile): Record<string, SourceLocation> | undefined;
6
6
  export declare function extractProjection(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ProjectionPattern>;
7
7
  export declare function extractMultiStreamProjection(call: CallExpression, sourceFile: SourceFile): ExtractOutput<MultiStreamProjectionPattern>;
@@ -1,6 +1,6 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { DescribePattern, OptionalRequiresPattern, ReadsConfigPattern, RequiresPattern, SystemScopePattern, ToggleablePattern, UiHintsPattern } from "../patterns.js";
3
- import { type ExtractOutput } from "./shared.js";
2
+ import type { DescribePattern, OptionalRequiresPattern, ReadsConfigPattern, RequiresPattern, SystemScopePattern, ToggleablePattern, UiHintsPattern } from "../patterns.ts";
3
+ import { type ExtractOutput } from "./shared.ts";
4
4
  export declare function extractRequires(call: CallExpression, sourceFile: SourceFile): ExtractOutput<RequiresPattern>;
5
5
  export declare function extractOptionalRequires(call: CallExpression, sourceFile: SourceFile): ExtractOutput<OptionalRequiresPattern>;
6
6
  export declare function extractReadsConfig(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ReadsConfigPattern>;
@@ -1,6 +1,6 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { EntityPattern, NavPattern, RelationPattern, WorkspacePattern } from "../patterns.js";
3
- import { type ExtractOutput } from "./shared.js";
2
+ import type { EntityPattern, NavPattern, RelationPattern, WorkspacePattern } from "../patterns.ts";
3
+ import { type ExtractOutput } from "./shared.ts";
4
4
  export declare function extractEntity(call: CallExpression, sourceFile: SourceFile): ExtractOutput<EntityPattern>;
5
5
  export declare function extractRelation(call: CallExpression, sourceFile: SourceFile): ExtractOutput<RelationPattern>;
6
6
  export declare function extractNav(call: CallExpression, sourceFile: SourceFile): ExtractOutput<NavPattern>;
@@ -1,8 +1,8 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { ClaimKeyType } from "../../types/handlers.js";
3
- import type { ParseError } from "../parse.js";
4
- import type { ClaimKeyPattern, ConfigPattern, MetricPattern, ReferenceDataPattern, SecretNamespacePattern, SecretPattern, TranslationsPattern, UseExtensionPattern } from "../patterns.js";
5
- import { type ExtractOutput, type ReadDataLiteralOptions } from "./shared.js";
2
+ import type { ClaimKeyType } from "../../types/handlers.ts";
3
+ import type { ParseError } from "../parse.ts";
4
+ import type { ClaimKeyPattern, ConfigPattern, MetricPattern, ReferenceDataPattern, SecretNamespacePattern, SecretPattern, TranslationsPattern, UseExtensionPattern } from "../patterns.ts";
5
+ import { type ExtractOutput, type ReadDataLiteralOptions } from "./shared.ts";
6
6
  export type NamedOptionsResult = {
7
7
  readonly kind: "ok";
8
8
  readonly name: string;
@@ -1,6 +1,6 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { EnvSchemaPattern, ExposesApiPattern, ExtendsRegistrarPattern, UsesApiPattern } from "../patterns.js";
3
- import { type ExtractOutput } from "./shared.js";
2
+ import type { EnvSchemaPattern, ExposesApiPattern, ExtendsRegistrarPattern, UsesApiPattern } from "../patterns.ts";
3
+ import { type ExtractOutput } from "./shared.ts";
4
4
  export declare function extractEnvSchema(call: CallExpression, sourceFile: SourceFile): ExtractOutput<EnvSchemaPattern>;
5
5
  export declare function extractExtendsRegistrar(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ExtendsRegistrarPattern>;
6
6
  export declare function extractUsesApi(call: CallExpression, sourceFile: SourceFile): ExtractOutput<UsesApiPattern>;
@@ -1,4 +1,4 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { TreeActionsPattern } from "../patterns.js";
3
- import { type ExtractOutput } from "./shared.js";
2
+ import type { TreeActionsPattern } from "../patterns.ts";
3
+ import { type ExtractOutput } from "./shared.ts";
4
4
  export declare function extractTreeActions(call: CallExpression, sourceFile: SourceFile): ExtractOutput<TreeActionsPattern>;
@@ -1,6 +1,6 @@
1
1
  import type { CallExpression, ObjectLiteralExpression } from "ts-morph";
2
2
  import { Node } from "ts-morph";
3
- import type { ParseError } from "../parse.js";
3
+ import type { ParseError } from "../parse.ts";
4
4
  export type ExtractOutput<TPattern> = {
5
5
  readonly kind: "pattern";
6
6
  readonly pattern: TPattern;
@@ -51,7 +51,7 @@ export declare function readStringOrRaw(node: Node): string | RawRefSentinel | u
51
51
  * — see #1009).
52
52
  */
53
53
  export declare function readStringOrRawArgs(call: CallExpression): readonly (string | RawRefSentinel)[] | undefined;
54
- export { isPlainObject } from "../../../utils/is-plain-object.js";
54
+ export { isPlainObject } from "../../../utils/is-plain-object.ts";
55
55
  export declare function readPropertyKey(propAssign: import("ts-morph").PropertyAssignment): string;
56
56
  /**
57
57
  * Resolved name plus, when the source node was an identifier rather than
@@ -1,16 +1,16 @@
1
- export type { FormFieldLabel, FormFieldSpec, FormInputType, PatternCategory, PatternFormSchema, } from "../pattern-library/index.js";
2
- export { getPatternSchema, groupByCategory, PATTERN_LIBRARY } from "../pattern-library/index.js";
3
- export type { ParseError, ParseResult } from "./parse.js";
4
- export { parseFeatureFile, parseSourceFile } from "./parse.js";
5
- export type { HandlerHeaderUpdate, PatternChange, PatternId, QueryHandlerHeaderKey, StreamHandlerHeaderKey, WriteHandlerHeaderKey, } from "./patch.js";
6
- export { addPattern, applyChanges, removePattern, replacePattern, SINGLETON_KINDS, updatePattern, } from "./patch.js";
7
- export type { AddAuthClaimsArgs, AddClaimKeyArgs, AddConfigArgs, AddDefineEventArgs, AddEntityArgs, AddHookArgs, AddHttpRouteArgs, AddJobArgs, AddMetricArgs, AddMultiStreamProjectionArgs, AddNavArgs, AddNotificationArgs, AddOptionalRequiresArgs, AddProjectionArgs, AddQueryHandlerArgs, AddReadsConfigArgs, AddReferenceDataArgs, AddRelationArgs, AddRequiresArgs, AddScreenArgs, AddSecretArgs, AddStreamHandlerArgs, AddToggleableArgs, AddTranslationsArgs, AddUseExtensionArgs, AddWorkspaceArgs, AddWriteHandlerArgs, FeaturePatcher, } from "./patcher.js";
8
- export { createFeaturePatcher } from "./patcher.js";
9
- export type { PatternChangeIssue, PatternChangesParseResult } from "./pattern-change-schema.js";
10
- export { parsePatternChanges } from "./pattern-change-schema.js";
11
- export type { AuthClaimsPattern, ClaimKeyPattern, ConfigPattern, DefineEventPattern, Editability, EntityPattern, ExtendsRegistrarPattern, FeaturePattern, FeaturePatternKind, HookPattern, HttpRoutePattern, JobPattern, MetricPattern, MultiStreamProjectionPattern, NavPattern, NotificationPattern, OptionalRequiresPattern, ProjectionPattern, QueryHandlerPattern, ReadsConfigPattern, ReferenceDataPattern, RelationPattern, RequiresPattern, ScreenPattern, SecretNamespacePattern, SecretPattern, StreamHandlerPattern, SystemScopePattern, ToggleablePattern, TranslationsPattern, UnknownPattern, UseExtensionPattern, WorkspacePattern, WriteHandlerPattern, } from "./patterns.js";
12
- export { getEditability } from "./patterns.js";
13
- export type { RenderFeatureFileInput } from "./render.js";
14
- export { FEATURE_FILE_VERSION, renderFeatureFile, renderPattern, renderValue, VERSION_HEADER, } from "./render.js";
15
- export type { SourceLocation, SourcePosition } from "./source-location.js";
16
- export { sourceLocationFromNode } from "./source-location.js";
1
+ export type { FormFieldLabel, FormFieldSpec, FormInputType, PatternCategory, PatternFormSchema, } from "../pattern-library/index.ts";
2
+ export { getPatternSchema, groupByCategory, PATTERN_LIBRARY } from "../pattern-library/index.ts";
3
+ export type { ParseError, ParseResult } from "./parse.ts";
4
+ export { parseFeatureFile, parseSourceFile } from "./parse.ts";
5
+ export type { HandlerHeaderUpdate, PatternChange, PatternId, QueryHandlerHeaderKey, StreamHandlerHeaderKey, WriteHandlerHeaderKey, } from "./patch.ts";
6
+ export { addPattern, applyChanges, removePattern, replacePattern, SINGLETON_KINDS, updatePattern, } from "./patch.ts";
7
+ export type { AddAuthClaimsArgs, AddClaimKeyArgs, AddConfigArgs, AddDefineEventArgs, AddEntityArgs, AddHookArgs, AddHttpRouteArgs, AddJobArgs, AddMetricArgs, AddMultiStreamProjectionArgs, AddNavArgs, AddNotificationArgs, AddOptionalRequiresArgs, AddProjectionArgs, AddQueryHandlerArgs, AddReadsConfigArgs, AddReferenceDataArgs, AddRelationArgs, AddRequiresArgs, AddScreenArgs, AddSecretArgs, AddStreamHandlerArgs, AddToggleableArgs, AddTranslationsArgs, AddUseExtensionArgs, AddWorkspaceArgs, AddWriteHandlerArgs, FeaturePatcher, } from "./patcher.ts";
8
+ export { createFeaturePatcher } from "./patcher.ts";
9
+ export type { PatternChangeIssue, PatternChangesParseResult } from "./pattern-change-schema.ts";
10
+ export { parsePatternChanges } from "./pattern-change-schema.ts";
11
+ export type { AuthClaimsPattern, ClaimKeyPattern, ConfigPattern, DefineEventPattern, Editability, EntityPattern, ExtendsRegistrarPattern, FeaturePattern, FeaturePatternKind, HookPattern, HttpRoutePattern, JobPattern, MetricPattern, MultiStreamProjectionPattern, NavPattern, NotificationPattern, OptionalRequiresPattern, ProjectionPattern, QueryHandlerPattern, ReadsConfigPattern, ReferenceDataPattern, RelationPattern, RequiresPattern, ScreenPattern, SecretNamespacePattern, SecretPattern, StreamHandlerPattern, SystemScopePattern, ToggleablePattern, TranslationsPattern, UnknownPattern, UseExtensionPattern, WorkspacePattern, WriteHandlerPattern, } from "./patterns.ts";
12
+ export { getEditability } from "./patterns.ts";
13
+ export type { RenderFeatureFileInput } from "./render.ts";
14
+ export { FEATURE_FILE_VERSION, renderFeatureFile, renderPattern, renderValue, VERSION_HEADER, } from "./render.ts";
15
+ export type { SourceLocation, SourcePosition } from "./source-location.ts";
16
+ export { sourceLocationFromNode } from "./source-location.ts";
@@ -1,6 +1,6 @@
1
1
  import type { SourceFile } from "ts-morph";
2
- import type { FeaturePattern } from "./patterns.js";
3
- import { type SourceLocation } from "./source-location.js";
2
+ import type { FeaturePattern } from "./patterns.ts";
3
+ import { type SourceLocation } from "./source-location.ts";
4
4
  export type ParseError = {
5
5
  readonly methodName: string;
6
6
  readonly source: SourceLocation;
@@ -1,5 +1,5 @@
1
1
  import { type SourceFile } from "ts-morph";
2
- import type { FeaturePattern, QueryHandlerPattern, StreamHandlerPattern, WriteHandlerPattern } from "./patterns.js";
2
+ import type { FeaturePattern, QueryHandlerPattern, StreamHandlerPattern, WriteHandlerPattern } from "./patterns.ts";
3
3
  /**
4
4
  * Identifier used by replace/remove. Discriminated union: each pattern
5
5
  * kind names the property the patcher must match against. Adding a new
@@ -1,19 +1,19 @@
1
1
  import type { SourceFile } from "ts-morph";
2
- import type { LifecycleHookType } from "../constants.js";
3
- import type { ConfigKeyDefinition, ConfigKeyType, JobDefinition, RunIn, TranslationKeys } from "../types/config.js";
4
- import type { MetricOptions, SecretNamespaceOptions, SecretOptions } from "../types/feature.js";
5
- import type { EntityDefinition } from "../types/fields.js";
6
- import type { AccessRule, ClaimKeyType, EscapeHatchDeclaration, RateLimitOption } from "../types/handlers.js";
7
- import type { HookPhase } from "../types/hooks.js";
8
- import type { HttpRouteMethod } from "../types/http-route.js";
9
- import type { NavDefinition } from "../types/nav.js";
10
- import type { MspErrorMode } from "../types/projection.js";
11
- import type { RelationDefinition } from "../types/relations.js";
12
- import type { ScreenDefinition } from "../types/screen.js";
13
- import type { WorkspaceDefinition } from "../types/workspace.js";
14
- import { type PatternChange, type PatternId } from "./patch.js";
15
- import type { FeaturePattern } from "./patterns.js";
16
- import type { SourceLocation } from "./source-location.js";
2
+ import type { LifecycleHookType } from "../constants.ts";
3
+ import type { ConfigKeyDefinition, ConfigKeyType, JobDefinition, RunIn, TranslationKeys } from "../types/config.ts";
4
+ import type { MetricOptions, SecretNamespaceOptions, SecretOptions } from "../types/feature.ts";
5
+ import type { EntityDefinition } from "../types/fields.ts";
6
+ import type { AccessRule, ClaimKeyType, EscapeHatchDeclaration, RateLimitOption } from "../types/handlers.ts";
7
+ import type { HookPhase } from "../types/hooks.ts";
8
+ import type { HttpRouteMethod } from "../types/http-route.ts";
9
+ import type { NavDefinition } from "../types/nav.ts";
10
+ import type { MspErrorMode } from "../types/projection.ts";
11
+ import type { RelationDefinition } from "../types/relations.ts";
12
+ import type { ScreenDefinition } from "../types/screen.ts";
13
+ import type { WorkspaceDefinition } from "../types/workspace.ts";
14
+ import { type PatternChange, type PatternId } from "./patch.ts";
15
+ import type { FeaturePattern } from "./patterns.ts";
16
+ import type { SourceLocation } from "./source-location.ts";
17
17
  export declare const SYNTHETIC_LOC: SourceLocation;
18
18
  export declare function rawLoc(raw: string): SourceLocation;
19
19
  export type AddEntityArgs = {
@@ -1,14 +1,14 @@
1
1
  import * as z from "zod";
2
- import type { ConfigKeyDefinition, ConfigKeyType, JobDefinition } from "../types/config.js";
3
- import type { MetricOptions, SecretNamespaceOptions, SecretOptions } from "../types/feature.js";
4
- import type { EntityDefinition } from "../types/fields.js";
5
- import type { NavDefinition } from "../types/nav.js";
6
- import type { RelationDefinition } from "../types/relations.js";
7
- import type { ScreenDefinition } from "../types/screen.js";
8
- import type { TreeActionDef } from "../types/tree-node.js";
9
- import type { WorkspaceDefinition } from "../types/workspace.js";
10
- import type { PatternChange } from "./patch.js";
11
- import type { SourceLocation } from "./source-location.js";
2
+ import type { ConfigKeyDefinition, ConfigKeyType, JobDefinition } from "../types/config.ts";
3
+ import type { MetricOptions, SecretNamespaceOptions, SecretOptions } from "../types/feature.ts";
4
+ import type { EntityDefinition } from "../types/fields.ts";
5
+ import type { NavDefinition } from "../types/nav.ts";
6
+ import type { RelationDefinition } from "../types/relations.ts";
7
+ import type { ScreenDefinition } from "../types/screen.ts";
8
+ import type { TreeActionDef } from "../types/tree-node.ts";
9
+ import type { WorkspaceDefinition } from "../types/workspace.ts";
10
+ import type { PatternChange } from "./patch.ts";
11
+ import type { SourceLocation } from "./source-location.ts";
12
12
  export type PatternChangeIssue = {
13
13
  readonly path: string;
14
14
  readonly message: string;
@@ -1,18 +1,18 @@
1
- import type { LifecycleHookType } from "../constants.js";
2
- import type { ConfigKeyDefinition, ConfigKeyType, JobDefinition, ReferenceDataDef, RunIn, TranslationKeys } from "../types/config.js";
3
- import type { MetricOptions, SecretNamespaceOptions, SecretOptions } from "../types/feature.js";
4
- import type { EntityDefinition } from "../types/fields.js";
5
- import type { AccessRule, AgentHandlerHints, ClaimKeyType, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../types/handlers.js";
6
- import type { HookPhase } from "../types/hooks.js";
7
- import type { HttpRouteMethod } from "../types/http-route.js";
8
- import type { NavDefinition } from "../types/nav.js";
9
- import type { MspErrorMode } from "../types/projection.js";
10
- import type { RelationDefinition } from "../types/relations.js";
11
- import type { ScreenDefinition } from "../types/screen.js";
12
- import type { TreeActionDef } from "../types/tree-node.js";
13
- import type { WorkspaceDefinition } from "../types/workspace.js";
14
- import type { RawRefSentinel } from "./extractors/shared.js";
15
- import type { SourceLocation } from "./source-location.js";
1
+ import type { LifecycleHookType } from "../constants.ts";
2
+ import type { ConfigKeyDefinition, ConfigKeyType, JobDefinition, ReferenceDataDef, RunIn, TranslationKeys } from "../types/config.ts";
3
+ import type { MetricOptions, SecretNamespaceOptions, SecretOptions } from "../types/feature.ts";
4
+ import type { EntityDefinition } from "../types/fields.ts";
5
+ import type { AccessRule, AgentHandlerHints, ClaimKeyType, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../types/handlers.ts";
6
+ import type { HookPhase } from "../types/hooks.ts";
7
+ import type { HttpRouteMethod } from "../types/http-route.ts";
8
+ import type { NavDefinition } from "../types/nav.ts";
9
+ import type { MspErrorMode } from "../types/projection.ts";
10
+ import type { RelationDefinition } from "../types/relations.ts";
11
+ import type { ScreenDefinition } from "../types/screen.ts";
12
+ import type { TreeActionDef } from "../types/tree-node.ts";
13
+ import type { WorkspaceDefinition } from "../types/workspace.ts";
14
+ import type { RawRefSentinel } from "./extractors/shared.ts";
15
+ import type { SourceLocation } from "./source-location.ts";
16
16
  export type EntityPattern = {
17
17
  readonly kind: "entity";
18
18
  readonly source: SourceLocation;
@@ -1,4 +1,4 @@
1
- import type { FeaturePattern } from "./patterns.js";
1
+ import type { FeaturePattern } from "./patterns.ts";
2
2
  export declare const FEATURE_FILE_VERSION: 1;
3
3
  export declare const VERSION_HEADER: string;
4
4
  /**
@@ -1,10 +1,10 @@
1
1
  import type { WebSocketRouteDefinition } from "@cosmicdrift/kumiko-types/websocket-route";
2
2
  import type * as z from "zod";
3
- import type { HttpRouteDefinition } from "./types/http-route.js";
4
- import type { AuthClaimsFn, BootCheckFn, ClaimKeyDefinition, ConfigKeyDefinition, ConfigSeedDef, EntityDefinition, EntityProjectionExtension, EventDef, EventMigrationDef, ExtensionSelectorDef, FeatureMetricDef, JobDefinition, LifecycleHookFn, MultiStreamProjectionDefinition, NotificationDefinition, OwnedFn, PhasedHook, PostDeleteHookFn, PostQueryHookFn, PostSaveHookFn, PreDeleteHookFn, ProjectionDefinition, QueryHandlerDef, ReferenceDataDef, RegistrarExtensionDef, RegistrarExtensionRegistration, RelationDefinition, SearchPayloadContributorFn, SecretKeyDefinition, SecretNamespaceDefinition, StoreTableEntry, StreamHandlerDef, TranslationKeys, TreeActionDef, UiHints, ValidationHookFn, WriteHandlerDef } from "./types/index.js";
5
- import type { ContentCollectionDefinition, NavDefinition } from "./types/nav.js";
6
- import type { ScreenDefinition } from "./types/screen.js";
7
- import type { WorkspaceDefinition } from "./types/workspace.js";
3
+ import type { HttpRouteDefinition } from "./types/http-route.ts";
4
+ import type { AuthClaimsFn, BootCheckFn, ClaimKeyDefinition, ConfigKeyDefinition, ConfigSeedDef, EntityDefinition, EntityProjectionExtension, EventDef, EventMigrationDef, ExtensionSelectorDef, FeatureMetricDef, JobDefinition, LifecycleHookFn, MultiStreamProjectionDefinition, NotificationDefinition, OwnedFn, PhasedHook, PostDeleteHookFn, PostQueryHookFn, PostSaveHookFn, PreDeleteHookFn, ProjectionDefinition, QueryHandlerDef, ReferenceDataDef, RegistrarExtensionDef, RegistrarExtensionRegistration, RelationDefinition, SearchPayloadContributorFn, SecretKeyDefinition, SecretNamespaceDefinition, StoreTableEntry, StreamHandlerDef, TranslationKeys, TreeActionDef, UiHints, ValidationHookFn, WriteHandlerDef } from "./types/index.ts";
5
+ import type { ContentCollectionDefinition, NavDefinition } from "./types/nav.ts";
6
+ import type { ScreenDefinition } from "./types/screen.ts";
7
+ import type { WorkspaceDefinition } from "./types/workspace.ts";
8
8
  export type FeatureBuilderState = {
9
9
  requires: string[];
10
10
  optionalRequires: string[];
@@ -1,7 +1,7 @@
1
1
  import type * as z from "zod";
2
- import { type ZodType } from "zod";
3
- import type { FeatureBuilderState } from "./feature-builder-state.js";
4
- import type { AuthClaimsFn, ClaimKeyHandle, ClaimKeyType, ConfigKeyDefinition, ConfigKeyHandle, ConfigKeyType, ConfigSeedDef, DeclarativeEventMigration, EventDef, EventPiiStance, EventUpcastFn, JobDefinition, JobHandlerFn, MetricOptions, NameOrRef, NotificationDataFn, NotificationLocalizedTemplate, NotificationRecipientFn, NotificationRecordMapping, NotificationTemplateBody, NotificationTemplateFn, NotificationTemplateMeta, QualifiedEventName, SecretKeyHandle, SecretNamespaceHandle, SecretNamespaceOptions, SecretOptions, TemplateVariables, TranslationsDef } from "./types/index.js";
2
+ import type { ZodType } from "zod";
3
+ import type { FeatureBuilderState } from "./feature-builder-state.ts";
4
+ import type { AuthClaimsFn, ClaimKeyHandle, ClaimKeyType, ConfigKeyDefinition, ConfigKeyHandle, ConfigKeyType, ConfigSeedDef, DeclarativeEventMigration, EventDef, EventPiiStance, EventUpcastFn, JobDefinition, JobHandlerFn, MetricOptions, NameOrRef, NotificationDataFn, NotificationLocalizedTemplate, NotificationRecipientFn, NotificationRecordMapping, NotificationTemplateBody, NotificationTemplateFn, NotificationTemplateMeta, QualifiedEventName, SecretKeyHandle, SecretNamespaceHandle, SecretNamespaceOptions, SecretOptions, TemplateVariables, TranslationsDef } from "./types/index.ts";
5
5
  export declare function buildConfigEventsJobsMethods<TName extends string>(state: FeatureBuilderState, name: TName): {
6
6
  config: {
7
7
  <T extends ConfigKeyType>(keyName: string, def: ConfigKeyDefinition<T>): ConfigKeyHandle<T>;
@@ -1,53 +1,10 @@
1
- import { escapeHatchGrantsProblem, normalizeEventPiiSubject, } from "@cosmicdrift/kumiko-types/handlers";
1
+ import { escapeHatchGrantsProblem } from "@cosmicdrift/kumiko-types/handlers";
2
2
  import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
3
- import { ZodObject } from "zod";
4
3
  import { isValidIanaTimeZone } from "../time/iana.js";
4
+ import { createEventDef } from "./event-def.js";
5
5
  import { resolveName } from "./handler-helpers.js";
6
6
  import { splitNamedDefinition, unwrapArrayForm } from "./object-form.js";
7
7
  import { QnTypes, qn, toKebab } from "./qualified-name.js";
8
- // A payload field that still holds null/undefined after parsing — the case
9
- // where an event-PII owner field yields no subject at append time (fw#2776).
10
- // A `.default(...)` accepts undefined but parses to a value, so it is not
11
- // absentable.
12
- function isAbsentable(field) {
13
- return [null, undefined].some((candidate) => {
14
- const parsed = field.safeParse(candidate);
15
- return parsed.success && (parsed.data === null || parsed.data === undefined);
16
- });
17
- }
18
- const NON_STRING_SCHEMA_TYPES = new Set([
19
- "number",
20
- "int",
21
- "boolean",
22
- "bigint",
23
- "date",
24
- "object",
25
- "array",
26
- ]);
27
- // An owner id is resolved through "non-empty string or absent" at append time,
28
- // so a schema that can never yield a string would make every append throw in
29
- // prod. Wrappers (optional/nullable/default/...) are looked through.
30
- function neverYieldsString(field) {
31
- let current = field;
32
- for (;;) {
33
- const def = current._zod.def;
34
- if (def.innerType === undefined)
35
- return NON_STRING_SCHEMA_TYPES.has(def.type);
36
- current = def.innerType;
37
- }
38
- }
39
- function assertOwnerFieldYieldsPresentString(args) {
40
- const { featureName, eventName, field, ownerField, owner } = args;
41
- if (neverYieldsString(owner)) {
42
- throw new Error(`[Feature ${featureName}] defineEvent("${eventName}"): piiFields."${field}" is owned by "${ownerField}", whose payload schema is not a string — the subject id must be a non-empty string, so every append would fail. ` +
43
- `Use a string owner field, or declare whenAbsent ("tenant" | "self" | "plaintext").`);
44
- }
45
- if (isAbsentable(owner)) {
46
- throw new Error(`[Feature ${featureName}] defineEvent("${eventName}"): piiFields."${field}" is owned by "${ownerField}", which the payload schema allows to be null/undefined. ` +
47
- `Declare what happens then: { personal: { of: "${ownerField}", whenAbsent: "tenant" } } encrypts under the envelope tenant key, ` +
48
- `whenAbsent: "self" under the event's own record key, whenAbsent: "plaintext" acknowledges that the value ships unencrypted and cannot be crypto-shredded (fw#2776).`);
49
- }
50
- }
51
8
  // Builds config/secrets/claims/events/jobs/notifications registrar methods.
52
9
  export function buildConfigEventsJobsMethods(state, name) {
53
10
  function config(arg1, arg2) {
@@ -89,45 +46,6 @@ export function buildConfigEventsJobsMethods(state, name) {
89
46
  // Single-key call unwraps its own handle; multi-key returns the record.
90
47
  return typeof arg1 === "string" ? handles[arg1] : handles;
91
48
  }
92
- // piiFields misconfiguration is a boot-time error, not a silent
93
- // plaintext leak: both the pii field and its owner field must exist
94
- // on the payload schema (checkable when the schema is a ZodObject).
95
- function validateEventPiiFields(eventName, schema, piiFields) {
96
- const shape = schema instanceof ZodObject ? schema.shape : undefined;
97
- for (const [field, spec] of Object.entries(piiFields)) {
98
- const normalized = normalizeEventPiiSubject(spec);
99
- // Only the user form names an owner field — tenant/self subjects come
100
- // from the write-time envelope (tenantId / aggregateType+aggregateId),
101
- // so there is no owner-field existence or self-reference check for them.
102
- if (normalized.kind !== "user") {
103
- if (shape && !(field in shape)) {
104
- throw new Error(`[Feature ${name}] defineEvent("${eventName}"): piiFields references "${field}" which is not a field of the payload schema.`);
105
- }
106
- continue;
107
- }
108
- if (field === normalized.ownerField) {
109
- throw new Error(`[Feature ${name}] defineEvent("${eventName}"): piiFields."${field}" cannot use itself as the owner field — the subject id is a plaintext pseudonymous fk, the pii field is the value it owns.`);
110
- }
111
- if (normalized.ownerField === "id") {
112
- throw new Error(`[Feature ${name}] defineEvent("${eventName}"): piiFields."${field}" uses owner field "id" — on entities \`of: "id"\` means record-owned, but on events it would encrypt under a phantom user key that a forget never reaches. Use \`personal: "self"\` for a record-owned event field.`);
113
- }
114
- for (const required of [field, normalized.ownerField]) {
115
- if (shape && !(required in shape)) {
116
- throw new Error(`[Feature ${name}] defineEvent("${eventName}"): piiFields references "${required}" which is not a field of the payload schema.`);
117
- }
118
- }
119
- const owner = shape?.[normalized.ownerField];
120
- if (normalized.whenAbsent === undefined && owner !== undefined) {
121
- assertOwnerFieldYieldsPresentString({
122
- featureName: name,
123
- eventName,
124
- field,
125
- ownerField: normalized.ownerField,
126
- owner,
127
- });
128
- }
129
- }
130
- }
131
49
  // Shared by defineEvent's `migrations` option — each entry registers a
132
50
  // single upcast step, same validation/dedup as the old standalone
133
51
  // r.eventMigration() call (folded into defineEvent, #1082 step 8).
@@ -229,53 +147,13 @@ export function buildConfigEventsJobsMethods(state, name) {
229
147
  state.translations = { ...state.translations, ...def.keys };
230
148
  },
231
149
  defineEvent: (eventName, schema, options) => {
232
- // Fail-closed PII stance gate (fw#2558) — runs before anything else so
233
- // an untyped JS consumer (no compiler to stop it) still can't register
234
- // an event without declaring whether its payload carries personal data.
235
- const missingStanceError = () => new Error(`[Feature ${name}] defineEvent("${eventName}") must declare an explicit PII stance. Pass { piiFields: { <payloadField>: { personal: { of: "<userIdField>" } } } } for payload fields owned by a user (or { personal: "tenant" } / { personal: "self" } for tenant- or record-scoped subjects), or { piiFields: "none" } when the payload holds none.`);
236
- if (options === undefined || options.piiFields === undefined) {
237
- throw missingStanceError();
238
- }
239
- const piiFields = options.piiFields;
240
- // @cast-boundary runtime-guard — an untyped JS caller can hand
241
- // anything through `piiFields` (including null), so re-check the
242
- // shape before trusting it as EventPiiStance: `typeof null === "object"`
243
- // would otherwise pass through to Object.keys(null) below and throw a
244
- // raw TypeError instead of this guidance message.
245
- if (piiFields !== "none" && (typeof piiFields !== "object" || piiFields === null)) {
246
- throw missingStanceError();
247
- }
248
- if (piiFields !== "none" && Object.keys(piiFields).length === 0) {
249
- throw new Error(`[Feature ${name}] defineEvent("${eventName}"): piiFields: {} is not a stance — use piiFields: "none" to declare the payload holds no personal data.`);
250
- }
251
- if (piiFields !== "none") {
252
- validateEventPiiFields(eventName, schema, piiFields);
253
- }
254
- // Return the fully-qualified event name so callers can pass it
255
- // straight to ctx.appendEvent without hand-building the
256
- // "<feature>:event:<name>" shape. Registry keeps events keyed by
257
- // short name — qualification is the framework's job, not the feature
258
- // author's.
259
- //
260
- // The runtime kebab-step (`qn(toKebab(feature), …)`) is mirrored at
261
- // the type-level by `QualifiedEventName<TName, TInner>` so the
262
- // returned `name` carries the literal qualified shape that the
263
- // augmented `KumikoEventTypeMap` keys against.
264
- const qualified = qn(toKebab(name), "event", toKebab(eventName));
265
- const version = options.version ?? 1;
266
- if (!Number.isInteger(version) || version < 1) {
267
- throw new Error(`[Feature ${name}] defineEvent("${eventName}"): version must be a positive integer, got ${String(version)}`);
268
- }
269
- // @cast-boundary engine-bridge — runtime-string mirrors the
270
- // template-literal-type via QualifiedEventName + toKebab. Both
271
- // sides are tested (CamelToKebab type-tests + scan-events kebab
272
- // tests), so the cast is a contract, not a typing-loss.
273
- const def = {
274
- name: qualified,
150
+ const def = createEventDef({
151
+ feature: name,
152
+ name: eventName,
275
153
  schema,
276
- version,
277
- piiFields,
278
- };
154
+ piiFields: options?.piiFields,
155
+ ...(options?.version !== undefined ? { version: options.version } : {}),
156
+ });
279
157
  state.events[eventName] = def;
280
158
  for (const m of options.migrations ?? []) {
281
159
  registerEventMigration(eventName, m.fromVersion, m.toVersion, m.transform);
@@ -1,9 +1,9 @@
1
1
  import type * as z from "zod";
2
2
  import type { ZodType } from "zod";
3
- import { type QueryHandlerDefinition, type StreamHandlerDefinition, type WriteHandlerDefinition } from "./define-handler.js";
4
- import type { RegisterEntityCrudOptions } from "./entity-handlers.js";
5
- import type { FeatureBuilderState } from "./feature-builder-state.js";
6
- import type { AccessRule, EntityDefinition, EntityObjectDefinition, EntityRef, EscapeHatchDeclaration, HandlerRef, KumikoEventTypeMap, NameOrRef, RateLimitDeclaration, RelationDefinition, StreamHandlerFn } from "./types/index.js";
3
+ import { type QueryHandlerDefinition, type StreamHandlerDefinition, type WriteHandlerDefinition } from "./define-handler.ts";
4
+ import type { RegisterEntityCrudOptions } from "./entity-handlers.ts";
5
+ import type { FeatureBuilderState } from "./feature-builder-state.ts";
6
+ import type { AccessRule, EntityDefinition, EntityObjectDefinition, EntityRef, EscapeHatchDeclaration, HandlerRef, KumikoEventTypeMap, NameOrRef, RateLimitDeclaration, RelationDefinition, StreamHandlerFn } from "./types/index.ts";
7
7
  export declare function buildEntityHandlerMethods<TName extends string>(state: FeatureBuilderState, name: TName): {
8
8
  entity(definition: EntityObjectDefinition): EntityRef;
9
9
  relation(entityRefOrDefinition: NameOrRef | ({
@@ -1,9 +1,9 @@
1
1
  import { ENTITY_CONVENTION_QUERY_BRAND } from "@cosmicdrift/kumiko-types/handlers";
2
2
  import { toTableName } from "../db/table-builder.js";
3
3
  import { isEntityConventionQueryHandler, isPagedQueryHandler, PAGED_QUERY_HANDLER_BRAND, } from "./define-handler.js";
4
- import { registerCrudHandlers } from "./entity-handlers.js";
4
+ import { assertEscapeHatchAccessIsSystemAdminOnly, registerCrudHandlers, } from "./entity-handlers.js";
5
5
  import { resolveName } from "./handler-helpers.js";
6
- import { isObjectArgument, throwPositionalFormRemoved } from "./object-form.js";
6
+ import { isObjectArgument, throwObjectArgumentRequired } from "./object-form.js";
7
7
  const CRUD_VERBS = new Set(["create", "update", "delete"]);
8
8
  const CRUD_REGISTERED_VERBS = new Set([...CRUD_VERBS, "restore", "list", "detail"]);
9
9
  // A silent overwrite would drop framework behaviour that rides on the r.crud
@@ -84,7 +84,7 @@ export function buildEntityHandlerMethods(state, name) {
84
84
  const methods = {
85
85
  entity(definition) {
86
86
  if (!isObjectArgument(definition))
87
- throwPositionalFormRemoved(name, "entity");
87
+ throwObjectArgumentRequired(name, "entity");
88
88
  const { name: entityName, backingTable, ...entityDefinition } = definition;
89
89
  state.entities[entityName] = entityDefinition;
90
90
  if (backingTable !== undefined)
@@ -105,7 +105,7 @@ export function buildEntityHandlerMethods(state, name) {
105
105
  },
106
106
  writeHandler(def) {
107
107
  if (!isObjectArgument(def))
108
- throwPositionalFormRemoved(name, "writeHandler");
108
+ throwObjectArgumentRequired(name, "writeHandler");
109
109
  assertHandlerHasAccess(name, "writeHandler", def.name, def.access);
110
110
  assertHandlerNameFree(state, name, "write", def.name);
111
111
  state.writeHandlers[def.name] = {
@@ -144,9 +144,15 @@ export function buildEntityHandlerMethods(state, name) {
144
144
  },
145
145
  queryHandler(def) {
146
146
  if (!isObjectArgument(def))
147
- throwPositionalFormRemoved(name, "queryHandler");
147
+ throwObjectArgumentRequired(name, "queryHandler");
148
148
  assertHandlerHasAccess(name, "queryHandler", def.name, def.access);
149
149
  assertHandlerNameFree(state, name, "query", def.name);
150
+ // A generated entity handler checks its escapeHatch when it is built, but a
151
+ // spread of it can add escapeHatch afterwards; the registered object is
152
+ // what the dispatcher trusts, so the check runs on it again.
153
+ if (def.escapeHatch !== undefined && isEntityConventionQueryHandler(def)) {
154
+ assertEscapeHatchAccessIsSystemAdminOnly(def.name, "query", def.access);
155
+ }
150
156
  state.queryHandlers[def.name] = {
151
157
  name: def.name,
152
158
  schema: def.schema,
@@ -1,4 +1,4 @@
1
- import type { Registry, UiHints } from "./types/feature.js";
1
+ import type { Registry, UiHints } from "./types/feature.ts";
2
2
  export type ManifestConfigKey = {
3
3
  readonly key: string;
4
4
  readonly qualifiedName: string;