@apifuse/provider-sdk 2.2.0-beta.5 → 2.2.0-beta.51

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 (368) hide show
  1. package/AUTHORING.md +537 -33
  2. package/CHANGELOG.md +205 -1
  3. package/README.md +83 -22
  4. package/SUBMISSION.md +2 -2
  5. package/bin/apifuse-check.ts +165 -11
  6. package/bin/apifuse-dev.ts +57 -13
  7. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  8. package/bin/apifuse-migrate-shape.ts +202 -0
  9. package/bin/apifuse-pack-check.ts +22 -2
  10. package/bin/apifuse-pack-smoke.ts +57 -2
  11. package/bin/apifuse-pack-types.ts +357 -38
  12. package/bin/apifuse-perf.ts +14 -13
  13. package/bin/apifuse-record.ts +709 -72
  14. package/bin/apifuse-submit-check.ts +2344 -324
  15. package/bin/apifuse-sync-assets.ts +117 -0
  16. package/bin/submit-check-delimited-text.ts +50 -0
  17. package/dist/auth-turn/index.d.ts +3 -3
  18. package/dist/auth-turn/index.js +1 -1
  19. package/dist/auth.d.ts +14 -0
  20. package/dist/auth.js +67 -0
  21. package/dist/ceremonies/index.d.ts +16 -0
  22. package/dist/ceremonies/index.js +141 -36
  23. package/dist/cli/commands.d.ts +1 -1
  24. package/dist/cli/commands.js +27 -0
  25. package/dist/cli/create.d.ts +4 -1
  26. package/dist/cli/create.js +42 -37
  27. package/dist/cli/migrate-operation-declaration.d.ts +59 -0
  28. package/dist/cli/migrate-operation-declaration.js +1249 -0
  29. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  30. package/dist/cli/migrate-operation-shape.js +113 -0
  31. package/dist/cli/migrate-provider-shape.d.ts +52 -0
  32. package/dist/cli/migrate-provider-shape.js +578 -0
  33. package/dist/cli/prompt-assets.d.ts +80 -0
  34. package/dist/cli/prompt-assets.js +743 -0
  35. package/dist/cli/templates/provider/AGENTS.md.tpl +17 -8
  36. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  37. package/dist/cli/templates/provider/README.md.tpl +5 -5
  38. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  39. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  40. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  41. package/dist/config/loader.d.ts +179 -16
  42. package/dist/config/loader.js +435 -127
  43. package/dist/contract-serialization.js +4 -8
  44. package/dist/contract-types.d.ts +12 -5
  45. package/dist/contract.js +24 -10
  46. package/dist/declaration-validation.d.ts +33 -0
  47. package/dist/declaration-validation.js +266 -0
  48. package/dist/define.d.ts +66 -29
  49. package/dist/define.js +778 -69
  50. package/dist/dev.d.ts +3 -0
  51. package/dist/dev.js +1 -1
  52. package/dist/engine.d.ts +78 -0
  53. package/dist/engine.js +133 -0
  54. package/dist/error-observability.d.ts +7 -0
  55. package/dist/error-observability.js +61 -0
  56. package/dist/error-resolution.d.ts +4 -0
  57. package/dist/error-resolution.js +122 -0
  58. package/dist/errors.d.ts +33 -0
  59. package/dist/errors.js +40 -0
  60. package/dist/fixture-sanitization.d.ts +28 -0
  61. package/dist/fixture-sanitization.js +227 -0
  62. package/dist/health-scenario.d.ts +1842 -0
  63. package/dist/health-scenario.js +624 -0
  64. package/dist/index.d.ts +21 -10
  65. package/dist/index.js +12 -7
  66. package/dist/lint.d.ts +23 -11
  67. package/dist/lint.js +572 -69
  68. package/dist/native-address.d.ts +43 -0
  69. package/dist/native-address.js +281 -0
  70. package/dist/native-egress-policy.d.ts +31 -0
  71. package/dist/native-egress-policy.js +288 -0
  72. package/dist/observability.d.ts +5 -2
  73. package/dist/observability.js +48 -1
  74. package/dist/provider.d.ts +10 -2
  75. package/dist/provider.js +4 -1
  76. package/dist/runtime/auth-flow.d.ts +5 -1
  77. package/dist/runtime/auth-flow.js +6 -0
  78. package/dist/runtime/browser.d.ts +1 -0
  79. package/dist/runtime/browser.js +492 -49
  80. package/dist/runtime/cache.d.ts +1 -0
  81. package/dist/runtime/cache.js +169 -15
  82. package/dist/runtime/choice-wordlist.d.ts +9 -0
  83. package/dist/runtime/choice-wordlist.js +138 -0
  84. package/dist/runtime/choice.d.ts +13 -1
  85. package/dist/runtime/choice.js +490 -102
  86. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  87. package/dist/runtime/chrome149-header-order.js +289 -0
  88. package/dist/runtime/env.js +12 -0
  89. package/dist/runtime/executor.d.ts +3 -2
  90. package/dist/runtime/executor.js +26 -25
  91. package/dist/runtime/http.d.ts +1 -0
  92. package/dist/runtime/http.js +515 -53
  93. package/dist/runtime/insights.js +2 -2
  94. package/dist/runtime/instrumentation.d.ts +2 -2
  95. package/dist/runtime/instrumentation.js +366 -8
  96. package/dist/runtime/native-network-errors.d.ts +33 -0
  97. package/dist/runtime/native-network-errors.js +69 -0
  98. package/dist/runtime/native-network.d.ts +96 -0
  99. package/dist/runtime/native-network.js +1232 -0
  100. package/dist/runtime/ocr.d.ts +29 -0
  101. package/dist/runtime/ocr.js +440 -0
  102. package/dist/runtime/otlp.d.ts +71 -2
  103. package/dist/runtime/otlp.js +397 -16
  104. package/dist/runtime/proxy-errors.js +6 -2
  105. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  106. package/dist/runtime/proxy-nodemaven.js +146 -0
  107. package/dist/runtime/proxy-telemetry.d.ts +80 -1
  108. package/dist/runtime/proxy-telemetry.js +154 -47
  109. package/dist/runtime/redirects.d.ts +29 -0
  110. package/dist/runtime/redirects.js +36 -0
  111. package/dist/runtime/redis.d.ts +1 -1
  112. package/dist/runtime/redis.js +4 -2
  113. package/dist/runtime/request-options.d.ts +68 -1
  114. package/dist/runtime/request-options.js +548 -0
  115. package/dist/runtime/resolver-config.d.ts +6 -0
  116. package/dist/runtime/resolver-config.js +6 -0
  117. package/dist/runtime/resolver-public.d.ts +1 -0
  118. package/dist/runtime/resolver-public.js +1 -0
  119. package/dist/runtime/resolver-shared.d.ts +14 -0
  120. package/dist/runtime/resolver-shared.js +12 -0
  121. package/dist/runtime/resolver-vendors/bindings.d.ts +48 -0
  122. package/dist/runtime/resolver-vendors/bindings.js +40 -0
  123. package/dist/runtime/resolver-vendors/browser.d.ts +22 -0
  124. package/dist/runtime/resolver-vendors/browser.js +377 -0
  125. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  126. package/dist/runtime/resolver-vendors/capsolver.js +531 -0
  127. package/dist/runtime/resolver-vendors/hosts.d.ts +2 -0
  128. package/dist/runtime/resolver-vendors/hosts.js +33 -0
  129. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  130. package/dist/runtime/resolver-vendors/twocaptcha.js +408 -0
  131. package/dist/runtime/resolver-vendors/types.d.ts +94 -0
  132. package/dist/runtime/resolver-vendors/types.js +96 -0
  133. package/dist/runtime/resolver.d.ts +72 -0
  134. package/dist/runtime/resolver.js +771 -0
  135. package/dist/runtime/secrets.d.ts +27 -0
  136. package/dist/runtime/secrets.js +51 -0
  137. package/dist/runtime/state.d.ts +3 -0
  138. package/dist/runtime/state.js +277 -71
  139. package/dist/runtime/stealth-cookies.d.ts +20 -0
  140. package/dist/runtime/stealth-cookies.js +111 -0
  141. package/dist/runtime/stealth.d.ts +41 -5
  142. package/dist/runtime/stealth.js +997 -291
  143. package/dist/runtime/stt.js +1 -12
  144. package/dist/runtime/timeout.d.ts +5 -0
  145. package/dist/runtime/timeout.js +12 -0
  146. package/dist/runtime/trace-config.d.ts +12 -0
  147. package/dist/runtime/trace-config.js +62 -0
  148. package/dist/runtime/trace.d.ts +5 -0
  149. package/dist/runtime/trace.js +43 -10
  150. package/dist/serve.d.ts +1 -1
  151. package/dist/serve.js +1 -1
  152. package/dist/server/error-observability.d.ts +1 -0
  153. package/dist/server/error-observability.js +1 -0
  154. package/dist/server/index.d.ts +5 -2
  155. package/dist/server/index.js +2 -2
  156. package/dist/server/self-test-input-tokens.d.ts +2 -1
  157. package/dist/server/self-test-input-tokens.js +18 -14
  158. package/dist/server/self-test.d.ts +14 -3
  159. package/dist/server/self-test.js +129 -58
  160. package/dist/server/serve-implementation.d.ts +230 -0
  161. package/dist/server/serve-implementation.js +2265 -0
  162. package/dist/server/serve.d.ts +1 -70
  163. package/dist/server/serve.js +1 -1131
  164. package/dist/server/trace-output.d.ts +6 -0
  165. package/dist/server/trace-output.js +79 -0
  166. package/dist/server/types.d.ts +30 -5
  167. package/dist/server/types.js +13 -1
  168. package/dist/stateful/errors.d.ts +19 -0
  169. package/dist/stateful/errors.js +24 -0
  170. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  171. package/dist/stateful/http-provider-event-emitter.js +237 -0
  172. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  173. package/dist/stateful/http-session-owner-registry.js +210 -0
  174. package/dist/stateful/index.d.ts +18 -0
  175. package/dist/stateful/index.js +18 -0
  176. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  177. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  178. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  179. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  180. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  181. package/dist/stateful/provider-event-pipeline.js +1 -0
  182. package/dist/stateful/provider-events.d.ts +101 -0
  183. package/dist/stateful/provider-events.js +289 -0
  184. package/dist/stateful/session-key.d.ts +15 -0
  185. package/dist/stateful/session-key.js +86 -0
  186. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  187. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  188. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  189. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  190. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  191. package/dist/stateful/stateful-provider-adapter.js +287 -0
  192. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  193. package/dist/stateful/stateful-provider-observability.js +161 -0
  194. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  195. package/dist/stateful/stateful-provider-owner-forwarder.js +215 -0
  196. package/dist/stateful/stateful-provider-runtime-context.d.ts +32 -0
  197. package/dist/stateful/stateful-provider-runtime-context.js +60 -0
  198. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  199. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  200. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  201. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  202. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  203. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  204. package/dist/stateful-signing.d.ts +18 -0
  205. package/dist/stateful-signing.js +27 -0
  206. package/dist/stealth/profiles.d.ts +9 -4
  207. package/dist/stealth/profiles.js +160 -211
  208. package/dist/stream-evidence.d.ts +74 -0
  209. package/dist/stream-evidence.js +785 -0
  210. package/dist/stream.js +7 -1
  211. package/dist/testing/index.d.ts +2 -1
  212. package/dist/testing/index.js +2 -1
  213. package/dist/testing/run.d.ts +32 -2
  214. package/dist/testing/run.js +489 -21
  215. package/dist/trace-sanitization.d.ts +5 -0
  216. package/dist/trace-sanitization.js +45 -0
  217. package/dist/types.d.ts +673 -131
  218. package/dist/types.js +1 -0
  219. package/package.json +45 -5
  220. package/src/auth-turn/index.ts +1 -1
  221. package/src/auth.ts +118 -0
  222. package/src/ceremonies/index.ts +189 -46
  223. package/src/cli/__tests__/fixtures/migrate-operation-declaration/approval-override.ts.txt +6 -0
  224. package/src/cli/__tests__/fixtures/migrate-operation-declaration/codemod-syntax.ts.txt +3 -0
  225. package/src/cli/__tests__/fixtures/migrate-operation-declaration/connection-precedence.ts.txt +10 -0
  226. package/src/cli/__tests__/fixtures/migrate-operation-declaration/docs-conflict.ts.txt +8 -0
  227. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-hoisted-array-spread.ts.txt +15 -0
  228. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-imported-array-spread.ts.txt +9 -0
  229. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-map.ts.txt +5 -0
  230. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-mixed-array-spread.ts.txt +24 -0
  231. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-operation.ts.txt +16 -0
  232. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-map.ts.txt +3 -0
  233. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoist-all.ts.txt +31 -0
  234. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoisted-const.ts.txt +11 -0
  235. package/src/cli/__tests__/fixtures/migrate-operation-declaration/imported-spread.ts.txt +11 -0
  236. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-map.ts.txt +11 -0
  237. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-cast-tail.ts.txt +21 -0
  238. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-ekitan.ts.txt +11 -0
  239. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-override.ts.txt +14 -0
  240. package/src/cli/__tests__/fixtures/migrate-operation-declaration/missing-english-locale.ts.txt +7 -0
  241. package/src/cli/__tests__/fixtures/migrate-operation-declaration/no-safety.ts.txt +6 -0
  242. package/src/cli/__tests__/fixtures/migrate-operation-declaration/non-literal.ts.txt +7 -0
  243. package/src/cli/__tests__/fixtures/migrate-operation-declaration/redundant-approval.ts.txt +6 -0
  244. package/src/cli/__tests__/fixtures/migrate-operation-declaration/safety-conflict.ts.txt +7 -0
  245. package/src/cli/__tests__/fixtures/migrate-operation-declaration/stream.ts.txt +7 -0
  246. package/src/cli/__tests__/fixtures/migrate-operation-declaration/tool-router-spread.ts.txt +15 -0
  247. package/src/cli/__tests__/fixtures/migrate-operation-declaration/unparseable.ts.txt +4 -0
  248. package/src/cli/__tests__/fixtures/migrate-operation-declaration/verbatim-template.ts.txt +12 -0
  249. package/src/cli/commands.ts +33 -0
  250. package/src/cli/create.ts +50 -37
  251. package/src/cli/migrate-operation-declaration.ts +1751 -0
  252. package/src/cli/migrate-operation-shape.ts +184 -0
  253. package/src/cli/migrate-provider-shape.ts +772 -0
  254. package/src/cli/prompt-assets.ts +865 -0
  255. package/src/cli/templates/provider/AGENTS.md.tpl +17 -8
  256. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  257. package/src/cli/templates/provider/README.md.tpl +5 -5
  258. package/src/cli/templates/provider/index.ts.tpl +6 -3
  259. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  260. package/src/cli/templates/provider/provider.json.tpl +6 -0
  261. package/src/config/loader.ts +690 -163
  262. package/src/contract-serialization.ts +5 -7
  263. package/src/contract-types.ts +12 -5
  264. package/src/contract.ts +24 -10
  265. package/src/declaration-validation.ts +330 -0
  266. package/src/define.ts +1048 -131
  267. package/src/dev.ts +4 -1
  268. package/src/engine.ts +279 -0
  269. package/src/error-observability.ts +64 -0
  270. package/src/error-resolution.ts +127 -0
  271. package/src/errors.ts +68 -0
  272. package/src/fixture-sanitization.ts +264 -0
  273. package/src/health-scenario.ts +875 -0
  274. package/src/index.ts +220 -13
  275. package/src/lint.ts +698 -90
  276. package/src/native-address.ts +340 -0
  277. package/src/native-egress-policy.ts +358 -0
  278. package/src/observability.ts +51 -1
  279. package/src/provider.ts +161 -3
  280. package/src/runtime/auth-flow.ts +12 -0
  281. package/src/runtime/browser.ts +661 -63
  282. package/src/runtime/cache.ts +189 -14
  283. package/src/runtime/choice-wordlist.ts +145 -0
  284. package/src/runtime/choice.ts +631 -120
  285. package/src/runtime/chrome149-header-order.ts +330 -0
  286. package/src/runtime/env.ts +13 -0
  287. package/src/runtime/executor.ts +43 -31
  288. package/src/runtime/http.ts +641 -61
  289. package/src/runtime/insights.ts +2 -2
  290. package/src/runtime/instrumentation.ts +520 -15
  291. package/src/runtime/native-network-errors.ts +99 -0
  292. package/src/runtime/native-network.ts +1605 -0
  293. package/src/runtime/ocr.ts +523 -0
  294. package/src/runtime/otlp.ts +467 -21
  295. package/src/runtime/proxy-errors.ts +12 -4
  296. package/src/runtime/proxy-nodemaven.ts +221 -0
  297. package/src/runtime/proxy-telemetry.ts +244 -75
  298. package/src/runtime/redirects.ts +66 -0
  299. package/src/runtime/redis.ts +7 -2
  300. package/src/runtime/request-options.ts +680 -1
  301. package/src/runtime/resolver-config.ts +6 -0
  302. package/src/runtime/resolver-public.ts +23 -0
  303. package/src/runtime/resolver-shared.ts +33 -0
  304. package/src/runtime/resolver-vendors/bindings.ts +56 -0
  305. package/src/runtime/resolver-vendors/browser.ts +533 -0
  306. package/src/runtime/resolver-vendors/capsolver.ts +707 -0
  307. package/src/runtime/resolver-vendors/hosts.ts +38 -0
  308. package/src/runtime/resolver-vendors/twocaptcha.ts +540 -0
  309. package/src/runtime/resolver-vendors/types.ts +212 -0
  310. package/src/runtime/resolver.ts +1157 -0
  311. package/src/runtime/secrets.ts +64 -0
  312. package/src/runtime/state.ts +394 -77
  313. package/src/runtime/stealth-cookies.ts +132 -0
  314. package/src/runtime/stealth.ts +1280 -336
  315. package/src/runtime/stt.ts +1 -19
  316. package/src/runtime/timeout.ts +18 -0
  317. package/src/runtime/trace-config.ts +78 -0
  318. package/src/runtime/trace.ts +57 -17
  319. package/src/serve.ts +6 -1
  320. package/src/server/error-observability.ts +1 -0
  321. package/src/server/index.ts +34 -2
  322. package/src/server/self-test-input-tokens.ts +29 -14
  323. package/src/server/self-test.ts +191 -68
  324. package/src/server/serve-implementation.ts +3378 -0
  325. package/src/server/serve.ts +1 -1632
  326. package/src/server/trace-output.ts +129 -0
  327. package/src/server/types.ts +13 -1
  328. package/src/stateful/README.md +146 -0
  329. package/src/stateful/errors.ts +35 -0
  330. package/src/stateful/http-provider-event-emitter.ts +314 -0
  331. package/src/stateful/http-session-owner-registry.ts +306 -0
  332. package/src/stateful/index.ts +18 -0
  333. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  334. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  335. package/src/stateful/provider-event-pipeline.ts +61 -0
  336. package/src/stateful/provider-events.ts +462 -0
  337. package/src/stateful/session-key.ts +111 -0
  338. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  339. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  340. package/src/stateful/stateful-provider-adapter.ts +562 -0
  341. package/src/stateful/stateful-provider-observability.ts +261 -0
  342. package/src/stateful/stateful-provider-owner-forwarder.ts +287 -0
  343. package/src/stateful/stateful-provider-runtime-context.ts +92 -0
  344. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  345. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  346. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  347. package/src/stateful-signing.ts +46 -0
  348. package/src/stealth/profiles.ts +202 -231
  349. package/src/stream-evidence.ts +988 -0
  350. package/src/stream.ts +8 -1
  351. package/src/testing/index.ts +10 -1
  352. package/src/testing/run.ts +658 -15
  353. package/src/trace-sanitization.ts +63 -0
  354. package/src/types.ts +788 -174
  355. package/dist/cli/templates/provider/CLAUDE.md.tpl +0 -1
  356. package/src/cli/templates/provider/CLAUDE.md.tpl +0 -1
  357. /package/dist/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  358. /package/dist/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  359. /package/dist/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  360. /package/dist/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  361. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  362. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
  363. /package/src/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  364. /package/src/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  365. /package/src/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  366. /package/src/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  367. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  368. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
@@ -0,0 +1,624 @@
1
+ import { z } from "zod";
2
+ const finiteInt = (min, max) => {
3
+ const schema = z.number().finite().int().min(min);
4
+ return max === undefined ? schema : schema.max(max);
5
+ };
6
+ const nonEmptyArray = (schema) => z
7
+ .array(schema)
8
+ .min(1)
9
+ .transform((value) => value);
10
+ const jsonValueSchema = z.lazy(() => z.union([
11
+ z.null(),
12
+ z.boolean(),
13
+ z.number().finite(),
14
+ z.string(),
15
+ z.array(jsonValueSchema),
16
+ z.record(z.string(), jsonValueSchema),
17
+ ]));
18
+ const pathPartSchema = z.union([z.string().min(1), finiteInt(0, 10_000)]);
19
+ const propertyNameSchema = z
20
+ .string()
21
+ .min(1)
22
+ .superRefine((value, ctx) => {
23
+ if (new TextEncoder().encode(value).byteLength > 128)
24
+ ctx.addIssue({ code: "custom", message: "property name exceeds 128 UTF-8 bytes" });
25
+ });
26
+ const pathSegmentSchema = z.union([
27
+ z.object({ kind: z.literal("property"), name: propertyNameSchema }).strict(),
28
+ z.object({ kind: z.literal("index"), index: finiteInt(0, 10_000) }).strict(),
29
+ ]);
30
+ export const BoundedJsonPathSchema = z
31
+ .object({ root: z.literal("$"), segments: z.array(pathSegmentSchema).max(12) })
32
+ .strict();
33
+ const valueTypeSchema = z.enum([
34
+ "null",
35
+ "boolean",
36
+ "number",
37
+ "string",
38
+ "object",
39
+ "array",
40
+ "json",
41
+ "established_connection",
42
+ ]);
43
+ export const ValueTypeSchema = valueTypeSchema;
44
+ const stepReferenceSchema = z
45
+ .object({
46
+ namespace: z.literal("steps"),
47
+ binding: z.string().min(1),
48
+ path: z.array(pathPartSchema).min(1).max(12),
49
+ })
50
+ .strict();
51
+ export const StepReferenceSchema = stepReferenceSchema;
52
+ const credentialReferenceSchema = z
53
+ .object({
54
+ namespace: z.literal("credentials"),
55
+ alias: z.string().min(1),
56
+ field: z.literal("connection"),
57
+ })
58
+ .strict();
59
+ const attemptReferenceSchema = z
60
+ .object({
61
+ namespace: z.literal("attempt"),
62
+ field: z.enum([
63
+ "id",
64
+ "external_ref",
65
+ "provider_id",
66
+ "scenario_id",
67
+ "started_at",
68
+ "deadline_at",
69
+ ]),
70
+ })
71
+ .strict();
72
+ const candidateReferenceSchema = z
73
+ .object({
74
+ namespace: z.literal("candidate"),
75
+ binding: z.string().min(1),
76
+ path: z.union([
77
+ z.tuple([z.literal("item")]).rest(pathPartSchema),
78
+ z.tuple([z.literal("result")]).rest(pathPartSchema),
79
+ ]),
80
+ })
81
+ .strict();
82
+ const referenceSchema = z.discriminatedUnion("namespace", [
83
+ stepReferenceSchema,
84
+ credentialReferenceSchema,
85
+ attemptReferenceSchema,
86
+ candidateReferenceSchema,
87
+ ]);
88
+ export const ReferenceSchema = referenceSchema;
89
+ const relativeDateNodeSchema = z
90
+ .object({
91
+ relativeDate: z
92
+ .object({
93
+ anchor: z.literal("operation_started_at"),
94
+ offsetDays: finiteInt(1, 365),
95
+ timeZone: z.literal("Asia/Seoul"),
96
+ format: z.enum(["YYYY-MM-DD", "YYYYMMDD"]),
97
+ })
98
+ .strict(),
99
+ })
100
+ .strict();
101
+ export const RelativeDateNodeSchema = relativeDateNodeSchema;
102
+ const referenceNodeSchema = z.object({ ref: referenceSchema }).strict();
103
+ // Reserved template keys may only occur in their exact, single-key node forms.
104
+ const templateRecordSchema = z
105
+ .record(z.string(), z.lazy(() => jsonTemplateSchema))
106
+ .superRefine((value, ctx) => {
107
+ if (Object.hasOwn(value, "ref") || Object.hasOwn(value, "relativeDate"))
108
+ ctx.addIssue({ code: "custom", message: "reserved template keys require a sole-key node" });
109
+ });
110
+ const jsonTemplateSchema = z.lazy(() => z.union([
111
+ z.null(),
112
+ z.boolean(),
113
+ z.number().finite(),
114
+ z.string(),
115
+ referenceNodeSchema,
116
+ relativeDateNodeSchema,
117
+ z.array(jsonTemplateSchema),
118
+ templateRecordSchema,
119
+ ]));
120
+ export const JsonTemplateSchema = jsonTemplateSchema;
121
+ function containsNestedRegexQuantifier(pattern) {
122
+ const groups = [];
123
+ let escaped = false;
124
+ let inClass = false;
125
+ let closedQuantified = false;
126
+ for (let i = 0; i < pattern.length; i += 1) {
127
+ const c = pattern[i];
128
+ if (escaped) {
129
+ escaped = false;
130
+ closedQuantified = false;
131
+ continue;
132
+ }
133
+ if (c === "\\") {
134
+ escaped = true;
135
+ closedQuantified = false;
136
+ continue;
137
+ }
138
+ if (c === "[" && !inClass) {
139
+ inClass = true;
140
+ continue;
141
+ }
142
+ if (c === "]" && inClass) {
143
+ inClass = false;
144
+ continue;
145
+ }
146
+ if (inClass)
147
+ continue;
148
+ if (c === "(") {
149
+ groups.push(false);
150
+ closedQuantified = false;
151
+ continue;
152
+ }
153
+ if (c === ")") {
154
+ closedQuantified = groups.pop() ?? false;
155
+ if (closedQuantified && groups.length > 0)
156
+ groups[groups.length - 1] = true;
157
+ continue;
158
+ }
159
+ const brace = c === "{" && /^\{\d+(?:,\d*)?\}/.test(pattern.slice(i));
160
+ if (c === "*" || c === "+" || brace || (c === "?" && pattern[i - 1] !== "(")) {
161
+ if (closedQuantified)
162
+ return true;
163
+ if (groups.length > 0)
164
+ groups[groups.length - 1] = true;
165
+ }
166
+ closedQuantified = false;
167
+ }
168
+ return false;
169
+ }
170
+ export const SafeRegexSchema = z
171
+ .object({ engine: z.literal("re2"), pattern: z.string().max(256), flags: z.enum(["", "i"]) })
172
+ .strict()
173
+ .superRefine((value, ctx) => {
174
+ if (/\\[1-9kg]/.test(value.pattern))
175
+ ctx.addIssue({ code: "custom", path: ["pattern"], message: "backreferences are not supported by RE2" });
176
+ if (/\(\?/.test(value.pattern))
177
+ ctx.addIssue({ code: "custom", path: ["pattern"], message: "extended groups are not supported by RE2" });
178
+ if (containsNestedRegexQuantifier(value.pattern))
179
+ ctx.addIssue({ code: "custom", path: ["pattern"], message: "nested regex quantifiers are not permitted" });
180
+ try {
181
+ new RegExp(value.pattern, value.flags);
182
+ }
183
+ catch {
184
+ ctx.addIssue({ code: "custom", path: ["pattern"], message: "pattern must be valid regular-expression syntax" });
185
+ }
186
+ });
187
+ const operandLiteralSchema = jsonValueSchema.superRefine((value, ctx) => {
188
+ if (value !== null &&
189
+ typeof value === "object" &&
190
+ !Array.isArray(value) &&
191
+ Object.hasOwn(value, "ref"))
192
+ ctx.addIssue({
193
+ code: "custom",
194
+ message: 'the object key "ref" is reserved for a validated reference',
195
+ });
196
+ });
197
+ const operandSchema = z.union([operandLiteralSchema, referenceNodeSchema]);
198
+ export const OperandSchema = operandSchema;
199
+ const predicateSchema = z.union([
200
+ z
201
+ .object({
202
+ kind: z.literal("predicate"),
203
+ operator: z.enum(["exists", "not_exists", "non_empty", "is_true"]),
204
+ actual: operandSchema,
205
+ })
206
+ .strict(),
207
+ z
208
+ .object({
209
+ kind: z.literal("predicate"),
210
+ operator: z.enum(["equals", "not_equals", "contains"]),
211
+ actual: operandSchema,
212
+ expected: operandSchema,
213
+ })
214
+ .strict(),
215
+ z
216
+ .object({
217
+ kind: z.literal("predicate"),
218
+ operator: z.literal("matches"),
219
+ actual: operandSchema,
220
+ pattern: SafeRegexSchema,
221
+ })
222
+ .strict(),
223
+ z
224
+ .object({
225
+ kind: z.literal("predicate"),
226
+ operator: z.enum(["number_gt", "number_gte", "number_lt", "number_lte"]),
227
+ actual: operandSchema,
228
+ expected: operandSchema,
229
+ })
230
+ .strict(),
231
+ z
232
+ .object({
233
+ kind: z.literal("predicate"),
234
+ operator: z.enum(["array_length_eq", "array_length_gte", "array_length_lte"]),
235
+ actual: operandSchema,
236
+ expected: z.number().finite().int().nonnegative(),
237
+ })
238
+ .strict(),
239
+ z
240
+ .object({
241
+ kind: z.literal("predicate"),
242
+ operator: z.literal("status_2xx"),
243
+ actual: operandSchema,
244
+ })
245
+ .strict(),
246
+ z
247
+ .object({
248
+ kind: z.literal("predicate"),
249
+ operator: z.literal("type_is"),
250
+ actual: operandSchema,
251
+ expected: z.enum(["null", "boolean", "number", "string", "object", "array"]),
252
+ })
253
+ .strict(),
254
+ ]);
255
+ export const AssertionPredicateSchema = predicateSchema;
256
+ const scopedItemReferenceSchema = z
257
+ .object({
258
+ namespace: z.literal("item"),
259
+ binding: z.string().min(1),
260
+ path: z.array(pathPartSchema).max(12),
261
+ })
262
+ .strict();
263
+ export const ScopedItemReferenceSchema = scopedItemReferenceSchema;
264
+ const scopedOperandSchema = z.union([
265
+ operandLiteralSchema,
266
+ z.object({ ref: scopedItemReferenceSchema }).strict(),
267
+ referenceNodeSchema,
268
+ ]);
269
+ export const ScopedOperandSchema = scopedOperandSchema;
270
+ const scopedPredicateSchema = z.union([
271
+ z
272
+ .object({
273
+ kind: z.literal("predicate"),
274
+ operator: z.enum(["exists", "not_exists", "non_empty", "is_true"]),
275
+ actual: scopedOperandSchema,
276
+ })
277
+ .strict(),
278
+ z
279
+ .object({
280
+ kind: z.literal("predicate"),
281
+ operator: z.enum(["equals", "not_equals", "contains"]),
282
+ actual: scopedOperandSchema,
283
+ expected: scopedOperandSchema,
284
+ })
285
+ .strict(),
286
+ z
287
+ .object({
288
+ kind: z.literal("predicate"),
289
+ operator: z.literal("matches"),
290
+ actual: scopedOperandSchema,
291
+ pattern: SafeRegexSchema,
292
+ })
293
+ .strict(),
294
+ z
295
+ .object({
296
+ kind: z.literal("predicate"),
297
+ operator: z.enum(["number_gt", "number_gte", "number_lt", "number_lte"]),
298
+ actual: scopedOperandSchema,
299
+ expected: scopedOperandSchema,
300
+ })
301
+ .strict(),
302
+ z
303
+ .object({
304
+ kind: z.literal("predicate"),
305
+ operator: z.enum(["array_length_eq", "array_length_gte", "array_length_lte"]),
306
+ actual: scopedOperandSchema,
307
+ expected: z.number().finite().int().nonnegative(),
308
+ })
309
+ .strict(),
310
+ z
311
+ .object({
312
+ kind: z.literal("predicate"),
313
+ operator: z.literal("status_2xx"),
314
+ actual: scopedOperandSchema,
315
+ })
316
+ .strict(),
317
+ z
318
+ .object({
319
+ kind: z.literal("predicate"),
320
+ operator: z.literal("type_is"),
321
+ actual: scopedOperandSchema,
322
+ expected: z.enum(["null", "boolean", "number", "string", "object", "array"]),
323
+ })
324
+ .strict(),
325
+ ]);
326
+ export const ScopedAssertionPredicateSchema = scopedPredicateSchema;
327
+ const scopedExpressionSchema = z.lazy(() => z.union([
328
+ z.object({ kind: z.literal("all"), clauses: nonEmptyArray(scopedExpressionSchema) }).strict(),
329
+ z.object({ kind: z.literal("any"), clauses: nonEmptyArray(scopedExpressionSchema) }).strict(),
330
+ z.object({ kind: z.literal("not"), clause: scopedExpressionSchema }).strict(),
331
+ scopedPredicateSchema,
332
+ ]));
333
+ export const ScopedAssertionExpressionSchema = scopedExpressionSchema;
334
+ const quantifierSchema = z
335
+ .object({
336
+ kind: z.literal("quantifier"),
337
+ quantifier: z.enum(["every", "any"]),
338
+ items: z.object({ ref: z.union([stepReferenceSchema, candidateReferenceSchema]) }).strict(),
339
+ itemBinding: z.string().min(1),
340
+ maxItems: finiteInt(1, 100),
341
+ clause: scopedExpressionSchema,
342
+ })
343
+ .strict();
344
+ export const QuantifierSchema = quantifierSchema;
345
+ const expressionSchema = z.lazy(() => z.union([
346
+ z.object({ kind: z.literal("all"), clauses: nonEmptyArray(expressionSchema) }).strict(),
347
+ z.object({ kind: z.literal("any"), clauses: nonEmptyArray(expressionSchema) }).strict(),
348
+ z.object({ kind: z.literal("not"), clause: expressionSchema }).strict(),
349
+ predicateSchema,
350
+ quantifierSchema,
351
+ ]));
352
+ export const AssertionExpressionSchema = expressionSchema;
353
+ const retryPolicySchema = z
354
+ .object({
355
+ maxAttempts: finiteInt(1, 3),
356
+ retryOn: nonEmptyArray(z.enum(["transport_error", "timeout", "http_429", "http_5xx"])),
357
+ backoff: z.union([
358
+ z
359
+ .object({ kind: z.literal("fixed"), delayMs: z.number().finite().int().nonnegative() })
360
+ .strict(),
361
+ z
362
+ .object({
363
+ kind: z.literal("exponential"),
364
+ initialDelayMs: z.number().finite().int().nonnegative(),
365
+ maxDelayMs: z.number().finite().int().nonnegative(),
366
+ })
367
+ .strict(),
368
+ ]),
369
+ attemptTimeoutMs: finiteInt(1, 600_000).optional(),
370
+ })
371
+ .strict();
372
+ export const RetryPolicySchema = retryPolicySchema;
373
+ const candidatePolicySchema = z
374
+ .object({
375
+ items: stepReferenceSchema,
376
+ itemBinding: z.string().min(1),
377
+ itemType: z.enum(["string", "number", "object"]),
378
+ maxAttempts: finiteInt(1, 10),
379
+ accept: expressionSchema,
380
+ })
381
+ .strict();
382
+ export const CandidatePolicySchema = candidatePolicySchema;
383
+ const candidateBlockSchema = z
384
+ .object({
385
+ scope: z.literal("step_block"),
386
+ items: stepReferenceSchema,
387
+ itemBinding: z.string().min(1),
388
+ itemType: z.enum(["string", "number", "object"]),
389
+ members: z
390
+ .array(z.string().min(1))
391
+ .min(2)
392
+ .max(16)
393
+ .transform((value) => value),
394
+ maxAttempts: finiteInt(1, 10),
395
+ accept: expressionSchema,
396
+ })
397
+ .strict();
398
+ export const CandidateBlockSchema = candidateBlockSchema;
399
+ const journalPolicySchema = z
400
+ .object({
401
+ kind: z.literal("side_effect_barrier"),
402
+ version: z.literal(1),
403
+ key: referenceSchema,
404
+ before: z.literal("required"),
405
+ after: z.literal("required"),
406
+ replay: z.literal("deny_after_started"),
407
+ })
408
+ .strict();
409
+ export const JournalPolicySchema = journalPolicySchema;
410
+ const stepBaseSchema = z
411
+ .object({
412
+ id: z.string().min(1),
413
+ result: z.string().min(1),
414
+ timeoutMs: finiteInt(1, 600_000).optional(),
415
+ })
416
+ .strict();
417
+ const attributionSchema = z
418
+ .object({
419
+ operationId: z.string().min(1),
420
+ status: z.literal("degraded"),
421
+ reasonCode: z.literal("expected_absence"),
422
+ reasonKey: z.string().min(1),
423
+ })
424
+ .strict();
425
+ const findFirstSchema = z
426
+ .object({
427
+ kind: z.literal("find_first"),
428
+ itemBinding: z.string().min(1),
429
+ predicate: scopedExpressionSchema,
430
+ maxScan: finiteInt(1, 100),
431
+ })
432
+ .strict();
433
+ export const FindFirstSchema = findFirstSchema;
434
+ const operationStepSchema = stepBaseSchema
435
+ .extend({
436
+ kind: z.literal("operation"),
437
+ operationId: z.string().min(1),
438
+ inputTemplate: jsonTemplateSchema,
439
+ connection: credentialReferenceSchema.optional(),
440
+ retry: retryPolicySchema.optional(),
441
+ candidate: z.union([candidatePolicySchema, candidateBlockSchema]).optional(),
442
+ journal: journalPolicySchema.optional(),
443
+ })
444
+ .strict();
445
+ const extractStepSchema = stepBaseSchema
446
+ .extend({
447
+ kind: z.literal("extract"),
448
+ from: stepReferenceSchema,
449
+ selector: z.union([BoundedJsonPathSchema, findFirstSchema]),
450
+ valueType: valueTypeSchema,
451
+ required: z.boolean(),
452
+ })
453
+ .strict();
454
+ const assertStepSchema = stepBaseSchema
455
+ .extend({
456
+ kind: z.literal("assert"),
457
+ coversOperations: nonEmptyArray(z.string().min(1)),
458
+ expression: expressionSchema,
459
+ })
460
+ .strict();
461
+ const guardStepSchema = stepBaseSchema
462
+ .extend({
463
+ kind: z.literal("guard"),
464
+ condition: expressionSchema,
465
+ onFail: z
466
+ .object({ attribute: nonEmptyArray(attributionSchema), stop: z.literal("scenario") })
467
+ .strict(),
468
+ })
469
+ .strict();
470
+ export const HealthStepSchema = z.discriminatedUnion("kind", [
471
+ operationStepSchema,
472
+ extractStepSchema,
473
+ assertStepSchema,
474
+ guardStepSchema,
475
+ ]);
476
+ export const OperationStepSchema = operationStepSchema;
477
+ export const ExtractStepSchema = extractStepSchema;
478
+ export const AssertStepSchema = assertStepSchema;
479
+ export const GuardStepSchema = guardStepSchema;
480
+ const manualTriggerSchema = z.union([
481
+ z.object({ enabled: z.literal(false), reasonKey: z.string().min(1) }).strict(),
482
+ z
483
+ .object({
484
+ enabled: z.literal(true),
485
+ requiresAcknowledgement: z.boolean(),
486
+ risk: z.enum(["read_only", "writes_external_state"]),
487
+ minManualIntervalMs: finiteInt(1000, 86_400_000),
488
+ publicRationaleKey: z.string().min(1),
489
+ })
490
+ .strict(),
491
+ ]);
492
+ export const ManualTriggerPolicySchema = manualTriggerSchema;
493
+ const credentialRefDeclarationSchema = z
494
+ .object({ alias: z.string().min(1), kind: z.literal("connection") })
495
+ .strict();
496
+ export const CredentialRefDeclarationSchema = credentialRefDeclarationSchema;
497
+ export const HealthScenarioSchema = z
498
+ .object({
499
+ scenarioVersion: z.literal(2),
500
+ id: z.string().min(1),
501
+ display: z
502
+ .object({ titleKey: z.string().min(1), descriptionKey: z.string().min(1).optional() })
503
+ .strict(),
504
+ schedule: z
505
+ .object({
506
+ kind: z.literal("interval"),
507
+ intervalMs: finiteInt(30_000, 604_800_000),
508
+ jitterMs: finiteInt(0),
509
+ })
510
+ .strict(),
511
+ timeoutMs: finiteInt(1000, 600_000),
512
+ cooldownMs: finiteInt(0, 86_400_000).optional(),
513
+ manualTrigger: manualTriggerSchema.optional(),
514
+ coversOperations: nonEmptyArray(z.string().min(1)),
515
+ credentialRefs: z.array(credentialRefDeclarationSchema),
516
+ steps: z
517
+ .array(HealthStepSchema)
518
+ .min(1)
519
+ .max(64)
520
+ .transform((value) => value),
521
+ })
522
+ .strict()
523
+ .superRefine((value, ctx) => {
524
+ if (value.schedule.jitterMs > value.schedule.intervalMs)
525
+ ctx.addIssue({
526
+ code: "custom",
527
+ path: ["schedule", "jitterMs"],
528
+ message: "jitterMs must not exceed intervalMs",
529
+ });
530
+ if (value.timeoutMs > value.schedule.intervalMs)
531
+ ctx.addIssue({
532
+ code: "custom",
533
+ path: ["timeoutMs"],
534
+ message: "timeoutMs must not exceed intervalMs",
535
+ });
536
+ const ids = new Set();
537
+ const bindings = new Set();
538
+ for (const [index, step] of value.steps.entries()) {
539
+ if (ids.has(step.id))
540
+ ctx.addIssue({
541
+ code: "custom",
542
+ path: ["steps", index, "id"],
543
+ message: `duplicate step ${step.id}`,
544
+ });
545
+ ids.add(step.id);
546
+ if (bindings.has(step.result))
547
+ ctx.addIssue({
548
+ code: "custom",
549
+ path: ["steps", index, "result"],
550
+ message: `duplicate result binding ${step.result}`,
551
+ });
552
+ bindings.add(step.result);
553
+ if (step.timeoutMs !== undefined && step.timeoutMs > value.timeoutMs)
554
+ ctx.addIssue({
555
+ code: "custom",
556
+ path: ["steps", index, "timeoutMs"],
557
+ message: "step timeout must not exceed the scenario timeout",
558
+ });
559
+ if (step.kind === "operation" &&
560
+ step.retry?.retryOn.includes("timeout") &&
561
+ step.retry.attemptTimeoutMs === undefined)
562
+ ctx.addIssue({
563
+ code: "custom",
564
+ path: ["steps", index, "retry", "attemptTimeoutMs"],
565
+ message: "timeout retry requires attemptTimeoutMs",
566
+ });
567
+ const expression = step.kind === "assert"
568
+ ? step.expression
569
+ : step.kind === "guard"
570
+ ? step.condition
571
+ : step.kind === "operation" && step.candidate
572
+ ? step.candidate.accept
573
+ : undefined;
574
+ if (expression)
575
+ walkExpression(expression, ctx, ["steps", index], 0, { count: 0 }, true);
576
+ if (step.kind === "extract" && "kind" in step.selector && step.selector.kind === "find_first")
577
+ walkExpression(step.selector.predicate, ctx, ["steps", index, "selector", "predicate"], 0, { count: 0 }, false, step.selector.itemBinding);
578
+ }
579
+ try {
580
+ const serialized = JSON.stringify(value);
581
+ if (new TextEncoder().encode(serialized).byteLength > 128 * 1024)
582
+ ctx.addIssue({ code: "custom", path: [], message: "serialized scenario exceeds 128 KiB" });
583
+ }
584
+ catch {
585
+ ctx.addIssue({ code: "custom", path: [], message: "scenario must be JSON-serializable" });
586
+ }
587
+ });
588
+ function walkExpression(expression, ctx, path, depth, leaves, allowQuantifier, scopedBinding) {
589
+ if (depth > 8) {
590
+ ctx.addIssue({ code: "custom", path, message: "expression depth exceeds 8" });
591
+ return;
592
+ }
593
+ if (expression.kind === "quantifier") {
594
+ if (!allowQuantifier) {
595
+ ctx.addIssue({ code: "custom", path, message: "quantifiers may not be nested" });
596
+ return;
597
+ }
598
+ if (expression.itemBinding === scopedBinding) {
599
+ ctx.addIssue({
600
+ code: "custom",
601
+ path: [...path, "itemBinding"],
602
+ message: "item binding is invalid or shadows an enclosing binding",
603
+ });
604
+ return;
605
+ }
606
+ walkExpression(expression.clause, ctx, [...path, "clause"], depth + 1, leaves, false, expression.itemBinding);
607
+ return;
608
+ }
609
+ if (expression.kind === "all" || expression.kind === "any") {
610
+ for (const [index, clause] of expression.clauses.entries())
611
+ walkExpression(clause, ctx, [...path, "clauses", index], depth + 1, leaves, allowQuantifier, scopedBinding);
612
+ return;
613
+ }
614
+ if (expression.kind === "not") {
615
+ walkExpression(expression.clause, ctx, [...path, "clause"], depth + 1, leaves, allowQuantifier, scopedBinding);
616
+ return;
617
+ }
618
+ leaves.count += 1;
619
+ if (leaves.count > 64)
620
+ ctx.addIssue({ code: "custom", path, message: "expression contains more than 64 leaves" });
621
+ }
622
+ export function defineHealthScenario(input) {
623
+ return HealthScenarioSchema.parse(input);
624
+ }