@fudrouter/fsrouter 0.6.59 → 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 (556) hide show
  1. package/package.json +1 -1
  2. package/open-sse/AGENTS.md +0 -39
  3. package/open-sse/config/anthropicHeaders.js +0 -87
  4. package/open-sse/config/appConstants.js +0 -238
  5. package/open-sse/config/audioRegistry.js +0 -506
  6. package/open-sse/config/cliFingerprints.js +0 -304
  7. package/open-sse/config/codexInstructions.js +0 -119
  8. package/open-sse/config/codexQuotaScopes.js +0 -42
  9. package/open-sse/config/constants.js +0 -4
  10. package/open-sse/config/contextEditing.js +0 -68
  11. package/open-sse/config/credentialLoader.js +0 -83
  12. package/open-sse/config/defaultThinkingSignature.js +0 -12
  13. package/open-sse/config/embeddingRegistry.js +0 -264
  14. package/open-sse/config/errorConfig.js +0 -96
  15. package/open-sse/config/freeModelCatalog.data.js +0 -121
  16. package/open-sse/config/freeModelCatalog.js +0 -90
  17. package/open-sse/config/freeTierCatalog.js +0 -81
  18. package/open-sse/config/googleTtsLanguages.js +0 -62
  19. package/open-sse/config/imageParamDefs.js +0 -360
  20. package/open-sse/config/imageRegistry.js +0 -493
  21. package/open-sse/config/kiroConstants.js +0 -268
  22. package/open-sse/config/mediaConfig.js +0 -27
  23. package/open-sse/config/mediaServiceKinds.js +0 -71
  24. package/open-sse/config/models.js +0 -13
  25. package/open-sse/config/moderationRegistry.js +0 -71
  26. package/open-sse/config/musicRegistry.js +0 -99
  27. package/open-sse/config/ocrRegistry.js +0 -61
  28. package/open-sse/config/ollamaModels.js +0 -19
  29. package/open-sse/config/providerErrorRules.js +0 -114
  30. package/open-sse/config/providerFieldStrips.js +0 -35
  31. package/open-sse/config/providerHeaderProfiles.js +0 -191
  32. package/open-sse/config/providerModels.js +0 -106
  33. package/open-sse/config/providerRegistry.js +0 -16
  34. package/open-sse/config/providers.js +0 -19
  35. package/open-sse/config/registryUtils.js +0 -106
  36. package/open-sse/config/rerankRegistry.js +0 -177
  37. package/open-sse/config/runtimeConfig.js +0 -96
  38. package/open-sse/config/runway.js +0 -39
  39. package/open-sse/config/searchRegistry.js +0 -153
  40. package/open-sse/config/toolCloaking.js +0 -199
  41. package/open-sse/config/ttsModels.js +0 -129
  42. package/open-sse/config/videoRegistry.js +0 -207
  43. package/open-sse/executors/adapta-web.js +0 -435
  44. package/open-sse/executors/antigravity.js +0 -534
  45. package/open-sse/executors/antigravityUpstreamError.js +0 -13
  46. package/open-sse/executors/auggie.js +0 -437
  47. package/open-sse/executors/azure-openai.js +0 -32
  48. package/open-sse/executors/azure.js +0 -57
  49. package/open-sse/executors/base.js +0 -181
  50. package/open-sse/executors/bedrock.js +0 -633
  51. package/open-sse/executors/blackbox-web.js +0 -578
  52. package/open-sse/executors/chatgpt-web.js +0 -2042
  53. package/open-sse/executors/chipotle.js +0 -357
  54. package/open-sse/executors/claude-web-with-auto-refresh.js +0 -73
  55. package/open-sse/executors/claude-web.js +0 -586
  56. package/open-sse/executors/cliproxyapi.js +0 -296
  57. package/open-sse/executors/cloudflare-ai.js +0 -46
  58. package/open-sse/executors/codebuddy-cn.js +0 -40
  59. package/open-sse/executors/codex.js +0 -1324
  60. package/open-sse/executors/commandCode.js +0 -558
  61. package/open-sse/executors/commandcode.js +0 -88
  62. package/open-sse/executors/copilot-m365-connection.js +0 -176
  63. package/open-sse/executors/copilot-m365-frames.js +0 -192
  64. package/open-sse/executors/copilot-m365-web.js +0 -299
  65. package/open-sse/executors/copilot-web.js +0 -580
  66. package/open-sse/executors/cursor.js +0 -795
  67. package/open-sse/executors/deepseek-web-with-auto-refresh.js +0 -150
  68. package/open-sse/executors/deepseek-web.js +0 -875
  69. package/open-sse/executors/default.js +0 -430
  70. package/open-sse/executors/devin-cli.js +0 -351
  71. package/open-sse/executors/doubao-web.js +0 -550
  72. package/open-sse/executors/duckduckgo-web.js +0 -629
  73. package/open-sse/executors/forceResponsesUpstream.js +0 -33
  74. package/open-sse/executors/gemini-business.js +0 -320
  75. package/open-sse/executors/gemini-cli.js +0 -89
  76. package/open-sse/executors/gemini-web.js +0 -297
  77. package/open-sse/executors/github.js +0 -379
  78. package/open-sse/executors/gitlab.js +0 -569
  79. package/open-sse/executors/glm.js +0 -361
  80. package/open-sse/executors/grok-cli.js +0 -119
  81. package/open-sse/executors/grok-web.js +0 -345
  82. package/open-sse/executors/huggingchat.js +0 -467
  83. package/open-sse/executors/iflow.js +0 -108
  84. package/open-sse/executors/index.js +0 -78
  85. package/open-sse/executors/inner-ai.js +0 -527
  86. package/open-sse/executors/kimchi.js +0 -123
  87. package/open-sse/executors/kimi-web.js +0 -325
  88. package/open-sse/executors/kimi.js +0 -97
  89. package/open-sse/executors/kiro.js +0 -503
  90. package/open-sse/executors/kiroThinking.js +0 -44
  91. package/open-sse/executors/lmarena.js +0 -395
  92. package/open-sse/executors/mimo-free.js +0 -167
  93. package/open-sse/executors/mimocode.js +0 -392
  94. package/open-sse/executors/ninerouter.js +0 -155
  95. package/open-sse/executors/nlpcloud.js +0 -438
  96. package/open-sse/executors/ollama-local.js +0 -14
  97. package/open-sse/executors/opencode-go.js +0 -41
  98. package/open-sse/executors/opencode.js +0 -32
  99. package/open-sse/executors/perplexity-web.js +0 -581
  100. package/open-sse/executors/poe-web.js +0 -133
  101. package/open-sse/executors/pollinations.js +0 -95
  102. package/open-sse/executors/puter.js +0 -31
  103. package/open-sse/executors/qoder.js +0 -448
  104. package/open-sse/executors/qwen-web.js +0 -372
  105. package/open-sse/executors/qwen.js +0 -129
  106. package/open-sse/executors/t3-chat-web.js +0 -417
  107. package/open-sse/executors/theoldllm.js +0 -290
  108. package/open-sse/executors/trae.js +0 -418
  109. package/open-sse/executors/v0-vercel-web.js +0 -141
  110. package/open-sse/executors/venice-web.js +0 -142
  111. package/open-sse/executors/vertex.js +0 -131
  112. package/open-sse/executors/vertexMedia.js +0 -236
  113. package/open-sse/executors/windsurf.js +0 -560
  114. package/open-sse/executors/xai.js +0 -46
  115. package/open-sse/executors/xiaomi-tokenplan.js +0 -19
  116. package/open-sse/executors/yuanbao-web.js +0 -385
  117. package/open-sse/executors/zed-hosted.js +0 -281
  118. package/open-sse/executors/zenmux-free.js +0 -247
  119. package/open-sse/handlers/audioSpeech.js +0 -759
  120. package/open-sse/handlers/audioTranscription.js +0 -395
  121. package/open-sse/handlers/audioTranslation.js +0 -181
  122. package/open-sse/handlers/chatCore/nonStreamingHandler.js +0 -300
  123. package/open-sse/handlers/chatCore/requestDetail.js +0 -102
  124. package/open-sse/handlers/chatCore/sseToJsonHandler.js +0 -231
  125. package/open-sse/handlers/chatCore/streamingHandler.js +0 -95
  126. package/open-sse/handlers/chatCore.js +0 -404
  127. package/open-sse/handlers/embeddingProviders/_base.js +0 -4
  128. package/open-sse/handlers/embeddingProviders/gemini.js +0 -54
  129. package/open-sse/handlers/embeddingProviders/index.js +0 -23
  130. package/open-sse/handlers/embeddingProviders/openai.js +0 -39
  131. package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +0 -13
  132. package/open-sse/handlers/embeddingsCore.js +0 -126
  133. package/open-sse/handlers/fetch/index.js +0 -237
  134. package/open-sse/handlers/imageGenerationCore.js +0 -230
  135. package/open-sse/handlers/imageProviders/_base.js +0 -31
  136. package/open-sse/handlers/imageProviders/antigravity.js +0 -73
  137. package/open-sse/handlers/imageProviders/blackForestLabs.js +0 -63
  138. package/open-sse/handlers/imageProviders/cloudflareAi.js +0 -207
  139. package/open-sse/handlers/imageProviders/codex.js +0 -217
  140. package/open-sse/handlers/imageProviders/comfyui.js +0 -25
  141. package/open-sse/handlers/imageProviders/falAi.js +0 -62
  142. package/open-sse/handlers/imageProviders/gemini.js +0 -40
  143. package/open-sse/handlers/imageProviders/huggingface.js +0 -38
  144. package/open-sse/handlers/imageProviders/index.js +0 -44
  145. package/open-sse/handlers/imageProviders/leonardo.js +0 -435
  146. package/open-sse/handlers/imageProviders/nanobanana.js +0 -79
  147. package/open-sse/handlers/imageProviders/openai.js +0 -61
  148. package/open-sse/handlers/imageProviders/runwayml.js +0 -72
  149. package/open-sse/handlers/imageProviders/sdwebui.js +0 -36
  150. package/open-sse/handlers/imageProviders/stabilityAi.js +0 -59
  151. package/open-sse/handlers/imageProviders/weavy.js +0 -222
  152. package/open-sse/handlers/moderations.js +0 -92
  153. package/open-sse/handlers/ocr.js +0 -89
  154. package/open-sse/handlers/rerank.js +0 -223
  155. package/open-sse/handlers/responseSanitizer/reasoning.js +0 -144
  156. package/open-sse/handlers/responsesHandler.js +0 -99
  157. package/open-sse/handlers/search/callers.js +0 -371
  158. package/open-sse/handlers/search/chatSearch.js +0 -409
  159. package/open-sse/handlers/search/index.js +0 -201
  160. package/open-sse/handlers/search/normalizers.js +0 -223
  161. package/open-sse/handlers/search.js +0 -1056
  162. package/open-sse/handlers/sseParser.js +0 -469
  163. package/open-sse/handlers/sttCore.js +0 -193
  164. package/open-sse/handlers/ttsCore.js +0 -74
  165. package/open-sse/handlers/ttsProviders/_base.js +0 -39
  166. package/open-sse/handlers/ttsProviders/edgeTts.js +0 -89
  167. package/open-sse/handlers/ttsProviders/elevenlabs.js +0 -48
  168. package/open-sse/handlers/ttsProviders/gemini.js +0 -117
  169. package/open-sse/handlers/ttsProviders/genericFormats.js +0 -169
  170. package/open-sse/handlers/ttsProviders/googleTts.js +0 -54
  171. package/open-sse/handlers/ttsProviders/index.js +0 -50
  172. package/open-sse/handlers/ttsProviders/localDevice.js +0 -87
  173. package/open-sse/handlers/ttsProviders/minimax.js +0 -59
  174. package/open-sse/handlers/ttsProviders/openai.js +0 -30
  175. package/open-sse/handlers/ttsProviders/openrouter.js +0 -70
  176. package/open-sse/handlers/usageExtractor.js +0 -93
  177. package/open-sse/handlers/videoGenerationCore.js +0 -119
  178. package/open-sse/handlers/videoProviders/index.js +0 -22
  179. package/open-sse/handlers/videoProviders/leonardo.js +0 -511
  180. package/open-sse/handlers/videoProviders/weavy.js +0 -198
  181. package/open-sse/handlers/webFetch.js +0 -200
  182. package/open-sse/index.js +0 -79
  183. package/open-sse/mcp-server/audit.js +0 -283
  184. package/open-sse/mcp-server/catalog.js +0 -184
  185. package/open-sse/mcp-server/descriptionCompressor.js +0 -175
  186. package/open-sse/mcp-server/httpAuthContext.js +0 -32
  187. package/open-sse/mcp-server/httpTransport.js +0 -229
  188. package/open-sse/mcp-server/index.js +0 -33
  189. package/open-sse/mcp-server/mcpCallerIdentity.js +0 -21
  190. package/open-sse/mcp-server/runtimeHeartbeat.js +0 -110
  191. package/open-sse/mcp-server/schemas/a2a.js +0 -153
  192. package/open-sse/mcp-server/schemas/audit.js +0 -17
  193. package/open-sse/mcp-server/schemas/index.js +0 -166
  194. package/open-sse/mcp-server/schemas/pickFastestModel.js +0 -90
  195. package/open-sse/mcp-server/schemas/toolDefinition.js +0 -0
  196. package/open-sse/mcp-server/schemas/toolSearch.js +0 -32
  197. package/open-sse/mcp-server/schemas/tools.js +0 -1219
  198. package/open-sse/mcp-server/scopeEnforcement.js +0 -80
  199. package/open-sse/mcp-server/server.js +0 -1168
  200. package/open-sse/mcp-server/toolCardinality.js +0 -78
  201. package/open-sse/mcp-server/toolSearch/catalog.js +0 -66
  202. package/open-sse/mcp-server/toolSearch/handler.js +0 -20
  203. package/open-sse/mcp-server/toolSearch/index.js +0 -10
  204. package/open-sse/mcp-server/toolSearch/register.js +0 -21
  205. package/open-sse/mcp-server/toolSearch/search.js +0 -55
  206. package/open-sse/mcp-server/toolSearch/signature.js +0 -67
  207. package/open-sse/mcp-server/tools/advancedTools.js +0 -893
  208. package/open-sse/mcp-server/tools/agentSkillTools.js +0 -69
  209. package/open-sse/mcp-server/tools/compressionTools.js +0 -309
  210. package/open-sse/mcp-server/tools/gamificationTools.js +0 -134
  211. package/open-sse/mcp-server/tools/githubSkillTools.js +0 -102
  212. package/open-sse/mcp-server/tools/memoryTools.js +0 -118
  213. package/open-sse/mcp-server/tools/notionTools.js +0 -101
  214. package/open-sse/mcp-server/tools/obsidianTools.js +0 -307
  215. package/open-sse/mcp-server/tools/pickFastestModel.js +0 -223
  216. package/open-sse/mcp-server/tools/pluginTools.js +0 -181
  217. package/open-sse/mcp-server/tools/poolTools.js +0 -139
  218. package/open-sse/mcp-server/tools/skillTools.js +0 -113
  219. package/open-sse/package.json +0 -10
  220. package/open-sse/providers/REGISTRY_TEMPLATE.js +0 -98
  221. package/open-sse/providers/capabilities.js +0 -293
  222. package/open-sse/providers/index.js +0 -51
  223. package/open-sse/providers/models/helpers.js +0 -20
  224. package/open-sse/providers/models/namePatterns.js +0 -33
  225. package/open-sse/providers/models/schema.js +0 -40
  226. package/open-sse/providers/pricing.js +0 -308
  227. package/open-sse/providers/registry/alicode-intl.js +0 -30
  228. package/open-sse/providers/registry/alicode.js +0 -31
  229. package/open-sse/providers/registry/anthropic.js +0 -37
  230. package/open-sse/providers/registry/antigravity.js +0 -81
  231. package/open-sse/providers/registry/assemblyai.js +0 -38
  232. package/open-sse/providers/registry/aws-polly.js +0 -45
  233. package/open-sse/providers/registry/azure.js +0 -21
  234. package/open-sse/providers/registry/black-forest-labs.js +0 -32
  235. package/open-sse/providers/registry/blackbox.js +0 -41
  236. package/open-sse/providers/registry/brave-search.js +0 -35
  237. package/open-sse/providers/registry/byteplus.js +0 -35
  238. package/open-sse/providers/registry/cartesia.js +0 -36
  239. package/open-sse/providers/registry/cerebras.js +0 -31
  240. package/open-sse/providers/registry/chutes.js +0 -24
  241. package/open-sse/providers/registry/claude.js +0 -87
  242. package/open-sse/providers/registry/cline.js +0 -51
  243. package/open-sse/providers/registry/clinepass.js +0 -57
  244. package/open-sse/providers/registry/cloudflare-ai.js +0 -55
  245. package/open-sse/providers/registry/codebuddy-cn.js +0 -77
  246. package/open-sse/providers/registry/codex.js +0 -100
  247. package/open-sse/providers/registry/cohere.js +0 -27
  248. package/open-sse/providers/registry/comfyui.js +0 -20
  249. package/open-sse/providers/registry/commandcode.js +0 -43
  250. package/open-sse/providers/registry/coqui.js +0 -30
  251. package/open-sse/providers/registry/cursor.js +0 -58
  252. package/open-sse/providers/registry/deepgram.js +0 -33
  253. package/open-sse/providers/registry/deepseek.js +0 -51
  254. package/open-sse/providers/registry/digitalocean.js +0 -92
  255. package/open-sse/providers/registry/edge-tts.js +0 -24
  256. package/open-sse/providers/registry/elevenlabs.js +0 -35
  257. package/open-sse/providers/registry/exa.js +0 -50
  258. package/open-sse/providers/registry/fal-ai.js +0 -34
  259. package/open-sse/providers/registry/featherless.js +0 -34
  260. package/open-sse/providers/registry/firecrawl.js +0 -34
  261. package/open-sse/providers/registry/fireworks.js +0 -29
  262. package/open-sse/providers/registry/gemini-cli.js +0 -58
  263. package/open-sse/providers/registry/gemini.js +0 -83
  264. package/open-sse/providers/registry/github.js +0 -88
  265. package/open-sse/providers/registry/gitlab.js +0 -32
  266. package/open-sse/providers/registry/glm-cn.js +0 -35
  267. package/open-sse/providers/registry/glm.js +0 -58
  268. package/open-sse/providers/registry/google-pse.js +0 -35
  269. package/open-sse/providers/registry/google-tts.js +0 -24
  270. package/open-sse/providers/registry/grok-cli.js +0 -86
  271. package/open-sse/providers/registry/grok-web.js +0 -39
  272. package/open-sse/providers/registry/groq.js +0 -37
  273. package/open-sse/providers/registry/huggingface.js +0 -34
  274. package/open-sse/providers/registry/hyperbolic.js +0 -35
  275. package/open-sse/providers/registry/ibm-bob.js +0 -27
  276. package/open-sse/providers/registry/iflow.js +0 -52
  277. package/open-sse/providers/registry/index.js +0 -210
  278. package/open-sse/providers/registry/inworld.js +0 -36
  279. package/open-sse/providers/registry/jina-ai.js +0 -42
  280. package/open-sse/providers/registry/jina-reader.js +0 -34
  281. package/open-sse/providers/registry/kilocode.js +0 -51
  282. package/open-sse/providers/registry/kimchi.js +0 -49
  283. package/open-sse/providers/registry/kimi-coding.js +0 -65
  284. package/open-sse/providers/registry/kimi.js +0 -56
  285. package/open-sse/providers/registry/kiro.js +0 -115
  286. package/open-sse/providers/registry/linkup.js +0 -34
  287. package/open-sse/providers/registry/local-device.js +0 -24
  288. package/open-sse/providers/registry/mimo-free.js +0 -24
  289. package/open-sse/providers/registry/minimax-cn.js +0 -76
  290. package/open-sse/providers/registry/minimax.js +0 -83
  291. package/open-sse/providers/registry/mistral.js +0 -34
  292. package/open-sse/providers/registry/mmf.js +0 -19
  293. package/open-sse/providers/registry/nanobanana.js +0 -35
  294. package/open-sse/providers/registry/nebius.js +0 -27
  295. package/open-sse/providers/registry/nvidia.js +0 -43
  296. package/open-sse/providers/registry/ollama-local.js +0 -19
  297. package/open-sse/providers/registry/ollama.js +0 -36
  298. package/open-sse/providers/registry/openai.js +0 -84
  299. package/open-sse/providers/registry/opencode-go.js +0 -41
  300. package/open-sse/providers/registry/opencode.js +0 -25
  301. package/open-sse/providers/registry/openrouter.js +0 -60
  302. package/open-sse/providers/registry/perplexity-agent.js +0 -49
  303. package/open-sse/providers/registry/perplexity-web.js +0 -33
  304. package/open-sse/providers/registry/perplexity.js +0 -37
  305. package/open-sse/providers/registry/playht.js +0 -36
  306. package/open-sse/providers/registry/qoder.js +0 -54
  307. package/open-sse/providers/registry/qwen.js +0 -33
  308. package/open-sse/providers/registry/recraft.js +0 -24
  309. package/open-sse/providers/registry/runwayml.js +0 -30
  310. package/open-sse/providers/registry/sdwebui.js +0 -20
  311. package/open-sse/providers/registry/searchapi.js +0 -35
  312. package/open-sse/providers/registry/searxng.js +0 -35
  313. package/open-sse/providers/registry/serper.js +0 -35
  314. package/open-sse/providers/registry/siliconflow.js +0 -39
  315. package/open-sse/providers/registry/stability-ai.js +0 -31
  316. package/open-sse/providers/registry/tavily.js +0 -50
  317. package/open-sse/providers/registry/together.js +0 -31
  318. package/open-sse/providers/registry/topaz.js +0 -19
  319. package/open-sse/providers/registry/tortoise.js +0 -30
  320. package/open-sse/providers/registry/venice.js +0 -56
  321. package/open-sse/providers/registry/vercel-ai-gateway.js +0 -41
  322. package/open-sse/providers/registry/vertex-partner.js +0 -29
  323. package/open-sse/providers/registry/vertex.js +0 -32
  324. package/open-sse/providers/registry/volcengine-ark.js +0 -35
  325. package/open-sse/providers/registry/voyage-ai.js +0 -30
  326. package/open-sse/providers/registry/xai.js +0 -45
  327. package/open-sse/providers/registry/xiaomi-mimo.js +0 -46
  328. package/open-sse/providers/registry/xiaomi-tokenplan.js +0 -63
  329. package/open-sse/providers/registry/youcom.js +0 -35
  330. package/open-sse/providers/schema.js +0 -76
  331. package/open-sse/providers/shared.js +0 -74
  332. package/open-sse/providers/thinkingLevels.js +0 -48
  333. package/open-sse/rtk/applyFilter.js +0 -15
  334. package/open-sse/rtk/autodetect.js +0 -111
  335. package/open-sse/rtk/caveman.js +0 -100
  336. package/open-sse/rtk/cavemanPrompts.js +0 -78
  337. package/open-sse/rtk/constants.js +0 -55
  338. package/open-sse/rtk/filters/buildOutput.js +0 -127
  339. package/open-sse/rtk/filters/dedupLog.js +0 -44
  340. package/open-sse/rtk/filters/find.js +0 -50
  341. package/open-sse/rtk/filters/gitDiff.js +0 -92
  342. package/open-sse/rtk/filters/gitLog.js +0 -99
  343. package/open-sse/rtk/filters/gitStatus.js +0 -117
  344. package/open-sse/rtk/filters/grep.js +0 -48
  345. package/open-sse/rtk/filters/ls.js +0 -79
  346. package/open-sse/rtk/filters/readNumbered.js +0 -27
  347. package/open-sse/rtk/filters/searchList.js +0 -52
  348. package/open-sse/rtk/filters/smartTruncate.js +0 -15
  349. package/open-sse/rtk/filters/tree.js +0 -32
  350. package/open-sse/rtk/headroom.js +0 -215
  351. package/open-sse/rtk/index.js +0 -155
  352. package/open-sse/rtk/paleo.js +0 -47
  353. package/open-sse/rtk/ponytail.js +0 -9
  354. package/open-sse/rtk/ponytailPrompt.js +0 -52
  355. package/open-sse/rtk/ponytailPrompts.js +0 -76
  356. package/open-sse/rtk/pxpipe.js +0 -104
  357. package/open-sse/rtk/registry.js +0 -38
  358. package/open-sse/rtk/systemInject.js +0 -98
  359. package/open-sse/services/accountFallback.js +0 -323
  360. package/open-sse/services/antigravityHeaders.js +0 -91
  361. package/open-sse/services/antigravityVersion.js +0 -154
  362. package/open-sse/services/clinepassModels.js +0 -63
  363. package/open-sse/services/codexQuotaFetcher.js +0 -312
  364. package/open-sse/services/codexVerbosity.js +0 -30
  365. package/open-sse/services/combo/context.js +0 -12
  366. package/open-sse/services/combo/fingerprintExpansion.js +0 -51
  367. package/open-sse/services/combo/headroomRanking.js +0 -28
  368. package/open-sse/services/combo/quotaExhaustionCutoff.js +0 -87
  369. package/open-sse/services/combo/quotaScoring.js +0 -226
  370. package/open-sse/services/combo/quotaShareConcurrency.js +0 -25
  371. package/open-sse/services/combo/quotaShareInflight.js +0 -50
  372. package/open-sse/services/combo/quotaShareStrategy.js +0 -130
  373. package/open-sse/services/combo/resolveAutoStrategy.js +0 -231
  374. package/open-sse/services/combo/responseValidation.js +0 -140
  375. package/open-sse/services/combo/runtimeUnits.js +0 -195
  376. package/open-sse/services/combo/sessionStickiness.js +0 -128
  377. package/open-sse/services/combo/shadowRouting.js +0 -131
  378. package/open-sse/services/combo/targetExhaustion.js +0 -75
  379. package/open-sse/services/combo/targetSorters.js +0 -126
  380. package/open-sse/services/combo/targetTimeoutRunner.js +0 -65
  381. package/open-sse/services/combo/validateQuality.js +0 -271
  382. package/open-sse/services/combo.js +0 -571
  383. package/open-sse/services/comboAgentMiddleware.js +0 -91
  384. package/open-sse/services/comboConfig.js +0 -153
  385. package/open-sse/services/comboManifestMetrics.js +0 -10
  386. package/open-sse/services/comboMetrics.js +0 -278
  387. package/open-sse/services/compact.js +0 -71
  388. package/open-sse/services/copilotModels.js +0 -155
  389. package/open-sse/services/emergencyFallback.js +0 -109
  390. package/open-sse/services/errorClassifier.js +0 -190
  391. package/open-sse/services/evalRouting.js +0 -201
  392. package/open-sse/services/freeWebSearch.js +0 -4
  393. package/open-sse/services/fusion.js +0 -223
  394. package/open-sse/services/intentClassifier.js +0 -631
  395. package/open-sse/services/kimchiModels.js +0 -176
  396. package/open-sse/services/kiroModels.js +0 -332
  397. package/open-sse/services/model.js +0 -136
  398. package/open-sse/services/modelCapabilities.js +0 -5
  399. package/open-sse/services/modelDeprecation.js +0 -101
  400. package/open-sse/services/modelFamilyFallback.js +0 -166
  401. package/open-sse/services/oauthCredentialManager.js +0 -156
  402. package/open-sse/services/pipeline.js +0 -107
  403. package/open-sse/services/projectId.js +0 -306
  404. package/open-sse/services/provider.js +0 -169
  405. package/open-sse/services/providerCooldownTracker.js +0 -94
  406. package/open-sse/services/providerDefaultRateLimit.js +0 -11
  407. package/open-sse/services/proxyAutoSelector.js +0 -24
  408. package/open-sse/services/qoderModels.js +0 -214
  409. package/open-sse/services/quotaFetchThrottle.js +0 -103
  410. package/open-sse/services/quotaMonitor.js +0 -310
  411. package/open-sse/services/quotaPreflight.js +0 -266
  412. package/open-sse/services/rateLimitManager/headers.js +0 -56
  413. package/open-sse/services/rateLimitManager.js +0 -616
  414. package/open-sse/services/rateLimitSemaphore.js +0 -112
  415. package/open-sse/services/responsesInputSanitizer.js +0 -99
  416. package/open-sse/services/slidingWindowLimiter.js +0 -44
  417. package/open-sse/services/streamRecovery.js +0 -355
  418. package/open-sse/services/taskAwareRouter.js +0 -227
  419. package/open-sse/services/taskAwareRouting.js +0 -332
  420. package/open-sse/services/thinkingBudget.js +0 -247
  421. package/open-sse/services/tokenRefresh/dedup.js +0 -31
  422. package/open-sse/services/tokenRefresh/providers.js +0 -624
  423. package/open-sse/services/tokenRefresh.js +0 -254
  424. package/open-sse/services/usage/claude.js +0 -147
  425. package/open-sse/services/usage/codebuddy-cn.js +0 -138
  426. package/open-sse/services/usage/codex.js +0 -267
  427. package/open-sse/services/usage/github.js +0 -100
  428. package/open-sse/services/usage/google.js +0 -241
  429. package/open-sse/services/usage/grok-cli.js +0 -274
  430. package/open-sse/services/usage/kiro.js +0 -188
  431. package/open-sse/services/usage/minimax.js +0 -234
  432. package/open-sse/services/usage/misc.js +0 -288
  433. package/open-sse/services/usage/shared.js +0 -70
  434. package/open-sse/services/usage.js +0 -62
  435. package/open-sse/services/usageDb.js +0 -2
  436. package/open-sse/services/webSearchRouting.js +0 -25
  437. package/open-sse/services/wildcardRouter.js +0 -59
  438. package/open-sse/shared/clineAuth.js +0 -37
  439. package/open-sse/shared/machineId.js +0 -19
  440. package/open-sse/shared/qoder/constants.js +0 -64
  441. package/open-sse/shared/qoder/cosy.js +0 -175
  442. package/open-sse/shared/qoder/encoding.js +0 -55
  443. package/open-sse/transformer/responsesTransformer.js +0 -439
  444. package/open-sse/transformer/streamToJsonConverter.js +0 -103
  445. package/open-sse/translator/concerns/chunk.js +0 -11
  446. package/open-sse/translator/concerns/finishReason.js +0 -63
  447. package/open-sse/translator/concerns/image.js +0 -124
  448. package/open-sse/translator/concerns/json.js +0 -5
  449. package/open-sse/translator/concerns/message.js +0 -7
  450. package/open-sse/translator/concerns/modality.js +0 -155
  451. package/open-sse/translator/concerns/paramSupport.js +0 -75
  452. package/open-sse/translator/concerns/prefetch.js +0 -96
  453. package/open-sse/translator/concerns/reasoning.js +0 -24
  454. package/open-sse/translator/concerns/thinking.js +0 -53
  455. package/open-sse/translator/concerns/thinkingUnified.js +0 -329
  456. package/open-sse/translator/concerns/toolCall.js +0 -153
  457. package/open-sse/translator/concerns/usage.js +0 -69
  458. package/open-sse/translator/formats/claude.js +0 -368
  459. package/open-sse/translator/formats/gemini.js +0 -380
  460. package/open-sse/translator/formats/maxTokens.js +0 -34
  461. package/open-sse/translator/formats/openai.js +0 -134
  462. package/open-sse/translator/formats/responsesApi.js +0 -141
  463. package/open-sse/translator/formats.js +0 -36
  464. package/open-sse/translator/helpers/claudeHelper.js +0 -216
  465. package/open-sse/translator/helpers/geminiHelper.js +0 -372
  466. package/open-sse/translator/helpers/imageHelper.js +0 -34
  467. package/open-sse/translator/helpers/maxTokensHelper.js +0 -27
  468. package/open-sse/translator/helpers/openaiHelper.js +0 -130
  469. package/open-sse/translator/helpers/responsesApiHelper.js +0 -139
  470. package/open-sse/translator/helpers/toolCallHelper.js +0 -148
  471. package/open-sse/translator/index.js +0 -252
  472. package/open-sse/translator/request/antigravity-to-openai.js +0 -242
  473. package/open-sse/translator/request/claude-to-kiro.js +0 -478
  474. package/open-sse/translator/request/claude-to-openai.js +0 -263
  475. package/open-sse/translator/request/gemini-to-openai.js +0 -152
  476. package/open-sse/translator/request/openai-responses.js +0 -385
  477. package/open-sse/translator/request/openai-to-claude.js +0 -383
  478. package/open-sse/translator/request/openai-to-commandcode.js +0 -176
  479. package/open-sse/translator/request/openai-to-cursor.js +0 -185
  480. package/open-sse/translator/request/openai-to-gemini.js +0 -442
  481. package/open-sse/translator/request/openai-to-kiro.js +0 -607
  482. package/open-sse/translator/request/openai-to-kiro.old.js +0 -278
  483. package/open-sse/translator/request/openai-to-ollama.js +0 -195
  484. package/open-sse/translator/request/openai-to-vertex.js +0 -42
  485. package/open-sse/translator/response/claude-to-openai.js +0 -195
  486. package/open-sse/translator/response/commandcode-to-openai.js +0 -188
  487. package/open-sse/translator/response/cursor-to-openai.js +0 -30
  488. package/open-sse/translator/response/gemini-to-openai.js +0 -147
  489. package/open-sse/translator/response/kiro-to-claude.js +0 -261
  490. package/open-sse/translator/response/kiro-to-openai.js +0 -160
  491. package/open-sse/translator/response/ollama-to-openai.js +0 -134
  492. package/open-sse/translator/response/openai-responses.js +0 -535
  493. package/open-sse/translator/response/openai-to-antigravity.js +0 -123
  494. package/open-sse/translator/response/openai-to-claude.js +0 -265
  495. package/open-sse/translator/schema/blocks.js +0 -43
  496. package/open-sse/translator/schema/defaults.js +0 -7
  497. package/open-sse/translator/schema/finishReasons.js +0 -27
  498. package/open-sse/translator/schema/index.js +0 -8
  499. package/open-sse/translator/schema/roles.js +0 -16
  500. package/open-sse/utils/agentGoalPolicy.js +0 -85
  501. package/open-sse/utils/aiSdkCompat.js +0 -75
  502. package/open-sse/utils/bypassHandler.js +0 -298
  503. package/open-sse/utils/cacheControlPolicy.js +0 -189
  504. package/open-sse/utils/claudeCloaking.js +0 -155
  505. package/open-sse/utils/claudeHeaderCache.js +0 -70
  506. package/open-sse/utils/claudeSignature.js +0 -41
  507. package/open-sse/utils/clientDetector.js +0 -63
  508. package/open-sse/utils/codebuddySanitizer.js +0 -96
  509. package/open-sse/utils/composerToolCalls.js +0 -158
  510. package/open-sse/utils/cors.js +0 -13
  511. package/open-sse/utils/cursorChecksum.js +0 -149
  512. package/open-sse/utils/cursorImages.js +0 -224
  513. package/open-sse/utils/cursorProtobuf.js +0 -904
  514. package/open-sse/utils/cursorVersionDetector.js +0 -55
  515. package/open-sse/utils/debugLog.js +0 -14
  516. package/open-sse/utils/diagnostics.js +0 -143
  517. package/open-sse/utils/error.js +0 -164
  518. package/open-sse/utils/estimateSize.js +0 -33
  519. package/open-sse/utils/finishReason.js +0 -32
  520. package/open-sse/utils/flattenToolHistory.js +0 -68
  521. package/open-sse/utils/headers.js +0 -36
  522. package/open-sse/utils/heapPressure.js +0 -35
  523. package/open-sse/utils/jsonToSse.js +0 -125
  524. package/open-sse/utils/keepaliveThreshold.js +0 -40
  525. package/open-sse/utils/logger.js +0 -104
  526. package/open-sse/utils/noThinkingAlias.js +0 -74
  527. package/open-sse/utils/number.js +0 -7
  528. package/open-sse/utils/ollamaTransform.js +0 -85
  529. package/open-sse/utils/opencodeHeaders.js +0 -47
  530. package/open-sse/utils/progressTracker.js +0 -81
  531. package/open-sse/utils/providerRequestLogging.js +0 -219
  532. package/open-sse/utils/proxyFetch.js +0 -369
  533. package/open-sse/utils/reasoningContentInjector.js +0 -79
  534. package/open-sse/utils/reasoningFields.js +0 -70
  535. package/open-sse/utils/requestLogger.js +0 -260
  536. package/open-sse/utils/responsesInputNormalization.js +0 -92
  537. package/open-sse/utils/responsesStatePolicy.js +0 -52
  538. package/open-sse/utils/responsesStreamHelpers.js +0 -49
  539. package/open-sse/utils/sessionManager.js +0 -240
  540. package/open-sse/utils/sleep.js +0 -6
  541. package/open-sse/utils/sse.js +0 -14
  542. package/open-sse/utils/sseConstants.js +0 -23
  543. package/open-sse/utils/sseHeartbeat.js +0 -104
  544. package/open-sse/utils/stream.js +0 -517
  545. package/open-sse/utils/streamFailureFinalization.js +0 -134
  546. package/open-sse/utils/streamHandler.js +0 -250
  547. package/open-sse/utils/streamHelpers.js +0 -137
  548. package/open-sse/utils/textualToolCall.js +0 -104
  549. package/open-sse/utils/thinkCloseMarker.js +0 -72
  550. package/open-sse/utils/thinkTagParser.js +0 -146
  551. package/open-sse/utils/toolCallArguments.js +0 -12
  552. package/open-sse/utils/toolDeduper.js +0 -49
  553. package/open-sse/utils/toolSources.js +0 -31
  554. package/open-sse/utils/upstreamResponseHeaders.js +0 -25
  555. package/open-sse/utils/urlSanitize.js +0 -15
  556. 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
- }