@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.
- package/dist/lib/headroom/detect.js +97 -7
- package/dist/lib/headroom/process.js +136 -4
- package/dist/open-sse/config/appConstants.js +23 -79
- package/dist/open-sse/config/cliFingerprints.js +1 -1
- package/dist/open-sse/config/errorConfig.js +0 -11
- package/dist/open-sse/config/grokCli.js +10 -0
- package/dist/open-sse/config/kiroConstants.js +99 -46
- package/dist/open-sse/config/runtimeConfig.js +2 -0
- package/dist/open-sse/config/ttsModels.js +2 -0
- package/dist/open-sse/executors/antigravity.js +250 -164
- package/dist/open-sse/executors/base.js +16 -11
- package/dist/open-sse/executors/codex.js +269 -1108
- package/dist/open-sse/executors/commandCode.js +1 -1
- package/dist/open-sse/executors/commandcode.js +10 -4
- package/dist/open-sse/executors/cursor.js +96 -203
- package/dist/open-sse/executors/default.js +146 -244
- package/dist/open-sse/executors/github.js +128 -73
- package/dist/open-sse/executors/grok-cli.js +527 -94
- package/dist/open-sse/executors/grok-web.js +5 -7
- package/dist/open-sse/executors/index.js +12 -0
- package/dist/open-sse/executors/kiro.js +150 -61
- package/dist/open-sse/executors/opencode-go.js +12 -4
- package/dist/open-sse/executors/opencode.js +1 -1
- package/dist/open-sse/executors/perplexity-web.js +20 -96
- package/dist/open-sse/executors/qoder.js +28 -18
- package/dist/open-sse/executors/vertex.js +53 -7
- package/dist/open-sse/executors/xiaomi-tokenplan.js +6 -5
- package/dist/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
- package/dist/open-sse/handlers/chatCore/requestDetail.js +32 -8
- package/dist/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
- package/dist/open-sse/handlers/chatCore/streamingHandler.js +74 -25
- package/dist/open-sse/handlers/chatCore.js +35 -41
- package/dist/open-sse/handlers/embeddingProviders/index.js +1 -0
- package/dist/open-sse/handlers/embeddingProviders/openai.js +8 -16
- package/dist/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
- package/dist/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
- package/dist/open-sse/handlers/imageProviders/codex.js +2 -20
- package/dist/open-sse/handlers/imageProviders/comfyui.js +5 -18
- package/dist/open-sse/handlers/imageProviders/falAi.js +2 -22
- package/dist/open-sse/handlers/imageProviders/gemini.js +2 -16
- package/dist/open-sse/handlers/imageProviders/huggingface.js +2 -17
- package/dist/open-sse/handlers/imageProviders/index.js +3 -4
- package/dist/open-sse/handlers/imageProviders/leonardo.js +1 -1
- package/dist/open-sse/handlers/imageProviders/nanobanana.js +4 -23
- package/dist/open-sse/handlers/imageProviders/openai.js +15 -43
- package/dist/open-sse/handlers/imageProviders/runwayml.js +2 -26
- package/dist/open-sse/handlers/imageProviders/sdwebui.js +4 -20
- package/dist/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
- package/dist/open-sse/handlers/imageProviders/weavy.js +1 -1
- package/dist/open-sse/handlers/search/chatSearch.js +60 -14
- package/dist/open-sse/handlers/ttsProviders/gemini.js +14 -3
- package/dist/open-sse/handlers/ttsProviders/index.js +4 -2
- package/dist/open-sse/handlers/ttsProviders/openai.js +4 -1
- package/dist/open-sse/handlers/ttsProviders/openrouter.js +7 -4
- package/dist/open-sse/handlers/videoCore.js +166 -0
- package/dist/open-sse/handlers/videoProviders/weavy.js +1 -1
- package/dist/open-sse/mcp-server/catalog.js +1 -1
- package/dist/open-sse/mcp-server/server.js +2 -2
- package/dist/open-sse/mcp-server/tools/advancedTools.js +2 -2
- package/dist/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
- package/dist/open-sse/mcp-server/tools/compressionTools.js +4 -4
- package/dist/open-sse/mcp-server/tools/gamificationTools.js +10 -10
- package/dist/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
- package/dist/open-sse/mcp-server/tools/memoryTools.js +3 -3
- package/dist/open-sse/mcp-server/tools/notionTools.js +2 -2
- package/dist/open-sse/mcp-server/tools/obsidianTools.js +2 -2
- package/dist/open-sse/mcp-server/tools/pickFastestModel.js +1 -1
- package/dist/open-sse/mcp-server/tools/pluginTools.js +4 -4
- package/dist/open-sse/mcp-server/tools/skillTools.js +2 -2
- package/dist/open-sse/providers/capabilities.js +24 -4
- package/dist/open-sse/providers/registry/alicode-intl.js +1 -1
- package/dist/open-sse/providers/registry/anthropic.js +1 -8
- package/dist/open-sse/providers/registry/codex.js +0 -9
- package/dist/open-sse/providers/registry/cohere.js +0 -2
- package/dist/open-sse/providers/registry/gemini.js +0 -2
- package/dist/open-sse/providers/registry/github.js +9 -6
- package/dist/open-sse/providers/registry/grok-cli.js +28 -18
- package/dist/open-sse/providers/registry/index.js +74 -80
- package/dist/open-sse/providers/registry/kiro.js +12 -0
- package/dist/open-sse/providers/registry/mistral.js +0 -3
- package/dist/open-sse/providers/registry/openai.js +0 -3
- package/dist/open-sse/providers/registry/perplexity.js +0 -2
- package/dist/open-sse/providers/registry/xai.js +5 -3
- package/dist/open-sse/rtk/autodetect.js +10 -2
- package/dist/open-sse/rtk/caveman.js +2 -93
- package/dist/open-sse/rtk/cavemanPrompts.js +34 -2
- package/dist/open-sse/rtk/constants.js +7 -2
- package/dist/open-sse/rtk/headroom.js +133 -0
- package/dist/open-sse/rtk/ponytail.js +1 -1
- package/dist/open-sse/rtk/registry.js +2 -0
- package/dist/open-sse/services/accountFallback.js +0 -108
- package/dist/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
- package/dist/open-sse/services/combo/quotaShareStrategy.js +1 -1
- package/dist/open-sse/services/combo/resolveAutoStrategy.js +1 -1
- package/dist/open-sse/services/combo/sessionStickiness.js +1 -1
- package/dist/open-sse/services/combo/targetSorters.js +2 -2
- package/dist/open-sse/services/combo/validateQuality.js +1 -1
- package/dist/open-sse/services/comboConfig.js +1 -1
- package/dist/open-sse/services/emergencyFallback.js +1 -1
- package/dist/open-sse/services/grokCliModels.js +127 -0
- package/dist/open-sse/services/model.js +7 -1
- package/dist/open-sse/services/provider.js +1 -1
- package/dist/open-sse/services/proxyAutoSelector.js +1 -1
- package/dist/open-sse/services/tokenRefresh/providers.js +3 -3
- package/dist/open-sse/services/usage/codex.js +148 -214
- package/dist/open-sse/services/usage/grok-cli.js +61 -7
- package/dist/open-sse/services/usage/misc.js +0 -19
- package/dist/open-sse/services/usage.js +0 -2
- package/dist/open-sse/translator/concerns/paramSupport.js +2 -2
- package/dist/open-sse/translator/concerns/thinkingUnified.js +6 -0
- package/dist/open-sse/translator/index.js +97 -59
- package/dist/open-sse/translator/request/claude-to-kiro.js +67 -40
- package/dist/open-sse/translator/request/openai-responses.js +1 -0
- package/dist/open-sse/translator/request/openai-to-commandcode.js +0 -4
- package/dist/open-sse/translator/request/openai-to-kiro.js +49 -20
- package/dist/open-sse/translator/response/commandcode-to-openai.js +0 -4
- package/dist/open-sse/utils/bypassHandler.js +18 -3
- package/dist/open-sse/utils/claudeCloaking.js +15 -5
- package/dist/open-sse/utils/cursorImages.js +1 -1
- package/dist/open-sse/utils/error.js +0 -17
- package/dist/open-sse/utils/keepaliveThreshold.js +4 -4
- package/dist/open-sse/utils/kiroSessionReplay.js +125 -0
- package/dist/open-sse/utils/noThinkingAlias.js +1 -1
- package/dist/open-sse/utils/proxyFetch.js +0 -1
- package/dist/open-sse/utils/reasoningContentInjector.js +4 -7
- package/dist/open-sse/utils/responsesStatePolicy.js +1 -1
- package/dist/open-sse/utils/responsesStreamHelpers.js +1 -0
- package/dist/open-sse/utils/sessionManager.js +49 -22
- package/dist/open-sse/utils/stream.js +54 -77
- package/dist/open-sse/utils/streamHandler.js +19 -15
- package/dist/open-sse/utils/streamHelpers.js +2 -17
- package/dist/open-sse/utils/usageTracking.js +103 -12
- package/dist/routes/headroom/extras/route.js +58 -0
- package/dist/routes/headroom/restart/route.js +33 -0
- package/open-sse/config/appConstants.js +23 -79
- package/open-sse/config/errorConfig.js +0 -11
- package/open-sse/config/grokCli.js +10 -0
- package/open-sse/config/kiroConstants.js +99 -46
- package/open-sse/config/runtimeConfig.js +2 -0
- package/open-sse/config/ttsModels.js +2 -0
- package/open-sse/executors/antigravity.js +250 -164
- package/open-sse/executors/base.js +16 -11
- package/open-sse/executors/codex.js +269 -1108
- package/open-sse/executors/commandcode.js +10 -4
- package/open-sse/executors/cursor.js +96 -203
- package/open-sse/executors/default.js +146 -244
- package/open-sse/executors/github.js +128 -73
- package/open-sse/executors/grok-cli.js +527 -94
- package/open-sse/executors/grok-web.js +5 -7
- package/open-sse/executors/index.js +12 -0
- package/open-sse/executors/kiro.js +150 -61
- package/open-sse/executors/opencode-go.js +12 -4
- package/open-sse/executors/opencode.js +1 -1
- package/open-sse/executors/perplexity-web.js +20 -96
- package/open-sse/executors/qoder.js +28 -18
- package/open-sse/executors/vertex.js +53 -7
- package/open-sse/executors/xiaomi-tokenplan.js +6 -5
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
- package/open-sse/handlers/chatCore/requestDetail.js +32 -8
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
- package/open-sse/handlers/chatCore/streamingHandler.js +74 -25
- package/open-sse/handlers/chatCore.js +35 -41
- package/open-sse/handlers/embeddingProviders/index.js +1 -0
- package/open-sse/handlers/embeddingProviders/openai.js +8 -16
- package/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
- package/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
- package/open-sse/handlers/imageProviders/codex.js +2 -20
- package/open-sse/handlers/imageProviders/comfyui.js +5 -18
- package/open-sse/handlers/imageProviders/falAi.js +2 -22
- package/open-sse/handlers/imageProviders/gemini.js +2 -16
- package/open-sse/handlers/imageProviders/huggingface.js +2 -17
- package/open-sse/handlers/imageProviders/index.js +3 -4
- package/open-sse/handlers/imageProviders/leonardo.js +1 -1
- package/open-sse/handlers/imageProviders/nanobanana.js +4 -23
- package/open-sse/handlers/imageProviders/openai.js +15 -43
- package/open-sse/handlers/imageProviders/runwayml.js +2 -26
- package/open-sse/handlers/imageProviders/sdwebui.js +4 -20
- package/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
- package/open-sse/handlers/imageProviders/weavy.js +1 -1
- package/open-sse/handlers/search/chatSearch.js +60 -14
- package/open-sse/handlers/ttsProviders/gemini.js +14 -3
- package/open-sse/handlers/ttsProviders/index.js +4 -2
- package/open-sse/handlers/ttsProviders/openai.js +4 -1
- package/open-sse/handlers/ttsProviders/openrouter.js +7 -4
- package/open-sse/handlers/videoCore.js +166 -0
- package/open-sse/handlers/videoProviders/weavy.js +1 -1
- package/open-sse/mcp-server/audit.js +1 -1
- package/open-sse/mcp-server/catalog.js +2 -2
- package/open-sse/mcp-server/descriptionCompressor.js +1 -1
- package/open-sse/mcp-server/mcpCallerIdentity.js +1 -1
- package/open-sse/mcp-server/schemas/tools.js +1 -1
- package/open-sse/mcp-server/server.js +4 -4
- package/open-sse/mcp-server/tools/advancedTools.js +5 -5
- package/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
- package/open-sse/mcp-server/tools/compressionTools.js +4 -4
- package/open-sse/mcp-server/tools/gamificationTools.js +10 -10
- package/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
- package/open-sse/mcp-server/tools/memoryTools.js +3 -3
- package/open-sse/mcp-server/tools/notionTools.js +2 -2
- package/open-sse/mcp-server/tools/obsidianTools.js +2 -2
- package/open-sse/mcp-server/tools/pickFastestModel.js +3 -3
- package/open-sse/mcp-server/tools/pluginTools.js +4 -4
- package/open-sse/mcp-server/tools/skillTools.js +2 -2
- package/open-sse/providers/capabilities.js +24 -4
- package/open-sse/providers/registry/alicode-intl.js +1 -1
- package/open-sse/providers/registry/anthropic.js +1 -8
- package/open-sse/providers/registry/codex.js +0 -9
- package/open-sse/providers/registry/cohere.js +0 -2
- package/open-sse/providers/registry/gemini.js +0 -2
- package/open-sse/providers/registry/github.js +9 -6
- package/open-sse/providers/registry/grok-cli.js +28 -18
- package/open-sse/providers/registry/index.js +74 -80
- package/open-sse/providers/registry/kiro.js +12 -0
- package/open-sse/providers/registry/mistral.js +0 -3
- package/open-sse/providers/registry/openai.js +0 -3
- package/open-sse/providers/registry/perplexity.js +0 -2
- package/open-sse/providers/registry/xai.js +5 -3
- package/open-sse/rtk/autodetect.js +10 -2
- package/open-sse/rtk/caveman.js +2 -93
- package/open-sse/rtk/cavemanPrompts.js +34 -2
- package/open-sse/rtk/constants.js +7 -2
- package/open-sse/rtk/headroom.js +133 -0
- package/open-sse/rtk/ponytail.js +1 -1
- package/open-sse/rtk/registry.js +2 -0
- package/open-sse/services/accountFallback.js +0 -108
- package/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
- package/open-sse/services/combo/quotaShareStrategy.js +1 -1
- package/open-sse/services/combo/resolveAutoStrategy.js +1 -1
- package/open-sse/services/combo/sessionStickiness.js +1 -1
- package/open-sse/services/combo/shadowRouting.js +1 -1
- package/open-sse/services/combo/targetSorters.js +4 -4
- package/open-sse/services/combo/validateQuality.js +1 -1
- package/open-sse/services/evalRouting.js +1 -1
- package/open-sse/services/grokCliModels.js +127 -0
- package/open-sse/services/model.js +7 -1
- package/open-sse/services/modelCapabilities.js +1 -1
- package/open-sse/services/modelFamilyFallback.js +1 -1
- package/open-sse/services/provider.js +1 -1
- package/open-sse/services/providerCooldownTracker.js +1 -1
- package/open-sse/services/rateLimitManager.js +1 -1
- package/open-sse/services/tokenRefresh/providers.js +3 -3
- package/open-sse/services/usage/codex.js +148 -214
- package/open-sse/services/usage/grok-cli.js +61 -7
- package/open-sse/services/usage/misc.js +0 -19
- package/open-sse/services/usage.js +0 -2
- package/open-sse/translator/concerns/paramSupport.js +2 -2
- package/open-sse/translator/concerns/thinkingUnified.js +6 -0
- package/open-sse/translator/index.js +97 -59
- package/open-sse/translator/request/claude-to-kiro.js +67 -40
- package/open-sse/translator/request/openai-responses.js +1 -0
- package/open-sse/translator/request/openai-to-commandcode.js +0 -4
- package/open-sse/translator/request/openai-to-kiro.js +49 -20
- package/open-sse/translator/response/commandcode-to-openai.js +0 -4
- package/open-sse/utils/bypassHandler.js +18 -3
- package/open-sse/utils/claudeCloaking.js +15 -5
- package/open-sse/utils/error.js +0 -17
- package/open-sse/utils/kiroSessionReplay.js +125 -0
- package/open-sse/utils/logger.js +1 -1
- package/open-sse/utils/proxyFetch.js +0 -1
- package/open-sse/utils/reasoningContentInjector.js +4 -7
- package/open-sse/utils/responsesStreamHelpers.js +1 -0
- package/open-sse/utils/sessionManager.js +49 -22
- package/open-sse/utils/stream.js +54 -77
- package/open-sse/utils/streamHandler.js +19 -15
- package/open-sse/utils/streamHelpers.js +2 -17
- package/open-sse/utils/usageTracking.js +103 -12
- package/package.json +4 -7
- package/public/assets/EndpointPageClient.C2WMTYy0.js +6 -0
- package/public/assets/{Loading.Bj-WGl4k.js → Loading.BHPtQ9vj.js} +1 -1
- package/public/assets/{NoAuthProxyCard.qAv57b-0.js → NoAuthProxyCard.BDcXaWvM.js} +1 -1
- package/public/assets/index.Be3gbrBl.js +89 -0
- package/public/assets/index.COMgQZYj.css +1 -0
- package/public/assets/{page.CbkENBd5.js → page.-lpNgYAw.js} +1 -1
- package/public/assets/{page.CssmrzTT.js → page.11hpNKmq.js} +1 -1
- package/public/assets/{page.C72FTTJr.js → page.B-LxsnqU.js} +1 -1
- package/public/assets/{page.sOFOrxqq.js → page.B-dzeIUC.js} +1 -1
- package/public/assets/{page.CsxWmPoI.js → page.B-nBR75u.js} +1 -1
- package/public/assets/{page.Dx_GRRdT.js → page.B3QqvLep.js} +1 -1
- package/public/assets/{page.DPyOkPVo.js → page.B8xdkCWA.js} +1 -1
- package/public/assets/{page.DUI8kqOY.js → page.BFb7yUd8.js} +1 -1
- package/public/assets/page.BbPPdoas.js +1 -0
- package/public/assets/page.BdS20a1O.js +1 -0
- package/public/assets/{page.DibhF7f-.js → page.BfmI9KYe.js} +1 -1
- package/public/assets/{page.DX4Nno6M.js → page.BgGJovOg.js} +1 -1
- package/public/assets/{page.BnmTC5jG.js → page.C0gBvR4O.js} +1 -1
- package/public/assets/{page.D5gj98Oe.js → page.C6bYizL7.js} +1 -1
- package/public/assets/{page.vla5Mzki.js → page.C8sLEMa6.js} +1 -1
- package/public/assets/{page.CXd_R9yU.js → page.CCNsZBXp.js} +1 -1
- package/public/assets/{page.CQlVGoXg.js → page.CF_YSLwP.js} +1 -1
- package/public/assets/{page.BbO1pspY.js → page.CPTtRDxw.js} +1 -1
- package/public/assets/{page.D1oKew1j.js → page.CdMmlUEm.js} +1 -1
- package/public/assets/{page.DxMDTbSx.js → page.Cged1bOZ.js} +1 -1
- package/public/assets/{page.Cj5h09Zo.js → page.Ch647dVk.js} +1 -1
- package/public/assets/{page.DVIHRbxB.js → page.CpvXDkQF.js} +1 -1
- package/public/assets/{page.i4KDuWcM.js → page.CrBl7f8N.js} +1 -1
- package/public/assets/{page.BSLJ4tx5.js → page.CrP7niA2.js} +1 -1
- package/public/assets/{page.CnTop8Zt.js → page.CvUFZzXr.js} +1 -1
- package/public/assets/{page.O2ddJYoT.js → page.CyUqJPmx.js} +1 -1
- package/public/assets/{page.DBhu4Arl.js → page.D8Rp8fFR.js} +1 -1
- package/public/assets/{page.CPZav1_c.js → page.Df9qtrdG.js} +1 -1
- package/public/assets/{page.Qkkv8roc.js → page.DiL4Gwqe.js} +1 -1
- package/public/assets/{page.BdmJ3yY3.js → page.Dl1apZE2.js} +1 -1
- package/public/assets/{page.1qjqvrwX.js → page.HV0w1d5C.js} +1 -1
- package/public/assets/{page.ChX1NqmC.js → page.N1x4YL8_.js} +1 -1
- package/public/assets/{page.Dh5f0XJC.js → page.P2Ny5veR.js} +1 -1
- package/public/assets/{page.CSs3-gdt.js → page.fOOCr18J.js} +1 -1
- package/public/assets/{page.Ir7KvKcF.js → page.sUIPWIiF.js} +1 -1
- package/public/assets/{page.CzlQTyAL.js → page.tE7PpWYW.js} +1 -1
- package/public/assets/{page.DzZLqI5Q.js → page.uziaGZsT.js} +1 -1
- package/public/index.html +2 -2
- package/public/assets/EndpointPageClient.LyNNvZ4z.js +0 -6
- package/public/assets/index.BuPfZebu.css +0 -1
- package/public/assets/index.CShjRV_B.js +0 -89
- package/public/assets/page.DD_czjjP.js +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
2
|
import { BaseExecutor } from "./base.js";
|
|
3
3
|
import { PROVIDERS } from "../config/providers.js";
|
|
4
|
-
import {
|
|
4
|
+
import { commandCodeToOpenAIResponse } from "../translator/response/commandcode-to-openai.js";
|
|
5
|
+
import { SSE_DONE } from "../utils/sseConstants.js";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* CommandCodeExecutor — talks to https://api.commandcode.ai/alpha/generate
|
|
@@ -19,6 +20,11 @@ export class CommandCodeExecutor extends BaseExecutor {
|
|
|
19
20
|
super("commandcode", PROVIDERS.commandcode);
|
|
20
21
|
}
|
|
21
22
|
|
|
23
|
+
transformRequest(model, body, stream, credentials) {
|
|
24
|
+
body.stream = true;
|
|
25
|
+
return body;
|
|
26
|
+
}
|
|
27
|
+
|
|
22
28
|
buildHeaders(credentials, stream = true) {
|
|
23
29
|
const headers = {
|
|
24
30
|
"Content-Type": "application/json",
|
|
@@ -65,15 +71,15 @@ function wrapNdjsonAsOpenAISse(originalResponse, model) {
|
|
|
65
71
|
const trimmed = line.trim();
|
|
66
72
|
if (!trimmed) continue;
|
|
67
73
|
// Translate AI SDK v5 NDJSON line to one or more OpenAI chunks
|
|
68
|
-
emitChunks(
|
|
74
|
+
emitChunks(commandCodeToOpenAIResponse(trimmed, state), controller);
|
|
69
75
|
}
|
|
70
76
|
},
|
|
71
77
|
flush(controller) {
|
|
72
78
|
const trimmed = buffer.trim();
|
|
73
79
|
if (trimmed) {
|
|
74
|
-
emitChunks(
|
|
80
|
+
emitChunks(commandCodeToOpenAIResponse(trimmed, state), controller);
|
|
75
81
|
}
|
|
76
|
-
controller.enqueue(encoder.encode(
|
|
82
|
+
controller.enqueue(encoder.encode(SSE_DONE));
|
|
77
83
|
},
|
|
78
84
|
});
|
|
79
85
|
|
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
} from "../utils/cursorProtobuf.js";
|
|
9
9
|
import { buildCursorHeaders } from "../utils/cursorChecksum.js";
|
|
10
10
|
import { estimateUsage } from "../utils/usageTracking.js";
|
|
11
|
+
import { SSE_DONE, SSE_HEADERS } from "../utils/sseConstants.js";
|
|
12
|
+
import { chatChunkSse } from "../utils/sse.js";
|
|
11
13
|
import { FORMATS } from "../translator/formats.js";
|
|
12
14
|
import { proxyAwareFetch } from "../utils/proxyFetch.js";
|
|
13
15
|
import zlib from "zlib";
|
|
@@ -98,6 +100,32 @@ function decompressPayload(payload, flags) {
|
|
|
98
100
|
return payload;
|
|
99
101
|
}
|
|
100
102
|
|
|
103
|
+
// Read one cursor protobuf frame: header + bounds + decompress. Returns status + payload + new offset.
|
|
104
|
+
function readCursorFrame(buffer, offset, frameNum, tag) {
|
|
105
|
+
if (offset + 5 > buffer.length) {
|
|
106
|
+
debugLog(`[CURSOR BUFFER${tag}] Reached end, offset=${offset}, remaining=${buffer.length - offset}`);
|
|
107
|
+
return { status: "done" };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const flags = buffer[offset];
|
|
111
|
+
const length = buffer.readUInt32BE(offset + 1);
|
|
112
|
+
debugLog(`[CURSOR BUFFER${tag}] Frame ${frameNum + 1}: flags=0x${flags.toString(16).padStart(2, "0")}, length=${length}`);
|
|
113
|
+
|
|
114
|
+
if (offset + 5 + length > buffer.length) {
|
|
115
|
+
debugLog(`[CURSOR BUFFER${tag}] Incomplete frame, offset=${offset}, length=${length}, buffer.length=${buffer.length}`);
|
|
116
|
+
return { status: "done" };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let payload = buffer.slice(offset + 5, offset + 5 + length);
|
|
120
|
+
const newOffset = offset + 5 + length;
|
|
121
|
+
payload = decompressPayload(payload, flags);
|
|
122
|
+
if (!payload) {
|
|
123
|
+
debugLog(`[CURSOR BUFFER${tag}] Frame ${frameNum + 1}: decompression failed, skipping`);
|
|
124
|
+
return { status: "skip", offset: newOffset };
|
|
125
|
+
}
|
|
126
|
+
return { status: "ok", payload, offset: newOffset };
|
|
127
|
+
}
|
|
128
|
+
|
|
101
129
|
function createErrorResponse(jsonError) {
|
|
102
130
|
const errorMsg = jsonError?.error?.details?.[0]?.debug?.details?.title
|
|
103
131
|
|| jsonError?.error?.details?.[0]?.debug?.details?.detail
|
|
@@ -141,7 +169,7 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
141
169
|
|
|
142
170
|
transformRequest(model, body, stream, credentials) {
|
|
143
171
|
// Messages are already translated by chatCore (claude→openai→cursor)
|
|
144
|
-
// Do NOT call
|
|
172
|
+
// Do NOT call openaiToCursorRequest again — double-translation drops tool_results
|
|
145
173
|
const messages = body.messages || [];
|
|
146
174
|
const tools = body.tools || [];
|
|
147
175
|
const reasoningEffort = body.reasoning_effort || null;
|
|
@@ -286,36 +314,12 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
286
314
|
debugLog(`[CURSOR BUFFER] Total length: ${buffer.length} bytes`);
|
|
287
315
|
|
|
288
316
|
while (offset < buffer.length) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
);
|
|
293
|
-
break;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
const flags = buffer[offset];
|
|
297
|
-
const length = buffer.readUInt32BE(offset + 1);
|
|
298
|
-
|
|
299
|
-
debugLog(
|
|
300
|
-
`[CURSOR BUFFER] Frame ${frameCount + 1}: flags=0x${flags.toString(16).padStart(2, "0")}, length=${length}`
|
|
301
|
-
);
|
|
302
|
-
|
|
303
|
-
if (offset + 5 + length > buffer.length) {
|
|
304
|
-
debugLog(
|
|
305
|
-
`[CURSOR BUFFER] Incomplete frame, offset=${offset}, length=${length}, buffer.length=${buffer.length}`
|
|
306
|
-
);
|
|
307
|
-
break;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
let payload = buffer.slice(offset + 5, offset + 5 + length);
|
|
311
|
-
offset += 5 + length;
|
|
317
|
+
const frame = readCursorFrame(buffer, offset, frameCount, "");
|
|
318
|
+
if (frame.status === "done") break;
|
|
319
|
+
offset = frame.offset;
|
|
312
320
|
frameCount++;
|
|
313
|
-
|
|
314
|
-
payload =
|
|
315
|
-
if (!payload) {
|
|
316
|
-
debugLog(`[CURSOR BUFFER] Frame ${frameCount}: decompression failed, skipping`);
|
|
317
|
-
continue;
|
|
318
|
-
}
|
|
321
|
+
if (frame.status === "skip") continue;
|
|
322
|
+
const payload = frame.payload;
|
|
319
323
|
|
|
320
324
|
// Check for JSON error frames (byte guard: skip toString on non-JSON frames)
|
|
321
325
|
if (payload.length > 0 && payload[0] === 0x7b) {
|
|
@@ -466,36 +470,12 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
466
470
|
debugLog(`[CURSOR BUFFER SSE] Total length: ${buffer.length} bytes`);
|
|
467
471
|
|
|
468
472
|
while (offset < buffer.length) {
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
);
|
|
473
|
-
break;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
const flags = buffer[offset];
|
|
477
|
-
const length = buffer.readUInt32BE(offset + 1);
|
|
478
|
-
|
|
479
|
-
debugLog(
|
|
480
|
-
`[CURSOR BUFFER SSE] Frame ${frameCount + 1}: flags=0x${flags.toString(16).padStart(2, "0")}, length=${length}`
|
|
481
|
-
);
|
|
482
|
-
|
|
483
|
-
if (offset + 5 + length > buffer.length) {
|
|
484
|
-
debugLog(
|
|
485
|
-
`[CURSOR BUFFER SSE] Incomplete frame, offset=${offset}, length=${length}, buffer.length=${buffer.length}`
|
|
486
|
-
);
|
|
487
|
-
break;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
let payload = buffer.slice(offset + 5, offset + 5 + length);
|
|
491
|
-
offset += 5 + length;
|
|
473
|
+
const frame = readCursorFrame(buffer, offset, frameCount, " SSE");
|
|
474
|
+
if (frame.status === "done") break;
|
|
475
|
+
offset = frame.offset;
|
|
492
476
|
frameCount++;
|
|
493
|
-
|
|
494
|
-
payload =
|
|
495
|
-
if (!payload) {
|
|
496
|
-
debugLog(`[CURSOR BUFFER SSE] Frame ${frameCount}: decompression failed, skipping`);
|
|
497
|
-
continue;
|
|
498
|
-
}
|
|
477
|
+
if (frame.status === "skip") continue;
|
|
478
|
+
const payload = frame.payload;
|
|
499
479
|
|
|
500
480
|
// Check for JSON error frames (byte-guard: only decode if starts with '{')
|
|
501
481
|
if (payload[0] === 0x7b) {
|
|
@@ -542,21 +522,7 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
542
522
|
const tc = result.toolCall;
|
|
543
523
|
|
|
544
524
|
if (chunks.length === 0) {
|
|
545
|
-
chunks.push(
|
|
546
|
-
`data: ${JSON.stringify({
|
|
547
|
-
id: responseId,
|
|
548
|
-
object: "chat.completion.chunk",
|
|
549
|
-
created,
|
|
550
|
-
model,
|
|
551
|
-
choices: [
|
|
552
|
-
{
|
|
553
|
-
index: 0,
|
|
554
|
-
delta: { role: "assistant", content: "" },
|
|
555
|
-
finish_reason: null
|
|
556
|
-
}
|
|
557
|
-
]
|
|
558
|
-
})}\n\n`
|
|
559
|
-
);
|
|
525
|
+
chunks.push(chatChunkSse({ id: responseId, created, model, delta: { role: "assistant", content: "" } }));
|
|
560
526
|
}
|
|
561
527
|
|
|
562
528
|
if (toolCallsMap.has(tc.id)) {
|
|
@@ -569,33 +535,22 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
569
535
|
// Stream the delta arguments
|
|
570
536
|
if (tc.function.arguments) {
|
|
571
537
|
emittedToolCallIds.add(tc.id);
|
|
572
|
-
chunks.push(
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
created,
|
|
577
|
-
model,
|
|
578
|
-
choices: [
|
|
538
|
+
chunks.push(chatChunkSse({
|
|
539
|
+
id: responseId, created, model,
|
|
540
|
+
delta: {
|
|
541
|
+
tool_calls: [
|
|
579
542
|
{
|
|
580
|
-
index:
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
function: {
|
|
588
|
-
name: tc.function.name,
|
|
589
|
-
arguments: tc.function.arguments
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
]
|
|
593
|
-
},
|
|
594
|
-
finish_reason: null
|
|
543
|
+
index: existing.index,
|
|
544
|
+
id: tc.id,
|
|
545
|
+
type: "function",
|
|
546
|
+
function: {
|
|
547
|
+
name: tc.function.name,
|
|
548
|
+
arguments: tc.function.arguments
|
|
549
|
+
}
|
|
595
550
|
}
|
|
596
551
|
]
|
|
597
|
-
}
|
|
598
|
-
);
|
|
552
|
+
}
|
|
553
|
+
}));
|
|
599
554
|
}
|
|
600
555
|
} else {
|
|
601
556
|
// New tool call - assign index and add to map
|
|
@@ -606,56 +561,34 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
606
561
|
|
|
607
562
|
// Stream initial tool call with name
|
|
608
563
|
emittedToolCallIds.add(tc.id);
|
|
609
|
-
chunks.push(
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
created,
|
|
614
|
-
model,
|
|
615
|
-
choices: [
|
|
564
|
+
chunks.push(chatChunkSse({
|
|
565
|
+
id: responseId, created, model,
|
|
566
|
+
delta: {
|
|
567
|
+
tool_calls: [
|
|
616
568
|
{
|
|
617
|
-
index:
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
function: {
|
|
625
|
-
name: tc.function.name,
|
|
626
|
-
arguments: tc.function.arguments
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
]
|
|
630
|
-
},
|
|
631
|
-
finish_reason: null
|
|
569
|
+
index: toolCallIndex,
|
|
570
|
+
id: tc.id,
|
|
571
|
+
type: "function",
|
|
572
|
+
function: {
|
|
573
|
+
name: tc.function.name,
|
|
574
|
+
arguments: tc.function.arguments
|
|
575
|
+
}
|
|
632
576
|
}
|
|
633
577
|
]
|
|
634
|
-
}
|
|
635
|
-
);
|
|
578
|
+
}
|
|
579
|
+
}));
|
|
636
580
|
}
|
|
637
581
|
}
|
|
638
582
|
|
|
639
583
|
if (result.text) {
|
|
640
584
|
totalContent += result.text;
|
|
641
|
-
chunks.push(
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
{
|
|
649
|
-
index: 0,
|
|
650
|
-
delta:
|
|
651
|
-
chunks.length === 0 && toolCalls.length === 0
|
|
652
|
-
? { role: "assistant", content: result.text }
|
|
653
|
-
: { content: result.text },
|
|
654
|
-
finish_reason: null
|
|
655
|
-
}
|
|
656
|
-
]
|
|
657
|
-
})}\n\n`
|
|
658
|
-
);
|
|
585
|
+
chunks.push(chatChunkSse({
|
|
586
|
+
id: responseId, created, model,
|
|
587
|
+
delta:
|
|
588
|
+
chunks.length === 0 && toolCalls.length === 0
|
|
589
|
+
? { role: "assistant", content: result.text }
|
|
590
|
+
: { content: result.text }
|
|
591
|
+
}));
|
|
659
592
|
}
|
|
660
593
|
|
|
661
594
|
if (isComposerModel(model) && result.thinking) {
|
|
@@ -665,24 +598,13 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
665
598
|
const deltaContent = visibleContent.slice(emittedComposerThinkingContentLength);
|
|
666
599
|
emittedComposerThinkingContentLength = visibleContent.length;
|
|
667
600
|
totalContent += deltaContent;
|
|
668
|
-
chunks.push(
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
{
|
|
676
|
-
index: 0,
|
|
677
|
-
delta:
|
|
678
|
-
chunks.length === 0 && toolCalls.length === 0
|
|
679
|
-
? { role: "assistant", content: deltaContent }
|
|
680
|
-
: { content: deltaContent },
|
|
681
|
-
finish_reason: null
|
|
682
|
-
}
|
|
683
|
-
]
|
|
684
|
-
})}\n\n`
|
|
685
|
-
);
|
|
601
|
+
chunks.push(chatChunkSse({
|
|
602
|
+
id: responseId, created, model,
|
|
603
|
+
delta:
|
|
604
|
+
chunks.length === 0 && toolCalls.length === 0
|
|
605
|
+
? { role: "assistant", content: deltaContent }
|
|
606
|
+
: { content: deltaContent }
|
|
607
|
+
}));
|
|
686
608
|
}
|
|
687
609
|
}
|
|
688
610
|
}
|
|
@@ -708,53 +630,28 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
708
630
|
|
|
709
631
|
// Emit SSE chunk for the finalized tool call if not already emitted
|
|
710
632
|
if (!emittedToolCallIds.has(tc.id)) {
|
|
711
|
-
chunks.push(
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
created,
|
|
716
|
-
model,
|
|
717
|
-
choices: [
|
|
633
|
+
chunks.push(chatChunkSse({
|
|
634
|
+
id: responseId, created, model,
|
|
635
|
+
delta: {
|
|
636
|
+
tool_calls: [
|
|
718
637
|
{
|
|
719
|
-
index:
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
function: {
|
|
727
|
-
name: tc.function.name,
|
|
728
|
-
arguments: tc.function.arguments
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
]
|
|
732
|
-
},
|
|
733
|
-
finish_reason: null
|
|
638
|
+
index: toolCallIndex,
|
|
639
|
+
id: tc.id,
|
|
640
|
+
type: "function",
|
|
641
|
+
function: {
|
|
642
|
+
name: tc.function.name,
|
|
643
|
+
arguments: tc.function.arguments
|
|
644
|
+
}
|
|
734
645
|
}
|
|
735
646
|
]
|
|
736
|
-
}
|
|
737
|
-
);
|
|
647
|
+
}
|
|
648
|
+
}));
|
|
738
649
|
}
|
|
739
650
|
}
|
|
740
651
|
}
|
|
741
652
|
|
|
742
653
|
if (chunks.length === 0 && toolCalls.length === 0) {
|
|
743
|
-
chunks.push(
|
|
744
|
-
`data: ${JSON.stringify({
|
|
745
|
-
id: responseId,
|
|
746
|
-
object: "chat.completion.chunk",
|
|
747
|
-
created,
|
|
748
|
-
model,
|
|
749
|
-
choices: [
|
|
750
|
-
{
|
|
751
|
-
index: 0,
|
|
752
|
-
delta: { role: "assistant", content: "" },
|
|
753
|
-
finish_reason: null
|
|
754
|
-
}
|
|
755
|
-
]
|
|
756
|
-
})}\n\n`
|
|
757
|
-
);
|
|
654
|
+
chunks.push(chatChunkSse({ id: responseId, created, model, delta: { role: "assistant", content: "" } }));
|
|
758
655
|
}
|
|
759
656
|
|
|
760
657
|
const usage = estimateUsage(body, totalContent.length, FORMATS.OPENAI);
|
|
@@ -775,15 +672,11 @@ export class CursorExecutor extends BaseExecutor {
|
|
|
775
672
|
usage
|
|
776
673
|
})}\n\n`
|
|
777
674
|
);
|
|
778
|
-
chunks.push(
|
|
675
|
+
chunks.push(SSE_DONE);
|
|
779
676
|
|
|
780
677
|
return new Response(chunks.join(""), {
|
|
781
678
|
status: 200,
|
|
782
|
-
headers: {
|
|
783
|
-
"Content-Type": "text/event-stream",
|
|
784
|
-
"Cache-Control": "no-cache",
|
|
785
|
-
"Connection": "keep-alive"
|
|
786
|
-
}
|
|
679
|
+
headers: { ...SSE_HEADERS }
|
|
787
680
|
});
|
|
788
681
|
}
|
|
789
682
|
|