@apifuse/provider-sdk 2.2.0-beta.7 → 2.2.0-beta.70

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 (478) hide show
  1. package/AUTHORING.md +943 -51
  2. package/CHANGELOG.md +273 -1
  3. package/LICENSE +21 -0
  4. package/README.md +117 -29
  5. package/SUBMISSION.md +3 -2
  6. package/bin/apifuse-check.ts +293 -13
  7. package/bin/apifuse-dev.ts +42 -19
  8. package/bin/apifuse-migrate-deployment.ts +200 -0
  9. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  10. package/bin/apifuse-migrate-shape.ts +202 -0
  11. package/bin/apifuse-pack-check.ts +19 -6
  12. package/bin/apifuse-pack-smoke.ts +57 -2
  13. package/bin/apifuse-pack-types.ts +736 -38
  14. package/bin/apifuse-perf.ts +59 -23
  15. package/bin/apifuse-record.ts +923 -94
  16. package/bin/apifuse-submit-check.ts +2313 -281
  17. package/bin/apifuse-test.ts +3 -1
  18. package/bin/submit-check-delimited-text.ts +50 -0
  19. package/dist/auth-turn/index.d.ts +3 -3
  20. package/dist/auth-turn/index.js +1 -1
  21. package/dist/auth.d.ts +14 -0
  22. package/dist/auth.js +67 -0
  23. package/dist/ceremonies/index.d.ts +16 -0
  24. package/dist/ceremonies/index.js +141 -36
  25. package/dist/cli/commands.d.ts +1 -1
  26. package/dist/cli/commands.js +30 -0
  27. package/dist/cli/create.d.ts +1 -1
  28. package/dist/cli/create.js +8 -2
  29. package/dist/cli/deployment-intent.d.ts +178 -0
  30. package/dist/cli/deployment-intent.js +277 -0
  31. package/dist/cli/local-connection.d.ts +111 -0
  32. package/dist/cli/local-connection.js +151 -0
  33. package/dist/cli/migrate-deployment-intent.d.ts +132 -0
  34. package/dist/cli/migrate-deployment-intent.js +1552 -0
  35. package/dist/cli/migrate-operation-declaration.d.ts +70 -0
  36. package/dist/cli/migrate-operation-declaration.js +2206 -0
  37. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  38. package/dist/cli/migrate-operation-shape.js +113 -0
  39. package/dist/cli/migrate-provider-shape.d.ts +56 -0
  40. package/dist/cli/migrate-provider-shape.js +580 -0
  41. package/dist/cli/resolver-runtime.d.ts +21 -0
  42. package/dist/cli/resolver-runtime.js +31 -0
  43. package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  44. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  45. package/dist/cli/templates/provider/README.md.tpl +41 -19
  46. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  47. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  48. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  49. package/dist/config/loader.d.ts +202 -16
  50. package/dist/config/loader.js +491 -141
  51. package/dist/contract-serialization.js +4 -8
  52. package/dist/contract-types.d.ts +12 -5
  53. package/dist/contract.js +24 -10
  54. package/dist/declaration-validation.d.ts +34 -0
  55. package/dist/declaration-validation.js +305 -0
  56. package/dist/define.d.ts +71 -29
  57. package/dist/define.js +807 -69
  58. package/dist/dev.d.ts +5 -0
  59. package/dist/dev.js +8 -1
  60. package/dist/engine.d.ts +129 -0
  61. package/dist/engine.js +209 -0
  62. package/dist/error-observability.d.ts +7 -0
  63. package/dist/error-observability.js +61 -0
  64. package/dist/error-resolution.d.ts +18 -0
  65. package/dist/error-resolution.js +243 -0
  66. package/dist/errors.d.ts +74 -0
  67. package/dist/errors.js +99 -0
  68. package/dist/fixture-sanitization.d.ts +28 -0
  69. package/dist/fixture-sanitization.js +371 -0
  70. package/dist/handle-meta.d.ts +90 -0
  71. package/dist/handle-meta.js +73 -0
  72. package/dist/handle.d.ts +226 -0
  73. package/dist/handle.js +345 -0
  74. package/dist/health-scenario.d.ts +1901 -0
  75. package/dist/health-scenario.js +653 -0
  76. package/dist/i18n/catalog.js +21 -1
  77. package/dist/i18n/error-messages.d.ts +86 -0
  78. package/dist/i18n/error-messages.js +192 -0
  79. package/dist/i18n/index.d.ts +1 -0
  80. package/dist/i18n/index.js +1 -0
  81. package/dist/i18n/keys.d.ts +12 -0
  82. package/dist/i18n/keys.js +76 -5
  83. package/dist/i18n/operation-locale-namespace.d.ts +2 -0
  84. package/dist/i18n/operation-locale-namespace.js +7 -0
  85. package/dist/index.d.ts +40 -15
  86. package/dist/index.js +29 -11
  87. package/dist/lint.d.ts +43 -11
  88. package/dist/lint.js +2512 -177
  89. package/dist/native-address.d.ts +43 -0
  90. package/dist/native-address.js +281 -0
  91. package/dist/native-egress-policy.d.ts +31 -0
  92. package/dist/native-egress-policy.js +288 -0
  93. package/dist/observability.d.ts +5 -2
  94. package/dist/observability.js +48 -1
  95. package/dist/provider.d.ts +18 -8
  96. package/dist/provider.js +11 -6
  97. package/dist/runtime/auth-flow.d.ts +6 -1
  98. package/dist/runtime/auth-flow.js +8 -0
  99. package/dist/runtime/bounded-expiring-map.d.ts +21 -0
  100. package/dist/runtime/bounded-expiring-map.js +64 -0
  101. package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
  102. package/dist/runtime/browser-telemetry-binding.js +83 -0
  103. package/dist/runtime/browser-telemetry.d.ts +76 -0
  104. package/dist/runtime/browser-telemetry.js +165 -0
  105. package/dist/runtime/browser.d.ts +4 -0
  106. package/dist/runtime/browser.js +688 -83
  107. package/dist/runtime/cache-telemetry.d.ts +71 -0
  108. package/dist/runtime/cache-telemetry.js +177 -0
  109. package/dist/runtime/cache.d.ts +3 -0
  110. package/dist/runtime/cache.js +245 -23
  111. package/dist/runtime/capability-response.d.ts +3 -0
  112. package/dist/runtime/capability-response.js +56 -0
  113. package/dist/runtime/capability-telemetry.d.ts +46 -0
  114. package/dist/runtime/capability-telemetry.js +68 -0
  115. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  116. package/dist/runtime/chrome149-header-order.js +289 -0
  117. package/dist/runtime/diagnostic-env-values.d.ts +5 -0
  118. package/dist/runtime/diagnostic-env-values.js +57 -0
  119. package/dist/runtime/diagnostic-env.d.ts +14 -0
  120. package/dist/runtime/diagnostic-env.js +44 -0
  121. package/dist/runtime/diagnostic-redactor.d.ts +54 -0
  122. package/dist/runtime/diagnostic-redactor.js +571 -0
  123. package/dist/runtime/egress-lease.d.ts +65 -0
  124. package/dist/runtime/egress-lease.js +236 -0
  125. package/dist/runtime/engine-mode.d.ts +74 -0
  126. package/dist/runtime/engine-mode.js +152 -0
  127. package/dist/runtime/env.js +14 -1
  128. package/dist/runtime/executor.d.ts +3 -2
  129. package/dist/runtime/executor.js +23 -26
  130. package/dist/runtime/handle-wordlist.d.ts +43 -0
  131. package/dist/runtime/handle-wordlist.js +256 -0
  132. package/dist/runtime/handle.d.ts +71 -0
  133. package/dist/runtime/handle.js +908 -0
  134. package/dist/runtime/http-telemetry-binding.d.ts +10 -0
  135. package/dist/runtime/http-telemetry-binding.js +152 -0
  136. package/dist/runtime/http-telemetry-guard.d.ts +16 -0
  137. package/dist/runtime/http-telemetry-guard.js +202 -0
  138. package/dist/runtime/http-telemetry.d.ts +104 -0
  139. package/dist/runtime/http-telemetry.js +190 -0
  140. package/dist/runtime/http.d.ts +34 -0
  141. package/dist/runtime/http.js +680 -121
  142. package/dist/runtime/insights.js +2 -2
  143. package/dist/runtime/instrumentation.d.ts +2 -2
  144. package/dist/runtime/instrumentation.js +462 -19
  145. package/dist/runtime/native-network-errors.d.ts +33 -0
  146. package/dist/runtime/native-network-errors.js +69 -0
  147. package/dist/runtime/native-network.d.ts +105 -0
  148. package/dist/runtime/native-network.js +1433 -0
  149. package/dist/runtime/native-telemetry.d.ts +142 -0
  150. package/dist/runtime/native-telemetry.js +231 -0
  151. package/dist/runtime/ocr-telemetry.d.ts +82 -0
  152. package/dist/runtime/ocr-telemetry.js +192 -0
  153. package/dist/runtime/ocr.d.ts +29 -0
  154. package/dist/runtime/ocr.js +468 -0
  155. package/dist/runtime/otlp.d.ts +71 -2
  156. package/dist/runtime/otlp.js +398 -16
  157. package/dist/runtime/provider.d.ts +7 -0
  158. package/dist/runtime/provider.js +14 -0
  159. package/dist/runtime/proxy-errors.js +6 -2
  160. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  161. package/dist/runtime/proxy-nodemaven.js +147 -0
  162. package/dist/runtime/proxy-retry-policy.d.ts +4 -1
  163. package/dist/runtime/proxy-retry-policy.js +11 -2
  164. package/dist/runtime/proxy-telemetry.d.ts +133 -3
  165. package/dist/runtime/proxy-telemetry.js +218 -70
  166. package/dist/runtime/redirect-hop-headers.d.ts +19 -0
  167. package/dist/runtime/redirect-hop-headers.js +58 -0
  168. package/dist/runtime/redirects.d.ts +61 -0
  169. package/dist/runtime/redirects.js +149 -0
  170. package/dist/runtime/redis.d.ts +1 -1
  171. package/dist/runtime/redis.js +4 -2
  172. package/dist/runtime/request-options.d.ts +75 -1
  173. package/dist/runtime/request-options.js +588 -0
  174. package/dist/runtime/request-telemetry.d.ts +70 -0
  175. package/dist/runtime/request-telemetry.js +229 -0
  176. package/dist/runtime/resolver-config.d.ts +13 -0
  177. package/dist/runtime/resolver-config.js +14 -0
  178. package/dist/runtime/resolver-public.d.ts +3 -0
  179. package/dist/runtime/resolver-public.js +1 -0
  180. package/dist/runtime/resolver-runtime-options.d.ts +14 -0
  181. package/dist/runtime/resolver-runtime-options.js +33 -0
  182. package/dist/runtime/resolver-shared.d.ts +24 -0
  183. package/dist/runtime/resolver-shared.js +69 -0
  184. package/dist/runtime/resolver-span-attributes.d.ts +34 -0
  185. package/dist/runtime/resolver-span-attributes.js +93 -0
  186. package/dist/runtime/resolver-telemetry.d.ts +135 -0
  187. package/dist/runtime/resolver-telemetry.js +204 -0
  188. package/dist/runtime/resolver-usage.d.ts +32 -0
  189. package/dist/runtime/resolver-usage.js +54 -0
  190. package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
  191. package/dist/runtime/resolver-vendors/bindings.js +45 -0
  192. package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
  193. package/dist/runtime/resolver-vendors/browser.js +423 -0
  194. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  195. package/dist/runtime/resolver-vendors/capsolver.js +544 -0
  196. package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
  197. package/dist/runtime/resolver-vendors/hosts.js +68 -0
  198. package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
  199. package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
  200. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  201. package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
  202. package/dist/runtime/resolver-vendors/types.d.ts +125 -0
  203. package/dist/runtime/resolver-vendors/types.js +106 -0
  204. package/dist/runtime/resolver.d.ts +79 -0
  205. package/dist/runtime/resolver.js +1094 -0
  206. package/dist/runtime/state-telemetry.d.ts +79 -0
  207. package/dist/runtime/state-telemetry.js +194 -0
  208. package/dist/runtime/state.d.ts +10 -1
  209. package/dist/runtime/state.js +322 -82
  210. package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
  211. package/dist/runtime/stealth-akamai-sbsd.js +142 -0
  212. package/dist/runtime/stealth-cookies.d.ts +24 -0
  213. package/dist/runtime/stealth-cookies.js +131 -0
  214. package/dist/runtime/stealth-owned-headers.d.ts +39 -0
  215. package/dist/runtime/stealth-owned-headers.js +57 -0
  216. package/dist/runtime/stealth-telemetry.d.ts +92 -0
  217. package/dist/runtime/stealth-telemetry.js +179 -0
  218. package/dist/runtime/stealth.d.ts +45 -6
  219. package/dist/runtime/stealth.js +1775 -320
  220. package/dist/runtime/stt-telemetry.d.ts +77 -0
  221. package/dist/runtime/stt-telemetry.js +176 -0
  222. package/dist/runtime/stt.js +18 -19
  223. package/dist/runtime/timeout.d.ts +5 -0
  224. package/dist/runtime/timeout.js +12 -0
  225. package/dist/runtime/trace-config.d.ts +12 -0
  226. package/dist/runtime/trace-config.js +62 -0
  227. package/dist/runtime/trace.d.ts +17 -0
  228. package/dist/runtime/trace.js +176 -25
  229. package/dist/runtime-boundary-lint.d.ts +137 -0
  230. package/dist/runtime-boundary-lint.js +590 -0
  231. package/dist/schema.d.ts +20 -0
  232. package/dist/schema.js +72 -2
  233. package/dist/serve.d.ts +1 -1
  234. package/dist/serve.js +1 -1
  235. package/dist/server/error-observability.d.ts +1 -0
  236. package/dist/server/error-observability.js +1 -0
  237. package/dist/server/error-stack-frames.d.ts +35 -0
  238. package/dist/server/error-stack-frames.js +219 -0
  239. package/dist/server/index.d.ts +21 -2
  240. package/dist/server/index.js +11 -2
  241. package/dist/server/runtime-diagnostics.d.ts +165 -0
  242. package/dist/server/runtime-diagnostics.js +360 -0
  243. package/dist/server/sdk-version.d.ts +3 -0
  244. package/dist/server/sdk-version.js +19 -0
  245. package/dist/server/self-test-input-tokens.d.ts +2 -1
  246. package/dist/server/self-test-input-tokens.js +18 -14
  247. package/dist/server/self-test-redaction.js +8 -33
  248. package/dist/server/self-test.d.ts +18 -3
  249. package/dist/server/self-test.js +139 -76
  250. package/dist/server/sensitive-values.d.ts +26 -0
  251. package/dist/server/sensitive-values.js +137 -0
  252. package/dist/server/serve-implementation.d.ts +285 -0
  253. package/dist/server/serve-implementation.js +3172 -0
  254. package/dist/server/serve.d.ts +1 -75
  255. package/dist/server/serve.js +1 -1170
  256. package/dist/server/state-backend-report.d.ts +70 -0
  257. package/dist/server/state-backend-report.js +113 -0
  258. package/dist/server/trace-output.d.ts +7 -0
  259. package/dist/server/trace-output.js +111 -0
  260. package/dist/server/types.d.ts +37 -5
  261. package/dist/server/types.js +34 -1
  262. package/dist/stateful/errors.d.ts +19 -0
  263. package/dist/stateful/errors.js +24 -0
  264. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  265. package/dist/stateful/http-provider-event-emitter.js +237 -0
  266. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  267. package/dist/stateful/http-session-owner-registry.js +210 -0
  268. package/dist/stateful/index.d.ts +18 -0
  269. package/dist/stateful/index.js +18 -0
  270. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  271. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  272. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  273. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  274. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  275. package/dist/stateful/provider-event-pipeline.js +1 -0
  276. package/dist/stateful/provider-events.d.ts +101 -0
  277. package/dist/stateful/provider-events.js +289 -0
  278. package/dist/stateful/session-key.d.ts +15 -0
  279. package/dist/stateful/session-key.js +86 -0
  280. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  281. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  282. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  283. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  284. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  285. package/dist/stateful/stateful-provider-adapter.js +287 -0
  286. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  287. package/dist/stateful/stateful-provider-observability.js +161 -0
  288. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  289. package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
  290. package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
  291. package/dist/stateful/stateful-provider-runtime-context.js +61 -0
  292. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  293. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  294. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  295. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  296. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  297. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  298. package/dist/stateful-signing.d.ts +18 -0
  299. package/dist/stateful-signing.js +27 -0
  300. package/dist/stealth/profiles.d.ts +15 -4
  301. package/dist/stealth/profiles.js +169 -211
  302. package/dist/stream-evidence.d.ts +74 -0
  303. package/dist/stream-evidence.js +785 -0
  304. package/dist/stream.js +7 -1
  305. package/dist/testing/index.d.ts +2 -1
  306. package/dist/testing/index.js +2 -1
  307. package/dist/testing/run.d.ts +32 -2
  308. package/dist/testing/run.js +509 -25
  309. package/dist/trace-sanitization.d.ts +6 -0
  310. package/dist/trace-sanitization.js +68 -0
  311. package/dist/types.d.ts +899 -210
  312. package/dist/types.js +1 -0
  313. package/dist/typescript-module.d.ts +39 -0
  314. package/dist/typescript-module.js +72 -0
  315. package/package.json +52 -6
  316. package/src/auth-turn/index.ts +1 -1
  317. package/src/auth.ts +118 -0
  318. package/src/ceremonies/index.ts +189 -46
  319. package/src/cli/commands.ts +37 -0
  320. package/src/cli/create.ts +8 -2
  321. package/src/cli/deployment-intent.ts +364 -0
  322. package/src/cli/local-connection.ts +221 -0
  323. package/src/cli/migrate-deployment-intent.ts +1908 -0
  324. package/src/cli/migrate-operation-declaration.ts +3026 -0
  325. package/src/cli/migrate-operation-shape.ts +184 -0
  326. package/src/cli/migrate-provider-shape.ts +778 -0
  327. package/src/cli/resolver-runtime.ts +72 -0
  328. package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  329. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  330. package/src/cli/templates/provider/README.md.tpl +41 -19
  331. package/src/cli/templates/provider/index.ts.tpl +6 -3
  332. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  333. package/src/cli/templates/provider/provider.json.tpl +6 -0
  334. package/src/config/loader.ts +774 -181
  335. package/src/contract-serialization.ts +5 -7
  336. package/src/contract-types.ts +12 -5
  337. package/src/contract.ts +24 -10
  338. package/src/declaration-validation.ts +376 -0
  339. package/src/define.ts +1105 -131
  340. package/src/dev.ts +13 -1
  341. package/src/engine.ts +390 -0
  342. package/src/error-observability.ts +64 -0
  343. package/src/error-resolution.ts +269 -0
  344. package/src/errors.ts +157 -0
  345. package/src/fixture-sanitization.ts +422 -0
  346. package/src/handle-meta.ts +143 -0
  347. package/src/handle.ts +694 -0
  348. package/src/health-scenario.ts +960 -0
  349. package/src/i18n/catalog.ts +23 -1
  350. package/src/i18n/error-messages.ts +255 -0
  351. package/src/i18n/index.ts +1 -0
  352. package/src/i18n/keys.ts +80 -6
  353. package/src/i18n/operation-locale-namespace.ts +10 -0
  354. package/src/index.ts +390 -23
  355. package/src/lint.ts +2975 -234
  356. package/src/native-address.ts +340 -0
  357. package/src/native-egress-policy.ts +358 -0
  358. package/src/observability.ts +51 -1
  359. package/src/provider.ts +207 -27
  360. package/src/runtime/auth-flow.ts +15 -0
  361. package/src/runtime/bounded-expiring-map.ts +67 -0
  362. package/src/runtime/browser-telemetry-binding.ts +92 -0
  363. package/src/runtime/browser-telemetry.ts +289 -0
  364. package/src/runtime/browser.ts +882 -99
  365. package/src/runtime/cache-telemetry.ts +247 -0
  366. package/src/runtime/cache.ts +258 -22
  367. package/src/runtime/capability-response.ts +53 -0
  368. package/src/runtime/capability-telemetry.ts +101 -0
  369. package/src/runtime/chrome149-header-order.ts +330 -0
  370. package/src/runtime/diagnostic-env-values.ts +56 -0
  371. package/src/runtime/diagnostic-env.ts +65 -0
  372. package/src/runtime/diagnostic-redactor.ts +668 -0
  373. package/src/runtime/egress-lease.ts +341 -0
  374. package/src/runtime/engine-mode.ts +233 -0
  375. package/src/runtime/env.ts +15 -1
  376. package/src/runtime/executor.ts +39 -32
  377. package/src/runtime/handle-wordlist.ts +266 -0
  378. package/src/runtime/handle.ts +1180 -0
  379. package/src/runtime/http-telemetry-binding.ts +162 -0
  380. package/src/runtime/http-telemetry-guard.ts +208 -0
  381. package/src/runtime/http-telemetry.ts +292 -0
  382. package/src/runtime/http.ts +896 -150
  383. package/src/runtime/insights.ts +2 -2
  384. package/src/runtime/instrumentation.ts +628 -28
  385. package/src/runtime/native-network-errors.ts +99 -0
  386. package/src/runtime/native-network.ts +1853 -0
  387. package/src/runtime/native-telemetry.ts +366 -0
  388. package/src/runtime/ocr-telemetry.ts +308 -0
  389. package/src/runtime/ocr.ts +564 -0
  390. package/src/runtime/otlp.ts +468 -21
  391. package/src/runtime/provider.ts +15 -0
  392. package/src/runtime/proxy-errors.ts +12 -4
  393. package/src/runtime/proxy-nodemaven.ts +222 -0
  394. package/src/runtime/proxy-retry-policy.ts +12 -1
  395. package/src/runtime/proxy-telemetry.ts +358 -103
  396. package/src/runtime/redirect-hop-headers.ts +71 -0
  397. package/src/runtime/redirects.ts +215 -0
  398. package/src/runtime/redis.ts +7 -2
  399. package/src/runtime/request-options.ts +728 -1
  400. package/src/runtime/request-telemetry.ts +375 -0
  401. package/src/runtime/resolver-config.ts +18 -0
  402. package/src/runtime/resolver-public.ts +44 -0
  403. package/src/runtime/resolver-runtime-options.ts +50 -0
  404. package/src/runtime/resolver-shared.ts +113 -0
  405. package/src/runtime/resolver-span-attributes.ts +139 -0
  406. package/src/runtime/resolver-telemetry.ts +362 -0
  407. package/src/runtime/resolver-usage.ts +99 -0
  408. package/src/runtime/resolver-vendors/bindings.ts +61 -0
  409. package/src/runtime/resolver-vendors/browser.ts +591 -0
  410. package/src/runtime/resolver-vendors/capsolver.ts +727 -0
  411. package/src/runtime/resolver-vendors/hosts.ts +81 -0
  412. package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
  413. package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
  414. package/src/runtime/resolver-vendors/types.ts +261 -0
  415. package/src/runtime/resolver.ts +1543 -0
  416. package/src/runtime/state-telemetry.ts +298 -0
  417. package/src/runtime/state.ts +435 -89
  418. package/src/runtime/stealth-akamai-sbsd.ts +207 -0
  419. package/src/runtime/stealth-cookies.ts +155 -0
  420. package/src/runtime/stealth-owned-headers.ts +67 -0
  421. package/src/runtime/stealth-telemetry.ts +309 -0
  422. package/src/runtime/stealth.ts +2275 -372
  423. package/src/runtime/stt-telemetry.ts +282 -0
  424. package/src/runtime/stt.ts +96 -91
  425. package/src/runtime/timeout.ts +18 -0
  426. package/src/runtime/trace-config.ts +78 -0
  427. package/src/runtime/trace.ts +257 -35
  428. package/src/runtime-boundary-lint.ts +707 -0
  429. package/src/schema.ts +80 -2
  430. package/src/serve.ts +6 -1
  431. package/src/server/error-observability.ts +1 -0
  432. package/src/server/error-stack-frames.ts +214 -0
  433. package/src/server/index.ts +184 -2
  434. package/src/server/runtime-diagnostics.ts +522 -0
  435. package/src/server/sdk-version.ts +22 -0
  436. package/src/server/self-test-input-tokens.ts +29 -14
  437. package/src/server/self-test-redaction.ts +10 -40
  438. package/src/server/self-test.ts +205 -89
  439. package/src/server/sensitive-values.ts +211 -0
  440. package/src/server/serve-implementation.ts +4596 -0
  441. package/src/server/serve.ts +1 -1685
  442. package/src/server/state-backend-report.ts +185 -0
  443. package/src/server/trace-output.ts +189 -0
  444. package/src/server/types.ts +34 -1
  445. package/src/stateful/README.md +146 -0
  446. package/src/stateful/errors.ts +35 -0
  447. package/src/stateful/http-provider-event-emitter.ts +314 -0
  448. package/src/stateful/http-session-owner-registry.ts +306 -0
  449. package/src/stateful/index.ts +18 -0
  450. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  451. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  452. package/src/stateful/provider-event-pipeline.ts +61 -0
  453. package/src/stateful/provider-events.ts +462 -0
  454. package/src/stateful/session-key.ts +111 -0
  455. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  456. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  457. package/src/stateful/stateful-provider-adapter.ts +562 -0
  458. package/src/stateful/stateful-provider-observability.ts +261 -0
  459. package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
  460. package/src/stateful/stateful-provider-runtime-context.ts +96 -0
  461. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  462. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  463. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  464. package/src/stateful-signing.ts +46 -0
  465. package/src/stealth/profiles.ts +212 -231
  466. package/src/stream-evidence.ts +988 -0
  467. package/src/stream.ts +8 -1
  468. package/src/testing/index.ts +10 -1
  469. package/src/testing/run.ts +685 -19
  470. package/src/trace-sanitization.ts +110 -0
  471. package/src/types.ts +1014 -273
  472. package/src/typescript-module.ts +100 -0
  473. package/dist/choice-token.d.ts +0 -24
  474. package/dist/choice-token.js +0 -74
  475. package/dist/runtime/choice.d.ts +0 -15
  476. package/dist/runtime/choice.js +0 -413
  477. package/src/choice-token.ts +0 -165
  478. package/src/runtime/choice.ts +0 -686
@@ -0,0 +1,653 @@
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({
176
+ code: "custom",
177
+ path: ["pattern"],
178
+ message: "backreferences are not supported by RE2",
179
+ });
180
+ if (/\(\?/.test(value.pattern))
181
+ ctx.addIssue({
182
+ code: "custom",
183
+ path: ["pattern"],
184
+ message: "extended groups are not supported by RE2",
185
+ });
186
+ if (containsNestedRegexQuantifier(value.pattern))
187
+ ctx.addIssue({
188
+ code: "custom",
189
+ path: ["pattern"],
190
+ message: "nested regex quantifiers are not permitted",
191
+ });
192
+ try {
193
+ new RegExp(value.pattern, value.flags);
194
+ }
195
+ catch {
196
+ ctx.addIssue({
197
+ code: "custom",
198
+ path: ["pattern"],
199
+ message: "pattern must be valid regular-expression syntax",
200
+ });
201
+ }
202
+ });
203
+ const operandLiteralSchema = jsonValueSchema.superRefine((value, ctx) => {
204
+ if (value !== null &&
205
+ typeof value === "object" &&
206
+ !Array.isArray(value) &&
207
+ Object.hasOwn(value, "ref"))
208
+ ctx.addIssue({
209
+ code: "custom",
210
+ message: 'the object key "ref" is reserved for a validated reference',
211
+ });
212
+ });
213
+ const operandSchema = z.union([operandLiteralSchema, referenceNodeSchema]);
214
+ export const OperandSchema = operandSchema;
215
+ const predicateSchema = z.union([
216
+ z
217
+ .object({
218
+ kind: z.literal("predicate"),
219
+ operator: z.enum(["exists", "not_exists", "non_empty", "is_true"]),
220
+ actual: operandSchema,
221
+ })
222
+ .strict(),
223
+ z
224
+ .object({
225
+ kind: z.literal("predicate"),
226
+ operator: z.enum(["equals", "not_equals", "contains"]),
227
+ actual: operandSchema,
228
+ expected: operandSchema,
229
+ })
230
+ .strict(),
231
+ z
232
+ .object({
233
+ kind: z.literal("predicate"),
234
+ operator: z.literal("matches"),
235
+ actual: operandSchema,
236
+ pattern: SafeRegexSchema,
237
+ })
238
+ .strict(),
239
+ z
240
+ .object({
241
+ kind: z.literal("predicate"),
242
+ operator: z.enum(["number_gt", "number_gte", "number_lt", "number_lte"]),
243
+ actual: operandSchema,
244
+ expected: operandSchema,
245
+ })
246
+ .strict(),
247
+ z
248
+ .object({
249
+ kind: z.literal("predicate"),
250
+ operator: z.enum(["array_length_eq", "array_length_gte", "array_length_lte"]),
251
+ actual: operandSchema,
252
+ expected: z.number().finite().int().nonnegative(),
253
+ })
254
+ .strict(),
255
+ z
256
+ .object({
257
+ kind: z.literal("predicate"),
258
+ operator: z.literal("status_2xx"),
259
+ actual: operandSchema,
260
+ })
261
+ .strict(),
262
+ z
263
+ .object({
264
+ kind: z.literal("predicate"),
265
+ operator: z.literal("type_is"),
266
+ actual: operandSchema,
267
+ expected: z.enum(["null", "boolean", "number", "string", "object", "array"]),
268
+ })
269
+ .strict(),
270
+ ]);
271
+ export const AssertionPredicateSchema = predicateSchema;
272
+ const scopedItemReferenceSchema = z
273
+ .object({
274
+ namespace: z.literal("item"),
275
+ binding: z.string().min(1),
276
+ path: z.array(pathPartSchema).max(12),
277
+ })
278
+ .strict();
279
+ export const ScopedItemReferenceSchema = scopedItemReferenceSchema;
280
+ const scopedOperandSchema = z.union([
281
+ operandLiteralSchema,
282
+ z.object({ ref: scopedItemReferenceSchema }).strict(),
283
+ referenceNodeSchema,
284
+ ]);
285
+ export const ScopedOperandSchema = scopedOperandSchema;
286
+ const scopedPredicateSchema = z.union([
287
+ z
288
+ .object({
289
+ kind: z.literal("predicate"),
290
+ operator: z.enum(["exists", "not_exists", "non_empty", "is_true"]),
291
+ actual: scopedOperandSchema,
292
+ })
293
+ .strict(),
294
+ z
295
+ .object({
296
+ kind: z.literal("predicate"),
297
+ operator: z.enum(["equals", "not_equals", "contains"]),
298
+ actual: scopedOperandSchema,
299
+ expected: scopedOperandSchema,
300
+ })
301
+ .strict(),
302
+ z
303
+ .object({
304
+ kind: z.literal("predicate"),
305
+ operator: z.literal("matches"),
306
+ actual: scopedOperandSchema,
307
+ pattern: SafeRegexSchema,
308
+ })
309
+ .strict(),
310
+ z
311
+ .object({
312
+ kind: z.literal("predicate"),
313
+ operator: z.enum(["number_gt", "number_gte", "number_lt", "number_lte"]),
314
+ actual: scopedOperandSchema,
315
+ expected: scopedOperandSchema,
316
+ })
317
+ .strict(),
318
+ z
319
+ .object({
320
+ kind: z.literal("predicate"),
321
+ operator: z.enum(["array_length_eq", "array_length_gte", "array_length_lte"]),
322
+ actual: scopedOperandSchema,
323
+ expected: z.number().finite().int().nonnegative(),
324
+ })
325
+ .strict(),
326
+ z
327
+ .object({
328
+ kind: z.literal("predicate"),
329
+ operator: z.literal("status_2xx"),
330
+ actual: scopedOperandSchema,
331
+ })
332
+ .strict(),
333
+ z
334
+ .object({
335
+ kind: z.literal("predicate"),
336
+ operator: z.literal("type_is"),
337
+ actual: scopedOperandSchema,
338
+ expected: z.enum(["null", "boolean", "number", "string", "object", "array"]),
339
+ })
340
+ .strict(),
341
+ ]);
342
+ export const ScopedAssertionPredicateSchema = scopedPredicateSchema;
343
+ const scopedExpressionSchema = z.lazy(() => z.union([
344
+ z.object({ kind: z.literal("all"), clauses: nonEmptyArray(scopedExpressionSchema) }).strict(),
345
+ z.object({ kind: z.literal("any"), clauses: nonEmptyArray(scopedExpressionSchema) }).strict(),
346
+ z.object({ kind: z.literal("not"), clause: scopedExpressionSchema }).strict(),
347
+ scopedPredicateSchema,
348
+ ]));
349
+ export const ScopedAssertionExpressionSchema = scopedExpressionSchema;
350
+ const quantifierSchema = z
351
+ .object({
352
+ kind: z.literal("quantifier"),
353
+ quantifier: z.enum(["every", "any"]),
354
+ items: z.object({ ref: z.union([stepReferenceSchema, candidateReferenceSchema]) }).strict(),
355
+ itemBinding: z.string().min(1),
356
+ maxItems: finiteInt(1, 100),
357
+ clause: scopedExpressionSchema,
358
+ })
359
+ .strict();
360
+ export const QuantifierSchema = quantifierSchema;
361
+ const expressionSchema = z.lazy(() => z.union([
362
+ z.object({ kind: z.literal("all"), clauses: nonEmptyArray(expressionSchema) }).strict(),
363
+ z.object({ kind: z.literal("any"), clauses: nonEmptyArray(expressionSchema) }).strict(),
364
+ z.object({ kind: z.literal("not"), clause: expressionSchema }).strict(),
365
+ predicateSchema,
366
+ quantifierSchema,
367
+ ]));
368
+ export const AssertionExpressionSchema = expressionSchema;
369
+ const retryPolicySchema = z
370
+ .object({
371
+ maxAttempts: finiteInt(1, 3),
372
+ retryOn: nonEmptyArray(z.enum(["transport_error", "timeout", "http_429", "http_5xx"])),
373
+ backoff: z.union([
374
+ z
375
+ .object({ kind: z.literal("fixed"), delayMs: z.number().finite().int().nonnegative() })
376
+ .strict(),
377
+ z
378
+ .object({
379
+ kind: z.literal("exponential"),
380
+ initialDelayMs: z.number().finite().int().nonnegative(),
381
+ maxDelayMs: z.number().finite().int().nonnegative(),
382
+ })
383
+ .strict(),
384
+ ]),
385
+ attemptTimeoutMs: finiteInt(1, 600_000).optional(),
386
+ })
387
+ .strict();
388
+ export const RetryPolicySchema = retryPolicySchema;
389
+ const candidatePolicySchema = z
390
+ .object({
391
+ items: stepReferenceSchema,
392
+ itemBinding: z.string().min(1),
393
+ itemType: z.enum(["string", "number", "object"]),
394
+ maxAttempts: finiteInt(1, 10),
395
+ accept: expressionSchema,
396
+ })
397
+ .strict();
398
+ export const CandidatePolicySchema = candidatePolicySchema;
399
+ const candidateBlockSchema = z
400
+ .object({
401
+ scope: z.literal("step_block"),
402
+ items: stepReferenceSchema,
403
+ itemBinding: z.string().min(1),
404
+ itemType: z.enum(["string", "number", "object"]),
405
+ members: z
406
+ .array(z.string().min(1))
407
+ .min(2)
408
+ .max(16)
409
+ .transform((value) => value),
410
+ maxAttempts: finiteInt(1, 10),
411
+ accept: expressionSchema,
412
+ })
413
+ .strict();
414
+ export const CandidateBlockSchema = candidateBlockSchema;
415
+ const journalPolicySchema = z
416
+ .object({
417
+ kind: z.literal("side_effect_barrier"),
418
+ version: z.literal(1),
419
+ key: referenceSchema,
420
+ before: z.literal("required"),
421
+ after: z.literal("required"),
422
+ replay: z.literal("deny_after_started"),
423
+ })
424
+ .strict();
425
+ export const JournalPolicySchema = journalPolicySchema;
426
+ const stepBaseSchema = z
427
+ .object({
428
+ id: z.string().min(1),
429
+ result: z.string().min(1),
430
+ timeoutMs: finiteInt(1, 600_000).optional(),
431
+ })
432
+ .strict();
433
+ /**
434
+ * Every member of the union, pinned in both directions: a code missing here
435
+ * fails `satisfies Record<GuardReasonCode, true>`, a code added here without
436
+ * the union fails the excess-property check. The union itself stays a
437
+ * literal so the type-only entry points (contract, server, testing) do not
438
+ * have to re-export the runtime tuple.
439
+ */
440
+ const GUARD_REASON_CODE_SET = {
441
+ expected_absence: true,
442
+ served_stale_cache: true,
443
+ };
444
+ /** The closed vocabulary as a non-empty tuple, for schema and lint consumers. */
445
+ export const GUARD_REASON_CODES = Object.keys(GUARD_REASON_CODE_SET);
446
+ const attributionSchema = z
447
+ .object({
448
+ operationId: z.string().min(1),
449
+ status: z.literal("degraded"),
450
+ reasonCode: z.enum(GUARD_REASON_CODES),
451
+ reasonKey: z.string().min(1),
452
+ })
453
+ .strict();
454
+ const findFirstSchema = z
455
+ .object({
456
+ kind: z.literal("find_first"),
457
+ itemBinding: z.string().min(1),
458
+ predicate: scopedExpressionSchema,
459
+ maxScan: finiteInt(1, 100),
460
+ })
461
+ .strict();
462
+ export const FindFirstSchema = findFirstSchema;
463
+ const operationStepSchema = stepBaseSchema
464
+ .extend({
465
+ kind: z.literal("operation"),
466
+ operationId: z.string().min(1),
467
+ inputTemplate: jsonTemplateSchema,
468
+ connection: credentialReferenceSchema.optional(),
469
+ retry: retryPolicySchema.optional(),
470
+ candidate: z.union([candidatePolicySchema, candidateBlockSchema]).optional(),
471
+ journal: journalPolicySchema.optional(),
472
+ })
473
+ .strict();
474
+ const extractStepSchema = stepBaseSchema
475
+ .extend({
476
+ kind: z.literal("extract"),
477
+ from: stepReferenceSchema,
478
+ selector: z.union([BoundedJsonPathSchema, findFirstSchema]),
479
+ valueType: valueTypeSchema,
480
+ required: z.boolean(),
481
+ })
482
+ .strict();
483
+ const assertStepSchema = stepBaseSchema
484
+ .extend({
485
+ kind: z.literal("assert"),
486
+ coversOperations: nonEmptyArray(z.string().min(1)),
487
+ expression: expressionSchema,
488
+ })
489
+ .strict();
490
+ const guardStepSchema = stepBaseSchema
491
+ .extend({
492
+ kind: z.literal("guard"),
493
+ condition: expressionSchema,
494
+ onFail: z
495
+ .object({ attribute: nonEmptyArray(attributionSchema), stop: z.literal("scenario") })
496
+ .strict(),
497
+ })
498
+ .strict();
499
+ export const HealthStepSchema = z.discriminatedUnion("kind", [
500
+ operationStepSchema,
501
+ extractStepSchema,
502
+ assertStepSchema,
503
+ guardStepSchema,
504
+ ]);
505
+ export const OperationStepSchema = operationStepSchema;
506
+ export const ExtractStepSchema = extractStepSchema;
507
+ export const AssertStepSchema = assertStepSchema;
508
+ export const GuardStepSchema = guardStepSchema;
509
+ const manualTriggerSchema = z.union([
510
+ z.object({ enabled: z.literal(false), reasonKey: z.string().min(1) }).strict(),
511
+ z
512
+ .object({
513
+ enabled: z.literal(true),
514
+ requiresAcknowledgement: z.boolean(),
515
+ risk: z.enum(["read_only", "writes_external_state"]),
516
+ minManualIntervalMs: finiteInt(1000, 86_400_000),
517
+ publicRationaleKey: z.string().min(1),
518
+ })
519
+ .strict(),
520
+ ]);
521
+ export const ManualTriggerPolicySchema = manualTriggerSchema;
522
+ const credentialRefDeclarationSchema = z
523
+ .object({ alias: z.string().min(1), kind: z.literal("connection") })
524
+ .strict();
525
+ export const CredentialRefDeclarationSchema = credentialRefDeclarationSchema;
526
+ export const HealthScenarioSchema = z
527
+ .object({
528
+ scenarioVersion: z.literal(2),
529
+ id: z.string().min(1),
530
+ display: z
531
+ .object({ titleKey: z.string().min(1), descriptionKey: z.string().min(1).optional() })
532
+ .strict(),
533
+ schedule: z
534
+ .object({
535
+ kind: z.literal("interval"),
536
+ intervalMs: finiteInt(30_000, 604_800_000),
537
+ jitterMs: finiteInt(0),
538
+ })
539
+ .strict(),
540
+ timeoutMs: finiteInt(1000, 600_000),
541
+ cooldownMs: finiteInt(0, 86_400_000).optional(),
542
+ manualTrigger: manualTriggerSchema.optional(),
543
+ coversOperations: nonEmptyArray(z.string().min(1)),
544
+ credentialRefs: z.array(credentialRefDeclarationSchema),
545
+ steps: z
546
+ .array(HealthStepSchema)
547
+ .min(1)
548
+ .max(64)
549
+ .transform((value) => value),
550
+ })
551
+ .strict()
552
+ .superRefine((value, ctx) => {
553
+ if (value.schedule.jitterMs > value.schedule.intervalMs)
554
+ ctx.addIssue({
555
+ code: "custom",
556
+ path: ["schedule", "jitterMs"],
557
+ message: "jitterMs must not exceed intervalMs",
558
+ });
559
+ if (value.timeoutMs > value.schedule.intervalMs)
560
+ ctx.addIssue({
561
+ code: "custom",
562
+ path: ["timeoutMs"],
563
+ message: "timeoutMs must not exceed intervalMs",
564
+ });
565
+ const ids = new Set();
566
+ const bindings = new Set();
567
+ for (const [index, step] of value.steps.entries()) {
568
+ if (ids.has(step.id))
569
+ ctx.addIssue({
570
+ code: "custom",
571
+ path: ["steps", index, "id"],
572
+ message: `duplicate step ${step.id}`,
573
+ });
574
+ ids.add(step.id);
575
+ if (bindings.has(step.result))
576
+ ctx.addIssue({
577
+ code: "custom",
578
+ path: ["steps", index, "result"],
579
+ message: `duplicate result binding ${step.result}`,
580
+ });
581
+ bindings.add(step.result);
582
+ if (step.timeoutMs !== undefined && step.timeoutMs > value.timeoutMs)
583
+ ctx.addIssue({
584
+ code: "custom",
585
+ path: ["steps", index, "timeoutMs"],
586
+ message: "step timeout must not exceed the scenario timeout",
587
+ });
588
+ if (step.kind === "operation" &&
589
+ step.retry?.retryOn.includes("timeout") &&
590
+ step.retry.attemptTimeoutMs === undefined)
591
+ ctx.addIssue({
592
+ code: "custom",
593
+ path: ["steps", index, "retry", "attemptTimeoutMs"],
594
+ message: "timeout retry requires attemptTimeoutMs",
595
+ });
596
+ const expression = step.kind === "assert"
597
+ ? step.expression
598
+ : step.kind === "guard"
599
+ ? step.condition
600
+ : step.kind === "operation" && step.candidate
601
+ ? step.candidate.accept
602
+ : undefined;
603
+ if (expression)
604
+ walkExpression(expression, ctx, ["steps", index], 0, { count: 0 }, true);
605
+ if (step.kind === "extract" && "kind" in step.selector && step.selector.kind === "find_first")
606
+ walkExpression(step.selector.predicate, ctx, ["steps", index, "selector", "predicate"], 0, { count: 0 }, false, step.selector.itemBinding);
607
+ }
608
+ try {
609
+ const serialized = JSON.stringify(value);
610
+ if (new TextEncoder().encode(serialized).byteLength > 128 * 1024)
611
+ ctx.addIssue({ code: "custom", path: [], message: "serialized scenario exceeds 128 KiB" });
612
+ }
613
+ catch {
614
+ ctx.addIssue({ code: "custom", path: [], message: "scenario must be JSON-serializable" });
615
+ }
616
+ });
617
+ function walkExpression(expression, ctx, path, depth, leaves, allowQuantifier, scopedBinding) {
618
+ if (depth > 8) {
619
+ ctx.addIssue({ code: "custom", path, message: "expression depth exceeds 8" });
620
+ return;
621
+ }
622
+ if (expression.kind === "quantifier") {
623
+ if (!allowQuantifier) {
624
+ ctx.addIssue({ code: "custom", path, message: "quantifiers may not be nested" });
625
+ return;
626
+ }
627
+ if (expression.itemBinding === scopedBinding) {
628
+ ctx.addIssue({
629
+ code: "custom",
630
+ path: [...path, "itemBinding"],
631
+ message: "item binding is invalid or shadows an enclosing binding",
632
+ });
633
+ return;
634
+ }
635
+ walkExpression(expression.clause, ctx, [...path, "clause"], depth + 1, leaves, false, expression.itemBinding);
636
+ return;
637
+ }
638
+ if (expression.kind === "all" || expression.kind === "any") {
639
+ for (const [index, clause] of expression.clauses.entries())
640
+ walkExpression(clause, ctx, [...path, "clauses", index], depth + 1, leaves, allowQuantifier, scopedBinding);
641
+ return;
642
+ }
643
+ if (expression.kind === "not") {
644
+ walkExpression(expression.clause, ctx, [...path, "clause"], depth + 1, leaves, allowQuantifier, scopedBinding);
645
+ return;
646
+ }
647
+ leaves.count += 1;
648
+ if (leaves.count > 64)
649
+ ctx.addIssue({ code: "custom", path, message: "expression contains more than 64 leaves" });
650
+ }
651
+ export function defineHealthScenario(input) {
652
+ return HealthScenarioSchema.parse(input);
653
+ }
@@ -100,6 +100,26 @@ export function localizeAuthTurn(turn, options) {
100
100
  : {}),
101
101
  };
102
102
  }
103
+ /**
104
+ * Markers that indicate a locale value was scaffolded but never translated.
105
+ *
106
+ * ASCII tokens are matched case-sensitively as whole `\w` tokens so ordinary
107
+ * prose such as "todo list" or identifiers like "TBDx" are not flagged. Locale
108
+ * tags such as `[ko]` are matched literally (the brackets are the boundary), and
109
+ * the Korean/Japanese phrases are matched as-is since CJK text has no `\b`.
110
+ */
111
+ const PROVIDER_LOCALE_PLACEHOLDER_PATTERNS = [
112
+ /\b(?:TODO|FIXME|TBD|TRANSLATE)\b/,
113
+ /\[(?:en|ko|ja)\]/i,
114
+ /번역\s*필요/,
115
+ /翻訳が必要/,
116
+ ];
117
+ function isProviderLocalePlaceholderText(text) {
118
+ if (text.trim().length === 0) {
119
+ return true;
120
+ }
121
+ return PROVIDER_LOCALE_PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(text));
122
+ }
103
123
  export function validateProviderLocaleCatalogs(options) {
104
124
  const issues = [];
105
125
  const uniqueKeys = Array.from(new Set(options.requiredKeys.map((key) => {
@@ -138,7 +158,7 @@ export function validateProviderLocaleCatalogs(options) {
138
158
  continue;
139
159
  }
140
160
  for (const text of Array.isArray(value) ? value : [value]) {
141
- if (text.trim().length === 0 || /\bTODO\b/i.test(text)) {
161
+ if (isProviderLocalePlaceholderText(text)) {
142
162
  issues.push({
143
163
  locale,
144
164
  key,