@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
@@ -4,7 +4,7 @@ const SLOW_TRANSFORM_MS = 10;
4
4
  const DNS_WARN_MS = 5;
5
5
  const BROWSER_IDLE_MS = 5_000;
6
6
  const REFRESH_WARN_RATE = 0.1;
7
- const TLS_REUSE_FIX = `const session = ctx.stealth.createSession({ profile: 'chrome-146' });
7
+ const TLS_REUSE_FIX = `const session = ctx.stealth.createSession({ stealth: { browser: 'chrome', os: 'macos' } });
8
8
  const resp = await session.fetch(url, opts);`;
9
9
  const TRANSFORM_FIX = `transformResponse: (raw) => {
10
10
  return raw.items.map(({ id, name, price }) => ({ id, name, price }));
@@ -13,7 +13,7 @@ const LARGE_RESPONSE_FIX = `const resp = await ctx.http.get('/items', {
13
13
  params: { limit: 50, page: 1 },
14
14
  });`;
15
15
  const DNS_FIX = `// Enable DNS caching or reuse a long-lived session per host.
16
- const session = ctx.stealth.createSession({ profile: 'chrome-146' });
16
+ const session = ctx.stealth.createSession({ stealth: { browser: 'chrome', os: 'macos' } });
17
17
  await session.fetch(url, opts);`;
18
18
  const PROXY_FIX = `// Re-check whether this operation really needs a proxy.
19
19
  await ctx.stealth.fetch(url, { ...opts, proxy: undefined });`;
@@ -2,7 +2,7 @@ import type { ProviderContext } from "../types.js";
2
2
  import { type CreateTraceContextOptions, type TraceContext } from "./trace.js";
3
3
  export interface InstrumentationOptions extends CreateTraceContextOptions {
4
4
  }
5
- export type InstrumentedProviderContext<T extends ProviderContext> = Omit<T, "trace"> & {
5
+ export type InstrumentedProviderContext<T extends Pick<ProviderContext, "trace">> = Omit<T, "trace"> & {
6
6
  trace: TraceContext;
7
7
  };
8
- export declare function wrapWithInstrumentation<T extends ProviderContext>(ctx: T, options?: InstrumentationOptions): InstrumentedProviderContext<T>;
8
+ export declare function wrapWithInstrumentation<T extends Pick<ProviderContext, "trace">>(ctx: T, options?: InstrumentationOptions): InstrumentedProviderContext<T>;
@@ -1,5 +1,26 @@
1
+ import { runCapabilitySpan } from "./capability-telemetry.js";
2
+ import { registerDiagnosticSensitiveValues } from "./diagnostic-redactor.js";
3
+ import { readableBytes, readableLines, readableTextChunks } from "../stream.js";
4
+ import { parseHttpRequestInvocation, isSensitiveKey, redactSensitiveError, redactSensitiveText, redactUrlQueryParams, requestOptionsFromHttpInvocation, serializeRequestUrl, } from "./request-options.js";
1
5
  import { createTraceContext, getTraceRecorder, } from "./trace.js";
2
- const BROWSER_PAGE_METHODS = new Set(["goto", "fill", "click", "type", "waitForSelector"]);
6
+ import { RESOLVER_INSTRUMENTATION_METADATA } from "./resolver-shared.js";
7
+ import { resolverSpanAttributes } from "./resolver-span-attributes.js";
8
+ const BROWSER_PAGE_METHODS = new Set([
9
+ "goto",
10
+ "fill",
11
+ "click",
12
+ "type",
13
+ "waitForSelector",
14
+ "evaluate",
15
+ "content",
16
+ "screenshot",
17
+ ]);
18
+ const DIAGNOSTIC_BASE_URL = "http://apifuse-instrumentation.invalid";
19
+ function isThenable(value) {
20
+ return ((typeof value === "object" || typeof value === "function") &&
21
+ value !== null &&
22
+ typeof value.then === "function");
23
+ }
3
24
  function getErrorStatus(error) {
4
25
  if (typeof error === "object" &&
5
26
  error !== null &&
@@ -46,8 +67,173 @@ function getUrl(namespace, args, result) {
46
67
  }
47
68
  return undefined;
48
69
  }
70
+ function requestOptionsForInvocation(namespace, methodName, args) {
71
+ if (namespace === "http") {
72
+ const invocation = parseHttpRequestInvocation(methodName, [...args]);
73
+ return invocation ? requestOptionsFromHttpInvocation(invocation) : undefined;
74
+ }
75
+ if (namespace !== "stealth" || methodName !== "fetch" || typeof args[0] !== "string") {
76
+ return undefined;
77
+ }
78
+ const options = args[1];
79
+ return options !== null && typeof options === "object" && !Array.isArray(options)
80
+ ? options
81
+ : undefined;
82
+ }
83
+ function fallbackSensitiveValues(options) {
84
+ const sensitiveParams = options?.sensitiveParams;
85
+ if (!sensitiveParams || typeof sensitiveParams !== "object")
86
+ return [];
87
+ return Object.values(sensitiveParams).map(String);
88
+ }
89
+ function stripDiagnosticBase(url) {
90
+ return url.startsWith(DIAGNOSTIC_BASE_URL) ? url.slice(DIAGNOSTIC_BASE_URL.length) || "/" : url;
91
+ }
92
+ function serializeDiagnosticUrl(url, options) {
93
+ try {
94
+ return {
95
+ degraded: false,
96
+ serializedUrl: serializeRequestUrl(url, options?.params, options?.sensitiveParams),
97
+ };
98
+ }
99
+ catch {
100
+ try {
101
+ const absoluteUrl = new URL(url, DIAGNOSTIC_BASE_URL).toString();
102
+ const serialized = serializeRequestUrl(absoluteUrl, options?.params, options?.sensitiveParams);
103
+ return {
104
+ degraded: false,
105
+ serializedUrl: {
106
+ requestUrl: stripDiagnosticBase(serialized.requestUrl),
107
+ redactedUrl: stripDiagnosticBase(serialized.redactedUrl),
108
+ sensitiveValues: serialized.sensitiveValues,
109
+ },
110
+ };
111
+ }
112
+ catch {
113
+ const sensitiveParamNames = Object.keys(options?.sensitiveParams ?? {});
114
+ const structural = redactUrlQueryParams(url, sensitiveParamNames);
115
+ return {
116
+ degraded: true,
117
+ serializedUrl: {
118
+ requestUrl: url,
119
+ redactedUrl: structural.redactedUrl,
120
+ sensitiveValues: [
121
+ ...new Set([...fallbackSensitiveValues(options), ...structural.sensitiveValues]),
122
+ ],
123
+ },
124
+ };
125
+ }
126
+ }
127
+ }
128
+ function snapshotRequestDiagnostics(namespace, methodName, args) {
129
+ const options = requestOptionsForInvocation(namespace, methodName, args);
130
+ const url = typeof args[0] === "string" ? args[0] : undefined;
131
+ const hasSensitiveParams = Boolean(options?.sensitiveParams && Object.keys(options.sensitiveParams).length > 0);
132
+ const sensitiveParamNames = Object.keys(options?.sensitiveParams ?? {});
133
+ const diagnosticUrl = hasSensitiveParams && url ? serializeDiagnosticUrl(url, options) : undefined;
134
+ const traceUrl = hasSensitiveParams && url
135
+ ? serializeDiagnosticUrl(url, { sensitiveParams: options?.sensitiveParams }).serializedUrl
136
+ .redactedUrl
137
+ : undefined;
138
+ return {
139
+ ...(diagnosticUrl?.degraded ? { diagnosticUrlDegraded: true } : {}),
140
+ ...(hasSensitiveParams ? { requestId: crypto.randomUUID() } : {}),
141
+ serializedUrl: diagnosticUrl?.serializedUrl,
142
+ sensitiveParamNames,
143
+ sensitiveValues: diagnosticUrl?.serializedUrl.sensitiveValues ?? fallbackSensitiveValues(options),
144
+ traceUrl,
145
+ };
146
+ }
147
+ function sanitizeRequestError(error, diagnostics) {
148
+ return redactSensitiveError(error, diagnostics.sensitiveValues, diagnostics.serializedUrl?.requestUrl, diagnostics.serializedUrl?.redactedUrl);
149
+ }
150
+ function isHttpStreamResponse(value) {
151
+ return (typeof value === "object" &&
152
+ value !== null &&
153
+ "body" in value &&
154
+ value.body instanceof ReadableStream);
155
+ }
156
+ function instrumentHttpStreamConsumption(value, recorder, args, diagnostics) {
157
+ const source = value.body;
158
+ let reader;
159
+ const body = new ReadableStream({
160
+ async pull(controller) {
161
+ try {
162
+ reader ??= source.getReader();
163
+ const chunk = await reader.read();
164
+ if (chunk.done) {
165
+ controller.close();
166
+ return;
167
+ }
168
+ controller.enqueue(chunk.value);
169
+ }
170
+ catch (error) {
171
+ const sanitizedError = sanitizeRequestError(error, diagnostics);
172
+ try {
173
+ await recorder.runSpan("http.stream.consume", () => {
174
+ throw sanitizedError;
175
+ }, {
176
+ onError: (spanError) => buildSpanAttributes("http", "stream", args, undefined, spanError, diagnostics),
177
+ });
178
+ }
179
+ catch (recordedError) {
180
+ controller.error(recordedError);
181
+ }
182
+ }
183
+ },
184
+ async cancel(reason) {
185
+ try {
186
+ await (reader ? reader.cancel(reason) : source.cancel(reason));
187
+ }
188
+ catch (error) {
189
+ throw sanitizeRequestError(error, diagnostics);
190
+ }
191
+ },
192
+ }, { highWaterMark: 0 });
193
+ const instrumented = {
194
+ ...value,
195
+ body,
196
+ bytes: () => readableBytes(body),
197
+ textChunks: () => readableTextChunks(body),
198
+ lines: () => readableLines(body),
199
+ };
200
+ try {
201
+ Object.assign(value, instrumented);
202
+ return value;
203
+ }
204
+ catch {
205
+ return instrumented;
206
+ }
207
+ }
208
+ function isAsyncIterable(value) {
209
+ return (typeof value === "object" &&
210
+ value !== null &&
211
+ Symbol.asyncIterator in value &&
212
+ typeof value[Symbol.asyncIterator] === "function");
213
+ }
214
+ function instrumentHttpSseConsumption(value, recorder, args, diagnostics) {
215
+ const source = value;
216
+ return {
217
+ async *[Symbol.asyncIterator]() {
218
+ try {
219
+ for await (const event of source)
220
+ yield event;
221
+ }
222
+ catch (error) {
223
+ const sanitizedError = sanitizeRequestError(error, diagnostics);
224
+ return await recorder.runSpan("http.sse.consume", () => {
225
+ throw sanitizedError;
226
+ }, {
227
+ onError: (spanError) => buildSpanAttributes("http", "sse", args, undefined, spanError, diagnostics),
228
+ });
229
+ }
230
+ },
231
+ };
232
+ }
49
233
  function getMethod(namespace, methodName, args) {
50
234
  if (namespace === "http") {
235
+ // Preserve the original instrumentation contract: generic entry points are
236
+ // reported as REQUEST/STREAM/SSE, independent of transport options.
51
237
  return methodName.toUpperCase();
52
238
  }
53
239
  if (namespace === "stealth") {
@@ -59,21 +245,38 @@ function getMethod(namespace, methodName, args) {
59
245
  }
60
246
  return undefined;
61
247
  }
62
- function buildSpanAttributes(namespace, methodName, args, result, error) {
248
+ function buildSpanAttributes(namespace, methodName, args, result, error, diagnostics = { sensitiveParamNames: [], sensitiveValues: [] }) {
63
249
  const attributes = {};
64
- const url = getUrl(namespace, args, result);
250
+ const rawUrl = getUrl(namespace, args, result);
251
+ const structuralUrl = diagnostics.traceUrl ?? rawUrl;
252
+ const url = structuralUrl
253
+ ? redactSensitiveText(structuralUrl, diagnostics.sensitiveValues, diagnostics.serializedUrl?.requestUrl, diagnostics.serializedUrl?.redactedUrl)
254
+ : undefined;
65
255
  const method = getMethod(namespace, methodName, args);
66
256
  const status = error ? getErrorStatus(error) : getResponseStatus(namespace, result);
67
257
  const duration = error ? undefined : getResponseDuration(result);
68
258
  if (url) {
69
259
  attributes.url = url;
70
260
  }
261
+ if (diagnostics.requestId)
262
+ attributes.request_id = diagnostics.requestId;
263
+ if (diagnostics.diagnosticUrlDegraded)
264
+ attributes.redaction_degraded = true;
71
265
  if (method) {
72
266
  attributes.method = method;
73
267
  }
74
- if (status !== undefined && (namespace === "http" || namespace === "stealth")) {
268
+ if (status !== undefined &&
269
+ (namespace === "http" || namespace === "stealth" || namespace === "ocr" || namespace === "stt")) {
75
270
  attributes.status = status;
76
271
  }
272
+ if ((namespace === "ocr" || namespace === "stt") && result && typeof result === "object") {
273
+ if ("model" in result && typeof result.model === "string")
274
+ attributes.model = result.model;
275
+ if ("durationMs" in result && typeof result.durationMs === "number")
276
+ attributes.duration_ms = result.durationMs;
277
+ if ("warnings" in result && Array.isArray(result.warnings))
278
+ attributes.warnings = result.warnings.length;
279
+ }
77
280
  if (duration !== undefined) {
78
281
  attributes.duration_ms = duration;
79
282
  }
@@ -86,6 +289,51 @@ function buildSpanAttributes(namespace, methodName, args, result, error) {
86
289
  }
87
290
  return attributes;
88
291
  }
292
+ function isStealthRedirectRunResult(value) {
293
+ return (typeof value === "object" &&
294
+ value !== null &&
295
+ "reason" in value &&
296
+ typeof value.reason === "string" &&
297
+ "hops" in value &&
298
+ Array.isArray(value.hops) &&
299
+ "final" in value &&
300
+ typeof value.final === "object" &&
301
+ value.final !== null);
302
+ }
303
+ function buildStealthRedirectAttributes(args, result, error, diagnostics) {
304
+ const attributes = buildSpanAttributes("stealth", "fetch", args, undefined, error, diagnostics);
305
+ if (!isStealthRedirectRunResult(result))
306
+ return attributes;
307
+ attributes.redirect_reason = result.reason;
308
+ attributes.redirect_hop_count = result.hops.length;
309
+ attributes.status = result.final.status;
310
+ if (result.hops.length > 0) {
311
+ const sensitiveValues = new Set(diagnostics.sensitiveValues);
312
+ const path = result.hops
313
+ .map((hop) => {
314
+ const hopUrl = hop.nextUrl ?? hop.url;
315
+ const responseSensitiveParamNames = [...queryParamNames(hopUrl)].filter(isSensitiveKey);
316
+ const structural = redactUrlQueryParams(hopUrl, [
317
+ ...new Set([...diagnostics.sensitiveParamNames, ...responseSensitiveParamNames]),
318
+ ]);
319
+ for (const value of structural.sensitiveValues)
320
+ sensitiveValues.add(value);
321
+ const safeUrl = redactSensitiveText(structural.redactedUrl, [...sensitiveValues]);
322
+ return `${hop.method} ${hop.status} ${safeUrl}`;
323
+ })
324
+ .join(" -> ");
325
+ attributes.redirect_path = redactSensitiveText(path, [...sensitiveValues], diagnostics.serializedUrl?.requestUrl, diagnostics.serializedUrl?.redactedUrl);
326
+ }
327
+ return attributes;
328
+ }
329
+ function queryParamNames(url) {
330
+ const queryStart = url.indexOf("?");
331
+ if (queryStart === -1)
332
+ return new Set();
333
+ const fragmentStart = url.indexOf("#", queryStart);
334
+ const query = url.slice(queryStart + 1, fragmentStart === -1 ? undefined : fragmentStart);
335
+ return new Set(new URLSearchParams(query).keys());
336
+ }
89
337
  function getBrowserPageAttributes(methodName, args, elapsedMs, error) {
90
338
  const attributes = {};
91
339
  if (methodName === "goto") {
@@ -131,14 +379,30 @@ function wrapPage(page, trace) {
131
379
  const methodName = String(property);
132
380
  const wrapped = (...args) => {
133
381
  let elapsedMs = 0;
134
- return recorder.runSpan(`browser.page.${methodName}`, async () => {
382
+ const diagnostics = snapshotRequestDiagnostics("browser", methodName, args);
383
+ registerDiagnosticSensitiveValues(trace, diagnostics.sensitiveValues);
384
+ return recorder.runSpan(["evaluate", "content", "screenshot"].includes(methodName)
385
+ ? `browser.${methodName}`
386
+ : `browser.page.${methodName}`, async () => {
135
387
  const startedAt = Date.now();
136
- const result = await Reflect.apply(value, pageTarget, args);
388
+ let result;
389
+ try {
390
+ result = await Reflect.apply(value, pageTarget, args);
391
+ }
392
+ catch (error) {
393
+ throw sanitizeRequestError(error, diagnostics);
394
+ }
137
395
  elapsedMs = Date.now() - startedAt;
138
396
  return result;
139
397
  }, {
140
- onSuccess: () => getBrowserPageAttributes(methodName, args, elapsedMs),
141
- onError: (error) => getBrowserPageAttributes(methodName, args, undefined, error),
398
+ onSuccess: () => ({
399
+ ...getBrowserPageAttributes(methodName, args, elapsedMs),
400
+ ...(diagnostics.traceUrl ? { url: diagnostics.traceUrl } : {}),
401
+ }),
402
+ onError: (error) => ({
403
+ ...getBrowserPageAttributes(methodName, args, undefined, error),
404
+ ...(diagnostics.traceUrl ? { url: diagnostics.traceUrl } : {}),
405
+ }),
142
406
  });
143
407
  };
144
408
  wrappedMethods.set(property, wrapped);
@@ -146,18 +410,90 @@ function wrapPage(page, trace) {
146
410
  },
147
411
  });
148
412
  }
149
- function wrapNamespace(namespace, target, trace) {
413
+ function wrapStealthRedirects(redirects, trace) {
150
414
  const recorder = getTraceRecorder(trace);
151
- if (!recorder) {
415
+ if (!recorder)
416
+ return redirects;
417
+ return {
418
+ run(...args) {
419
+ const diagnosticArgs = [args[0].url, args[0]];
420
+ const diagnostics = snapshotRequestDiagnostics("stealth", "fetch", diagnosticArgs);
421
+ registerDiagnosticSensitiveValues(trace, diagnostics.sensitiveValues);
422
+ let result;
423
+ try {
424
+ result = redirects.run(...args);
425
+ }
426
+ catch (error) {
427
+ const sanitizedError = sanitizeRequestError(error, diagnostics);
428
+ recorder
429
+ .runSpan("stealth.redirects.run", () => {
430
+ throw sanitizedError;
431
+ }, {
432
+ onError: (spanError) => buildStealthRedirectAttributes(diagnosticArgs, undefined, spanError, diagnostics),
433
+ })
434
+ .catch(() => undefined);
435
+ throw sanitizedError;
436
+ }
437
+ const sanitizedResult = Promise.resolve(result).catch((error) => {
438
+ throw sanitizeRequestError(error, diagnostics);
439
+ });
440
+ return recorder.runSpan("stealth.redirects.run", () => sanitizedResult, {
441
+ onSuccess: (spanResult) => buildStealthRedirectAttributes(diagnosticArgs, spanResult, undefined, diagnostics),
442
+ onError: (error) => buildStealthRedirectAttributes(diagnosticArgs, undefined, error, diagnostics),
443
+ });
444
+ },
445
+ };
446
+ }
447
+ function wrapStealthSession(session, trace) {
448
+ const wrappedSession = wrapNamespace("stealth", session, trace);
449
+ const redirects = wrapStealthRedirects(session.redirects, trace);
450
+ return new Proxy(wrappedSession, {
451
+ get(target, property, receiver) {
452
+ return property === "redirects" ? redirects : Reflect.get(target, property, receiver);
453
+ },
454
+ });
455
+ }
456
+ function wrapNamespace(namespace, target, trace, shouldInstrument) {
457
+ const baseRecorder = getTraceRecorder(trace);
458
+ if (!baseRecorder)
152
459
  return target;
153
- }
460
+ const recorder = namespace === "ocr" || namespace === "stt"
461
+ ? {
462
+ runSpan: (name, fn, options) => runCapabilitySpan(target, () => baseRecorder.runSpan(name, fn, options)),
463
+ }
464
+ : baseRecorder;
154
465
  const wrappedMethods = new Map();
466
+ const resolverMetadata = namespace === "resolver" ? { target, traceRecorder: recorder } : undefined;
155
467
  return new Proxy(target, {
156
468
  get(namespaceTarget, property, receiver) {
469
+ if (property === RESOLVER_INSTRUMENTATION_METADATA && resolverMetadata) {
470
+ return resolverMetadata;
471
+ }
157
472
  const value = Reflect.get(namespaceTarget, property, receiver);
158
473
  if (typeof value !== "function" || property === "constructor") {
159
474
  return value;
160
475
  }
476
+ if (namespace === "resolver" && property === "solve") {
477
+ if (wrappedMethods.has(property)) {
478
+ return wrappedMethods.get(property);
479
+ }
480
+ const wrapped = (...args) => {
481
+ const challenge = args[0];
482
+ const challengeKind = typeof challenge === "object" &&
483
+ challenge !== null &&
484
+ "kind" in challenge &&
485
+ typeof challenge.kind === "string"
486
+ ? challenge.kind
487
+ : undefined;
488
+ return recorder.runSpan("resolver.solve", () => Reflect.apply(value, namespaceTarget, [args[0], args[1], recorder]), {
489
+ attributes: challengeKind
490
+ ? resolverSpanAttributes({ challenge_kind: challengeKind })
491
+ : undefined,
492
+ });
493
+ };
494
+ wrappedMethods.set(property, wrapped);
495
+ return wrapped;
496
+ }
161
497
  if (namespace === "browser" && property === "newPage") {
162
498
  if (wrappedMethods.has(property)) {
163
499
  return wrappedMethods.get(property);
@@ -194,6 +530,30 @@ function wrapNamespace(namespace, target, trace) {
194
530
  wrappedMethods.set(property, wrapped);
195
531
  return wrapped;
196
532
  }
533
+ if (namespace === "browser" && property === "rawPage") {
534
+ if (wrappedMethods.has(property))
535
+ return wrappedMethods.get(property);
536
+ const wrapped = (...args) => recorder.runSpan("browser.rawPage", async () => {
537
+ const page = await Reflect.apply(value, namespaceTarget, args);
538
+ return wrapPage(page, trace);
539
+ });
540
+ wrappedMethods.set(property, wrapped);
541
+ return wrapped;
542
+ }
543
+ if (namespace === "browser" && property === "withIsolatedContext") {
544
+ if (wrappedMethods.has(property))
545
+ return wrappedMethods.get(property);
546
+ const wrapped = (handler, ...args) => recorder.runSpan("browser.withIsolatedContext", async () => {
547
+ if (typeof handler !== "function")
548
+ return Reflect.apply(value, namespaceTarget, [handler, ...args]);
549
+ return Reflect.apply(value, namespaceTarget, [
550
+ (page) => Reflect.apply(handler, undefined, [wrapPage(page, trace)]),
551
+ ...args,
552
+ ]);
553
+ });
554
+ wrappedMethods.set(property, wrapped);
555
+ return wrapped;
556
+ }
197
557
  if (wrappedMethods.has(property)) {
198
558
  return wrappedMethods.get(property);
199
559
  }
@@ -201,23 +561,103 @@ function wrapNamespace(namespace, target, trace) {
201
561
  if (namespace === "browser") {
202
562
  const wrapped = (...args) => {
203
563
  let elapsedMs = 0;
564
+ const diagnostics = snapshotRequestDiagnostics("browser", methodName, args);
565
+ registerDiagnosticSensitiveValues(trace, diagnostics.sensitiveValues);
204
566
  return recorder.runSpan(`browser.${methodName}`, async () => {
205
567
  const startedAt = Date.now();
206
- const result = await Reflect.apply(value, namespaceTarget, args);
568
+ let result;
569
+ try {
570
+ result = await Reflect.apply(value, namespaceTarget, args);
571
+ }
572
+ catch (error) {
573
+ throw sanitizeRequestError(error, diagnostics);
574
+ }
207
575
  elapsedMs = Date.now() - startedAt;
208
576
  return result;
209
577
  }, {
210
- onSuccess: () => getBrowserPageAttributes(methodName, args, elapsedMs),
211
- onError: (error) => getBrowserPageAttributes(methodName, args, undefined, error),
578
+ onSuccess: () => ({
579
+ ...getBrowserPageAttributes(methodName, args, elapsedMs),
580
+ ...(diagnostics.traceUrl ? { url: diagnostics.traceUrl } : {}),
581
+ }),
582
+ onError: (error) => ({
583
+ ...getBrowserPageAttributes(methodName, args, undefined, error),
584
+ ...(diagnostics.traceUrl ? { url: diagnostics.traceUrl } : {}),
585
+ }),
212
586
  });
213
587
  };
214
588
  wrappedMethods.set(property, wrapped);
215
589
  return wrapped;
216
590
  }
217
- const wrapped = (...args) => recorder.runSpan(`${namespace}.${methodName}`, () => Reflect.apply(value, namespaceTarget, args), {
218
- onSuccess: (result) => buildSpanAttributes(namespace, methodName, args, result),
219
- onError: (error) => buildSpanAttributes(namespace, methodName, args, undefined, error),
220
- });
591
+ const wrapped = (...args) => {
592
+ if (shouldInstrument && !shouldInstrument(methodName, args)) {
593
+ return Reflect.apply(value, namespaceTarget, args);
594
+ }
595
+ const requestDiagnostics = snapshotRequestDiagnostics(namespace, methodName, args);
596
+ registerDiagnosticSensitiveValues(trace, requestDiagnostics.sensitiveValues);
597
+ // Invoke first and decide by the RETURN VALUE. `runSpan` always
598
+ // returns a Promise, so unconditionally span-wrapping every member
599
+ // silently rewrote synchronous contracts: `ctx.state.namespace()`
600
+ // (a sync factory) came back as a Promise, and every method call on
601
+ // it threw a raw TypeError — surfaced in production as catchtable's
602
+ // deterministic CONFIRM_STATE_UNAVAILABLE on 2026-07-27 (and the
603
+ // 2026-07-22 reserve internal_error loop before it). Sync members
604
+ // keep their sync contract; only genuinely async operations are
605
+ // recorded as spans.
606
+ let result;
607
+ try {
608
+ result = Reflect.apply(value, namespaceTarget, args);
609
+ }
610
+ catch (error) {
611
+ const sanitizedError = sanitizeRequestError(error, requestDiagnostics);
612
+ // A promise-returning implementation may still throw
613
+ // SYNCHRONOUSLY during pre-flight validation. Preserve the
614
+ // synchronous throw contract, but keep recording the failure
615
+ // span (the pre-fidelity wrapper captured these).
616
+ recorder
617
+ .runSpan(`${namespace}.${methodName}`, () => {
618
+ throw sanitizedError;
619
+ }, {
620
+ onError: (spanError) => buildSpanAttributes(namespace, methodName, args, undefined, spanError, requestDiagnostics),
621
+ })
622
+ .catch(() => undefined);
623
+ throw sanitizedError;
624
+ }
625
+ if (!isThenable(result)) {
626
+ // The state namespace factory returns the object whose METHODS
627
+ // are the operations worth tracing — instrument that object so
628
+ // `state.get`/`state.compareAndSet`/… spans exist (they never
629
+ // could before: the factory's return value was destroyed).
630
+ if (namespace === "state" &&
631
+ methodName === "namespace" &&
632
+ typeof result === "object" &&
633
+ result !== null) {
634
+ return wrapNamespace(namespace, result, trace);
635
+ }
636
+ if (namespace === "stealth" &&
637
+ methodName === "createSession" &&
638
+ typeof result === "object" &&
639
+ result !== null) {
640
+ return wrapStealthSession(result, trace);
641
+ }
642
+ return result;
643
+ }
644
+ const sanitizedResult = Promise.resolve(result).catch((error) => {
645
+ throw sanitizeRequestError(error, requestDiagnostics);
646
+ });
647
+ const tracedResult = recorder.runSpan(`${namespace}.${methodName}`, () => sanitizedResult, {
648
+ onSuccess: (spanResult) => buildSpanAttributes(namespace, methodName, args, spanResult, undefined, requestDiagnostics),
649
+ onError: (error) => buildSpanAttributes(namespace, methodName, args, undefined, error, requestDiagnostics),
650
+ });
651
+ return namespace === "http" && methodName === "stream"
652
+ ? tracedResult.then((spanResult) => isHttpStreamResponse(spanResult)
653
+ ? instrumentHttpStreamConsumption(spanResult, recorder, args, requestDiagnostics)
654
+ : spanResult)
655
+ : namespace === "http" && methodName === "sse"
656
+ ? tracedResult.then((spanResult) => isAsyncIterable(spanResult)
657
+ ? instrumentHttpSseConsumption(spanResult, recorder, args, requestDiagnostics)
658
+ : spanResult)
659
+ : tracedResult;
660
+ };
221
661
  wrappedMethods.set(property, wrapped);
222
662
  return wrapped;
223
663
  },
@@ -240,7 +680,10 @@ export function wrapWithInstrumentation(ctx, options = {}) {
240
680
  property === "stealth" ||
241
681
  property === "browser" ||
242
682
  property === "session" ||
243
- property === "state") {
683
+ property === "state" ||
684
+ property === "resolver" ||
685
+ property === "ocr" ||
686
+ property === "stt") {
244
687
  const namespace = property;
245
688
  if (wrappedTargets.has(namespace)) {
246
689
  return wrappedTargets.get(namespace);
@@ -0,0 +1,33 @@
1
+ import { TransportError } from "../errors.js";
2
+ export type NativeNetworkErrorCode = "native_connection_aborted" | "native_connection_closed" | "native_connection_failed" | "native_connection_idle_timeout" | "native_connection_timeout" | "native_egress_authorization_failed" | "native_egress_grant_expired" | "native_egress_grant_invalid" | "native_egress_grant_limit_exceeded" | "native_egress_input_invalid" | "native_egress_not_declared" | "native_egress_policy_invalid" | "native_dynamic_egress_unsupported" | "native_proxy_expired" | "native_proxy_invalid";
3
+ export declare class NativeNetworkError extends TransportError {
4
+ constructor(message: string, code: NativeNetworkErrorCode, cause?: Error);
5
+ get code(): NativeNetworkErrorCode;
6
+ }
7
+ export declare function safeDiagnosticEgressHost(value: unknown): string;
8
+ export declare class NativeProxyExpiredError extends NativeNetworkError {
9
+ readonly expiresAt: string;
10
+ constructor(expiresAt: string);
11
+ }
12
+ /** Raised before transport setup when a native destination is not authorized. */
13
+ export declare class NativeEgressNotDeclaredError extends NativeNetworkError {
14
+ readonly port: number;
15
+ readonly tls: "required" | "disabled";
16
+ readonly host: string;
17
+ constructor(host: string, port: number, tls: "required" | "disabled");
18
+ }
19
+ /**
20
+ * Raised when the destination was authorized by a grant whose TTL elapsed and
21
+ * its expiry remains in the client's bounded recent-expiry evidence window.
22
+ */
23
+ export declare class NativeEgressGrantExpiredError extends NativeNetworkError {
24
+ readonly port: number;
25
+ readonly tls: "required" | "disabled";
26
+ readonly expiresAt: string;
27
+ readonly host: string;
28
+ constructor(host: string, port: number, tls: "required" | "disabled", expiresAt: string);
29
+ }
30
+ /** Raised when an established connection exceeds its opt-in read-idle window. */
31
+ export declare class NativeIdleTimeoutError extends NativeNetworkError {
32
+ constructor();
33
+ }