@apifuse/provider-sdk 2.2.0-beta.3 → 2.2.0-beta.31

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 (342) hide show
  1. package/AUTHORING.md +493 -5
  2. package/CHANGELOG.md +131 -1
  3. package/README.md +52 -6
  4. package/SUBMISSION.md +1 -1
  5. package/bin/apifuse-check.ts +106 -62
  6. package/bin/apifuse-create.ts +1 -1
  7. package/bin/apifuse-dev.ts +63 -55
  8. package/bin/apifuse-pack-check.ts +22 -2
  9. package/bin/apifuse-pack-smoke.ts +78 -82
  10. package/bin/apifuse-pack-types.ts +583 -0
  11. package/bin/apifuse-perf.ts +59 -140
  12. package/bin/apifuse-record.ts +698 -113
  13. package/bin/apifuse-submit-check.ts +517 -44
  14. package/bin/apifuse-sync-assets.ts +117 -0
  15. package/bin/apifuse.ts +1 -1
  16. package/bin/submit-check-delimited-text.ts +50 -0
  17. package/bin/submit-check-xml.ts +1 -1
  18. package/dist/auth-turn/index.d.ts +4 -4
  19. package/dist/auth-turn/index.js +1 -1
  20. package/dist/auth.d.ts +16 -2
  21. package/dist/auth.js +76 -18
  22. package/dist/ceremonies/index.d.ts +9 -1
  23. package/dist/ceremonies/index.js +117 -29
  24. package/dist/cli/commands.d.ts +1 -1
  25. package/dist/cli/commands.js +8 -0
  26. package/dist/cli/create.d.ts +3 -0
  27. package/dist/cli/create.js +34 -35
  28. package/dist/cli/prompt-assets.d.ts +80 -0
  29. package/dist/cli/prompt-assets.js +743 -0
  30. package/dist/cli/templates/provider/AGENTS.md.tpl +17 -8
  31. package/dist/cli/templates/provider/README.md.tpl +4 -4
  32. package/dist/config/loader.d.ts +176 -17
  33. package/dist/config/loader.js +434 -161
  34. package/dist/contract-serialization.d.ts +2 -2
  35. package/dist/contract-serialization.js +7 -14
  36. package/dist/contract-types.d.ts +3 -2
  37. package/dist/contract.d.ts +3 -3
  38. package/dist/contract.js +6 -6
  39. package/dist/declaration-validation.d.ts +23 -0
  40. package/dist/declaration-validation.js +159 -0
  41. package/dist/define.d.ts +13 -1
  42. package/dist/define.js +391 -122
  43. package/dist/dev.d.ts +1 -1
  44. package/dist/dev.js +1 -1
  45. package/dist/error-resolution.d.ts +4 -0
  46. package/dist/error-resolution.js +123 -0
  47. package/dist/errors.d.ts +19 -1
  48. package/dist/errors.js +41 -3
  49. package/dist/fixture-sanitization.d.ts +26 -0
  50. package/dist/fixture-sanitization.js +216 -0
  51. package/dist/i18n/catalog.d.ts +2 -2
  52. package/dist/i18n/catalog.js +4 -10
  53. package/dist/i18n/index.d.ts +2 -2
  54. package/dist/i18n/index.js +2 -2
  55. package/dist/i18n/keys.d.ts +2 -2
  56. package/dist/index.d.ts +50 -42
  57. package/dist/index.js +41 -37
  58. package/dist/lint.d.ts +6 -1
  59. package/dist/lint.js +370 -18
  60. package/dist/native-address.d.ts +43 -0
  61. package/dist/native-address.js +281 -0
  62. package/dist/native-egress-policy.d.ts +31 -0
  63. package/dist/native-egress-policy.js +288 -0
  64. package/dist/observability.d.ts +5 -2
  65. package/dist/observability.js +48 -1
  66. package/dist/provider.d.ts +13 -11
  67. package/dist/provider.js +10 -9
  68. package/dist/public-schema-field-lint.d.ts +1 -1
  69. package/dist/recipes/gov-api.js +1 -1
  70. package/dist/runtime/auth-flow.d.ts +3 -1
  71. package/dist/runtime/auth-flow.js +8 -3
  72. package/dist/runtime/browser.d.ts +1 -1
  73. package/dist/runtime/browser.js +138 -40
  74. package/dist/runtime/cache.d.ts +2 -1
  75. package/dist/runtime/cache.js +173 -23
  76. package/dist/runtime/choice-wordlist.d.ts +9 -0
  77. package/dist/runtime/choice-wordlist.js +138 -0
  78. package/dist/runtime/choice.d.ts +14 -1
  79. package/dist/runtime/choice.js +566 -101
  80. package/dist/runtime/credential.d.ts +1 -1
  81. package/dist/runtime/credential.js +1 -1
  82. package/dist/runtime/env.d.ts +1 -1
  83. package/dist/runtime/executor.d.ts +1 -1
  84. package/dist/runtime/executor.js +25 -3
  85. package/dist/runtime/http.d.ts +3 -2
  86. package/dist/runtime/http.js +517 -55
  87. package/dist/runtime/insights.d.ts +1 -1
  88. package/dist/runtime/insights.js +6 -13
  89. package/dist/runtime/instrumentation.d.ts +2 -2
  90. package/dist/runtime/instrumentation.js +371 -23
  91. package/dist/runtime/keyring.js +1 -1
  92. package/dist/runtime/namespace.js +1 -1
  93. package/dist/runtime/native-network-errors.d.ts +33 -0
  94. package/dist/runtime/native-network-errors.js +69 -0
  95. package/dist/runtime/native-network.d.ts +96 -0
  96. package/dist/runtime/native-network.js +1232 -0
  97. package/dist/runtime/ocr.d.ts +29 -0
  98. package/dist/runtime/ocr.js +440 -0
  99. package/dist/runtime/otlp.d.ts +1 -1
  100. package/dist/runtime/perf.d.ts +1 -1
  101. package/dist/runtime/provider.d.ts +1 -1
  102. package/dist/runtime/provider.js +1 -2
  103. package/dist/runtime/proxy-errors.d.ts +1 -1
  104. package/dist/runtime/proxy-errors.js +9 -7
  105. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  106. package/dist/runtime/proxy-nodemaven.js +146 -0
  107. package/dist/runtime/proxy-retry-policy.d.ts +2 -2
  108. package/dist/runtime/proxy-retry-policy.js +2 -2
  109. package/dist/runtime/proxy-telemetry.d.ts +2 -1
  110. package/dist/runtime/proxy-telemetry.js +58 -52
  111. package/dist/runtime/redirects.d.ts +29 -0
  112. package/dist/runtime/redirects.js +36 -0
  113. package/dist/runtime/redis.d.ts +1 -1
  114. package/dist/runtime/redis.js +5 -5
  115. package/dist/runtime/request-options.d.ts +68 -1
  116. package/dist/runtime/request-options.js +548 -0
  117. package/dist/runtime/resolver-config.d.ts +6 -0
  118. package/dist/runtime/resolver-config.js +6 -0
  119. package/dist/runtime/resolver-public.d.ts +1 -0
  120. package/dist/runtime/resolver-public.js +1 -0
  121. package/dist/runtime/resolver-shared.d.ts +3 -0
  122. package/dist/runtime/resolver-shared.js +12 -0
  123. package/dist/runtime/resolver-vendors/bindings.d.ts +48 -0
  124. package/dist/runtime/resolver-vendors/bindings.js +40 -0
  125. package/dist/runtime/resolver-vendors/browser.d.ts +20 -0
  126. package/dist/runtime/resolver-vendors/browser.js +282 -0
  127. package/dist/runtime/resolver-vendors/hosts.d.ts +2 -0
  128. package/dist/runtime/resolver-vendors/hosts.js +33 -0
  129. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  130. package/dist/runtime/resolver-vendors/twocaptcha.js +368 -0
  131. package/dist/runtime/resolver-vendors/types.d.ts +83 -0
  132. package/dist/runtime/resolver-vendors/types.js +69 -0
  133. package/dist/runtime/resolver.d.ts +59 -0
  134. package/dist/runtime/resolver.js +705 -0
  135. package/dist/runtime/secrets.d.ts +27 -0
  136. package/dist/runtime/secrets.js +51 -0
  137. package/dist/runtime/state.d.ts +5 -2
  138. package/dist/runtime/state.js +280 -74
  139. package/dist/runtime/stealth-cookies.d.ts +20 -0
  140. package/dist/runtime/stealth-cookies.js +111 -0
  141. package/dist/runtime/stealth.d.ts +30 -5
  142. package/dist/runtime/stealth.js +523 -259
  143. package/dist/runtime/stt.d.ts +1 -1
  144. package/dist/runtime/stt.js +12 -27
  145. package/dist/runtime/timeout.d.ts +5 -0
  146. package/dist/runtime/timeout.js +12 -0
  147. package/dist/runtime/trace.d.ts +2 -2
  148. package/dist/runtime/trace.js +2 -4
  149. package/dist/runtime/waterfall.d.ts +1 -1
  150. package/dist/schema.d.ts +1 -1
  151. package/dist/schema.js +7 -15
  152. package/dist/serve.d.ts +1 -1
  153. package/dist/serve.js +1 -1
  154. package/dist/server/index.d.ts +7 -7
  155. package/dist/server/index.js +6 -6
  156. package/dist/server/self-test-input-tokens.d.ts +2 -1
  157. package/dist/server/self-test-input-tokens.js +18 -14
  158. package/dist/server/self-test-redaction.d.ts +1 -1
  159. package/dist/server/self-test-redaction.js +1 -1
  160. package/dist/server/self-test.d.ts +117 -3
  161. package/dist/server/self-test.js +787 -151
  162. package/dist/server/serve-implementation.d.ts +210 -0
  163. package/dist/server/serve-implementation.js +2078 -0
  164. package/dist/server/serve.d.ts +1 -70
  165. package/dist/server/serve.js +1 -1143
  166. package/dist/server/types.d.ts +34 -9
  167. package/dist/server/types.js +8 -1
  168. package/dist/stateful/errors.d.ts +19 -0
  169. package/dist/stateful/errors.js +24 -0
  170. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  171. package/dist/stateful/http-provider-event-emitter.js +237 -0
  172. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  173. package/dist/stateful/http-session-owner-registry.js +210 -0
  174. package/dist/stateful/index.d.ts +18 -0
  175. package/dist/stateful/index.js +18 -0
  176. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  177. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  178. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  179. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  180. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  181. package/dist/stateful/provider-event-pipeline.js +1 -0
  182. package/dist/stateful/provider-events.d.ts +101 -0
  183. package/dist/stateful/provider-events.js +289 -0
  184. package/dist/stateful/session-key.d.ts +15 -0
  185. package/dist/stateful/session-key.js +86 -0
  186. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  187. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  188. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  189. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  190. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  191. package/dist/stateful/stateful-provider-adapter.js +287 -0
  192. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  193. package/dist/stateful/stateful-provider-observability.js +161 -0
  194. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  195. package/dist/stateful/stateful-provider-owner-forwarder.js +215 -0
  196. package/dist/stateful/stateful-provider-runtime-context.d.ts +32 -0
  197. package/dist/stateful/stateful-provider-runtime-context.js +60 -0
  198. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  199. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  200. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  201. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  202. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  203. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  204. package/dist/stateful-signing.d.ts +18 -0
  205. package/dist/stateful-signing.js +27 -0
  206. package/dist/stealth/profiles.d.ts +1 -1
  207. package/dist/stealth/profiles.js +21 -21
  208. package/dist/stream-evidence.d.ts +74 -0
  209. package/dist/stream-evidence.js +785 -0
  210. package/dist/stream.d.ts +1 -1
  211. package/dist/stream.js +7 -1
  212. package/dist/testing/index.d.ts +3 -2
  213. package/dist/testing/index.js +3 -2
  214. package/dist/testing/run.d.ts +32 -2
  215. package/dist/testing/run.js +488 -28
  216. package/dist/types.d.ts +566 -19
  217. package/dist/types.js +1 -0
  218. package/dist/user-input.d.ts +30 -0
  219. package/dist/user-input.js +66 -0
  220. package/package.json +42 -7
  221. package/src/auth-turn/index.ts +2 -2
  222. package/src/auth.ts +146 -86
  223. package/src/ceremonies/index.ts +167 -92
  224. package/src/cli/commands.ts +10 -0
  225. package/src/cli/create.ts +42 -35
  226. package/src/cli/prompt-assets.ts +865 -0
  227. package/src/cli/templates/provider/AGENTS.md.tpl +17 -8
  228. package/src/cli/templates/provider/README.md.tpl +4 -4
  229. package/src/config/loader.ts +667 -289
  230. package/src/contract-serialization.ts +10 -18
  231. package/src/contract-types.ts +3 -2
  232. package/src/contract.ts +14 -28
  233. package/src/declaration-validation.ts +202 -0
  234. package/src/define.ts +631 -495
  235. package/src/dev.ts +4 -9
  236. package/src/error-resolution.ts +128 -0
  237. package/src/errors.ts +56 -11
  238. package/src/fixture-sanitization.ts +247 -0
  239. package/src/i18n/catalog.ts +10 -32
  240. package/src/i18n/index.ts +2 -2
  241. package/src/i18n/keys.ts +5 -11
  242. package/src/index.ts +158 -44
  243. package/src/lint.ts +488 -154
  244. package/src/native-address.ts +340 -0
  245. package/src/native-egress-policy.ts +358 -0
  246. package/src/observability.ts +51 -1
  247. package/src/provider.ts +66 -11
  248. package/src/public-schema-field-lint.ts +7 -33
  249. package/src/recipes/gov-api.ts +2 -5
  250. package/src/runtime/auth-flow.ts +13 -7
  251. package/src/runtime/browser.ts +252 -207
  252. package/src/runtime/cache.ts +209 -81
  253. package/src/runtime/choice-wordlist.ts +145 -0
  254. package/src/runtime/choice.ts +758 -197
  255. package/src/runtime/credential.ts +2 -2
  256. package/src/runtime/env.ts +1 -1
  257. package/src/runtime/executor.ts +37 -19
  258. package/src/runtime/http.ts +645 -65
  259. package/src/runtime/insights.ts +15 -53
  260. package/src/runtime/instrumentation.ts +530 -67
  261. package/src/runtime/keyring.ts +7 -19
  262. package/src/runtime/namespace.ts +2 -7
  263. package/src/runtime/native-network-errors.ts +99 -0
  264. package/src/runtime/native-network.ts +1605 -0
  265. package/src/runtime/ocr.ts +523 -0
  266. package/src/runtime/otlp.ts +12 -23
  267. package/src/runtime/perf.ts +1 -1
  268. package/src/runtime/provider.ts +4 -9
  269. package/src/runtime/proxy-errors.ts +29 -42
  270. package/src/runtime/proxy-nodemaven.ts +221 -0
  271. package/src/runtime/proxy-retry-policy.ts +3 -3
  272. package/src/runtime/proxy-telemetry.ts +84 -77
  273. package/src/runtime/redirects.ts +66 -0
  274. package/src/runtime/redis.ts +10 -13
  275. package/src/runtime/request-options.ts +679 -9
  276. package/src/runtime/resolver-config.ts +6 -0
  277. package/src/runtime/resolver-public.ts +18 -0
  278. package/src/runtime/resolver-shared.ts +17 -0
  279. package/src/runtime/resolver-vendors/bindings.ts +56 -0
  280. package/src/runtime/resolver-vendors/browser.ts +408 -0
  281. package/src/runtime/resolver-vendors/hosts.ts +38 -0
  282. package/src/runtime/resolver-vendors/twocaptcha.ts +500 -0
  283. package/src/runtime/resolver-vendors/types.ts +173 -0
  284. package/src/runtime/resolver.ts +1060 -0
  285. package/src/runtime/secrets.ts +64 -0
  286. package/src/runtime/state.ts +399 -161
  287. package/src/runtime/stealth-cookies.ts +132 -0
  288. package/src/runtime/stealth.ts +681 -295
  289. package/src/runtime/stt.ts +39 -113
  290. package/src/runtime/timeout.ts +18 -0
  291. package/src/runtime/trace.ts +14 -44
  292. package/src/runtime/waterfall.ts +5 -18
  293. package/src/schema.ts +23 -84
  294. package/src/serve.ts +6 -1
  295. package/src/server/index.ts +30 -7
  296. package/src/server/self-test-input-tokens.ts +29 -14
  297. package/src/server/self-test-redaction.ts +2 -2
  298. package/src/server/self-test.ts +1030 -180
  299. package/src/server/serve-implementation.ts +3062 -0
  300. package/src/server/serve.ts +1 -1781
  301. package/src/server/types.ts +12 -13
  302. package/src/stateful/README.md +146 -0
  303. package/src/stateful/errors.ts +35 -0
  304. package/src/stateful/http-provider-event-emitter.ts +314 -0
  305. package/src/stateful/http-session-owner-registry.ts +306 -0
  306. package/src/stateful/index.ts +18 -0
  307. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  308. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  309. package/src/stateful/provider-event-pipeline.ts +61 -0
  310. package/src/stateful/provider-events.ts +462 -0
  311. package/src/stateful/session-key.ts +111 -0
  312. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  313. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  314. package/src/stateful/stateful-provider-adapter.ts +562 -0
  315. package/src/stateful/stateful-provider-observability.ts +261 -0
  316. package/src/stateful/stateful-provider-owner-forwarder.ts +287 -0
  317. package/src/stateful/stateful-provider-runtime-context.ts +92 -0
  318. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  319. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  320. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  321. package/src/stateful-signing.ts +46 -0
  322. package/src/stealth/profiles.ts +27 -33
  323. package/src/stream-evidence.ts +988 -0
  324. package/src/stream.ts +16 -20
  325. package/src/testing/index.ts +11 -2
  326. package/src/testing/run.ts +668 -74
  327. package/src/types.ts +665 -35
  328. package/src/user-input.ts +118 -0
  329. package/dist/cli/templates/provider/CLAUDE.md.tpl +0 -1
  330. package/src/cli/templates/provider/CLAUDE.md.tpl +0 -1
  331. /package/dist/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  332. /package/dist/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  333. /package/dist/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  334. /package/dist/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  335. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  336. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
  337. /package/src/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  338. /package/src/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  339. /package/src/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  340. /package/src/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  341. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  342. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
@@ -4,8 +4,8 @@ You are building an APIFuse provider. APIFuse turns messy upstream APIs into
4
4
  normalized, typed, evidence-backed public APIs. A provider that merely proxies
5
5
  the upstream is a failed provider, even if every check passes.
6
6
 
7
- This file is the core contract. Detailed procedures live in `skills/` — load
8
- the matching skill BEFORE working on that area (index at the bottom).
7
+ This file is the core contract. Detailed procedures live in `.agents/skills/` —
8
+ load the matching skill BEFORE working on that area (index at the bottom).
9
9
 
10
10
  ## Non-negotiable principles
11
11
 
@@ -75,13 +75,22 @@ bun run submit-check # structural score; a high score does NOT prove quality
75
75
  `submit-check` is a structural gate. Every principle above can be violated
76
76
  while scoring 95/100 — reviewers and CI audit for exactly these classes.
77
77
 
78
+ ## Managed prompt assets
79
+
80
+ `AGENTS.md` and `.agents/skills/**` are generated by the SDK; `CLAUDE.md`,
81
+ `.claude`, and `.codex` are symlinks onto them so every agent CLI reads the
82
+ same contract. Do not hand-edit these files — regenerate them with
83
+ `bun run sync-assets` (or `bunx apifuse sync-assets .`). `apifuse check` and
84
+ `submit-check` enforce a freshness gate: stale or modified prompt assets
85
+ (tracked in `.apifuse/prompt-assets.json`) block submission until re-synced.
86
+
78
87
  ## Skill index — load before working on:
79
88
 
80
89
  | Area | Load |
81
90
  | --- | --- |
82
- | Output schemas, mappers, field naming, timestamps, enums | `skills/normalization-standards/SKILL.md` |
83
- | Upstream request params, new endpoint wiring, field mapping | `skills/upstream-contract-verification/SKILL.md` |
84
- | Recording fixtures, writing tests against fixtures | `skills/fixtures-and-recording/SKILL.md` |
85
- | List operations, paging, totals, client-side filtering | `skills/pagination-and-counts/SKILL.md` |
86
- | healthCheck blocks, error classification, fail-closed guards | `skills/health-checks-and-fail-closed/SKILL.md` |
87
- | Upstream-specific known pitfalls for THIS bounty | `skills/upstream-notes/` (read every file) |
91
+ | Output schemas, mappers, field naming, timestamps, enums | `.agents/skills/normalization-standards/SKILL.md` |
92
+ | Upstream request params, new endpoint wiring, field mapping | `.agents/skills/upstream-contract-verification/SKILL.md` |
93
+ | Recording fixtures, writing tests against fixtures | `.agents/skills/fixtures-and-recording/SKILL.md` |
94
+ | List operations, paging, totals, client-side filtering | `.agents/skills/pagination-and-counts/SKILL.md` |
95
+ | healthCheck blocks, error classification, fail-closed guards | `.agents/skills/health-checks-and-fail-closed/SKILL.md` |
96
+ | Upstream-specific known pitfalls for THIS bounty | `.agents/skills/upstream-notes/` (read every file) |
@@ -114,10 +114,10 @@ Structured errors return an `error` object with `code`, `message`,
114
114
  - Auth flow: call `/auth/start`, then `/auth/continue` with the same `flowId`;
115
115
  carry returned `contextPatch` values into the next request's `context`.
116
116
  - Stealth/browser runtime: keep access-sensitive operations on `ctx.stealth.fetch()` with an
117
- SDK stealth `profile`; the TypeScript stealth runtime uses `impit` internally.
118
- `ctx.stealth` supports Chrome/Firefox-style profiles. For TypeScript browser
119
- Providers or Safari-specific behavior use `browser.engine: "playwright-stealth"`
120
- (`nodriver` is Python-runtime only), then install local Chromium with
117
+ SDK stealth `profile`; the TypeScript stealth runtime uses `wreq-js` internally
118
+ and supports Chrome, Firefox, and Safari profiles. Use `ctx.browser` only when
119
+ the provider needs browser execution; TypeScript browser Providers use
120
+ `browser.engine: "playwright-stealth"` (`nodriver` is Python-runtime only). Install local Chromium with
121
121
  `bunx playwright install chromium` or set `APIFUSE__CDP_POOL__URL`.
122
122
 
123
123
  ## Next steps
@@ -1,5 +1,9 @@
1
- import Redis from "ioredis";
2
- import type { ProviderProxyPolicy, TraceConfig } from "../types";
1
+ import type { Redis } from "ioredis";
2
+ import type { ProviderProxyPolicy, TraceConfig } from "../types.js";
3
+ import { type ProxyProtocol } from "../runtime/proxy-nodemaven.js";
4
+ export type { ProxyProtocol } from "../runtime/proxy-nodemaven.js";
5
+ /** Proxy vendors with SDK-managed resolution. */
6
+ export type ProxyVendorName = "smartproxy" | "nodemaven";
3
7
  export declare const SMARTPROXY_APP_KEY_ENV = "APIFUSE__PROXY__SMARTPROXY_APP_KEY";
4
8
  export declare const SMARTPROXY_MAX_LIFETIME_MINUTES = 2000;
5
9
  export declare const DEFAULT_SMARTPROXY_POOL_SIZE = 20;
@@ -10,13 +14,6 @@ export declare const DEFAULT_PROXY_LIFETIME_ENV = "APIFUSE__PROXY__DEFAULT_LIFET
10
14
  export declare const PROVIDER_CACHE_REDIS_URL_ENV = "APIFUSE__PROVIDER__CACHE_REDIS_URL";
11
15
  export declare const PROVIDER_STATE_REDIS_URL_ENV = "APIFUSE__PROVIDER__STATE_REDIS_URL";
12
16
  export declare const REDIS_URL_ENV = "APIFUSE__REDIS__URL";
13
- export type ProxyOptions = {
14
- url: string;
15
- };
16
- export type ProxyConfig = Partial<ProxyOptions> & {
17
- provider?: string;
18
- apiKey?: string;
19
- };
20
17
  export type BrowserConfig = {
21
18
  executablePath?: string;
22
19
  headless?: boolean;
@@ -26,7 +23,6 @@ export type SessionConfig = {
26
23
  path?: string;
27
24
  };
28
25
  export type ApiFuseConfig = {
29
- proxy?: ProxyConfig;
30
26
  browser?: BrowserConfig;
31
27
  session?: SessionConfig;
32
28
  trace?: TraceConfig;
@@ -37,17 +33,39 @@ export type ProxyResolutionOptions = {
37
33
  upstream?: {
38
34
  proxy?: boolean | ProviderProxyPolicy;
39
35
  };
40
- apifuseConfig?: Pick<ApiFuseConfig, "proxy">;
41
36
  proxyPolicy?: ProviderProxyPolicy;
42
37
  affinityKey?: string;
43
38
  /** Zero-based proxy-pool attempt index used by SDK transports for failover. */
44
39
  proxyAttempt?: number;
40
+ /**
41
+ * Tunnelling protocols the calling transport can use. When a resolved
42
+ * protocol is not in this set the resolver fails with
43
+ * `PROXY_PROTOCOL_UNSUPPORTED` instead of silently downgrading. Unset means
44
+ * permissive (both protocols allowed).
45
+ */
46
+ transportProtocols?: readonly ProxyProtocol[];
47
+ /**
48
+ * Explicit protocol override. Internal — for the verification harness and
49
+ * tests, or an advanced caller. Normal callers omit it and each vendor uses
50
+ * its own benchmarked default protocol (see VENDOR_DEFAULT_PROTOCOL). Not an
51
+ * env var and not a provider-policy field.
52
+ */
53
+ protocol?: ProxyProtocol;
54
+ /**
55
+ * Gateway pool "refresh" generation. Bumped by transports on pool refresh to
56
+ * derive a fresh gateway session set (ignored by allocation-style vendors,
57
+ * whose refresh is driven by cache invalidation).
58
+ */
59
+ proxyRefreshEpoch?: number;
45
60
  telemetry?: ProxyTelemetrySink;
46
61
  };
47
62
  export type ProxyCacheStatus = "memory_hit" | "redis_hit" | "allocator" | "soft_stale_refresh" | "lock_wait" | "redis_error" | "redis_corrupt" | "disabled";
48
63
  export type SmartproxyAllocatorBodyClass = "network_error" | "http_error" | "empty" | "json_without_proxies" | "text_without_proxies" | "usable_proxy_endpoints";
64
+ export type ProxyUserAgentSource = "declared" | "defaulted";
49
65
  export type ProxyResolutionTelemetryEvent = {
50
- provider: "smartproxy";
66
+ provider: ProxyVendorName;
67
+ userAgentSource?: ProxyUserAgentSource;
68
+ protocol?: ProxyProtocol;
51
69
  cacheStatus: ProxyCacheStatus;
52
70
  cacheHit: boolean;
53
71
  resolutionMs: number;
@@ -64,7 +82,7 @@ export type ProxyResolutionTelemetryEvent = {
64
82
  refreshes?: number;
65
83
  };
66
84
  export type ProxyAttemptTelemetryEvent = {
67
- provider: "smartproxy";
85
+ provider: ProxyVendorName;
68
86
  attempt: number;
69
87
  poolIndex?: number;
70
88
  proxyHash?: string;
@@ -73,22 +91,43 @@ export type ProxyAttemptTelemetryEvent = {
73
91
  status?: number;
74
92
  durationMs?: number;
75
93
  };
94
+ export type ProxyVendorFailoverTelemetryEvent = {
95
+ /** Vendor that failed or was skipped. */
96
+ vendor: ProxyVendorName;
97
+ /** Vendor tried next, or undefined when the chain is exhausted. */
98
+ nextVendor?: ProxyVendorName;
99
+ phase: "resolution" | "transport";
100
+ reason: "no_credentials" | "allocation_failed" | "pool_exhausted" | "protocol_unsupported";
101
+ attempt?: number;
102
+ };
76
103
  export type ProxyTelemetrySink = {
77
104
  recordProxyResolution(event: ProxyResolutionTelemetryEvent): void;
78
105
  recordProxyAttempt?(event: ProxyAttemptTelemetryEvent): void;
106
+ recordProxyVendorFailover?(event: ProxyVendorFailoverTelemetryEvent): void;
79
107
  };
108
+ export type ProxyResolutionSource = "explicit" | "env" | "config" | "smartproxy-allocator" | "nodemaven-gateway";
80
109
  export type ResolvedProxyConfig = {
81
110
  shouldWarn: boolean;
82
111
  url?: string;
83
- source?: "explicit" | "env" | "config" | "smartproxy-allocator";
112
+ /** SDK-native vendor that supplied the URL, when applicable. */
113
+ vendor?: ProxyVendorName;
114
+ source?: ProxyResolutionSource;
115
+ protocol?: ProxyProtocol;
84
116
  diagnostics?: Record<string, string | number | boolean>;
85
117
  };
118
+ export type ProxyResolutionErrorCode = "PROXY_REQUIRED" | "PROXY_ALLOCATION_FAILED" | "PROXY_PROTOCOL_UNSUPPORTED";
86
119
  export declare class ProxyResolutionError extends Error {
87
- readonly code: "PROXY_REQUIRED" | "PROXY_ALLOCATION_FAILED";
120
+ readonly code: ProxyResolutionErrorCode;
88
121
  readonly telemetry?: ProxyResolutionTelemetryEvent;
89
- constructor(code: "PROXY_REQUIRED" | "PROXY_ALLOCATION_FAILED", message: string, options?: {
122
+ readonly vendor?: ProxyVendorName;
123
+ readonly vendorChain?: ProxyVendorName[];
124
+ readonly protocol?: ProxyProtocol;
125
+ constructor(code: ProxyResolutionErrorCode, message: string, options?: {
90
126
  cause?: unknown;
91
127
  telemetry?: ProxyResolutionTelemetryEvent;
128
+ vendor?: ProxyVendorName;
129
+ vendorChain?: ProxyVendorName[];
130
+ protocol?: ProxyProtocol;
92
131
  });
93
132
  }
94
133
  type ProxyRedisClient = Pick<Redis, "connect" | "del" | "eval" | "get" | "on" | "pttl" | "set" | "status">;
@@ -99,9 +138,129 @@ export declare function __setProxyRedisForTests(redis: ProxyRedisClient | undefi
99
138
  export declare function __setSmartproxyAllocatorDeadlineMsForTests(deadlineMs: number | undefined): void;
100
139
  export declare function resolveProxyConfig(options?: ProxyResolutionOptions): ResolvedProxyConfig;
101
140
  export declare function resolveProxyConfigAsync(options?: ProxyResolutionOptions): Promise<ResolvedProxyConfig>;
141
+ /**
142
+ * Resolve the proxy URL for a provider-owned consumer such as a CAPTCHA solver.
143
+ * Vendor allocation and failover remain owned by the SDK.
144
+ */
145
+ export declare function resolveProxy(options?: ProxyResolutionOptions): Promise<ResolvedProxyConfig>;
146
+ /**
147
+ * Each vendor's default egress protocol, chosen from live KR benchmarks. HTTP
148
+ * CONNECT wins for nodemaven (socks5 adds ~500ms through the gateway) and ties
149
+ * for smartproxy, and is the only protocol ctx.http (Bun native fetch) supports.
150
+ * Override per call via ProxyResolutionOptions.protocol (harness/tests).
151
+ */
152
+ export declare const VENDOR_DEFAULT_PROTOCOL: Readonly<Record<ProxyVendorName, ProxyProtocol>>;
153
+ /**
154
+ * Guard the No-MITM invariant: a resolved proxy URL must use a tunnelling scheme
155
+ * (http CONNECT or socks5) so the client TLS handshake reaches the origin
156
+ * end-to-end. Anything else would intercept TLS and break fingerprinting.
157
+ */
158
+ export declare function assertTunnelingScheme(url: string): void;
159
+ export type ProxyVendorResolutionContext = {
160
+ readonly protocol: ProxyProtocol;
161
+ readonly poolIndex: number;
162
+ readonly refreshEpoch: number;
163
+ /** Explicit vendor credentials. Omit only on the legacy ambient-env path. */
164
+ readonly credentials?: Readonly<Record<string, string>>;
165
+ /** Disable non-policy env defaults for deterministic injected adapters. */
166
+ readonly ambientDefaults?: boolean;
167
+ /** Disable env-discovered Redis sharing for deterministic injected adapters. */
168
+ readonly sharedCache?: boolean;
169
+ };
170
+ export declare function resolveWithVendor(vendor: ProxyVendorName, policy: ProviderProxyPolicy, options: ProxyResolutionOptions, context: ProxyVendorResolutionContext): Promise<ResolvedProxyConfig>;
171
+ /**
172
+ * Ordered list of SDK-native proxy vendors declared by the policy. `providers`
173
+ * takes precedence over the legacy singular `provider`; the platform default
174
+ * env is the final fallback. Non-registry names (decodo/custom) are dropped so
175
+ * an all-deprecated chain has no managed adapter.
176
+ */
177
+ export declare function resolveVendorChain(policy: ProviderProxyPolicy): ProxyVendorName[];
178
+ /**
179
+ * Total attempt span across a policy's vendor chain — the sum of each vendor's
180
+ * pool size. Transports use this so successive attempts rotate a vendor's pool
181
+ * and then fail over to the next vendor via the flat attempt index. With one
182
+ * vendor this equals that vendor's pool size (today's behaviour).
183
+ */
184
+ export declare function resolvePolicyProxyPoolSpan(policy: ProviderProxyPolicy): number;
185
+ /**
186
+ * Absolute upper bound on a chain's attempt span — the sum of each vendor's
187
+ * *maximum* pool size. Unlike `resolvePolicyProxyPoolSpan` (the configured
188
+ * span), this backstop is independent of `session.poolSize`, so it never
189
+ * truncates a legitimately large pool below the point where the flat attempt
190
+ * index would cross into the next vendor (e.g. a 50-slot NodeMaven pool).
191
+ */
192
+ export declare function maxPolicyProxyPoolSpan(policy: ProviderProxyPolicy): number;
193
+ /**
194
+ * Transport-retry attempt cap for a policy-managed request. A transport failure
195
+ * rotates the flat attempt index onto the *next* endpoint (and, once the index
196
+ * passes the primary vendor's pool span, the *next vendor*), so the cap must be
197
+ * the chain's full pool span for failover to reach the fallback vendor — the
198
+ * per-endpoint retry budget (default 3) never gets there.
199
+ *
200
+ * The span only widens beyond the caller's retry budget when ALL hold:
201
+ * - the request is policy-allocator managed (not a caller-supplied proxy URL);
202
+ * - the caller did NOT pin an explicit retry policy — `HttpRetryOptions.attempts`
203
+ * is the documented total-attempt ceiling and must be honoured verbatim;
204
+ * - the method is safe/idempotent — an unsafe request must never be duplicated
205
+ * across the pool even if some framework default would allow it;
206
+ * - the policy resolves a non-empty *registry* vendor chain (smartproxy /
207
+ * nodemaven). Deprecated vendors (custom / decodo) resolve no managed pool,
208
+ * so there is no possible endpoint crossover — they keep the retry budget.
209
+ *
210
+ * The widened cap is bounded by the chain's true maximum span (sum of each
211
+ * vendor's max pool size), so a large NodeMaven pool (≤50) stays reachable and
212
+ * a pathological chain can never spin unbounded.
213
+ */
214
+ /**
215
+ * True when a policy request is in *implicit chain-rotation* mode: successive
216
+ * transport attempts rotate the flat index across the concatenated vendor pool
217
+ * spans (and, past the primary vendor's span, into the fallback vendor). This is
218
+ * the ONLY mode in which the transport loop widens its attempt cap AND
219
+ * de-duplicates repeated endpoints — the two behaviours must share one predicate
220
+ * so they never diverge. It holds when ALL of the widening conditions hold:
221
+ * - the request is policy-allocator managed (not a caller-supplied proxy URL);
222
+ * - the caller did NOT pin an explicit retry policy — its `attempts` ceiling is
223
+ * the documented contract and must be honoured verbatim against whatever
224
+ * endpoint each attempt resolves (even a repeated one), so no de-duplication;
225
+ * - the method is safe/idempotent — an unsafe request is never duplicated;
226
+ * - the policy resolves a non-empty registry vendor chain (smartproxy /
227
+ * nodemaven). Deprecated vendors (custom / decodo) resolve no managed
228
+ * endpoint, so there is nothing to rotate or de-duplicate.
229
+ */
230
+ export declare function policyRotatesTransportVendorChain(input: {
231
+ policy: ProviderProxyPolicy | undefined;
232
+ usesPolicyAllocator: boolean;
233
+ explicitRetry: boolean;
234
+ method: string;
235
+ }): boolean;
236
+ export declare function resolvePolicyTransportAttemptCap(input: {
237
+ policy: ProviderProxyPolicy | undefined;
238
+ usesPolicyAllocator: boolean;
239
+ retryAttempts: number;
240
+ explicitRetry: boolean;
241
+ method: string;
242
+ }): number;
243
+ /**
244
+ * A registry vendor chain (smartproxy/nodemaven) resolves a potentially
245
+ * *different* endpoint per flat attempt index, so a transport retry should
246
+ * advance across endpoints and de-duplicate once the chain stops yielding new
247
+ * ones. Deprecated custom/decodo policies have an empty registry chain and no
248
+ * managed endpoint, so the transport loop has nothing to rotate or de-duplicate.
249
+ */
250
+ export declare function policyResolvesRegistryVendorChain(policy: ProviderProxyPolicy | undefined): boolean;
251
+ /** Map a resolved proxy source label to the vendor that served it. */
252
+ export declare function vendorFromResolvedSource(source: ResolvedProxyConfig["source"]): ProxyVendorName | undefined;
253
+ /**
254
+ * Map a flat attempt index into (vendorIndex, poolIndex) by concatenating each
255
+ * vendor's pool space in chain order. With a single vendor this reduces to
256
+ * `attempt % poolSize`, preserving today's behaviour exactly.
257
+ */
258
+ export declare function mapFlatAttempt(flat: number, sizes: readonly number[]): {
259
+ vendorIndex: number;
260
+ poolIndex: number;
261
+ };
102
262
  export declare function clearProxyResolutionCache(): void;
103
263
  export declare function invalidateProxyResolutionCache(options?: ProxyResolutionOptions): boolean;
104
264
  export declare function invalidateProxyResolutionCacheAsync(options?: ProxyResolutionOptions): Promise<boolean>;
105
265
  export declare function defineConfig(config: ApiFuseConfig): ApiFuseConfig;
106
266
  export declare function loadApiFuseConfig(dir?: string): Promise<ApiFuseConfig>;
107
- export {};