@fudrouter/fsrouter 0.6.58 → 0.6.60

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 (599) hide show
  1. package/bin/copyJs.js +9 -0
  2. package/bin/rewriteSseImports.js +15 -5
  3. package/dist/open-sse/executors/blackbox-web.js +1 -1
  4. package/dist/open-sse/executors/claude-web.js +1 -1
  5. package/dist/open-sse/executors/gitlab.js +1 -1
  6. package/dist/open-sse/executors/huggingchat.js +1 -1
  7. package/dist/open-sse/executors/kimi-web.js +1 -1
  8. package/dist/open-sse/executors/ninerouter.js +2 -2
  9. package/dist/open-sse/executors/qoder.js +3 -3
  10. package/dist/open-sse/executors/qwen-web.js +1 -1
  11. package/dist/open-sse/executors/yuanbao-web.js +1 -1
  12. package/dist/open-sse/handlers/chatCore/nonStreamingHandler.js +1 -1
  13. package/dist/open-sse/handlers/chatCore/requestDetail.js +1 -1
  14. package/dist/open-sse/handlers/chatCore/sseToJsonHandler.js +1 -1
  15. package/dist/open-sse/handlers/chatCore/streamingHandler.js +1 -1
  16. package/dist/open-sse/handlers/chatCore.js +1 -1
  17. package/dist/open-sse/handlers/imageProviders/leonardo.js +1 -1
  18. package/dist/open-sse/handlers/imageProviders/weavy.js +1 -1
  19. package/dist/open-sse/handlers/videoProviders/weavy.js +1 -1
  20. package/dist/open-sse/mcp-server/tools/advancedTools.js +2 -2
  21. package/dist/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
  22. package/dist/open-sse/mcp-server/tools/compressionTools.js +4 -4
  23. package/dist/open-sse/mcp-server/tools/gamificationTools.js +10 -10
  24. package/dist/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
  25. package/dist/open-sse/mcp-server/tools/memoryTools.js +3 -3
  26. package/dist/open-sse/mcp-server/tools/notionTools.js +2 -2
  27. package/dist/open-sse/mcp-server/tools/obsidianTools.js +2 -2
  28. package/dist/open-sse/mcp-server/tools/pickFastestModel.js +1 -1
  29. package/dist/open-sse/mcp-server/tools/pluginTools.js +4 -4
  30. package/dist/open-sse/mcp-server/tools/skillTools.js +2 -2
  31. package/dist/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
  32. package/dist/open-sse/services/combo/quotaShareStrategy.js +1 -1
  33. package/dist/open-sse/services/combo/resolveAutoStrategy.js +1 -1
  34. package/dist/open-sse/services/combo/sessionStickiness.js +1 -1
  35. package/dist/open-sse/services/combo/targetSorters.js +2 -2
  36. package/dist/open-sse/services/combo/validateQuality.js +1 -1
  37. package/dist/open-sse/services/thinkingBudget.js +1 -1
  38. package/dist/open-sse/services/tokenRefresh/providers.js +3 -3
  39. package/dist/open-sse/utils/providerRequestLogging.js +1 -1
  40. package/dist/open-sse/utils/responsesStatePolicy.js +1 -1
  41. package/dist/open-sse/utils/stream.js +1 -1
  42. package/dist/open-sse/utils/streamFailureFinalization.js +1 -1
  43. package/dist/open-sse/utils/usageTracking.js +1 -1
  44. package/package.json +1 -1
  45. package/open-sse/AGENTS.md +0 -39
  46. package/open-sse/config/anthropicHeaders.js +0 -87
  47. package/open-sse/config/appConstants.js +0 -238
  48. package/open-sse/config/audioRegistry.js +0 -506
  49. package/open-sse/config/cliFingerprints.js +0 -304
  50. package/open-sse/config/codexInstructions.js +0 -119
  51. package/open-sse/config/codexQuotaScopes.js +0 -42
  52. package/open-sse/config/constants.js +0 -4
  53. package/open-sse/config/contextEditing.js +0 -68
  54. package/open-sse/config/credentialLoader.js +0 -83
  55. package/open-sse/config/defaultThinkingSignature.js +0 -12
  56. package/open-sse/config/embeddingRegistry.js +0 -264
  57. package/open-sse/config/errorConfig.js +0 -96
  58. package/open-sse/config/freeModelCatalog.data.js +0 -121
  59. package/open-sse/config/freeModelCatalog.js +0 -90
  60. package/open-sse/config/freeTierCatalog.js +0 -81
  61. package/open-sse/config/googleTtsLanguages.js +0 -62
  62. package/open-sse/config/imageParamDefs.js +0 -360
  63. package/open-sse/config/imageRegistry.js +0 -493
  64. package/open-sse/config/kiroConstants.js +0 -268
  65. package/open-sse/config/mediaConfig.js +0 -27
  66. package/open-sse/config/mediaServiceKinds.js +0 -71
  67. package/open-sse/config/models.js +0 -13
  68. package/open-sse/config/moderationRegistry.js +0 -71
  69. package/open-sse/config/musicRegistry.js +0 -99
  70. package/open-sse/config/ocrRegistry.js +0 -61
  71. package/open-sse/config/ollamaModels.js +0 -19
  72. package/open-sse/config/providerErrorRules.js +0 -114
  73. package/open-sse/config/providerFieldStrips.js +0 -35
  74. package/open-sse/config/providerHeaderProfiles.js +0 -191
  75. package/open-sse/config/providerModels.js +0 -106
  76. package/open-sse/config/providerRegistry.js +0 -16
  77. package/open-sse/config/providers.js +0 -19
  78. package/open-sse/config/registryUtils.js +0 -106
  79. package/open-sse/config/rerankRegistry.js +0 -177
  80. package/open-sse/config/runtimeConfig.js +0 -96
  81. package/open-sse/config/runway.js +0 -39
  82. package/open-sse/config/searchRegistry.js +0 -153
  83. package/open-sse/config/toolCloaking.js +0 -199
  84. package/open-sse/config/ttsModels.js +0 -129
  85. package/open-sse/config/videoRegistry.js +0 -207
  86. package/open-sse/executors/adapta-web.js +0 -435
  87. package/open-sse/executors/antigravity.js +0 -534
  88. package/open-sse/executors/antigravityUpstreamError.js +0 -13
  89. package/open-sse/executors/auggie.js +0 -437
  90. package/open-sse/executors/azure-openai.js +0 -32
  91. package/open-sse/executors/azure.js +0 -57
  92. package/open-sse/executors/base.js +0 -181
  93. package/open-sse/executors/bedrock.js +0 -633
  94. package/open-sse/executors/blackbox-web.js +0 -578
  95. package/open-sse/executors/chatgpt-web.js +0 -2042
  96. package/open-sse/executors/chipotle.js +0 -357
  97. package/open-sse/executors/claude-web-with-auto-refresh.js +0 -73
  98. package/open-sse/executors/claude-web.js +0 -586
  99. package/open-sse/executors/cliproxyapi.js +0 -296
  100. package/open-sse/executors/cloudflare-ai.js +0 -46
  101. package/open-sse/executors/codebuddy-cn.js +0 -40
  102. package/open-sse/executors/codex.js +0 -1324
  103. package/open-sse/executors/commandCode.js +0 -558
  104. package/open-sse/executors/commandcode.js +0 -88
  105. package/open-sse/executors/copilot-m365-connection.js +0 -176
  106. package/open-sse/executors/copilot-m365-frames.js +0 -192
  107. package/open-sse/executors/copilot-m365-web.js +0 -299
  108. package/open-sse/executors/copilot-web.js +0 -580
  109. package/open-sse/executors/cursor.js +0 -795
  110. package/open-sse/executors/deepseek-web-with-auto-refresh.js +0 -150
  111. package/open-sse/executors/deepseek-web.js +0 -875
  112. package/open-sse/executors/default.js +0 -430
  113. package/open-sse/executors/devin-cli.js +0 -351
  114. package/open-sse/executors/doubao-web.js +0 -550
  115. package/open-sse/executors/duckduckgo-web.js +0 -629
  116. package/open-sse/executors/forceResponsesUpstream.js +0 -33
  117. package/open-sse/executors/gemini-business.js +0 -320
  118. package/open-sse/executors/gemini-cli.js +0 -89
  119. package/open-sse/executors/gemini-web.js +0 -297
  120. package/open-sse/executors/github.js +0 -379
  121. package/open-sse/executors/gitlab.js +0 -569
  122. package/open-sse/executors/glm.js +0 -361
  123. package/open-sse/executors/grok-cli.js +0 -119
  124. package/open-sse/executors/grok-web.js +0 -345
  125. package/open-sse/executors/huggingchat.js +0 -467
  126. package/open-sse/executors/iflow.js +0 -108
  127. package/open-sse/executors/index.js +0 -78
  128. package/open-sse/executors/inner-ai.js +0 -527
  129. package/open-sse/executors/kimchi.js +0 -123
  130. package/open-sse/executors/kimi-web.js +0 -325
  131. package/open-sse/executors/kimi.js +0 -97
  132. package/open-sse/executors/kiro.js +0 -503
  133. package/open-sse/executors/kiroThinking.js +0 -44
  134. package/open-sse/executors/lmarena.js +0 -395
  135. package/open-sse/executors/mimo-free.js +0 -167
  136. package/open-sse/executors/mimocode.js +0 -392
  137. package/open-sse/executors/ninerouter.js +0 -155
  138. package/open-sse/executors/nlpcloud.js +0 -438
  139. package/open-sse/executors/ollama-local.js +0 -14
  140. package/open-sse/executors/opencode-go.js +0 -41
  141. package/open-sse/executors/opencode.js +0 -32
  142. package/open-sse/executors/perplexity-web.js +0 -581
  143. package/open-sse/executors/poe-web.js +0 -133
  144. package/open-sse/executors/pollinations.js +0 -95
  145. package/open-sse/executors/puter.js +0 -31
  146. package/open-sse/executors/qoder.js +0 -448
  147. package/open-sse/executors/qwen-web.js +0 -372
  148. package/open-sse/executors/qwen.js +0 -129
  149. package/open-sse/executors/t3-chat-web.js +0 -417
  150. package/open-sse/executors/theoldllm.js +0 -290
  151. package/open-sse/executors/trae.js +0 -418
  152. package/open-sse/executors/v0-vercel-web.js +0 -141
  153. package/open-sse/executors/venice-web.js +0 -142
  154. package/open-sse/executors/vertex.js +0 -131
  155. package/open-sse/executors/vertexMedia.js +0 -236
  156. package/open-sse/executors/windsurf.js +0 -560
  157. package/open-sse/executors/xai.js +0 -46
  158. package/open-sse/executors/xiaomi-tokenplan.js +0 -19
  159. package/open-sse/executors/yuanbao-web.js +0 -385
  160. package/open-sse/executors/zed-hosted.js +0 -281
  161. package/open-sse/executors/zenmux-free.js +0 -247
  162. package/open-sse/handlers/audioSpeech.js +0 -759
  163. package/open-sse/handlers/audioTranscription.js +0 -395
  164. package/open-sse/handlers/audioTranslation.js +0 -181
  165. package/open-sse/handlers/chatCore/nonStreamingHandler.js +0 -300
  166. package/open-sse/handlers/chatCore/requestDetail.js +0 -102
  167. package/open-sse/handlers/chatCore/sseToJsonHandler.js +0 -231
  168. package/open-sse/handlers/chatCore/streamingHandler.js +0 -95
  169. package/open-sse/handlers/chatCore.js +0 -404
  170. package/open-sse/handlers/embeddingProviders/_base.js +0 -4
  171. package/open-sse/handlers/embeddingProviders/gemini.js +0 -54
  172. package/open-sse/handlers/embeddingProviders/index.js +0 -23
  173. package/open-sse/handlers/embeddingProviders/openai.js +0 -39
  174. package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +0 -13
  175. package/open-sse/handlers/embeddingsCore.js +0 -126
  176. package/open-sse/handlers/fetch/index.js +0 -237
  177. package/open-sse/handlers/imageGenerationCore.js +0 -230
  178. package/open-sse/handlers/imageProviders/_base.js +0 -31
  179. package/open-sse/handlers/imageProviders/antigravity.js +0 -73
  180. package/open-sse/handlers/imageProviders/blackForestLabs.js +0 -63
  181. package/open-sse/handlers/imageProviders/cloudflareAi.js +0 -207
  182. package/open-sse/handlers/imageProviders/codex.js +0 -217
  183. package/open-sse/handlers/imageProviders/comfyui.js +0 -25
  184. package/open-sse/handlers/imageProviders/falAi.js +0 -62
  185. package/open-sse/handlers/imageProviders/gemini.js +0 -40
  186. package/open-sse/handlers/imageProviders/huggingface.js +0 -38
  187. package/open-sse/handlers/imageProviders/index.js +0 -44
  188. package/open-sse/handlers/imageProviders/leonardo.js +0 -435
  189. package/open-sse/handlers/imageProviders/nanobanana.js +0 -79
  190. package/open-sse/handlers/imageProviders/openai.js +0 -61
  191. package/open-sse/handlers/imageProviders/runwayml.js +0 -72
  192. package/open-sse/handlers/imageProviders/sdwebui.js +0 -36
  193. package/open-sse/handlers/imageProviders/stabilityAi.js +0 -59
  194. package/open-sse/handlers/imageProviders/weavy.js +0 -222
  195. package/open-sse/handlers/moderations.js +0 -92
  196. package/open-sse/handlers/ocr.js +0 -89
  197. package/open-sse/handlers/rerank.js +0 -223
  198. package/open-sse/handlers/responseSanitizer/reasoning.js +0 -144
  199. package/open-sse/handlers/responsesHandler.js +0 -99
  200. package/open-sse/handlers/search/callers.js +0 -371
  201. package/open-sse/handlers/search/chatSearch.js +0 -409
  202. package/open-sse/handlers/search/index.js +0 -201
  203. package/open-sse/handlers/search/normalizers.js +0 -223
  204. package/open-sse/handlers/search.js +0 -1056
  205. package/open-sse/handlers/sseParser.js +0 -469
  206. package/open-sse/handlers/sttCore.js +0 -193
  207. package/open-sse/handlers/ttsCore.js +0 -74
  208. package/open-sse/handlers/ttsProviders/_base.js +0 -39
  209. package/open-sse/handlers/ttsProviders/edgeTts.js +0 -89
  210. package/open-sse/handlers/ttsProviders/elevenlabs.js +0 -48
  211. package/open-sse/handlers/ttsProviders/gemini.js +0 -117
  212. package/open-sse/handlers/ttsProviders/genericFormats.js +0 -169
  213. package/open-sse/handlers/ttsProviders/googleTts.js +0 -54
  214. package/open-sse/handlers/ttsProviders/index.js +0 -50
  215. package/open-sse/handlers/ttsProviders/localDevice.js +0 -87
  216. package/open-sse/handlers/ttsProviders/minimax.js +0 -59
  217. package/open-sse/handlers/ttsProviders/openai.js +0 -30
  218. package/open-sse/handlers/ttsProviders/openrouter.js +0 -70
  219. package/open-sse/handlers/usageExtractor.js +0 -93
  220. package/open-sse/handlers/videoGenerationCore.js +0 -119
  221. package/open-sse/handlers/videoProviders/index.js +0 -22
  222. package/open-sse/handlers/videoProviders/leonardo.js +0 -511
  223. package/open-sse/handlers/videoProviders/weavy.js +0 -198
  224. package/open-sse/handlers/webFetch.js +0 -200
  225. package/open-sse/index.js +0 -79
  226. package/open-sse/mcp-server/audit.js +0 -283
  227. package/open-sse/mcp-server/catalog.js +0 -184
  228. package/open-sse/mcp-server/descriptionCompressor.js +0 -175
  229. package/open-sse/mcp-server/httpAuthContext.js +0 -32
  230. package/open-sse/mcp-server/httpTransport.js +0 -229
  231. package/open-sse/mcp-server/index.js +0 -33
  232. package/open-sse/mcp-server/mcpCallerIdentity.js +0 -21
  233. package/open-sse/mcp-server/runtimeHeartbeat.js +0 -110
  234. package/open-sse/mcp-server/schemas/a2a.js +0 -153
  235. package/open-sse/mcp-server/schemas/audit.js +0 -17
  236. package/open-sse/mcp-server/schemas/index.js +0 -166
  237. package/open-sse/mcp-server/schemas/pickFastestModel.js +0 -90
  238. package/open-sse/mcp-server/schemas/toolDefinition.js +0 -0
  239. package/open-sse/mcp-server/schemas/toolSearch.js +0 -32
  240. package/open-sse/mcp-server/schemas/tools.js +0 -1219
  241. package/open-sse/mcp-server/scopeEnforcement.js +0 -80
  242. package/open-sse/mcp-server/server.js +0 -1168
  243. package/open-sse/mcp-server/toolCardinality.js +0 -78
  244. package/open-sse/mcp-server/toolSearch/catalog.js +0 -66
  245. package/open-sse/mcp-server/toolSearch/handler.js +0 -20
  246. package/open-sse/mcp-server/toolSearch/index.js +0 -10
  247. package/open-sse/mcp-server/toolSearch/register.js +0 -21
  248. package/open-sse/mcp-server/toolSearch/search.js +0 -55
  249. package/open-sse/mcp-server/toolSearch/signature.js +0 -67
  250. package/open-sse/mcp-server/tools/advancedTools.js +0 -893
  251. package/open-sse/mcp-server/tools/agentSkillTools.js +0 -69
  252. package/open-sse/mcp-server/tools/compressionTools.js +0 -309
  253. package/open-sse/mcp-server/tools/gamificationTools.js +0 -134
  254. package/open-sse/mcp-server/tools/githubSkillTools.js +0 -102
  255. package/open-sse/mcp-server/tools/memoryTools.js +0 -118
  256. package/open-sse/mcp-server/tools/notionTools.js +0 -101
  257. package/open-sse/mcp-server/tools/obsidianTools.js +0 -307
  258. package/open-sse/mcp-server/tools/pickFastestModel.js +0 -223
  259. package/open-sse/mcp-server/tools/pluginTools.js +0 -181
  260. package/open-sse/mcp-server/tools/poolTools.js +0 -139
  261. package/open-sse/mcp-server/tools/skillTools.js +0 -113
  262. package/open-sse/package.json +0 -10
  263. package/open-sse/providers/REGISTRY_TEMPLATE.js +0 -98
  264. package/open-sse/providers/capabilities.js +0 -293
  265. package/open-sse/providers/index.js +0 -51
  266. package/open-sse/providers/models/helpers.js +0 -20
  267. package/open-sse/providers/models/namePatterns.js +0 -33
  268. package/open-sse/providers/models/schema.js +0 -40
  269. package/open-sse/providers/pricing.js +0 -308
  270. package/open-sse/providers/registry/alicode-intl.js +0 -30
  271. package/open-sse/providers/registry/alicode.js +0 -31
  272. package/open-sse/providers/registry/anthropic.js +0 -37
  273. package/open-sse/providers/registry/antigravity.js +0 -81
  274. package/open-sse/providers/registry/assemblyai.js +0 -38
  275. package/open-sse/providers/registry/aws-polly.js +0 -45
  276. package/open-sse/providers/registry/azure.js +0 -21
  277. package/open-sse/providers/registry/black-forest-labs.js +0 -32
  278. package/open-sse/providers/registry/blackbox.js +0 -41
  279. package/open-sse/providers/registry/brave-search.js +0 -35
  280. package/open-sse/providers/registry/byteplus.js +0 -35
  281. package/open-sse/providers/registry/cartesia.js +0 -36
  282. package/open-sse/providers/registry/cerebras.js +0 -31
  283. package/open-sse/providers/registry/chutes.js +0 -24
  284. package/open-sse/providers/registry/claude.js +0 -87
  285. package/open-sse/providers/registry/cline.js +0 -51
  286. package/open-sse/providers/registry/clinepass.js +0 -57
  287. package/open-sse/providers/registry/cloudflare-ai.js +0 -55
  288. package/open-sse/providers/registry/codebuddy-cn.js +0 -77
  289. package/open-sse/providers/registry/codex.js +0 -100
  290. package/open-sse/providers/registry/cohere.js +0 -27
  291. package/open-sse/providers/registry/comfyui.js +0 -20
  292. package/open-sse/providers/registry/commandcode.js +0 -43
  293. package/open-sse/providers/registry/coqui.js +0 -30
  294. package/open-sse/providers/registry/cursor.js +0 -58
  295. package/open-sse/providers/registry/deepgram.js +0 -33
  296. package/open-sse/providers/registry/deepseek.js +0 -51
  297. package/open-sse/providers/registry/digitalocean.js +0 -92
  298. package/open-sse/providers/registry/edge-tts.js +0 -24
  299. package/open-sse/providers/registry/elevenlabs.js +0 -35
  300. package/open-sse/providers/registry/exa.js +0 -50
  301. package/open-sse/providers/registry/fal-ai.js +0 -34
  302. package/open-sse/providers/registry/featherless.js +0 -34
  303. package/open-sse/providers/registry/firecrawl.js +0 -34
  304. package/open-sse/providers/registry/fireworks.js +0 -29
  305. package/open-sse/providers/registry/gemini-cli.js +0 -58
  306. package/open-sse/providers/registry/gemini.js +0 -83
  307. package/open-sse/providers/registry/github.js +0 -88
  308. package/open-sse/providers/registry/gitlab.js +0 -32
  309. package/open-sse/providers/registry/glm-cn.js +0 -35
  310. package/open-sse/providers/registry/glm.js +0 -58
  311. package/open-sse/providers/registry/google-pse.js +0 -35
  312. package/open-sse/providers/registry/google-tts.js +0 -24
  313. package/open-sse/providers/registry/grok-cli.js +0 -86
  314. package/open-sse/providers/registry/grok-web.js +0 -39
  315. package/open-sse/providers/registry/groq.js +0 -37
  316. package/open-sse/providers/registry/huggingface.js +0 -34
  317. package/open-sse/providers/registry/hyperbolic.js +0 -35
  318. package/open-sse/providers/registry/ibm-bob.js +0 -27
  319. package/open-sse/providers/registry/iflow.js +0 -52
  320. package/open-sse/providers/registry/index.js +0 -210
  321. package/open-sse/providers/registry/inworld.js +0 -36
  322. package/open-sse/providers/registry/jina-ai.js +0 -42
  323. package/open-sse/providers/registry/jina-reader.js +0 -34
  324. package/open-sse/providers/registry/kilocode.js +0 -51
  325. package/open-sse/providers/registry/kimchi.js +0 -49
  326. package/open-sse/providers/registry/kimi-coding.js +0 -65
  327. package/open-sse/providers/registry/kimi.js +0 -56
  328. package/open-sse/providers/registry/kiro.js +0 -115
  329. package/open-sse/providers/registry/linkup.js +0 -34
  330. package/open-sse/providers/registry/local-device.js +0 -24
  331. package/open-sse/providers/registry/mimo-free.js +0 -24
  332. package/open-sse/providers/registry/minimax-cn.js +0 -76
  333. package/open-sse/providers/registry/minimax.js +0 -83
  334. package/open-sse/providers/registry/mistral.js +0 -34
  335. package/open-sse/providers/registry/mmf.js +0 -19
  336. package/open-sse/providers/registry/nanobanana.js +0 -35
  337. package/open-sse/providers/registry/nebius.js +0 -27
  338. package/open-sse/providers/registry/nvidia.js +0 -43
  339. package/open-sse/providers/registry/ollama-local.js +0 -19
  340. package/open-sse/providers/registry/ollama.js +0 -36
  341. package/open-sse/providers/registry/openai.js +0 -84
  342. package/open-sse/providers/registry/opencode-go.js +0 -41
  343. package/open-sse/providers/registry/opencode.js +0 -25
  344. package/open-sse/providers/registry/openrouter.js +0 -60
  345. package/open-sse/providers/registry/perplexity-agent.js +0 -49
  346. package/open-sse/providers/registry/perplexity-web.js +0 -33
  347. package/open-sse/providers/registry/perplexity.js +0 -37
  348. package/open-sse/providers/registry/playht.js +0 -36
  349. package/open-sse/providers/registry/qoder.js +0 -54
  350. package/open-sse/providers/registry/qwen.js +0 -33
  351. package/open-sse/providers/registry/recraft.js +0 -24
  352. package/open-sse/providers/registry/runwayml.js +0 -30
  353. package/open-sse/providers/registry/sdwebui.js +0 -20
  354. package/open-sse/providers/registry/searchapi.js +0 -35
  355. package/open-sse/providers/registry/searxng.js +0 -35
  356. package/open-sse/providers/registry/serper.js +0 -35
  357. package/open-sse/providers/registry/siliconflow.js +0 -39
  358. package/open-sse/providers/registry/stability-ai.js +0 -31
  359. package/open-sse/providers/registry/tavily.js +0 -50
  360. package/open-sse/providers/registry/together.js +0 -31
  361. package/open-sse/providers/registry/topaz.js +0 -19
  362. package/open-sse/providers/registry/tortoise.js +0 -30
  363. package/open-sse/providers/registry/venice.js +0 -56
  364. package/open-sse/providers/registry/vercel-ai-gateway.js +0 -41
  365. package/open-sse/providers/registry/vertex-partner.js +0 -29
  366. package/open-sse/providers/registry/vertex.js +0 -32
  367. package/open-sse/providers/registry/volcengine-ark.js +0 -35
  368. package/open-sse/providers/registry/voyage-ai.js +0 -30
  369. package/open-sse/providers/registry/xai.js +0 -45
  370. package/open-sse/providers/registry/xiaomi-mimo.js +0 -46
  371. package/open-sse/providers/registry/xiaomi-tokenplan.js +0 -63
  372. package/open-sse/providers/registry/youcom.js +0 -35
  373. package/open-sse/providers/schema.js +0 -76
  374. package/open-sse/providers/shared.js +0 -74
  375. package/open-sse/providers/thinkingLevels.js +0 -48
  376. package/open-sse/rtk/applyFilter.js +0 -15
  377. package/open-sse/rtk/autodetect.js +0 -111
  378. package/open-sse/rtk/caveman.js +0 -100
  379. package/open-sse/rtk/cavemanPrompts.js +0 -78
  380. package/open-sse/rtk/constants.js +0 -55
  381. package/open-sse/rtk/filters/buildOutput.js +0 -127
  382. package/open-sse/rtk/filters/dedupLog.js +0 -44
  383. package/open-sse/rtk/filters/find.js +0 -50
  384. package/open-sse/rtk/filters/gitDiff.js +0 -92
  385. package/open-sse/rtk/filters/gitLog.js +0 -99
  386. package/open-sse/rtk/filters/gitStatus.js +0 -117
  387. package/open-sse/rtk/filters/grep.js +0 -48
  388. package/open-sse/rtk/filters/ls.js +0 -79
  389. package/open-sse/rtk/filters/readNumbered.js +0 -27
  390. package/open-sse/rtk/filters/searchList.js +0 -52
  391. package/open-sse/rtk/filters/smartTruncate.js +0 -15
  392. package/open-sse/rtk/filters/tree.js +0 -32
  393. package/open-sse/rtk/headroom.js +0 -215
  394. package/open-sse/rtk/index.js +0 -155
  395. package/open-sse/rtk/paleo.js +0 -47
  396. package/open-sse/rtk/ponytail.js +0 -9
  397. package/open-sse/rtk/ponytailPrompt.js +0 -52
  398. package/open-sse/rtk/ponytailPrompts.js +0 -76
  399. package/open-sse/rtk/pxpipe.js +0 -104
  400. package/open-sse/rtk/registry.js +0 -38
  401. package/open-sse/rtk/systemInject.js +0 -98
  402. package/open-sse/services/accountFallback.js +0 -323
  403. package/open-sse/services/antigravityHeaders.js +0 -91
  404. package/open-sse/services/antigravityVersion.js +0 -154
  405. package/open-sse/services/clinepassModels.js +0 -63
  406. package/open-sse/services/codexQuotaFetcher.js +0 -312
  407. package/open-sse/services/codexVerbosity.js +0 -30
  408. package/open-sse/services/combo/context.js +0 -12
  409. package/open-sse/services/combo/fingerprintExpansion.js +0 -51
  410. package/open-sse/services/combo/headroomRanking.js +0 -28
  411. package/open-sse/services/combo/quotaExhaustionCutoff.js +0 -87
  412. package/open-sse/services/combo/quotaScoring.js +0 -226
  413. package/open-sse/services/combo/quotaShareConcurrency.js +0 -25
  414. package/open-sse/services/combo/quotaShareInflight.js +0 -50
  415. package/open-sse/services/combo/quotaShareStrategy.js +0 -130
  416. package/open-sse/services/combo/resolveAutoStrategy.js +0 -231
  417. package/open-sse/services/combo/responseValidation.js +0 -140
  418. package/open-sse/services/combo/runtimeUnits.js +0 -195
  419. package/open-sse/services/combo/sessionStickiness.js +0 -128
  420. package/open-sse/services/combo/shadowRouting.js +0 -131
  421. package/open-sse/services/combo/targetExhaustion.js +0 -75
  422. package/open-sse/services/combo/targetSorters.js +0 -126
  423. package/open-sse/services/combo/targetTimeoutRunner.js +0 -65
  424. package/open-sse/services/combo/validateQuality.js +0 -271
  425. package/open-sse/services/combo.js +0 -571
  426. package/open-sse/services/comboAgentMiddleware.js +0 -91
  427. package/open-sse/services/comboConfig.js +0 -153
  428. package/open-sse/services/comboManifestMetrics.js +0 -10
  429. package/open-sse/services/comboMetrics.js +0 -278
  430. package/open-sse/services/compact.js +0 -71
  431. package/open-sse/services/copilotModels.js +0 -155
  432. package/open-sse/services/emergencyFallback.js +0 -109
  433. package/open-sse/services/errorClassifier.js +0 -190
  434. package/open-sse/services/evalRouting.js +0 -201
  435. package/open-sse/services/freeWebSearch.js +0 -4
  436. package/open-sse/services/fusion.js +0 -223
  437. package/open-sse/services/intentClassifier.js +0 -631
  438. package/open-sse/services/kimchiModels.js +0 -176
  439. package/open-sse/services/kiroModels.js +0 -332
  440. package/open-sse/services/model.js +0 -136
  441. package/open-sse/services/modelCapabilities.js +0 -5
  442. package/open-sse/services/modelDeprecation.js +0 -101
  443. package/open-sse/services/modelFamilyFallback.js +0 -166
  444. package/open-sse/services/oauthCredentialManager.js +0 -156
  445. package/open-sse/services/pipeline.js +0 -107
  446. package/open-sse/services/projectId.js +0 -306
  447. package/open-sse/services/provider.js +0 -169
  448. package/open-sse/services/providerCooldownTracker.js +0 -94
  449. package/open-sse/services/providerDefaultRateLimit.js +0 -11
  450. package/open-sse/services/proxyAutoSelector.js +0 -24
  451. package/open-sse/services/qoderModels.js +0 -214
  452. package/open-sse/services/quotaFetchThrottle.js +0 -103
  453. package/open-sse/services/quotaMonitor.js +0 -310
  454. package/open-sse/services/quotaPreflight.js +0 -266
  455. package/open-sse/services/rateLimitManager/headers.js +0 -56
  456. package/open-sse/services/rateLimitManager.js +0 -616
  457. package/open-sse/services/rateLimitSemaphore.js +0 -112
  458. package/open-sse/services/responsesInputSanitizer.js +0 -99
  459. package/open-sse/services/slidingWindowLimiter.js +0 -44
  460. package/open-sse/services/streamRecovery.js +0 -355
  461. package/open-sse/services/taskAwareRouter.js +0 -227
  462. package/open-sse/services/taskAwareRouting.js +0 -332
  463. package/open-sse/services/thinkingBudget.js +0 -247
  464. package/open-sse/services/tokenRefresh/dedup.js +0 -31
  465. package/open-sse/services/tokenRefresh/providers.js +0 -624
  466. package/open-sse/services/tokenRefresh.js +0 -254
  467. package/open-sse/services/usage/claude.js +0 -147
  468. package/open-sse/services/usage/codebuddy-cn.js +0 -138
  469. package/open-sse/services/usage/codex.js +0 -267
  470. package/open-sse/services/usage/github.js +0 -100
  471. package/open-sse/services/usage/google.js +0 -241
  472. package/open-sse/services/usage/grok-cli.js +0 -274
  473. package/open-sse/services/usage/kiro.js +0 -188
  474. package/open-sse/services/usage/minimax.js +0 -234
  475. package/open-sse/services/usage/misc.js +0 -288
  476. package/open-sse/services/usage/shared.js +0 -70
  477. package/open-sse/services/usage.js +0 -62
  478. package/open-sse/services/usageDb.js +0 -2
  479. package/open-sse/services/webSearchRouting.js +0 -25
  480. package/open-sse/services/wildcardRouter.js +0 -59
  481. package/open-sse/shared/clineAuth.js +0 -37
  482. package/open-sse/shared/machineId.js +0 -19
  483. package/open-sse/shared/qoder/constants.js +0 -64
  484. package/open-sse/shared/qoder/cosy.js +0 -175
  485. package/open-sse/shared/qoder/encoding.js +0 -55
  486. package/open-sse/transformer/responsesTransformer.js +0 -439
  487. package/open-sse/transformer/streamToJsonConverter.js +0 -103
  488. package/open-sse/translator/concerns/chunk.js +0 -11
  489. package/open-sse/translator/concerns/finishReason.js +0 -63
  490. package/open-sse/translator/concerns/image.js +0 -124
  491. package/open-sse/translator/concerns/json.js +0 -5
  492. package/open-sse/translator/concerns/message.js +0 -7
  493. package/open-sse/translator/concerns/modality.js +0 -155
  494. package/open-sse/translator/concerns/paramSupport.js +0 -75
  495. package/open-sse/translator/concerns/prefetch.js +0 -96
  496. package/open-sse/translator/concerns/reasoning.js +0 -24
  497. package/open-sse/translator/concerns/thinking.js +0 -53
  498. package/open-sse/translator/concerns/thinkingUnified.js +0 -329
  499. package/open-sse/translator/concerns/toolCall.js +0 -153
  500. package/open-sse/translator/concerns/usage.js +0 -69
  501. package/open-sse/translator/formats/claude.js +0 -368
  502. package/open-sse/translator/formats/gemini.js +0 -380
  503. package/open-sse/translator/formats/maxTokens.js +0 -34
  504. package/open-sse/translator/formats/openai.js +0 -134
  505. package/open-sse/translator/formats/responsesApi.js +0 -141
  506. package/open-sse/translator/formats.js +0 -36
  507. package/open-sse/translator/helpers/claudeHelper.js +0 -216
  508. package/open-sse/translator/helpers/geminiHelper.js +0 -372
  509. package/open-sse/translator/helpers/imageHelper.js +0 -34
  510. package/open-sse/translator/helpers/maxTokensHelper.js +0 -27
  511. package/open-sse/translator/helpers/openaiHelper.js +0 -130
  512. package/open-sse/translator/helpers/responsesApiHelper.js +0 -139
  513. package/open-sse/translator/helpers/toolCallHelper.js +0 -148
  514. package/open-sse/translator/index.js +0 -252
  515. package/open-sse/translator/request/antigravity-to-openai.js +0 -242
  516. package/open-sse/translator/request/claude-to-kiro.js +0 -478
  517. package/open-sse/translator/request/claude-to-openai.js +0 -263
  518. package/open-sse/translator/request/gemini-to-openai.js +0 -152
  519. package/open-sse/translator/request/openai-responses.js +0 -385
  520. package/open-sse/translator/request/openai-to-claude.js +0 -383
  521. package/open-sse/translator/request/openai-to-commandcode.js +0 -176
  522. package/open-sse/translator/request/openai-to-cursor.js +0 -185
  523. package/open-sse/translator/request/openai-to-gemini.js +0 -442
  524. package/open-sse/translator/request/openai-to-kiro.js +0 -607
  525. package/open-sse/translator/request/openai-to-kiro.old.js +0 -278
  526. package/open-sse/translator/request/openai-to-ollama.js +0 -195
  527. package/open-sse/translator/request/openai-to-vertex.js +0 -42
  528. package/open-sse/translator/response/claude-to-openai.js +0 -195
  529. package/open-sse/translator/response/commandcode-to-openai.js +0 -188
  530. package/open-sse/translator/response/cursor-to-openai.js +0 -30
  531. package/open-sse/translator/response/gemini-to-openai.js +0 -147
  532. package/open-sse/translator/response/kiro-to-claude.js +0 -261
  533. package/open-sse/translator/response/kiro-to-openai.js +0 -160
  534. package/open-sse/translator/response/ollama-to-openai.js +0 -134
  535. package/open-sse/translator/response/openai-responses.js +0 -535
  536. package/open-sse/translator/response/openai-to-antigravity.js +0 -123
  537. package/open-sse/translator/response/openai-to-claude.js +0 -265
  538. package/open-sse/translator/schema/blocks.js +0 -43
  539. package/open-sse/translator/schema/defaults.js +0 -7
  540. package/open-sse/translator/schema/finishReasons.js +0 -27
  541. package/open-sse/translator/schema/index.js +0 -8
  542. package/open-sse/translator/schema/roles.js +0 -16
  543. package/open-sse/utils/agentGoalPolicy.js +0 -85
  544. package/open-sse/utils/aiSdkCompat.js +0 -75
  545. package/open-sse/utils/bypassHandler.js +0 -298
  546. package/open-sse/utils/cacheControlPolicy.js +0 -189
  547. package/open-sse/utils/claudeCloaking.js +0 -155
  548. package/open-sse/utils/claudeHeaderCache.js +0 -70
  549. package/open-sse/utils/claudeSignature.js +0 -41
  550. package/open-sse/utils/clientDetector.js +0 -63
  551. package/open-sse/utils/codebuddySanitizer.js +0 -96
  552. package/open-sse/utils/composerToolCalls.js +0 -158
  553. package/open-sse/utils/cors.js +0 -13
  554. package/open-sse/utils/cursorChecksum.js +0 -149
  555. package/open-sse/utils/cursorImages.js +0 -224
  556. package/open-sse/utils/cursorProtobuf.js +0 -904
  557. package/open-sse/utils/cursorVersionDetector.js +0 -55
  558. package/open-sse/utils/debugLog.js +0 -14
  559. package/open-sse/utils/diagnostics.js +0 -143
  560. package/open-sse/utils/error.js +0 -164
  561. package/open-sse/utils/estimateSize.js +0 -33
  562. package/open-sse/utils/finishReason.js +0 -32
  563. package/open-sse/utils/flattenToolHistory.js +0 -68
  564. package/open-sse/utils/headers.js +0 -36
  565. package/open-sse/utils/heapPressure.js +0 -35
  566. package/open-sse/utils/jsonToSse.js +0 -125
  567. package/open-sse/utils/keepaliveThreshold.js +0 -40
  568. package/open-sse/utils/logger.js +0 -104
  569. package/open-sse/utils/noThinkingAlias.js +0 -74
  570. package/open-sse/utils/number.js +0 -7
  571. package/open-sse/utils/ollamaTransform.js +0 -85
  572. package/open-sse/utils/opencodeHeaders.js +0 -47
  573. package/open-sse/utils/progressTracker.js +0 -81
  574. package/open-sse/utils/providerRequestLogging.js +0 -219
  575. package/open-sse/utils/proxyFetch.js +0 -369
  576. package/open-sse/utils/reasoningContentInjector.js +0 -79
  577. package/open-sse/utils/reasoningFields.js +0 -70
  578. package/open-sse/utils/requestLogger.js +0 -260
  579. package/open-sse/utils/responsesInputNormalization.js +0 -92
  580. package/open-sse/utils/responsesStatePolicy.js +0 -52
  581. package/open-sse/utils/responsesStreamHelpers.js +0 -49
  582. package/open-sse/utils/sessionManager.js +0 -240
  583. package/open-sse/utils/sleep.js +0 -6
  584. package/open-sse/utils/sse.js +0 -14
  585. package/open-sse/utils/sseConstants.js +0 -23
  586. package/open-sse/utils/sseHeartbeat.js +0 -104
  587. package/open-sse/utils/stream.js +0 -517
  588. package/open-sse/utils/streamFailureFinalization.js +0 -134
  589. package/open-sse/utils/streamHandler.js +0 -250
  590. package/open-sse/utils/streamHelpers.js +0 -137
  591. package/open-sse/utils/textualToolCall.js +0 -104
  592. package/open-sse/utils/thinkCloseMarker.js +0 -72
  593. package/open-sse/utils/thinkTagParser.js +0 -146
  594. package/open-sse/utils/toolCallArguments.js +0 -12
  595. package/open-sse/utils/toolDeduper.js +0 -49
  596. package/open-sse/utils/toolSources.js +0 -31
  597. package/open-sse/utils/upstreamResponseHeaders.js +0 -25
  598. package/open-sse/utils/urlSanitize.js +0 -15
  599. package/open-sse/utils/usageTracking.js +0 -347
@@ -1,215 +0,0 @@
1
- import { claudeToOpenAIRequest } from "../translator/request/claude-to-openai.js";
2
- import { openaiToClaudeRequest } from "../translator/request/openai-to-claude.js";
3
- import {
4
- openaiResponsesToOpenAIRequest,
5
- openaiToOpenAIResponsesRequest,
6
- } from "../translator/request/openai-responses.js";
7
-
8
- const DEFAULT_TIMEOUT_MS = 3000;
9
-
10
- function jsonBytes(value) {
11
- try {
12
- return new TextEncoder().encode(JSON.stringify(value) || "").length;
13
- } catch {
14
- return 0;
15
- }
16
- }
17
-
18
- function messagePayload(body) {
19
- if (Array.isArray(body?.messages)) return body.messages;
20
- if (Array.isArray(body?.input)) return body.input;
21
- return null;
22
- }
23
-
24
- function captureSizeSnapshot(body) {
25
- const messages = messagePayload(body);
26
- return {
27
- bodyBytes: jsonBytes(body),
28
- messageBytes: messages ? jsonBytes(messages) : 0,
29
- };
30
- }
31
-
32
- function setDiagnostic(diagnostics, reason) {
33
- if (diagnostics && !diagnostics.reason) diagnostics.reason = reason;
34
- }
35
-
36
- function scrubSensitiveUrlText(text) {
37
- return String(text)
38
- .replace(/\/\/[^/@\s]+@/g, "//")
39
- .replace(/(https?:\/\/[^\s?#]+)[?#][^\s)]*/g, "$1");
40
- }
41
-
42
- function describeFetchError(error) {
43
- const cause = error?.cause;
44
- const code = cause?.code || error?.code;
45
- const message = scrubSensitiveUrlText(cause?.message || error?.message || String(error));
46
- return code ? `${code}: ${message}` : message;
47
- }
48
-
49
- function buildCompressEndpoint(url) {
50
- try {
51
- const parsed = new URL(url);
52
- parsed.pathname = `${parsed.pathname.replace(/\/$/, "")}/v1/compress`;
53
- parsed.hash = "";
54
- return parsed.toString();
55
- } catch {
56
- const raw = String(url).replace(/#.*$/, "");
57
- const [base, query = ""] = raw.split("?", 2);
58
- const endpoint = `${base.replace(/\/$/, "")}/v1/compress`;
59
- return query ? `${endpoint}?${query}` : endpoint;
60
- }
61
- }
62
-
63
- function maskEndpoint(endpoint) {
64
- try {
65
- const parsed = new URL(endpoint);
66
- parsed.username = "";
67
- parsed.password = "";
68
- parsed.search = "";
69
- parsed.hash = "";
70
- return parsed.toString();
71
- } catch {
72
- return String(endpoint).replace(/\/\/[^/@\s]+@/, "//").replace(/[?#].*$/, "");
73
- }
74
- }
75
-
76
- function hasUnsafeResponsesInputForCompression(body) {
77
- if (!Array.isArray(body?.input)) return false;
78
- return body.input.some((item) => {
79
- if (!item || typeof item !== "object" || Array.isArray(item)) return false;
80
- return typeof item.type === "string" && item.type !== "message";
81
- });
82
- }
83
-
84
- // POST messages to Headroom /v1/compress; returns compressed messages + stats or null.
85
- async function callCompress(url, messages, model, timeoutMs, compressUserMessages, diagnostics) {
86
- const endpoint = buildCompressEndpoint(url);
87
- diagnostics.endpoint = maskEndpoint(endpoint);
88
- const payload = { messages, model };
89
- if (compressUserMessages) payload.config = { compress_user_messages: true };
90
- let res;
91
- try {
92
- res = await fetch(endpoint, {
93
- method: "POST",
94
- headers: { "Content-Type": "application/json" },
95
- body: JSON.stringify(payload),
96
- signal: AbortSignal.timeout(timeoutMs),
97
- });
98
- } catch (error) {
99
- setDiagnostic(diagnostics, `request failed: ${describeFetchError(error)}`);
100
- return null;
101
- }
102
- if (!res.ok) {
103
- setDiagnostic(diagnostics, `proxy returned HTTP ${res.status}`);
104
- return null;
105
- }
106
- const data = await res.json();
107
- if (!Array.isArray(data?.messages)) {
108
- setDiagnostic(diagnostics, "proxy response missing messages[]");
109
- return null;
110
- }
111
- return data;
112
- }
113
-
114
- // Compress request body via Headroom proxy. Fail-open: returns null on any error.
115
- // /v1/compress only understands OpenAI shape, so Claude bodies are translated
116
- // to OpenAI, compressed, then translated back using 9Router's own translators.
117
- export async function compressWithHeadroom(body, { enabled, url, model, format, compressUserMessages, timeoutMs = DEFAULT_TIMEOUT_MS, diagnostics = null } = {}) {
118
- if (!enabled) {
119
- setDiagnostic(diagnostics, "disabled");
120
- return null;
121
- }
122
- if (!url) {
123
- setDiagnostic(diagnostics, "missing proxy URL");
124
- return null;
125
- }
126
- if (!body) {
127
- setDiagnostic(diagnostics, "missing request body");
128
- return null;
129
- }
130
-
131
- try {
132
- if (diagnostics) diagnostics.before = captureSizeSnapshot(body);
133
-
134
- // Claude shape: translate → OpenAI → compress → translate back.
135
- if (format === "claude") {
136
- const oai = claudeToOpenAIRequest(model, body, false);
137
- if (!Array.isArray(oai?.messages)) {
138
- setDiagnostic(diagnostics, "Claude request did not translate to messages[]");
139
- return null;
140
- }
141
- const data = await callCompress(url, oai.messages, model, timeoutMs, compressUserMessages, diagnostics || {});
142
- if (!data) return null;
143
- const claudeBody = openaiToClaudeRequest(model, { ...oai, messages: data.messages }, false);
144
- if (Array.isArray(claudeBody?.messages)) body.messages = claudeBody.messages;
145
- if (claudeBody?.system !== undefined) body.system = claudeBody.system;
146
- if (diagnostics) diagnostics.after = captureSizeSnapshot(body);
147
- return data;
148
- }
149
-
150
- // OpenAI Responses shape (Codex): body.input holds Responses items, NOT OpenAI
151
- // messages. Translate input -> OpenAI -> compress -> translate back to input so
152
- // body.input keeps the Responses contract (the proxy only understands OpenAI). (#1998)
153
- if (format === "openai-responses") {
154
- if (hasUnsafeResponsesInputForCompression(body)) {
155
- setDiagnostic(diagnostics, "skipped: openai-responses tool/reasoning input is not safe to compress");
156
- return null;
157
- }
158
- const oai = openaiResponsesToOpenAIRequest(model, body, false);
159
- if (!Array.isArray(oai?.messages)) return null;
160
- const data = await callCompress(url, oai.messages, model, timeoutMs, compressUserMessages, diagnostics || {});
161
- if (!data) return null;
162
- // input: undefined so the translator rebuilds input from the compressed
163
- // messages instead of returning the original input unchanged.
164
- const responsesBody = openaiToOpenAIResponsesRequest(
165
- model,
166
- { ...oai, input: undefined, messages: data.messages },
167
- false
168
- );
169
- if (Array.isArray(responsesBody?.input)) body.input = responsesBody.input;
170
- if (diagnostics) diagnostics.after = captureSizeSnapshot(body);
171
- return data;
172
- }
173
-
174
- // OpenAI shape: messages/input go straight to the proxy.
175
- const key = Array.isArray(body.messages) ? "messages"
176
- : Array.isArray(body.input) ? "input"
177
- : null;
178
- if (!key) {
179
- setDiagnostic(diagnostics, `unsupported ${format || "unknown"} request shape`);
180
- return null;
181
- }
182
- const data = await callCompress(url, body[key], model, timeoutMs, compressUserMessages, diagnostics || {});
183
- if (!data) return null;
184
- body[key] = data.messages;
185
- if (diagnostics) diagnostics.after = captureSizeSnapshot(body);
186
- return data;
187
- } catch (error) {
188
- setDiagnostic(diagnostics, `unexpected error: ${error?.message || String(error)}`);
189
- return null;
190
- }
191
- }
192
-
193
- export function formatHeadroomLog(stats) {
194
- if (!stats) return null;
195
- const before = stats.tokens_before || 0;
196
- const after = stats.tokens_after || 0;
197
- const delta = stats.tokens_saved || 0;
198
- const pct = before > 0 ? ((delta / before) * 100).toFixed(1) : "0";
199
- return `reported token delta=${delta} before=${before}${after ? ` after=${after}` : ""} (${pct}%)`.trim();
200
- }
201
-
202
- export function formatHeadroomSizeLog(diagnostics) {
203
- const before = diagnostics?.before;
204
- const after = diagnostics?.after;
205
- if (!before || !after) return "";
206
- return `body=${before.bodyBytes}B→${after.bodyBytes}B messages=${before.messageBytes}B→${after.messageBytes}B`;
207
- }
208
-
209
- export function isHeadroomPhantomSavings(stats, diagnostics, minShrinkRatio = 0.05) {
210
- if (!stats?.tokens_saved || stats.tokens_saved <= 0) return false;
211
- const before = diagnostics?.before?.bodyBytes || 0;
212
- const after = diagnostics?.after?.bodyBytes || 0;
213
- if (before <= 0 || after <= 0) return false;
214
- return after >= before * (1 - minShrinkRatio);
215
- }
@@ -1,155 +0,0 @@
1
- // RTK port: compress tool_result content in LLM request bodies
2
- // Injected at the top of translateRequest (before any format translation)
3
- import { RAW_CAP, MIN_COMPRESS_SIZE } from "./constants.js";
4
- import { autoDetectFilter } from "./autodetect.js";
5
- import { safeApply } from "./applyFilter.js";
6
-
7
- // Compress tool_result content in-place. Returns stats or null if disabled/failed.
8
- export function compressMessages(body, enabled) {
9
- if (!enabled) return null;
10
- if (!body) return null;
11
-
12
- // Kiro format: conversationState.history + conversationState.currentMessage
13
- if (body.conversationState) {
14
- return compressKiroFormat(body, enabled);
15
- }
16
-
17
- // Support both OpenAI/Claude "messages" and OpenAI Responses "input"
18
- const items = Array.isArray(body.messages) ? body.messages
19
- : Array.isArray(body.input) ? body.input
20
- : null;
21
- if (!items) return null;
22
-
23
- const stats = { bytesBefore: 0, bytesAfter: 0, hits: [] };
24
- try {
25
- for (let i = 0; i < items.length; i++) {
26
- const msg = items[i];
27
- if (!msg) continue;
28
-
29
- // Shape 4: OpenAI Responses — top-level { type:"function_call_output", output: string | [{type:"input_text", text}] }
30
- if (msg.type === "function_call_output") {
31
- if (typeof msg.output === "string") {
32
- msg.output = compressText(msg.output, stats, "openai-responses-string");
33
- } else if (Array.isArray(msg.output)) {
34
- for (let k = 0; k < msg.output.length; k++) {
35
- const part = msg.output[k];
36
- if (part && part.type === "input_text" && typeof part.text === "string") {
37
- part.text = compressText(part.text, stats, "openai-responses-array");
38
- }
39
- }
40
- }
41
- continue;
42
- }
43
-
44
- // Shape 1: OpenAI tool message — { role:"tool", content: "string" }
45
- if (msg.role === "tool" && typeof msg.content === "string") {
46
- msg.content = compressText(msg.content, stats, "openai-tool");
47
- continue;
48
- }
49
-
50
- if (!Array.isArray(msg.content)) continue;
51
-
52
- // Shape 1b: OpenAI tool message — { role:"tool", content:[{type:"text", text:"..."}] }
53
- if (msg.role === "tool") {
54
- for (let k = 0; k < msg.content.length; k++) {
55
- const part = msg.content[k];
56
- if (part && part.type === "text" && typeof part.text === "string") {
57
- part.text = compressText(part.text, stats, "openai-tool-array");
58
- }
59
- }
60
- continue;
61
- }
62
-
63
- // Shape 2/3: blocks array with tool_result entries
64
- for (let j = 0; j < msg.content.length; j++) {
65
- const block = msg.content[j];
66
- if (!block || block.type !== "tool_result") continue;
67
- if (block.is_error === true) continue; // preserve error traces
68
-
69
- if (typeof block.content === "string") {
70
- // Shape 2: claude string form
71
- block.content = compressText(block.content, stats, "claude-string");
72
- } else if (Array.isArray(block.content)) {
73
- // Shape 3: claude array form — compress each text part
74
- for (let k = 0; k < block.content.length; k++) {
75
- const part = block.content[k];
76
- if (part && part.type === "text" && typeof part.text === "string") {
77
- part.text = compressText(part.text, stats, "claude-array");
78
- }
79
- }
80
- }
81
- }
82
- }
83
- } catch (e) {
84
- console.warn("[RTK] compressMessages error:", e.message);
85
- return null;
86
- }
87
- return stats;
88
- }
89
-
90
- // Compress Kiro format: conversationState.history[].userInputMessage.userInputMessageContext.toolResults[].content[].text
91
- function compressKiroFormat(body, enabled) {
92
- const stats = { bytesBefore: 0, bytesAfter: 0, hits: [] };
93
- try {
94
- const state = body.conversationState;
95
- const allMessages = [...(Array.isArray(state?.history) ? state.history : [])];
96
- if (state?.currentMessage) allMessages.push(state.currentMessage);
97
-
98
- for (const msg of allMessages) {
99
- const toolResults = msg?.userInputMessage?.userInputMessageContext?.toolResults;
100
- if (!Array.isArray(toolResults)) continue;
101
-
102
- for (const tr of toolResults) {
103
- if (tr.status === "error") continue; // preserve error traces
104
- if (!Array.isArray(tr.content)) continue;
105
-
106
- for (const part of tr.content) {
107
- if (part && typeof part.text === "string") {
108
- part.text = compressText(part.text, stats, "kiro-tool-result");
109
- }
110
- }
111
- }
112
- }
113
- } catch (e) {
114
- console.warn("[RTK] compressKiroFormat error:", e.message);
115
- return null;
116
- }
117
- return stats;
118
- }
119
-
120
- function compressText(text, stats, shape) {
121
- const bytesIn = text.length;
122
- stats.bytesBefore += bytesIn;
123
-
124
- if (bytesIn < MIN_COMPRESS_SIZE || bytesIn > RAW_CAP) {
125
- stats.bytesAfter += bytesIn;
126
- return text;
127
- }
128
-
129
- const fn = autoDetectFilter(text);
130
- if (!fn) {
131
- stats.bytesAfter += bytesIn;
132
- return text;
133
- }
134
-
135
- const out = safeApply(fn, text);
136
-
137
- // Safety: never return empty, never grow the input
138
- if (!out || out.length === 0 || out.length >= bytesIn) {
139
- stats.bytesAfter += bytesIn;
140
- return text;
141
- }
142
-
143
- stats.bytesAfter += out.length;
144
- stats.hits.push({ shape, filter: fn.filterName || fn.name, saved: bytesIn - out.length });
145
- return out;
146
- }
147
-
148
- // Convenience: format a log line from stats
149
- export function formatRtkLog(stats) {
150
- if (!stats || !stats.hits || stats.hits.length === 0) return null;
151
- const saved = stats.bytesBefore - stats.bytesAfter;
152
- const pct = stats.bytesBefore > 0 ? ((saved / stats.bytesBefore) * 100).toFixed(1) : "0";
153
- const filters = Array.from(new Set(stats.hits.map(h => h.filter))).join(",");
154
- return `[RTK] saved ${saved}B / ${stats.bytesBefore}B (${pct}%) via [${filters}] hits=${stats.hits.length}`;
155
- }
@@ -1,47 +0,0 @@
1
- /**
2
- * Paleo Token Saver — inject system prompt to minimize output tokens.
3
- * Inspired by github.com/mocasus/paleo
4
- *
5
- * Levels:
6
- * lite — gentle hints to be concise
7
- * full — strong compression instructions
8
- * ultra — extreme telegraphic, max savings
9
- */
10
-
11
- import { injectSystemPrompt } from "./systemInject.js";
12
-
13
- const PALEO_PROMPTS = {
14
- lite: [
15
- "Be concise. Skip filler phrases, unnecessary preambles, and redundant explanations. Get to the point directly.",
16
- "Do not repeat information already provided. Use minimal words to convey maximum meaning.",
17
- ].join("\n"),
18
-
19
- full: [
20
- "You are in token-saving mode. Follow these rules strictly:",
21
- "- NO filler: skip 'Certainly', 'Sure', 'Here is', 'Let me', 'I will', preamble, disclaimers.",
22
- "- NO repetition: never restate what the user said or what you already said.",
23
- "- Compress: use fragments, abbreviations, and terse phrasing when clarity permits.",
24
- "- Code: output ONLY the changed lines with minimal context. No full-file rewrites unless asked.",
25
- "- Lists: use short bullets, not full sentences.",
26
- "- If the answer is a single value, output ONLY that value.",
27
- "- Arrow causality for reasoning: X → Y → Z, not 'Because X, therefore Y, which leads to Z'.",
28
- ].join("\n"),
29
-
30
- ultra: [
31
- "TOKEN-SAVING ULTRA MODE. Rules enforced:",
32
- "- Absolute minimum output. Every token costs money.",
33
- "- Fragments OK. Articles/determiners optional (a, the, this).",
34
- "- No greeting, no sign-off, no filler, no hedging.",
35
- "- Code: diffs/patches only. No explanations unless asked.",
36
- "- Data: raw values, no wrapping prose.",
37
- "- If yes/no suffices, output only yes/no.",
38
- "- Chain reasoning: A→B→C. No connective tissue.",
39
- "- Max 50% of what you'd normally output. Prefer shorter.",
40
- ].join("\n"),
41
- };
42
-
43
- export function injectPaleo(body, format, level) {
44
- const prompt = PALEO_PROMPTS[level];
45
- if (!prompt) return;
46
- injectSystemPrompt(body, format, prompt);
47
- }
@@ -1,9 +0,0 @@
1
- // Ponytail injector: appends the "lazy senior dev" instruction into the system
2
- // message of the final request body, just before dispatch to the provider executor.
3
-
4
- import { injectSystemPrompt } from "./systemInject.js";
5
- import { PONYTAIL_PROMPTS } from "./ponytailPrompts.js";
6
-
7
- export function injectPonytail(body, format, level) {
8
- injectSystemPrompt(body, format, PONYTAIL_PROMPTS[level]);
9
- }
@@ -1,52 +0,0 @@
1
- // Ponytail intensity-level prompts injected into system message to bias toward minimal code.
2
- // Adapted from ponytail skill (https://github.com/DietrichGebert/ponytail).
3
-
4
- export const PONYTAIL_LEVELS = {
5
- LITE: "lite",
6
- FULL: "full",
7
- ULTRA: "ultra",
8
- };
9
-
10
- const SHARED_PERSONA = "You are a lazy senior developer. Lazy means efficient, not careless. The best code is the code never written.";
11
-
12
- const SHARED_LADDER = "Before writing code, stop at the first rung that holds: 1) Does this need to exist at all? (YAGNI) 2) Stdlib does it? Use it. 3) Native platform feature covers it? Use it (CSS over JS, DB constraint over app code). 4) Already-installed dependency solves it? Use it; never add a new one for what a few lines can do. 5) Can it be one line? One line. 6) Only then: the minimum code that works.";
13
-
14
- const SHARED_RULES = "No unrequested abstractions (no interface with one implementation, no factory for one product, no config for a value that never changes). No boilerplate or scaffolding \"for later\". Deletion over addition. Boring over clever. Fewest files possible; shortest working diff wins. Two stdlib options the same size: take the edge-case-correct one. Mark deliberate simplifications with a `ponytail:` comment naming the ceiling and upgrade path.";
15
-
16
- const SHARED_OUTPUT = "Code first. Then at most three short lines: what was skipped, when to add it. No essays or design notes. Pattern: `[code] → skipped: [X], add when [Y].`";
17
-
18
- const SHARED_NOT_LAZY = "Never simplify away: input validation at trust boundaries, error handling that prevents data loss, security, accessibility, anything explicitly requested. Non-trivial logic leaves ONE runnable check behind (an assert-based self-check or one small test file; no frameworks). Trivial one-liners need no test.";
19
-
20
- const SHARED_PERSISTENCE = "ACTIVE EVERY RESPONSE. No drift back to over-building. Still active if unsure.";
21
-
22
- export const PONYTAIL_PROMPTS = {
23
- [PONYTAIL_LEVELS.LITE]: [
24
- SHARED_PERSONA,
25
- "Lite: build what's asked, but name the lazier alternative in one line. User picks.",
26
- SHARED_LADDER,
27
- SHARED_RULES,
28
- SHARED_OUTPUT,
29
- SHARED_NOT_LAZY,
30
- SHARED_PERSISTENCE,
31
- ].join(" "),
32
-
33
- [PONYTAIL_LEVELS.FULL]: [
34
- SHARED_PERSONA,
35
- "Full: the ladder enforced. Stdlib and native first. Shortest diff, shortest explanation.",
36
- SHARED_LADDER,
37
- SHARED_RULES,
38
- SHARED_OUTPUT,
39
- SHARED_NOT_LAZY,
40
- SHARED_PERSISTENCE,
41
- ].join(" "),
42
-
43
- [PONYTAIL_LEVELS.ULTRA]: [
44
- SHARED_PERSONA,
45
- "Ultra: YAGNI extremist. Deletion before addition. Ship the one-liner and challenge the rest of the requirement in the same response.",
46
- SHARED_LADDER,
47
- SHARED_RULES,
48
- SHARED_OUTPUT,
49
- SHARED_NOT_LAZY,
50
- SHARED_PERSISTENCE,
51
- ].join(" "),
52
- };
@@ -1,76 +0,0 @@
1
- // Ponytail intensity-level prompts injected into the system message to reduce
2
- // OUTPUT tokens by writing less code (YAGNI / stdlib-first / one-line-first).
3
- // Adapted from the ponytail skill (https://github.com/DietrichGebert/ponytail).
4
- //
5
- // Orthogonal to Caveman: ponytail governs WHAT the model builds (code
6
- // minimalism); caveman governs HOW it talks (terse prose). The ponytail author
7
- // explicitly recommends pairing the two ("Ponytail governs what you build, not
8
- // how you talk — pair with Caveman for terse prose").
9
-
10
- const PONYTAIL_LEVELS = {
11
- LITE: "lite",
12
- FULL: "full",
13
- ULTRA: "ultra",
14
- };
15
-
16
- // The decision ladder is identical across levels; intensity changes how
17
- // aggressively unrequested scope is challenged.
18
- const SHARED_LADDER = [
19
- "You are a lazy senior developer. Lazy means efficient, not careless. The best code is the code never written.",
20
- "Before writing code, stop at the first rung that holds:",
21
- "1. Does this need to exist at all? Speculative need = skip it, say so in one line (YAGNI).",
22
- "2. Stdlib does it? Use it.",
23
- "3. Native platform feature covers it? Use it (native input over a picker lib, CSS over JS, DB constraint over app code).",
24
- "4. Already-installed dependency solves it? Use it. Never add a new dependency for what a few lines can do.",
25
- "5. Can it be one line? One line.",
26
- "6. Only then: the minimum code that works.",
27
- ].join(" ");
28
-
29
- const SHARED_RULES = [
30
- "No unrequested abstractions (no interface with one implementation, no factory for one product, no config for a value that never changes).",
31
- "No boilerplate or scaffolding 'for later'. Deletion over addition. Boring over clever. Fewest files possible; shortest working diff wins.",
32
- "Two stdlib options the same size? Take the one correct on edge cases — lazy means less code, not the flimsier algorithm.",
33
- "Mark deliberate simplifications with a `ponytail:` comment naming the ceiling and upgrade path (e.g. `// ponytail: global lock, per-account locks if throughput matters`).",
34
- ].join(" ");
35
-
36
- // Hard boundaries — never simplified away. Mirrors caveman's safety stance.
37
- const SHARED_BOUNDARIES = "Never simplify away: input validation at trust boundaries, error handling that prevents data loss, security, accessibility, or anything explicitly requested. If the user insists on the full version, build it without re-arguing.";
38
-
39
- // Skeptical verification — no false claims, no assumptions.
40
- const SHARED_SKEPTICAL = "now is 2026, Be skeptical: never claim 'fixed', 'working', or 'correct' without concrete proof (test output, diff, reproducible verification). If a test passes, verify it tests what you think it tests. Check for side effects. Never fabricate reports ('all tests pass' without running them). Distinguish pre-existing bugs from ones you caused — run tests BEFORE and AFTER, diff the results. Report honestly: if broken and can't fix, say so. If skipped, explain why. If caveats, state them. Verify before declaring done — run relevant tests AFTER changes, show actual output.";
41
-
42
- const SHARED_OUTPUT = "Code first. Then at most three short lines: what was skipped and when to add it. Pattern: [code] then skipped: [X], add when [Y]. If the explanation is longer than the code, delete the explanation.";
43
-
44
- const SHARED_PERSISTENCE = "ACTIVE EVERY RESPONSE. No drift back to over-building. Still active if unsure.";
45
-
46
- export const PONYTAIL_PROMPTS = {
47
- [PONYTAIL_LEVELS.LITE]: [
48
- SHARED_LADDER,
49
- "Level: lite. Build what's asked, but name the lazier alternative in one line — the user picks.",
50
- SHARED_RULES,
51
- SHARED_OUTPUT,
52
- SHARED_BOUNDARIES,
53
- SHARED_SKEPTICAL,
54
- SHARED_PERSISTENCE,
55
- ].join(" "),
56
-
57
- [PONYTAIL_LEVELS.FULL]: [
58
- SHARED_LADDER,
59
- "Level: full. The ladder is enforced — stdlib and native first, shortest diff, shortest explanation. Ship the lazy version and question unrequested scope in the same response.",
60
- SHARED_RULES,
61
- SHARED_OUTPUT,
62
- SHARED_BOUNDARIES,
63
- SHARED_SKEPTICAL,
64
- SHARED_PERSISTENCE,
65
- ].join(" "),
66
-
67
- [PONYTAIL_LEVELS.ULTRA]: [
68
- SHARED_LADDER,
69
- "Level: ultra. YAGNI extremist. Deletion before addition. Ship the one-liner and challenge the rest of the requirement in the same breath. No feature until a profiler or a real requirement demands it.",
70
- SHARED_RULES,
71
- SHARED_OUTPUT,
72
- SHARED_BOUNDARIES,
73
- SHARED_SKEPTICAL,
74
- SHARED_PERSISTENCE,
75
- ].join(" "),
76
- };
@@ -1,104 +0,0 @@
1
- // PXPIPE: render bulky Claude-format context as dense PNGs via pxpipe-proxy's
2
- // library API (transformAnthropicMessages). Fail-open like every token saver:
3
- // any error/timeout returns { body: null, summary } and leaves the request untouched.
4
- import { FORMATS } from "../translator/formats.js";
5
-
6
- const DEFAULT_TIMEOUT_MS = 15000;
7
- const DEFAULT_MIN_CHARS = 25000;
8
- // pxpipe's own profitability gate assumes ~4 chars/token; reuse it for the
9
- // estimated before/after numbers surfaced in stats (marked "estimated" in UI).
10
- const EST_CHARS_PER_TOKEN = 4;
11
-
12
- function bodyChars(body) {
13
- try {
14
- return JSON.stringify(body)?.length || 0;
15
- } catch {
16
- return 0;
17
- }
18
- }
19
-
20
- function estTokens(chars) {
21
- return Math.round(chars / EST_CHARS_PER_TOKEN);
22
- }
23
-
24
- function skipped(reason, extra = {}) {
25
- return { body: null, summary: { applied: false, reason, ...extra } };
26
- }
27
-
28
- // Transform a Claude-format request body through pxpipe. Returns
29
- // { body: <new body object> | null, summary } — body is null when nothing changed.
30
- // opts.transform is injected by the host (src side) so open-sse stays free of
31
- // filesystem/install concerns and remains usable standalone.
32
- export async function compressWithPxpipe(body, { enabled, format, model, minChars, timeoutMs, transform } = {}) {
33
- if (!enabled) return skipped("disabled");
34
- if (typeof transform !== "function") return skipped("not_installed");
35
- if (!body) return skipped("missing_body");
36
- if (format !== FORMATS.CLAUDE) return skipped("unsupported_format", { detail: format });
37
-
38
- const startedAt = Date.now();
39
- const originalChars = bodyChars(body);
40
- const threshold = Number(minChars) > 0 ? Number(minChars) : DEFAULT_MIN_CHARS;
41
- if (originalChars < threshold) {
42
- return skipped("below_threshold", { originalChars, threshold });
43
- }
44
-
45
- try {
46
- const encoded = new TextEncoder().encode(JSON.stringify(body));
47
- const budget = Number(timeoutMs) > 0 ? Number(timeoutMs) : DEFAULT_TIMEOUT_MS;
48
- // transformAnthropicMessages is local CPU work and can't be aborted; race a
49
- // timer and discard the result if it loses (input body is never mutated).
50
- const result = await Promise.race([
51
- transform({
52
- body: encoded,
53
- model,
54
- options: { minCompressChars: threshold },
55
- }),
56
- new Promise((resolve) => setTimeout(() => resolve(null), budget)),
57
- ]);
58
- if (!result) return skipped("timeout", { originalChars, durationMs: Date.now() - startedAt });
59
- if (!result.applied) {
60
- return skipped(result.reason || "passthrough", {
61
- detail: result.detail,
62
- originalChars,
63
- durationMs: Date.now() - startedAt,
64
- });
65
- }
66
-
67
- const newBody = JSON.parse(new TextDecoder().decode(result.body));
68
- const compressedBodyChars = bodyChars(newBody);
69
- const info = result.info || {};
70
- const imagedChars = info.compressedChars || 0;
71
- // The transformed body is BIGGER in bytes (base64 PNGs) but cheaper in tokens:
72
- // images bill by pixels (Anthropic: pixels/750), not by encoded length. So the
73
- // after-estimate is remaining-text tokens + image tokens — never chars/4 of the
74
- // new body. Provider-billed usage recorded per request stays the ground truth.
75
- const imageTokensEst = info.imageTokens
76
- || (info.imagePixels ? Math.round(info.imagePixels / 750) : (info.imageCount || 0) * 4761);
77
- const summary = {
78
- applied: true,
79
- reason: "applied",
80
- originalChars,
81
- compressedBodyChars,
82
- imagedChars,
83
- imageCount: info.imageCount || 0,
84
- imageBytes: info.imageBytes || 0,
85
- tokensBeforeEst: info.baselineTokens || estTokens(originalChars),
86
- tokensAfterEst: estTokens(Math.max(0, originalChars - imagedChars)) + imageTokensEst,
87
- durationMs: Date.now() - startedAt,
88
- cacheOwnsControl: result.cache?.ownsCacheControl === true,
89
- };
90
- summary.tokensSavedEst = Math.max(0, summary.tokensBeforeEst - summary.tokensAfterEst);
91
- summary.savedPct = summary.tokensBeforeEst > 0
92
- ? +((summary.tokensSavedEst / summary.tokensBeforeEst) * 100).toFixed(2)
93
- : 0;
94
- return { body: newBody, summary };
95
- } catch (e) {
96
- return skipped("transform_error", { detail: e?.message || String(e), originalChars, durationMs: Date.now() - startedAt });
97
- }
98
- }
99
-
100
- export function formatPxpipeLog(summary) {
101
- if (!summary) return null;
102
- if (!summary.applied) return null;
103
- return `imaged ${summary.imagedChars}ch → ${summary.imageCount} image(s) | est ${summary.tokensBeforeEst}→${summary.tokensAfterEst} tokens (-${summary.savedPct}%) | ${summary.durationMs}ms`;
104
- }