@fudrouter/fsrouter 0.6.63 → 0.6.64

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