@cosmicdrift/kumiko-framework 0.388.0 → 0.390.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. package/AGENTS.md +12 -4
  2. package/README.md +1 -1
  3. package/agents/examples/apex-surface-auth.md +2 -3
  4. package/agents/examples/api-worker-split.md +9 -2
  5. package/agents/examples/auth-claims.md +1 -1
  6. package/agents/examples/cross-feature-events.md +12 -12
  7. package/agents/examples/crypto-shredding-hr.md +2 -2
  8. package/agents/examples/encrypted-tenant-config.md +1 -1
  9. package/agents/examples/error-contract.md +12 -7
  10. package/agents/examples/event-sourcing.md +29 -29
  11. package/agents/examples/files-post-processing.md +10 -8
  12. package/agents/examples/golden-path.md +13 -1
  13. package/agents/examples/inbound-mail-triage.md +1 -0
  14. package/agents/examples/lane-routing.md +2 -1
  15. package/agents/examples/legal-pages.md +2 -2
  16. package/agents/examples/lifecycle-hooks.md +55 -2
  17. package/agents/examples/list-table-options.md +466 -0
  18. package/agents/examples/managed-config.md +4 -4
  19. package/agents/examples/managed-pages.md +1 -1
  20. package/agents/examples/pdf-audit-export.md +4 -2
  21. package/agents/examples/relations.md +19 -4
  22. package/agents/examples/search.md +4 -4
  23. package/agents/examples/secrets-demo.md +9 -6
  24. package/agents/examples/state-machine.md +5 -4
  25. package/agents/examples/tenant-isolation.md +73 -1
  26. package/agents/examples/tenant-settings.md +1 -1
  27. package/agents/examples/user-data-rights.md +3 -6
  28. package/agents/examples/workflow-engine.md +53 -47
  29. package/agents/examples.md +5 -4
  30. package/agents/features.md +1 -1
  31. package/agents/widgets.md +1 -0
  32. package/dist/api/api-constants.d.ts +1 -0
  33. package/dist/api/api-constants.js +2 -0
  34. package/dist/api/auth-middleware.js +1 -1
  35. package/dist/api/auth-routes-invite.js +2 -1
  36. package/dist/api/auth-routes-shared.d.ts +2 -0
  37. package/dist/api/auth-routes-shared.js +5 -0
  38. package/dist/api/client-error-route.js +2 -3
  39. package/dist/api/entity-read-access.d.ts +4 -1
  40. package/dist/api/entity-read-access.js +14 -0
  41. package/dist/api/export/export-cells-reference.d.ts +9 -0
  42. package/dist/api/export/export-cells-reference.js +21 -0
  43. package/dist/api/export/export-cells.d.ts +11 -0
  44. package/dist/api/export/export-cells.js +136 -0
  45. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  46. package/dist/api/export/export-ciphertext-guard.js +27 -0
  47. package/dist/api/export/export-columns.d.ts +31 -0
  48. package/dist/api/export/export-columns.js +85 -0
  49. package/dist/api/export/export-errors.d.ts +4 -0
  50. package/dist/api/export/export-errors.js +14 -0
  51. package/dist/api/export/export-route.d.ts +4 -0
  52. package/dist/api/export/export-route.js +75 -0
  53. package/dist/api/export/export-rows.d.ts +13 -0
  54. package/dist/api/export/export-rows.js +62 -0
  55. package/dist/api/export/export-screen.d.ts +13 -0
  56. package/dist/api/export/export-screen.js +47 -0
  57. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  58. package/dist/api/export/export-xlsx-writer.js +21 -0
  59. package/dist/api/extra-route.d.ts +7 -1
  60. package/dist/api/index.d.ts +23 -27
  61. package/dist/api/index.js +13 -15
  62. package/dist/api/jwt.js +1 -1
  63. package/dist/api/observability-middleware.d.ts +1 -1
  64. package/dist/api/observability-middleware.js +2 -1
  65. package/dist/api/pii-leak-guard.d.ts +3 -0
  66. package/dist/api/pii-leak-guard.js +3 -2
  67. package/dist/api/request-context-internals.d.ts +31 -0
  68. package/dist/api/request-context-internals.js +11 -0
  69. package/dist/api/request-context-scopes.d.ts +14 -0
  70. package/dist/api/request-context-scopes.js +69 -0
  71. package/dist/api/request-context.d.ts +1 -40
  72. package/dist/api/request-context.js +22 -51
  73. package/dist/api/request-id-middleware.d.ts +1 -1
  74. package/dist/api/route-registrars.d.ts +2 -1
  75. package/dist/api/route-registrars.js +1 -1
  76. package/dist/api/routes.d.ts +16 -0
  77. package/dist/api/routes.js +9 -5
  78. package/dist/api/server-boot-checks.d.ts +1 -1
  79. package/dist/api/server-boot-checks.js +2 -2
  80. package/dist/api/server-event-dispatcher.d.ts +6 -1
  81. package/dist/api/server-event-dispatcher.js +3 -4
  82. package/dist/api/server-extra-routes.d.ts +1 -1
  83. package/dist/api/server-extra-routes.js +5 -1
  84. package/dist/api/server-middleware.js +3 -1
  85. package/dist/api/server-routes.d.ts +3 -2
  86. package/dist/api/server-routes.js +8 -2
  87. package/dist/api/server-wiring.js +8 -4
  88. package/dist/api/server.d.ts +2 -1
  89. package/dist/api/sse-route.d.ts +3 -1
  90. package/dist/api/sse-route.js +11 -1
  91. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  92. package/dist/api/tenant-scoped-secrets.js +13 -0
  93. package/dist/api/websocket-route.d.ts +1 -1
  94. package/dist/auth/index.d.ts +0 -1
  95. package/dist/auth/roles.d.ts +0 -5
  96. package/dist/compliance/duration-spec.d.ts +0 -1
  97. package/dist/compliance/duration-spec.js +0 -5
  98. package/dist/compliance/index.d.ts +4 -4
  99. package/dist/compliance/index.js +2 -2
  100. package/dist/compliance/profiles.d.ts +0 -15
  101. package/dist/compliance/profiles.js +0 -23
  102. package/dist/config/index.d.ts +11 -9
  103. package/dist/config/index.js +13 -1
  104. package/dist/config/internals.d.ts +9 -0
  105. package/dist/config/internals.js +1 -0
  106. package/dist/consumer-cli-internals.d.ts +4 -0
  107. package/dist/consumer-cli-internals.js +1 -0
  108. package/dist/consumer-cli.d.ts +1 -4
  109. package/dist/consumer-cli.js +5 -1
  110. package/dist/crypto/event-pii.js +1 -1
  111. package/dist/crypto/index.d.ts +8 -9
  112. package/dist/crypto/index.js +7 -8
  113. package/dist/crypto/pg-kms-adapter.d.ts +1 -0
  114. package/dist/crypto/pg-kms-adapter.js +17 -18
  115. package/dist/db/aggregate-sql.d.ts +2 -0
  116. package/dist/db/aggregate-sql.js +10 -0
  117. package/dist/db/apply-entity-event.d.ts +1 -1
  118. package/dist/db/apply-entity-event.js +15 -47
  119. package/dist/db/blind-index-cleanup.js +91 -77
  120. package/dist/db/closed-connection.js +12 -19
  121. package/dist/db/collect-table-metas.js +1 -1
  122. package/dist/db/compound-types.d.ts +1 -1
  123. package/dist/db/compound-types.js +0 -7
  124. package/dist/db/config-seed.d.ts +2 -1
  125. package/dist/db/config-seed.js +6 -1
  126. package/dist/db/connection.d.ts +7 -6
  127. package/dist/db/connection.js +43 -24
  128. package/dist/db/cross-tenant-reads.d.ts +1 -1
  129. package/dist/db/cross-tenant-reads.js +1 -1
  130. package/dist/db/dialect.d.ts +0 -5
  131. package/dist/db/dialect.js +0 -3
  132. package/dist/db/driver-row-coercion.js +4 -4
  133. package/dist/db/driver-value-preparation.js +6 -4
  134. package/dist/db/eagerload.d.ts +2 -1
  135. package/dist/db/entity-field-encryption.d.ts +1 -1
  136. package/dist/db/entity-table-meta.d.ts +1 -1
  137. package/dist/db/event-store-executor-context.d.ts +3 -1
  138. package/dist/db/event-store-executor-context.js +4 -3
  139. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  140. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  141. package/dist/db/event-store-executor-read-aggregate.js +36 -5
  142. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  143. package/dist/db/event-store-executor-read-filter.js +6 -3
  144. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  145. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  146. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  147. package/dist/db/event-store-executor-read.js +2 -2
  148. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  149. package/dist/db/event-store-executor-write-atomic.js +42 -0
  150. package/dist/db/event-store-executor-write-steps.d.ts +3 -5
  151. package/dist/db/event-store-executor-write-steps.js +0 -5
  152. package/dist/db/event-store-executor-write.js +22 -19
  153. package/dist/db/event-store-executor.d.ts +1 -1
  154. package/dist/db/event-store-executor.js +2 -1
  155. package/dist/db/executor-managed-tables.d.ts +7 -1
  156. package/dist/db/executor-managed-tables.js +12 -3
  157. package/dist/db/index.d.ts +29 -28
  158. package/dist/db/index.js +22 -20
  159. package/dist/db/known-table-names.d.ts +6 -0
  160. package/dist/db/known-table-names.js +21 -0
  161. package/dist/db/list-aggregate-labels.d.ts +1 -1
  162. package/dist/db/located-timestamp.d.ts +1 -1
  163. package/dist/db/located-timestamp.js +0 -5
  164. package/dist/db/migrate-generator.d.ts +17 -1
  165. package/dist/db/migrate-generator.js +50 -20
  166. package/dist/db/migrate-primary-key.d.ts +12 -0
  167. package/dist/db/migrate-primary-key.js +45 -0
  168. package/dist/db/migrate-rls-diff.d.ts +20 -0
  169. package/dist/db/migrate-rls-diff.js +61 -0
  170. package/dist/db/migrate-runner.js +7 -3
  171. package/dist/db/money.d.ts +1 -1
  172. package/dist/db/money.js +1 -1
  173. package/dist/db/parent-ref-clause.d.ts +2 -1
  174. package/dist/db/pg-error.d.ts +2 -0
  175. package/dist/db/pg-error.js +37 -21
  176. package/dist/db/queries/backfill-pii.js +3 -6
  177. package/dist/db/queries/database-now.js +2 -1
  178. package/dist/db/queries/ddl.d.ts +3 -0
  179. package/dist/db/queries/ddl.js +34 -1
  180. package/dist/db/queries/event-store.js +4 -2
  181. package/dist/db/queries/event-tenants.d.ts +2 -0
  182. package/dist/db/queries/event-tenants.js +17 -0
  183. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  184. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  185. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  186. package/dist/db/queries/rls-boot-catalog.js +39 -0
  187. package/dist/db/queries/rls-catalog.d.ts +6 -0
  188. package/dist/db/queries/rls-catalog.js +82 -0
  189. package/dist/db/queries/rls-scope.d.ts +3 -0
  190. package/dist/db/queries/rls-scope.js +17 -0
  191. package/dist/db/queries/rls-shape.d.ts +10 -0
  192. package/dist/db/queries/rls-shape.js +42 -0
  193. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  194. package/dist/db/queries/session-advisory-lock.js +23 -0
  195. package/dist/db/queries/shadow-swap.d.ts +1 -2
  196. package/dist/db/queries/shadow-swap.js +11 -28
  197. package/dist/db/queries/test-stack.d.ts +4 -1
  198. package/dist/db/queries/test-stack.js +83 -2
  199. package/dist/db/query.d.ts +14 -0
  200. package/dist/db/query.js +77 -48
  201. package/dist/db/reference-data.d.ts +1 -1
  202. package/dist/db/reference-data.js +20 -3
  203. package/dist/db/render-ddl.d.ts +6 -2
  204. package/dist/db/render-ddl.js +7 -7
  205. package/dist/db/render-rls-ddl.d.ts +35 -0
  206. package/dist/db/render-rls-ddl.js +127 -0
  207. package/dist/db/replay-migration-sql.d.ts +3 -1
  208. package/dist/db/replay-migration-sql.js +22 -5
  209. package/dist/db/replay-rls.d.ts +25 -0
  210. package/dist/db/replay-rls.js +156 -0
  211. package/dist/db/row-level-security-boot-check.d.ts +5 -0
  212. package/dist/db/row-level-security-boot-check.js +85 -0
  213. package/dist/db/row-level-security-connection.d.ts +3 -0
  214. package/dist/db/row-level-security-connection.js +213 -0
  215. package/dist/db/row-level-security-scope.d.ts +33 -0
  216. package/dist/db/row-level-security-scope.js +127 -0
  217. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  218. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  219. package/dist/db/sql-identifier.d.ts +1 -0
  220. package/dist/db/sql-identifier.js +3 -0
  221. package/dist/db/statement-timeout.js +2 -1
  222. package/dist/db/table-builder.d.ts +2 -1
  223. package/dist/db/table-builder.js +1 -1
  224. package/dist/db/table-info.js +1 -1
  225. package/dist/db/table-push.d.ts +11 -2
  226. package/dist/db/table-push.js +15 -2
  227. package/dist/db/tenant-db-runner.d.ts +3 -1
  228. package/dist/db/tenant-db-runner.js +4 -3
  229. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  230. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  231. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  232. package/dist/db/tenant-db-statement-runner.js +48 -0
  233. package/dist/db/tenant-db-upsert.d.ts +5 -0
  234. package/dist/db/tenant-db-upsert.js +91 -0
  235. package/dist/db/tenant-db.d.ts +17 -12
  236. package/dist/db/tenant-db.js +60 -121
  237. package/dist/db/tenant-id-filter.d.ts +3 -0
  238. package/dist/db/tenant-id-filter.js +30 -0
  239. package/dist/db/transaction-serialization.d.ts +6 -0
  240. package/dist/db/transaction-serialization.js +60 -0
  241. package/dist/derivatives/delete-stored-file.js +1 -1
  242. package/dist/derivatives/index.d.ts +2 -5
  243. package/dist/derivatives/index.js +2 -3
  244. package/dist/engine/access.d.ts +2 -1
  245. package/dist/engine/access.js +1 -1
  246. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  247. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  248. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  249. package/dist/engine/boot-validator/entity-handler.js +1 -1
  250. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  251. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  252. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  253. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  254. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  255. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  256. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  257. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  258. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
  259. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  260. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  261. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  262. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  263. package/dist/engine/boot-validator/list-table-options.js +77 -0
  264. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  265. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  266. package/dist/engine/boot-validator/nav.d.ts +3 -1
  267. package/dist/engine/boot-validator/nav.js +1 -1
  268. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  269. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  270. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  271. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  272. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  273. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  274. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  275. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  276. package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
  277. package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
  278. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  279. package/dist/engine/boot-validator/screens-lists.js +12 -2
  280. package/dist/engine/boot-validator/screens.d.ts +2 -1
  281. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  282. package/dist/engine/bridge-stub.d.ts +5 -2
  283. package/dist/engine/bridge-stub.js +39 -24
  284. package/dist/engine/build-app-schema.d.ts +2 -1
  285. package/dist/engine/build-app-schema.js +9 -1
  286. package/dist/engine/build-config-feature-schema.js +6 -1
  287. package/dist/engine/config-helpers.d.ts +2 -2
  288. package/dist/engine/config-helpers.js +0 -9
  289. package/dist/engine/constants.d.ts +0 -10
  290. package/dist/engine/constants.js +0 -8
  291. package/dist/engine/create-app.js +1 -1
  292. package/dist/engine/define-feature.d.ts +2 -1
  293. package/dist/engine/define-feature.js +5 -2
  294. package/dist/engine/define-handler.d.ts +1 -1
  295. package/dist/engine/define-step.d.ts +0 -1
  296. package/dist/engine/define-step.js +0 -3
  297. package/dist/engine/embedded-derived.d.ts +1 -1
  298. package/dist/engine/entity-handlers.d.ts +2 -1
  299. package/dist/engine/entity-handlers.js +7 -7
  300. package/dist/engine/entity-list-runtime-options.js +3 -1
  301. package/dist/engine/entity-list-searchability.d.ts +2 -1
  302. package/dist/engine/event-def.d.ts +2 -1
  303. package/dist/engine/event-helpers.d.ts +3 -1
  304. package/dist/engine/event-helpers.js +3 -3
  305. package/dist/engine/extension-names.d.ts +2 -8
  306. package/dist/engine/extension-names.js +2 -2
  307. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  308. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  309. package/dist/engine/extensions/user-data.d.ts +0 -8
  310. package/dist/engine/factories.d.ts +2 -1
  311. package/dist/engine/feature-builder-state.d.ts +9 -1
  312. package/dist/engine/feature-builder-state.js +1 -0
  313. package/dist/engine/feature-changelog.d.ts +1 -1
  314. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  315. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  316. package/dist/engine/feature-manifest.d.ts +1 -0
  317. package/dist/engine/feature-manifest.js +2 -1
  318. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  319. package/dist/engine/feature-ui-extensions.js +6 -4
  320. package/dist/engine/field-access.d.ts +3 -1
  321. package/dist/engine/field-access.js +12 -0
  322. package/dist/engine/handler-field-references.d.ts +0 -4
  323. package/dist/engine/index.d.ts +58 -55
  324. package/dist/engine/index.js +23 -28
  325. package/dist/engine/instruction-fields.d.ts +1 -1
  326. package/dist/engine/personal-data-fields.d.ts +1 -1
  327. package/dist/engine/qualified-name.d.ts +0 -1
  328. package/dist/engine/read-claim.d.ts +2 -1
  329. package/dist/engine/registry-facade.js +0 -3
  330. package/dist/engine/registry-ingest.d.ts +2 -1
  331. package/dist/engine/registry-ingest.js +1 -2
  332. package/dist/engine/registry-state.d.ts +12 -2
  333. package/dist/engine/registry-state.js +2 -3
  334. package/dist/engine/registry-validate.d.ts +3 -1
  335. package/dist/engine/registry-validate.js +7 -7
  336. package/dist/engine/run-in.d.ts +1 -1
  337. package/dist/engine/run-in.js +0 -1
  338. package/dist/engine/schema-builder.d.ts +1 -1
  339. package/dist/engine/schema-builder.js +1 -1
  340. package/dist/engine/screen-filter-ops.d.ts +2 -1
  341. package/dist/engine/screen-filter-ops.js +2 -5
  342. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  343. package/dist/engine/soft-delete-cleanup.js +4 -4
  344. package/dist/engine/state-machine.js +2 -1
  345. package/dist/engine/steps/_read-source.js +1 -1
  346. package/dist/engine/steps/aggregate-append-event.js +2 -2
  347. package/dist/engine/steps/call-feature.js +2 -2
  348. package/dist/engine/steps/mail-send.js +1 -1
  349. package/dist/engine/steps/retry.js +1 -1
  350. package/dist/engine/steps/wait-for-event.js +1 -1
  351. package/dist/engine/steps/wait.js +1 -1
  352. package/dist/engine/steps/webhook-send.js +1 -1
  353. package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
  354. package/dist/engine/template-variables.d.ts +2 -1
  355. package/dist/engine/transfer-adjacency.d.ts +1 -1
  356. package/dist/engine/types/feature.d.ts +1 -0
  357. package/dist/engine/types/index.d.ts +8 -30
  358. package/dist/engine/types/index.js +2 -10
  359. package/dist/engine/types/screen.d.ts +1 -1
  360. package/dist/engine/types/screen.js +1 -1
  361. package/dist/engine/validation.d.ts +2 -1
  362. package/dist/entrypoint/index.d.ts +9 -35
  363. package/dist/entrypoint/index.js +10 -1
  364. package/dist/entrypoint/internals.d.ts +40 -0
  365. package/dist/entrypoint/internals.js +1 -0
  366. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  367. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  368. package/dist/env/dry-run-internals.d.ts +10 -0
  369. package/dist/env/dry-run-internals.js +1 -0
  370. package/dist/env/dry-run.d.ts +1 -10
  371. package/dist/env/dry-run.js +2 -1
  372. package/dist/env/index.d.ts +1 -85
  373. package/dist/env/index.js +6 -50
  374. package/dist/env/internals.d.ts +87 -0
  375. package/dist/env/internals.js +53 -0
  376. package/dist/errors/classes.js +2 -2
  377. package/dist/errors/index.d.ts +5 -14
  378. package/dist/errors/index.js +4 -9
  379. package/dist/errors/member-resolution.js +1 -1
  380. package/dist/errors/reasons.d.ts +0 -1
  381. package/dist/errors/reasons.js +7 -7
  382. package/dist/errors/serialize.d.ts +0 -18
  383. package/dist/errors/serialize.js +0 -27
  384. package/dist/es-ops/index.d.ts +4 -4
  385. package/dist/es-ops/index.js +2 -2
  386. package/dist/es-ops/operations-schema.d.ts +1 -1
  387. package/dist/es-ops/types.d.ts +4 -5
  388. package/dist/event-store/admin-api-internals.d.ts +14 -0
  389. package/dist/event-store/admin-api-internals.js +1 -0
  390. package/dist/event-store/admin-api.d.ts +1 -14
  391. package/dist/event-store/admin-api.js +11 -6
  392. package/dist/event-store/archive.js +4 -2
  393. package/dist/event-store/errors.js +2 -2
  394. package/dist/event-store/event-store.d.ts +1 -0
  395. package/dist/event-store/event-store.js +42 -32
  396. package/dist/event-store/events-schema.js +4 -1
  397. package/dist/event-store/index.d.ts +11 -13
  398. package/dist/event-store/index.js +7 -9
  399. package/dist/event-store/provenance-append.js +1 -1
  400. package/dist/event-store/rebuild-dead-letter.js +4 -2
  401. package/dist/event-store/snapshot.js +4 -3
  402. package/dist/event-store/stream-scope.d.ts +2 -0
  403. package/dist/event-store/stream-scope.js +6 -0
  404. package/dist/event-store/upcaster-dead-letter.js +4 -2
  405. package/dist/event-store/upcaster.d.ts +2 -1
  406. package/dist/files/action-form-upload.d.ts +2 -1
  407. package/dist/files/action-form-upload.js +1 -1
  408. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  409. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  410. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  411. package/dist/files/bind-pending-file-refs.js +2 -1
  412. package/dist/files/bind-referenced-files.write.js +1 -1
  413. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  414. package/dist/files/create-file-ref-from-bytes.js +6 -3
  415. package/dist/files/create-file-ref.d.ts +6 -2
  416. package/dist/files/create-file-ref.js +13 -4
  417. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  418. package/dist/files/dispose-removed-file-refs.js +1 -1
  419. package/dist/files/feature.js +2 -2
  420. package/dist/files/file-handle.js +1 -1
  421. package/dist/files/file-routes.d.ts +3 -1
  422. package/dist/files/file-routes.js +41 -4
  423. package/dist/files/index.d.ts +11 -13
  424. package/dist/files/index.js +5 -7
  425. package/dist/files/load-save-file-refs.d.ts +2 -1
  426. package/dist/files/load-save-file-refs.js +1 -1
  427. package/dist/files/provider-resolver.d.ts +6 -4
  428. package/dist/files/provider-resolver.js +5 -5
  429. package/dist/files/record-write-check.d.ts +6 -0
  430. package/dist/files/record-write-check.js +13 -0
  431. package/dist/files/storage-tracking.js +4 -2
  432. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  433. package/dist/files/sweep-orphaned-uploads.js +1 -1
  434. package/dist/files/upload-ledger.d.ts +2 -2
  435. package/dist/files/upload-ledger.js +4 -4
  436. package/dist/i18n/index.d.ts +2 -8
  437. package/dist/i18n/index.js +1 -1
  438. package/dist/i18n/internals.d.ts +7 -0
  439. package/dist/i18n/internals.js +1 -0
  440. package/dist/i18n/required-surface-keys.d.ts +4 -1
  441. package/dist/i18n/required-surface-keys.js +7 -2
  442. package/dist/internal/row-level-security.d.ts +3 -0
  443. package/dist/internal/row-level-security.js +3 -0
  444. package/dist/internal/stack-support.d.ts +1 -1
  445. package/dist/internal/stack-support.js +1 -1
  446. package/dist/internal/testing.d.ts +1 -0
  447. package/dist/internal/testing.js +10 -6
  448. package/dist/jobs/index.d.ts +1 -1
  449. package/dist/jobs/job-append-event.d.ts +12 -0
  450. package/dist/jobs/job-append-event.js +30 -0
  451. package/dist/jobs/job-runner-context.d.ts +2 -2
  452. package/dist/jobs/job-runner-context.js +46 -16
  453. package/dist/jobs/job-runner-execution.d.ts +1 -1
  454. package/dist/jobs/job-runner-execution.js +6 -4
  455. package/dist/jobs/job-runner-gates.d.ts +1 -1
  456. package/dist/jobs/job-runner-gates.js +0 -1
  457. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  458. package/dist/jobs/job-runner-helpers.js +10 -1
  459. package/dist/jobs/job-runner-scope.d.ts +5 -2
  460. package/dist/jobs/job-runner-scope.js +6 -6
  461. package/dist/jobs/job-runner-types.d.ts +2 -1
  462. package/dist/jobs/job-runner.js +22 -6
  463. package/dist/jobs/max-per-tenant.d.ts +1 -1
  464. package/dist/logging/index.d.ts +1 -2
  465. package/dist/logging/index.js +1 -1
  466. package/dist/logging/pino-logger.js +1 -1
  467. package/dist/logging/utils.d.ts +1 -0
  468. package/dist/logging/utils.js +6 -0
  469. package/dist/migrations/index.d.ts +3 -3
  470. package/dist/migrations/index.js +3 -3
  471. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  472. package/dist/migrations/pending-rebuilds.js +1 -1
  473. package/dist/migrations/pii-event-backfill.js +4 -1
  474. package/dist/observability/escape-hatch-report.d.ts +2 -1
  475. package/dist/observability/escape-hatch-report.js +9 -2
  476. package/dist/observability/index.d.ts +7 -15
  477. package/dist/observability/index.js +4 -12
  478. package/dist/observability/metric-validator.js +1 -1
  479. package/dist/observability/metrics-handle.d.ts +0 -1
  480. package/dist/observability/metrics-handle.js +2 -15
  481. package/dist/observability/recording-tracer.d.ts +1 -2
  482. package/dist/observability/recording-tracer.js +0 -6
  483. package/dist/observability/sensitive-filter.d.ts +0 -2
  484. package/dist/observability/sensitive-filter.js +0 -29
  485. package/dist/pipeline/active-membership.d.ts +2 -1
  486. package/dist/pipeline/active-membership.js +6 -2
  487. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  488. package/dist/pipeline/after-rollback-sink.js +32 -0
  489. package/dist/pipeline/append-event-core.d.ts +2 -1
  490. package/dist/pipeline/append-event-core.js +2 -2
  491. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  492. package/dist/pipeline/attach-outside-transaction.js +13 -0
  493. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  494. package/dist/pipeline/cascade-handler.d.ts +2 -1
  495. package/dist/pipeline/cascade-handler.js +3 -2
  496. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  497. package/dist/pipeline/config-accessor-factory.js +1 -1
  498. package/dist/pipeline/context-services.d.ts +56 -0
  499. package/dist/pipeline/context-services.js +73 -0
  500. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  501. package/dist/pipeline/dispatch-batch.js +39 -19
  502. package/dist/pipeline/dispatch-query.js +5 -4
  503. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  504. package/dist/pipeline/dispatch-scope.js +27 -0
  505. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  506. package/dist/pipeline/dispatch-shared.js +75 -194
  507. package/dist/pipeline/dispatch-stream.js +8 -4
  508. package/dist/pipeline/dispatch-write.d.ts +2 -1
  509. package/dist/pipeline/dispatch-write.js +10 -8
  510. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  511. package/dist/pipeline/dispatcher-utils.js +8 -2
  512. package/dist/pipeline/dispatcher.d.ts +3 -2
  513. package/dist/pipeline/dispatcher.js +4 -3
  514. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  515. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  516. package/dist/pipeline/event-dispatcher-delivery.js +7 -3
  517. package/dist/pipeline/event-dispatcher.d.ts +3 -2
  518. package/dist/pipeline/event-dispatcher.js +13 -12
  519. package/dist/pipeline/event-retention.js +59 -56
  520. package/dist/pipeline/handler-access-error.js +2 -1
  521. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  522. package/dist/pipeline/handler-context-auth.js +7 -4
  523. package/dist/pipeline/handler-context-config.d.ts +2 -5
  524. package/dist/pipeline/handler-context-config.js +2 -2
  525. package/dist/pipeline/handler-context-db.d.ts +32 -7
  526. package/dist/pipeline/handler-context-db.js +26 -17
  527. package/dist/pipeline/handler-context-dispatch.d.ts +14 -6
  528. package/dist/pipeline/handler-context-dispatch.js +18 -5
  529. package/dist/pipeline/handler-context-events.d.ts +22 -38
  530. package/dist/pipeline/handler-context-events.js +42 -35
  531. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  532. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  533. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  534. package/dist/pipeline/handler-context-notify.js +1 -1
  535. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  536. package/dist/pipeline/handler-context-observability.js +7 -5
  537. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  538. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  539. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  540. package/dist/pipeline/handler-context-scope.js +18 -20
  541. package/dist/pipeline/index.d.ts +9 -21
  542. package/dist/pipeline/index.js +5 -7
  543. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  544. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  545. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  546. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  547. package/dist/pipeline/member-read-only-transaction.js +11 -3
  548. package/dist/pipeline/member-reader.d.ts +1 -1
  549. package/dist/pipeline/member-reader.js +2 -2
  550. package/dist/pipeline/msp-rebuild.js +5 -3
  551. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  552. package/dist/pipeline/notify-scope.d.ts +2 -1
  553. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  554. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  555. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  556. package/dist/pipeline/projection-rebuild.js +12 -5
  557. package/dist/pipeline/projection-state.d.ts +0 -6
  558. package/dist/pipeline/projection-state.js +0 -5
  559. package/dist/pipeline/projections-runner.d.ts +2 -1
  560. package/dist/pipeline/projections-runner.js +10 -6
  561. package/dist/pipeline/system-hooks.d.ts +6 -2
  562. package/dist/pipeline/system-hooks.js +61 -10
  563. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  564. package/dist/pipeline/system-identity-switch.js +51 -36
  565. package/dist/pipeline/typed-append-event.d.ts +2 -0
  566. package/dist/pipeline/typed-append-event.js +4 -0
  567. package/dist/pipeline/write-origin.js +2 -2
  568. package/dist/pipeline/write-result-masking.d.ts +1 -1
  569. package/dist/pipeline/write-result-masking.js +13 -10
  570. package/dist/random/index.d.ts +1 -2
  571. package/dist/random/index.js +1 -2
  572. package/dist/rate-limit/bucket.d.ts +2 -1
  573. package/dist/rate-limit/middleware.js +2 -1
  574. package/dist/redis/index.d.ts +3 -4
  575. package/dist/redis/index.js +2 -2
  576. package/dist/schema-cli/apply-command.js +5 -2
  577. package/dist/schema-cli/baseline-command.js +7 -2
  578. package/dist/schema-cli/generate-command.js +7 -9
  579. package/dist/schema-cli/shared.d.ts +4 -0
  580. package/dist/schema-cli/shared.js +21 -2
  581. package/dist/schema-cli/status-command.js +8 -2
  582. package/dist/schema-cli/validate-command.js +52 -4
  583. package/dist/schema-cli.d.ts +0 -1
  584. package/dist/search/configure-tenant-index.d.ts +1 -3
  585. package/dist/search/configure-tenant-index.js +0 -4
  586. package/dist/search/index.d.ts +1 -4
  587. package/dist/search/index.js +0 -2
  588. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  589. package/dist/search/meilisearch-adapter-internals.js +9 -0
  590. package/dist/search/meilisearch-adapter.d.ts +1 -8
  591. package/dist/search/meilisearch-adapter.js +6 -7
  592. package/dist/search/meilisearch-peer.d.ts +2 -0
  593. package/dist/search/meilisearch-peer.js +5 -0
  594. package/dist/search/reindex-entity.js +107 -91
  595. package/dist/secrets/index.d.ts +3 -4
  596. package/dist/secrets/index.js +2 -3
  597. package/dist/seeding/index.d.ts +2 -2
  598. package/dist/seeding/index.js +1 -2
  599. package/dist/time/index.d.ts +2 -2
  600. package/dist/time/index.js +1 -1
  601. package/dist/time/tz-context.d.ts +0 -5
  602. package/dist/time/tz-context.js +0 -9
  603. package/dist/ui-types/index.d.ts +8 -11
  604. package/dist/ui-types/index.js +3 -3
  605. package/dist/upgrade-changelog.d.ts +3 -0
  606. package/dist/upgrade-changelog.js +18 -0
  607. package/dist/upgrade-cli-internals.d.ts +8 -0
  608. package/dist/upgrade-cli-internals.js +63 -0
  609. package/dist/upgrade-cli.d.ts +1 -18
  610. package/dist/upgrade-cli.js +29 -137
  611. package/dist/upgrade-marker-parse.d.ts +32 -0
  612. package/dist/upgrade-marker-parse.js +73 -0
  613. package/dist/utils/import-optional-peer.d.ts +6 -0
  614. package/dist/utils/import-optional-peer.js +19 -0
  615. package/dist/utils/index.d.ts +1 -4
  616. package/dist/utils/index.js +1 -4
  617. package/package.json +27 -20
  618. package/src/changes.json +451 -0
  619. package/dist/crypto/request-kms-cache.d.ts +0 -8
  620. package/dist/crypto/request-kms-cache.js +0 -21
  621. package/dist/engine/codemod/index.d.ts +0 -2
  622. package/dist/engine/codemod/index.js +0 -1
  623. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  624. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  625. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  626. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  627. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  628. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  629. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  630. package/dist/engine/feature-ast/extractors/events.js +0 -275
  631. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  632. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  633. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  634. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  635. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  636. package/dist/engine/feature-ast/extractors/index.js +0 -13
  637. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  638. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  639. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  640. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  641. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  642. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  643. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -10
  644. package/dist/engine/feature-ast/extractors/round1.js +0 -81
  645. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  646. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  647. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  648. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  649. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  650. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  651. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  652. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  653. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  654. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  655. package/dist/engine/feature-ast/index.d.ts +0 -16
  656. package/dist/engine/feature-ast/index.js +0 -10
  657. package/dist/engine/feature-ast/parse.d.ts +0 -31
  658. package/dist/engine/feature-ast/parse.js +0 -483
  659. package/dist/engine/feature-ast/patch.d.ts +0 -210
  660. package/dist/engine/feature-ast/patch.js +0 -610
  661. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  662. package/dist/engine/feature-ast/patcher.js +0 -281
  663. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1476
  664. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
  665. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  666. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
  667. package/dist/engine/feature-ast/patterns.d.ts +0 -318
  668. package/dist/engine/feature-ast/patterns.js +0 -106
  669. package/dist/engine/feature-ast/render.d.ts +0 -47
  670. package/dist/engine/feature-ast/render.js +0 -662
  671. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  672. package/dist/engine/feature-ast/source-location.js +0 -27
  673. package/dist/engine/pattern-library/index.d.ts +0 -2
  674. package/dist/engine/pattern-library/index.js +0 -3
  675. package/dist/engine/pattern-library/library.d.ts +0 -14
  676. package/dist/engine/pattern-library/library.js +0 -93
  677. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  678. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  679. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  680. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  681. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  682. package/dist/engine/pattern-library/shared-fields.js +0 -88
  683. package/dist/engine/pattern-library/static-schemas.d.ts +0 -20
  684. package/dist/engine/pattern-library/static-schemas.js +0 -478
  685. package/dist/engine/pattern-library/types.d.ts +0 -158
  686. package/dist/engine/pattern-library/types.js +0 -36
  687. package/dist/engine/provider-plugin-context.d.ts +0 -3
  688. package/dist/engine/provider-plugin-context.js +0 -28
  689. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  690. package/dist/engine/resolve-config-or-param.js +0 -76
  691. package/src/scripts/codemod/README.md +0 -187
  692. package/src/scripts/codemod/codemod-support.ts +0 -334
  693. package/src/scripts/codemod/collect-source-files.ts +0 -48
  694. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  695. package/src/scripts/codemod/db-factory.ts +0 -810
  696. package/src/scripts/codemod/feature-factory.ts +0 -429
  697. package/src/scripts/codemod/feature-layout.ts +0 -424
  698. package/src/scripts/codemod/import-extensions.ts +0 -118
  699. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  700. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  701. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  702. package/src/scripts/codemod/object-form.ts +0 -746
  703. package/src/scripts/codemod/package-merge.ts +0 -299
  704. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  705. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  706. package/src/scripts/codemod/s3-imports.ts +0 -236
  707. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  708. package/src/scripts/codemod/testing-injection.ts +0 -215
  709. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  710. package/src/scripts/codemod/testing-move.ts +0 -542
  711. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -1,483 +0,0 @@
1
- // parseFeatureFile — entry-point for AST pattern detection. Reads a
2
- // `defineFeature.ts` file, walks the `setup(r => { ... })` callback,
3
- // and emits one FeaturePattern per recognised `r.*` call.
4
- //
5
- // **Pipeline position:**
6
- //
7
- // ┌──────────────────┐ parseFeatureFile ┌─────────────────────┐
8
- // │ feature-file.ts │ ──────────────────────► │ ParseResult │
9
- // │ (defineFeature │ │ - featureName │
10
- // │ with r.* calls) │ │ - patterns: FP[] │
11
- // └──────────────────┘ │ - errors: PE[] │
12
- // └─────────────────────┘
13
- //
14
- // **What is NOT extracted:**
15
- // - Imports, helper functions, local consts between the `r.*` calls.
16
- // Those stay in the file buffer and survive every patch unchanged.
17
- // - Top-level code outside `defineFeature(...)`. Designer/AI treat
18
- // such files as "not a feature file".
19
- //
20
- // **Skeleton status:** interface fixed, extractors are TODO.
21
- // Per-pattern extractors fill in iteratively — each iteration adds
22
- // one extractor + a focused test.
23
- import { Project, SyntaxKind } from "ts-morph";
24
- import { extractAiClassify, extractAiExtract, extractAiGenerate, extractAuthClaims, extractBootCheck, extractClaimKey, extractConfig, extractDefineEvent, extractDescribe, extractEntity, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractHook, extractHttpRoute, extractJob, extractMetric, extractMultiStreamProjection, extractNav, extractNotification, extractOptionalRequires, extractProjection, extractQueryHandler, extractReadsConfig, extractReferenceData, extractRelation, extractRequires, extractScreen, extractSecret, extractSecretNamespace, extractStoreTable, extractStreamHandler, extractSystemScope, extractToggleable, extractTranslations, extractTreeActions, extractUiHints, extractUseExtension, extractUsesApi, extractWorkspace, extractWriteHandler, findFunctionLiteral, findImportBindingForLocalName, readObjectPropertyInitializer, resolveModuleFile, resolveSameFileObjectLiteral, } from "./extractors/index.js";
25
- import { sourceLocationFromNode } from "./source-location.js";
26
- /**
27
- * Parse the given feature file and return all recognised r.* calls
28
- * as a FeaturePattern list.
29
- *
30
- * Does NOT throw on TypeScript errors — the visitor works on the syntax
31
- * tree, not on the type checker. Files with type errors can still be
32
- * parsed structurally (Designer keeps showing them, AI can suggest fixes).
33
- *
34
- * Throws on filesystem / parse errors that ts-morph cannot recover from.
35
- */
36
- export function parseFeatureFile(filePath) {
37
- const project = new Project({
38
- // Skip tsconfig file discovery: we only ever load this single file.
39
- // Without these flags ts-morph would resolve the whole tsconfig
40
- // tree, which is expensive on large repos and unnecessary for
41
- // structural analysis.
42
- skipAddingFilesFromTsConfig: true,
43
- skipFileDependencyResolution: true,
44
- });
45
- const sourceFile = project.addSourceFileAtPath(filePath);
46
- return parseSourceFile(sourceFile);
47
- }
48
- /**
49
- * Same as parseFeatureFile, but for SourceFiles already loaded by the
50
- * caller. Useful for tests + the Designer (which keeps its own Project
51
- * instance and avoids re-IO per parse).
52
- */
53
- export function parseSourceFile(sourceFile) {
54
- const setupCall = findDefineFeatureCall(sourceFile);
55
- if (!setupCall) {
56
- return { featureName: undefined, patterns: [], errors: [] };
57
- }
58
- const featureName = extractFeatureName(setupCall);
59
- const setupCallback = extractSetupCallback(setupCall);
60
- if (!setupCallback) {
61
- return { featureName, patterns: [], errors: [] };
62
- }
63
- const registrarParamName = extractRegistrarParamName(setupCallback);
64
- if (!registrarParamName) {
65
- return { featureName, patterns: [], errors: [] };
66
- }
67
- const patterns = [];
68
- const errors = [];
69
- walkSetupCallback(setupCallback.getBody(), registrarParamName, sourceFile, patterns, errors);
70
- walkAiStepCalls(setupCallback.getBody(), registrarParamName, sourceFile, patterns, errors);
71
- // Tie-break on the path relative to the entry file's directory so cross-file
72
- // registrar wrappers don't interleave by foreign line numbers alone, without
73
- // the order depending on where the repo is checked out (worktrees).
74
- const parseRoot = sourceFile.getDirectoryPath();
75
- patterns.sort((a, b) => {
76
- const fileCmp = relativePosixPath(parseRoot, a.source.file).localeCompare(relativePosixPath(parseRoot, b.source.file));
77
- if (fileCmp !== 0)
78
- return fileCmp;
79
- return a.source.start.line - b.source.start.line;
80
- });
81
- return { featureName, patterns, errors };
82
- }
83
- // node:path is avoided: the Designer runs this against an in-memory file
84
- // system outside Node. ts-morph paths are always posix-style.
85
- export function relativePosixPath(fromDirectory, filePath) {
86
- const fromSegments = fromDirectory.split("/").filter(Boolean);
87
- const fileSegments = filePath.split("/").filter(Boolean);
88
- let common = 0;
89
- while (common < fromSegments.length &&
90
- common < fileSegments.length - 1 &&
91
- fromSegments[common] === fileSegments[common]) {
92
- common += 1;
93
- }
94
- return [...fromSegments.slice(common).map(() => ".."), ...fileSegments.slice(common)].join("/");
95
- }
96
- // =============================================================================
97
- // Internal — locate defineFeature + setup callback
98
- // =============================================================================
99
- /**
100
- * Find the `defineFeature(name, setup)` call in the source file.
101
- * Convention: each feature file invokes `defineFeature` exactly once
102
- * at top level. If multiple calls exist (unusual outside of test
103
- * helpers) we take the first.
104
- */
105
- function findDefineFeatureCall(sourceFile) {
106
- for (const stmt of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
107
- const expr = stmt.getExpression();
108
- if (expr.getText() === "defineFeature") {
109
- return stmt;
110
- }
111
- }
112
- return undefined;
113
- }
114
- /**
115
- * Read the feature name from the first argument of `defineFeature(...)`.
116
- * Returns undefined when the argument is not a string literal (e.g.
117
- * dynamic name from a const). Designer can still load the file but the
118
- * AI generator will never produce such a setup.
119
- */
120
- function extractFeatureName(call) {
121
- const arg = call.getArguments()[0];
122
- if (!arg)
123
- return undefined;
124
- const literal = arg.asKind(SyntaxKind.StringLiteral);
125
- if (!literal)
126
- return undefined;
127
- return literal.getLiteralValue();
128
- }
129
- /**
130
- * Read the `setup` callback (second argument) from `defineFeature(...)`.
131
- * We only support the arrow-function form here — function expressions
132
- * have not turned up in any sample so far. If a future feature needs
133
- * them, this is the single hook to extend.
134
- */
135
- function extractSetupCallback(call) {
136
- const arg = call.getArguments()[1];
137
- if (!arg)
138
- return undefined;
139
- return arg.asKind(SyntaxKind.ArrowFunction);
140
- }
141
- /**
142
- * Read the parameter name of the setup callback's first parameter.
143
- * Idiomatic feature files call it `r`, but `(registrar) => { ... }` or
144
- * `(reg) => { ... }` are equally legal — the visitor must follow the
145
- * author's choice or it would silently miss every call.
146
- *
147
- * Returns undefined when the callback takes no parameter at all (a
148
- * feature that does nothing — empty patterns list, no error).
149
- */
150
- function extractRegistrarParamName(setup) {
151
- const param = setup.getParameters()[0];
152
- if (!param)
153
- return undefined;
154
- return param.getName();
155
- }
156
- // =============================================================================
157
- // Internal — walk + dispatch
158
- // =============================================================================
159
- /**
160
- * Walk the body of the setup callback and route every `<param>.<method>(...)`
161
- * call to the matching extractor. Helper functions / local variables /
162
- * imports are ignored.
163
- *
164
- * We rely on `getDescendantsOfKind` rather than walking only direct
165
- * children: the `r.*` API is always called on the registrar variable,
166
- * which the closure rules keep scoped to the setup callback. Nested
167
- * calls inside a writeHandler closure would not see `r` and therefore
168
- * cannot pose as feature-level patterns — collisions are
169
- * structurally impossible.
170
- */
171
- function walkSetupCallback(body, registrarParamName, sourceFile, patterns, errors, visitedWrapperDecls = new Set()) {
172
- for (const call of body.getDescendantsOfKind(SyntaxKind.CallExpression)) {
173
- const methodName = extractRegistrarMethodName(call, registrarParamName);
174
- if (methodName) {
175
- const result = dispatchExtractor(methodName, call, sourceFile);
176
- if (result.kind === "pattern") {
177
- patterns.push(result.pattern);
178
- }
179
- else {
180
- errors.push(result.error);
181
- }
182
- continue;
183
- }
184
- // Not a direct `<registrarParam>.<method>(...)` call. Check whether it's
185
- // a registrar-wrapper call — a function that receives the registrar as
186
- // a bare argument, e.g. `registerShowPonyScreens(r)`. Such wrappers are
187
- // invisible to a receiver-shape match, so we resolve the callee (same
188
- // file, or the declaring file of a named import) and recurse
189
- // into its body with its own parameter name for the registrar slot.
190
- const wrapper = resolveRegistrarWrapperCall(call, registrarParamName);
191
- if (!wrapper)
192
- continue; // Free function call unrelated to the registrar — ignore.
193
- if (visitedWrapperDecls.has(wrapper.declNode))
194
- continue; // Cycle guard.
195
- visitedWrapperDecls.add(wrapper.declNode);
196
- // wrapper.sourceFile, not the outer `sourceFile` param: a cross-file
197
- // wrapper's body lives in a different file, and sourceLocationFromNode
198
- // uses whichever SourceFile it's given for both the `file` path and
199
- // the line/column table — passing the wrong one silently corrupts
200
- // both for every pattern found inside the wrapper.
201
- walkSetupCallback(wrapper.body, wrapper.paramName, wrapper.sourceFile, patterns, errors, visitedWrapperDecls);
202
- }
203
- }
204
- /**
205
- * Resolves a bare call like `registerShowPonyScreens(r)` to the callee's
206
- * body + its own parameter name for the registrar slot. The callee may be
207
- * declared in the same file, or imported by name from another file —
208
- * resolved syntactically via resolveModuleFile, which only works against a
209
- * real-filesystem Project; the in-memory Designer Project has no files to
210
- * resolve against and returns undefined there, same as any other
211
- * unresolvable reference. Does not follow re-exports in the target file — a
212
- * wrapper function is expected to be declared directly in the module it's
213
- * imported from.
214
- */
215
- function resolveRegistrarWrapperCall(call, registrarParamName) {
216
- const callee = call.getExpression().asKind(SyntaxKind.Identifier);
217
- if (!callee)
218
- return undefined;
219
- const args = call.getArguments();
220
- const argIndex = args.findIndex((arg) => arg.getText() === registrarParamName);
221
- if (argIndex === -1)
222
- return undefined; // Registrar not passed to this call.
223
- const callSourceFile = call.getSourceFile();
224
- const name = callee.getText();
225
- const local = resolveWrapperDeclarationInFile(callSourceFile, name, argIndex);
226
- if (local)
227
- return { ...local, sourceFile: callSourceFile };
228
- const binding = findImportBindingForLocalName(callSourceFile, name);
229
- if (!binding)
230
- return undefined;
231
- const targetFile = resolveModuleFile(callSourceFile, binding.moduleSpecifier);
232
- if (!targetFile)
233
- return undefined; // Unresolvable: in-memory project, external package, or missing file.
234
- const imported = resolveWrapperDeclarationInFile(targetFile, binding.importedName, argIndex);
235
- return imported ? { ...imported, sourceFile: targetFile } : undefined;
236
- }
237
- function resolveWrapperDeclarationInFile(sourceFile, name, argIndex) {
238
- const fnDecl = sourceFile.getFunction(name);
239
- if (fnDecl) {
240
- const param = fnDecl.getParameters()[argIndex];
241
- const body = fnDecl.getBody();
242
- if (!param || !body)
243
- return undefined;
244
- return { body, paramName: param.getName(), declNode: fnDecl };
245
- }
246
- const varDecl = sourceFile.getVariableDeclaration(name);
247
- const init = varDecl?.getInitializer();
248
- const literal = init ? findFunctionLiteral(init) : undefined;
249
- const fnLiteral = literal?.asKind(SyntaxKind.ArrowFunction) ?? literal?.asKind(SyntaxKind.FunctionExpression);
250
- if (fnLiteral) {
251
- const param = fnLiteral.getParameters()[argIndex];
252
- if (!param)
253
- return undefined;
254
- return { body: fnLiteral.getBody(), paramName: param.getName(), declNode: fnLiteral };
255
- }
256
- return undefined;
257
- }
258
- /**
259
- * Returns the method name when the call has the form
260
- * `<registrarParamName>.<method>(...)`, otherwise undefined.
261
- *
262
- * Reads the property-access expression on the call's left-hand side
263
- * and matches the receiver against the captured parameter name. Any
264
- * other shape (free function call, method call on something else)
265
- * returns undefined and is skipped by the walker.
266
- */
267
- function extractRegistrarMethodName(call, registrarParamName) {
268
- const expr = call.getExpression();
269
- const propAccess = expr.asKind(SyntaxKind.PropertyAccessExpression);
270
- if (!propAccess)
271
- return undefined;
272
- const receiver = propAccess.getExpression();
273
- if (receiver.getText() !== registrarParamName)
274
- return undefined;
275
- return propAccess.getName();
276
- }
277
- function resolveStepsArrayRoot(stepsInit) {
278
- const directArray = stepsInit.asKind(SyntaxKind.ArrayLiteralExpression);
279
- if (directArray)
280
- return directArray;
281
- const pipelineCall = stepsInit.asKind(SyntaxKind.CallExpression);
282
- if (pipelineCall?.getExpression().getText() !== "stepsPipeline") {
283
- return undefined;
284
- }
285
- const closureArg = pipelineCall.getArguments()[0];
286
- if (!closureArg)
287
- return undefined;
288
- const fn = findFunctionLiteral(closureArg);
289
- if (!fn)
290
- return undefined;
291
- const fnBody = fn.asKind(SyntaxKind.ArrowFunction)?.getBody() ??
292
- fn.asKind(SyntaxKind.FunctionExpression)?.getBody();
293
- const exprBody = fnBody?.asKind(SyntaxKind.ArrayLiteralExpression);
294
- if (exprBody)
295
- return exprBody;
296
- if (fnBody?.isKind(SyntaxKind.Block)) {
297
- for (const stmt of fnBody.getStatements()) {
298
- const ret = stmt.asKind(SyntaxKind.ReturnStatement);
299
- const retArray = ret?.getExpression()?.asKind(SyntaxKind.ArrayLiteralExpression);
300
- if (retArray)
301
- return retArray;
302
- }
303
- }
304
- return undefined;
305
- }
306
- function collectWorkflowStepArrayRoots(body) {
307
- const roots = [];
308
- for (const call of body.getDescendantsOfKind(SyntaxKind.CallExpression)) {
309
- if (call.getExpression().getText() !== "defineWorkflow")
310
- continue;
311
- const obj = resolveSameFileObjectLiteral(call.getArguments()[0] ?? call);
312
- if (!obj)
313
- continue;
314
- const stepsInit = readObjectPropertyInitializer(obj, "steps");
315
- if (!stepsInit)
316
- continue;
317
- const arrayRoot = resolveStepsArrayRoot(stepsInit);
318
- if (arrayRoot)
319
- roots.push(arrayRoot);
320
- }
321
- return roots;
322
- }
323
- function walkAiStepCallsInNode(node, sourceFile, patterns, errors) {
324
- for (const call of node.getDescendantsOfKind(SyntaxKind.CallExpression)) {
325
- const callee = call.getExpression().getText();
326
- switch (callee) {
327
- case "aiGenerateStep": {
328
- const result = extractAiGenerate(call, sourceFile);
329
- if (result.kind === "pattern")
330
- patterns.push(result.pattern);
331
- else
332
- errors.push(result.error);
333
- break;
334
- }
335
- case "aiExtractStep": {
336
- const result = extractAiExtract(call, sourceFile);
337
- if (result.kind === "pattern")
338
- patterns.push(result.pattern);
339
- else
340
- errors.push(result.error);
341
- break;
342
- }
343
- case "aiClassifyStep": {
344
- const result = extractAiClassify(call, sourceFile);
345
- if (result.kind === "pattern")
346
- patterns.push(result.pattern);
347
- else
348
- errors.push(result.error);
349
- break;
350
- }
351
- default:
352
- break;
353
- }
354
- }
355
- }
356
- function walkAiStepCalls(body, registrarParamName, sourceFile, patterns, errors, visitedWrapperDecls = new Set()) {
357
- for (const arrayRoot of collectWorkflowStepArrayRoots(body)) {
358
- walkAiStepCallsInNode(arrayRoot, sourceFile, patterns, errors);
359
- }
360
- for (const call of body.getDescendantsOfKind(SyntaxKind.CallExpression)) {
361
- const wrapper = resolveRegistrarWrapperCall(call, registrarParamName);
362
- if (!wrapper)
363
- continue;
364
- if (visitedWrapperDecls.has(wrapper.declNode))
365
- continue;
366
- visitedWrapperDecls.add(wrapper.declNode);
367
- walkAiStepCalls(wrapper.body, wrapper.paramName, wrapper.sourceFile, patterns, errors, visitedWrapperDecls);
368
- }
369
- }
370
- // =============================================================================
371
- // Internal — pattern extractors
372
- // =============================================================================
373
- /**
374
- * Route an `<r>.<method>(...)` call to its concrete extractor. New
375
- * r.* APIs → new case + new extractor + new pattern type in patterns.ts.
376
- * The discriminated union forces consumers (Designer, AI patcher) to
377
- * commit to the new kind via compile errors.
378
- *
379
- * Skeleton: every recognised method currently returns an UnknownPattern
380
- * with the right method name. Extractors replace the cases with concrete
381
- * implementations one at a time.
382
- */
383
- function dispatchExtractor(methodName, call, sourceFile) {
384
- switch (methodName) {
385
- // Simplest static patterns
386
- case "requires":
387
- return extractRequires(call, sourceFile);
388
- case "optionalRequires":
389
- return extractOptionalRequires(call, sourceFile);
390
- case "readsConfig":
391
- return extractReadsConfig(call, sourceFile);
392
- case "systemScope":
393
- return extractSystemScope(call, sourceFile);
394
- case "toggleable":
395
- return extractToggleable(call, sourceFile);
396
- case "describe":
397
- return extractDescribe(call, sourceFile);
398
- case "uiHints":
399
- return extractUiHints(call, sourceFile);
400
- // Object-literal-based static patterns
401
- case "entity":
402
- return extractEntity(call, sourceFile);
403
- case "relation":
404
- return extractRelation(call, sourceFile);
405
- case "nav":
406
- return extractNav(call, sourceFile);
407
- case "workspace":
408
- return extractWorkspace(call, sourceFile);
409
- // Complex static patterns
410
- case "config":
411
- return extractConfig(call, sourceFile);
412
- case "translations":
413
- return extractTranslations(call, sourceFile);
414
- case "metric":
415
- return extractMetric(call, sourceFile);
416
- case "secret":
417
- return extractSecret(call, sourceFile);
418
- case "secretNamespace":
419
- return extractSecretNamespace(call, sourceFile);
420
- case "claimKey":
421
- return extractClaimKey(call, sourceFile);
422
- case "referenceData":
423
- return extractReferenceData(call, sourceFile);
424
- case "useExtension":
425
- return extractUseExtension(call, sourceFile);
426
- // Mixed (header + body) patterns
427
- case "hook":
428
- return extractHook(call, sourceFile);
429
- case "authClaims":
430
- return extractAuthClaims(call, sourceFile);
431
- case "writeHandler":
432
- return extractWriteHandler(call, sourceFile);
433
- case "queryHandler":
434
- return extractQueryHandler(call, sourceFile);
435
- case "streamHandler":
436
- return extractStreamHandler(call, sourceFile);
437
- case "job":
438
- return extractJob(call, sourceFile);
439
- case "httpRoute":
440
- return extractHttpRoute(call, sourceFile);
441
- case "defineEvent":
442
- return extractDefineEvent(call, sourceFile);
443
- case "notification":
444
- return extractNotification(call, sourceFile);
445
- case "projection":
446
- return extractProjection(call, sourceFile);
447
- case "multiStreamProjection":
448
- return extractMultiStreamProjection(call, sourceFile);
449
- case "screen":
450
- return extractScreen(call, sourceFile);
451
- // Opaque patterns
452
- case "extendsRegistrar":
453
- return extractExtendsRegistrar(call, sourceFile);
454
- case "usesApi":
455
- return extractUsesApi(call, sourceFile);
456
- case "exposesApi":
457
- return extractExposesApi(call, sourceFile);
458
- case "storeTable":
459
- return extractStoreTable(call, sourceFile);
460
- case "bootCheck":
461
- return extractBootCheck(call, sourceFile);
462
- // Tree-Actions pattern
463
- case "treeActions":
464
- return extractTreeActions(call, sourceFile);
465
- // Env-schema contract (opaque, Zod-expression argument)
466
- case "envSchema":
467
- return extractEnvSchema(call, sourceFile);
468
- // Unknown method — UnknownPattern signal so Designer/AI surface it
469
- // as "custom call" without losing the source location.
470
- default:
471
- return {
472
- kind: "pattern",
473
- pattern: makeUnknownPattern(methodName, call, sourceFile),
474
- };
475
- }
476
- }
477
- function makeUnknownPattern(methodName, call, sourceFile) {
478
- return {
479
- kind: "unknown",
480
- methodName,
481
- source: sourceLocationFromNode(call, sourceFile),
482
- };
483
- }
@@ -1,210 +0,0 @@
1
- import { type SourceFile } from "ts-morph";
2
- import type { FeaturePattern, QueryHandlerPattern, StreamHandlerPattern, WriteHandlerPattern } from "./patterns.ts";
3
- /**
4
- * Identifier used by replace/remove. Discriminated union: each pattern
5
- * kind names the property the patcher must match against. Adding a new
6
- * pattern kind requires a new entry here so the type system forces the
7
- * call-site to think about identity (or fall through to "first call of
8
- * this kind" via the singleton helpers below).
9
- */
10
- export type PatternId = {
11
- readonly kind: "entity";
12
- readonly entityName: string;
13
- } | {
14
- readonly kind: "relation";
15
- readonly entityName: string;
16
- readonly relationName: string;
17
- } | {
18
- readonly kind: "nav";
19
- readonly id: string;
20
- } | {
21
- readonly kind: "workspace";
22
- readonly id: string;
23
- } | {
24
- readonly kind: "screen";
25
- readonly id: string;
26
- } | {
27
- readonly kind: "writeHandler";
28
- readonly handlerName: string;
29
- } | {
30
- readonly kind: "queryHandler";
31
- readonly handlerName: string;
32
- } | {
33
- readonly kind: "streamHandler";
34
- readonly handlerName: string;
35
- } | {
36
- readonly kind: "hook";
37
- readonly hookType: string;
38
- readonly target: string | {
39
- readonly allOf: string;
40
- };
41
- } | {
42
- readonly kind: "metric";
43
- readonly shortName: string;
44
- } | {
45
- readonly kind: "secret";
46
- readonly shortName: string;
47
- } | {
48
- readonly kind: "secretNamespace";
49
- readonly shortName: string;
50
- } | {
51
- readonly kind: "claimKey";
52
- readonly shortName: string;
53
- } | {
54
- readonly kind: "referenceData";
55
- readonly entityName: string;
56
- } | {
57
- readonly kind: "useExtension";
58
- readonly extensionName: string;
59
- readonly entityName: string;
60
- } | {
61
- readonly kind: "job";
62
- readonly jobName: string;
63
- } | {
64
- readonly kind: "notification";
65
- readonly notificationName: string;
66
- } | {
67
- readonly kind: "httpRoute";
68
- readonly method: string;
69
- readonly path: string;
70
- } | {
71
- readonly kind: "projection";
72
- readonly name: string;
73
- } | {
74
- readonly kind: "multiStreamProjection";
75
- readonly name: string;
76
- } | {
77
- readonly kind: "defineEvent";
78
- readonly eventName: string;
79
- } | {
80
- readonly kind: "extendsRegistrar";
81
- readonly extensionName: string;
82
- } | {
83
- readonly kind: "ai.generate";
84
- readonly stepKey: string;
85
- } | {
86
- readonly kind: "ai.extract";
87
- readonly stepKey: string;
88
- } | {
89
- readonly kind: "ai.classify";
90
- readonly stepKey: string;
91
- } | {
92
- readonly kind: "requires";
93
- } | {
94
- readonly kind: "optionalRequires";
95
- } | {
96
- readonly kind: "readsConfig";
97
- } | {
98
- readonly kind: "systemScope";
99
- } | {
100
- readonly kind: "toggleable";
101
- } | {
102
- readonly kind: "describe";
103
- } | {
104
- readonly kind: "uiHints";
105
- } | {
106
- readonly kind: "config";
107
- } | {
108
- readonly kind: "translations";
109
- } | {
110
- readonly kind: "authClaims";
111
- } | {
112
- readonly kind: "treeActions";
113
- };
114
- export type WriteHandlerHeaderKey = Exclude<keyof WriteHandlerPattern, "kind" | "source" | "handlerName" | "schemaSource" | "handlerBody">;
115
- export type QueryHandlerHeaderKey = Exclude<keyof QueryHandlerPattern, "kind" | "source" | "handlerName" | "schemaSource" | "handlerBody">;
116
- export type StreamHandlerHeaderKey = Exclude<keyof StreamHandlerPattern, "kind" | "source" | "handlerName" | "schemaSource" | "handlerBody">;
117
- export type HandlerHeaderUpdate = {
118
- readonly op: "update";
119
- readonly id: Extract<PatternId, {
120
- readonly kind: "writeHandler";
121
- }>;
122
- readonly set: Partial<Pick<WriteHandlerPattern, WriteHandlerHeaderKey>>;
123
- readonly unset?: readonly Exclude<WriteHandlerHeaderKey, "access">[];
124
- } | {
125
- readonly op: "update";
126
- readonly id: Extract<PatternId, {
127
- readonly kind: "queryHandler";
128
- }>;
129
- readonly set: Partial<Pick<QueryHandlerPattern, QueryHandlerHeaderKey>>;
130
- readonly unset?: readonly Exclude<QueryHandlerHeaderKey, "access">[];
131
- } | {
132
- readonly op: "update";
133
- readonly id: Extract<PatternId, {
134
- readonly kind: "streamHandler";
135
- }>;
136
- readonly set: Partial<Pick<StreamHandlerPattern, StreamHandlerHeaderKey>>;
137
- readonly unset?: readonly Exclude<StreamHandlerHeaderKey, "access">[];
138
- };
139
- export type PatternChange = {
140
- readonly op: "add";
141
- readonly pattern: FeaturePattern;
142
- } | {
143
- readonly op: "replace";
144
- readonly id: PatternId;
145
- readonly pattern: FeaturePattern;
146
- } | {
147
- readonly op: "remove";
148
- readonly id: PatternId;
149
- } | HandlerHeaderUpdate;
150
- /**
151
- * Apply a sequence of changes to the source file in-place. The list is
152
- * processed in order; replace/remove failures (id not found) throw so
153
- * callers can react explicitly — silent no-ops would mask design bugs
154
- * in the Designer/AI generator. Adds always succeed.
155
- *
156
- * The function does NOT save the file — `sourceFile.saveSync()` (or the
157
- * caller's persistence layer) is expected to follow.
158
- */
159
- export declare function applyChanges(sourceFile: SourceFile, changes: readonly PatternChange[]): void;
160
- /**
161
- * Low-level escape hatch: append a hand-built FeaturePattern at the end
162
- * of the setup callback's body. **Prefer the typed `add{Kind}` methods
163
- * on `createFeaturePatcher(sf)`** — they take natural args, build the
164
- * FeaturePattern internally, and avoid SourceLocation boilerplate.
165
- *
166
- * Use this directly when:
167
- * - Migrating a parsed pattern from another file (already-built
168
- * FeaturePattern object on hand)
169
- * - The pattern kind isn't yet covered by a typed `add{Kind}`
170
- *
171
- * The pattern is rendered (canonical Object-Form) and inserted as the
172
- * last statement, separated from the previous one by a blank line —
173
- * biome-stable formatting that matches the renderFeatureFile output.
174
- */
175
- export declare function addPattern(sourceFile: SourceFile, pattern: FeaturePattern): void;
176
- /**
177
- * Find the call matching `id` and replace the entire CallExpression text
178
- * with the rendered version of `pattern`. The replacement is reindented
179
- * to match the original call's column so existing helpers/comments
180
- * around it stay aligned. Throws when no call matches — callers must
181
- * handle that case explicitly.
182
- */
183
- export declare function replacePattern(sourceFile: SourceFile, id: PatternId, pattern: FeaturePattern): void;
184
- /**
185
- * Find the call matching `id` and remove it together with its trailing
186
- * newline. Comments belonging to the pattern are unaffected only when
187
- * they live BEFORE the call as line-leading trivia — those leading
188
- * comments are kept (they may belong to surrounding code, the patcher
189
- * can't disambiguate without semantic markers). Inline comments on the
190
- * same line as the call are removed with the call.
191
- */
192
- export declare function removePattern(sourceFile: SourceFile, id: PatternId): void;
193
- /**
194
- * Apply a `HandlerHeaderUpdate` to the header fields named in `set`/`unset`
195
- * only, via targeted text edits — `schemaSource`, `handlerBody`, comments,
196
- * and every unnamed field stay byte-identical (narrower than replacePattern).
197
- */
198
- export declare function updatePattern(sourceFile: SourceFile, change: HandlerHeaderUpdate): void;
199
- /**
200
- * Singleton kinds: a feature has at most one of each. The Boot-Validator
201
- * rejects features that declare two `r.requires(...)` etc. — the patcher
202
- * asserts the same invariant so a corrupt source file produces an
203
- * explicit error here, not a silent first-match win.
204
- *
205
- * Exported so the pattern-library tests + downstream consumers
206
- * (Designer, AI-Builder) share one source-of-truth — duplicating this
207
- * set would let the library's `singleton: true` flags drift silently
208
- * from the patcher's enforcement.
209
- */
210
- export declare const SINGLETON_KINDS: ReadonlySet<PatternId["kind"]>;