@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,142 @@
1
+ import type { ProviderProxyProvider } from "../types.js";
2
+ import type { NativeNetworkErrorCode } from "./native-network-errors.js";
3
+ import { type ClosedEnum, type TelemetryContributor } from "./request-telemetry.js";
4
+ export type NativeTelemetryErrorCode = NativeNetworkErrorCode | "PROXY_REQUIRED" | "PROXY_ALLOCATION_FAILED" | "other";
5
+ export type NativeTelemetryKind = "tcp" | "tls";
6
+ export type NativeTelemetryOutcome = "ok" | "error";
7
+ export type NativeTelemetryVendorSkipReason = "credentials_absent" | "protocol_unsupported" | "allocation_failed" | "credential_lookup_failed" | "adapter_unavailable";
8
+ export type NativeTelemetryLifecycleKind = "drain" | "drain_acknowledged" | "drain_error" | "drain_missing_handler" | "idle" | "expiry";
9
+ /** Operator-only text is redacted before it is detached and bounded to 300 code units. */
10
+ export type NativeTelemetryDiagnostics = {
11
+ host?: string;
12
+ serverName?: string;
13
+ protocol?: string;
14
+ sessionId?: string;
15
+ expiresAt?: string;
16
+ errorName?: string;
17
+ errorMessage?: string;
18
+ causeName?: string;
19
+ causeMessage?: string;
20
+ systemCode?: string;
21
+ missingFields?: readonly string[];
22
+ port?: number;
23
+ timeoutMs?: number;
24
+ idleTimeoutMs?: number;
25
+ status?: number;
26
+ socksReplyCode?: number;
27
+ sticky?: boolean;
28
+ };
29
+ export type NativeConnectTelemetryEvent = {
30
+ kind: NativeTelemetryKind;
31
+ outcome: NativeTelemetryOutcome;
32
+ /** Entire establishment, including lease resolution, tunnel and TLS handshake. */
33
+ ms: number;
34
+ /** Tunnel establishment only; included in ms, never added to it. */
35
+ tunnelMs: number;
36
+ proxyUsed: boolean;
37
+ /** Selected vendor for this connection; operator log only. */
38
+ vendor?: ProviderProxyProvider;
39
+ errorCode?: NativeTelemetryErrorCode;
40
+ diagnostics?: NativeTelemetryDiagnostics;
41
+ };
42
+ export type NativeVendorSkipTelemetryEvent = {
43
+ vendor: ProviderProxyProvider;
44
+ reason: NativeTelemetryVendorSkipReason;
45
+ diagnostics?: NativeTelemetryDiagnostics;
46
+ };
47
+ export type NativeLifecycleTelemetryEvent = {
48
+ kind: NativeTelemetryLifecycleKind;
49
+ errorCode?: NativeTelemetryErrorCode;
50
+ diagnostics?: NativeTelemetryDiagnostics;
51
+ };
52
+ export interface NativeTelemetrySink {
53
+ recordConnect(event: NativeConnectTelemetryEvent): void;
54
+ recordVendorSkip(event: NativeVendorSkipTelemetryEvent): void;
55
+ recordLifecycle(event: NativeLifecycleTelemetryEvent): void;
56
+ /** Application bytes returned by read or accepted by a successful write. Excludes tunnel/TLS framing. */
57
+ recordBytes(event: {
58
+ direction: "in" | "out";
59
+ bytes: number;
60
+ }): void;
61
+ recordError(event: {
62
+ errorCode: NativeTelemetryErrorCode;
63
+ diagnostics?: NativeTelemetryDiagnostics;
64
+ }): void;
65
+ }
66
+ export type NativeAttemptSample = NativeConnectTelemetryEvent & {
67
+ n: number;
68
+ };
69
+ export type NativeTelemetryLogPayload = {
70
+ attempts: number;
71
+ connectMs: number;
72
+ tunnelMs: number;
73
+ vendorSkips: number;
74
+ vendorSkipReasons: {
75
+ reason: NativeTelemetryVendorSkipReason;
76
+ count: number;
77
+ }[];
78
+ drain: number;
79
+ drainAcknowledged: number;
80
+ drainErrors: number;
81
+ drainMissingHandler: number;
82
+ idle: number;
83
+ expiry: number;
84
+ bytesIn: number;
85
+ bytesOut: number;
86
+ lastErrorCode?: NativeTelemetryErrorCode;
87
+ lastErrorDiagnostics?: NativeTelemetryDiagnostics;
88
+ attemptSamples?: NativeAttemptSample[];
89
+ attemptSamplesDropped?: number;
90
+ vendorSkipSamples?: NativeVendorSkipTelemetryEvent[];
91
+ vendorSkipSamplesDropped?: number;
92
+ };
93
+ export type NativeTelemetryHeaderPayload = {
94
+ attempts: number;
95
+ connectMs: number;
96
+ tunnelMs: number;
97
+ vendorSkips: number;
98
+ vendorSkipReasons: {
99
+ reason: ClosedEnum<NativeTelemetryVendorSkipReason>;
100
+ count: number;
101
+ }[];
102
+ drain: number;
103
+ drainAcknowledged: number;
104
+ drainErrors: number;
105
+ drainMissingHandler: number;
106
+ idle: number;
107
+ expiry: number;
108
+ bytesIn: number;
109
+ bytesOut: number;
110
+ lastErrorCode?: ClosedEnum<NativeTelemetryErrorCode>;
111
+ attemptSamples?: {
112
+ n: number;
113
+ kind: ClosedEnum<NativeTelemetryKind>;
114
+ outcome: ClosedEnum<NativeTelemetryOutcome>;
115
+ ms: number;
116
+ tunnelMs: number;
117
+ proxyUsed: boolean;
118
+ errorCode?: ClosedEnum<NativeTelemetryErrorCode>;
119
+ }[];
120
+ attemptSamplesDropped?: number;
121
+ vendorSkipSamplesDropped?: number;
122
+ };
123
+ export declare class NativeTelemetryCollector implements NativeTelemetrySink, TelemetryContributor<NativeTelemetryLogPayload, NativeTelemetryHeaderPayload> {
124
+ #private;
125
+ readonly key: "native";
126
+ constructor(options?: {
127
+ redact?: (text: string) => string;
128
+ });
129
+ recordConnect(event: NativeConnectTelemetryEvent): void;
130
+ recordVendorSkip(event: NativeVendorSkipTelemetryEvent): void;
131
+ recordLifecycle(event: NativeLifecycleTelemetryEvent): void;
132
+ recordBytes(event: {
133
+ direction: "in" | "out";
134
+ bytes: number;
135
+ }): void;
136
+ recordError(event: {
137
+ errorCode: NativeTelemetryErrorCode;
138
+ diagnostics?: NativeTelemetryDiagnostics;
139
+ }): void;
140
+ toLogPayload(): NativeTelemetryLogPayload | undefined;
141
+ toHeaderPayload(log: NativeTelemetryLogPayload): NativeTelemetryHeaderPayload;
142
+ }
@@ -0,0 +1,231 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { closedEnum } from "./request-telemetry.js";
3
+ const MAX_SAMPLES = 24;
4
+ function integer(value) {
5
+ return Math.max(0, Math.floor(Number.isFinite(value) ? value : 0));
6
+ }
7
+ function saturatingAdd(a, b) {
8
+ if (!Number.isFinite(a) || !Number.isFinite(b))
9
+ return Number.MAX_SAFE_INTEGER;
10
+ return Math.min(Number.MAX_SAFE_INTEGER, integer(a) + integer(b));
11
+ }
12
+ function boundedText(value, redact) {
13
+ let result;
14
+ try {
15
+ result = redact ? redact(value) : value;
16
+ if (typeof result !== "string")
17
+ return "[REDACTION_FAILED]";
18
+ }
19
+ catch {
20
+ return "[REDACTION_FAILED]";
21
+ }
22
+ // Do not slice caller text: a substring may retain the entire vendor response.
23
+ const length = Math.min(result.length, 300);
24
+ const units = Buffer.alloc(length * 2);
25
+ for (let index = 0; index < length; index++)
26
+ units.writeUInt16LE(result.charCodeAt(index), index * 2);
27
+ return units.toString("utf16le");
28
+ }
29
+ function diagnostics(value, redact) {
30
+ const result = {};
31
+ for (const key of [
32
+ "host",
33
+ "serverName",
34
+ "protocol",
35
+ "sessionId",
36
+ "expiresAt",
37
+ "errorName",
38
+ "errorMessage",
39
+ "causeName",
40
+ "causeMessage",
41
+ "systemCode",
42
+ ]) {
43
+ if (value[key] !== undefined)
44
+ result[key] = boundedText(value[key], redact);
45
+ }
46
+ for (const key of ["port", "timeoutMs", "idleTimeoutMs", "status", "socksReplyCode"]) {
47
+ if (value[key] !== undefined)
48
+ result[key] = integer(value[key]);
49
+ }
50
+ if (value.sticky !== undefined)
51
+ result.sticky = value.sticky;
52
+ if (value.missingFields)
53
+ result.missingFields = value.missingFields
54
+ .slice(0, MAX_SAMPLES)
55
+ .map((field) => boundedText(field, redact));
56
+ return result;
57
+ }
58
+ function copyDiagnostics(value) {
59
+ return { ...value, ...(value.missingFields ? { missingFields: [...value.missingFields] } : {}) };
60
+ }
61
+ export class NativeTelemetryCollector {
62
+ key = "native";
63
+ #redact;
64
+ #recorded = false;
65
+ #attempts = 0;
66
+ #connectMs = 0;
67
+ #tunnelMs = 0;
68
+ #vendorSkips = 0;
69
+ #vendorSkipReasons = new Map();
70
+ #lifecycle = {
71
+ drain: 0,
72
+ drain_acknowledged: 0,
73
+ drain_error: 0,
74
+ drain_missing_handler: 0,
75
+ idle: 0,
76
+ expiry: 0,
77
+ };
78
+ #bytesIn = 0;
79
+ #bytesOut = 0;
80
+ #lastErrorCode;
81
+ #lastErrorDiagnostics;
82
+ #attemptSamples = [];
83
+ #attemptSamplesDropped = 0;
84
+ #vendorSkipSamples = [];
85
+ #vendorSkipSamplesDropped = 0;
86
+ constructor(options = {}) {
87
+ this.#redact = options.redact;
88
+ }
89
+ recordConnect(event) {
90
+ this.#recorded = true;
91
+ const ms = saturatingAdd(0, event.ms);
92
+ const tunnelMs = saturatingAdd(0, event.tunnelMs);
93
+ this.#attempts = saturatingAdd(this.#attempts, 1);
94
+ this.#connectMs = saturatingAdd(this.#connectMs, ms);
95
+ this.#tunnelMs = saturatingAdd(this.#tunnelMs, tunnelMs);
96
+ if (event.errorCode)
97
+ this.recordError({ errorCode: event.errorCode, diagnostics: event.diagnostics });
98
+ if (this.#attemptSamples.length < MAX_SAMPLES) {
99
+ this.#attemptSamples.push({
100
+ n: this.#attempts,
101
+ kind: event.kind,
102
+ outcome: event.outcome,
103
+ ms,
104
+ tunnelMs,
105
+ proxyUsed: event.proxyUsed,
106
+ ...(event.vendor ? { vendor: event.vendor } : {}),
107
+ ...(event.errorCode ? { errorCode: event.errorCode } : {}),
108
+ ...(event.diagnostics ? { diagnostics: diagnostics(event.diagnostics, this.#redact) } : {}),
109
+ });
110
+ }
111
+ else
112
+ this.#attemptSamplesDropped = saturatingAdd(this.#attemptSamplesDropped, 1);
113
+ }
114
+ recordVendorSkip(event) {
115
+ this.#recorded = true;
116
+ this.#vendorSkips = saturatingAdd(this.#vendorSkips, 1);
117
+ this.#vendorSkipReasons.set(event.reason, saturatingAdd(this.#vendorSkipReasons.get(event.reason) ?? 0, 1));
118
+ if (this.#vendorSkipSamples.length < MAX_SAMPLES) {
119
+ this.#vendorSkipSamples.push({
120
+ vendor: event.vendor,
121
+ reason: event.reason,
122
+ ...(event.diagnostics ? { diagnostics: diagnostics(event.diagnostics, this.#redact) } : {}),
123
+ });
124
+ }
125
+ else
126
+ this.#vendorSkipSamplesDropped = saturatingAdd(this.#vendorSkipSamplesDropped, 1);
127
+ }
128
+ recordLifecycle(event) {
129
+ this.#recorded = true;
130
+ this.#lifecycle[event.kind] = saturatingAdd(this.#lifecycle[event.kind], 1);
131
+ if (event.errorCode)
132
+ this.recordError({ errorCode: event.errorCode, diagnostics: event.diagnostics });
133
+ }
134
+ recordBytes(event) {
135
+ this.#recorded = true;
136
+ if (event.direction === "in")
137
+ this.#bytesIn = saturatingAdd(this.#bytesIn, event.bytes);
138
+ else
139
+ this.#bytesOut = saturatingAdd(this.#bytesOut, event.bytes);
140
+ }
141
+ recordError(event) {
142
+ this.#recorded = true;
143
+ this.#lastErrorCode = event.errorCode;
144
+ this.#lastErrorDiagnostics = event.diagnostics
145
+ ? diagnostics(event.diagnostics, this.#redact)
146
+ : undefined;
147
+ }
148
+ toLogPayload() {
149
+ if (!this.#recorded)
150
+ return undefined;
151
+ return {
152
+ attempts: this.#attempts,
153
+ connectMs: this.#connectMs,
154
+ tunnelMs: this.#tunnelMs,
155
+ vendorSkips: this.#vendorSkips,
156
+ vendorSkipReasons: [...this.#vendorSkipReasons].map(([reason, count]) => ({ reason, count })),
157
+ drain: this.#lifecycle.drain,
158
+ drainAcknowledged: this.#lifecycle.drain_acknowledged,
159
+ drainErrors: this.#lifecycle.drain_error,
160
+ drainMissingHandler: this.#lifecycle.drain_missing_handler,
161
+ idle: this.#lifecycle.idle,
162
+ expiry: this.#lifecycle.expiry,
163
+ bytesIn: this.#bytesIn,
164
+ bytesOut: this.#bytesOut,
165
+ ...(this.#lastErrorCode ? { lastErrorCode: this.#lastErrorCode } : {}),
166
+ ...(this.#lastErrorDiagnostics
167
+ ? { lastErrorDiagnostics: copyDiagnostics(this.#lastErrorDiagnostics) }
168
+ : {}),
169
+ ...(this.#attemptSamples.length
170
+ ? {
171
+ attemptSamples: this.#attemptSamples.map((sample) => ({
172
+ ...sample,
173
+ ...(sample.diagnostics ? { diagnostics: copyDiagnostics(sample.diagnostics) } : {}),
174
+ })),
175
+ }
176
+ : {}),
177
+ ...(this.#attemptSamplesDropped
178
+ ? { attemptSamplesDropped: this.#attemptSamplesDropped }
179
+ : {}),
180
+ ...(this.#vendorSkipSamples.length
181
+ ? {
182
+ vendorSkipSamples: this.#vendorSkipSamples.map((sample) => ({
183
+ ...sample,
184
+ ...(sample.diagnostics ? { diagnostics: copyDiagnostics(sample.diagnostics) } : {}),
185
+ })),
186
+ }
187
+ : {}),
188
+ ...(this.#vendorSkipSamplesDropped
189
+ ? { vendorSkipSamplesDropped: this.#vendorSkipSamplesDropped }
190
+ : {}),
191
+ };
192
+ }
193
+ toHeaderPayload(log) {
194
+ return {
195
+ attempts: log.attempts,
196
+ connectMs: log.connectMs,
197
+ tunnelMs: log.tunnelMs,
198
+ vendorSkips: log.vendorSkips,
199
+ vendorSkipReasons: log.vendorSkipReasons.map(({ reason, count }) => ({
200
+ reason: closedEnum(reason),
201
+ count,
202
+ })),
203
+ drain: log.drain,
204
+ drainAcknowledged: log.drainAcknowledged,
205
+ drainErrors: log.drainErrors,
206
+ drainMissingHandler: log.drainMissingHandler,
207
+ idle: log.idle,
208
+ expiry: log.expiry,
209
+ bytesIn: log.bytesIn,
210
+ bytesOut: log.bytesOut,
211
+ ...(log.lastErrorCode ? { lastErrorCode: closedEnum(log.lastErrorCode) } : {}),
212
+ ...(log.attemptSamples
213
+ ? {
214
+ attemptSamples: log.attemptSamples.map((sample) => ({
215
+ n: sample.n,
216
+ kind: closedEnum(sample.kind),
217
+ outcome: closedEnum(sample.outcome),
218
+ ms: sample.ms,
219
+ tunnelMs: sample.tunnelMs,
220
+ proxyUsed: sample.proxyUsed,
221
+ ...(sample.errorCode ? { errorCode: closedEnum(sample.errorCode) } : {}),
222
+ })),
223
+ }
224
+ : {}),
225
+ ...(log.attemptSamplesDropped ? { attemptSamplesDropped: log.attemptSamplesDropped } : {}),
226
+ ...(log.vendorSkipSamplesDropped
227
+ ? { vendorSkipSamplesDropped: log.vendorSkipSamplesDropped }
228
+ : {}),
229
+ };
230
+ }
231
+ }
@@ -0,0 +1,82 @@
1
+ import type { OcrContext } from "../types.js";
2
+ import { type ClosedEnum, type SpanIndex, type TelemetryContributor } from "./request-telemetry.js";
3
+ export type OcrTelemetryBackend = "cloudflare-workers-ai" | "openai-compatible" | "custom" | "unavailable";
4
+ export type OcrTelemetryEngine = "workers-ai" | "openai-compatible" | "custom";
5
+ export type OcrTelemetryErrorCode = "OCR_UNAVAILABLE" | "UNSUPPORTED_OCR_BACKEND" | "OCR_UPSTREAM_FAILED" | "OCR_INCOMPLETE_RESPONSE" | "transport_network_error" | "transport_timeout" | "other";
6
+ export type OcrTelemetryModel = "gemma-4-26b-a4b-it" | "glm-ocr" | "moondream3.1-9B-A2B" | "kimi-k2.7-code";
7
+ export type OcrTelemetryFinishReason = "stop" | "length" | "content_filter" | "tool_calls" | "function_call" | "error" | "unknown";
8
+ export type OcrTelemetryEvent = {
9
+ backend: OcrTelemetryBackend;
10
+ engine: OcrTelemetryEngine;
11
+ model?: string;
12
+ ms: number;
13
+ status?: number;
14
+ bytesIn?: number;
15
+ bytesOut?: number;
16
+ candidates?: number;
17
+ warnings?: number;
18
+ errorCode?: OcrTelemetryErrorCode;
19
+ diagnostics?: string;
20
+ finishReason?: OcrTelemetryFinishReason;
21
+ };
22
+ export interface OcrTelemetrySink {
23
+ record(event: OcrTelemetryEvent): void;
24
+ markTelemetryFailed?(): void;
25
+ }
26
+ export type OcrTelemetryLogPayload = {
27
+ telemetryFailed?: true;
28
+ diagnostics?: string[];
29
+ backend: OcrTelemetryBackend;
30
+ engine: OcrTelemetryEngine;
31
+ model?: string;
32
+ ms: number;
33
+ status?: number;
34
+ bytesIn: number;
35
+ bytesOut: number;
36
+ candidates: number;
37
+ warnings: number;
38
+ lastErrorCode?: OcrTelemetryErrorCode;
39
+ finishReason?: OcrTelemetryFinishReason;
40
+ samples?: Array<Omit<OcrTelemetryEvent, "backend" | "engine" | "model" | "diagnostics">>;
41
+ samplesDropped?: number;
42
+ };
43
+ export type OcrTelemetryHeaderPayload = {
44
+ backend: ClosedEnum<OcrTelemetryBackend>;
45
+ engine: ClosedEnum<OcrTelemetryEngine>;
46
+ model?: ClosedEnum<OcrTelemetryModel>;
47
+ ms: number;
48
+ status?: number;
49
+ bytesIn: number;
50
+ bytesOut: number;
51
+ candidates: number;
52
+ warnings: number;
53
+ lastErrorCode?: ClosedEnum<OcrTelemetryErrorCode>;
54
+ finishReason?: ClosedEnum<OcrTelemetryFinishReason>;
55
+ samples?: Array<{
56
+ ms: number;
57
+ status?: number;
58
+ bytesIn?: number;
59
+ bytesOut?: number;
60
+ candidates?: number;
61
+ warnings?: number;
62
+ errorCode?: ClosedEnum<OcrTelemetryErrorCode>;
63
+ finishReason?: ClosedEnum<OcrTelemetryFinishReason>;
64
+ }>;
65
+ samplesDropped?: number;
66
+ };
67
+ export declare class OcrTelemetryCollector implements OcrTelemetrySink, TelemetryContributor<OcrTelemetryLogPayload, OcrTelemetryHeaderPayload> {
68
+ #private;
69
+ readonly key: "ocr";
70
+ constructor(options?: {
71
+ redact?: (text: string) => string;
72
+ });
73
+ markTelemetryFailed(): void;
74
+ record(event: OcrTelemetryEvent): void;
75
+ toLogPayload(_spans: SpanIndex): OcrTelemetryLogPayload | undefined;
76
+ toHeaderPayload(log: OcrTelemetryLogPayload): OcrTelemetryHeaderPayload;
77
+ }
78
+ export declare function bindOcrTelemetry(context: OcrContext, sink: OcrTelemetrySink, options?: {
79
+ backend?: OcrTelemetryBackend;
80
+ engine?: OcrTelemetryEngine;
81
+ model?: string;
82
+ }): OcrContext;
@@ -0,0 +1,192 @@
1
+ import { add, capabilityErrorText, capabilityFacts, capabilityMetadata, capabilityText, inputBytes, integer, observeCapability, registerCapabilityInput, } from "./capability-telemetry.js";
2
+ import { closedEnum, } from "./request-telemetry.js";
3
+ const ERROR_CODES = new Set([
4
+ "OCR_UNAVAILABLE",
5
+ "UNSUPPORTED_OCR_BACKEND",
6
+ "OCR_UPSTREAM_FAILED",
7
+ "OCR_INCOMPLETE_RESPONSE",
8
+ "transport_network_error",
9
+ "transport_timeout",
10
+ "other",
11
+ ]);
12
+ const MODELS = new Map([
13
+ ["@cf/google/gemma-4-26b-a4b-it", "gemma-4-26b-a4b-it"],
14
+ ["zai-org/GLM-OCR", "glm-ocr"],
15
+ ["@cf/moondream/moondream3.1-9B-A2B", "moondream3.1-9B-A2B"],
16
+ ["@cf/moonshotai/kimi-k2.7-code", "kimi-k2.7-code"],
17
+ ]);
18
+ function errorCode(error) {
19
+ const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
20
+ return typeof code === "string" && ERROR_CODES.has(code)
21
+ ? code
22
+ : "other";
23
+ }
24
+ function finishReason(value, failed) {
25
+ switch (value) {
26
+ case "stop":
27
+ case "length":
28
+ case "content_filter":
29
+ case "tool_calls":
30
+ case "function_call":
31
+ return value;
32
+ default:
33
+ return value === undefined ? (failed ? "error" : "stop") : "unknown";
34
+ }
35
+ }
36
+ export class OcrTelemetryCollector {
37
+ key = "ocr";
38
+ #redact;
39
+ #samples = [];
40
+ #summary;
41
+ #diagnostics = [];
42
+ #dropped = 0;
43
+ #failed = false;
44
+ constructor(options = {}) {
45
+ this.#redact = options.redact;
46
+ }
47
+ markTelemetryFailed() {
48
+ this.#failed = true;
49
+ this.#summary ??= {
50
+ backend: "custom",
51
+ engine: "custom",
52
+ ms: 0,
53
+ bytesIn: 0,
54
+ bytesOut: 0,
55
+ candidates: 0,
56
+ warnings: 0,
57
+ };
58
+ }
59
+ record(event) {
60
+ const sample = {
61
+ ms: integer(event.ms),
62
+ ...(event.status === undefined ? {} : { status: integer(event.status) }),
63
+ ...(event.bytesIn === undefined ? {} : { bytesIn: integer(event.bytesIn) }),
64
+ ...(event.bytesOut === undefined ? {} : { bytesOut: integer(event.bytesOut) }),
65
+ ...(event.candidates === undefined ? {} : { candidates: integer(event.candidates) }),
66
+ ...(event.warnings === undefined ? {} : { warnings: integer(event.warnings) }),
67
+ ...(event.errorCode ? { errorCode: event.errorCode } : {}),
68
+ ...(event.finishReason ? { finishReason: event.finishReason } : {}),
69
+ ...(event.diagnostics === undefined
70
+ ? {}
71
+ : { diagnostics: capabilityText(event.diagnostics, this.#redact, true) }),
72
+ };
73
+ const prior = this.#summary;
74
+ this.#summary = {
75
+ backend: event.backend,
76
+ engine: event.engine,
77
+ ...(event.model === undefined ? {} : { model: capabilityText(event.model, this.#redact) }),
78
+ ms: add(prior?.ms ?? 0, sample.ms),
79
+ ...(sample.status === undefined ? {} : { status: sample.status }),
80
+ bytesIn: add(prior?.bytesIn ?? 0, sample.bytesIn ?? 0),
81
+ bytesOut: add(prior?.bytesOut ?? 0, sample.bytesOut ?? 0),
82
+ candidates: add(prior?.candidates ?? 0, sample.candidates ?? 0),
83
+ warnings: add(prior?.warnings ?? 0, sample.warnings ?? 0),
84
+ ...(event.errorCode ? { lastErrorCode: event.errorCode } : {}),
85
+ ...(event.finishReason ? { finishReason: event.finishReason } : {}),
86
+ };
87
+ if (this.#samples.length < 24) {
88
+ const { diagnostics, ...closedSample } = sample;
89
+ this.#samples.push(closedSample);
90
+ if (diagnostics !== undefined)
91
+ this.#diagnostics.push(diagnostics);
92
+ }
93
+ else
94
+ this.#dropped = add(this.#dropped, 1);
95
+ }
96
+ toLogPayload(_spans) {
97
+ if (!this.#summary)
98
+ return undefined;
99
+ return {
100
+ ...this.#summary,
101
+ ...(this.#diagnostics.length ? { diagnostics: [...this.#diagnostics] } : {}),
102
+ ...(this.#failed ? { telemetryFailed: true } : {}),
103
+ samples: this.#samples.map((s) => ({ ...s })),
104
+ ...(this.#dropped ? { samplesDropped: this.#dropped } : {}),
105
+ };
106
+ }
107
+ toHeaderPayload(log) {
108
+ return {
109
+ backend: closedEnum(log.backend),
110
+ engine: closedEnum(log.engine),
111
+ ...(log.model && MODELS.has(log.model) ? { model: closedEnum(MODELS.get(log.model)) } : {}),
112
+ ms: log.ms,
113
+ ...(log.status === undefined ? {} : { status: log.status }),
114
+ bytesIn: log.bytesIn,
115
+ bytesOut: log.bytesOut,
116
+ candidates: log.candidates,
117
+ warnings: log.warnings,
118
+ ...(log.lastErrorCode ? { lastErrorCode: closedEnum(log.lastErrorCode) } : {}),
119
+ ...(log.finishReason ? { finishReason: closedEnum(log.finishReason) } : {}),
120
+ ...(log.samples
121
+ ? {
122
+ samples: log.samples.map((s) => ({
123
+ ms: s.ms,
124
+ ...(s.status === undefined ? {} : { status: s.status }),
125
+ ...(s.bytesIn === undefined ? {} : { bytesIn: s.bytesIn }),
126
+ ...(s.bytesOut === undefined ? {} : { bytesOut: s.bytesOut }),
127
+ ...(s.candidates === undefined ? {} : { candidates: s.candidates }),
128
+ ...(s.warnings === undefined ? {} : { warnings: s.warnings }),
129
+ ...(s.errorCode ? { errorCode: closedEnum(s.errorCode) } : {}),
130
+ ...(s.finishReason ? { finishReason: closedEnum(s.finishReason) } : {}),
131
+ })),
132
+ }
133
+ : {}),
134
+ ...(log.samplesDropped ? { samplesDropped: log.samplesDropped } : {}),
135
+ };
136
+ }
137
+ }
138
+ export function bindOcrTelemetry(context, sink, options = {}) {
139
+ const metadata = capabilityMetadata(context);
140
+ const backend = options.backend ?? metadata?.backend ?? "custom";
141
+ const engine = options.engine ?? metadata?.engine ?? "custom";
142
+ const model = options.model ?? metadata?.model;
143
+ async function run(input, operation) {
144
+ const started = performance.now();
145
+ const facts = {};
146
+ observeCapability(sink, () => registerCapabilityInput(input));
147
+ let result;
148
+ try {
149
+ result = await capabilityFacts.run(facts, operation);
150
+ }
151
+ catch (error) {
152
+ observeCapability(sink, () => {
153
+ const status = error &&
154
+ typeof error === "object" &&
155
+ "status" in error &&
156
+ typeof error.status === "number"
157
+ ? error.status
158
+ : undefined;
159
+ return sink.record({
160
+ backend,
161
+ engine,
162
+ model,
163
+ ms: performance.now() - started,
164
+ status: facts.status ?? status,
165
+ bytesIn: inputBytes(input),
166
+ errorCode: errorCode(error),
167
+ finishReason: finishReason(facts.finishReason, true),
168
+ diagnostics: `${capabilityErrorText(error)} ${facts.diagnostics ?? ""}`,
169
+ });
170
+ });
171
+ throw error;
172
+ }
173
+ observeCapability(sink, () => sink.record({
174
+ backend,
175
+ engine,
176
+ model: result.model,
177
+ ms: performance.now() - started,
178
+ status: facts.status,
179
+ bytesIn: inputBytes(input),
180
+ bytesOut: Buffer.byteLength(result.text),
181
+ candidates: result.candidates?.length ?? 0,
182
+ finishReason: finishReason(facts.finishReason, false),
183
+ warnings: result.warnings?.length ?? 0,
184
+ }));
185
+ return result;
186
+ }
187
+ return {
188
+ ...context,
189
+ recognize: (request) => run(request.image, () => context.recognize(request)),
190
+ extractCaptchaText: (image, opts) => run(image, () => context.extractCaptchaText(image, opts)),
191
+ };
192
+ }
@@ -0,0 +1,29 @@
1
+ import type { OcrCaptchaCandidate, OcrCaptchaOptions, OcrContext, ProviderOcrConfig } from "../types.js";
2
+ export { CLOUDFLARE_ACCOUNT_ID_ENV } from "./stt.js";
3
+ export declare const APIFUSE__OCR__BACKEND_ENV = "APIFUSE__OCR__BACKEND";
4
+ export declare const APIFUSE__OCR__MODEL_ENV = "APIFUSE__OCR__MODEL";
5
+ export declare const APIFUSE__OCR__CLOUDFLARE_API_TOKEN_ENV = "APIFUSE__OCR__CLOUDFLARE_API_TOKEN";
6
+ export declare const APIFUSE__OCR__BASE_URL_ENV = "APIFUSE__OCR__BASE_URL";
7
+ export declare const APIFUSE__OCR__API_KEY_ENV = "APIFUSE__OCR__API_KEY";
8
+ export declare const CLOUDFLARE_WORKERS_AI_OCR_BACKEND = "cloudflare-workers-ai";
9
+ export declare const OPENAI_COMPATIBLE_OCR_BACKEND = "openai-compatible";
10
+ export declare const DEFAULT_CLOUDFLARE_WORKERS_AI_OCR_MODEL = "@cf/google/gemma-4-26b-a4b-it";
11
+ export declare const DEFAULT_OCR_TIMEOUT_MS = 30000;
12
+ type EnvLike = Record<string, string | undefined>;
13
+ type CloudflareWorkersAiOcrClientOptions = {
14
+ accountId: string;
15
+ apiToken: string;
16
+ model?: string;
17
+ fetch?: typeof fetch;
18
+ };
19
+ type OpenAiCompatibleOcrClientOptions = {
20
+ baseUrl: string;
21
+ apiKey?: string;
22
+ model: string;
23
+ fetch?: typeof fetch;
24
+ };
25
+ export declare function createUnsupportedOcrClient(reason?: string): OcrContext;
26
+ export declare function createOcrClientFromEnv(config: ProviderOcrConfig | undefined, env?: EnvLike): OcrContext;
27
+ export declare function createCloudflareWorkersAiOcrClient(options: CloudflareWorkersAiOcrClientOptions): OcrContext;
28
+ export declare function createOpenAiCompatibleOcrClient(options: OpenAiCompatibleOcrClientOptions): OcrContext;
29
+ export declare function extractCaptchaCandidates(modelText: string, options?: OcrCaptchaOptions): readonly OcrCaptchaCandidate[];