@fudrouter/fsrouter 0.6.64 → 0.6.66

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