@fudrouter/fsrouter 0.6.72 → 0.6.74

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 (314) hide show
  1. package/dist/lib/headroom/detect.js +97 -7
  2. package/dist/lib/headroom/process.js +136 -4
  3. package/dist/open-sse/config/appConstants.js +23 -79
  4. package/dist/open-sse/config/cliFingerprints.js +1 -1
  5. package/dist/open-sse/config/errorConfig.js +0 -11
  6. package/dist/open-sse/config/grokCli.js +10 -0
  7. package/dist/open-sse/config/kiroConstants.js +99 -46
  8. package/dist/open-sse/config/runtimeConfig.js +2 -0
  9. package/dist/open-sse/config/ttsModels.js +2 -0
  10. package/dist/open-sse/executors/antigravity.js +250 -164
  11. package/dist/open-sse/executors/base.js +16 -11
  12. package/dist/open-sse/executors/codex.js +269 -1108
  13. package/dist/open-sse/executors/commandCode.js +1 -1
  14. package/dist/open-sse/executors/commandcode.js +10 -4
  15. package/dist/open-sse/executors/cursor.js +96 -203
  16. package/dist/open-sse/executors/default.js +146 -244
  17. package/dist/open-sse/executors/github.js +128 -73
  18. package/dist/open-sse/executors/grok-cli.js +527 -94
  19. package/dist/open-sse/executors/grok-web.js +5 -7
  20. package/dist/open-sse/executors/index.js +12 -0
  21. package/dist/open-sse/executors/kiro.js +150 -61
  22. package/dist/open-sse/executors/opencode-go.js +12 -4
  23. package/dist/open-sse/executors/opencode.js +1 -1
  24. package/dist/open-sse/executors/perplexity-web.js +20 -96
  25. package/dist/open-sse/executors/qoder.js +28 -18
  26. package/dist/open-sse/executors/vertex.js +53 -7
  27. package/dist/open-sse/executors/xiaomi-tokenplan.js +6 -5
  28. package/dist/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
  29. package/dist/open-sse/handlers/chatCore/requestDetail.js +32 -8
  30. package/dist/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
  31. package/dist/open-sse/handlers/chatCore/streamingHandler.js +74 -25
  32. package/dist/open-sse/handlers/chatCore.js +35 -41
  33. package/dist/open-sse/handlers/embeddingProviders/index.js +1 -0
  34. package/dist/open-sse/handlers/embeddingProviders/openai.js +8 -16
  35. package/dist/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
  36. package/dist/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
  37. package/dist/open-sse/handlers/imageProviders/codex.js +2 -20
  38. package/dist/open-sse/handlers/imageProviders/comfyui.js +5 -18
  39. package/dist/open-sse/handlers/imageProviders/falAi.js +2 -22
  40. package/dist/open-sse/handlers/imageProviders/gemini.js +2 -16
  41. package/dist/open-sse/handlers/imageProviders/huggingface.js +2 -17
  42. package/dist/open-sse/handlers/imageProviders/index.js +3 -4
  43. package/dist/open-sse/handlers/imageProviders/leonardo.js +1 -1
  44. package/dist/open-sse/handlers/imageProviders/nanobanana.js +4 -23
  45. package/dist/open-sse/handlers/imageProviders/openai.js +15 -43
  46. package/dist/open-sse/handlers/imageProviders/runwayml.js +2 -26
  47. package/dist/open-sse/handlers/imageProviders/sdwebui.js +4 -20
  48. package/dist/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
  49. package/dist/open-sse/handlers/imageProviders/weavy.js +1 -1
  50. package/dist/open-sse/handlers/search/chatSearch.js +60 -14
  51. package/dist/open-sse/handlers/ttsProviders/gemini.js +14 -3
  52. package/dist/open-sse/handlers/ttsProviders/index.js +4 -2
  53. package/dist/open-sse/handlers/ttsProviders/openai.js +4 -1
  54. package/dist/open-sse/handlers/ttsProviders/openrouter.js +7 -4
  55. package/dist/open-sse/handlers/videoCore.js +166 -0
  56. package/dist/open-sse/handlers/videoProviders/weavy.js +1 -1
  57. package/dist/open-sse/mcp-server/catalog.js +1 -1
  58. package/dist/open-sse/mcp-server/server.js +2 -2
  59. package/dist/open-sse/mcp-server/tools/advancedTools.js +2 -2
  60. package/dist/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
  61. package/dist/open-sse/mcp-server/tools/compressionTools.js +4 -4
  62. package/dist/open-sse/mcp-server/tools/gamificationTools.js +10 -10
  63. package/dist/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
  64. package/dist/open-sse/mcp-server/tools/memoryTools.js +3 -3
  65. package/dist/open-sse/mcp-server/tools/notionTools.js +2 -2
  66. package/dist/open-sse/mcp-server/tools/obsidianTools.js +2 -2
  67. package/dist/open-sse/mcp-server/tools/pickFastestModel.js +1 -1
  68. package/dist/open-sse/mcp-server/tools/pluginTools.js +4 -4
  69. package/dist/open-sse/mcp-server/tools/skillTools.js +2 -2
  70. package/dist/open-sse/providers/capabilities.js +24 -4
  71. package/dist/open-sse/providers/registry/alicode-intl.js +1 -1
  72. package/dist/open-sse/providers/registry/anthropic.js +1 -8
  73. package/dist/open-sse/providers/registry/codex.js +0 -9
  74. package/dist/open-sse/providers/registry/cohere.js +0 -2
  75. package/dist/open-sse/providers/registry/gemini.js +0 -2
  76. package/dist/open-sse/providers/registry/github.js +9 -6
  77. package/dist/open-sse/providers/registry/grok-cli.js +28 -18
  78. package/dist/open-sse/providers/registry/index.js +74 -80
  79. package/dist/open-sse/providers/registry/kiro.js +12 -0
  80. package/dist/open-sse/providers/registry/mistral.js +0 -3
  81. package/dist/open-sse/providers/registry/openai.js +0 -3
  82. package/dist/open-sse/providers/registry/perplexity.js +0 -2
  83. package/dist/open-sse/providers/registry/xai.js +5 -3
  84. package/dist/open-sse/rtk/autodetect.js +10 -2
  85. package/dist/open-sse/rtk/caveman.js +2 -93
  86. package/dist/open-sse/rtk/cavemanPrompts.js +34 -2
  87. package/dist/open-sse/rtk/constants.js +7 -2
  88. package/dist/open-sse/rtk/headroom.js +133 -0
  89. package/dist/open-sse/rtk/ponytail.js +1 -1
  90. package/dist/open-sse/rtk/registry.js +2 -0
  91. package/dist/open-sse/services/accountFallback.js +0 -108
  92. package/dist/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
  93. package/dist/open-sse/services/combo/quotaShareStrategy.js +1 -1
  94. package/dist/open-sse/services/combo/resolveAutoStrategy.js +1 -1
  95. package/dist/open-sse/services/combo/sessionStickiness.js +1 -1
  96. package/dist/open-sse/services/combo/targetSorters.js +2 -2
  97. package/dist/open-sse/services/combo/validateQuality.js +1 -1
  98. package/dist/open-sse/services/comboConfig.js +1 -1
  99. package/dist/open-sse/services/emergencyFallback.js +1 -1
  100. package/dist/open-sse/services/grokCliModels.js +127 -0
  101. package/dist/open-sse/services/model.js +7 -1
  102. package/dist/open-sse/services/provider.js +1 -1
  103. package/dist/open-sse/services/proxyAutoSelector.js +1 -1
  104. package/dist/open-sse/services/tokenRefresh/providers.js +3 -3
  105. package/dist/open-sse/services/usage/codex.js +148 -214
  106. package/dist/open-sse/services/usage/grok-cli.js +61 -7
  107. package/dist/open-sse/services/usage/misc.js +0 -19
  108. package/dist/open-sse/services/usage.js +0 -2
  109. package/dist/open-sse/translator/concerns/paramSupport.js +2 -2
  110. package/dist/open-sse/translator/concerns/thinkingUnified.js +6 -0
  111. package/dist/open-sse/translator/index.js +97 -59
  112. package/dist/open-sse/translator/request/claude-to-kiro.js +67 -40
  113. package/dist/open-sse/translator/request/openai-responses.js +1 -0
  114. package/dist/open-sse/translator/request/openai-to-commandcode.js +0 -4
  115. package/dist/open-sse/translator/request/openai-to-kiro.js +49 -20
  116. package/dist/open-sse/translator/response/commandcode-to-openai.js +0 -4
  117. package/dist/open-sse/utils/bypassHandler.js +18 -3
  118. package/dist/open-sse/utils/claudeCloaking.js +15 -5
  119. package/dist/open-sse/utils/cursorImages.js +1 -1
  120. package/dist/open-sse/utils/error.js +0 -17
  121. package/dist/open-sse/utils/keepaliveThreshold.js +4 -4
  122. package/dist/open-sse/utils/kiroSessionReplay.js +125 -0
  123. package/dist/open-sse/utils/noThinkingAlias.js +1 -1
  124. package/dist/open-sse/utils/proxyFetch.js +0 -1
  125. package/dist/open-sse/utils/reasoningContentInjector.js +4 -7
  126. package/dist/open-sse/utils/responsesStatePolicy.js +1 -1
  127. package/dist/open-sse/utils/responsesStreamHelpers.js +1 -0
  128. package/dist/open-sse/utils/sessionManager.js +49 -22
  129. package/dist/open-sse/utils/stream.js +54 -77
  130. package/dist/open-sse/utils/streamHandler.js +19 -15
  131. package/dist/open-sse/utils/streamHelpers.js +2 -17
  132. package/dist/open-sse/utils/usageTracking.js +103 -12
  133. package/dist/routes/headroom/extras/route.js +58 -0
  134. package/dist/routes/headroom/restart/route.js +33 -0
  135. package/open-sse/config/appConstants.js +23 -79
  136. package/open-sse/config/errorConfig.js +0 -11
  137. package/open-sse/config/grokCli.js +10 -0
  138. package/open-sse/config/kiroConstants.js +99 -46
  139. package/open-sse/config/runtimeConfig.js +2 -0
  140. package/open-sse/config/ttsModels.js +2 -0
  141. package/open-sse/executors/antigravity.js +250 -164
  142. package/open-sse/executors/base.js +16 -11
  143. package/open-sse/executors/codex.js +269 -1108
  144. package/open-sse/executors/commandcode.js +10 -4
  145. package/open-sse/executors/cursor.js +96 -203
  146. package/open-sse/executors/default.js +146 -244
  147. package/open-sse/executors/github.js +128 -73
  148. package/open-sse/executors/grok-cli.js +527 -94
  149. package/open-sse/executors/grok-web.js +5 -7
  150. package/open-sse/executors/index.js +12 -0
  151. package/open-sse/executors/kiro.js +150 -61
  152. package/open-sse/executors/opencode-go.js +12 -4
  153. package/open-sse/executors/opencode.js +1 -1
  154. package/open-sse/executors/perplexity-web.js +20 -96
  155. package/open-sse/executors/qoder.js +28 -18
  156. package/open-sse/executors/vertex.js +53 -7
  157. package/open-sse/executors/xiaomi-tokenplan.js +6 -5
  158. package/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
  159. package/open-sse/handlers/chatCore/requestDetail.js +32 -8
  160. package/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
  161. package/open-sse/handlers/chatCore/streamingHandler.js +74 -25
  162. package/open-sse/handlers/chatCore.js +35 -41
  163. package/open-sse/handlers/embeddingProviders/index.js +1 -0
  164. package/open-sse/handlers/embeddingProviders/openai.js +8 -16
  165. package/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
  166. package/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
  167. package/open-sse/handlers/imageProviders/codex.js +2 -20
  168. package/open-sse/handlers/imageProviders/comfyui.js +5 -18
  169. package/open-sse/handlers/imageProviders/falAi.js +2 -22
  170. package/open-sse/handlers/imageProviders/gemini.js +2 -16
  171. package/open-sse/handlers/imageProviders/huggingface.js +2 -17
  172. package/open-sse/handlers/imageProviders/index.js +3 -4
  173. package/open-sse/handlers/imageProviders/leonardo.js +1 -1
  174. package/open-sse/handlers/imageProviders/nanobanana.js +4 -23
  175. package/open-sse/handlers/imageProviders/openai.js +15 -43
  176. package/open-sse/handlers/imageProviders/runwayml.js +2 -26
  177. package/open-sse/handlers/imageProviders/sdwebui.js +4 -20
  178. package/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
  179. package/open-sse/handlers/imageProviders/weavy.js +1 -1
  180. package/open-sse/handlers/search/chatSearch.js +60 -14
  181. package/open-sse/handlers/ttsProviders/gemini.js +14 -3
  182. package/open-sse/handlers/ttsProviders/index.js +4 -2
  183. package/open-sse/handlers/ttsProviders/openai.js +4 -1
  184. package/open-sse/handlers/ttsProviders/openrouter.js +7 -4
  185. package/open-sse/handlers/videoCore.js +166 -0
  186. package/open-sse/handlers/videoProviders/weavy.js +1 -1
  187. package/open-sse/mcp-server/audit.js +1 -1
  188. package/open-sse/mcp-server/catalog.js +2 -2
  189. package/open-sse/mcp-server/descriptionCompressor.js +1 -1
  190. package/open-sse/mcp-server/mcpCallerIdentity.js +1 -1
  191. package/open-sse/mcp-server/schemas/tools.js +1 -1
  192. package/open-sse/mcp-server/server.js +4 -4
  193. package/open-sse/mcp-server/tools/advancedTools.js +5 -5
  194. package/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
  195. package/open-sse/mcp-server/tools/compressionTools.js +4 -4
  196. package/open-sse/mcp-server/tools/gamificationTools.js +10 -10
  197. package/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
  198. package/open-sse/mcp-server/tools/memoryTools.js +3 -3
  199. package/open-sse/mcp-server/tools/notionTools.js +2 -2
  200. package/open-sse/mcp-server/tools/obsidianTools.js +2 -2
  201. package/open-sse/mcp-server/tools/pickFastestModel.js +3 -3
  202. package/open-sse/mcp-server/tools/pluginTools.js +4 -4
  203. package/open-sse/mcp-server/tools/skillTools.js +2 -2
  204. package/open-sse/providers/capabilities.js +24 -4
  205. package/open-sse/providers/registry/alicode-intl.js +1 -1
  206. package/open-sse/providers/registry/anthropic.js +1 -8
  207. package/open-sse/providers/registry/codex.js +0 -9
  208. package/open-sse/providers/registry/cohere.js +0 -2
  209. package/open-sse/providers/registry/gemini.js +0 -2
  210. package/open-sse/providers/registry/github.js +9 -6
  211. package/open-sse/providers/registry/grok-cli.js +28 -18
  212. package/open-sse/providers/registry/index.js +74 -80
  213. package/open-sse/providers/registry/kiro.js +12 -0
  214. package/open-sse/providers/registry/mistral.js +0 -3
  215. package/open-sse/providers/registry/openai.js +0 -3
  216. package/open-sse/providers/registry/perplexity.js +0 -2
  217. package/open-sse/providers/registry/xai.js +5 -3
  218. package/open-sse/rtk/autodetect.js +10 -2
  219. package/open-sse/rtk/caveman.js +2 -93
  220. package/open-sse/rtk/cavemanPrompts.js +34 -2
  221. package/open-sse/rtk/constants.js +7 -2
  222. package/open-sse/rtk/headroom.js +133 -0
  223. package/open-sse/rtk/ponytail.js +1 -1
  224. package/open-sse/rtk/registry.js +2 -0
  225. package/open-sse/services/accountFallback.js +0 -108
  226. package/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
  227. package/open-sse/services/combo/quotaShareStrategy.js +1 -1
  228. package/open-sse/services/combo/resolveAutoStrategy.js +1 -1
  229. package/open-sse/services/combo/sessionStickiness.js +1 -1
  230. package/open-sse/services/combo/shadowRouting.js +1 -1
  231. package/open-sse/services/combo/targetSorters.js +4 -4
  232. package/open-sse/services/combo/validateQuality.js +1 -1
  233. package/open-sse/services/evalRouting.js +1 -1
  234. package/open-sse/services/grokCliModels.js +127 -0
  235. package/open-sse/services/model.js +7 -1
  236. package/open-sse/services/modelCapabilities.js +1 -1
  237. package/open-sse/services/modelFamilyFallback.js +1 -1
  238. package/open-sse/services/provider.js +1 -1
  239. package/open-sse/services/providerCooldownTracker.js +1 -1
  240. package/open-sse/services/rateLimitManager.js +1 -1
  241. package/open-sse/services/tokenRefresh/providers.js +3 -3
  242. package/open-sse/services/usage/codex.js +148 -214
  243. package/open-sse/services/usage/grok-cli.js +61 -7
  244. package/open-sse/services/usage/misc.js +0 -19
  245. package/open-sse/services/usage.js +0 -2
  246. package/open-sse/translator/concerns/paramSupport.js +2 -2
  247. package/open-sse/translator/concerns/thinkingUnified.js +6 -0
  248. package/open-sse/translator/index.js +97 -59
  249. package/open-sse/translator/request/claude-to-kiro.js +67 -40
  250. package/open-sse/translator/request/openai-responses.js +1 -0
  251. package/open-sse/translator/request/openai-to-commandcode.js +0 -4
  252. package/open-sse/translator/request/openai-to-kiro.js +49 -20
  253. package/open-sse/translator/response/commandcode-to-openai.js +0 -4
  254. package/open-sse/utils/bypassHandler.js +18 -3
  255. package/open-sse/utils/claudeCloaking.js +15 -5
  256. package/open-sse/utils/error.js +0 -17
  257. package/open-sse/utils/kiroSessionReplay.js +125 -0
  258. package/open-sse/utils/logger.js +1 -1
  259. package/open-sse/utils/proxyFetch.js +0 -1
  260. package/open-sse/utils/reasoningContentInjector.js +4 -7
  261. package/open-sse/utils/responsesStreamHelpers.js +1 -0
  262. package/open-sse/utils/sessionManager.js +49 -22
  263. package/open-sse/utils/stream.js +54 -77
  264. package/open-sse/utils/streamHandler.js +19 -15
  265. package/open-sse/utils/streamHelpers.js +2 -17
  266. package/open-sse/utils/usageTracking.js +103 -12
  267. package/package.json +4 -7
  268. package/public/assets/EndpointPageClient.C2WMTYy0.js +6 -0
  269. package/public/assets/{Loading.Bj-WGl4k.js → Loading.BHPtQ9vj.js} +1 -1
  270. package/public/assets/{NoAuthProxyCard.qAv57b-0.js → NoAuthProxyCard.BDcXaWvM.js} +1 -1
  271. package/public/assets/index.Be3gbrBl.js +89 -0
  272. package/public/assets/index.COMgQZYj.css +1 -0
  273. package/public/assets/{page.CbkENBd5.js → page.-lpNgYAw.js} +1 -1
  274. package/public/assets/{page.CssmrzTT.js → page.11hpNKmq.js} +1 -1
  275. package/public/assets/{page.C72FTTJr.js → page.B-LxsnqU.js} +1 -1
  276. package/public/assets/{page.sOFOrxqq.js → page.B-dzeIUC.js} +1 -1
  277. package/public/assets/{page.CsxWmPoI.js → page.B-nBR75u.js} +1 -1
  278. package/public/assets/{page.Dx_GRRdT.js → page.B3QqvLep.js} +1 -1
  279. package/public/assets/{page.DPyOkPVo.js → page.B8xdkCWA.js} +1 -1
  280. package/public/assets/{page.DUI8kqOY.js → page.BFb7yUd8.js} +1 -1
  281. package/public/assets/page.BbPPdoas.js +1 -0
  282. package/public/assets/page.BdS20a1O.js +1 -0
  283. package/public/assets/{page.DibhF7f-.js → page.BfmI9KYe.js} +1 -1
  284. package/public/assets/{page.DX4Nno6M.js → page.BgGJovOg.js} +1 -1
  285. package/public/assets/{page.BnmTC5jG.js → page.C0gBvR4O.js} +1 -1
  286. package/public/assets/{page.D5gj98Oe.js → page.C6bYizL7.js} +1 -1
  287. package/public/assets/{page.vla5Mzki.js → page.C8sLEMa6.js} +1 -1
  288. package/public/assets/{page.CXd_R9yU.js → page.CCNsZBXp.js} +1 -1
  289. package/public/assets/{page.CQlVGoXg.js → page.CF_YSLwP.js} +1 -1
  290. package/public/assets/{page.BbO1pspY.js → page.CPTtRDxw.js} +1 -1
  291. package/public/assets/{page.D1oKew1j.js → page.CdMmlUEm.js} +1 -1
  292. package/public/assets/{page.DxMDTbSx.js → page.Cged1bOZ.js} +1 -1
  293. package/public/assets/{page.Cj5h09Zo.js → page.Ch647dVk.js} +1 -1
  294. package/public/assets/{page.DVIHRbxB.js → page.CpvXDkQF.js} +1 -1
  295. package/public/assets/{page.i4KDuWcM.js → page.CrBl7f8N.js} +1 -1
  296. package/public/assets/{page.BSLJ4tx5.js → page.CrP7niA2.js} +1 -1
  297. package/public/assets/{page.CnTop8Zt.js → page.CvUFZzXr.js} +1 -1
  298. package/public/assets/{page.O2ddJYoT.js → page.CyUqJPmx.js} +1 -1
  299. package/public/assets/{page.DBhu4Arl.js → page.D8Rp8fFR.js} +1 -1
  300. package/public/assets/{page.CPZav1_c.js → page.Df9qtrdG.js} +1 -1
  301. package/public/assets/{page.Qkkv8roc.js → page.DiL4Gwqe.js} +1 -1
  302. package/public/assets/{page.BdmJ3yY3.js → page.Dl1apZE2.js} +1 -1
  303. package/public/assets/{page.1qjqvrwX.js → page.HV0w1d5C.js} +1 -1
  304. package/public/assets/{page.ChX1NqmC.js → page.N1x4YL8_.js} +1 -1
  305. package/public/assets/{page.Dh5f0XJC.js → page.P2Ny5veR.js} +1 -1
  306. package/public/assets/{page.CSs3-gdt.js → page.fOOCr18J.js} +1 -1
  307. package/public/assets/{page.Ir7KvKcF.js → page.sUIPWIiF.js} +1 -1
  308. package/public/assets/{page.CzlQTyAL.js → page.tE7PpWYW.js} +1 -1
  309. package/public/assets/{page.DzZLqI5Q.js → page.uziaGZsT.js} +1 -1
  310. package/public/index.html +2 -2
  311. package/public/assets/EndpointPageClient.LyNNvZ4z.js +0 -6
  312. package/public/assets/index.BuPfZebu.css +0 -1
  313. package/public/assets/index.CShjRV_B.js +0 -89
  314. package/public/assets/page.DD_czjjP.js +0 -1
@@ -1,32 +1,8 @@
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
1
  // Stability AI v2 — sync, returns { image: "<b64>" }
27
2
  import { nowSec, sizeToAspectRatio } from "./_base.js";
3
+ import { PROVIDER_MEDIA } from "../../providers/index.js";
28
4
 
29
- const BASE_URL = "https://api.stability.ai/v2beta/stable-image/generate";
5
+ const BASE_URL = PROVIDER_MEDIA["stability-ai"]?.imageConfig?.baseUrl;
30
6
 
31
7
  // Map model id → endpoint segment
32
8
  function modelToEndpoint(model) {
@@ -39,7 +39,7 @@ import path from "path";
39
39
  import { execFile } from "child_process";
40
40
  import { promisify } from "util";
41
41
  import { PROVIDER_MODELS } from "../../config/providerModels.js";
42
- import { updateProviderConnection } from '../../../../dist/lib/localDb.js';
42
+ import { updateProviderConnection } from '../../../dist/lib/localDb.js';
43
43
 
44
44
  const TEMPLATE_ID = "SZXXYN7L9PN2SCTVYAlt";
45
45
 
@@ -2,6 +2,12 @@
2
2
  * Wrap chat-completions endpoints (with built-in web search) into the unified
3
3
  * /v1/search response format. Supports gemini, openai, xai, kimi, minimax, perplexity.
4
4
  */
5
+ import { PROVIDER_MEDIA } from "../../providers/index.js";
6
+
7
+ // Default search model + endpoint derive from registry searchViaChat (single source)
8
+ const searchModel = (id) => PROVIDER_MEDIA[id]?.searchViaChat?.defaultModel;
9
+ const searchEndpoint = (id, model) =>
10
+ (PROVIDER_MEDIA[id]?.searchViaChat?.endpoint || "").replace("{model}", model || "");
5
11
 
6
12
  const REQUEST_TIMEOUT_MS = 15000;
7
13
  const DEFAULT_MAX_RESULTS = 10;
@@ -43,9 +49,7 @@ function normalizeCitation(c) {
43
49
  */
44
50
  const CHAT_SEARCH_CONFIG = {
45
51
  gemini: {
46
- endpoint: (model) =>
47
- `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`,
48
- defaultModel: "gemini-2.5-flash",
52
+ endpoint: (model) => searchEndpoint("gemini", model),
49
53
  buildBody: (query) => ({
50
54
  contents: [{ role: "user", parts: [{ text: query }] }],
51
55
  tools: [{ google_search: {} }]
@@ -70,8 +74,7 @@ const CHAT_SEARCH_CONFIG = {
70
74
  },
71
75
 
72
76
  openai: {
73
- endpoint: () => "https://api.openai.com/v1/chat/completions",
74
- defaultModel: "gpt-4o-mini",
77
+ endpoint: () => searchEndpoint("openai"),
75
78
  buildBody: (query, model) => {
76
79
  const body = {
77
80
  model,
@@ -105,8 +108,7 @@ const CHAT_SEARCH_CONFIG = {
105
108
  },
106
109
 
107
110
  xai: {
108
- endpoint: () => "https://api.x.ai/v1/responses",
109
- defaultModel: "grok-4.20-reasoning",
111
+ endpoint: () => searchEndpoint("xai"),
110
112
  buildBody: (query, model) => ({
111
113
  model,
112
114
  input: [{ role: "user", content: query }],
@@ -145,8 +147,7 @@ const CHAT_SEARCH_CONFIG = {
145
147
  },
146
148
 
147
149
  kimi: {
148
- endpoint: () => "https://api.moonshot.cn/v1/chat/completions",
149
- defaultModel: "kimi-k2.5",
150
+ endpoint: () => searchEndpoint("kimi"),
150
151
  buildBody: (query, model) => ({
151
152
  model,
152
153
  messages: [{ role: "user", content: query }],
@@ -195,8 +196,7 @@ const CHAT_SEARCH_CONFIG = {
195
196
  },
196
197
 
197
198
  minimax: {
198
- endpoint: () => "https://api.minimaxi.com/v1/text/chatcompletion_v2",
199
- defaultModel: "MiniMax-M2.7",
199
+ endpoint: () => searchEndpoint("minimax"),
200
200
  buildBody: (query, model) => ({
201
201
  model,
202
202
  messages: [{ role: "user", content: query }],
@@ -254,8 +254,7 @@ const CHAT_SEARCH_CONFIG = {
254
254
  },
255
255
 
256
256
  perplexity: {
257
- endpoint: () => "https://api.perplexity.ai/chat/completions",
258
- defaultModel: "sonar",
257
+ endpoint: () => searchEndpoint("perplexity"),
259
258
  buildBody: (query, model) => ({
260
259
  model,
261
260
  messages: [{ role: "user", content: query }]
@@ -274,6 +273,53 @@ const CHAT_SEARCH_CONFIG = {
274
273
  const tokens = data?.usage?.total_tokens || 0;
275
274
  return { text, citations, tokens };
276
275
  }
276
+ },
277
+
278
+ "perplexity-agent": {
279
+ endpoint: () => searchEndpoint("perplexity-agent"),
280
+ buildBody: (query, model) => ({
281
+ model,
282
+ input: query,
283
+ tools: [{ type: "web_search" }]
284
+ }),
285
+ buildHeaders: (token) => ({
286
+ "Content-Type": "application/json",
287
+ Authorization: `Bearer ${token}`
288
+ }),
289
+ extractAnswer: (data) => {
290
+ const output = Array.isArray(data?.output) ? data.output : [];
291
+ let text = "";
292
+ const citations = [];
293
+ for (const item of output) {
294
+ const parts = Array.isArray(item?.content) ? item.content : [];
295
+ for (const p of parts) {
296
+ if (typeof p?.text === "string") text += p.text;
297
+ const anns = Array.isArray(p?.annotations) ? p.annotations : [];
298
+ for (const a of anns) {
299
+ const c = normalizeCitation(a?.url ? a : a?.url_citation);
300
+ if (c) citations.push(c);
301
+ }
302
+ }
303
+ const results = Array.isArray(item?.results) ? item.results : [];
304
+ for (const r of results) {
305
+ const url = r?.url || r?.link;
306
+ if (!url) continue;
307
+ citations.push({
308
+ url,
309
+ title: r?.title || "",
310
+ snippet: r?.snippet || ""
311
+ });
312
+ }
313
+ }
314
+ if (!citations.length && Array.isArray(data?.citations)) {
315
+ for (const c of data.citations) {
316
+ const n = normalizeCitation(c);
317
+ if (n) citations.push(n);
318
+ }
319
+ }
320
+ const tokens = data?.usage?.total_tokens || 0;
321
+ return { text, citations, tokens };
322
+ }
277
323
  }
278
324
  };
279
325
 
@@ -324,7 +370,7 @@ export async function handleChatSearch({
324
370
  Number.isFinite(maxResults) && maxResults > 0
325
371
  ? Math.floor(maxResults)
326
372
  : DEFAULT_MAX_RESULTS;
327
- const useModel = model || cfg.defaultModel;
373
+ const useModel = model || searchModel(provider);
328
374
  const url = cfg.endpoint(useModel);
329
375
  const body = cfg.buildBody(query, useModel);
330
376
  const headers = cfg.buildHeaders(token);
@@ -1,9 +1,20 @@
1
1
  // Gemini TTS — generateContent with AUDIO modality returns PCM L16, wrap as WAV
2
2
  import { Buffer } from "node:buffer";
3
+ import { PROVIDER_MEDIA, PROVIDER_MODELS } from "../../providers/index.js";
3
4
 
4
- const DEFAULT_MODEL = "gemini-2.5-flash-preview-tts";
5
+ const TTS_CFG = PROVIDER_MEDIA["gemini"]?.ttsConfig || {};
6
+ const TTS_BASE = TTS_CFG.baseUrl;
7
+ const FALLBACK_MODEL = "gemini-3.1-flash-tts-preview";
8
+ const KNOWN_MODELS = [
9
+ ...(TTS_CFG.models || []),
10
+ ...(PROVIDER_MODELS["gemini-tts-models"] || []),
11
+ ...(PROVIDER_MODELS.gemini || []).filter((m) => (m.kind || m.type) === "tts"),
12
+ ]
13
+ .map((m) => m?.id)
14
+ .filter(Boolean)
15
+ .filter((id, index, list) => list.indexOf(id) === index);
16
+ const DEFAULT_MODEL = KNOWN_MODELS[0] || FALLBACK_MODEL;
5
17
  const DEFAULT_VOICE = "Kore";
6
- const KNOWN_MODELS = ["gemini-2.5-flash-preview-tts", "gemini-2.5-pro-preview-tts"];
7
18
 
8
19
  // Parse "model/voice" — if input doesn't match a known TTS model, treat it as voice with default model
9
20
  function parseGeminiModelVoice(input) {
@@ -51,7 +62,7 @@ export default {
51
62
  async synthesize(text, model, credentials, _responseFormat, opts = {}) {
52
63
  if (!credentials?.apiKey) throw new Error("No Gemini API key configured");
53
64
  const { modelId, voiceId } = parseGeminiModelVoice(model);
54
- const url = `https://generativelanguage.googleapis.com/v1beta/models/${modelId}:generateContent?key=${credentials.apiKey}`;
65
+ const url = `${TTS_BASE}/${modelId}:generateContent?key=${credentials.apiKey}`;
55
66
  const res = await fetch(url, {
56
67
  method: "POST",
57
68
  headers: { "Content-Type": "application/json" },
@@ -33,8 +33,10 @@ export async function synthesizeViaConfig(provider, text, model, credentials) {
33
33
  if (!handler) return null;
34
34
  const apiKey = credentials?.apiKey;
35
35
  if (cfg.authType !== "none" && !apiKey) throw new Error(`${provider} API key required`);
36
- const defaultModel = cfg.models?.[0]?.id || "";
37
- const { modelId, voiceId } = parseModelVoice(model, defaultModel, "", cfg.models || []);
36
+ const { PROVIDER_MODELS } = await import("open-sse/config/providerModels.js");
37
+ const ttsModels = (PROVIDER_MODELS[provider] || []).filter(m => (m.kind || m.type) === "tts");
38
+ const defaultModel = ttsModels[0]?.id || "";
39
+ const { modelId, voiceId } = parseModelVoice(model, defaultModel, "", ttsModels);
38
40
  return handler({ baseUrl: cfg.baseUrl, apiKey, text, modelId, voiceId });
39
41
  }
40
42
 
@@ -1,11 +1,14 @@
1
1
  // OpenAI TTS — model format: "tts-model/voice"
2
2
  import { Buffer } from "node:buffer";
3
+ import { PROVIDER_MEDIA } from "../../providers/index.js";
4
+
5
+ const DEFAULT_TTS_MODEL = PROVIDER_MEDIA["openai"]?.ttsConfig?.defaultModel;
3
6
 
4
7
  export default {
5
8
  async synthesize(text, model, credentials) {
6
9
  if (!credentials?.apiKey) throw new Error("No OpenAI API key configured");
7
10
 
8
- let ttsModel = "gpt-4o-mini-tts";
11
+ let ttsModel = DEFAULT_TTS_MODEL;
9
12
  let voice = "alloy";
10
13
  if (model && model.includes("/")) {
11
14
  const parts = model.split("/");
@@ -1,10 +1,14 @@
1
1
  // OpenRouter TTS — via chat completions + audio modality (SSE stream)
2
+ import { PROVIDER_MEDIA } from "../../providers/index.js";
3
+
4
+ const TTS_CFG = PROVIDER_MEDIA["openrouter"]?.ttsConfig || {};
5
+
2
6
  export default {
3
7
  async synthesize(text, model, credentials) {
4
8
  if (!credentials?.apiKey) throw new Error("No OpenRouter API key configured");
5
9
 
6
10
  // model format: "tts-model/voice" e.g. "openai/gpt-4o-mini-tts/alloy"
7
- let ttsModel = "openai/gpt-4o-mini-tts";
11
+ let ttsModel = TTS_CFG.defaultModel;
8
12
  let voice = "alloy";
9
13
  if (model && model.includes("/")) {
10
14
  const lastSlash = model.lastIndexOf("/");
@@ -20,13 +24,12 @@ export default {
20
24
  voice = model;
21
25
  }
22
26
 
23
- const res = await fetch("https://openrouter.ai/api/v1/chat/completions", {
27
+ const res = await fetch(TTS_CFG.baseUrl, {
24
28
  method: "POST",
25
29
  headers: {
26
30
  "Content-Type": "application/json",
27
31
  "Authorization": `Bearer ${credentials.apiKey}`,
28
- "HTTP-Referer": "https://endpoint-proxy.local",
29
- "X-Title": "Endpoint Proxy",
32
+ ...(TTS_CFG.headers || {}),
30
33
  },
31
34
  body: JSON.stringify({
32
35
  model: ttsModel,
@@ -0,0 +1,166 @@
1
+ import { createErrorResult } from "../utils/error.js";
2
+ import { HTTP_STATUS } from "../config/runtimeConfig.js";
3
+ import { refreshTokenByProvider } from "../services/tokenRefresh.js";
4
+ import { PROVIDER_MEDIA } from "../providers/index.js";
5
+
6
+ // Upstream fetch deadline for video job submission/polling (the job itself is
7
+ // async upstream — this only bounds the HTTP round-trip, not video rendering).
8
+ const VIDEO_FETCH_TIMEOUT_MS = Number(process.env.VIDEO_FETCH_TIMEOUT_MS || 120000);
9
+
10
+ // POST /videos/* creates a billable upstream job. A network error after the
11
+ // request left the socket may still have created the job, so creation is NEVER
12
+ // auto-retried (the only re-send is the auth retry after a 401/403 refresh,
13
+ // which upstream rejects before job creation).
14
+ export const VIDEO_ACTIONS = new Set(["generations", "edits", "extensions"]);
15
+
16
+ export function getVideoConfig(provider) {
17
+ return PROVIDER_MEDIA[provider]?.videoConfig || null;
18
+ }
19
+
20
+ /** Strip bearer tokens / obvious secrets from text destined for clients or logs. */
21
+ export function sanitizeSecrets(text, credentials = null) {
22
+ if (!text) return text;
23
+ let out = String(text).replace(/Bearer\s+[A-Za-z0-9._~+/=-]{8,}/gi, "Bearer [redacted]");
24
+ for (const key of ["accessToken", "refreshToken", "apiKey"]) {
25
+ const secret = credentials?.[key];
26
+ if (typeof secret === "string" && secret.length >= 8) {
27
+ out = out.split(secret).join("[redacted]");
28
+ }
29
+ }
30
+ return out;
31
+ }
32
+
33
+ function buildUpstreamUrl(config, action, requestId) {
34
+ const base = config.baseUrl.replace(/\/$/, "");
35
+ return requestId ? `${base}/${encodeURIComponent(requestId)}` : `${base}/${action}`;
36
+ }
37
+
38
+ function buildHeaders({ token, contentType, idempotencyKey }) {
39
+ const headers = { Accept: "application/json" };
40
+ if (token) headers.Authorization = `Bearer ${token}`;
41
+ if (contentType) headers["Content-Type"] = contentType;
42
+ if (idempotencyKey) headers["Idempotency-Key"] = idempotencyKey;
43
+ return headers;
44
+ }
45
+
46
+ function combineSignals(signal, timeoutMs) {
47
+ const timeoutSignal = typeof AbortSignal?.timeout === "function" ? AbortSignal.timeout(timeoutMs) : null;
48
+ if (signal && timeoutSignal && typeof AbortSignal.any === "function") {
49
+ return AbortSignal.any([signal, timeoutSignal]);
50
+ }
51
+ return signal || timeoutSignal || undefined;
52
+ }
53
+
54
+ /**
55
+ * Transparent proxy for async video jobs (xAI Grok Imagine shape).
56
+ *
57
+ * - Forwards the raw body byte-for-byte (JSON or multipart) — no reshaping.
58
+ * - Passes upstream JSON (request_id, status, video.url, error) back verbatim.
59
+ * - 401/403 with a refresh token: refresh ONCE, retry ONCE. No other retry.
60
+ * - Upstream error text is sanitized before it reaches the client.
61
+ *
62
+ * @param {object} options
63
+ * @param {string} options.provider - Provider id (must have registry videoConfig)
64
+ * @param {"generations"|"edits"|"extensions"|null} options.action - Creation action (POST)
65
+ * @param {string|null} [options.requestId] - Poll target (GET /videos/{id})
66
+ * @param {Buffer|string|null} [options.rawBody] - Exact body to forward
67
+ * @param {string|null} [options.contentType] - Original Content-Type header
68
+ * @param {string|null} [options.idempotencyKey] - Forwarded Idempotency-Key
69
+ * @param {object} options.credentials - { accessToken?, apiKey?, refreshToken?, authType? }
70
+ * @param {AbortSignal} [options.signal] - Client cancellation signal
71
+ * @param {number} [options.timeoutMs]
72
+ * @param {object} [options.log]
73
+ * @param {function} [options.onCredentialsRefreshed]
74
+ * @returns {Promise<{ success: boolean, response: Response, status?: number, error?: string }>}
75
+ */
76
+ export async function handleVideoProxyCore({
77
+ provider,
78
+ action = null,
79
+ requestId = null,
80
+ rawBody = null,
81
+ contentType = null,
82
+ idempotencyKey = null,
83
+ credentials,
84
+ signal,
85
+ timeoutMs = VIDEO_FETCH_TIMEOUT_MS,
86
+ log,
87
+ onCredentialsRefreshed,
88
+ }) {
89
+ const config = getVideoConfig(provider);
90
+ if (!config) {
91
+ return createErrorResult(HTTP_STATUS.BAD_REQUEST, `Provider '${provider}' does not support video generation`);
92
+ }
93
+ if (!requestId && !VIDEO_ACTIONS.has(action)) {
94
+ return createErrorResult(HTTP_STATUS.BAD_REQUEST, `Unknown video action: ${action}`);
95
+ }
96
+
97
+ const method = requestId ? "GET" : "POST";
98
+ const url = buildUpstreamUrl(config, action, requestId);
99
+ const fetchSignal = combineSignals(signal, timeoutMs);
100
+
101
+ const doFetch = (token) =>
102
+ fetch(url, {
103
+ method,
104
+ headers: buildHeaders({ token, contentType: method === "POST" ? contentType : null, idempotencyKey: method === "POST" ? idempotencyKey : null }),
105
+ body: method === "POST" ? rawBody : undefined,
106
+ signal: fetchSignal,
107
+ });
108
+
109
+ let upstream;
110
+ try {
111
+ upstream = await doFetch(credentials?.accessToken || credentials?.apiKey);
112
+ } catch (error) {
113
+ if (error?.name === "AbortError" || error?.name === "TimeoutError") {
114
+ return createErrorResult(HTTP_STATUS.REQUEST_TIMEOUT, `[${provider}] video ${method} aborted: ${error.message}`);
115
+ }
116
+ // Never re-send a creation POST on network error — the job may already exist upstream.
117
+ return createErrorResult(HTTP_STATUS.BAD_GATEWAY, sanitizeSecrets(`[${provider}] video upstream fetch failed: ${error.message}`, credentials));
118
+ }
119
+
120
+ // 401/403 → refresh once → retry once (OAuth accounts only; API keys can't refresh)
121
+ if (
122
+ (upstream.status === HTTP_STATUS.UNAUTHORIZED || upstream.status === HTTP_STATUS.FORBIDDEN) &&
123
+ credentials?.refreshToken
124
+ ) {
125
+ let refreshed = null;
126
+ try {
127
+ refreshed = await refreshTokenByProvider(provider, credentials, log);
128
+ } catch (error) {
129
+ log?.warn?.("TOKEN", `${provider} | video refresh error: ${sanitizeSecrets(error.message, credentials)}`);
130
+ }
131
+ if (refreshed?.accessToken) {
132
+ log?.info?.("TOKEN", `${provider.toUpperCase()} | refreshed for video ${method}`);
133
+ Object.assign(credentials, refreshed);
134
+ if (onCredentialsRefreshed) await onCredentialsRefreshed(refreshed);
135
+ try {
136
+ await upstream.body?.cancel?.();
137
+ } catch { /* noop */ }
138
+ try {
139
+ upstream = await doFetch(credentials.accessToken || credentials.apiKey);
140
+ } catch (error) {
141
+ return createErrorResult(HTTP_STATUS.BAD_GATEWAY, sanitizeSecrets(`[${provider}] video retry after refresh failed: ${error.message}`, credentials));
142
+ }
143
+ } else {
144
+ log?.warn?.("TOKEN", `${provider.toUpperCase()} | video refresh failed — account needs re-auth`);
145
+ }
146
+ }
147
+
148
+ const bodyText = await upstream.text().catch(() => "");
149
+
150
+ if (!upstream.ok) {
151
+ const message = sanitizeSecrets(bodyText || `HTTP ${upstream.status}`, credentials);
152
+ return createErrorResult(upstream.status, `[${provider}] ${message.slice(0, 2000)}`);
153
+ }
154
+
155
+ // Success: pass the upstream JSON through untouched (request_id / status / video.url).
156
+ return {
157
+ success: true,
158
+ response: new Response(bodyText, {
159
+ status: upstream.status,
160
+ headers: {
161
+ "Content-Type": upstream.headers.get("content-type") || "application/json",
162
+ "Access-Control-Allow-Origin": "*",
163
+ },
164
+ }),
165
+ };
166
+ }
@@ -1,7 +1,7 @@
1
1
  import path from "path";
2
2
  import { execFile } from "child_process";
3
3
  import { promisify } from "util";
4
- import { updateProviderConnection } from '../../../../dist/lib/localDb.js';
4
+ import { updateProviderConnection } from '../../../dist/lib/localDb.js';
5
5
 
6
6
  // 10 MB buffer — video polling can produce large stderr logs
7
7
  const MAX_BUFFER = 10 * 1024 * 1024;
@@ -1,6 +1,6 @@
1
1
  import { getCodexRequestDefaults } from "../../lib/providers/requestDefaults.ts";
2
2
  import { getProviderConnections } from "../../lib/db/providers.ts";
3
- import { AI_PROVIDERS, NOAUTH_PROVIDERS } from '../../../dist/shared/constants/providers.ts.js';
3
+ import { AI_PROVIDERS, NOAUTH_PROVIDERS } from '../../dist/shared/constants/providers.ts.js';
4
4
  function toRecord(value) {
5
5
  return value && typeof value === "object" && !Array.isArray(value) ? value : {};
6
6
  }
@@ -83,8 +83,8 @@ import {
83
83
  clampMcpAccessibilityConfig
84
84
  } from "../services/compression/engines/mcpAccessibility/constants.ts";
85
85
  import { getDbInstance } from "../../lib/db/core.ts";
86
- import { normalizeQuotaResponse } from '../../../dist/shared/contracts/quota.ts.js';
87
- import { resolveOmniRouteBaseUrl } from '../../../dist/shared/utils/resolveOmniRouteBaseUrl.ts.js';
86
+ import { normalizeQuotaResponse } from '../../dist/shared/contracts/quota.ts.js';
87
+ import { resolveOmniRouteBaseUrl } from '../../dist/shared/utils/resolveOmniRouteBaseUrl.ts.js';
88
88
  import { getMcpModelsCatalog } from "./catalog.ts";
89
89
  import { getMcpModelsCatalog as getMcpModelsCatalog2 } from "./catalog.ts";
90
90
  const OMNIROUTE_BASE_URL = resolveOmniRouteBaseUrl();
@@ -6,7 +6,7 @@ import {
6
6
  getComboModelProvider,
7
7
  getComboModelString,
8
8
  getComboStepTarget
9
- } from '../../../../dist/lib/combos/steps.ts.js';
9
+ } from '../../../dist/lib/combos/steps.ts.js';
10
10
  import { normalizeRoutingStrategy } from "../../../shared/constants/routingStrategies.ts";
11
11
  const OMNIROUTE_BASE_URL = resolveOmniRouteBaseUrl();
12
12
  const OMNIROUTE_API_KEY = process.env.OMNIROUTE_API_KEY || "";
@@ -684,7 +684,7 @@ async function handleDbHealthCheck(args) {
684
684
  const start = Date.now();
685
685
  const autoRepair = args.autoRepair === true;
686
686
  try {
687
- const { runManagedDbHealthCheck } = await import('../../../../dist/lib/db/core.ts.js');
687
+ const { runManagedDbHealthCheck } = await import('../../../dist/lib/db/core.ts.js');
688
688
  const result = runManagedDbHealthCheck({ autoRepair });
689
689
  await logToolCall(
690
690
  "omniroute_db_health_check",
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { getCatalog, getSkillById, filterCatalog, computeCoverage, fetchSkillMarkdown } from '../../../../dist/lib/agentSkills/catalog.js';
2
+ import { getCatalog, getSkillById, filterCatalog, computeCoverage, fetchSkillMarkdown } from '../../../dist/lib/agentSkills/catalog.js';
3
3
  const AgentSkillsListSchema = z.object({
4
4
  category: z.enum(["api", "cli"]).optional().describe("Filter by category: 'api' or 'cli'"),
5
5
  area: z.string().optional().describe("Filter by area (e.g. 'providers', 'models', 'cli-serve')")
@@ -2,10 +2,10 @@ import { logToolCall } from "../audit.ts";
2
2
  import {
3
3
  getCompressionSettings,
4
4
  updateCompressionSettings
5
- } from '../../../../dist/lib/db/compression.ts.js';
6
- import { getCompressionAnalyticsSummary } from '../../../../dist/lib/db/compressionAnalytics.ts.js';
7
- import { getCacheStatsSummary } from '../../../../dist/lib/db/compressionCacheStats.ts.js';
8
- import { listCompressionCombos } from '../../../../dist/lib/db/compressionCombos.ts.js';
5
+ } from '../../../dist/lib/db/compression.ts.js';
6
+ import { getCompressionAnalyticsSummary } from '../../../dist/lib/db/compressionAnalytics.ts.js';
7
+ import { getCacheStatsSummary } from '../../../dist/lib/db/compressionCacheStats.ts.js';
8
+ import { listCompressionCombos } from '../../../dist/lib/db/compressionCombos.ts.js';
9
9
  import {
10
10
  getMcpDescriptionCompressionStats,
11
11
  snapshotMcpDescriptionCompressionStats
@@ -9,7 +9,7 @@ const gamificationTools = [
9
9
  limit: z.number().min(1).max(100).default(50)
10
10
  }),
11
11
  handler: async (args) => {
12
- const { getTopN } = await import('../../../../dist/lib/gamification/leaderboard.js');
12
+ const { getTopN } = await import('../../../dist/lib/gamification/leaderboard.js');
13
13
  const entries = await getTopN(args.scope, args.limit);
14
14
  return { entries };
15
15
  }
@@ -23,7 +23,7 @@ const gamificationTools = [
23
23
  scope: z.enum(["global", "weekly", "monthly", "tokens_shared"]).default("global")
24
24
  }),
25
25
  handler: async (args) => {
26
- const { getRank } = await import('../../../../dist/lib/gamification/leaderboard.js');
26
+ const { getRank } = await import('../../../dist/lib/gamification/leaderboard.js');
27
27
  const rank = await getRank(args.apiKeyId, args.scope);
28
28
  return { rank };
29
29
  }
@@ -36,9 +36,9 @@ const gamificationTools = [
36
36
  apiKeyId: z.string()
37
37
  }),
38
38
  handler: async (args) => {
39
- const { getXp, getBadges } = await import('../../../../dist/lib/db/gamification.js');
40
- const { calculateLevel, getLevelTitle, getLevelTier } = await import('../../../../dist/lib/gamification/xp.js');
41
- const { getStreak } = await import('../../../../dist/lib/gamification/streaks.js');
39
+ const { getXp, getBadges } = await import('../../../dist/lib/db/gamification.js');
40
+ const { calculateLevel, getLevelTitle, getLevelTier } = await import('../../../dist/lib/gamification/xp.js');
41
+ const { getStreak } = await import('../../../dist/lib/gamification/streaks.js');
42
42
  const xp = getXp(args.apiKeyId);
43
43
  const badges = getBadges(args.apiKeyId);
44
44
  const streak = await getStreak(args.apiKeyId);
@@ -63,7 +63,7 @@ const gamificationTools = [
63
63
  category: z.string().optional()
64
64
  }),
65
65
  handler: async (args) => {
66
- const { getBadgeDefinitions, getBadges } = await import('../../../../dist/lib/db/gamification.js');
66
+ const { getBadgeDefinitions, getBadges } = await import('../../../dist/lib/db/gamification.js');
67
67
  if (args.apiKeyId) {
68
68
  const badges = getBadges(args.apiKeyId);
69
69
  return { earned: badges };
@@ -83,7 +83,7 @@ const gamificationTools = [
83
83
  reason: z.string().optional()
84
84
  }),
85
85
  handler: async (args) => {
86
- const { transferTokens } = await import('../../../../dist/lib/gamification/sharing.js');
86
+ const { transferTokens } = await import('../../../dist/lib/gamification/sharing.js');
87
87
  const result = await transferTokens(
88
88
  args.fromApiKeyId,
89
89
  args.toApiKeyId,
@@ -103,7 +103,7 @@ const gamificationTools = [
103
103
  maxUses: z.number().positive().default(1)
104
104
  }),
105
105
  handler: async (args) => {
106
- const { createInvite } = await import('../../../../dist/lib/gamification/invites.js');
106
+ const { createInvite } = await import('../../../dist/lib/gamification/invites.js');
107
107
  const result = await createInvite(args.apiKeyId, args.serverUrl, args.maxUses);
108
108
  return result;
109
109
  }
@@ -114,7 +114,7 @@ const gamificationTools = [
114
114
  scopes: ["read:gamification"],
115
115
  inputSchema: z.object({}),
116
116
  handler: async () => {
117
- const { listServers } = await import('../../../../dist/lib/gamification/servers.js');
117
+ const { listServers } = await import('../../../dist/lib/gamification/servers.js');
118
118
  return { servers: await listServers() };
119
119
  }
120
120
  },
@@ -124,7 +124,7 @@ const gamificationTools = [
124
124
  scopes: ["read:gamification"],
125
125
  inputSchema: z.object({}),
126
126
  handler: async () => {
127
- const { getAnomalies } = await import('../../../../dist/lib/gamification/antiCheat.js');
127
+ const { getAnomalies } = await import('../../../dist/lib/gamification/antiCheat.js');
128
128
  return { anomalies: await getAnomalies() };
129
129
  }
130
130
  }
@@ -6,7 +6,7 @@ import {
6
6
  GitHubSkillsSearchSchema,
7
7
  GitHubSkillsScanSchema,
8
8
  GitHubSkillsInstallSchema
9
- } from '../../../../dist/lib/skills/githubCollector.js';
9
+ } from '../../../dist/lib/skills/githubCollector.js';
10
10
  async function handleSearch(args) {
11
11
  const { repos, errors } = await searchGitHubSkills({
12
12
  minStars: args.minStars,
@@ -1,11 +1,11 @@
1
1
  import { z } from "zod";
2
- import { retrieveMemories } from '../../../../dist/lib/memory/retrieval.js';
3
- import { createMemory, deleteMemory, listMemories } from '../../../../dist/lib/memory/store.js';
2
+ import { retrieveMemories } from '../../../dist/lib/memory/retrieval.js';
3
+ import { createMemory, deleteMemory, listMemories } from '../../../dist/lib/memory/store.js';
4
4
  import {
5
5
  getMemorySettings,
6
6
  toMemoryRetrievalConfig,
7
7
  DEFAULT_MEMORY_SETTINGS
8
- } from '../../../../dist/lib/memory/settings.js';
8
+ } from '../../../dist/lib/memory/settings.js';
9
9
  const MemorySearchSchema = z.object({
10
10
  apiKeyId: z.string(),
11
11
  query: z.string().optional(),
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
- import { createNotionClient } from '../../../../dist/lib/notion/api.ts.js';
3
- import { getNotionToken } from '../../../../dist/lib/db/notion.ts.js';
2
+ import { createNotionClient } from '../../../dist/lib/notion/api.ts.js';
3
+ import { getNotionToken } from '../../../dist/lib/db/notion.ts.js';
4
4
  function requireToken() {
5
5
  const token = getNotionToken();
6
6
  if (!token) throw new Error("Notion integration token not configured. Set it in Settings > Context Sources.");
@@ -1,8 +1,8 @@
1
1
  import { z } from "zod";
2
- import { createObsidianClient, createSyncServerClient, getSyncToken } from '../../../../dist/lib/obsidian/api.ts.js';
2
+ import { createObsidianClient, createSyncServerClient, getSyncToken } from '../../../dist/lib/obsidian/api.ts.js';
3
3
  import {
4
4
  getObsidianConfigForApiKey
5
- } from '../../../../dist/lib/db/obsidian.ts.js';
5
+ } from '../../../dist/lib/db/obsidian.ts.js';
6
6
  function extractApiKeyId(extra) {
7
7
  const id = extra?.authInfo?.clientId;
8
8
  return typeof id === "string" && id.length > 0 && id !== "anonymous" && id !== "env-key" ? id : void 0;
@@ -6,7 +6,7 @@ import {
6
6
  getComboModelProvider,
7
7
  getComboModelString,
8
8
  getComboStepTarget
9
- } from '../../../../dist/lib/combos/steps.ts.js';
9
+ } from '../../../dist/lib/combos/steps.ts.js';
10
10
  import { rankBySpeed, DEFAULT_SPEED_WEIGHTS } from "../../services/autoCombo/speedRanking.ts";
11
11
  const OMNIROUTE_BASE_URL = resolveOmniRouteBaseUrl();
12
12
  const OMNIROUTE_API_KEY = process.env.OMNIROUTE_API_KEY || "";