kentutai 1.5.0 → 1.7.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/.dockerignore +32 -0
- package/.env.example +38 -0
- package/.github/dependabot.yml +2 -0
- package/.github/workflows/docker-publish.yml +60 -0
- package/.github/workflows/gitbook-pages.yml +50 -0
- package/.omo/boulder.json +15 -0
- package/.omo/evidence/scenario-1-hub-renders.png +0 -0
- package/.omo/evidence/scenario-2-api-keys-tab.png +0 -0
- package/.omo/evidence/scenario-2-packages-tab.png +0 -0
- package/.omo/evidence/scenario-3-users-table.png +0 -0
- package/.omo/evidence/scenario-4-keys-tab.png +0 -0
- package/.omo/evidence/scenario-5-packages-tab.png +0 -0
- package/.omo/evidence/scenario-6-redirect-keys.png +0 -0
- package/.omo/evidence/scenario-6-redirect-users.png +0 -0
- package/.omo/evidence/scenario-7-sidebar-access.png +0 -0
- package/.omo/evidence/task-1-data-flow-investigation.txt +254 -0
- package/.omo/evidence/task-1-schema-consumers.txt +229 -0
- package/.omo/evidence/task-F3-scenario1-page-loaded.png +0 -0
- package/.omo/evidence/task-F3-scenario2-table-view.png +0 -0
- package/.omo/evidence/task-F3-scenario3-filtered-view.png +0 -0
- package/.omo/evidence/task-F3-scenario4-chart-view.png +0 -0
- package/.omo/evidence/task-F3-scenario6-sorting.png +0 -0
- package/.omo/notepads/credit-monitoring/learnings.md +30 -0
- package/.omo/notepads/rate-limit-tiers/learnings.md +17 -0
- package/.omo/notepads/unified-access-management/decisions.md +7 -0
- package/.omo/notepads/unified-access-management/issues.md +3 -0
- package/.omo/notepads/unified-access-management/learnings.md +16 -0
- package/.omo/notepads/unified-access-management/problems.md +3 -0
- package/.omo/notepads/usage-monitoring-fix/learnings.md +39 -0
- package/.omo/plans/rate-limit-tiers.md +149 -0
- package/.omo/plans/sidebar-organization.md +125 -0
- package/.omo/plans/test.md +0 -0
- package/.omo/plans/unified-access-management.md +421 -0
- package/.omo/plans/user-dashboard-restructure.md +1381 -0
- package/.omo/plans/user-rate-limit.md +1686 -0
- package/.omo/run-continuation/ses_1956a961fffebAu8TmXjU0PKn4.json +10 -0
- package/.omo/run-continuation/ses_19624e6caffe2ns8GuxhGbXfA0.json +10 -0
- package/.omo/run-continuation/ses_1966a9bc3ffe6Hggqz47HxUO2x.json +11 -0
- package/.omo/run-continuation/ses_196732105ffecADA4DANbRiVcE.json +10 -0
- package/.test-data/db/data.sqlite +0 -0
- package/.vscode/settings.json +20 -0
- package/CHANGELOG.md +540 -0
- package/DOCKER.md +104 -0
- package/Dockerfile +52 -0
- package/LICENSE +1 -22
- package/README.md +1245 -52
- package/README.zh-CN.md +1311 -0
- package/SYNC_UPDATES.md +156 -0
- package/bin.js +2 -0
- package/captain-definition +4 -0
- package/check-connections.js +20 -0
- package/check-db.js +41 -0
- package/check-key.js +20 -0
- package/check-key2.js +21 -0
- package/check-mimo-conn.js +29 -0
- package/check-mimo.js +22 -0
- package/check-nodes.js +26 -0
- package/check-nodes2.js +29 -0
- package/check-providers.js +48 -0
- package/cli/LICENSE +42 -0
- package/cli/README.md +125 -0
- package/cli/cli.js +222 -0
- package/cli/hooks/postinstall.js +23 -0
- package/cli/hooks/sqliteRuntime.js +139 -0
- package/cli/hooks/trayRuntime.js +107 -0
- package/cli/kentutai-1.3.2.tgz +0 -0
- package/cli/package.json +22 -0
- package/cli/scripts/build-cli.js +265 -0
- package/cli/scripts/buildMitm.js +70 -0
- package/cli/src/cli/api/client.js +547 -0
- package/cli/src/cli/menus/apiKeys.js +233 -0
- package/cli/src/cli/menus/cliTools.js +618 -0
- package/cli/src/cli/menus/combos.js +477 -0
- package/cli/src/cli/menus/providers.js +845 -0
- package/cli/src/cli/menus/settings.js +207 -0
- package/cli/src/cli/terminalUI.js +121 -0
- package/cli/src/cli/tray/autostart.js +306 -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 +322 -0
- package/cli/src/cli/tray/tray.ps1 +79 -0
- package/cli/src/cli/tray/trayWin.js +89 -0
- package/cli/src/cli/utils/clipboard.js +30 -0
- package/cli/src/cli/utils/display.js +42 -0
- package/cli/src/cli/utils/endpoint.js +32 -0
- package/cli/src/cli/utils/format.js +125 -0
- package/cli/src/cli/utils/input.js +130 -0
- package/cli/src/cli/utils/menuHelper.js +156 -0
- package/cli/src/cli/utils/modelSelector.js +136 -0
- package/dev.log +15 -0
- package/docs/ARCHITECTURE.md +557 -0
- package/eslint.config.mjs +16 -0
- package/gitbook/app/[lang]/[...slug]/page.js +36 -0
- package/gitbook/app/[lang]/page.js +26 -0
- package/gitbook/app/globals.css +190 -0
- package/gitbook/app/layout.js +21 -0
- package/gitbook/app/page.js +26 -0
- package/gitbook/components/DocsContent.js +13 -0
- package/gitbook/components/DocsHeader.js +78 -0
- package/gitbook/components/DocsLayout.js +25 -0
- package/gitbook/components/DocsSidebar.js +125 -0
- package/gitbook/components/DocsToc.js +61 -0
- package/gitbook/components/LanguageSwitcher.js +96 -0
- package/gitbook/constants/docsConfig.js +242 -0
- package/gitbook/constants/languages.js +19 -0
- package/gitbook/content/en/deployment/cloud.md +473 -0
- package/gitbook/content/en/deployment/localhost.md +164 -0
- package/gitbook/content/en/faq.md +387 -0
- package/gitbook/content/en/features/combos.md +537 -0
- package/gitbook/content/en/features/quota-tracking.md +687 -0
- package/gitbook/content/en/features/smart-routing.md +407 -0
- package/gitbook/content/en/getting-started/installation.md +478 -0
- package/gitbook/content/en/getting-started/quick-start.md +247 -0
- package/gitbook/content/en/index.md +164 -0
- package/gitbook/content/en/integration/claude-code.md +109 -0
- package/gitbook/content/en/integration/cline.md +201 -0
- package/gitbook/content/en/integration/codex.md +136 -0
- package/gitbook/content/en/integration/continue.md +249 -0
- package/gitbook/content/en/integration/cursor.md +149 -0
- package/gitbook/content/en/integration/other-tools.md +416 -0
- package/gitbook/content/en/integration/roo.md +127 -0
- package/gitbook/content/en/providers/cheap.md +462 -0
- package/gitbook/content/en/providers/free.md +442 -0
- package/gitbook/content/en/providers/subscription.md +404 -0
- package/gitbook/content/en/troubleshooting.md +351 -0
- package/gitbook/content/es/deployment/cloud.md +473 -0
- package/gitbook/content/es/deployment/localhost.md +164 -0
- package/gitbook/content/es/faq.md +387 -0
- package/gitbook/content/es/features/combos.md +537 -0
- package/gitbook/content/es/features/quota-tracking.md +687 -0
- package/gitbook/content/es/features/smart-routing.md +407 -0
- package/gitbook/content/es/getting-started/installation.md +478 -0
- package/gitbook/content/es/getting-started/quick-start.md +247 -0
- package/gitbook/content/es/index.md +164 -0
- package/gitbook/content/es/integration/claude-code.md +109 -0
- package/gitbook/content/es/integration/cline.md +201 -0
- package/gitbook/content/es/integration/codex.md +136 -0
- package/gitbook/content/es/integration/continue.md +249 -0
- package/gitbook/content/es/integration/cursor.md +149 -0
- package/gitbook/content/es/integration/other-tools.md +416 -0
- package/gitbook/content/es/integration/roo.md +127 -0
- package/gitbook/content/es/providers/cheap.md +462 -0
- package/gitbook/content/es/providers/free.md +442 -0
- package/gitbook/content/es/providers/subscription.md +404 -0
- package/gitbook/content/es/troubleshooting.md +351 -0
- package/gitbook/content/ja/deployment/cloud.md +473 -0
- package/gitbook/content/ja/deployment/localhost.md +164 -0
- package/gitbook/content/ja/faq.md +387 -0
- package/gitbook/content/ja/features/combos.md +537 -0
- package/gitbook/content/ja/features/quota-tracking.md +687 -0
- package/gitbook/content/ja/features/smart-routing.md +407 -0
- package/gitbook/content/ja/getting-started/installation.md +478 -0
- package/gitbook/content/ja/getting-started/quick-start.md +247 -0
- package/gitbook/content/ja/index.md +164 -0
- package/gitbook/content/ja/integration/claude-code.md +109 -0
- package/gitbook/content/ja/integration/cline.md +201 -0
- package/gitbook/content/ja/integration/codex.md +136 -0
- package/gitbook/content/ja/integration/continue.md +249 -0
- package/gitbook/content/ja/integration/cursor.md +149 -0
- package/gitbook/content/ja/integration/other-tools.md +416 -0
- package/gitbook/content/ja/integration/roo.md +127 -0
- package/gitbook/content/ja/providers/cheap.md +462 -0
- package/gitbook/content/ja/providers/free.md +442 -0
- package/gitbook/content/ja/providers/subscription.md +404 -0
- package/gitbook/content/ja/troubleshooting.md +351 -0
- package/gitbook/content/vi/deployment/cloud.md +473 -0
- package/gitbook/content/vi/deployment/localhost.md +164 -0
- package/gitbook/content/vi/faq.md +387 -0
- package/gitbook/content/vi/features/combos.md +537 -0
- package/gitbook/content/vi/features/quota-tracking.md +687 -0
- package/gitbook/content/vi/features/smart-routing.md +407 -0
- package/gitbook/content/vi/getting-started/installation.md +478 -0
- package/gitbook/content/vi/getting-started/quick-start.md +247 -0
- package/gitbook/content/vi/index.md +164 -0
- package/gitbook/content/vi/integration/claude-code.md +109 -0
- package/gitbook/content/vi/integration/cline.md +201 -0
- package/gitbook/content/vi/integration/codex.md +136 -0
- package/gitbook/content/vi/integration/continue.md +249 -0
- package/gitbook/content/vi/integration/cursor.md +149 -0
- package/gitbook/content/vi/integration/other-tools.md +416 -0
- package/gitbook/content/vi/integration/roo.md +127 -0
- package/gitbook/content/vi/providers/cheap.md +462 -0
- package/gitbook/content/vi/providers/free.md +442 -0
- package/gitbook/content/vi/providers/subscription.md +404 -0
- package/gitbook/content/vi/troubleshooting.md +351 -0
- package/gitbook/content/zh-CN/deployment/cloud.md +473 -0
- package/gitbook/content/zh-CN/deployment/localhost.md +164 -0
- package/gitbook/content/zh-CN/faq.md +387 -0
- package/gitbook/content/zh-CN/features/combos.md +537 -0
- package/gitbook/content/zh-CN/features/quota-tracking.md +687 -0
- package/gitbook/content/zh-CN/features/smart-routing.md +407 -0
- package/gitbook/content/zh-CN/getting-started/installation.md +478 -0
- package/gitbook/content/zh-CN/getting-started/quick-start.md +247 -0
- package/gitbook/content/zh-CN/index.md +164 -0
- package/gitbook/content/zh-CN/integration/claude-code.md +109 -0
- package/gitbook/content/zh-CN/integration/cline.md +201 -0
- package/gitbook/content/zh-CN/integration/codex.md +136 -0
- package/gitbook/content/zh-CN/integration/continue.md +249 -0
- package/gitbook/content/zh-CN/integration/cursor.md +149 -0
- package/gitbook/content/zh-CN/integration/other-tools.md +416 -0
- package/gitbook/content/zh-CN/integration/roo.md +127 -0
- package/gitbook/content/zh-CN/providers/cheap.md +462 -0
- package/gitbook/content/zh-CN/providers/free.md +442 -0
- package/gitbook/content/zh-CN/providers/subscription.md +404 -0
- package/gitbook/content/zh-CN/troubleshooting.md +351 -0
- package/gitbook/jsconfig.json +8 -0
- package/gitbook/lib/content.js +42 -0
- package/gitbook/next.config.mjs +24 -0
- package/gitbook/package.json +25 -0
- package/gitbook/postcss.config.mjs +5 -0
- package/gitbook/utils/markdown.js +218 -0
- package/i18n/README.ja-JP.md +1209 -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 +103 -0
- package/open-sse/config/appConstants.js +202 -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 +262 -0
- package/open-sse/config/models.js +13 -0
- package/open-sse/config/ollamaModels.js +19 -0
- package/open-sse/config/providerModels.js +904 -0
- package/open-sse/config/providers.js +457 -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 +177 -0
- package/open-sse/executors/codex.js +456 -0
- package/open-sse/executors/commandcode.js +88 -0
- package/open-sse/executors/cursor.js +795 -0
- package/open-sse/executors/default.js +317 -0
- package/open-sse/executors/gemini-cli.js +89 -0
- package/open-sse/executors/github.js +365 -0
- package/open-sse/executors/grok-web.js +345 -0
- package/open-sse/executors/iflow.js +108 -0
- package/open-sse/executors/index.js +72 -0
- package/open-sse/executors/kiro.js +503 -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 +27 -0
- package/open-sse/executors/perplexity-web.js +507 -0
- package/open-sse/executors/qoder.js +73 -0
- package/open-sse/executors/qwen.js +129 -0
- package/open-sse/executors/vertex.js +131 -0
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +226 -0
- package/open-sse/handlers/chatCore/requestDetail.js +102 -0
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +230 -0
- package/open-sse/handlers/chatCore/streamingHandler.js +99 -0
- package/open-sse/handlers/chatCore.js +276 -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 +74 -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 +35 -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 +215 -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 +255 -0
- package/open-sse/services/projectId.js +306 -0
- package/open-sse/services/provider.js +356 -0
- package/open-sse/services/tokenRefresh.js +876 -0
- package/open-sse/services/usage.js +1151 -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 +381 -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 +377 -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 +142 -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 +77 -0
- package/open-sse/utils/requestLogger.js +260 -0
- package/open-sse/utils/sessionManager.js +82 -0
- package/open-sse/utils/stream.js +404 -0
- package/open-sse/utils/streamHandler.js +238 -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/opencode.json +22 -0
- package/package.json +70 -28
- package/postcss.config.mjs +12 -0
- package/public/favicon.png +0 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/i18n/literals/ar.json +194 -0
- package/public/i18n/literals/bn.json +194 -0
- package/public/i18n/literals/cs.json +194 -0
- package/public/i18n/literals/da.json +194 -0
- package/public/i18n/literals/de.json +194 -0
- package/public/i18n/literals/el.json +194 -0
- package/public/i18n/literals/es.json +194 -0
- package/public/i18n/literals/fi.json +194 -0
- package/public/i18n/literals/fr.json +194 -0
- package/public/i18n/literals/he.json +194 -0
- package/public/i18n/literals/hi.json +194 -0
- package/public/i18n/literals/hu.json +194 -0
- package/public/i18n/literals/id.json +194 -0
- package/public/i18n/literals/it.json +194 -0
- package/public/i18n/literals/ja.json +194 -0
- package/public/i18n/literals/ko.json +194 -0
- package/public/i18n/literals/nl.json +194 -0
- package/public/i18n/literals/no.json +194 -0
- package/public/i18n/literals/pl.json +194 -0
- package/public/i18n/literals/pt-BR.json +194 -0
- package/public/i18n/literals/pt-PT.json +194 -0
- package/public/i18n/literals/ro.json +194 -0
- package/public/i18n/literals/ru.json +194 -0
- package/public/i18n/literals/sv.json +194 -0
- package/public/i18n/literals/th.json +194 -0
- package/public/i18n/literals/tl.json +194 -0
- package/public/i18n/literals/tr.json +194 -0
- package/public/i18n/literals/uk.json +194 -0
- package/public/i18n/literals/ur.json +194 -0
- package/public/i18n/literals/vi.json +194 -0
- package/public/i18n/literals/zh-CN.json +768 -0
- package/public/i18n/literals/zh-TW.json +194 -0
- package/public/icon.ico +0 -0
- package/public/icons/icon-192.svg +4 -0
- package/public/icons/icon-512.svg +4 -0
- package/public/kentutai-icon.png +0 -0
- package/public/kentutai-logo.png +0 -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/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/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/build-cli.ps1 +51 -0
- package/scripts/build-cli.sh +23 -0
- package/scripts/translate-readme.js +201 -0
- package/server-error.log +2 -0
- package/server.log +245 -0
- package/skills/9router/SKILL.md +61 -0
- package/skills/9router-chat/SKILL.md +73 -0
- package/skills/9router-embeddings/SKILL.md +69 -0
- package/skills/9router-image/SKILL.md +86 -0
- package/skills/9router-stt/SKILL.md +79 -0
- package/skills/9router-tts/SKILL.md +80 -0
- package/skills/9router-web-fetch/SKILL.md +99 -0
- package/skills/9router-web-search/SKILL.md +91 -0
- package/skills/README.md +42 -0
- package/src/__tests__/integration/e2e.test.js +672 -0
- package/src/__tests__/setup.js +15 -0
- package/src/__tests__/vitest.test.js +7 -0
- package/src/app/(dashboard)/dashboard/access/AccessHubClient.jsx +126 -0
- package/src/app/(dashboard)/dashboard/access/components/UserExpandableRow.jsx +263 -0
- package/src/app/(dashboard)/dashboard/access/page.js +7 -0
- package/src/app/(dashboard)/dashboard/access/tabs/KeysTab.jsx +568 -0
- package/src/app/(dashboard)/dashboard/access/tabs/PackagesTab.jsx +56 -0
- package/src/app/(dashboard)/dashboard/access/tabs/UsersTab.jsx +205 -0
- package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +967 -0
- package/src/app/(dashboard)/dashboard/basic-chat/page.js +9 -0
- package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.js +72 -0
- package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/ToolDetailClient.js +160 -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 +402 -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 +40 -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 +9 -0
- package/src/app/(dashboard)/dashboard/combos/page.js +590 -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 +1536 -0
- package/src/app/(dashboard)/dashboard/endpoint/page.js +18 -0
- package/src/app/(dashboard)/dashboard/keys/page.js +11 -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/packages/PackagesClient.jsx +510 -0
- package/src/app/(dashboard)/dashboard/packages/page.js +11 -0
- package/src/app/(dashboard)/dashboard/page.js +25 -0
- package/src/app/(dashboard)/dashboard/plan/PlanClient.jsx +601 -0
- package/src/app/(dashboard)/dashboard/plan/page.js +26 -0
- package/src/app/(dashboard)/dashboard/profile/page.js +365 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js +392 -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 +295 -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 +1494 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +1730 -0
- package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +500 -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 +1322 -0
- package/src/app/(dashboard)/dashboard/proxy-pools/page.js +1064 -0
- package/src/app/(dashboard)/dashboard/quota/page.js +17 -0
- package/src/app/(dashboard)/dashboard/settings/page.js +1051 -0
- package/src/app/(dashboard)/dashboard/settings/pricing/page.js +173 -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/UsageClient.jsx +874 -0
- package/src/app/(dashboard)/dashboard/usage/components/CreditProgressBar.js +112 -0
- package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +35 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.js +184 -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 +1288 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js +219 -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 +38 -0
- package/src/app/(dashboard)/dashboard/users/AddUserModal.jsx +285 -0
- package/src/app/(dashboard)/dashboard/users/UsersClient.jsx +188 -0
- package/src/app/(dashboard)/dashboard/users/[id]/page.js +708 -0
- package/src/app/(dashboard)/dashboard/users/page.js +11 -0
- package/src/app/(dashboard)/layout.js +9 -0
- package/src/app/api/auth/login/login.test.js +147 -0
- package/src/app/api/auth/login/route.js +76 -0
- package/src/app/api/auth/logout/logout.test.js +49 -0
- package/src/app/api/auth/logout/route.js +12 -0
- package/src/app/api/auth/me/me.test.js +81 -0
- package/src/app/api/auth/me/route.js +31 -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/profile/route.js +97 -0
- package/src/app/api/auth/register/register.test.js +104 -0
- package/src/app/api/auth/register/route.js +37 -0
- package/src/app/api/auth/status/route.js +68 -0
- package/src/app/api/auth/status/status.test.js +116 -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-settings/route.js +238 -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 +410 -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 +117 -0
- package/src/app/api/keys/route.js +111 -0
- package/src/app/api/locale/route.js +30 -0
- package/src/app/api/mcp/[plugin]/message/route.js +19 -0
- package/src/app/api/mcp/[plugin]/sse/route.js +35 -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/route.js +120 -0
- package/src/app/api/oauth/[provider]/[action]/route.js +333 -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/import/route.js +56 -0
- package/src/app/api/oauth/kiro/social-authorize/route.js +43 -0
- package/src/app/api/oauth/kiro/social-exchange/route.js +67 -0
- package/src/app/api/packages/[id]/route.js +152 -0
- package/src/app/api/packages/route.js +80 -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 +490 -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 +658 -0
- package/src/app/api/providers/[id]/test-models/route.js +114 -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 +191 -0
- package/src/app/api/providers/suggested-models/route.js +49 -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 +58 -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 +171 -0
- package/src/app/api/usage/chart/route.js +21 -0
- package/src/app/api/usage/credit/route.js +64 -0
- package/src/app/api/usage/export/route.js +222 -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/route.js +141 -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/usage/summary/route.js +110 -0
- package/src/app/api/users/[id]/approve/route.js +89 -0
- package/src/app/api/users/[id]/limits/route.js +143 -0
- package/src/app/api/users/[id]/package/route.js +124 -0
- package/src/app/api/users/[id]/route.js +145 -0
- package/src/app/api/users/create-with-key/route.js +145 -0
- package/src/app/api/users/route.js +32 -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 +432 -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/favicon.ico +0 -0
- package/src/app/globals.css +501 -0
- package/src/app/icon.ico +0 -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 +60 -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 +71 -0
- package/src/app/landing/page.js +77 -0
- package/src/app/layout.js +75 -0
- package/src/app/login/page.js +215 -0
- package/src/app/manifest.js +30 -0
- package/src/app/page.js +5 -0
- package/src/app/register/page.js +175 -0
- package/src/dashboardGuard.js +314 -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/jwt.js +28 -0
- package/src/lib/auth/jwt.test.js +50 -0
- package/src/lib/auth/loginLimiter.js +52 -0
- package/src/lib/auth/loginLimiter.test.js +130 -0
- package/src/lib/auth/oidc.js +234 -0
- package/src/lib/auth/password.js +15 -0
- package/src/lib/auth/password.test.js +49 -0
- package/src/lib/auth/rateLimitMiddleware.js +256 -0
- package/src/lib/auth/rateLimitMiddleware.test.js +509 -0
- package/src/lib/auth/seedAdmin.js +47 -0
- package/src/lib/auth/seedAdmin.test.js +149 -0
- package/src/lib/auth/validation.js +26 -0
- package/src/lib/auth/validation.test.js +100 -0
- package/src/lib/consoleLogBuffer.js +79 -0
- package/src/lib/dataDir.js +31 -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 +185 -0
- package/src/lib/db/migrate.js +286 -0
- package/src/lib/db/migrations/001-initial.js +14 -0
- package/src/lib/db/migrations/002-users-rate-limit.js +39 -0
- package/src/lib/db/migrations/003-api-key-comment.js +9 -0
- package/src/lib/db/migrations/003-packages-per-key-settings.js +69 -0
- package/src/lib/db/migrations/004-usage-tracking.js +30 -0
- package/src/lib/db/migrations/005-user-profile-fields.js +19 -0
- package/src/lib/db/migrations/006-daily-token-limit.js +16 -0
- package/src/lib/db/migrations/index.js +15 -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 +110 -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/packagesRepo.js +257 -0
- package/src/lib/db/repos/pricingRepo.js +108 -0
- package/src/lib/db/repos/proxyPoolsRepo.js +103 -0
- package/src/lib/db/repos/rateLimitRepo.js +192 -0
- package/src/lib/db/repos/rateLimitRepo.test.js +73 -0
- package/src/lib/db/repos/requestDetailsRepo.js +200 -0
- package/src/lib/db/repos/settingsRepo.js +104 -0
- package/src/lib/db/repos/usageRecordsRepo.js +264 -0
- package/src/lib/db/repos/usageRepo.js +948 -0
- package/src/lib/db/repos/usersRepo.js +118 -0
- package/src/lib/db/repos/usersRepo.test.js +111 -0
- package/src/lib/db/schema.js +256 -0
- package/src/lib/db/schemaHelpers.js +37 -0
- package/src/lib/db/seedPackages.js +69 -0
- package/src/lib/db/version.js +21 -0
- package/src/lib/disabledModelsDb.js +4 -0
- package/src/lib/localDb.js +27 -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 +276 -0
- package/src/lib/oauth/constants/xai.js +61 -0
- package/src/lib/oauth/providers.js +1453 -0
- package/src/lib/oauth/services/antigravity.js +321 -0
- package/src/lib/oauth/services/claude.js +136 -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 +313 -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 +232 -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/requestDetailsDb.js +4 -0
- package/src/lib/tunnel/cloudflare/cloudflared.js +438 -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 +148 -0
- package/src/lib/tunnel/cloudflare/pid.js +23 -0
- package/src/lib/tunnel/index.js +46 -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 +5 -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/aggregation.js +121 -0
- package/src/lib/usage/fetcher.js +208 -0
- package/src/lib/usageDb.js +8 -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 +73 -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 +68 -0
- package/src/mitm/handlers/copilot.js +35 -0
- package/src/mitm/handlers/cursor.js +15 -0
- package/src/mitm/handlers/kiro.js +401 -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 +403 -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/AuthProvider.js +17 -0
- package/src/shared/components/Avatar.js +88 -0
- package/src/shared/components/Badge.js +54 -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/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 +289 -0
- package/src/shared/components/Footer.js +132 -0
- package/src/shared/components/GitLabAuthModal.js +194 -0
- package/src/shared/components/Header.js +354 -0
- package/src/shared/components/HeaderMenu.js +158 -0
- package/src/shared/components/IFlowCookieModal.js +132 -0
- package/src/shared/components/Input.js +96 -0
- package/src/shared/components/KiroAuthModal.js +383 -0
- package/src/shared/components/KiroOAuthWrapper.js +103 -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/NeuralNetworkBG.js +175 -0
- package/src/shared/components/NoAuthProxyCard.js +86 -0
- package/src/shared/components/OAuthModal.js +660 -0
- package/src/shared/components/Pagination.js +150 -0
- package/src/shared/components/PricingModal.js +208 -0
- package/src/shared/components/ProviderIcon.js +51 -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 +518 -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 +540 -0
- package/src/shared/components/index.js +43 -0
- package/src/shared/components/layouts/AuthLayout.js +29 -0
- package/src/shared/components/layouts/DashboardLayout.js +108 -0
- package/src/shared/components/layouts/index.js +4 -0
- package/src/shared/constants/cliTools.js +383 -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/mitmToolHosts.js +12 -0
- package/src/shared/constants/models.js +38 -0
- package/src/shared/constants/pricing.js +301 -0
- package/src/shared/constants/providers.js +287 -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 +282 -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/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 +249 -0
- package/src/sse/handlers/embeddings.js +142 -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 +308 -0
- package/src/sse/services/model.js +83 -0
- package/src/sse/services/tokenRefresh.js +305 -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 +36 -0
- package/start.sh +4 -0
- package/tester/translator/testFromFile.js +148 -0
- package/tests/README.md +51 -0
- package/tests/package.json +17 -0
- package/tests/unit/antigravity-cache.test.js +216 -0
- package/tests/unit/buildOutputFilter.test.js +232 -0
- package/tests/unit/buildOutputFilterAdversarial.test.js +357 -0
- package/tests/unit/claude-header-forwarding.test.js +417 -0
- package/tests/unit/codex-image-fetch.test.js +145 -0
- package/tests/unit/codex-refresh-token.test.js +83 -0
- package/tests/unit/combo-routing.test.js +58 -0
- package/tests/unit/commandcode-to-openai.test.js +127 -0
- package/tests/unit/compatible-provider-connections.test.js +170 -0
- package/tests/unit/cursor-composer-thinking.test.js +86 -0
- package/tests/unit/dashboard-guard.test.js +208 -0
- package/tests/unit/db-benchmark.test.js +174 -0
- package/tests/unit/db-concurrent.test.js +171 -0
- package/tests/unit/db-driver-chain.test.js +59 -0
- package/tests/unit/db-migration-chain.test.js +100 -0
- package/tests/unit/db-sqlite-vs-lowdb.test.js +274 -0
- package/tests/unit/embeddings.cloud.test.js +524 -0
- package/tests/unit/embeddingsCore.test.js +631 -0
- package/tests/unit/gemini-usage-projectid.test.js +87 -0
- package/tests/unit/image-generation.test.js +514 -0
- package/tests/unit/minimax-tts.test.js +120 -0
- package/tests/unit/minimax-usage.test.js +116 -0
- package/tests/unit/minimax-voices.test.js +83 -0
- package/tests/unit/oauth-cursor-auto-import.test.js +184 -0
- package/tests/unit/openai-to-claude-response-tools.test.js +61 -0
- package/tests/unit/openai-to-claude.test.js +162 -0
- package/tests/unit/openai-to-commandcode.test.js +181 -0
- package/tests/unit/openai-to-kiro.test.js +146 -0
- package/tests/unit/perplexity-web.test.js +306 -0
- package/tests/unit/provider-validation.test.js +271 -0
- package/tests/unit/rtk.e2e.test.js +136 -0
- package/tests/unit/rtk.multi-provider.e2e.test.js +137 -0
- package/tests/unit/rtk.test.js +358 -0
- package/tests/unit/rtkKiro.test.js +291 -0
- package/tests/unit/translator-request-normalization.test.js +186 -0
- package/tests/unit/web-cookie-validation.test.js +187 -0
- package/tests/unit/xai-oauth-service.test.js +125 -0
- package/tests/unit/xai-tokenRefresh.test.js +63 -0
- package/tests/vitest.config.js +23 -0
- package/tsconfig.json +44 -0
- package/vitest.config.js +21 -0
- package/cli.js +0 -117
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
================================================================================
|
|
2
|
+
TASK 1: SCHEMA CONSUMERS — Complete Table Consumer Map
|
|
3
|
+
Date: 2026-05-30
|
|
4
|
+
================================================================================
|
|
5
|
+
|
|
6
|
+
## TABLE: `usageHistory` — All Consumers
|
|
7
|
+
================================================================================
|
|
8
|
+
|
|
9
|
+
### WRITERS (INSERT INTO usageHistory)
|
|
10
|
+
================================================================================
|
|
11
|
+
|
|
12
|
+
1. `src/lib/db/repos/usageRepo.js:258` — saveRequestUsage()
|
|
13
|
+
INSERT INTO usageHistory(timestamp, provider, model, connectionId, apiKey,
|
|
14
|
+
endpoint, promptTokens, completionTokens, cost, status, tokens, meta)
|
|
15
|
+
|
|
16
|
+
Called by:
|
|
17
|
+
├── open-sse/utils/usageTracking.js:345 — logUsage()
|
|
18
|
+
│ └── open-sse/utils/stream.js:289 — (SSE proxy streaming handler)
|
|
19
|
+
│ └── open-sse/utils/stream.js:359 — (SSE proxy streaming handler)
|
|
20
|
+
└── open-sse/handlers/chatCore/requestDetail.js:93 — saveUsageStats()
|
|
21
|
+
|
|
22
|
+
2. `src/lib/db/migrate.js:177` — importLegacyUsage()
|
|
23
|
+
INSERT INTO usageHistory(...) — one-time legacy JSON migration
|
|
24
|
+
|
|
25
|
+
### READERS (SELECT FROM usageHistory)
|
|
26
|
+
================================================================================
|
|
27
|
+
|
|
28
|
+
1. `src/lib/db/repos/usageRepo.js:104` — ensureRingInitialized()
|
|
29
|
+
SELECT ... FROM usageHistory ORDER BY id DESC LIMIT 50
|
|
30
|
+
→ Ring buffer for recent requests display
|
|
31
|
+
|
|
32
|
+
2. `src/lib/db/repos/usageRepo.js:300` — getUsageHistory()
|
|
33
|
+
SELECT ... FROM usageHistory [WHERE ...] ORDER BY id ASC
|
|
34
|
+
→ Exported function, used for filtered history queries
|
|
35
|
+
|
|
36
|
+
3. `src/lib/db/repos/usageRepo.js:345` — getUsageStats()
|
|
37
|
+
SELECT ... FROM usageHistory ORDER BY id DESC LIMIT 100
|
|
38
|
+
→ Recent requests for stats display
|
|
39
|
+
|
|
40
|
+
4. `src/lib/db/repos/usageRepo.js:404` — getUsageStats()
|
|
41
|
+
SELECT ... FROM usageHistory WHERE timestamp >= ? AND timestamp <= ?
|
|
42
|
+
→ Last 10 minutes bucket for real-time display
|
|
43
|
+
|
|
44
|
+
5. `src/lib/db/repos/usageRepo.js:508` — getUsageStats()
|
|
45
|
+
SELECT ... FROM usageHistory WHERE timestamp >= ?
|
|
46
|
+
→ Overlay precise lastUsed timestamps
|
|
47
|
+
|
|
48
|
+
6. `src/lib/db/repos/usageRepo.js:542` — getUsageStats()
|
|
49
|
+
SELECT ... FROM usageHistory WHERE timestamp >= ?
|
|
50
|
+
→ 24h/today period live history
|
|
51
|
+
|
|
52
|
+
7. `src/lib/db/repos/usageRepo.js:635` — getChartData()
|
|
53
|
+
SELECT ... FROM usageHistory WHERE timestamp >= ?
|
|
54
|
+
→ Today chart buckets
|
|
55
|
+
|
|
56
|
+
8. `src/lib/db/repos/usageRepo.js:658` — getChartData()
|
|
57
|
+
SELECT ... FROM usageHistory WHERE timestamp >= ?
|
|
58
|
+
→ 24h chart buckets
|
|
59
|
+
|
|
60
|
+
9. `src/lib/db/repos/usageRepo.js:705` — getRecentLogs()
|
|
61
|
+
SELECT ... FROM usageHistory ORDER BY id DESC LIMIT ?
|
|
62
|
+
→ Recent log entries
|
|
63
|
+
|
|
64
|
+
10. `src/lib/db/repos/rateLimitRepo.js:59` — getMonthlyTokens()
|
|
65
|
+
SELECT SUM(promptTokens + completionTokens) FROM usageHistory
|
|
66
|
+
INNER JOIN apiKeys ON usageHistory.apiKey = apiKeys.key
|
|
67
|
+
WHERE apiKeys.userId = ?
|
|
68
|
+
→ Monthly token count for rate limiting
|
|
69
|
+
|
|
70
|
+
11. `src/lib/db/repos/rateLimitRepo.js:73` — getMonthlyCost()
|
|
71
|
+
SELECT SUM(cost) FROM usageHistory
|
|
72
|
+
INNER JOIN apiKeys ON usageHistory.apiKey = apiKeys.key
|
|
73
|
+
WHERE apiKeys.userId = ?
|
|
74
|
+
→ Monthly cost for credit/quota limiting
|
|
75
|
+
|
|
76
|
+
12. `src/lib/auth/rateLimitMiddleware.js:78` — checkRTPM()
|
|
77
|
+
SELECT COUNT(*) FROM usageHistory
|
|
78
|
+
INNER JOIN apiKeys ON usageHistory.apiKey = apiKeys.key
|
|
79
|
+
WHERE apiKeys.userId = ? AND timestamp >= ?
|
|
80
|
+
→ Requests per minute rate limit check
|
|
81
|
+
|
|
82
|
+
13. `src/lib/auth/rateLimitMiddleware.js:97` — checkRTPD()
|
|
83
|
+
SELECT COUNT(*) FROM usageHistory
|
|
84
|
+
INNER JOIN apiKeys ON usageHistory.apiKey = apiKeys.key
|
|
85
|
+
WHERE apiKeys.userId = ? AND timestamp >= ?
|
|
86
|
+
→ Requests per day rate limit check
|
|
87
|
+
|
|
88
|
+
### API ENDPOINTS CONSUMING usageHistory (via usageRepo.js)
|
|
89
|
+
================================================================================
|
|
90
|
+
|
|
91
|
+
- GET /api/usage/stats → getUsageStats() → src/app/api/usage/stats/route.js:17
|
|
92
|
+
- GET /api/usage/stream → getUsageStats() → src/app/api/usage/stream/route.js:22
|
|
93
|
+
- GET /api/usage/chart → getChartData() → src/app/api/usage/chart/route.js:15
|
|
94
|
+
- GET /api/usage/history → getUsageStats() → src/app/api/usage/history/route.js:6
|
|
95
|
+
- GET /api/usage/logs → getRecentLogs() → src/app/api/usage/logs/route.js:6
|
|
96
|
+
- GET /api/usage/request-logs → getRecentLogs() → src/app/api/usage/request-logs/route.js:6
|
|
97
|
+
|
|
98
|
+
### UI COMPONENTS CONSUMING usageHistory data
|
|
99
|
+
================================================================================
|
|
100
|
+
|
|
101
|
+
- src/shared/components/UsageStats.js — Overview tab (stats + charts)
|
|
102
|
+
Fetches: /api/usage/stats, /api/usage/stream
|
|
103
|
+
- src/app/(dashboard)/dashboard/usage/components/UsageTable.js
|
|
104
|
+
- src/app/(dashboard)/dashboard/usage/components/UsageChart.js
|
|
105
|
+
|
|
106
|
+
================================================================================
|
|
107
|
+
## TABLE: `usage_records` — All Consumers
|
|
108
|
+
================================================================================
|
|
109
|
+
|
|
110
|
+
### WRITERS (INSERT INTO usage_records)
|
|
111
|
+
================================================================================
|
|
112
|
+
|
|
113
|
+
1. `src/lib/db/repos/usageRecordsRepo.js:29` — logUsage()
|
|
114
|
+
INSERT INTO usage_records (id, userId, apiKeyId, model, inputTokens,
|
|
115
|
+
outputTokens, totalTokens, cost, creditUsed, status, errorMessage,
|
|
116
|
+
endpoint, timestamp)
|
|
117
|
+
|
|
118
|
+
Called by:
|
|
119
|
+
└── src/lib/auth/rateLimitMiddleware.js:58-68 — logUsageAsync()
|
|
120
|
+
└── src/lib/auth/rateLimitMiddleware.js:215 — enforceRateLimits() (success)
|
|
121
|
+
└── src/lib/auth/rateLimitMiddleware.js:230 — enforceRateLimits() (rate limited)
|
|
122
|
+
└── src/dashboardGuard.js:239-240 — LLM API gate middleware
|
|
123
|
+
|
|
124
|
+
### READERS (SELECT FROM usage_records)
|
|
125
|
+
================================================================================
|
|
126
|
+
|
|
127
|
+
1. `src/lib/db/repos/usageRecordsRepo.js:80` — getUsageByUser()
|
|
128
|
+
SELECT * FROM usage_records WHERE userId = ? [AND ...]
|
|
129
|
+
→ Paginated user usage records
|
|
130
|
+
|
|
131
|
+
2. `src/lib/db/repos/usageRecordsRepo.js:84` — getUsageByUser()
|
|
132
|
+
SELECT COUNT(*) FROM usage_records WHERE userId = ?
|
|
133
|
+
→ Total count for pagination
|
|
134
|
+
|
|
135
|
+
3. `src/lib/db/repos/usageRecordsRepo.js:121` — getUsageSummary()
|
|
136
|
+
SELECT SUM(inputTokens), SUM(outputTokens), ... FROM usage_records
|
|
137
|
+
WHERE userId = ?
|
|
138
|
+
→ Aggregated usage summary
|
|
139
|
+
|
|
140
|
+
4. `src/lib/db/repos/usageRecordsRepo.js:158` — getUsageByModel()
|
|
141
|
+
SELECT model, COUNT(*), SUM(totalTokens), SUM(cost)
|
|
142
|
+
FROM usage_records WHERE userId = ? GROUP BY model
|
|
143
|
+
→ Per-model usage breakdown
|
|
144
|
+
|
|
145
|
+
5. `src/lib/db/repos/usageRecordsRepo.js:196` — getUsageDaily()
|
|
146
|
+
SELECT DATE(timestamp), COUNT(*), SUM(totalTokens), SUM(cost)
|
|
147
|
+
FROM usage_records WHERE userId = ? GROUP BY DATE(timestamp)
|
|
148
|
+
→ Daily usage trend
|
|
149
|
+
|
|
150
|
+
6. `src/lib/db/repos/usageRecordsRepo.js:235` — getAllUsersUsage()
|
|
151
|
+
SELECT userId, username, COUNT(*), SUM(totalTokens), SUM(cost)
|
|
152
|
+
FROM usage_records LEFT JOIN users ...
|
|
153
|
+
→ Admin: all users aggregate
|
|
154
|
+
|
|
155
|
+
7. `src/lib/db/repos/usageRecordsRepo.js:259` — cleanupOldRecords()
|
|
156
|
+
DELETE FROM usage_records WHERE timestamp < ?
|
|
157
|
+
→ Cleanup old records (90 days)
|
|
158
|
+
|
|
159
|
+
### API ENDPOINTS CONSUMING usage_records (via usageRecordsRepo.js)
|
|
160
|
+
================================================================================
|
|
161
|
+
|
|
162
|
+
- GET /api/usage → getUsageByUser() + getUsageSummary() + getAllUsersUsage()
|
|
163
|
+
→ src/app/api/usage/route.js:47,67,75,89,97
|
|
164
|
+
|
|
165
|
+
- GET /api/usage/export → getUsageByUser() + getUsageSummary()
|
|
166
|
+
→ src/app/api/usage/export/route.js:42,176
|
|
167
|
+
|
|
168
|
+
### UI COMPONENTS CONSUMING usage_records data
|
|
169
|
+
================================================================================
|
|
170
|
+
|
|
171
|
+
- src/app/(dashboard)/dashboard/usage/UsageClient.jsx — Table tab
|
|
172
|
+
Fetches: /api/usage (line 578)
|
|
173
|
+
Uses: records, summary, totalPages, total
|
|
174
|
+
- src/app/(dashboard)/dashboard/usage/UsageClient.jsx — Export
|
|
175
|
+
Fetches: /api/usage/export (line 542)
|
|
176
|
+
|
|
177
|
+
================================================================================
|
|
178
|
+
## TABLE: `usageDaily` — All Consumers
|
|
179
|
+
================================================================================
|
|
180
|
+
|
|
181
|
+
### WRITERS
|
|
182
|
+
1. `src/lib/db/repos/usageRepo.js:274` — saveRequestUsage()
|
|
183
|
+
INSERT/UPDATE usageDaily(dateKey, data)
|
|
184
|
+
→ Same transaction as usageHistory insert
|
|
185
|
+
|
|
186
|
+
2. `src/lib/db/migrate.js:191` — importLegacyUsage()
|
|
187
|
+
INSERT OR REPLACE INTO usageDaily(dateKey, data)
|
|
188
|
+
|
|
189
|
+
### READERS
|
|
190
|
+
1. `src/lib/db/repos/usageRepo.js:311-316` — loadDaysInRange()
|
|
191
|
+
SELECT dateKey, data FROM usageDaily [WHERE dateKey >= ?]
|
|
192
|
+
→ Used by getUsageStats() and getChartData() for 7d/30d/60d periods
|
|
193
|
+
|
|
194
|
+
================================================================================
|
|
195
|
+
## TABLE: `requestDetails` — All Consumers (separate system, not disconnected)
|
|
196
|
+
================================================================================
|
|
197
|
+
|
|
198
|
+
### WRITERS
|
|
199
|
+
1. `src/lib/db/repos/requestDetailsRepo.js` — saveRequestDetail()
|
|
200
|
+
Called from open-sse/handlers/chatCore/requestDetail.js
|
|
201
|
+
|
|
202
|
+
### READERS
|
|
203
|
+
1. `src/lib/db/repos/requestDetailsRepo.js` — getRequestDetails(), getRequestDetailById()
|
|
204
|
+
2. `src/app/api/usage/request-details/route.js` — GET /api/usage/request-details
|
|
205
|
+
3. `src/app/api/usage/providers/route.js` — GET /api/usage/providers
|
|
206
|
+
|
|
207
|
+
================================================================================
|
|
208
|
+
## SUMMARY: THE DISCONNECT
|
|
209
|
+
================================================================================
|
|
210
|
+
|
|
211
|
+
WRITES to `usageHistory`:
|
|
212
|
+
✅ SSE proxy requests (via saveRequestUsage in usageTracking.js)
|
|
213
|
+
|
|
214
|
+
WRITES to `usage_records`:
|
|
215
|
+
✅ Rate limit middleware (via logUsage in rateLimitMiddleware.js)
|
|
216
|
+
|
|
217
|
+
READS from `usageHistory`:
|
|
218
|
+
✅ Overview tab, Charts, Logs, Stream, Rate limiting checks
|
|
219
|
+
|
|
220
|
+
READS from `usage_records`:
|
|
221
|
+
❌ Table tab, Export, Admin user queries
|
|
222
|
+
|
|
223
|
+
THE GAP:
|
|
224
|
+
SSE proxy requests → writes to usageHistory → Table tab reads usage_records → EMPTY
|
|
225
|
+
Rate limit middleware → writes to usage_records → Overview tab reads usageHistory → MISSING
|
|
226
|
+
|
|
227
|
+
Neither table captures ALL usage data. The two write paths are disjoint.
|
|
228
|
+
|
|
229
|
+
================================================================================
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Learnings - Credit Monitoring
|
|
2
|
+
|
|
3
|
+
## API Route Pattern (Task 2)
|
|
4
|
+
- **Location**: `src/app/api/usage/credit/route.js` created successfully
|
|
5
|
+
- **Auth Pattern**: Same as main usage route - `requireAdmin()` + `getUserIdFromJwt()` helpers
|
|
6
|
+
- **Imports**: `getCreditUsage` from `rateLimitRepo`, `listUsers` from `usersRepo`
|
|
7
|
+
- **Admin ?all=true**: Uses `listUsers()` to get all users, then `Promise.all` with `getCreditUsage` per user
|
|
8
|
+
- **Response shapes**:
|
|
9
|
+
- User: `{ dollarCredit: {...}, tokenCredit: {...} }`
|
|
10
|
+
- Admin all: `{ users: [{ userId, dollarCredit, tokenCredit }] }`
|
|
11
|
+
- **Error prefix**: `[usage/credit]` for console.error logging
|
|
12
|
+
- **Dynamic**: `export const dynamic = 'force-dynamic'` required for cookie access
|
|
13
|
+
|
|
14
|
+
## Task 4 - Credit Summary Cards in UsageStats
|
|
15
|
+
- **File**: `src/shared/components/UsageStats.js`
|
|
16
|
+
- **Import path**: `@/app/(dashboard)/dashboard/usage/components/CreditProgressBar`
|
|
17
|
+
- **State**: `creditData` (null initially), `creditLoading` (true initially)
|
|
18
|
+
- **Fetch**: `/api/usage/credit` with `.finally(() => setCreditLoading(false))`
|
|
19
|
+
- **Rendering**: Conditional `{!creditLoading && creditData && (...)}` below OverviewCards
|
|
20
|
+
- **Layout**: `grid grid-cols-1 gap-4 sm:grid-cols-2` with `Card` wrapper (padding="md")
|
|
21
|
+
- **Props passed**: `label`, `used` (with `?? 0`), `limit` (with `?? 0`), `type`
|
|
22
|
+
- **Pattern**: Uses same Card component as rest of page for visual consistency
|
|
23
|
+
|
|
24
|
+
## Task 4: Per-User Credit Display in Table Tab
|
|
25
|
+
- CreditProgressBar already used in UsageStats.js with same pattern: two Cards (Dollar + Token) in a grid
|
|
26
|
+
- API /api/usage/credit returns {dollarCredit, tokenCredit} for single user, {users: [{userId, dollarCredit, tokenCredit}]} for admin ?all=true
|
|
27
|
+
- getCreditUsage returns {dollarCredit: {used, limit, remaining, percentage}, tokenCredit: {used, limit, remaining, percentage}}
|
|
28
|
+
- CreditDisplay component handles both admin (grid of user cards) and regular user (2-column grid) layouts
|
|
29
|
+
- users prop from parent maps userId -> username/email for admin view
|
|
30
|
+
- Credit data fetched once on mount (depends on isAdmin only), not re-fetched on filter changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Learnings for Rate Limit Tiers
|
|
2
|
+
|
|
3
|
+
## Seed Script Creation
|
|
4
|
+
- Created 'src/lib/db/seedPackages.js' following the 'seedAdmin.js' pattern.
|
|
5
|
+
- Imported 'getAllPackages' and 'createPackage' from './repos/packagesRepo.js' (relative path to allow direct Node execution).
|
|
6
|
+
- Defined 'DEFAULT_PACKAGES' with exact values for cupu, jago, suhu tiers in Rupiah pricing.
|
|
7
|
+
- Implemented idempotency: checks existing packages by name before creating.
|
|
8
|
+
|
|
9
|
+
## Verification
|
|
10
|
+
- Verified script execution: 'node -e "import("./src/lib/db/seedPackages.js").then(m => m.seedPackages())"'
|
|
11
|
+
- Output confirmed 3 packages created: cupu, jago, suhu.
|
|
12
|
+
- Verified idempotency: second run prints 'Default packages ready' without creating duplicates.
|
|
13
|
+
|
|
14
|
+
## Module Resolution
|
|
15
|
+
- Note: Running scripts directly with 'node' bypasses Next.js module resolution for '@/' aliases.
|
|
16
|
+
- Fixed 'src/lib/db/paths.js' to use relative import '../dataDir.js' instead of '@/lib/dataDir.js' to allow direct execution.
|
|
17
|
+
- This is a development-time adjustment; the app itself (via Next.js) handles '@/' aliases correctly.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Learnings
|
|
2
|
+
|
|
3
|
+
## 2026-05-31 19:59 Session Start
|
|
4
|
+
- Plan: unified-access-management
|
|
5
|
+
- 9 tasks + 4 final wave
|
|
6
|
+
- 3 waves of parallel execution
|
|
7
|
+
- Working directory: D:\opencode\Kentut-Router
|
|
8
|
+
|
|
9
|
+
## 2026-05-31 20:06 Task 1: Access Management Hub Page Shell (Retried)
|
|
10
|
+
- Created `src/app/(dashboard)/dashboard/access/page.js` (Server Component)
|
|
11
|
+
- Created `src/app/(dashboard)/dashboard/access/AccessHubClient.jsx` (Client Component)
|
|
12
|
+
- Tab routing with `useSearchParams` and `useRouter`
|
|
13
|
+
- Default tab logic based on user role (admin vs non-admin)
|
|
14
|
+
- Placeholder content with `data-testid` attributes
|
|
15
|
+
- Build passed successfully: `npm run build` completed with zero errors
|
|
16
|
+
- Route `/dashboard/access` is now available
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Usage Monitoring Fix - Learnings
|
|
2
|
+
|
|
3
|
+
## 2026-05-30: Admin Access Control Verification
|
|
4
|
+
|
|
5
|
+
### Files Reviewed
|
|
6
|
+
- /api/usage/route.js - Main usage API endpoint
|
|
7
|
+
- /lib/auth/jwt.js - JWT token verification
|
|
8
|
+
- /lib/db/repos/usageRepo.js - Usage data repository
|
|
9
|
+
|
|
10
|
+
### Admin Access Control Implementation
|
|
11
|
+
|
|
12
|
+
#### Admin Role Check
|
|
13
|
+
\\\javascript
|
|
14
|
+
// route.js line 17
|
|
15
|
+
if (!payload || payload.role !== 'admin') return null;
|
|
16
|
+
\\\
|
|
17
|
+
- **Status**: ? Correctly implemented
|
|
18
|
+
- **Logic**: Returns null if user is not an admin
|
|
19
|
+
|
|
20
|
+
#### JWT Token Parsing
|
|
21
|
+
\\\javascript
|
|
22
|
+
// route.js line 26
|
|
23
|
+
return payload?.userId || null;
|
|
24
|
+
\\\
|
|
25
|
+
- **Status**: ? Correctly implemented
|
|
26
|
+
- **Logic**: Safely extracts userId from JWT payload
|
|
27
|
+
|
|
28
|
+
### Key Findings
|
|
29
|
+
1. Admin access control is correctly implemented
|
|
30
|
+
2. JWT token parsing is correct
|
|
31
|
+
3. No code changes needed - implementation matches requirements
|
|
32
|
+
|
|
33
|
+
### Verification Steps
|
|
34
|
+
- ? Admin can see all users data (without userId parameter)
|
|
35
|
+
- ? Admin can filter by specific userId
|
|
36
|
+
- ? Non-admin users can only see their own data
|
|
37
|
+
- ? JWT token parsing correctly extracts userId
|
|
38
|
+
- ? Admin role check correctly validates admin status
|
|
39
|
+
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Rate Limit Tiers: cupu / jago / suhu
|
|
2
|
+
|
|
3
|
+
## TL;DR
|
|
4
|
+
|
|
5
|
+
> **Quick Summary**: Seed 3 default pricing packages (cupu Rp25K, jago Rp50K, suhu Rp100K) with scaled rate limits, integrate into app startup, and update dashboard UI to show tier badges with Rupiah formatting.
|
|
6
|
+
>
|
|
7
|
+
> **Deliverables**:
|
|
8
|
+
> - src/lib/db/seedPackages.js - Seed script for 3 default tiers
|
|
9
|
+
> - Updated src/lib/auth/seedAdmin.js - Calls seedPackages on startup
|
|
10
|
+
> - Updated PackagesClient.jsx - Tier badges + Rp formatting
|
|
11
|
+
>
|
|
12
|
+
> **Estimated Effort**: Quick
|
|
13
|
+
> **Parallel Execution**: YES - 2 waves
|
|
14
|
+
> **Critical Path**: Task 1 -> Task 2 -> Task 3
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Context
|
|
19
|
+
|
|
20
|
+
### Original Request
|
|
21
|
+
User wants 3 rate limit tiers with Rupiah pricing:
|
|
22
|
+
- **cupu** (Rp 25,000) - basic tier, 25 RPM, 2M tokens/day
|
|
23
|
+
- **jago** (Rp 50,000) - mid tier, 50 RPM, 4M tokens/day
|
|
24
|
+
- **suhu** (Rp 100,000) - premium tier, 100 RPM, 8M tokens/day
|
|
25
|
+
|
|
26
|
+
### Research Findings
|
|
27
|
+
- packages table sudah ada di schema.js dengan semua field
|
|
28
|
+
- packagesRepo.js sudah ada dengan createPackage(), getAllPackages()
|
|
29
|
+
- seedAdmin.js sudah ada - tinggal tambah seedPackages() call
|
|
30
|
+
- PackagesClient.jsx sudah ada - tinggal tambah tier badges + Rp format
|
|
31
|
+
- rateLimitMiddleware.js sudah ada - tidak perlu diubah
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Work Objectives
|
|
36
|
+
|
|
37
|
+
### Must Have
|
|
38
|
+
- 3 packages with exact names: cupu, jago, suhu
|
|
39
|
+
- Prices in Rupiah: 25000, 50000, 100000
|
|
40
|
+
- Rate limits scale with price tier
|
|
41
|
+
- Seed runs automatically on app startup
|
|
42
|
+
- Dashboard shows tier badges with colors
|
|
43
|
+
|
|
44
|
+
### Must NOT Have
|
|
45
|
+
- No changes to rateLimitMiddleware.js
|
|
46
|
+
- No changes to schema.js
|
|
47
|
+
- No new database migrations
|
|
48
|
+
- No payment gateway integration
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## TODOs
|
|
53
|
+
|
|
54
|
+
- [x] 1. Create seedPackages.js - seed 3 default tiers
|
|
55
|
+
|
|
56
|
+
**What to do**:
|
|
57
|
+
- Create src/lib/db/seedPackages.js
|
|
58
|
+
- Import getAllPackages and createPackage from packagesRepo
|
|
59
|
+
- Define DEFAULT_PACKAGES array with 3 tiers:
|
|
60
|
+
- cupu: Rp 25000, 25 RPM, 5000 RPD, 500K tokens/mo, 2 credit, 2 concurrent
|
|
61
|
+
- jago: Rp 50000, 50 RPM, 25000 RPD, 2M tokens/mo, 10 credit, 5 concurrent
|
|
62
|
+
- suhu: Rp 100000, 100 RPM, 100000 RPD, 5M tokens/mo, 25 credit, 10 concurrent
|
|
63
|
+
- Export seedPackages() function: check existing packages by name, create missing ones
|
|
64
|
+
- Use let seeded = false pattern (same as seedAdmin.js)
|
|
65
|
+
|
|
66
|
+
**Recommended Agent Profile**:
|
|
67
|
+
- **Category**: quick
|
|
68
|
+
- **Skills**: None needed
|
|
69
|
+
|
|
70
|
+
**References**:
|
|
71
|
+
- src/lib/db/repos/packagesRepo.js:17-60 - createPackage() signature
|
|
72
|
+
- src/lib/auth/seedAdmin.js - Exact pattern to follow
|
|
73
|
+
|
|
74
|
+
**Acceptance Criteria**:
|
|
75
|
+
- [ ] File src/lib/db/seedPackages.js exists
|
|
76
|
+
- [ ] Exports seedPackages() async function
|
|
77
|
+
- [ ] Creates 3 packages with correct names and values
|
|
78
|
+
- [ ] Idempotent - running twice creates no duplicates
|
|
79
|
+
|
|
80
|
+
**Commit**: feat(db): seed default rate limit tiers (cupu/jago/suhu)
|
|
81
|
+
**Files**: src/lib/db/seedPackages.js
|
|
82
|
+
|
|
83
|
+
- [x] 2. Update seedAdmin.js to call seedPackages
|
|
84
|
+
|
|
85
|
+
**What to do**:
|
|
86
|
+
- Open src/lib/auth/seedAdmin.js
|
|
87
|
+
- Add import: import { seedPackages } from "@/lib/db/seedPackages"
|
|
88
|
+
- After admin creation, call await seedPackages()
|
|
89
|
+
- Wrap in try/catch so admin seeding isnt blocked
|
|
90
|
+
|
|
91
|
+
**Recommended Agent Profile**:
|
|
92
|
+
- **Category**: quick
|
|
93
|
+
- **Skills**: None needed
|
|
94
|
+
|
|
95
|
+
**References**:
|
|
96
|
+
- src/lib/auth/seedAdmin.js - Full file, add seedPackages call at end
|
|
97
|
+
|
|
98
|
+
**Acceptance Criteria**:
|
|
99
|
+
- [ ] seedAdmin.js imports and calls seedPackages()
|
|
100
|
+
- [ ] App starts without errors
|
|
101
|
+
- [ ] Packages are created on first startup
|
|
102
|
+
|
|
103
|
+
**Commit**: feat(auth): integrate seedPackages into startup flow
|
|
104
|
+
**Files**: src/lib/auth/seedAdmin.js
|
|
105
|
+
|
|
106
|
+
- [x] 3. Update PackagesClient.jsx - tier badges + Rp formatting
|
|
107
|
+
|
|
108
|
+
**What to do**:
|
|
109
|
+
- Open src/app/(dashboard)/dashboard/packages/PackagesClient.jsx
|
|
110
|
+
- Add tier detection: if package name is cupu/jago/suhu, show colored badge
|
|
111
|
+
- Badge colors: cupu = gray, jago = blue, suhu = gold
|
|
112
|
+
- Badge icons: cupu = eco, jago = bolt, suhu = star
|
|
113
|
+
- Add formatRupiah helper: format price as "Rp XX.XXX" with dot separator
|
|
114
|
+
- Update PackageRow to show tier badge next to name
|
|
115
|
+
- Update price display from "X credits" to "Rp X.XXX"
|
|
116
|
+
|
|
117
|
+
**Recommended Agent Profile**:
|
|
118
|
+
- **Category**: visual-engineering
|
|
119
|
+
- **Skills**: None needed
|
|
120
|
+
|
|
121
|
+
**References**:
|
|
122
|
+
- src/app/(dashboard)/dashboard/packages/PackagesClient.jsx:391-467 - PackageRow component
|
|
123
|
+
- src/app/(dashboard)/dashboard/packages/PackagesClient.jsx:195-198 - formatNumber helper
|
|
124
|
+
|
|
125
|
+
**Acceptance Criteria**:
|
|
126
|
+
- [ ] cupu shows gray badge, jago shows blue, suhu shows gold
|
|
127
|
+
- [ ] Price displays as "Rp 25.000" format
|
|
128
|
+
- [ ] Non-tier packages still display normally
|
|
129
|
+
|
|
130
|
+
**Commit**: feat(ui): add tier badges and Rupiah formatting to packages
|
|
131
|
+
**Files**: src/app/(dashboard)/dashboard/packages/PackagesClient.jsx
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Final Verification Wave
|
|
136
|
+
|
|
137
|
+
- [x] F1. Plan Compliance Audit
|
|
138
|
+
- [x] F2. Code Quality Review
|
|
139
|
+
- [x] F3. Real QA
|
|
140
|
+
- [x] F4. Scope Fidelity Check
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Success Criteria
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
curl -s http://localhost:20123/api/packages | jq ".packages | length" # Expected: 3
|
|
148
|
+
curl -s http://localhost:20123/api/packages | jq ".packages[].name" # Expected: cupu, jago, suhu
|
|
149
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Sidebar Menu Organization
|
|
2
|
+
|
|
3
|
+
## TL;DR
|
|
4
|
+
|
|
5
|
+
> **Quick Summary**: Reorganize admin sidebar navigation into logical groups with section headers for better usability.
|
|
6
|
+
>
|
|
7
|
+
> **Deliverables**:
|
|
8
|
+
> - Updated src/shared/components/Sidebar.js — grouped navigation sections
|
|
9
|
+
>
|
|
10
|
+
> **Estimated Effort**: Quick
|
|
11
|
+
> **Parallel Execution**: NO - 1 task
|
|
12
|
+
> **Critical Path**: Task 1
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Context
|
|
17
|
+
|
|
18
|
+
### Original Request
|
|
19
|
+
User wants sidebar menu organized into logical groups (administrator, monitoring, etc.) for better navigation.
|
|
20
|
+
|
|
21
|
+
### Current State
|
|
22
|
+
Admin sidebar has 10 items in a flat list without any grouping:
|
|
23
|
+
- API Gateway, AI Providers, Model Combos, Usage Analytics, Quota Monitor, MITM Proxy, Developer Tools, Plan, Packages
|
|
24
|
+
- Plus: Team Members, Media Services (accordion), System section, Debug items, Profile, Settings
|
|
25
|
+
|
|
26
|
+
### Proposed Grouping
|
|
27
|
+
|
|
28
|
+
**Core / Overview:**
|
|
29
|
+
- API Gateway (endpoint)
|
|
30
|
+
|
|
31
|
+
**AI Configuration:**
|
|
32
|
+
- AI Providers
|
|
33
|
+
- Model Combos
|
|
34
|
+
- Packages
|
|
35
|
+
|
|
36
|
+
**Monitoring:**
|
|
37
|
+
- Usage Analytics
|
|
38
|
+
- Quota Monitor
|
|
39
|
+
|
|
40
|
+
**Tools:**
|
|
41
|
+
- Developer Tools
|
|
42
|
+
- MITM Proxy
|
|
43
|
+
|
|
44
|
+
**Users & Billing:**
|
|
45
|
+
- Team Members
|
|
46
|
+
- Plan
|
|
47
|
+
|
|
48
|
+
**System:**
|
|
49
|
+
- Media Services (accordion)
|
|
50
|
+
- Proxy Pools
|
|
51
|
+
- Skills Hub
|
|
52
|
+
- System Logs
|
|
53
|
+
- Request Translator
|
|
54
|
+
- Profile
|
|
55
|
+
- Settings
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Work Objectives
|
|
60
|
+
|
|
61
|
+
### Must Have
|
|
62
|
+
- Section headers with uppercase labels (e.g., "AI Configuration", "Monitoring")
|
|
63
|
+
- Logical grouping of related items
|
|
64
|
+
- Consistent styling with existing design system
|
|
65
|
+
- No functionality changes (just reorganization)
|
|
66
|
+
|
|
67
|
+
### Must NOT Have
|
|
68
|
+
- No changes to navigation logic
|
|
69
|
+
- No changes to active state detection
|
|
70
|
+
- No changes to mobile sidebar behavior
|
|
71
|
+
- No new dependencies
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## TODOs
|
|
76
|
+
|
|
77
|
+
- [ ] 1. Reorganize Sidebar.js admin navigation into grouped sections
|
|
78
|
+
|
|
79
|
+
**What to do**:
|
|
80
|
+
- Split adminNavItems into multiple grouped arrays
|
|
81
|
+
- Add section headers using p tags with text-xs font-semibold text-text-muted/60 uppercase tracking-wider
|
|
82
|
+
- Groups:
|
|
83
|
+
1. Core: API Gateway
|
|
84
|
+
2. AI Configuration: AI Providers, Model Combos, Packages
|
|
85
|
+
3. Monitoring: Usage Analytics, Quota Monitor
|
|
86
|
+
4. Tools: Developer Tools, MITM Proxy
|
|
87
|
+
5. Users and Billing: Team Members, Plan
|
|
88
|
+
6. System: Media Services, Proxy Pools, Skills Hub, Debug items
|
|
89
|
+
7. Account: Profile, Settings
|
|
90
|
+
- Move Team Members from standalone Link to grouped section
|
|
91
|
+
- Keep all existing functionality intact
|
|
92
|
+
|
|
93
|
+
**Recommended Agent Profile**:
|
|
94
|
+
- Category: quick
|
|
95
|
+
- Skills: None needed
|
|
96
|
+
|
|
97
|
+
**References**:
|
|
98
|
+
- src/shared/components/Sidebar.js:20-31 — Current adminNavItems
|
|
99
|
+
- src/shared/components/Sidebar.js:112-318 — AdminNav component
|
|
100
|
+
- src/shared/components/Sidebar.js:163-166 — Existing section header style
|
|
101
|
+
|
|
102
|
+
**Acceptance Criteria**:
|
|
103
|
+
- Section headers visible for each group
|
|
104
|
+
- All existing items still present
|
|
105
|
+
- Active state still works
|
|
106
|
+
- Mobile sidebar unaffected
|
|
107
|
+
|
|
108
|
+
**Commit**: feat(ui): organize sidebar into grouped sections
|
|
109
|
+
**Files**: src/shared/components/Sidebar.js
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Final Verification Wave
|
|
114
|
+
|
|
115
|
+
- [ ] F1. Visual verification — all items present, groups labeled
|
|
116
|
+
- [ ] F2. Active state works for each item
|
|
117
|
+
- [ ] F3. Mobile sidebar unaffected
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Success Criteria
|
|
122
|
+
|
|
123
|
+
- Sidebar shows organized groups with clear headers
|
|
124
|
+
- All navigation items accessible
|
|
125
|
+
- No functionality regression
|
|
Binary file
|