@vib-rato/ai 0.16.0

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 (525) hide show
  1. package/CHANGELOG.md +3354 -0
  2. package/README.md +1194 -0
  3. package/dist/types/adapter-internals/provider-safety-stop.d.ts +45 -0
  4. package/dist/types/api-registry.d.ts +30 -0
  5. package/dist/types/auth-broker/client.d.ts +80 -0
  6. package/dist/types/auth-broker/index.d.ts +5 -0
  7. package/dist/types/auth-broker/redact.d.ts +7 -0
  8. package/dist/types/auth-broker/refresher.d.ts +25 -0
  9. package/dist/types/auth-broker/remote-store.d.ts +153 -0
  10. package/dist/types/auth-broker/server.d.ts +32 -0
  11. package/dist/types/auth-broker/types.d.ts +132 -0
  12. package/dist/types/auth-broker/wire-schemas.d.ts +555 -0
  13. package/dist/types/auth-gateway/http.d.ts +40 -0
  14. package/dist/types/auth-gateway/index.d.ts +3 -0
  15. package/dist/types/auth-gateway/server.d.ts +70 -0
  16. package/dist/types/auth-gateway/types.d.ts +129 -0
  17. package/dist/types/auth-storage.d.ts +1074 -0
  18. package/dist/types/cli.d.ts +2 -0
  19. package/dist/types/codex-tools.d.ts +4 -0
  20. package/dist/types/context-cap-policy.d.ts +68 -0
  21. package/dist/types/core.d.ts +35 -0
  22. package/dist/types/index.d.ts +55 -0
  23. package/dist/types/model-cache.d.ts +24 -0
  24. package/dist/types/model-manager.d.ts +77 -0
  25. package/dist/types/model-pricing.d.ts +3 -0
  26. package/dist/types/model-retirements.d.ts +6 -0
  27. package/dist/types/model-thinking.d.ts +100 -0
  28. package/dist/types/models.d.ts +21 -0
  29. package/dist/types/openai-completions-compat.d.ts +34 -0
  30. package/dist/types/provider-details.d.ts +24 -0
  31. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  32. package/dist/types/provider-models/descriptors.d.ts +48 -0
  33. package/dist/types/provider-models/google.d.ts +20 -0
  34. package/dist/types/provider-models/index.d.ts +5 -0
  35. package/dist/types/provider-models/ollama.d.ts +7 -0
  36. package/dist/types/provider-models/openai-compat.d.ts +293 -0
  37. package/dist/types/provider-models/special.d.ts +29 -0
  38. package/dist/types/providers/amazon-bedrock.d.ts +60 -0
  39. package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
  40. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  41. package/dist/types/providers/anthropic.d.ts +280 -0
  42. package/dist/types/providers/aws-credential-config.d.ts +19 -0
  43. package/dist/types/providers/aws-credentials.d.ts +43 -0
  44. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  45. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  46. package/dist/types/providers/azure-openai-responses.d.ts +22 -0
  47. package/dist/types/providers/composer-discipline.d.ts +32 -0
  48. package/dist/types/providers/cursor/client-version.d.ts +10 -0
  49. package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
  50. package/dist/types/providers/cursor/gen/agent_pb.d.ts +16769 -0
  51. package/dist/types/providers/cursor-pi-args.d.ts +119 -0
  52. package/dist/types/providers/cursor.d.ts +72 -0
  53. package/dist/types/providers/dashscope-token-plan-headers.d.ts +57 -0
  54. package/dist/types/providers/error-message.d.ts +27 -0
  55. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  56. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  57. package/dist/types/providers/google-auth.d.ts +26 -0
  58. package/dist/types/providers/google-gemini-cli.d.ts +75 -0
  59. package/dist/types/providers/google-gemini-headers.d.ts +43 -0
  60. package/dist/types/providers/google-shared.d.ts +183 -0
  61. package/dist/types/providers/google-types.d.ts +138 -0
  62. package/dist/types/providers/google-vertex.d.ts +11 -0
  63. package/dist/types/providers/google.d.ts +4 -0
  64. package/dist/types/providers/grammar.d.ts +1 -0
  65. package/dist/types/providers/kimi.d.ts +27 -0
  66. package/dist/types/providers/kiro-api-key.d.ts +50 -0
  67. package/dist/types/providers/kiro-codewhisperer.d.ts +11 -0
  68. package/dist/types/providers/mock.d.ts +189 -0
  69. package/dist/types/providers/ollama.d.ts +41 -0
  70. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  71. package/dist/types/providers/openai-bounded-rate-limits.d.ts +3 -0
  72. package/dist/types/providers/openai-chat-server-schema.d.ts +1733 -0
  73. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  74. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  75. package/dist/types/providers/openai-codex/request-transformer.d.ts +50 -0
  76. package/dist/types/providers/openai-codex/response-handler.d.ts +18 -0
  77. package/dist/types/providers/openai-codex-responses.d.ts +71 -0
  78. package/dist/types/providers/openai-completions-compat.d.ts +6 -0
  79. package/dist/types/providers/openai-completions.d.ts +35 -0
  80. package/dist/types/providers/openai-opencodex-responses.d.ts +10 -0
  81. package/dist/types/providers/openai-request-transform.d.ts +4 -0
  82. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  83. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  84. package/dist/types/providers/openai-responses-shared.d.ts +106 -0
  85. package/dist/types/providers/openai-responses.d.ts +37 -0
  86. package/dist/types/providers/pi-native-client.d.ts +29 -0
  87. package/dist/types/providers/pi-native-server.d.ts +60 -0
  88. package/dist/types/providers/register-builtins.d.ts +59 -0
  89. package/dist/types/providers/synthetic.d.ts +26 -0
  90. package/dist/types/providers/transform-messages.d.ts +33 -0
  91. package/dist/types/providers/vision-guard.d.ts +8 -0
  92. package/dist/types/rate-limit-utils.d.ts +19 -0
  93. package/dist/types/stream.d.ts +45 -0
  94. package/dist/types/types.d.ts +1073 -0
  95. package/dist/types/usage/claude.d.ts +3 -0
  96. package/dist/types/usage/gemini.d.ts +2 -0
  97. package/dist/types/usage/github-copilot.d.ts +7 -0
  98. package/dist/types/usage/google-antigravity.d.ts +2 -0
  99. package/dist/types/usage/grok-cli.d.ts +17 -0
  100. package/dist/types/usage/kimi.d.ts +4 -0
  101. package/dist/types/usage/minimax-code.d.ts +2 -0
  102. package/dist/types/usage/openai-codex.d.ts +3 -0
  103. package/dist/types/usage/shared.d.ts +1 -0
  104. package/dist/types/usage/zai.d.ts +2 -0
  105. package/dist/types/usage.d.ts +264 -0
  106. package/dist/types/utils/abort.d.ts +19 -0
  107. package/dist/types/utils/anthropic-auth.d.ts +39 -0
  108. package/dist/types/utils/block-symbols.d.ts +6 -0
  109. package/dist/types/utils/discovery/antigravity.d.ts +67 -0
  110. package/dist/types/utils/discovery/codex.d.ts +38 -0
  111. package/dist/types/utils/discovery/cursor.d.ts +49 -0
  112. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  113. package/dist/types/utils/discovery/index.d.ts +4 -0
  114. package/dist/types/utils/discovery/openai-compatible.d.ts +81 -0
  115. package/dist/types/utils/event-stream.d.ts +41 -0
  116. package/dist/types/utils/fallback-transport.d.ts +110 -0
  117. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  118. package/dist/types/utils/foundry.d.ts +11 -0
  119. package/dist/types/utils/h2-fetch.d.ts +22 -0
  120. package/dist/types/utils/http-inspector.d.ts +59 -0
  121. package/dist/types/utils/idle-iterator.d.ts +122 -0
  122. package/dist/types/utils/json-parse.d.ts +98 -0
  123. package/dist/types/utils/oauth/alibaba-token-plan.d.ts +19 -0
  124. package/dist/types/utils/oauth/anthropic.d.ts +41 -0
  125. package/dist/types/utils/oauth/api-key-login.d.ts +38 -0
  126. package/dist/types/utils/oauth/api-key-validation.d.ts +39 -0
  127. package/dist/types/utils/oauth/bizrouter.d.ts +1 -0
  128. package/dist/types/utils/oauth/callback-server.d.ts +80 -0
  129. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  130. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  131. package/dist/types/utils/oauth/commandcode.d.ts +1 -0
  132. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  133. package/dist/types/utils/oauth/deepinfra.d.ts +1 -0
  134. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  135. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  136. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  137. package/dist/types/utils/oauth/fugu.d.ts +1 -0
  138. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  139. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  140. package/dist/types/utils/oauth/glm-zcode.d.ts +71 -0
  141. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  142. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  143. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  144. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  145. package/dist/types/utils/oauth/index.d.ts +39 -0
  146. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  147. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  148. package/dist/types/utils/oauth/kimi.d.ts +17 -0
  149. package/dist/types/utils/oauth/kiro.d.ts +71 -0
  150. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  151. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  152. package/dist/types/utils/oauth/mara.d.ts +1 -0
  153. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  154. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  155. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  156. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  157. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  158. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  159. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  160. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  161. package/dist/types/utils/oauth/opengateway.d.ts +1 -0
  162. package/dist/types/utils/oauth/openrouter.d.ts +1 -0
  163. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  164. package/dist/types/utils/oauth/perplexity.d.ts +4 -0
  165. package/dist/types/utils/oauth/pkce.d.ts +8 -0
  166. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  167. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  168. package/dist/types/utils/oauth/sglang.d.ts +16 -0
  169. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  170. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  171. package/dist/types/utils/oauth/together.d.ts +1 -0
  172. package/dist/types/utils/oauth/types.d.ts +56 -0
  173. package/dist/types/utils/oauth/venice.d.ts +18 -0
  174. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  175. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  176. package/dist/types/utils/oauth/xai.d.ts +30 -0
  177. package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
  178. package/dist/types/utils/oauth/zai.d.ts +18 -0
  179. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  180. package/dist/types/utils/overflow.d.ts +14 -0
  181. package/dist/types/utils/parse-bind.d.ts +26 -0
  182. package/dist/types/utils/provider-response.d.ts +6 -0
  183. package/dist/types/utils/provider-safety-stop.d.ts +8 -0
  184. package/dist/types/utils/proxy.d.ts +7 -0
  185. package/dist/types/utils/retry-after.d.ts +3 -0
  186. package/dist/types/utils/retry-budget.d.ts +1 -0
  187. package/dist/types/utils/retry.d.ts +29 -0
  188. package/dist/types/utils/schema/adapt.d.ts +24 -0
  189. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  190. package/dist/types/utils/schema/dereference.d.ts +11 -0
  191. package/dist/types/utils/schema/draft.d.ts +10 -0
  192. package/dist/types/utils/schema/equality.d.ts +4 -0
  193. package/dist/types/utils/schema/fields.d.ts +49 -0
  194. package/dist/types/utils/schema/index.d.ts +14 -0
  195. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  196. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  197. package/dist/types/utils/schema/normalize.d.ts +93 -0
  198. package/dist/types/utils/schema/root-combinator.d.ts +12 -0
  199. package/dist/types/utils/schema/spill.d.ts +8 -0
  200. package/dist/types/utils/schema/stamps.d.ts +25 -0
  201. package/dist/types/utils/schema/types.d.ts +4 -0
  202. package/dist/types/utils/schema/wire.d.ts +54 -0
  203. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  204. package/dist/types/utils/sse-debug.d.ts +10 -0
  205. package/dist/types/utils/tool-call-healing.d.ts +80 -0
  206. package/dist/types/utils/tool-choice-capability.d.ts +57 -0
  207. package/dist/types/utils/tool-choice.d.ts +50 -0
  208. package/dist/types/utils/validation.d.ts +17 -0
  209. package/dist/types/utils.d.ts +117 -0
  210. package/package.json +152 -0
  211. package/src/adapter-internals/provider-safety-stop.d.ts +45 -0
  212. package/src/adapter-internals/provider-safety-stop.ts +156 -0
  213. package/src/api-registry.d.ts +30 -0
  214. package/src/api-registry.ts +96 -0
  215. package/src/auth-broker/client.ts +444 -0
  216. package/src/auth-broker/index.ts +5 -0
  217. package/src/auth-broker/redact.ts +39 -0
  218. package/src/auth-broker/refresher.ts +130 -0
  219. package/src/auth-broker/remote-store.ts +1576 -0
  220. package/src/auth-broker/server.ts +764 -0
  221. package/src/auth-broker/types.ts +164 -0
  222. package/src/auth-broker/wire-schemas.ts +261 -0
  223. package/src/auth-gateway/http.ts +198 -0
  224. package/src/auth-gateway/index.ts +3 -0
  225. package/src/auth-gateway/server.ts +1315 -0
  226. package/src/auth-gateway/types.ts +160 -0
  227. package/src/auth-storage.ts +7312 -0
  228. package/src/cli.ts +269 -0
  229. package/src/codex-tools.d.ts +4 -0
  230. package/src/codex-tools.ts +24 -0
  231. package/src/context-cap-policy.d.ts +68 -0
  232. package/src/context-cap-policy.ts +123 -0
  233. package/src/core.ts +44 -0
  234. package/src/index.ts +61 -0
  235. package/src/model-cache.ts +236 -0
  236. package/src/model-manager.ts +744 -0
  237. package/src/model-pricing.d.ts +3 -0
  238. package/src/model-pricing.ts +68 -0
  239. package/src/model-retirements.d.ts +6 -0
  240. package/src/model-retirements.ts +19 -0
  241. package/src/model-thinking.d.ts +100 -0
  242. package/src/model-thinking.ts +1054 -0
  243. package/src/models.d.ts +21 -0
  244. package/src/models.json +94672 -0
  245. package/src/models.json.d.ts +9 -0
  246. package/src/models.ts +126 -0
  247. package/src/openai-completions-compat.d.ts +34 -0
  248. package/src/openai-completions-compat.ts +383 -0
  249. package/src/prompts/composer-bash-policy-recovery.md +1 -0
  250. package/src/prompts/cursor-composer-bash-policy-recovery.md +1 -0
  251. package/src/prompts/cursor-composer-edit-discipline.md +7 -0
  252. package/src/prompts/turn-aborted-guidance.md +4 -0
  253. package/src/provider-details.ts +90 -0
  254. package/src/provider-models/bundled-references.ts +38 -0
  255. package/src/provider-models/descriptors.ts +392 -0
  256. package/src/provider-models/google.ts +92 -0
  257. package/src/provider-models/index.ts +5 -0
  258. package/src/provider-models/ollama.ts +159 -0
  259. package/src/provider-models/openai-compat.ts +2920 -0
  260. package/src/provider-models/special.ts +185 -0
  261. package/src/providers/amazon-bedrock.d.ts +60 -0
  262. package/src/providers/amazon-bedrock.ts +939 -0
  263. package/src/providers/anthropic-messages-server-schema.ts +229 -0
  264. package/src/providers/anthropic-messages-server.ts +839 -0
  265. package/src/providers/anthropic.d.ts +280 -0
  266. package/src/providers/anthropic.ts +4421 -0
  267. package/src/providers/aws-credential-config.d.ts +19 -0
  268. package/src/providers/aws-credential-config.ts +179 -0
  269. package/src/providers/aws-credentials.d.ts +43 -0
  270. package/src/providers/aws-credentials.ts +457 -0
  271. package/src/providers/aws-eventstream.d.ts +38 -0
  272. package/src/providers/aws-eventstream.ts +185 -0
  273. package/src/providers/aws-sigv4.d.ts +55 -0
  274. package/src/providers/aws-sigv4.ts +218 -0
  275. package/src/providers/azure-openai-responses.d.ts +22 -0
  276. package/src/providers/azure-openai-responses.ts +447 -0
  277. package/src/providers/composer-discipline.d.ts +32 -0
  278. package/src/providers/composer-discipline.ts +95 -0
  279. package/src/providers/cursor/client-version.d.ts +10 -0
  280. package/src/providers/cursor/client-version.ts +10 -0
  281. package/src/providers/cursor/exec-modern.d.ts +98 -0
  282. package/src/providers/cursor/exec-modern.ts +497 -0
  283. package/src/providers/cursor/gen/agent_pb.d.ts +16769 -0
  284. package/src/providers/cursor/gen/agent_pb.ts +19780 -0
  285. package/src/providers/cursor/proto/agent.proto +4533 -0
  286. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  287. package/src/providers/cursor/proto/buf.yaml +17 -0
  288. package/src/providers/cursor-pi-args.d.ts +119 -0
  289. package/src/providers/cursor-pi-args.ts +187 -0
  290. package/src/providers/cursor.d.ts +72 -0
  291. package/src/providers/cursor.ts +3396 -0
  292. package/src/providers/dashscope-token-plan-headers.d.ts +57 -0
  293. package/src/providers/dashscope-token-plan-headers.ts +84 -0
  294. package/src/providers/error-message.d.ts +27 -0
  295. package/src/providers/error-message.ts +21 -0
  296. package/src/providers/github-copilot-headers.d.ts +40 -0
  297. package/src/providers/github-copilot-headers.ts +140 -0
  298. package/src/providers/gitlab-duo.d.ts +27 -0
  299. package/src/providers/gitlab-duo.ts +393 -0
  300. package/src/providers/google-auth.d.ts +26 -0
  301. package/src/providers/google-auth.ts +262 -0
  302. package/src/providers/google-gemini-cli.d.ts +75 -0
  303. package/src/providers/google-gemini-cli.ts +969 -0
  304. package/src/providers/google-gemini-headers.d.ts +43 -0
  305. package/src/providers/google-gemini-headers.ts +100 -0
  306. package/src/providers/google-shared.d.ts +183 -0
  307. package/src/providers/google-shared.ts +1105 -0
  308. package/src/providers/google-types.d.ts +138 -0
  309. package/src/providers/google-types.ts +167 -0
  310. package/src/providers/google-vertex.d.ts +11 -0
  311. package/src/providers/google-vertex.ts +124 -0
  312. package/src/providers/google.d.ts +4 -0
  313. package/src/providers/google.ts +41 -0
  314. package/src/providers/grammar.d.ts +1 -0
  315. package/src/providers/grammar.ts +70 -0
  316. package/src/providers/kimi.d.ts +27 -0
  317. package/src/providers/kimi.ts +52 -0
  318. package/src/providers/kiro-api-key.d.ts +50 -0
  319. package/src/providers/kiro-api-key.ts +786 -0
  320. package/src/providers/kiro-codewhisperer.d.ts +11 -0
  321. package/src/providers/kiro-codewhisperer.ts +600 -0
  322. package/src/providers/mock.ts +526 -0
  323. package/src/providers/ollama.d.ts +41 -0
  324. package/src/providers/ollama.ts +645 -0
  325. package/src/providers/openai-anthropic-shim.d.ts +31 -0
  326. package/src/providers/openai-anthropic-shim.ts +156 -0
  327. package/src/providers/openai-bounded-rate-limits.d.ts +3 -0
  328. package/src/providers/openai-bounded-rate-limits.ts +57 -0
  329. package/src/providers/openai-chat-server-schema.ts +254 -0
  330. package/src/providers/openai-chat-server.ts +724 -0
  331. package/src/providers/openai-codex/constants.d.ts +26 -0
  332. package/src/providers/openai-codex/constants.ts +43 -0
  333. package/src/providers/openai-codex/request-transformer.d.ts +50 -0
  334. package/src/providers/openai-codex/request-transformer.ts +219 -0
  335. package/src/providers/openai-codex/response-handler.d.ts +18 -0
  336. package/src/providers/openai-codex/response-handler.ts +111 -0
  337. package/src/providers/openai-codex-responses.d.ts +71 -0
  338. package/src/providers/openai-codex-responses.ts +3288 -0
  339. package/src/providers/openai-completions-compat.d.ts +6 -0
  340. package/src/providers/openai-completions-compat.ts +6 -0
  341. package/src/providers/openai-completions.d.ts +35 -0
  342. package/src/providers/openai-completions.ts +2294 -0
  343. package/src/providers/openai-opencodex-responses.ts +174 -0
  344. package/src/providers/openai-request-transform.d.ts +4 -0
  345. package/src/providers/openai-request-transform.ts +136 -0
  346. package/src/providers/openai-responses-server-schema.ts +290 -0
  347. package/src/providers/openai-responses-server.ts +1268 -0
  348. package/src/providers/openai-responses-shared.d.ts +106 -0
  349. package/src/providers/openai-responses-shared.ts +1253 -0
  350. package/src/providers/openai-responses.d.ts +37 -0
  351. package/src/providers/openai-responses.ts +989 -0
  352. package/src/providers/pi-native-client.d.ts +29 -0
  353. package/src/providers/pi-native-client.ts +243 -0
  354. package/src/providers/pi-native-server.ts +488 -0
  355. package/src/providers/register-builtins.d.ts +59 -0
  356. package/src/providers/register-builtins.ts +544 -0
  357. package/src/providers/synthetic.d.ts +26 -0
  358. package/src/providers/synthetic.ts +50 -0
  359. package/src/providers/transform-messages.d.ts +33 -0
  360. package/src/providers/transform-messages.ts +408 -0
  361. package/src/providers/vision-guard.d.ts +8 -0
  362. package/src/providers/vision-guard.ts +31 -0
  363. package/src/rate-limit-utils.d.ts +19 -0
  364. package/src/rate-limit-utils.ts +102 -0
  365. package/src/stream.d.ts +45 -0
  366. package/src/stream.ts +1306 -0
  367. package/src/types.d.ts +1073 -0
  368. package/src/types.ts +1305 -0
  369. package/src/usage/claude.ts +449 -0
  370. package/src/usage/gemini.ts +250 -0
  371. package/src/usage/github-copilot.ts +421 -0
  372. package/src/usage/google-antigravity.ts +201 -0
  373. package/src/usage/grok-cli.ts +259 -0
  374. package/src/usage/kimi.ts +285 -0
  375. package/src/usage/minimax-code.ts +31 -0
  376. package/src/usage/openai-codex.ts +503 -0
  377. package/src/usage/shared.ts +10 -0
  378. package/src/usage/zai.ts +247 -0
  379. package/src/usage.ts +190 -0
  380. package/src/utils/abort.d.ts +19 -0
  381. package/src/utils/abort.ts +51 -0
  382. package/src/utils/anthropic-auth.ts +95 -0
  383. package/src/utils/block-symbols.d.ts +6 -0
  384. package/src/utils/block-symbols.ts +11 -0
  385. package/src/utils/discovery/antigravity.ts +275 -0
  386. package/src/utils/discovery/codex.ts +362 -0
  387. package/src/utils/discovery/cursor.ts +388 -0
  388. package/src/utils/discovery/gemini.ts +248 -0
  389. package/src/utils/discovery/index.ts +4 -0
  390. package/src/utils/discovery/openai-compatible.ts +379 -0
  391. package/src/utils/event-stream.d.ts +41 -0
  392. package/src/utils/event-stream.ts +269 -0
  393. package/src/utils/fallback-transport.d.ts +110 -0
  394. package/src/utils/fallback-transport.ts +411 -0
  395. package/src/utils/fireworks-model-id.d.ts +10 -0
  396. package/src/utils/fireworks-model-id.ts +30 -0
  397. package/src/utils/foundry.d.ts +11 -0
  398. package/src/utils/foundry.ts +18 -0
  399. package/src/utils/h2-fetch.ts +60 -0
  400. package/src/utils/http-inspector.d.ts +59 -0
  401. package/src/utils/http-inspector.ts +380 -0
  402. package/src/utils/idle-iterator.d.ts +122 -0
  403. package/src/utils/idle-iterator.ts +410 -0
  404. package/src/utils/json-parse.d.ts +98 -0
  405. package/src/utils/json-parse.ts +607 -0
  406. package/src/utils/oauth/alibaba-token-plan.ts +60 -0
  407. package/src/utils/oauth/anthropic.ts +233 -0
  408. package/src/utils/oauth/api-key-login.ts +98 -0
  409. package/src/utils/oauth/api-key-validation.ts +344 -0
  410. package/src/utils/oauth/bizrouter.ts +15 -0
  411. package/src/utils/oauth/callback-server.d.ts +80 -0
  412. package/src/utils/oauth/callback-server.ts +359 -0
  413. package/src/utils/oauth/cerebras.ts +16 -0
  414. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  415. package/src/utils/oauth/commandcode.ts +17 -0
  416. package/src/utils/oauth/cursor.ts +157 -0
  417. package/src/utils/oauth/deepinfra.ts +15 -0
  418. package/src/utils/oauth/deepseek.ts +53 -0
  419. package/src/utils/oauth/firepass.ts +24 -0
  420. package/src/utils/oauth/fireworks.ts +15 -0
  421. package/src/utils/oauth/fugu.ts +15 -0
  422. package/src/utils/oauth/github-copilot.d.ts +38 -0
  423. package/src/utils/oauth/github-copilot.ts +362 -0
  424. package/src/utils/oauth/gitlab-duo.ts +123 -0
  425. package/src/utils/oauth/glm-zcode.d.ts +71 -0
  426. package/src/utils/oauth/glm-zcode.ts +433 -0
  427. package/src/utils/oauth/google-antigravity.ts +200 -0
  428. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  429. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  430. package/src/utils/oauth/huggingface.ts +62 -0
  431. package/src/utils/oauth/index.ts +558 -0
  432. package/src/utils/oauth/kagi.ts +47 -0
  433. package/src/utils/oauth/kilo.ts +87 -0
  434. package/src/utils/oauth/kimi.d.ts +17 -0
  435. package/src/utils/oauth/kimi.ts +275 -0
  436. package/src/utils/oauth/kiro.ts +448 -0
  437. package/src/utils/oauth/litellm.ts +47 -0
  438. package/src/utils/oauth/lm-studio.ts +38 -0
  439. package/src/utils/oauth/mara.ts +16 -0
  440. package/src/utils/oauth/minimax-code.ts +78 -0
  441. package/src/utils/oauth/moonshot.ts +16 -0
  442. package/src/utils/oauth/nanogpt.ts +15 -0
  443. package/src/utils/oauth/nvidia.ts +70 -0
  444. package/src/utils/oauth/oauth.html +199 -0
  445. package/src/utils/oauth/ollama-cloud.ts +28 -0
  446. package/src/utils/oauth/ollama.ts +47 -0
  447. package/src/utils/oauth/openai-codex.ts +299 -0
  448. package/src/utils/oauth/opencode.ts +49 -0
  449. package/src/utils/oauth/opengateway.ts +15 -0
  450. package/src/utils/oauth/openrouter.ts +16 -0
  451. package/src/utils/oauth/parallel.ts +46 -0
  452. package/src/utils/oauth/perplexity.ts +225 -0
  453. package/src/utils/oauth/pkce.ts +18 -0
  454. package/src/utils/oauth/qianfan.ts +58 -0
  455. package/src/utils/oauth/qwen-portal.ts +60 -0
  456. package/src/utils/oauth/sglang.ts +42 -0
  457. package/src/utils/oauth/synthetic.ts +15 -0
  458. package/src/utils/oauth/tavily.ts +46 -0
  459. package/src/utils/oauth/together.ts +16 -0
  460. package/src/utils/oauth/types.d.ts +56 -0
  461. package/src/utils/oauth/types.ts +122 -0
  462. package/src/utils/oauth/venice.ts +59 -0
  463. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  464. package/src/utils/oauth/vllm.ts +42 -0
  465. package/src/utils/oauth/xai.ts +246 -0
  466. package/src/utils/oauth/xiaomi.ts +199 -0
  467. package/src/utils/oauth/zai.ts +60 -0
  468. package/src/utils/oauth/zenmux.ts +15 -0
  469. package/src/utils/overflow.ts +275 -0
  470. package/src/utils/parse-bind.ts +81 -0
  471. package/src/utils/provider-response.d.ts +6 -0
  472. package/src/utils/provider-response.ts +30 -0
  473. package/src/utils/provider-safety-stop.ts +8 -0
  474. package/src/utils/proxy.d.ts +7 -0
  475. package/src/utils/proxy.ts +652 -0
  476. package/src/utils/retry-after.d.ts +3 -0
  477. package/src/utils/retry-after.ts +110 -0
  478. package/src/utils/retry-budget.d.ts +1 -0
  479. package/src/utils/retry-budget.ts +4 -0
  480. package/src/utils/retry.d.ts +29 -0
  481. package/src/utils/retry.ts +67 -0
  482. package/src/utils/schema/CONSTRAINTS.md +164 -0
  483. package/src/utils/schema/adapt.d.ts +24 -0
  484. package/src/utils/schema/adapt.ts +36 -0
  485. package/src/utils/schema/compatibility.d.ts +30 -0
  486. package/src/utils/schema/compatibility.ts +435 -0
  487. package/src/utils/schema/dereference.d.ts +11 -0
  488. package/src/utils/schema/dereference.ts +98 -0
  489. package/src/utils/schema/draft.d.ts +10 -0
  490. package/src/utils/schema/draft.ts +341 -0
  491. package/src/utils/schema/equality.d.ts +4 -0
  492. package/src/utils/schema/equality.ts +97 -0
  493. package/src/utils/schema/fields.d.ts +49 -0
  494. package/src/utils/schema/fields.ts +190 -0
  495. package/src/utils/schema/index.d.ts +14 -0
  496. package/src/utils/schema/index.ts +14 -0
  497. package/src/utils/schema/json-schema-validator.d.ts +12 -0
  498. package/src/utils/schema/json-schema-validator.ts +577 -0
  499. package/src/utils/schema/meta-validator.d.ts +2 -0
  500. package/src/utils/schema/meta-validator.ts +167 -0
  501. package/src/utils/schema/normalize.d.ts +93 -0
  502. package/src/utils/schema/normalize.ts +1588 -0
  503. package/src/utils/schema/root-combinator.d.ts +12 -0
  504. package/src/utils/schema/root-combinator.ts +143 -0
  505. package/src/utils/schema/spill.d.ts +8 -0
  506. package/src/utils/schema/spill.ts +43 -0
  507. package/src/utils/schema/stamps.d.ts +25 -0
  508. package/src/utils/schema/stamps.ts +97 -0
  509. package/src/utils/schema/types.d.ts +4 -0
  510. package/src/utils/schema/types.ts +11 -0
  511. package/src/utils/schema/wire.d.ts +54 -0
  512. package/src/utils/schema/wire.ts +213 -0
  513. package/src/utils/schema/zod-decontaminate.d.ts +31 -0
  514. package/src/utils/schema/zod-decontaminate.ts +331 -0
  515. package/src/utils/sse-debug.d.ts +10 -0
  516. package/src/utils/sse-debug.ts +289 -0
  517. package/src/utils/tool-call-healing.d.ts +80 -0
  518. package/src/utils/tool-call-healing.ts +298 -0
  519. package/src/utils/tool-choice-capability.d.ts +57 -0
  520. package/src/utils/tool-choice-capability.ts +633 -0
  521. package/src/utils/tool-choice.d.ts +50 -0
  522. package/src/utils/tool-choice.ts +99 -0
  523. package/src/utils/validation.ts +1080 -0
  524. package/src/utils.d.ts +117 -0
  525. package/src/utils.ts +523 -0
@@ -0,0 +1,7 @@
1
+ import * as tls from "node:tls";
2
+ export interface ProxyConnectOptions {
3
+ signal?: AbortSignal;
4
+ timeoutMs?: number;
5
+ }
6
+ export declare function getProxyForUrl(provider: string, url: URL): string | undefined;
7
+ export declare function connectProxiedSocket(proxyUrl: string, targetUrl: string, options?: ProxyConnectOptions): Promise<tls.TLSSocket>;
@@ -0,0 +1,652 @@
1
+ import * as net from "node:net";
2
+ import * as tls from "node:tls";
3
+
4
+ export interface ProxyConnectOptions {
5
+ signal?: AbortSignal;
6
+ timeoutMs?: number;
7
+ }
8
+
9
+ const CONNECT_HEADER_LIMIT = 64 * 1024;
10
+ const CLOUD_METADATA_HOSTS: Record<string, true> = {
11
+ metadata: true,
12
+ "metadata.aws": true,
13
+ "metadata.aws.internal": true,
14
+ "metadata.azure": true,
15
+ "metadata.azure.com": true,
16
+ "metadata.azure.internal": true,
17
+ "metadata.google": true,
18
+ "metadata.google.internal": true,
19
+ "metadata.oraclecloud.com": true,
20
+ "instance-data": true,
21
+ "instance-data.ec2.internal": true,
22
+ "100.100.100.100": true,
23
+ "100.100.100.200": true,
24
+ "169.254.169.254": true,
25
+ };
26
+
27
+ class ProxyTransportError extends Error {
28
+ readonly name = "ProxyTransportError";
29
+ }
30
+
31
+ function transportError(message: string): ProxyTransportError {
32
+ return new ProxyTransportError(message);
33
+ }
34
+
35
+ function normalizeProvider(provider: string): string {
36
+ return provider
37
+ .trim()
38
+ .toUpperCase()
39
+ .replace(/[^A-Z0-9]+/g, "_")
40
+ .replace(/^_+|_+$/g, "");
41
+ }
42
+
43
+ function firstEnvValue(...names: string[]): string | undefined {
44
+ for (const name of names) {
45
+ const value = process.env[name];
46
+ if (value?.trim()) return value.trim();
47
+ }
48
+ return undefined;
49
+ }
50
+
51
+ function normalizeHost(hostname: string): string {
52
+ return hostname
53
+ .trim()
54
+ .replace(/^\[|\]$/g, "")
55
+ .replace(/\.$/, "")
56
+ .toLowerCase();
57
+ }
58
+
59
+ function defaultPortForProtocol(protocol: string): number | undefined {
60
+ if (protocol === "https:") return 443;
61
+ if (protocol === "http:") return 80;
62
+ return undefined;
63
+ }
64
+
65
+ function effectiveUrlPort(url: URL): number | undefined {
66
+ if (url.port) {
67
+ const port = Number(url.port);
68
+ return Number.isInteger(port) && port >= 1 && port <= 65_535 ? port : undefined;
69
+ }
70
+ return defaultPortForProtocol(url.protocol);
71
+ }
72
+
73
+ function parseIPv4(host: string): [number, number, number, number] | undefined {
74
+ if (net.isIP(host) !== 4) return undefined;
75
+ const parts = host.split(".");
76
+ if (parts.length !== 4) return undefined;
77
+ const numbers = parts.map(part => Number(part));
78
+ if (numbers.some(part => !Number.isInteger(part) || part < 0 || part > 255)) return undefined;
79
+ return numbers as [number, number, number, number];
80
+ }
81
+
82
+ function parseIPv6(host: string): Uint8Array | undefined {
83
+ if (net.isIP(host) !== 6) return undefined;
84
+ const withoutZone = host.split("%", 1)[0] ?? host;
85
+ let value = withoutZone;
86
+
87
+ // IPv4 tails are represented by the final two IPv6 hextets.
88
+ const lastColon = value.lastIndexOf(":");
89
+ const lastDot = value.lastIndexOf(".");
90
+ if (lastDot > lastColon) {
91
+ const ipv4 = value.slice(lastColon + 1);
92
+ const parsed = parseIPv4(ipv4);
93
+ if (!parsed) return undefined;
94
+ const [a, b, c, d] = parsed;
95
+ value = `${value.slice(0, lastColon + 1)}${((a << 8) | b).toString(16)}:${((c << 8) | d).toString(16)}`;
96
+ }
97
+
98
+ const doubleColon = value.indexOf("::");
99
+ if (doubleColon !== value.lastIndexOf("::")) return undefined;
100
+
101
+ const parseHextets = (part: string): number[] => {
102
+ if (!part) return [];
103
+ const hextets = part.split(":");
104
+ if (hextets.some(hextet => !/^[0-9a-f]{1,4}$/i.test(hextet))) return [];
105
+ return hextets.map(hextet => Number.parseInt(hextet, 16));
106
+ };
107
+
108
+ let hextets: number[];
109
+ if (doubleColon >= 0) {
110
+ const left = parseHextets(value.slice(0, doubleColon));
111
+ const right = parseHextets(value.slice(doubleColon + 2));
112
+ if (
113
+ (!left.length && value.slice(0, doubleColon) !== "") ||
114
+ (!right.length && value.slice(doubleColon + 2) !== "")
115
+ ) {
116
+ return undefined;
117
+ }
118
+ const missing = 8 - left.length - right.length;
119
+ if (missing < 1) return undefined;
120
+ hextets = [...left, ...new Array<number>(missing).fill(0), ...right];
121
+ } else {
122
+ hextets = parseHextets(value);
123
+ if (hextets.length !== 8) return undefined;
124
+ }
125
+ if (hextets.length !== 8) return undefined;
126
+
127
+ const bytes = new Uint8Array(16);
128
+ for (let index = 0; index < hextets.length; index++) {
129
+ bytes[index * 2] = hextets[index]! >> 8;
130
+ bytes[index * 2 + 1] = hextets[index]! & 0xff;
131
+ }
132
+ return bytes;
133
+ }
134
+
135
+ function isPrivateOrLocalHost(hostname: string): boolean {
136
+ const host = normalizeHost(hostname);
137
+ if (!host) return false;
138
+ if (
139
+ host === "localhost" ||
140
+ host.endsWith(".localhost") ||
141
+ host === "localhost.localdomain" ||
142
+ host.endsWith(".localhost.localdomain")
143
+ )
144
+ return true;
145
+ if (Object.hasOwn(CLOUD_METADATA_HOSTS, host)) return true;
146
+
147
+ const ipv4 = parseIPv4(host);
148
+ if (ipv4) {
149
+ const [first, second] = ipv4;
150
+ return (
151
+ first === 0 ||
152
+ first === 10 ||
153
+ (first === 172 && second >= 16 && second <= 31) ||
154
+ (first === 192 && second === 168) ||
155
+ first === 127 ||
156
+ (first === 169 && second === 254)
157
+ );
158
+ }
159
+
160
+ const ipv6 = parseIPv6(host);
161
+ if (!ipv6) return false;
162
+
163
+ // IPv4-mapped IPv6 addresses retain the local/private classification of IPv4.
164
+ const isMapped = ipv6.slice(0, 10).every(byte => byte === 0) && ipv6[10] === 0xff && ipv6[11] === 0xff;
165
+ if (isMapped) {
166
+ const mapped = `${ipv6[12]}.${ipv6[13]}.${ipv6[14]}.${ipv6[15]}`;
167
+ return isPrivateOrLocalHost(mapped);
168
+ }
169
+
170
+ const isUnspecified = ipv6.every(byte => byte === 0);
171
+ const isLoopback = ipv6.slice(0, 15).every(byte => byte === 0) && ipv6[15] === 1;
172
+ const isLinkLocal = ipv6[0] === 0xfe && (ipv6[1]! & 0xc0) === 0x80;
173
+ const isUniqueLocal = (ipv6[0]! & 0xfe) === 0xfc;
174
+ return isUnspecified || isLoopback || isLinkLocal || isUniqueLocal;
175
+ }
176
+
177
+ interface NoProxyRule {
178
+ host: string;
179
+ port?: number;
180
+ wildcard: boolean;
181
+ }
182
+
183
+ function parseNoProxyRule(rawRule: string): NoProxyRule | undefined {
184
+ const rule = rawRule.trim().toLowerCase();
185
+ if (!rule) return undefined;
186
+
187
+ let host: string;
188
+ let portText: string | undefined;
189
+ if (rule.startsWith("[")) {
190
+ const closingBracket = rule.indexOf("]");
191
+ if (closingBracket < 0) return undefined;
192
+ host = rule.slice(1, closingBracket);
193
+ const suffix = rule.slice(closingBracket + 1);
194
+ if (suffix) {
195
+ if (!suffix.startsWith(":")) return undefined;
196
+ portText = suffix.slice(1);
197
+ }
198
+ } else {
199
+ const colon = rule.lastIndexOf(":");
200
+ if (colon >= 0 && rule.indexOf(":") === colon) {
201
+ const possiblePort = rule.slice(colon + 1);
202
+ if (/^\d+$/.test(possiblePort) || possiblePort === "*") {
203
+ host = rule.slice(0, colon);
204
+ portText = possiblePort;
205
+ } else {
206
+ host = rule;
207
+ }
208
+ } else {
209
+ host = rule;
210
+ }
211
+ }
212
+
213
+ const wildcard = host === "*" || host === "*.";
214
+ if (wildcard) {
215
+ if (portText && portText !== "*" && !/^\d+$/.test(portText)) return undefined;
216
+ const port = portText && portText !== "*" ? Number(portText) : undefined;
217
+ if (port !== undefined && (!Number.isInteger(port) || port < 1 || port > 65_535)) return undefined;
218
+ return { host: "*", port, wildcard: true };
219
+ }
220
+
221
+ if (host.startsWith("*.")) host = host.slice(1);
222
+ if (host.startsWith(".")) host = host.slice(1);
223
+ host = normalizeHost(host);
224
+ if (!host) return undefined;
225
+
226
+ let port: number | undefined;
227
+ if (portText && portText !== "*") {
228
+ if (!/^\d+$/.test(portText)) return undefined;
229
+ port = Number(portText);
230
+ if (!Number.isInteger(port) || port < 1 || port > 65_535) return undefined;
231
+ }
232
+ return { host, port, wildcard: false };
233
+ }
234
+
235
+ function matchesNoProxy(hostname: string, port: number | undefined): boolean {
236
+ const noProxy = firstEnvValue("NO_PROXY", "no_proxy");
237
+ if (!noProxy) return false;
238
+ const host = normalizeHost(hostname);
239
+
240
+ for (const rawRule of noProxy.split(",")) {
241
+ const rule = parseNoProxyRule(rawRule);
242
+ if (!rule) continue;
243
+ if (rule.port !== undefined && rule.port !== port) continue;
244
+ if (rule.wildcard) return true;
245
+ if (host === rule.host || host.endsWith(`.${rule.host}`)) return true;
246
+ }
247
+ return false;
248
+ }
249
+
250
+ export function getProxyForUrl(provider: string, url: URL): string | undefined {
251
+ const hostname = normalizeHost(url.hostname);
252
+ if (!hostname || isPrivateOrLocalHost(hostname) || matchesNoProxy(hostname, effectiveUrlPort(url))) return undefined;
253
+
254
+ const normalizedProvider = normalizeProvider(provider);
255
+ const protocolProxy =
256
+ url.protocol === "https:"
257
+ ? firstEnvValue("HTTPS_PROXY", "https_proxy")
258
+ : url.protocol === "http:"
259
+ ? firstEnvValue("HTTP_PROXY", "http_proxy")
260
+ : undefined;
261
+ const candidates = [
262
+ normalizedProvider ? process.env[`PI_PROXY_${normalizedProvider}`] : undefined,
263
+ process.env.PI_PROXY,
264
+ protocolProxy,
265
+ firstEnvValue("ALL_PROXY", "all_proxy"),
266
+ ];
267
+ for (const candidate of candidates) {
268
+ if (candidate?.trim()) return candidate.trim();
269
+ }
270
+ return undefined;
271
+ }
272
+
273
+ function formatAuthority(hostname: string, port: number): string {
274
+ const host = normalizeHost(hostname);
275
+ return net.isIP(host) === 6 ? `[${host}]:${port}` : `${host}:${port}`;
276
+ }
277
+
278
+ function tlsServerName(hostname: string): string | undefined {
279
+ const host = normalizeHost(hostname);
280
+ return host && net.isIP(host) === 0 ? host : undefined;
281
+ }
282
+
283
+ interface ParsedProxyUrl {
284
+ protocol: "http:" | "https:";
285
+ hostname: string;
286
+ port: number;
287
+ username: string;
288
+ password: string;
289
+ }
290
+
291
+ function parseProxyUrl(value: string): ParsedProxyUrl {
292
+ let url: URL;
293
+ try {
294
+ url = new URL(value);
295
+ } catch {
296
+ throw transportError("Invalid proxy URL");
297
+ }
298
+ if (url.protocol !== "http:" && url.protocol !== "https:") throw transportError("Unsupported proxy protocol");
299
+ const hostname = normalizeHost(url.hostname);
300
+ const port = url.port ? Number(url.port) : url.protocol === "https:" ? 443 : 80;
301
+ if (!hostname || !Number.isInteger(port) || port < 1 || port > 65_535) throw transportError("Invalid proxy address");
302
+ return { protocol: url.protocol, hostname, port, username: url.username, password: url.password };
303
+ }
304
+
305
+ interface ParsedTargetUrl {
306
+ hostname: string;
307
+ port: number;
308
+ authority: string;
309
+ servername?: string;
310
+ }
311
+
312
+ function parseTargetUrl(value: string): ParsedTargetUrl {
313
+ let url: URL;
314
+ try {
315
+ url = new URL(value);
316
+ } catch {
317
+ throw transportError("Invalid target URL");
318
+ }
319
+ const hostname = normalizeHost(url.hostname);
320
+ const port = url.port ? Number(url.port) : defaultPortForProtocol(url.protocol);
321
+ if (!hostname || port === undefined || !Number.isInteger(port) || port < 1 || port > 65_535) {
322
+ throw transportError("Invalid target address");
323
+ }
324
+ return { hostname, port, authority: formatAuthority(hostname, port), servername: tlsServerName(hostname) };
325
+ }
326
+
327
+ function decodeProxyCredential(value: string): string {
328
+ try {
329
+ return decodeURIComponent(value);
330
+ } catch {
331
+ throw transportError("Invalid proxy credentials");
332
+ }
333
+ }
334
+
335
+ function proxyAuthorization(proxy: ParsedProxyUrl): string | undefined {
336
+ if (!proxy.username && !proxy.password) return undefined;
337
+ const username = decodeProxyCredential(proxy.username);
338
+ const password = decodeProxyCredential(proxy.password);
339
+ return `Basic ${Buffer.from(`${username}:${password}`, "utf8").toString("base64")}`;
340
+ }
341
+
342
+ function waitForSocketConnect(socket: net.Socket, signal: AbortSignal): Promise<void> {
343
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
344
+ let settled = false;
345
+ const cleanup = () => {
346
+ socket.removeListener("connect", onConnect);
347
+ socket.removeListener("error", onError);
348
+ socket.removeListener("close", onClose);
349
+ signal.removeEventListener("abort", onAbort);
350
+ };
351
+ const succeed = () => {
352
+ if (settled) return;
353
+ settled = true;
354
+ cleanup();
355
+ resolve();
356
+ };
357
+ const fail = (error: ProxyTransportError) => {
358
+ if (settled) return;
359
+ settled = true;
360
+ cleanup();
361
+ reject(error);
362
+ };
363
+ const onConnect = () => succeed();
364
+ const onError = () => fail(transportError("Proxy TCP connection failed"));
365
+ const onClose = () => fail(transportError("Proxy TCP connection closed"));
366
+ const onAbort = () => {
367
+ cleanup();
368
+ if (!settled) {
369
+ settled = true;
370
+ reject(transportError("Proxy connection aborted"));
371
+ }
372
+ };
373
+
374
+ socket.once("connect", onConnect);
375
+ socket.once("error", onError);
376
+ socket.once("close", onClose);
377
+ signal.addEventListener("abort", onAbort, { once: true });
378
+ if (signal.aborted) onAbort();
379
+ return promise;
380
+ }
381
+
382
+ function openTcpSocket(
383
+ hostname: string,
384
+ port: number,
385
+ signal: AbortSignal,
386
+ addSocket: (socket: net.Socket) => void,
387
+ ): Promise<net.Socket> {
388
+ let socket: net.Socket;
389
+ try {
390
+ socket = net.connect({ host: hostname, port });
391
+ } catch {
392
+ return Promise.reject(transportError("Proxy TCP connection failed"));
393
+ }
394
+ addSocket(socket);
395
+ return waitForSocketConnect(socket, signal).then(() => socket);
396
+ }
397
+
398
+ function waitForTlsHandshake(socket: tls.TLSSocket, signal: AbortSignal): Promise<tls.TLSSocket> {
399
+ const { promise, resolve, reject } = Promise.withResolvers<tls.TLSSocket>();
400
+ let settled = false;
401
+ const cleanup = () => {
402
+ socket.removeListener("secureConnect", onSecureConnect);
403
+ socket.removeListener("error", onError);
404
+ socket.removeListener("close", onClose);
405
+ signal.removeEventListener("abort", onAbort);
406
+ };
407
+ const succeed = () => {
408
+ if (settled) return;
409
+ settled = true;
410
+ cleanup();
411
+ resolve(socket);
412
+ };
413
+ const fail = (error: ProxyTransportError) => {
414
+ if (settled) return;
415
+ settled = true;
416
+ cleanup();
417
+ reject(error);
418
+ };
419
+ const onSecureConnect = () => succeed();
420
+ const onError = () => fail(transportError("Proxy TLS handshake failed"));
421
+ const onClose = () => fail(transportError("Proxy TLS connection closed"));
422
+ const onAbort = () => {
423
+ cleanup();
424
+ if (!settled) {
425
+ settled = true;
426
+ reject(transportError("Proxy connection aborted"));
427
+ }
428
+ };
429
+
430
+ socket.once("secureConnect", onSecureConnect);
431
+ socket.once("error", onError);
432
+ socket.once("close", onClose);
433
+ signal.addEventListener("abort", onAbort, { once: true });
434
+ if (signal.aborted) onAbort();
435
+ return promise;
436
+ }
437
+
438
+ function wrapProxyTls(
439
+ socket: net.Socket,
440
+ servername: string | undefined,
441
+ signal: AbortSignal,
442
+ addSocket: (socket: net.Socket) => void,
443
+ alpnProtocols?: string[],
444
+ ): Promise<tls.TLSSocket> {
445
+ let tlsSocket: tls.TLSSocket;
446
+ try {
447
+ const options: tls.ConnectionOptions = { socket };
448
+ if (servername) options.servername = servername;
449
+ if (alpnProtocols) options.ALPNProtocols = alpnProtocols;
450
+ tlsSocket = tls.connect(options);
451
+ } catch {
452
+ return Promise.reject(transportError("Proxy TLS handshake failed"));
453
+ }
454
+ addSocket(tlsSocket);
455
+ const handshake = waitForTlsHandshake(tlsSocket, signal);
456
+ // CONNECT parsing pauses the socket before handing it to TLS so buffered bytes are not lost.
457
+ socket.resume();
458
+ return handshake;
459
+ }
460
+
461
+ function issueConnectRequest(
462
+ socket: net.Socket,
463
+ target: ParsedTargetUrl,
464
+ proxy: ParsedProxyUrl,
465
+ signal: AbortSignal,
466
+ ): Promise<void> {
467
+ const authorization = proxyAuthorization(proxy);
468
+ const request = [
469
+ `CONNECT ${target.authority} HTTP/1.1`,
470
+ `Host: ${target.authority}`,
471
+ authorization ? `Proxy-Authorization: ${authorization}` : undefined,
472
+ "Connection: Keep-Alive",
473
+ "",
474
+ "",
475
+ ]
476
+ .filter((line): line is string => line !== undefined)
477
+ .join("\r\n");
478
+
479
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
480
+ let settled = false;
481
+ const response = Buffer.allocUnsafe(CONNECT_HEADER_LIMIT);
482
+ let responseLength = 0;
483
+ let headerMatchLength = 0;
484
+ const cleanup = () => {
485
+ socket.removeListener("data", onData);
486
+ socket.removeListener("error", onError);
487
+ socket.removeListener("close", onClose);
488
+ signal.removeEventListener("abort", onAbort);
489
+ };
490
+ const succeed = () => {
491
+ if (settled) return;
492
+ settled = true;
493
+ cleanup();
494
+ resolve();
495
+ };
496
+ const fail = (error: ProxyTransportError) => {
497
+ if (settled) return;
498
+ settled = true;
499
+ cleanup();
500
+ reject(error);
501
+ };
502
+ const onData = (bytes: Buffer) => {
503
+ const capacity = CONNECT_HEADER_LIMIT - responseLength;
504
+ const scanLength = Math.min(bytes.length, capacity);
505
+ let headerLength = -1;
506
+
507
+ for (let index = 0; index < scanLength; index++) {
508
+ const byte = bytes[index];
509
+ if (headerMatchLength === 0) {
510
+ if (byte === 0x0d) headerMatchLength = 1;
511
+ } else if (headerMatchLength === 1) {
512
+ if (byte === 0x0a) headerMatchLength = 2;
513
+ else if (byte !== 0x0d) headerMatchLength = 0;
514
+ } else if (headerMatchLength === 2) {
515
+ if (byte === 0x0d) headerMatchLength = 3;
516
+ else headerMatchLength = 0;
517
+ } else {
518
+ if (byte === 0x0a) {
519
+ headerLength = index + 1;
520
+ break;
521
+ }
522
+ if (byte === 0x0d) headerMatchLength = 1;
523
+ else headerMatchLength = 0;
524
+ }
525
+ }
526
+
527
+ if (headerLength < 0) {
528
+ if (bytes.length > capacity) {
529
+ fail(transportError("Proxy CONNECT response headers too large"));
530
+ return;
531
+ }
532
+ bytes.copy(response, responseLength);
533
+ responseLength += bytes.length;
534
+ return;
535
+ }
536
+
537
+ bytes.copy(response, responseLength, 0, headerLength);
538
+ responseLength += headerLength;
539
+ const headerEnd = responseLength - 4;
540
+ const header = response.subarray(0, responseLength);
541
+ const firstLineEnd = header.indexOf("\r\n");
542
+ const firstLine = header.subarray(0, firstLineEnd < 0 ? headerEnd : firstLineEnd).toString("latin1");
543
+ const statusMatch = /^HTTP\/\d(?:\.\d)?\s+(\d{3})(?:\s|$)/i.exec(firstLine);
544
+ if (!statusMatch) {
545
+ fail(transportError("Invalid proxy CONNECT response"));
546
+ return;
547
+ }
548
+ const status = Number(statusMatch[1]);
549
+ if (status !== 200) {
550
+ fail(transportError(`Proxy CONNECT failed with status ${status}`));
551
+ return;
552
+ }
553
+ socket.pause();
554
+ const remaining = bytes.subarray(headerLength);
555
+ if (remaining.length > 0) socket.unshift(remaining);
556
+ succeed();
557
+ };
558
+ const onError = () => fail(transportError("Proxy CONNECT failed"));
559
+ const onClose = () => fail(transportError("Proxy CONNECT connection closed"));
560
+ const onAbort = () => {
561
+ cleanup();
562
+ if (!settled) {
563
+ settled = true;
564
+ reject(transportError("Proxy connection aborted"));
565
+ }
566
+ };
567
+
568
+ socket.on("data", onData);
569
+ socket.once("error", onError);
570
+ socket.once("close", onClose);
571
+ signal.addEventListener("abort", onAbort, { once: true });
572
+ if (signal.aborted) {
573
+ onAbort();
574
+ return promise;
575
+ }
576
+ try {
577
+ socket.write(request);
578
+ } catch {
579
+ onError();
580
+ }
581
+ return promise;
582
+ }
583
+
584
+ export function connectProxiedSocket(
585
+ proxyUrl: string,
586
+ targetUrl: string,
587
+ options: ProxyConnectOptions = {},
588
+ ): Promise<tls.TLSSocket> {
589
+ const { promise, resolve, reject } = Promise.withResolvers<tls.TLSSocket>();
590
+ const sockets = new Set<net.Socket>();
591
+ const abortController = new AbortController();
592
+ const signal = abortController.signal;
593
+ let settled = false;
594
+ let timeout: NodeJS.Timeout | undefined;
595
+
596
+ const addSocket = (socket: net.Socket) => sockets.add(socket);
597
+ const cleanup = () => {
598
+ if (options.signal) options.signal.removeEventListener("abort", onAbort);
599
+ if (timeout !== undefined) clearTimeout(timeout);
600
+ };
601
+ const destroySockets = () => {
602
+ for (const socket of sockets) socket.destroy();
603
+ sockets.clear();
604
+ };
605
+ const fail = (message: string) => {
606
+ if (settled) return;
607
+ settled = true;
608
+ cleanup();
609
+ abortController.abort();
610
+ destroySockets();
611
+ reject(transportError(message));
612
+ };
613
+ const succeed = (socket: tls.TLSSocket) => {
614
+ if (settled) {
615
+ socket.destroy();
616
+ return;
617
+ }
618
+ settled = true;
619
+ cleanup();
620
+ sockets.clear();
621
+ resolve(socket);
622
+ };
623
+ const onAbort = () => fail("Proxy connection aborted");
624
+ if (options.signal?.aborted) {
625
+ fail("Proxy connection aborted");
626
+ return promise;
627
+ }
628
+ if (options.signal) options.signal.addEventListener("abort", onAbort, { once: true });
629
+ if (options.timeoutMs !== undefined && Number.isFinite(options.timeoutMs) && options.timeoutMs > 0) {
630
+ timeout = setTimeout(() => fail("Proxy connection timed out"), options.timeoutMs);
631
+ }
632
+
633
+ void (async () => {
634
+ try {
635
+ if (settled) return;
636
+ const proxy = parseProxyUrl(proxyUrl);
637
+ const target = parseTargetUrl(targetUrl);
638
+ let proxySocket: net.Socket = await openTcpSocket(proxy.hostname, proxy.port, signal, addSocket);
639
+ if (proxy.protocol === "https:") {
640
+ proxySocket = await wrapProxyTls(proxySocket, tlsServerName(proxy.hostname), signal, addSocket);
641
+ }
642
+ await issueConnectRequest(proxySocket, target, proxy, signal);
643
+ const targetTls = await wrapProxyTls(proxySocket, target.servername, signal, addSocket, ["h2"]);
644
+ succeed(targetTls);
645
+ } catch (error) {
646
+ if (settled) return;
647
+ const message = error instanceof ProxyTransportError ? error.message : "Proxy connection failed";
648
+ fail(message);
649
+ }
650
+ })();
651
+ return promise;
652
+ }
@@ -0,0 +1,3 @@
1
+ export type HeadersLike = Headers | Record<string, string | undefined> | undefined | null;
2
+ export declare function formatErrorMessageWithRetryAfter(error: unknown, headers?: HeadersLike): string;
3
+ export declare function getRetryAfterMsFromHeaders(headers: HeadersLike): number | undefined;