wyxrouter 0.4.71
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/CHANGELOG.md +222 -0
- package/LICENSE +21 -0
- package/README.md +96 -0
- package/README.zh-CN.md +1311 -0
- package/assets/pixel-router-2d.png +0 -0
- package/cli/LICENSE +42 -0
- package/cli/README.md +125 -0
- package/cli/app/package.json +58 -0
- package/cli/cli.js +806 -0
- package/cli/package.json +48 -0
- package/i18n/README.ja-JP.md +1209 -0
- package/i18n/README.ru.md +1311 -0
- package/i18n/README.vi.md +1310 -0
- package/i18n/README.zh-CN.md +1306 -0
- package/images/9router.png +0 -0
- package/jsconfig.json +12 -0
- package/next.config.mjs +71 -0
- package/open-sse/config/appConstants.js +203 -0
- package/open-sse/config/codexInstructions.js +119 -0
- package/open-sse/config/constants.js +4 -0
- package/open-sse/config/defaultThinkingSignature.js +12 -0
- package/open-sse/config/errorConfig.js +85 -0
- package/open-sse/config/googleTtsLanguages.js +62 -0
- package/open-sse/config/kiroConstants.js +322 -0
- package/open-sse/config/models.js +13 -0
- package/open-sse/config/ollamaModels.js +19 -0
- package/open-sse/config/providerModels.js +944 -0
- package/open-sse/config/providers.js +458 -0
- package/open-sse/config/runtimeConfig.js +72 -0
- package/open-sse/config/ttsModels.js +129 -0
- package/open-sse/executors/antigravity.js +504 -0
- package/open-sse/executors/azure.js +57 -0
- package/open-sse/executors/base.js +185 -0
- package/open-sse/executors/codex.js +469 -0
- package/open-sse/executors/commandcode.js +88 -0
- package/open-sse/executors/cursor.js +795 -0
- package/open-sse/executors/default.js +497 -0
- package/open-sse/executors/gemini-cli.js +89 -0
- package/open-sse/executors/github.js +379 -0
- package/open-sse/executors/grok-web.js +345 -0
- package/open-sse/executors/iflow.js +108 -0
- package/open-sse/executors/index.js +75 -0
- package/open-sse/executors/kiro.js +508 -0
- package/open-sse/executors/ollama-local.js +14 -0
- package/open-sse/executors/opencode-go.js +41 -0
- package/open-sse/executors/opencode.js +32 -0
- package/open-sse/executors/perplexity-web.js +507 -0
- package/open-sse/executors/qoder.js +450 -0
- package/open-sse/executors/qwen.js +129 -0
- package/open-sse/executors/vertex.js +131 -0
- package/open-sse/executors/xiaomi-tokenplan.js +19 -0
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +230 -0
- package/open-sse/handlers/chatCore/requestDetail.js +102 -0
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +231 -0
- package/open-sse/handlers/chatCore/streamingHandler.js +103 -0
- package/open-sse/handlers/chatCore.js +287 -0
- package/open-sse/handlers/embeddingProviders/_base.js +4 -0
- package/open-sse/handlers/embeddingProviders/gemini.js +54 -0
- package/open-sse/handlers/embeddingProviders/index.js +23 -0
- package/open-sse/handlers/embeddingProviders/openai.js +39 -0
- package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +13 -0
- package/open-sse/handlers/embeddingsCore.js +126 -0
- package/open-sse/handlers/fetch/index.js +237 -0
- package/open-sse/handlers/imageGenerationCore.js +189 -0
- package/open-sse/handlers/imageProviders/_base.js +31 -0
- package/open-sse/handlers/imageProviders/blackForestLabs.js +43 -0
- package/open-sse/handlers/imageProviders/cloudflareAi.js +178 -0
- package/open-sse/handlers/imageProviders/codex.js +198 -0
- package/open-sse/handlers/imageProviders/comfyui.js +8 -0
- package/open-sse/handlers/imageProviders/falAi.js +41 -0
- package/open-sse/handlers/imageProviders/gemini.js +25 -0
- package/open-sse/handlers/imageProviders/huggingface.js +22 -0
- package/open-sse/handlers/imageProviders/index.js +40 -0
- package/open-sse/handlers/imageProviders/nanobanana.js +58 -0
- package/open-sse/handlers/imageProviders/openai.js +40 -0
- package/open-sse/handlers/imageProviders/runwayml.js +47 -0
- package/open-sse/handlers/imageProviders/sdwebui.js +17 -0
- package/open-sse/handlers/imageProviders/stabilityAi.js +34 -0
- package/open-sse/handlers/responsesHandler.js +103 -0
- package/open-sse/handlers/search/callers.js +371 -0
- package/open-sse/handlers/search/chatSearch.js +409 -0
- package/open-sse/handlers/search/index.js +201 -0
- package/open-sse/handlers/search/normalizers.js +223 -0
- package/open-sse/handlers/sttCore.js +194 -0
- package/open-sse/handlers/ttsCore.js +74 -0
- package/open-sse/handlers/ttsProviders/_base.js +39 -0
- package/open-sse/handlers/ttsProviders/edgeTts.js +89 -0
- package/open-sse/handlers/ttsProviders/elevenlabs.js +48 -0
- package/open-sse/handlers/ttsProviders/gemini.js +117 -0
- package/open-sse/handlers/ttsProviders/genericFormats.js +169 -0
- package/open-sse/handlers/ttsProviders/googleTts.js +54 -0
- package/open-sse/handlers/ttsProviders/index.js +50 -0
- package/open-sse/handlers/ttsProviders/localDevice.js +87 -0
- package/open-sse/handlers/ttsProviders/minimax.js +59 -0
- package/open-sse/handlers/ttsProviders/openai.js +30 -0
- package/open-sse/handlers/ttsProviders/openrouter.js +70 -0
- package/open-sse/index.js +82 -0
- package/open-sse/rtk/applyFilter.js +15 -0
- package/open-sse/rtk/autodetect.js +111 -0
- package/open-sse/rtk/caveman.js +100 -0
- package/open-sse/rtk/cavemanPrompts.js +78 -0
- package/open-sse/rtk/constants.js +55 -0
- package/open-sse/rtk/filters/buildOutput.js +127 -0
- package/open-sse/rtk/filters/dedupLog.js +44 -0
- package/open-sse/rtk/filters/find.js +49 -0
- package/open-sse/rtk/filters/gitDiff.js +92 -0
- package/open-sse/rtk/filters/gitStatus.js +117 -0
- package/open-sse/rtk/filters/grep.js +48 -0
- package/open-sse/rtk/filters/ls.js +79 -0
- package/open-sse/rtk/filters/readNumbered.js +27 -0
- package/open-sse/rtk/filters/searchList.js +52 -0
- package/open-sse/rtk/filters/smartTruncate.js +15 -0
- package/open-sse/rtk/filters/tree.js +32 -0
- package/open-sse/rtk/index.js +155 -0
- package/open-sse/rtk/registry.js +38 -0
- package/open-sse/services/accountFallback.js +238 -0
- package/open-sse/services/combo.js +198 -0
- package/open-sse/services/compact.js +71 -0
- package/open-sse/services/kiroModels.js +332 -0
- package/open-sse/services/model.js +261 -0
- package/open-sse/services/oauthCredentialManager.js +151 -0
- package/open-sse/services/projectId.js +306 -0
- package/open-sse/services/provider.js +356 -0
- package/open-sse/services/qoderModels.js +214 -0
- package/open-sse/services/tokenRefresh.js +939 -0
- package/open-sse/services/usage.js +1496 -0
- package/open-sse/transformer/responsesTransformer.js +439 -0
- package/open-sse/transformer/streamToJsonConverter.js +103 -0
- package/open-sse/translator/formats.js +36 -0
- package/open-sse/translator/helpers/claudeHelper.js +216 -0
- package/open-sse/translator/helpers/geminiHelper.js +372 -0
- package/open-sse/translator/helpers/imageHelper.js +34 -0
- package/open-sse/translator/helpers/maxTokensHelper.js +27 -0
- package/open-sse/translator/helpers/openaiHelper.js +130 -0
- package/open-sse/translator/helpers/responsesApiHelper.js +139 -0
- package/open-sse/translator/helpers/toolCallHelper.js +148 -0
- package/open-sse/translator/index.js +251 -0
- package/open-sse/translator/request/antigravity-to-openai.js +229 -0
- package/open-sse/translator/request/claude-to-openai.js +232 -0
- package/open-sse/translator/request/gemini-to-openai.js +147 -0
- package/open-sse/translator/request/openai-responses.js +318 -0
- package/open-sse/translator/request/openai-to-claude.js +401 -0
- package/open-sse/translator/request/openai-to-commandcode.js +170 -0
- package/open-sse/translator/request/openai-to-cursor.js +183 -0
- package/open-sse/translator/request/openai-to-gemini.js +470 -0
- package/open-sse/translator/request/openai-to-kiro.js +629 -0
- package/open-sse/translator/request/openai-to-kiro.old.js +278 -0
- package/open-sse/translator/request/openai-to-ollama.js +192 -0
- package/open-sse/translator/request/openai-to-vertex.js +42 -0
- package/open-sse/translator/response/claude-to-openai.js +206 -0
- package/open-sse/translator/response/commandcode-to-openai.js +197 -0
- package/open-sse/translator/response/cursor-to-openai.js +30 -0
- package/open-sse/translator/response/gemini-to-openai.js +245 -0
- package/open-sse/translator/response/kiro-to-openai.js +195 -0
- package/open-sse/translator/response/ollama-to-openai.js +152 -0
- package/open-sse/translator/response/openai-responses.js +590 -0
- package/open-sse/translator/response/openai-to-antigravity.js +122 -0
- package/open-sse/translator/response/openai-to-claude.js +266 -0
- package/open-sse/utils/bypassHandler.js +298 -0
- package/open-sse/utils/claudeCloaking.js +155 -0
- package/open-sse/utils/claudeHeaderCache.js +70 -0
- package/open-sse/utils/clientDetector.js +63 -0
- package/open-sse/utils/cursorChecksum.js +149 -0
- package/open-sse/utils/cursorProtobuf.js +904 -0
- package/open-sse/utils/debugLog.js +14 -0
- package/open-sse/utils/error.js +147 -0
- package/open-sse/utils/ollamaTransform.js +85 -0
- package/open-sse/utils/proxyFetch.js +368 -0
- package/open-sse/utils/reasoningContentInjector.js +79 -0
- package/open-sse/utils/requestLogger.js +260 -0
- package/open-sse/utils/responsesStreamHelpers.js +49 -0
- package/open-sse/utils/sessionManager.js +82 -0
- package/open-sse/utils/stream.js +462 -0
- package/open-sse/utils/streamHandler.js +250 -0
- package/open-sse/utils/streamHelpers.js +122 -0
- package/open-sse/utils/toolDeduper.js +49 -0
- package/open-sse/utils/usageTracking.js +347 -0
- package/package.json +100 -0
- package/postcss.config.mjs +12 -0
- package/public/favicon.svg +11 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/i18n/literals/ar.json +195 -0
- package/public/i18n/literals/bn.json +195 -0
- package/public/i18n/literals/cs.json +195 -0
- package/public/i18n/literals/da.json +195 -0
- package/public/i18n/literals/de.json +195 -0
- package/public/i18n/literals/el.json +195 -0
- package/public/i18n/literals/es.json +195 -0
- package/public/i18n/literals/fi.json +195 -0
- package/public/i18n/literals/fr.json +195 -0
- package/public/i18n/literals/he.json +195 -0
- package/public/i18n/literals/hi.json +195 -0
- package/public/i18n/literals/hu.json +195 -0
- package/public/i18n/literals/id.json +195 -0
- package/public/i18n/literals/it.json +195 -0
- package/public/i18n/literals/ja.json +195 -0
- package/public/i18n/literals/ko.json +195 -0
- package/public/i18n/literals/nl.json +195 -0
- package/public/i18n/literals/no.json +195 -0
- package/public/i18n/literals/pl.json +195 -0
- package/public/i18n/literals/pt-BR.json +195 -0
- package/public/i18n/literals/pt-PT.json +195 -0
- package/public/i18n/literals/ro.json +195 -0
- package/public/i18n/literals/ru.json +195 -0
- package/public/i18n/literals/sv.json +195 -0
- package/public/i18n/literals/th.json +195 -0
- package/public/i18n/literals/tl.json +195 -0
- package/public/i18n/literals/tr.json +195 -0
- package/public/i18n/literals/uk.json +195 -0
- package/public/i18n/literals/ur.json +195 -0
- package/public/i18n/literals/vi.json +195 -0
- package/public/i18n/literals/zh-CN.json +772 -0
- package/public/i18n/literals/zh-TW.json +195 -0
- package/public/icons/discord.svg +4 -0
- package/public/icons/icon-192.svg +4 -0
- package/public/icons/icon-512.svg +4 -0
- package/public/next.svg +1 -0
- package/public/providers/alicode-intl.png +0 -0
- package/public/providers/alicode.png +0 -0
- package/public/providers/amp.png +0 -0
- package/public/providers/anthropic-m.png +0 -0
- package/public/providers/anthropic.png +0 -0
- package/public/providers/antigravity.png +0 -0
- package/public/providers/assemblyai.png +0 -0
- package/public/providers/aws-polly.png +0 -0
- package/public/providers/azure.png +0 -0
- package/public/providers/black-forest-labs.png +0 -0
- package/public/providers/blackbox.png +0 -0
- package/public/providers/brave-search.png +0 -0
- package/public/providers/byteplus.png +0 -0
- package/public/providers/cartesia.png +0 -0
- package/public/providers/cerebras.png +0 -0
- package/public/providers/chutes.png +0 -0
- package/public/providers/claude.png +0 -0
- package/public/providers/cline.png +0 -0
- package/public/providers/cloudflare-ai.png +0 -0
- package/public/providers/codebuddy.svg +37 -0
- package/public/providers/codex.png +0 -0
- package/public/providers/cohere.png +0 -0
- package/public/providers/comfyui.png +0 -0
- package/public/providers/commandcode.png +0 -0
- package/public/providers/continue.png +0 -0
- package/public/providers/copilot.png +0 -0
- package/public/providers/coqui.png +0 -0
- package/public/providers/cursor.png +0 -0
- package/public/providers/deepgram.png +0 -0
- package/public/providers/deepseek-tui.png +0 -0
- package/public/providers/deepseek.png +0 -0
- package/public/providers/droid.png +0 -0
- package/public/providers/edge-tts.png +0 -0
- package/public/providers/elevenlabs.png +0 -0
- package/public/providers/exa.png +0 -0
- package/public/providers/fal-ai.png +0 -0
- package/public/providers/firecrawl.png +0 -0
- package/public/providers/fireworks.png +0 -0
- package/public/providers/gemini-cli.png +0 -0
- package/public/providers/gemini.png +0 -0
- package/public/providers/github.png +0 -0
- package/public/providers/glm-cn.png +0 -0
- package/public/providers/glm.png +0 -0
- package/public/providers/google-pse.png +0 -0
- package/public/providers/google-tts.png +0 -0
- package/public/providers/grok-web.png +0 -0
- package/public/providers/groq.png +0 -0
- package/public/providers/hermes.png +0 -0
- package/public/providers/huggingface.png +0 -0
- package/public/providers/hyperbolic.png +0 -0
- package/public/providers/iflow.png +0 -0
- package/public/providers/inworld.png +0 -0
- package/public/providers/jcode.png +0 -0
- package/public/providers/jina-ai.png +0 -0
- package/public/providers/jina-reader.png +0 -0
- package/public/providers/kilocode.png +0 -0
- package/public/providers/kimi-coding.png +0 -0
- package/public/providers/kimi.png +0 -0
- package/public/providers/kiro.png +0 -0
- package/public/providers/linkup.png +0 -0
- package/public/providers/local-device.png +0 -0
- package/public/providers/minimax-cn.png +0 -0
- package/public/providers/minimax.png +0 -0
- package/public/providers/mistral.png +0 -0
- package/public/providers/nanobanana.png +0 -0
- package/public/providers/nebius.png +0 -0
- package/public/providers/nvidia.png +0 -0
- package/public/providers/oai-cc.png +0 -0
- package/public/providers/oai-r.png +0 -0
- package/public/providers/ollama-local.png +0 -0
- package/public/providers/ollama.png +0 -0
- package/public/providers/openai.png +0 -0
- package/public/providers/openclaw.png +0 -0
- package/public/providers/opencode-go.png +0 -0
- package/public/providers/opencode.png +0 -0
- package/public/providers/openrouter.png +0 -0
- package/public/providers/perplexity-web.png +0 -0
- package/public/providers/perplexity.png +0 -0
- package/public/providers/playht.png +0 -0
- package/public/providers/qoder.png +0 -0
- package/public/providers/qwen.png +0 -0
- package/public/providers/recraft.png +0 -0
- package/public/providers/roo.png +0 -0
- package/public/providers/runwayml.png +0 -0
- package/public/providers/sdwebui.png +0 -0
- package/public/providers/searchapi.png +0 -0
- package/public/providers/searxng.png +0 -0
- package/public/providers/serper.png +0 -0
- package/public/providers/siliconflow.png +0 -0
- package/public/providers/stability-ai.png +0 -0
- package/public/providers/tavily.png +0 -0
- package/public/providers/together.png +0 -0
- package/public/providers/topaz.png +0 -0
- package/public/providers/tortoise.png +0 -0
- package/public/providers/vertex-partner.png +0 -0
- package/public/providers/vertex.png +0 -0
- package/public/providers/volcengine-ark.png +0 -0
- package/public/providers/voyage-ai.png +0 -0
- package/public/providers/xai.png +0 -0
- package/public/providers/xiaomi-mimo.png +0 -0
- package/public/providers/xiaomi-tokenplan.png +0 -0
- package/public/providers/youcom.png +0 -0
- package/public/sw.js +22 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/scripts/compact-request-details.mjs +71 -0
- package/scripts/import-codex-gptjson.mjs +342 -0
- package/scripts/start-standalone.mjs +25 -0
- package/scripts/translate-readme.js +201 -0
- package/src/app/(dashboard)/dashboard/automation/page.js +294 -0
- package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +967 -0
- package/src/app/(dashboard)/dashboard/basic-chat/page.js +5 -0
- package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.js +66 -0
- package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/ToolDetailClient.js +173 -0
- package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +11 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +481 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ApiKeySelect.js +66 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +174 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +390 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +301 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +458 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +323 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +640 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +338 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js +271 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +410 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +128 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +317 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +380 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +275 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmLinkCard.js +40 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js +329 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +318 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +388 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +500 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ToolSummaryCard.js +39 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/cliEndpointMatch.js +13 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/index.js +19 -0
- package/src/app/(dashboard)/dashboard/cli-tools/page.js +7 -0
- package/src/app/(dashboard)/dashboard/combos/page.js +612 -0
- package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.js +91 -0
- package/src/app/(dashboard)/dashboard/console-log/page.js +8 -0
- package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +1555 -0
- package/src/app/(dashboard)/dashboard/endpoint/page.js +7 -0
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1903 -0
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/page.js +289 -0
- package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +410 -0
- package/src/app/(dashboard)/dashboard/media-providers/web/page.js +209 -0
- package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +117 -0
- package/src/app/(dashboard)/dashboard/mitm/page.js +5 -0
- package/src/app/(dashboard)/dashboard/page.js +7 -0
- package/src/app/(dashboard)/dashboard/profile/page.js +1140 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js +389 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +125 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/CompatibleModelsSection.js +250 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +299 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/CooldownTimer.js +42 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +161 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.js +95 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/PassthroughModelsSection.js +183 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.js +2053 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +1724 -0
- package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +497 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +185 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +294 -0
- package/src/app/(dashboard)/dashboard/providers/new/page.js +220 -0
- package/src/app/(dashboard)/dashboard/providers/page.js +1365 -0
- package/src/app/(dashboard)/dashboard/proxy-pools/page.js +1092 -0
- package/src/app/(dashboard)/dashboard/quota/page.js +11 -0
- package/src/app/(dashboard)/dashboard/skills/page.js +112 -0
- package/src/app/(dashboard)/dashboard/translator/page.js +303 -0
- package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +35 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.js +185 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.js +127 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +259 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +1394 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js +244 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +327 -0
- package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +433 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +141 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +247 -0
- package/src/app/(dashboard)/dashboard/usage/page.js +75 -0
- package/src/app/(dashboard)/layout.js +6 -0
- package/src/app/api/auth/login/route.js +76 -0
- package/src/app/api/auth/logout/route.js +12 -0
- package/src/app/api/auth/oidc/callback/route.js +87 -0
- package/src/app/api/auth/oidc/start/route.js +52 -0
- package/src/app/api/auth/oidc/test/route.js +84 -0
- package/src/app/api/auth/status/route.js +45 -0
- package/src/app/api/cli-tools/all-statuses/route.js +46 -0
- package/src/app/api/cli-tools/antigravity-mitm/alias/route.js +53 -0
- package/src/app/api/cli-tools/antigravity-mitm/route.js +202 -0
- package/src/app/api/cli-tools/claude-settings/route.js +203 -0
- package/src/app/api/cli-tools/cline-settings/route.js +133 -0
- package/src/app/api/cli-tools/codex-gateway/accounts/route.js +16 -0
- package/src/app/api/cli-tools/codex-settings/route.js +239 -0
- package/src/app/api/cli-tools/copilot-settings/route.js +148 -0
- package/src/app/api/cli-tools/cowork-mcp-registry/route.js +77 -0
- package/src/app/api/cli-tools/cowork-mcp-tools/route.js +95 -0
- package/src/app/api/cli-tools/cowork-settings/route.js +412 -0
- package/src/app/api/cli-tools/deepseek-tui-settings/route.js +164 -0
- package/src/app/api/cli-tools/droid-settings/route.js +213 -0
- package/src/app/api/cli-tools/hermes-settings/route.js +175 -0
- package/src/app/api/cli-tools/jcode-settings/route.js +216 -0
- package/src/app/api/cli-tools/kilo-settings/route.js +131 -0
- package/src/app/api/cli-tools/openclaw-settings/route.js +292 -0
- package/src/app/api/cli-tools/opencode-settings/route.js +259 -0
- package/src/app/api/combos/[id]/route.js +81 -0
- package/src/app/api/combos/route.js +48 -0
- package/src/app/api/health/route.js +15 -0
- package/src/app/api/init/route.js +4 -0
- package/src/app/api/keys/[id]/route.js +58 -0
- package/src/app/api/keys/route.js +42 -0
- package/src/app/api/locale/route.js +30 -0
- package/src/app/api/mcp/[plugin]/message/route.js +21 -0
- package/src/app/api/mcp/[plugin]/sse/route.js +37 -0
- package/src/app/api/media-providers/tts/deepgram/voices/route.js +65 -0
- package/src/app/api/media-providers/tts/elevenlabs/voices/route.js +71 -0
- package/src/app/api/media-providers/tts/inworld/voices/route.js +61 -0
- package/src/app/api/media-providers/tts/minimax/voices/route.js +113 -0
- package/src/app/api/media-providers/tts/voices/route.js +99 -0
- package/src/app/api/models/alias/route.js +53 -0
- package/src/app/api/models/availability/route.js +103 -0
- package/src/app/api/models/custom/route.js +48 -0
- package/src/app/api/models/disabled/route.js +50 -0
- package/src/app/api/models/route.js +64 -0
- package/src/app/api/models/test/ping.js +191 -0
- package/src/app/api/models/test/route.js +14 -0
- package/src/app/api/oauth/[provider]/[action]/route.js +343 -0
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js +19 -0
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js +30 -0
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js +23 -0
- package/src/app/api/oauth/codebuddy/bulk-import/latest/route.js +25 -0
- package/src/app/api/oauth/codebuddy/bulk-import/route.js +49 -0
- package/src/app/api/oauth/codebuddy/quota-cookie/route.js +133 -0
- package/src/app/api/oauth/codex/import-token/route.js +96 -0
- package/src/app/api/oauth/cursor/auto-import/route.js +258 -0
- package/src/app/api/oauth/cursor/import/route.js +100 -0
- package/src/app/api/oauth/gitlab/pat/route.js +62 -0
- package/src/app/api/oauth/iflow/cookie/route.js +137 -0
- package/src/app/api/oauth/kiro/auto-import/route.js +85 -0
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js +18 -0
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js +29 -0
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/route.js +22 -0
- package/src/app/api/oauth/kiro/bulk-import/latest/route.js +25 -0
- package/src/app/api/oauth/kiro/bulk-import/route.js +49 -0
- package/src/app/api/oauth/kiro/import/route.js +110 -0
- package/src/app/api/oauth/kiro/social-authorize/route.js +27 -0
- package/src/app/api/oauth/kiro/social-exchange/route.js +41 -0
- package/src/app/api/pricing/route.js +134 -0
- package/src/app/api/provider-nodes/[id]/route.js +101 -0
- package/src/app/api/provider-nodes/route.js +104 -0
- package/src/app/api/provider-nodes/validate/route.js +201 -0
- package/src/app/api/providers/[id]/models/route.js +526 -0
- package/src/app/api/providers/[id]/route.js +189 -0
- package/src/app/api/providers/[id]/test/route.js +23 -0
- package/src/app/api/providers/[id]/test/testUtils.js +714 -0
- package/src/app/api/providers/[id]/test-models/route.js +66 -0
- package/src/app/api/providers/client/route.js +126 -0
- package/src/app/api/providers/kilo/free-models/route.js +55 -0
- package/src/app/api/providers/route.js +206 -0
- package/src/app/api/providers/suggested-models/filters.js +20 -0
- package/src/app/api/providers/suggested-models/route.js +32 -0
- package/src/app/api/providers/test-batch/route.js +131 -0
- package/src/app/api/providers/validate/route.js +637 -0
- package/src/app/api/proxy-pools/[id]/route.js +123 -0
- package/src/app/api/proxy-pools/[id]/test/route.js +70 -0
- package/src/app/api/proxy-pools/cloudflare-deploy/route.js +145 -0
- package/src/app/api/proxy-pools/deno-deploy/route.js +175 -0
- package/src/app/api/proxy-pools/route.js +93 -0
- package/src/app/api/proxy-pools/vercel-deploy/route.js +142 -0
- package/src/app/api/settings/database/route.js +36 -0
- package/src/app/api/settings/proxy-test/route.js +23 -0
- package/src/app/api/settings/require-login/route.js +15 -0
- package/src/app/api/settings/route.js +100 -0
- package/src/app/api/shutdown/route.js +24 -0
- package/src/app/api/tags/route.js +18 -0
- package/src/app/api/translator/console-logs/route.js +24 -0
- package/src/app/api/translator/console-logs/stream/route.js +79 -0
- package/src/app/api/translator/load/route.js +45 -0
- package/src/app/api/translator/save/route.js +44 -0
- package/src/app/api/translator/send/route.js +94 -0
- package/src/app/api/translator/translate/route.js +90 -0
- package/src/app/api/tunnel/disable/route.js +12 -0
- package/src/app/api/tunnel/enable/route.js +16 -0
- package/src/app/api/tunnel/status/route.js +13 -0
- package/src/app/api/tunnel/tailscale-check/route.js +50 -0
- package/src/app/api/tunnel/tailscale-disable/route.js +12 -0
- package/src/app/api/tunnel/tailscale-enable/route.js +12 -0
- package/src/app/api/tunnel/tailscale-install/route.js +72 -0
- package/src/app/api/usage/[connectionId]/route.js +188 -0
- package/src/app/api/usage/chart/route.js +21 -0
- package/src/app/api/usage/history/route.js +12 -0
- package/src/app/api/usage/logs/route.js +12 -0
- package/src/app/api/usage/providers/route.js +42 -0
- package/src/app/api/usage/request-details/route.js +57 -0
- package/src/app/api/usage/request-logs/route.js +13 -0
- package/src/app/api/usage/stats/route.js +23 -0
- package/src/app/api/usage/stream/route.js +79 -0
- package/src/app/api/v1/api/chat/route.js +37 -0
- package/src/app/api/v1/audio/speech/route.js +16 -0
- package/src/app/api/v1/audio/transcriptions/route.js +19 -0
- package/src/app/api/v1/audio/voices/route.js +68 -0
- package/src/app/api/v1/chat/completions/route.js +35 -0
- package/src/app/api/v1/embeddings/route.js +21 -0
- package/src/app/api/v1/images/generations/route.js +16 -0
- package/src/app/api/v1/messages/count_tokens/route.js +52 -0
- package/src/app/api/v1/messages/route.js +36 -0
- package/src/app/api/v1/models/[kind]/route.js +55 -0
- package/src/app/api/v1/models/info/route.js +110 -0
- package/src/app/api/v1/models/route.js +451 -0
- package/src/app/api/v1/responses/compact/route.js +37 -0
- package/src/app/api/v1/responses/route.js +30 -0
- package/src/app/api/v1/route.js +1 -0
- package/src/app/api/v1/search/route.js +21 -0
- package/src/app/api/v1/web/fetch/route.js +21 -0
- package/src/app/api/v1beta/models/[...path]/route.js +328 -0
- package/src/app/api/v1beta/models/route.js +44 -0
- package/src/app/api/version/route.js +45 -0
- package/src/app/api/version/shutdown/route.js +15 -0
- package/src/app/api/version/update/route.js +21 -0
- package/src/app/callback/page.js +148 -0
- package/src/app/dashboard/settings/pricing/page.js +173 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +496 -0
- package/src/app/landing/components/AnimatedBackground.js +57 -0
- package/src/app/landing/components/Features.js +133 -0
- package/src/app/landing/components/FlowAnimation.js +175 -0
- package/src/app/landing/components/Footer.js +61 -0
- package/src/app/landing/components/GetStarted.js +97 -0
- package/src/app/landing/components/HeroSection.js +47 -0
- package/src/app/landing/components/HowItWorks.js +66 -0
- package/src/app/landing/components/Navigation.js +72 -0
- package/src/app/landing/page.js +106 -0
- package/src/app/layout.js +49 -0
- package/src/app/login/page.js +197 -0
- package/src/app/manifest.js +30 -0
- package/src/app/page.js +5 -0
- package/src/dashboardGuard.js +242 -0
- package/src/i18n/RuntimeI18nProvider.js +27 -0
- package/src/i18n/config.js +146 -0
- package/src/i18n/runtime.js +162 -0
- package/src/lib/appUpdater.js +200 -0
- package/src/lib/auth/dashboardSession.js +68 -0
- package/src/lib/auth/loginLimiter.js +52 -0
- package/src/lib/auth/oidc.js +234 -0
- package/src/lib/consoleLogBuffer.js +79 -0
- package/src/lib/dataDir.js +29 -0
- package/src/lib/db/adapters/betterSqliteAdapter.js +55 -0
- package/src/lib/db/adapters/bunSqliteAdapter.js +63 -0
- package/src/lib/db/adapters/nodeSqliteAdapter.js +84 -0
- package/src/lib/db/adapters/sqljsAdapter.js +115 -0
- package/src/lib/db/backup.js +35 -0
- package/src/lib/db/driver.js +85 -0
- package/src/lib/db/helpers/jsonCol.js +9 -0
- package/src/lib/db/helpers/kvStore.js +39 -0
- package/src/lib/db/helpers/metaStore.js +22 -0
- package/src/lib/db/index.js +171 -0
- package/src/lib/db/migrate.js +286 -0
- package/src/lib/db/migrations/001-initial.js +14 -0
- package/src/lib/db/migrations/index.js +10 -0
- package/src/lib/db/paths.js +18 -0
- package/src/lib/db/repos/aliasRepo.js +62 -0
- package/src/lib/db/repos/apiKeysRepo.js +75 -0
- package/src/lib/db/repos/combosRepo.js +73 -0
- package/src/lib/db/repos/connectionsRepo.js +226 -0
- package/src/lib/db/repos/disabledModelsRepo.js +56 -0
- package/src/lib/db/repos/nodesRepo.js +95 -0
- package/src/lib/db/repos/pricingRepo.js +108 -0
- package/src/lib/db/repos/proxyPoolsRepo.js +103 -0
- package/src/lib/db/repos/requestDetailsRepo.js +259 -0
- package/src/lib/db/repos/settingsRepo.js +104 -0
- package/src/lib/db/repos/usageRepo.js +731 -0
- package/src/lib/db/schema.js +157 -0
- package/src/lib/db/version.js +21 -0
- package/src/lib/disabledModelsDb.js +4 -0
- package/src/lib/localDb.js +21 -0
- package/src/lib/mcp/stdioSseBridge.js +198 -0
- package/src/lib/mitmAliasCache.js +46 -0
- package/src/lib/network/connectionProxy.js +160 -0
- package/src/lib/network/initOutboundProxy.js +25 -0
- package/src/lib/network/outboundProxy.js +68 -0
- package/src/lib/network/proxyTest.js +91 -0
- package/src/lib/oauth/constants/oauth.js +284 -0
- package/src/lib/oauth/constants/xai.js +61 -0
- package/src/lib/oauth/providers.js +1506 -0
- package/src/lib/oauth/services/antigravity.js +321 -0
- package/src/lib/oauth/services/claude.js +136 -0
- package/src/lib/oauth/services/codebuddyBulkImportManager.js +454 -0
- package/src/lib/oauth/services/codex.js +144 -0
- package/src/lib/oauth/services/cursor.js +179 -0
- package/src/lib/oauth/services/gemini.js +240 -0
- package/src/lib/oauth/services/github.js +225 -0
- package/src/lib/oauth/services/iflow.js +202 -0
- package/src/lib/oauth/services/index.js +17 -0
- package/src/lib/oauth/services/kiro.js +334 -0
- package/src/lib/oauth/services/kiroBulkImportManager.js +778 -0
- package/src/lib/oauth/services/kiroConnections.js +93 -0
- package/src/lib/oauth/services/kiroGoogleAutomation.js +1136 -0
- package/src/lib/oauth/services/oauth.js +157 -0
- package/src/lib/oauth/services/openai.js +123 -0
- package/src/lib/oauth/services/qoder.js +216 -0
- package/src/lib/oauth/services/qwen.js +170 -0
- package/src/lib/oauth/services/xai.js +238 -0
- package/src/lib/oauth/utils/banner.js +63 -0
- package/src/lib/oauth/utils/pkce.js +39 -0
- package/src/lib/oauth/utils/server.js +415 -0
- package/src/lib/oauth/utils/ui.js +48 -0
- package/src/lib/providerNormalization.js +45 -0
- package/src/lib/qoder/constants.js +64 -0
- package/src/lib/qoder/cosy.js +175 -0
- package/src/lib/qoder/encoding.js +55 -0
- package/src/lib/requestDetailsDb.js +4 -0
- package/src/lib/tunnel/cloudflare/cloudflared.js +449 -0
- package/src/lib/tunnel/cloudflare/config.js +9 -0
- package/src/lib/tunnel/cloudflare/healthCheck.js +29 -0
- package/src/lib/tunnel/cloudflare/manager.js +151 -0
- package/src/lib/tunnel/cloudflare/pid.js +23 -0
- package/src/lib/tunnel/index.js +48 -0
- package/src/lib/tunnel/shared/dnsResolver.js +17 -0
- package/src/lib/tunnel/shared/internetCheck.js +26 -0
- package/src/lib/tunnel/shared/state.js +41 -0
- package/src/lib/tunnel/shared/watchdogConfig.js +8 -0
- package/src/lib/tunnel/tailscale/config.js +7 -0
- package/src/lib/tunnel/tailscale/healthCheck.js +29 -0
- package/src/lib/tunnel/tailscale/manager.js +129 -0
- package/src/lib/tunnel/tailscale/tailscale.js +790 -0
- package/src/lib/updater/updater.js +235 -0
- package/src/lib/usage/fetcher.js +208 -0
- package/src/lib/usageDb.js +7 -0
- package/src/mitm/antigravityIdeVersion.js +50 -0
- package/src/mitm/cert/generate.js +32 -0
- package/src/mitm/cert/install.js +269 -0
- package/src/mitm/cert/rootCA.js +173 -0
- package/src/mitm/config.js +87 -0
- package/src/mitm/dbReader.js +22 -0
- package/src/mitm/dns/dnsConfig.js +266 -0
- package/src/mitm/handlers/antigravity.js +33 -0
- package/src/mitm/handlers/base.js +226 -0
- package/src/mitm/handlers/copilot.js +35 -0
- package/src/mitm/handlers/cursor.js +15 -0
- package/src/mitm/handlers/kiro.js +526 -0
- package/src/mitm/logger.js +106 -0
- package/src/mitm/manager.js +851 -0
- package/src/mitm/paths.js +32 -0
- package/src/mitm/server.js +435 -0
- package/src/mitm/winElevated.js +81 -0
- package/src/models/index.js +38 -0
- package/src/proxy.js +5 -0
- package/src/shared/components/AddCustomEmbeddingModal.js +183 -0
- package/src/shared/components/Avatar.js +88 -0
- package/src/shared/components/Badge.js +54 -0
- package/src/shared/components/BulkAccountAutomationModal.js +508 -0
- package/src/shared/components/Button.js +56 -0
- package/src/shared/components/Card.js +116 -0
- package/src/shared/components/ChangelogModal.js +97 -0
- package/src/shared/components/CodeBuddyQuotaCookieModal.js +109 -0
- package/src/shared/components/ComboFormModal.js +176 -0
- package/src/shared/components/CursorAuthModal.js +212 -0
- package/src/shared/components/DonateModal.js +136 -0
- package/src/shared/components/Drawer.js +82 -0
- package/src/shared/components/EditConnectionModal.js +286 -0
- package/src/shared/components/Footer.js +132 -0
- package/src/shared/components/GitLabAuthModal.js +194 -0
- package/src/shared/components/Header.js +380 -0
- package/src/shared/components/HeaderLanguage.js +46 -0
- package/src/shared/components/HeaderMenu.js +126 -0
- package/src/shared/components/IFlowCookieModal.js +132 -0
- package/src/shared/components/Input.js +65 -0
- package/src/shared/components/KiroAuthModal.js +1171 -0
- package/src/shared/components/KiroOAuthWrapper.js +149 -0
- package/src/shared/components/KiroSocialOAuthModal.js +205 -0
- package/src/shared/components/LanguageSwitcher.js +190 -0
- package/src/shared/components/Loading.js +75 -0
- package/src/shared/components/ManualConfigModal.js +44 -0
- package/src/shared/components/McpMarketplaceModal.js +255 -0
- package/src/shared/components/Modal.js +146 -0
- package/src/shared/components/ModelSelectModal.js +537 -0
- package/src/shared/components/NineRemoteButton.js +23 -0
- package/src/shared/components/NineRemotePromoModal.js +99 -0
- package/src/shared/components/NoAuthProxyCard.js +86 -0
- package/src/shared/components/OAuthModal.js +682 -0
- package/src/shared/components/Pagination.js +150 -0
- package/src/shared/components/PricingModal.js +208 -0
- package/src/shared/components/ProviderIcon.js +63 -0
- package/src/shared/components/ProviderInfoCard.js +82 -0
- package/src/shared/components/RequestLogger.js +121 -0
- package/src/shared/components/SegmentedControl.js +48 -0
- package/src/shared/components/Select.js +67 -0
- package/src/shared/components/Sidebar.js +441 -0
- package/src/shared/components/ThemeProvider.js +15 -0
- package/src/shared/components/ThemeToggle.js +42 -0
- package/src/shared/components/Toggle.js +69 -0
- package/src/shared/components/Tooltip.js +25 -0
- package/src/shared/components/UsageStats.js +505 -0
- package/src/shared/components/index.js +46 -0
- package/src/shared/components/layouts/AuthLayout.js +29 -0
- package/src/shared/components/layouts/DashboardLayout.js +104 -0
- package/src/shared/components/layouts/index.js +4 -0
- package/src/shared/constants/cliTools.js +397 -0
- package/src/shared/constants/colors.js +77 -0
- package/src/shared/constants/config.js +99 -0
- package/src/shared/constants/coworkPlugins.js +75 -0
- package/src/shared/constants/index.js +4 -0
- package/src/shared/constants/locales.js +36 -0
- package/src/shared/constants/mitmToolHosts.js +12 -0
- package/src/shared/constants/models.js +38 -0
- package/src/shared/constants/pricing.js +303 -0
- package/src/shared/constants/providers.js +289 -0
- package/src/shared/constants/skills.js +78 -0
- package/src/shared/constants/ttsProviders.js +138 -0
- package/src/shared/hooks/index.js +2 -0
- package/src/shared/hooks/useCopyToClipboard.js +43 -0
- package/src/shared/hooks/useTheme.js +60 -0
- package/src/shared/services/bootstrap.js +12 -0
- package/src/shared/services/initializeApp.js +268 -0
- package/src/shared/utils/api.js +93 -0
- package/src/shared/utils/apiKey.js +98 -0
- package/src/shared/utils/clineAuth.js +37 -0
- package/src/shared/utils/cn.js +11 -0
- package/src/shared/utils/connectionStatus.js +162 -0
- package/src/shared/utils/index.js +40 -0
- package/src/shared/utils/machine.js +6 -0
- package/src/shared/utils/machineId.js +66 -0
- package/src/shared/utils/providerModelsFetcher.js +30 -0
- package/src/sse/handlers/chat.js +261 -0
- package/src/sse/handlers/embeddings.js +141 -0
- package/src/sse/handlers/fetch.js +213 -0
- package/src/sse/handlers/imageGeneration.js +142 -0
- package/src/sse/handlers/search.js +206 -0
- package/src/sse/handlers/stt.js +88 -0
- package/src/sse/handlers/tts.js +114 -0
- package/src/sse/services/auth.js +346 -0
- package/src/sse/services/codexGateway.js +215 -0
- package/src/sse/services/model.js +99 -0
- package/src/sse/services/tokenRefresh.js +319 -0
- package/src/sse/utils/logger.js +75 -0
- package/src/store/headerSearchStore.js +19 -0
- package/src/store/index.js +6 -0
- package/src/store/notificationStore.js +45 -0
- package/src/store/providerStore.js +55 -0
- package/src/store/settingsStore.js +51 -0
- package/src/store/themeStore.js +54 -0
- package/src/store/userStore.js +20 -0
- package/start.sh +4 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { GET as claudeGet } from "../claude-settings/route";
|
|
5
|
+
import { GET as codexGet } from "../codex-settings/route";
|
|
6
|
+
import { GET as opencodeGet } from "../opencode-settings/route";
|
|
7
|
+
import { GET as droidGet } from "../droid-settings/route";
|
|
8
|
+
import { GET as openclawGet } from "../openclaw-settings/route";
|
|
9
|
+
import { GET as hermesGet } from "../hermes-settings/route";
|
|
10
|
+
import { GET as coworkGet } from "../cowork-settings/route";
|
|
11
|
+
import { GET as copilotGet } from "../copilot-settings/route";
|
|
12
|
+
import { GET as clineGet } from "../cline-settings/route";
|
|
13
|
+
import { GET as kiloGet } from "../kilo-settings/route";
|
|
14
|
+
import { GET as deepseekTuiGet } from "../deepseek-tui-settings/route";
|
|
15
|
+
import { GET as jcodeGet } from "../jcode-settings/route";
|
|
16
|
+
|
|
17
|
+
const STATUS_GETTERS = {
|
|
18
|
+
claude: claudeGet,
|
|
19
|
+
codex: codexGet,
|
|
20
|
+
opencode: opencodeGet,
|
|
21
|
+
droid: droidGet,
|
|
22
|
+
openclaw: openclawGet,
|
|
23
|
+
hermes: hermesGet,
|
|
24
|
+
cowork: coworkGet,
|
|
25
|
+
copilot: copilotGet,
|
|
26
|
+
cline: clineGet,
|
|
27
|
+
kilo: kiloGet,
|
|
28
|
+
"deepseek-tui": deepseekTuiGet,
|
|
29
|
+
jcode: jcodeGet,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Batch endpoint: gather all CLI tool statuses in one round-trip
|
|
33
|
+
export async function GET() {
|
|
34
|
+
const entries = await Promise.all(
|
|
35
|
+
Object.entries(STATUS_GETTERS).map(async ([toolId, getter]) => {
|
|
36
|
+
try {
|
|
37
|
+
const res = await getter();
|
|
38
|
+
const data = await res.json();
|
|
39
|
+
return [toolId, data];
|
|
40
|
+
} catch {
|
|
41
|
+
return [toolId, null];
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
return NextResponse.json(Object.fromEntries(entries));
|
|
46
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { getMitmAlias, setMitmAliasAll } from "@/models";
|
|
5
|
+
import { getMitmStatus } from "@/mitm/manager";
|
|
6
|
+
import { writeAliasForTool } from "@/lib/mitmAliasCache";
|
|
7
|
+
|
|
8
|
+
// GET - Get MITM aliases for a tool
|
|
9
|
+
export async function GET(request) {
|
|
10
|
+
try {
|
|
11
|
+
const { searchParams } = new URL(request.url);
|
|
12
|
+
const toolName = searchParams.get("tool");
|
|
13
|
+
const aliases = await getMitmAlias(toolName || undefined);
|
|
14
|
+
return NextResponse.json({ aliases });
|
|
15
|
+
} catch (error) {
|
|
16
|
+
console.log("Error fetching MITM aliases:", error.message);
|
|
17
|
+
return NextResponse.json({ error: "Failed to fetch aliases" }, { status: 500 });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// PUT - Save MITM aliases for a specific tool
|
|
22
|
+
export async function PUT(request) {
|
|
23
|
+
try {
|
|
24
|
+
const { tool, mappings } = await request.json();
|
|
25
|
+
|
|
26
|
+
if (!tool || !mappings || typeof mappings !== "object") {
|
|
27
|
+
return NextResponse.json({ error: "tool and mappings required" }, { status: 400 });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Check if DNS is enabled for this tool
|
|
31
|
+
const status = await getMitmStatus();
|
|
32
|
+
if (!status.dnsStatus || !status.dnsStatus[tool]) {
|
|
33
|
+
return NextResponse.json(
|
|
34
|
+
{ error: `DNS must be enabled for ${tool} before editing model mappings` },
|
|
35
|
+
{ status: 403 }
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const filtered = {};
|
|
40
|
+
for (const [alias, model] of Object.entries(mappings)) {
|
|
41
|
+
if (model && model.trim()) {
|
|
42
|
+
filtered[alias] = model.trim();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
await setMitmAliasAll(tool, filtered);
|
|
47
|
+
writeAliasForTool(tool, filtered);
|
|
48
|
+
return NextResponse.json({ success: true, aliases: filtered });
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.log("Error saving MITM aliases:", error.message);
|
|
51
|
+
return NextResponse.json({ error: "Failed to save aliases" }, { status: 500 });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import {
|
|
3
|
+
getMitmStatus,
|
|
4
|
+
startServer,
|
|
5
|
+
stopServer,
|
|
6
|
+
enableToolDNS,
|
|
7
|
+
disableToolDNS,
|
|
8
|
+
trustCert,
|
|
9
|
+
getCachedPassword,
|
|
10
|
+
setCachedPassword,
|
|
11
|
+
loadEncryptedPassword,
|
|
12
|
+
isSudoPasswordRequired,
|
|
13
|
+
initDbHooks,
|
|
14
|
+
} from "@/mitm/manager";
|
|
15
|
+
import { getSettings, updateSettings } from "@/lib/localDb";
|
|
16
|
+
|
|
17
|
+
initDbHooks(getSettings, updateSettings);
|
|
18
|
+
|
|
19
|
+
const DEFAULT_MITM_ROUTER_BASE = "http://localhost:20128";
|
|
20
|
+
|
|
21
|
+
function normalizeMitmRouterBaseUrlInput(input) {
|
|
22
|
+
if (input == null || String(input).trim() === "") {
|
|
23
|
+
return DEFAULT_MITM_ROUTER_BASE;
|
|
24
|
+
}
|
|
25
|
+
const t = String(input).trim().replace(/\/+$/, "");
|
|
26
|
+
let u;
|
|
27
|
+
try {
|
|
28
|
+
u = new URL(t);
|
|
29
|
+
} catch {
|
|
30
|
+
throw new Error("Invalid MITM router URL");
|
|
31
|
+
}
|
|
32
|
+
if (u.protocol !== "http:" && u.protocol !== "https:") {
|
|
33
|
+
throw new Error("MITM router URL must use http or https");
|
|
34
|
+
}
|
|
35
|
+
return t;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const isWin = process.platform === "win32";
|
|
39
|
+
|
|
40
|
+
function getPassword(provided) {
|
|
41
|
+
return provided || getCachedPassword() || null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function requiresSudoPassword(pwd) {
|
|
45
|
+
return !isWin && !pwd && isSudoPasswordRequired();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function checkIsAdmin() {
|
|
49
|
+
if (isWin) {
|
|
50
|
+
try {
|
|
51
|
+
require("child_process").execSync("net session >nul 2>&1", { windowsHide: true });
|
|
52
|
+
return true;
|
|
53
|
+
} catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return typeof process.getuid === "function" && process.getuid() === 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function checkPrivilege(pwd) {
|
|
61
|
+
if (checkIsAdmin()) return true;
|
|
62
|
+
if (isWin) return false;
|
|
63
|
+
if (!isSudoPasswordRequired()) return true;
|
|
64
|
+
return !!pwd;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// GET - Full MITM status (server + per-tool DNS)
|
|
68
|
+
export async function GET() {
|
|
69
|
+
try {
|
|
70
|
+
const status = await getMitmStatus();
|
|
71
|
+
const settings = await getSettings();
|
|
72
|
+
const hasCachedPassword = !!getCachedPassword() || !!(await loadEncryptedPassword());
|
|
73
|
+
return NextResponse.json({
|
|
74
|
+
running: status.running,
|
|
75
|
+
pid: status.pid || null,
|
|
76
|
+
certExists: status.certExists || false,
|
|
77
|
+
certTrusted: status.certTrusted || false,
|
|
78
|
+
dnsStatus: status.dnsStatus || {},
|
|
79
|
+
hasCachedPassword,
|
|
80
|
+
isWin,
|
|
81
|
+
needsSudoPassword: !isWin && !hasCachedPassword && isSudoPasswordRequired(),
|
|
82
|
+
isAdmin: checkIsAdmin(),
|
|
83
|
+
mitmRouterBaseUrl:
|
|
84
|
+
(settings.mitmRouterBaseUrl && String(settings.mitmRouterBaseUrl).trim()) ||
|
|
85
|
+
DEFAULT_MITM_ROUTER_BASE,
|
|
86
|
+
});
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.log("Error getting MITM status:", error.message);
|
|
89
|
+
return NextResponse.json({ error: "Failed to get MITM status" }, { status: 500 });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// POST - Start MITM server (cert + server, no DNS)
|
|
94
|
+
export async function POST(request) {
|
|
95
|
+
try {
|
|
96
|
+
const { apiKey, sudoPassword, mitmRouterBaseUrl, forceKillPort443 } = await request.json();
|
|
97
|
+
const pwd = getPassword(sudoPassword) || await loadEncryptedPassword() || "";
|
|
98
|
+
|
|
99
|
+
if (!apiKey || requiresSudoPassword(pwd)) {
|
|
100
|
+
return NextResponse.json(
|
|
101
|
+
{ error: !apiKey ? "Missing apiKey" : "Missing sudoPassword" },
|
|
102
|
+
{ status: 400 }
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (!checkPrivilege(pwd)) {
|
|
107
|
+
return NextResponse.json(
|
|
108
|
+
{ error: isWin ? "Administrator required — restart 9Router as Administrator" : "Root or sudo password required to start MITM" },
|
|
109
|
+
{ status: 403 }
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (mitmRouterBaseUrl !== undefined && mitmRouterBaseUrl !== null) {
|
|
114
|
+
try {
|
|
115
|
+
const normalized = normalizeMitmRouterBaseUrlInput(mitmRouterBaseUrl);
|
|
116
|
+
await updateSettings({ mitmRouterBaseUrl: normalized });
|
|
117
|
+
} catch (e) {
|
|
118
|
+
return NextResponse.json(
|
|
119
|
+
{ error: e.message || "Invalid MITM router URL" },
|
|
120
|
+
{ status: 400 },
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const result = await startServer(apiKey, pwd, !!forceKillPort443);
|
|
126
|
+
if (!isWin) setCachedPassword(pwd);
|
|
127
|
+
|
|
128
|
+
return NextResponse.json({ success: true, running: result.running, pid: result.pid });
|
|
129
|
+
} catch (error) {
|
|
130
|
+
console.log("Error starting MITM server:", error.message);
|
|
131
|
+
if (error.code === "PORT_443_BUSY") {
|
|
132
|
+
return NextResponse.json(
|
|
133
|
+
{ error: error.message, code: "PORT_443_BUSY", portOwner: error.portOwner },
|
|
134
|
+
{ status: 409 }
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
return NextResponse.json({ error: error.message || "Failed to start MITM server" }, { status: 500 });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// DELETE - Stop MITM server (removes all DNS first, then kills server)
|
|
142
|
+
export async function DELETE(request) {
|
|
143
|
+
try {
|
|
144
|
+
const body = await request.json().catch(() => ({}));
|
|
145
|
+
const { sudoPassword } = body;
|
|
146
|
+
const pwd = getPassword(sudoPassword) || await loadEncryptedPassword() || "";
|
|
147
|
+
|
|
148
|
+
if (requiresSudoPassword(pwd)) {
|
|
149
|
+
return NextResponse.json({ error: "Missing sudoPassword" }, { status: 400 });
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
await stopServer(pwd);
|
|
153
|
+
if (!isWin && sudoPassword) setCachedPassword(sudoPassword);
|
|
154
|
+
|
|
155
|
+
return NextResponse.json({ success: true, running: false });
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.log("Error stopping MITM server:", error.message);
|
|
158
|
+
return NextResponse.json({ error: error.message || "Failed to stop MITM server" }, { status: 500 });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// PATCH - Toggle DNS for a specific tool (enable/disable)
|
|
163
|
+
export async function PATCH(request) {
|
|
164
|
+
try {
|
|
165
|
+
const { tool, action, sudoPassword } = await request.json();
|
|
166
|
+
const pwd = getPassword(sudoPassword) || await loadEncryptedPassword() || "";
|
|
167
|
+
|
|
168
|
+
if (!tool || !action) {
|
|
169
|
+
return NextResponse.json({ error: "tool and action required" }, { status: 400 });
|
|
170
|
+
}
|
|
171
|
+
if (requiresSudoPassword(pwd)) {
|
|
172
|
+
return NextResponse.json({ error: "Missing sudoPassword" }, { status: 400 });
|
|
173
|
+
}
|
|
174
|
+
if (!checkPrivilege(pwd)) {
|
|
175
|
+
return NextResponse.json(
|
|
176
|
+
{ error: isWin ? "Administrator required — restart 9Router as Administrator" : "Root or sudo password required to modify DNS" },
|
|
177
|
+
{ status: 403 }
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (action === "enable") {
|
|
182
|
+
await enableToolDNS(tool, pwd);
|
|
183
|
+
} else if (action === "disable") {
|
|
184
|
+
await disableToolDNS(tool, pwd);
|
|
185
|
+
} else if (action === "trust-cert") {
|
|
186
|
+
await trustCert(pwd);
|
|
187
|
+
if (!isWin && sudoPassword) setCachedPassword(sudoPassword);
|
|
188
|
+
const status = await getMitmStatus();
|
|
189
|
+
return NextResponse.json({ success: true, certTrusted: status.certTrusted });
|
|
190
|
+
} else {
|
|
191
|
+
return NextResponse.json({ error: "action must be enable, disable, or trust-cert" }, { status: 400 });
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (!isWin && sudoPassword) setCachedPassword(sudoPassword);
|
|
195
|
+
|
|
196
|
+
const status = await getMitmStatus();
|
|
197
|
+
return NextResponse.json({ success: true, dnsStatus: status.dnsStatus });
|
|
198
|
+
} catch (error) {
|
|
199
|
+
console.log("Error toggling DNS:", error.message);
|
|
200
|
+
return NextResponse.json({ error: error.message || "Failed to toggle DNS" }, { status: 500 });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { exec } from "child_process";
|
|
5
|
+
import { promisify } from "util";
|
|
6
|
+
import fs from "fs/promises";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import os from "os";
|
|
9
|
+
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
|
|
12
|
+
// Get claude settings path based on OS
|
|
13
|
+
const getClaudeSettingsPath = () => {
|
|
14
|
+
const homeDir = os.homedir();
|
|
15
|
+
return path.join(homeDir, ".claude", "settings.json");
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
// Check if claude CLI is installed (via which/where or config file exists)
|
|
20
|
+
const checkClaudeInstalled = async () => {
|
|
21
|
+
try {
|
|
22
|
+
const isWindows = os.platform() === "win32";
|
|
23
|
+
const command = isWindows ? "where claude" : "which claude";
|
|
24
|
+
const env = isWindows
|
|
25
|
+
? { ...process.env, PATH: `${process.env.APPDATA}\\npm;${process.env.PATH}` }
|
|
26
|
+
: process.env;
|
|
27
|
+
await execAsync(command, { windowsHide: true, env });
|
|
28
|
+
return true;
|
|
29
|
+
} catch {
|
|
30
|
+
try {
|
|
31
|
+
await fs.access(getClaudeSettingsPath());
|
|
32
|
+
return true;
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Read current settings
|
|
40
|
+
const readSettings = async () => {
|
|
41
|
+
try {
|
|
42
|
+
const settingsPath = getClaudeSettingsPath();
|
|
43
|
+
const content = await fs.readFile(settingsPath, "utf-8");
|
|
44
|
+
return JSON.parse(content);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
if (error.code === "ENOENT") {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// GET - Check claude CLI and read current settings
|
|
54
|
+
export async function GET() {
|
|
55
|
+
try {
|
|
56
|
+
const isInstalled = await checkClaudeInstalled();
|
|
57
|
+
|
|
58
|
+
if (!isInstalled) {
|
|
59
|
+
return NextResponse.json({
|
|
60
|
+
installed: false,
|
|
61
|
+
settings: null,
|
|
62
|
+
message: "Claude CLI is not installed",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const settings = await readSettings();
|
|
67
|
+
const has9Router = !!(settings?.env?.ANTHROPIC_BASE_URL);
|
|
68
|
+
|
|
69
|
+
return NextResponse.json({
|
|
70
|
+
installed: true,
|
|
71
|
+
settings: settings,
|
|
72
|
+
has9Router: has9Router,
|
|
73
|
+
settingsPath: getClaudeSettingsPath(),
|
|
74
|
+
});
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.log("Error checking claude settings:", error);
|
|
77
|
+
return NextResponse.json(
|
|
78
|
+
{ error: "Failed to check claude settings" },
|
|
79
|
+
{ status: 500 }
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// POST - Backup old fields and write new settings
|
|
85
|
+
export async function POST(request) {
|
|
86
|
+
try {
|
|
87
|
+
const { env } = await request.json();
|
|
88
|
+
|
|
89
|
+
if (!env || typeof env !== "object") {
|
|
90
|
+
return NextResponse.json(
|
|
91
|
+
{ error: "Invalid env object" },
|
|
92
|
+
{ status: 400 }
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const settingsPath = getClaudeSettingsPath();
|
|
97
|
+
const claudeDir = path.dirname(settingsPath);
|
|
98
|
+
|
|
99
|
+
// Ensure .claude directory exists
|
|
100
|
+
await fs.mkdir(claudeDir, { recursive: true });
|
|
101
|
+
|
|
102
|
+
// Read current settings
|
|
103
|
+
let currentSettings = {};
|
|
104
|
+
try {
|
|
105
|
+
const content = await fs.readFile(settingsPath, "utf-8");
|
|
106
|
+
currentSettings = JSON.parse(content);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
if (error.code !== "ENOENT") {
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Normalize ANTHROPIC_BASE_URL to ensure /v1 suffix
|
|
114
|
+
if (env.ANTHROPIC_BASE_URL) {
|
|
115
|
+
env.ANTHROPIC_BASE_URL = env.ANTHROPIC_BASE_URL.endsWith("/v1")
|
|
116
|
+
? env.ANTHROPIC_BASE_URL
|
|
117
|
+
: `${env.ANTHROPIC_BASE_URL}/v1`;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Merge new env with existing settings
|
|
121
|
+
const newSettings = {
|
|
122
|
+
...currentSettings,
|
|
123
|
+
hasCompletedOnboarding: true,
|
|
124
|
+
env: {
|
|
125
|
+
...(currentSettings.env || {}),
|
|
126
|
+
...env,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// Write new settings
|
|
131
|
+
await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));
|
|
132
|
+
|
|
133
|
+
return NextResponse.json({
|
|
134
|
+
success: true,
|
|
135
|
+
message: "Settings updated successfully",
|
|
136
|
+
});
|
|
137
|
+
} catch (error) {
|
|
138
|
+
console.log("Error updating claude settings:", error);
|
|
139
|
+
return NextResponse.json(
|
|
140
|
+
{ error: "Failed to update claude settings" },
|
|
141
|
+
{ status: 500 }
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Fields to remove when resetting
|
|
147
|
+
const RESET_ENV_KEYS = [
|
|
148
|
+
"ANTHROPIC_BASE_URL",
|
|
149
|
+
"ANTHROPIC_AUTH_TOKEN",
|
|
150
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL",
|
|
151
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL",
|
|
152
|
+
"ANTHROPIC_DEFAULT_HAIKU_MODEL",
|
|
153
|
+
"API_TIMEOUT_MS",
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
// DELETE - Reset settings (remove env fields)
|
|
157
|
+
export async function DELETE() {
|
|
158
|
+
try {
|
|
159
|
+
const settingsPath = getClaudeSettingsPath();
|
|
160
|
+
|
|
161
|
+
// Read current settings
|
|
162
|
+
let currentSettings = {};
|
|
163
|
+
try {
|
|
164
|
+
const content = await fs.readFile(settingsPath, "utf-8");
|
|
165
|
+
currentSettings = JSON.parse(content);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
if (error.code === "ENOENT") {
|
|
168
|
+
return NextResponse.json({
|
|
169
|
+
success: true,
|
|
170
|
+
message: "No settings file to reset",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Remove specified env fields
|
|
177
|
+
if (currentSettings.env) {
|
|
178
|
+
RESET_ENV_KEYS.forEach((key) => {
|
|
179
|
+
delete currentSettings.env[key];
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// Clean up empty env object
|
|
183
|
+
if (Object.keys(currentSettings.env).length === 0) {
|
|
184
|
+
delete currentSettings.env;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Write updated settings
|
|
189
|
+
await fs.writeFile(settingsPath, JSON.stringify(currentSettings, null, 2));
|
|
190
|
+
|
|
191
|
+
return NextResponse.json({
|
|
192
|
+
success: true,
|
|
193
|
+
message: "Settings reset successfully",
|
|
194
|
+
});
|
|
195
|
+
} catch (error) {
|
|
196
|
+
console.log("Error resetting claude settings:", error);
|
|
197
|
+
return NextResponse.json(
|
|
198
|
+
{ error: "Failed to reset claude settings" },
|
|
199
|
+
{ status: 500 }
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { exec } from "child_process";
|
|
5
|
+
import { promisify } from "util";
|
|
6
|
+
import fs from "fs/promises";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import os from "os";
|
|
9
|
+
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
|
|
12
|
+
const getDataDir = () => path.join(os.homedir(), ".cline", "data");
|
|
13
|
+
const getGlobalStatePath = () => path.join(getDataDir(), "globalState.json");
|
|
14
|
+
const getSecretsPath = () => path.join(getDataDir(), "secrets.json");
|
|
15
|
+
|
|
16
|
+
const checkInstalled = async () => {
|
|
17
|
+
try {
|
|
18
|
+
const isWindows = os.platform() === "win32";
|
|
19
|
+
const command = isWindows ? "where cline" : "which cline";
|
|
20
|
+
const env = isWindows
|
|
21
|
+
? { ...process.env, PATH: `${process.env.APPDATA}\\npm;${process.env.PATH}` }
|
|
22
|
+
: process.env;
|
|
23
|
+
await execAsync(command, { windowsHide: true, env });
|
|
24
|
+
return true;
|
|
25
|
+
} catch {
|
|
26
|
+
try {
|
|
27
|
+
await fs.access(getGlobalStatePath());
|
|
28
|
+
return true;
|
|
29
|
+
} catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const readJson = async (filePath) => {
|
|
36
|
+
try {
|
|
37
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
38
|
+
return JSON.parse(content);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (error.code === "ENOENT") return null;
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const has9RouterConfig = (globalState) => {
|
|
46
|
+
if (!globalState) return false;
|
|
47
|
+
const isOpenAi =
|
|
48
|
+
globalState.actModeApiProvider === "openai" || globalState.planModeApiProvider === "openai";
|
|
49
|
+
const baseUrl = globalState.openAiBaseUrl || "";
|
|
50
|
+
return isOpenAi && (baseUrl.includes("localhost") || baseUrl.includes("127.0.0.1") || baseUrl.includes("9router"));
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export async function GET() {
|
|
54
|
+
try {
|
|
55
|
+
const installed = await checkInstalled();
|
|
56
|
+
if (!installed) {
|
|
57
|
+
return NextResponse.json({ installed: false, settings: null, message: "Cline CLI is not installed" });
|
|
58
|
+
}
|
|
59
|
+
const globalState = await readJson(getGlobalStatePath());
|
|
60
|
+
return NextResponse.json({
|
|
61
|
+
installed: true,
|
|
62
|
+
settings: {
|
|
63
|
+
actModeApiProvider: globalState?.actModeApiProvider,
|
|
64
|
+
planModeApiProvider: globalState?.planModeApiProvider,
|
|
65
|
+
openAiBaseUrl: globalState?.openAiBaseUrl,
|
|
66
|
+
openAiModelId: globalState?.openAiModelId,
|
|
67
|
+
},
|
|
68
|
+
has9Router: has9RouterConfig(globalState),
|
|
69
|
+
globalStatePath: getGlobalStatePath(),
|
|
70
|
+
});
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.log("Error checking cline settings:", error);
|
|
73
|
+
return NextResponse.json({ error: "Failed to check cline settings" }, { status: 500 });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function POST(request) {
|
|
78
|
+
try {
|
|
79
|
+
const { baseUrl, apiKey, model } = await request.json();
|
|
80
|
+
if (!baseUrl || !apiKey || !model) {
|
|
81
|
+
return NextResponse.json({ error: "baseUrl, apiKey and model are required" }, { status: 400 });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
await fs.mkdir(getDataDir(), { recursive: true });
|
|
85
|
+
|
|
86
|
+
// Cline expects base WITHOUT /v1
|
|
87
|
+
const normalizedBaseUrl = baseUrl.endsWith("/v1") ? baseUrl.slice(0, -3) : baseUrl;
|
|
88
|
+
|
|
89
|
+
const globalState = (await readJson(getGlobalStatePath())) || {};
|
|
90
|
+
globalState.actModeApiProvider = "openai";
|
|
91
|
+
globalState.planModeApiProvider = "openai";
|
|
92
|
+
globalState.openAiBaseUrl = normalizedBaseUrl;
|
|
93
|
+
globalState.openAiModelId = model;
|
|
94
|
+
globalState.planModeOpenAiModelId = model;
|
|
95
|
+
await fs.writeFile(getGlobalStatePath(), JSON.stringify(globalState, null, 2));
|
|
96
|
+
|
|
97
|
+
const secrets = (await readJson(getSecretsPath())) || {};
|
|
98
|
+
secrets.openAiApiKey = apiKey;
|
|
99
|
+
await fs.writeFile(getSecretsPath(), JSON.stringify(secrets, null, 2));
|
|
100
|
+
|
|
101
|
+
return NextResponse.json({ success: true, message: "Cline settings applied successfully!", globalStatePath: getGlobalStatePath() });
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.log("Error updating cline settings:", error);
|
|
104
|
+
return NextResponse.json({ error: "Failed to update cline settings" }, { status: 500 });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export async function DELETE() {
|
|
109
|
+
try {
|
|
110
|
+
const globalState = await readJson(getGlobalStatePath());
|
|
111
|
+
if (!globalState) {
|
|
112
|
+
return NextResponse.json({ success: true, message: "No settings file to reset" });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (globalState.actModeApiProvider === "openai") {
|
|
116
|
+
delete globalState.openAiBaseUrl;
|
|
117
|
+
delete globalState.openAiModelId;
|
|
118
|
+
delete globalState.planModeOpenAiModelId;
|
|
119
|
+
globalState.actModeApiProvider = "cline";
|
|
120
|
+
globalState.planModeApiProvider = "cline";
|
|
121
|
+
}
|
|
122
|
+
await fs.writeFile(getGlobalStatePath(), JSON.stringify(globalState, null, 2));
|
|
123
|
+
|
|
124
|
+
const secrets = (await readJson(getSecretsPath())) || {};
|
|
125
|
+
delete secrets.openAiApiKey;
|
|
126
|
+
await fs.writeFile(getSecretsPath(), JSON.stringify(secrets, null, 2));
|
|
127
|
+
|
|
128
|
+
return NextResponse.json({ success: true, message: "9Router settings removed from Cline" });
|
|
129
|
+
} catch (error) {
|
|
130
|
+
console.log("Error resetting cline settings:", error);
|
|
131
|
+
return NextResponse.json({ error: "Failed to reset cline settings" }, { status: 500 });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { listCodexGatewayAccounts } from "@/sse/services/codexGateway.js";
|
|
3
|
+
|
|
4
|
+
export const dynamic = "force-dynamic";
|
|
5
|
+
|
|
6
|
+
export async function GET() {
|
|
7
|
+
try {
|
|
8
|
+
const data = await listCodexGatewayAccounts();
|
|
9
|
+
return NextResponse.json(data, {
|
|
10
|
+
headers: { "Cache-Control": "no-store" },
|
|
11
|
+
});
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.log("Error listing Codex gateway accounts:", error);
|
|
14
|
+
return NextResponse.json({ error: "Failed to list Codex gateway accounts" }, { status: 500 });
|
|
15
|
+
}
|
|
16
|
+
}
|