@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
@@ -54,15 +54,11 @@ function isZodSchema(schema) {
54
54
  return schema instanceof z.ZodType;
55
55
  }
56
56
  function zodJsonSchema(schema) {
57
- try {
58
- const jsonSchema = z.toJSONSchema(schema);
59
- return toJsonValue(jsonSchema);
60
- }
61
- catch (error) {
62
- if (error instanceof Error)
63
- return undefined;
64
- throw error;
57
+ const jsonSchema = toJsonValue(z.toJSONSchema(schema));
58
+ if (jsonSchema === undefined) {
59
+ throw new TypeError("z.toJSONSchema() returned a non-JSON value");
65
60
  }
61
+ return jsonSchema;
66
62
  }
67
63
  function getSchemaTypeName(schema) {
68
64
  if (!isRecord(schema))
@@ -11,6 +11,7 @@ export interface ProviderContractSnapshot {
11
11
  readonly allowedHosts?: readonly string[];
12
12
  readonly stealth?: JsonValue;
13
13
  readonly proxy?: JsonValue;
14
+ readonly ocr?: JsonValue;
14
15
  readonly stt?: JsonValue;
15
16
  readonly browser?: JsonValue;
16
17
  readonly auth?: JsonValue;
@@ -26,17 +27,23 @@ export interface ProviderContractSnapshot {
26
27
  }
27
28
  export interface ProviderContractOperation {
28
29
  readonly id: string;
30
+ readonly connectionMode?: JsonValue;
31
+ readonly connectionExternalRefParam?: JsonValue;
32
+ readonly riskClass: JsonValue;
33
+ readonly approval?: JsonValue;
34
+ readonly timeoutMs?: JsonValue;
35
+ readonly titleKey?: JsonValue;
29
36
  readonly descriptionKey?: JsonValue;
30
- readonly docs?: JsonValue;
37
+ readonly summaryKey?: JsonValue;
38
+ readonly markdownKey?: JsonValue;
31
39
  readonly whenToUseKeys?: JsonValue;
32
40
  readonly whenNotToUseKeys?: JsonValue;
33
- readonly derivations?: JsonValue;
34
- readonly inputExamples?: JsonValue;
35
- readonly annotations?: JsonValue;
41
+ readonly normalizationNotesKeys?: JsonValue;
42
+ readonly errorCodes?: JsonValue;
43
+ readonly examples?: JsonValue;
36
44
  readonly contract?: JsonValue;
37
45
  readonly tags?: JsonValue;
38
46
  readonly relatedOperations?: JsonValue;
39
- readonly toolRouter?: JsonValue;
40
47
  readonly observability?: JsonValue;
41
48
  readonly transport?: JsonValue;
42
49
  readonly inputSchema: JsonValue;
package/dist/contract.js CHANGED
@@ -7,6 +7,7 @@ export function extractProviderContract(provider) {
7
7
  const auth = extractAuth(provider.auth);
8
8
  const stealth = toJsonValue(provider.stealth);
9
9
  const proxy = toJsonValue(provider.proxy);
10
+ const ocr = toJsonValue(provider.ocr);
10
11
  const stt = toJsonValue(provider.stt);
11
12
  const browser = toJsonValue(provider.browser);
12
13
  const reviewed = toJsonValue(provider.reviewed);
@@ -30,6 +31,7 @@ export function extractProviderContract(provider) {
30
31
  ...(provider.allowedHosts ? { allowedHosts: [...provider.allowedHosts].sort() } : {}),
31
32
  ...(stealth === undefined ? {} : { stealth }),
32
33
  ...(proxy === undefined ? {} : { proxy }),
34
+ ...(ocr === undefined ? {} : { ocr }),
33
35
  ...(stt === undefined ? {} : { stt }),
34
36
  ...(browser === undefined ? {} : { browser }),
35
37
  ...(auth === undefined ? {} : { auth }),
@@ -46,17 +48,22 @@ export function digestProviderContract(snapshot) {
46
48
  return createHash("sha256").update(canonicalJson(snapshot)).digest("hex");
47
49
  }
48
50
  function extractOperation(operationId, operation) {
51
+ const connectionMode = toJsonValue(operation.connectionMode);
52
+ const connectionExternalRefParam = toJsonValue(operation.connectionExternalRefParam);
53
+ const approval = toJsonValue(operation.approval);
54
+ const timeoutMs = toJsonValue(operation.timeoutMs);
55
+ const titleKey = toJsonValue(operation.titleKey);
49
56
  const descriptionKey = toJsonValue(operation.descriptionKey);
50
- const docs = toJsonValue(operation.docs);
57
+ const summaryKey = toJsonValue(operation.summaryKey);
58
+ const markdownKey = toJsonValue(operation.markdownKey);
51
59
  const whenToUseKeys = toJsonValue(operation.whenToUseKeys);
52
60
  const whenNotToUseKeys = toJsonValue(operation.whenNotToUseKeys);
53
- const derivations = toJsonValue(operation.derivations);
54
- const inputExamples = toJsonValue(operation.inputExamples);
55
- const annotations = toJsonValue(operation.annotations);
61
+ const normalizationNotesKeys = toJsonValue(operation.normalizationNotesKeys);
62
+ const errorCodes = toJsonValue(operation.errorCodes);
63
+ const examples = toJsonValue(operation.examples);
56
64
  const contract = toJsonValue(operation.contract);
57
65
  const tags = toJsonValue(operation.tags);
58
66
  const relatedOperations = toJsonValue(operation.relatedOperations);
59
- const toolRouter = toJsonValue(operation.toolRouter);
60
67
  const observability = toJsonValue(operation.observability);
61
68
  const transport = extractTransport(operation.transport);
62
69
  const fixtures = toJsonValue(operation.fixtures);
@@ -68,17 +75,23 @@ function extractOperation(operationId, operation) {
68
75
  id: operationId,
69
76
  inputSchema: describeSchema(operation.input),
70
77
  outputSchema: describeSchema(operation.output),
78
+ ...(connectionMode === undefined ? {} : { connectionMode }),
79
+ ...(connectionExternalRefParam === undefined ? {} : { connectionExternalRefParam }),
80
+ riskClass: operation.riskClass,
81
+ ...(approval === undefined ? {} : { approval }),
82
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
83
+ ...(titleKey === undefined ? {} : { titleKey }),
71
84
  ...(descriptionKey === undefined ? {} : { descriptionKey }),
72
- ...(docs === undefined ? {} : { docs }),
85
+ ...(summaryKey === undefined ? {} : { summaryKey }),
86
+ ...(markdownKey === undefined ? {} : { markdownKey }),
73
87
  ...(whenToUseKeys === undefined ? {} : { whenToUseKeys }),
74
88
  ...(whenNotToUseKeys === undefined ? {} : { whenNotToUseKeys }),
75
- ...(derivations === undefined ? {} : { derivations }),
76
- ...(inputExamples === undefined ? {} : { inputExamples }),
77
- ...(annotations === undefined ? {} : { annotations }),
89
+ ...(normalizationNotesKeys === undefined ? {} : { normalizationNotesKeys }),
90
+ ...(errorCodes === undefined ? {} : { errorCodes }),
91
+ ...(examples === undefined ? {} : { examples }),
78
92
  ...(contract === undefined ? {} : { contract }),
79
93
  ...(tags === undefined ? {} : { tags }),
80
94
  ...(relatedOperations === undefined ? {} : { relatedOperations }),
81
- ...(toolRouter === undefined ? {} : { toolRouter }),
82
95
  ...(observability === undefined ? {} : { observability }),
83
96
  ...(transport === undefined ? {} : { transport }),
84
97
  ...(fixtures === undefined ? {} : { fixtures }),
@@ -128,6 +141,7 @@ function extractHealthCheck(value) {
128
141
  name: item.name,
129
142
  description: item.description,
130
143
  input: toJsonValue(item.input),
144
+ scenario: toJsonValue(item.scenario),
131
145
  degradedThresholdMs: item.degradedThresholdMs,
132
146
  timeoutMs: item.timeoutMs,
133
147
  expectedStatus: item.expectedStatus,
@@ -0,0 +1,34 @@
1
+ import { ProviderError } from "./errors.js";
2
+ import type { ProviderDefinition } from "./types.js";
3
+ export declare const DECLARATION_INVALID_CODE = "DECLARATION_INVALID";
4
+ export declare const DECLARATION_RULE_IDS: {
5
+ readonly challengeShape: "credentials-challenge-shape";
6
+ readonly journeyExecutable: "health-journey-executable";
7
+ readonly journeyRunScenarioExclusive: "health-journey-run-scenario-exclusive";
8
+ readonly journeyScenarioValid: "health-journey-scenario-valid";
9
+ readonly schemaSerializable: "operation-schema-serializable";
10
+ readonly proxyExplicitPolicy: "proxy-explicit-policy";
11
+ readonly proxyVendorExclusive: "proxy-vendor-fields-exclusive";
12
+ readonly proxyNoMixedVendors: "proxy-no-mixed-vendors";
13
+ readonly proxySmartproxyGeo: "proxy-smartproxy-country-only";
14
+ readonly operationUpstreamProxy: "operation-upstream-proxy-unsupported";
15
+ readonly pinnedWireFieldPathValid: "public-schema-pinned-wire-field-valid";
16
+ readonly resolverClientProfileFamily: "resolver-client-profile-family";
17
+ };
18
+ export type DeclarationRuleId = (typeof DECLARATION_RULE_IDS)[keyof typeof DECLARATION_RULE_IDS];
19
+ export type DeclarationViolation = {
20
+ ruleId: DeclarationRuleId;
21
+ path: string;
22
+ message: string;
23
+ fix: string;
24
+ };
25
+ export declare function declarationInvalidError(violations: readonly DeclarationViolation[]): ProviderError;
26
+ /** Enforces declaration rules whose runtime behavior would otherwise fail open. */
27
+ export declare function validateFailClosedDeclaration(provider: ProviderDefinition): void;
28
+ type ProviderDeclarationRulesInput = Pick<ProviderDefinition, "healthJourneys" | "meta" | "proxy" | "resolver" | "stealth">;
29
+ type OperationDeclarationRulesInput = Pick<ProviderDefinition, "operations">;
30
+ /** Enforces fail-closed rules that only depend on the provider declaration. */
31
+ export declare function validateFailClosedProviderDeclaration(provider: ProviderDeclarationRulesInput): void;
32
+ /** Enforces fail-closed rules that depend on the operation implementation. */
33
+ export declare function validateFailClosedOperationDeclaration(provider: OperationDeclarationRulesInput): void;
34
+ export {};
@@ -0,0 +1,305 @@
1
+ import { describeSchema } from "./contract-serialization.js";
2
+ import { ProviderError } from "./errors.js";
3
+ import { HealthScenarioSchema } from "./health-scenario.js";
4
+ import { kindRequiresClientProfile } from "./runtime/resolver-config.js";
5
+ import { resolverClientProfileFamily, resolveStealthProfileSelection } from "./stealth/profiles.js";
6
+ export const DECLARATION_INVALID_CODE = "DECLARATION_INVALID";
7
+ export const DECLARATION_RULE_IDS = {
8
+ challengeShape: "credentials-challenge-shape",
9
+ journeyExecutable: "health-journey-executable",
10
+ journeyRunScenarioExclusive: "health-journey-run-scenario-exclusive",
11
+ journeyScenarioValid: "health-journey-scenario-valid",
12
+ schemaSerializable: "operation-schema-serializable",
13
+ proxyExplicitPolicy: "proxy-explicit-policy",
14
+ proxyVendorExclusive: "proxy-vendor-fields-exclusive",
15
+ proxyNoMixedVendors: "proxy-no-mixed-vendors",
16
+ proxySmartproxyGeo: "proxy-smartproxy-country-only",
17
+ operationUpstreamProxy: "operation-upstream-proxy-unsupported",
18
+ pinnedWireFieldPathValid: "public-schema-pinned-wire-field-valid",
19
+ resolverClientProfileFamily: "resolver-client-profile-family",
20
+ };
21
+ export function declarationInvalidError(violations) {
22
+ const summary = violations
23
+ .map((violation) => `${violation.path} [${violation.ruleId}]: ${violation.message}`)
24
+ .join("\n");
25
+ return new ProviderError(`Provider declaration is invalid (${violations.length} violation${violations.length === 1 ? "" : "s"}).${summary ? `\n${summary}` : ""}`, {
26
+ code: DECLARATION_INVALID_CODE,
27
+ details: { violations: [...violations] },
28
+ fix: "Apply every violation's fix hint, then validate the declaration again.",
29
+ });
30
+ }
31
+ /** Enforces declaration rules whose runtime behavior would otherwise fail open. */
32
+ export function validateFailClosedDeclaration(provider) {
33
+ const violations = [];
34
+ validateHealthDeclaration(provider, violations);
35
+ validatePinnedWireFieldPaths(provider, violations);
36
+ validateSchemaDeclaration(provider, violations);
37
+ validateProxyDeclaration(provider, violations);
38
+ validateResolverClientProfileDeclaration(provider, violations);
39
+ validateOperationDeclaration(provider, violations);
40
+ if (violations.length > 0)
41
+ throw declarationInvalidError(violations);
42
+ }
43
+ /** Enforces fail-closed rules that only depend on the provider declaration. */
44
+ export function validateFailClosedProviderDeclaration(provider) {
45
+ const violations = [];
46
+ collectProviderDeclarationViolations(provider, violations);
47
+ if (violations.length > 0)
48
+ throw declarationInvalidError(violations);
49
+ }
50
+ /** Enforces fail-closed rules that depend on the operation implementation. */
51
+ export function validateFailClosedOperationDeclaration(provider) {
52
+ const violations = [];
53
+ collectOperationDeclarationViolations(provider, violations);
54
+ if (violations.length > 0)
55
+ throw declarationInvalidError(violations);
56
+ }
57
+ function collectProviderDeclarationViolations(provider, violations) {
58
+ validateHealthDeclaration(provider, violations);
59
+ validatePinnedWireFieldPaths(provider, violations);
60
+ validateProxyDeclaration(provider, violations);
61
+ validateResolverClientProfileDeclaration(provider, violations);
62
+ }
63
+ function validatePinnedWireFieldPaths(provider, violations) {
64
+ const pins = provider.meta?.contract?.pinnedWireFieldPaths;
65
+ if (pins === undefined)
66
+ return;
67
+ if (!Array.isArray(pins)) {
68
+ violations.push({
69
+ ruleId: DECLARATION_RULE_IDS.pinnedWireFieldPathValid,
70
+ path: "meta.contract.pinnedWireFieldPaths",
71
+ message: "pinned wire field paths must be an array.",
72
+ fix: "Declare a readonly array of { path, reason } entries.",
73
+ });
74
+ return;
75
+ }
76
+ const seenPaths = new Set();
77
+ for (const [index, pin] of pins.entries()) {
78
+ const entryPath = `meta.contract.pinnedWireFieldPaths[${index}]`;
79
+ if (!pin || typeof pin !== "object" || Array.isArray(pin)) {
80
+ violations.push({
81
+ ruleId: DECLARATION_RULE_IDS.pinnedWireFieldPathValid,
82
+ path: entryPath,
83
+ message: "each pinned wire field path must be an object.",
84
+ fix: `Replace ${entryPath} with { path: "operations.<operation-id>.<field-path>", reason: "<non-empty reason>" }.`,
85
+ });
86
+ continue;
87
+ }
88
+ const path = "path" in pin ? pin.path : undefined;
89
+ const reason = "reason" in pin ? pin.reason : undefined;
90
+ if (typeof path !== "string" || path.trim().length === 0) {
91
+ violations.push({
92
+ ruleId: DECLARATION_RULE_IDS.pinnedWireFieldPathValid,
93
+ path: `${entryPath}.path`,
94
+ message: "path must be a non-empty string.",
95
+ fix: `Set ${entryPath}.path to the exact public-schema-upstream-field diagnostic path.`,
96
+ });
97
+ }
98
+ else if (seenPaths.has(path)) {
99
+ violations.push({
100
+ ruleId: DECLARATION_RULE_IDS.pinnedWireFieldPathValid,
101
+ path: `${entryPath}.path`,
102
+ message: `duplicate pinned wire field path ${JSON.stringify(path)}.`,
103
+ fix: `Keep exactly one declaration for ${JSON.stringify(path)}.`,
104
+ });
105
+ }
106
+ else {
107
+ seenPaths.add(path);
108
+ }
109
+ if (typeof reason !== "string" || reason.trim().length === 0) {
110
+ violations.push({
111
+ ruleId: DECLARATION_RULE_IDS.pinnedWireFieldPathValid,
112
+ path: `${entryPath}.reason`,
113
+ message: "reason must be a non-empty string.",
114
+ fix: `Document why renaming the exact wire field would break the upstream contract.`,
115
+ });
116
+ }
117
+ }
118
+ }
119
+ function collectOperationDeclarationViolations(provider, violations) {
120
+ validateSchemaDeclaration(provider, violations);
121
+ validateOperationDeclaration(provider, violations);
122
+ }
123
+ function validateHealthDeclaration(provider, violations) {
124
+ for (const [index, journey] of (provider.healthJourneys ?? []).entries()) {
125
+ if (!journey || typeof journey !== "object")
126
+ continue;
127
+ const hasRun = journey.run !== undefined;
128
+ const hasScenario = journey.scenario !== undefined;
129
+ if (hasRun && hasScenario) {
130
+ const journeyPath = healthJourneyPath(journey, index);
131
+ violations.push({
132
+ ruleId: DECLARATION_RULE_IDS.journeyRunScenarioExclusive,
133
+ path: journeyPath,
134
+ message: "A health journey must declare exactly one of run or scenario, not both.",
135
+ fix: `Remove either ${journeyPath}.run or ${journeyPath}.scenario.`,
136
+ });
137
+ }
138
+ if (!hasRun && !hasScenario) {
139
+ const journeyPath = healthJourneyPath(journey, index);
140
+ violations.push({
141
+ ruleId: DECLARATION_RULE_IDS.journeyExecutable,
142
+ path: `${journeyPath}.run`,
143
+ message: "coversOperations cannot provide health coverage without run or a declarative scenario.",
144
+ fix: `Add an async run(ctx) implementation or a valid scenario to ${journeyPath}.`,
145
+ });
146
+ }
147
+ if (hasScenario) {
148
+ const parsed = HealthScenarioSchema.safeParse(journey.scenario);
149
+ if (!parsed.success) {
150
+ const journeyPath = healthJourneyPath(journey, index);
151
+ violations.push({
152
+ ruleId: DECLARATION_RULE_IDS.journeyScenarioValid,
153
+ path: `${journeyPath}.scenario`,
154
+ message: "scenario must conform to HealthScenario.",
155
+ fix: "Build the scenario with defineHealthScenario().",
156
+ });
157
+ }
158
+ }
159
+ }
160
+ // NOTE: healthCheck.cases[].enabled is intentionally NOT validated here.
161
+ // self-test.ts reports a gated case as status "skipped" with skipReason
162
+ // "disabled", so the skip is visible in results rather than silent — it is a
163
+ // supported conditional-execution feature, not a class-1 silent no-op.
164
+ }
165
+ function healthJourneyPath(journey, index) {
166
+ return typeof journey.id === "string" && journey.id.length > 0
167
+ ? `healthJourneys.${journey.id}`
168
+ : `healthJourneys[${index}]`;
169
+ }
170
+ function validateSchemaDeclaration(provider, violations) {
171
+ for (const [operationId, operation] of Object.entries(provider.operations ?? {})) {
172
+ const schemaEntries = [
173
+ [`operations.${operationId}.input`, operation.input],
174
+ [`operations.${operationId}.output`, operation.output],
175
+ ];
176
+ // SSE event schemas reach contract extraction the same way input/output do,
177
+ // so a transform-bearing event schema would abort extraction at runtime while
178
+ // passing declaration checks. Validate them under the same rule.
179
+ const transport = operation.transport;
180
+ if (transport?.kind === "sse") {
181
+ for (const [eventName, eventSchema] of Object.entries(transport.events ?? {})) {
182
+ schemaEntries.push([
183
+ `operations.${operationId}.transport.events.${eventName}`,
184
+ eventSchema,
185
+ ]);
186
+ }
187
+ }
188
+ for (const [path, schema] of schemaEntries) {
189
+ try {
190
+ describeSchema(schema);
191
+ }
192
+ catch (error) {
193
+ const reason = error instanceof Error ? error.message : String(error);
194
+ violations.push({
195
+ ruleId: DECLARATION_RULE_IDS.schemaSerializable,
196
+ path,
197
+ message: `schema conversion to JSON Schema failed: ${reason}`,
198
+ fix: `Replace unsupported constructs in ${path} so z.toJSONSchema() succeeds.`,
199
+ });
200
+ }
201
+ }
202
+ }
203
+ }
204
+ const MANAGED_PROXY_VENDORS = new Set(["smartproxy", "nodemaven"]);
205
+ const STATIC_PROXY_VENDORS = new Set(["custom", "decodo"]);
206
+ function validateProxyDeclaration(provider, violations) {
207
+ if (provider.proxy === true) {
208
+ violations.push({
209
+ ruleId: DECLARATION_RULE_IDS.proxyExplicitPolicy,
210
+ path: "proxy",
211
+ message: "proxy: true does not require resolvable proxy egress.",
212
+ fix: 'Replace proxy: true with an explicit policy such as proxy: { mode: "required", providers: ["smartproxy"] }.',
213
+ });
214
+ return;
215
+ }
216
+ if (!provider.proxy || typeof provider.proxy !== "object")
217
+ return;
218
+ const policy = provider.proxy;
219
+ const hasProvider = policy.provider !== undefined;
220
+ const hasProviders = policy.providers !== undefined;
221
+ if (hasProvider && hasProviders) {
222
+ violations.push({
223
+ ruleId: DECLARATION_RULE_IDS.proxyVendorExclusive,
224
+ path: "proxy",
225
+ message: "provider and providers are ambiguous when declared together.",
226
+ fix: "Keep either proxy.provider or proxy.providers, and remove the other field.",
227
+ });
228
+ }
229
+ const vendors = declaredProxyVendors(policy);
230
+ if (vendors.some((vendor) => MANAGED_PROXY_VENDORS.has(vendor)) &&
231
+ vendors.some((vendor) => STATIC_PROXY_VENDORS.has(vendor))) {
232
+ violations.push({
233
+ ruleId: DECLARATION_RULE_IDS.proxyNoMixedVendors,
234
+ path: hasProviders ? "proxy.providers" : "proxy.provider",
235
+ message: "managed and deprecated static proxy vendors cannot share a chain.",
236
+ fix: "Use only smartproxy/nodemaven vendors, or only deprecated static markers, in one policy.",
237
+ });
238
+ }
239
+ if (vendors.includes("smartproxy")) {
240
+ for (const field of ["subdivision", "city"]) {
241
+ if (policy.geo?.[field] === undefined)
242
+ continue;
243
+ const path = `proxy.geo.${field}`;
244
+ violations.push({
245
+ ruleId: DECLARATION_RULE_IDS.proxySmartproxyGeo,
246
+ path,
247
+ message: `smartproxy cannot honor ${field}-level geo targeting.`,
248
+ fix: `Remove ${path} or use a vendor chain that can honor it.`,
249
+ });
250
+ }
251
+ }
252
+ }
253
+ /**
254
+ * An akamai_sbsd solve runs on the provider's own stealth session, so the declared
255
+ * resolver.clientProfile must name the browser family that session emulates. The
256
+ * stealth runtime re-checks per request (a fetch may override the browser); this
257
+ * rule fails the declaration instead of the first challenged request.
258
+ */
259
+ function validateResolverClientProfileDeclaration(provider, violations) {
260
+ const resolver = provider.resolver;
261
+ if (!resolver ||
262
+ !Array.isArray(resolver.kinds) ||
263
+ !resolver.kinds.some(kindRequiresClientProfile) ||
264
+ typeof resolver.clientProfile !== "string") {
265
+ return;
266
+ }
267
+ let sessionBrowser;
268
+ try {
269
+ sessionBrowser = resolveStealthProfileSelection(provider.stealth).browser;
270
+ }
271
+ catch {
272
+ // An unsupported stealth selection is reported by the stealth runtime itself.
273
+ return;
274
+ }
275
+ const family = resolverClientProfileFamily(resolver.clientProfile);
276
+ if (family === sessionBrowser)
277
+ return;
278
+ violations.push({
279
+ ruleId: DECLARATION_RULE_IDS.resolverClientProfileFamily,
280
+ path: "resolver.clientProfile",
281
+ message: family
282
+ ? `"${resolver.clientProfile}" names ${family}, but the stealth session browser is ${sessionBrowser}.`
283
+ : `"${resolver.clientProfile}" does not name a supported browser family (chrome, firefox, safari).`,
284
+ fix: `Declare stealth.browser as the family resolver.clientProfile names, or set resolver.clientProfile to the ${sessionBrowser} profile the SBSD session runs on.`,
285
+ });
286
+ }
287
+ function declaredProxyVendors(policy) {
288
+ const vendors = [...(policy.providers ?? [])];
289
+ if (policy.provider !== undefined)
290
+ vendors.push(policy.provider);
291
+ return vendors;
292
+ }
293
+ function validateOperationDeclaration(provider, violations) {
294
+ for (const [operationId, operation] of Object.entries(provider.operations ?? {})) {
295
+ if (!operation.upstream?.proxy)
296
+ continue;
297
+ const path = `operations.${operationId}.upstream.proxy`;
298
+ violations.push({
299
+ ruleId: DECLARATION_RULE_IDS.operationUpstreamProxy,
300
+ path,
301
+ message: "operation-level proxy policy is not wired into operation execution.",
302
+ fix: `Remove ${path} and declare the effective policy at provider.proxy.`,
303
+ });
304
+ }
305
+ }
package/dist/define.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { AuthConfig, BrowserEngine, ContextDeclaration, CredentialDeclaration, HealthJourneyDefinition, HealthJourneySchedule, HealthScheduleRandomization, InferSchemaOutput, OperationDefinition, OperationHandlerResult, OperationHttpStreamTransport, OperationSseTransport, OperationWebSocketTransport, ProviderAccessConfig, ProviderDefinition, ProviderDeploymentOverrides, ProviderHealthMonitorConfig, ProviderProxyConfig, ProviderPublicProfile, ProviderReviewed, ProviderSecretDeclaration, ProviderStreamEvent, ProviderSttConfig, SchemaLike, SmsOtpMatcherDefinition, StealthPlatform } from "./types.js";
1
+ import type { HandleKind } from "./handle.js";
2
+ import type { AuthConfig, BrowserEngine, ContextDeclaration, CredentialDeclaration, HealthJourneyDefinition, HealthJourneySchedule, HealthScheduleRandomization, InferSchemaOutput, NativeProviderConfig, OperationDefinition, OperationHandlerResult, OperationHttpStreamTransport, OperationSseTransport, OperationWebSocketTransport, ProviderAccessConfig, ProviderContext, ProviderDefinition, ProviderDeploymentOverrides, ProviderHealthMonitorConfig, ProviderOcrConfig, ProviderProxyConfig, ProviderPublicProfile, ProviderResolverConfig, ProviderReviewed, ProviderRuntimeTarget, ProviderSecretDeclaration, ProviderStreamEvent, ProviderSttConfig, ProviderStealthConfig, SchemaLike, SmsOtpMatcherDefinition } from "./types.js";
2
3
  type ProviderImplementationSourceAccess = "official_api" | "private_api" | "browser_flow" | "hybrid";
3
4
  type ProviderImplementationCredentialStrategy = "apifuse_managed" | "workspace_secret" | "user_oauth" | "user_session" | "none";
4
5
  interface ProviderImplementationProfile {
@@ -8,62 +9,89 @@ interface ProviderImplementationProfile {
8
9
  operatorNotes?: string;
9
10
  visibility: "internal" | "operator";
10
11
  }
11
- type ProviderOperation = OperationDefinition<SchemaLike, SchemaLike>;
12
- type OperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike> = Omit<OperationDefinition<TInput, TOutput>, "handler"> & {
13
- handler(ctx: Parameters<OperationDefinition<TInput, TOutput>["handler"]>[0], input: InferSchemaOutput<TInput>): OperationHandlerResult<InferSchemaOutput<TOutput>> | Promise<OperationHandlerResult<InferSchemaOutput<TOutput>>>;
12
+ export declare const VALID_PROVIDER_RESOLVER_VENDORS: readonly ["browser", "capsolver", "capmonster", "2captcha", "hypersolutions", "custom"];
13
+ export declare const VALID_PROVIDER_CHALLENGE_KINDS: readonly ["turnstile", "recaptcha_v2", "recaptcha_v3", "hcaptcha", "cloudflare_interstitial", "aws_waf", "akamai_sec_cpt", "akamai_sensor", "akamai_sbsd"];
14
+ type ProviderOperation = OperationDefinition<any, any, any>;
15
+ type OperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike, TContext = ProviderContext> = Omit<OperationDefinition<TInput, TOutput, TContext>, "handler"> & {
16
+ handler(ctx: TContext, input: InferSchemaOutput<TInput>): OperationHandlerResult<InferSchemaOutput<TOutput>> | Promise<OperationHandlerResult<InferSchemaOutput<TOutput>>>;
14
17
  };
15
- type OperationMapConfig<TOperations extends Record<string, ProviderOperation>> = {
16
- [K in keyof TOperations]: TOperations[K] extends OperationDefinition<infer TInput, infer TOutput> ? OperationConfig<TInput, TOutput> | OperationDefinition<TInput, TOutput> : never;
18
+ type OperationMapConfig<TOperations extends Record<string, ProviderOperation>, TContext = ProviderContext> = {
19
+ [K in keyof TOperations]: TOperations[K] extends OperationDefinition<infer TInput, infer TOutput> ? OperationConfig<TInput, TOutput, TContext> | OperationDefinition<TInput, TOutput, TContext> : never;
17
20
  };
18
- type StreamOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike> = SseOperationConfig<TInput, TOutput> | HttpStreamOperationConfig<TInput, TOutput> | WebSocketOperationConfig<TInput, TOutput>;
19
- type SseOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike> = Omit<OperationConfig<TInput, TOutput>, "handler" | "transport"> & {
21
+ type StreamOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike, TContext = ProviderContext> = SseOperationConfig<TInput, TOutput, TContext> | HttpStreamOperationConfig<TInput, TOutput, TContext> | WebSocketOperationConfig<TInput, TOutput, TContext>;
22
+ type SseOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike, TContext = ProviderContext> = Omit<OperationConfig<TInput, TOutput, TContext>, "handler" | "transport"> & {
20
23
  transport: OperationSseTransport;
21
- handler(ctx: Parameters<OperationDefinition<TInput, TOutput>["handler"]>[0], input: InferSchemaOutput<TInput>): AsyncIterable<ProviderStreamEvent> | Promise<AsyncIterable<ProviderStreamEvent>>;
24
+ handler(ctx: TContext, input: InferSchemaOutput<TInput>): AsyncIterable<ProviderStreamEvent> | Promise<AsyncIterable<ProviderStreamEvent>>;
22
25
  };
23
- type HttpStreamOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike> = Omit<OperationConfig<TInput, TOutput>, "handler" | "transport"> & {
26
+ type HttpStreamOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike, TContext = ProviderContext> = Omit<OperationConfig<TInput, TOutput, TContext>, "handler" | "transport"> & {
24
27
  transport: OperationHttpStreamTransport;
25
- handler(ctx: Parameters<OperationDefinition<TInput, TOutput>["handler"]>[0], input: InferSchemaOutput<TInput>): Response | ReadableStream<Uint8Array> | Promise<Response | ReadableStream<Uint8Array>>;
28
+ handler(ctx: TContext, input: InferSchemaOutput<TInput>): Response | ReadableStream<Uint8Array> | Promise<Response | ReadableStream<Uint8Array>>;
26
29
  };
27
- type WebSocketOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike> = Omit<OperationConfig<TInput, TOutput>, "handler" | "transport"> & {
30
+ type WebSocketOperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike, TContext = ProviderContext> = Omit<OperationConfig<TInput, TOutput, TContext>, "handler" | "transport"> & {
28
31
  transport: OperationWebSocketTransport;
29
- handler(ctx: Parameters<OperationDefinition<TInput, TOutput>["handler"]>[0], input: InferSchemaOutput<TInput>): Response | ReadableStream<Uint8Array> | Promise<Response | ReadableStream<Uint8Array>>;
32
+ handler(ctx: TContext, input: InferSchemaOutput<TInput>): Response | ReadableStream<Uint8Array> | Promise<Response | ReadableStream<Uint8Array>>;
30
33
  };
31
- type AuthStartNoInputGuard<TConfig> = TConfig extends {
34
+ type AuthStartHandlerNoInputGuard<TStart> = TStart extends (...args: infer TArgs) => unknown ? TArgs["length"] extends 0 | 1 ? unknown : {
35
+ "auth start handlers must not declare input parameters; return a form turn from start and receive user input in continue": never;
36
+ } : unknown;
37
+ export type AuthStartNoInputGuard<TConfig> = TConfig extends {
32
38
  auth?: {
33
39
  flow?: {
34
40
  start: infer TStart;
35
41
  };
36
42
  };
37
- } ? TStart extends (...args: infer TArgs) => unknown ? TArgs extends [unknown] ? unknown : {
38
- "auth start handlers must not declare input parameters; return a form turn from start and receive user input in continue": never;
39
- } : unknown : unknown;
40
- export interface ProviderConfig<TOperations extends Record<string, ProviderOperation>> {
43
+ } ? AuthStartHandlerNoInputGuard<TStart> : TConfig extends {
44
+ start: infer TStart;
45
+ } ? AuthStartHandlerNoInputGuard<TStart> : unknown;
46
+ export interface ProviderDeclaration {
41
47
  id: string;
42
48
  version: string;
43
49
  runtime: "standard" | "shared" | "browser";
50
+ /** Provider business-logic target. Omit only while migrating a legacy provider. */
51
+ runtimeTarget?: ProviderRuntimeTarget;
44
52
  /**
45
53
  * Optional deployment overrides, passed through verbatim onto the returned
46
54
  * provider definition. The SDK types this field but does not deep-validate
47
55
  * it — the APIFuse registry builder owns deployment validation and
48
56
  * resolves omitted fields against the runtime deployment profiles.
57
+ *
58
+ * This is the only authored deployment surface (no standalone
59
+ * `deploy.ts`); declare only the fields that differ from the profile.
49
60
  */
50
61
  deployment?: ProviderDeploymentOverrides;
62
+ /** Declares the HTTP capability binding. A bare object states use without configuration. */
63
+ http?: Record<string, never> | true;
64
+ /** Declares upstream host policy; this does not add a `ctx.allowedHosts` member. */
51
65
  allowedHosts?: string[];
52
- stealth?: {
53
- profile: string;
54
- platform: StealthPlatform;
55
- };
66
+ native?: NativeProviderConfig;
67
+ stealth?: ProviderStealthConfig;
68
+ /** Declares proxy policy; this is provider intent and does not add a `ctx.proxy` member. */
56
69
  proxy?: ProviderProxyConfig;
70
+ ocr?: ProviderOcrConfig;
57
71
  stt?: ProviderSttConfig;
72
+ resolver?: ProviderResolverConfig;
58
73
  browser?: {
59
74
  engine: BrowserEngine;
60
75
  };
61
76
  auth?: AuthConfig;
77
+ /** Declares the handle kinds this provider issues and accepts (ADR-0012). */
78
+ handle?: readonly HandleKind[];
62
79
  reviewed?: ProviderReviewed;
63
80
  access?: ProviderAccessConfig;
81
+ /** Declares secret requirements; this does not add a `ctx.secrets` member. */
64
82
  secrets?: ProviderSecretDeclaration[];
83
+ /** Declares the environment capability binding. A bare object states use without configuration. */
84
+ env?: Record<string, never> | true;
85
+ /** Declares credential keys; platform-managed auth declares this capability without key filtering. */
65
86
  credential?: CredentialDeclaration;
87
+ /** Declares provider context metadata; this does not add a `ctx.context` member. */
66
88
  context?: ContextDeclaration;
89
+ /** Declares the state capability binding. A bare object states use without configuration. */
90
+ state?: Record<string, never> | true;
91
+ /** Declares the cache capability binding. A bare object states use without configuration. */
92
+ cache?: Record<string, never> | true;
93
+ /** Declares the files capability binding. A bare object states use without configuration. */
94
+ files?: Record<string, never> | true;
67
95
  meta: {
68
96
  displayName: string;
69
97
  displayNameKey?: string;
@@ -83,18 +111,21 @@ export interface ProviderConfig<TOperations extends Record<string, ProviderOpera
83
111
  implementationProfile?: ProviderImplementationProfile;
84
112
  contract?: {
85
113
  publicSchemaFieldNames?: "normalized";
114
+ readonly pinnedWireFieldPaths?: readonly {
115
+ readonly path: string;
116
+ readonly reason: string;
117
+ }[];
86
118
  };
87
119
  };
88
- operations: OperationMapConfig<TOperations>;
89
120
  healthMonitor?: ProviderHealthMonitorConfig;
90
121
  /** New name for `healthMonitor` (transitional alias); declaring both is a ValidationError. */
91
122
  healthProbe?: ProviderHealthMonitorConfig;
92
123
  healthJourneys?: readonly HealthJourneyDefinition[];
93
124
  }
94
- /** Define one provider operation with schema-driven handler inference. */
95
- export declare function defineOperation<TInput extends SchemaLike, TOutput extends SchemaLike>(operation: OperationConfig<TInput, TOutput>): OperationDefinition<TInput, TOutput>;
96
- /** Define a non-JSON provider operation with explicit transport metadata. */
97
- export declare function defineStreamOperation<TInput extends SchemaLike, TOutput extends SchemaLike>(operation: StreamOperationConfig<TInput, TOutput>): OperationDefinition<TInput, TOutput>;
125
+ /** Define one factored provider operation with schema-driven handler inference. */
126
+ export declare function defineOperation<TContext>(): <TInput extends SchemaLike, TOutput extends SchemaLike>(config: OperationConfig<TInput, TOutput, TContext>) => OperationDefinition<TInput, TOutput, TContext>;
127
+ /** Define a factored non-JSON operation with explicit transport metadata. */
128
+ export declare function defineStreamOperation<TContext>(): <TInput extends SchemaLike, TOutput extends SchemaLike>(config: StreamOperationConfig<TInput, TOutput, TContext>) => OperationDefinition<TInput, TOutput, TContext>;
98
129
  export declare function every(interval: string, options?: {
99
130
  jitter?: string;
100
131
  randomize?: HealthScheduleRandomization;
@@ -103,7 +134,18 @@ export declare function centered(maxOffset: string): HealthScheduleRandomization
103
134
  export declare function delayed(maxDelay: string): HealthScheduleRandomization;
104
135
  export declare function defineSmsOtpMatcher(config: Omit<SmsOtpMatcherDefinition, "extractOtp">): SmsOtpMatcherDefinition;
105
136
  export declare function defineHealthJourney(config: HealthJourneyDefinition): HealthJourneyDefinition;
106
- export declare function defineProvider<TOperations extends Record<string, ProviderOperation>, TConfig extends ProviderConfig<TOperations>>(config: TConfig & AuthStartNoInputGuard<TConfig>): ProviderDefinition & {
107
- operations: OperationMapConfig<TOperations>;
137
+ /** The second authoring phase for a declaration established by defineProvider. */
138
+ export type ProviderBuilder<TConfig extends ProviderDeclaration> = <TOperations extends Record<string, ProviderOperation>>(implementation: {
139
+ operations: OperationMapConfig<TOperations, ProviderContext<TConfig>>;
140
+ }) => Omit<ProviderDefinition, "operations"> & {
141
+ operations: OperationMapConfig<TOperations, ProviderContext<TConfig>>;
108
142
  };
143
+ /** Extract the declaration-derived operation context from a provider builder. */
144
+ export type ProviderContextOf<TBuilder> = TBuilder extends ProviderBuilder<infer TConfig> ? ProviderContext<TConfig> : never;
145
+ /** Annotate an operation while preserving the declaration-derived context. */
146
+ export type OperationDefinitionFor<TBuilder, TInput extends SchemaLike = SchemaLike, TOutput extends SchemaLike = SchemaLike> = OperationDefinition<TInput, TOutput, ProviderContextOf<TBuilder>>;
147
+ /** Annotate a built provider while preserving the declaration-derived context. */
148
+ export type ProviderDefinitionFor<TBuilder> = ProviderDefinition<ProviderContextOf<TBuilder>>;
149
+ /** Establish a provider declaration before its operations are contextually typed. */
150
+ export declare function defineProvider<const TConfig extends ProviderDeclaration>(declaration: TConfig & Record<Exclude<keyof TConfig, keyof ProviderDeclaration>, never> & AuthStartNoInputGuard<TConfig>): ProviderBuilder<TConfig>;
109
151
  export {};