swayrouter 1.0.0
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/.env.example +43 -0
- package/CHANGELOG.md +132 -0
- package/LICENSE +30 -0
- package/README.id.md +633 -0
- package/README.md +628 -0
- package/cli/cli.js +388 -0
- package/cli/package.json +4 -0
- package/cli/src/cli/commands/xaiVideo.js +280 -0
- package/cli/src/cli/tray/SwayAvatar.svg +20 -0
- package/cli/src/cli/tray/autostart.js +351 -0
- package/cli/src/cli/tray/icon.ico +0 -0
- package/cli/src/cli/tray/icon.png +0 -0
- package/cli/src/cli/tray/tray.js +258 -0
- package/cli/src/cli/tray/tray.ps1 +129 -0
- package/cli/src/cli/tray/trayHost.js +157 -0
- package/cli/src/cli/tray/trayWin.js +83 -0
- package/cli/src/cli/utils/display.js +123 -0
- package/cli/src/cli/utils/input.js +138 -0
- package/cli/src/runtime/discover.js +153 -0
- package/cli/src/runtime/lifecycle.js +333 -0
- package/cli/src/runtime/runMenu.js +250 -0
- package/cli/src/runtime/uiAdapters.js +12 -0
- package/cli/src/runtime/update.js +130 -0
- package/dashboard/dist/assets/CliTools-Ch3gKuNw.js +24 -0
- package/dashboard/dist/assets/Combo-BBCldjWi.js +1 -0
- package/dashboard/dist/assets/ConsoleLog-wywAYcPT.js +6 -0
- package/dashboard/dist/assets/Dashboard-DxzyF41b.js +1 -0
- package/dashboard/dist/assets/Header-C_9Su9BF.js +1 -0
- package/dashboard/dist/assets/Keys-D0ufgcsc.js +1 -0
- package/dashboard/dist/assets/Login-BeKpipS_.js +1 -0
- package/dashboard/dist/assets/ManageApiKey-CVXsmW2B.js +1 -0
- package/dashboard/dist/assets/OAuthCallback-D_UZYcF6.js +1 -0
- package/dashboard/dist/assets/Provider-BU7JfTqm.js +4 -0
- package/dashboard/dist/assets/ProviderModelAccordion-BAifkfVR.js +1 -0
- package/dashboard/dist/assets/Proxy-CU15VJ--.js +1 -0
- package/dashboard/dist/assets/QuotaMonitor-HzGK7bcc.js +1 -0
- package/dashboard/dist/assets/Settings-Dt4y2dC0.js +1 -0
- package/dashboard/dist/assets/Setup-DSDUwU7N.js +1 -0
- package/dashboard/dist/assets/StatusBadge-1nAOyHU2.js +1 -0
- package/dashboard/dist/assets/SwayChat-Bup7up6D.js +10 -0
- package/dashboard/dist/assets/Usage-eWnrPQ_v.js +4 -0
- package/dashboard/dist/assets/accordion-DOOPDDgt.js +1 -0
- package/dashboard/dist/assets/admin-extras-api-CCdu5TFM.js +1 -0
- package/dashboard/dist/assets/api-keys-api-ifAC2Ok3.js +1 -0
- package/dashboard/dist/assets/card-CC0Omjcv.js +1 -0
- package/dashboard/dist/assets/chatStudio-C0zPz_Z_.js +2 -0
- package/dashboard/dist/assets/checkbox-7SZBrmbN.js +1 -0
- package/dashboard/dist/assets/connections-api-_N54UD3S.js +1 -0
- package/dashboard/dist/assets/copy-button-qBvM6H9z.js +1 -0
- package/dashboard/dist/assets/currency-api-SV9CBf5e.js +1 -0
- package/dashboard/dist/assets/flip-button-BGgkjtl0.js +1 -0
- package/dashboard/dist/assets/frame-cUiti6Lq.js +1 -0
- package/dashboard/dist/assets/icons-vendor-CUx7SB5V.js +541 -0
- package/dashboard/dist/assets/index-B6j-9zHy.js +10 -0
- package/dashboard/dist/assets/index-C-_l0yYz.css +1 -0
- package/dashboard/dist/assets/live-mode-CHShLY4E.js +1 -0
- package/dashboard/dist/assets/markdown-vendor-BY8e1gQ8.js +29 -0
- package/dashboard/dist/assets/motion-vendor-g5fpGzmJ.js +9 -0
- package/dashboard/dist/assets/oauth-callback-CqYQzyd7.js +1 -0
- package/dashboard/dist/assets/query-vendor-DVevaSVS.js +1 -0
- package/dashboard/dist/assets/react-vendor-xnYrwzsL.js +61 -0
- package/dashboard/dist/assets/ripple-button-l8aMiVVG.js +1 -0
- package/dashboard/dist/assets/segmented-CqmEnQjZ.js +1 -0
- package/dashboard/dist/assets/select-D8pUtMXp.js +1 -0
- package/dashboard/dist/assets/skeleton-7uJDiIXe.js +1 -0
- package/dashboard/dist/assets/table-D0M60Tu1.js +1 -0
- package/dashboard/dist/assets/tabs-C6YkuulG.js +1 -0
- package/dashboard/dist/assets/tunnel-api-DDPsBaDV.js +1 -0
- package/dashboard/dist/assets/ui-vendor-BuM9f2NY.js +17 -0
- package/dashboard/dist/image2/SwayAvatar.svg +20 -0
- package/dashboard/dist/index.html +32 -0
- package/dashboard/dist/logo/avatar.svg +1 -0
- package/dashboard/dist/logo/sway.svg +20 -0
- package/dashboard/dist/logo/swaychat.svg +20 -0
- package/dashboard/dist/providers/SwayCustom.svg +19 -0
- package/dashboard/dist/providers/alicode.svg +12 -0
- package/dashboard/dist/providers/anthropic.svg +11 -0
- package/dashboard/dist/providers/antigravity.svg +3 -0
- package/dashboard/dist/providers/azure.svg +5 -0
- package/dashboard/dist/providers/baidu.svg +3 -0
- package/dashboard/dist/providers/blackbox.svg +5 -0
- package/dashboard/dist/providers/byteplus.svg +3 -0
- package/dashboard/dist/providers/cerebras.svg +4 -0
- package/dashboard/dist/providers/chutes.svg +4 -0
- package/dashboard/dist/providers/claude.svg +3 -0
- package/dashboard/dist/providers/cline.svg +11 -0
- package/dashboard/dist/providers/cloudflare-ai.svg +4 -0
- package/dashboard/dist/providers/codebuddy.svg +11 -0
- package/dashboard/dist/providers/codex.svg +10 -0
- package/dashboard/dist/providers/commandcode.svg +3 -0
- package/dashboard/dist/providers/cursor.svg +3 -0
- package/dashboard/dist/providers/deepseek.svg +10 -0
- package/dashboard/dist/providers/featherless.svg +3 -0
- package/dashboard/dist/providers/fireworks.svg +3 -0
- package/dashboard/dist/providers/gemini.svg +3 -0
- package/dashboard/dist/providers/geminicli.svg +11 -0
- package/dashboard/dist/providers/github.svg +3 -0
- package/dashboard/dist/providers/grok.svg +3 -0
- package/dashboard/dist/providers/groq.svg +3 -0
- package/dashboard/dist/providers/hermesagent.svg +1 -0
- package/dashboard/dist/providers/kilocode.svg +15 -0
- package/dashboard/dist/providers/kimchi.svg +3 -0
- package/dashboard/dist/providers/kimi.svg +4 -0
- package/dashboard/dist/providers/kiro.svg +10 -0
- package/dashboard/dist/providers/meta.svg +3 -0
- package/dashboard/dist/providers/mimo.svg +10 -0
- package/dashboard/dist/providers/minimax.svg +3 -0
- package/dashboard/dist/providers/mistral.svg +3 -0
- package/dashboard/dist/providers/morph.svg +3 -0
- package/dashboard/dist/providers/nebius.svg +4 -0
- package/dashboard/dist/providers/nvidia.svg +3 -0
- package/dashboard/dist/providers/ollama.svg +3 -0
- package/dashboard/dist/providers/omp.svg +5 -0
- package/dashboard/dist/providers/openai.svg +3 -0
- package/dashboard/dist/providers/opencode.svg +3 -0
- package/dashboard/dist/providers/openrouter.svg +3 -0
- package/dashboard/dist/providers/perplexity.svg +3 -0
- package/dashboard/dist/providers/poolside.svg +36 -0
- package/dashboard/dist/providers/qoder.svg +11 -0
- package/dashboard/dist/providers/sumopod.svg +3 -0
- package/dashboard/dist/providers/tencent.svg +5 -0
- package/dashboard/dist/providers/together.svg +12 -0
- package/dashboard/dist/providers/trae.svg +3 -0
- package/dashboard/dist/providers/venice.svg +4 -0
- package/dashboard/dist/providers/vercel.svg +3 -0
- package/dashboard/dist/providers/vertex.svg +17 -0
- package/dashboard/dist/providers/windsurf.svg +10 -0
- package/dashboard/dist/providers/zai.svg +3 -0
- package/dashboard/tsconfig.json +13 -0
- package/package.json +87 -0
- package/src/config/appConstants.js +153 -0
- package/src/config/defaultThinkingSignature.js +7 -0
- package/src/config/errorConfig.js +117 -0
- package/src/config/grokCli.js +9 -0
- package/src/config/kiroConstants.js +235 -0
- package/src/config/mediaConfig.js +20 -0
- package/src/config/ollamaModels.js +18 -0
- package/src/config/providerModels.js +109 -0
- package/src/config/providers.js +17 -0
- package/src/config/runtimeConfig.js +84 -0
- package/src/dashboardGuard.js +254 -0
- package/src/executors/antigravity.js +389 -0
- package/src/executors/azure.js +49 -0
- package/src/executors/base.js +225 -0
- package/src/executors/codebuddy-cn.js +23 -0
- package/src/executors/codebuddy-intl.js +60 -0
- package/src/executors/codex.js +436 -0
- package/src/executors/commandcode.js +83 -0
- package/src/executors/cursor.js +1075 -0
- package/src/executors/default.js +294 -0
- package/src/executors/gemini-cli.js +88 -0
- package/src/executors/github.js +393 -0
- package/src/executors/grok-cli.js +510 -0
- package/src/executors/grok-web.js +342 -0
- package/src/executors/index.js +86 -0
- package/src/executors/kimchi.js +116 -0
- package/src/executors/kiro.js +1155 -0
- package/src/executors/ollama-local.js +14 -0
- package/src/executors/opencode-go.js +47 -0
- package/src/executors/opencode.js +31 -0
- package/src/executors/qoder.js +433 -0
- package/src/executors/trae.js +318 -0
- package/src/executors/vertex.js +151 -0
- package/src/executors/windsurf.js +555 -0
- package/src/executors/xiaomi-tokenplan.js +16 -0
- package/src/handlers/chatCore/nonStreamingHandler.js +370 -0
- package/src/handlers/chatCore/requestDetail.js +130 -0
- package/src/handlers/chatCore/sseToJsonHandler.js +318 -0
- package/src/handlers/chatCore/streamingHandler.js +250 -0
- package/src/handlers/chatCore.js +652 -0
- package/src/lib/auth/dashboardSession.js +83 -0
- package/src/lib/auth/loginLimiter.js +99 -0
- package/src/lib/cache/ttlCache.js +153 -0
- package/src/lib/consoleLogBuffer.js +127 -0
- package/src/lib/dataDir.js +45 -0
- package/src/lib/db/adapters/betterSqliteAdapter.js +36 -0
- package/src/lib/db/adapters/bunSqliteAdapter.js +47 -0
- package/src/lib/db/adapters/nodeSqliteAdapter.js +65 -0
- package/src/lib/db/adapters/runtimeHelpers.js +23 -0
- package/src/lib/db/adapters/sqljsAdapter.js +103 -0
- package/src/lib/db/backup.js +75 -0
- package/src/lib/db/driver.js +110 -0
- package/src/lib/db/helpers/jsonCol.js +18 -0
- package/src/lib/db/helpers/kvStore.js +48 -0
- package/src/lib/db/helpers/metaStore.js +32 -0
- package/src/lib/db/index.js +473 -0
- package/src/lib/db/migrate.js +267 -0
- package/src/lib/db/migrations/001-initial.js +12 -0
- package/src/lib/db/migrations/002-prune-headroom-pxpipe-settings.js +32 -0
- package/src/lib/db/migrations/004-request-details-trace-id.js +12 -0
- package/src/lib/db/migrations/005-request-details-payload-capture.js +11 -0
- package/src/lib/db/migrations/007-headroom-readd-settings.js +35 -0
- package/src/lib/db/migrations/008-account-model-locks.js +22 -0
- package/src/lib/db/migrations/009-warp-pool-lifecycle.js +5 -0
- package/src/lib/db/migrations/010-api-key-file-permissions.js +7 -0
- package/src/lib/db/migrations/011-remove-upstream-user-agent-profile.js +41 -0
- package/src/lib/db/migrations/012-remove-headroom-settings.js +33 -0
- package/src/lib/db/migrations/013-default-fill-first-routing.js +20 -0
- package/src/lib/db/migrations/014-normalize-fill-first-routing.js +37 -0
- package/src/lib/db/migrations/015-remove-ip-ban-tables.js +8 -0
- package/src/lib/db/migrations/016-prune-legacy-codebuddy-intl-models.js +25 -0
- package/src/lib/db/migrations/index.js +20 -0
- package/src/lib/db/nineRouterMigration.js +785 -0
- package/src/lib/db/paths.js +23 -0
- package/src/lib/db/repos/accountModelLocksRepo.js +74 -0
- package/src/lib/db/repos/aliasRepo.js +108 -0
- package/src/lib/db/repos/apiKeysRepo.js +204 -0
- package/src/lib/db/repos/combosRepo.js +85 -0
- package/src/lib/db/repos/connectionsRepo.js +522 -0
- package/src/lib/db/repos/disabledModelsRepo.js +63 -0
- package/src/lib/db/repos/nodesRepo.js +127 -0
- package/src/lib/db/repos/pricingRepo.js +108 -0
- package/src/lib/db/repos/proxyPoolsRepo.js +104 -0
- package/src/lib/db/repos/requestDetailsRepo.js +345 -0
- package/src/lib/db/repos/settingsRepo.js +135 -0
- package/src/lib/db/repos/usageRepo.js +1335 -0
- package/src/lib/db/schema.js +179 -0
- package/src/lib/db/version.js +32 -0
- package/src/lib/db/writeBehind.js +174 -0
- package/src/lib/disabledModelsDb.js +3 -0
- package/src/lib/env.ts +175 -0
- package/src/lib/errors/publicError.js +18 -0
- package/src/lib/grokBuildConfig.js +243 -0
- package/src/lib/guardRequest.js +51 -0
- package/src/lib/localDb.js +21 -0
- package/src/lib/mcp/stdioSseBridge.js +174 -0
- package/src/lib/network/connectionProxy.js +200 -0
- package/src/lib/network/proxyTest.js +158 -0
- package/src/lib/network/proxyUrl.js +76 -0
- package/src/lib/network/relay.js +71 -0
- package/src/lib/oauth/constants/oauth.js +152 -0
- package/src/lib/oauth/constants/xai.js +43 -0
- package/src/lib/oauth/kiroExternalIdp.js +167 -0
- package/src/lib/oauth/providerHelpers.js +90 -0
- package/src/lib/oauth/providers/_shared.js +12 -0
- package/src/lib/oauth/providers/antigravity.js +126 -0
- package/src/lib/oauth/providers/claude.js +60 -0
- package/src/lib/oauth/providers/cline.js +62 -0
- package/src/lib/oauth/providers/clinepass.js +62 -0
- package/src/lib/oauth/providers/codebuddy-cn.js +75 -0
- package/src/lib/oauth/providers/codebuddy-intl.js +73 -0
- package/src/lib/oauth/providers/codex.js +72 -0
- package/src/lib/oauth/providers/cursor.js +18 -0
- package/src/lib/oauth/providers/gemini-cli.js +84 -0
- package/src/lib/oauth/providers/github.js +96 -0
- package/src/lib/oauth/providers/grok-cli.js +123 -0
- package/src/lib/oauth/providers/index.js +233 -0
- package/src/lib/oauth/providers/kilocode.js +60 -0
- package/src/lib/oauth/providers/kimchi.js +79 -0
- package/src/lib/oauth/providers/kimi.js +79 -0
- package/src/lib/oauth/providers/kiro.js +147 -0
- package/src/lib/oauth/providers/qoder.js +90 -0
- package/src/lib/oauth/providers/trae.js +244 -0
- package/src/lib/oauth/providers/windsurf.js +123 -0
- package/src/lib/oauth/providers/xai.js +95 -0
- package/src/lib/oauth/providers.js +16 -0
- package/src/lib/oauth/services/cursor.js +132 -0
- package/src/lib/oauth/services/kiro.js +351 -0
- package/src/lib/oauth/services/oauth.js +135 -0
- package/src/lib/oauth/services/qoder.js +151 -0
- package/src/lib/oauth/services/xai.js +204 -0
- package/src/lib/oauth/utils/ideDetect.js +55 -0
- package/src/lib/oauth/utils/pkce.js +25 -0
- package/src/lib/oauth/utils/server.js +732 -0
- package/src/lib/oauth/utils/ui.js +43 -0
- package/src/lib/providerNormalization.js +40 -0
- package/src/lib/qoder/constants.js +1 -0
- package/src/lib/requestDetailsDb.js +3 -0
- package/src/lib/resourceProfile.ts +124 -0
- package/src/lib/runtimeSecrets.ts +130 -0
- package/src/lib/security/payloadCapture.js +87 -0
- package/src/lib/tunnel/cloudflare/cloudflared.js +436 -0
- package/src/lib/tunnel/cloudflare/config.js +8 -0
- package/src/lib/tunnel/cloudflare/healthCheck.js +37 -0
- package/src/lib/tunnel/cloudflare/manager.js +149 -0
- package/src/lib/tunnel/cloudflare/pid.js +31 -0
- package/src/lib/tunnel/cloudflare/publicUrl.js +41 -0
- package/src/lib/tunnel/cloudflare/requirements.js +12 -0
- package/src/lib/tunnel/index.js +26 -0
- package/src/lib/tunnel/shared/dnsResolver.js +16 -0
- package/src/lib/tunnel/shared/internetCheck.js +30 -0
- package/src/lib/tunnel/shared/state.js +45 -0
- package/src/lib/tunnel/shared/watchdogConfig.js +6 -0
- package/src/lib/update/installer.js +52 -0
- package/src/lib/update/version.js +116 -0
- package/src/lib/usageDb.js +6 -0
- package/src/lib/usageRefresh.js +88 -0
- package/src/lifecycle/appLifecycle.ts +99 -0
- package/src/models.js +36 -0
- package/src/next/headers.js +12 -0
- package/src/next/server.js +74 -0
- package/src/observability/metrics.js +439 -0
- package/src/observability/tracing.js +107 -0
- package/src/open-sse-index.js +70 -0
- package/src/providers/capabilities.js +299 -0
- package/src/providers/display.ts +142 -0
- package/src/providers/index.js +27 -0
- package/src/providers/models/helpers.js +19 -0
- package/src/providers/models/namePatterns.js +27 -0
- package/src/providers/models/schema.js +32 -0
- package/src/providers/pricing.js +248 -0
- package/src/providers/registry/agentrouter.js +52 -0
- package/src/providers/registry/alicode-intl.js +32 -0
- package/src/providers/registry/alicode.js +33 -0
- package/src/providers/registry/alims-intl.js +30 -0
- package/src/providers/registry/anthropic.js +29 -0
- package/src/providers/registry/antigravity.js +139 -0
- package/src/providers/registry/azure.js +23 -0
- package/src/providers/registry/baidu.js +35 -0
- package/src/providers/registry/blackbox.js +41 -0
- package/src/providers/registry/byteplus.js +36 -0
- package/src/providers/registry/cerebras.js +33 -0
- package/src/providers/registry/chutes.js +26 -0
- package/src/providers/registry/claude.js +80 -0
- package/src/providers/registry/cline.js +53 -0
- package/src/providers/registry/clinepass.js +62 -0
- package/src/providers/registry/cloudflare-ai.js +84 -0
- package/src/providers/registry/codebuddy-cn.js +95 -0
- package/src/providers/registry/codebuddy-intl.js +91 -0
- package/src/providers/registry/codex.js +145 -0
- package/src/providers/registry/commandcode.js +45 -0
- package/src/providers/registry/cursor.js +61 -0
- package/src/providers/registry/deepseek.js +55 -0
- package/src/providers/registry/featherless.js +36 -0
- package/src/providers/registry/fireworks.js +34 -0
- package/src/providers/registry/gemini-cli.js +59 -0
- package/src/providers/registry/gemini.js +76 -0
- package/src/providers/registry/github.js +131 -0
- package/src/providers/registry/glm-cn.js +35 -0
- package/src/providers/registry/glm.js +58 -0
- package/src/providers/registry/grok-cli.js +87 -0
- package/src/providers/registry/grok-web.js +41 -0
- package/src/providers/registry/groq.js +38 -0
- package/src/providers/registry/index.js +77 -0
- package/src/providers/registry/kilo-gateway.js +34 -0
- package/src/providers/registry/kilocode.js +48 -0
- package/src/providers/registry/kimchi.js +49 -0
- package/src/providers/registry/kimi.js +82 -0
- package/src/providers/registry/kiro.js +132 -0
- package/src/providers/registry/meta.js +34 -0
- package/src/providers/registry/minimax-cn.js +90 -0
- package/src/providers/registry/minimax.js +90 -0
- package/src/providers/registry/mistral.js +36 -0
- package/src/providers/registry/morph.js +31 -0
- package/src/providers/registry/nebius.js +26 -0
- package/src/providers/registry/nvidia.js +55 -0
- package/src/providers/registry/ollama-local.js +18 -0
- package/src/providers/registry/ollama.js +38 -0
- package/src/providers/registry/openai.js +114 -0
- package/src/providers/registry/opencode-go.js +41 -0
- package/src/providers/registry/opencode.js +26 -0
- package/src/providers/registry/openrouter.js +36 -0
- package/src/providers/registry/perplexity.js +56 -0
- package/src/providers/registry/poolside.js +30 -0
- package/src/providers/registry/qoder.js +58 -0
- package/src/providers/registry/sumopod.js +84 -0
- package/src/providers/registry/tencent.js +29 -0
- package/src/providers/registry/together.js +38 -0
- package/src/providers/registry/trae.js +71 -0
- package/src/providers/registry/venice.js +69 -0
- package/src/providers/registry/vercel-ai-gateway.js +37 -0
- package/src/providers/registry/vertex-partner.js +31 -0
- package/src/providers/registry/vertex.js +33 -0
- package/src/providers/registry/windsurf.js +129 -0
- package/src/providers/registry/xai.js +46 -0
- package/src/providers/registry/xiaomi-mimo.js +66 -0
- package/src/providers/registry/xiaomi-tokenplan.js +58 -0
- package/src/providers/registryEntry.js +3 -0
- package/src/providers/schema.js +33 -0
- package/src/providers/shared.js +114 -0
- package/src/providers/thinkingLevels.js +49 -0
- package/src/routes/api/auth/login/route.js +82 -0
- package/src/routes/api/auth/logout/route.js +9 -0
- package/src/routes/api/auth/reset-password/route.js +12 -0
- package/src/routes/api/auth/status/route.js +33 -0
- package/src/routes/api/auth/verify-password/route.js +39 -0
- package/src/routes/api/chat/tools/curl/route.js +100 -0
- package/src/routes/api/chat/tools/router/route.js +215 -0
- package/src/routes/api/chat/tools/search/route.js +362 -0
- package/src/routes/api/chat/tools/shell/route.js +228 -0
- package/src/routes/api/cli-tools/all-statuses/route.js +37 -0
- package/src/routes/api/cli-tools/claude-settings/route.js +261 -0
- package/src/routes/api/cli-tools/codex-settings/route.js +220 -0
- package/src/routes/api/cli-tools/cowork-mcp-registry/route.js +80 -0
- package/src/routes/api/cli-tools/cowork-mcp-tools/route.js +96 -0
- package/src/routes/api/cli-tools/cowork-settings/route.js +380 -0
- package/src/routes/api/cli-tools/grok-build-settings/route.js +152 -0
- package/src/routes/api/cli-tools/hermes-settings/route.js +169 -0
- package/src/routes/api/cli-tools/kilo-settings/route.js +131 -0
- package/src/routes/api/cli-tools/model-mappings/route.js +43 -0
- package/src/routes/api/cli-tools/omp-settings/route.js +266 -0
- package/src/routes/api/cli-tools/opencode-settings/route.js +243 -0
- package/src/routes/api/combos/[id]/route.js +73 -0
- package/src/routes/api/combos/route.js +43 -0
- package/src/routes/api/health/live/route.js +7 -0
- package/src/routes/api/health/ready/route.js +19 -0
- package/src/routes/api/health/route.js +17 -0
- package/src/routes/api/inflight/stream/route.js +24 -0
- package/src/routes/api/init/route.js +3 -0
- package/src/routes/api/keys/[id]/route.js +71 -0
- package/src/routes/api/keys/route.js +41 -0
- package/src/routes/api/logs/route.js +19 -0
- package/src/routes/api/mcp/[plugin]/message/route.js +23 -0
- package/src/routes/api/mcp/[plugin]/sse/route.js +35 -0
- package/src/routes/api/models/availability/route.js +104 -0
- package/src/routes/api/models/custom/route.js +58 -0
- package/src/routes/api/models/disabled/route.js +47 -0
- package/src/routes/api/models/route.js +64 -0
- package/src/routes/api/models/test/ping.js +236 -0
- package/src/routes/api/models/test/route.js +14 -0
- package/src/routes/api/oauth/[provider]/[action]/route.js +491 -0
- package/src/routes/api/oauth/codex/bulk-import/route.js +105 -0
- package/src/routes/api/oauth/codex/import-token/route.js +82 -0
- package/src/routes/api/oauth/cursor/auto-import/route.js +250 -0
- package/src/routes/api/oauth/cursor/import/route.js +86 -0
- package/src/routes/api/oauth/kiro/api-key/route.js +60 -0
- package/src/routes/api/oauth/kiro/auto-import/route.js +120 -0
- package/src/routes/api/oauth/kiro/import/route.js +72 -0
- package/src/routes/api/oauth/kiro/import-cli-proxy/route.js +42 -0
- package/src/routes/api/oauth/kiro/social-authorize/route.js +40 -0
- package/src/routes/api/oauth/kiro/social-exchange/route.js +62 -0
- package/src/routes/api/pricing/route.js +96 -0
- package/src/routes/api/provider-nodes/[id]/route.js +106 -0
- package/src/routes/api/provider-nodes/route.js +110 -0
- package/src/routes/api/provider-nodes/validate/route.js +197 -0
- package/src/routes/api/providers/[id]/models/route.js +716 -0
- package/src/routes/api/providers/[id]/route.js +195 -0
- package/src/routes/api/providers/[id]/test/route.js +27 -0
- package/src/routes/api/providers/[id]/test/testUtils.js +912 -0
- package/src/routes/api/providers/[id]/test-models/route.js +211 -0
- package/src/routes/api/providers/catalog/route.js +58 -0
- package/src/routes/api/providers/client/route.js +133 -0
- package/src/routes/api/providers/counts/route.js +43 -0
- package/src/routes/api/providers/kilo/free-models/route.js +58 -0
- package/src/routes/api/providers/route.js +361 -0
- package/src/routes/api/providers/suggested-models/filters.js +24 -0
- package/src/routes/api/providers/suggested-models/route.js +34 -0
- package/src/routes/api/providers/test-batch/route.js +145 -0
- package/src/routes/api/providers/validate/route.js +633 -0
- package/src/routes/api/proxy-pools/[id]/route.js +129 -0
- package/src/routes/api/proxy-pools/[id]/test/route.js +64 -0
- package/src/routes/api/proxy-pools/cloudflare-deploy/route.js +183 -0
- package/src/routes/api/proxy-pools/route.js +85 -0
- package/src/routes/api/proxy-pools/vercel-deploy/route.js +181 -0
- package/src/routes/api/settings/currency/route.js +29 -0
- package/src/routes/api/settings/database/path/route.js +8 -0
- package/src/routes/api/settings/database/route.js +89 -0
- package/src/routes/api/settings/migrate-9router/route.js +81 -0
- package/src/routes/api/settings/require-login/route.js +14 -0
- package/src/routes/api/settings/route.js +186 -0
- package/src/routes/api/shutdown/route.js +25 -0
- package/src/routes/api/tags/route.js +17 -0
- package/src/routes/api/translator/console-logs/route.js +28 -0
- package/src/routes/api/translator/console-logs/stream/route.js +95 -0
- package/src/routes/api/tunnel/disable/route.js +18 -0
- package/src/routes/api/tunnel/enable/route.js +32 -0
- package/src/routes/api/tunnel/status/route.js +23 -0
- package/src/routes/api/update/route.js +42 -0
- package/src/routes/api/usage/[connectionId]/codex-reset-credits/route.js +169 -0
- package/src/routes/api/usage/[connectionId]/route.js +222 -0
- package/src/routes/api/usage/chart/route.js +27 -0
- package/src/routes/api/usage/history/route.js +94 -0
- package/src/routes/api/usage/logs/route.js +14 -0
- package/src/routes/api/usage/providers/route.js +36 -0
- package/src/routes/api/usage/request-details/route.js +61 -0
- package/src/routes/api/usage/request-logs/route.js +15 -0
- package/src/routes/api/usage/stats/route.js +23 -0
- package/src/routes/api/usage/stream/route.js +78 -0
- package/src/routes/api/v1/api/chat/route.js +36 -0
- package/src/routes/api/v1/chat/completions/route.js +28 -0
- package/src/routes/api/v1/images/edits/route.js +70 -0
- package/src/routes/api/v1/images/generations/route.js +50 -0
- package/src/routes/api/v1/images/imageValidation.js +45 -0
- package/src/routes/api/v1/messages/count_tokens/route.js +87 -0
- package/src/routes/api/v1/messages/route.js +26 -0
- package/src/routes/api/v1/models/route.js +440 -0
- package/src/routes/api/v1/responses/compact/route.js +34 -0
- package/src/routes/api/v1/responses/route.js +26 -0
- package/src/routes/api/v1/route.js +1 -0
- package/src/routes/api/version/route.js +11 -0
- package/src/routes/table.js +1141 -0
- package/src/rtk/applyFilter.js +13 -0
- package/src/rtk/autodetect.js +104 -0
- package/src/rtk/caveman.js +6 -0
- package/src/rtk/cavemanPrompts.js +107 -0
- package/src/rtk/constants.js +51 -0
- package/src/rtk/filters/buildOutput.js +120 -0
- package/src/rtk/filters/dedupLog.js +43 -0
- package/src/rtk/filters/find.js +47 -0
- package/src/rtk/filters/gitDiff.js +90 -0
- package/src/rtk/filters/gitLog.js +88 -0
- package/src/rtk/filters/gitStatus.js +101 -0
- package/src/rtk/filters/grep.js +45 -0
- package/src/rtk/filters/ls.js +73 -0
- package/src/rtk/filters/readNumbered.js +22 -0
- package/src/rtk/filters/searchList.js +49 -0
- package/src/rtk/filters/smartTruncate.js +13 -0
- package/src/rtk/filters/tree.js +28 -0
- package/src/rtk/index.js +143 -0
- package/src/rtk/ponytail.js +6 -0
- package/src/rtk/ponytailPrompt.js +49 -0
- package/src/rtk/systemInject.js +89 -0
- package/src/server.ts +474 -0
- package/src/services/accountFallback.js +241 -0
- package/src/services/accountPool.js +389 -0
- package/src/services/capacityAdapter.js +140 -0
- package/src/services/cliModelMapping.js +84 -0
- package/src/services/clinepassModels.js +60 -0
- package/src/services/codebuddyModels.js +250 -0
- package/src/services/combo.js +482 -0
- package/src/services/copilotModels.js +126 -0
- package/src/services/currencyRate.js +56 -0
- package/src/services/cursorModels.js +197 -0
- package/src/services/grokCliModels.js +130 -0
- package/src/services/kimchiModels.js +175 -0
- package/src/services/kiroModels.js +246 -0
- package/src/services/model.js +83 -0
- package/src/services/oauthCredentialManager.js +153 -0
- package/src/services/projectId.js +240 -0
- package/src/services/provider.js +145 -0
- package/src/services/qoderModels.js +274 -0
- package/src/services/tokenRefresh/dedup.js +70 -0
- package/src/services/tokenRefresh/providers.js +626 -0
- package/src/services/tokenRefresh.js +274 -0
- package/src/services/usage/claude.js +134 -0
- package/src/services/usage/codebuddy-cn.js +212 -0
- package/src/services/usage/codex.js +193 -0
- package/src/services/usage/deepseek.js +103 -0
- package/src/services/usage/github.js +94 -0
- package/src/services/usage/google.js +218 -0
- package/src/services/usage/grok-cli.js +368 -0
- package/src/services/usage/grokCliQuotaFrame.js +170 -0
- package/src/services/usage/kimi.js +185 -0
- package/src/services/usage/kiro.js +172 -0
- package/src/services/usage/minimax.js +215 -0
- package/src/services/usage/misc.js +264 -0
- package/src/services/usage/shared.js +59 -0
- package/src/services/usage.js +56 -0
- package/src/shared/clineAuth.js +37 -0
- package/src/shared/constants/config.js +80 -0
- package/src/shared/constants/coworkPlugins.js +69 -0
- package/src/shared/constants/models.js +41 -0
- package/src/shared/constants/providers.js +128 -0
- package/src/shared/constants/providersDisplay.js +1 -0
- package/src/shared/qoder/constants.js +50 -0
- package/src/shared/qoder/cosy.js +134 -0
- package/src/shared/qoder/encoding.js +36 -0
- package/src/shared/services/initializeApp.js +226 -0
- package/src/shared/services/quotaAutoPing.js +310 -0
- package/src/shared/utils/apiKey.js +65 -0
- package/src/shared/utils/clineAuth.js +1 -0
- package/src/shared/utils/index.js +3 -0
- package/src/shared/utils/machineId.js +60 -0
- package/src/shared/utils/ssrfGuard.js +280 -0
- package/src/sse/handlers/chat.js +426 -0
- package/src/sse/oauthLease.js +32 -0
- package/src/sse/recovery.js +235 -0
- package/src/sse/services/auth.js +489 -0
- package/src/sse/services/backgroundTokenRefresh.js +173 -0
- package/src/sse/services/model.js +129 -0
- package/src/sse/services/requestCancellation.js +4 -0
- package/src/sse/services/tokenRefresh.js +264 -0
- package/src/sse/utils/logger.js +142 -0
- package/src/staticServe.ts +95 -0
- package/src/transformer/streamToJsonConverter.js +87 -0
- package/src/translator/canonical.js +81 -0
- package/src/translator/concerns/chunk.js +9 -0
- package/src/translator/concerns/compatFallback.js +147 -0
- package/src/translator/concerns/finishReason.js +59 -0
- package/src/translator/concerns/image.js +105 -0
- package/src/translator/concerns/json.js +4 -0
- package/src/translator/concerns/kiroConversation.js +428 -0
- package/src/translator/concerns/message.js +5 -0
- package/src/translator/concerns/modality.js +134 -0
- package/src/translator/concerns/paramSupport.js +97 -0
- package/src/translator/concerns/prefetch.js +86 -0
- package/src/translator/concerns/reasoning.js +18 -0
- package/src/translator/concerns/thinking.js +40 -0
- package/src/translator/concerns/thinkingUnified.js +319 -0
- package/src/translator/concerns/toolCall.js +134 -0
- package/src/translator/concerns/usage.js +61 -0
- package/src/translator/detection.js +42 -0
- package/src/translator/formats/claude.js +323 -0
- package/src/translator/formats/gemini.js +366 -0
- package/src/translator/formats/maxTokens.js +19 -0
- package/src/translator/formats/openai.js +116 -0
- package/src/translator/formats/responsesApi.js +117 -0
- package/src/translator/formats.js +28 -0
- package/src/translator/index.js +237 -0
- package/src/translator/request/antigravity-to-openai.js +217 -0
- package/src/translator/request/claude-to-kiro.js +288 -0
- package/src/translator/request/claude-to-openai.js +199 -0
- package/src/translator/request/gemini-to-openai.js +142 -0
- package/src/translator/request/openai-responses.js +373 -0
- package/src/translator/request/openai-to-claude.js +260 -0
- package/src/translator/request/openai-to-commandcode.js +161 -0
- package/src/translator/request/openai-to-cursor.js +175 -0
- package/src/translator/request/openai-to-gemini.js +422 -0
- package/src/translator/request/openai-to-kiro.js +360 -0
- package/src/translator/request/openai-to-ollama.js +152 -0
- package/src/translator/request/openai-to-vertex.js +36 -0
- package/src/translator/response/claude-to-openai.js +185 -0
- package/src/translator/response/commandcode-to-openai.js +164 -0
- package/src/translator/response/cursor-to-openai.js +18 -0
- package/src/translator/response/gemini-to-openai.js +127 -0
- package/src/translator/response/kiro-to-claude.js +230 -0
- package/src/translator/response/kiro-to-openai.js +136 -0
- package/src/translator/response/ollama-to-openai.js +106 -0
- package/src/translator/response/openai-responses.js +534 -0
- package/src/translator/response/openai-to-antigravity.js +107 -0
- package/src/translator/response/openai-to-claude.js +231 -0
- package/src/translator/schema/blocks.js +40 -0
- package/src/translator/schema/defaults.js +3 -0
- package/src/translator/schema/finishReasons.js +22 -0
- package/src/translator/schema/index.js +7 -0
- package/src/translator/schema/roles.js +12 -0
- package/src/transport/requestBoundary.ts +223 -0
- package/src/transport/routerAdmission.ts +380 -0
- package/src/types/provider.ts +59 -0
- package/src/utils/bypassHandler.js +272 -0
- package/src/utils/claudeCloaking.js +10 -0
- package/src/utils/claudeSignature.js +35 -0
- package/src/utils/clientDetector.js +183 -0
- package/src/utils/cursorChecksum.js +104 -0
- package/src/utils/cursorProtobuf.js +801 -0
- package/src/utils/debugLog.js +12 -0
- package/src/utils/error.js +120 -0
- package/src/utils/inflight.js +127 -0
- package/src/utils/kiroSessionReplay.js +139 -0
- package/src/utils/ollamaTransform.js +83 -0
- package/src/utils/proxyFetch.js +308 -0
- package/src/utils/reasoningContentInjector.js +71 -0
- package/src/utils/requestLogger.js +272 -0
- package/src/utils/responsesStreamHelpers.js +46 -0
- package/src/utils/sessionManager.js +205 -0
- package/src/utils/sse.js +13 -0
- package/src/utils/sseConstants.js +21 -0
- package/src/utils/stream.js +511 -0
- package/src/utils/streamHandler.js +256 -0
- package/src/utils/streamHelpers.js +113 -0
- package/src/utils/toolDeduper.js +44 -0
- package/src/utils/usageTracking.js +329 -0
- package/tsconfig.json +45 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getComboById, updateCombo, deleteCombo, getComboByName } from "@/lib/localDb";
|
|
3
|
+
import { resetComboRotation } from "open-sse/services/combo.js";
|
|
4
|
+
|
|
5
|
+
const VALID_NAME_REGEX = /^[a-zA-Z0-9_.\-]+$/;
|
|
6
|
+
|
|
7
|
+
export async function GET(request, { params }) {
|
|
8
|
+
try {
|
|
9
|
+
const { id } = await params;
|
|
10
|
+
const combo = await getComboById(id);
|
|
11
|
+
|
|
12
|
+
if (!combo) {
|
|
13
|
+
return NextResponse.json({ error: "Combo not found" }, { status: 404 });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return NextResponse.json(combo);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.log("Error fetching combo:", error);
|
|
19
|
+
return NextResponse.json({ error: "Failed to fetch combo" }, { status: 500 });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function PUT(request, { params }) {
|
|
24
|
+
try {
|
|
25
|
+
const { id } = await params;
|
|
26
|
+
const body = await request.json();
|
|
27
|
+
|
|
28
|
+
if (body.name) {
|
|
29
|
+
if (!VALID_NAME_REGEX.test(body.name)) {
|
|
30
|
+
return NextResponse.json({ error: "Name can only contain letters, numbers, -, _ and ." }, { status: 400 });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const existing = await getComboByName(body.name);
|
|
34
|
+
if (existing && existing.id !== id) {
|
|
35
|
+
return NextResponse.json({ error: "Combo name already exists" }, { status: 400 });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const prev = await getComboById(id);
|
|
40
|
+
const combo = await updateCombo(id, body);
|
|
41
|
+
|
|
42
|
+
if (!combo) {
|
|
43
|
+
return NextResponse.json({ error: "Combo not found" }, { status: 404 });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (prev?.name) resetComboRotation(prev.name);
|
|
47
|
+
if (combo.name && combo.name !== prev?.name) resetComboRotation(combo.name);
|
|
48
|
+
|
|
49
|
+
return NextResponse.json(combo);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.log("Error updating combo:", error);
|
|
52
|
+
return NextResponse.json({ error: "Failed to update combo" }, { status: 500 });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function DELETE(request, { params }) {
|
|
57
|
+
try {
|
|
58
|
+
const { id } = await params;
|
|
59
|
+
const prev = await getComboById(id);
|
|
60
|
+
const success = await deleteCombo(id);
|
|
61
|
+
|
|
62
|
+
if (!success) {
|
|
63
|
+
return NextResponse.json({ error: "Combo not found" }, { status: 404 });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (prev?.name) resetComboRotation(prev.name);
|
|
67
|
+
|
|
68
|
+
return NextResponse.json({ success: true });
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.log("Error deleting combo:", error);
|
|
71
|
+
return NextResponse.json({ error: "Failed to delete combo" }, { status: 500 });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getCombos, createCombo, getComboByName } from "@/lib/localDb";
|
|
3
|
+
|
|
4
|
+
export const dynamic = "force-dynamic";
|
|
5
|
+
|
|
6
|
+
const VALID_NAME_REGEX = /^[a-zA-Z0-9_.\-]+$/;
|
|
7
|
+
|
|
8
|
+
export async function GET() {
|
|
9
|
+
try {
|
|
10
|
+
const combos = await getCombos();
|
|
11
|
+
return NextResponse.json({ combos });
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.log("Error fetching combos:", error);
|
|
14
|
+
return NextResponse.json({ error: "Failed to fetch combos" }, { status: 500 });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function POST(request) {
|
|
19
|
+
try {
|
|
20
|
+
const body = await request.json();
|
|
21
|
+
const { name, models, kind } = body;
|
|
22
|
+
|
|
23
|
+
if (!name) {
|
|
24
|
+
return NextResponse.json({ error: "Name is required" }, { status: 400 });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!VALID_NAME_REGEX.test(name)) {
|
|
28
|
+
return NextResponse.json({ error: "Name can only contain letters, numbers, -, _ and ." }, { status: 400 });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const existing = await getComboByName(name);
|
|
32
|
+
if (existing) {
|
|
33
|
+
return NextResponse.json({ error: "Combo name already exists" }, { status: 400 });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const combo = await createCombo({ name, models: models || [], kind: kind || null });
|
|
37
|
+
|
|
38
|
+
return NextResponse.json(combo, { status: 201 });
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.log("Error creating combo:", error);
|
|
41
|
+
return NextResponse.json({ error: "Failed to create combo" }, { status: 500 });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getAdapter } from "@/lib/db/driver.js";
|
|
3
|
+
import { getLifecycleSnapshot } from "@/lifecycle/appLifecycle";
|
|
4
|
+
|
|
5
|
+
const HEADERS = { "Cache-Control": "no-store" };
|
|
6
|
+
|
|
7
|
+
export async function GET() {
|
|
8
|
+
const lifecycle = getLifecycleSnapshot();
|
|
9
|
+
if (lifecycle.state !== "ready") {
|
|
10
|
+
return NextResponse.json({ ok: false, status: "not_ready" }, { status: 503, headers: HEADERS });
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const db = await getAdapter();
|
|
14
|
+
db.get("SELECT 1 AS ok");
|
|
15
|
+
return NextResponse.json({ ok: true, status: "ready" }, { headers: HEADERS });
|
|
16
|
+
} catch {
|
|
17
|
+
return NextResponse.json({ ok: false, status: "not_ready" }, { status: 503, headers: HEADERS });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
|
|
3
|
+
const CORS_HEADERS = {
|
|
4
|
+
"Cache-Control": "no-store",
|
|
5
|
+
|
|
6
|
+
"Access-Control-Allow-Origin": "*",
|
|
7
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS",
|
|
8
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization, X-Api-Key",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export async function GET() {
|
|
12
|
+
return NextResponse.json({ ok: true }, { headers: CORS_HEADERS });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function OPTIONS() {
|
|
16
|
+
return new NextResponse(null, { status: 204, headers: CORS_HEADERS });
|
|
17
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createInflightStream } from "@/utils/inflight";
|
|
2
|
+
|
|
3
|
+
export async function GET(request) {
|
|
4
|
+
const { stream, status, cleanup } = createInflightStream();
|
|
5
|
+
|
|
6
|
+
if (status === 429 || !stream) {
|
|
7
|
+
return new Response(
|
|
8
|
+
JSON.stringify({ error: "Too many SSE connections", maxClients: 10 }),
|
|
9
|
+
{ status: 429, headers: { "Content-Type": "application/json" } }
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
request.signal?.addEventListener("abort", () => cleanup());
|
|
14
|
+
|
|
15
|
+
return new Response(stream, {
|
|
16
|
+
status: 200,
|
|
17
|
+
headers: {
|
|
18
|
+
"Content-Type": "text/event-stream",
|
|
19
|
+
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
20
|
+
"Connection": "keep-alive",
|
|
21
|
+
"X-Accel-Buffering": "no",
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { deleteApiKey, getApiKeyById, getApiKeySecretById, rotateApiKey, updateApiKey } from "@/lib/localDb";
|
|
3
|
+
|
|
4
|
+
export async function GET(request, { params }) {
|
|
5
|
+
try {
|
|
6
|
+
const { id } = await params;
|
|
7
|
+
const key = await getApiKeyById(id);
|
|
8
|
+
if (!key) {
|
|
9
|
+
return NextResponse.json({ error: "Key not found" }, { status: 404 });
|
|
10
|
+
}
|
|
11
|
+
const secret = await getApiKeySecretById(id);
|
|
12
|
+
return NextResponse.json({ key: secret ? { ...key, key: secret } : key });
|
|
13
|
+
} catch (error) {
|
|
14
|
+
console.log("Error fetching key:", error);
|
|
15
|
+
return NextResponse.json({ error: "Failed to fetch key" }, { status: 500 });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function PUT(request, { params }) {
|
|
20
|
+
try {
|
|
21
|
+
const { id } = await params;
|
|
22
|
+
const body = await request.json();
|
|
23
|
+
const { isActive, rotate } = body;
|
|
24
|
+
|
|
25
|
+
if (isActive !== undefined && typeof isActive !== "boolean") {
|
|
26
|
+
return NextResponse.json({ error: "isActive must be a boolean" }, { status: 400 });
|
|
27
|
+
}
|
|
28
|
+
if (rotate !== undefined && typeof rotate !== "boolean") {
|
|
29
|
+
return NextResponse.json({ error: "rotate must be a boolean" }, { status: 400 });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const existing = await getApiKeyById(id);
|
|
33
|
+
if (!existing) {
|
|
34
|
+
return NextResponse.json({ error: "Key not found" }, { status: 404 });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (rotate === true) {
|
|
38
|
+
const rotated = await rotateApiKey(id);
|
|
39
|
+
return NextResponse.json({ key: rotated, message: "API key rotated. Replace the old secret in your clients." });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const updateData = {};
|
|
43
|
+
if (isActive !== undefined) updateData.isActive = isActive;
|
|
44
|
+
|
|
45
|
+
const updated = await updateApiKey(id, updateData);
|
|
46
|
+
|
|
47
|
+
return NextResponse.json({ key: updated });
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.log("Error updating key:", error);
|
|
50
|
+
return NextResponse.json({ error: "Failed to update key" }, { status: 500 });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function DELETE(request, { params }) {
|
|
55
|
+
try {
|
|
56
|
+
const { id } = await params;
|
|
57
|
+
|
|
58
|
+
const deleted = await deleteApiKey(id);
|
|
59
|
+
if (!deleted) {
|
|
60
|
+
return NextResponse.json({ error: "Key not found" }, { status: 404 });
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return NextResponse.json({ message: "Key deleted successfully" });
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.log("Error deleting key:", error);
|
|
66
|
+
if (error?.code === "DEFAULT_API_KEY") {
|
|
67
|
+
return NextResponse.json({ error: error.message }, { status: 409 });
|
|
68
|
+
}
|
|
69
|
+
return NextResponse.json({ error: "Failed to delete key" }, { status: 500 });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getApiKeys, createApiKey } from "@/lib/localDb";
|
|
3
|
+
import { getConsistentMachineId } from "@/shared/utils/machineId";
|
|
4
|
+
|
|
5
|
+
export const dynamic = "force-dynamic";
|
|
6
|
+
|
|
7
|
+
export async function GET(request) {
|
|
8
|
+
try {
|
|
9
|
+
const keys = await getApiKeys();
|
|
10
|
+
const includeRevoked = new URL(request.url).searchParams.get("includeRevoked") === "1";
|
|
11
|
+
return NextResponse.json({ keys: includeRevoked ? keys : keys.filter((key) => key.isActive !== false) });
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.log("Error fetching keys:", error);
|
|
14
|
+
return NextResponse.json({ error: "Failed to fetch keys" }, { status: 500 });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function POST(request) {
|
|
19
|
+
try {
|
|
20
|
+
const body = await request.json();
|
|
21
|
+
const { name } = body;
|
|
22
|
+
|
|
23
|
+
if (!name) {
|
|
24
|
+
return NextResponse.json({ error: "Name is required" }, { status: 400 });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const machineId = await getConsistentMachineId();
|
|
28
|
+
const apiKey = await createApiKey(name, machineId);
|
|
29
|
+
|
|
30
|
+
return NextResponse.json({
|
|
31
|
+
key: apiKey.key,
|
|
32
|
+
name: apiKey.name,
|
|
33
|
+
id: apiKey.id,
|
|
34
|
+
machineId: apiKey.machineId,
|
|
35
|
+
isDefault: apiKey.isDefault === true,
|
|
36
|
+
}, { status: 201 });
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.log("Error creating key:", error);
|
|
39
|
+
return NextResponse.json({ error: "Failed to create key" }, { status: 500 });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { searchLogs } from "@/lib/usageDb.js";
|
|
2
|
+
|
|
3
|
+
export async function GET(request) {
|
|
4
|
+
const url = new URL(request.url);
|
|
5
|
+
const qp = url.searchParams;
|
|
6
|
+
|
|
7
|
+
const result = await searchLogs({
|
|
8
|
+
page: qp.get("page") || 1,
|
|
9
|
+
limit: qp.get("limit") || 50,
|
|
10
|
+
provider: qp.get("provider") || undefined,
|
|
11
|
+
model: qp.get("model") || undefined,
|
|
12
|
+
status: qp.get("status") || undefined,
|
|
13
|
+
q: qp.get("q") || undefined,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
return new Response(JSON.stringify(result), {
|
|
17
|
+
headers: { "Content-Type": "application/json" },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { sendToChild, findPlugin } from "@/lib/mcp/stdioSseBridge";
|
|
3
|
+
import { logRouteError, publicError } from "@/lib/errors/publicError";
|
|
4
|
+
|
|
5
|
+
const MCP_MESSAGE_ERROR = publicError("provider", "MCP message failed");
|
|
6
|
+
|
|
7
|
+
export const runtime = "nodejs";
|
|
8
|
+
export const dynamic = "force-dynamic";
|
|
9
|
+
|
|
10
|
+
export async function POST(request, { params }) {
|
|
11
|
+
const { plugin } = await params;
|
|
12
|
+
if (!findPlugin(plugin)) {
|
|
13
|
+
return NextResponse.json({ error: `Unknown plugin: ${plugin}` }, { status: 404 });
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const body = await request.json();
|
|
17
|
+
sendToChild(plugin, body);
|
|
18
|
+
return new Response(null, { status: 202 });
|
|
19
|
+
} catch (e) {
|
|
20
|
+
logRouteError("McpMessage", e);
|
|
21
|
+
return NextResponse.json({ error: MCP_MESSAGE_ERROR }, { status: 500 });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { registerSession, unregisterSession, findPlugin } from "@/lib/mcp/stdioSseBridge";
|
|
2
|
+
|
|
3
|
+
export const runtime = "nodejs";
|
|
4
|
+
export const dynamic = "force-dynamic";
|
|
5
|
+
|
|
6
|
+
export async function GET(request, { params }) {
|
|
7
|
+
const { plugin } = await params;
|
|
8
|
+
if (!findPlugin(plugin)) {
|
|
9
|
+
return new Response(`Unknown plugin: ${plugin}`, { status: 404 });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
let sid;
|
|
14
|
+
|
|
15
|
+
const stream = new ReadableStream({
|
|
16
|
+
start(controller) {
|
|
17
|
+
const send = (chunk) => controller.enqueue(encoder.encode(chunk));
|
|
18
|
+
sid = registerSession(plugin, send);
|
|
19
|
+
|
|
20
|
+
send(`event: endpoint\ndata: /api/mcp/${plugin}/message?sessionId=${sid}\n\n`);
|
|
21
|
+
},
|
|
22
|
+
cancel() {
|
|
23
|
+
if (sid) unregisterSession(plugin, sid);
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return new Response(stream, {
|
|
28
|
+
headers: {
|
|
29
|
+
"Content-Type": "text/event-stream",
|
|
30
|
+
"Cache-Control": "no-cache, no-transform",
|
|
31
|
+
Connection: "keep-alive",
|
|
32
|
+
"X-Accel-Buffering": "no",
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import {
|
|
3
|
+
getProviderConnectionsForRouting,
|
|
4
|
+
updateProviderConnection,
|
|
5
|
+
} from "@/lib/localDb";
|
|
6
|
+
|
|
7
|
+
const MODEL_LOCK_PREFIX = "modelLock_";
|
|
8
|
+
|
|
9
|
+
function getActiveModelLocks(connection) {
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
return Object.entries(connection)
|
|
12
|
+
.filter(([key, value]) => key.startsWith(MODEL_LOCK_PREFIX) && value)
|
|
13
|
+
.map(([key, value]) => ({
|
|
14
|
+
key,
|
|
15
|
+
model: key.slice(MODEL_LOCK_PREFIX.length) || "__all",
|
|
16
|
+
until: value,
|
|
17
|
+
active: new Date(value).getTime() > now,
|
|
18
|
+
}))
|
|
19
|
+
.filter((lock) => lock.active);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function GET() {
|
|
23
|
+
try {
|
|
24
|
+
|
|
25
|
+
const connections = await getProviderConnectionsForRouting({ isActive: true });
|
|
26
|
+
const models = [];
|
|
27
|
+
|
|
28
|
+
for (const connection of connections) {
|
|
29
|
+
const locks = getActiveModelLocks(connection);
|
|
30
|
+
for (const lock of locks) {
|
|
31
|
+
models.push({
|
|
32
|
+
provider: connection.provider,
|
|
33
|
+
model: lock.model,
|
|
34
|
+
status: "cooldown",
|
|
35
|
+
until: lock.until,
|
|
36
|
+
connectionId: connection.id,
|
|
37
|
+
connectionName: connection.name || connection.email || connection.id,
|
|
38
|
+
lastError: connection.lastError || null,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (locks.length === 0 && connection.testStatus === "unavailable") {
|
|
43
|
+
models.push({
|
|
44
|
+
provider: connection.provider,
|
|
45
|
+
model: "__all",
|
|
46
|
+
status: "unavailable",
|
|
47
|
+
connectionId: connection.id,
|
|
48
|
+
connectionName: connection.name || connection.email || connection.id,
|
|
49
|
+
lastError: connection.lastError || null,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return NextResponse.json({
|
|
55
|
+
models,
|
|
56
|
+
unavailableCount: models.length,
|
|
57
|
+
});
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error("[API] Failed to get model availability:", error);
|
|
60
|
+
return NextResponse.json(
|
|
61
|
+
{ error: "Failed to fetch model availability" },
|
|
62
|
+
{ status: 500 },
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function POST(request) {
|
|
68
|
+
try {
|
|
69
|
+
const { action, provider, model } = await request.json();
|
|
70
|
+
|
|
71
|
+
if (action !== "clearCooldown" || !provider || !model) {
|
|
72
|
+
return NextResponse.json({ error: "Invalid request" }, { status: 400 });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const connections = await getProviderConnectionsForRouting({ provider });
|
|
76
|
+
const lockKey = `${MODEL_LOCK_PREFIX}${model}`;
|
|
77
|
+
|
|
78
|
+
await Promise.all(
|
|
79
|
+
connections
|
|
80
|
+
.filter((connection) => connection[lockKey])
|
|
81
|
+
.map((connection) =>
|
|
82
|
+
updateProviderConnection(connection.id, {
|
|
83
|
+
[lockKey]: null,
|
|
84
|
+
...(connection.testStatus === "unavailable"
|
|
85
|
+
? {
|
|
86
|
+
testStatus: "active",
|
|
87
|
+
lastError: null,
|
|
88
|
+
lastErrorAt: null,
|
|
89
|
+
backoffLevel: 0,
|
|
90
|
+
}
|
|
91
|
+
: {}),
|
|
92
|
+
}),
|
|
93
|
+
),
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
return NextResponse.json({ ok: true });
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error("[API] Failed to clear model cooldown:", error);
|
|
99
|
+
return NextResponse.json(
|
|
100
|
+
{ error: "Failed to clear cooldown" },
|
|
101
|
+
{ status: 500 },
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getCustomModels, addCustomModel, deleteCustomModel } from "@/models";
|
|
3
|
+
import { getCapabilitiesForModel } from "open-sse/providers/capabilities.js";
|
|
4
|
+
import { getThinkingLevels } from "open-sse/providers/thinkingLevels.js";
|
|
5
|
+
import { resolveProviderId } from "@/shared/constants/providers";
|
|
6
|
+
|
|
7
|
+
export const dynamic = "force-dynamic";
|
|
8
|
+
|
|
9
|
+
export async function GET() {
|
|
10
|
+
try {
|
|
11
|
+
const models = await getCustomModels();
|
|
12
|
+
return NextResponse.json({
|
|
13
|
+
models: models.map((model) => {
|
|
14
|
+
const provider = resolveProviderId(model.providerAlias);
|
|
15
|
+
const capabilities = getCapabilitiesForModel(provider, model.id, model.capabilities || null);
|
|
16
|
+
return {
|
|
17
|
+
...model,
|
|
18
|
+
capabilities,
|
|
19
|
+
thinkingLevels: getThinkingLevels(provider, model.id, model.capabilities || null),
|
|
20
|
+
};
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
} catch (error) {
|
|
24
|
+
console.log("Error fetching custom models:", error);
|
|
25
|
+
return NextResponse.json({ error: "Failed to fetch custom models" }, { status: 500 });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function POST(request) {
|
|
30
|
+
try {
|
|
31
|
+
const { providerAlias, id, type, name, capabilities } = await request.json();
|
|
32
|
+
if (!providerAlias || !id) {
|
|
33
|
+
return NextResponse.json({ error: "providerAlias and id required" }, { status: 400 });
|
|
34
|
+
}
|
|
35
|
+
const added = await addCustomModel({ providerAlias, id, type: type || "llm", name, capabilities });
|
|
36
|
+
return NextResponse.json({ success: true, added });
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.log("Error adding custom model:", error);
|
|
39
|
+
return NextResponse.json({ error: "Failed to add custom model" }, { status: 500 });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function DELETE(request) {
|
|
44
|
+
try {
|
|
45
|
+
const { searchParams } = new URL(request.url);
|
|
46
|
+
const providerAlias = searchParams.get("providerAlias");
|
|
47
|
+
const id = searchParams.get("id");
|
|
48
|
+
const type = searchParams.get("type") || "llm";
|
|
49
|
+
if (!providerAlias || !id) {
|
|
50
|
+
return NextResponse.json({ error: "providerAlias and id required" }, { status: 400 });
|
|
51
|
+
}
|
|
52
|
+
await deleteCustomModel({ providerAlias, id, type });
|
|
53
|
+
return NextResponse.json({ success: true });
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.log("Error deleting custom model:", error);
|
|
56
|
+
return NextResponse.json({ error: "Failed to delete custom model" }, { status: 500 });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getDisabledModels, disableModels, enableModels } from "@/lib/disabledModelsDb";
|
|
3
|
+
|
|
4
|
+
export const dynamic = "force-dynamic";
|
|
5
|
+
|
|
6
|
+
export async function GET(request) {
|
|
7
|
+
try {
|
|
8
|
+
const { searchParams } = new URL(request.url);
|
|
9
|
+
const providerAlias = searchParams.get("providerAlias");
|
|
10
|
+
const all = await getDisabledModels();
|
|
11
|
+
if (providerAlias) return NextResponse.json({ ids: all[providerAlias] || [] });
|
|
12
|
+
return NextResponse.json({ disabled: all });
|
|
13
|
+
} catch (error) {
|
|
14
|
+
console.log("Error fetching disabled models:", error);
|
|
15
|
+
return NextResponse.json({ error: "Failed to fetch disabled models" }, { status: 500 });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function POST(request) {
|
|
20
|
+
try {
|
|
21
|
+
const { providerAlias, ids } = await request.json();
|
|
22
|
+
if (!providerAlias || !Array.isArray(ids)) {
|
|
23
|
+
return NextResponse.json({ error: "providerAlias and ids[] required" }, { status: 400 });
|
|
24
|
+
}
|
|
25
|
+
await disableModels(providerAlias, ids);
|
|
26
|
+
return NextResponse.json({ success: true });
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.log("Error disabling models:", error);
|
|
29
|
+
return NextResponse.json({ error: "Failed to disable models" }, { status: 500 });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function DELETE(request) {
|
|
34
|
+
try {
|
|
35
|
+
const { searchParams } = new URL(request.url);
|
|
36
|
+
const providerAlias = searchParams.get("providerAlias");
|
|
37
|
+
const id = searchParams.get("id");
|
|
38
|
+
if (!providerAlias) {
|
|
39
|
+
return NextResponse.json({ error: "providerAlias required" }, { status: 400 });
|
|
40
|
+
}
|
|
41
|
+
await enableModels(providerAlias, id ? [id] : []);
|
|
42
|
+
return NextResponse.json({ success: true });
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.log("Error enabling models:", error);
|
|
45
|
+
return NextResponse.json({ error: "Failed to enable models" }, { status: 500 });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getDisabledModels } from "@/lib/disabledModelsDb";
|
|
3
|
+
import { AI_MODELS } from "@/shared/constants/config";
|
|
4
|
+
import { getProviderAlias, resolveProviderId } from "@/shared/constants/providers";
|
|
5
|
+
import { getCapabilitiesForModel } from "open-sse/providers/capabilities.js";
|
|
6
|
+
import { getThinkingLevels } from "open-sse/providers/thinkingLevels.js";
|
|
7
|
+
|
|
8
|
+
function publicModelId(provider, model) {
|
|
9
|
+
const value = String(model || "").trim();
|
|
10
|
+
if (provider === "clinepass" || provider === "cline-pass") {
|
|
11
|
+
return value.replace(/^(?:clinepass|cline-pass)\//, "");
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function GET() {
|
|
17
|
+
try {
|
|
18
|
+
const disabled = await getDisabledModels();
|
|
19
|
+
|
|
20
|
+
const models = AI_MODELS
|
|
21
|
+
.filter((m) => {
|
|
22
|
+
const alias = getProviderAlias(m.provider) || m.provider;
|
|
23
|
+
const list = disabled[alias] || disabled[m.provider] || [];
|
|
24
|
+
return !list.includes(m.model);
|
|
25
|
+
})
|
|
26
|
+
.map((m) => {
|
|
27
|
+
const publicModel = publicModelId(m.provider, m.model);
|
|
28
|
+
const fullModel = `${m.provider}/${publicModel}`;
|
|
29
|
+
const providerAlias = getProviderAlias(m.provider) || m.provider;
|
|
30
|
+
const routedModel = `${providerAlias}/${publicModel}`;
|
|
31
|
+
const providerId = resolveProviderId(m.provider);
|
|
32
|
+
const c = getCapabilitiesForModel(providerId, m.model);
|
|
33
|
+
const thinkingLevels = getThinkingLevels(providerId, m.model);
|
|
34
|
+
return {
|
|
35
|
+
...m,
|
|
36
|
+
fullModel,
|
|
37
|
+
routedModel,
|
|
38
|
+
name: m.name || publicModel,
|
|
39
|
+
thinkingLevels,
|
|
40
|
+
caps: {
|
|
41
|
+
vision: c.vision,
|
|
42
|
+
pdf: c.pdf,
|
|
43
|
+
audioInput: c.audioInput,
|
|
44
|
+
videoInput: c.videoInput,
|
|
45
|
+
imageOutput: c.imageOutput,
|
|
46
|
+
audioOutput: c.audioOutput,
|
|
47
|
+
search: c.search,
|
|
48
|
+
tools: c.tools,
|
|
49
|
+
reasoning: c.reasoning,
|
|
50
|
+
thinkingFormat: c.thinkingFormat,
|
|
51
|
+
thinkingCanDisable: c.thinkingCanDisable,
|
|
52
|
+
thinkingRange: c.thinkingRange,
|
|
53
|
+
contextWindow: c.contextWindow,
|
|
54
|
+
maxOutput: c.maxOutput,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return NextResponse.json({ models });
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.log("Error fetching models:", error);
|
|
62
|
+
return NextResponse.json({ error: "Failed to fetch models" }, { status: 500 });
|
|
63
|
+
}
|
|
64
|
+
}
|