@fudrouter/fsrouter 0.6.63 → 0.6.64

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 (559) hide show
  1. package/bin/rewriteSseImports.js +5 -1
  2. package/dist/open-sse/executors/cliproxyapi.js +2 -2
  3. package/dist/open-sse/services/rateLimitManager.js +4 -4
  4. package/package.json +1 -1
  5. package/open-sse/AGENTS.md +0 -39
  6. package/open-sse/config/anthropicHeaders.js +0 -87
  7. package/open-sse/config/appConstants.js +0 -238
  8. package/open-sse/config/audioRegistry.js +0 -506
  9. package/open-sse/config/cliFingerprints.js +0 -304
  10. package/open-sse/config/codexInstructions.js +0 -119
  11. package/open-sse/config/codexQuotaScopes.js +0 -42
  12. package/open-sse/config/constants.js +0 -4
  13. package/open-sse/config/contextEditing.js +0 -68
  14. package/open-sse/config/credentialLoader.js +0 -83
  15. package/open-sse/config/defaultThinkingSignature.js +0 -12
  16. package/open-sse/config/embeddingRegistry.js +0 -264
  17. package/open-sse/config/errorConfig.js +0 -96
  18. package/open-sse/config/freeModelCatalog.data.js +0 -121
  19. package/open-sse/config/freeModelCatalog.js +0 -90
  20. package/open-sse/config/freeTierCatalog.js +0 -81
  21. package/open-sse/config/googleTtsLanguages.js +0 -62
  22. package/open-sse/config/imageParamDefs.js +0 -360
  23. package/open-sse/config/imageRegistry.js +0 -493
  24. package/open-sse/config/kiroConstants.js +0 -268
  25. package/open-sse/config/mediaConfig.js +0 -27
  26. package/open-sse/config/mediaServiceKinds.js +0 -71
  27. package/open-sse/config/models.js +0 -13
  28. package/open-sse/config/moderationRegistry.js +0 -71
  29. package/open-sse/config/musicRegistry.js +0 -99
  30. package/open-sse/config/ocrRegistry.js +0 -61
  31. package/open-sse/config/ollamaModels.js +0 -19
  32. package/open-sse/config/providerErrorRules.js +0 -114
  33. package/open-sse/config/providerFieldStrips.js +0 -35
  34. package/open-sse/config/providerHeaderProfiles.js +0 -191
  35. package/open-sse/config/providerModels.js +0 -106
  36. package/open-sse/config/providerRegistry.js +0 -16
  37. package/open-sse/config/providers.js +0 -19
  38. package/open-sse/config/registryUtils.js +0 -106
  39. package/open-sse/config/rerankRegistry.js +0 -177
  40. package/open-sse/config/runtimeConfig.js +0 -96
  41. package/open-sse/config/runway.js +0 -39
  42. package/open-sse/config/searchRegistry.js +0 -153
  43. package/open-sse/config/toolCloaking.js +0 -199
  44. package/open-sse/config/ttsModels.js +0 -129
  45. package/open-sse/config/videoRegistry.js +0 -207
  46. package/open-sse/executors/adapta-web.js +0 -435
  47. package/open-sse/executors/antigravity.js +0 -534
  48. package/open-sse/executors/antigravityUpstreamError.js +0 -13
  49. package/open-sse/executors/auggie.js +0 -437
  50. package/open-sse/executors/azure-openai.js +0 -32
  51. package/open-sse/executors/azure.js +0 -57
  52. package/open-sse/executors/base.js +0 -181
  53. package/open-sse/executors/bedrock.js +0 -633
  54. package/open-sse/executors/blackbox-web.js +0 -578
  55. package/open-sse/executors/chatgpt-web.js +0 -2042
  56. package/open-sse/executors/chipotle.js +0 -357
  57. package/open-sse/executors/claude-web-with-auto-refresh.js +0 -73
  58. package/open-sse/executors/claude-web.js +0 -586
  59. package/open-sse/executors/cliproxyapi.js +0 -296
  60. package/open-sse/executors/cloudflare-ai.js +0 -46
  61. package/open-sse/executors/codebuddy-cn.js +0 -40
  62. package/open-sse/executors/codex.js +0 -1324
  63. package/open-sse/executors/commandCode.js +0 -558
  64. package/open-sse/executors/commandcode.js +0 -88
  65. package/open-sse/executors/copilot-m365-connection.js +0 -176
  66. package/open-sse/executors/copilot-m365-frames.js +0 -192
  67. package/open-sse/executors/copilot-m365-web.js +0 -299
  68. package/open-sse/executors/copilot-web.js +0 -580
  69. package/open-sse/executors/cursor.js +0 -795
  70. package/open-sse/executors/deepseek-web-with-auto-refresh.js +0 -150
  71. package/open-sse/executors/deepseek-web.js +0 -875
  72. package/open-sse/executors/default.js +0 -430
  73. package/open-sse/executors/devin-cli.js +0 -351
  74. package/open-sse/executors/doubao-web.js +0 -550
  75. package/open-sse/executors/duckduckgo-web.js +0 -629
  76. package/open-sse/executors/forceResponsesUpstream.js +0 -33
  77. package/open-sse/executors/gemini-business.js +0 -320
  78. package/open-sse/executors/gemini-cli.js +0 -89
  79. package/open-sse/executors/gemini-web.js +0 -297
  80. package/open-sse/executors/github.js +0 -379
  81. package/open-sse/executors/gitlab.js +0 -569
  82. package/open-sse/executors/glm.js +0 -361
  83. package/open-sse/executors/grok-cli.js +0 -119
  84. package/open-sse/executors/grok-web.js +0 -345
  85. package/open-sse/executors/huggingchat.js +0 -467
  86. package/open-sse/executors/iflow.js +0 -108
  87. package/open-sse/executors/index.js +0 -78
  88. package/open-sse/executors/inner-ai.js +0 -527
  89. package/open-sse/executors/kimchi.js +0 -123
  90. package/open-sse/executors/kimi-web.js +0 -325
  91. package/open-sse/executors/kimi.js +0 -97
  92. package/open-sse/executors/kiro.js +0 -503
  93. package/open-sse/executors/kiroThinking.js +0 -44
  94. package/open-sse/executors/lmarena.js +0 -395
  95. package/open-sse/executors/mimo-free.js +0 -167
  96. package/open-sse/executors/mimocode.js +0 -392
  97. package/open-sse/executors/ninerouter.js +0 -155
  98. package/open-sse/executors/nlpcloud.js +0 -438
  99. package/open-sse/executors/ollama-local.js +0 -14
  100. package/open-sse/executors/opencode-go.js +0 -41
  101. package/open-sse/executors/opencode.js +0 -32
  102. package/open-sse/executors/perplexity-web.js +0 -581
  103. package/open-sse/executors/poe-web.js +0 -133
  104. package/open-sse/executors/pollinations.js +0 -95
  105. package/open-sse/executors/puter.js +0 -31
  106. package/open-sse/executors/qoder.js +0 -448
  107. package/open-sse/executors/qwen-web.js +0 -372
  108. package/open-sse/executors/qwen.js +0 -129
  109. package/open-sse/executors/t3-chat-web.js +0 -417
  110. package/open-sse/executors/theoldllm.js +0 -290
  111. package/open-sse/executors/trae.js +0 -418
  112. package/open-sse/executors/v0-vercel-web.js +0 -141
  113. package/open-sse/executors/venice-web.js +0 -142
  114. package/open-sse/executors/vertex.js +0 -131
  115. package/open-sse/executors/vertexMedia.js +0 -236
  116. package/open-sse/executors/windsurf.js +0 -560
  117. package/open-sse/executors/xai.js +0 -46
  118. package/open-sse/executors/xiaomi-tokenplan.js +0 -19
  119. package/open-sse/executors/yuanbao-web.js +0 -385
  120. package/open-sse/executors/zed-hosted.js +0 -281
  121. package/open-sse/executors/zenmux-free.js +0 -247
  122. package/open-sse/handlers/audioSpeech.js +0 -759
  123. package/open-sse/handlers/audioTranscription.js +0 -395
  124. package/open-sse/handlers/audioTranslation.js +0 -181
  125. package/open-sse/handlers/chatCore/nonStreamingHandler.js +0 -300
  126. package/open-sse/handlers/chatCore/requestDetail.js +0 -102
  127. package/open-sse/handlers/chatCore/sseToJsonHandler.js +0 -231
  128. package/open-sse/handlers/chatCore/streamingHandler.js +0 -95
  129. package/open-sse/handlers/chatCore.js +0 -404
  130. package/open-sse/handlers/embeddingProviders/_base.js +0 -4
  131. package/open-sse/handlers/embeddingProviders/gemini.js +0 -54
  132. package/open-sse/handlers/embeddingProviders/index.js +0 -23
  133. package/open-sse/handlers/embeddingProviders/openai.js +0 -39
  134. package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +0 -13
  135. package/open-sse/handlers/embeddingsCore.js +0 -126
  136. package/open-sse/handlers/fetch/index.js +0 -237
  137. package/open-sse/handlers/imageGenerationCore.js +0 -230
  138. package/open-sse/handlers/imageProviders/_base.js +0 -31
  139. package/open-sse/handlers/imageProviders/antigravity.js +0 -73
  140. package/open-sse/handlers/imageProviders/blackForestLabs.js +0 -63
  141. package/open-sse/handlers/imageProviders/cloudflareAi.js +0 -207
  142. package/open-sse/handlers/imageProviders/codex.js +0 -217
  143. package/open-sse/handlers/imageProviders/comfyui.js +0 -25
  144. package/open-sse/handlers/imageProviders/falAi.js +0 -62
  145. package/open-sse/handlers/imageProviders/gemini.js +0 -40
  146. package/open-sse/handlers/imageProviders/huggingface.js +0 -38
  147. package/open-sse/handlers/imageProviders/index.js +0 -44
  148. package/open-sse/handlers/imageProviders/leonardo.js +0 -435
  149. package/open-sse/handlers/imageProviders/nanobanana.js +0 -79
  150. package/open-sse/handlers/imageProviders/openai.js +0 -61
  151. package/open-sse/handlers/imageProviders/runwayml.js +0 -72
  152. package/open-sse/handlers/imageProviders/sdwebui.js +0 -36
  153. package/open-sse/handlers/imageProviders/stabilityAi.js +0 -59
  154. package/open-sse/handlers/imageProviders/weavy.js +0 -222
  155. package/open-sse/handlers/moderations.js +0 -92
  156. package/open-sse/handlers/ocr.js +0 -89
  157. package/open-sse/handlers/rerank.js +0 -223
  158. package/open-sse/handlers/responseSanitizer/reasoning.js +0 -144
  159. package/open-sse/handlers/responsesHandler.js +0 -99
  160. package/open-sse/handlers/search/callers.js +0 -371
  161. package/open-sse/handlers/search/chatSearch.js +0 -409
  162. package/open-sse/handlers/search/index.js +0 -201
  163. package/open-sse/handlers/search/normalizers.js +0 -223
  164. package/open-sse/handlers/search.js +0 -1056
  165. package/open-sse/handlers/sseParser.js +0 -469
  166. package/open-sse/handlers/sttCore.js +0 -193
  167. package/open-sse/handlers/ttsCore.js +0 -74
  168. package/open-sse/handlers/ttsProviders/_base.js +0 -39
  169. package/open-sse/handlers/ttsProviders/edgeTts.js +0 -89
  170. package/open-sse/handlers/ttsProviders/elevenlabs.js +0 -48
  171. package/open-sse/handlers/ttsProviders/gemini.js +0 -117
  172. package/open-sse/handlers/ttsProviders/genericFormats.js +0 -169
  173. package/open-sse/handlers/ttsProviders/googleTts.js +0 -54
  174. package/open-sse/handlers/ttsProviders/index.js +0 -50
  175. package/open-sse/handlers/ttsProviders/localDevice.js +0 -87
  176. package/open-sse/handlers/ttsProviders/minimax.js +0 -59
  177. package/open-sse/handlers/ttsProviders/openai.js +0 -30
  178. package/open-sse/handlers/ttsProviders/openrouter.js +0 -70
  179. package/open-sse/handlers/usageExtractor.js +0 -93
  180. package/open-sse/handlers/videoGenerationCore.js +0 -119
  181. package/open-sse/handlers/videoProviders/index.js +0 -22
  182. package/open-sse/handlers/videoProviders/leonardo.js +0 -511
  183. package/open-sse/handlers/videoProviders/weavy.js +0 -198
  184. package/open-sse/handlers/webFetch.js +0 -200
  185. package/open-sse/index.js +0 -79
  186. package/open-sse/mcp-server/audit.js +0 -283
  187. package/open-sse/mcp-server/catalog.js +0 -184
  188. package/open-sse/mcp-server/descriptionCompressor.js +0 -175
  189. package/open-sse/mcp-server/httpAuthContext.js +0 -32
  190. package/open-sse/mcp-server/httpTransport.js +0 -229
  191. package/open-sse/mcp-server/index.js +0 -33
  192. package/open-sse/mcp-server/mcpCallerIdentity.js +0 -21
  193. package/open-sse/mcp-server/runtimeHeartbeat.js +0 -110
  194. package/open-sse/mcp-server/schemas/a2a.js +0 -153
  195. package/open-sse/mcp-server/schemas/audit.js +0 -17
  196. package/open-sse/mcp-server/schemas/index.js +0 -166
  197. package/open-sse/mcp-server/schemas/pickFastestModel.js +0 -90
  198. package/open-sse/mcp-server/schemas/toolDefinition.js +0 -0
  199. package/open-sse/mcp-server/schemas/toolSearch.js +0 -32
  200. package/open-sse/mcp-server/schemas/tools.js +0 -1219
  201. package/open-sse/mcp-server/scopeEnforcement.js +0 -80
  202. package/open-sse/mcp-server/server.js +0 -1168
  203. package/open-sse/mcp-server/toolCardinality.js +0 -78
  204. package/open-sse/mcp-server/toolSearch/catalog.js +0 -66
  205. package/open-sse/mcp-server/toolSearch/handler.js +0 -20
  206. package/open-sse/mcp-server/toolSearch/index.js +0 -10
  207. package/open-sse/mcp-server/toolSearch/register.js +0 -21
  208. package/open-sse/mcp-server/toolSearch/search.js +0 -55
  209. package/open-sse/mcp-server/toolSearch/signature.js +0 -67
  210. package/open-sse/mcp-server/tools/advancedTools.js +0 -893
  211. package/open-sse/mcp-server/tools/agentSkillTools.js +0 -69
  212. package/open-sse/mcp-server/tools/compressionTools.js +0 -309
  213. package/open-sse/mcp-server/tools/gamificationTools.js +0 -134
  214. package/open-sse/mcp-server/tools/githubSkillTools.js +0 -102
  215. package/open-sse/mcp-server/tools/memoryTools.js +0 -118
  216. package/open-sse/mcp-server/tools/notionTools.js +0 -101
  217. package/open-sse/mcp-server/tools/obsidianTools.js +0 -307
  218. package/open-sse/mcp-server/tools/pickFastestModel.js +0 -223
  219. package/open-sse/mcp-server/tools/pluginTools.js +0 -181
  220. package/open-sse/mcp-server/tools/poolTools.js +0 -139
  221. package/open-sse/mcp-server/tools/skillTools.js +0 -113
  222. package/open-sse/package.json +0 -10
  223. package/open-sse/providers/REGISTRY_TEMPLATE.js +0 -98
  224. package/open-sse/providers/capabilities.js +0 -293
  225. package/open-sse/providers/index.js +0 -51
  226. package/open-sse/providers/models/helpers.js +0 -20
  227. package/open-sse/providers/models/namePatterns.js +0 -33
  228. package/open-sse/providers/models/schema.js +0 -40
  229. package/open-sse/providers/pricing.js +0 -308
  230. package/open-sse/providers/registry/alicode-intl.js +0 -30
  231. package/open-sse/providers/registry/alicode.js +0 -31
  232. package/open-sse/providers/registry/anthropic.js +0 -37
  233. package/open-sse/providers/registry/antigravity.js +0 -81
  234. package/open-sse/providers/registry/assemblyai.js +0 -38
  235. package/open-sse/providers/registry/aws-polly.js +0 -45
  236. package/open-sse/providers/registry/azure.js +0 -21
  237. package/open-sse/providers/registry/black-forest-labs.js +0 -32
  238. package/open-sse/providers/registry/blackbox.js +0 -41
  239. package/open-sse/providers/registry/brave-search.js +0 -35
  240. package/open-sse/providers/registry/byteplus.js +0 -35
  241. package/open-sse/providers/registry/cartesia.js +0 -36
  242. package/open-sse/providers/registry/cerebras.js +0 -31
  243. package/open-sse/providers/registry/chutes.js +0 -24
  244. package/open-sse/providers/registry/claude.js +0 -87
  245. package/open-sse/providers/registry/cline.js +0 -51
  246. package/open-sse/providers/registry/clinepass.js +0 -57
  247. package/open-sse/providers/registry/cloudflare-ai.js +0 -55
  248. package/open-sse/providers/registry/codebuddy-cn.js +0 -77
  249. package/open-sse/providers/registry/codex.js +0 -100
  250. package/open-sse/providers/registry/cohere.js +0 -27
  251. package/open-sse/providers/registry/comfyui.js +0 -20
  252. package/open-sse/providers/registry/commandcode.js +0 -43
  253. package/open-sse/providers/registry/coqui.js +0 -30
  254. package/open-sse/providers/registry/cursor.js +0 -58
  255. package/open-sse/providers/registry/deepgram.js +0 -33
  256. package/open-sse/providers/registry/deepseek.js +0 -51
  257. package/open-sse/providers/registry/digitalocean.js +0 -92
  258. package/open-sse/providers/registry/edge-tts.js +0 -24
  259. package/open-sse/providers/registry/elevenlabs.js +0 -35
  260. package/open-sse/providers/registry/exa.js +0 -50
  261. package/open-sse/providers/registry/fal-ai.js +0 -34
  262. package/open-sse/providers/registry/featherless.js +0 -34
  263. package/open-sse/providers/registry/firecrawl.js +0 -34
  264. package/open-sse/providers/registry/fireworks.js +0 -29
  265. package/open-sse/providers/registry/gemini-cli.js +0 -58
  266. package/open-sse/providers/registry/gemini.js +0 -83
  267. package/open-sse/providers/registry/github.js +0 -88
  268. package/open-sse/providers/registry/gitlab.js +0 -32
  269. package/open-sse/providers/registry/glm-cn.js +0 -35
  270. package/open-sse/providers/registry/glm.js +0 -58
  271. package/open-sse/providers/registry/google-pse.js +0 -35
  272. package/open-sse/providers/registry/google-tts.js +0 -24
  273. package/open-sse/providers/registry/grok-cli.js +0 -86
  274. package/open-sse/providers/registry/grok-web.js +0 -39
  275. package/open-sse/providers/registry/groq.js +0 -37
  276. package/open-sse/providers/registry/huggingface.js +0 -34
  277. package/open-sse/providers/registry/hyperbolic.js +0 -35
  278. package/open-sse/providers/registry/ibm-bob.js +0 -27
  279. package/open-sse/providers/registry/iflow.js +0 -52
  280. package/open-sse/providers/registry/index.js +0 -210
  281. package/open-sse/providers/registry/inworld.js +0 -36
  282. package/open-sse/providers/registry/jina-ai.js +0 -42
  283. package/open-sse/providers/registry/jina-reader.js +0 -34
  284. package/open-sse/providers/registry/kilocode.js +0 -51
  285. package/open-sse/providers/registry/kimchi.js +0 -49
  286. package/open-sse/providers/registry/kimi-coding.js +0 -65
  287. package/open-sse/providers/registry/kimi.js +0 -56
  288. package/open-sse/providers/registry/kiro.js +0 -115
  289. package/open-sse/providers/registry/linkup.js +0 -34
  290. package/open-sse/providers/registry/local-device.js +0 -24
  291. package/open-sse/providers/registry/mimo-free.js +0 -24
  292. package/open-sse/providers/registry/minimax-cn.js +0 -76
  293. package/open-sse/providers/registry/minimax.js +0 -83
  294. package/open-sse/providers/registry/mistral.js +0 -34
  295. package/open-sse/providers/registry/mmf.js +0 -19
  296. package/open-sse/providers/registry/nanobanana.js +0 -35
  297. package/open-sse/providers/registry/nebius.js +0 -27
  298. package/open-sse/providers/registry/nvidia.js +0 -43
  299. package/open-sse/providers/registry/ollama-local.js +0 -19
  300. package/open-sse/providers/registry/ollama.js +0 -36
  301. package/open-sse/providers/registry/openai.js +0 -84
  302. package/open-sse/providers/registry/opencode-go.js +0 -41
  303. package/open-sse/providers/registry/opencode.js +0 -25
  304. package/open-sse/providers/registry/openrouter.js +0 -60
  305. package/open-sse/providers/registry/perplexity-agent.js +0 -49
  306. package/open-sse/providers/registry/perplexity-web.js +0 -33
  307. package/open-sse/providers/registry/perplexity.js +0 -37
  308. package/open-sse/providers/registry/playht.js +0 -36
  309. package/open-sse/providers/registry/qoder.js +0 -54
  310. package/open-sse/providers/registry/qwen.js +0 -33
  311. package/open-sse/providers/registry/recraft.js +0 -24
  312. package/open-sse/providers/registry/runwayml.js +0 -30
  313. package/open-sse/providers/registry/sdwebui.js +0 -20
  314. package/open-sse/providers/registry/searchapi.js +0 -35
  315. package/open-sse/providers/registry/searxng.js +0 -35
  316. package/open-sse/providers/registry/serper.js +0 -35
  317. package/open-sse/providers/registry/siliconflow.js +0 -39
  318. package/open-sse/providers/registry/stability-ai.js +0 -31
  319. package/open-sse/providers/registry/tavily.js +0 -50
  320. package/open-sse/providers/registry/together.js +0 -31
  321. package/open-sse/providers/registry/topaz.js +0 -19
  322. package/open-sse/providers/registry/tortoise.js +0 -30
  323. package/open-sse/providers/registry/venice.js +0 -56
  324. package/open-sse/providers/registry/vercel-ai-gateway.js +0 -41
  325. package/open-sse/providers/registry/vertex-partner.js +0 -29
  326. package/open-sse/providers/registry/vertex.js +0 -32
  327. package/open-sse/providers/registry/volcengine-ark.js +0 -35
  328. package/open-sse/providers/registry/voyage-ai.js +0 -30
  329. package/open-sse/providers/registry/xai.js +0 -45
  330. package/open-sse/providers/registry/xiaomi-mimo.js +0 -46
  331. package/open-sse/providers/registry/xiaomi-tokenplan.js +0 -63
  332. package/open-sse/providers/registry/youcom.js +0 -35
  333. package/open-sse/providers/schema.js +0 -76
  334. package/open-sse/providers/shared.js +0 -74
  335. package/open-sse/providers/thinkingLevels.js +0 -48
  336. package/open-sse/rtk/applyFilter.js +0 -15
  337. package/open-sse/rtk/autodetect.js +0 -111
  338. package/open-sse/rtk/caveman.js +0 -100
  339. package/open-sse/rtk/cavemanPrompts.js +0 -78
  340. package/open-sse/rtk/constants.js +0 -55
  341. package/open-sse/rtk/filters/buildOutput.js +0 -127
  342. package/open-sse/rtk/filters/dedupLog.js +0 -44
  343. package/open-sse/rtk/filters/find.js +0 -50
  344. package/open-sse/rtk/filters/gitDiff.js +0 -92
  345. package/open-sse/rtk/filters/gitLog.js +0 -99
  346. package/open-sse/rtk/filters/gitStatus.js +0 -117
  347. package/open-sse/rtk/filters/grep.js +0 -48
  348. package/open-sse/rtk/filters/ls.js +0 -79
  349. package/open-sse/rtk/filters/readNumbered.js +0 -27
  350. package/open-sse/rtk/filters/searchList.js +0 -52
  351. package/open-sse/rtk/filters/smartTruncate.js +0 -15
  352. package/open-sse/rtk/filters/tree.js +0 -32
  353. package/open-sse/rtk/headroom.js +0 -215
  354. package/open-sse/rtk/index.js +0 -155
  355. package/open-sse/rtk/paleo.js +0 -47
  356. package/open-sse/rtk/ponytail.js +0 -9
  357. package/open-sse/rtk/ponytailPrompt.js +0 -52
  358. package/open-sse/rtk/ponytailPrompts.js +0 -76
  359. package/open-sse/rtk/pxpipe.js +0 -104
  360. package/open-sse/rtk/registry.js +0 -38
  361. package/open-sse/rtk/systemInject.js +0 -98
  362. package/open-sse/services/accountFallback.js +0 -323
  363. package/open-sse/services/antigravityHeaders.js +0 -91
  364. package/open-sse/services/antigravityVersion.js +0 -154
  365. package/open-sse/services/clinepassModels.js +0 -63
  366. package/open-sse/services/codexQuotaFetcher.js +0 -312
  367. package/open-sse/services/codexVerbosity.js +0 -30
  368. package/open-sse/services/combo/context.js +0 -12
  369. package/open-sse/services/combo/fingerprintExpansion.js +0 -51
  370. package/open-sse/services/combo/headroomRanking.js +0 -28
  371. package/open-sse/services/combo/quotaExhaustionCutoff.js +0 -87
  372. package/open-sse/services/combo/quotaScoring.js +0 -226
  373. package/open-sse/services/combo/quotaShareConcurrency.js +0 -25
  374. package/open-sse/services/combo/quotaShareInflight.js +0 -50
  375. package/open-sse/services/combo/quotaShareStrategy.js +0 -130
  376. package/open-sse/services/combo/resolveAutoStrategy.js +0 -231
  377. package/open-sse/services/combo/responseValidation.js +0 -140
  378. package/open-sse/services/combo/runtimeUnits.js +0 -195
  379. package/open-sse/services/combo/sessionStickiness.js +0 -128
  380. package/open-sse/services/combo/shadowRouting.js +0 -131
  381. package/open-sse/services/combo/targetExhaustion.js +0 -75
  382. package/open-sse/services/combo/targetSorters.js +0 -126
  383. package/open-sse/services/combo/targetTimeoutRunner.js +0 -65
  384. package/open-sse/services/combo/validateQuality.js +0 -271
  385. package/open-sse/services/combo.js +0 -571
  386. package/open-sse/services/comboAgentMiddleware.js +0 -91
  387. package/open-sse/services/comboConfig.js +0 -153
  388. package/open-sse/services/comboManifestMetrics.js +0 -10
  389. package/open-sse/services/comboMetrics.js +0 -278
  390. package/open-sse/services/compact.js +0 -71
  391. package/open-sse/services/copilotModels.js +0 -155
  392. package/open-sse/services/emergencyFallback.js +0 -109
  393. package/open-sse/services/errorClassifier.js +0 -190
  394. package/open-sse/services/evalRouting.js +0 -201
  395. package/open-sse/services/freeWebSearch.js +0 -4
  396. package/open-sse/services/fusion.js +0 -223
  397. package/open-sse/services/intentClassifier.js +0 -631
  398. package/open-sse/services/kimchiModels.js +0 -176
  399. package/open-sse/services/kiroModels.js +0 -332
  400. package/open-sse/services/model.js +0 -136
  401. package/open-sse/services/modelCapabilities.js +0 -5
  402. package/open-sse/services/modelDeprecation.js +0 -101
  403. package/open-sse/services/modelFamilyFallback.js +0 -166
  404. package/open-sse/services/oauthCredentialManager.js +0 -156
  405. package/open-sse/services/pipeline.js +0 -107
  406. package/open-sse/services/projectId.js +0 -306
  407. package/open-sse/services/provider.js +0 -169
  408. package/open-sse/services/providerCooldownTracker.js +0 -94
  409. package/open-sse/services/providerDefaultRateLimit.js +0 -11
  410. package/open-sse/services/proxyAutoSelector.js +0 -24
  411. package/open-sse/services/qoderModels.js +0 -214
  412. package/open-sse/services/quotaFetchThrottle.js +0 -103
  413. package/open-sse/services/quotaMonitor.js +0 -310
  414. package/open-sse/services/quotaPreflight.js +0 -266
  415. package/open-sse/services/rateLimitManager/headers.js +0 -56
  416. package/open-sse/services/rateLimitManager.js +0 -616
  417. package/open-sse/services/rateLimitSemaphore.js +0 -112
  418. package/open-sse/services/responsesInputSanitizer.js +0 -99
  419. package/open-sse/services/slidingWindowLimiter.js +0 -44
  420. package/open-sse/services/streamRecovery.js +0 -355
  421. package/open-sse/services/taskAwareRouter.js +0 -227
  422. package/open-sse/services/taskAwareRouting.js +0 -332
  423. package/open-sse/services/thinkingBudget.js +0 -247
  424. package/open-sse/services/tokenRefresh/dedup.js +0 -31
  425. package/open-sse/services/tokenRefresh/providers.js +0 -624
  426. package/open-sse/services/tokenRefresh.js +0 -254
  427. package/open-sse/services/usage/claude.js +0 -147
  428. package/open-sse/services/usage/codebuddy-cn.js +0 -138
  429. package/open-sse/services/usage/codex.js +0 -267
  430. package/open-sse/services/usage/github.js +0 -100
  431. package/open-sse/services/usage/google.js +0 -241
  432. package/open-sse/services/usage/grok-cli.js +0 -274
  433. package/open-sse/services/usage/kiro.js +0 -188
  434. package/open-sse/services/usage/minimax.js +0 -234
  435. package/open-sse/services/usage/misc.js +0 -288
  436. package/open-sse/services/usage/shared.js +0 -70
  437. package/open-sse/services/usage.js +0 -62
  438. package/open-sse/services/usageDb.js +0 -2
  439. package/open-sse/services/webSearchRouting.js +0 -25
  440. package/open-sse/services/wildcardRouter.js +0 -59
  441. package/open-sse/shared/clineAuth.js +0 -37
  442. package/open-sse/shared/machineId.js +0 -19
  443. package/open-sse/shared/qoder/constants.js +0 -64
  444. package/open-sse/shared/qoder/cosy.js +0 -175
  445. package/open-sse/shared/qoder/encoding.js +0 -55
  446. package/open-sse/transformer/responsesTransformer.js +0 -439
  447. package/open-sse/transformer/streamToJsonConverter.js +0 -103
  448. package/open-sse/translator/concerns/chunk.js +0 -11
  449. package/open-sse/translator/concerns/finishReason.js +0 -63
  450. package/open-sse/translator/concerns/image.js +0 -124
  451. package/open-sse/translator/concerns/json.js +0 -5
  452. package/open-sse/translator/concerns/message.js +0 -7
  453. package/open-sse/translator/concerns/modality.js +0 -155
  454. package/open-sse/translator/concerns/paramSupport.js +0 -75
  455. package/open-sse/translator/concerns/prefetch.js +0 -96
  456. package/open-sse/translator/concerns/reasoning.js +0 -24
  457. package/open-sse/translator/concerns/thinking.js +0 -53
  458. package/open-sse/translator/concerns/thinkingUnified.js +0 -329
  459. package/open-sse/translator/concerns/toolCall.js +0 -153
  460. package/open-sse/translator/concerns/usage.js +0 -69
  461. package/open-sse/translator/formats/claude.js +0 -368
  462. package/open-sse/translator/formats/gemini.js +0 -380
  463. package/open-sse/translator/formats/maxTokens.js +0 -34
  464. package/open-sse/translator/formats/openai.js +0 -134
  465. package/open-sse/translator/formats/responsesApi.js +0 -141
  466. package/open-sse/translator/formats.js +0 -36
  467. package/open-sse/translator/helpers/claudeHelper.js +0 -216
  468. package/open-sse/translator/helpers/geminiHelper.js +0 -372
  469. package/open-sse/translator/helpers/imageHelper.js +0 -34
  470. package/open-sse/translator/helpers/maxTokensHelper.js +0 -27
  471. package/open-sse/translator/helpers/openaiHelper.js +0 -130
  472. package/open-sse/translator/helpers/responsesApiHelper.js +0 -139
  473. package/open-sse/translator/helpers/toolCallHelper.js +0 -148
  474. package/open-sse/translator/index.js +0 -252
  475. package/open-sse/translator/request/antigravity-to-openai.js +0 -242
  476. package/open-sse/translator/request/claude-to-kiro.js +0 -478
  477. package/open-sse/translator/request/claude-to-openai.js +0 -263
  478. package/open-sse/translator/request/gemini-to-openai.js +0 -152
  479. package/open-sse/translator/request/openai-responses.js +0 -385
  480. package/open-sse/translator/request/openai-to-claude.js +0 -383
  481. package/open-sse/translator/request/openai-to-commandcode.js +0 -176
  482. package/open-sse/translator/request/openai-to-cursor.js +0 -185
  483. package/open-sse/translator/request/openai-to-gemini.js +0 -442
  484. package/open-sse/translator/request/openai-to-kiro.js +0 -607
  485. package/open-sse/translator/request/openai-to-kiro.old.js +0 -278
  486. package/open-sse/translator/request/openai-to-ollama.js +0 -195
  487. package/open-sse/translator/request/openai-to-vertex.js +0 -42
  488. package/open-sse/translator/response/claude-to-openai.js +0 -195
  489. package/open-sse/translator/response/commandcode-to-openai.js +0 -188
  490. package/open-sse/translator/response/cursor-to-openai.js +0 -30
  491. package/open-sse/translator/response/gemini-to-openai.js +0 -147
  492. package/open-sse/translator/response/kiro-to-claude.js +0 -261
  493. package/open-sse/translator/response/kiro-to-openai.js +0 -160
  494. package/open-sse/translator/response/ollama-to-openai.js +0 -134
  495. package/open-sse/translator/response/openai-responses.js +0 -535
  496. package/open-sse/translator/response/openai-to-antigravity.js +0 -123
  497. package/open-sse/translator/response/openai-to-claude.js +0 -265
  498. package/open-sse/translator/schema/blocks.js +0 -43
  499. package/open-sse/translator/schema/defaults.js +0 -7
  500. package/open-sse/translator/schema/finishReasons.js +0 -27
  501. package/open-sse/translator/schema/index.js +0 -8
  502. package/open-sse/translator/schema/roles.js +0 -16
  503. package/open-sse/utils/agentGoalPolicy.js +0 -85
  504. package/open-sse/utils/aiSdkCompat.js +0 -75
  505. package/open-sse/utils/bypassHandler.js +0 -298
  506. package/open-sse/utils/cacheControlPolicy.js +0 -189
  507. package/open-sse/utils/claudeCloaking.js +0 -155
  508. package/open-sse/utils/claudeHeaderCache.js +0 -70
  509. package/open-sse/utils/claudeSignature.js +0 -41
  510. package/open-sse/utils/clientDetector.js +0 -63
  511. package/open-sse/utils/codebuddySanitizer.js +0 -96
  512. package/open-sse/utils/composerToolCalls.js +0 -158
  513. package/open-sse/utils/cors.js +0 -13
  514. package/open-sse/utils/cursorChecksum.js +0 -149
  515. package/open-sse/utils/cursorImages.js +0 -224
  516. package/open-sse/utils/cursorProtobuf.js +0 -904
  517. package/open-sse/utils/cursorVersionDetector.js +0 -55
  518. package/open-sse/utils/debugLog.js +0 -14
  519. package/open-sse/utils/diagnostics.js +0 -143
  520. package/open-sse/utils/error.js +0 -164
  521. package/open-sse/utils/estimateSize.js +0 -33
  522. package/open-sse/utils/finishReason.js +0 -32
  523. package/open-sse/utils/flattenToolHistory.js +0 -68
  524. package/open-sse/utils/headers.js +0 -36
  525. package/open-sse/utils/heapPressure.js +0 -35
  526. package/open-sse/utils/jsonToSse.js +0 -125
  527. package/open-sse/utils/keepaliveThreshold.js +0 -40
  528. package/open-sse/utils/logger.js +0 -104
  529. package/open-sse/utils/noThinkingAlias.js +0 -74
  530. package/open-sse/utils/number.js +0 -7
  531. package/open-sse/utils/ollamaTransform.js +0 -85
  532. package/open-sse/utils/opencodeHeaders.js +0 -47
  533. package/open-sse/utils/progressTracker.js +0 -81
  534. package/open-sse/utils/providerRequestLogging.js +0 -219
  535. package/open-sse/utils/proxyFetch.js +0 -369
  536. package/open-sse/utils/reasoningContentInjector.js +0 -79
  537. package/open-sse/utils/reasoningFields.js +0 -70
  538. package/open-sse/utils/requestLogger.js +0 -260
  539. package/open-sse/utils/responsesInputNormalization.js +0 -92
  540. package/open-sse/utils/responsesStatePolicy.js +0 -52
  541. package/open-sse/utils/responsesStreamHelpers.js +0 -49
  542. package/open-sse/utils/sessionManager.js +0 -240
  543. package/open-sse/utils/sleep.js +0 -6
  544. package/open-sse/utils/sse.js +0 -14
  545. package/open-sse/utils/sseConstants.js +0 -23
  546. package/open-sse/utils/sseHeartbeat.js +0 -104
  547. package/open-sse/utils/stream.js +0 -517
  548. package/open-sse/utils/streamFailureFinalization.js +0 -134
  549. package/open-sse/utils/streamHandler.js +0 -250
  550. package/open-sse/utils/streamHelpers.js +0 -137
  551. package/open-sse/utils/textualToolCall.js +0 -104
  552. package/open-sse/utils/thinkCloseMarker.js +0 -72
  553. package/open-sse/utils/thinkTagParser.js +0 -146
  554. package/open-sse/utils/toolCallArguments.js +0 -12
  555. package/open-sse/utils/toolDeduper.js +0 -49
  556. package/open-sse/utils/toolSources.js +0 -31
  557. package/open-sse/utils/upstreamResponseHeaders.js +0 -25
  558. package/open-sse/utils/urlSanitize.js +0 -15
  559. package/open-sse/utils/usageTracking.js +0 -347
@@ -1,219 +0,0 @@
1
- import { AsyncLocalStorage } from "node:async_hooks";
2
-
3
- import { updatePendingScope } from '../../../dist/lib/usage/pendingRequestScope.js';
4
-
5
- const CAPTURE_STATE_KEY = Symbol.for("omniroute.providerRequestCapture.state");
6
-
7
- function getCaptureState() {
8
- const scopedGlobal = globalThis;
9
-
10
- if (!scopedGlobal[CAPTURE_STATE_KEY]) {
11
- scopedGlobal[CAPTURE_STATE_KEY] = {
12
- context: new AsyncLocalStorage(),
13
- wrappedFetch: null,
14
- wrappedInnerFetch: null,
15
- };
16
- }
17
- return scopedGlobal[CAPTURE_STATE_KEY];
18
- }
19
-
20
- const captureState = getCaptureState();
21
- const BODY_METHODS = new Set(["POST", "PUT", "PATCH"]);
22
- const AUTH_BODY_KEYS = new Set([
23
- "access_token",
24
- "client_secret",
25
- "grant_type",
26
- "id_token",
27
- "refresh_token",
28
- ]);
29
- const REQUEST_BODY_KEYS = new Set([
30
- "conversationId",
31
- "conversation_id",
32
- "contents",
33
- "input",
34
- "messages",
35
- "model",
36
- "prompt",
37
- "request",
38
- "tools",
39
- "userSelectedModel",
40
- ]);
41
-
42
- export function parseBody(bodyString) {
43
- try {
44
- return JSON.parse(bodyString);
45
- } catch {
46
- return bodyString;
47
- }
48
- }
49
-
50
- async function capturePreparedRequest(requestCapture, url, headers, body, bodyString, log) {
51
- if (!requestCapture) return;
52
- const latest = requestCapture.latest?.();
53
- if (latest?.url === url && latest.bodyString === bodyString) return;
54
-
55
- try {
56
- await requestCapture.capture({ url, headers, body, bodyString });
57
- } catch (error) {
58
- log?.warn?.(
59
- "REQUEST_LOG",
60
- `Provider request logging hook failed: ${error instanceof Error ? error.message : String(error)}`
61
- );
62
- }
63
- }
64
-
65
- export function captureCurrentProviderRequest(url, headers, body, bodyString, log) {
66
- return capturePreparedRequest(
67
- captureState.context.getStore(),
68
- url,
69
- headers,
70
- body,
71
- bodyString,
72
- log
73
- );
74
- }
75
-
76
- export function captureCurrentProviderBody(url, headers, bodyString, log) {
77
- return captureCurrentProviderRequest(url, headers, parseBody(bodyString), bodyString, log);
78
- }
79
-
80
- export function runWithCapture(requestCapture, fn) {
81
- installFetchCapture();
82
- return captureState.context.run(requestCapture, fn);
83
- }
84
-
85
- function installFetchCapture() {
86
- if (globalThis.fetch === captureState.wrappedFetch) return;
87
-
88
- captureState.wrappedInnerFetch = globalThis.fetch.bind(globalThis);
89
- captureState.wrappedFetch = async (input, init) => {
90
- const activeCapture = captureState.context.getStore();
91
- if (activeCapture) {
92
- await captureFetchRequest(activeCapture, input, init);
93
- }
94
- return captureState.wrappedInnerFetch(input, init);
95
- };
96
- globalThis.fetch = captureState.wrappedFetch;
97
- }
98
-
99
- async function captureFetchRequest(requestCapture, input, init) {
100
- const method = getFetchMethod(input, init);
101
- if (!BODY_METHODS.has(method)) return;
102
-
103
- const bodyString = bodyToString(init?.body);
104
- if (!bodyString) return;
105
-
106
- const body = parseBody(bodyString);
107
- if (!looksLikeProviderRequestBody(body)) return;
108
-
109
- await capturePreparedRequest(
110
- requestCapture,
111
- getFetchUrl(input),
112
- getFetchHeaders(input, init),
113
- body,
114
- bodyString
115
- );
116
- }
117
-
118
- function getFetchMethod(input, init) {
119
- const method = init?.method || (isRequest(input) ? input.method : "GET");
120
- return String(method || "GET").toUpperCase();
121
- }
122
-
123
- function getFetchUrl(input) {
124
- if (typeof input === "string") return input;
125
- if (input instanceof URL) return input.toString();
126
- if (isRequest(input)) return input.url;
127
- return String(input);
128
- }
129
-
130
- function getFetchHeaders(input, init) {
131
- const headers = new Headers(isRequest(input) ? input.headers : undefined);
132
- if (init?.headers) {
133
- new Headers(init.headers).forEach((value, key) => headers.set(key, value));
134
- }
135
-
136
- const result = {};
137
- headers.forEach((value, key) => {
138
- result[key] = value;
139
- });
140
- return result;
141
- }
142
-
143
- function bodyToString(body) {
144
- if (typeof body === "string") return body;
145
- if (body instanceof URLSearchParams) return body.toString();
146
- if (body instanceof ArrayBuffer) return new TextDecoder().decode(body);
147
- if (ArrayBuffer.isView(body)) {
148
- return new TextDecoder().decode(
149
- body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength)
150
- );
151
- }
152
- return null;
153
- }
154
-
155
- function isRequest(input) {
156
- return typeof Request !== "undefined" && input instanceof Request;
157
- }
158
-
159
- function looksLikeProviderRequestBody(body) {
160
- if (!body || typeof body !== "object" || Array.isArray(body)) return false;
161
- const record = body;
162
-
163
- if (Object.keys(record).some((key) => AUTH_BODY_KEYS.has(key))) return false;
164
- if (Object.keys(record).some((key) => REQUEST_BODY_KEYS.has(key))) return true;
165
-
166
- return (
167
- typeof record.query === "string" && !!record.variables && typeof record.variables === "object"
168
- );
169
- }
170
-
171
- export function createPreparedRequestLogger(reqLogger, scope) {
172
- let latest = null;
173
- return {
174
- capture(request) {
175
- latest = request;
176
- reqLogger.logTargetRequest(request.url, request.headers, request.body);
177
- updatePendingScope(scope, {
178
- providerRequest: request.body,
179
- providerUrl: request.url,
180
- stage: "sending_to_provider",
181
- });
182
- },
183
- body(fallback) {
184
- const resolved = latest?.body ?? fallback;
185
- // #4091: the captured body is rebuilt from the serialized upstream payload
186
- // (the fetch-capture does `JSON.parse(JSON.stringify(...))`), which drops
187
- // non-enumerable properties. The native-Claude tool-name cloak stashes its
188
- // per-request alias→original map as a NON-ENUMERABLE `_toolNameMap` on the
189
- // real (fallback) transformed body; without it the response-side un-cloak
190
- // (`mergeResponseToolNameMap` → `remapToolNamesInResponse`) can't restore
191
- // MCP / snake_case tool names, so Claude Code receives the cloaked
192
- // PascalCase name and rejects every call with "No such tool available".
193
- // Re-attach the map onto the resolved (captured) body — kept non-enumerable
194
- // so it still never re-serializes into an upstream request.
195
- if (
196
- resolved !== fallback &&
197
- resolved &&
198
- typeof resolved === "object" &&
199
- fallback &&
200
- typeof fallback === "object"
201
- ) {
202
- const map = fallback._toolNameMap;
203
- const target = resolved;
204
- if (map instanceof Map && !(target._toolNameMap instanceof Map)) {
205
- Object.defineProperty(target, "_toolNameMap", {
206
- value: map,
207
- enumerable: false,
208
- configurable: true,
209
- writable: true,
210
- });
211
- }
212
- }
213
- return resolved;
214
- },
215
- latest() {
216
- return latest;
217
- },
218
- };
219
- }
@@ -1,369 +0,0 @@
1
- import { Readable } from "stream";
2
- import { MEMORY_CONFIG } from "../config/runtimeConfig.js";
3
- import { dbg } from "./debugLog.js";
4
-
5
- const originalFetch = globalThis.fetch;
6
- const proxyDispatchers = new Map();
7
-
8
- // ─── TLS fingerprinting via got-scraping (browser-like JA3) ───────────────
9
- // Disabled: not in use. Kept commented for future re-enable.
10
- // Restore the original block to re-enable per-host JA3 spoofing.
11
- /*
12
- let _gotScraping = null;
13
- let _gotScrapingChecked = false;
14
- const _gotScrapingLoggedHosts = new Set();
15
-
16
- async function getGotScraping() {
17
- if (_gotScrapingChecked) return _gotScraping;
18
- _gotScrapingChecked = true;
19
- try {
20
- const mod = await import("got-scraping");
21
- _gotScraping = typeof mod.gotScraping === "function" ? mod.gotScraping : null;
22
- if (_gotScraping) dbg("TLS", "got-scraping loaded (browser-like JA3 enabled)");
23
- } catch (e) {
24
- console.warn(`[ProxyFetch] got-scraping unavailable, falling back to native fetch: ${e.message}`);
25
- _gotScraping = null;
26
- }
27
- return _gotScraping;
28
- }
29
-
30
- async function gotScrapingFetch(url, options) {
31
- const gs = await getGotScraping();
32
- if (!gs) return null;
33
-
34
- const method = (options.method || "GET").toUpperCase();
35
- const headersInit = options.headers || {};
36
- const headers = headersInit instanceof Headers
37
- ? Object.fromEntries(headersInit.entries())
38
- : { ...headersInit };
39
-
40
- return new Promise((resolve, reject) => {
41
- let settled = false;
42
- const stream = gs.stream({
43
- url,
44
- method,
45
- headers,
46
- body: method === "GET" || method === "HEAD" ? undefined : options.body,
47
- throwHttpErrors: false,
48
- retry: { limit: 0 },
49
- timeout: { request: undefined },
50
- followRedirect: false,
51
- decompress: true,
52
- });
53
-
54
- if (options.signal) {
55
- const onAbort = () => { try { stream.destroy(new Error("aborted")); } catch { } };
56
- if (options.signal.aborted) onAbort();
57
- else options.signal.addEventListener("abort", onAbort, { once: true });
58
- }
59
-
60
- stream.once("response", (res) => {
61
- if (settled) return;
62
- settled = true;
63
- const resHeaders = new Headers();
64
- for (const [k, v] of Object.entries(res.headers || {})) {
65
- if (Array.isArray(v)) v.forEach((x) => resHeaders.append(k, String(x)));
66
- else if (v != null) resHeaders.set(k, String(v));
67
- }
68
- const body = Readable.toWeb(stream);
69
- resolve(new Response(body, { status: res.statusCode, statusText: res.statusMessage || "", headers: resHeaders }));
70
- });
71
-
72
- stream.once("error", (err) => {
73
- if (settled) return;
74
- settled = true;
75
- reject(err);
76
- });
77
- });
78
- }
79
-
80
- async function tryGotScrapingFetch(url, options) {
81
- try {
82
- const res = await gotScrapingFetch(url, options);
83
- if (res) {
84
- try {
85
- const host = new URL(typeof url === "string" ? url : url.toString()).hostname;
86
- if (!_gotScrapingLoggedHosts.has(host)) {
87
- _gotScrapingLoggedHosts.add(host);
88
- dbg("TLS", `using got-scraping for ${host}`);
89
- }
90
- } catch { }
91
- }
92
- return res;
93
- } catch (e) {
94
- console.warn(`[ProxyFetch] got-scraping request failed, fallback to native fetch: ${e.message}`);
95
- return null;
96
- }
97
- }
98
- */
99
-
100
- // DNS cache — use Map to avoid prototype pollution via malformed hostnames
101
- const DNS_CACHE = new Map();
102
- const MITM_BYPASS_HOSTS = [
103
- "cloudcode-pa.googleapis.com",
104
- "daily-cloudcode-pa.googleapis.com",
105
- "api.individual.githubcopilot.com",
106
- "q.us-east-1.amazonaws.com",
107
- "codewhisperer.us-east-1.amazonaws.com",
108
- "api2.cursor.sh",
109
- "leonardo.ai",
110
- ];
111
- const GOOGLE_DNS_SERVERS = ["8.8.8.8", "8.8.4.4"];
112
- const HTTPS_PORT = 443;
113
- const HTTP_SUCCESS_MIN = 200;
114
- const HTTP_SUCCESS_MAX = 300;
115
-
116
- function normalizeString(value) {
117
- if (value === undefined || value === null) return "";
118
- return String(value).trim();
119
- }
120
-
121
- /**
122
- * Resolve real IP using Google DNS (bypass system DNS)
123
- */
124
- async function resolveRealIP(hostname) {
125
- const cached = DNS_CACHE.get(hostname);
126
- if (cached && Date.now() < cached.expiry) return cached.ip;
127
-
128
- try {
129
- const dns = await import("dns");
130
- const { promisify } = await import("util");
131
- const resolver = new dns.Resolver();
132
- resolver.setServers(GOOGLE_DNS_SERVERS);
133
- const resolve4 = promisify(resolver.resolve4.bind(resolver));
134
- const addresses = await resolve4(hostname);
135
- DNS_CACHE.set(hostname, { ip: addresses[0], expiry: Date.now() + MEMORY_CONFIG.dnsCacheTtlMs });
136
- return addresses[0];
137
- } catch (error) {
138
- console.warn(`[ProxyFetch] DNS resolve failed for ${hostname}:`, error.message);
139
- return null;
140
- }
141
- }
142
-
143
- /**
144
- * Check if request should bypass MITM DNS redirect
145
- */
146
- function shouldBypassMitmDns(url) {
147
- try {
148
- const hostname = new URL(url).hostname;
149
- return MITM_BYPASS_HOSTS.some(host => hostname.includes(host));
150
- } catch { return false; }
151
- }
152
-
153
- function shouldBypassByNoProxy(targetUrl, noProxyValue) {
154
- const noProxy = normalizeString(noProxyValue);
155
- if (!noProxy) return false;
156
-
157
- let hostname;
158
- try { hostname = new URL(targetUrl).hostname.toLowerCase(); } catch { return false; }
159
- const patterns = noProxy.split(",").map((p) => p.trim().toLowerCase()).filter(Boolean);
160
-
161
- return patterns.some((pattern) => {
162
- if (pattern === "*") return true;
163
- if (pattern.startsWith(".")) return hostname.endsWith(pattern) || hostname === pattern.slice(1);
164
- return hostname === pattern || hostname.endsWith(`.${pattern}`);
165
- });
166
- }
167
-
168
- /**
169
- * Get proxy URL from environment
170
- */
171
- function getEnvProxyUrl(targetUrl) {
172
- const noProxy = process.env.NO_PROXY || process.env.no_proxy;
173
- if (shouldBypassByNoProxy(targetUrl, noProxy)) return null;
174
-
175
- let protocol;
176
- try { protocol = new URL(targetUrl).protocol; } catch { return null; }
177
-
178
- if (protocol === "https:") {
179
- return process.env.HTTPS_PROXY || process.env.https_proxy ||
180
- process.env.ALL_PROXY || process.env.all_proxy;
181
- }
182
-
183
- return process.env.HTTP_PROXY || process.env.http_proxy ||
184
- process.env.ALL_PROXY || process.env.all_proxy;
185
- }
186
-
187
- /**
188
- * Normalize proxy URL (allow host:port)
189
- */
190
- function normalizeProxyUrl(proxyUrl) {
191
- const normalizedInput = normalizeString(proxyUrl);
192
- if (!normalizedInput) return null;
193
-
194
- try {
195
-
196
- new URL(normalizedInput);
197
- return normalizedInput;
198
- } catch {
199
- // Allow "127.0.0.1:7890" style values
200
- return `http://${normalizedInput}`;
201
- }
202
- }
203
-
204
- function resolveConnectionProxyUrl(targetUrl, proxyOptions) {
205
- const enabled = proxyOptions?.enabled === true || proxyOptions?.connectionProxyEnabled === true;
206
- if (!enabled) return null;
207
-
208
- const proxyUrlRaw = normalizeString(proxyOptions?.url ?? proxyOptions?.connectionProxyUrl);
209
- if (!proxyUrlRaw) return null;
210
-
211
- const noProxy = normalizeString(proxyOptions?.noProxy ?? proxyOptions?.connectionNoProxy);
212
- if (noProxy && shouldBypassByNoProxy(targetUrl, noProxy)) return null;
213
-
214
- return normalizeProxyUrl(proxyUrlRaw);
215
- }
216
-
217
- /**
218
- * Create proxy dispatcher lazily (undici-compatible)
219
- */
220
- async function getDispatcher(proxyUrl) {
221
- const normalized = normalizeProxyUrl(proxyUrl);
222
- if (!normalized) return null;
223
-
224
- if (!proxyDispatchers.has(normalized)) {
225
- // Evict oldest entry if max size reached
226
- if (proxyDispatchers.size >= MEMORY_CONFIG.proxyDispatchersMaxSize) {
227
- proxyDispatchers.delete(proxyDispatchers.keys().next().value);
228
- }
229
- const { ProxyAgent } = await import("undici");
230
- proxyDispatchers.set(normalized, new ProxyAgent({ uri: normalized }));
231
- }
232
-
233
- return proxyDispatchers.get(normalized);
234
- }
235
-
236
- /**
237
- * Create HTTPS request with manual socket connection (bypass DNS)
238
- */
239
- async function createBypassRequest(parsedUrl, realIP, options) {
240
- const httpsModule = await import("https");
241
- const netModule = await import("net");
242
- // CJS modules expose exports via .default in ESM dynamic import context
243
- const https = httpsModule.default ?? httpsModule;
244
- const net = netModule.default ?? netModule;
245
-
246
- return new Promise((resolve, reject) => {
247
- const socket = new net.Socket();
248
-
249
- socket.connect(HTTPS_PORT, realIP, () => {
250
- const reqOptions = {
251
- socket,
252
- // SNI + cert hostname are validated against the hostname the caller
253
- // asked for, not the IP we connected to. This keeps the DNS-bypass
254
- // (avoiding /etc/hosts MITM) while still rejecting on-path attackers
255
- // that present a different cert. The MITM_BYPASS_HOSTS targets are
256
- // all public-CA-issued (Google / GitHub / AWS / Cursor) so default
257
- // verification works without any extra trust store.
258
- servername: parsedUrl.hostname,
259
- path: parsedUrl.pathname + parsedUrl.search,
260
- method: options.method || "POST",
261
- headers: {
262
- ...options.headers,
263
- Host: parsedUrl.hostname,
264
- },
265
- };
266
-
267
- const req = https.request(reqOptions, (res) => {
268
- const response = {
269
- ok: res.statusCode >= HTTP_SUCCESS_MIN && res.statusCode < HTTP_SUCCESS_MAX,
270
- status: res.statusCode,
271
- statusText: res.statusMessage,
272
- headers: new Map(Object.entries(res.headers)),
273
- body: Readable.toWeb(res),
274
- text: async () => {
275
- const chunks = [];
276
- for await (const chunk of res) chunks.push(chunk);
277
- return Buffer.concat(chunks).toString();
278
- },
279
- json: async () => JSON.parse(await response.text()),
280
- };
281
- resolve(response);
282
- });
283
-
284
- req.on("error", reject);
285
- if (options.body) {
286
- req.write(typeof options.body === "string" ? options.body : JSON.stringify(options.body));
287
- }
288
- req.end();
289
- });
290
-
291
- socket.on("error", reject);
292
- });
293
- }
294
-
295
- export async function proxyAwareFetch(url, options = {}, proxyOptions = null) {
296
- const targetUrl = typeof url === "string" ? url : url.toString();
297
-
298
- // Vercel relay: forward request via relay headers
299
- const vercelRelayUrl = normalizeString(proxyOptions?.vercelRelayUrl);
300
- if (vercelRelayUrl) {
301
- const parsed = new URL(targetUrl);
302
- const relayHeaders = {
303
- ...options.headers,
304
- "x-relay-target": `${parsed.protocol}//${parsed.host}`,
305
- "x-relay-path": `${parsed.pathname}${parsed.search}`,
306
- };
307
- return originalFetch(vercelRelayUrl, { ...options, headers: relayHeaders });
308
- }
309
-
310
- const connectionProxyUrl = resolveConnectionProxyUrl(targetUrl, proxyOptions);
311
- const envProxyUrl = connectionProxyUrl ? null : normalizeProxyUrl(getEnvProxyUrl(targetUrl));
312
- const proxyUrl = connectionProxyUrl || envProxyUrl;
313
-
314
- // MITM DNS bypass: for known MITM-intercepted hosts, resolve real IP to avoid DNS spoof
315
- if (shouldBypassMitmDns(targetUrl)) {
316
- if (proxyUrl) {
317
- // Proxy resolves DNS externally (not affected by /etc/hosts) — use proxy directly
318
- try {
319
- const dispatcher = await getDispatcher(proxyUrl);
320
- return await originalFetch(url, { ...options, dispatcher });
321
- } catch (proxyError) {
322
- if (proxyOptions?.strictProxy === true) {
323
- throw new Error(`[ProxyFetch] Proxy required but failed (strictProxy=true): ${proxyError.message}`);
324
- }
325
- console.warn(`[ProxyFetch] Proxy failed, falling back to direct bypass: ${proxyError.message}`);
326
- }
327
- }
328
- // No proxy — manually resolve real IP to bypass DNS spoof
329
- try {
330
- const parsedUrl = new URL(targetUrl);
331
- const realIP = await resolveRealIP(parsedUrl.hostname);
332
- if (realIP) return await createBypassRequest(parsedUrl, realIP, options);
333
- } catch (error) {
334
- console.warn(`[ProxyFetch] MITM bypass failed: ${error.message}`);
335
- }
336
- }
337
-
338
- if (proxyUrl) {
339
- try {
340
- const dispatcher = await getDispatcher(proxyUrl);
341
- return await originalFetch(url, { ...options, dispatcher });
342
- } catch (proxyError) {
343
- // If strictProxy is enabled, fail hard instead of falling back to direct
344
- if (proxyOptions?.strictProxy === true) {
345
- throw new Error(`[ProxyFetch] Proxy required but failed (strictProxy=true): ${proxyError.message}`);
346
- }
347
- console.warn(`[ProxyFetch] Proxy failed, falling back to direct: ${proxyError.message}`);
348
- return originalFetch(url, options);
349
- }
350
- }
351
-
352
- // got-scraping disabled — use native fetch directly
353
- // (Re-enable per-host by wrapping with tryGotScrapingFetch when needed)
354
- return originalFetch(url, options);
355
- }
356
-
357
- /**
358
- * Patched global fetch with env-proxy support and MITM DNS bypass
359
- */
360
- async function patchedFetch(url, options = {}) {
361
- return proxyAwareFetch(url, options, null);
362
- }
363
-
364
- // Idempotency guard — only patch once to avoid wrapping multiple times
365
- if (globalThis.fetch !== patchedFetch) {
366
- globalThis.fetch = patchedFetch;
367
- }
368
-
369
- export default patchedFetch;
@@ -1,79 +0,0 @@
1
- // Some thinking-mode providers (DeepSeek, Kimi, MiniMax, ...) require reasoning_content
2
- // to be echoed back on assistant messages. Clients in OpenAI format don't send it,
3
- // so we inject a non-empty placeholder to satisfy upstream validation.
4
-
5
- const PLACEHOLDER = " ";
6
-
7
- // Provider-level rules: keyed by executor.provider
8
- const PROVIDER_RULES = {
9
- deepseek: { scope: "all" },
10
- minimax: { scope: "all" },
11
- "minimax-cn": { scope: "all" }
12
- };
13
-
14
- // Model-level rules: matched by predicate against model id
15
- const MODEL_RULES = [
16
- { match: m => /^kimi-/i.test(m || ""), scope: "toolCalls" },
17
- { match: m => /deepseek/i.test(m || ""), scope: "all" }
18
- ];
19
-
20
- const DEEPSEEK_V4_PRO = "deepseek-v4-pro";
21
- const DEEPSEEK_V4_PRO_ALIASES = {
22
- [`${DEEPSEEK_V4_PRO}-max`]: {
23
- thinkingType: "enabled",
24
- reasoningEffort: "max"
25
- },
26
- [`${DEEPSEEK_V4_PRO}-none`]: {
27
- thinkingType: "disabled",
28
- reasoningEffort: null
29
- }
30
- };
31
-
32
- function shouldInject(message, scope) {
33
- if (message?.role !== "assistant") return false;
34
- const rc = message.reasoning_content;
35
- if (typeof rc === "string" && rc.length > 0) return false;
36
- if (scope === "toolCalls") return Array.isArray(message.tool_calls) && message.tool_calls.length > 0;
37
- return true;
38
- }
39
-
40
- function applyRule(body, rule) {
41
- if (!rule || !body?.messages) return body;
42
- const messages = body.messages.map(m =>
43
- shouldInject(m, rule.scope) ? { ...m, reasoning_content: PLACEHOLDER } : m
44
- );
45
- return { ...body, messages };
46
- }
47
-
48
- function applyDeepSeekV4ProAlias({ provider, model, body }) {
49
- const alias = DEEPSEEK_V4_PRO_ALIASES[model];
50
- if (provider !== "deepseek" || !alias || !body) return body;
51
-
52
- const nextBody = {
53
- ...body,
54
- model: DEEPSEEK_V4_PRO,
55
- extra_body: {
56
- ...(body.extra_body || {}),
57
- thinking: {
58
- ...(body.extra_body?.thinking || {}),
59
- type: alias.thinkingType
60
- }
61
- }
62
- };
63
-
64
- if (alias.reasoningEffort) {
65
- nextBody.reasoning_effort = alias.reasoningEffort;
66
- } else {
67
- delete nextBody.reasoning_effort;
68
- }
69
-
70
- return nextBody;
71
- }
72
-
73
- export function injectReasoningContent({ provider, model, body }) {
74
- const providerRule = PROVIDER_RULES[provider];
75
- const modelRule = MODEL_RULES.find(r => r.match(model));
76
- const rule = providerRule || modelRule;
77
- const nextBody = applyDeepSeekV4ProAlias({ provider, model, body });
78
- return applyRule(nextBody, rule);
79
- }