@fudrouter/fsrouter 0.6.59 → 0.6.61
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/package.json +1 -1
- package/open-sse/AGENTS.md +0 -39
- package/open-sse/config/anthropicHeaders.js +0 -87
- package/open-sse/config/appConstants.js +0 -238
- package/open-sse/config/audioRegistry.js +0 -506
- package/open-sse/config/cliFingerprints.js +0 -304
- package/open-sse/config/codexInstructions.js +0 -119
- package/open-sse/config/codexQuotaScopes.js +0 -42
- package/open-sse/config/constants.js +0 -4
- package/open-sse/config/contextEditing.js +0 -68
- package/open-sse/config/credentialLoader.js +0 -83
- package/open-sse/config/defaultThinkingSignature.js +0 -12
- package/open-sse/config/embeddingRegistry.js +0 -264
- package/open-sse/config/errorConfig.js +0 -96
- package/open-sse/config/freeModelCatalog.data.js +0 -121
- package/open-sse/config/freeModelCatalog.js +0 -90
- package/open-sse/config/freeTierCatalog.js +0 -81
- package/open-sse/config/googleTtsLanguages.js +0 -62
- package/open-sse/config/imageParamDefs.js +0 -360
- package/open-sse/config/imageRegistry.js +0 -493
- package/open-sse/config/kiroConstants.js +0 -268
- package/open-sse/config/mediaConfig.js +0 -27
- package/open-sse/config/mediaServiceKinds.js +0 -71
- package/open-sse/config/models.js +0 -13
- package/open-sse/config/moderationRegistry.js +0 -71
- package/open-sse/config/musicRegistry.js +0 -99
- package/open-sse/config/ocrRegistry.js +0 -61
- package/open-sse/config/ollamaModels.js +0 -19
- package/open-sse/config/providerErrorRules.js +0 -114
- package/open-sse/config/providerFieldStrips.js +0 -35
- package/open-sse/config/providerHeaderProfiles.js +0 -191
- package/open-sse/config/providerModels.js +0 -106
- package/open-sse/config/providerRegistry.js +0 -16
- package/open-sse/config/providers.js +0 -19
- package/open-sse/config/registryUtils.js +0 -106
- package/open-sse/config/rerankRegistry.js +0 -177
- package/open-sse/config/runtimeConfig.js +0 -96
- package/open-sse/config/runway.js +0 -39
- package/open-sse/config/searchRegistry.js +0 -153
- package/open-sse/config/toolCloaking.js +0 -199
- package/open-sse/config/ttsModels.js +0 -129
- package/open-sse/config/videoRegistry.js +0 -207
- package/open-sse/executors/adapta-web.js +0 -435
- package/open-sse/executors/antigravity.js +0 -534
- package/open-sse/executors/antigravityUpstreamError.js +0 -13
- package/open-sse/executors/auggie.js +0 -437
- package/open-sse/executors/azure-openai.js +0 -32
- package/open-sse/executors/azure.js +0 -57
- package/open-sse/executors/base.js +0 -181
- package/open-sse/executors/bedrock.js +0 -633
- package/open-sse/executors/blackbox-web.js +0 -578
- package/open-sse/executors/chatgpt-web.js +0 -2042
- package/open-sse/executors/chipotle.js +0 -357
- package/open-sse/executors/claude-web-with-auto-refresh.js +0 -73
- package/open-sse/executors/claude-web.js +0 -586
- package/open-sse/executors/cliproxyapi.js +0 -296
- package/open-sse/executors/cloudflare-ai.js +0 -46
- package/open-sse/executors/codebuddy-cn.js +0 -40
- package/open-sse/executors/codex.js +0 -1324
- package/open-sse/executors/commandCode.js +0 -558
- package/open-sse/executors/commandcode.js +0 -88
- package/open-sse/executors/copilot-m365-connection.js +0 -176
- package/open-sse/executors/copilot-m365-frames.js +0 -192
- package/open-sse/executors/copilot-m365-web.js +0 -299
- package/open-sse/executors/copilot-web.js +0 -580
- package/open-sse/executors/cursor.js +0 -795
- package/open-sse/executors/deepseek-web-with-auto-refresh.js +0 -150
- package/open-sse/executors/deepseek-web.js +0 -875
- package/open-sse/executors/default.js +0 -430
- package/open-sse/executors/devin-cli.js +0 -351
- package/open-sse/executors/doubao-web.js +0 -550
- package/open-sse/executors/duckduckgo-web.js +0 -629
- package/open-sse/executors/forceResponsesUpstream.js +0 -33
- package/open-sse/executors/gemini-business.js +0 -320
- package/open-sse/executors/gemini-cli.js +0 -89
- package/open-sse/executors/gemini-web.js +0 -297
- package/open-sse/executors/github.js +0 -379
- package/open-sse/executors/gitlab.js +0 -569
- package/open-sse/executors/glm.js +0 -361
- package/open-sse/executors/grok-cli.js +0 -119
- package/open-sse/executors/grok-web.js +0 -345
- package/open-sse/executors/huggingchat.js +0 -467
- package/open-sse/executors/iflow.js +0 -108
- package/open-sse/executors/index.js +0 -78
- package/open-sse/executors/inner-ai.js +0 -527
- package/open-sse/executors/kimchi.js +0 -123
- package/open-sse/executors/kimi-web.js +0 -325
- package/open-sse/executors/kimi.js +0 -97
- package/open-sse/executors/kiro.js +0 -503
- package/open-sse/executors/kiroThinking.js +0 -44
- package/open-sse/executors/lmarena.js +0 -395
- package/open-sse/executors/mimo-free.js +0 -167
- package/open-sse/executors/mimocode.js +0 -392
- package/open-sse/executors/ninerouter.js +0 -155
- package/open-sse/executors/nlpcloud.js +0 -438
- package/open-sse/executors/ollama-local.js +0 -14
- package/open-sse/executors/opencode-go.js +0 -41
- package/open-sse/executors/opencode.js +0 -32
- package/open-sse/executors/perplexity-web.js +0 -581
- package/open-sse/executors/poe-web.js +0 -133
- package/open-sse/executors/pollinations.js +0 -95
- package/open-sse/executors/puter.js +0 -31
- package/open-sse/executors/qoder.js +0 -448
- package/open-sse/executors/qwen-web.js +0 -372
- package/open-sse/executors/qwen.js +0 -129
- package/open-sse/executors/t3-chat-web.js +0 -417
- package/open-sse/executors/theoldllm.js +0 -290
- package/open-sse/executors/trae.js +0 -418
- package/open-sse/executors/v0-vercel-web.js +0 -141
- package/open-sse/executors/venice-web.js +0 -142
- package/open-sse/executors/vertex.js +0 -131
- package/open-sse/executors/vertexMedia.js +0 -236
- package/open-sse/executors/windsurf.js +0 -560
- package/open-sse/executors/xai.js +0 -46
- package/open-sse/executors/xiaomi-tokenplan.js +0 -19
- package/open-sse/executors/yuanbao-web.js +0 -385
- package/open-sse/executors/zed-hosted.js +0 -281
- package/open-sse/executors/zenmux-free.js +0 -247
- package/open-sse/handlers/audioSpeech.js +0 -759
- package/open-sse/handlers/audioTranscription.js +0 -395
- package/open-sse/handlers/audioTranslation.js +0 -181
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +0 -300
- package/open-sse/handlers/chatCore/requestDetail.js +0 -102
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +0 -231
- package/open-sse/handlers/chatCore/streamingHandler.js +0 -95
- package/open-sse/handlers/chatCore.js +0 -404
- package/open-sse/handlers/embeddingProviders/_base.js +0 -4
- package/open-sse/handlers/embeddingProviders/gemini.js +0 -54
- package/open-sse/handlers/embeddingProviders/index.js +0 -23
- package/open-sse/handlers/embeddingProviders/openai.js +0 -39
- package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +0 -13
- package/open-sse/handlers/embeddingsCore.js +0 -126
- package/open-sse/handlers/fetch/index.js +0 -237
- package/open-sse/handlers/imageGenerationCore.js +0 -230
- package/open-sse/handlers/imageProviders/_base.js +0 -31
- package/open-sse/handlers/imageProviders/antigravity.js +0 -73
- package/open-sse/handlers/imageProviders/blackForestLabs.js +0 -63
- package/open-sse/handlers/imageProviders/cloudflareAi.js +0 -207
- package/open-sse/handlers/imageProviders/codex.js +0 -217
- package/open-sse/handlers/imageProviders/comfyui.js +0 -25
- package/open-sse/handlers/imageProviders/falAi.js +0 -62
- package/open-sse/handlers/imageProviders/gemini.js +0 -40
- package/open-sse/handlers/imageProviders/huggingface.js +0 -38
- package/open-sse/handlers/imageProviders/index.js +0 -44
- package/open-sse/handlers/imageProviders/leonardo.js +0 -435
- package/open-sse/handlers/imageProviders/nanobanana.js +0 -79
- package/open-sse/handlers/imageProviders/openai.js +0 -61
- package/open-sse/handlers/imageProviders/runwayml.js +0 -72
- package/open-sse/handlers/imageProviders/sdwebui.js +0 -36
- package/open-sse/handlers/imageProviders/stabilityAi.js +0 -59
- package/open-sse/handlers/imageProviders/weavy.js +0 -222
- package/open-sse/handlers/moderations.js +0 -92
- package/open-sse/handlers/ocr.js +0 -89
- package/open-sse/handlers/rerank.js +0 -223
- package/open-sse/handlers/responseSanitizer/reasoning.js +0 -144
- package/open-sse/handlers/responsesHandler.js +0 -99
- package/open-sse/handlers/search/callers.js +0 -371
- package/open-sse/handlers/search/chatSearch.js +0 -409
- package/open-sse/handlers/search/index.js +0 -201
- package/open-sse/handlers/search/normalizers.js +0 -223
- package/open-sse/handlers/search.js +0 -1056
- package/open-sse/handlers/sseParser.js +0 -469
- package/open-sse/handlers/sttCore.js +0 -193
- package/open-sse/handlers/ttsCore.js +0 -74
- package/open-sse/handlers/ttsProviders/_base.js +0 -39
- package/open-sse/handlers/ttsProviders/edgeTts.js +0 -89
- package/open-sse/handlers/ttsProviders/elevenlabs.js +0 -48
- package/open-sse/handlers/ttsProviders/gemini.js +0 -117
- package/open-sse/handlers/ttsProviders/genericFormats.js +0 -169
- package/open-sse/handlers/ttsProviders/googleTts.js +0 -54
- package/open-sse/handlers/ttsProviders/index.js +0 -50
- package/open-sse/handlers/ttsProviders/localDevice.js +0 -87
- package/open-sse/handlers/ttsProviders/minimax.js +0 -59
- package/open-sse/handlers/ttsProviders/openai.js +0 -30
- package/open-sse/handlers/ttsProviders/openrouter.js +0 -70
- package/open-sse/handlers/usageExtractor.js +0 -93
- package/open-sse/handlers/videoGenerationCore.js +0 -119
- package/open-sse/handlers/videoProviders/index.js +0 -22
- package/open-sse/handlers/videoProviders/leonardo.js +0 -511
- package/open-sse/handlers/videoProviders/weavy.js +0 -198
- package/open-sse/handlers/webFetch.js +0 -200
- package/open-sse/index.js +0 -79
- package/open-sse/mcp-server/audit.js +0 -283
- package/open-sse/mcp-server/catalog.js +0 -184
- package/open-sse/mcp-server/descriptionCompressor.js +0 -175
- package/open-sse/mcp-server/httpAuthContext.js +0 -32
- package/open-sse/mcp-server/httpTransport.js +0 -229
- package/open-sse/mcp-server/index.js +0 -33
- package/open-sse/mcp-server/mcpCallerIdentity.js +0 -21
- package/open-sse/mcp-server/runtimeHeartbeat.js +0 -110
- package/open-sse/mcp-server/schemas/a2a.js +0 -153
- package/open-sse/mcp-server/schemas/audit.js +0 -17
- package/open-sse/mcp-server/schemas/index.js +0 -166
- package/open-sse/mcp-server/schemas/pickFastestModel.js +0 -90
- package/open-sse/mcp-server/schemas/toolDefinition.js +0 -0
- package/open-sse/mcp-server/schemas/toolSearch.js +0 -32
- package/open-sse/mcp-server/schemas/tools.js +0 -1219
- package/open-sse/mcp-server/scopeEnforcement.js +0 -80
- package/open-sse/mcp-server/server.js +0 -1168
- package/open-sse/mcp-server/toolCardinality.js +0 -78
- package/open-sse/mcp-server/toolSearch/catalog.js +0 -66
- package/open-sse/mcp-server/toolSearch/handler.js +0 -20
- package/open-sse/mcp-server/toolSearch/index.js +0 -10
- package/open-sse/mcp-server/toolSearch/register.js +0 -21
- package/open-sse/mcp-server/toolSearch/search.js +0 -55
- package/open-sse/mcp-server/toolSearch/signature.js +0 -67
- package/open-sse/mcp-server/tools/advancedTools.js +0 -893
- package/open-sse/mcp-server/tools/agentSkillTools.js +0 -69
- package/open-sse/mcp-server/tools/compressionTools.js +0 -309
- package/open-sse/mcp-server/tools/gamificationTools.js +0 -134
- package/open-sse/mcp-server/tools/githubSkillTools.js +0 -102
- package/open-sse/mcp-server/tools/memoryTools.js +0 -118
- package/open-sse/mcp-server/tools/notionTools.js +0 -101
- package/open-sse/mcp-server/tools/obsidianTools.js +0 -307
- package/open-sse/mcp-server/tools/pickFastestModel.js +0 -223
- package/open-sse/mcp-server/tools/pluginTools.js +0 -181
- package/open-sse/mcp-server/tools/poolTools.js +0 -139
- package/open-sse/mcp-server/tools/skillTools.js +0 -113
- package/open-sse/package.json +0 -10
- package/open-sse/providers/REGISTRY_TEMPLATE.js +0 -98
- package/open-sse/providers/capabilities.js +0 -293
- package/open-sse/providers/index.js +0 -51
- package/open-sse/providers/models/helpers.js +0 -20
- package/open-sse/providers/models/namePatterns.js +0 -33
- package/open-sse/providers/models/schema.js +0 -40
- package/open-sse/providers/pricing.js +0 -308
- package/open-sse/providers/registry/alicode-intl.js +0 -30
- package/open-sse/providers/registry/alicode.js +0 -31
- package/open-sse/providers/registry/anthropic.js +0 -37
- package/open-sse/providers/registry/antigravity.js +0 -81
- package/open-sse/providers/registry/assemblyai.js +0 -38
- package/open-sse/providers/registry/aws-polly.js +0 -45
- package/open-sse/providers/registry/azure.js +0 -21
- package/open-sse/providers/registry/black-forest-labs.js +0 -32
- package/open-sse/providers/registry/blackbox.js +0 -41
- package/open-sse/providers/registry/brave-search.js +0 -35
- package/open-sse/providers/registry/byteplus.js +0 -35
- package/open-sse/providers/registry/cartesia.js +0 -36
- package/open-sse/providers/registry/cerebras.js +0 -31
- package/open-sse/providers/registry/chutes.js +0 -24
- package/open-sse/providers/registry/claude.js +0 -87
- package/open-sse/providers/registry/cline.js +0 -51
- package/open-sse/providers/registry/clinepass.js +0 -57
- package/open-sse/providers/registry/cloudflare-ai.js +0 -55
- package/open-sse/providers/registry/codebuddy-cn.js +0 -77
- package/open-sse/providers/registry/codex.js +0 -100
- package/open-sse/providers/registry/cohere.js +0 -27
- package/open-sse/providers/registry/comfyui.js +0 -20
- package/open-sse/providers/registry/commandcode.js +0 -43
- package/open-sse/providers/registry/coqui.js +0 -30
- package/open-sse/providers/registry/cursor.js +0 -58
- package/open-sse/providers/registry/deepgram.js +0 -33
- package/open-sse/providers/registry/deepseek.js +0 -51
- package/open-sse/providers/registry/digitalocean.js +0 -92
- package/open-sse/providers/registry/edge-tts.js +0 -24
- package/open-sse/providers/registry/elevenlabs.js +0 -35
- package/open-sse/providers/registry/exa.js +0 -50
- package/open-sse/providers/registry/fal-ai.js +0 -34
- package/open-sse/providers/registry/featherless.js +0 -34
- package/open-sse/providers/registry/firecrawl.js +0 -34
- package/open-sse/providers/registry/fireworks.js +0 -29
- package/open-sse/providers/registry/gemini-cli.js +0 -58
- package/open-sse/providers/registry/gemini.js +0 -83
- package/open-sse/providers/registry/github.js +0 -88
- package/open-sse/providers/registry/gitlab.js +0 -32
- package/open-sse/providers/registry/glm-cn.js +0 -35
- package/open-sse/providers/registry/glm.js +0 -58
- package/open-sse/providers/registry/google-pse.js +0 -35
- package/open-sse/providers/registry/google-tts.js +0 -24
- package/open-sse/providers/registry/grok-cli.js +0 -86
- package/open-sse/providers/registry/grok-web.js +0 -39
- package/open-sse/providers/registry/groq.js +0 -37
- package/open-sse/providers/registry/huggingface.js +0 -34
- package/open-sse/providers/registry/hyperbolic.js +0 -35
- package/open-sse/providers/registry/ibm-bob.js +0 -27
- package/open-sse/providers/registry/iflow.js +0 -52
- package/open-sse/providers/registry/index.js +0 -210
- package/open-sse/providers/registry/inworld.js +0 -36
- package/open-sse/providers/registry/jina-ai.js +0 -42
- package/open-sse/providers/registry/jina-reader.js +0 -34
- package/open-sse/providers/registry/kilocode.js +0 -51
- package/open-sse/providers/registry/kimchi.js +0 -49
- package/open-sse/providers/registry/kimi-coding.js +0 -65
- package/open-sse/providers/registry/kimi.js +0 -56
- package/open-sse/providers/registry/kiro.js +0 -115
- package/open-sse/providers/registry/linkup.js +0 -34
- package/open-sse/providers/registry/local-device.js +0 -24
- package/open-sse/providers/registry/mimo-free.js +0 -24
- package/open-sse/providers/registry/minimax-cn.js +0 -76
- package/open-sse/providers/registry/minimax.js +0 -83
- package/open-sse/providers/registry/mistral.js +0 -34
- package/open-sse/providers/registry/mmf.js +0 -19
- package/open-sse/providers/registry/nanobanana.js +0 -35
- package/open-sse/providers/registry/nebius.js +0 -27
- package/open-sse/providers/registry/nvidia.js +0 -43
- package/open-sse/providers/registry/ollama-local.js +0 -19
- package/open-sse/providers/registry/ollama.js +0 -36
- package/open-sse/providers/registry/openai.js +0 -84
- package/open-sse/providers/registry/opencode-go.js +0 -41
- package/open-sse/providers/registry/opencode.js +0 -25
- package/open-sse/providers/registry/openrouter.js +0 -60
- package/open-sse/providers/registry/perplexity-agent.js +0 -49
- package/open-sse/providers/registry/perplexity-web.js +0 -33
- package/open-sse/providers/registry/perplexity.js +0 -37
- package/open-sse/providers/registry/playht.js +0 -36
- package/open-sse/providers/registry/qoder.js +0 -54
- package/open-sse/providers/registry/qwen.js +0 -33
- package/open-sse/providers/registry/recraft.js +0 -24
- package/open-sse/providers/registry/runwayml.js +0 -30
- package/open-sse/providers/registry/sdwebui.js +0 -20
- package/open-sse/providers/registry/searchapi.js +0 -35
- package/open-sse/providers/registry/searxng.js +0 -35
- package/open-sse/providers/registry/serper.js +0 -35
- package/open-sse/providers/registry/siliconflow.js +0 -39
- package/open-sse/providers/registry/stability-ai.js +0 -31
- package/open-sse/providers/registry/tavily.js +0 -50
- package/open-sse/providers/registry/together.js +0 -31
- package/open-sse/providers/registry/topaz.js +0 -19
- package/open-sse/providers/registry/tortoise.js +0 -30
- package/open-sse/providers/registry/venice.js +0 -56
- package/open-sse/providers/registry/vercel-ai-gateway.js +0 -41
- package/open-sse/providers/registry/vertex-partner.js +0 -29
- package/open-sse/providers/registry/vertex.js +0 -32
- package/open-sse/providers/registry/volcengine-ark.js +0 -35
- package/open-sse/providers/registry/voyage-ai.js +0 -30
- package/open-sse/providers/registry/xai.js +0 -45
- package/open-sse/providers/registry/xiaomi-mimo.js +0 -46
- package/open-sse/providers/registry/xiaomi-tokenplan.js +0 -63
- package/open-sse/providers/registry/youcom.js +0 -35
- package/open-sse/providers/schema.js +0 -76
- package/open-sse/providers/shared.js +0 -74
- package/open-sse/providers/thinkingLevels.js +0 -48
- package/open-sse/rtk/applyFilter.js +0 -15
- package/open-sse/rtk/autodetect.js +0 -111
- package/open-sse/rtk/caveman.js +0 -100
- package/open-sse/rtk/cavemanPrompts.js +0 -78
- package/open-sse/rtk/constants.js +0 -55
- package/open-sse/rtk/filters/buildOutput.js +0 -127
- package/open-sse/rtk/filters/dedupLog.js +0 -44
- package/open-sse/rtk/filters/find.js +0 -50
- package/open-sse/rtk/filters/gitDiff.js +0 -92
- package/open-sse/rtk/filters/gitLog.js +0 -99
- package/open-sse/rtk/filters/gitStatus.js +0 -117
- package/open-sse/rtk/filters/grep.js +0 -48
- package/open-sse/rtk/filters/ls.js +0 -79
- package/open-sse/rtk/filters/readNumbered.js +0 -27
- package/open-sse/rtk/filters/searchList.js +0 -52
- package/open-sse/rtk/filters/smartTruncate.js +0 -15
- package/open-sse/rtk/filters/tree.js +0 -32
- package/open-sse/rtk/headroom.js +0 -215
- package/open-sse/rtk/index.js +0 -155
- package/open-sse/rtk/paleo.js +0 -47
- package/open-sse/rtk/ponytail.js +0 -9
- package/open-sse/rtk/ponytailPrompt.js +0 -52
- package/open-sse/rtk/ponytailPrompts.js +0 -76
- package/open-sse/rtk/pxpipe.js +0 -104
- package/open-sse/rtk/registry.js +0 -38
- package/open-sse/rtk/systemInject.js +0 -98
- package/open-sse/services/accountFallback.js +0 -323
- package/open-sse/services/antigravityHeaders.js +0 -91
- package/open-sse/services/antigravityVersion.js +0 -154
- package/open-sse/services/clinepassModels.js +0 -63
- package/open-sse/services/codexQuotaFetcher.js +0 -312
- package/open-sse/services/codexVerbosity.js +0 -30
- package/open-sse/services/combo/context.js +0 -12
- package/open-sse/services/combo/fingerprintExpansion.js +0 -51
- package/open-sse/services/combo/headroomRanking.js +0 -28
- package/open-sse/services/combo/quotaExhaustionCutoff.js +0 -87
- package/open-sse/services/combo/quotaScoring.js +0 -226
- package/open-sse/services/combo/quotaShareConcurrency.js +0 -25
- package/open-sse/services/combo/quotaShareInflight.js +0 -50
- package/open-sse/services/combo/quotaShareStrategy.js +0 -130
- package/open-sse/services/combo/resolveAutoStrategy.js +0 -231
- package/open-sse/services/combo/responseValidation.js +0 -140
- package/open-sse/services/combo/runtimeUnits.js +0 -195
- package/open-sse/services/combo/sessionStickiness.js +0 -128
- package/open-sse/services/combo/shadowRouting.js +0 -131
- package/open-sse/services/combo/targetExhaustion.js +0 -75
- package/open-sse/services/combo/targetSorters.js +0 -126
- package/open-sse/services/combo/targetTimeoutRunner.js +0 -65
- package/open-sse/services/combo/validateQuality.js +0 -271
- package/open-sse/services/combo.js +0 -571
- package/open-sse/services/comboAgentMiddleware.js +0 -91
- package/open-sse/services/comboConfig.js +0 -153
- package/open-sse/services/comboManifestMetrics.js +0 -10
- package/open-sse/services/comboMetrics.js +0 -278
- package/open-sse/services/compact.js +0 -71
- package/open-sse/services/copilotModels.js +0 -155
- package/open-sse/services/emergencyFallback.js +0 -109
- package/open-sse/services/errorClassifier.js +0 -190
- package/open-sse/services/evalRouting.js +0 -201
- package/open-sse/services/freeWebSearch.js +0 -4
- package/open-sse/services/fusion.js +0 -223
- package/open-sse/services/intentClassifier.js +0 -631
- package/open-sse/services/kimchiModels.js +0 -176
- package/open-sse/services/kiroModels.js +0 -332
- package/open-sse/services/model.js +0 -136
- package/open-sse/services/modelCapabilities.js +0 -5
- package/open-sse/services/modelDeprecation.js +0 -101
- package/open-sse/services/modelFamilyFallback.js +0 -166
- package/open-sse/services/oauthCredentialManager.js +0 -156
- package/open-sse/services/pipeline.js +0 -107
- package/open-sse/services/projectId.js +0 -306
- package/open-sse/services/provider.js +0 -169
- package/open-sse/services/providerCooldownTracker.js +0 -94
- package/open-sse/services/providerDefaultRateLimit.js +0 -11
- package/open-sse/services/proxyAutoSelector.js +0 -24
- package/open-sse/services/qoderModels.js +0 -214
- package/open-sse/services/quotaFetchThrottle.js +0 -103
- package/open-sse/services/quotaMonitor.js +0 -310
- package/open-sse/services/quotaPreflight.js +0 -266
- package/open-sse/services/rateLimitManager/headers.js +0 -56
- package/open-sse/services/rateLimitManager.js +0 -616
- package/open-sse/services/rateLimitSemaphore.js +0 -112
- package/open-sse/services/responsesInputSanitizer.js +0 -99
- package/open-sse/services/slidingWindowLimiter.js +0 -44
- package/open-sse/services/streamRecovery.js +0 -355
- package/open-sse/services/taskAwareRouter.js +0 -227
- package/open-sse/services/taskAwareRouting.js +0 -332
- package/open-sse/services/thinkingBudget.js +0 -247
- package/open-sse/services/tokenRefresh/dedup.js +0 -31
- package/open-sse/services/tokenRefresh/providers.js +0 -624
- package/open-sse/services/tokenRefresh.js +0 -254
- package/open-sse/services/usage/claude.js +0 -147
- package/open-sse/services/usage/codebuddy-cn.js +0 -138
- package/open-sse/services/usage/codex.js +0 -267
- package/open-sse/services/usage/github.js +0 -100
- package/open-sse/services/usage/google.js +0 -241
- package/open-sse/services/usage/grok-cli.js +0 -274
- package/open-sse/services/usage/kiro.js +0 -188
- package/open-sse/services/usage/minimax.js +0 -234
- package/open-sse/services/usage/misc.js +0 -288
- package/open-sse/services/usage/shared.js +0 -70
- package/open-sse/services/usage.js +0 -62
- package/open-sse/services/usageDb.js +0 -2
- package/open-sse/services/webSearchRouting.js +0 -25
- package/open-sse/services/wildcardRouter.js +0 -59
- package/open-sse/shared/clineAuth.js +0 -37
- package/open-sse/shared/machineId.js +0 -19
- package/open-sse/shared/qoder/constants.js +0 -64
- package/open-sse/shared/qoder/cosy.js +0 -175
- package/open-sse/shared/qoder/encoding.js +0 -55
- package/open-sse/transformer/responsesTransformer.js +0 -439
- package/open-sse/transformer/streamToJsonConverter.js +0 -103
- package/open-sse/translator/concerns/chunk.js +0 -11
- package/open-sse/translator/concerns/finishReason.js +0 -63
- package/open-sse/translator/concerns/image.js +0 -124
- package/open-sse/translator/concerns/json.js +0 -5
- package/open-sse/translator/concerns/message.js +0 -7
- package/open-sse/translator/concerns/modality.js +0 -155
- package/open-sse/translator/concerns/paramSupport.js +0 -75
- package/open-sse/translator/concerns/prefetch.js +0 -96
- package/open-sse/translator/concerns/reasoning.js +0 -24
- package/open-sse/translator/concerns/thinking.js +0 -53
- package/open-sse/translator/concerns/thinkingUnified.js +0 -329
- package/open-sse/translator/concerns/toolCall.js +0 -153
- package/open-sse/translator/concerns/usage.js +0 -69
- package/open-sse/translator/formats/claude.js +0 -368
- package/open-sse/translator/formats/gemini.js +0 -380
- package/open-sse/translator/formats/maxTokens.js +0 -34
- package/open-sse/translator/formats/openai.js +0 -134
- package/open-sse/translator/formats/responsesApi.js +0 -141
- package/open-sse/translator/formats.js +0 -36
- package/open-sse/translator/helpers/claudeHelper.js +0 -216
- package/open-sse/translator/helpers/geminiHelper.js +0 -372
- package/open-sse/translator/helpers/imageHelper.js +0 -34
- package/open-sse/translator/helpers/maxTokensHelper.js +0 -27
- package/open-sse/translator/helpers/openaiHelper.js +0 -130
- package/open-sse/translator/helpers/responsesApiHelper.js +0 -139
- package/open-sse/translator/helpers/toolCallHelper.js +0 -148
- package/open-sse/translator/index.js +0 -252
- package/open-sse/translator/request/antigravity-to-openai.js +0 -242
- package/open-sse/translator/request/claude-to-kiro.js +0 -478
- package/open-sse/translator/request/claude-to-openai.js +0 -263
- package/open-sse/translator/request/gemini-to-openai.js +0 -152
- package/open-sse/translator/request/openai-responses.js +0 -385
- package/open-sse/translator/request/openai-to-claude.js +0 -383
- package/open-sse/translator/request/openai-to-commandcode.js +0 -176
- package/open-sse/translator/request/openai-to-cursor.js +0 -185
- package/open-sse/translator/request/openai-to-gemini.js +0 -442
- package/open-sse/translator/request/openai-to-kiro.js +0 -607
- package/open-sse/translator/request/openai-to-kiro.old.js +0 -278
- package/open-sse/translator/request/openai-to-ollama.js +0 -195
- package/open-sse/translator/request/openai-to-vertex.js +0 -42
- package/open-sse/translator/response/claude-to-openai.js +0 -195
- package/open-sse/translator/response/commandcode-to-openai.js +0 -188
- package/open-sse/translator/response/cursor-to-openai.js +0 -30
- package/open-sse/translator/response/gemini-to-openai.js +0 -147
- package/open-sse/translator/response/kiro-to-claude.js +0 -261
- package/open-sse/translator/response/kiro-to-openai.js +0 -160
- package/open-sse/translator/response/ollama-to-openai.js +0 -134
- package/open-sse/translator/response/openai-responses.js +0 -535
- package/open-sse/translator/response/openai-to-antigravity.js +0 -123
- package/open-sse/translator/response/openai-to-claude.js +0 -265
- package/open-sse/translator/schema/blocks.js +0 -43
- package/open-sse/translator/schema/defaults.js +0 -7
- package/open-sse/translator/schema/finishReasons.js +0 -27
- package/open-sse/translator/schema/index.js +0 -8
- package/open-sse/translator/schema/roles.js +0 -16
- package/open-sse/utils/agentGoalPolicy.js +0 -85
- package/open-sse/utils/aiSdkCompat.js +0 -75
- package/open-sse/utils/bypassHandler.js +0 -298
- package/open-sse/utils/cacheControlPolicy.js +0 -189
- package/open-sse/utils/claudeCloaking.js +0 -155
- package/open-sse/utils/claudeHeaderCache.js +0 -70
- package/open-sse/utils/claudeSignature.js +0 -41
- package/open-sse/utils/clientDetector.js +0 -63
- package/open-sse/utils/codebuddySanitizer.js +0 -96
- package/open-sse/utils/composerToolCalls.js +0 -158
- package/open-sse/utils/cors.js +0 -13
- package/open-sse/utils/cursorChecksum.js +0 -149
- package/open-sse/utils/cursorImages.js +0 -224
- package/open-sse/utils/cursorProtobuf.js +0 -904
- package/open-sse/utils/cursorVersionDetector.js +0 -55
- package/open-sse/utils/debugLog.js +0 -14
- package/open-sse/utils/diagnostics.js +0 -143
- package/open-sse/utils/error.js +0 -164
- package/open-sse/utils/estimateSize.js +0 -33
- package/open-sse/utils/finishReason.js +0 -32
- package/open-sse/utils/flattenToolHistory.js +0 -68
- package/open-sse/utils/headers.js +0 -36
- package/open-sse/utils/heapPressure.js +0 -35
- package/open-sse/utils/jsonToSse.js +0 -125
- package/open-sse/utils/keepaliveThreshold.js +0 -40
- package/open-sse/utils/logger.js +0 -104
- package/open-sse/utils/noThinkingAlias.js +0 -74
- package/open-sse/utils/number.js +0 -7
- package/open-sse/utils/ollamaTransform.js +0 -85
- package/open-sse/utils/opencodeHeaders.js +0 -47
- package/open-sse/utils/progressTracker.js +0 -81
- package/open-sse/utils/providerRequestLogging.js +0 -219
- package/open-sse/utils/proxyFetch.js +0 -369
- package/open-sse/utils/reasoningContentInjector.js +0 -79
- package/open-sse/utils/reasoningFields.js +0 -70
- package/open-sse/utils/requestLogger.js +0 -260
- package/open-sse/utils/responsesInputNormalization.js +0 -92
- package/open-sse/utils/responsesStatePolicy.js +0 -52
- package/open-sse/utils/responsesStreamHelpers.js +0 -49
- package/open-sse/utils/sessionManager.js +0 -240
- package/open-sse/utils/sleep.js +0 -6
- package/open-sse/utils/sse.js +0 -14
- package/open-sse/utils/sseConstants.js +0 -23
- package/open-sse/utils/sseHeartbeat.js +0 -104
- package/open-sse/utils/stream.js +0 -517
- package/open-sse/utils/streamFailureFinalization.js +0 -134
- package/open-sse/utils/streamHandler.js +0 -250
- package/open-sse/utils/streamHelpers.js +0 -137
- package/open-sse/utils/textualToolCall.js +0 -104
- package/open-sse/utils/thinkCloseMarker.js +0 -72
- package/open-sse/utils/thinkTagParser.js +0 -146
- package/open-sse/utils/toolCallArguments.js +0 -12
- package/open-sse/utils/toolDeduper.js +0 -49
- package/open-sse/utils/toolSources.js +0 -31
- package/open-sse/utils/upstreamResponseHeaders.js +0 -25
- package/open-sse/utils/urlSanitize.js +0 -15
- package/open-sse/utils/usageTracking.js +0 -347
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Singleton cache for real Claude Code client headers.
|
|
3
|
-
* Captures headers from authentic Claude Code requests and makes them available
|
|
4
|
-
* for forwarding to api.anthropic.com, replacing static hardcoded values.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const CLAUDE_IDENTITY_HEADERS = [
|
|
8
|
-
"user-agent",
|
|
9
|
-
"anthropic-beta",
|
|
10
|
-
"anthropic-version",
|
|
11
|
-
"anthropic-dangerous-direct-browser-access",
|
|
12
|
-
"x-app",
|
|
13
|
-
"x-stainless-helper-method",
|
|
14
|
-
"x-stainless-retry-count",
|
|
15
|
-
"x-stainless-runtime-version",
|
|
16
|
-
"x-stainless-package-version",
|
|
17
|
-
"x-stainless-runtime",
|
|
18
|
-
"x-stainless-lang",
|
|
19
|
-
"x-stainless-arch",
|
|
20
|
-
"x-stainless-os",
|
|
21
|
-
"x-stainless-timeout",
|
|
22
|
-
"x-claude-code-session-id",
|
|
23
|
-
"package-version",
|
|
24
|
-
"runtime-version",
|
|
25
|
-
"os",
|
|
26
|
-
"arch",
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
let cachedHeaders = null;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Detect if request headers look like a real Claude Code client.
|
|
33
|
-
* @param {object} headers - Lowercase header key/value object
|
|
34
|
-
*/
|
|
35
|
-
function isClaudeCodeClient(headers) {
|
|
36
|
-
const ua = (headers["user-agent"] || "").toLowerCase();
|
|
37
|
-
const xApp = (headers["x-app"] || "").toLowerCase();
|
|
38
|
-
return ua.includes("claude-cli") || ua.includes("claude-code") || xApp === "cli";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Store Claude Code identity headers if this looks like a real client request.
|
|
43
|
-
* Called at the entry point before any translation/forwarding.
|
|
44
|
-
* @param {object} headers - Lowercase header key/value object (from request.headers.entries())
|
|
45
|
-
*/
|
|
46
|
-
export function cacheClaudeHeaders(headers) {
|
|
47
|
-
if (!headers || typeof headers !== "object") return;
|
|
48
|
-
if (!isClaudeCodeClient(headers)) return;
|
|
49
|
-
|
|
50
|
-
const captured = {};
|
|
51
|
-
for (const key of CLAUDE_IDENTITY_HEADERS) {
|
|
52
|
-
if (headers[key] !== undefined && headers[key] !== null) {
|
|
53
|
-
captured[key] = headers[key];
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (Object.keys(captured).length > 0) {
|
|
58
|
-
cachedHeaders = captured;
|
|
59
|
-
console.log(`[ClaudeHeaders] Cached ${Object.keys(captured).length} identity headers from Claude Code client`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Get the most recently cached Claude Code identity headers.
|
|
65
|
-
* Returns null if no authentic client request has been seen yet (cold start).
|
|
66
|
-
* @returns {object|null}
|
|
67
|
-
*/
|
|
68
|
-
export function getCachedClaudeHeaders() {
|
|
69
|
-
return cachedHeaders;
|
|
70
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// Claude thinking signature validation (ported from CLIProxyAPI internal/signature).
|
|
2
|
-
// E-form: single-layer base64, decoded[0] == 0x12 (Claude marker).
|
|
3
|
-
// R-form: double-layer base64, outer decoded[0] == 'E', inner decoded[0] == 0x12.
|
|
4
|
-
// Cache prefix "...#sig" stripped before validation.
|
|
5
|
-
|
|
6
|
-
const MAX_CLAUDE_SIGNATURE_LEN = 32 * 1024 * 1024;
|
|
7
|
-
const CLAUDE_SIGNATURE_MARKER = 0x12;
|
|
8
|
-
|
|
9
|
-
function stripCachePrefix(rawSignature) {
|
|
10
|
-
const sig = (rawSignature || "").trim();
|
|
11
|
-
if (!sig) return "";
|
|
12
|
-
const idx = sig.indexOf("#");
|
|
13
|
-
return idx >= 0 ? sig.slice(idx + 1).trim() : sig;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function hasClaudeSignaturePrefix(rawSignature) {
|
|
17
|
-
const sig = stripCachePrefix(rawSignature);
|
|
18
|
-
return sig.length > 0 && (sig[0] === "E" || sig[0] === "R");
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Strict-ish: validates base64 layers + Claude marker byte.
|
|
22
|
-
export function isValidClaudeSignature(rawSignature) {
|
|
23
|
-
const sig = stripCachePrefix(rawSignature);
|
|
24
|
-
if (!sig || sig.length > MAX_CLAUDE_SIGNATURE_LEN) return false;
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
if (sig[0] === "E") {
|
|
28
|
-
const decoded = Buffer.from(sig, "base64");
|
|
29
|
-
return decoded.length > 0 && decoded[0] === CLAUDE_SIGNATURE_MARKER;
|
|
30
|
-
}
|
|
31
|
-
if (sig[0] === "R") {
|
|
32
|
-
const outer = Buffer.from(sig, "base64");
|
|
33
|
-
if (!outer.length || outer[0] !== 0x45) return false; // 'E'
|
|
34
|
-
const inner = Buffer.from(outer.toString(), "base64");
|
|
35
|
-
return inner.length > 0 && inner[0] === CLAUDE_SIGNATURE_MARKER;
|
|
36
|
-
}
|
|
37
|
-
return false;
|
|
38
|
-
} catch {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detect CLI tool identity from request headers/body.
|
|
3
|
-
* Used to determine if a request can be passed through losslessly.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Map of CLI tool identifiers to provider IDs they are "native" to
|
|
7
|
-
const NATIVE_PAIRS = {
|
|
8
|
-
"claude": ["claude", "anthropic"],
|
|
9
|
-
"gemini-cli": ["gemini-cli"],
|
|
10
|
-
"antigravity": ["antigravity"],
|
|
11
|
-
"codex": ["codex"],
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Detect which CLI tool is making the request.
|
|
16
|
-
* Returns one of: "claude" | "gemini-cli" | "antigravity" | "codex" | null
|
|
17
|
-
* @param {object} headers - Lowercase header key/value object
|
|
18
|
-
* @param {object} body - Parsed request body
|
|
19
|
-
*/
|
|
20
|
-
export function detectClientTool(headers = {}, body = {}) {
|
|
21
|
-
const ua = (headers["user-agent"] || "").toLowerCase();
|
|
22
|
-
const xApp = (headers["x-app"] || "").toLowerCase();
|
|
23
|
-
const openaiIntent = (headers["openai-intent"] || "").toLowerCase();
|
|
24
|
-
const initiator = (headers["x-initiator"] || headers["X-Initiator"] || "").toLowerCase();
|
|
25
|
-
|
|
26
|
-
// Antigravity: detected via body field (not header)
|
|
27
|
-
if (body.userAgent === "antigravity") return "antigravity";
|
|
28
|
-
|
|
29
|
-
// GitHub Copilot / OAI compatible extension using Copilot chat headers
|
|
30
|
-
if (ua.includes("githubcopilotchat") || openaiIntent === "conversation-panel" || initiator === "user") {
|
|
31
|
-
return "github-copilot";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Claude Code / Claude CLI
|
|
35
|
-
if (ua.includes("claude-cli") || ua.includes("claude-code") || xApp === "cli") return "claude";
|
|
36
|
-
|
|
37
|
-
// Gemini CLI
|
|
38
|
-
if (ua.includes("gemini-cli")) return "gemini-cli";
|
|
39
|
-
|
|
40
|
-
// Codex CLI
|
|
41
|
-
if (ua.includes("codex-cli")) return "codex";
|
|
42
|
-
|
|
43
|
-
// DeepSeek TUI
|
|
44
|
-
if (ua.includes("deepseek-tui")) return "deepseek-tui";
|
|
45
|
-
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Check if this CLI tool + provider pair should be passed through losslessly.
|
|
51
|
-
* @param {string|null} clientTool - Result of detectClientTool()
|
|
52
|
-
* @param {string} provider - Provider ID (e.g. "claude", "gemini-cli")
|
|
53
|
-
*/
|
|
54
|
-
export function isNativePassthrough(clientTool, provider) {
|
|
55
|
-
if (!clientTool) return false;
|
|
56
|
-
const nativeProviders = NATIVE_PAIRS[clientTool];
|
|
57
|
-
if (!nativeProviders) return false;
|
|
58
|
-
// Support anthropic-compatible-* variants
|
|
59
|
-
const normalizedProvider = provider.startsWith("anthropic-compatible")
|
|
60
|
-
? "anthropic"
|
|
61
|
-
: provider;
|
|
62
|
-
return nativeProviders.includes(normalizedProvider);
|
|
63
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sanitize system prompt messages for CodeBuddy (Tencent) provider.
|
|
3
|
-
* Removes sections containing keywords that trigger Tencent content moderation.
|
|
4
|
-
* These are typically from Claude Code CLI's built-in security guidelines.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Phrases that trigger Tencent security moderation when sent to CodeBuddy API.
|
|
8
|
-
// These come from Claude Code CLI's injected system safety guidelines.
|
|
9
|
-
const CODEBUDDY_SENSITIVE_PATTERNS = [
|
|
10
|
-
/IMPORTANT:\s*Assist with authorized security testing[\s\S]*?(?=\n\n|\n#|\z)/gi,
|
|
11
|
-
/authorized security testing/gi,
|
|
12
|
-
/defensive security/gi,
|
|
13
|
-
/CTF challenges/gi,
|
|
14
|
-
/DoS attacks?/gi,
|
|
15
|
-
/C2 frameworks?/gi,
|
|
16
|
-
/credential testing/gi,
|
|
17
|
-
/exploit development/gi,
|
|
18
|
-
/dual.use security/gi,
|
|
19
|
-
/mass targeting/gi,
|
|
20
|
-
/supply chain compromise/gi,
|
|
21
|
-
/detection evasion/gi,
|
|
22
|
-
/malicious purposes?/gi,
|
|
23
|
-
/destructive techniques?/gi,
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Strip sensitive security keywords from text content.
|
|
28
|
-
* Removes full sentences containing sensitive keywords.
|
|
29
|
-
*/
|
|
30
|
-
function stripSensitiveText(text) {
|
|
31
|
-
if (!text || typeof text !== "string") return text;
|
|
32
|
-
let result = text;
|
|
33
|
-
|
|
34
|
-
// 1. GFW/Tencent blocks OpenAI/ChatGPT branding in developer/system prompts
|
|
35
|
-
result = result.replace(/OpenAI/gi, "9Router");
|
|
36
|
-
result = result.replace(/ChatGPT/gi, "9Router Assistant");
|
|
37
|
-
result = result.replace(/Codex CLI/gi, "CLI Coding Agent");
|
|
38
|
-
|
|
39
|
-
// 2. Strip complete sentences containing sensitive patterns
|
|
40
|
-
result = result.replace(
|
|
41
|
-
/[^.!?\n]*(?:authorized security testing|defensive security|CTF challenges?|DoS attacks?|C2 frameworks?|credential testing|exploit development|dual.use security|mass targeting|supply chain compromise|detection evasion|malicious purposes?|destructive techniques?)[^.!?\n]*/gi,
|
|
42
|
-
""
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
// 3. Strip complex sandboxing/approval policy boilerplate that Tencent flag as command escalation bypasses
|
|
46
|
-
result = result.replace(/## Codex CLI harness, sandboxing, and approvals[\s\S]*?(?=\n\n|\n#|\z)/gi, "");
|
|
47
|
-
result = result.replace(/## Plan tool[\s\S]*?(?=\n\n|\n#|\z)/gi, "");
|
|
48
|
-
result = result.replace(/<permissions instructions>[\s\S]*?<\/permissions instructions>/gi, "");
|
|
49
|
-
|
|
50
|
-
// Clean up double blank lines left by removal
|
|
51
|
-
result = result.replace(/\n{3,}/g, "\n\n").trim();
|
|
52
|
-
return result;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Strip system prompt content from a messages array (OpenAI format).
|
|
57
|
-
*/
|
|
58
|
-
function sanitizeMessages(messages) {
|
|
59
|
-
if (!Array.isArray(messages)) return;
|
|
60
|
-
for (const msg of messages) {
|
|
61
|
-
if (msg.role !== "system" && msg.role !== "developer") continue;
|
|
62
|
-
if (typeof msg.content === "string") {
|
|
63
|
-
msg.content = stripSensitiveText(msg.content);
|
|
64
|
-
} else if (Array.isArray(msg.content)) {
|
|
65
|
-
for (const part of msg.content) {
|
|
66
|
-
if (part && typeof part.text === "string") {
|
|
67
|
-
part.text = stripSensitiveText(part.text);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Main entry point: sanitize translatedBody for CodeBuddy.
|
|
76
|
-
* Handles OpenAI messages[] format.
|
|
77
|
-
*/
|
|
78
|
-
export function sanitizeCodebuddySystemPrompt(body) {
|
|
79
|
-
if (!body) return;
|
|
80
|
-
// OpenAI format (messages[] or input[])
|
|
81
|
-
const arr = Array.isArray(body.messages) ? body.messages
|
|
82
|
-
: Array.isArray(body.input) ? body.input
|
|
83
|
-
: null;
|
|
84
|
-
if (arr) sanitizeMessages(arr);
|
|
85
|
-
// Also handle top-level system (Claude format fallback)
|
|
86
|
-
if (typeof body.system === "string") {
|
|
87
|
-
body.system = stripSensitiveText(body.system);
|
|
88
|
-
} else if (Array.isArray(body.system)) {
|
|
89
|
-
for (const block of body.system) {
|
|
90
|
-
if (block && typeof block.text === "string") {
|
|
91
|
-
block.text = stripSensitiveText(block.text);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
const FW = "[\uFF5C|]";
|
|
2
|
-
const SEP = "[\u2581_]";
|
|
3
|
-
const OUTER_RE = new RegExp(
|
|
4
|
-
`<${FW}tool${SEP}calls${SEP}begin${FW}>([\\s\\S]*?)<${FW}tool${SEP}calls${SEP}end${FW}>`,
|
|
5
|
-
"i"
|
|
6
|
-
);
|
|
7
|
-
const INNER_RE = new RegExp(
|
|
8
|
-
`<${FW}tool${SEP}call${SEP}begin${FW}>([\\s\\S]*?)<${FW}tool${SEP}call${SEP}end${FW}>`,
|
|
9
|
-
"gi"
|
|
10
|
-
);
|
|
11
|
-
const ARG_SEP_RE = new RegExp(`<${FW}tool${SEP}sep${FW}>`, "gi");
|
|
12
|
-
const PARTIAL_OPEN_MARKER_RE = new RegExp(
|
|
13
|
-
`<${FW}?(?:t(?:o(?:o(?:l(?:${SEP}(?:c(?:a(?:l(?:l(?:s)?(?:${SEP}(?:b(?:e(?:g(?:i(?:n${FW}?>?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$`,
|
|
14
|
-
"i"
|
|
15
|
-
);
|
|
16
|
-
function hasComposerToolCalls(text) {
|
|
17
|
-
if (!text || typeof text !== "string") return false;
|
|
18
|
-
return OUTER_RE.test(text);
|
|
19
|
-
}
|
|
20
|
-
function generateToolCallId(index) {
|
|
21
|
-
const rand = crypto.randomUUID().replace(/-/g, "").slice(0, 10);
|
|
22
|
-
return `call_${rand}${index}`;
|
|
23
|
-
}
|
|
24
|
-
function parseInnerCall(body) {
|
|
25
|
-
const trimmed = body.replace(/^\s+|\s+$/g, "");
|
|
26
|
-
const segments = trimmed.split(ARG_SEP_RE);
|
|
27
|
-
const name = (segments.shift() ?? "").trim();
|
|
28
|
-
if (!name) {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
const args = {};
|
|
32
|
-
for (const seg of segments) {
|
|
33
|
-
if (!seg) continue;
|
|
34
|
-
const idxNl = seg.indexOf("\n");
|
|
35
|
-
let argName;
|
|
36
|
-
let argValue;
|
|
37
|
-
if (idxNl < 0) {
|
|
38
|
-
argName = seg.trim();
|
|
39
|
-
argValue = "";
|
|
40
|
-
} else {
|
|
41
|
-
argName = seg.slice(0, idxNl).trim();
|
|
42
|
-
argValue = seg.slice(idxNl + 1);
|
|
43
|
-
}
|
|
44
|
-
if (!argName) continue;
|
|
45
|
-
argValue = argValue.replace(/\n+$/, "");
|
|
46
|
-
args[argName] = coerceArgValue(argValue);
|
|
47
|
-
}
|
|
48
|
-
return { name, arguments: JSON.stringify(args) };
|
|
49
|
-
}
|
|
50
|
-
function coerceArgValue(raw) {
|
|
51
|
-
if (raw === "") return "";
|
|
52
|
-
const stripped = raw.trim();
|
|
53
|
-
if (stripped.startsWith("{") && stripped.endsWith("}") || stripped.startsWith("[") && stripped.endsWith("]")) {
|
|
54
|
-
try {
|
|
55
|
-
return JSON.parse(stripped);
|
|
56
|
-
} catch {
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (stripped === "true") return true;
|
|
60
|
-
if (stripped === "false") return false;
|
|
61
|
-
if (stripped === "null") return null;
|
|
62
|
-
if (/^-?\d+$/.test(stripped)) {
|
|
63
|
-
const n = Number(stripped);
|
|
64
|
-
if (Number.isSafeInteger(n)) return n;
|
|
65
|
-
}
|
|
66
|
-
if (/^-?\d*\.\d+$/.test(stripped)) {
|
|
67
|
-
const n = Number(stripped);
|
|
68
|
-
if (Number.isFinite(n)) return n;
|
|
69
|
-
}
|
|
70
|
-
return raw;
|
|
71
|
-
}
|
|
72
|
-
function parseComposerToolCalls(text) {
|
|
73
|
-
if (!text || typeof text !== "string") {
|
|
74
|
-
return { content: text || "", toolCalls: [] };
|
|
75
|
-
}
|
|
76
|
-
const match = text.match(OUTER_RE);
|
|
77
|
-
if (!match || match.index === void 0) {
|
|
78
|
-
return { content: text, toolCalls: [] };
|
|
79
|
-
}
|
|
80
|
-
const preamble = text.slice(0, match.index);
|
|
81
|
-
const trailing = text.slice(match.index + match[0].length);
|
|
82
|
-
const block = match[1];
|
|
83
|
-
const toolCalls = [];
|
|
84
|
-
let idx = 0;
|
|
85
|
-
for (const innerMatch of block.matchAll(INNER_RE)) {
|
|
86
|
-
const parsed = parseInnerCall(innerMatch[1]);
|
|
87
|
-
if (!parsed) continue;
|
|
88
|
-
toolCalls.push({
|
|
89
|
-
id: generateToolCallId(idx),
|
|
90
|
-
type: "function",
|
|
91
|
-
function: parsed
|
|
92
|
-
});
|
|
93
|
-
idx += 1;
|
|
94
|
-
}
|
|
95
|
-
const residual = (preamble + trailing).trim();
|
|
96
|
-
return { content: residual, toolCalls };
|
|
97
|
-
}
|
|
98
|
-
function createStreamingState() {
|
|
99
|
-
return {
|
|
100
|
-
emitted: 0,
|
|
101
|
-
// number of safe content chars already emitted
|
|
102
|
-
done: false
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
function feedStreamingChunk(state, accumulated) {
|
|
106
|
-
if (state.done) {
|
|
107
|
-
return { safeDelta: "", ready: false, toolCalls: [], holdback: false };
|
|
108
|
-
}
|
|
109
|
-
if (!accumulated) {
|
|
110
|
-
return { safeDelta: "", ready: false, toolCalls: [], holdback: false };
|
|
111
|
-
}
|
|
112
|
-
const m = accumulated.match(OUTER_RE);
|
|
113
|
-
if (m && m.index !== void 0) {
|
|
114
|
-
const preamble = accumulated.slice(0, m.index);
|
|
115
|
-
const block = m[1];
|
|
116
|
-
const toolCalls = [];
|
|
117
|
-
let idx = 0;
|
|
118
|
-
for (const innerMatch of block.matchAll(INNER_RE)) {
|
|
119
|
-
const parsed = parseInnerCall(innerMatch[1]);
|
|
120
|
-
if (!parsed) continue;
|
|
121
|
-
toolCalls.push({
|
|
122
|
-
id: generateToolCallId(idx),
|
|
123
|
-
type: "function",
|
|
124
|
-
function: parsed
|
|
125
|
-
});
|
|
126
|
-
idx += 1;
|
|
127
|
-
}
|
|
128
|
-
const safe = preamble;
|
|
129
|
-
const safeDelta2 = safe.length > state.emitted ? safe.slice(state.emitted) : "";
|
|
130
|
-
state.emitted = safe.length;
|
|
131
|
-
state.done = true;
|
|
132
|
-
return { safeDelta: safeDelta2, ready: true, toolCalls, holdback: false };
|
|
133
|
-
}
|
|
134
|
-
const openOnlyRe = new RegExp(`<${FW}tool${SEP}calls${SEP}begin${FW}>`, "i");
|
|
135
|
-
const openMatch = accumulated.match(openOnlyRe);
|
|
136
|
-
if (openMatch && openMatch.index !== void 0) {
|
|
137
|
-
const safe = accumulated.slice(0, openMatch.index);
|
|
138
|
-
const safeDelta2 = safe.length > state.emitted ? safe.slice(state.emitted) : "";
|
|
139
|
-
state.emitted = safe.length;
|
|
140
|
-
return { safeDelta: safeDelta2, ready: false, toolCalls: [], holdback: true };
|
|
141
|
-
}
|
|
142
|
-
const tailMatch = accumulated.match(PARTIAL_OPEN_MARKER_RE);
|
|
143
|
-
if (tailMatch && tailMatch.index !== void 0) {
|
|
144
|
-
const safe = accumulated.slice(0, tailMatch.index);
|
|
145
|
-
const safeDelta2 = safe.length > state.emitted ? safe.slice(state.emitted) : "";
|
|
146
|
-
state.emitted = safe.length;
|
|
147
|
-
return { safeDelta: safeDelta2, ready: false, toolCalls: [], holdback: true };
|
|
148
|
-
}
|
|
149
|
-
const safeDelta = accumulated.length > state.emitted ? accumulated.slice(state.emitted) : "";
|
|
150
|
-
state.emitted = accumulated.length;
|
|
151
|
-
return { safeDelta, ready: false, toolCalls: [], holdback: false };
|
|
152
|
-
}
|
|
153
|
-
export {
|
|
154
|
-
createStreamingState,
|
|
155
|
-
feedStreamingChunk,
|
|
156
|
-
hasComposerToolCalls,
|
|
157
|
-
parseComposerToolCalls
|
|
158
|
-
};
|
package/open-sse/utils/cors.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Static CORS headers for open-sse handlers.
|
|
3
|
-
*
|
|
4
|
-
* `Access-Control-Allow-Origin` is set by the Next.js middleware
|
|
5
|
-
* (`src/server/cors/origins.ts`). Handlers in this package only need the
|
|
6
|
-
* methods/headers list; the middleware overlays the allowed origin per
|
|
7
|
-
* the central allowlist on the way out.
|
|
8
|
-
*/
|
|
9
|
-
export const CORS_HEADERS = {
|
|
10
|
-
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
|
|
11
|
-
"Access-Control-Allow-Headers":
|
|
12
|
-
"Content-Type, Authorization, x-api-key, anthropic-version, x-omniroute-connection, x-internal-test, accept",
|
|
13
|
-
};
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor Checksum Utility (Jyh Cipher)
|
|
3
|
-
*
|
|
4
|
-
* Generates the x-cursor-checksum header required for Cursor API authentication.
|
|
5
|
-
* Based on the JavaScript implementation from Cursor IDE.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import crypto from "crypto";
|
|
9
|
-
import { v5 as uuidv5 } from "uuid";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Generate SHA-256 hash like generateHashed64Hex
|
|
13
|
-
* @param {string} input - Input string
|
|
14
|
-
* @param {string} salt - Optional salt
|
|
15
|
-
* @returns {string} - 64-character hex string
|
|
16
|
-
*/
|
|
17
|
-
export function generateHashed64Hex(input, salt = "") {
|
|
18
|
-
return crypto.createHash("sha256").update(input + salt).digest("hex");
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Generate session ID using UUID v5 with DNS namespace
|
|
23
|
-
* @param {string} authToken - Auth token
|
|
24
|
-
* @returns {string} - UUID string
|
|
25
|
-
*/
|
|
26
|
-
export function generateSessionId(authToken) {
|
|
27
|
-
return uuidv5(authToken, uuidv5.DNS);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Generate cursor checksum (Jyh cipher)
|
|
32
|
-
*
|
|
33
|
-
* Algorithm:
|
|
34
|
-
* 1. Get Unix timestamp in specific format
|
|
35
|
-
* 2. XOR each byte with key (starting 165)
|
|
36
|
-
* 3. Update key: key = (key + byte) & 0xFF
|
|
37
|
-
* 4. URL-safe base64 encode
|
|
38
|
-
* 5. Format: {base64_encoded}{machineId}
|
|
39
|
-
*
|
|
40
|
-
* @param {string} machineId - Machine ID from Cursor storage or generated
|
|
41
|
-
* @returns {string} - Checksum string
|
|
42
|
-
*/
|
|
43
|
-
export function generateCursorChecksum(machineId) {
|
|
44
|
-
// Math.floor(Date.now() / 1e6) - same as Python implementation
|
|
45
|
-
const timestamp = Math.floor(Date.now() / 1000000);
|
|
46
|
-
|
|
47
|
-
// Create byte array from timestamp (6 bytes, big-endian)
|
|
48
|
-
const byteArray = new Uint8Array([
|
|
49
|
-
(timestamp >> 40) & 0xFF,
|
|
50
|
-
(timestamp >> 32) & 0xFF,
|
|
51
|
-
(timestamp >> 24) & 0xFF,
|
|
52
|
-
(timestamp >> 16) & 0xFF,
|
|
53
|
-
(timestamp >> 8) & 0xFF,
|
|
54
|
-
timestamp & 0xFF
|
|
55
|
-
]);
|
|
56
|
-
|
|
57
|
-
// Jyh cipher obfuscation
|
|
58
|
-
let t = 165;
|
|
59
|
-
for (let i = 0; i < byteArray.length; i++) {
|
|
60
|
-
byteArray[i] = ((byteArray[i] ^ t) + (i % 256)) & 0xFF;
|
|
61
|
-
t = byteArray[i];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// URL-safe base64 encode (without padding)
|
|
65
|
-
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
66
|
-
let encoded = "";
|
|
67
|
-
|
|
68
|
-
for (let i = 0; i < byteArray.length; i += 3) {
|
|
69
|
-
const a = byteArray[i];
|
|
70
|
-
const b = i + 1 < byteArray.length ? byteArray[i + 1] : 0;
|
|
71
|
-
const c = i + 2 < byteArray.length ? byteArray[i + 2] : 0;
|
|
72
|
-
|
|
73
|
-
encoded += alphabet[a >> 2];
|
|
74
|
-
encoded += alphabet[((a & 3) << 4) | (b >> 4)];
|
|
75
|
-
|
|
76
|
-
if (i + 1 < byteArray.length) {
|
|
77
|
-
encoded += alphabet[((b & 15) << 2) | (c >> 6)];
|
|
78
|
-
}
|
|
79
|
-
if (i + 2 < byteArray.length) {
|
|
80
|
-
encoded += alphabet[c & 63];
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return `${encoded}${machineId}`;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Build all Cursor API headers
|
|
89
|
-
*
|
|
90
|
-
* @param {string} accessToken - Bearer token
|
|
91
|
-
* @param {string} machineId - Machine ID (or will be generated from token)
|
|
92
|
-
* @param {boolean} ghostMode - Enable ghost mode (privacy)
|
|
93
|
-
* @returns {Object} - Headers object
|
|
94
|
-
*/
|
|
95
|
-
export function buildCursorHeaders(accessToken, machineId = null, ghostMode = true) {
|
|
96
|
-
// Clean token if it has prefix
|
|
97
|
-
const cleanToken = accessToken.includes("::")
|
|
98
|
-
? accessToken.split("::")[1]
|
|
99
|
-
: accessToken;
|
|
100
|
-
|
|
101
|
-
// Generate machine ID if not provided
|
|
102
|
-
const effectiveMachineId = machineId || generateHashed64Hex(cleanToken, "machineId");
|
|
103
|
-
|
|
104
|
-
// Generate derived values
|
|
105
|
-
const sessionId = generateSessionId(cleanToken);
|
|
106
|
-
const clientKey = generateHashed64Hex(cleanToken);
|
|
107
|
-
const checksum = generateCursorChecksum(effectiveMachineId);
|
|
108
|
-
|
|
109
|
-
// Detect OS
|
|
110
|
-
let os = "linux";
|
|
111
|
-
if (typeof process !== "undefined") {
|
|
112
|
-
if (process.platform === "win32") os = "windows";
|
|
113
|
-
else if (process.platform === "darwin") os = "macos";
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Detect architecture
|
|
117
|
-
let arch = "x64";
|
|
118
|
-
if (typeof process !== "undefined") {
|
|
119
|
-
if (process.arch === "arm64") arch = "aarch64";
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
"authorization": `Bearer ${cleanToken}`,
|
|
124
|
-
"connect-accept-encoding": "gzip",
|
|
125
|
-
"connect-protocol-version": "1",
|
|
126
|
-
"content-type": "application/connect+proto",
|
|
127
|
-
"user-agent": "connect-es/1.6.1",
|
|
128
|
-
"x-amzn-trace-id": `Root=${crypto.randomUUID()}`,
|
|
129
|
-
"x-client-key": clientKey,
|
|
130
|
-
"x-cursor-checksum": checksum,
|
|
131
|
-
"x-cursor-client-version": "3.1.0",
|
|
132
|
-
"x-cursor-client-type": "ide",
|
|
133
|
-
"x-cursor-client-os": os,
|
|
134
|
-
"x-cursor-client-arch": arch,
|
|
135
|
-
"x-cursor-client-device-type": "desktop",
|
|
136
|
-
"x-cursor-config-version": crypto.randomUUID(),
|
|
137
|
-
"x-cursor-timezone": Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC",
|
|
138
|
-
"x-ghost-mode": ghostMode ? "true" : "false",
|
|
139
|
-
"x-request-id": crypto.randomUUID(),
|
|
140
|
-
"x-session-id": sessionId
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export default {
|
|
145
|
-
generateCursorChecksum,
|
|
146
|
-
buildCursorHeaders,
|
|
147
|
-
generateHashed64Hex,
|
|
148
|
-
generateSessionId
|
|
149
|
-
};
|