claude-code-workflow 7.2.26 → 7.2.28

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 (408) hide show
  1. package/.ccw/specs/architecture-constraints.md +5 -0
  2. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
  3. package/.claude/skills/investigate/SKILL.md +110 -0
  4. package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
  5. package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
  6. package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
  7. package/.claude/skills/investigate/phases/04-implementation.md +139 -0
  8. package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
  9. package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
  10. package/.claude/skills/investigate/specs/iron-law.md +101 -0
  11. package/.claude/skills/security-audit/SKILL.md +125 -0
  12. package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
  13. package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
  14. package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
  15. package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
  16. package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
  17. package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
  18. package/.claude/skills/ship/SKILL.md +105 -0
  19. package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
  20. package/.claude/skills/ship/phases/02-code-review.md +137 -0
  21. package/.claude/skills/ship/phases/03-version-bump.md +171 -0
  22. package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
  23. package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
  24. package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
  25. package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
  26. package/.claude/skills/team-arch-opt/SKILL.md +1 -1
  27. package/.claude/skills/team-arch-opt/roles/coordinator/commands/monitor.md +3 -1
  28. package/.claude/skills/team-arch-opt/roles/refactorer/role.md +3 -1
  29. package/.claude/skills/team-arch-opt/specs/team-config.json +2 -2
  30. package/.claude/skills/team-coordinate/SKILL.md +4 -3
  31. package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +1 -1
  32. package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +3 -2
  33. package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +3 -2
  34. package/.claude/skills/team-coordinate/roles/coordinator/role.md +16 -15
  35. package/.claude/skills/team-coordinate/specs/pipelines.md +7 -4
  36. package/.claude/skills/team-coordinate/specs/role-spec-template.md +1 -0
  37. package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
  38. package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
  39. package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
  40. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
  41. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
  42. package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
  43. package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
  44. package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
  45. package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
  46. package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
  47. package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
  48. package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
  49. package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
  50. package/.claude/skills/team-lifecycle-v4/SKILL.md +1 -1
  51. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +14 -2
  52. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +24 -2
  53. package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +3 -1
  54. package/.claude/skills/team-motion-design/SKILL.md +129 -0
  55. package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
  56. package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
  57. package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
  58. package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
  59. package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
  60. package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
  61. package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
  62. package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
  63. package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
  64. package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
  65. package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
  66. package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
  67. package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
  68. package/.claude/skills/team-perf-opt/SKILL.md +1 -1
  69. package/.claude/skills/team-perf-opt/roles/optimizer/role.md +3 -1
  70. package/.claude/skills/team-perf-opt/specs/team-config.json +2 -2
  71. package/.claude/skills/team-quality-assurance/SKILL.md +1 -1
  72. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +4 -2
  73. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +4 -2
  74. package/.claude/skills/team-quality-assurance/roles/executor/role.md +3 -1
  75. package/.claude/skills/team-testing/SKILL.md +1 -1
  76. package/.claude/skills/team-testing/roles/coordinator/commands/dispatch.md +5 -2
  77. package/.claude/skills/team-testing/roles/coordinator/commands/monitor.md +4 -2
  78. package/.claude/skills/team-testing/roles/executor/role.md +3 -1
  79. package/.claude/skills/team-ui-polish/SKILL.md +127 -0
  80. package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
  81. package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
  82. package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
  83. package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
  84. package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
  85. package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
  86. package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
  87. package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
  88. package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
  89. package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
  90. package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
  91. package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
  92. package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
  93. package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
  94. package/.claude/skills/team-uidesign/SKILL.md +6 -1
  95. package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
  96. package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
  97. package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
  98. package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
  99. package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
  100. package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
  101. package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
  102. package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
  103. package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
  104. package/.claude/skills/team-ux-improve/SKILL.md +3 -0
  105. package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
  106. package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
  107. package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
  108. package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
  109. package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
  110. package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
  111. package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
  112. package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
  113. package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
  114. package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
  115. package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
  116. package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
  117. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
  118. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
  119. package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
  120. package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
  121. package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
  122. package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
  123. package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
  124. package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
  125. package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
  126. package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
  127. package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
  128. package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
  129. package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
  130. package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
  131. package/.codex/skills/investigate/agents/investigator.md +392 -0
  132. package/.codex/skills/investigate/orchestrator.md +362 -0
  133. package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
  134. package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
  135. package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
  136. package/.codex/skills/investigate/phases/04-implementation.md +195 -0
  137. package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
  138. package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
  139. package/.codex/skills/security-audit/orchestrator.md +384 -0
  140. package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
  141. package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
  142. package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
  143. package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
  144. package/.codex/skills/ship/agents/ship-operator.md +318 -0
  145. package/.codex/skills/ship/orchestrator.md +426 -0
  146. package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
  147. package/.codex/skills/ship/phases/02-code-review.md +228 -0
  148. package/.codex/skills/ship/phases/03-version-bump.md +259 -0
  149. package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
  150. package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
  151. package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
  152. package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
  153. package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
  154. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
  155. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
  156. package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
  157. package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
  158. package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
  159. package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
  160. package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
  161. package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
  162. package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
  163. package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
  164. package/.codex/skills/team-motion-design/SKILL.md +222 -0
  165. package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
  166. package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
  167. package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
  168. package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
  169. package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
  170. package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
  171. package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
  172. package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
  173. package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
  174. package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
  175. package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
  176. package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
  177. package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
  178. package/.codex/skills/team-ui-polish/SKILL.md +218 -0
  179. package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
  180. package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
  181. package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
  182. package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
  183. package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
  184. package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
  185. package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
  186. package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
  187. package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
  188. package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
  189. package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
  190. package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
  191. package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
  192. package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
  193. package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
  194. package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
  195. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
  196. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
  197. package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
  198. package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
  199. package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
  200. package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
  201. package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
  202. package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
  203. package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
  204. package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
  205. package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
  206. package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
  207. package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
  208. package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
  209. package/README.md +8 -0
  210. package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
  211. package/ccw/dist/core/hooks/hook-templates.js +114 -1
  212. package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
  213. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/cli-routes.js +34 -0
  215. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/system-routes.js +2 -2
  217. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  218. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
  219. package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
  220. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
  221. package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
  222. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
  223. package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
  224. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
  225. package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
  226. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
  227. package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
  228. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
  229. package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
  230. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
  231. package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
  232. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
  233. package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
  234. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
  235. package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
  236. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
  237. package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
  238. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
  239. package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
  240. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
  241. package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
  242. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
  243. package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
  244. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
  245. package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
  246. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
  247. package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
  248. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
  249. package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
  250. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
  251. package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
  252. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
  253. package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
  254. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
  255. package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
  256. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
  257. package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
  258. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
  259. package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
  260. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
  261. package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
  262. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
  263. package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
  264. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
  265. package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
  266. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
  267. package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
  268. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
  269. package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
  270. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
  271. package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
  272. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
  273. package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
  274. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
  275. package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
  276. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
  277. package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
  278. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
  279. package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
  280. package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
  281. package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
  282. package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
  283. package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
  284. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
  285. package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
  286. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
  287. package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
  288. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
  289. package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
  290. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
  291. package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
  292. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
  293. package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
  294. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
  295. package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
  296. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
  297. package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
  298. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
  299. package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
  300. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
  301. package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
  302. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
  303. package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
  304. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
  305. package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
  306. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
  307. package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
  308. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
  309. package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
  310. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
  311. package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
  312. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
  313. package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
  314. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
  315. package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
  316. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
  317. package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
  318. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
  319. package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
  320. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
  321. package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
  322. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
  323. package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
  324. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
  325. package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
  326. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
  327. package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
  328. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
  329. package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
  330. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
  331. package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
  332. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
  333. package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
  334. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
  335. package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
  336. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
  337. package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
  338. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
  339. package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
  340. package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
  341. package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
  342. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
  343. package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
  344. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
  345. package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
  346. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
  347. package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
  348. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
  349. package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
  350. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
  351. package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
  352. package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
  353. package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
  354. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
  355. package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
  356. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
  357. package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
  358. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
  359. package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
  360. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
  361. package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
  362. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
  363. package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
  364. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
  365. package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
  366. package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
  367. package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
  368. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
  369. package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
  370. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
  371. package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
  372. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
  373. package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
  374. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
  375. package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
  376. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
  377. package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
  378. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
  379. package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
  380. package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
  381. package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
  382. package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
  383. package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
  384. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
  385. package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
  386. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
  387. package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
  388. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
  389. package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
  390. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
  391. package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
  392. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
  393. package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
  394. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
  395. package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
  396. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
  397. package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
  398. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
  399. package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
  400. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
  401. package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
  402. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
  403. package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
  404. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
  405. package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
  406. package/ccw/frontend/dist/index.html +1 -1
  407. package/package.json +105 -105
  408. package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ApiSettingsPage-BL2c3UNS.js","sources":["../../src/components/api-settings/ProviderList.tsx","../../src/components/api-settings/ProviderModal.tsx","../../src/components/api-settings/EndpointList.tsx","../../src/components/api-settings/EndpointModal.tsx","../../src/components/api-settings/CacheSettings.tsx","../../src/components/api-settings/ModelPoolList.tsx","../../src/components/api-settings/ModelPoolModal.tsx","../../src/components/api-settings/CliSettingsList.tsx","../../src/components/api-settings/CliSettingsModal.tsx","../../src/components/api-settings/MultiKeySettingsModal.tsx","../../src/components/api-settings/ManageModelsModal.tsx","../../src/pages/ApiSettingsPage.tsx"],"sourcesContent":["// ========================================\n// Provider List Component\n// ========================================\n// Display providers as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Zap,\n Settings,\n CheckCircle2,\n XCircle,\n AlertCircle,\n MoreVertical,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@/components/ui/Dropdown';\nimport {\n useProviders,\n useDeleteProvider,\n useUpdateProvider,\n useTestProvider,\n useTriggerProviderHealthCheck,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ProviderCredential } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface ProviderListProps {\n onAddProvider: () => void;\n onEditProvider: (providerId: string) => void;\n onMultiKeySettings: (providerId: string) => void;\n onSyncToCodexLens: (providerId: string) => void;\n onManageModels: (providerId: string) => void;\n}\n\n// ========== Helper Components ==========\n\ninterface ProviderCardProps {\n provider: ProviderCredential;\n onEdit: () => void;\n onDelete: () => void;\n onTest: () => void;\n onMultiKeySettings: () => void;\n onSyncToCodexLens: () => void;\n onManageModels: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isTesting: boolean;\n isToggling: boolean;\n}\n\nfunction ProviderCard({\n provider,\n onEdit,\n onDelete,\n onTest,\n onMultiKeySettings,\n onSyncToCodexLens,\n onManageModels,\n onToggleEnabled,\n isDeleting,\n isTesting,\n isToggling,\n}: ProviderCardProps) {\n const { formatMessage } = useIntl();\n\n // Count enabled multi-keys\n const multiKeyCount = provider.apiKeys?.filter((k) => k.enabled).length || 0;\n const hasMultiKeys = (provider.apiKeys?.length || 0) > 0;\n\n // Health status badge\n const getHealthBadge = () => {\n if (!provider.enabled) {\n return <Badge variant=\"secondary\">{formatMessage({ id: 'apiSettings.common.disabled' })}</Badge>;\n }\n if (!provider.healthCheck?.enabled) {\n return <Badge variant=\"outline\">{formatMessage({ id: 'apiSettings.providers.unknown' })}</Badge>;\n }\n // Check key health statuses\n const keys = provider.apiKeys || [];\n if (keys.length === 0) {\n return <Badge variant=\"info\">{formatMessage({ id: 'apiSettings.providers.unknown' })}</Badge>;\n }\n const healthyCount = keys.filter((k) => k.healthStatus === 'healthy').length;\n const unhealthyCount = keys.filter((k) => k.healthStatus === 'unhealthy').length;\n\n if (unhealthyCount > 0) {\n return <Badge variant=\"destructive\">{formatMessage({ id: 'apiSettings.providers.unhealthy' })}</Badge>;\n }\n if (healthyCount === keys.length) {\n return <Badge variant=\"success\">{formatMessage({ id: 'apiSettings.providers.healthy' })}</Badge>;\n }\n return <Badge variant=\"warning\">{formatMessage({ id: 'apiSettings.providers.unknown' })}</Badge>;\n };\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: Provider Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground truncate\">{provider.name}</h3>\n {getHealthBadge()}\n </div>\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span className=\"capitalize\">{provider.type}</span>\n {hasMultiKeys && (\n <span className=\"flex items-center gap-1\">\n <Zap className=\"w-3 h-3\" />\n {multiKeyCount} {formatMessage({ id: 'apiSettings.providers.apiKey' })}\n </span>\n )}\n {provider.routingStrategy && (\n <span className=\"capitalize\">{provider.routingStrategy.replace('-', ' ')}</span>\n )}\n </div>\n {provider.apiBase && (\n <p className=\"text-xs text-muted-foreground mt-1 truncate\">{provider.apiBase}</p>\n )}\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={provider.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onTest} disabled={isTesting}>\n <Zap className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.test' })}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onManageModels}>\n <Settings className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.manageModels' })}\n </DropdownMenuItem>\n {hasMultiKeys && (\n <DropdownMenuItem onClick={onMultiKeySettings}>\n <Zap className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.multiKeySettings' })}\n </DropdownMenuItem>\n )}\n <DropdownMenuItem onClick={onSyncToCodexLens}>\n <CheckCircle2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.syncToCodexLens' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ProviderList({\n onAddProvider,\n onEditProvider,\n onMultiKeySettings,\n onSyncToCodexLens,\n onManageModels,\n}: ProviderListProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const [searchQuery, setSearchQuery] = useState('');\n const [showDisabledOnly, setShowDisabledOnly] = useState(false);\n\n const {\n providers,\n isLoading,\n refetch,\n } = useProviders();\n\n const { deleteProvider, isDeleting } = useDeleteProvider();\n const { updateProvider, isUpdating } = useUpdateProvider();\n const { testProvider, isTesting } = useTestProvider();\n const { triggerHealthCheck } = useTriggerProviderHealthCheck();\n\n // Filter providers based on search and filter\n const filteredProviders = useMemo(() => {\n return providers.filter((provider) => {\n const matchesSearch =\n provider.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n provider.type.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesFilter = !showDisabledOnly || !provider.enabled;\n return matchesSearch && matchesFilter;\n });\n }, [providers, searchQuery, showDisabledOnly]);\n\n // Actions\n const handleDeleteProvider = async (providerId: string, providerName: string) => {\n const confirmMessage = formatMessage(\n { id: 'apiSettings.providers.deleteConfirm' },\n { name: providerName }\n );\n if (window.confirm(confirmMessage)) {\n try {\n await deleteProvider(providerId);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.deleteError' }));\n }\n }\n };\n\n const handleToggleEnabled = async (providerId: string, enabled: boolean) => {\n try {\n await updateProvider(providerId, { enabled });\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.toggleError' }));\n }\n };\n\n const handleTestProvider = async (providerId: string) => {\n try {\n const result = await testProvider(providerId);\n if (result.success) {\n // Trigger health check refresh\n await triggerHealthCheck(providerId);\n }\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.testError' }));\n }\n };\n\n // Stats\n const enabledCount = providers.filter((p) => p.enabled).length;\n const totalCount = providers.length;\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h2 className=\"text-xl font-bold text-foreground\">\n {formatMessage({ id: 'apiSettings.providers.title' })}\n </h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.providers.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isLoading}>\n <Zap className={cn('w-4 h-4 mr-2', isLoading && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <Button onClick={onAddProvider}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-2 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{totalCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.providers.stats.total' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"w-5 h-5 text-success\" />\n <span className=\"text-2xl font-bold\">{enabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.providers.stats.enabled' })}\n </p>\n </Card>\n </div>\n\n {/* Search and Filter */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.common.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={showDisabledOnly ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowDisabledOnly((prev) => !prev)}\n >\n {showDisabledOnly ? (\n <XCircle className=\"w-4 h-4 mr-2\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4 mr-2\" />\n )}\n {showDisabledOnly\n ? formatMessage({ id: 'apiSettings.providers.actions.hideDisabled' })\n : formatMessage({ id: 'apiSettings.providers.actions.showDisabled' })}\n </Button>\n </div>\n </div>\n\n {/* Provider List */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-24 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : filteredProviders.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <AlertCircle className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'apiSettings.providers.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.providers.emptyState.message' })}\n </p>\n <Button className=\"mt-4\" onClick={onAddProvider}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.add' })}\n </Button>\n </Card>\n ) : (\n <div className=\"space-y-3\">\n {filteredProviders.map((provider) => (\n <ProviderCard\n key={provider.id}\n provider={provider}\n onEdit={() => onEditProvider(provider.id)}\n onDelete={() => handleDeleteProvider(provider.id, provider.name)}\n onTest={() => handleTestProvider(provider.id)}\n onMultiKeySettings={() => onMultiKeySettings(provider.id)}\n onSyncToCodexLens={() => onSyncToCodexLens(provider.id)}\n onManageModels={() => onManageModels(provider.id)}\n onToggleEnabled={(enabled) => handleToggleEnabled(provider.id, enabled)}\n isDeleting={isDeleting}\n isTesting={isTesting}\n isToggling={isUpdating}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default ProviderList;\n","// ========================================\n// Provider Modal Component\n// ========================================\n// Add/Edit provider modal with multi-key support\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n Plus,\n Trash2,\n Zap,\n ChevronDown,\n ChevronUp,\n Eye,\n EyeOff,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/Collapsible';\nimport { useCreateProvider, useUpdateProvider } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ProviderCredential, ProviderType, RoutingStrategy } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface ProviderModalProps {\n open: boolean;\n onClose: () => void;\n provider?: ProviderCredential | null;\n}\n\ninterface ApiKeyFormEntry {\n id: string;\n key: string;\n label?: string;\n weight?: number;\n enabled: boolean;\n}\n\ninterface ModelDefinitionEntry {\n id: string;\n name: string;\n series?: string;\n contextWindow?: number;\n streaming?: boolean;\n functionCalling?: boolean;\n vision?: boolean;\n description?: string;\n}\n\n// ========== Helper Components ==========\n\ninterface ApiKeyEntryRowProps {\n entry: ApiKeyFormEntry;\n showKey: boolean;\n onToggleShowKey: () => void;\n onUpdate: (updates: Partial<ApiKeyFormEntry>) => void;\n onRemove: () => void;\n}\n\nfunction ApiKeyEntryRow({\n entry,\n showKey,\n onToggleShowKey,\n onUpdate,\n onRemove,\n}: ApiKeyEntryRowProps) {\n const { formatMessage } = useIntl();\n\n return (\n <div className=\"grid grid-cols-12 gap-2 items-start p-3 bg-muted/30 rounded-lg\">\n <div className=\"col-span-3\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyLabel' })}</Label>\n <Input\n value={entry.label || ''}\n onChange={(e) => onUpdate({ label: e.target.value })}\n placeholder=\"Key 1\"\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-4\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyValue' })}</Label>\n <div className=\"relative mt-1\">\n <Input\n type={showKey ? 'text' : 'password'}\n value={entry.key}\n onChange={(e) => onUpdate({ key: e.target.value })}\n placeholder=\"sk-...\"\n className=\"pr-8\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={onToggleShowKey}\n >\n {showKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n <div className=\"col-span-2\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyWeight' })}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"100\"\n value={entry.weight ?? 1}\n onChange={(e) => onUpdate({ weight: parseInt(e.target.value) || 1 })}\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-2 flex items-center gap-2 pt-5\">\n <Switch\n checked={entry.enabled}\n onCheckedChange={(enabled) => onUpdate({ enabled })}\n />\n <span className=\"text-sm text-muted-foreground\">\n {entry.enabled ? formatMessage({ id: 'apiSettings.common.enabled' }) : formatMessage({ id: 'apiSettings.common.disabled' })}\n </span>\n </div>\n <div className=\"col-span-1 flex items-center justify-end pt-5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ProviderModal({ open, onClose, provider }: ProviderModalProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const isEditing = !!provider;\n\n // Mutations\n const { createProvider, isCreating } = useCreateProvider();\n const { updateProvider, isUpdating } = useUpdateProvider();\n\n // Form state\n const [name, setName] = useState('');\n const [type, setType] = useState<ProviderType>('openai');\n const [apiKey, setApiKey] = useState('');\n const [apiBase, setApiBase] = useState('');\n const [enabled, setEnabled] = useState(true);\n\n // Advanced settings\n const [showAdvanced, setShowAdvanced] = useState(false);\n const [timeout, setTimeout] = useState<number>(300);\n const [maxRetries, setMaxRetries] = useState<number>(0);\n const [organization, setOrganization] = useState('');\n const [apiVersion, setApiVersion] = useState('');\n const [customHeaders, setCustomHeaders] = useState('');\n const [rpm, setRpm] = useState<number | undefined>();\n const [tpm, setTpm] = useState<number | undefined>();\n const [proxy, setProxy] = useState('');\n\n // Multi-key configuration\n const [useMultiKey, setUseMultiKey] = useState(false);\n const [apiKeys, setApiKeys] = useState<ApiKeyFormEntry[]>([]);\n const [showKeyIndices, setShowKeyIndices] = useState<Set<number>>(new Set());\n\n // Routing strategy\n const [routingStrategy, setRoutingStrategy] = useState<RoutingStrategy>('simple-shuffle');\n\n // Health check\n const [enableHealthCheck, setEnableHealthCheck] = useState(false);\n const [checkInterval, setCheckInterval] = useState(60);\n const [cooldownPeriod, setCooldownPeriod] = useState(300);\n const [failureThreshold, setFailureThreshold] = useState(5);\n\n // Models\n const [showModels, setShowModels] = useState(false);\n const [llmModels, setLlmModels] = useState<ModelDefinitionEntry[]>([]);\n const [embeddingModels, setEmbeddingModels] = useState<ModelDefinitionEntry[]>([]);\n\n // Initialize form from provider\n useEffect(() => {\n if (provider) {\n setName(provider.name);\n setType(provider.type);\n setApiKey(provider.apiKey);\n setApiBase(provider.apiBase || '');\n setEnabled(provider.enabled);\n setRoutingStrategy(provider.routingStrategy || 'simple-shuffle');\n\n // Advanced settings\n if (provider.advancedSettings) {\n setTimeout(provider.advancedSettings.timeout || 300);\n setMaxRetries(provider.advancedSettings.maxRetries || 0);\n setOrganization(provider.advancedSettings.organization || '');\n setApiVersion(provider.advancedSettings.apiVersion || '');\n setCustomHeaders(provider.advancedSettings.customHeaders ? JSON.stringify(provider.advancedSettings.customHeaders, null, 2) : '');\n setRpm(provider.advancedSettings.rpm);\n setTpm(provider.advancedSettings.tpm);\n setProxy(provider.advancedSettings.proxy || '');\n }\n\n // Multi-key\n const hasMultiKeys = Boolean(provider.apiKeys && provider.apiKeys.length > 0);\n setUseMultiKey(hasMultiKeys);\n if (hasMultiKeys && provider.apiKeys) {\n setApiKeys(provider.apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })));\n }\n\n // Health check\n if (provider.healthCheck) {\n setEnableHealthCheck(provider.healthCheck.enabled);\n setCheckInterval(provider.healthCheck.intervalSeconds);\n setCooldownPeriod(provider.healthCheck.cooldownSeconds);\n setFailureThreshold(provider.healthCheck.failureThreshold);\n }\n\n // Models\n if (provider.llmModels) {\n setLlmModels(provider.llmModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n if (provider.embeddingModels) {\n setEmbeddingModels(provider.embeddingModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n } else {\n // Reset form for new provider\n setName('');\n setType('openai');\n setApiKey('');\n setApiBase('');\n setEnabled(true);\n setTimeout(300);\n setMaxRetries(0);\n setOrganization('');\n setApiVersion('');\n setCustomHeaders('');\n setRpm(undefined);\n setTpm(undefined);\n setProxy('');\n setUseMultiKey(false);\n setApiKeys([]);\n setRoutingStrategy('simple-shuffle');\n setEnableHealthCheck(false);\n setCheckInterval(60);\n setCooldownPeriod(300);\n setFailureThreshold(5);\n setLlmModels([]);\n setEmbeddingModels([]);\n }\n }, [provider, open]);\n\n // Handlers\n const handleAddKey = () => {\n const newKey: ApiKeyFormEntry = {\n id: `key-${Date.now()}`,\n key: '',\n label: `Key ${apiKeys.length + 1}`,\n weight: 1,\n enabled: true,\n };\n setApiKeys([...apiKeys, newKey]);\n };\n\n const handleUpdateKey = (index: number, updates: Partial<ApiKeyFormEntry>) => {\n setApiKeys(apiKeys.map((k, i) => (i === index ? { ...k, ...updates } : k)));\n };\n\n const handleRemoveKey = (index: number) => {\n setApiKeys(apiKeys.filter((_, i) => i !== index));\n };\n\n const handleToggleShowKey = (index: number) => {\n setShowKeyIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n const handleAddLlmModel = () => {\n const newModel: ModelDefinitionEntry = {\n id: `llm-${Date.now()}`,\n name: '',\n series: '',\n };\n setLlmModels([...llmModels, newModel]);\n };\n\n const handleRemoveLlmModel = (index: number) => {\n setLlmModels(llmModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateLlmModel = (index: number, field: keyof ModelDefinitionEntry, value: string | number | boolean | undefined) => {\n setLlmModels(llmModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleAddEmbeddingModel = () => {\n const newModel: ModelDefinitionEntry = {\n id: `emb-${Date.now()}`,\n name: '',\n series: '',\n };\n setEmbeddingModels([...embeddingModels, newModel]);\n };\n\n const handleRemoveEmbeddingModel = (index: number) => {\n setEmbeddingModels(embeddingModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateEmbeddingModel = (index: number, field: keyof ModelDefinitionEntry, value: string | number | boolean | undefined) => {\n setEmbeddingModels(embeddingModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleSubmit = async () => {\n try {\n // Validate custom headers JSON\n let parsedHeaders: Record<string, string> | undefined;\n if (customHeaders.trim()) {\n try {\n parsedHeaders = JSON.parse(customHeaders);\n } catch {\n alert(formatMessage({ id: 'apiSettings.messages.invalidJsonHeaders' }));\n return;\n }\n }\n\n const now = new Date().toISOString();\n\n const providerData = {\n name,\n type,\n apiKey: useMultiKey ? '' : apiKey,\n apiBase: apiBase || undefined,\n enabled,\n advancedSettings: {\n timeout,\n maxRetries,\n organization: organization || undefined,\n apiVersion: apiVersion || undefined,\n customHeaders: parsedHeaders,\n rpm,\n tpm,\n proxy: proxy || undefined,\n },\n apiKeys: useMultiKey ? apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })) : undefined,\n routingStrategy: useMultiKey ? routingStrategy : undefined,\n healthCheck: enableHealthCheck ? {\n enabled: true,\n intervalSeconds: checkInterval,\n cooldownSeconds: cooldownPeriod,\n failureThreshold,\n } : undefined,\n llmModels: llmModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'llm' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n embeddingModels: embeddingModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'embedding' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n };\n\n if (isEditing && provider) {\n await updateProvider(provider.id, providerData);\n } else {\n await createProvider(providerData);\n }\n\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n const isSaving = isCreating || isUpdating;\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {isEditing\n ? formatMessage({ id: 'apiSettings.providers.actions.edit' })\n : formatMessage({ id: 'apiSettings.providers.actions.add' })}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.providers.description' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* Basic Info */}\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.basicInfo' })}</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">{formatMessage({ id: 'apiSettings.providers.displayName' })} *</Label>\n <Input\n id=\"name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My OpenAI\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"type\">{formatMessage({ id: 'apiSettings.common.type' })} *</Label>\n <Select value={type} onValueChange={(v: ProviderType) => setType(v)}>\n <SelectTrigger id=\"type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"openai\">OpenAI</SelectItem>\n <SelectItem value=\"anthropic\">Anthropic</SelectItem>\n <SelectItem value=\"custom\">Custom</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {!useMultiKey && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"apiKey\">{formatMessage({ id: 'apiSettings.providers.apiKey' })} *</Label>\n <Input\n id=\"apiKey\"\n type=\"password\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"sk-...\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.useEnvVar' })}</p>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"apiBase\">{formatMessage({ id: 'apiSettings.providers.apiBaseUrl' })}</Label>\n <Input\n id=\"apiBase\"\n value={apiBase}\n onChange={(e) => setApiBase(e.target.value)}\n placeholder=\"https://api.openai.com/v1\"\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"enabled\"\n checked={enabled}\n onCheckedChange={setEnabled}\n />\n <Label htmlFor=\"enabled\">{formatMessage({ id: 'apiSettings.providers.enableProvider' })}</Label>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"useMultiKey\"\n checked={useMultiKey}\n onCheckedChange={setUseMultiKey}\n />\n <Label htmlFor=\"useMultiKey\">{formatMessage({ id: 'apiSettings.providers.multiKeySettings' })}</Label>\n </div>\n </div>\n\n {/* Multi-Key Configuration */}\n {useMultiKey && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.multiKeySettings' })}</h3>\n <Button type=\"button\" size=\"sm\" onClick={handleAddKey}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addKey' })}\n </Button>\n </div>\n\n {apiKeys.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {apiKeys.map((entry, index) => (\n <ApiKeyEntryRow\n key={entry.id}\n entry={entry}\n showKey={showKeyIndices.has(index)}\n onToggleShowKey={() => handleToggleShowKey(index)}\n onUpdate={(updates) => handleUpdateKey(index, updates)}\n onRemove={() => handleRemoveKey(index)}\n />\n ))}\n </div>\n )}\n\n {/* Routing Strategy */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"routingStrategy\">{formatMessage({ id: 'apiSettings.providers.routingStrategy' })}</Label>\n <Select value={routingStrategy} onValueChange={(v: RoutingStrategy) => setRoutingStrategy(v)}>\n <SelectTrigger id=\"routingStrategy\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"simple-shuffle\">{formatMessage({ id: 'apiSettings.providers.simpleShuffle' })}</SelectItem>\n <SelectItem value=\"weighted\">{formatMessage({ id: 'apiSettings.providers.weighted' })}</SelectItem>\n <SelectItem value=\"latency-based\">{formatMessage({ id: 'apiSettings.providers.latencyBased' })}</SelectItem>\n <SelectItem value=\"cost-based\">{formatMessage({ id: 'apiSettings.providers.costBased' })}</SelectItem>\n <SelectItem value=\"least-busy\">{formatMessage({ id: 'apiSettings.providers.leastBusy' })}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Health Check */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Label>{formatMessage({ id: 'apiSettings.providers.healthCheck' })}</Label>\n <Switch\n checked={enableHealthCheck}\n onCheckedChange={setEnableHealthCheck}\n />\n </div>\n {enableHealthCheck && (\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"checkInterval\">{formatMessage({ id: 'apiSettings.providers.checkInterval' })}</Label>\n <Input\n id=\"checkInterval\"\n type=\"number\"\n min=\"10\"\n value={checkInterval}\n onChange={(e) => setCheckInterval(parseInt(e.target.value) || 60)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cooldownPeriod\">{formatMessage({ id: 'apiSettings.providers.cooldownPeriod' })}</Label>\n <Input\n id=\"cooldownPeriod\"\n type=\"number\"\n min=\"10\"\n value={cooldownPeriod}\n onChange={(e) => setCooldownPeriod(parseInt(e.target.value) || 300)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"failureThreshold\">{formatMessage({ id: 'apiSettings.providers.failureThreshold' })}</Label>\n <Input\n id=\"failureThreshold\"\n type=\"number\"\n min=\"1\"\n value={failureThreshold}\n onChange={(e) => setFailureThreshold(parseInt(e.target.value) || 5)}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Advanced Settings */}\n <Collapsible open={showAdvanced} onOpenChange={setShowAdvanced}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full justify-between\">\n <span className=\"font-semibold\">{formatMessage({ id: 'apiSettings.providers.advancedSettings' })}</span>\n {showAdvanced ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-4\">\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"timeout\">{formatMessage({ id: 'apiSettings.providers.timeout' })}</Label>\n <Input\n id=\"timeout\"\n type=\"number\"\n min=\"1\"\n value={timeout}\n onChange={(e) => setTimeout(parseInt(e.target.value) || 300)}\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.timeoutHint' })}</p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"maxRetries\">{formatMessage({ id: 'apiSettings.providers.maxRetries' })}</Label>\n <Input\n id=\"maxRetries\"\n type=\"number\"\n min=\"0\"\n value={maxRetries}\n onChange={(e) => setMaxRetries(parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"organization\">{formatMessage({ id: 'apiSettings.providers.organization' })}</Label>\n <Input\n id=\"organization\"\n value={organization}\n onChange={(e) => setOrganization(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.organizationHint' })}</p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"apiVersion\">{formatMessage({ id: 'apiSettings.providers.apiVersion' })}</Label>\n <Input\n id=\"apiVersion\"\n value={apiVersion}\n onChange={(e) => setApiVersion(e.target.value)}\n placeholder=\"2024-02-01\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.apiVersionHint' })}</p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"rpm\">{formatMessage({ id: 'apiSettings.providers.rpm' })}</Label>\n <Input\n id=\"rpm\"\n type=\"number\"\n min=\"0\"\n value={rpm ?? ''}\n onChange={(e) => setRpm(e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder={formatMessage({ id: 'apiSettings.providers.unlimited' })}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"tpm\">{formatMessage({ id: 'apiSettings.providers.tpm' })}</Label>\n <Input\n id=\"tpm\"\n type=\"number\"\n min=\"0\"\n value={tpm ?? ''}\n onChange={(e) => setTpm(e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder={formatMessage({ id: 'apiSettings.providers.unlimited' })}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"proxy\">{formatMessage({ id: 'apiSettings.providers.proxy' })}</Label>\n <Input\n id=\"proxy\"\n value={proxy}\n onChange={(e) => setProxy(e.target.value)}\n placeholder=\"http://proxy.example.com:8080\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"customHeaders\">{formatMessage({ id: 'apiSettings.providers.customHeaders' })}</Label>\n <Textarea\n id=\"customHeaders\"\n value={customHeaders}\n onChange={(e) => setCustomHeaders(e.target.value)}\n placeholder={`{\\n \"X-Custom\": \"value\"\\n}`}\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.customHeadersHint' })}</p>\n </div>\n </CollapsibleContent>\n </Collapsible>\n\n {/* Model Configuration */}\n <Collapsible open={showModels} onOpenChange={setShowModels}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full justify-between\">\n <span className=\"font-semibold\">{formatMessage({ id: 'apiSettings.providers.modelSettings' })}</span>\n {showModels ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-4\">\n {/* LLM Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-sm font-medium\">{formatMessage({ id: 'apiSettings.providers.llmModels' })}</h4>\n <Button type=\"button\" size=\"sm\" onClick={handleAddLlmModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addLlmModel' })}\n </Button>\n </div>\n {llmModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {llmModels.map((model, index) => (\n <div key={model.id} className=\"flex items-start gap-2 p-3 bg-muted/30 rounded-lg\">\n <div className=\"flex-1 grid grid-cols-2 gap-2\">\n <Input\n value={model.name}\n onChange={(e) => handleUpdateLlmModel(index, 'name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelId' })}\n />\n <Input\n value={model.series || ''}\n onChange={(e) => handleUpdateLlmModel(index, 'series', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelSeries' })}\n />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleRemoveLlmModel(index)}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Embedding Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-sm font-medium\">{formatMessage({ id: 'apiSettings.providers.embeddingModels' })}</h4>\n <Button type=\"button\" size=\"sm\" onClick={handleAddEmbeddingModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addEmbeddingModel' })}\n </Button>\n </div>\n {embeddingModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {embeddingModels.map((model, index) => (\n <div key={model.id} className=\"flex items-start gap-2 p-3 bg-muted/30 rounded-lg\">\n <div className=\"flex-1 grid grid-cols-2 gap-2\">\n <Input\n value={model.name}\n onChange={(e) => handleUpdateEmbeddingModel(index, 'name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelId' })}\n />\n <Input\n value={model.series || ''}\n onChange={(e) => handleUpdateEmbeddingModel(index, 'series', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelSeries' })}\n />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleRemoveEmbeddingModel(index)}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n </CollapsibleContent>\n </Collapsible>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isSaving}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSubmit} disabled={isSaving || !name.trim()}>\n {isSaving ? (\n <Zap className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default ProviderModal;\n","// ========================================\n// Endpoint List Component\n// ========================================\n// Display endpoints as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Zap,\n CheckCircle2,\n XCircle,\n MoreVertical,\n Database,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@/components/ui/Dropdown';\nimport {\n useEndpoints,\n useDeleteEndpoint,\n useUpdateEndpoint,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { CustomEndpoint } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface EndpointListProps {\n onAddEndpoint: () => void;\n onEditEndpoint: (endpointId: string) => void;\n}\n\n// ========== Helper Components ==========\n\ninterface EndpointCardProps {\n endpoint: CustomEndpoint;\n onEdit: () => void;\n onDelete: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isToggling: boolean;\n}\n\nfunction EndpointCard({\n endpoint,\n onEdit,\n onDelete,\n onToggleEnabled,\n isDeleting,\n isToggling,\n}: EndpointCardProps) {\n const { formatMessage } = useIntl();\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: Endpoint Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground font-mono\">{endpoint.id}</h3>\n {endpoint.enabled ? (\n <Badge variant=\"success\">{formatMessage({ id: 'apiSettings.common.enabled' })}</Badge>\n ) : (\n <Badge variant=\"secondary\">{formatMessage({ id: 'apiSettings.common.disabled' })}</Badge>\n )}\n {endpoint.cacheStrategy.enabled && (\n <Badge variant=\"info\" className=\"flex items-center gap-1\">\n <Database className=\"w-3 h-3\" />\n {formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </Badge>\n )}\n </div>\n <p className=\"text-sm font-medium text-foreground mt-1\">{endpoint.name}</p>\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span>\n {formatMessage({ id: 'apiSettings.endpoints.provider' })}: {endpoint.providerId}\n </span>\n <span>\n {formatMessage({ id: 'apiSettings.endpoints.model' })}: {endpoint.model}\n </span>\n </div>\n {endpoint.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{endpoint.description}</p>\n )}\n {endpoint.cacheStrategy.enabled && (\n <div className=\"flex items-center gap-3 mt-2 text-xs text-muted-foreground\">\n <span>{formatMessage({ id: 'apiSettings.endpoints.cacheTTL' })}: {endpoint.cacheStrategy.ttlMinutes}m</span>\n <span>{formatMessage({ id: 'apiSettings.endpoints.cacheMaxSize' })}: {endpoint.cacheStrategy.maxSizeKB}KB</span>\n {(endpoint.cacheStrategy.filePatterns?.length || 0) > 0 && (\n <span>{formatMessage({ id: 'apiSettings.endpoints.filePatterns' })}: {endpoint.cacheStrategy.filePatterns?.length || 0}</span>\n )}\n </div>\n )}\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={endpoint.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function EndpointList({\n onAddEndpoint,\n onEditEndpoint,\n}: EndpointListProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const [searchQuery, setSearchQuery] = useState('');\n const [showDisabledOnly, setShowDisabledOnly] = useState(false);\n const [showCachedOnly, setShowCachedOnly] = useState(false);\n\n const {\n endpoints,\n cachedCount,\n isLoading,\n refetch,\n } = useEndpoints();\n\n const { deleteEndpoint, isDeleting } = useDeleteEndpoint();\n const { updateEndpoint, isUpdating } = useUpdateEndpoint();\n\n // Filter endpoints based on search and filter\n const filteredEndpoints = useMemo(() => {\n return endpoints.filter((endpoint) => {\n const matchesSearch =\n endpoint.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n endpoint.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n endpoint.model.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesDisabledFilter = !showDisabledOnly || !endpoint.enabled;\n const matchesCacheFilter = !showCachedOnly || endpoint.cacheStrategy.enabled;\n return matchesSearch && matchesDisabledFilter && matchesCacheFilter;\n });\n }, [endpoints, searchQuery, showDisabledOnly, showCachedOnly]);\n\n // Actions\n const handleDeleteEndpoint = async (endpointId: string, endpointName: string) => {\n const confirmMessage = formatMessage(\n { id: 'apiSettings.endpoints.deleteConfirm' },\n { id: endpointName }\n );\n if (window.confirm(confirmMessage)) {\n try {\n await deleteEndpoint(endpointId);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.endpoints.deleteError' }));\n }\n }\n };\n\n const handleToggleEnabled = async (endpointId: string, enabled: boolean) => {\n try {\n await updateEndpoint(endpointId, { enabled });\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.endpoints.toggleError' }));\n }\n };\n\n // Stats\n const totalCount = endpoints.length;\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h2 className=\"text-xl font-bold text-foreground\">\n {formatMessage({ id: 'apiSettings.endpoints.title' })}\n </h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isLoading}>\n <Zap className={cn('w-4 h-4 mr-2', isLoading && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <Button onClick={onAddEndpoint}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-2 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Zap className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{totalCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.stats.totalEndpoints' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Database className=\"w-5 h-5 text-info\" />\n <span className=\"text-2xl font-bold\">{cachedCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.stats.cachedEndpoints' })}\n </p>\n </Card>\n </div>\n\n {/* Search and Filter */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.common.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={showDisabledOnly ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowDisabledOnly((prev) => !prev)}\n >\n {showDisabledOnly ? (\n <XCircle className=\"w-4 h-4 mr-2\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4 mr-2\" />\n )}\n {showDisabledOnly\n ? formatMessage({ id: 'apiSettings.endpoints.actions.showAll' })\n : formatMessage({ id: 'apiSettings.endpoints.actions.showDisabled' })}\n </Button>\n <Button\n variant={showCachedOnly ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowCachedOnly((prev) => !prev)}\n >\n <Database className=\"w-4 h-4 mr-2\" />\n {showCachedOnly\n ? formatMessage({ id: 'apiSettings.endpoints.actions.showAll' })\n : formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </Button>\n </div>\n </div>\n\n {/* Endpoint List */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-24 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : filteredEndpoints.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <Database className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'apiSettings.endpoints.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.endpoints.emptyState.message' })}\n </p>\n <Button className=\"mt-4\" onClick={onAddEndpoint}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.add' })}\n </Button>\n </Card>\n ) : (\n <div className=\"space-y-3\">\n {filteredEndpoints.map((endpoint) => (\n <EndpointCard\n key={endpoint.id}\n endpoint={endpoint}\n onEdit={() => onEditEndpoint(endpoint.id)}\n onDelete={() => handleDeleteEndpoint(endpoint.id, endpoint.name)}\n onToggleEnabled={(enabled) => handleToggleEnabled(endpoint.id, enabled)}\n isDeleting={isDeleting}\n isToggling={isUpdating}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default EndpointList;\n","// ========================================\n// Endpoint Modal Component\n// ========================================\n// Add/Edit endpoint modal with cache configuration\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n ChevronDown,\n ChevronUp,\n Database,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/Collapsible';\nimport { useCreateEndpoint, useUpdateEndpoint, useProviders } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { CustomEndpoint, CacheStrategy } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface EndpointModalProps {\n open: boolean;\n onClose: () => void;\n endpoint?: CustomEndpoint | null;\n}\n\n// ========== Helper Components ==========\n\ninterface FilePatternInputProps {\n value: string[];\n onChange: (patterns: string[]) => void;\n placeholder: string;\n}\n\nfunction FilePatternInput({ value, onChange, placeholder }: FilePatternInputProps) {\n const [inputValue, setInputValue] = useState('');\n\n const handleAddPattern = () => {\n if (inputValue.trim() && !value.includes(inputValue.trim())) {\n onChange([...value, inputValue.trim()]);\n setInputValue('');\n }\n };\n\n const handleRemovePattern = (pattern: string) => {\n onChange(value.filter((p) => p !== pattern));\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddPattern();\n }\n }}\n placeholder={placeholder}\n />\n <Button type=\"button\" size=\"sm\" onClick={handleAddPattern}>\n <Check className=\"w-4 h-4\" />\n </Button>\n </div>\n {value.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {value.map((pattern) => (\n <span\n key={pattern}\n className=\"inline-flex items-center gap-1 px-2 py-1 bg-muted rounded-md text-xs\"\n >\n {pattern}\n <button\n type=\"button\"\n onClick={() => handleRemovePattern(pattern)}\n className=\"hover:text-destructive\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function EndpointModal({ open, onClose, endpoint }: EndpointModalProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const isEditing = !!endpoint;\n\n // Mutations\n const { createEndpoint, isCreating } = useCreateEndpoint();\n const { updateEndpoint, isUpdating } = useUpdateEndpoint();\n\n // Get providers for dropdown\n const { providers } = useProviders();\n\n // Form state\n const [id, setId] = useState('');\n const [name, setName] = useState('');\n const [providerId, setProviderId] = useState('');\n const [model, setModel] = useState('');\n const [description, setDescription] = useState('');\n const [enabled, setEnabled] = useState(true);\n\n // Cache strategy\n const [showCacheSettings, setShowCacheSettings] = useState(false);\n const [enableCache, setEnableCache] = useState(false);\n const [cacheTTL, setCacheTTL] = useState(60);\n const [cacheMaxSize, setCacheMaxSize] = useState(1024);\n const [filePatterns, setFilePatterns] = useState<string[]>([]);\n\n // Get available models for selected provider\n const availableModels = useMemo(() => {\n if (!providerId) return [];\n const provider = providers.find((p) => p.id === providerId);\n if (!provider) return [];\n\n const models: string[] = [];\n if (provider.llmModels) {\n models.push(...provider.llmModels.filter((m) => m.enabled).map((m) => m.id));\n }\n if (provider.embeddingModels) {\n models.push(...provider.embeddingModels.filter((m) => m.enabled).map((m) => m.id));\n }\n if (provider.rerankerModels) {\n models.push(...provider.rerankerModels.filter((m) => m.enabled).map((m) => m.id));\n }\n return models;\n }, [providerId, providers]);\n\n // Initialize form from endpoint\n useEffect(() => {\n if (endpoint) {\n setId(endpoint.id);\n setName(endpoint.name);\n setProviderId(endpoint.providerId);\n setModel(endpoint.model);\n setDescription(endpoint.description || '');\n setEnabled(endpoint.enabled);\n setEnableCache(endpoint.cacheStrategy.enabled);\n setCacheTTL(endpoint.cacheStrategy.ttlMinutes);\n setCacheMaxSize(endpoint.cacheStrategy.maxSizeKB);\n setFilePatterns(endpoint.cacheStrategy.filePatterns || []);\n } else {\n // Reset form for new endpoint\n setId('');\n setName('');\n setProviderId('');\n setModel('');\n setDescription('');\n setEnabled(true);\n setEnableCache(false);\n setCacheTTL(60);\n setCacheMaxSize(1024);\n setFilePatterns([]);\n }\n }, [endpoint, open]);\n\n // Reset model when provider changes\n useEffect(() => {\n if (!isEditing && providerId) {\n const provider = providers.find((p) => p.id === providerId);\n if (provider && provider.llmModels && provider.llmModels.length > 0) {\n setModel(provider.llmModels[0].id);\n }\n }\n }, [providerId, providers, isEditing]);\n\n const handleSubmit = async () => {\n try {\n const cacheStrategy: CacheStrategy = {\n enabled: enableCache,\n ttlMinutes: cacheTTL,\n maxSizeKB: cacheMaxSize,\n filePatterns: enableCache ? filePatterns : [],\n };\n\n const endpointData = {\n id,\n name,\n providerId,\n model,\n description: description || undefined,\n enabled,\n cacheStrategy,\n };\n\n if (isEditing && endpoint) {\n await updateEndpoint(endpoint.id, endpointData);\n } else {\n await createEndpoint(endpointData);\n }\n\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.endpoints.saveError' }));\n }\n };\n\n const isSaving = isCreating || isUpdating;\n\n // Validate form\n const isValid = id.trim() && name.trim() && providerId && model.trim();\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {isEditing\n ? formatMessage({ id: 'apiSettings.endpoints.actions.edit' })\n : formatMessage({ id: 'apiSettings.endpoints.actions.add' })}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.endpoints.description' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* Basic Info */}\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.basicInfo' })}</h3>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"endpointId\">{formatMessage({ id: 'apiSettings.endpoints.endpointId' })} *</Label>\n <Input\n id=\"endpointId\"\n value={id}\n onChange={(e) => setId(e.target.value)}\n placeholder=\"my-gpt4o\"\n disabled={isEditing}\n className=\"font-mono\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.endpoints.endpointIdHint' })}</p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">{formatMessage({ id: 'apiSettings.endpoints.name' })} *</Label>\n <Input\n id=\"name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My GPT-4o\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"providerId\">{formatMessage({ id: 'apiSettings.endpoints.provider' })} *</Label>\n <Select value={providerId} onValueChange={setProviderId} disabled={isEditing}>\n <SelectTrigger id=\"providerId\">\n <SelectValue\n placeholder={providers.length === 0\n ? formatMessage({ id: 'apiSettings.providers.addProviderFirst' })\n : formatMessage({ id: 'apiSettings.endpoints.selectProvider' })\n }\n />\n </SelectTrigger>\n <SelectContent>\n {providers.map((provider) => (\n <SelectItem key={provider.id} value={provider.id} disabled={!provider.enabled}>\n {provider.name}\n {!provider.enabled && ` (${formatMessage({ id: 'apiSettings.common.disabled' })})`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"model\">{formatMessage({ id: 'apiSettings.endpoints.model' })} *</Label>\n {availableModels.length === 0 && providerId ? (\n <Input\n id=\"model\"\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"\"\n className=\"font-mono\"\n />\n ) : (\n <Select value={model} onValueChange={setModel}>\n <SelectTrigger id=\"model\">\n <SelectValue\n placeholder={!providerId\n ? formatMessage({ id: 'apiSettings.endpoints.selectProvider' })\n : formatMessage({ id: 'apiSettings.endpoints.selectModel' })\n }\n />\n </SelectTrigger>\n <SelectContent>\n {availableModels.map((modelId) => (\n <SelectItem key={modelId} value={modelId}>\n {modelId}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">{formatMessage({ id: 'apiSettings.common.description' })}</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.common.optional' })}\n rows={2}\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"enabled\"\n checked={enabled}\n onCheckedChange={setEnabled}\n />\n <Label htmlFor=\"enabled\">{formatMessage({ id: 'apiSettings.endpoints.enabled' })}</Label>\n </div>\n </div>\n\n {/* Cache Strategy */}\n <Collapsible open={showCacheSettings} onOpenChange={setShowCacheSettings}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full justify-between\">\n <span className=\"flex items-center gap-2 font-semibold\">\n <Database className=\"w-4 h-4\" />\n {formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </span>\n {showCacheSettings ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <Label>{formatMessage({ id: 'apiSettings.endpoints.enableContextCaching' })}</Label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </p>\n </div>\n <Switch\n checked={enableCache}\n onCheckedChange={setEnableCache}\n />\n </div>\n\n {enableCache && (\n <>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"cacheTTL\">{formatMessage({ id: 'apiSettings.endpoints.cacheTTL' })}</Label>\n <Input\n id=\"cacheTTL\"\n type=\"number\"\n min=\"1\"\n value={cacheTTL}\n onChange={(e) => setCacheTTL(parseInt(e.target.value) || 60)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cacheMaxSize\">{formatMessage({ id: 'apiSettings.endpoints.cacheMaxSize' })}</Label>\n <Input\n id=\"cacheMaxSize\"\n type=\"number\"\n min=\"1\"\n value={cacheMaxSize}\n onChange={(e) => setCacheMaxSize(parseInt(e.target.value) || 1024)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label>{formatMessage({ id: 'apiSettings.endpoints.autoCachePatterns' })}</Label>\n <FilePatternInput\n value={filePatterns}\n onChange={setFilePatterns}\n placeholder=\"*.md,*.ts\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.endpoints.filePatternsHint' })}</p>\n </div>\n </>\n )}\n </CollapsibleContent>\n </Collapsible>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isSaving}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSubmit} disabled={isSaving || !isValid}>\n {isSaving ? (\n <Database className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default EndpointModal;\n","// ========================================\n// Cache Settings Component\n// ========================================\n// Global cache configuration form with statistics display\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Database,\n Trash2,\n Save,\n HardDrive,\n FileText,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Switch } from '@/components/ui/Switch';\nimport { Progress } from '@/components/ui/Progress';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/AlertDialog';\nimport {\n useCacheStats,\n useUpdateCacheSettings,\n useClearCache,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { GlobalCacheSettings } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface CacheSettingsProps {\n className?: string;\n}\n\n// ========== Helper Components ==========\n\ninterface CacheUsageIndicatorProps {\n used: number;\n total: number;\n}\n\nfunction CacheUsageIndicator({ used, total }: CacheUsageIndicatorProps) {\n const { formatMessage } = useIntl();\n const percentage = total > 0 ? Math.round((used / total) * 100) : 0;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cache.settings.cacheUsage' })}\n </span>\n <span className=\"font-medium\">\n {percentage}%\n </span>\n </div>\n <Progress value={percentage} className=\"h-2\" />\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {formatMessage({ id: 'apiSettings.cache.settings.used' })} {(used / 1024 / 1024).toFixed(2)} MB\n </span>\n <span>\n {formatMessage({ id: 'apiSettings.cache.settings.total' })} {(total / 1024 / 1024).toFixed(2)} MB\n </span>\n </div>\n </div>\n );\n}\n\ninterface StatCardProps {\n icon: React.ReactNode;\n label: string;\n value: string | number;\n className?: string;\n}\n\nfunction StatCard({ icon, label, value, className }: StatCardProps) {\n return (\n <Card className={cn('p-4', className)}>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-primary/10 rounded-md text-primary\">\n {icon}\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <p className=\"text-2xl font-semibold\">{value}</p>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function CacheSettings({ className }: CacheSettingsProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n\n // Queries and mutations\n const { stats, refetch } = useCacheStats();\n const { updateCacheSettings, isUpdating } = useUpdateCacheSettings();\n const { clearCache, isClearing } = useClearCache();\n\n // Form state - initialize with defaults, will update from API if available\n const [settings, setSettings] = useState<Partial<GlobalCacheSettings>>({\n enabled: true,\n cacheDir: '',\n maxTotalSizeMB: 1024,\n });\n\n const [showClearDialog, setShowClearDialog] = useState(false);\n\n // Update local state when stats load (if API returns settings)\n useEffect(() => {\n if (stats) {\n // CacheStats has totalSize, maxSize, entries - settings might need separate fetch\n // For now, keep local state as the source of truth for settings\n }\n }, [stats]);\n\n // Handle save\n const handleSave = async () => {\n try {\n await updateCacheSettings(settings);\n success(\n formatMessage({ id: 'apiSettings.cache.messages.cacheSettingsUpdated' })\n );\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n }\n };\n\n // Handle clear cache\n const handleClearCache = async () => {\n try {\n await clearCache();\n setShowClearDialog(false);\n success(\n formatMessage({ id: 'apiSettings.cache.messages.cacheCleared' })\n );\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n }\n };\n\n return (\n <div className={cn('space-y-6', className)}>\n {/* Statistics Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <StatCard\n icon={<FileText className=\"w-5 h-5\" />}\n label={formatMessage({ id: 'apiSettings.cache.settings.cacheEntries' })}\n value={stats?.entries ?? 0}\n />\n <StatCard\n icon={<HardDrive className=\"w-5 h-5\" />}\n label={formatMessage({ id: 'apiSettings.cache.settings.cacheSize' })}\n value={`${((stats?.totalSize ?? 0) / 1024 / 1024).toFixed(2)} MB`}\n />\n <StatCard\n icon={<Database className=\"w-5 h-5\" />}\n label={formatMessage({ id: 'apiSettings.cache.settings.maxSize' })}\n value={`${((stats?.maxSize ?? 0) / 1024 / 1024).toFixed(2)} MB`}\n />\n </div>\n\n {/* Cache Usage Progress */}\n {stats && (\n <Card className=\"p-4\">\n <CacheUsageIndicator\n used={stats.totalSize}\n total={stats.maxSize}\n />\n </Card>\n )}\n\n {/* Settings Form */}\n <Card className=\"p-6\">\n <h3 className=\"text-lg font-semibold mb-4\">\n {formatMessage({ id: 'apiSettings.cache.settings.title' })}\n </h3>\n\n <div className=\"space-y-4\">\n {/* Enable Global Caching */}\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <Label htmlFor=\"cache-enabled\">\n {formatMessage({ id: 'apiSettings.cache.settings.enableGlobalCaching' })}\n </Label>\n </div>\n <Switch\n id=\"cache-enabled\"\n checked={settings.enabled ?? true}\n onCheckedChange={(checked) =>\n setSettings({ ...settings, enabled: checked })\n }\n disabled={isUpdating}\n />\n </div>\n\n {/* Cache Directory */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"cache-dir\">\n {formatMessage({ id: 'apiSettings.cache.settings.cacheDirectory' })}\n </Label>\n <Input\n id=\"cache-dir\"\n value={settings.cacheDir ?? ''}\n onChange={(e) =>\n setSettings({ ...settings, cacheDir: e.target.value })\n }\n disabled={isUpdating}\n placeholder=\"/path/to/cache\"\n />\n </div>\n\n {/* Max Total Size */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"cache-max-size\">\n {formatMessage({ id: 'apiSettings.cache.settings.maxSize' })}\n </Label>\n <Input\n id=\"cache-max-size\"\n type=\"number\"\n min={1}\n value={settings.maxTotalSizeMB ?? 1024}\n onChange={(e) =>\n setSettings({\n ...settings,\n maxTotalSizeMB: parseInt(e.target.value) || 1024,\n })\n }\n disabled={isUpdating}\n />\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-between pt-4 border-t\">\n <Button\n variant=\"destructive\"\n onClick={() => setShowClearDialog(true)}\n disabled={isClearing}\n >\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cache.settings.actions.clearCache' })}\n </Button>\n\n <Button onClick={handleSave} disabled={isUpdating}>\n <Save className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.save' })}\n </Button>\n </div>\n </div>\n </Card>\n\n {/* Clear Cache Confirmation Dialog */}\n <AlertDialog open={showClearDialog} onOpenChange={setShowClearDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {formatMessage({ id: 'apiSettings.cache.settings.actions.clearCache' })}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {formatMessage({\n id: 'apiSettings.cache.settings.confirmClearCache',\n })}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isClearing}>\n {formatMessage({ id: 'common.cancel' })}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleClearCache} disabled={isClearing}>\n {isClearing\n ? formatMessage({ id: 'common.loading' })\n : formatMessage({ id: 'common.confirm' })}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","// ========================================\n// Model Pool List Component\n// ========================================\n// Display model pools as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Layers,\n Zap,\n CheckCircle2,\n XCircle,\n MoreVertical,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@/components/ui/Dropdown';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/AlertDialog';\nimport {\n useModelPools,\n useDeleteModelPool,\n useUpdateModelPool,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ModelPoolConfig, ModelPoolType } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface ModelPoolListProps {\n onAddPool: () => void;\n onEditPool: (poolId: string) => void;\n}\n\ntype FilterType = 'all' | 'embedding' | 'llm' | 'reranker';\n\n// ========== Helper Components ==========\n\ninterface PoolCardProps {\n pool: ModelPoolConfig;\n onEdit: () => void;\n onDelete: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isToggling: boolean;\n}\n\nfunction PoolCard({\n pool,\n onEdit,\n onDelete,\n onToggleEnabled,\n isDeleting,\n isToggling,\n}: PoolCardProps) {\n const { formatMessage } = useIntl();\n\n // Get model type badge\n const getModelTypeBadge = () => {\n const variantMap = {\n embedding: 'success' as const,\n llm: 'default' as const,\n reranker: 'info' as const,\n };\n\n const labelMap = {\n embedding: 'apiSettings.modelPools.embedding',\n llm: 'apiSettings.modelPools.llm',\n reranker: 'apiSettings.modelPools.reranker',\n };\n\n return (\n <Badge variant={variantMap[pool.modelType]}>\n {formatMessage({ id: labelMap[pool.modelType] })}\n </Badge>\n );\n };\n\n // Get strategy label\n const getStrategyLabel = () => {\n const strategyMap = {\n round_robin: 'apiSettings.modelPools.roundRobin',\n latency_aware: 'apiSettings.modelPools.latencyAware',\n weighted_random: 'apiSettings.modelPools.weightedRandom',\n };\n return formatMessage({ id: strategyMap[pool.strategy] });\n };\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: Pool Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground truncate\">\n {pool.name || pool.id}\n </h3>\n {getModelTypeBadge()}\n {pool.enabled ? (\n <Badge variant=\"success\">\n <CheckCircle2 className=\"w-3 h-3 mr-1\" />\n {formatMessage({ id: 'apiSettings.common.enabled' })}\n </Badge>\n ) : (\n <Badge variant=\"secondary\">\n <XCircle className=\"w-3 h-3 mr-1\" />\n {formatMessage({ id: 'apiSettings.common.disabled' })}\n </Badge>\n )}\n </div>\n\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span className=\"capitalize\">{getStrategyLabel()}</span>\n {pool.autoDiscover && (\n <span className=\"flex items-center gap-1\">\n <Zap className=\"w-3 h-3\" />\n {formatMessage({ id: 'apiSettings.modelPools.autoDiscover' })}\n </span>\n )}\n </div>\n\n <div className=\"mt-2 text-sm\">\n <p className=\"text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.modelPools.targetModel' })}: <span className=\"font-medium\">{pool.targetModel}</span>\n </p>\n </div>\n\n {pool.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{pool.description}</p>\n )}\n\n <div className=\"flex items-center gap-4 mt-2 text-xs text-muted-foreground\">\n <span>\n {formatMessage({ id: 'apiSettings.modelPools.defaultCooldown' })}: {pool.defaultCooldown}s\n </span>\n <span>\n {formatMessage({ id: 'apiSettings.modelPools.defaultConcurrent' })}: {pool.defaultMaxConcurrentPerKey}\n </span>\n </div>\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={pool.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\ninterface StatCardProps {\n label: string;\n value: number;\n icon: React.ReactNode;\n className?: string;\n}\n\nfunction StatCard({ label, value, icon, className }: StatCardProps) {\n return (\n <Card className={cn('p-4', className)}>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-primary/10 rounded-md text-primary\">\n {icon}\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <p className=\"text-2xl font-semibold\">{value}</p>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ModelPoolList({ onAddPool, onEditPool }: ModelPoolListProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n\n // Queries and mutations\n const { pools, totalCount, enabledCount, isLoading, refetch } = useModelPools();\n const { deleteModelPool, isDeleting } = useDeleteModelPool();\n const { updateModelPool } = useUpdateModelPool();\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [filterType, setFilterType] = useState<FilterType>('all');\n const [deletePoolId, setDeletePoolId] = useState<string | null>(null);\n const [togglingPoolId, setTogglingPoolId] = useState<string | null>(null);\n\n // Filter pools\n const filteredPools = useMemo(() => {\n return pools.filter((pool) => {\n const matchesSearch =\n !searchQuery ||\n pool.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n pool.name?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n pool.targetModel.toLowerCase().includes(searchQuery.toLowerCase());\n\n const matchesFilter =\n filterType === 'all' || pool.modelType === filterType;\n\n return matchesSearch && matchesFilter;\n });\n }, [pools, searchQuery, filterType]);\n\n // Count pools by type\n const typeCounts = useMemo(() => {\n return {\n embedding: pools.filter((p) => p.modelType === 'embedding').length,\n llm: pools.filter((p) => p.modelType === 'llm').length,\n reranker: pools.filter((p) => p.modelType === 'reranker').length,\n };\n }, [pools]);\n\n // Handle delete\n const handleDelete = async () => {\n if (!deletePoolId) return;\n\n try {\n await deleteModelPool(deletePoolId);\n success(\n formatMessage({ id: 'apiSettings.messages.settingsDeleted' })\n );\n setDeletePoolId(null);\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n }\n };\n\n // Handle toggle enabled\n const handleToggleEnabled = async (poolId: string, enabled: boolean) => {\n setTogglingPoolId(poolId);\n try {\n await updateModelPool(poolId, { enabled });\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n } finally {\n setTogglingPoolId(null);\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Statistics Cards */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.stats.total' })}\n value={totalCount}\n icon={<Layers className=\"w-5 h-5\" />}\n />\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.stats.enabled' })}\n value={enabledCount}\n icon={<CheckCircle2 className=\"w-5 h-5\" />}\n />\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.embedding' })}\n value={typeCounts.embedding}\n icon={<Zap className=\"w-5 h-5\" />}\n />\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.llm' })}\n value={typeCounts.llm}\n icon={<Layers className=\"w-5 h-5\" />}\n />\n </div>\n\n {/* Search and Filter Bar */}\n <div className=\"flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between\">\n <div className=\"flex-1 w-full sm:max-w-md\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.common.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Filter Buttons */}\n <div className=\"flex items-center bg-muted rounded-lg p-1\">\n {(Object.keys({ all: null, embedding: null, llm: null, reranker: null }) as FilterType[]).map((type) => (\n <button\n key={type}\n onClick={() => setFilterType(type)}\n className={cn(\n 'px-3 py-1.5 text-sm font-medium rounded-md transition-colors',\n filterType === type\n ? 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {type === 'all'\n ? formatMessage({ id: 'apiSettings.common.showAll' })\n : formatMessage({ id: `apiSettings.modelPools.${type as ModelPoolType}` })}\n </button>\n ))}\n </div>\n\n <Button onClick={onAddPool}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* Pool List */}\n {isLoading ? (\n <div className=\"text-center py-12 text-muted-foreground\">\n {formatMessage({ id: 'common.loading' })}\n </div>\n ) : filteredPools.length === 0 ? (\n <Card className=\"p-12 text-center\">\n <Layers className=\"w-12 h-12 mx-auto mb-4 text-muted-foreground\" />\n <h3 className=\"text-lg font-semibold mb-2\">\n {formatMessage({ id: 'apiSettings.modelPools.emptyState.title' })}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-4\">\n {formatMessage({ id: 'apiSettings.modelPools.emptyState.message' })}\n </p>\n <Button onClick={onAddPool}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.add' })}\n </Button>\n </Card>\n ) : (\n <div className=\"grid gap-4\">\n {filteredPools.map((pool) => (\n <PoolCard\n key={pool.id}\n pool={pool}\n onEdit={() => onEditPool(pool.id)}\n onDelete={() => setDeletePoolId(pool.id)}\n onToggleEnabled={(enabled) => handleToggleEnabled(pool.id, enabled)}\n isDeleting={isDeleting && deletePoolId === pool.id}\n isToggling={togglingPoolId === pool.id}\n />\n ))}\n </div>\n )}\n\n {/* Delete Confirmation Dialog */}\n <AlertDialog open={!!deletePoolId} onOpenChange={() => setDeletePoolId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {formatMessage({ id: 'apiSettings.modelPools.actions.delete' })}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {formatMessage(\n { id: 'apiSettings.modelPools.deleteConfirm' },\n { name: pools.find((p) => p.id === deletePoolId)?.name || deletePoolId || '' }\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isDeleting}>\n {formatMessage({ id: 'common.cancel' })}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleDelete} disabled={isDeleting} className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\">\n {isDeleting\n ? formatMessage({ id: 'common.loading' })\n : formatMessage({ id: 'common.confirm' })}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","// ========================================\n// Model Pool Modal Component\n// ========================================\n// Add/Edit model pool modal with auto-discovery\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Save,\n X,\n Zap,\n Loader2,\n Info,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Checkbox } from '@/components/ui/Checkbox';\nimport {\n useCreateModelPool,\n useUpdateModelPool,\n useDiscoverModelsForPool,\n useAvailableModelsForPool,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ModelPoolConfig, ModelPoolType, DiscoveredProvider } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface ModelPoolModalProps {\n open: boolean;\n onClose: () => void;\n pool?: ModelPoolConfig | null;\n}\n\ninterface FormData {\n modelType: ModelPoolType | '';\n targetModel: string;\n strategy: 'round_robin' | 'latency_aware' | 'weighted_random';\n autoDiscover: boolean;\n excludedProviderIds: string[];\n defaultCooldown: number;\n defaultMaxConcurrentPerKey: number;\n name: string;\n description: string;\n}\n\nconst defaultFormData: FormData = {\n modelType: '',\n targetModel: '',\n strategy: 'round_robin',\n autoDiscover: true,\n excludedProviderIds: [],\n defaultCooldown: 60,\n defaultMaxConcurrentPerKey: 5,\n name: '',\n description: '',\n};\n\n// ========== Helper Components ==========\n\ninterface ProviderDiscoveryItemProps {\n provider: DiscoveredProvider;\n excluded: boolean;\n onToggle: (providerId: string) => void;\n}\n\nfunction ProviderDiscoveryItem({ provider, excluded, onToggle }: ProviderDiscoveryItemProps) {\n const { formatMessage } = useIntl();\n\n return (\n <div className=\"flex items-center justify-between p-3 bg-muted/50 rounded-md\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={`provider-${provider.providerId}`}\n checked={!excluded}\n onCheckedChange={() => onToggle(provider.providerId)}\n />\n <Label\n htmlFor={`provider-${provider.providerId}`}\n className=\"font-medium cursor-pointer\"\n >\n {provider.providerName}\n </Label>\n </div>\n <div className=\"ml-6 mt-1 flex flex-wrap gap-1\">\n {provider.models.map((model) => (\n <span\n key={model}\n className=\"text-xs px-2 py-0.5 bg-background rounded text-muted-foreground\"\n >\n {model}\n </span>\n ))}\n </div>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onToggle(provider.providerId)}\n >\n {excluded ? (\n <span className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.modelPools.excludeProvider' })}\n </span>\n ) : (\n <span className=\"text-xs text-primary\">\n {formatMessage({ id: 'apiSettings.modelPools.includeProvider' })}\n </span>\n )}\n </Button>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ModelPoolModal({ open, onClose, pool }: ModelPoolModalProps) {\n const { formatMessage } = useIntl();\n const { success, error, warning } = useNotifications();\n\n // Form state\n const [formData, setFormData] = useState<FormData>(defaultFormData);\n const [hasDiscovered, setHasDiscovered] = useState(false);\n\n // Mutations and queries\n const { createModelPool, isCreating } = useCreateModelPool();\n const { updateModelPool, isUpdating } = useUpdateModelPool();\n const { discoverModels, isDiscovering, data: discoveredResponse } = useDiscoverModelsForPool();\n const { data: availableModelsResponse, isLoading: isLoadingModels } = useAvailableModelsForPool(\n (formData.modelType as ModelPoolType | '') || ('embedding' as ModelPoolType)\n );\n\n const isEdit = !!pool;\n const isLoading = isCreating || isUpdating;\n\n // Initialize form from pool (edit mode)\n useEffect(() => {\n if (pool) {\n setFormData({\n modelType: pool.modelType,\n targetModel: pool.targetModel,\n strategy: pool.strategy,\n autoDiscover: pool.autoDiscover,\n excludedProviderIds: pool.excludedProviderIds ?? [],\n defaultCooldown: pool.defaultCooldown,\n defaultMaxConcurrentPerKey: pool.defaultMaxConcurrentPerKey,\n name: pool.name ?? '',\n description: pool.description ?? '',\n });\n } else {\n setFormData(defaultFormData);\n }\n setHasDiscovered(false);\n }, [pool, open]);\n\n // Handle input change\n const handleInputChange = <K extends keyof FormData>(\n key: K,\n value: FormData[K]\n ) => {\n setFormData((prev) => ({ ...prev, [key]: value }));\n // Reset discovered state when model type or target model changes\n if (key === 'modelType' || key === 'targetModel') {\n setHasDiscovered(false);\n }\n };\n\n // Handle auto-discover\n const handleAutoDiscover = async () => {\n if (!formData.modelType || !formData.targetModel) {\n warning(\n 'Please select model type and target model first'\n );\n return;\n }\n\n try {\n await discoverModels(formData.modelType as ModelPoolType, formData.targetModel);\n setHasDiscovered(true);\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : 'Failed to discover providers'\n );\n }\n };\n\n // Toggle provider exclusion\n const handleToggleProvider = (providerId: string) => {\n setFormData((prev) => ({\n ...prev,\n excludedProviderIds: prev.excludedProviderIds.includes(providerId)\n ? prev.excludedProviderIds.filter((id) => id !== providerId)\n : [...prev.excludedProviderIds, providerId],\n }));\n };\n\n // Validate form\n const isValid = useMemo(() => {\n return !!formData.modelType && !!formData.targetModel;\n }, [formData.modelType, formData.targetModel]);\n\n // Handle submit\n const handleSubmit = async () => {\n if (!isValid) return;\n\n try {\n const poolData: Omit<ModelPoolConfig, 'id'> = {\n modelType: formData.modelType as ModelPoolType,\n targetModel: formData.targetModel,\n strategy: formData.strategy,\n autoDiscover: formData.autoDiscover,\n excludedProviderIds: formData.excludedProviderIds,\n defaultCooldown: formData.defaultCooldown,\n defaultMaxConcurrentPerKey: formData.defaultMaxConcurrentPerKey,\n name: formData.name || undefined,\n description: formData.description || undefined,\n enabled: true,\n };\n\n if (isEdit && pool) {\n await updateModelPool(pool.id, poolData);\n } else {\n await createModelPool(poolData);\n }\n\n success(\n formatMessage({ id: 'apiSettings.modelPools.poolSaved' })\n );\n onClose();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : 'Failed to save model pool'\n );\n }\n };\n\n // Extract discovered providers from response\n const discoveredProviders = discoveredResponse?.discovered ?? [];\n\n // Count included providers\n const includedCount = useMemo(() => {\n if (!discoveredResponse || !discoveredProviders) return 0;\n return discoveredProviders.length - formData.excludedProviderIds.filter(\n (id) => discoveredProviders.some((p) => p.providerId === id)\n ).length;\n }, [discoveredResponse, discoveredProviders, formData.excludedProviderIds]);\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {isEdit\n ? formatMessage({ id: 'apiSettings.modelPools.actions.edit' })\n : formatMessage({ id: 'apiSettings.modelPools.actions.add' })}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.modelPools.embeddingPoolDesc' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n {/* Model Type */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-model-type\">\n {formatMessage({ id: 'apiSettings.modelPools.modelType' })} *\n </Label>\n <Select\n value={formData.modelType}\n onValueChange={(value) => handleInputChange('modelType', value as ModelPoolType)}\n disabled={isEdit}\n >\n <SelectTrigger id=\"pool-model-type\">\n <SelectValue placeholder={formatMessage({ id: 'apiSettings.modelPools.selectTargetModel' })} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"embedding\">\n {formatMessage({ id: 'apiSettings.modelPools.embedding' })}\n </SelectItem>\n <SelectItem value=\"llm\">\n {formatMessage({ id: 'apiSettings.modelPools.llm' })}\n </SelectItem>\n <SelectItem value=\"reranker\">\n {formatMessage({ id: 'apiSettings.modelPools.reranker' })}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Target Model */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-target-model\">\n {formatMessage({ id: 'apiSettings.modelPools.targetModel' })} *\n </Label>\n {isLoadingModels ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n {formatMessage({ id: 'common.loading' })}\n </div>\n ) : (\n <Select\n value={formData.targetModel}\n onValueChange={(value) => handleInputChange('targetModel', value)}\n disabled={!formData.modelType}\n >\n <SelectTrigger id=\"pool-target-model\">\n <SelectValue placeholder={formatMessage({ id: 'apiSettings.modelPools.selectTargetModel' })} />\n </SelectTrigger>\n <SelectContent>\n {availableModelsResponse?.availableModels?.map((model) => (\n <SelectItem key={model.modelId} value={model.modelId}>\n {model.modelName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n\n {/* Strategy */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-strategy\">\n {formatMessage({ id: 'apiSettings.modelPools.strategy' })}\n </Label>\n <Select\n value={formData.strategy}\n onValueChange={(value) => handleInputChange('strategy', value as FormData['strategy'])}\n >\n <SelectTrigger id=\"pool-strategy\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"round_robin\">\n {formatMessage({ id: 'apiSettings.modelPools.roundRobin' })}\n </SelectItem>\n <SelectItem value=\"latency_aware\">\n {formatMessage({ id: 'apiSettings.modelPools.latencyAware' })}\n </SelectItem>\n <SelectItem value=\"weighted_random\">\n {formatMessage({ id: 'apiSettings.modelPools.weightedRandom' })}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Auto-Discover Toggle */}\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <Label htmlFor=\"pool-auto-discover\">\n {formatMessage({ id: 'apiSettings.modelPools.autoDiscover' })}\n </Label>\n <p className=\"text-xs text-muted-foreground\">\n Automatically find providers offering this model\n </p>\n </div>\n <Switch\n id=\"pool-auto-discover\"\n checked={formData.autoDiscover}\n onCheckedChange={(checked) => handleInputChange('autoDiscover', checked)}\n />\n </div>\n\n {/* Auto-Discover Button and Results */}\n {formData.autoDiscover && formData.modelType && formData.targetModel && (\n <div className=\"space-y-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleAutoDiscover}\n disabled={isDiscovering}\n className=\"w-full\"\n >\n {isDiscovering ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {formatMessage({ id: 'common.loading' })}\n </>\n ) : (\n <>\n <Zap className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.autoDiscover' })}\n </>\n )}\n </Button>\n\n {hasDiscovered && discoveredProviders.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Info className=\"w-4 h-4\" />\n <span>\n {formatMessage({ id: 'apiSettings.modelPools.discovered' })}{' '}\n {discoveredProviders.length}{' '}\n {formatMessage({ id: 'apiSettings.modelPools.providers' })} •{' '}\n {includedCount} {formatMessage({ id: 'apiSettings.modelPools.discovered' }).toLowerCase()}\n </span>\n </div>\n {discoveredProviders.map((provider) => (\n <ProviderDiscoveryItem\n key={provider.providerId}\n provider={provider}\n excluded={formData.excludedProviderIds.includes(provider.providerId)}\n onToggle={handleToggleProvider}\n />\n ))}\n </div>\n )}\n\n {hasDiscovered && discoveredProviders.length === 0 && (\n <div className=\"text-center py-6 text-muted-foreground\">\n <p className=\"text-sm\">\n {formatMessage({ id: 'apiSettings.modelPools.noProvidersFound' })}\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* Cooldown and Concurrent */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-cooldown\">\n {formatMessage({ id: 'apiSettings.modelPools.defaultCooldown' })}\n </Label>\n <Input\n id=\"pool-cooldown\"\n type=\"number\"\n min={0}\n value={formData.defaultCooldown}\n onChange={(e) => handleInputChange('defaultCooldown', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-concurrent\">\n {formatMessage({ id: 'apiSettings.modelPools.defaultConcurrent' })}\n </Label>\n <Input\n id=\"pool-concurrent\"\n type=\"number\"\n min={1}\n value={formData.defaultMaxConcurrentPerKey}\n onChange={(e) => handleInputChange('defaultMaxConcurrentPerKey', parseInt(e.target.value) || 1)}\n />\n </div>\n </div>\n\n {/* Name and Description */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-name\">\n {formatMessage({ id: 'apiSettings.common.name' })}\n </Label>\n <Input\n id=\"pool-name\"\n value={formData.name}\n onChange={(e) => handleInputChange('name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.common.optional' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-description\">\n {formatMessage({ id: 'apiSettings.common.description' })}\n </Label>\n <Textarea\n id=\"pool-description\"\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.common.optional' })}\n rows={3}\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={isLoading}>\n <X className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.cancel' })}\n </Button>\n <Button onClick={handleSubmit} disabled={!isValid || isLoading}>\n {isLoading ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {formatMessage({ id: 'common.loading' })}\n </>\n ) : (\n <>\n <Save className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.save' })}\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","// ========================================\n// CLI Settings List Component\n// ========================================\n// Display CLI settings as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Settings,\n CheckCircle2,\n MoreVertical,\n Link as LinkIcon,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n} from '@/components/ui/Dropdown';\nimport {\n useCliSettings,\n useDeleteCliSettings,\n useToggleCliSettings,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { CliSettingsEndpoint } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface CliSettingsListProps {\n onAddCliSettings: () => void;\n onEditCliSettings: (endpointId: string) => void;\n}\n\n// ========== Helper Components ==========\n\ninterface CliSettingsCardProps {\n cliSettings: CliSettingsEndpoint;\n onEdit: () => void;\n onDelete: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isToggling: boolean;\n}\n\nfunction CliSettingsCard({\n cliSettings,\n onEdit,\n onDelete,\n onToggleEnabled,\n isDeleting,\n isToggling,\n}: CliSettingsCardProps) {\n const { formatMessage } = useIntl();\n\n // Display provider badge\n const getProviderBadge = () => {\n const provider = cliSettings.provider || 'claude';\n const variants: Record<string, { variant: 'secondary' | 'outline' | 'default'; label: string }> = {\n claude: { variant: 'secondary', label: 'Claude' },\n codex: { variant: 'outline', label: 'Codex' },\n gemini: { variant: 'default', label: 'Gemini' },\n };\n const config = variants[provider] || variants.claude;\n return (\n <Badge variant={config.variant} className=\"text-xs\">\n {config.label}\n </Badge>\n );\n };\n\n const getStatusBadge = () => {\n if (!cliSettings.enabled) {\n return <Badge variant=\"secondary\">{formatMessage({ id: 'apiSettings.common.disabled' })}</Badge>;\n }\n return <Badge variant=\"success\">{formatMessage({ id: 'apiSettings.common.enabled' })}</Badge>;\n };\n\n // Get provider-appropriate endpoint URL for display\n const endpointUrl = (() => {\n const env = cliSettings.settings.env;\n return env.ANTHROPIC_BASE_URL || env.OPENAI_BASE_URL || '';\n })();\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: CLI Settings Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground truncate\">{cliSettings.name}</h3>\n {getStatusBadge()}\n {getProviderBadge()}\n </div>\n {cliSettings.description && (\n <p className=\"text-sm text-muted-foreground mt-1\">{cliSettings.description}</p>\n )}\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Settings className=\"w-3 h-3\" />\n {cliSettings.settings.model || 'default'}\n </span>\n {endpointUrl && (\n <span className=\"flex items-center gap-1 truncate max-w-[200px]\" title={endpointUrl}>\n <LinkIcon className=\"w-3 h-3 flex-shrink-0\" />\n {endpointUrl}\n </span>\n )}\n </div>\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={cliSettings.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cliSettings.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cliSettings.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function CliSettingsList({\n onAddCliSettings,\n onEditCliSettings,\n}: CliSettingsListProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const [searchQuery, setSearchQuery] = useState('');\n\n const {\n cliSettings,\n totalCount,\n enabledCount,\n providerCounts,\n isLoading,\n refetch,\n } = useCliSettings();\n\n const { deleteCliSettings, isDeleting } = useDeleteCliSettings();\n const { toggleCliSettings, isToggling } = useToggleCliSettings();\n\n // Filter settings by search query\n const filteredSettings = useMemo(() => {\n if (!searchQuery) return cliSettings;\n const query = searchQuery.toLowerCase();\n return cliSettings.filter(\n (s) =>\n s.name.toLowerCase().includes(query) ||\n s.description?.toLowerCase().includes(query) ||\n s.id.toLowerCase().includes(query)\n );\n }, [cliSettings, searchQuery]);\n\n // Handlers\n const handleDelete = async (endpointId: string) => {\n const settings = cliSettings.find((s) => s.id === endpointId);\n if (!settings) return;\n\n const confirmMessage = formatMessage(\n { id: 'apiSettings.cliSettings.deleteConfirm' },\n { name: settings.name }\n );\n\n if (confirm(confirmMessage)) {\n try {\n await deleteCliSettings(endpointId);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.deleteError' }));\n }\n }\n };\n\n const handleToggleEnabled = async (endpointId: string, enabled: boolean) => {\n try {\n await toggleCliSettings(endpointId, enabled);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.toggleError' }));\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Stats Cards */}\n <div className=\"grid grid-cols-2 sm:grid-cols-5 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{totalCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.cliSettings.stats.total' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"w-5 h-5 text-success\" />\n <span className=\"text-2xl font-bold\">{enabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.cliSettings.stats.enabled' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold\">{providerCounts.claude || 0}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">Claude</p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold\">{providerCounts.codex || 0}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">Codex</p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold\">{providerCounts.gemini || 0}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">Gemini</p>\n </Card>\n </div>\n\n {/* Search and Actions */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isLoading}>\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <Button onClick={onAddCliSettings}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cliSettings.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* CLI Settings Cards */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-32 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : filteredSettings.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <Settings className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.emptyState.message' })}\n </p>\n </Card>\n ) : (\n <div className=\"space-y-3\">\n {filteredSettings.map((settings) => (\n <CliSettingsCard\n key={settings.id}\n cliSettings={settings}\n onEdit={() => onEditCliSettings(settings.id)}\n onDelete={() => handleDelete(settings.id)}\n onToggleEnabled={(enabled) => handleToggleEnabled(settings.id, enabled)}\n isDeleting={isDeleting}\n isToggling={isToggling}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default CliSettingsList;\n","// ========================================\n// CLI Settings Modal Component\n// ========================================\n// Add/Edit CLI settings modal with multi-provider support (Claude/Codex/Gemini)\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Check, Eye, EyeOff, X, Plus, Loader2, Download } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/Tabs';\nimport { useCreateCliSettings, useUpdateCliSettings, useProviders } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport { fetchCodexConfigPreview, fetchGeminiConfigPreview } from '@/lib/api';\nimport type { CliSettingsEndpoint, CliProvider } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface CliSettingsModalProps {\n open: boolean;\n onClose: () => void;\n cliSettings?: CliSettingsEndpoint | null;\n /** Pre-selected provider when creating new */\n defaultProvider?: CliProvider;\n}\n\ntype ModeType = 'provider-based' | 'direct';\n\n// ========== Helper Functions ==========\n\nfunction parseConfigText(\n text: string,\n format: 'json' | 'toml' = 'json'\n): { ok: true; value: string } | { ok: false; errorKey: string } {\n const trimmed = text.trim();\n if (!trimmed) {\n return { ok: true, value: '' };\n }\n\n if (format === 'json') {\n try {\n JSON.parse(trimmed);\n return { ok: true, value: trimmed };\n } catch {\n return { ok: false, errorKey: 'invalidJson' };\n }\n }\n\n // TOML: basic format check (no full parser needed)\n return { ok: true, value: trimmed };\n}\n\n// ========== Main Component ==========\n\nexport function CliSettingsModal({ open, onClose, cliSettings, defaultProvider }: CliSettingsModalProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const isEditing = !!cliSettings;\n\n // Mutations\n const { createCliSettings, isCreating } = useCreateCliSettings();\n const { updateCliSettings, isUpdating } = useUpdateCliSettings();\n\n // Get providers for provider-based mode (Claude)\n const { providers } = useProviders();\n\n // Common form state\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [enabled, setEnabled] = useState(true);\n const [cliProvider, setCliProvider] = useState<CliProvider>('claude');\n\n // Claude: mode tabs\n const [mode, setMode] = useState<ModeType>('direct');\n const [providerId, setProviderId] = useState('');\n const [authToken, setAuthToken] = useState('');\n const [baseUrl, setBaseUrl] = useState('');\n const [showToken, setShowToken] = useState(false);\n const [settingsFile, setSettingsFile] = useState('');\n\n // Codex specific\n const [codexApiKey, setCodexApiKey] = useState('');\n const [codexBaseUrl, setCodexBaseUrl] = useState('');\n const [codexProfile, setCodexProfile] = useState('');\n const [showCodexKey, setShowCodexKey] = useState(false);\n const [authJson, setAuthJson] = useState('');\n const [configToml, setConfigToml] = useState('');\n const [writeCommonConfig, setWriteCommonConfig] = useState(false);\n\n // Gemini specific\n const [geminiApiKey, setGeminiApiKey] = useState('');\n const [showGeminiKey, setShowGeminiKey] = useState(false);\n const [geminiSettingsJson, setGeminiSettingsJson] = useState('');\n const [isLoadingGeminiConfig, setIsLoadingGeminiConfig] = useState(false);\n\n // Shared\n const [model, setModel] = useState('');\n const [availableModels, setAvailableModels] = useState<string[]>([]);\n const [modelInput, setModelInput] = useState('');\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n const [configJson, setConfigJson] = useState('{}');\n const [showJsonInput, setShowJsonInput] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n // Codex config preview loading state\n const [isLoadingCodexConfig, setIsLoadingCodexConfig] = useState(false);\n\n // Initialize form\n useEffect(() => {\n if (cliSettings) {\n setName(cliSettings.name);\n setDescription(cliSettings.description || '');\n setEnabled(cliSettings.enabled);\n setCliProvider(cliSettings.provider || 'claude');\n setModel(cliSettings.settings.model || '');\n setAvailableModels(cliSettings.settings.availableModels || []);\n setTags(cliSettings.settings.tags || []);\n\n const provider = cliSettings.provider || 'claude';\n if (provider === 'claude') {\n setSettingsFile((cliSettings.settings as any).settingsFile || '');\n const env = cliSettings.settings.env;\n const hasCustomBaseUrl = Boolean(\n env.ANTHROPIC_BASE_URL && !env.ANTHROPIC_BASE_URL.includes('api.anthropic.com')\n );\n if (hasCustomBaseUrl) {\n setMode('direct');\n setBaseUrl(env.ANTHROPIC_BASE_URL || '');\n setAuthToken(env.ANTHROPIC_AUTH_TOKEN || '');\n } else {\n setMode('provider-based');\n const matchingProvider = providers.find((p) => p.apiBase === env.ANTHROPIC_BASE_URL);\n if (matchingProvider) setProviderId(matchingProvider.id);\n }\n } else if (provider === 'codex') {\n const s = cliSettings.settings as any;\n setCodexApiKey(s.env.OPENAI_API_KEY || '');\n setCodexBaseUrl(s.env.OPENAI_BASE_URL || '');\n setCodexProfile(s.profile || '');\n setAuthJson(s.authJson || '');\n setConfigToml(s.configToml || '');\n } else if (provider === 'gemini') {\n setGeminiApiKey(cliSettings.settings.env.GEMINI_API_KEY || cliSettings.settings.env.GOOGLE_API_KEY || '');\n }\n } else {\n // Reset for new\n const p = defaultProvider || 'claude';\n setName('');\n setDescription('');\n setEnabled(true);\n setCliProvider(p);\n setMode('direct');\n setProviderId('');\n setModel('');\n setSettingsFile('');\n setAuthToken('');\n setBaseUrl('');\n setCodexApiKey('');\n setCodexBaseUrl('');\n setCodexProfile('');\n setShowCodexKey(false);\n setAuthJson('');\n setConfigToml('');\n setWriteCommonConfig(false);\n setGeminiApiKey('');\n setShowGeminiKey(false);\n setGeminiSettingsJson('');\n setAvailableModels([]);\n setModelInput('');\n setTags([]);\n setTagInput('');\n setConfigJson('{}');\n setShowJsonInput(false);\n setErrors({});\n }\n }, [cliSettings, open, providers, defaultProvider]);\n\n // Validate form\n const validateForm = (): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (!name.trim()) {\n newErrors.name = formatMessage({ id: 'apiSettings.validation.nameRequired' });\n } else {\n const namePattern = /^[a-zA-Z][a-zA-Z0-9_-]*$/;\n if (!namePattern.test(name.trim())) {\n newErrors.name = formatMessage({ id: 'apiSettings.cliSettings.nameFormatHint' });\n }\n if (name.trim().length > 32) {\n newErrors.name = formatMessage({ id: 'apiSettings.cliSettings.nameTooLong' }, { max: 32 });\n }\n }\n\n if (cliProvider === 'claude') {\n if (mode === 'provider-based' && !providerId) {\n newErrors.providerId = formatMessage({ id: 'apiSettings.cliSettings.validation.providerRequired' });\n }\n if (mode === 'direct' && !authToken.trim() && !baseUrl.trim()) {\n newErrors.direct = formatMessage({ id: 'apiSettings.cliSettings.validation.authOrBaseUrlRequired' });\n }\n }\n\n if (authJson.trim()) {\n const parsed = parseConfigText(authJson, 'json');\n if (!parsed.ok) {\n newErrors.authJson = formatMessage({ id: `apiSettings.cliSettings.${parsed.errorKey}` });\n }\n }\n\n if (showJsonInput) {\n const parsed = parseConfigText(configJson, 'json');\n if (!parsed.ok) {\n newErrors.configJson = formatMessage({ id: `apiSettings.cliSettings.${parsed.errorKey}` });\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n // Handle load Codex config preview\n const handleLoadCodexConfig = async () => {\n setIsLoadingCodexConfig(true);\n try {\n const result = await fetchCodexConfigPreview();\n if (result.success) {\n if (result.configToml) {\n setConfigToml(result.configToml);\n }\n if (result.authJson) {\n setAuthJson(result.authJson);\n }\n } else {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n }\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n } finally {\n setIsLoadingCodexConfig(false);\n }\n };\n\n // Handle load Gemini config preview\n const handleLoadGeminiConfig = async () => {\n setIsLoadingGeminiConfig(true);\n try {\n const result = await fetchGeminiConfigPreview();\n if (result.success) {\n if (result.settingsJson) {\n setGeminiSettingsJson(result.settingsJson);\n }\n } else {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n }\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n } finally {\n setIsLoadingGeminiConfig(false);\n }\n };\n\n // Handle save\n const handleSave = async () => {\n if (!validateForm()) return;\n\n try {\n let settings: any;\n\n if (cliProvider === 'claude') {\n const env: Record<string, string> = { DISABLE_AUTOUPDATER: '1' };\n if (mode === 'provider-based') {\n const provider = providers.find((p) => p.id === providerId);\n if (provider?.apiBase) env.ANTHROPIC_BASE_URL = provider.apiBase;\n if (provider?.apiKey) env.ANTHROPIC_AUTH_TOKEN = provider.apiKey;\n } else {\n if (authToken.trim()) env.ANTHROPIC_AUTH_TOKEN = authToken.trim();\n if (baseUrl.trim()) env.ANTHROPIC_BASE_URL = baseUrl.trim();\n }\n settings = {\n env,\n model: model || undefined,\n settingsFile: settingsFile.trim() || undefined,\n availableModels,\n tags,\n };\n } else if (cliProvider === 'codex') {\n const env: Record<string, string> = {};\n if (codexApiKey.trim()) env.OPENAI_API_KEY = codexApiKey.trim();\n if (codexBaseUrl.trim()) env.OPENAI_BASE_URL = codexBaseUrl.trim();\n settings = {\n env,\n model: model || undefined,\n profile: codexProfile.trim() || undefined,\n authJson: authJson.trim() || undefined,\n configToml: configToml.trim() || undefined,\n availableModels,\n tags,\n };\n } else {\n // gemini\n const env: Record<string, string> = {};\n if (geminiApiKey.trim()) env.GEMINI_API_KEY = geminiApiKey.trim();\n settings = {\n env,\n model: model || undefined,\n availableModels,\n tags,\n };\n }\n\n // Merge JSON config if shown\n if (showJsonInput && configJson.trim()) {\n try {\n const extra = JSON.parse(configJson);\n if (extra && typeof extra === 'object' && !Array.isArray(extra)) {\n Object.assign(settings, extra);\n }\n } catch {\n // skip invalid json\n }\n }\n\n const request = {\n id: cliSettings?.id,\n name: name.trim(),\n description: description.trim() || undefined,\n provider: cliProvider,\n enabled,\n settings,\n };\n\n if (isEditing && cliSettings) {\n await updateCliSettings(cliSettings.id, request);\n } else {\n await createCliSettings(request);\n }\n\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.saveError' }));\n }\n };\n\n // Tag/Model helpers\n const handleAddModel = () => {\n const v = modelInput.trim();\n if (v && !availableModels.includes(v)) {\n setAvailableModels([...availableModels, v]);\n setModelInput('');\n }\n };\n const handleRemoveModel = (m: string) => setAvailableModels(availableModels.filter((x) => x !== m));\n const handleAddTag = () => {\n const v = tagInput.trim();\n if (v && !tags.includes(v)) {\n setTags([...tags, v]);\n setTagInput('');\n }\n };\n const handleRemoveTag = (t: string) => setTags(tags.filter((x) => x !== t));\n\n const predefinedTags = ['分析', 'Debug', 'implementation', 'refactoring', 'testing'];\n const selectedProvider = providers.find((p) => p.id === providerId);\n\n // Title by provider\n const providerLabel: Record<CliProvider, string> = {\n claude: 'Claude',\n codex: 'Codex',\n gemini: 'Gemini',\n };\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {isEditing\n ? formatMessage({ id: 'apiSettings.cliSettings.actions.edit' })\n : formatMessage({ id: 'apiSettings.cliSettings.actions.add' })}\n {' - '}{providerLabel[cliProvider]}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.cliSettings.modalDescription' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* Common Fields */}\n <div className=\"space-y-4\">\n {/* Provider Selector (only when creating new) */}\n {!isEditing && (\n <div className=\"space-y-2\">\n <Label>CLI Provider</Label>\n <Select value={cliProvider} onValueChange={(v) => setCliProvider(v as CliProvider)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"claude\">Claude</SelectItem>\n <SelectItem value=\"codex\">Codex</SelectItem>\n <SelectItem value=\"gemini\">Gemini</SelectItem>\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">\n {formatMessage({ id: 'apiSettings.common.name' })}\n <span className=\"text-destructive\">*</span>\n </Label>\n <Input\n id=\"name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.namePlaceholder' })}\n className={errors.name ? 'border-destructive' : ''}\n maxLength={32}\n />\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.nameFormatHint' })}\n </p>\n {errors.name && <p className=\"text-sm text-destructive\">{errors.name}</p>}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">\n {formatMessage({ id: 'apiSettings.common.description' })}\n </Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.descriptionPlaceholder' })}\n rows={2}\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch id=\"enabled\" checked={enabled} onCheckedChange={setEnabled} />\n <Label htmlFor=\"enabled\" className=\"cursor-pointer\">\n {formatMessage({ id: 'apiSettings.common.enableThis' })}\n </Label>\n </div>\n </div>\n\n {/* ========== Claude Settings ========== */}\n {cliProvider === 'claude' && (\n <>\n <Tabs value={mode} onValueChange={(v) => setMode(v as ModeType)} className=\"w-full\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"provider-based\">\n {formatMessage({ id: 'apiSettings.cliSettings.providerBased' })}\n </TabsTrigger>\n <TabsTrigger value=\"direct\">\n {formatMessage({ id: 'apiSettings.cliSettings.direct' })}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"provider-based\" className=\"space-y-4 mt-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"providerId\">\n {formatMessage({ id: 'apiSettings.common.provider' })}\n <span className=\"text-destructive\">*</span>\n </Label>\n <Select value={providerId} onValueChange={setProviderId}>\n <SelectTrigger className={errors.providerId ? 'border-destructive' : ''}>\n <SelectValue placeholder={formatMessage({ id: 'apiSettings.cliSettings.selectProvider' })} />\n </SelectTrigger>\n <SelectContent>\n {providers.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n {errors.providerId && <p className=\"text-sm text-destructive\">{errors.providerId}</p>}\n </div>\n\n {selectedProvider && (\n <div className=\"p-4 bg-muted/50 rounded-lg space-y-2\">\n <p className=\"text-sm font-medium\">{selectedProvider.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.common.type' })}: {selectedProvider.type}\n </p>\n {selectedProvider.apiBase && (\n <p className=\"text-xs text-muted-foreground truncate\">\n {formatMessage({ id: 'apiSettings.providers.apiBaseUrl' })}: {selectedProvider.apiBase}\n </p>\n )}\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"model-pb\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input id=\"model-pb\" value={model} onChange={(e) => setModel(e.target.value)} placeholder=\"\" />\n </div>\n </TabsContent>\n\n <TabsContent value=\"direct\" className=\"space-y-4 mt-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"authToken\">{formatMessage({ id: 'apiSettings.cliSettings.authToken' })}</Label>\n <div className=\"relative\">\n <Input\n id=\"authToken\"\n type={showToken ? 'text' : 'password'}\n value={authToken}\n onChange={(e) => setAuthToken(e.target.value)}\n placeholder=\"sk-ant-...\"\n className={errors.direct ? 'border-destructive pr-10' : 'pr-10'}\n />\n <Button\n type=\"button\" variant=\"ghost\" size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={() => setShowToken(!showToken)}\n >\n {showToken ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"baseUrl\">{formatMessage({ id: 'apiSettings.cliSettings.baseUrl' })}</Label>\n <Input\n id=\"baseUrl\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.anthropic.com\"\n className={errors.direct ? 'border-destructive' : ''}\n />\n </div>\n {errors.direct && <p className=\"text-sm text-destructive\">{errors.direct}</p>}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"model-direct\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input id=\"model-direct\" value={model} onChange={(e) => setModel(e.target.value)} placeholder=\"\" />\n </div>\n </TabsContent>\n </Tabs>\n\n {/* Claude: Settings File */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"settingsFile\">{formatMessage({ id: 'apiSettings.cliSettings.settingsFile' })}</Label>\n <Input\n id=\"settingsFile\"\n value={settingsFile}\n onChange={(e) => setSettingsFile(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.settingsFilePlaceholder' })}\n />\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.settingsFileHint' })}\n </p>\n </div>\n </>\n )}\n\n {/* ========== Codex Settings ========== */}\n {cliProvider === 'codex' && (\n <div className=\"space-y-4\">\n {/* Load Global Config Button */}\n <div className=\"flex items-center justify-between p-3 bg-muted/30 rounded-lg\">\n <div>\n <p className=\"text-sm font-medium\">Load Global Config</p>\n <p className=\"text-xs text-muted-foreground\">\n Load config.toml and auth.json from global Codex config directory\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleLoadCodexConfig}\n disabled={isLoadingCodexConfig}\n >\n {isLoadingCodexConfig ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n Loading...\n </>\n ) : (\n <>\n <Download className=\"w-4 h-4 mr-2\" />\n Load Config\n </>\n )}\n </Button>\n </div>\n\n {/* API Key */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-apikey\">API Key</Label>\n <p className=\"text-xs text-muted-foreground\">\n 只需要填这里,下方 auth.json 会自动填充\n </p>\n <div className=\"relative\">\n <Input\n id=\"codex-apikey\"\n type={showCodexKey ? 'text' : 'password'}\n value={codexApiKey}\n onChange={(e) => setCodexApiKey(e.target.value)}\n placeholder=\"sk-...\"\n className=\"pr-10\"\n />\n <Button\n type=\"button\" variant=\"ghost\" size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={() => setShowCodexKey(!showCodexKey)}\n >\n {showCodexKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n\n {/* API Endpoint URL */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-baseurl\">API 请求地址</Label>\n <Input\n id=\"codex-baseurl\"\n value={codexBaseUrl}\n onChange={(e) => setCodexBaseUrl(e.target.value)}\n placeholder=\"https://your-api-endpoint.com/v1\"\n />\n <p className=\"text-xs text-muted-foreground\">\n 填写兼容 OpenAI Response 格式的服务端点地址\n </p>\n </div>\n\n {/* Model Name */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-model\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input\n id=\"codex-model\"\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"\"\n />\n <p className=\"text-xs text-muted-foreground\">\n 指定使用的模型,将自动更新到 config.toml 中\n </p>\n </div>\n\n {/* Profile */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-profile\">Profile</Label>\n <Input\n id=\"codex-profile\"\n value={codexProfile}\n onChange={(e) => setCodexProfile(e.target.value)}\n placeholder=\"default\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Codex profile 名称,通过 --profile 参数传递\n </p>\n </div>\n\n {/* auth.json Editor */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-authjson\">auth.json (JSON) *</Label>\n <Textarea\n id=\"codex-authjson\"\n value={authJson}\n onChange={(e) => {\n setAuthJson(e.target.value);\n if (errors.authJson) {\n setErrors((prev) => { const n = { ...prev }; delete n.authJson; return n; });\n }\n }}\n placeholder='{\"OPENAI_API_KEY\": \"...\"}'\n className={`font-mono text-sm ${errors.authJson ? 'border-destructive' : ''}`}\n rows={8}\n />\n {errors.authJson && <p className=\"text-xs text-destructive\">{errors.authJson}</p>}\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xs text-muted-foreground\">Codex auth.json 配置内容</p>\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\"\n onClick={() => {\n try {\n const formatted = JSON.stringify(JSON.parse(authJson), null, 2);\n setAuthJson(formatted);\n } catch { /* skip */ }\n }}\n >\n 格式化\n </Button>\n </div>\n </div>\n\n {/* config.toml Editor */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"codex-configtoml\">config.toml (TOML)</Label>\n <div className=\"flex items-center gap-2\">\n <Switch id=\"writeCommon\" checked={writeCommonConfig} onCheckedChange={setWriteCommonConfig} />\n <Label htmlFor=\"writeCommon\" className=\"text-xs cursor-pointer\">写入通用配置</Label>\n </div>\n </div>\n <Textarea\n id=\"codex-configtoml\"\n value={configToml}\n onChange={(e) => setConfigToml(e.target.value)}\n placeholder=\"\"\n className=\"font-mono text-sm\"\n rows={6}\n />\n </div>\n </div>\n )}\n\n {/* ========== Gemini Settings ========== */}\n {cliProvider === 'gemini' && (\n <div className=\"space-y-4\">\n {/* Load Global Config Button */}\n <div className=\"flex items-center justify-between p-3 bg-muted/30 rounded-lg\">\n <div>\n <p className=\"text-sm font-medium\">Load Global Config</p>\n <p className=\"text-xs text-muted-foreground\">\n Load settings.json from global Gemini config directory\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleLoadGeminiConfig}\n disabled={isLoadingGeminiConfig}\n >\n {isLoadingGeminiConfig ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n Loading...\n </>\n ) : (\n <>\n <Download className=\"w-4 h-4 mr-2\" />\n Load Config\n </>\n )}\n </Button>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"gemini-apikey\">API Key</Label>\n <div className=\"relative\">\n <Input\n id=\"gemini-apikey\"\n type={showGeminiKey ? 'text' : 'password'}\n value={geminiApiKey}\n onChange={(e) => setGeminiApiKey(e.target.value)}\n placeholder=\"AIza...\"\n className=\"pr-10\"\n />\n <Button\n type=\"button\" variant=\"ghost\" size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={() => setShowGeminiKey(!showGeminiKey)}\n >\n {showGeminiKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"gemini-model\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input\n id=\"gemini-model\"\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"\"\n />\n </div>\n\n {/* settings.json Editor */}\n {geminiSettingsJson && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"gemini-settingsjson\">settings.json (Preview)</Label>\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\"\n onClick={() => {\n try {\n const formatted = JSON.stringify(JSON.parse(geminiSettingsJson), null, 2);\n setGeminiSettingsJson(formatted);\n } catch { /* skip */ }\n }}\n >\n Format\n </Button>\n </div>\n <Textarea\n id=\"gemini-settingsjson\"\n value={geminiSettingsJson}\n onChange={(e) => setGeminiSettingsJson(e.target.value)}\n placeholder=\"{}\"\n className=\"font-mono text-sm\"\n rows={8}\n readOnly\n />\n <p className=\"text-xs text-muted-foreground\">\n Gemini settings.json content (read-only preview)\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* ========== Shared Settings (all providers) ========== */}\n <div className=\"space-y-4\">\n {/* Available Models */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"availableModels\">{formatMessage({ id: 'apiSettings.cliSettings.availableModels' })}</Label>\n <div className=\"flex flex-wrap gap-2 p-3 bg-muted/30 rounded-lg min-h-[60px]\">\n {availableModels.map((m) => (\n <span key={m} className=\"inline-flex items-center gap-1 px-2 py-1 bg-primary/10 text-primary rounded-md text-sm\">\n {m}\n <button type=\"button\" onClick={() => handleRemoveModel(m)} className=\"hover:text-destructive transition-colors\">×</button>\n </span>\n ))}\n <div className=\"flex gap-2 flex-1\">\n <Input\n id=\"availableModels\"\n value={modelInput}\n onChange={(e) => setModelInput(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); handleAddModel(); } }}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.availableModelsPlaceholder' })}\n className=\"flex-1 min-w-[120px]\"\n />\n <Button type=\"button\" size=\"sm\" onClick={handleAddModel} variant=\"outline\">\n <Check className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.availableModelsHint' })}\n </p>\n </div>\n\n {/* Tags */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"tags\">{formatMessage({ id: 'apiSettings.cliSettings.tags' })}</Label>\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.tagsDescription' })}\n </p>\n <div className=\"flex flex-wrap gap-2 p-3 bg-muted/30 rounded-lg min-h-[60px]\">\n {tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center gap-1 px-2 py-1 bg-primary/10 text-primary rounded-md text-sm\">\n {tag}\n <button\n type=\"button\"\n onClick={() => handleRemoveTag(tag)}\n className=\"hover:text-destructive transition-colors\"\n aria-label={formatMessage({ id: 'apiSettings.cliSettings.removeTag' })}\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n <div className=\"flex gap-2 flex-1\">\n <Input\n id=\"tags\"\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); handleAddTag(); } }}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.tagInputPlaceholder' })}\n className=\"flex-1 min-w-[120px]\"\n />\n <Button type=\"button\" size=\"sm\" onClick={handleAddTag} variant=\"outline\">\n <Plus className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n <span className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.predefinedTags' })}:\n </span>\n {predefinedTags.map((pt) => (\n <button\n key={pt}\n type=\"button\"\n onClick={() => { if (!tags.includes(pt)) setTags([...tags, pt]); }}\n disabled={tags.includes(pt)}\n className=\"text-xs px-2 py-0.5 rounded border border-border hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {pt}\n </button>\n ))}\n </div>\n </div>\n\n {/* JSON Config (all providers) */}\n <div className=\"space-y-2 pt-4 border-t border-border\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"configJson\" className=\"cursor-pointer\">\n {formatMessage({ id: 'apiSettings.cliSettings.configJson' })}\n </Label>\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\"\n onClick={() => setShowJsonInput(!showJsonInput)}\n >\n {showJsonInput\n ? formatMessage({ id: 'common.actions.close' })\n : formatMessage({ id: 'common.actions.expand' }, { value: 'JSON' })}\n </Button>\n </div>\n {showJsonInput && (\n <div className=\"space-y-2\">\n <Textarea\n id=\"configJson\"\n value={configJson}\n onChange={(e) => {\n setConfigJson(e.target.value);\n if (errors.configJson) {\n setErrors((prev) => { const n = { ...prev }; delete n.configJson; return n; });\n }\n }}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.configJsonPlaceholder' })}\n className={errors.configJson ? 'font-mono border-destructive' : 'font-mono'}\n rows={8}\n />\n {errors.configJson && <p className=\"text-xs text-destructive\">{errors.configJson}</p>}\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.configJsonHint' })}\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n {formatMessage({ id: 'common.actions.cancel' })}\n </Button>\n <Button onClick={handleSave} disabled={isCreating || isUpdating}>\n {(isCreating || isUpdating) ? (\n formatMessage({ id: 'common.actions.saving' })\n ) : (\n <>\n <Check className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.actions.save' })}\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default CliSettingsModal;\n","// ========================================\n// Multi-Key Settings Modal Component\n// ========================================\n// Modal for managing multiple API keys per provider\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n Plus,\n Trash2,\n Eye,\n EyeOff,\n Zap,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { useProviders, useUpdateProvider } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { RoutingStrategy } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface MultiKeySettingsModalProps {\n open: boolean;\n onClose: () => void;\n providerId: string;\n}\n\ninterface ApiKeyFormEntry {\n id: string;\n key: string;\n label?: string;\n weight?: number;\n enabled: boolean;\n}\n\n// ========== Helper Components ==========\n\ninterface ApiKeyEntryRowProps {\n entry: ApiKeyFormEntry;\n showKey: boolean;\n onToggleShowKey: () => void;\n onUpdate: (updates: Partial<ApiKeyFormEntry>) => void;\n onRemove: () => void;\n index: number;\n}\n\nfunction ApiKeyEntryRow({\n entry,\n showKey,\n onToggleShowKey,\n onUpdate,\n onRemove,\n index,\n}: ApiKeyEntryRowProps) {\n const { formatMessage } = useIntl();\n\n return (\n <div className=\"grid grid-cols-12 gap-2 items-start p-3 bg-muted/30 rounded-lg\">\n <div className=\"col-span-3\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyLabel' })}</Label>\n <Input\n value={entry.label || ''}\n onChange={(e) => onUpdate({ label: e.target.value })}\n placeholder={`Key ${index + 1}`}\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-4\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyValue' })}</Label>\n <div className=\"relative mt-1\">\n <Input\n type={showKey ? 'text' : 'password'}\n value={entry.key}\n onChange={(e) => onUpdate({ key: e.target.value })}\n placeholder=\"sk-...\"\n className=\"pr-8\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={onToggleShowKey}\n >\n {showKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n <div className=\"col-span-2\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyWeight' })}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"100\"\n value={entry.weight ?? 1}\n onChange={(e) => onUpdate({ weight: parseInt(e.target.value) || 1 })}\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-2 flex items-center gap-2 pt-5\">\n <Switch\n checked={entry.enabled}\n onCheckedChange={(enabled) => onUpdate({ enabled })}\n />\n <span className=\"text-sm text-muted-foreground\">\n {entry.enabled\n ? formatMessage({ id: 'apiSettings.common.enabled' })\n : formatMessage({ id: 'apiSettings.common.disabled' })}\n </span>\n </div>\n <div className=\"col-span-1 flex items-center justify-end pt-5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function MultiKeySettingsModal({ open, onClose, providerId }: MultiKeySettingsModalProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n const { providers } = useProviders();\n const { updateProvider, isUpdating } = useUpdateProvider();\n\n // Find provider\n const provider = providers.find((p) => p.id === providerId);\n\n // Form state\n const [apiKeys, setApiKeys] = useState<ApiKeyFormEntry[]>([]);\n const [showKeyIndices, setShowKeyIndices] = useState<Set<number>>(new Set());\n const [routingStrategy, setRoutingStrategy] = useState<RoutingStrategy>('simple-shuffle');\n\n // Health check state\n const [enableHealthCheck, setEnableHealthCheck] = useState(false);\n const [checkInterval, setCheckInterval] = useState(60);\n const [cooldownPeriod, setCooldownPeriod] = useState(300);\n const [failureThreshold, setFailureThreshold] = useState(5);\n\n // Initialize form from provider\n useEffect(() => {\n if (provider) {\n const hasMultiKeys = Boolean(provider.apiKeys && provider.apiKeys.length > 0);\n if (hasMultiKeys && provider.apiKeys) {\n setApiKeys(provider.apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })));\n } else if (provider.apiKey) {\n // Convert single key to multi-key format\n setApiKeys([{\n id: 'key-1',\n key: provider.apiKey,\n label: 'Key 1',\n weight: 1,\n enabled: true,\n }]);\n } else {\n setApiKeys([]);\n }\n\n setRoutingStrategy(provider.routingStrategy || 'simple-shuffle');\n\n // Health check\n if (provider.healthCheck) {\n setEnableHealthCheck(provider.healthCheck.enabled);\n setCheckInterval(provider.healthCheck.intervalSeconds);\n setCooldownPeriod(provider.healthCheck.cooldownSeconds);\n setFailureThreshold(provider.healthCheck.failureThreshold);\n }\n }\n }, [provider, open]);\n\n // Handlers\n const handleAddKey = () => {\n const newKey: ApiKeyFormEntry = {\n id: `key-${Date.now()}`,\n key: '',\n label: `Key ${apiKeys.length + 1}`,\n weight: 1,\n enabled: true,\n };\n setApiKeys([...apiKeys, newKey]);\n };\n\n const handleUpdateKey = (index: number, updates: Partial<ApiKeyFormEntry>) => {\n setApiKeys(apiKeys.map((k, i) => (i === index ? { ...k, ...updates } : k)));\n };\n\n const handleRemoveKey = (index: number) => {\n setApiKeys(apiKeys.filter((_, i) => i !== index));\n };\n\n const handleToggleShowKey = (index: number) => {\n setShowKeyIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n const handleSave = async () => {\n if (!provider) return;\n\n try {\n await updateProvider(providerId, {\n apiKey: '', // Clear single key when using multi-key\n apiKeys: apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })),\n routingStrategy,\n healthCheck: enableHealthCheck ? {\n enabled: true,\n intervalSeconds: checkInterval,\n cooldownSeconds: cooldownPeriod,\n failureThreshold,\n } : undefined,\n });\n\n success(formatMessage({ id: 'apiSettings.providers.actions.save' }));\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n if (!provider) return null;\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'apiSettings.providers.multiKeySettings' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.providers.description' })}: {provider.name}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* API Keys */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.actions.multiKeySettings' })}</h3>\n <Button type=\"button\" size=\"sm\" onClick={handleAddKey}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addKey' })}\n </Button>\n </div>\n\n {apiKeys.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {apiKeys.map((entry, index) => (\n <ApiKeyEntryRow\n key={entry.id}\n entry={entry}\n showKey={showKeyIndices.has(index)}\n onToggleShowKey={() => handleToggleShowKey(index)}\n onUpdate={(updates) => handleUpdateKey(index, updates)}\n onRemove={() => handleRemoveKey(index)}\n index={index}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Routing Strategy */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"routingStrategy\">{formatMessage({ id: 'apiSettings.providers.routingStrategy' })}</Label>\n <Select value={routingStrategy} onValueChange={(v: RoutingStrategy) => setRoutingStrategy(v)}>\n <SelectTrigger id=\"routingStrategy\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"simple-shuffle\">{formatMessage({ id: 'apiSettings.providers.simpleShuffle' })}</SelectItem>\n <SelectItem value=\"weighted\">{formatMessage({ id: 'apiSettings.providers.weighted' })}</SelectItem>\n <SelectItem value=\"latency-based\">{formatMessage({ id: 'apiSettings.providers.latencyBased' })}</SelectItem>\n <SelectItem value=\"cost-based\">{formatMessage({ id: 'apiSettings.providers.costBased' })}</SelectItem>\n <SelectItem value=\"least-busy\">{formatMessage({ id: 'apiSettings.providers.leastBusy' })}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Health Check */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Label>{formatMessage({ id: 'apiSettings.providers.healthCheck' })}</Label>\n <Switch\n checked={enableHealthCheck}\n onCheckedChange={setEnableHealthCheck}\n />\n </div>\n {enableHealthCheck && (\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"checkInterval\">{formatMessage({ id: 'apiSettings.providers.checkInterval' })}</Label>\n <Input\n id=\"checkInterval\"\n type=\"number\"\n min=\"10\"\n value={checkInterval}\n onChange={(e) => setCheckInterval(parseInt(e.target.value) || 60)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cooldownPeriod\">{formatMessage({ id: 'apiSettings.providers.cooldownPeriod' })}</Label>\n <Input\n id=\"cooldownPeriod\"\n type=\"number\"\n min=\"10\"\n value={cooldownPeriod}\n onChange={(e) => setCooldownPeriod(parseInt(e.target.value) || 300)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"failureThreshold\">{formatMessage({ id: 'apiSettings.providers.failureThreshold' })}</Label>\n <Input\n id=\"failureThreshold\"\n type=\"number\"\n min=\"1\"\n value={failureThreshold}\n onChange={(e) => setFailureThreshold(parseInt(e.target.value) || 5)}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isUpdating}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSave} disabled={isUpdating || apiKeys.length === 0}>\n {isUpdating ? (\n <Zap className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default MultiKeySettingsModal;\n","// ========================================\n// Manage Models Modal Component\n// ========================================\n// Modal for viewing and managing models available for a provider\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n Plus,\n Trash2,\n Zap,\n ChevronDown,\n ChevronUp,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Switch } from '@/components/ui/Switch';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/Collapsible';\nimport { Badge } from '@/components/ui/Badge';\nimport { useProviders, useUpdateProvider } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\n\n// ========== Types ==========\n\nexport interface ManageModelsModalProps {\n open: boolean;\n onClose: () => void;\n providerId: string;\n}\n\ninterface ModelFormEntry {\n id: string;\n name: string;\n series?: string;\n contextWindow?: number;\n streaming?: boolean;\n functionCalling?: boolean;\n vision?: boolean;\n description?: string;\n}\n\n// ========== Helper Components ==========\n\ninterface ModelEntryRowProps {\n model: ModelFormEntry;\n onRemove: () => void;\n onUpdate: (field: keyof ModelFormEntry, value: string | number | boolean | undefined) => void;\n index: number;\n}\n\nfunction ModelEntryRow({\n model,\n onRemove,\n onUpdate,\n index,\n}: ModelEntryRowProps) {\n const { formatMessage } = useIntl();\n const [showDetails, setShowDetails] = useState(false);\n\n return (\n <div className=\"border rounded-lg p-3 space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 grid grid-cols-2 gap-2\">\n <Input\n value={model.name}\n onChange={(e) => onUpdate('name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelId' })}\n className=\"font-medium\"\n />\n <Input\n value={model.series || ''}\n onChange={(e) => onUpdate('series', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelSeries' })}\n />\n </div>\n <div className=\"flex items-center gap-1\">\n <Collapsible open={showDetails} onOpenChange={setShowDetails}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\">\n {showDetails ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"w-full\">\n <div className=\"grid grid-cols-2 gap-2 mt-2 pt-2 border-t\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.contextWindow' })}</Label>\n <Input\n type=\"number\"\n value={model.contextWindow || ''}\n onChange={(e) => onUpdate('contextWindow', parseInt(e.target.value) || undefined)}\n placeholder=\"200000\"\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.description' })}</Label>\n <Input\n value={model.description || ''}\n onChange={(e) => onUpdate('description', e.target.value)}\n placeholder=\"Optional description\"\n />\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n <div className=\"flex items-center gap-1\">\n <Switch\n checked={model.streaming}\n onCheckedChange={(checked) => onUpdate('streaming', checked)}\n id={`streaming-${index}`}\n />\n <Label htmlFor={`streaming-${index}`} className=\"text-xs cursor-pointer\">\n {formatMessage({ id: 'apiSettings.providers.streaming' })}\n </Label>\n </div>\n <div className=\"flex items-center gap-1\">\n <Switch\n checked={model.functionCalling}\n onCheckedChange={(checked) => onUpdate('functionCalling', checked)}\n id={`fc-${index}`}\n />\n <Label htmlFor={`fc-${index}`} className=\"text-xs cursor-pointer\">\n {formatMessage({ id: 'apiSettings.providers.functionCalling' })}\n </Label>\n </div>\n <div className=\"flex items-center gap-1\">\n <Switch\n checked={model.vision}\n onCheckedChange={(checked) => onUpdate('vision', checked)}\n id={`vision-${index}`}\n />\n <Label htmlFor={`vision-${index}`} className=\"text-xs cursor-pointer\">\n {formatMessage({ id: 'apiSettings.providers.vision' })}\n </Label>\n </div>\n </div>\n </CollapsibleContent>\n </Collapsible>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ManageModelsModal({ open, onClose, providerId }: ManageModelsModalProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n const { providers } = useProviders();\n const { updateProvider, isUpdating } = useUpdateProvider();\n\n // Find provider\n const provider = providers.find((p) => p.id === providerId);\n\n // Form state\n const [llmModels, setLlmModels] = useState<ModelFormEntry[]>([]);\n const [embeddingModels, setEmbeddingModels] = useState<ModelFormEntry[]>([]);\n\n // Initialize form from provider\n useEffect(() => {\n if (provider) {\n if (provider.llmModels) {\n setLlmModels(provider.llmModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n if (provider.embeddingModels) {\n setEmbeddingModels(provider.embeddingModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n }\n }, [provider, open]);\n\n // Handlers\n const handleAddLlmModel = () => {\n const newModel: ModelFormEntry = {\n id: `llm-${Date.now()}`,\n name: '',\n series: '',\n };\n setLlmModels([...llmModels, newModel]);\n };\n\n const handleRemoveLlmModel = (index: number) => {\n setLlmModels(llmModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateLlmModel = (index: number, field: keyof ModelFormEntry, value: string | number | boolean | undefined) => {\n setLlmModels(llmModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleAddEmbeddingModel = () => {\n const newModel: ModelFormEntry = {\n id: `emb-${Date.now()}`,\n name: '',\n series: '',\n };\n setEmbeddingModels([...embeddingModels, newModel]);\n };\n\n const handleRemoveEmbeddingModel = (index: number) => {\n setEmbeddingModels(embeddingModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateEmbeddingModel = (index: number, field: keyof ModelFormEntry, value: string | number | boolean | undefined) => {\n setEmbeddingModels(embeddingModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleSave = async () => {\n if (!provider) return;\n\n try {\n const now = new Date().toISOString();\n\n await updateProvider(providerId, {\n llmModels: llmModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'llm' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n embeddingModels: embeddingModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'embedding' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n });\n\n success(formatMessage({ id: 'apiSettings.providers.actions.save' }));\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n if (!provider) return null;\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'apiSettings.providers.actions.manageModels' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.providers.description' })}: {provider.name}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* LLM Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.llmModels' })}</h3>\n <Badge variant=\"secondary\">{llmModels.length}</Badge>\n </div>\n <Button type=\"button\" size=\"sm\" onClick={handleAddLlmModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addLlmModel' })}\n </Button>\n </div>\n\n {llmModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {llmModels.map((model, index) => (\n <ModelEntryRow\n key={model.id}\n model={model}\n onRemove={() => handleRemoveLlmModel(index)}\n onUpdate={(field, value) => handleUpdateLlmModel(index, field, value)}\n index={index}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Embedding Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.embeddingModels' })}</h3>\n <Badge variant=\"secondary\">{embeddingModels.length}</Badge>\n </div>\n <Button type=\"button\" size=\"sm\" onClick={handleAddEmbeddingModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addEmbeddingModel' })}\n </Button>\n </div>\n\n {embeddingModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {embeddingModels.map((model, index) => (\n <ModelEntryRow\n key={model.id}\n model={model}\n onRemove={() => handleRemoveEmbeddingModel(index)}\n onUpdate={(field, value) => handleUpdateEmbeddingModel(index, field, value)}\n index={index}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isUpdating}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSave} disabled={isUpdating}>\n {isUpdating ? (\n <Zap className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default ManageModelsModal;\n","// ========================================\n// API Settings Page\n// ========================================\n// Main page for managing LiteLLM API providers, endpoints, cache, model pools, and CLI settings\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Server,\n RefreshCw,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/Button';\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\nimport {\n ProviderList,\n ProviderModal,\n EndpointList,\n EndpointModal,\n CacheSettings,\n ModelPoolList,\n ModelPoolModal,\n CliSettingsList,\n CliSettingsModal,\n MultiKeySettingsModal,\n ManageModelsModal,\n} from '@/components/api-settings';\nimport { useProviders, useEndpoints, useModelPools, useCliSettings, useSyncApiConfig } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\n\n// Tab type definitions\ntype TabType = 'providers' | 'endpoints' | 'cache' | 'modelPools' | 'cliSettings';\n\nexport function ApiSettingsPage() {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n const [activeTab, setActiveTab] = useState<TabType>('providers');\n const syncMutation = useSyncApiConfig();\n\n // Get providers, endpoints, model pools, and CLI settings data\n const { providers } = useProviders();\n const { endpoints } = useEndpoints();\n const { pools } = useModelPools();\n const { cliSettings } = useCliSettings();\n\n // Modal states\n const [providerModalOpen, setProviderModalOpen] = useState(false);\n const [editingProviderId, setEditingProviderId] = useState<string | null>(null);\n const [endpointModalOpen, setEndpointModalOpen] = useState(false);\n const [editingEndpointId, setEditingEndpointId] = useState<string | null>(null);\n const [modelPoolModalOpen, setModelPoolModalOpen] = useState(false);\n const [editingPoolId, setEditingPoolId] = useState<string | null>(null);\n const [cliSettingsModalOpen, setCliSettingsModalOpen] = useState(false);\n const [editingCliSettingsId, setEditingCliSettingsId] = useState<string | null>(null);\n\n // Additional modal states for multi-key settings and model management\n const [multiKeyModalOpen, setMultiKeyModalOpen] = useState(false);\n const [multiKeyProviderId, setMultiKeyProviderId] = useState<string | null>(null);\n const [manageModelsModalOpen, setManageModelsModalOpen] = useState(false);\n const [manageModelsProviderId, setManageModelsProviderId] = useState<string | null>(null);\n\n // Find the provider being edited\n const editingProvider = useMemo(\n () => providers.find((p) => p.id === editingProviderId) || null,\n [providers, editingProviderId]\n );\n\n // Find the endpoint being edited\n const editingEndpoint = useMemo(\n () => endpoints.find((e) => e.id === editingEndpointId) || null,\n [endpoints, editingEndpointId]\n );\n\n // Find the pool being edited\n const editingPool = useMemo(\n () => pools.find((p) => p.id === editingPoolId) || null,\n [pools, editingPoolId]\n );\n\n // Find the CLI settings being edited\n const editingCliSettings = useMemo(\n () => cliSettings.find((s) => s.id === editingCliSettingsId) || null,\n [cliSettings, editingCliSettingsId]\n );\n\n // Provider modal handlers\n const handleAddProvider = () => {\n setEditingProviderId(null);\n setProviderModalOpen(true);\n };\n\n const handleEditProvider = (providerId: string) => {\n setEditingProviderId(providerId);\n setProviderModalOpen(true);\n };\n\n const handleCloseProviderModal = () => {\n setProviderModalOpen(false);\n setEditingProviderId(null);\n };\n\n // Endpoint modal handlers\n const handleAddEndpoint = () => {\n setEditingEndpointId(null);\n setEndpointModalOpen(true);\n };\n\n const handleEditEndpoint = (endpointId: string) => {\n setEditingEndpointId(endpointId);\n setEndpointModalOpen(true);\n };\n\n const handleCloseEndpointModal = () => {\n setEndpointModalOpen(false);\n setEditingEndpointId(null);\n };\n\n // Model pool modal handlers\n const handleAddPool = () => {\n setEditingPoolId(null);\n setModelPoolModalOpen(true);\n };\n\n const handleEditPool = (poolId: string) => {\n setEditingPoolId(poolId);\n setModelPoolModalOpen(true);\n };\n\n const handleClosePoolModal = () => {\n setModelPoolModalOpen(false);\n setEditingPoolId(null);\n };\n\n // CLI Settings modal handlers\n const handleAddCliSettings = () => {\n setEditingCliSettingsId(null);\n setCliSettingsModalOpen(true);\n };\n\n const handleEditCliSettings = (endpointId: string) => {\n setEditingCliSettingsId(endpointId);\n setCliSettingsModalOpen(true);\n };\n\n const handleCloseCliSettingsModal = () => {\n setCliSettingsModalOpen(false);\n setEditingCliSettingsId(null);\n };\n\n // Multi-key settings modal handlers\n const handleMultiKeySettings = (providerId: string) => {\n setMultiKeyProviderId(providerId);\n setMultiKeyModalOpen(true);\n };\n\n const handleCloseMultiKeyModal = () => {\n setMultiKeyModalOpen(false);\n setMultiKeyProviderId(null);\n };\n\n // Manage models modal handlers\n const handleManageModels = (providerId: string) => {\n setManageModelsProviderId(providerId);\n setManageModelsModalOpen(true);\n };\n\n const handleCloseManageModelsModal = () => {\n setManageModelsModalOpen(false);\n setManageModelsProviderId(null);\n };\n\n // Sync to CodexLens handler\n const handleSyncToCodexLens = async (providerId: string) => {\n const providerName = providers.find((p) => p.id === providerId)?.name ?? providerId;\n\n try {\n const result = await syncMutation.mutateAsync();\n const messageParts = [\n providerName,\n result.yamlPath ?? result.message,\n ].filter(Boolean);\n\n success(\n formatMessage({ id: 'apiSettings.messages.configSynced' }),\n messageParts.length > 0 ? messageParts.join('\\n') : undefined\n );\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Page Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\n <Server className=\"w-6 h-6 text-primary\" />\n {formatMessage({ id: 'apiSettings.title' })}\n </h1>\n <p className=\"text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.description' })}\n </p>\n </div>\n <Button variant=\"outline\" onClick={() => window.location.reload()}>\n <RefreshCw className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n </div>\n\n {/* Tabbed Interface */}\n <TabsNavigation\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as TabType)}\n tabs={[\n { value: 'providers', label: formatMessage({ id: 'apiSettings.tabs.providers' }) },\n { value: 'endpoints', label: formatMessage({ id: 'apiSettings.tabs.endpoints' }) },\n { value: 'cache', label: formatMessage({ id: 'apiSettings.tabs.cache' }) },\n { value: 'modelPools', label: formatMessage({ id: 'apiSettings.tabs.modelPools' }) },\n { value: 'cliSettings', label: formatMessage({ id: 'apiSettings.tabs.cliSettings' }) },\n ]}\n />\n\n {/* Tab Content */}\n {activeTab === 'providers' && (\n <div className=\"mt-4\">\n <ProviderList\n onAddProvider={handleAddProvider}\n onEditProvider={handleEditProvider}\n onMultiKeySettings={handleMultiKeySettings}\n onSyncToCodexLens={handleSyncToCodexLens}\n onManageModels={handleManageModels}\n />\n </div>\n )}\n\n {activeTab === 'endpoints' && (\n <div className=\"mt-4\">\n <EndpointList\n onAddEndpoint={handleAddEndpoint}\n onEditEndpoint={handleEditEndpoint}\n />\n </div>\n )}\n\n {activeTab === 'cache' && (\n <div className=\"mt-4\">\n <CacheSettings />\n </div>\n )}\n\n {activeTab === 'modelPools' && (\n <div className=\"mt-4\">\n <ModelPoolList\n onAddPool={handleAddPool}\n onEditPool={handleEditPool}\n />\n </div>\n )}\n\n {activeTab === 'cliSettings' && (\n <div className=\"mt-4\">\n <CliSettingsList\n onAddCliSettings={handleAddCliSettings}\n onEditCliSettings={handleEditCliSettings}\n />\n </div>\n )}\n\n {/* Modals */}\n <ProviderModal\n open={providerModalOpen}\n onClose={handleCloseProviderModal}\n provider={editingProvider}\n />\n <EndpointModal\n open={endpointModalOpen}\n onClose={handleCloseEndpointModal}\n endpoint={editingEndpoint}\n />\n <ModelPoolModal\n open={modelPoolModalOpen}\n onClose={handleClosePoolModal}\n pool={editingPool}\n />\n <CliSettingsModal\n open={cliSettingsModalOpen}\n onClose={handleCloseCliSettingsModal}\n cliSettings={editingCliSettings}\n />\n <MultiKeySettingsModal\n open={multiKeyModalOpen}\n onClose={handleCloseMultiKeyModal}\n providerId={multiKeyProviderId || ''}\n />\n <ManageModelsModal\n open={manageModelsModalOpen}\n onClose={handleCloseManageModelsModal}\n providerId={manageModelsProviderId || ''}\n />\n </div>\n );\n}\n\nexport default ApiSettingsPage;\n"],"names":["ProviderCard","provider","onEdit","onDelete","onTest","onMultiKeySettings","onSyncToCodexLens","onManageModels","onToggleEnabled","isDeleting","isTesting","isToggling","formatMessage","useIntl","multiKeyCount","_a","k","hasMultiKeys","_b","getHealthBadge","jsx","Badge","keys","healthyCount","Card","jsxs","Zap","Switch","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","Edit","Settings","CheckCircle2","DropdownMenuSeparator","Trash2","ProviderList","onAddProvider","onEditProvider","error","useNotifications","searchQuery","setSearchQuery","useState","showDisabledOnly","setShowDisabledOnly","providers","isLoading","refetch","useProviders","deleteProvider","useDeleteProvider","updateProvider","isUpdating","useUpdateProvider","testProvider","useTestProvider","triggerHealthCheck","useTriggerProviderHealthCheck","filteredProviders","useMemo","matchesSearch","matchesFilter","handleDeleteProvider","providerId","providerName","confirmMessage","handleToggleEnabled","enabled","handleTestProvider","enabledCount","p","totalCount","cn","Plus","AlertCircle","Search","Input","e","prev","XCircle","i","ApiKeyEntryRow","entry","showKey","onToggleShowKey","onUpdate","onRemove","Label","EyeOff","Eye","ProviderModal","open","onClose","isEditing","createProvider","isCreating","useCreateProvider","name","setName","type","setType","apiKey","setApiKey","apiBase","setApiBase","setEnabled","showAdvanced","setShowAdvanced","timeout","setTimeout","maxRetries","setMaxRetries","organization","setOrganization","apiVersion","setApiVersion","customHeaders","setCustomHeaders","rpm","setRpm","tpm","setTpm","proxy","setProxy","useMultiKey","setUseMultiKey","apiKeys","setApiKeys","showKeyIndices","setShowKeyIndices","routingStrategy","setRoutingStrategy","enableHealthCheck","setEnableHealthCheck","checkInterval","setCheckInterval","cooldownPeriod","setCooldownPeriod","failureThreshold","setFailureThreshold","showModels","setShowModels","llmModels","setLlmModels","embeddingModels","setEmbeddingModels","useEffect","m","handleAddKey","newKey","handleUpdateKey","index","updates","handleRemoveKey","_","handleToggleShowKey","next","handleAddLlmModel","newModel","handleRemoveLlmModel","handleUpdateLlmModel","field","value","handleAddEmbeddingModel","handleRemoveEmbeddingModel","handleUpdateEmbeddingModel","handleSubmit","parsedHeaders","now","providerData","isSaving","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","Collapsible","CollapsibleTrigger","ChevronUp","ChevronDown","CollapsibleContent","Textarea","model","DialogFooter","Check","EndpointCard","endpoint","Database","EndpointList","onAddEndpoint","onEditEndpoint","showCachedOnly","setShowCachedOnly","endpoints","cachedCount","useEndpoints","deleteEndpoint","useDeleteEndpoint","updateEndpoint","useUpdateEndpoint","filteredEndpoints","matchesDisabledFilter","matchesCacheFilter","handleDeleteEndpoint","endpointId","endpointName","FilePatternInput","onChange","placeholder","inputValue","setInputValue","handleAddPattern","handleRemovePattern","pattern","EndpointModal","createEndpoint","useCreateEndpoint","id","setId","setProviderId","setModel","description","setDescription","showCacheSettings","setShowCacheSettings","enableCache","setEnableCache","cacheTTL","setCacheTTL","cacheMaxSize","setCacheMaxSize","filePatterns","setFilePatterns","availableModels","models","endpointData","isValid","modelId","Fragment","CacheUsageIndicator","used","total","percentage","Progress","StatCard","icon","label","className","CacheSettings","success","stats","useCacheStats","updateCacheSettings","useUpdateCacheSettings","clearCache","isClearing","useClearCache","settings","setSettings","showClearDialog","setShowClearDialog","handleSave","err","handleClearCache","FileText","HardDrive","checked","Save","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","PoolCard","pool","getModelTypeBadge","variantMap","labelMap","getStrategyLabel","ModelPoolList","onAddPool","onEditPool","pools","useModelPools","deleteModelPool","useDeleteModelPool","updateModelPool","useUpdateModelPool","filterType","setFilterType","deletePoolId","setDeletePoolId","togglingPoolId","setTogglingPoolId","filteredPools","typeCounts","handleDelete","poolId","Layers","defaultFormData","ProviderDiscoveryItem","excluded","onToggle","Checkbox","ModelPoolModal","warning","formData","setFormData","hasDiscovered","setHasDiscovered","createModelPool","useCreateModelPool","discoverModels","isDiscovering","discoveredResponse","useDiscoverModelsForPool","availableModelsResponse","isLoadingModels","useAvailableModelsForPool","isEdit","handleInputChange","key","handleAutoDiscover","handleToggleProvider","poolData","discoveredProviders","includedCount","Loader2","Info","X","CliSettingsCard","cliSettings","getProviderBadge","variants","config","getStatusBadge","endpointUrl","env","LinkIcon","CliSettingsList","onAddCliSettings","onEditCliSettings","providerCounts","useCliSettings","deleteCliSettings","useDeleteCliSettings","toggleCliSettings","useToggleCliSettings","filteredSettings","query","s","parseConfigText","text","format","trimmed","CliSettingsModal","defaultProvider","createCliSettings","useCreateCliSettings","updateCliSettings","useUpdateCliSettings","cliProvider","setCliProvider","mode","setMode","authToken","setAuthToken","baseUrl","setBaseUrl","showToken","setShowToken","settingsFile","setSettingsFile","codexApiKey","setCodexApiKey","codexBaseUrl","setCodexBaseUrl","codexProfile","setCodexProfile","showCodexKey","setShowCodexKey","authJson","setAuthJson","configToml","setConfigToml","writeCommonConfig","setWriteCommonConfig","geminiApiKey","setGeminiApiKey","showGeminiKey","setShowGeminiKey","geminiSettingsJson","setGeminiSettingsJson","isLoadingGeminiConfig","setIsLoadingGeminiConfig","setAvailableModels","modelInput","setModelInput","tags","setTags","tagInput","setTagInput","configJson","setConfigJson","showJsonInput","setShowJsonInput","errors","setErrors","isLoadingCodexConfig","setIsLoadingCodexConfig","matchingProvider","validateForm","newErrors","parsed","handleLoadCodexConfig","result","fetchCodexConfigPreview","handleLoadGeminiConfig","fetchGeminiConfigPreview","extra","request","handleAddModel","handleRemoveModel","x","handleAddTag","handleRemoveTag","t","predefinedTags","selectedProvider","providerLabel","Tabs","TabsList","TabsTrigger","TabsContent","Download","n","formatted","tag","pt","MultiKeySettingsModal","ModelEntryRow","showDetails","setShowDetails","ManageModelsModal","ApiSettingsPage","activeTab","setActiveTab","syncMutation","useSyncApiConfig","providerModalOpen","setProviderModalOpen","editingProviderId","setEditingProviderId","endpointModalOpen","setEndpointModalOpen","editingEndpointId","setEditingEndpointId","modelPoolModalOpen","setModelPoolModalOpen","editingPoolId","setEditingPoolId","cliSettingsModalOpen","setCliSettingsModalOpen","editingCliSettingsId","setEditingCliSettingsId","multiKeyModalOpen","setMultiKeyModalOpen","multiKeyProviderId","setMultiKeyProviderId","manageModelsModalOpen","setManageModelsModalOpen","manageModelsProviderId","setManageModelsProviderId","editingProvider","editingEndpoint","editingPool","editingCliSettings","handleAddProvider","handleEditProvider","handleCloseProviderModal","handleAddEndpoint","handleEditEndpoint","handleCloseEndpointModal","handleAddPool","handleEditPool","handleClosePoolModal","handleAddCliSettings","handleEditCliSettings","handleCloseCliSettingsModal","handleMultiKeySettings","handleCloseMultiKeyModal","handleManageModels","handleCloseManageModelsModal","handleSyncToCodexLens","messageParts","Server","RefreshCw","TabsNavigation"],"mappings":"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"}
1
+ {"version":3,"file":"ApiSettingsPage-CtWlmztq.js","sources":["../../src/components/api-settings/ProviderList.tsx","../../src/components/api-settings/ProviderModal.tsx","../../src/components/api-settings/EndpointList.tsx","../../src/components/api-settings/EndpointModal.tsx","../../src/components/api-settings/CacheSettings.tsx","../../src/components/api-settings/ModelPoolList.tsx","../../src/components/api-settings/ModelPoolModal.tsx","../../src/components/api-settings/CliSettingsList.tsx","../../src/components/api-settings/CliSettingsModal.tsx","../../src/components/api-settings/MultiKeySettingsModal.tsx","../../src/components/api-settings/ManageModelsModal.tsx","../../src/pages/ApiSettingsPage.tsx"],"sourcesContent":["// ========================================\n// Provider List Component\n// ========================================\n// Display providers as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Zap,\n Settings,\n CheckCircle2,\n XCircle,\n AlertCircle,\n MoreVertical,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@/components/ui/Dropdown';\nimport {\n useProviders,\n useDeleteProvider,\n useUpdateProvider,\n useTestProvider,\n useTriggerProviderHealthCheck,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ProviderCredential } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface ProviderListProps {\n onAddProvider: () => void;\n onEditProvider: (providerId: string) => void;\n onMultiKeySettings: (providerId: string) => void;\n onSyncToCodexLens: (providerId: string) => void;\n onManageModels: (providerId: string) => void;\n}\n\n// ========== Helper Components ==========\n\ninterface ProviderCardProps {\n provider: ProviderCredential;\n onEdit: () => void;\n onDelete: () => void;\n onTest: () => void;\n onMultiKeySettings: () => void;\n onSyncToCodexLens: () => void;\n onManageModels: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isTesting: boolean;\n isToggling: boolean;\n}\n\nfunction ProviderCard({\n provider,\n onEdit,\n onDelete,\n onTest,\n onMultiKeySettings,\n onSyncToCodexLens,\n onManageModels,\n onToggleEnabled,\n isDeleting,\n isTesting,\n isToggling,\n}: ProviderCardProps) {\n const { formatMessage } = useIntl();\n\n // Count enabled multi-keys\n const multiKeyCount = provider.apiKeys?.filter((k) => k.enabled).length || 0;\n const hasMultiKeys = (provider.apiKeys?.length || 0) > 0;\n\n // Health status badge\n const getHealthBadge = () => {\n if (!provider.enabled) {\n return <Badge variant=\"secondary\">{formatMessage({ id: 'apiSettings.common.disabled' })}</Badge>;\n }\n if (!provider.healthCheck?.enabled) {\n return <Badge variant=\"outline\">{formatMessage({ id: 'apiSettings.providers.unknown' })}</Badge>;\n }\n // Check key health statuses\n const keys = provider.apiKeys || [];\n if (keys.length === 0) {\n return <Badge variant=\"info\">{formatMessage({ id: 'apiSettings.providers.unknown' })}</Badge>;\n }\n const healthyCount = keys.filter((k) => k.healthStatus === 'healthy').length;\n const unhealthyCount = keys.filter((k) => k.healthStatus === 'unhealthy').length;\n\n if (unhealthyCount > 0) {\n return <Badge variant=\"destructive\">{formatMessage({ id: 'apiSettings.providers.unhealthy' })}</Badge>;\n }\n if (healthyCount === keys.length) {\n return <Badge variant=\"success\">{formatMessage({ id: 'apiSettings.providers.healthy' })}</Badge>;\n }\n return <Badge variant=\"warning\">{formatMessage({ id: 'apiSettings.providers.unknown' })}</Badge>;\n };\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: Provider Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground truncate\">{provider.name}</h3>\n {getHealthBadge()}\n </div>\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span className=\"capitalize\">{provider.type}</span>\n {hasMultiKeys && (\n <span className=\"flex items-center gap-1\">\n <Zap className=\"w-3 h-3\" />\n {multiKeyCount} {formatMessage({ id: 'apiSettings.providers.apiKey' })}\n </span>\n )}\n {provider.routingStrategy && (\n <span className=\"capitalize\">{provider.routingStrategy.replace('-', ' ')}</span>\n )}\n </div>\n {provider.apiBase && (\n <p className=\"text-xs text-muted-foreground mt-1 truncate\">{provider.apiBase}</p>\n )}\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={provider.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onTest} disabled={isTesting}>\n <Zap className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.test' })}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onManageModels}>\n <Settings className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.manageModels' })}\n </DropdownMenuItem>\n {hasMultiKeys && (\n <DropdownMenuItem onClick={onMultiKeySettings}>\n <Zap className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.multiKeySettings' })}\n </DropdownMenuItem>\n )}\n <DropdownMenuItem onClick={onSyncToCodexLens}>\n <CheckCircle2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.syncToCodexLens' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ProviderList({\n onAddProvider,\n onEditProvider,\n onMultiKeySettings,\n onSyncToCodexLens,\n onManageModels,\n}: ProviderListProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const [searchQuery, setSearchQuery] = useState('');\n const [showDisabledOnly, setShowDisabledOnly] = useState(false);\n\n const {\n providers,\n isLoading,\n refetch,\n } = useProviders();\n\n const { deleteProvider, isDeleting } = useDeleteProvider();\n const { updateProvider, isUpdating } = useUpdateProvider();\n const { testProvider, isTesting } = useTestProvider();\n const { triggerHealthCheck } = useTriggerProviderHealthCheck();\n\n // Filter providers based on search and filter\n const filteredProviders = useMemo(() => {\n return providers.filter((provider) => {\n const matchesSearch =\n provider.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n provider.type.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesFilter = !showDisabledOnly || !provider.enabled;\n return matchesSearch && matchesFilter;\n });\n }, [providers, searchQuery, showDisabledOnly]);\n\n // Actions\n const handleDeleteProvider = async (providerId: string, providerName: string) => {\n const confirmMessage = formatMessage(\n { id: 'apiSettings.providers.deleteConfirm' },\n { name: providerName }\n );\n if (window.confirm(confirmMessage)) {\n try {\n await deleteProvider(providerId);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.deleteError' }));\n }\n }\n };\n\n const handleToggleEnabled = async (providerId: string, enabled: boolean) => {\n try {\n await updateProvider(providerId, { enabled });\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.toggleError' }));\n }\n };\n\n const handleTestProvider = async (providerId: string) => {\n try {\n const result = await testProvider(providerId);\n if (result.success) {\n // Trigger health check refresh\n await triggerHealthCheck(providerId);\n }\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.testError' }));\n }\n };\n\n // Stats\n const enabledCount = providers.filter((p) => p.enabled).length;\n const totalCount = providers.length;\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h2 className=\"text-xl font-bold text-foreground\">\n {formatMessage({ id: 'apiSettings.providers.title' })}\n </h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.providers.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isLoading}>\n <Zap className={cn('w-4 h-4 mr-2', isLoading && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <Button onClick={onAddProvider}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-2 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{totalCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.providers.stats.total' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"w-5 h-5 text-success\" />\n <span className=\"text-2xl font-bold\">{enabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.providers.stats.enabled' })}\n </p>\n </Card>\n </div>\n\n {/* Search and Filter */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.common.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={showDisabledOnly ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowDisabledOnly((prev) => !prev)}\n >\n {showDisabledOnly ? (\n <XCircle className=\"w-4 h-4 mr-2\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4 mr-2\" />\n )}\n {showDisabledOnly\n ? formatMessage({ id: 'apiSettings.providers.actions.hideDisabled' })\n : formatMessage({ id: 'apiSettings.providers.actions.showDisabled' })}\n </Button>\n </div>\n </div>\n\n {/* Provider List */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-24 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : filteredProviders.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <AlertCircle className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'apiSettings.providers.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.providers.emptyState.message' })}\n </p>\n <Button className=\"mt-4\" onClick={onAddProvider}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.actions.add' })}\n </Button>\n </Card>\n ) : (\n <div className=\"space-y-3\">\n {filteredProviders.map((provider) => (\n <ProviderCard\n key={provider.id}\n provider={provider}\n onEdit={() => onEditProvider(provider.id)}\n onDelete={() => handleDeleteProvider(provider.id, provider.name)}\n onTest={() => handleTestProvider(provider.id)}\n onMultiKeySettings={() => onMultiKeySettings(provider.id)}\n onSyncToCodexLens={() => onSyncToCodexLens(provider.id)}\n onManageModels={() => onManageModels(provider.id)}\n onToggleEnabled={(enabled) => handleToggleEnabled(provider.id, enabled)}\n isDeleting={isDeleting}\n isTesting={isTesting}\n isToggling={isUpdating}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default ProviderList;\n","// ========================================\n// Provider Modal Component\n// ========================================\n// Add/Edit provider modal with multi-key support\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n Plus,\n Trash2,\n Zap,\n ChevronDown,\n ChevronUp,\n Eye,\n EyeOff,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/Collapsible';\nimport { useCreateProvider, useUpdateProvider } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ProviderCredential, ProviderType, RoutingStrategy } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface ProviderModalProps {\n open: boolean;\n onClose: () => void;\n provider?: ProviderCredential | null;\n}\n\ninterface ApiKeyFormEntry {\n id: string;\n key: string;\n label?: string;\n weight?: number;\n enabled: boolean;\n}\n\ninterface ModelDefinitionEntry {\n id: string;\n name: string;\n series?: string;\n contextWindow?: number;\n streaming?: boolean;\n functionCalling?: boolean;\n vision?: boolean;\n description?: string;\n}\n\n// ========== Helper Components ==========\n\ninterface ApiKeyEntryRowProps {\n entry: ApiKeyFormEntry;\n showKey: boolean;\n onToggleShowKey: () => void;\n onUpdate: (updates: Partial<ApiKeyFormEntry>) => void;\n onRemove: () => void;\n}\n\nfunction ApiKeyEntryRow({\n entry,\n showKey,\n onToggleShowKey,\n onUpdate,\n onRemove,\n}: ApiKeyEntryRowProps) {\n const { formatMessage } = useIntl();\n\n return (\n <div className=\"grid grid-cols-12 gap-2 items-start p-3 bg-muted/30 rounded-lg\">\n <div className=\"col-span-3\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyLabel' })}</Label>\n <Input\n value={entry.label || ''}\n onChange={(e) => onUpdate({ label: e.target.value })}\n placeholder=\"Key 1\"\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-4\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyValue' })}</Label>\n <div className=\"relative mt-1\">\n <Input\n type={showKey ? 'text' : 'password'}\n value={entry.key}\n onChange={(e) => onUpdate({ key: e.target.value })}\n placeholder=\"sk-...\"\n className=\"pr-8\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={onToggleShowKey}\n >\n {showKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n <div className=\"col-span-2\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyWeight' })}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"100\"\n value={entry.weight ?? 1}\n onChange={(e) => onUpdate({ weight: parseInt(e.target.value) || 1 })}\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-2 flex items-center gap-2 pt-5\">\n <Switch\n checked={entry.enabled}\n onCheckedChange={(enabled) => onUpdate({ enabled })}\n />\n <span className=\"text-sm text-muted-foreground\">\n {entry.enabled ? formatMessage({ id: 'apiSettings.common.enabled' }) : formatMessage({ id: 'apiSettings.common.disabled' })}\n </span>\n </div>\n <div className=\"col-span-1 flex items-center justify-end pt-5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ProviderModal({ open, onClose, provider }: ProviderModalProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const isEditing = !!provider;\n\n // Mutations\n const { createProvider, isCreating } = useCreateProvider();\n const { updateProvider, isUpdating } = useUpdateProvider();\n\n // Form state\n const [name, setName] = useState('');\n const [type, setType] = useState<ProviderType>('openai');\n const [apiKey, setApiKey] = useState('');\n const [apiBase, setApiBase] = useState('');\n const [enabled, setEnabled] = useState(true);\n\n // Advanced settings\n const [showAdvanced, setShowAdvanced] = useState(false);\n const [timeout, setTimeout] = useState<number>(300);\n const [maxRetries, setMaxRetries] = useState<number>(0);\n const [organization, setOrganization] = useState('');\n const [apiVersion, setApiVersion] = useState('');\n const [customHeaders, setCustomHeaders] = useState('');\n const [rpm, setRpm] = useState<number | undefined>();\n const [tpm, setTpm] = useState<number | undefined>();\n const [proxy, setProxy] = useState('');\n\n // Multi-key configuration\n const [useMultiKey, setUseMultiKey] = useState(false);\n const [apiKeys, setApiKeys] = useState<ApiKeyFormEntry[]>([]);\n const [showKeyIndices, setShowKeyIndices] = useState<Set<number>>(new Set());\n\n // Routing strategy\n const [routingStrategy, setRoutingStrategy] = useState<RoutingStrategy>('simple-shuffle');\n\n // Health check\n const [enableHealthCheck, setEnableHealthCheck] = useState(false);\n const [checkInterval, setCheckInterval] = useState(60);\n const [cooldownPeriod, setCooldownPeriod] = useState(300);\n const [failureThreshold, setFailureThreshold] = useState(5);\n\n // Models\n const [showModels, setShowModels] = useState(false);\n const [llmModels, setLlmModels] = useState<ModelDefinitionEntry[]>([]);\n const [embeddingModels, setEmbeddingModels] = useState<ModelDefinitionEntry[]>([]);\n\n // Initialize form from provider\n useEffect(() => {\n if (provider) {\n setName(provider.name);\n setType(provider.type);\n setApiKey(provider.apiKey);\n setApiBase(provider.apiBase || '');\n setEnabled(provider.enabled);\n setRoutingStrategy(provider.routingStrategy || 'simple-shuffle');\n\n // Advanced settings\n if (provider.advancedSettings) {\n setTimeout(provider.advancedSettings.timeout || 300);\n setMaxRetries(provider.advancedSettings.maxRetries || 0);\n setOrganization(provider.advancedSettings.organization || '');\n setApiVersion(provider.advancedSettings.apiVersion || '');\n setCustomHeaders(provider.advancedSettings.customHeaders ? JSON.stringify(provider.advancedSettings.customHeaders, null, 2) : '');\n setRpm(provider.advancedSettings.rpm);\n setTpm(provider.advancedSettings.tpm);\n setProxy(provider.advancedSettings.proxy || '');\n }\n\n // Multi-key\n const hasMultiKeys = Boolean(provider.apiKeys && provider.apiKeys.length > 0);\n setUseMultiKey(hasMultiKeys);\n if (hasMultiKeys && provider.apiKeys) {\n setApiKeys(provider.apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })));\n }\n\n // Health check\n if (provider.healthCheck) {\n setEnableHealthCheck(provider.healthCheck.enabled);\n setCheckInterval(provider.healthCheck.intervalSeconds);\n setCooldownPeriod(provider.healthCheck.cooldownSeconds);\n setFailureThreshold(provider.healthCheck.failureThreshold);\n }\n\n // Models\n if (provider.llmModels) {\n setLlmModels(provider.llmModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n if (provider.embeddingModels) {\n setEmbeddingModels(provider.embeddingModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n } else {\n // Reset form for new provider\n setName('');\n setType('openai');\n setApiKey('');\n setApiBase('');\n setEnabled(true);\n setTimeout(300);\n setMaxRetries(0);\n setOrganization('');\n setApiVersion('');\n setCustomHeaders('');\n setRpm(undefined);\n setTpm(undefined);\n setProxy('');\n setUseMultiKey(false);\n setApiKeys([]);\n setRoutingStrategy('simple-shuffle');\n setEnableHealthCheck(false);\n setCheckInterval(60);\n setCooldownPeriod(300);\n setFailureThreshold(5);\n setLlmModels([]);\n setEmbeddingModels([]);\n }\n }, [provider, open]);\n\n // Handlers\n const handleAddKey = () => {\n const newKey: ApiKeyFormEntry = {\n id: `key-${Date.now()}`,\n key: '',\n label: `Key ${apiKeys.length + 1}`,\n weight: 1,\n enabled: true,\n };\n setApiKeys([...apiKeys, newKey]);\n };\n\n const handleUpdateKey = (index: number, updates: Partial<ApiKeyFormEntry>) => {\n setApiKeys(apiKeys.map((k, i) => (i === index ? { ...k, ...updates } : k)));\n };\n\n const handleRemoveKey = (index: number) => {\n setApiKeys(apiKeys.filter((_, i) => i !== index));\n };\n\n const handleToggleShowKey = (index: number) => {\n setShowKeyIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n const handleAddLlmModel = () => {\n const newModel: ModelDefinitionEntry = {\n id: `llm-${Date.now()}`,\n name: '',\n series: '',\n };\n setLlmModels([...llmModels, newModel]);\n };\n\n const handleRemoveLlmModel = (index: number) => {\n setLlmModels(llmModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateLlmModel = (index: number, field: keyof ModelDefinitionEntry, value: string | number | boolean | undefined) => {\n setLlmModels(llmModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleAddEmbeddingModel = () => {\n const newModel: ModelDefinitionEntry = {\n id: `emb-${Date.now()}`,\n name: '',\n series: '',\n };\n setEmbeddingModels([...embeddingModels, newModel]);\n };\n\n const handleRemoveEmbeddingModel = (index: number) => {\n setEmbeddingModels(embeddingModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateEmbeddingModel = (index: number, field: keyof ModelDefinitionEntry, value: string | number | boolean | undefined) => {\n setEmbeddingModels(embeddingModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleSubmit = async () => {\n try {\n // Validate custom headers JSON\n let parsedHeaders: Record<string, string> | undefined;\n if (customHeaders.trim()) {\n try {\n parsedHeaders = JSON.parse(customHeaders);\n } catch {\n alert(formatMessage({ id: 'apiSettings.messages.invalidJsonHeaders' }));\n return;\n }\n }\n\n const now = new Date().toISOString();\n\n const providerData = {\n name,\n type,\n apiKey: useMultiKey ? '' : apiKey,\n apiBase: apiBase || undefined,\n enabled,\n advancedSettings: {\n timeout,\n maxRetries,\n organization: organization || undefined,\n apiVersion: apiVersion || undefined,\n customHeaders: parsedHeaders,\n rpm,\n tpm,\n proxy: proxy || undefined,\n },\n apiKeys: useMultiKey ? apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })) : undefined,\n routingStrategy: useMultiKey ? routingStrategy : undefined,\n healthCheck: enableHealthCheck ? {\n enabled: true,\n intervalSeconds: checkInterval,\n cooldownSeconds: cooldownPeriod,\n failureThreshold,\n } : undefined,\n llmModels: llmModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'llm' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n embeddingModels: embeddingModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'embedding' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n };\n\n if (isEditing && provider) {\n await updateProvider(provider.id, providerData);\n } else {\n await createProvider(providerData);\n }\n\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n const isSaving = isCreating || isUpdating;\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {isEditing\n ? formatMessage({ id: 'apiSettings.providers.actions.edit' })\n : formatMessage({ id: 'apiSettings.providers.actions.add' })}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.providers.description' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* Basic Info */}\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.basicInfo' })}</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">{formatMessage({ id: 'apiSettings.providers.displayName' })} *</Label>\n <Input\n id=\"name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My OpenAI\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"type\">{formatMessage({ id: 'apiSettings.common.type' })} *</Label>\n <Select value={type} onValueChange={(v: ProviderType) => setType(v)}>\n <SelectTrigger id=\"type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"openai\">OpenAI</SelectItem>\n <SelectItem value=\"anthropic\">Anthropic</SelectItem>\n <SelectItem value=\"custom\">Custom</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {!useMultiKey && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"apiKey\">{formatMessage({ id: 'apiSettings.providers.apiKey' })} *</Label>\n <Input\n id=\"apiKey\"\n type=\"password\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"sk-...\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.useEnvVar' })}</p>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"apiBase\">{formatMessage({ id: 'apiSettings.providers.apiBaseUrl' })}</Label>\n <Input\n id=\"apiBase\"\n value={apiBase}\n onChange={(e) => setApiBase(e.target.value)}\n placeholder=\"https://api.openai.com/v1\"\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"enabled\"\n checked={enabled}\n onCheckedChange={setEnabled}\n />\n <Label htmlFor=\"enabled\">{formatMessage({ id: 'apiSettings.providers.enableProvider' })}</Label>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"useMultiKey\"\n checked={useMultiKey}\n onCheckedChange={setUseMultiKey}\n />\n <Label htmlFor=\"useMultiKey\">{formatMessage({ id: 'apiSettings.providers.multiKeySettings' })}</Label>\n </div>\n </div>\n\n {/* Multi-Key Configuration */}\n {useMultiKey && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.multiKeySettings' })}</h3>\n <Button type=\"button\" size=\"sm\" onClick={handleAddKey}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addKey' })}\n </Button>\n </div>\n\n {apiKeys.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {apiKeys.map((entry, index) => (\n <ApiKeyEntryRow\n key={entry.id}\n entry={entry}\n showKey={showKeyIndices.has(index)}\n onToggleShowKey={() => handleToggleShowKey(index)}\n onUpdate={(updates) => handleUpdateKey(index, updates)}\n onRemove={() => handleRemoveKey(index)}\n />\n ))}\n </div>\n )}\n\n {/* Routing Strategy */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"routingStrategy\">{formatMessage({ id: 'apiSettings.providers.routingStrategy' })}</Label>\n <Select value={routingStrategy} onValueChange={(v: RoutingStrategy) => setRoutingStrategy(v)}>\n <SelectTrigger id=\"routingStrategy\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"simple-shuffle\">{formatMessage({ id: 'apiSettings.providers.simpleShuffle' })}</SelectItem>\n <SelectItem value=\"weighted\">{formatMessage({ id: 'apiSettings.providers.weighted' })}</SelectItem>\n <SelectItem value=\"latency-based\">{formatMessage({ id: 'apiSettings.providers.latencyBased' })}</SelectItem>\n <SelectItem value=\"cost-based\">{formatMessage({ id: 'apiSettings.providers.costBased' })}</SelectItem>\n <SelectItem value=\"least-busy\">{formatMessage({ id: 'apiSettings.providers.leastBusy' })}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Health Check */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Label>{formatMessage({ id: 'apiSettings.providers.healthCheck' })}</Label>\n <Switch\n checked={enableHealthCheck}\n onCheckedChange={setEnableHealthCheck}\n />\n </div>\n {enableHealthCheck && (\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"checkInterval\">{formatMessage({ id: 'apiSettings.providers.checkInterval' })}</Label>\n <Input\n id=\"checkInterval\"\n type=\"number\"\n min=\"10\"\n value={checkInterval}\n onChange={(e) => setCheckInterval(parseInt(e.target.value) || 60)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cooldownPeriod\">{formatMessage({ id: 'apiSettings.providers.cooldownPeriod' })}</Label>\n <Input\n id=\"cooldownPeriod\"\n type=\"number\"\n min=\"10\"\n value={cooldownPeriod}\n onChange={(e) => setCooldownPeriod(parseInt(e.target.value) || 300)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"failureThreshold\">{formatMessage({ id: 'apiSettings.providers.failureThreshold' })}</Label>\n <Input\n id=\"failureThreshold\"\n type=\"number\"\n min=\"1\"\n value={failureThreshold}\n onChange={(e) => setFailureThreshold(parseInt(e.target.value) || 5)}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Advanced Settings */}\n <Collapsible open={showAdvanced} onOpenChange={setShowAdvanced}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full justify-between\">\n <span className=\"font-semibold\">{formatMessage({ id: 'apiSettings.providers.advancedSettings' })}</span>\n {showAdvanced ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-4\">\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"timeout\">{formatMessage({ id: 'apiSettings.providers.timeout' })}</Label>\n <Input\n id=\"timeout\"\n type=\"number\"\n min=\"1\"\n value={timeout}\n onChange={(e) => setTimeout(parseInt(e.target.value) || 300)}\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.timeoutHint' })}</p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"maxRetries\">{formatMessage({ id: 'apiSettings.providers.maxRetries' })}</Label>\n <Input\n id=\"maxRetries\"\n type=\"number\"\n min=\"0\"\n value={maxRetries}\n onChange={(e) => setMaxRetries(parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"organization\">{formatMessage({ id: 'apiSettings.providers.organization' })}</Label>\n <Input\n id=\"organization\"\n value={organization}\n onChange={(e) => setOrganization(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.organizationHint' })}</p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"apiVersion\">{formatMessage({ id: 'apiSettings.providers.apiVersion' })}</Label>\n <Input\n id=\"apiVersion\"\n value={apiVersion}\n onChange={(e) => setApiVersion(e.target.value)}\n placeholder=\"2024-02-01\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.apiVersionHint' })}</p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"rpm\">{formatMessage({ id: 'apiSettings.providers.rpm' })}</Label>\n <Input\n id=\"rpm\"\n type=\"number\"\n min=\"0\"\n value={rpm ?? ''}\n onChange={(e) => setRpm(e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder={formatMessage({ id: 'apiSettings.providers.unlimited' })}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"tpm\">{formatMessage({ id: 'apiSettings.providers.tpm' })}</Label>\n <Input\n id=\"tpm\"\n type=\"number\"\n min=\"0\"\n value={tpm ?? ''}\n onChange={(e) => setTpm(e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder={formatMessage({ id: 'apiSettings.providers.unlimited' })}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"proxy\">{formatMessage({ id: 'apiSettings.providers.proxy' })}</Label>\n <Input\n id=\"proxy\"\n value={proxy}\n onChange={(e) => setProxy(e.target.value)}\n placeholder=\"http://proxy.example.com:8080\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"customHeaders\">{formatMessage({ id: 'apiSettings.providers.customHeaders' })}</Label>\n <Textarea\n id=\"customHeaders\"\n value={customHeaders}\n onChange={(e) => setCustomHeaders(e.target.value)}\n placeholder={`{\\n \"X-Custom\": \"value\"\\n}`}\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.customHeadersHint' })}</p>\n </div>\n </CollapsibleContent>\n </Collapsible>\n\n {/* Model Configuration */}\n <Collapsible open={showModels} onOpenChange={setShowModels}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full justify-between\">\n <span className=\"font-semibold\">{formatMessage({ id: 'apiSettings.providers.modelSettings' })}</span>\n {showModels ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-4\">\n {/* LLM Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-sm font-medium\">{formatMessage({ id: 'apiSettings.providers.llmModels' })}</h4>\n <Button type=\"button\" size=\"sm\" onClick={handleAddLlmModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addLlmModel' })}\n </Button>\n </div>\n {llmModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {llmModels.map((model, index) => (\n <div key={model.id} className=\"flex items-start gap-2 p-3 bg-muted/30 rounded-lg\">\n <div className=\"flex-1 grid grid-cols-2 gap-2\">\n <Input\n value={model.name}\n onChange={(e) => handleUpdateLlmModel(index, 'name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelId' })}\n />\n <Input\n value={model.series || ''}\n onChange={(e) => handleUpdateLlmModel(index, 'series', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelSeries' })}\n />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleRemoveLlmModel(index)}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Embedding Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-sm font-medium\">{formatMessage({ id: 'apiSettings.providers.embeddingModels' })}</h4>\n <Button type=\"button\" size=\"sm\" onClick={handleAddEmbeddingModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addEmbeddingModel' })}\n </Button>\n </div>\n {embeddingModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {embeddingModels.map((model, index) => (\n <div key={model.id} className=\"flex items-start gap-2 p-3 bg-muted/30 rounded-lg\">\n <div className=\"flex-1 grid grid-cols-2 gap-2\">\n <Input\n value={model.name}\n onChange={(e) => handleUpdateEmbeddingModel(index, 'name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelId' })}\n />\n <Input\n value={model.series || ''}\n onChange={(e) => handleUpdateEmbeddingModel(index, 'series', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelSeries' })}\n />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleRemoveEmbeddingModel(index)}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n </CollapsibleContent>\n </Collapsible>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isSaving}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSubmit} disabled={isSaving || !name.trim()}>\n {isSaving ? (\n <Zap className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default ProviderModal;\n","// ========================================\n// Endpoint List Component\n// ========================================\n// Display endpoints as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Zap,\n CheckCircle2,\n XCircle,\n MoreVertical,\n Database,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@/components/ui/Dropdown';\nimport {\n useEndpoints,\n useDeleteEndpoint,\n useUpdateEndpoint,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { CustomEndpoint } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface EndpointListProps {\n onAddEndpoint: () => void;\n onEditEndpoint: (endpointId: string) => void;\n}\n\n// ========== Helper Components ==========\n\ninterface EndpointCardProps {\n endpoint: CustomEndpoint;\n onEdit: () => void;\n onDelete: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isToggling: boolean;\n}\n\nfunction EndpointCard({\n endpoint,\n onEdit,\n onDelete,\n onToggleEnabled,\n isDeleting,\n isToggling,\n}: EndpointCardProps) {\n const { formatMessage } = useIntl();\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: Endpoint Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground font-mono\">{endpoint.id}</h3>\n {endpoint.enabled ? (\n <Badge variant=\"success\">{formatMessage({ id: 'apiSettings.common.enabled' })}</Badge>\n ) : (\n <Badge variant=\"secondary\">{formatMessage({ id: 'apiSettings.common.disabled' })}</Badge>\n )}\n {endpoint.cacheStrategy.enabled && (\n <Badge variant=\"info\" className=\"flex items-center gap-1\">\n <Database className=\"w-3 h-3\" />\n {formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </Badge>\n )}\n </div>\n <p className=\"text-sm font-medium text-foreground mt-1\">{endpoint.name}</p>\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span>\n {formatMessage({ id: 'apiSettings.endpoints.provider' })}: {endpoint.providerId}\n </span>\n <span>\n {formatMessage({ id: 'apiSettings.endpoints.model' })}: {endpoint.model}\n </span>\n </div>\n {endpoint.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{endpoint.description}</p>\n )}\n {endpoint.cacheStrategy.enabled && (\n <div className=\"flex items-center gap-3 mt-2 text-xs text-muted-foreground\">\n <span>{formatMessage({ id: 'apiSettings.endpoints.cacheTTL' })}: {endpoint.cacheStrategy.ttlMinutes}m</span>\n <span>{formatMessage({ id: 'apiSettings.endpoints.cacheMaxSize' })}: {endpoint.cacheStrategy.maxSizeKB}KB</span>\n {(endpoint.cacheStrategy.filePatterns?.length || 0) > 0 && (\n <span>{formatMessage({ id: 'apiSettings.endpoints.filePatterns' })}: {endpoint.cacheStrategy.filePatterns?.length || 0}</span>\n )}\n </div>\n )}\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={endpoint.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function EndpointList({\n onAddEndpoint,\n onEditEndpoint,\n}: EndpointListProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const [searchQuery, setSearchQuery] = useState('');\n const [showDisabledOnly, setShowDisabledOnly] = useState(false);\n const [showCachedOnly, setShowCachedOnly] = useState(false);\n\n const {\n endpoints,\n cachedCount,\n isLoading,\n refetch,\n } = useEndpoints();\n\n const { deleteEndpoint, isDeleting } = useDeleteEndpoint();\n const { updateEndpoint, isUpdating } = useUpdateEndpoint();\n\n // Filter endpoints based on search and filter\n const filteredEndpoints = useMemo(() => {\n return endpoints.filter((endpoint) => {\n const matchesSearch =\n endpoint.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n endpoint.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n endpoint.model.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesDisabledFilter = !showDisabledOnly || !endpoint.enabled;\n const matchesCacheFilter = !showCachedOnly || endpoint.cacheStrategy.enabled;\n return matchesSearch && matchesDisabledFilter && matchesCacheFilter;\n });\n }, [endpoints, searchQuery, showDisabledOnly, showCachedOnly]);\n\n // Actions\n const handleDeleteEndpoint = async (endpointId: string, endpointName: string) => {\n const confirmMessage = formatMessage(\n { id: 'apiSettings.endpoints.deleteConfirm' },\n { id: endpointName }\n );\n if (window.confirm(confirmMessage)) {\n try {\n await deleteEndpoint(endpointId);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.endpoints.deleteError' }));\n }\n }\n };\n\n const handleToggleEnabled = async (endpointId: string, enabled: boolean) => {\n try {\n await updateEndpoint(endpointId, { enabled });\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.endpoints.toggleError' }));\n }\n };\n\n // Stats\n const totalCount = endpoints.length;\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h2 className=\"text-xl font-bold text-foreground\">\n {formatMessage({ id: 'apiSettings.endpoints.title' })}\n </h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isLoading}>\n <Zap className={cn('w-4 h-4 mr-2', isLoading && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <Button onClick={onAddEndpoint}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-2 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Zap className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{totalCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.stats.totalEndpoints' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Database className=\"w-5 h-5 text-info\" />\n <span className=\"text-2xl font-bold\">{cachedCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.stats.cachedEndpoints' })}\n </p>\n </Card>\n </div>\n\n {/* Search and Filter */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.common.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={showDisabledOnly ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowDisabledOnly((prev) => !prev)}\n >\n {showDisabledOnly ? (\n <XCircle className=\"w-4 h-4 mr-2\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4 mr-2\" />\n )}\n {showDisabledOnly\n ? formatMessage({ id: 'apiSettings.endpoints.actions.showAll' })\n : formatMessage({ id: 'apiSettings.endpoints.actions.showDisabled' })}\n </Button>\n <Button\n variant={showCachedOnly ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowCachedOnly((prev) => !prev)}\n >\n <Database className=\"w-4 h-4 mr-2\" />\n {showCachedOnly\n ? formatMessage({ id: 'apiSettings.endpoints.actions.showAll' })\n : formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </Button>\n </div>\n </div>\n\n {/* Endpoint List */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-24 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : filteredEndpoints.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <Database className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'apiSettings.endpoints.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.endpoints.emptyState.message' })}\n </p>\n <Button className=\"mt-4\" onClick={onAddEndpoint}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.endpoints.actions.add' })}\n </Button>\n </Card>\n ) : (\n <div className=\"space-y-3\">\n {filteredEndpoints.map((endpoint) => (\n <EndpointCard\n key={endpoint.id}\n endpoint={endpoint}\n onEdit={() => onEditEndpoint(endpoint.id)}\n onDelete={() => handleDeleteEndpoint(endpoint.id, endpoint.name)}\n onToggleEnabled={(enabled) => handleToggleEnabled(endpoint.id, enabled)}\n isDeleting={isDeleting}\n isToggling={isUpdating}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default EndpointList;\n","// ========================================\n// Endpoint Modal Component\n// ========================================\n// Add/Edit endpoint modal with cache configuration\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n ChevronDown,\n ChevronUp,\n Database,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/Collapsible';\nimport { useCreateEndpoint, useUpdateEndpoint, useProviders } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { CustomEndpoint, CacheStrategy } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface EndpointModalProps {\n open: boolean;\n onClose: () => void;\n endpoint?: CustomEndpoint | null;\n}\n\n// ========== Helper Components ==========\n\ninterface FilePatternInputProps {\n value: string[];\n onChange: (patterns: string[]) => void;\n placeholder: string;\n}\n\nfunction FilePatternInput({ value, onChange, placeholder }: FilePatternInputProps) {\n const [inputValue, setInputValue] = useState('');\n\n const handleAddPattern = () => {\n if (inputValue.trim() && !value.includes(inputValue.trim())) {\n onChange([...value, inputValue.trim()]);\n setInputValue('');\n }\n };\n\n const handleRemovePattern = (pattern: string) => {\n onChange(value.filter((p) => p !== pattern));\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddPattern();\n }\n }}\n placeholder={placeholder}\n />\n <Button type=\"button\" size=\"sm\" onClick={handleAddPattern}>\n <Check className=\"w-4 h-4\" />\n </Button>\n </div>\n {value.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {value.map((pattern) => (\n <span\n key={pattern}\n className=\"inline-flex items-center gap-1 px-2 py-1 bg-muted rounded-md text-xs\"\n >\n {pattern}\n <button\n type=\"button\"\n onClick={() => handleRemovePattern(pattern)}\n className=\"hover:text-destructive\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function EndpointModal({ open, onClose, endpoint }: EndpointModalProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const isEditing = !!endpoint;\n\n // Mutations\n const { createEndpoint, isCreating } = useCreateEndpoint();\n const { updateEndpoint, isUpdating } = useUpdateEndpoint();\n\n // Get providers for dropdown\n const { providers } = useProviders();\n\n // Form state\n const [id, setId] = useState('');\n const [name, setName] = useState('');\n const [providerId, setProviderId] = useState('');\n const [model, setModel] = useState('');\n const [description, setDescription] = useState('');\n const [enabled, setEnabled] = useState(true);\n\n // Cache strategy\n const [showCacheSettings, setShowCacheSettings] = useState(false);\n const [enableCache, setEnableCache] = useState(false);\n const [cacheTTL, setCacheTTL] = useState(60);\n const [cacheMaxSize, setCacheMaxSize] = useState(1024);\n const [filePatterns, setFilePatterns] = useState<string[]>([]);\n\n // Get available models for selected provider\n const availableModels = useMemo(() => {\n if (!providerId) return [];\n const provider = providers.find((p) => p.id === providerId);\n if (!provider) return [];\n\n const models: string[] = [];\n if (provider.llmModels) {\n models.push(...provider.llmModels.filter((m) => m.enabled).map((m) => m.id));\n }\n if (provider.embeddingModels) {\n models.push(...provider.embeddingModels.filter((m) => m.enabled).map((m) => m.id));\n }\n if (provider.rerankerModels) {\n models.push(...provider.rerankerModels.filter((m) => m.enabled).map((m) => m.id));\n }\n return models;\n }, [providerId, providers]);\n\n // Initialize form from endpoint\n useEffect(() => {\n if (endpoint) {\n setId(endpoint.id);\n setName(endpoint.name);\n setProviderId(endpoint.providerId);\n setModel(endpoint.model);\n setDescription(endpoint.description || '');\n setEnabled(endpoint.enabled);\n setEnableCache(endpoint.cacheStrategy.enabled);\n setCacheTTL(endpoint.cacheStrategy.ttlMinutes);\n setCacheMaxSize(endpoint.cacheStrategy.maxSizeKB);\n setFilePatterns(endpoint.cacheStrategy.filePatterns || []);\n } else {\n // Reset form for new endpoint\n setId('');\n setName('');\n setProviderId('');\n setModel('');\n setDescription('');\n setEnabled(true);\n setEnableCache(false);\n setCacheTTL(60);\n setCacheMaxSize(1024);\n setFilePatterns([]);\n }\n }, [endpoint, open]);\n\n // Reset model when provider changes\n useEffect(() => {\n if (!isEditing && providerId) {\n const provider = providers.find((p) => p.id === providerId);\n if (provider && provider.llmModels && provider.llmModels.length > 0) {\n setModel(provider.llmModels[0].id);\n }\n }\n }, [providerId, providers, isEditing]);\n\n const handleSubmit = async () => {\n try {\n const cacheStrategy: CacheStrategy = {\n enabled: enableCache,\n ttlMinutes: cacheTTL,\n maxSizeKB: cacheMaxSize,\n filePatterns: enableCache ? filePatterns : [],\n };\n\n const endpointData = {\n id,\n name,\n providerId,\n model,\n description: description || undefined,\n enabled,\n cacheStrategy,\n };\n\n if (isEditing && endpoint) {\n await updateEndpoint(endpoint.id, endpointData);\n } else {\n await createEndpoint(endpointData);\n }\n\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.endpoints.saveError' }));\n }\n };\n\n const isSaving = isCreating || isUpdating;\n\n // Validate form\n const isValid = id.trim() && name.trim() && providerId && model.trim();\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {isEditing\n ? formatMessage({ id: 'apiSettings.endpoints.actions.edit' })\n : formatMessage({ id: 'apiSettings.endpoints.actions.add' })}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.endpoints.description' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* Basic Info */}\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.basicInfo' })}</h3>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"endpointId\">{formatMessage({ id: 'apiSettings.endpoints.endpointId' })} *</Label>\n <Input\n id=\"endpointId\"\n value={id}\n onChange={(e) => setId(e.target.value)}\n placeholder=\"my-gpt4o\"\n disabled={isEditing}\n className=\"font-mono\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.endpoints.endpointIdHint' })}</p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">{formatMessage({ id: 'apiSettings.endpoints.name' })} *</Label>\n <Input\n id=\"name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My GPT-4o\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"providerId\">{formatMessage({ id: 'apiSettings.endpoints.provider' })} *</Label>\n <Select value={providerId} onValueChange={setProviderId} disabled={isEditing}>\n <SelectTrigger id=\"providerId\">\n <SelectValue\n placeholder={providers.length === 0\n ? formatMessage({ id: 'apiSettings.providers.addProviderFirst' })\n : formatMessage({ id: 'apiSettings.endpoints.selectProvider' })\n }\n />\n </SelectTrigger>\n <SelectContent>\n {providers.map((provider) => (\n <SelectItem key={provider.id} value={provider.id} disabled={!provider.enabled}>\n {provider.name}\n {!provider.enabled && ` (${formatMessage({ id: 'apiSettings.common.disabled' })})`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"model\">{formatMessage({ id: 'apiSettings.endpoints.model' })} *</Label>\n {availableModels.length === 0 && providerId ? (\n <Input\n id=\"model\"\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"\"\n className=\"font-mono\"\n />\n ) : (\n <Select value={model} onValueChange={setModel}>\n <SelectTrigger id=\"model\">\n <SelectValue\n placeholder={!providerId\n ? formatMessage({ id: 'apiSettings.endpoints.selectProvider' })\n : formatMessage({ id: 'apiSettings.endpoints.selectModel' })\n }\n />\n </SelectTrigger>\n <SelectContent>\n {availableModels.map((modelId) => (\n <SelectItem key={modelId} value={modelId}>\n {modelId}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">{formatMessage({ id: 'apiSettings.common.description' })}</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.common.optional' })}\n rows={2}\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"enabled\"\n checked={enabled}\n onCheckedChange={setEnabled}\n />\n <Label htmlFor=\"enabled\">{formatMessage({ id: 'apiSettings.endpoints.enabled' })}</Label>\n </div>\n </div>\n\n {/* Cache Strategy */}\n <Collapsible open={showCacheSettings} onOpenChange={setShowCacheSettings}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full justify-between\">\n <span className=\"flex items-center gap-2 font-semibold\">\n <Database className=\"w-4 h-4\" />\n {formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </span>\n {showCacheSettings ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <Label>{formatMessage({ id: 'apiSettings.endpoints.enableContextCaching' })}</Label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.endpoints.cacheStrategy' })}\n </p>\n </div>\n <Switch\n checked={enableCache}\n onCheckedChange={setEnableCache}\n />\n </div>\n\n {enableCache && (\n <>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"cacheTTL\">{formatMessage({ id: 'apiSettings.endpoints.cacheTTL' })}</Label>\n <Input\n id=\"cacheTTL\"\n type=\"number\"\n min=\"1\"\n value={cacheTTL}\n onChange={(e) => setCacheTTL(parseInt(e.target.value) || 60)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cacheMaxSize\">{formatMessage({ id: 'apiSettings.endpoints.cacheMaxSize' })}</Label>\n <Input\n id=\"cacheMaxSize\"\n type=\"number\"\n min=\"1\"\n value={cacheMaxSize}\n onChange={(e) => setCacheMaxSize(parseInt(e.target.value) || 1024)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label>{formatMessage({ id: 'apiSettings.endpoints.autoCachePatterns' })}</Label>\n <FilePatternInput\n value={filePatterns}\n onChange={setFilePatterns}\n placeholder=\"*.md,*.ts\"\n />\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'apiSettings.endpoints.filePatternsHint' })}</p>\n </div>\n </>\n )}\n </CollapsibleContent>\n </Collapsible>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isSaving}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSubmit} disabled={isSaving || !isValid}>\n {isSaving ? (\n <Database className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default EndpointModal;\n","// ========================================\n// Cache Settings Component\n// ========================================\n// Global cache configuration form with statistics display\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Database,\n Trash2,\n Save,\n HardDrive,\n FileText,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Switch } from '@/components/ui/Switch';\nimport { Progress } from '@/components/ui/Progress';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/AlertDialog';\nimport {\n useCacheStats,\n useUpdateCacheSettings,\n useClearCache,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { GlobalCacheSettings } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface CacheSettingsProps {\n className?: string;\n}\n\n// ========== Helper Components ==========\n\ninterface CacheUsageIndicatorProps {\n used: number;\n total: number;\n}\n\nfunction CacheUsageIndicator({ used, total }: CacheUsageIndicatorProps) {\n const { formatMessage } = useIntl();\n const percentage = total > 0 ? Math.round((used / total) * 100) : 0;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cache.settings.cacheUsage' })}\n </span>\n <span className=\"font-medium\">\n {percentage}%\n </span>\n </div>\n <Progress value={percentage} className=\"h-2\" />\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {formatMessage({ id: 'apiSettings.cache.settings.used' })} {(used / 1024 / 1024).toFixed(2)} MB\n </span>\n <span>\n {formatMessage({ id: 'apiSettings.cache.settings.total' })} {(total / 1024 / 1024).toFixed(2)} MB\n </span>\n </div>\n </div>\n );\n}\n\ninterface StatCardProps {\n icon: React.ReactNode;\n label: string;\n value: string | number;\n className?: string;\n}\n\nfunction StatCard({ icon, label, value, className }: StatCardProps) {\n return (\n <Card className={cn('p-4', className)}>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-primary/10 rounded-md text-primary\">\n {icon}\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <p className=\"text-2xl font-semibold\">{value}</p>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function CacheSettings({ className }: CacheSettingsProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n\n // Queries and mutations\n const { stats, refetch } = useCacheStats();\n const { updateCacheSettings, isUpdating } = useUpdateCacheSettings();\n const { clearCache, isClearing } = useClearCache();\n\n // Form state - initialize with defaults, will update from API if available\n const [settings, setSettings] = useState<Partial<GlobalCacheSettings>>({\n enabled: true,\n cacheDir: '',\n maxTotalSizeMB: 1024,\n });\n\n const [showClearDialog, setShowClearDialog] = useState(false);\n\n // Update local state when stats load (if API returns settings)\n useEffect(() => {\n if (stats) {\n // CacheStats has totalSize, maxSize, entries - settings might need separate fetch\n // For now, keep local state as the source of truth for settings\n }\n }, [stats]);\n\n // Handle save\n const handleSave = async () => {\n try {\n await updateCacheSettings(settings);\n success(\n formatMessage({ id: 'apiSettings.cache.messages.cacheSettingsUpdated' })\n );\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n }\n };\n\n // Handle clear cache\n const handleClearCache = async () => {\n try {\n await clearCache();\n setShowClearDialog(false);\n success(\n formatMessage({ id: 'apiSettings.cache.messages.cacheCleared' })\n );\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n }\n };\n\n return (\n <div className={cn('space-y-6', className)}>\n {/* Statistics Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <StatCard\n icon={<FileText className=\"w-5 h-5\" />}\n label={formatMessage({ id: 'apiSettings.cache.settings.cacheEntries' })}\n value={stats?.entries ?? 0}\n />\n <StatCard\n icon={<HardDrive className=\"w-5 h-5\" />}\n label={formatMessage({ id: 'apiSettings.cache.settings.cacheSize' })}\n value={`${((stats?.totalSize ?? 0) / 1024 / 1024).toFixed(2)} MB`}\n />\n <StatCard\n icon={<Database className=\"w-5 h-5\" />}\n label={formatMessage({ id: 'apiSettings.cache.settings.maxSize' })}\n value={`${((stats?.maxSize ?? 0) / 1024 / 1024).toFixed(2)} MB`}\n />\n </div>\n\n {/* Cache Usage Progress */}\n {stats && (\n <Card className=\"p-4\">\n <CacheUsageIndicator\n used={stats.totalSize}\n total={stats.maxSize}\n />\n </Card>\n )}\n\n {/* Settings Form */}\n <Card className=\"p-6\">\n <h3 className=\"text-lg font-semibold mb-4\">\n {formatMessage({ id: 'apiSettings.cache.settings.title' })}\n </h3>\n\n <div className=\"space-y-4\">\n {/* Enable Global Caching */}\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <Label htmlFor=\"cache-enabled\">\n {formatMessage({ id: 'apiSettings.cache.settings.enableGlobalCaching' })}\n </Label>\n </div>\n <Switch\n id=\"cache-enabled\"\n checked={settings.enabled ?? true}\n onCheckedChange={(checked) =>\n setSettings({ ...settings, enabled: checked })\n }\n disabled={isUpdating}\n />\n </div>\n\n {/* Cache Directory */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"cache-dir\">\n {formatMessage({ id: 'apiSettings.cache.settings.cacheDirectory' })}\n </Label>\n <Input\n id=\"cache-dir\"\n value={settings.cacheDir ?? ''}\n onChange={(e) =>\n setSettings({ ...settings, cacheDir: e.target.value })\n }\n disabled={isUpdating}\n placeholder=\"/path/to/cache\"\n />\n </div>\n\n {/* Max Total Size */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"cache-max-size\">\n {formatMessage({ id: 'apiSettings.cache.settings.maxSize' })}\n </Label>\n <Input\n id=\"cache-max-size\"\n type=\"number\"\n min={1}\n value={settings.maxTotalSizeMB ?? 1024}\n onChange={(e) =>\n setSettings({\n ...settings,\n maxTotalSizeMB: parseInt(e.target.value) || 1024,\n })\n }\n disabled={isUpdating}\n />\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-between pt-4 border-t\">\n <Button\n variant=\"destructive\"\n onClick={() => setShowClearDialog(true)}\n disabled={isClearing}\n >\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cache.settings.actions.clearCache' })}\n </Button>\n\n <Button onClick={handleSave} disabled={isUpdating}>\n <Save className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.save' })}\n </Button>\n </div>\n </div>\n </Card>\n\n {/* Clear Cache Confirmation Dialog */}\n <AlertDialog open={showClearDialog} onOpenChange={setShowClearDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {formatMessage({ id: 'apiSettings.cache.settings.actions.clearCache' })}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {formatMessage({\n id: 'apiSettings.cache.settings.confirmClearCache',\n })}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isClearing}>\n {formatMessage({ id: 'common.cancel' })}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleClearCache} disabled={isClearing}>\n {isClearing\n ? formatMessage({ id: 'common.loading' })\n : formatMessage({ id: 'common.confirm' })}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","// ========================================\n// Model Pool List Component\n// ========================================\n// Display model pools as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Layers,\n Zap,\n CheckCircle2,\n XCircle,\n MoreVertical,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@/components/ui/Dropdown';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/AlertDialog';\nimport {\n useModelPools,\n useDeleteModelPool,\n useUpdateModelPool,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ModelPoolConfig, ModelPoolType } from '@/lib/api';\nimport { cn } from '@/lib/utils';\n\n// ========== Types ==========\n\nexport interface ModelPoolListProps {\n onAddPool: () => void;\n onEditPool: (poolId: string) => void;\n}\n\ntype FilterType = 'all' | 'embedding' | 'llm' | 'reranker';\n\n// ========== Helper Components ==========\n\ninterface PoolCardProps {\n pool: ModelPoolConfig;\n onEdit: () => void;\n onDelete: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isToggling: boolean;\n}\n\nfunction PoolCard({\n pool,\n onEdit,\n onDelete,\n onToggleEnabled,\n isDeleting,\n isToggling,\n}: PoolCardProps) {\n const { formatMessage } = useIntl();\n\n // Get model type badge\n const getModelTypeBadge = () => {\n const variantMap = {\n embedding: 'success' as const,\n llm: 'default' as const,\n reranker: 'info' as const,\n };\n\n const labelMap = {\n embedding: 'apiSettings.modelPools.embedding',\n llm: 'apiSettings.modelPools.llm',\n reranker: 'apiSettings.modelPools.reranker',\n };\n\n return (\n <Badge variant={variantMap[pool.modelType]}>\n {formatMessage({ id: labelMap[pool.modelType] })}\n </Badge>\n );\n };\n\n // Get strategy label\n const getStrategyLabel = () => {\n const strategyMap = {\n round_robin: 'apiSettings.modelPools.roundRobin',\n latency_aware: 'apiSettings.modelPools.latencyAware',\n weighted_random: 'apiSettings.modelPools.weightedRandom',\n };\n return formatMessage({ id: strategyMap[pool.strategy] });\n };\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: Pool Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground truncate\">\n {pool.name || pool.id}\n </h3>\n {getModelTypeBadge()}\n {pool.enabled ? (\n <Badge variant=\"success\">\n <CheckCircle2 className=\"w-3 h-3 mr-1\" />\n {formatMessage({ id: 'apiSettings.common.enabled' })}\n </Badge>\n ) : (\n <Badge variant=\"secondary\">\n <XCircle className=\"w-3 h-3 mr-1\" />\n {formatMessage({ id: 'apiSettings.common.disabled' })}\n </Badge>\n )}\n </div>\n\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span className=\"capitalize\">{getStrategyLabel()}</span>\n {pool.autoDiscover && (\n <span className=\"flex items-center gap-1\">\n <Zap className=\"w-3 h-3\" />\n {formatMessage({ id: 'apiSettings.modelPools.autoDiscover' })}\n </span>\n )}\n </div>\n\n <div className=\"mt-2 text-sm\">\n <p className=\"text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.modelPools.targetModel' })}: <span className=\"font-medium\">{pool.targetModel}</span>\n </p>\n </div>\n\n {pool.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{pool.description}</p>\n )}\n\n <div className=\"flex items-center gap-4 mt-2 text-xs text-muted-foreground\">\n <span>\n {formatMessage({ id: 'apiSettings.modelPools.defaultCooldown' })}: {pool.defaultCooldown}s\n </span>\n <span>\n {formatMessage({ id: 'apiSettings.modelPools.defaultConcurrent' })}: {pool.defaultMaxConcurrentPerKey}\n </span>\n </div>\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={pool.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\ninterface StatCardProps {\n label: string;\n value: number;\n icon: React.ReactNode;\n className?: string;\n}\n\nfunction StatCard({ label, value, icon, className }: StatCardProps) {\n return (\n <Card className={cn('p-4', className)}>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-primary/10 rounded-md text-primary\">\n {icon}\n </div>\n <div>\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n <p className=\"text-2xl font-semibold\">{value}</p>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ModelPoolList({ onAddPool, onEditPool }: ModelPoolListProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n\n // Queries and mutations\n const { pools, totalCount, enabledCount, isLoading, refetch } = useModelPools();\n const { deleteModelPool, isDeleting } = useDeleteModelPool();\n const { updateModelPool } = useUpdateModelPool();\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [filterType, setFilterType] = useState<FilterType>('all');\n const [deletePoolId, setDeletePoolId] = useState<string | null>(null);\n const [togglingPoolId, setTogglingPoolId] = useState<string | null>(null);\n\n // Filter pools\n const filteredPools = useMemo(() => {\n return pools.filter((pool) => {\n const matchesSearch =\n !searchQuery ||\n pool.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n pool.name?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n pool.targetModel.toLowerCase().includes(searchQuery.toLowerCase());\n\n const matchesFilter =\n filterType === 'all' || pool.modelType === filterType;\n\n return matchesSearch && matchesFilter;\n });\n }, [pools, searchQuery, filterType]);\n\n // Count pools by type\n const typeCounts = useMemo(() => {\n return {\n embedding: pools.filter((p) => p.modelType === 'embedding').length,\n llm: pools.filter((p) => p.modelType === 'llm').length,\n reranker: pools.filter((p) => p.modelType === 'reranker').length,\n };\n }, [pools]);\n\n // Handle delete\n const handleDelete = async () => {\n if (!deletePoolId) return;\n\n try {\n await deleteModelPool(deletePoolId);\n success(\n formatMessage({ id: 'apiSettings.messages.settingsDeleted' })\n );\n setDeletePoolId(null);\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n }\n };\n\n // Handle toggle enabled\n const handleToggleEnabled = async (poolId: string, enabled: boolean) => {\n setTogglingPoolId(poolId);\n try {\n await updateModelPool(poolId, { enabled });\n await refetch();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : formatMessage({ id: 'common.error' })\n );\n } finally {\n setTogglingPoolId(null);\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Statistics Cards */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.stats.total' })}\n value={totalCount}\n icon={<Layers className=\"w-5 h-5\" />}\n />\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.stats.enabled' })}\n value={enabledCount}\n icon={<CheckCircle2 className=\"w-5 h-5\" />}\n />\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.embedding' })}\n value={typeCounts.embedding}\n icon={<Zap className=\"w-5 h-5\" />}\n />\n <StatCard\n label={formatMessage({ id: 'apiSettings.modelPools.llm' })}\n value={typeCounts.llm}\n icon={<Layers className=\"w-5 h-5\" />}\n />\n </div>\n\n {/* Search and Filter Bar */}\n <div className=\"flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between\">\n <div className=\"flex-1 w-full sm:max-w-md\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.common.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Filter Buttons */}\n <div className=\"flex items-center bg-muted rounded-lg p-1\">\n {(Object.keys({ all: null, embedding: null, llm: null, reranker: null }) as FilterType[]).map((type) => (\n <button\n key={type}\n onClick={() => setFilterType(type)}\n className={cn(\n 'px-3 py-1.5 text-sm font-medium rounded-md transition-colors',\n filterType === type\n ? 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {type === 'all'\n ? formatMessage({ id: 'apiSettings.common.showAll' })\n : formatMessage({ id: `apiSettings.modelPools.${type as ModelPoolType}` })}\n </button>\n ))}\n </div>\n\n <Button onClick={onAddPool}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* Pool List */}\n {isLoading ? (\n <div className=\"text-center py-12 text-muted-foreground\">\n {formatMessage({ id: 'common.loading' })}\n </div>\n ) : filteredPools.length === 0 ? (\n <Card className=\"p-12 text-center\">\n <Layers className=\"w-12 h-12 mx-auto mb-4 text-muted-foreground\" />\n <h3 className=\"text-lg font-semibold mb-2\">\n {formatMessage({ id: 'apiSettings.modelPools.emptyState.title' })}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-4\">\n {formatMessage({ id: 'apiSettings.modelPools.emptyState.message' })}\n </p>\n <Button onClick={onAddPool}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.add' })}\n </Button>\n </Card>\n ) : (\n <div className=\"grid gap-4\">\n {filteredPools.map((pool) => (\n <PoolCard\n key={pool.id}\n pool={pool}\n onEdit={() => onEditPool(pool.id)}\n onDelete={() => setDeletePoolId(pool.id)}\n onToggleEnabled={(enabled) => handleToggleEnabled(pool.id, enabled)}\n isDeleting={isDeleting && deletePoolId === pool.id}\n isToggling={togglingPoolId === pool.id}\n />\n ))}\n </div>\n )}\n\n {/* Delete Confirmation Dialog */}\n <AlertDialog open={!!deletePoolId} onOpenChange={() => setDeletePoolId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {formatMessage({ id: 'apiSettings.modelPools.actions.delete' })}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {formatMessage(\n { id: 'apiSettings.modelPools.deleteConfirm' },\n { name: pools.find((p) => p.id === deletePoolId)?.name || deletePoolId || '' }\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isDeleting}>\n {formatMessage({ id: 'common.cancel' })}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleDelete} disabled={isDeleting} className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\">\n {isDeleting\n ? formatMessage({ id: 'common.loading' })\n : formatMessage({ id: 'common.confirm' })}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","// ========================================\n// Model Pool Modal Component\n// ========================================\n// Add/Edit model pool modal with auto-discovery\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Save,\n X,\n Zap,\n Loader2,\n Info,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Checkbox } from '@/components/ui/Checkbox';\nimport {\n useCreateModelPool,\n useUpdateModelPool,\n useDiscoverModelsForPool,\n useAvailableModelsForPool,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { ModelPoolConfig, ModelPoolType, DiscoveredProvider } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface ModelPoolModalProps {\n open: boolean;\n onClose: () => void;\n pool?: ModelPoolConfig | null;\n}\n\ninterface FormData {\n modelType: ModelPoolType | '';\n targetModel: string;\n strategy: 'round_robin' | 'latency_aware' | 'weighted_random';\n autoDiscover: boolean;\n excludedProviderIds: string[];\n defaultCooldown: number;\n defaultMaxConcurrentPerKey: number;\n name: string;\n description: string;\n}\n\nconst defaultFormData: FormData = {\n modelType: '',\n targetModel: '',\n strategy: 'round_robin',\n autoDiscover: true,\n excludedProviderIds: [],\n defaultCooldown: 60,\n defaultMaxConcurrentPerKey: 5,\n name: '',\n description: '',\n};\n\n// ========== Helper Components ==========\n\ninterface ProviderDiscoveryItemProps {\n provider: DiscoveredProvider;\n excluded: boolean;\n onToggle: (providerId: string) => void;\n}\n\nfunction ProviderDiscoveryItem({ provider, excluded, onToggle }: ProviderDiscoveryItemProps) {\n const { formatMessage } = useIntl();\n\n return (\n <div className=\"flex items-center justify-between p-3 bg-muted/50 rounded-md\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={`provider-${provider.providerId}`}\n checked={!excluded}\n onCheckedChange={() => onToggle(provider.providerId)}\n />\n <Label\n htmlFor={`provider-${provider.providerId}`}\n className=\"font-medium cursor-pointer\"\n >\n {provider.providerName}\n </Label>\n </div>\n <div className=\"ml-6 mt-1 flex flex-wrap gap-1\">\n {provider.models.map((model) => (\n <span\n key={model}\n className=\"text-xs px-2 py-0.5 bg-background rounded text-muted-foreground\"\n >\n {model}\n </span>\n ))}\n </div>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onToggle(provider.providerId)}\n >\n {excluded ? (\n <span className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.modelPools.excludeProvider' })}\n </span>\n ) : (\n <span className=\"text-xs text-primary\">\n {formatMessage({ id: 'apiSettings.modelPools.includeProvider' })}\n </span>\n )}\n </Button>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ModelPoolModal({ open, onClose, pool }: ModelPoolModalProps) {\n const { formatMessage } = useIntl();\n const { success, error, warning } = useNotifications();\n\n // Form state\n const [formData, setFormData] = useState<FormData>(defaultFormData);\n const [hasDiscovered, setHasDiscovered] = useState(false);\n\n // Mutations and queries\n const { createModelPool, isCreating } = useCreateModelPool();\n const { updateModelPool, isUpdating } = useUpdateModelPool();\n const { discoverModels, isDiscovering, data: discoveredResponse } = useDiscoverModelsForPool();\n const { data: availableModelsResponse, isLoading: isLoadingModels } = useAvailableModelsForPool(\n (formData.modelType as ModelPoolType | '') || ('embedding' as ModelPoolType)\n );\n\n const isEdit = !!pool;\n const isLoading = isCreating || isUpdating;\n\n // Initialize form from pool (edit mode)\n useEffect(() => {\n if (pool) {\n setFormData({\n modelType: pool.modelType,\n targetModel: pool.targetModel,\n strategy: pool.strategy,\n autoDiscover: pool.autoDiscover,\n excludedProviderIds: pool.excludedProviderIds ?? [],\n defaultCooldown: pool.defaultCooldown,\n defaultMaxConcurrentPerKey: pool.defaultMaxConcurrentPerKey,\n name: pool.name ?? '',\n description: pool.description ?? '',\n });\n } else {\n setFormData(defaultFormData);\n }\n setHasDiscovered(false);\n }, [pool, open]);\n\n // Handle input change\n const handleInputChange = <K extends keyof FormData>(\n key: K,\n value: FormData[K]\n ) => {\n setFormData((prev) => ({ ...prev, [key]: value }));\n // Reset discovered state when model type or target model changes\n if (key === 'modelType' || key === 'targetModel') {\n setHasDiscovered(false);\n }\n };\n\n // Handle auto-discover\n const handleAutoDiscover = async () => {\n if (!formData.modelType || !formData.targetModel) {\n warning(\n 'Please select model type and target model first'\n );\n return;\n }\n\n try {\n await discoverModels(formData.modelType as ModelPoolType, formData.targetModel);\n setHasDiscovered(true);\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : 'Failed to discover providers'\n );\n }\n };\n\n // Toggle provider exclusion\n const handleToggleProvider = (providerId: string) => {\n setFormData((prev) => ({\n ...prev,\n excludedProviderIds: prev.excludedProviderIds.includes(providerId)\n ? prev.excludedProviderIds.filter((id) => id !== providerId)\n : [...prev.excludedProviderIds, providerId],\n }));\n };\n\n // Validate form\n const isValid = useMemo(() => {\n return !!formData.modelType && !!formData.targetModel;\n }, [formData.modelType, formData.targetModel]);\n\n // Handle submit\n const handleSubmit = async () => {\n if (!isValid) return;\n\n try {\n const poolData: Omit<ModelPoolConfig, 'id'> = {\n modelType: formData.modelType as ModelPoolType,\n targetModel: formData.targetModel,\n strategy: formData.strategy,\n autoDiscover: formData.autoDiscover,\n excludedProviderIds: formData.excludedProviderIds,\n defaultCooldown: formData.defaultCooldown,\n defaultMaxConcurrentPerKey: formData.defaultMaxConcurrentPerKey,\n name: formData.name || undefined,\n description: formData.description || undefined,\n enabled: true,\n };\n\n if (isEdit && pool) {\n await updateModelPool(pool.id, poolData);\n } else {\n await createModelPool(poolData);\n }\n\n success(\n formatMessage({ id: 'apiSettings.modelPools.poolSaved' })\n );\n onClose();\n } catch (err) {\n error(\n formatMessage({ id: 'common.error' }),\n err instanceof Error ? err.message : 'Failed to save model pool'\n );\n }\n };\n\n // Extract discovered providers from response\n const discoveredProviders = discoveredResponse?.discovered ?? [];\n\n // Count included providers\n const includedCount = useMemo(() => {\n if (!discoveredResponse || !discoveredProviders) return 0;\n return discoveredProviders.length - formData.excludedProviderIds.filter(\n (id) => discoveredProviders.some((p) => p.providerId === id)\n ).length;\n }, [discoveredResponse, discoveredProviders, formData.excludedProviderIds]);\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {isEdit\n ? formatMessage({ id: 'apiSettings.modelPools.actions.edit' })\n : formatMessage({ id: 'apiSettings.modelPools.actions.add' })}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.modelPools.embeddingPoolDesc' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n {/* Model Type */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-model-type\">\n {formatMessage({ id: 'apiSettings.modelPools.modelType' })} *\n </Label>\n <Select\n value={formData.modelType}\n onValueChange={(value) => handleInputChange('modelType', value as ModelPoolType)}\n disabled={isEdit}\n >\n <SelectTrigger id=\"pool-model-type\">\n <SelectValue placeholder={formatMessage({ id: 'apiSettings.modelPools.selectTargetModel' })} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"embedding\">\n {formatMessage({ id: 'apiSettings.modelPools.embedding' })}\n </SelectItem>\n <SelectItem value=\"llm\">\n {formatMessage({ id: 'apiSettings.modelPools.llm' })}\n </SelectItem>\n <SelectItem value=\"reranker\">\n {formatMessage({ id: 'apiSettings.modelPools.reranker' })}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Target Model */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-target-model\">\n {formatMessage({ id: 'apiSettings.modelPools.targetModel' })} *\n </Label>\n {isLoadingModels ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n {formatMessage({ id: 'common.loading' })}\n </div>\n ) : (\n <Select\n value={formData.targetModel}\n onValueChange={(value) => handleInputChange('targetModel', value)}\n disabled={!formData.modelType}\n >\n <SelectTrigger id=\"pool-target-model\">\n <SelectValue placeholder={formatMessage({ id: 'apiSettings.modelPools.selectTargetModel' })} />\n </SelectTrigger>\n <SelectContent>\n {availableModelsResponse?.availableModels?.map((model) => (\n <SelectItem key={model.modelId} value={model.modelId}>\n {model.modelName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n\n {/* Strategy */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-strategy\">\n {formatMessage({ id: 'apiSettings.modelPools.strategy' })}\n </Label>\n <Select\n value={formData.strategy}\n onValueChange={(value) => handleInputChange('strategy', value as FormData['strategy'])}\n >\n <SelectTrigger id=\"pool-strategy\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"round_robin\">\n {formatMessage({ id: 'apiSettings.modelPools.roundRobin' })}\n </SelectItem>\n <SelectItem value=\"latency_aware\">\n {formatMessage({ id: 'apiSettings.modelPools.latencyAware' })}\n </SelectItem>\n <SelectItem value=\"weighted_random\">\n {formatMessage({ id: 'apiSettings.modelPools.weightedRandom' })}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Auto-Discover Toggle */}\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <Label htmlFor=\"pool-auto-discover\">\n {formatMessage({ id: 'apiSettings.modelPools.autoDiscover' })}\n </Label>\n <p className=\"text-xs text-muted-foreground\">\n Automatically find providers offering this model\n </p>\n </div>\n <Switch\n id=\"pool-auto-discover\"\n checked={formData.autoDiscover}\n onCheckedChange={(checked) => handleInputChange('autoDiscover', checked)}\n />\n </div>\n\n {/* Auto-Discover Button and Results */}\n {formData.autoDiscover && formData.modelType && formData.targetModel && (\n <div className=\"space-y-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleAutoDiscover}\n disabled={isDiscovering}\n className=\"w-full\"\n >\n {isDiscovering ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {formatMessage({ id: 'common.loading' })}\n </>\n ) : (\n <>\n <Zap className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.modelPools.actions.autoDiscover' })}\n </>\n )}\n </Button>\n\n {hasDiscovered && discoveredProviders.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Info className=\"w-4 h-4\" />\n <span>\n {formatMessage({ id: 'apiSettings.modelPools.discovered' })}{' '}\n {discoveredProviders.length}{' '}\n {formatMessage({ id: 'apiSettings.modelPools.providers' })} •{' '}\n {includedCount} {formatMessage({ id: 'apiSettings.modelPools.discovered' }).toLowerCase()}\n </span>\n </div>\n {discoveredProviders.map((provider) => (\n <ProviderDiscoveryItem\n key={provider.providerId}\n provider={provider}\n excluded={formData.excludedProviderIds.includes(provider.providerId)}\n onToggle={handleToggleProvider}\n />\n ))}\n </div>\n )}\n\n {hasDiscovered && discoveredProviders.length === 0 && (\n <div className=\"text-center py-6 text-muted-foreground\">\n <p className=\"text-sm\">\n {formatMessage({ id: 'apiSettings.modelPools.noProvidersFound' })}\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* Cooldown and Concurrent */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-cooldown\">\n {formatMessage({ id: 'apiSettings.modelPools.defaultCooldown' })}\n </Label>\n <Input\n id=\"pool-cooldown\"\n type=\"number\"\n min={0}\n value={formData.defaultCooldown}\n onChange={(e) => handleInputChange('defaultCooldown', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-concurrent\">\n {formatMessage({ id: 'apiSettings.modelPools.defaultConcurrent' })}\n </Label>\n <Input\n id=\"pool-concurrent\"\n type=\"number\"\n min={1}\n value={formData.defaultMaxConcurrentPerKey}\n onChange={(e) => handleInputChange('defaultMaxConcurrentPerKey', parseInt(e.target.value) || 1)}\n />\n </div>\n </div>\n\n {/* Name and Description */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-name\">\n {formatMessage({ id: 'apiSettings.common.name' })}\n </Label>\n <Input\n id=\"pool-name\"\n value={formData.name}\n onChange={(e) => handleInputChange('name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.common.optional' })}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"pool-description\">\n {formatMessage({ id: 'apiSettings.common.description' })}\n </Label>\n <Textarea\n id=\"pool-description\"\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.common.optional' })}\n rows={3}\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={isLoading}>\n <X className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.cancel' })}\n </Button>\n <Button onClick={handleSubmit} disabled={!isValid || isLoading}>\n {isLoading ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n {formatMessage({ id: 'common.loading' })}\n </>\n ) : (\n <>\n <Save className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.save' })}\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","// ========================================\n// CLI Settings List Component\n// ========================================\n// Display CLI settings as cards with search, filter, and actions\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Search,\n Plus,\n Edit,\n Trash2,\n Settings,\n CheckCircle2,\n MoreVertical,\n Link as LinkIcon,\n} from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n} from '@/components/ui/Dropdown';\nimport {\n useCliSettings,\n useDeleteCliSettings,\n useToggleCliSettings,\n} from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { CliSettingsEndpoint } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface CliSettingsListProps {\n onAddCliSettings: () => void;\n onEditCliSettings: (endpointId: string) => void;\n}\n\n// ========== Helper Components ==========\n\ninterface CliSettingsCardProps {\n cliSettings: CliSettingsEndpoint;\n onEdit: () => void;\n onDelete: () => void;\n onToggleEnabled: (enabled: boolean) => void;\n isDeleting: boolean;\n isToggling: boolean;\n}\n\nfunction CliSettingsCard({\n cliSettings,\n onEdit,\n onDelete,\n onToggleEnabled,\n isDeleting,\n isToggling,\n}: CliSettingsCardProps) {\n const { formatMessage } = useIntl();\n\n // Display provider badge\n const getProviderBadge = () => {\n const provider = cliSettings.provider || 'claude';\n const variants: Record<string, { variant: 'secondary' | 'outline' | 'default'; label: string }> = {\n claude: { variant: 'secondary', label: 'Claude' },\n codex: { variant: 'outline', label: 'Codex' },\n gemini: { variant: 'default', label: 'Gemini' },\n };\n const config = variants[provider] || variants.claude;\n return (\n <Badge variant={config.variant} className=\"text-xs\">\n {config.label}\n </Badge>\n );\n };\n\n const getStatusBadge = () => {\n if (!cliSettings.enabled) {\n return <Badge variant=\"secondary\">{formatMessage({ id: 'apiSettings.common.disabled' })}</Badge>;\n }\n return <Badge variant=\"success\">{formatMessage({ id: 'apiSettings.common.enabled' })}</Badge>;\n };\n\n // Get provider-appropriate endpoint URL for display\n const endpointUrl = (() => {\n const env = cliSettings.settings.env;\n return env.ANTHROPIC_BASE_URL || env.OPENAI_BASE_URL || '';\n })();\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left: CLI Settings Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"text-lg font-semibold text-foreground truncate\">{cliSettings.name}</h3>\n {getStatusBadge()}\n {getProviderBadge()}\n </div>\n {cliSettings.description && (\n <p className=\"text-sm text-muted-foreground mt-1\">{cliSettings.description}</p>\n )}\n <div className=\"flex items-center gap-4 mt-2 text-sm text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Settings className=\"w-3 h-3\" />\n {cliSettings.settings.model || 'default'}\n </span>\n {endpointUrl && (\n <span className=\"flex items-center gap-1 truncate max-w-[200px]\" title={endpointUrl}>\n <LinkIcon className=\"w-3 h-3 flex-shrink-0\" />\n {endpointUrl}\n </span>\n )}\n </div>\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-2\">\n <Switch\n checked={cliSettings.enabled}\n onCheckedChange={onToggleEnabled}\n disabled={isToggling}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <MoreVertical className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onEdit}>\n <Edit className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cliSettings.actions.edit' })}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} disabled={isDeleting} className=\"text-destructive\">\n <Trash2 className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cliSettings.actions.delete' })}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </Card>\n );\n}\n\n// ========== Main Component ==========\n\nexport function CliSettingsList({\n onAddCliSettings,\n onEditCliSettings,\n}: CliSettingsListProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const [searchQuery, setSearchQuery] = useState('');\n\n const {\n cliSettings,\n totalCount,\n enabledCount,\n providerCounts,\n isLoading,\n refetch,\n } = useCliSettings();\n\n const { deleteCliSettings, isDeleting } = useDeleteCliSettings();\n const { toggleCliSettings, isToggling } = useToggleCliSettings();\n\n // Filter settings by search query\n const filteredSettings = useMemo(() => {\n if (!searchQuery) return cliSettings;\n const query = searchQuery.toLowerCase();\n return cliSettings.filter(\n (s) =>\n s.name.toLowerCase().includes(query) ||\n s.description?.toLowerCase().includes(query) ||\n s.id.toLowerCase().includes(query)\n );\n }, [cliSettings, searchQuery]);\n\n // Handlers\n const handleDelete = async (endpointId: string) => {\n const settings = cliSettings.find((s) => s.id === endpointId);\n if (!settings) return;\n\n const confirmMessage = formatMessage(\n { id: 'apiSettings.cliSettings.deleteConfirm' },\n { name: settings.name }\n );\n\n if (confirm(confirmMessage)) {\n try {\n await deleteCliSettings(endpointId);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.deleteError' }));\n }\n }\n };\n\n const handleToggleEnabled = async (endpointId: string, enabled: boolean) => {\n try {\n await toggleCliSettings(endpointId, enabled);\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.toggleError' }));\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Stats Cards */}\n <div className=\"grid grid-cols-2 sm:grid-cols-5 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{totalCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.cliSettings.stats.total' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"w-5 h-5 text-success\" />\n <span className=\"text-2xl font-bold\">{enabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.cliSettings.stats.enabled' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold\">{providerCounts.claude || 0}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">Claude</p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold\">{providerCounts.codex || 0}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">Codex</p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold\">{providerCounts.gemini || 0}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">Gemini</p>\n </Card>\n </div>\n\n {/* Search and Actions */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isLoading}>\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n <Button onClick={onAddCliSettings}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.cliSettings.actions.add' })}\n </Button>\n </div>\n </div>\n\n {/* CLI Settings Cards */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-32 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : filteredSettings.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <Settings className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.emptyState.message' })}\n </p>\n </Card>\n ) : (\n <div className=\"space-y-3\">\n {filteredSettings.map((settings) => (\n <CliSettingsCard\n key={settings.id}\n cliSettings={settings}\n onEdit={() => onEditCliSettings(settings.id)}\n onDelete={() => handleDelete(settings.id)}\n onToggleEnabled={(enabled) => handleToggleEnabled(settings.id, enabled)}\n isDeleting={isDeleting}\n isToggling={isToggling}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default CliSettingsList;\n","// ========================================\n// CLI Settings Modal Component\n// ========================================\n// Add/Edit CLI settings modal with multi-provider support (Claude/Codex/Gemini)\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Check, Eye, EyeOff, X, Plus, Loader2, Download } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Textarea } from '@/components/ui/Textarea';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/Tabs';\nimport { useCreateCliSettings, useUpdateCliSettings, useProviders } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport { fetchCodexConfigPreview, fetchGeminiConfigPreview } from '@/lib/api';\nimport type { CliSettingsEndpoint, CliProvider } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface CliSettingsModalProps {\n open: boolean;\n onClose: () => void;\n cliSettings?: CliSettingsEndpoint | null;\n /** Pre-selected provider when creating new */\n defaultProvider?: CliProvider;\n}\n\ntype ModeType = 'provider-based' | 'direct';\n\n// ========== Helper Functions ==========\n\nfunction parseConfigText(\n text: string,\n format: 'json' | 'toml' = 'json'\n): { ok: true; value: string } | { ok: false; errorKey: string } {\n const trimmed = text.trim();\n if (!trimmed) {\n return { ok: true, value: '' };\n }\n\n if (format === 'json') {\n try {\n JSON.parse(trimmed);\n return { ok: true, value: trimmed };\n } catch {\n return { ok: false, errorKey: 'invalidJson' };\n }\n }\n\n // TOML: basic format check (no full parser needed)\n return { ok: true, value: trimmed };\n}\n\n// ========== Main Component ==========\n\nexport function CliSettingsModal({ open, onClose, cliSettings, defaultProvider }: CliSettingsModalProps) {\n const { formatMessage } = useIntl();\n const { error } = useNotifications();\n const isEditing = !!cliSettings;\n\n // Mutations\n const { createCliSettings, isCreating } = useCreateCliSettings();\n const { updateCliSettings, isUpdating } = useUpdateCliSettings();\n\n // Get providers for provider-based mode (Claude)\n const { providers } = useProviders();\n\n // Common form state\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [enabled, setEnabled] = useState(true);\n const [cliProvider, setCliProvider] = useState<CliProvider>('claude');\n\n // Claude: mode tabs\n const [mode, setMode] = useState<ModeType>('direct');\n const [providerId, setProviderId] = useState('');\n const [authToken, setAuthToken] = useState('');\n const [baseUrl, setBaseUrl] = useState('');\n const [showToken, setShowToken] = useState(false);\n const [settingsFile, setSettingsFile] = useState('');\n\n // Codex specific\n const [codexApiKey, setCodexApiKey] = useState('');\n const [codexBaseUrl, setCodexBaseUrl] = useState('');\n const [codexProfile, setCodexProfile] = useState('');\n const [showCodexKey, setShowCodexKey] = useState(false);\n const [authJson, setAuthJson] = useState('');\n const [configToml, setConfigToml] = useState('');\n const [writeCommonConfig, setWriteCommonConfig] = useState(false);\n\n // Gemini specific\n const [geminiApiKey, setGeminiApiKey] = useState('');\n const [showGeminiKey, setShowGeminiKey] = useState(false);\n const [geminiSettingsJson, setGeminiSettingsJson] = useState('');\n const [isLoadingGeminiConfig, setIsLoadingGeminiConfig] = useState(false);\n\n // Shared\n const [model, setModel] = useState('');\n const [availableModels, setAvailableModels] = useState<string[]>([]);\n const [modelInput, setModelInput] = useState('');\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n const [configJson, setConfigJson] = useState('{}');\n const [showJsonInput, setShowJsonInput] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n // Codex config preview loading state\n const [isLoadingCodexConfig, setIsLoadingCodexConfig] = useState(false);\n\n // Initialize form\n useEffect(() => {\n if (cliSettings) {\n setName(cliSettings.name);\n setDescription(cliSettings.description || '');\n setEnabled(cliSettings.enabled);\n setCliProvider(cliSettings.provider || 'claude');\n setModel(cliSettings.settings.model || '');\n setAvailableModels(cliSettings.settings.availableModels || []);\n setTags(cliSettings.settings.tags || []);\n\n const provider = cliSettings.provider || 'claude';\n if (provider === 'claude') {\n setSettingsFile((cliSettings.settings as any).settingsFile || '');\n const env = cliSettings.settings.env;\n const hasCustomBaseUrl = Boolean(\n env.ANTHROPIC_BASE_URL && !env.ANTHROPIC_BASE_URL.includes('api.anthropic.com')\n );\n if (hasCustomBaseUrl) {\n setMode('direct');\n setBaseUrl(env.ANTHROPIC_BASE_URL || '');\n setAuthToken(env.ANTHROPIC_AUTH_TOKEN || '');\n } else {\n setMode('provider-based');\n const matchingProvider = providers.find((p) => p.apiBase === env.ANTHROPIC_BASE_URL);\n if (matchingProvider) setProviderId(matchingProvider.id);\n }\n } else if (provider === 'codex') {\n const s = cliSettings.settings as any;\n setCodexApiKey(s.env.OPENAI_API_KEY || '');\n setCodexBaseUrl(s.env.OPENAI_BASE_URL || '');\n setCodexProfile(s.profile || '');\n setAuthJson(s.authJson || '');\n setConfigToml(s.configToml || '');\n } else if (provider === 'gemini') {\n setGeminiApiKey(cliSettings.settings.env.GEMINI_API_KEY || cliSettings.settings.env.GOOGLE_API_KEY || '');\n }\n } else {\n // Reset for new\n const p = defaultProvider || 'claude';\n setName('');\n setDescription('');\n setEnabled(true);\n setCliProvider(p);\n setMode('direct');\n setProviderId('');\n setModel('');\n setSettingsFile('');\n setAuthToken('');\n setBaseUrl('');\n setCodexApiKey('');\n setCodexBaseUrl('');\n setCodexProfile('');\n setShowCodexKey(false);\n setAuthJson('');\n setConfigToml('');\n setWriteCommonConfig(false);\n setGeminiApiKey('');\n setShowGeminiKey(false);\n setGeminiSettingsJson('');\n setAvailableModels([]);\n setModelInput('');\n setTags([]);\n setTagInput('');\n setConfigJson('{}');\n setShowJsonInput(false);\n setErrors({});\n }\n }, [cliSettings, open, providers, defaultProvider]);\n\n // Validate form\n const validateForm = (): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (!name.trim()) {\n newErrors.name = formatMessage({ id: 'apiSettings.validation.nameRequired' });\n } else {\n const namePattern = /^[a-zA-Z][a-zA-Z0-9_-]*$/;\n if (!namePattern.test(name.trim())) {\n newErrors.name = formatMessage({ id: 'apiSettings.cliSettings.nameFormatHint' });\n }\n if (name.trim().length > 32) {\n newErrors.name = formatMessage({ id: 'apiSettings.cliSettings.nameTooLong' }, { max: 32 });\n }\n }\n\n if (cliProvider === 'claude') {\n if (mode === 'provider-based' && !providerId) {\n newErrors.providerId = formatMessage({ id: 'apiSettings.cliSettings.validation.providerRequired' });\n }\n if (mode === 'direct' && !authToken.trim() && !baseUrl.trim()) {\n newErrors.direct = formatMessage({ id: 'apiSettings.cliSettings.validation.authOrBaseUrlRequired' });\n }\n }\n\n if (authJson.trim()) {\n const parsed = parseConfigText(authJson, 'json');\n if (!parsed.ok) {\n newErrors.authJson = formatMessage({ id: `apiSettings.cliSettings.${parsed.errorKey}` });\n }\n }\n\n if (showJsonInput) {\n const parsed = parseConfigText(configJson, 'json');\n if (!parsed.ok) {\n newErrors.configJson = formatMessage({ id: `apiSettings.cliSettings.${parsed.errorKey}` });\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n // Handle load Codex config preview\n const handleLoadCodexConfig = async () => {\n setIsLoadingCodexConfig(true);\n try {\n const result = await fetchCodexConfigPreview();\n if (result.success) {\n if (result.configToml) {\n setConfigToml(result.configToml);\n }\n if (result.authJson) {\n setAuthJson(result.authJson);\n }\n } else {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n }\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n } finally {\n setIsLoadingCodexConfig(false);\n }\n };\n\n // Handle load Gemini config preview\n const handleLoadGeminiConfig = async () => {\n setIsLoadingGeminiConfig(true);\n try {\n const result = await fetchGeminiConfigPreview();\n if (result.success) {\n if (result.settingsJson) {\n setGeminiSettingsJson(result.settingsJson);\n }\n } else {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n }\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.loadConfigError' }) || 'Failed to load config');\n } finally {\n setIsLoadingGeminiConfig(false);\n }\n };\n\n // Handle save\n const handleSave = async () => {\n if (!validateForm()) return;\n\n try {\n let settings: any;\n\n if (cliProvider === 'claude') {\n const env: Record<string, string> = { DISABLE_AUTOUPDATER: '1' };\n if (mode === 'provider-based') {\n const provider = providers.find((p) => p.id === providerId);\n if (provider?.apiBase) env.ANTHROPIC_BASE_URL = provider.apiBase;\n if (provider?.apiKey) env.ANTHROPIC_AUTH_TOKEN = provider.apiKey;\n } else {\n if (authToken.trim()) env.ANTHROPIC_AUTH_TOKEN = authToken.trim();\n if (baseUrl.trim()) env.ANTHROPIC_BASE_URL = baseUrl.trim();\n }\n settings = {\n env,\n model: model || undefined,\n settingsFile: settingsFile.trim() || undefined,\n availableModels,\n tags,\n };\n } else if (cliProvider === 'codex') {\n const env: Record<string, string> = {};\n if (codexApiKey.trim()) env.OPENAI_API_KEY = codexApiKey.trim();\n if (codexBaseUrl.trim()) env.OPENAI_BASE_URL = codexBaseUrl.trim();\n settings = {\n env,\n model: model || undefined,\n profile: codexProfile.trim() || undefined,\n authJson: authJson.trim() || undefined,\n configToml: configToml.trim() || undefined,\n availableModels,\n tags,\n };\n } else {\n // gemini\n const env: Record<string, string> = {};\n if (geminiApiKey.trim()) env.GEMINI_API_KEY = geminiApiKey.trim();\n settings = {\n env,\n model: model || undefined,\n availableModels,\n tags,\n };\n }\n\n // Merge JSON config if shown\n if (showJsonInput && configJson.trim()) {\n try {\n const extra = JSON.parse(configJson);\n if (extra && typeof extra === 'object' && !Array.isArray(extra)) {\n Object.assign(settings, extra);\n }\n } catch {\n // skip invalid json\n }\n }\n\n const request = {\n id: cliSettings?.id,\n name: name.trim(),\n description: description.trim() || undefined,\n provider: cliProvider,\n enabled,\n settings,\n };\n\n if (isEditing && cliSettings) {\n await updateCliSettings(cliSettings.id, request);\n } else {\n await createCliSettings(request);\n }\n\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.cliSettings.saveError' }));\n }\n };\n\n // Tag/Model helpers\n const handleAddModel = () => {\n const v = modelInput.trim();\n if (v && !availableModels.includes(v)) {\n setAvailableModels([...availableModels, v]);\n setModelInput('');\n }\n };\n const handleRemoveModel = (m: string) => setAvailableModels(availableModels.filter((x) => x !== m));\n const handleAddTag = () => {\n const v = tagInput.trim();\n if (v && !tags.includes(v)) {\n setTags([...tags, v]);\n setTagInput('');\n }\n };\n const handleRemoveTag = (t: string) => setTags(tags.filter((x) => x !== t));\n\n const predefinedTags = ['分析', 'Debug', 'implementation', 'refactoring', 'testing'];\n const selectedProvider = providers.find((p) => p.id === providerId);\n\n // Title by provider\n const providerLabel: Record<CliProvider, string> = {\n claude: 'Claude',\n codex: 'Codex',\n gemini: 'Gemini',\n };\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {isEditing\n ? formatMessage({ id: 'apiSettings.cliSettings.actions.edit' })\n : formatMessage({ id: 'apiSettings.cliSettings.actions.add' })}\n {' - '}{providerLabel[cliProvider]}\n </DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.cliSettings.modalDescription' })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* Common Fields */}\n <div className=\"space-y-4\">\n {/* Provider Selector (only when creating new) */}\n {!isEditing && (\n <div className=\"space-y-2\">\n <Label>CLI Provider</Label>\n <Select value={cliProvider} onValueChange={(v) => setCliProvider(v as CliProvider)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"claude\">Claude</SelectItem>\n <SelectItem value=\"codex\">Codex</SelectItem>\n <SelectItem value=\"gemini\">Gemini</SelectItem>\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">\n {formatMessage({ id: 'apiSettings.common.name' })}\n <span className=\"text-destructive\">*</span>\n </Label>\n <Input\n id=\"name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.namePlaceholder' })}\n className={errors.name ? 'border-destructive' : ''}\n maxLength={32}\n />\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.nameFormatHint' })}\n </p>\n {errors.name && <p className=\"text-sm text-destructive\">{errors.name}</p>}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">\n {formatMessage({ id: 'apiSettings.common.description' })}\n </Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.descriptionPlaceholder' })}\n rows={2}\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Switch id=\"enabled\" checked={enabled} onCheckedChange={setEnabled} />\n <Label htmlFor=\"enabled\" className=\"cursor-pointer\">\n {formatMessage({ id: 'apiSettings.common.enableThis' })}\n </Label>\n </div>\n </div>\n\n {/* ========== Claude Settings ========== */}\n {cliProvider === 'claude' && (\n <>\n <Tabs value={mode} onValueChange={(v) => setMode(v as ModeType)} className=\"w-full\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"provider-based\">\n {formatMessage({ id: 'apiSettings.cliSettings.providerBased' })}\n </TabsTrigger>\n <TabsTrigger value=\"direct\">\n {formatMessage({ id: 'apiSettings.cliSettings.direct' })}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"provider-based\" className=\"space-y-4 mt-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"providerId\">\n {formatMessage({ id: 'apiSettings.common.provider' })}\n <span className=\"text-destructive\">*</span>\n </Label>\n <Select value={providerId} onValueChange={setProviderId}>\n <SelectTrigger className={errors.providerId ? 'border-destructive' : ''}>\n <SelectValue placeholder={formatMessage({ id: 'apiSettings.cliSettings.selectProvider' })} />\n </SelectTrigger>\n <SelectContent>\n {providers.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n {errors.providerId && <p className=\"text-sm text-destructive\">{errors.providerId}</p>}\n </div>\n\n {selectedProvider && (\n <div className=\"p-4 bg-muted/50 rounded-lg space-y-2\">\n <p className=\"text-sm font-medium\">{selectedProvider.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.common.type' })}: {selectedProvider.type}\n </p>\n {selectedProvider.apiBase && (\n <p className=\"text-xs text-muted-foreground truncate\">\n {formatMessage({ id: 'apiSettings.providers.apiBaseUrl' })}: {selectedProvider.apiBase}\n </p>\n )}\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"model-pb\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input id=\"model-pb\" value={model} onChange={(e) => setModel(e.target.value)} placeholder=\"\" />\n </div>\n </TabsContent>\n\n <TabsContent value=\"direct\" className=\"space-y-4 mt-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"authToken\">{formatMessage({ id: 'apiSettings.cliSettings.authToken' })}</Label>\n <div className=\"relative\">\n <Input\n id=\"authToken\"\n type={showToken ? 'text' : 'password'}\n value={authToken}\n onChange={(e) => setAuthToken(e.target.value)}\n placeholder=\"sk-ant-...\"\n className={errors.direct ? 'border-destructive pr-10' : 'pr-10'}\n />\n <Button\n type=\"button\" variant=\"ghost\" size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={() => setShowToken(!showToken)}\n >\n {showToken ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"baseUrl\">{formatMessage({ id: 'apiSettings.cliSettings.baseUrl' })}</Label>\n <Input\n id=\"baseUrl\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.anthropic.com\"\n className={errors.direct ? 'border-destructive' : ''}\n />\n </div>\n {errors.direct && <p className=\"text-sm text-destructive\">{errors.direct}</p>}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"model-direct\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input id=\"model-direct\" value={model} onChange={(e) => setModel(e.target.value)} placeholder=\"\" />\n </div>\n </TabsContent>\n </Tabs>\n\n {/* Claude: Settings File */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"settingsFile\">{formatMessage({ id: 'apiSettings.cliSettings.settingsFile' })}</Label>\n <Input\n id=\"settingsFile\"\n value={settingsFile}\n onChange={(e) => setSettingsFile(e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.settingsFilePlaceholder' })}\n />\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.settingsFileHint' })}\n </p>\n </div>\n </>\n )}\n\n {/* ========== Codex Settings ========== */}\n {cliProvider === 'codex' && (\n <div className=\"space-y-4\">\n {/* Load Global Config Button */}\n <div className=\"flex items-center justify-between p-3 bg-muted/30 rounded-lg\">\n <div>\n <p className=\"text-sm font-medium\">Load Global Config</p>\n <p className=\"text-xs text-muted-foreground\">\n Load config.toml and auth.json from global Codex config directory\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleLoadCodexConfig}\n disabled={isLoadingCodexConfig}\n >\n {isLoadingCodexConfig ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n Loading...\n </>\n ) : (\n <>\n <Download className=\"w-4 h-4 mr-2\" />\n Load Config\n </>\n )}\n </Button>\n </div>\n\n {/* API Key */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-apikey\">API Key</Label>\n <p className=\"text-xs text-muted-foreground\">\n 只需要填这里,下方 auth.json 会自动填充\n </p>\n <div className=\"relative\">\n <Input\n id=\"codex-apikey\"\n type={showCodexKey ? 'text' : 'password'}\n value={codexApiKey}\n onChange={(e) => setCodexApiKey(e.target.value)}\n placeholder=\"sk-...\"\n className=\"pr-10\"\n />\n <Button\n type=\"button\" variant=\"ghost\" size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={() => setShowCodexKey(!showCodexKey)}\n >\n {showCodexKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n\n {/* API Endpoint URL */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-baseurl\">API 请求地址</Label>\n <Input\n id=\"codex-baseurl\"\n value={codexBaseUrl}\n onChange={(e) => setCodexBaseUrl(e.target.value)}\n placeholder=\"https://your-api-endpoint.com/v1\"\n />\n <p className=\"text-xs text-muted-foreground\">\n 填写兼容 OpenAI Response 格式的服务端点地址\n </p>\n </div>\n\n {/* Model Name */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-model\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input\n id=\"codex-model\"\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"\"\n />\n <p className=\"text-xs text-muted-foreground\">\n 指定使用的模型,将自动更新到 config.toml 中\n </p>\n </div>\n\n {/* Profile */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-profile\">Profile</Label>\n <Input\n id=\"codex-profile\"\n value={codexProfile}\n onChange={(e) => setCodexProfile(e.target.value)}\n placeholder=\"default\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Codex profile 名称,通过 --profile 参数传递\n </p>\n </div>\n\n {/* auth.json Editor */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"codex-authjson\">auth.json (JSON) *</Label>\n <Textarea\n id=\"codex-authjson\"\n value={authJson}\n onChange={(e) => {\n setAuthJson(e.target.value);\n if (errors.authJson) {\n setErrors((prev) => { const n = { ...prev }; delete n.authJson; return n; });\n }\n }}\n placeholder='{\"OPENAI_API_KEY\": \"...\"}'\n className={`font-mono text-sm ${errors.authJson ? 'border-destructive' : ''}`}\n rows={8}\n />\n {errors.authJson && <p className=\"text-xs text-destructive\">{errors.authJson}</p>}\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xs text-muted-foreground\">Codex auth.json 配置内容</p>\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\"\n onClick={() => {\n try {\n const formatted = JSON.stringify(JSON.parse(authJson), null, 2);\n setAuthJson(formatted);\n } catch { /* skip */ }\n }}\n >\n 格式化\n </Button>\n </div>\n </div>\n\n {/* config.toml Editor */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"codex-configtoml\">config.toml (TOML)</Label>\n <div className=\"flex items-center gap-2\">\n <Switch id=\"writeCommon\" checked={writeCommonConfig} onCheckedChange={setWriteCommonConfig} />\n <Label htmlFor=\"writeCommon\" className=\"text-xs cursor-pointer\">写入通用配置</Label>\n </div>\n </div>\n <Textarea\n id=\"codex-configtoml\"\n value={configToml}\n onChange={(e) => setConfigToml(e.target.value)}\n placeholder=\"\"\n className=\"font-mono text-sm\"\n rows={6}\n />\n </div>\n </div>\n )}\n\n {/* ========== Gemini Settings ========== */}\n {cliProvider === 'gemini' && (\n <div className=\"space-y-4\">\n {/* Load Global Config Button */}\n <div className=\"flex items-center justify-between p-3 bg-muted/30 rounded-lg\">\n <div>\n <p className=\"text-sm font-medium\">Load Global Config</p>\n <p className=\"text-xs text-muted-foreground\">\n Load settings.json from global Gemini config directory\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleLoadGeminiConfig}\n disabled={isLoadingGeminiConfig}\n >\n {isLoadingGeminiConfig ? (\n <>\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n Loading...\n </>\n ) : (\n <>\n <Download className=\"w-4 h-4 mr-2\" />\n Load Config\n </>\n )}\n </Button>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"gemini-apikey\">API Key</Label>\n <div className=\"relative\">\n <Input\n id=\"gemini-apikey\"\n type={showGeminiKey ? 'text' : 'password'}\n value={geminiApiKey}\n onChange={(e) => setGeminiApiKey(e.target.value)}\n placeholder=\"AIza...\"\n className=\"pr-10\"\n />\n <Button\n type=\"button\" variant=\"ghost\" size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={() => setShowGeminiKey(!showGeminiKey)}\n >\n {showGeminiKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"gemini-model\">{formatMessage({ id: 'apiSettings.cliSettings.model' })}</Label>\n <Input\n id=\"gemini-model\"\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"\"\n />\n </div>\n\n {/* settings.json Editor */}\n {geminiSettingsJson && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"gemini-settingsjson\">settings.json (Preview)</Label>\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\"\n onClick={() => {\n try {\n const formatted = JSON.stringify(JSON.parse(geminiSettingsJson), null, 2);\n setGeminiSettingsJson(formatted);\n } catch { /* skip */ }\n }}\n >\n Format\n </Button>\n </div>\n <Textarea\n id=\"gemini-settingsjson\"\n value={geminiSettingsJson}\n onChange={(e) => setGeminiSettingsJson(e.target.value)}\n placeholder=\"{}\"\n className=\"font-mono text-sm\"\n rows={8}\n readOnly\n />\n <p className=\"text-xs text-muted-foreground\">\n Gemini settings.json content (read-only preview)\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* ========== Shared Settings (all providers) ========== */}\n <div className=\"space-y-4\">\n {/* Available Models */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"availableModels\">{formatMessage({ id: 'apiSettings.cliSettings.availableModels' })}</Label>\n <div className=\"flex flex-wrap gap-2 p-3 bg-muted/30 rounded-lg min-h-[60px]\">\n {availableModels.map((m) => (\n <span key={m} className=\"inline-flex items-center gap-1 px-2 py-1 bg-primary/10 text-primary rounded-md text-sm\">\n {m}\n <button type=\"button\" onClick={() => handleRemoveModel(m)} className=\"hover:text-destructive transition-colors\">×</button>\n </span>\n ))}\n <div className=\"flex gap-2 flex-1\">\n <Input\n id=\"availableModels\"\n value={modelInput}\n onChange={(e) => setModelInput(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); handleAddModel(); } }}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.availableModelsPlaceholder' })}\n className=\"flex-1 min-w-[120px]\"\n />\n <Button type=\"button\" size=\"sm\" onClick={handleAddModel} variant=\"outline\">\n <Check className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.availableModelsHint' })}\n </p>\n </div>\n\n {/* Tags */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"tags\">{formatMessage({ id: 'apiSettings.cliSettings.tags' })}</Label>\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.tagsDescription' })}\n </p>\n <div className=\"flex flex-wrap gap-2 p-3 bg-muted/30 rounded-lg min-h-[60px]\">\n {tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center gap-1 px-2 py-1 bg-primary/10 text-primary rounded-md text-sm\">\n {tag}\n <button\n type=\"button\"\n onClick={() => handleRemoveTag(tag)}\n className=\"hover:text-destructive transition-colors\"\n aria-label={formatMessage({ id: 'apiSettings.cliSettings.removeTag' })}\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n <div className=\"flex gap-2 flex-1\">\n <Input\n id=\"tags\"\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); handleAddTag(); } }}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.tagInputPlaceholder' })}\n className=\"flex-1 min-w-[120px]\"\n />\n <Button type=\"button\" size=\"sm\" onClick={handleAddTag} variant=\"outline\">\n <Plus className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n <span className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.predefinedTags' })}:\n </span>\n {predefinedTags.map((pt) => (\n <button\n key={pt}\n type=\"button\"\n onClick={() => { if (!tags.includes(pt)) setTags([...tags, pt]); }}\n disabled={tags.includes(pt)}\n className=\"text-xs px-2 py-0.5 rounded border border-border hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {pt}\n </button>\n ))}\n </div>\n </div>\n\n {/* JSON Config (all providers) */}\n <div className=\"space-y-2 pt-4 border-t border-border\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"configJson\" className=\"cursor-pointer\">\n {formatMessage({ id: 'apiSettings.cliSettings.configJson' })}\n </Label>\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\"\n onClick={() => setShowJsonInput(!showJsonInput)}\n >\n {showJsonInput\n ? formatMessage({ id: 'common.actions.close' })\n : formatMessage({ id: 'common.actions.expand' }, { value: 'JSON' })}\n </Button>\n </div>\n {showJsonInput && (\n <div className=\"space-y-2\">\n <Textarea\n id=\"configJson\"\n value={configJson}\n onChange={(e) => {\n setConfigJson(e.target.value);\n if (errors.configJson) {\n setErrors((prev) => { const n = { ...prev }; delete n.configJson; return n; });\n }\n }}\n placeholder={formatMessage({ id: 'apiSettings.cliSettings.configJsonPlaceholder' })}\n className={errors.configJson ? 'font-mono border-destructive' : 'font-mono'}\n rows={8}\n />\n {errors.configJson && <p className=\"text-xs text-destructive\">{errors.configJson}</p>}\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'apiSettings.cliSettings.configJsonHint' })}\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n {formatMessage({ id: 'common.actions.cancel' })}\n </Button>\n <Button onClick={handleSave} disabled={isCreating || isUpdating}>\n {(isCreating || isUpdating) ? (\n formatMessage({ id: 'common.actions.saving' })\n ) : (\n <>\n <Check className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.actions.save' })}\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default CliSettingsModal;\n","// ========================================\n// Multi-Key Settings Modal Component\n// ========================================\n// Modal for managing multiple API keys per provider\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n Plus,\n Trash2,\n Eye,\n EyeOff,\n Zap,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Switch } from '@/components/ui/Switch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { useProviders, useUpdateProvider } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\nimport type { RoutingStrategy } from '@/lib/api';\n\n// ========== Types ==========\n\nexport interface MultiKeySettingsModalProps {\n open: boolean;\n onClose: () => void;\n providerId: string;\n}\n\ninterface ApiKeyFormEntry {\n id: string;\n key: string;\n label?: string;\n weight?: number;\n enabled: boolean;\n}\n\n// ========== Helper Components ==========\n\ninterface ApiKeyEntryRowProps {\n entry: ApiKeyFormEntry;\n showKey: boolean;\n onToggleShowKey: () => void;\n onUpdate: (updates: Partial<ApiKeyFormEntry>) => void;\n onRemove: () => void;\n index: number;\n}\n\nfunction ApiKeyEntryRow({\n entry,\n showKey,\n onToggleShowKey,\n onUpdate,\n onRemove,\n index,\n}: ApiKeyEntryRowProps) {\n const { formatMessage } = useIntl();\n\n return (\n <div className=\"grid grid-cols-12 gap-2 items-start p-3 bg-muted/30 rounded-lg\">\n <div className=\"col-span-3\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyLabel' })}</Label>\n <Input\n value={entry.label || ''}\n onChange={(e) => onUpdate({ label: e.target.value })}\n placeholder={`Key ${index + 1}`}\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-4\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyValue' })}</Label>\n <div className=\"relative mt-1\">\n <Input\n type={showKey ? 'text' : 'password'}\n value={entry.key}\n onChange={(e) => onUpdate({ key: e.target.value })}\n placeholder=\"sk-...\"\n className=\"pr-8\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-2\"\n onClick={onToggleShowKey}\n >\n {showKey ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n <div className=\"col-span-2\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.keyWeight' })}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"100\"\n value={entry.weight ?? 1}\n onChange={(e) => onUpdate({ weight: parseInt(e.target.value) || 1 })}\n className=\"mt-1\"\n />\n </div>\n <div className=\"col-span-2 flex items-center gap-2 pt-5\">\n <Switch\n checked={entry.enabled}\n onCheckedChange={(enabled) => onUpdate({ enabled })}\n />\n <span className=\"text-sm text-muted-foreground\">\n {entry.enabled\n ? formatMessage({ id: 'apiSettings.common.enabled' })\n : formatMessage({ id: 'apiSettings.common.disabled' })}\n </span>\n </div>\n <div className=\"col-span-1 flex items-center justify-end pt-5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function MultiKeySettingsModal({ open, onClose, providerId }: MultiKeySettingsModalProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n const { providers } = useProviders();\n const { updateProvider, isUpdating } = useUpdateProvider();\n\n // Find provider\n const provider = providers.find((p) => p.id === providerId);\n\n // Form state\n const [apiKeys, setApiKeys] = useState<ApiKeyFormEntry[]>([]);\n const [showKeyIndices, setShowKeyIndices] = useState<Set<number>>(new Set());\n const [routingStrategy, setRoutingStrategy] = useState<RoutingStrategy>('simple-shuffle');\n\n // Health check state\n const [enableHealthCheck, setEnableHealthCheck] = useState(false);\n const [checkInterval, setCheckInterval] = useState(60);\n const [cooldownPeriod, setCooldownPeriod] = useState(300);\n const [failureThreshold, setFailureThreshold] = useState(5);\n\n // Initialize form from provider\n useEffect(() => {\n if (provider) {\n const hasMultiKeys = Boolean(provider.apiKeys && provider.apiKeys.length > 0);\n if (hasMultiKeys && provider.apiKeys) {\n setApiKeys(provider.apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })));\n } else if (provider.apiKey) {\n // Convert single key to multi-key format\n setApiKeys([{\n id: 'key-1',\n key: provider.apiKey,\n label: 'Key 1',\n weight: 1,\n enabled: true,\n }]);\n } else {\n setApiKeys([]);\n }\n\n setRoutingStrategy(provider.routingStrategy || 'simple-shuffle');\n\n // Health check\n if (provider.healthCheck) {\n setEnableHealthCheck(provider.healthCheck.enabled);\n setCheckInterval(provider.healthCheck.intervalSeconds);\n setCooldownPeriod(provider.healthCheck.cooldownSeconds);\n setFailureThreshold(provider.healthCheck.failureThreshold);\n }\n }\n }, [provider, open]);\n\n // Handlers\n const handleAddKey = () => {\n const newKey: ApiKeyFormEntry = {\n id: `key-${Date.now()}`,\n key: '',\n label: `Key ${apiKeys.length + 1}`,\n weight: 1,\n enabled: true,\n };\n setApiKeys([...apiKeys, newKey]);\n };\n\n const handleUpdateKey = (index: number, updates: Partial<ApiKeyFormEntry>) => {\n setApiKeys(apiKeys.map((k, i) => (i === index ? { ...k, ...updates } : k)));\n };\n\n const handleRemoveKey = (index: number) => {\n setApiKeys(apiKeys.filter((_, i) => i !== index));\n };\n\n const handleToggleShowKey = (index: number) => {\n setShowKeyIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n const handleSave = async () => {\n if (!provider) return;\n\n try {\n await updateProvider(providerId, {\n apiKey: '', // Clear single key when using multi-key\n apiKeys: apiKeys.map((k) => ({\n id: k.id,\n key: k.key,\n label: k.label,\n weight: k.weight,\n enabled: k.enabled,\n })),\n routingStrategy,\n healthCheck: enableHealthCheck ? {\n enabled: true,\n intervalSeconds: checkInterval,\n cooldownSeconds: cooldownPeriod,\n failureThreshold,\n } : undefined,\n });\n\n success(formatMessage({ id: 'apiSettings.providers.actions.save' }));\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n if (!provider) return null;\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'apiSettings.providers.multiKeySettings' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.providers.description' })}: {provider.name}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* API Keys */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.actions.multiKeySettings' })}</h3>\n <Button type=\"button\" size=\"sm\" onClick={handleAddKey}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addKey' })}\n </Button>\n </div>\n\n {apiKeys.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {apiKeys.map((entry, index) => (\n <ApiKeyEntryRow\n key={entry.id}\n entry={entry}\n showKey={showKeyIndices.has(index)}\n onToggleShowKey={() => handleToggleShowKey(index)}\n onUpdate={(updates) => handleUpdateKey(index, updates)}\n onRemove={() => handleRemoveKey(index)}\n index={index}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Routing Strategy */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"routingStrategy\">{formatMessage({ id: 'apiSettings.providers.routingStrategy' })}</Label>\n <Select value={routingStrategy} onValueChange={(v: RoutingStrategy) => setRoutingStrategy(v)}>\n <SelectTrigger id=\"routingStrategy\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"simple-shuffle\">{formatMessage({ id: 'apiSettings.providers.simpleShuffle' })}</SelectItem>\n <SelectItem value=\"weighted\">{formatMessage({ id: 'apiSettings.providers.weighted' })}</SelectItem>\n <SelectItem value=\"latency-based\">{formatMessage({ id: 'apiSettings.providers.latencyBased' })}</SelectItem>\n <SelectItem value=\"cost-based\">{formatMessage({ id: 'apiSettings.providers.costBased' })}</SelectItem>\n <SelectItem value=\"least-busy\">{formatMessage({ id: 'apiSettings.providers.leastBusy' })}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Health Check */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Label>{formatMessage({ id: 'apiSettings.providers.healthCheck' })}</Label>\n <Switch\n checked={enableHealthCheck}\n onCheckedChange={setEnableHealthCheck}\n />\n </div>\n {enableHealthCheck && (\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"checkInterval\">{formatMessage({ id: 'apiSettings.providers.checkInterval' })}</Label>\n <Input\n id=\"checkInterval\"\n type=\"number\"\n min=\"10\"\n value={checkInterval}\n onChange={(e) => setCheckInterval(parseInt(e.target.value) || 60)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"cooldownPeriod\">{formatMessage({ id: 'apiSettings.providers.cooldownPeriod' })}</Label>\n <Input\n id=\"cooldownPeriod\"\n type=\"number\"\n min=\"10\"\n value={cooldownPeriod}\n onChange={(e) => setCooldownPeriod(parseInt(e.target.value) || 300)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"failureThreshold\">{formatMessage({ id: 'apiSettings.providers.failureThreshold' })}</Label>\n <Input\n id=\"failureThreshold\"\n type=\"number\"\n min=\"1\"\n value={failureThreshold}\n onChange={(e) => setFailureThreshold(parseInt(e.target.value) || 5)}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isUpdating}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSave} disabled={isUpdating || apiKeys.length === 0}>\n {isUpdating ? (\n <Zap className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default MultiKeySettingsModal;\n","// ========================================\n// Manage Models Modal Component\n// ========================================\n// Modal for viewing and managing models available for a provider\n\nimport { useState, useEffect } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Check,\n Plus,\n Trash2,\n Zap,\n ChevronDown,\n ChevronUp,\n} from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/Dialog';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Label } from '@/components/ui/Label';\nimport { Switch } from '@/components/ui/Switch';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/Collapsible';\nimport { Badge } from '@/components/ui/Badge';\nimport { useProviders, useUpdateProvider } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\n\n// ========== Types ==========\n\nexport interface ManageModelsModalProps {\n open: boolean;\n onClose: () => void;\n providerId: string;\n}\n\ninterface ModelFormEntry {\n id: string;\n name: string;\n series?: string;\n contextWindow?: number;\n streaming?: boolean;\n functionCalling?: boolean;\n vision?: boolean;\n description?: string;\n}\n\n// ========== Helper Components ==========\n\ninterface ModelEntryRowProps {\n model: ModelFormEntry;\n onRemove: () => void;\n onUpdate: (field: keyof ModelFormEntry, value: string | number | boolean | undefined) => void;\n index: number;\n}\n\nfunction ModelEntryRow({\n model,\n onRemove,\n onUpdate,\n index,\n}: ModelEntryRowProps) {\n const { formatMessage } = useIntl();\n const [showDetails, setShowDetails] = useState(false);\n\n return (\n <div className=\"border rounded-lg p-3 space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 grid grid-cols-2 gap-2\">\n <Input\n value={model.name}\n onChange={(e) => onUpdate('name', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelId' })}\n className=\"font-medium\"\n />\n <Input\n value={model.series || ''}\n onChange={(e) => onUpdate('series', e.target.value)}\n placeholder={formatMessage({ id: 'apiSettings.providers.modelSeries' })}\n />\n </div>\n <div className=\"flex items-center gap-1\">\n <Collapsible open={showDetails} onOpenChange={setShowDetails}>\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\">\n {showDetails ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"w-full\">\n <div className=\"grid grid-cols-2 gap-2 mt-2 pt-2 border-t\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.contextWindow' })}</Label>\n <Input\n type=\"number\"\n value={model.contextWindow || ''}\n onChange={(e) => onUpdate('contextWindow', parseInt(e.target.value) || undefined)}\n placeholder=\"200000\"\n />\n </div>\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">{formatMessage({ id: 'apiSettings.providers.description' })}</Label>\n <Input\n value={model.description || ''}\n onChange={(e) => onUpdate('description', e.target.value)}\n placeholder=\"Optional description\"\n />\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n <div className=\"flex items-center gap-1\">\n <Switch\n checked={model.streaming}\n onCheckedChange={(checked) => onUpdate('streaming', checked)}\n id={`streaming-${index}`}\n />\n <Label htmlFor={`streaming-${index}`} className=\"text-xs cursor-pointer\">\n {formatMessage({ id: 'apiSettings.providers.streaming' })}\n </Label>\n </div>\n <div className=\"flex items-center gap-1\">\n <Switch\n checked={model.functionCalling}\n onCheckedChange={(checked) => onUpdate('functionCalling', checked)}\n id={`fc-${index}`}\n />\n <Label htmlFor={`fc-${index}`} className=\"text-xs cursor-pointer\">\n {formatMessage({ id: 'apiSettings.providers.functionCalling' })}\n </Label>\n </div>\n <div className=\"flex items-center gap-1\">\n <Switch\n checked={model.vision}\n onCheckedChange={(checked) => onUpdate('vision', checked)}\n id={`vision-${index}`}\n />\n <Label htmlFor={`vision-${index}`} className=\"text-xs cursor-pointer\">\n {formatMessage({ id: 'apiSettings.providers.vision' })}\n </Label>\n </div>\n </div>\n </CollapsibleContent>\n </Collapsible>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\n// ========== Main Component ==========\n\nexport function ManageModelsModal({ open, onClose, providerId }: ManageModelsModalProps) {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n const { providers } = useProviders();\n const { updateProvider, isUpdating } = useUpdateProvider();\n\n // Find provider\n const provider = providers.find((p) => p.id === providerId);\n\n // Form state\n const [llmModels, setLlmModels] = useState<ModelFormEntry[]>([]);\n const [embeddingModels, setEmbeddingModels] = useState<ModelFormEntry[]>([]);\n\n // Initialize form from provider\n useEffect(() => {\n if (provider) {\n if (provider.llmModels) {\n setLlmModels(provider.llmModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n if (provider.embeddingModels) {\n setEmbeddingModels(provider.embeddingModels.map((m) => ({\n id: m.id,\n name: m.name,\n series: m.series,\n description: m.description,\n })));\n }\n }\n }, [provider, open]);\n\n // Handlers\n const handleAddLlmModel = () => {\n const newModel: ModelFormEntry = {\n id: `llm-${Date.now()}`,\n name: '',\n series: '',\n };\n setLlmModels([...llmModels, newModel]);\n };\n\n const handleRemoveLlmModel = (index: number) => {\n setLlmModels(llmModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateLlmModel = (index: number, field: keyof ModelFormEntry, value: string | number | boolean | undefined) => {\n setLlmModels(llmModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleAddEmbeddingModel = () => {\n const newModel: ModelFormEntry = {\n id: `emb-${Date.now()}`,\n name: '',\n series: '',\n };\n setEmbeddingModels([...embeddingModels, newModel]);\n };\n\n const handleRemoveEmbeddingModel = (index: number) => {\n setEmbeddingModels(embeddingModels.filter((_, i) => i !== index));\n };\n\n const handleUpdateEmbeddingModel = (index: number, field: keyof ModelFormEntry, value: string | number | boolean | undefined) => {\n setEmbeddingModels(embeddingModels.map((m, i) => (i === index ? { ...m, [field]: value } : m)));\n };\n\n const handleSave = async () => {\n if (!provider) return;\n\n try {\n const now = new Date().toISOString();\n\n await updateProvider(providerId, {\n llmModels: llmModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'llm' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n embeddingModels: embeddingModels.filter((m) => m.name.trim()).map((m) => ({\n id: m.id,\n name: m.name,\n type: 'embedding' as const,\n series: m.series || m.name.split('-')[0],\n enabled: true,\n createdAt: now,\n updatedAt: now,\n })),\n });\n\n success(formatMessage({ id: 'apiSettings.providers.actions.save' }));\n onClose();\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n if (!provider) return null;\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{formatMessage({ id: 'apiSettings.providers.actions.manageModels' })}</DialogTitle>\n <DialogDescription>\n {formatMessage({ id: 'apiSettings.providers.description' })}: {provider.name}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* LLM Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.llmModels' })}</h3>\n <Badge variant=\"secondary\">{llmModels.length}</Badge>\n </div>\n <Button type=\"button\" size=\"sm\" onClick={handleAddLlmModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addLlmModel' })}\n </Button>\n </div>\n\n {llmModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {llmModels.map((model, index) => (\n <ModelEntryRow\n key={model.id}\n model={model}\n onRemove={() => handleRemoveLlmModel(index)}\n onUpdate={(field, value) => handleUpdateLlmModel(index, field, value)}\n index={index}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Embedding Models */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{formatMessage({ id: 'apiSettings.providers.embeddingModels' })}</h3>\n <Badge variant=\"secondary\">{embeddingModels.length}</Badge>\n </div>\n <Button type=\"button\" size=\"sm\" onClick={handleAddEmbeddingModel}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'apiSettings.providers.addEmbeddingModel' })}\n </Button>\n </div>\n\n {embeddingModels.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'apiSettings.providers.noModels' })}</p>\n ) : (\n <div className=\"space-y-2\">\n {embeddingModels.map((model, index) => (\n <ModelEntryRow\n key={model.id}\n model={model}\n onRemove={() => handleRemoveEmbeddingModel(index)}\n onUpdate={(field, value) => handleUpdateEmbeddingModel(index, field, value)}\n index={index}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isUpdating}>\n {formatMessage({ id: 'apiSettings.common.cancel' })}\n </Button>\n <Button onClick={handleSave} disabled={isUpdating}>\n {isUpdating ? (\n <Zap className=\"w-4 h-4 mr-2 animate-spin\" />\n ) : (\n <Check className=\"w-4 h-4 mr-2\" />\n )}\n {formatMessage({ id: 'apiSettings.common.save' })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default ManageModelsModal;\n","// ========================================\n// API Settings Page\n// ========================================\n// Main page for managing LiteLLM API providers, endpoints, cache, model pools, and CLI settings\n\nimport { useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Server,\n RefreshCw,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/Button';\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\nimport {\n ProviderList,\n ProviderModal,\n EndpointList,\n EndpointModal,\n CacheSettings,\n ModelPoolList,\n ModelPoolModal,\n CliSettingsList,\n CliSettingsModal,\n MultiKeySettingsModal,\n ManageModelsModal,\n} from '@/components/api-settings';\nimport { useProviders, useEndpoints, useModelPools, useCliSettings, useSyncApiConfig } from '@/hooks/useApiSettings';\nimport { useNotifications } from '@/hooks/useNotifications';\n\n// Tab type definitions\ntype TabType = 'providers' | 'endpoints' | 'cache' | 'modelPools' | 'cliSettings';\n\nexport function ApiSettingsPage() {\n const { formatMessage } = useIntl();\n const { success, error } = useNotifications();\n const [activeTab, setActiveTab] = useState<TabType>('providers');\n const syncMutation = useSyncApiConfig();\n\n // Get providers, endpoints, model pools, and CLI settings data\n const { providers } = useProviders();\n const { endpoints } = useEndpoints();\n const { pools } = useModelPools();\n const { cliSettings } = useCliSettings();\n\n // Modal states\n const [providerModalOpen, setProviderModalOpen] = useState(false);\n const [editingProviderId, setEditingProviderId] = useState<string | null>(null);\n const [endpointModalOpen, setEndpointModalOpen] = useState(false);\n const [editingEndpointId, setEditingEndpointId] = useState<string | null>(null);\n const [modelPoolModalOpen, setModelPoolModalOpen] = useState(false);\n const [editingPoolId, setEditingPoolId] = useState<string | null>(null);\n const [cliSettingsModalOpen, setCliSettingsModalOpen] = useState(false);\n const [editingCliSettingsId, setEditingCliSettingsId] = useState<string | null>(null);\n\n // Additional modal states for multi-key settings and model management\n const [multiKeyModalOpen, setMultiKeyModalOpen] = useState(false);\n const [multiKeyProviderId, setMultiKeyProviderId] = useState<string | null>(null);\n const [manageModelsModalOpen, setManageModelsModalOpen] = useState(false);\n const [manageModelsProviderId, setManageModelsProviderId] = useState<string | null>(null);\n\n // Find the provider being edited\n const editingProvider = useMemo(\n () => providers.find((p) => p.id === editingProviderId) || null,\n [providers, editingProviderId]\n );\n\n // Find the endpoint being edited\n const editingEndpoint = useMemo(\n () => endpoints.find((e) => e.id === editingEndpointId) || null,\n [endpoints, editingEndpointId]\n );\n\n // Find the pool being edited\n const editingPool = useMemo(\n () => pools.find((p) => p.id === editingPoolId) || null,\n [pools, editingPoolId]\n );\n\n // Find the CLI settings being edited\n const editingCliSettings = useMemo(\n () => cliSettings.find((s) => s.id === editingCliSettingsId) || null,\n [cliSettings, editingCliSettingsId]\n );\n\n // Provider modal handlers\n const handleAddProvider = () => {\n setEditingProviderId(null);\n setProviderModalOpen(true);\n };\n\n const handleEditProvider = (providerId: string) => {\n setEditingProviderId(providerId);\n setProviderModalOpen(true);\n };\n\n const handleCloseProviderModal = () => {\n setProviderModalOpen(false);\n setEditingProviderId(null);\n };\n\n // Endpoint modal handlers\n const handleAddEndpoint = () => {\n setEditingEndpointId(null);\n setEndpointModalOpen(true);\n };\n\n const handleEditEndpoint = (endpointId: string) => {\n setEditingEndpointId(endpointId);\n setEndpointModalOpen(true);\n };\n\n const handleCloseEndpointModal = () => {\n setEndpointModalOpen(false);\n setEditingEndpointId(null);\n };\n\n // Model pool modal handlers\n const handleAddPool = () => {\n setEditingPoolId(null);\n setModelPoolModalOpen(true);\n };\n\n const handleEditPool = (poolId: string) => {\n setEditingPoolId(poolId);\n setModelPoolModalOpen(true);\n };\n\n const handleClosePoolModal = () => {\n setModelPoolModalOpen(false);\n setEditingPoolId(null);\n };\n\n // CLI Settings modal handlers\n const handleAddCliSettings = () => {\n setEditingCliSettingsId(null);\n setCliSettingsModalOpen(true);\n };\n\n const handleEditCliSettings = (endpointId: string) => {\n setEditingCliSettingsId(endpointId);\n setCliSettingsModalOpen(true);\n };\n\n const handleCloseCliSettingsModal = () => {\n setCliSettingsModalOpen(false);\n setEditingCliSettingsId(null);\n };\n\n // Multi-key settings modal handlers\n const handleMultiKeySettings = (providerId: string) => {\n setMultiKeyProviderId(providerId);\n setMultiKeyModalOpen(true);\n };\n\n const handleCloseMultiKeyModal = () => {\n setMultiKeyModalOpen(false);\n setMultiKeyProviderId(null);\n };\n\n // Manage models modal handlers\n const handleManageModels = (providerId: string) => {\n setManageModelsProviderId(providerId);\n setManageModelsModalOpen(true);\n };\n\n const handleCloseManageModelsModal = () => {\n setManageModelsModalOpen(false);\n setManageModelsProviderId(null);\n };\n\n // Sync to CodexLens handler\n const handleSyncToCodexLens = async (providerId: string) => {\n const providerName = providers.find((p) => p.id === providerId)?.name ?? providerId;\n\n try {\n const result = await syncMutation.mutateAsync();\n const messageParts = [\n providerName,\n result.yamlPath ?? result.message,\n ].filter(Boolean);\n\n success(\n formatMessage({ id: 'apiSettings.messages.configSynced' }),\n messageParts.length > 0 ? messageParts.join('\\n') : undefined\n );\n } catch (err) {\n error(formatMessage({ id: 'apiSettings.providers.saveError' }));\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Page Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\n <Server className=\"w-6 h-6 text-primary\" />\n {formatMessage({ id: 'apiSettings.title' })}\n </h1>\n <p className=\"text-muted-foreground mt-1\">\n {formatMessage({ id: 'apiSettings.description' })}\n </p>\n </div>\n <Button variant=\"outline\" onClick={() => window.location.reload()}>\n <RefreshCw className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n </div>\n\n {/* Tabbed Interface */}\n <TabsNavigation\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as TabType)}\n tabs={[\n { value: 'providers', label: formatMessage({ id: 'apiSettings.tabs.providers' }) },\n { value: 'endpoints', label: formatMessage({ id: 'apiSettings.tabs.endpoints' }) },\n { value: 'cache', label: formatMessage({ id: 'apiSettings.tabs.cache' }) },\n { value: 'modelPools', label: formatMessage({ id: 'apiSettings.tabs.modelPools' }) },\n { value: 'cliSettings', label: formatMessage({ id: 'apiSettings.tabs.cliSettings' }) },\n ]}\n />\n\n {/* Tab Content */}\n {activeTab === 'providers' && (\n <div className=\"mt-4\">\n <ProviderList\n onAddProvider={handleAddProvider}\n onEditProvider={handleEditProvider}\n onMultiKeySettings={handleMultiKeySettings}\n onSyncToCodexLens={handleSyncToCodexLens}\n onManageModels={handleManageModels}\n />\n </div>\n )}\n\n {activeTab === 'endpoints' && (\n <div className=\"mt-4\">\n <EndpointList\n onAddEndpoint={handleAddEndpoint}\n onEditEndpoint={handleEditEndpoint}\n />\n </div>\n )}\n\n {activeTab === 'cache' && (\n <div className=\"mt-4\">\n <CacheSettings />\n </div>\n )}\n\n {activeTab === 'modelPools' && (\n <div className=\"mt-4\">\n <ModelPoolList\n onAddPool={handleAddPool}\n onEditPool={handleEditPool}\n />\n </div>\n )}\n\n {activeTab === 'cliSettings' && (\n <div className=\"mt-4\">\n <CliSettingsList\n onAddCliSettings={handleAddCliSettings}\n onEditCliSettings={handleEditCliSettings}\n />\n </div>\n )}\n\n {/* Modals */}\n <ProviderModal\n open={providerModalOpen}\n onClose={handleCloseProviderModal}\n provider={editingProvider}\n />\n <EndpointModal\n open={endpointModalOpen}\n onClose={handleCloseEndpointModal}\n endpoint={editingEndpoint}\n />\n <ModelPoolModal\n open={modelPoolModalOpen}\n onClose={handleClosePoolModal}\n pool={editingPool}\n />\n <CliSettingsModal\n open={cliSettingsModalOpen}\n onClose={handleCloseCliSettingsModal}\n cliSettings={editingCliSettings}\n />\n <MultiKeySettingsModal\n open={multiKeyModalOpen}\n onClose={handleCloseMultiKeyModal}\n providerId={multiKeyProviderId || ''}\n />\n <ManageModelsModal\n open={manageModelsModalOpen}\n onClose={handleCloseManageModelsModal}\n providerId={manageModelsProviderId || ''}\n />\n </div>\n );\n}\n\nexport default ApiSettingsPage;\n"],"names":["ProviderCard","provider","onEdit","onDelete","onTest","onMultiKeySettings","onSyncToCodexLens","onManageModels","onToggleEnabled","isDeleting","isTesting","isToggling","formatMessage","useIntl","multiKeyCount","_a","k","hasMultiKeys","_b","getHealthBadge","jsx","Badge","keys","healthyCount","Card","jsxs","Zap","Switch","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","Edit","Settings","CheckCircle2","DropdownMenuSeparator","Trash2","ProviderList","onAddProvider","onEditProvider","error","useNotifications","searchQuery","setSearchQuery","useState","showDisabledOnly","setShowDisabledOnly","providers","isLoading","refetch","useProviders","deleteProvider","useDeleteProvider","updateProvider","isUpdating","useUpdateProvider","testProvider","useTestProvider","triggerHealthCheck","useTriggerProviderHealthCheck","filteredProviders","useMemo","matchesSearch","matchesFilter","handleDeleteProvider","providerId","providerName","confirmMessage","handleToggleEnabled","enabled","handleTestProvider","enabledCount","p","totalCount","cn","Plus","AlertCircle","Search","Input","e","prev","XCircle","i","ApiKeyEntryRow","entry","showKey","onToggleShowKey","onUpdate","onRemove","Label","EyeOff","Eye","ProviderModal","open","onClose","isEditing","createProvider","isCreating","useCreateProvider","name","setName","type","setType","apiKey","setApiKey","apiBase","setApiBase","setEnabled","showAdvanced","setShowAdvanced","timeout","setTimeout","maxRetries","setMaxRetries","organization","setOrganization","apiVersion","setApiVersion","customHeaders","setCustomHeaders","rpm","setRpm","tpm","setTpm","proxy","setProxy","useMultiKey","setUseMultiKey","apiKeys","setApiKeys","showKeyIndices","setShowKeyIndices","routingStrategy","setRoutingStrategy","enableHealthCheck","setEnableHealthCheck","checkInterval","setCheckInterval","cooldownPeriod","setCooldownPeriod","failureThreshold","setFailureThreshold","showModels","setShowModels","llmModels","setLlmModels","embeddingModels","setEmbeddingModels","useEffect","m","handleAddKey","newKey","handleUpdateKey","index","updates","handleRemoveKey","_","handleToggleShowKey","next","handleAddLlmModel","newModel","handleRemoveLlmModel","handleUpdateLlmModel","field","value","handleAddEmbeddingModel","handleRemoveEmbeddingModel","handleUpdateEmbeddingModel","handleSubmit","parsedHeaders","now","providerData","isSaving","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","Collapsible","CollapsibleTrigger","ChevronUp","ChevronDown","CollapsibleContent","Textarea","model","DialogFooter","Check","EndpointCard","endpoint","Database","EndpointList","onAddEndpoint","onEditEndpoint","showCachedOnly","setShowCachedOnly","endpoints","cachedCount","useEndpoints","deleteEndpoint","useDeleteEndpoint","updateEndpoint","useUpdateEndpoint","filteredEndpoints","matchesDisabledFilter","matchesCacheFilter","handleDeleteEndpoint","endpointId","endpointName","FilePatternInput","onChange","placeholder","inputValue","setInputValue","handleAddPattern","handleRemovePattern","pattern","EndpointModal","createEndpoint","useCreateEndpoint","id","setId","setProviderId","setModel","description","setDescription","showCacheSettings","setShowCacheSettings","enableCache","setEnableCache","cacheTTL","setCacheTTL","cacheMaxSize","setCacheMaxSize","filePatterns","setFilePatterns","availableModels","models","endpointData","isValid","modelId","Fragment","CacheUsageIndicator","used","total","percentage","Progress","StatCard","icon","label","className","CacheSettings","success","stats","useCacheStats","updateCacheSettings","useUpdateCacheSettings","clearCache","isClearing","useClearCache","settings","setSettings","showClearDialog","setShowClearDialog","handleSave","err","handleClearCache","FileText","HardDrive","checked","Save","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","PoolCard","pool","getModelTypeBadge","variantMap","labelMap","getStrategyLabel","ModelPoolList","onAddPool","onEditPool","pools","useModelPools","deleteModelPool","useDeleteModelPool","updateModelPool","useUpdateModelPool","filterType","setFilterType","deletePoolId","setDeletePoolId","togglingPoolId","setTogglingPoolId","filteredPools","typeCounts","handleDelete","poolId","Layers","defaultFormData","ProviderDiscoveryItem","excluded","onToggle","Checkbox","ModelPoolModal","warning","formData","setFormData","hasDiscovered","setHasDiscovered","createModelPool","useCreateModelPool","discoverModels","isDiscovering","discoveredResponse","useDiscoverModelsForPool","availableModelsResponse","isLoadingModels","useAvailableModelsForPool","isEdit","handleInputChange","key","handleAutoDiscover","handleToggleProvider","poolData","discoveredProviders","includedCount","Loader2","Info","X","CliSettingsCard","cliSettings","getProviderBadge","variants","config","getStatusBadge","endpointUrl","env","LinkIcon","CliSettingsList","onAddCliSettings","onEditCliSettings","providerCounts","useCliSettings","deleteCliSettings","useDeleteCliSettings","toggleCliSettings","useToggleCliSettings","filteredSettings","query","s","parseConfigText","text","format","trimmed","CliSettingsModal","defaultProvider","createCliSettings","useCreateCliSettings","updateCliSettings","useUpdateCliSettings","cliProvider","setCliProvider","mode","setMode","authToken","setAuthToken","baseUrl","setBaseUrl","showToken","setShowToken","settingsFile","setSettingsFile","codexApiKey","setCodexApiKey","codexBaseUrl","setCodexBaseUrl","codexProfile","setCodexProfile","showCodexKey","setShowCodexKey","authJson","setAuthJson","configToml","setConfigToml","writeCommonConfig","setWriteCommonConfig","geminiApiKey","setGeminiApiKey","showGeminiKey","setShowGeminiKey","geminiSettingsJson","setGeminiSettingsJson","isLoadingGeminiConfig","setIsLoadingGeminiConfig","setAvailableModels","modelInput","setModelInput","tags","setTags","tagInput","setTagInput","configJson","setConfigJson","showJsonInput","setShowJsonInput","errors","setErrors","isLoadingCodexConfig","setIsLoadingCodexConfig","matchingProvider","validateForm","newErrors","parsed","handleLoadCodexConfig","result","fetchCodexConfigPreview","handleLoadGeminiConfig","fetchGeminiConfigPreview","extra","request","handleAddModel","handleRemoveModel","x","handleAddTag","handleRemoveTag","t","predefinedTags","selectedProvider","providerLabel","Tabs","TabsList","TabsTrigger","TabsContent","Download","n","formatted","tag","pt","MultiKeySettingsModal","ModelEntryRow","showDetails","setShowDetails","ManageModelsModal","ApiSettingsPage","activeTab","setActiveTab","syncMutation","useSyncApiConfig","providerModalOpen","setProviderModalOpen","editingProviderId","setEditingProviderId","endpointModalOpen","setEndpointModalOpen","editingEndpointId","setEditingEndpointId","modelPoolModalOpen","setModelPoolModalOpen","editingPoolId","setEditingPoolId","cliSettingsModalOpen","setCliSettingsModalOpen","editingCliSettingsId","setEditingCliSettingsId","multiKeyModalOpen","setMultiKeyModalOpen","multiKeyProviderId","setMultiKeyProviderId","manageModelsModalOpen","setManageModelsModalOpen","manageModelsProviderId","setManageModelsProviderId","editingProvider","editingEndpoint","editingPool","editingCliSettings","handleAddProvider","handleEditProvider","handleCloseProviderModal","handleAddEndpoint","handleEditEndpoint","handleCloseEndpointModal","handleAddPool","handleEditPool","handleClosePoolModal","handleAddCliSettings","handleEditCliSettings","handleCloseCliSettingsModal","handleMultiKeySettings","handleCloseMultiKeyModal","handleManageModels","handleCloseManageModelsModal","handleSyncToCodexLens","messageParts","Server","RefreshCw","TabsNavigation"],"mappings":"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"}