@fudrouter/fsrouter 0.6.64 → 0.6.65

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,72 @@
1
+ /**
2
+ * RunwayML image and video generation adapter.
3
+ *
4
+ * Providers: runwayml
5
+ * Auth: Bearer token + X-Runway-Version header
6
+ * Format: JSON body → async polling
7
+ * Polling: Yes — polls task ID until status == "SUCCEEDED"
8
+ *
9
+ * Model routing:
10
+ * - "*_image*" model IDs → POST /text_to_image (image generation)
11
+ * - all others → POST /image_to_video (video generation)
12
+ *
13
+ * Image model params:
14
+ * @param {string} prompt - (required) Image description (sent as promptText)
15
+ * @param {string} [size] - Maps to ratio: "1:1"|"16:9"|"9:16" etc.
16
+ * @param {string} [image] - Reference image URL (referenceImages[])
17
+ *
18
+ * Video model params:
19
+ * @param {string} prompt - (required) Video description (promptText)
20
+ * @param {string} [image] - Start frame URL (promptImage)
21
+ * @param {number} [duration=5] - Video duration in seconds
22
+ * @param {string} [resolution] - "720p"|"1080p"
23
+ *
24
+ * Response normalize: output[] → { created, data: [{ url }] }.
25
+ */
26
+ // Runway ML — async submit + /tasks/{id} polling
27
+ import { sleep, nowSec, sizeToAspectRatio, POLL_INTERVAL_MS, POLL_TIMEOUT_MS } from "./_base.js";
28
+
29
+ const BASE_URL = "https://api.dev.runwayml.com/v1";
30
+
31
+ export default {
32
+ async: true,
33
+ buildUrl: (model) => {
34
+ // Image models (gen4_image*) → text_to_image; video models → image_to_video
35
+ return `${BASE_URL}/${model.includes("image") ? "text_to_image" : "image_to_video"}`;
36
+ },
37
+ buildHeaders: (creds) => {
38
+ const key = creds?.apiKey || creds?.accessToken;
39
+ return {
40
+ "Content-Type": "application/json",
41
+ "Authorization": `Bearer ${key}`,
42
+ "X-Runway-Version": "2024-11-06",
43
+ };
44
+ },
45
+ buildBody: (model, body) => {
46
+ const isVideo = !model.includes("image");
47
+ const ratio = sizeToAspectRatio(body.size);
48
+ if (isVideo) {
49
+ return { promptText: body.prompt, model, ratio, duration: 5, ...(body.image ? { promptImage: body.image } : {}) };
50
+ }
51
+ return { promptText: body.prompt, model, ratio, ...(body.image ? { referenceImages: [{ uri: body.image }] } : {}) };
52
+ },
53
+ async parseResponse(response, { headers }) {
54
+ const { id } = await response.json();
55
+ if (!id) throw new Error("Runway: no task id returned");
56
+ const taskUrl = `${BASE_URL}/tasks/${id}`;
57
+ const deadline = Date.now() + POLL_TIMEOUT_MS;
58
+ while (Date.now() < deadline) {
59
+ await sleep(POLL_INTERVAL_MS);
60
+ const r = await fetch(taskUrl, { headers });
61
+ if (!r.ok) throw new Error(`Runway status ${r.status}`);
62
+ const s = await r.json();
63
+ if (s.status === "SUCCEEDED") return s;
64
+ if (s.status === "FAILED" || s.status === "CANCELLED") throw new Error(s.failure || "Runway task failed");
65
+ }
66
+ throw new Error("Runway polling timeout");
67
+ },
68
+ normalize: (responseBody) => {
69
+ const outputs = Array.isArray(responseBody.output) ? responseBody.output : [];
70
+ return { created: nowSec(), data: outputs.map((url) => ({ url })) };
71
+ },
72
+ };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Stable Diffusion WebUI (Automatic1111) local adapter.
3
+ *
4
+ * Providers: sdwebui (self-hosted instance)
5
+ * Auth: Optional HTTP Basic auth (username/password)
6
+ * Format: JSON body → sync JSON response
7
+ * Polling: None (synchronous, but can be slow)
8
+ *
9
+ * Supported request params:
10
+ * @param {string} prompt - (required) Positive prompt
11
+ * @param {number} [n=1] - Number of images (batch_size)
12
+ * @param {string} [size="512x512"] - Dimensions e.g. "512x512", "768x768" → width/height
13
+ * @param {string} [negative_prompt] - Tokens to exclude
14
+ * @param {number} [seed] - Fixed seed (-1 = random)
15
+ * @param {number} [guidance=7] - CFG scale
16
+ * @param {number} [num_steps=20] - Sampling steps
17
+ *
18
+ * Response normalize: extracts images[0] → { created, data: [{ b64_json }] }.
19
+ */
20
+ // SD WebUI (AUTOMATIC1111) — local, noAuth
21
+ import { nowSec } from "./_base.js";
22
+
23
+ export default {
24
+ noAuth: true,
25
+ buildUrl: () => "http://localhost:7860/sdapi/v1/txt2img",
26
+ buildHeaders: () => ({ "Content-Type": "application/json" }),
27
+ buildBody: (_model, body) => {
28
+ const { prompt, n = 1, size = "1024x1024" } = body;
29
+ const [width, height] = size.split("x").map(Number);
30
+ return { prompt, width: width || 512, height: height || 512, steps: 20, batch_size: n };
31
+ },
32
+ normalize: (responseBody) => {
33
+ const images = Array.isArray(responseBody.images) ? responseBody.images.map((img) => ({ b64_json: img })) : [];
34
+ return { created: nowSec(), data: images };
35
+ },
36
+ };
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Stability AI v2beta image generation adapter.
3
+ *
4
+ * Providers: stability-ai
5
+ * Auth: Bearer token via Authorization header (apiKey or accessToken)
6
+ * Format: JSON body → sync JSON response ({ image: "<b64>" })
7
+ * Polling: None (synchronous)
8
+ *
9
+ * Endpoint routing by model:
10
+ * - "stable-image-ultra" → /ultra
11
+ * - "sd3*" → /sd3
12
+ * - all others → /core
13
+ *
14
+ * Supported request params:
15
+ * @param {string} prompt - (required) Image description
16
+ * @param {string} [size="1024x1024"] - Maps to aspect_ratio: "1:1"|"16:9"|"9:16"|"4:3"|"3:2"|"2:3"
17
+ * @param {string} [style] - Style preset (core only): "anime"|"photographic"|"cinematic" etc.
18
+ * @param {string} [negative_prompt] - Elements to exclude
19
+ * @param {number} [seed] - Fixed seed
20
+ * @param {number} [guidance] - CFG scale
21
+ * @param {string} [output_format="png"] - "png"|"jpeg"|"webp"
22
+ * @param {string} [model] - SD3 only: "sd3.5-large"|"sd3.5-large-turbo"|"sd3.5-medium"
23
+ *
24
+ * Response normalize: { image: b64 } → { created, data: [{ b64_json }] }.
25
+ */
26
+ // Stability AI v2 — sync, returns { image: "<b64>" }
27
+ import { nowSec, sizeToAspectRatio } from "./_base.js";
28
+
29
+ const BASE_URL = "https://api.stability.ai/v2beta/stable-image/generate";
30
+
31
+ // Map model id → endpoint segment
32
+ function modelToEndpoint(model) {
33
+ if (model.includes("ultra")) return "ultra";
34
+ if (model.includes("sd3")) return "sd3";
35
+ return "core";
36
+ }
37
+
38
+ export default {
39
+ buildUrl: (model) => `${BASE_URL}/${modelToEndpoint(model)}`,
40
+ buildHeaders: (creds) => {
41
+ const key = creds?.apiKey || creds?.accessToken;
42
+ return {
43
+ "Content-Type": "application/json",
44
+ "Authorization": `Bearer ${key}`,
45
+ "Accept": "application/json",
46
+ };
47
+ },
48
+ buildBody: (model, body) => {
49
+ const req = { prompt: body.prompt, output_format: (body.output_format || "png").toLowerCase() };
50
+ if (body.size) req.aspect_ratio = sizeToAspectRatio(body.size);
51
+ if (body.style) req.style_preset = body.style;
52
+ if (model.includes("sd3")) req.model = model;
53
+ return req;
54
+ },
55
+ normalize: (responseBody) => {
56
+ if (responseBody.image) return { created: nowSec(), data: [{ b64_json: responseBody.image }] };
57
+ return { created: nowSec(), data: [] };
58
+ },
59
+ };
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Weavy AI image and video generation adapter.
3
+ *
4
+ * Providers: weavy
5
+ * Auth: Firebase JWT Bearer token + x-weavy-* headers
6
+ * Requires: accessToken (or apiKey), optionally email/connectionName
7
+ * Format: POST duplicate-recipe → then delegates to weavy_generate.py subprocess
8
+ * Polling: Handled entirely by weavy_generate.py (polls Weavy batch status)
9
+ *
10
+ * MODEL TYPE DETECTION:
11
+ * - Model IDs registered as type="image" → --model-type image
12
+ * - Model IDs registered as type="video" → --model-type video
13
+ * - Detected at runtime by checking PROVIDER_MODELS registry
14
+ *
15
+ * NOTE: Weavy image models use FAL-style image_size names (square_hd, portrait_16_9, etc.).
16
+ * The backend (weavy_service.py) maps these to the appropriate format per model:
17
+ * - FAL models: image_size = "portrait_16_9" etc. (passed directly)
18
+ * - Replicate/Google: aspect_ratio = "9:16" etc. (converted from FAL name)
19
+ * - GPT Image 2: size = "1024x1536" etc. (converted via size_map)
20
+ *
21
+ * Supported request params (image models):
22
+ * @param {string} prompt - (required) Image/video description
23
+ * @param {string} [size="1:1"] - Aspect ratio: "1:1"|"16:9"|"9:16"|"4:3"|"3:2"|"2:3"
24
+ * @param {string} [negative_prompt] - Elements to exclude (model-dependent)
25
+ * @param {string} [image_url] - Reference/start-frame image URL
26
+ *
27
+ * Additional params for video models:
28
+ * @param {number} [duration] - Duration in seconds (model-specific: 5/8/10 etc.)
29
+ * @param {string} [video_url] - Reference video URL (motion-strength models)
30
+ * @param {string} [end_image_url] - End/last-frame image URL (first-last-frame models)
31
+ *
32
+ * Headers:
33
+ * @header Authorization Bearer {token}
34
+ * @header x-weavy-auth-provider "firebase"
35
+ * @header x-weavy-token JWT token
36
+ * @header x-weavy-email User email
37
+ */
38
+ import path from "path";
39
+ import { execFile } from "child_process";
40
+ import { promisify } from "util";
41
+ import { PROVIDER_MODELS } from "../../config/providerModels.js";
42
+ import { updateProviderConnection } from '../../../dist/lib/localDb.js';
43
+
44
+ const TEMPLATE_ID = "SZXXYN7L9PN2SCTVYAlt";
45
+
46
+ // 10 MB buffer — avoids ENOBUFS on heavy stderr logs
47
+ const MAX_BUFFER = 10 * 1024 * 1024;
48
+ // Timeout slightly longer than Python's own 180 s image timeout
49
+ const EXEC_TIMEOUT_MS = 240_000; // 4 minutes
50
+
51
+ export default {
52
+ skipFetch: true,
53
+
54
+ buildUrl: (_model, _creds) => {
55
+ return `https://api.weavy.ai/api/v1/recipes/${TEMPLATE_ID}/duplicate`;
56
+ },
57
+
58
+ buildHeaders: (...args) => {
59
+ const creds = args[0];
60
+ const token = creds?.accessToken || creds?.apiKey || "";
61
+ const email = creds?.email || creds?.name || creds?.connectionName || "";
62
+ const connectionId = creds?.connectionId || creds?.id || "";
63
+ return {
64
+ "x-weavy-auth-provider": "firebase",
65
+ "x-app-version": "4.1.489",
66
+ "authorization": `Bearer ${token}`,
67
+ "Accept": "application/json",
68
+ "Content-Type": "application/json",
69
+ "x-weavy-email": email,
70
+ "x-weavy-token": token,
71
+ "x-weavy-connection-id": connectionId,
72
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
73
+ };
74
+ },
75
+
76
+ buildBody: async (_model, _body) => {
77
+ return {};
78
+ },
79
+
80
+ async parseResponse(response, { headers, log, model, body }) {
81
+ const email = headers["x-weavy-email"] || "";
82
+ const token = headers["x-weavy-token"] || "";
83
+ const connId = headers["x-weavy-connection-id"] || "";
84
+ const prompt = body.prompt || "";
85
+ const size = body.size || "1:1";
86
+ const modelId = model.replace(/^weavy-/, "");
87
+ const imageUrl = body.image_url || body.imageReference || body.start_frame || body.startFrame || "";
88
+ const endImageUrl = body.end_image_url || body.endImageUrl || "";
89
+ const videoUrl = body.video_url || body.videoUrl || "";
90
+ const negativePrompt = body.negative_prompt || "";
91
+ const duration = body.duration ? parseInt(body.duration, 10) : undefined;
92
+
93
+ // Detect model type from registry (image vs video)
94
+ const weavyModels = PROVIDER_MODELS["weavy"] || [];
95
+ const modelEntry = weavyModels.find(m => m.id === model);
96
+ const modelType = modelEntry?.type === "video" ? "video" : "image";
97
+
98
+ log?.debug?.("WEAVY", `Running generation via python: email=${email}, model=${modelId}, type=${modelType}, prompt="${prompt.slice(0, 30)}..." img=${imageUrl ? "yes" : "no"} endImg=${endImageUrl ? "yes" : "no"} video=${videoUrl ? "yes" : "no"} dur=${duration ?? "none"} negPrompt=${negativePrompt ? "yes" : "no"}`);
99
+
100
+ const venvPython = path.resolve(process.cwd(), ".venv/bin/python");
101
+ const scriptPath = path.resolve(process.cwd(), "src/automation/weavy_generate.py");
102
+ const profilesDir = path.resolve(process.cwd(), "profiles/weavy");
103
+
104
+ const execFileAsync = promisify(execFile);
105
+ let stdout;
106
+ let stderr;
107
+ try {
108
+ const args = [
109
+ scriptPath,
110
+ "--email", email,
111
+ "--prompt", prompt,
112
+ "--aspect-ratio", size,
113
+ "--model-type", modelType,
114
+ "--model", modelId,
115
+ "--profiles-dir", profilesDir,
116
+ "--token", token,
117
+ ];
118
+ if (imageUrl) {
119
+ args.push("--image-url", imageUrl);
120
+ }
121
+ if (endImageUrl) {
122
+ args.push("--end-image-url", endImageUrl);
123
+ }
124
+ if (videoUrl) {
125
+ args.push("--video-url", videoUrl);
126
+ }
127
+ if (duration !== undefined && !isNaN(duration)) {
128
+ args.push("--duration", String(duration));
129
+ }
130
+ if (negativePrompt) {
131
+ args.push("--negative-prompt", negativePrompt);
132
+ }
133
+
134
+ const res = await execFileAsync(venvPython, args, {
135
+ maxBuffer: MAX_BUFFER,
136
+ timeout: EXEC_TIMEOUT_MS,
137
+ });
138
+ stdout = res.stdout;
139
+ stderr = res.stderr;
140
+ } catch (err) {
141
+ if (err.message && token) {
142
+ err.message = err.message.split(token).join("[REDACTED_JWT_TOKEN]");
143
+ }
144
+ if (err.stderr) {
145
+ log?.debug?.("WEAVY", `stderr: ${err.stderr.slice(0, 500)}`);
146
+ }
147
+ if (err.killed || err.code === "ETIMEDOUT") {
148
+ throw new Error("Weavy image generation timed out (Node exec limit)");
149
+ }
150
+ // Surface actual Python error message from stdout JSON (e.g. "only available on paid plans").
151
+ // When Python exits with code 1, execFile throws with a generic "Command failed: ..." message
152
+ // and the real error sits in err.stdout — which error classification rules can't match.
153
+ if (err.stdout) {
154
+ try {
155
+ const pyOut = JSON.parse(err.stdout.trim());
156
+ if (pyOut?.message) {
157
+ const actualMsg = token ? pyOut.message.split(token).join("[REDACTED_JWT_TOKEN]") : pyOut.message;
158
+ log?.debug?.("WEAVY", `python error: ${actualMsg.slice(0, 300)}`);
159
+ throw new Error(actualMsg);
160
+ }
161
+ } catch (innerErr) {
162
+ if (innerErr !== err) throw innerErr; // re-throw the new Error we just constructed
163
+ // stdout wasn't valid JSON → fall through to original error
164
+ }
165
+ }
166
+ throw err;
167
+ }
168
+
169
+ // Surface Python stderr for debugging
170
+ if (stderr) {
171
+ log?.debug?.("WEAVY", `python stderr: ${stderr.slice(0, 500)}`);
172
+ }
173
+
174
+ let parsed;
175
+ try {
176
+ parsed = JSON.parse(stdout.trim());
177
+ } catch (parseErr) {
178
+ log?.debug?.("WEAVY", `JSON parse failed. stdout="${stdout.slice(0, 200)}"`);
179
+ throw new Error(`Weavy image returned non-JSON output: ${stdout.slice(0, 200)}`);
180
+ }
181
+
182
+ if (parsed.status === "success" && Array.isArray(parsed.urls)) {
183
+ if (connId) {
184
+ const updates = {};
185
+ if (parsed.balance !== undefined) {
186
+ updates.last_balance = parsed.balance;
187
+ }
188
+ if (parsed.refreshed_token) {
189
+ updates.accessToken = parsed.refreshed_token;
190
+ updates.cached_jwt = parsed.refreshed_token;
191
+ updates.testStatus = "active";
192
+ try {
193
+ const payload = JSON.parse(Buffer.from(parsed.refreshed_token.split('.')[1], 'base64').toString());
194
+ if (payload && payload.exp) {
195
+ updates.jwt_expires_at = payload.exp;
196
+ updates.expiresAt = new Date(payload.exp * 1000).toISOString();
197
+ }
198
+ } catch (e) {
199
+ const exp = Math.floor(Date.now() / 1000) + 3600;
200
+ updates.jwt_expires_at = exp;
201
+ updates.expiresAt = new Date(exp * 1000).toISOString();
202
+ }
203
+ }
204
+ if (Object.keys(updates).length > 0) {
205
+ updateProviderConnection(connId, updates).catch(() => {});
206
+ }
207
+ }
208
+ return {
209
+ created: Math.floor(Date.now() / 1000),
210
+ data: parsed.urls.map(url => ({ url }))
211
+ };
212
+ } else {
213
+ throw new Error(parsed.message || "Weavy generation failed");
214
+ }
215
+ },
216
+
217
+ normalize: (parsed) => {
218
+ if (parsed?.created && Array.isArray(parsed?.data)) return parsed;
219
+ const urls = Array.isArray(parsed?.data) ? parsed.data : [];
220
+ return { created: Math.floor(Date.now() / 1000), data: urls };
221
+ },
222
+ };
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Moderation Handler
3
+ *
4
+ * Handles POST /v1/moderations (OpenAI Moderations API format).
5
+ * Converted from OmniRoute TypeScript.
6
+ */
7
+
8
+ const CORS_HEADERS = {
9
+ "Access-Control-Allow-Origin": "*",
10
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
11
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
12
+ };
13
+
14
+ import { MODERATION_PROVIDERS, parseModerationModel, getModerationProvider } from "../config/moderationRegistry.js";
15
+
16
+ // ── Inline stubs for @/ imports ──────────────────────────────────────
17
+ function attachOmniRouteMetaHeaders(headers, meta) {
18
+ if (meta.provider) headers.set("X-Provider", meta.provider);
19
+ if (meta.model) headers.set("X-Model", meta.model);
20
+ if (meta.latencyMs != null) headers.set("X-Latency-Ms", String(meta.latencyMs));
21
+ }
22
+
23
+ function generateRequestId() {
24
+ return crypto.randomUUID();
25
+ }
26
+
27
+ import { errorResponse } from "../utils/error.js";
28
+
29
+ /**
30
+ * Handle moderation request
31
+ */
32
+ export async function handleModeration({ body, credentials }) {
33
+ const startTime = Date.now();
34
+ if (!body.input) {
35
+ return errorResponse(400, "input is required");
36
+ }
37
+
38
+ // Default to latest moderation model
39
+ const model = body.model || "omni-moderation-latest";
40
+ const { provider: providerId, model: modelId } = parseModerationModel(model);
41
+ const providerConfig = providerId ? getModerationProvider(providerId) : null;
42
+
43
+ if (!providerConfig) {
44
+ return errorResponse(
45
+ 400,
46
+ `No moderation provider found for model "${model}". Available: openai`
47
+ );
48
+ }
49
+
50
+ const token = credentials?.apiKey || credentials?.accessToken;
51
+ if (!token) {
52
+ return errorResponse(401, `No credentials for moderation provider: ${providerId}`);
53
+ }
54
+
55
+ try {
56
+ const res = await fetch(providerConfig.baseUrl, {
57
+ method: "POST",
58
+ headers: {
59
+ "Content-Type": "application/json",
60
+ Authorization: `Bearer ${token}`,
61
+ },
62
+ body: JSON.stringify({
63
+ model: modelId,
64
+ input: body.input,
65
+ }),
66
+ });
67
+
68
+ if (!res.ok) {
69
+ const errText = await res.text();
70
+ return new Response(errText, {
71
+ status: res.status,
72
+ headers: {
73
+ "Content-Type": "application/json",
74
+ ...CORS_HEADERS,
75
+ },
76
+ });
77
+ }
78
+
79
+ const data = await res.json();
80
+ const headers = new Headers({ ...CORS_HEADERS, "Content-Type": "application/json" });
81
+ attachOmniRouteMetaHeaders(headers, {
82
+ provider: providerId,
83
+ model: modelId,
84
+ costUsd: 0,
85
+ latencyMs: Date.now() - startTime,
86
+ requestId: generateRequestId(),
87
+ });
88
+ return new Response(JSON.stringify(data), { status: 200, headers });
89
+ } catch (err) {
90
+ return errorResponse(500, `Moderation request failed: ${err.message}`);
91
+ }
92
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * OCR Handler
3
+ *
4
+ * Handles POST /v1/ocr (Mistral OCR API format).
5
+ * Converted from OmniRoute TypeScript.
6
+ */
7
+
8
+ const CORS_HEADERS = {
9
+ "Access-Control-Allow-Origin": "*",
10
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
11
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
12
+ };
13
+
14
+ import { OCR_PROVIDERS, parseOcrModel, getOcrProvider } from "../config/ocrRegistry.js";
15
+
16
+ // ── Inline stubs for @/ imports ──────────────────────────────────────
17
+ function attachOmniRouteMetaHeaders(headers, meta) {
18
+ if (meta.provider) headers.set("X-Provider", meta.provider);
19
+ if (meta.model) headers.set("X-Model", meta.model);
20
+ if (meta.latencyMs != null) headers.set("X-Latency-Ms", String(meta.latencyMs));
21
+ }
22
+
23
+ function generateRequestId() {
24
+ return crypto.randomUUID();
25
+ }
26
+
27
+ import { errorResponse } from "../utils/error.js";
28
+
29
+ /**
30
+ * Handle OCR request
31
+ */
32
+ export async function handleOcr({ body, credentials }) {
33
+ const startTime = Date.now();
34
+ if (!body.document) {
35
+ return errorResponse(400, "document is required");
36
+ }
37
+
38
+ // Default to latest OCR model
39
+ const model = body.model || "mistral-ocr-latest";
40
+ const { provider: providerId, model: modelId } = parseOcrModel(model);
41
+ const providerConfig = providerId ? getOcrProvider(providerId) : null;
42
+
43
+ if (!providerConfig) {
44
+ return errorResponse(400, `No OCR provider found for model "${model}". Available: mistral`);
45
+ }
46
+
47
+ const token = credentials?.apiKey || credentials?.accessToken;
48
+ if (!token) {
49
+ return errorResponse(401, `No credentials for OCR provider: ${providerId}`);
50
+ }
51
+
52
+ try {
53
+ const res = await fetch(providerConfig.baseUrl, {
54
+ method: "POST",
55
+ headers: {
56
+ "Content-Type": "application/json",
57
+ Authorization: `Bearer ${token}`,
58
+ },
59
+ body: JSON.stringify({
60
+ ...body,
61
+ model: modelId,
62
+ }),
63
+ });
64
+
65
+ if (!res.ok) {
66
+ const errText = await res.text();
67
+ return new Response(errText, {
68
+ status: res.status,
69
+ headers: {
70
+ "Content-Type": "application/json",
71
+ ...CORS_HEADERS,
72
+ },
73
+ });
74
+ }
75
+
76
+ const data = await res.json();
77
+ const headers = new Headers({ ...CORS_HEADERS, "Content-Type": "application/json" });
78
+ attachOmniRouteMetaHeaders(headers, {
79
+ provider: providerId,
80
+ model: modelId,
81
+ costUsd: 0,
82
+ latencyMs: Date.now() - startTime,
83
+ requestId: generateRequestId(),
84
+ });
85
+ return new Response(JSON.stringify(data), { status: 200, headers });
86
+ } catch (err) {
87
+ return errorResponse(500, `OCR request failed: ${err.message}`);
88
+ }
89
+ }