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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/AUTHORING.md +943 -51
  2. package/CHANGELOG.md +273 -1
  3. package/LICENSE +21 -0
  4. package/README.md +117 -29
  5. package/SUBMISSION.md +3 -2
  6. package/bin/apifuse-check.ts +293 -13
  7. package/bin/apifuse-dev.ts +42 -19
  8. package/bin/apifuse-migrate-deployment.ts +200 -0
  9. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  10. package/bin/apifuse-migrate-shape.ts +202 -0
  11. package/bin/apifuse-pack-check.ts +19 -6
  12. package/bin/apifuse-pack-smoke.ts +57 -2
  13. package/bin/apifuse-pack-types.ts +736 -38
  14. package/bin/apifuse-perf.ts +59 -23
  15. package/bin/apifuse-record.ts +923 -94
  16. package/bin/apifuse-submit-check.ts +2313 -281
  17. package/bin/apifuse-test.ts +3 -1
  18. package/bin/submit-check-delimited-text.ts +50 -0
  19. package/dist/auth-turn/index.d.ts +3 -3
  20. package/dist/auth-turn/index.js +1 -1
  21. package/dist/auth.d.ts +14 -0
  22. package/dist/auth.js +67 -0
  23. package/dist/ceremonies/index.d.ts +16 -0
  24. package/dist/ceremonies/index.js +141 -36
  25. package/dist/cli/commands.d.ts +1 -1
  26. package/dist/cli/commands.js +30 -0
  27. package/dist/cli/create.d.ts +1 -1
  28. package/dist/cli/create.js +8 -2
  29. package/dist/cli/deployment-intent.d.ts +178 -0
  30. package/dist/cli/deployment-intent.js +277 -0
  31. package/dist/cli/local-connection.d.ts +111 -0
  32. package/dist/cli/local-connection.js +151 -0
  33. package/dist/cli/migrate-deployment-intent.d.ts +132 -0
  34. package/dist/cli/migrate-deployment-intent.js +1552 -0
  35. package/dist/cli/migrate-operation-declaration.d.ts +70 -0
  36. package/dist/cli/migrate-operation-declaration.js +2206 -0
  37. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  38. package/dist/cli/migrate-operation-shape.js +113 -0
  39. package/dist/cli/migrate-provider-shape.d.ts +56 -0
  40. package/dist/cli/migrate-provider-shape.js +580 -0
  41. package/dist/cli/resolver-runtime.d.ts +21 -0
  42. package/dist/cli/resolver-runtime.js +31 -0
  43. package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  44. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  45. package/dist/cli/templates/provider/README.md.tpl +41 -19
  46. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  47. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  48. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  49. package/dist/config/loader.d.ts +202 -16
  50. package/dist/config/loader.js +491 -141
  51. package/dist/contract-serialization.js +4 -8
  52. package/dist/contract-types.d.ts +12 -5
  53. package/dist/contract.js +24 -10
  54. package/dist/declaration-validation.d.ts +34 -0
  55. package/dist/declaration-validation.js +305 -0
  56. package/dist/define.d.ts +71 -29
  57. package/dist/define.js +807 -69
  58. package/dist/dev.d.ts +5 -0
  59. package/dist/dev.js +8 -1
  60. package/dist/engine.d.ts +129 -0
  61. package/dist/engine.js +209 -0
  62. package/dist/error-observability.d.ts +7 -0
  63. package/dist/error-observability.js +61 -0
  64. package/dist/error-resolution.d.ts +18 -0
  65. package/dist/error-resolution.js +243 -0
  66. package/dist/errors.d.ts +74 -0
  67. package/dist/errors.js +99 -0
  68. package/dist/fixture-sanitization.d.ts +28 -0
  69. package/dist/fixture-sanitization.js +371 -0
  70. package/dist/handle-meta.d.ts +90 -0
  71. package/dist/handle-meta.js +73 -0
  72. package/dist/handle.d.ts +226 -0
  73. package/dist/handle.js +345 -0
  74. package/dist/health-scenario.d.ts +1901 -0
  75. package/dist/health-scenario.js +653 -0
  76. package/dist/i18n/catalog.js +21 -1
  77. package/dist/i18n/error-messages.d.ts +86 -0
  78. package/dist/i18n/error-messages.js +192 -0
  79. package/dist/i18n/index.d.ts +1 -0
  80. package/dist/i18n/index.js +1 -0
  81. package/dist/i18n/keys.d.ts +12 -0
  82. package/dist/i18n/keys.js +76 -5
  83. package/dist/i18n/operation-locale-namespace.d.ts +2 -0
  84. package/dist/i18n/operation-locale-namespace.js +7 -0
  85. package/dist/index.d.ts +40 -15
  86. package/dist/index.js +29 -11
  87. package/dist/lint.d.ts +43 -11
  88. package/dist/lint.js +2512 -177
  89. package/dist/native-address.d.ts +43 -0
  90. package/dist/native-address.js +281 -0
  91. package/dist/native-egress-policy.d.ts +31 -0
  92. package/dist/native-egress-policy.js +288 -0
  93. package/dist/observability.d.ts +5 -2
  94. package/dist/observability.js +48 -1
  95. package/dist/provider.d.ts +18 -8
  96. package/dist/provider.js +11 -6
  97. package/dist/runtime/auth-flow.d.ts +6 -1
  98. package/dist/runtime/auth-flow.js +8 -0
  99. package/dist/runtime/bounded-expiring-map.d.ts +21 -0
  100. package/dist/runtime/bounded-expiring-map.js +64 -0
  101. package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
  102. package/dist/runtime/browser-telemetry-binding.js +83 -0
  103. package/dist/runtime/browser-telemetry.d.ts +76 -0
  104. package/dist/runtime/browser-telemetry.js +165 -0
  105. package/dist/runtime/browser.d.ts +4 -0
  106. package/dist/runtime/browser.js +688 -83
  107. package/dist/runtime/cache-telemetry.d.ts +71 -0
  108. package/dist/runtime/cache-telemetry.js +177 -0
  109. package/dist/runtime/cache.d.ts +3 -0
  110. package/dist/runtime/cache.js +245 -23
  111. package/dist/runtime/capability-response.d.ts +3 -0
  112. package/dist/runtime/capability-response.js +56 -0
  113. package/dist/runtime/capability-telemetry.d.ts +46 -0
  114. package/dist/runtime/capability-telemetry.js +68 -0
  115. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  116. package/dist/runtime/chrome149-header-order.js +289 -0
  117. package/dist/runtime/diagnostic-env-values.d.ts +5 -0
  118. package/dist/runtime/diagnostic-env-values.js +57 -0
  119. package/dist/runtime/diagnostic-env.d.ts +14 -0
  120. package/dist/runtime/diagnostic-env.js +44 -0
  121. package/dist/runtime/diagnostic-redactor.d.ts +54 -0
  122. package/dist/runtime/diagnostic-redactor.js +571 -0
  123. package/dist/runtime/egress-lease.d.ts +65 -0
  124. package/dist/runtime/egress-lease.js +236 -0
  125. package/dist/runtime/engine-mode.d.ts +74 -0
  126. package/dist/runtime/engine-mode.js +152 -0
  127. package/dist/runtime/env.js +14 -1
  128. package/dist/runtime/executor.d.ts +3 -2
  129. package/dist/runtime/executor.js +23 -26
  130. package/dist/runtime/handle-wordlist.d.ts +43 -0
  131. package/dist/runtime/handle-wordlist.js +256 -0
  132. package/dist/runtime/handle.d.ts +71 -0
  133. package/dist/runtime/handle.js +908 -0
  134. package/dist/runtime/http-telemetry-binding.d.ts +10 -0
  135. package/dist/runtime/http-telemetry-binding.js +152 -0
  136. package/dist/runtime/http-telemetry-guard.d.ts +16 -0
  137. package/dist/runtime/http-telemetry-guard.js +202 -0
  138. package/dist/runtime/http-telemetry.d.ts +104 -0
  139. package/dist/runtime/http-telemetry.js +190 -0
  140. package/dist/runtime/http.d.ts +34 -0
  141. package/dist/runtime/http.js +680 -121
  142. package/dist/runtime/insights.js +2 -2
  143. package/dist/runtime/instrumentation.d.ts +2 -2
  144. package/dist/runtime/instrumentation.js +462 -19
  145. package/dist/runtime/native-network-errors.d.ts +33 -0
  146. package/dist/runtime/native-network-errors.js +69 -0
  147. package/dist/runtime/native-network.d.ts +105 -0
  148. package/dist/runtime/native-network.js +1433 -0
  149. package/dist/runtime/native-telemetry.d.ts +142 -0
  150. package/dist/runtime/native-telemetry.js +231 -0
  151. package/dist/runtime/ocr-telemetry.d.ts +82 -0
  152. package/dist/runtime/ocr-telemetry.js +192 -0
  153. package/dist/runtime/ocr.d.ts +29 -0
  154. package/dist/runtime/ocr.js +468 -0
  155. package/dist/runtime/otlp.d.ts +71 -2
  156. package/dist/runtime/otlp.js +398 -16
  157. package/dist/runtime/provider.d.ts +7 -0
  158. package/dist/runtime/provider.js +14 -0
  159. package/dist/runtime/proxy-errors.js +6 -2
  160. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  161. package/dist/runtime/proxy-nodemaven.js +147 -0
  162. package/dist/runtime/proxy-retry-policy.d.ts +4 -1
  163. package/dist/runtime/proxy-retry-policy.js +11 -2
  164. package/dist/runtime/proxy-telemetry.d.ts +133 -3
  165. package/dist/runtime/proxy-telemetry.js +218 -70
  166. package/dist/runtime/redirect-hop-headers.d.ts +19 -0
  167. package/dist/runtime/redirect-hop-headers.js +58 -0
  168. package/dist/runtime/redirects.d.ts +61 -0
  169. package/dist/runtime/redirects.js +149 -0
  170. package/dist/runtime/redis.d.ts +1 -1
  171. package/dist/runtime/redis.js +4 -2
  172. package/dist/runtime/request-options.d.ts +75 -1
  173. package/dist/runtime/request-options.js +588 -0
  174. package/dist/runtime/request-telemetry.d.ts +70 -0
  175. package/dist/runtime/request-telemetry.js +229 -0
  176. package/dist/runtime/resolver-config.d.ts +13 -0
  177. package/dist/runtime/resolver-config.js +14 -0
  178. package/dist/runtime/resolver-public.d.ts +3 -0
  179. package/dist/runtime/resolver-public.js +1 -0
  180. package/dist/runtime/resolver-runtime-options.d.ts +14 -0
  181. package/dist/runtime/resolver-runtime-options.js +33 -0
  182. package/dist/runtime/resolver-shared.d.ts +24 -0
  183. package/dist/runtime/resolver-shared.js +69 -0
  184. package/dist/runtime/resolver-span-attributes.d.ts +34 -0
  185. package/dist/runtime/resolver-span-attributes.js +93 -0
  186. package/dist/runtime/resolver-telemetry.d.ts +135 -0
  187. package/dist/runtime/resolver-telemetry.js +204 -0
  188. package/dist/runtime/resolver-usage.d.ts +32 -0
  189. package/dist/runtime/resolver-usage.js +54 -0
  190. package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
  191. package/dist/runtime/resolver-vendors/bindings.js +45 -0
  192. package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
  193. package/dist/runtime/resolver-vendors/browser.js +423 -0
  194. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  195. package/dist/runtime/resolver-vendors/capsolver.js +544 -0
  196. package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
  197. package/dist/runtime/resolver-vendors/hosts.js +68 -0
  198. package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
  199. package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
  200. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  201. package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
  202. package/dist/runtime/resolver-vendors/types.d.ts +125 -0
  203. package/dist/runtime/resolver-vendors/types.js +106 -0
  204. package/dist/runtime/resolver.d.ts +79 -0
  205. package/dist/runtime/resolver.js +1094 -0
  206. package/dist/runtime/state-telemetry.d.ts +79 -0
  207. package/dist/runtime/state-telemetry.js +194 -0
  208. package/dist/runtime/state.d.ts +10 -1
  209. package/dist/runtime/state.js +322 -82
  210. package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
  211. package/dist/runtime/stealth-akamai-sbsd.js +142 -0
  212. package/dist/runtime/stealth-cookies.d.ts +24 -0
  213. package/dist/runtime/stealth-cookies.js +131 -0
  214. package/dist/runtime/stealth-owned-headers.d.ts +39 -0
  215. package/dist/runtime/stealth-owned-headers.js +57 -0
  216. package/dist/runtime/stealth-telemetry.d.ts +92 -0
  217. package/dist/runtime/stealth-telemetry.js +179 -0
  218. package/dist/runtime/stealth.d.ts +45 -6
  219. package/dist/runtime/stealth.js +1775 -320
  220. package/dist/runtime/stt-telemetry.d.ts +77 -0
  221. package/dist/runtime/stt-telemetry.js +176 -0
  222. package/dist/runtime/stt.js +18 -19
  223. package/dist/runtime/timeout.d.ts +5 -0
  224. package/dist/runtime/timeout.js +12 -0
  225. package/dist/runtime/trace-config.d.ts +12 -0
  226. package/dist/runtime/trace-config.js +62 -0
  227. package/dist/runtime/trace.d.ts +17 -0
  228. package/dist/runtime/trace.js +176 -25
  229. package/dist/runtime-boundary-lint.d.ts +137 -0
  230. package/dist/runtime-boundary-lint.js +590 -0
  231. package/dist/schema.d.ts +20 -0
  232. package/dist/schema.js +72 -2
  233. package/dist/serve.d.ts +1 -1
  234. package/dist/serve.js +1 -1
  235. package/dist/server/error-observability.d.ts +1 -0
  236. package/dist/server/error-observability.js +1 -0
  237. package/dist/server/error-stack-frames.d.ts +35 -0
  238. package/dist/server/error-stack-frames.js +219 -0
  239. package/dist/server/index.d.ts +21 -2
  240. package/dist/server/index.js +11 -2
  241. package/dist/server/runtime-diagnostics.d.ts +165 -0
  242. package/dist/server/runtime-diagnostics.js +360 -0
  243. package/dist/server/sdk-version.d.ts +3 -0
  244. package/dist/server/sdk-version.js +19 -0
  245. package/dist/server/self-test-input-tokens.d.ts +2 -1
  246. package/dist/server/self-test-input-tokens.js +18 -14
  247. package/dist/server/self-test-redaction.js +8 -33
  248. package/dist/server/self-test.d.ts +18 -3
  249. package/dist/server/self-test.js +139 -76
  250. package/dist/server/sensitive-values.d.ts +26 -0
  251. package/dist/server/sensitive-values.js +137 -0
  252. package/dist/server/serve-implementation.d.ts +285 -0
  253. package/dist/server/serve-implementation.js +3172 -0
  254. package/dist/server/serve.d.ts +1 -75
  255. package/dist/server/serve.js +1 -1170
  256. package/dist/server/state-backend-report.d.ts +70 -0
  257. package/dist/server/state-backend-report.js +113 -0
  258. package/dist/server/trace-output.d.ts +7 -0
  259. package/dist/server/trace-output.js +111 -0
  260. package/dist/server/types.d.ts +37 -5
  261. package/dist/server/types.js +34 -1
  262. package/dist/stateful/errors.d.ts +19 -0
  263. package/dist/stateful/errors.js +24 -0
  264. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  265. package/dist/stateful/http-provider-event-emitter.js +237 -0
  266. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  267. package/dist/stateful/http-session-owner-registry.js +210 -0
  268. package/dist/stateful/index.d.ts +18 -0
  269. package/dist/stateful/index.js +18 -0
  270. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  271. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  272. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  273. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  274. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  275. package/dist/stateful/provider-event-pipeline.js +1 -0
  276. package/dist/stateful/provider-events.d.ts +101 -0
  277. package/dist/stateful/provider-events.js +289 -0
  278. package/dist/stateful/session-key.d.ts +15 -0
  279. package/dist/stateful/session-key.js +86 -0
  280. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  281. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  282. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  283. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  284. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  285. package/dist/stateful/stateful-provider-adapter.js +287 -0
  286. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  287. package/dist/stateful/stateful-provider-observability.js +161 -0
  288. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  289. package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
  290. package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
  291. package/dist/stateful/stateful-provider-runtime-context.js +61 -0
  292. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  293. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  294. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  295. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  296. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  297. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  298. package/dist/stateful-signing.d.ts +18 -0
  299. package/dist/stateful-signing.js +27 -0
  300. package/dist/stealth/profiles.d.ts +15 -4
  301. package/dist/stealth/profiles.js +169 -211
  302. package/dist/stream-evidence.d.ts +74 -0
  303. package/dist/stream-evidence.js +785 -0
  304. package/dist/stream.js +7 -1
  305. package/dist/testing/index.d.ts +2 -1
  306. package/dist/testing/index.js +2 -1
  307. package/dist/testing/run.d.ts +32 -2
  308. package/dist/testing/run.js +509 -25
  309. package/dist/trace-sanitization.d.ts +6 -0
  310. package/dist/trace-sanitization.js +68 -0
  311. package/dist/types.d.ts +899 -210
  312. package/dist/types.js +1 -0
  313. package/dist/typescript-module.d.ts +39 -0
  314. package/dist/typescript-module.js +72 -0
  315. package/package.json +52 -6
  316. package/src/auth-turn/index.ts +1 -1
  317. package/src/auth.ts +118 -0
  318. package/src/ceremonies/index.ts +189 -46
  319. package/src/cli/commands.ts +37 -0
  320. package/src/cli/create.ts +8 -2
  321. package/src/cli/deployment-intent.ts +364 -0
  322. package/src/cli/local-connection.ts +221 -0
  323. package/src/cli/migrate-deployment-intent.ts +1908 -0
  324. package/src/cli/migrate-operation-declaration.ts +3026 -0
  325. package/src/cli/migrate-operation-shape.ts +184 -0
  326. package/src/cli/migrate-provider-shape.ts +778 -0
  327. package/src/cli/resolver-runtime.ts +72 -0
  328. package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  329. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  330. package/src/cli/templates/provider/README.md.tpl +41 -19
  331. package/src/cli/templates/provider/index.ts.tpl +6 -3
  332. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  333. package/src/cli/templates/provider/provider.json.tpl +6 -0
  334. package/src/config/loader.ts +774 -181
  335. package/src/contract-serialization.ts +5 -7
  336. package/src/contract-types.ts +12 -5
  337. package/src/contract.ts +24 -10
  338. package/src/declaration-validation.ts +376 -0
  339. package/src/define.ts +1105 -131
  340. package/src/dev.ts +13 -1
  341. package/src/engine.ts +390 -0
  342. package/src/error-observability.ts +64 -0
  343. package/src/error-resolution.ts +269 -0
  344. package/src/errors.ts +157 -0
  345. package/src/fixture-sanitization.ts +422 -0
  346. package/src/handle-meta.ts +143 -0
  347. package/src/handle.ts +694 -0
  348. package/src/health-scenario.ts +960 -0
  349. package/src/i18n/catalog.ts +23 -1
  350. package/src/i18n/error-messages.ts +255 -0
  351. package/src/i18n/index.ts +1 -0
  352. package/src/i18n/keys.ts +80 -6
  353. package/src/i18n/operation-locale-namespace.ts +10 -0
  354. package/src/index.ts +390 -23
  355. package/src/lint.ts +2975 -234
  356. package/src/native-address.ts +340 -0
  357. package/src/native-egress-policy.ts +358 -0
  358. package/src/observability.ts +51 -1
  359. package/src/provider.ts +207 -27
  360. package/src/runtime/auth-flow.ts +15 -0
  361. package/src/runtime/bounded-expiring-map.ts +67 -0
  362. package/src/runtime/browser-telemetry-binding.ts +92 -0
  363. package/src/runtime/browser-telemetry.ts +289 -0
  364. package/src/runtime/browser.ts +882 -99
  365. package/src/runtime/cache-telemetry.ts +247 -0
  366. package/src/runtime/cache.ts +258 -22
  367. package/src/runtime/capability-response.ts +53 -0
  368. package/src/runtime/capability-telemetry.ts +101 -0
  369. package/src/runtime/chrome149-header-order.ts +330 -0
  370. package/src/runtime/diagnostic-env-values.ts +56 -0
  371. package/src/runtime/diagnostic-env.ts +65 -0
  372. package/src/runtime/diagnostic-redactor.ts +668 -0
  373. package/src/runtime/egress-lease.ts +341 -0
  374. package/src/runtime/engine-mode.ts +233 -0
  375. package/src/runtime/env.ts +15 -1
  376. package/src/runtime/executor.ts +39 -32
  377. package/src/runtime/handle-wordlist.ts +266 -0
  378. package/src/runtime/handle.ts +1180 -0
  379. package/src/runtime/http-telemetry-binding.ts +162 -0
  380. package/src/runtime/http-telemetry-guard.ts +208 -0
  381. package/src/runtime/http-telemetry.ts +292 -0
  382. package/src/runtime/http.ts +896 -150
  383. package/src/runtime/insights.ts +2 -2
  384. package/src/runtime/instrumentation.ts +628 -28
  385. package/src/runtime/native-network-errors.ts +99 -0
  386. package/src/runtime/native-network.ts +1853 -0
  387. package/src/runtime/native-telemetry.ts +366 -0
  388. package/src/runtime/ocr-telemetry.ts +308 -0
  389. package/src/runtime/ocr.ts +564 -0
  390. package/src/runtime/otlp.ts +468 -21
  391. package/src/runtime/provider.ts +15 -0
  392. package/src/runtime/proxy-errors.ts +12 -4
  393. package/src/runtime/proxy-nodemaven.ts +222 -0
  394. package/src/runtime/proxy-retry-policy.ts +12 -1
  395. package/src/runtime/proxy-telemetry.ts +358 -103
  396. package/src/runtime/redirect-hop-headers.ts +71 -0
  397. package/src/runtime/redirects.ts +215 -0
  398. package/src/runtime/redis.ts +7 -2
  399. package/src/runtime/request-options.ts +728 -1
  400. package/src/runtime/request-telemetry.ts +375 -0
  401. package/src/runtime/resolver-config.ts +18 -0
  402. package/src/runtime/resolver-public.ts +44 -0
  403. package/src/runtime/resolver-runtime-options.ts +50 -0
  404. package/src/runtime/resolver-shared.ts +113 -0
  405. package/src/runtime/resolver-span-attributes.ts +139 -0
  406. package/src/runtime/resolver-telemetry.ts +362 -0
  407. package/src/runtime/resolver-usage.ts +99 -0
  408. package/src/runtime/resolver-vendors/bindings.ts +61 -0
  409. package/src/runtime/resolver-vendors/browser.ts +591 -0
  410. package/src/runtime/resolver-vendors/capsolver.ts +727 -0
  411. package/src/runtime/resolver-vendors/hosts.ts +81 -0
  412. package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
  413. package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
  414. package/src/runtime/resolver-vendors/types.ts +261 -0
  415. package/src/runtime/resolver.ts +1543 -0
  416. package/src/runtime/state-telemetry.ts +298 -0
  417. package/src/runtime/state.ts +435 -89
  418. package/src/runtime/stealth-akamai-sbsd.ts +207 -0
  419. package/src/runtime/stealth-cookies.ts +155 -0
  420. package/src/runtime/stealth-owned-headers.ts +67 -0
  421. package/src/runtime/stealth-telemetry.ts +309 -0
  422. package/src/runtime/stealth.ts +2275 -372
  423. package/src/runtime/stt-telemetry.ts +282 -0
  424. package/src/runtime/stt.ts +96 -91
  425. package/src/runtime/timeout.ts +18 -0
  426. package/src/runtime/trace-config.ts +78 -0
  427. package/src/runtime/trace.ts +257 -35
  428. package/src/runtime-boundary-lint.ts +707 -0
  429. package/src/schema.ts +80 -2
  430. package/src/serve.ts +6 -1
  431. package/src/server/error-observability.ts +1 -0
  432. package/src/server/error-stack-frames.ts +214 -0
  433. package/src/server/index.ts +184 -2
  434. package/src/server/runtime-diagnostics.ts +522 -0
  435. package/src/server/sdk-version.ts +22 -0
  436. package/src/server/self-test-input-tokens.ts +29 -14
  437. package/src/server/self-test-redaction.ts +10 -40
  438. package/src/server/self-test.ts +205 -89
  439. package/src/server/sensitive-values.ts +211 -0
  440. package/src/server/serve-implementation.ts +4596 -0
  441. package/src/server/serve.ts +1 -1685
  442. package/src/server/state-backend-report.ts +185 -0
  443. package/src/server/trace-output.ts +189 -0
  444. package/src/server/types.ts +34 -1
  445. package/src/stateful/README.md +146 -0
  446. package/src/stateful/errors.ts +35 -0
  447. package/src/stateful/http-provider-event-emitter.ts +314 -0
  448. package/src/stateful/http-session-owner-registry.ts +306 -0
  449. package/src/stateful/index.ts +18 -0
  450. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  451. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  452. package/src/stateful/provider-event-pipeline.ts +61 -0
  453. package/src/stateful/provider-events.ts +462 -0
  454. package/src/stateful/session-key.ts +111 -0
  455. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  456. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  457. package/src/stateful/stateful-provider-adapter.ts +562 -0
  458. package/src/stateful/stateful-provider-observability.ts +261 -0
  459. package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
  460. package/src/stateful/stateful-provider-runtime-context.ts +96 -0
  461. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  462. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  463. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  464. package/src/stateful-signing.ts +46 -0
  465. package/src/stealth/profiles.ts +212 -231
  466. package/src/stream-evidence.ts +988 -0
  467. package/src/stream.ts +8 -1
  468. package/src/testing/index.ts +10 -1
  469. package/src/testing/run.ts +685 -19
  470. package/src/trace-sanitization.ts +110 -0
  471. package/src/types.ts +1014 -273
  472. package/src/typescript-module.ts +100 -0
  473. package/dist/choice-token.d.ts +0 -24
  474. package/dist/choice-token.js +0 -74
  475. package/dist/runtime/choice.d.ts +0 -15
  476. package/dist/runtime/choice.js +0 -413
  477. package/src/choice-token.ts +0 -165
  478. package/src/runtime/choice.ts +0 -686
@@ -0,0 +1,229 @@
1
+ import { PROVIDER_OBSERVABILITY_TAXONOMY_VERSION } from "../observability.js";
2
+ export const PROVIDER_TELEMETRY_HEADER = "X-ApiFuse-Provider-Telemetry";
3
+ /** Brands a value from an SDK-declared closed string union without changing it. */
4
+ export function closedEnum(value) {
5
+ return value;
6
+ }
7
+ /** Names the deliberate tenant cache-key exemption without changing its wire value. */
8
+ export function tenantOpaqueKeys(value) {
9
+ return value;
10
+ }
11
+ const MAX_HEADER_BYTES = 4_096;
12
+ const MAX_INGESTIBLE_ARRAY_LENGTH = 64;
13
+ const MAX_INGESTIBLE_OBJECT_KEYS = 32;
14
+ const MAX_INGESTIBLE_DEPTH = 4;
15
+ const INGESTIBLE_TOKEN = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/;
16
+ /** @internal */
17
+ export const HEADER_PRIORITY = [
18
+ "proxy",
19
+ "resolver",
20
+ "native",
21
+ "http",
22
+ "stealth",
23
+ "browser",
24
+ "ocr",
25
+ "stt",
26
+ "cache",
27
+ "state",
28
+ ];
29
+ const warnedInvalidKeys = new Set();
30
+ function createSpanIndex(trace) {
31
+ const spans = trace.getSpans().slice();
32
+ const mutableByName = new Map();
33
+ for (const span of spans) {
34
+ const named = mutableByName.get(span.name);
35
+ if (named)
36
+ named.push(span);
37
+ else
38
+ mutableByName.set(span.name, [span]);
39
+ }
40
+ const byName = new Map(mutableByName);
41
+ return {
42
+ spans,
43
+ byName,
44
+ count(name) {
45
+ return byName.get(name)?.length ?? 0;
46
+ },
47
+ durationMs(name) {
48
+ return (byName.get(name) ?? []).reduce((total, span) => total + span.duration_ms, 0);
49
+ },
50
+ };
51
+ }
52
+ function isPlainRecord(value) {
53
+ if (value === null || typeof value !== "object" || Array.isArray(value))
54
+ return false;
55
+ const prototype = Object.getPrototypeOf(value);
56
+ return prototype === Object.prototype || prototype === null;
57
+ }
58
+ /**
59
+ * Bounded structural defence in depth against casts and accidental free text.
60
+ * Closed-enum brands are erased at runtime; the type-level guard is the contract,
61
+ * while this check only enforces safe token shapes and collection bounds.
62
+ */
63
+ export function isGatewayIngestible(value) {
64
+ const ancestors = new Set();
65
+ const visit = (candidate, depth) => {
66
+ if (typeof candidate === "number")
67
+ return Number.isFinite(candidate);
68
+ if (typeof candidate === "boolean")
69
+ return true;
70
+ if (typeof candidate === "string")
71
+ return INGESTIBLE_TOKEN.test(candidate);
72
+ if (candidate === null || typeof candidate !== "object")
73
+ return false;
74
+ if (depth >= MAX_INGESTIBLE_DEPTH || ancestors.has(candidate))
75
+ return false;
76
+ if (Array.isArray(candidate)) {
77
+ if (candidate.length > MAX_INGESTIBLE_ARRAY_LENGTH)
78
+ return false;
79
+ ancestors.add(candidate);
80
+ const valid = candidate.every((item, index) => Object.hasOwn(candidate, index) && visit(item, depth + 1));
81
+ ancestors.delete(candidate);
82
+ return valid;
83
+ }
84
+ if (!isPlainRecord(candidate))
85
+ return false;
86
+ const keys = Object.keys(candidate);
87
+ if (keys.length > MAX_INGESTIBLE_OBJECT_KEYS)
88
+ return false;
89
+ ancestors.add(candidate);
90
+ const valid = keys.every((key) => visit(candidate[key], depth + 1));
91
+ ancestors.delete(candidate);
92
+ return valid;
93
+ };
94
+ try {
95
+ return visit(value, 0);
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ function encodeEnvelope(envelope) {
102
+ return Buffer.from(JSON.stringify(envelope), "utf8").toString("base64url");
103
+ }
104
+ function warnInvalidSibling(key) {
105
+ if (warnedInvalidKeys.has(key))
106
+ return;
107
+ warnedInvalidKeys.add(key);
108
+ try {
109
+ console.warn(`[provider-sdk] Dropped invalid telemetry sibling "${key}"; contributors must return serializable log objects and bounded gateway-safe header values.`);
110
+ }
111
+ catch {
112
+ // A host-provided console must not let telemetry fail the request path.
113
+ }
114
+ }
115
+ function isProxySink(value) {
116
+ if (value === null || typeof value !== "object")
117
+ return false;
118
+ try {
119
+ return typeof Reflect.get(value, "recordProxyResolution") === "function";
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ /** One finalisation owner for every request-scoped telemetry contributor. */
126
+ export class RequestTelemetry {
127
+ trace;
128
+ contributors;
129
+ #registered = {};
130
+ #exposed = {};
131
+ #proxy;
132
+ constructor(trace) {
133
+ this.trace = trace;
134
+ this.contributors = this.#exposed;
135
+ }
136
+ register(contributor) {
137
+ if (this.#registered[contributor.key]) {
138
+ throw new TypeError(`Telemetry contributor "${contributor.key}" is already registered.`);
139
+ }
140
+ const registered = {
141
+ key: contributor.key,
142
+ toLogPayload: (spans) => contributor.toLogPayload(spans),
143
+ toHeaderPayload: (log) => contributor.toHeaderPayload(log),
144
+ };
145
+ this.#registered[contributor.key] = registered;
146
+ this.#exposed[contributor.key] = contributor;
147
+ if (contributor.key === "proxy" && isProxySink(contributor))
148
+ this.#proxy = contributor;
149
+ }
150
+ get proxy() {
151
+ return this.#proxy;
152
+ }
153
+ toLogPayload() {
154
+ const spans = createSpanIndex(this.trace);
155
+ const payload = {};
156
+ for (const key of Object.keys(this.#registered)) {
157
+ const contributor = this.#registered[key];
158
+ if (!contributor)
159
+ continue;
160
+ try {
161
+ const sibling = contributor.toLogPayload(spans);
162
+ if (sibling === undefined)
163
+ continue;
164
+ JSON.stringify(sibling);
165
+ payload[key] = sibling;
166
+ }
167
+ catch {
168
+ warnInvalidSibling(key);
169
+ }
170
+ }
171
+ return Object.keys(payload).length > 0 ? payload : undefined;
172
+ }
173
+ toHeaderValue() {
174
+ const spans = createSpanIndex(this.trace);
175
+ const siblings = {};
176
+ for (const key of HEADER_PRIORITY) {
177
+ const contributor = this.#registered[key];
178
+ if (!contributor)
179
+ continue;
180
+ try {
181
+ const log = contributor.toLogPayload(spans);
182
+ if (log === undefined)
183
+ continue;
184
+ const projected = contributor.toHeaderPayload(log);
185
+ if (projected === undefined)
186
+ continue;
187
+ if (!isGatewayIngestible(projected)) {
188
+ warnInvalidSibling(key);
189
+ continue;
190
+ }
191
+ const serialized = JSON.stringify(projected);
192
+ const decoded = JSON.parse(serialized);
193
+ if (!isGatewayIngestible(decoded) || !isPlainRecord(decoded)) {
194
+ warnInvalidSibling(key);
195
+ continue;
196
+ }
197
+ siblings[key] = decoded;
198
+ }
199
+ catch {
200
+ warnInvalidSibling(key);
201
+ }
202
+ }
203
+ if (Object.keys(siblings).length === 0)
204
+ return undefined;
205
+ // Gateway uses permissive json.Unmarshal (unknown keys are ignored) but
206
+ // requires v === 1. The observability taxonomy is additive and independent.
207
+ const envelope = {
208
+ v: 1,
209
+ taxonomy: PROVIDER_OBSERVABILITY_TAXONOMY_VERSION,
210
+ ...siblings,
211
+ };
212
+ let encoded = encodeEnvelope(envelope);
213
+ if (encoded.length <= MAX_HEADER_BYTES)
214
+ return encoded;
215
+ for (let index = HEADER_PRIORITY.length - 1; index >= 0; index -= 1) {
216
+ const key = HEADER_PRIORITY[index];
217
+ if (!key || !(key in envelope))
218
+ continue;
219
+ delete envelope[key];
220
+ if (!HEADER_PRIORITY.some((candidate) => candidate in envelope))
221
+ return undefined;
222
+ envelope.truncated = true;
223
+ encoded = encodeEnvelope(envelope);
224
+ if (encoded.length <= MAX_HEADER_BYTES)
225
+ return encoded;
226
+ }
227
+ return undefined;
228
+ }
229
+ }
@@ -0,0 +1,13 @@
1
+ import type { ProviderChallengeKind } from "../types.js";
2
+ export declare const APIFUSE__RESOLVER__2CAPTCHA__API_KEY = "APIFUSE__RESOLVER__2CAPTCHA__API_KEY";
3
+ export declare const APIFUSE__RESOLVER__CAPSOLVER__API_KEY = "APIFUSE__RESOLVER__CAPSOLVER__API_KEY";
4
+ export declare const APIFUSE__RESOLVER__CAPMONSTER__API_KEY = "APIFUSE__RESOLVER__CAPMONSTER__API_KEY";
5
+ export declare const APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY = "APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY";
6
+ export declare const APIFUSE__RESOLVER__TIMEOUT_MS = "APIFUSE__RESOLVER__TIMEOUT_MS";
7
+ export declare const APIFUSE__CDP_POOL__URL = "APIFUSE__CDP_POOL__URL";
8
+ export declare const DEFAULT_RESOLVER_TIMEOUT_MS = 180000;
9
+ /**
10
+ * SBSD is solved on the provider's own admitted session, so the transport profile must be
11
+ * declared up front. Other kinds, including `akamai_sensor`, keep the profile optional.
12
+ */
13
+ export declare function kindRequiresClientProfile(kind: ProviderChallengeKind): boolean;
@@ -0,0 +1,14 @@
1
+ export const APIFUSE__RESOLVER__2CAPTCHA__API_KEY = "APIFUSE__RESOLVER__2CAPTCHA__API_KEY";
2
+ export const APIFUSE__RESOLVER__CAPSOLVER__API_KEY = "APIFUSE__RESOLVER__CAPSOLVER__API_KEY";
3
+ export const APIFUSE__RESOLVER__CAPMONSTER__API_KEY = "APIFUSE__RESOLVER__CAPMONSTER__API_KEY";
4
+ export const APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY = "APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY";
5
+ export const APIFUSE__RESOLVER__TIMEOUT_MS = "APIFUSE__RESOLVER__TIMEOUT_MS";
6
+ export const APIFUSE__CDP_POOL__URL = "APIFUSE__CDP_POOL__URL";
7
+ export const DEFAULT_RESOLVER_TIMEOUT_MS = 180_000;
8
+ /**
9
+ * SBSD is solved on the provider's own admitted session, so the transport profile must be
10
+ * declared up front. Other kinds, including `akamai_sensor`, keep the profile optional.
11
+ */
12
+ export function kindRequiresClientProfile(kind) {
13
+ return kind === "akamai_sbsd";
14
+ }
@@ -0,0 +1,3 @@
1
+ export { APIFUSE__CDP_POOL__URL, APIFUSE__RESOLVER__2CAPTCHA__API_KEY, APIFUSE__RESOLVER__CAPMONSTER__API_KEY, APIFUSE__RESOLVER__CAPSOLVER__API_KEY, APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY, APIFUSE__RESOLVER__TIMEOUT_MS, bindResolverSignal, createResolverClient, createResolverClientFromEnv, createUnsupportedResolverClient, DEFAULT_RESOLVER_VENDOR_PREFERENCE, DEFAULT_RESOLVER_TIMEOUT_MS, getResolverSolutionSource, invalidateCachedResolverSolution, invalidateResolverSolution, RESOLVER_ADAPTER_REGISTRY, RESOLVER_INSTRUMENTATION_METADATA, resolveProviderResolverVendors, type ResolverAdapterFactory, type ResolverInstrumentationMetadata, type ResolverRuntimeOptions, type ResolverSolutionSource, } from "./resolver.js";
2
+ export { type ResolverCacheReadTelemetryEvent, type ResolverCacheWriteTelemetryEvent, type ResolverFailoverTelemetryEvent, type ResolverIdentityTelemetryEvent, type ResolverOutcomeTelemetryEvent, type ResolverTelemetryAttemptOutcome, type ResolverTelemetryCacheStatus, type ResolverTelemetryCacheWriteReason, type ResolverTelemetryErrorClass, type ResolverTelemetryIdentitySource, type ResolverTelemetryOutcome, type ResolverTelemetryPhase, type ResolverTelemetrySink, type ResolverVendorAttemptTelemetryEvent, } from "./resolver-telemetry.js";
3
+ export type { ResolverPaidUsageContext, ResolverVendorUnavailableReason, } from "./resolver-vendors/types.js";
@@ -0,0 +1 @@
1
+ export { APIFUSE__CDP_POOL__URL, APIFUSE__RESOLVER__2CAPTCHA__API_KEY, APIFUSE__RESOLVER__CAPMONSTER__API_KEY, APIFUSE__RESOLVER__CAPSOLVER__API_KEY, APIFUSE__RESOLVER__HYPERSOLUTIONS__API_KEY, APIFUSE__RESOLVER__TIMEOUT_MS, bindResolverSignal, createResolverClient, createResolverClientFromEnv, createUnsupportedResolverClient, DEFAULT_RESOLVER_VENDOR_PREFERENCE, DEFAULT_RESOLVER_TIMEOUT_MS, getResolverSolutionSource, invalidateCachedResolverSolution, invalidateResolverSolution, RESOLVER_ADAPTER_REGISTRY, RESOLVER_INSTRUMENTATION_METADATA, resolveProviderResolverVendors, } from "./resolver.js";
@@ -0,0 +1,14 @@
1
+ import type { ProviderCache, ProviderDefinition, ProviderProxyPolicy } from "../types.js";
2
+ import type { ResolverRuntimeOptions } from "./resolver.js";
3
+ import type { ResolverTelemetrySink } from "./resolver-telemetry.js";
4
+ import type { BrowserTelemetrySink } from "./browser-telemetry.js";
5
+ /** Normalize the `proxy` declaration shorthand (`true`/`false`) into the policy object the resolver chain consumes. */
6
+ export declare function resolveNativeProxyPolicy(provider: ProviderDefinition): ProviderProxyPolicy | undefined;
7
+ /**
8
+ * One option set for every SDK-built resolver chain — the server's ctx.resolver and automatic
9
+ * SBSD solve, and the CLI helper contexts — so they share allowed hosts, cache, identity scope,
10
+ * proxy intent, and the telemetry sink. `identityScope` is server-owned; CLI contexts pass none.
11
+ */
12
+ export declare function createResolverRuntimeOptions(provider: ProviderDefinition, cache: ProviderCache, identityScope: string | undefined, proxyPolicy: ProviderProxyPolicy | undefined, proxyClientOptions: Omit<NonNullable<ResolverRuntimeOptions["proxyIntent"]>, "mode" | "userAgent">, stealthProfile: {
13
+ readonly userAgent: string;
14
+ } | undefined, telemetry: ResolverTelemetrySink, browserTelemetry?: BrowserTelemetrySink): ResolverRuntimeOptions;
@@ -0,0 +1,33 @@
1
+ /** Normalize the `proxy` declaration shorthand (`true`/`false`) into the policy object the resolver chain consumes. */
2
+ export function resolveNativeProxyPolicy(provider) {
3
+ if (typeof provider.proxy === "object")
4
+ return provider.proxy;
5
+ if (provider.proxy === true)
6
+ return { mode: "optional" };
7
+ if (provider.proxy === false)
8
+ return { mode: "disabled" };
9
+ return undefined;
10
+ }
11
+ /**
12
+ * One option set for every SDK-built resolver chain — the server's ctx.resolver and automatic
13
+ * SBSD solve, and the CLI helper contexts — so they share allowed hosts, cache, identity scope,
14
+ * proxy intent, and the telemetry sink. `identityScope` is server-owned; CLI contexts pass none.
15
+ */
16
+ export function createResolverRuntimeOptions(provider, cache, identityScope, proxyPolicy, proxyClientOptions, stealthProfile, telemetry, browserTelemetry) {
17
+ return {
18
+ allowedHosts: provider.allowedHosts,
19
+ cache,
20
+ telemetry,
21
+ browserTelemetry,
22
+ ...(identityScope === undefined ? {} : { identityScope }),
23
+ ...(proxyPolicy
24
+ ? {
25
+ proxyIntent: {
26
+ mode: proxyPolicy.mode,
27
+ ...proxyClientOptions,
28
+ ...(stealthProfile ? { userAgent: stealthProfile.userAgent } : {}),
29
+ },
30
+ }
31
+ : {}),
32
+ };
33
+ }
@@ -0,0 +1,24 @@
1
+ import type { ChallengeSolution, ProviderChallenge, ResolverContext } from "../types.js";
2
+ import type { TraceRecorder } from "./trace.js";
3
+ import type { ResolverTelemetrySink } from "./resolver-telemetry.js";
4
+ import type { BrowserTelemetrySink } from "./browser-telemetry.js";
5
+ type ResolverTelemetryBinding = (sink: ResolverTelemetrySink, browserSink?: BrowserTelemetrySink) => ResolverContext;
6
+ /** Internal contract: reconstruct a chain with a new request sink, without mutating the host chain. */
7
+ export declare function registerResolverTelemetryBinding(resolver: ResolverContext, bind: ResolverTelemetryBinding): void;
8
+ /** Preserve reconstruction across SDK wrappers without capturing their current request sink. */
9
+ export declare function inheritResolverTelemetryBinding(resolver: ResolverContext, wrapper: ResolverContext): void;
10
+ /** SDK chains expose each vendor invocation; opaque host resolvers expose one custom invocation. */
11
+ export declare function bindResolverTelemetry(resolver: ResolverContext, sink: ResolverTelemetrySink | undefined, browserSink?: BrowserTelemetrySink): ResolverContext;
12
+ export declare const RESOLVER_INSTRUMENTATION_METADATA: unique symbol;
13
+ /**
14
+ * Internal solve surface. The instrumentation layer threads its recorder as a
15
+ * third argument so vendor-level spans (`resolver.vendor.*`) attach to the
16
+ * active trace. Every wrapper that re-exposes `solve` must forward the extra
17
+ * arguments; a wrapper typed against the public two-argument `ResolverContext`
18
+ * silently drops the recorder and vendor spans vanish.
19
+ */
20
+ export type ResolverSolveWithRecorder = {
21
+ solve(challenge: ProviderChallenge, signal?: AbortSignal, traceRecorder?: TraceRecorder): Promise<ChallengeSolution>;
22
+ };
23
+ export declare function createUnsupportedResolverClient(reason?: string): ResolverContext;
24
+ export {};
@@ -0,0 +1,69 @@
1
+ import { ProviderError } from "../errors.js";
2
+ const telemetryBindings = new WeakMap();
3
+ /** Internal contract: reconstruct a chain with a new request sink, without mutating the host chain. */
4
+ export function registerResolverTelemetryBinding(resolver, bind) {
5
+ telemetryBindings.set(resolver, bind);
6
+ }
7
+ /** Preserve reconstruction across SDK wrappers without capturing their current request sink. */
8
+ export function inheritResolverTelemetryBinding(resolver, wrapper) {
9
+ const bind = telemetryBindings.get(resolver);
10
+ if (bind)
11
+ telemetryBindings.set(wrapper, bind);
12
+ }
13
+ /** SDK chains expose each vendor invocation; opaque host resolvers expose one custom invocation. */
14
+ export function bindResolverTelemetry(resolver, sink, browserSink) {
15
+ if (!sink)
16
+ return resolver;
17
+ const metadata = resolver[RESOLVER_INSTRUMENTATION_METADATA];
18
+ if (metadata)
19
+ return bindResolverTelemetry(metadata.target, sink, browserSink);
20
+ const bind = telemetryBindings.get(resolver);
21
+ if (bind)
22
+ return bind(sink, browserSink);
23
+ const wrapper = {
24
+ async solve(challenge, signal, recorder) {
25
+ const startedAt = Date.now();
26
+ let outcome = "error";
27
+ try {
28
+ const solution = await resolver.solve(challenge, signal, recorder);
29
+ outcome = "solved";
30
+ return solution;
31
+ }
32
+ catch (error) {
33
+ outcome = signal?.aborted
34
+ ? "aborted"
35
+ : error instanceof ProviderError && error.code === "RESOLVER_CHAIN_EXHAUSTED"
36
+ ? "exhausted"
37
+ : "error";
38
+ throw error;
39
+ }
40
+ finally {
41
+ const ms = Date.now() - startedAt;
42
+ sink.recordVendorAttempt({
43
+ vendor: "custom",
44
+ phase: outcome === "solved" ? "poll_result" : "create_task",
45
+ outcome: outcome === "solved" ? "ok" : "error",
46
+ ms,
47
+ });
48
+ sink.recordOutcome({ outcome, solveMs: ms, challengeKind: challenge.kind });
49
+ }
50
+ },
51
+ };
52
+ // Rebinding this wrapper returns to the original host, never to its previous sink.
53
+ registerResolverTelemetryBinding(wrapper, createOpaqueResolverTelemetryBinding(resolver));
54
+ return wrapper;
55
+ }
56
+ function createOpaqueResolverTelemetryBinding(resolver) {
57
+ return (sink, browserSink) => bindResolverTelemetry(resolver, sink, browserSink);
58
+ }
59
+ export const RESOLVER_INSTRUMENTATION_METADATA = Symbol.for("@apifuse/provider-sdk/runtime/resolver-instrumentation-metadata");
60
+ export function createUnsupportedResolverClient(reason) {
61
+ return {
62
+ async solve() {
63
+ throw new ProviderError(reason ?? "Resolver runtime is not configured", {
64
+ code: "RESOLVER_UNAVAILABLE",
65
+ fix: "Declare resolver on the provider definition and configure vendor credentials.",
66
+ });
67
+ },
68
+ };
69
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Closed-enum span attributes emitted by the resolver, by attribute key. A value listed here is an
3
+ * SDK-declared literal, so fail-closed diagnostic redaction keeps it the way it keeps a typed
4
+ * number; any other value under the same key is still free text. Registered credentials are
5
+ * matched either way.
6
+ */
7
+ export declare const RESOLVER_CLOSED_ENUM_SPAN_ATTRIBUTES: {
8
+ readonly vendor: readonly ["browser", "capsolver", "capmonster", "2captcha", "hypersolutions", "custom"];
9
+ readonly challenge_kind: readonly ["turnstile", "recaptcha_v2", "recaptcha_v3", "hcaptcha", "cloudflare_interstitial", "aws_waf", "akamai_sec_cpt", "akamai_sensor", "akamai_sbsd"];
10
+ readonly endpoint: readonly ["capsolver:create_task", "twocaptcha:create_task", "hyper:ip", "hyper:sbsd_create"];
11
+ readonly billing: readonly ["metered", "unconfirmed"];
12
+ readonly outcome: readonly ["success", "vendor_error", "timeout", "abandoned", "cache_disabled", "entry_deleted", "index_entry_deleted", "not_cookie_solution", "solution_not_cached"];
13
+ readonly unavailability_reason: readonly ["missing_credentials", "missing_proxy_identity", "missing_client_profile", "missing_challenge_input", "missing_transport", "allocation_exhausted", "transport_failure", "timeout", "not_implemented"];
14
+ readonly verdict_reason: readonly ["human_puzzle", "solve_failed"];
15
+ readonly transport_phase: readonly ["create_task", "poll_result", "cleanup", "measure_ip", "fetch_script", "generate_payload", "post_payload"];
16
+ readonly resolver_identity_source: readonly ["declared", "defaulted"];
17
+ readonly operation: readonly ["client.close", "context.close"];
18
+ };
19
+ type ResolverClosedEnumSpanAttributes = typeof RESOLVER_CLOSED_ENUM_SPAN_ATTRIBUTES;
20
+ type Present<T> = Exclude<T, undefined>;
21
+ /** Properties typed as a finite union of string literals, never plain `string`. */
22
+ type FiniteStringKeys<T> = {
23
+ [K in keyof T]-?: [Present<T[K]>] extends [never] ? never : [Present<T[K]>] extends [string] ? string extends Present<T[K]> ? never : K : never;
24
+ }[keyof T];
25
+ type DeclaredClosedEnumAttributes<T> = {
26
+ [K in keyof T]: K extends FiniteStringKeys<T> ? K extends keyof ResolverClosedEnumSpanAttributes ? [Present<T[K]>] extends [ResolverClosedEnumSpanAttributes[K][number]] ? T[K] : never : never : T[K];
27
+ };
28
+ /**
29
+ * Resolver span attributes. Every property typed as a finite string union must be declared in
30
+ * `RESOLVER_CLOSED_ENUM_SPAN_ATTRIBUTES` with all of its members, so a new closed-enum attribute
31
+ * cannot silently become free text that fail-closed redaction suppresses.
32
+ */
33
+ export declare function resolverSpanAttributes<const T extends Record<string, unknown>>(attributes: T & DeclaredClosedEnumAttributes<T>): T;
34
+ export {};
@@ -0,0 +1,93 @@
1
+ // Type-only imports: the diagnostic redactor reads this table, so it must not pull the resolver
2
+ // runtime (or anything that imports the redactor) into module evaluation.
3
+ /** Every member of a closed string union, as runtime values; a missing or extra member fails tsc. */
4
+ function closedEnumValues() {
5
+ return (values, ..._missing) => values;
6
+ }
7
+ const RESOLVER_PAID_USAGE_OUTCOMES = closedEnumValues()([
8
+ "success",
9
+ "vendor_error",
10
+ "timeout",
11
+ "abandoned",
12
+ ]);
13
+ // `resolver.cache.invalidate` outcomes. The union stays private to resolver.ts; its producer's
14
+ // `resolverSpanAttributes` call fails to compile if it can emit an outcome missing here.
15
+ const RESOLVER_CACHE_INVALIDATION_OUTCOMES = [
16
+ "cache_disabled",
17
+ "entry_deleted",
18
+ "index_entry_deleted",
19
+ "not_cookie_solution",
20
+ "solution_not_cached",
21
+ ];
22
+ /**
23
+ * Closed-enum span attributes emitted by the resolver, by attribute key. A value listed here is an
24
+ * SDK-declared literal, so fail-closed diagnostic redaction keeps it the way it keeps a typed
25
+ * number; any other value under the same key is still free text. Registered credentials are
26
+ * matched either way.
27
+ */
28
+ export const RESOLVER_CLOSED_ENUM_SPAN_ATTRIBUTES = {
29
+ vendor: closedEnumValues()([
30
+ "browser",
31
+ "capsolver",
32
+ "capmonster",
33
+ "2captcha",
34
+ "hypersolutions",
35
+ "custom",
36
+ ]),
37
+ challenge_kind: closedEnumValues()([
38
+ "turnstile",
39
+ "recaptcha_v2",
40
+ "recaptcha_v3",
41
+ "hcaptcha",
42
+ "cloudflare_interstitial",
43
+ "aws_waf",
44
+ "akamai_sec_cpt",
45
+ "akamai_sensor",
46
+ "akamai_sbsd",
47
+ ]),
48
+ endpoint: closedEnumValues()([
49
+ "capsolver:create_task",
50
+ "twocaptcha:create_task",
51
+ "hyper:ip",
52
+ "hyper:sbsd_create",
53
+ ]),
54
+ billing: closedEnumValues()(["metered", "unconfirmed"]),
55
+ outcome: [...RESOLVER_PAID_USAGE_OUTCOMES, ...RESOLVER_CACHE_INVALIDATION_OUTCOMES],
56
+ unavailability_reason: closedEnumValues()([
57
+ "missing_credentials",
58
+ "missing_proxy_identity",
59
+ "missing_client_profile",
60
+ "missing_challenge_input",
61
+ "missing_transport",
62
+ "allocation_exhausted",
63
+ "transport_failure",
64
+ "timeout",
65
+ "not_implemented",
66
+ ]),
67
+ verdict_reason: closedEnumValues()([
68
+ "human_puzzle",
69
+ "solve_failed",
70
+ ]),
71
+ transport_phase: closedEnumValues()([
72
+ "create_task",
73
+ "poll_result",
74
+ "cleanup",
75
+ "measure_ip",
76
+ "fetch_script",
77
+ "generate_payload",
78
+ "post_payload",
79
+ ]),
80
+ resolver_identity_source: closedEnumValues()(["declared", "defaulted"]),
81
+ operation: closedEnumValues()([
82
+ "client.close",
83
+ "context.close",
84
+ ]),
85
+ };
86
+ /**
87
+ * Resolver span attributes. Every property typed as a finite string union must be declared in
88
+ * `RESOLVER_CLOSED_ENUM_SPAN_ATTRIBUTES` with all of its members, so a new closed-enum attribute
89
+ * cannot silently become free text that fail-closed redaction suppresses.
90
+ */
91
+ export function resolverSpanAttributes(attributes) {
92
+ return attributes;
93
+ }