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.
Files changed (1056) hide show
  1. package/.dockerignore +32 -0
  2. package/.env.example +38 -0
  3. package/.github/dependabot.yml +2 -0
  4. package/.github/workflows/docker-publish.yml +60 -0
  5. package/.github/workflows/gitbook-pages.yml +50 -0
  6. package/.omo/boulder.json +15 -0
  7. package/.omo/evidence/scenario-1-hub-renders.png +0 -0
  8. package/.omo/evidence/scenario-2-api-keys-tab.png +0 -0
  9. package/.omo/evidence/scenario-2-packages-tab.png +0 -0
  10. package/.omo/evidence/scenario-3-users-table.png +0 -0
  11. package/.omo/evidence/scenario-4-keys-tab.png +0 -0
  12. package/.omo/evidence/scenario-5-packages-tab.png +0 -0
  13. package/.omo/evidence/scenario-6-redirect-keys.png +0 -0
  14. package/.omo/evidence/scenario-6-redirect-users.png +0 -0
  15. package/.omo/evidence/scenario-7-sidebar-access.png +0 -0
  16. package/.omo/evidence/task-1-data-flow-investigation.txt +254 -0
  17. package/.omo/evidence/task-1-schema-consumers.txt +229 -0
  18. package/.omo/evidence/task-F3-scenario1-page-loaded.png +0 -0
  19. package/.omo/evidence/task-F3-scenario2-table-view.png +0 -0
  20. package/.omo/evidence/task-F3-scenario3-filtered-view.png +0 -0
  21. package/.omo/evidence/task-F3-scenario4-chart-view.png +0 -0
  22. package/.omo/evidence/task-F3-scenario6-sorting.png +0 -0
  23. package/.omo/notepads/credit-monitoring/learnings.md +30 -0
  24. package/.omo/notepads/rate-limit-tiers/learnings.md +17 -0
  25. package/.omo/notepads/unified-access-management/decisions.md +7 -0
  26. package/.omo/notepads/unified-access-management/issues.md +3 -0
  27. package/.omo/notepads/unified-access-management/learnings.md +16 -0
  28. package/.omo/notepads/unified-access-management/problems.md +3 -0
  29. package/.omo/notepads/usage-monitoring-fix/learnings.md +39 -0
  30. package/.omo/plans/rate-limit-tiers.md +149 -0
  31. package/.omo/plans/sidebar-organization.md +125 -0
  32. package/.omo/plans/test.md +0 -0
  33. package/.omo/plans/unified-access-management.md +421 -0
  34. package/.omo/plans/user-dashboard-restructure.md +1381 -0
  35. package/.omo/plans/user-rate-limit.md +1686 -0
  36. package/.omo/run-continuation/ses_1956a961fffebAu8TmXjU0PKn4.json +10 -0
  37. package/.omo/run-continuation/ses_19624e6caffe2ns8GuxhGbXfA0.json +10 -0
  38. package/.omo/run-continuation/ses_1966a9bc3ffe6Hggqz47HxUO2x.json +11 -0
  39. package/.omo/run-continuation/ses_196732105ffecADA4DANbRiVcE.json +10 -0
  40. package/.test-data/db/data.sqlite +0 -0
  41. package/.vscode/settings.json +20 -0
  42. package/CHANGELOG.md +540 -0
  43. package/DOCKER.md +104 -0
  44. package/Dockerfile +52 -0
  45. package/LICENSE +1 -22
  46. package/README.md +1245 -52
  47. package/README.zh-CN.md +1311 -0
  48. package/SYNC_UPDATES.md +156 -0
  49. package/bin.js +2 -0
  50. package/captain-definition +4 -0
  51. package/check-connections.js +20 -0
  52. package/check-db.js +41 -0
  53. package/check-key.js +20 -0
  54. package/check-key2.js +21 -0
  55. package/check-mimo-conn.js +29 -0
  56. package/check-mimo.js +22 -0
  57. package/check-nodes.js +26 -0
  58. package/check-nodes2.js +29 -0
  59. package/check-providers.js +48 -0
  60. package/cli/LICENSE +42 -0
  61. package/cli/README.md +125 -0
  62. package/cli/cli.js +222 -0
  63. package/cli/hooks/postinstall.js +23 -0
  64. package/cli/hooks/sqliteRuntime.js +139 -0
  65. package/cli/hooks/trayRuntime.js +107 -0
  66. package/cli/kentutai-1.3.2.tgz +0 -0
  67. package/cli/package.json +22 -0
  68. package/cli/scripts/build-cli.js +265 -0
  69. package/cli/scripts/buildMitm.js +70 -0
  70. package/cli/src/cli/api/client.js +547 -0
  71. package/cli/src/cli/menus/apiKeys.js +233 -0
  72. package/cli/src/cli/menus/cliTools.js +618 -0
  73. package/cli/src/cli/menus/combos.js +477 -0
  74. package/cli/src/cli/menus/providers.js +845 -0
  75. package/cli/src/cli/menus/settings.js +207 -0
  76. package/cli/src/cli/terminalUI.js +121 -0
  77. package/cli/src/cli/tray/autostart.js +306 -0
  78. package/cli/src/cli/tray/icon.ico +0 -0
  79. package/cli/src/cli/tray/icon.png +0 -0
  80. package/cli/src/cli/tray/tray.js +322 -0
  81. package/cli/src/cli/tray/tray.ps1 +79 -0
  82. package/cli/src/cli/tray/trayWin.js +89 -0
  83. package/cli/src/cli/utils/clipboard.js +30 -0
  84. package/cli/src/cli/utils/display.js +42 -0
  85. package/cli/src/cli/utils/endpoint.js +32 -0
  86. package/cli/src/cli/utils/format.js +125 -0
  87. package/cli/src/cli/utils/input.js +130 -0
  88. package/cli/src/cli/utils/menuHelper.js +156 -0
  89. package/cli/src/cli/utils/modelSelector.js +136 -0
  90. package/dev.log +15 -0
  91. package/docs/ARCHITECTURE.md +557 -0
  92. package/eslint.config.mjs +16 -0
  93. package/gitbook/app/[lang]/[...slug]/page.js +36 -0
  94. package/gitbook/app/[lang]/page.js +26 -0
  95. package/gitbook/app/globals.css +190 -0
  96. package/gitbook/app/layout.js +21 -0
  97. package/gitbook/app/page.js +26 -0
  98. package/gitbook/components/DocsContent.js +13 -0
  99. package/gitbook/components/DocsHeader.js +78 -0
  100. package/gitbook/components/DocsLayout.js +25 -0
  101. package/gitbook/components/DocsSidebar.js +125 -0
  102. package/gitbook/components/DocsToc.js +61 -0
  103. package/gitbook/components/LanguageSwitcher.js +96 -0
  104. package/gitbook/constants/docsConfig.js +242 -0
  105. package/gitbook/constants/languages.js +19 -0
  106. package/gitbook/content/en/deployment/cloud.md +473 -0
  107. package/gitbook/content/en/deployment/localhost.md +164 -0
  108. package/gitbook/content/en/faq.md +387 -0
  109. package/gitbook/content/en/features/combos.md +537 -0
  110. package/gitbook/content/en/features/quota-tracking.md +687 -0
  111. package/gitbook/content/en/features/smart-routing.md +407 -0
  112. package/gitbook/content/en/getting-started/installation.md +478 -0
  113. package/gitbook/content/en/getting-started/quick-start.md +247 -0
  114. package/gitbook/content/en/index.md +164 -0
  115. package/gitbook/content/en/integration/claude-code.md +109 -0
  116. package/gitbook/content/en/integration/cline.md +201 -0
  117. package/gitbook/content/en/integration/codex.md +136 -0
  118. package/gitbook/content/en/integration/continue.md +249 -0
  119. package/gitbook/content/en/integration/cursor.md +149 -0
  120. package/gitbook/content/en/integration/other-tools.md +416 -0
  121. package/gitbook/content/en/integration/roo.md +127 -0
  122. package/gitbook/content/en/providers/cheap.md +462 -0
  123. package/gitbook/content/en/providers/free.md +442 -0
  124. package/gitbook/content/en/providers/subscription.md +404 -0
  125. package/gitbook/content/en/troubleshooting.md +351 -0
  126. package/gitbook/content/es/deployment/cloud.md +473 -0
  127. package/gitbook/content/es/deployment/localhost.md +164 -0
  128. package/gitbook/content/es/faq.md +387 -0
  129. package/gitbook/content/es/features/combos.md +537 -0
  130. package/gitbook/content/es/features/quota-tracking.md +687 -0
  131. package/gitbook/content/es/features/smart-routing.md +407 -0
  132. package/gitbook/content/es/getting-started/installation.md +478 -0
  133. package/gitbook/content/es/getting-started/quick-start.md +247 -0
  134. package/gitbook/content/es/index.md +164 -0
  135. package/gitbook/content/es/integration/claude-code.md +109 -0
  136. package/gitbook/content/es/integration/cline.md +201 -0
  137. package/gitbook/content/es/integration/codex.md +136 -0
  138. package/gitbook/content/es/integration/continue.md +249 -0
  139. package/gitbook/content/es/integration/cursor.md +149 -0
  140. package/gitbook/content/es/integration/other-tools.md +416 -0
  141. package/gitbook/content/es/integration/roo.md +127 -0
  142. package/gitbook/content/es/providers/cheap.md +462 -0
  143. package/gitbook/content/es/providers/free.md +442 -0
  144. package/gitbook/content/es/providers/subscription.md +404 -0
  145. package/gitbook/content/es/troubleshooting.md +351 -0
  146. package/gitbook/content/ja/deployment/cloud.md +473 -0
  147. package/gitbook/content/ja/deployment/localhost.md +164 -0
  148. package/gitbook/content/ja/faq.md +387 -0
  149. package/gitbook/content/ja/features/combos.md +537 -0
  150. package/gitbook/content/ja/features/quota-tracking.md +687 -0
  151. package/gitbook/content/ja/features/smart-routing.md +407 -0
  152. package/gitbook/content/ja/getting-started/installation.md +478 -0
  153. package/gitbook/content/ja/getting-started/quick-start.md +247 -0
  154. package/gitbook/content/ja/index.md +164 -0
  155. package/gitbook/content/ja/integration/claude-code.md +109 -0
  156. package/gitbook/content/ja/integration/cline.md +201 -0
  157. package/gitbook/content/ja/integration/codex.md +136 -0
  158. package/gitbook/content/ja/integration/continue.md +249 -0
  159. package/gitbook/content/ja/integration/cursor.md +149 -0
  160. package/gitbook/content/ja/integration/other-tools.md +416 -0
  161. package/gitbook/content/ja/integration/roo.md +127 -0
  162. package/gitbook/content/ja/providers/cheap.md +462 -0
  163. package/gitbook/content/ja/providers/free.md +442 -0
  164. package/gitbook/content/ja/providers/subscription.md +404 -0
  165. package/gitbook/content/ja/troubleshooting.md +351 -0
  166. package/gitbook/content/vi/deployment/cloud.md +473 -0
  167. package/gitbook/content/vi/deployment/localhost.md +164 -0
  168. package/gitbook/content/vi/faq.md +387 -0
  169. package/gitbook/content/vi/features/combos.md +537 -0
  170. package/gitbook/content/vi/features/quota-tracking.md +687 -0
  171. package/gitbook/content/vi/features/smart-routing.md +407 -0
  172. package/gitbook/content/vi/getting-started/installation.md +478 -0
  173. package/gitbook/content/vi/getting-started/quick-start.md +247 -0
  174. package/gitbook/content/vi/index.md +164 -0
  175. package/gitbook/content/vi/integration/claude-code.md +109 -0
  176. package/gitbook/content/vi/integration/cline.md +201 -0
  177. package/gitbook/content/vi/integration/codex.md +136 -0
  178. package/gitbook/content/vi/integration/continue.md +249 -0
  179. package/gitbook/content/vi/integration/cursor.md +149 -0
  180. package/gitbook/content/vi/integration/other-tools.md +416 -0
  181. package/gitbook/content/vi/integration/roo.md +127 -0
  182. package/gitbook/content/vi/providers/cheap.md +462 -0
  183. package/gitbook/content/vi/providers/free.md +442 -0
  184. package/gitbook/content/vi/providers/subscription.md +404 -0
  185. package/gitbook/content/vi/troubleshooting.md +351 -0
  186. package/gitbook/content/zh-CN/deployment/cloud.md +473 -0
  187. package/gitbook/content/zh-CN/deployment/localhost.md +164 -0
  188. package/gitbook/content/zh-CN/faq.md +387 -0
  189. package/gitbook/content/zh-CN/features/combos.md +537 -0
  190. package/gitbook/content/zh-CN/features/quota-tracking.md +687 -0
  191. package/gitbook/content/zh-CN/features/smart-routing.md +407 -0
  192. package/gitbook/content/zh-CN/getting-started/installation.md +478 -0
  193. package/gitbook/content/zh-CN/getting-started/quick-start.md +247 -0
  194. package/gitbook/content/zh-CN/index.md +164 -0
  195. package/gitbook/content/zh-CN/integration/claude-code.md +109 -0
  196. package/gitbook/content/zh-CN/integration/cline.md +201 -0
  197. package/gitbook/content/zh-CN/integration/codex.md +136 -0
  198. package/gitbook/content/zh-CN/integration/continue.md +249 -0
  199. package/gitbook/content/zh-CN/integration/cursor.md +149 -0
  200. package/gitbook/content/zh-CN/integration/other-tools.md +416 -0
  201. package/gitbook/content/zh-CN/integration/roo.md +127 -0
  202. package/gitbook/content/zh-CN/providers/cheap.md +462 -0
  203. package/gitbook/content/zh-CN/providers/free.md +442 -0
  204. package/gitbook/content/zh-CN/providers/subscription.md +404 -0
  205. package/gitbook/content/zh-CN/troubleshooting.md +351 -0
  206. package/gitbook/jsconfig.json +8 -0
  207. package/gitbook/lib/content.js +42 -0
  208. package/gitbook/next.config.mjs +24 -0
  209. package/gitbook/package.json +25 -0
  210. package/gitbook/postcss.config.mjs +5 -0
  211. package/gitbook/utils/markdown.js +218 -0
  212. package/i18n/README.ja-JP.md +1209 -0
  213. package/i18n/README.vi.md +1310 -0
  214. package/i18n/README.zh-CN.md +1306 -0
  215. package/images/9router.png +0 -0
  216. package/jsconfig.json +12 -0
  217. package/next.config.mjs +103 -0
  218. package/open-sse/config/appConstants.js +202 -0
  219. package/open-sse/config/codexInstructions.js +119 -0
  220. package/open-sse/config/constants.js +4 -0
  221. package/open-sse/config/defaultThinkingSignature.js +12 -0
  222. package/open-sse/config/errorConfig.js +85 -0
  223. package/open-sse/config/googleTtsLanguages.js +62 -0
  224. package/open-sse/config/kiroConstants.js +262 -0
  225. package/open-sse/config/models.js +13 -0
  226. package/open-sse/config/ollamaModels.js +19 -0
  227. package/open-sse/config/providerModels.js +904 -0
  228. package/open-sse/config/providers.js +457 -0
  229. package/open-sse/config/runtimeConfig.js +72 -0
  230. package/open-sse/config/ttsModels.js +129 -0
  231. package/open-sse/executors/antigravity.js +504 -0
  232. package/open-sse/executors/azure.js +57 -0
  233. package/open-sse/executors/base.js +177 -0
  234. package/open-sse/executors/codex.js +456 -0
  235. package/open-sse/executors/commandcode.js +88 -0
  236. package/open-sse/executors/cursor.js +795 -0
  237. package/open-sse/executors/default.js +317 -0
  238. package/open-sse/executors/gemini-cli.js +89 -0
  239. package/open-sse/executors/github.js +365 -0
  240. package/open-sse/executors/grok-web.js +345 -0
  241. package/open-sse/executors/iflow.js +108 -0
  242. package/open-sse/executors/index.js +72 -0
  243. package/open-sse/executors/kiro.js +503 -0
  244. package/open-sse/executors/ollama-local.js +14 -0
  245. package/open-sse/executors/opencode-go.js +41 -0
  246. package/open-sse/executors/opencode.js +27 -0
  247. package/open-sse/executors/perplexity-web.js +507 -0
  248. package/open-sse/executors/qoder.js +73 -0
  249. package/open-sse/executors/qwen.js +129 -0
  250. package/open-sse/executors/vertex.js +131 -0
  251. package/open-sse/handlers/chatCore/nonStreamingHandler.js +226 -0
  252. package/open-sse/handlers/chatCore/requestDetail.js +102 -0
  253. package/open-sse/handlers/chatCore/sseToJsonHandler.js +230 -0
  254. package/open-sse/handlers/chatCore/streamingHandler.js +99 -0
  255. package/open-sse/handlers/chatCore.js +276 -0
  256. package/open-sse/handlers/embeddingProviders/_base.js +4 -0
  257. package/open-sse/handlers/embeddingProviders/gemini.js +54 -0
  258. package/open-sse/handlers/embeddingProviders/index.js +23 -0
  259. package/open-sse/handlers/embeddingProviders/openai.js +39 -0
  260. package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +13 -0
  261. package/open-sse/handlers/embeddingsCore.js +126 -0
  262. package/open-sse/handlers/fetch/index.js +237 -0
  263. package/open-sse/handlers/imageGenerationCore.js +189 -0
  264. package/open-sse/handlers/imageProviders/_base.js +31 -0
  265. package/open-sse/handlers/imageProviders/blackForestLabs.js +43 -0
  266. package/open-sse/handlers/imageProviders/cloudflareAi.js +178 -0
  267. package/open-sse/handlers/imageProviders/codex.js +198 -0
  268. package/open-sse/handlers/imageProviders/comfyui.js +8 -0
  269. package/open-sse/handlers/imageProviders/falAi.js +41 -0
  270. package/open-sse/handlers/imageProviders/gemini.js +25 -0
  271. package/open-sse/handlers/imageProviders/huggingface.js +22 -0
  272. package/open-sse/handlers/imageProviders/index.js +40 -0
  273. package/open-sse/handlers/imageProviders/nanobanana.js +58 -0
  274. package/open-sse/handlers/imageProviders/openai.js +40 -0
  275. package/open-sse/handlers/imageProviders/runwayml.js +47 -0
  276. package/open-sse/handlers/imageProviders/sdwebui.js +17 -0
  277. package/open-sse/handlers/imageProviders/stabilityAi.js +34 -0
  278. package/open-sse/handlers/responsesHandler.js +103 -0
  279. package/open-sse/handlers/search/callers.js +371 -0
  280. package/open-sse/handlers/search/chatSearch.js +409 -0
  281. package/open-sse/handlers/search/index.js +201 -0
  282. package/open-sse/handlers/search/normalizers.js +223 -0
  283. package/open-sse/handlers/sttCore.js +194 -0
  284. package/open-sse/handlers/ttsCore.js +74 -0
  285. package/open-sse/handlers/ttsProviders/_base.js +39 -0
  286. package/open-sse/handlers/ttsProviders/edgeTts.js +89 -0
  287. package/open-sse/handlers/ttsProviders/elevenlabs.js +48 -0
  288. package/open-sse/handlers/ttsProviders/gemini.js +117 -0
  289. package/open-sse/handlers/ttsProviders/genericFormats.js +169 -0
  290. package/open-sse/handlers/ttsProviders/googleTts.js +54 -0
  291. package/open-sse/handlers/ttsProviders/index.js +50 -0
  292. package/open-sse/handlers/ttsProviders/localDevice.js +87 -0
  293. package/open-sse/handlers/ttsProviders/minimax.js +59 -0
  294. package/open-sse/handlers/ttsProviders/openai.js +30 -0
  295. package/open-sse/handlers/ttsProviders/openrouter.js +70 -0
  296. package/open-sse/index.js +74 -0
  297. package/open-sse/rtk/applyFilter.js +15 -0
  298. package/open-sse/rtk/autodetect.js +111 -0
  299. package/open-sse/rtk/caveman.js +100 -0
  300. package/open-sse/rtk/cavemanPrompts.js +35 -0
  301. package/open-sse/rtk/constants.js +55 -0
  302. package/open-sse/rtk/filters/buildOutput.js +127 -0
  303. package/open-sse/rtk/filters/dedupLog.js +44 -0
  304. package/open-sse/rtk/filters/find.js +49 -0
  305. package/open-sse/rtk/filters/gitDiff.js +92 -0
  306. package/open-sse/rtk/filters/gitStatus.js +117 -0
  307. package/open-sse/rtk/filters/grep.js +48 -0
  308. package/open-sse/rtk/filters/ls.js +79 -0
  309. package/open-sse/rtk/filters/readNumbered.js +27 -0
  310. package/open-sse/rtk/filters/searchList.js +52 -0
  311. package/open-sse/rtk/filters/smartTruncate.js +15 -0
  312. package/open-sse/rtk/filters/tree.js +32 -0
  313. package/open-sse/rtk/index.js +155 -0
  314. package/open-sse/rtk/registry.js +38 -0
  315. package/open-sse/services/accountFallback.js +215 -0
  316. package/open-sse/services/combo.js +198 -0
  317. package/open-sse/services/compact.js +71 -0
  318. package/open-sse/services/kiroModels.js +332 -0
  319. package/open-sse/services/model.js +255 -0
  320. package/open-sse/services/projectId.js +306 -0
  321. package/open-sse/services/provider.js +356 -0
  322. package/open-sse/services/tokenRefresh.js +876 -0
  323. package/open-sse/services/usage.js +1151 -0
  324. package/open-sse/transformer/responsesTransformer.js +439 -0
  325. package/open-sse/transformer/streamToJsonConverter.js +103 -0
  326. package/open-sse/translator/formats.js +36 -0
  327. package/open-sse/translator/helpers/claudeHelper.js +216 -0
  328. package/open-sse/translator/helpers/geminiHelper.js +372 -0
  329. package/open-sse/translator/helpers/imageHelper.js +34 -0
  330. package/open-sse/translator/helpers/maxTokensHelper.js +27 -0
  331. package/open-sse/translator/helpers/openaiHelper.js +130 -0
  332. package/open-sse/translator/helpers/responsesApiHelper.js +139 -0
  333. package/open-sse/translator/helpers/toolCallHelper.js +148 -0
  334. package/open-sse/translator/index.js +251 -0
  335. package/open-sse/translator/request/antigravity-to-openai.js +229 -0
  336. package/open-sse/translator/request/claude-to-openai.js +232 -0
  337. package/open-sse/translator/request/gemini-to-openai.js +147 -0
  338. package/open-sse/translator/request/openai-responses.js +318 -0
  339. package/open-sse/translator/request/openai-to-claude.js +381 -0
  340. package/open-sse/translator/request/openai-to-commandcode.js +170 -0
  341. package/open-sse/translator/request/openai-to-cursor.js +183 -0
  342. package/open-sse/translator/request/openai-to-gemini.js +470 -0
  343. package/open-sse/translator/request/openai-to-kiro.js +377 -0
  344. package/open-sse/translator/request/openai-to-kiro.old.js +278 -0
  345. package/open-sse/translator/request/openai-to-ollama.js +192 -0
  346. package/open-sse/translator/request/openai-to-vertex.js +42 -0
  347. package/open-sse/translator/response/claude-to-openai.js +206 -0
  348. package/open-sse/translator/response/commandcode-to-openai.js +197 -0
  349. package/open-sse/translator/response/cursor-to-openai.js +30 -0
  350. package/open-sse/translator/response/gemini-to-openai.js +245 -0
  351. package/open-sse/translator/response/kiro-to-openai.js +195 -0
  352. package/open-sse/translator/response/ollama-to-openai.js +152 -0
  353. package/open-sse/translator/response/openai-responses.js +590 -0
  354. package/open-sse/translator/response/openai-to-antigravity.js +122 -0
  355. package/open-sse/translator/response/openai-to-claude.js +266 -0
  356. package/open-sse/utils/bypassHandler.js +298 -0
  357. package/open-sse/utils/claudeCloaking.js +142 -0
  358. package/open-sse/utils/claudeHeaderCache.js +70 -0
  359. package/open-sse/utils/clientDetector.js +63 -0
  360. package/open-sse/utils/cursorChecksum.js +149 -0
  361. package/open-sse/utils/cursorProtobuf.js +904 -0
  362. package/open-sse/utils/debugLog.js +14 -0
  363. package/open-sse/utils/error.js +147 -0
  364. package/open-sse/utils/ollamaTransform.js +85 -0
  365. package/open-sse/utils/proxyFetch.js +368 -0
  366. package/open-sse/utils/reasoningContentInjector.js +77 -0
  367. package/open-sse/utils/requestLogger.js +260 -0
  368. package/open-sse/utils/sessionManager.js +82 -0
  369. package/open-sse/utils/stream.js +404 -0
  370. package/open-sse/utils/streamHandler.js +238 -0
  371. package/open-sse/utils/streamHelpers.js +122 -0
  372. package/open-sse/utils/toolDeduper.js +49 -0
  373. package/open-sse/utils/usageTracking.js +347 -0
  374. package/opencode.json +22 -0
  375. package/package.json +70 -28
  376. package/postcss.config.mjs +12 -0
  377. package/public/favicon.png +0 -0
  378. package/public/file.svg +1 -0
  379. package/public/globe.svg +1 -0
  380. package/public/i18n/literals/ar.json +194 -0
  381. package/public/i18n/literals/bn.json +194 -0
  382. package/public/i18n/literals/cs.json +194 -0
  383. package/public/i18n/literals/da.json +194 -0
  384. package/public/i18n/literals/de.json +194 -0
  385. package/public/i18n/literals/el.json +194 -0
  386. package/public/i18n/literals/es.json +194 -0
  387. package/public/i18n/literals/fi.json +194 -0
  388. package/public/i18n/literals/fr.json +194 -0
  389. package/public/i18n/literals/he.json +194 -0
  390. package/public/i18n/literals/hi.json +194 -0
  391. package/public/i18n/literals/hu.json +194 -0
  392. package/public/i18n/literals/id.json +194 -0
  393. package/public/i18n/literals/it.json +194 -0
  394. package/public/i18n/literals/ja.json +194 -0
  395. package/public/i18n/literals/ko.json +194 -0
  396. package/public/i18n/literals/nl.json +194 -0
  397. package/public/i18n/literals/no.json +194 -0
  398. package/public/i18n/literals/pl.json +194 -0
  399. package/public/i18n/literals/pt-BR.json +194 -0
  400. package/public/i18n/literals/pt-PT.json +194 -0
  401. package/public/i18n/literals/ro.json +194 -0
  402. package/public/i18n/literals/ru.json +194 -0
  403. package/public/i18n/literals/sv.json +194 -0
  404. package/public/i18n/literals/th.json +194 -0
  405. package/public/i18n/literals/tl.json +194 -0
  406. package/public/i18n/literals/tr.json +194 -0
  407. package/public/i18n/literals/uk.json +194 -0
  408. package/public/i18n/literals/ur.json +194 -0
  409. package/public/i18n/literals/vi.json +194 -0
  410. package/public/i18n/literals/zh-CN.json +768 -0
  411. package/public/i18n/literals/zh-TW.json +194 -0
  412. package/public/icon.ico +0 -0
  413. package/public/icons/icon-192.svg +4 -0
  414. package/public/icons/icon-512.svg +4 -0
  415. package/public/kentutai-icon.png +0 -0
  416. package/public/kentutai-logo.png +0 -0
  417. package/public/next.svg +1 -0
  418. package/public/providers/alicode-intl.png +0 -0
  419. package/public/providers/alicode.png +0 -0
  420. package/public/providers/amp.png +0 -0
  421. package/public/providers/anthropic-m.png +0 -0
  422. package/public/providers/anthropic.png +0 -0
  423. package/public/providers/antigravity.png +0 -0
  424. package/public/providers/assemblyai.png +0 -0
  425. package/public/providers/aws-polly.png +0 -0
  426. package/public/providers/azure.png +0 -0
  427. package/public/providers/black-forest-labs.png +0 -0
  428. package/public/providers/blackbox.png +0 -0
  429. package/public/providers/brave-search.png +0 -0
  430. package/public/providers/byteplus.png +0 -0
  431. package/public/providers/cartesia.png +0 -0
  432. package/public/providers/cerebras.png +0 -0
  433. package/public/providers/chutes.png +0 -0
  434. package/public/providers/claude.png +0 -0
  435. package/public/providers/cline.png +0 -0
  436. package/public/providers/cloudflare-ai.png +0 -0
  437. package/public/providers/codex.png +0 -0
  438. package/public/providers/cohere.png +0 -0
  439. package/public/providers/comfyui.png +0 -0
  440. package/public/providers/commandcode.png +0 -0
  441. package/public/providers/continue.png +0 -0
  442. package/public/providers/copilot.png +0 -0
  443. package/public/providers/coqui.png +0 -0
  444. package/public/providers/cursor.png +0 -0
  445. package/public/providers/deepgram.png +0 -0
  446. package/public/providers/deepseek-tui.png +0 -0
  447. package/public/providers/deepseek.png +0 -0
  448. package/public/providers/droid.png +0 -0
  449. package/public/providers/edge-tts.png +0 -0
  450. package/public/providers/elevenlabs.png +0 -0
  451. package/public/providers/exa.png +0 -0
  452. package/public/providers/fal-ai.png +0 -0
  453. package/public/providers/firecrawl.png +0 -0
  454. package/public/providers/fireworks.png +0 -0
  455. package/public/providers/gemini-cli.png +0 -0
  456. package/public/providers/gemini.png +0 -0
  457. package/public/providers/github.png +0 -0
  458. package/public/providers/glm-cn.png +0 -0
  459. package/public/providers/glm.png +0 -0
  460. package/public/providers/google-pse.png +0 -0
  461. package/public/providers/google-tts.png +0 -0
  462. package/public/providers/grok-web.png +0 -0
  463. package/public/providers/groq.png +0 -0
  464. package/public/providers/hermes.png +0 -0
  465. package/public/providers/huggingface.png +0 -0
  466. package/public/providers/hyperbolic.png +0 -0
  467. package/public/providers/iflow.png +0 -0
  468. package/public/providers/inworld.png +0 -0
  469. package/public/providers/jcode.png +0 -0
  470. package/public/providers/jina-ai.png +0 -0
  471. package/public/providers/jina-reader.png +0 -0
  472. package/public/providers/kilocode.png +0 -0
  473. package/public/providers/kimi-coding.png +0 -0
  474. package/public/providers/kimi.png +0 -0
  475. package/public/providers/kiro.png +0 -0
  476. package/public/providers/linkup.png +0 -0
  477. package/public/providers/local-device.png +0 -0
  478. package/public/providers/minimax-cn.png +0 -0
  479. package/public/providers/minimax.png +0 -0
  480. package/public/providers/mistral.png +0 -0
  481. package/public/providers/nanobanana.png +0 -0
  482. package/public/providers/nebius.png +0 -0
  483. package/public/providers/nvidia.png +0 -0
  484. package/public/providers/oai-cc.png +0 -0
  485. package/public/providers/oai-r.png +0 -0
  486. package/public/providers/ollama-local.png +0 -0
  487. package/public/providers/ollama.png +0 -0
  488. package/public/providers/openai.png +0 -0
  489. package/public/providers/openclaw.png +0 -0
  490. package/public/providers/opencode-go.png +0 -0
  491. package/public/providers/opencode.png +0 -0
  492. package/public/providers/openrouter.png +0 -0
  493. package/public/providers/perplexity-web.png +0 -0
  494. package/public/providers/perplexity.png +0 -0
  495. package/public/providers/playht.png +0 -0
  496. package/public/providers/qwen.png +0 -0
  497. package/public/providers/recraft.png +0 -0
  498. package/public/providers/roo.png +0 -0
  499. package/public/providers/runwayml.png +0 -0
  500. package/public/providers/sdwebui.png +0 -0
  501. package/public/providers/searchapi.png +0 -0
  502. package/public/providers/searxng.png +0 -0
  503. package/public/providers/serper.png +0 -0
  504. package/public/providers/siliconflow.png +0 -0
  505. package/public/providers/stability-ai.png +0 -0
  506. package/public/providers/tavily.png +0 -0
  507. package/public/providers/together.png +0 -0
  508. package/public/providers/topaz.png +0 -0
  509. package/public/providers/tortoise.png +0 -0
  510. package/public/providers/vertex-partner.png +0 -0
  511. package/public/providers/vertex.png +0 -0
  512. package/public/providers/volcengine-ark.png +0 -0
  513. package/public/providers/voyage-ai.png +0 -0
  514. package/public/providers/xai.png +0 -0
  515. package/public/providers/xiaomi-mimo.png +0 -0
  516. package/public/providers/xiaomi-tokenplan.png +0 -0
  517. package/public/providers/youcom.png +0 -0
  518. package/public/sw.js +22 -0
  519. package/public/vercel.svg +1 -0
  520. package/public/window.svg +1 -0
  521. package/scripts/build-cli.ps1 +51 -0
  522. package/scripts/build-cli.sh +23 -0
  523. package/scripts/translate-readme.js +201 -0
  524. package/server-error.log +2 -0
  525. package/server.log +245 -0
  526. package/skills/9router/SKILL.md +61 -0
  527. package/skills/9router-chat/SKILL.md +73 -0
  528. package/skills/9router-embeddings/SKILL.md +69 -0
  529. package/skills/9router-image/SKILL.md +86 -0
  530. package/skills/9router-stt/SKILL.md +79 -0
  531. package/skills/9router-tts/SKILL.md +80 -0
  532. package/skills/9router-web-fetch/SKILL.md +99 -0
  533. package/skills/9router-web-search/SKILL.md +91 -0
  534. package/skills/README.md +42 -0
  535. package/src/__tests__/integration/e2e.test.js +672 -0
  536. package/src/__tests__/setup.js +15 -0
  537. package/src/__tests__/vitest.test.js +7 -0
  538. package/src/app/(dashboard)/dashboard/access/AccessHubClient.jsx +126 -0
  539. package/src/app/(dashboard)/dashboard/access/components/UserExpandableRow.jsx +263 -0
  540. package/src/app/(dashboard)/dashboard/access/page.js +7 -0
  541. package/src/app/(dashboard)/dashboard/access/tabs/KeysTab.jsx +568 -0
  542. package/src/app/(dashboard)/dashboard/access/tabs/PackagesTab.jsx +56 -0
  543. package/src/app/(dashboard)/dashboard/access/tabs/UsersTab.jsx +205 -0
  544. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +967 -0
  545. package/src/app/(dashboard)/dashboard/basic-chat/page.js +9 -0
  546. package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.js +72 -0
  547. package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/ToolDetailClient.js +160 -0
  548. package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +11 -0
  549. package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +481 -0
  550. package/src/app/(dashboard)/dashboard/cli-tools/components/ApiKeySelect.js +66 -0
  551. package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +174 -0
  552. package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +390 -0
  553. package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +301 -0
  554. package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +402 -0
  555. package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +323 -0
  556. package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +640 -0
  557. package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +338 -0
  558. package/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js +271 -0
  559. package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +410 -0
  560. package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +128 -0
  561. package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +317 -0
  562. package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +380 -0
  563. package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +275 -0
  564. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmLinkCard.js +40 -0
  565. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js +329 -0
  566. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +318 -0
  567. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +388 -0
  568. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +500 -0
  569. package/src/app/(dashboard)/dashboard/cli-tools/components/ToolSummaryCard.js +40 -0
  570. package/src/app/(dashboard)/dashboard/cli-tools/components/cliEndpointMatch.js +13 -0
  571. package/src/app/(dashboard)/dashboard/cli-tools/components/index.js +19 -0
  572. package/src/app/(dashboard)/dashboard/cli-tools/page.js +9 -0
  573. package/src/app/(dashboard)/dashboard/combos/page.js +590 -0
  574. package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.js +91 -0
  575. package/src/app/(dashboard)/dashboard/console-log/page.js +8 -0
  576. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +1536 -0
  577. package/src/app/(dashboard)/dashboard/endpoint/page.js +18 -0
  578. package/src/app/(dashboard)/dashboard/keys/page.js +11 -0
  579. package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1903 -0
  580. package/src/app/(dashboard)/dashboard/media-providers/[kind]/page.js +289 -0
  581. package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +410 -0
  582. package/src/app/(dashboard)/dashboard/media-providers/web/page.js +209 -0
  583. package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +117 -0
  584. package/src/app/(dashboard)/dashboard/mitm/page.js +5 -0
  585. package/src/app/(dashboard)/dashboard/packages/PackagesClient.jsx +510 -0
  586. package/src/app/(dashboard)/dashboard/packages/page.js +11 -0
  587. package/src/app/(dashboard)/dashboard/page.js +25 -0
  588. package/src/app/(dashboard)/dashboard/plan/PlanClient.jsx +601 -0
  589. package/src/app/(dashboard)/dashboard/plan/page.js +26 -0
  590. package/src/app/(dashboard)/dashboard/profile/page.js +365 -0
  591. package/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js +392 -0
  592. package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +125 -0
  593. package/src/app/(dashboard)/dashboard/providers/[id]/CompatibleModelsSection.js +250 -0
  594. package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +295 -0
  595. package/src/app/(dashboard)/dashboard/providers/[id]/CooldownTimer.js +42 -0
  596. package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +161 -0
  597. package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.js +95 -0
  598. package/src/app/(dashboard)/dashboard/providers/[id]/PassthroughModelsSection.js +183 -0
  599. package/src/app/(dashboard)/dashboard/providers/[id]/page.js +1494 -0
  600. package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +1730 -0
  601. package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +500 -0
  602. package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +185 -0
  603. package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +294 -0
  604. package/src/app/(dashboard)/dashboard/providers/new/page.js +220 -0
  605. package/src/app/(dashboard)/dashboard/providers/page.js +1322 -0
  606. package/src/app/(dashboard)/dashboard/proxy-pools/page.js +1064 -0
  607. package/src/app/(dashboard)/dashboard/quota/page.js +17 -0
  608. package/src/app/(dashboard)/dashboard/settings/page.js +1051 -0
  609. package/src/app/(dashboard)/dashboard/settings/pricing/page.js +173 -0
  610. package/src/app/(dashboard)/dashboard/skills/page.js +112 -0
  611. package/src/app/(dashboard)/dashboard/translator/page.js +303 -0
  612. package/src/app/(dashboard)/dashboard/usage/UsageClient.jsx +874 -0
  613. package/src/app/(dashboard)/dashboard/usage/components/CreditProgressBar.js +112 -0
  614. package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +35 -0
  615. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.js +184 -0
  616. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.js +127 -0
  617. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +259 -0
  618. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +1288 -0
  619. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js +219 -0
  620. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +327 -0
  621. package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +433 -0
  622. package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +141 -0
  623. package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +247 -0
  624. package/src/app/(dashboard)/dashboard/usage/page.js +38 -0
  625. package/src/app/(dashboard)/dashboard/users/AddUserModal.jsx +285 -0
  626. package/src/app/(dashboard)/dashboard/users/UsersClient.jsx +188 -0
  627. package/src/app/(dashboard)/dashboard/users/[id]/page.js +708 -0
  628. package/src/app/(dashboard)/dashboard/users/page.js +11 -0
  629. package/src/app/(dashboard)/layout.js +9 -0
  630. package/src/app/api/auth/login/login.test.js +147 -0
  631. package/src/app/api/auth/login/route.js +76 -0
  632. package/src/app/api/auth/logout/logout.test.js +49 -0
  633. package/src/app/api/auth/logout/route.js +12 -0
  634. package/src/app/api/auth/me/me.test.js +81 -0
  635. package/src/app/api/auth/me/route.js +31 -0
  636. package/src/app/api/auth/oidc/callback/route.js +87 -0
  637. package/src/app/api/auth/oidc/start/route.js +52 -0
  638. package/src/app/api/auth/oidc/test/route.js +84 -0
  639. package/src/app/api/auth/profile/route.js +97 -0
  640. package/src/app/api/auth/register/register.test.js +104 -0
  641. package/src/app/api/auth/register/route.js +37 -0
  642. package/src/app/api/auth/status/route.js +68 -0
  643. package/src/app/api/auth/status/status.test.js +116 -0
  644. package/src/app/api/cli-tools/all-statuses/route.js +46 -0
  645. package/src/app/api/cli-tools/antigravity-mitm/alias/route.js +53 -0
  646. package/src/app/api/cli-tools/antigravity-mitm/route.js +202 -0
  647. package/src/app/api/cli-tools/claude-settings/route.js +203 -0
  648. package/src/app/api/cli-tools/cline-settings/route.js +133 -0
  649. package/src/app/api/cli-tools/codex-settings/route.js +238 -0
  650. package/src/app/api/cli-tools/copilot-settings/route.js +148 -0
  651. package/src/app/api/cli-tools/cowork-mcp-registry/route.js +77 -0
  652. package/src/app/api/cli-tools/cowork-mcp-tools/route.js +95 -0
  653. package/src/app/api/cli-tools/cowork-settings/route.js +410 -0
  654. package/src/app/api/cli-tools/deepseek-tui-settings/route.js +164 -0
  655. package/src/app/api/cli-tools/droid-settings/route.js +213 -0
  656. package/src/app/api/cli-tools/hermes-settings/route.js +175 -0
  657. package/src/app/api/cli-tools/jcode-settings/route.js +216 -0
  658. package/src/app/api/cli-tools/kilo-settings/route.js +131 -0
  659. package/src/app/api/cli-tools/openclaw-settings/route.js +292 -0
  660. package/src/app/api/cli-tools/opencode-settings/route.js +259 -0
  661. package/src/app/api/combos/[id]/route.js +81 -0
  662. package/src/app/api/combos/route.js +48 -0
  663. package/src/app/api/health/route.js +15 -0
  664. package/src/app/api/init/route.js +4 -0
  665. package/src/app/api/keys/[id]/route.js +117 -0
  666. package/src/app/api/keys/route.js +111 -0
  667. package/src/app/api/locale/route.js +30 -0
  668. package/src/app/api/mcp/[plugin]/message/route.js +19 -0
  669. package/src/app/api/mcp/[plugin]/sse/route.js +35 -0
  670. package/src/app/api/media-providers/tts/deepgram/voices/route.js +65 -0
  671. package/src/app/api/media-providers/tts/elevenlabs/voices/route.js +71 -0
  672. package/src/app/api/media-providers/tts/inworld/voices/route.js +61 -0
  673. package/src/app/api/media-providers/tts/minimax/voices/route.js +113 -0
  674. package/src/app/api/media-providers/tts/voices/route.js +99 -0
  675. package/src/app/api/models/alias/route.js +53 -0
  676. package/src/app/api/models/availability/route.js +103 -0
  677. package/src/app/api/models/custom/route.js +48 -0
  678. package/src/app/api/models/disabled/route.js +50 -0
  679. package/src/app/api/models/route.js +64 -0
  680. package/src/app/api/models/test/route.js +120 -0
  681. package/src/app/api/oauth/[provider]/[action]/route.js +333 -0
  682. package/src/app/api/oauth/codex/import-token/route.js +96 -0
  683. package/src/app/api/oauth/cursor/auto-import/route.js +258 -0
  684. package/src/app/api/oauth/cursor/import/route.js +100 -0
  685. package/src/app/api/oauth/gitlab/pat/route.js +62 -0
  686. package/src/app/api/oauth/iflow/cookie/route.js +137 -0
  687. package/src/app/api/oauth/kiro/auto-import/route.js +85 -0
  688. package/src/app/api/oauth/kiro/import/route.js +56 -0
  689. package/src/app/api/oauth/kiro/social-authorize/route.js +43 -0
  690. package/src/app/api/oauth/kiro/social-exchange/route.js +67 -0
  691. package/src/app/api/packages/[id]/route.js +152 -0
  692. package/src/app/api/packages/route.js +80 -0
  693. package/src/app/api/pricing/route.js +134 -0
  694. package/src/app/api/provider-nodes/[id]/route.js +101 -0
  695. package/src/app/api/provider-nodes/route.js +104 -0
  696. package/src/app/api/provider-nodes/validate/route.js +201 -0
  697. package/src/app/api/providers/[id]/models/route.js +490 -0
  698. package/src/app/api/providers/[id]/route.js +189 -0
  699. package/src/app/api/providers/[id]/test/route.js +23 -0
  700. package/src/app/api/providers/[id]/test/testUtils.js +658 -0
  701. package/src/app/api/providers/[id]/test-models/route.js +114 -0
  702. package/src/app/api/providers/client/route.js +126 -0
  703. package/src/app/api/providers/kilo/free-models/route.js +55 -0
  704. package/src/app/api/providers/route.js +191 -0
  705. package/src/app/api/providers/suggested-models/route.js +49 -0
  706. package/src/app/api/providers/test-batch/route.js +131 -0
  707. package/src/app/api/providers/validate/route.js +637 -0
  708. package/src/app/api/proxy-pools/[id]/route.js +123 -0
  709. package/src/app/api/proxy-pools/[id]/test/route.js +70 -0
  710. package/src/app/api/proxy-pools/cloudflare-deploy/route.js +145 -0
  711. package/src/app/api/proxy-pools/deno-deploy/route.js +175 -0
  712. package/src/app/api/proxy-pools/route.js +93 -0
  713. package/src/app/api/proxy-pools/vercel-deploy/route.js +142 -0
  714. package/src/app/api/settings/database/route.js +36 -0
  715. package/src/app/api/settings/proxy-test/route.js +23 -0
  716. package/src/app/api/settings/require-login/route.js +15 -0
  717. package/src/app/api/settings/route.js +100 -0
  718. package/src/app/api/shutdown/route.js +24 -0
  719. package/src/app/api/tags/route.js +18 -0
  720. package/src/app/api/translator/console-logs/route.js +24 -0
  721. package/src/app/api/translator/console-logs/stream/route.js +79 -0
  722. package/src/app/api/translator/load/route.js +45 -0
  723. package/src/app/api/translator/save/route.js +44 -0
  724. package/src/app/api/translator/send/route.js +58 -0
  725. package/src/app/api/translator/translate/route.js +90 -0
  726. package/src/app/api/tunnel/disable/route.js +12 -0
  727. package/src/app/api/tunnel/enable/route.js +16 -0
  728. package/src/app/api/tunnel/status/route.js +13 -0
  729. package/src/app/api/tunnel/tailscale-check/route.js +50 -0
  730. package/src/app/api/tunnel/tailscale-disable/route.js +12 -0
  731. package/src/app/api/tunnel/tailscale-enable/route.js +12 -0
  732. package/src/app/api/tunnel/tailscale-install/route.js +72 -0
  733. package/src/app/api/usage/[connectionId]/route.js +171 -0
  734. package/src/app/api/usage/chart/route.js +21 -0
  735. package/src/app/api/usage/credit/route.js +64 -0
  736. package/src/app/api/usage/export/route.js +222 -0
  737. package/src/app/api/usage/history/route.js +12 -0
  738. package/src/app/api/usage/logs/route.js +12 -0
  739. package/src/app/api/usage/providers/route.js +42 -0
  740. package/src/app/api/usage/request-details/route.js +57 -0
  741. package/src/app/api/usage/request-logs/route.js +13 -0
  742. package/src/app/api/usage/route.js +141 -0
  743. package/src/app/api/usage/stats/route.js +23 -0
  744. package/src/app/api/usage/stream/route.js +79 -0
  745. package/src/app/api/usage/summary/route.js +110 -0
  746. package/src/app/api/users/[id]/approve/route.js +89 -0
  747. package/src/app/api/users/[id]/limits/route.js +143 -0
  748. package/src/app/api/users/[id]/package/route.js +124 -0
  749. package/src/app/api/users/[id]/route.js +145 -0
  750. package/src/app/api/users/create-with-key/route.js +145 -0
  751. package/src/app/api/users/route.js +32 -0
  752. package/src/app/api/v1/api/chat/route.js +37 -0
  753. package/src/app/api/v1/audio/speech/route.js +16 -0
  754. package/src/app/api/v1/audio/transcriptions/route.js +19 -0
  755. package/src/app/api/v1/audio/voices/route.js +68 -0
  756. package/src/app/api/v1/chat/completions/route.js +35 -0
  757. package/src/app/api/v1/embeddings/route.js +21 -0
  758. package/src/app/api/v1/images/generations/route.js +16 -0
  759. package/src/app/api/v1/messages/count_tokens/route.js +52 -0
  760. package/src/app/api/v1/messages/route.js +36 -0
  761. package/src/app/api/v1/models/[kind]/route.js +55 -0
  762. package/src/app/api/v1/models/info/route.js +110 -0
  763. package/src/app/api/v1/models/route.js +432 -0
  764. package/src/app/api/v1/responses/compact/route.js +37 -0
  765. package/src/app/api/v1/responses/route.js +30 -0
  766. package/src/app/api/v1/route.js +1 -0
  767. package/src/app/api/v1/search/route.js +21 -0
  768. package/src/app/api/v1/web/fetch/route.js +21 -0
  769. package/src/app/api/v1beta/models/[...path]/route.js +328 -0
  770. package/src/app/api/v1beta/models/route.js +44 -0
  771. package/src/app/api/version/route.js +45 -0
  772. package/src/app/api/version/shutdown/route.js +15 -0
  773. package/src/app/api/version/update/route.js +21 -0
  774. package/src/app/callback/page.js +148 -0
  775. package/src/app/favicon.ico +0 -0
  776. package/src/app/globals.css +501 -0
  777. package/src/app/icon.ico +0 -0
  778. package/src/app/landing/components/AnimatedBackground.js +57 -0
  779. package/src/app/landing/components/Features.js +133 -0
  780. package/src/app/landing/components/FlowAnimation.js +175 -0
  781. package/src/app/landing/components/Footer.js +60 -0
  782. package/src/app/landing/components/GetStarted.js +97 -0
  783. package/src/app/landing/components/HeroSection.js +47 -0
  784. package/src/app/landing/components/HowItWorks.js +66 -0
  785. package/src/app/landing/components/Navigation.js +71 -0
  786. package/src/app/landing/page.js +77 -0
  787. package/src/app/layout.js +75 -0
  788. package/src/app/login/page.js +215 -0
  789. package/src/app/manifest.js +30 -0
  790. package/src/app/page.js +5 -0
  791. package/src/app/register/page.js +175 -0
  792. package/src/dashboardGuard.js +314 -0
  793. package/src/i18n/RuntimeI18nProvider.js +27 -0
  794. package/src/i18n/config.js +146 -0
  795. package/src/i18n/runtime.js +162 -0
  796. package/src/lib/appUpdater.js +200 -0
  797. package/src/lib/auth/dashboardSession.js +68 -0
  798. package/src/lib/auth/jwt.js +28 -0
  799. package/src/lib/auth/jwt.test.js +50 -0
  800. package/src/lib/auth/loginLimiter.js +52 -0
  801. package/src/lib/auth/loginLimiter.test.js +130 -0
  802. package/src/lib/auth/oidc.js +234 -0
  803. package/src/lib/auth/password.js +15 -0
  804. package/src/lib/auth/password.test.js +49 -0
  805. package/src/lib/auth/rateLimitMiddleware.js +256 -0
  806. package/src/lib/auth/rateLimitMiddleware.test.js +509 -0
  807. package/src/lib/auth/seedAdmin.js +47 -0
  808. package/src/lib/auth/seedAdmin.test.js +149 -0
  809. package/src/lib/auth/validation.js +26 -0
  810. package/src/lib/auth/validation.test.js +100 -0
  811. package/src/lib/consoleLogBuffer.js +79 -0
  812. package/src/lib/dataDir.js +31 -0
  813. package/src/lib/db/adapters/betterSqliteAdapter.js +55 -0
  814. package/src/lib/db/adapters/bunSqliteAdapter.js +63 -0
  815. package/src/lib/db/adapters/nodeSqliteAdapter.js +84 -0
  816. package/src/lib/db/adapters/sqljsAdapter.js +115 -0
  817. package/src/lib/db/backup.js +35 -0
  818. package/src/lib/db/driver.js +85 -0
  819. package/src/lib/db/helpers/jsonCol.js +9 -0
  820. package/src/lib/db/helpers/kvStore.js +39 -0
  821. package/src/lib/db/helpers/metaStore.js +22 -0
  822. package/src/lib/db/index.js +185 -0
  823. package/src/lib/db/migrate.js +286 -0
  824. package/src/lib/db/migrations/001-initial.js +14 -0
  825. package/src/lib/db/migrations/002-users-rate-limit.js +39 -0
  826. package/src/lib/db/migrations/003-api-key-comment.js +9 -0
  827. package/src/lib/db/migrations/003-packages-per-key-settings.js +69 -0
  828. package/src/lib/db/migrations/004-usage-tracking.js +30 -0
  829. package/src/lib/db/migrations/005-user-profile-fields.js +19 -0
  830. package/src/lib/db/migrations/006-daily-token-limit.js +16 -0
  831. package/src/lib/db/migrations/index.js +15 -0
  832. package/src/lib/db/paths.js +18 -0
  833. package/src/lib/db/repos/aliasRepo.js +62 -0
  834. package/src/lib/db/repos/apiKeysRepo.js +110 -0
  835. package/src/lib/db/repos/combosRepo.js +73 -0
  836. package/src/lib/db/repos/connectionsRepo.js +226 -0
  837. package/src/lib/db/repos/disabledModelsRepo.js +56 -0
  838. package/src/lib/db/repos/nodesRepo.js +95 -0
  839. package/src/lib/db/repos/packagesRepo.js +257 -0
  840. package/src/lib/db/repos/pricingRepo.js +108 -0
  841. package/src/lib/db/repos/proxyPoolsRepo.js +103 -0
  842. package/src/lib/db/repos/rateLimitRepo.js +192 -0
  843. package/src/lib/db/repos/rateLimitRepo.test.js +73 -0
  844. package/src/lib/db/repos/requestDetailsRepo.js +200 -0
  845. package/src/lib/db/repos/settingsRepo.js +104 -0
  846. package/src/lib/db/repos/usageRecordsRepo.js +264 -0
  847. package/src/lib/db/repos/usageRepo.js +948 -0
  848. package/src/lib/db/repos/usersRepo.js +118 -0
  849. package/src/lib/db/repos/usersRepo.test.js +111 -0
  850. package/src/lib/db/schema.js +256 -0
  851. package/src/lib/db/schemaHelpers.js +37 -0
  852. package/src/lib/db/seedPackages.js +69 -0
  853. package/src/lib/db/version.js +21 -0
  854. package/src/lib/disabledModelsDb.js +4 -0
  855. package/src/lib/localDb.js +27 -0
  856. package/src/lib/mcp/stdioSseBridge.js +198 -0
  857. package/src/lib/mitmAliasCache.js +46 -0
  858. package/src/lib/network/connectionProxy.js +160 -0
  859. package/src/lib/network/initOutboundProxy.js +25 -0
  860. package/src/lib/network/outboundProxy.js +68 -0
  861. package/src/lib/network/proxyTest.js +91 -0
  862. package/src/lib/oauth/constants/oauth.js +276 -0
  863. package/src/lib/oauth/constants/xai.js +61 -0
  864. package/src/lib/oauth/providers.js +1453 -0
  865. package/src/lib/oauth/services/antigravity.js +321 -0
  866. package/src/lib/oauth/services/claude.js +136 -0
  867. package/src/lib/oauth/services/codex.js +144 -0
  868. package/src/lib/oauth/services/cursor.js +179 -0
  869. package/src/lib/oauth/services/gemini.js +240 -0
  870. package/src/lib/oauth/services/github.js +225 -0
  871. package/src/lib/oauth/services/iflow.js +202 -0
  872. package/src/lib/oauth/services/index.js +17 -0
  873. package/src/lib/oauth/services/kiro.js +313 -0
  874. package/src/lib/oauth/services/oauth.js +157 -0
  875. package/src/lib/oauth/services/openai.js +123 -0
  876. package/src/lib/oauth/services/qoder.js +232 -0
  877. package/src/lib/oauth/services/qwen.js +170 -0
  878. package/src/lib/oauth/services/xai.js +238 -0
  879. package/src/lib/oauth/utils/banner.js +63 -0
  880. package/src/lib/oauth/utils/pkce.js +39 -0
  881. package/src/lib/oauth/utils/server.js +415 -0
  882. package/src/lib/oauth/utils/ui.js +48 -0
  883. package/src/lib/providerNormalization.js +45 -0
  884. package/src/lib/requestDetailsDb.js +4 -0
  885. package/src/lib/tunnel/cloudflare/cloudflared.js +438 -0
  886. package/src/lib/tunnel/cloudflare/config.js +9 -0
  887. package/src/lib/tunnel/cloudflare/healthCheck.js +29 -0
  888. package/src/lib/tunnel/cloudflare/manager.js +148 -0
  889. package/src/lib/tunnel/cloudflare/pid.js +23 -0
  890. package/src/lib/tunnel/index.js +46 -0
  891. package/src/lib/tunnel/shared/dnsResolver.js +17 -0
  892. package/src/lib/tunnel/shared/internetCheck.js +26 -0
  893. package/src/lib/tunnel/shared/state.js +41 -0
  894. package/src/lib/tunnel/shared/watchdogConfig.js +5 -0
  895. package/src/lib/tunnel/tailscale/config.js +7 -0
  896. package/src/lib/tunnel/tailscale/healthCheck.js +29 -0
  897. package/src/lib/tunnel/tailscale/manager.js +129 -0
  898. package/src/lib/tunnel/tailscale/tailscale.js +790 -0
  899. package/src/lib/updater/updater.js +235 -0
  900. package/src/lib/usage/aggregation.js +121 -0
  901. package/src/lib/usage/fetcher.js +208 -0
  902. package/src/lib/usageDb.js +8 -0
  903. package/src/mitm/antigravityIdeVersion.js +50 -0
  904. package/src/mitm/cert/generate.js +32 -0
  905. package/src/mitm/cert/install.js +269 -0
  906. package/src/mitm/cert/rootCA.js +173 -0
  907. package/src/mitm/config.js +73 -0
  908. package/src/mitm/dbReader.js +22 -0
  909. package/src/mitm/dns/dnsConfig.js +266 -0
  910. package/src/mitm/handlers/antigravity.js +33 -0
  911. package/src/mitm/handlers/base.js +68 -0
  912. package/src/mitm/handlers/copilot.js +35 -0
  913. package/src/mitm/handlers/cursor.js +15 -0
  914. package/src/mitm/handlers/kiro.js +401 -0
  915. package/src/mitm/logger.js +106 -0
  916. package/src/mitm/manager.js +851 -0
  917. package/src/mitm/paths.js +32 -0
  918. package/src/mitm/server.js +403 -0
  919. package/src/mitm/winElevated.js +81 -0
  920. package/src/models/index.js +38 -0
  921. package/src/proxy.js +5 -0
  922. package/src/shared/components/AddCustomEmbeddingModal.js +183 -0
  923. package/src/shared/components/AuthProvider.js +17 -0
  924. package/src/shared/components/Avatar.js +88 -0
  925. package/src/shared/components/Badge.js +54 -0
  926. package/src/shared/components/Button.js +56 -0
  927. package/src/shared/components/Card.js +116 -0
  928. package/src/shared/components/ChangelogModal.js +97 -0
  929. package/src/shared/components/ComboFormModal.js +176 -0
  930. package/src/shared/components/CursorAuthModal.js +212 -0
  931. package/src/shared/components/DonateModal.js +136 -0
  932. package/src/shared/components/Drawer.js +82 -0
  933. package/src/shared/components/EditConnectionModal.js +289 -0
  934. package/src/shared/components/Footer.js +132 -0
  935. package/src/shared/components/GitLabAuthModal.js +194 -0
  936. package/src/shared/components/Header.js +354 -0
  937. package/src/shared/components/HeaderMenu.js +158 -0
  938. package/src/shared/components/IFlowCookieModal.js +132 -0
  939. package/src/shared/components/Input.js +96 -0
  940. package/src/shared/components/KiroAuthModal.js +383 -0
  941. package/src/shared/components/KiroOAuthWrapper.js +103 -0
  942. package/src/shared/components/KiroSocialOAuthModal.js +205 -0
  943. package/src/shared/components/LanguageSwitcher.js +190 -0
  944. package/src/shared/components/Loading.js +75 -0
  945. package/src/shared/components/ManualConfigModal.js +44 -0
  946. package/src/shared/components/McpMarketplaceModal.js +255 -0
  947. package/src/shared/components/Modal.js +146 -0
  948. package/src/shared/components/ModelSelectModal.js +537 -0
  949. package/src/shared/components/NeuralNetworkBG.js +175 -0
  950. package/src/shared/components/NoAuthProxyCard.js +86 -0
  951. package/src/shared/components/OAuthModal.js +660 -0
  952. package/src/shared/components/Pagination.js +150 -0
  953. package/src/shared/components/PricingModal.js +208 -0
  954. package/src/shared/components/ProviderIcon.js +51 -0
  955. package/src/shared/components/ProviderInfoCard.js +82 -0
  956. package/src/shared/components/RequestLogger.js +121 -0
  957. package/src/shared/components/SegmentedControl.js +48 -0
  958. package/src/shared/components/Select.js +67 -0
  959. package/src/shared/components/Sidebar.js +518 -0
  960. package/src/shared/components/ThemeProvider.js +15 -0
  961. package/src/shared/components/ThemeToggle.js +42 -0
  962. package/src/shared/components/Toggle.js +69 -0
  963. package/src/shared/components/Tooltip.js +25 -0
  964. package/src/shared/components/UsageStats.js +540 -0
  965. package/src/shared/components/index.js +43 -0
  966. package/src/shared/components/layouts/AuthLayout.js +29 -0
  967. package/src/shared/components/layouts/DashboardLayout.js +108 -0
  968. package/src/shared/components/layouts/index.js +4 -0
  969. package/src/shared/constants/cliTools.js +383 -0
  970. package/src/shared/constants/colors.js +77 -0
  971. package/src/shared/constants/config.js +99 -0
  972. package/src/shared/constants/coworkPlugins.js +75 -0
  973. package/src/shared/constants/index.js +4 -0
  974. package/src/shared/constants/mitmToolHosts.js +12 -0
  975. package/src/shared/constants/models.js +38 -0
  976. package/src/shared/constants/pricing.js +301 -0
  977. package/src/shared/constants/providers.js +287 -0
  978. package/src/shared/constants/skills.js +78 -0
  979. package/src/shared/constants/ttsProviders.js +138 -0
  980. package/src/shared/hooks/index.js +2 -0
  981. package/src/shared/hooks/useCopyToClipboard.js +43 -0
  982. package/src/shared/hooks/useTheme.js +60 -0
  983. package/src/shared/services/bootstrap.js +12 -0
  984. package/src/shared/services/initializeApp.js +282 -0
  985. package/src/shared/utils/api.js +93 -0
  986. package/src/shared/utils/apiKey.js +98 -0
  987. package/src/shared/utils/clineAuth.js +37 -0
  988. package/src/shared/utils/cn.js +11 -0
  989. package/src/shared/utils/index.js +40 -0
  990. package/src/shared/utils/machine.js +6 -0
  991. package/src/shared/utils/machineId.js +66 -0
  992. package/src/shared/utils/providerModelsFetcher.js +30 -0
  993. package/src/sse/handlers/chat.js +249 -0
  994. package/src/sse/handlers/embeddings.js +142 -0
  995. package/src/sse/handlers/fetch.js +213 -0
  996. package/src/sse/handlers/imageGeneration.js +142 -0
  997. package/src/sse/handlers/search.js +206 -0
  998. package/src/sse/handlers/stt.js +88 -0
  999. package/src/sse/handlers/tts.js +114 -0
  1000. package/src/sse/services/auth.js +308 -0
  1001. package/src/sse/services/model.js +83 -0
  1002. package/src/sse/services/tokenRefresh.js +305 -0
  1003. package/src/sse/utils/logger.js +75 -0
  1004. package/src/store/headerSearchStore.js +19 -0
  1005. package/src/store/index.js +6 -0
  1006. package/src/store/notificationStore.js +45 -0
  1007. package/src/store/providerStore.js +55 -0
  1008. package/src/store/settingsStore.js +51 -0
  1009. package/src/store/themeStore.js +54 -0
  1010. package/src/store/userStore.js +36 -0
  1011. package/start.sh +4 -0
  1012. package/tester/translator/testFromFile.js +148 -0
  1013. package/tests/README.md +51 -0
  1014. package/tests/package.json +17 -0
  1015. package/tests/unit/antigravity-cache.test.js +216 -0
  1016. package/tests/unit/buildOutputFilter.test.js +232 -0
  1017. package/tests/unit/buildOutputFilterAdversarial.test.js +357 -0
  1018. package/tests/unit/claude-header-forwarding.test.js +417 -0
  1019. package/tests/unit/codex-image-fetch.test.js +145 -0
  1020. package/tests/unit/codex-refresh-token.test.js +83 -0
  1021. package/tests/unit/combo-routing.test.js +58 -0
  1022. package/tests/unit/commandcode-to-openai.test.js +127 -0
  1023. package/tests/unit/compatible-provider-connections.test.js +170 -0
  1024. package/tests/unit/cursor-composer-thinking.test.js +86 -0
  1025. package/tests/unit/dashboard-guard.test.js +208 -0
  1026. package/tests/unit/db-benchmark.test.js +174 -0
  1027. package/tests/unit/db-concurrent.test.js +171 -0
  1028. package/tests/unit/db-driver-chain.test.js +59 -0
  1029. package/tests/unit/db-migration-chain.test.js +100 -0
  1030. package/tests/unit/db-sqlite-vs-lowdb.test.js +274 -0
  1031. package/tests/unit/embeddings.cloud.test.js +524 -0
  1032. package/tests/unit/embeddingsCore.test.js +631 -0
  1033. package/tests/unit/gemini-usage-projectid.test.js +87 -0
  1034. package/tests/unit/image-generation.test.js +514 -0
  1035. package/tests/unit/minimax-tts.test.js +120 -0
  1036. package/tests/unit/minimax-usage.test.js +116 -0
  1037. package/tests/unit/minimax-voices.test.js +83 -0
  1038. package/tests/unit/oauth-cursor-auto-import.test.js +184 -0
  1039. package/tests/unit/openai-to-claude-response-tools.test.js +61 -0
  1040. package/tests/unit/openai-to-claude.test.js +162 -0
  1041. package/tests/unit/openai-to-commandcode.test.js +181 -0
  1042. package/tests/unit/openai-to-kiro.test.js +146 -0
  1043. package/tests/unit/perplexity-web.test.js +306 -0
  1044. package/tests/unit/provider-validation.test.js +271 -0
  1045. package/tests/unit/rtk.e2e.test.js +136 -0
  1046. package/tests/unit/rtk.multi-provider.e2e.test.js +137 -0
  1047. package/tests/unit/rtk.test.js +358 -0
  1048. package/tests/unit/rtkKiro.test.js +291 -0
  1049. package/tests/unit/translator-request-normalization.test.js +186 -0
  1050. package/tests/unit/web-cookie-validation.test.js +187 -0
  1051. package/tests/unit/xai-oauth-service.test.js +125 -0
  1052. package/tests/unit/xai-tokenRefresh.test.js +63 -0
  1053. package/tests/vitest.config.js +23 -0
  1054. package/tsconfig.json +44 -0
  1055. package/vitest.config.js +21 -0
  1056. 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
+ ================================================================================
@@ -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,7 @@
1
+ # Decisions
2
+
3
+ ## Architecture
4
+ - Hub at /dashboard/access with URL-based tab state
5
+ - RTK/Caveman: per-key only (removed from AddUserModal)
6
+ - PackagesTab: full CRUD embedded
7
+ - Non-admin: API Keys tab only
@@ -0,0 +1,3 @@
1
+ # Issues
2
+
3
+ (none yet)
@@ -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,3 @@
1
+ # Problems
2
+
3
+ (none yet)
@@ -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