From ccb0842d0ab35fd2e67e1d46dc8cffcb3705ddac Mon Sep 17 00:00:00 2001 From: decolua Date: Fri, 17 Jul 2026 12:12:20 +0700 Subject: [PATCH] fix(dashboard): cut duplicate API/icon spam, lazy-load provider assets Share one /api/models fetch via useModelCaps cache, mount ModelSelectModal only when open, stop double fetchModelAliases on CLI tool cards, and resolve provider icons through a session 404 cache with missing PNGs + loading=lazy. Also include Claude Exa MCP toggle (claude-settings + ClaudeToolCard) that was already in the working tree. Co-authored-by: Cursor --- public/providers/agentrouter.png | Bin 0 -> 7847 bytes public/providers/codebuddy-cn.png | Bin 23433 -> 17688 bytes public/providers/commandcode.png | Bin 6585 -> 9335 bytes public/providers/featherless.png | Bin 0 -> 3881 bytes public/providers/gitlab.png | Bin 0 -> 3109 bytes public/providers/longcat.png | Bin 0 -> 5968 bytes public/providers/mmf.png | Bin 0 -> 2630 bytes public/providers/morph.png | Bin 0 -> 2584 bytes public/providers/novita.png | Bin 0 -> 1306 bytes public/providers/perplexity-agent.png | Bin 0 -> 10678 bytes public/providers/qoder.png | Bin 7197 -> 6054 bytes public/providers/reka.png | Bin 0 -> 2492 bytes public/providers/venice.png | Bin 0 -> 6010 bytes public/providers/vercel-ai-gateway.png | Bin 0 -> 2081 bytes public/providers/vercel.png | Bin 0 -> 2081 bytes .../basic-chat/BasicChatPageClient.js | 2 +- .../components/AntigravityToolCard.js | 35 +++--- .../cli-tools/components/ClaudeToolCard.js | 36 +++++-- .../cli-tools/components/ClineToolCard.js | 27 ++--- .../cli-tools/components/CodexToolCard.js | 47 ++++---- .../cli-tools/components/CopilotToolCard.js | 51 ++++----- .../cli-tools/components/CoworkToolCard.js | 46 ++++---- .../components/DeepSeekTuiToolCard.js | 27 ++--- .../cli-tools/components/DefaultToolCard.js | 34 ++++-- .../cli-tools/components/DroidToolCard.js | 27 ++--- .../cli-tools/components/GrokBuildToolCard.js | 27 ++--- .../cli-tools/components/HermesToolCard.js | 27 ++--- .../cli-tools/components/JcodeToolCard.js | 27 ++--- .../cli-tools/components/KiloToolCard.js | 27 ++--- .../cli-tools/components/MitmLinkCard.js | 2 + .../cli-tools/components/MitmToolCard.js | 22 ++-- .../cli-tools/components/OpenClawToolCard.js | 27 ++--- .../cli-tools/components/OpenCodeToolCard.js | 81 +++++++------- .../cli-tools/components/ToolSummaryCard.js | 2 +- src/app/(dashboard)/dashboard/combos/page.js | 100 +++++++++--------- .../[id]/components/GenericExampleCard.js | 8 ++ .../media-providers/combo/[id]/page.js | 28 ++--- .../providers/components/ModelsCard.js | 12 +-- .../(dashboard)/dashboard/providers/page.js | 5 +- .../usage/components/ProviderLimits/index.js | 30 +++--- .../usage/components/ProviderTopology.js | 21 +++- .../api/cli-tools/claude-settings/route.js | 50 ++++++++- src/shared/components/ComboFormModal.js | 12 ++- src/shared/components/DonateModal.js | 2 + src/shared/components/Header.js | 5 +- src/shared/components/McpMarketplaceModal.js | 2 +- src/shared/components/ProviderIcon.js | 25 ++++- src/shared/hooks/useModelCaps.js | 89 ++++++++++------ src/shared/utils/index.js | 1 + src/shared/utils/providerIcon.js | 40 +++++++ 50 files changed, 612 insertions(+), 392 deletions(-) create mode 100644 public/providers/agentrouter.png create mode 100644 public/providers/featherless.png create mode 100644 public/providers/gitlab.png create mode 100644 public/providers/longcat.png create mode 100644 public/providers/mmf.png create mode 100644 public/providers/morph.png create mode 100644 public/providers/novita.png create mode 100644 public/providers/perplexity-agent.png create mode 100644 public/providers/reka.png create mode 100644 public/providers/venice.png create mode 100644 public/providers/vercel-ai-gateway.png create mode 100644 public/providers/vercel.png create mode 100644 src/shared/utils/providerIcon.js diff --git a/public/providers/agentrouter.png b/public/providers/agentrouter.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5ca60d4915777824cf5094eef3f6e3b0a6e7c0 GIT binary patch literal 7847 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 M@)~lLGUnm`1KGF09{>OV literal 0 HcmV?d00001 diff --git a/public/providers/codebuddy-cn.png b/public/providers/codebuddy-cn.png index eae3f4c1752e24c43a98e811a081a06c82e2260e..c836282f29512e354728c001c7f49086f401af0a 100644 GIT binary patch literal 17688 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 XY#OJ9MLDRA00000NkvXXu0mjfL3md! literal 23433 zcmXt;Wl$Vlw}m0NyCi7P;31H~hXe@@!68_19VEEBI|O%khr!+5Z3dUYgS%bcTlM|u z?y9cp?o;RVS$nT%@6ey}5?JUT(Ba_Vu%sl#l-{n1{~f5vZ)ZVxyDd04TsSGQ?~_j&3+isjUM=5Z3RgK zahh0JCf}A)hsc%|m2bZaC}p#l6*kbX7E&7~LvZQ{B5)oEzTQ~Nl}mnNj4%E772eU) zKxguqX(+2Si`k(yX{2fANvbk&QTtDKpD`qI&|0dzBOuHO63OLJTE?i4)KWHA!5&Em zl|#E}!aphraKpcO8m2VhpNtO`^plZq|01icy@g`-k}gQN zrsO)xL(Y41=)2iXhmbJPAUuGFGb4l414*2tb}0>Ck3f#9?Z6+WRv$&+;_LI;fDDH# zxq4NGe7Vd76nx0Gr{I#QqX(o77DOrh`&(vT+(`~nT|#12Fd1#2rBmKYN2C

LvTR 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 literal 6585 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 BMFs!> diff --git a/public/providers/featherless.png b/public/providers/featherless.png new file mode 100644 index 0000000000000000000000000000000000000000..b918a0ff05e07aa91053aedba9ab099ade5fd28d GIT binary patch literal 3881 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 literal 0 HcmV?d00001 diff --git a/public/providers/gitlab.png b/public/providers/gitlab.png new file mode 100644 index 0000000000000000000000000000000000000000..9c790b1a18f2afb6f4e8387222b9822831743696 GIT binary patch literal 3109 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 literal 0 HcmV?d00001 diff --git a/public/providers/longcat.png b/public/providers/longcat.png new file mode 100644 index 0000000000000000000000000000000000000000..e72dffb9dc1780a41968f860659f92f14cd7037b GIT binary patch literal 5968 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 LDPJ#V8Tx+!Sh%H` literal 0 HcmV?d00001 diff --git a/public/providers/qoder.png b/public/providers/qoder.png index 41e81c1d3760fa47678a9a99d7e105b010298163..be87ec619f2c4177c47786fa52c2c99ead26079c 100644 GIT binary patch literal 6054 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 F{|||6QP}_h literal 7197 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 diff --git a/public/providers/reka.png b/public/providers/reka.png new file mode 100644 index 0000000000000000000000000000000000000000..000162576afdfc2a891ba28f201aeb042be1bca6 GIT binary patch literal 2492 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 literal 0 HcmV?d00001 diff --git a/public/providers/vercel-ai-gateway.png b/public/providers/vercel-ai-gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..0319f0e6ef867a74444d4a88c06fc9dce90667fb GIT binary patch literal 2081 zcmb7_dpy(s9>>3%VZyQKLc;8aT$XFfWx3@VA(u6x%{?p)xs=vEib94- z$|W|!$hBe=GFpCx$U)}*;3m9&DqgLeBY6M004;F*;=~n zlDH?R(C+)j#HV`~phy=R3!t*^==a?rHUMK6c7kW1SI>nw+5*K z0{_{A0U#w9fc%wl+~r=`?rQJmzZ570{gvL`6@vdx6AK0Y=l9OyK-y-z5FyxlL;`@Q z)Sf`V!#rsK5Vo+hGsj8Y1V&Cz%U}dC!T=~$>oz=Fl+CkH(UnX(1 zrtKt5Pft$Ms^{#hUnY@(^K6{LF28;Pj(LM=62@G!g}zB>N&rK2A6({FOXVC)M6(6vI*hePJU~ix3=MwD&@n6j4BD-iFaoUQ>}s zxm$fUQ)KMs;wN=qSJPKUedC*ilw{Vb+(Ur!yN-P(l-_1=?n1!mmP`$g$WoI|Hoo>r z6X%-5R1ECU)Q2+^)|-VwJt@vxGRBcvA(D0At!)xn9p}oV0|AB1Eol?U{s z)!QXN3G7~D1_oU*Yw#d9`rt|qFs$OWiPzP!DHA5WAP;Nj?jj;@s`5rz8(E8w;U4U- z*Nj>}ipt*BKr-Lu-I`1ykuN1w^N)$@>J(kb3P%3)OG|ce_$KM!<$4Lp-5WH|B?uAN zJ#6*FNgh_>q}_sggLk_YGBH{OQKS?FdA<(HR(>}68QGai_dK6_RY1Yox{KLiSbAi~ z4F!oCZNa<~3s*->(#&dSx^>_hy7m@hGD|`Z?NuGbo_iziZB83?XRM_Pj|k{CN^*kb zZhkXOF5|CAXUWOjpe|f3{ru0)+A}W`*E%!BjLZCBD|fUjwgbgFe`2tDtUpFsY}oQz zGx*dAO)U8G)o8UpYGC;E#yE@o-fggx?vGosXb(|QK@E4N|I8BQ2R_2PWGXIq(_gms zDWahYS610NaQ*Ia8Dr|K>)WPOe09yY6V3%Jv7>ysj;k&t_sdIwgE!bXL&dwQTnKOop=Q^Jdr~a$U{W1PqcuZ!@3v zSMWNe2-X!!{nr(bw7(dsMUr!4XL@_P=Zk0E+;fd_Qyu_aF!X&o-@NUZc4#^BSGnq#Etm9!h?N<4i^?Cvl$jt$0rs*Pm@)7~=)? z=6!Rf{M(SOQG*SiFFzRC@oB|9=R=#Ev`^T?`DK3!1f$2PtP*Mx&m(`1A3gOx=D=wg z4bl}TULGHLo|ybusM3-hnPD^=y9`nJ&0?F|HXDV=zvDP|_wn#xm>y2tqx>goLV@)dnc_I^^zuxhU%oO!VHff~A^7eaj;CKPnCwl}O{C~CDe!hf7gAKP}#=C9rtF^Oo Kw5+ti-TV`eu$o~2 literal 0 HcmV?d00001 diff --git a/public/providers/vercel.png b/public/providers/vercel.png new file mode 100644 index 0000000000000000000000000000000000000000..0319f0e6ef867a74444d4a88c06fc9dce90667fb GIT binary patch literal 2081 zcmb7_dpy(s9>>3%VZyQKLc;8aT$XFfWx3@VA(u6x%{?p)xs=vEib94- z$|W|!$hBe=GFpCx$U)}*;3m9&DqgLeBY6M004;F*;=~n zlDH?R(C+)j#HV`~phy=R3!t*^==a?rHUMK6c7kW1SI>nw+5*K z0{_{A0U#w9fc%wl+~r=`?rQJmzZ570{gvL`6@vdx6AK0Y=l9OyK-y-z5FyxlL;`@Q z)Sf`V!#rsK5Vo+hGsj8Y1V&Cz%U}dC!T=~$>oz=Fl+CkH(UnX(1 zrtKt5Pft$Ms^{#hUnY@(^K6{LF28;Pj(LM=62@G!g}zB>N&rK2A6({FOXVC)M6(6vI*hePJU~ix3=MwD&@n6j4BD-iFaoUQ>}s zxm$fUQ)KMs;wN=qSJPKUedC*ilw{Vb+(Ur!yN-P(l-_1=?n1!mmP`$g$WoI|Hoo>r z6X%-5R1ECU)Q2+^)|-VwJt@vxGRBcvA(D0At!)xn9p}oV0|AB1Eol?U{s z)!QXN3G7~D1_oU*Yw#d9`rt|qFs$OWiPzP!DHA5WAP;Nj?jj;@s`5rz8(E8w;U4U- z*Nj>}ipt*BKr-Lu-I`1ykuN1w^N)$@>J(kb3P%3)OG|ce_$KM!<$4Lp-5WH|B?uAN zJ#6*FNgh_>q}_sggLk_YGBH{OQKS?FdA<(HR(>}68QGai_dK6_RY1Yox{KLiSbAi~ z4F!oCZNa<~3s*->(#&dSx^>_hy7m@hGD|`Z?NuGbo_iziZB83?XRM_Pj|k{CN^*kb zZhkXOF5|CAXUWOjpe|f3{ru0)+A}W`*E%!BjLZCBD|fUjwgbgFe`2tDtUpFsY}oQz zGx*dAO)U8G)o8UpYGC;E#yE@o-fggx?vGosXb(|QK@E4N|I8BQ2R_2PWGXIq(_gms zDWahYS610NaQ*Ia8Dr|K>)WPOe09yY6V3%Jv7>ysj;k&t_sdIwgE!bXL&dwQTnKOop=Q^Jdr~a$U{W1PqcuZ!@3v zSMWNe2-X!!{nr(bw7(dsMUr!4XL@_P=Zk0E+;fd_Qyu_aF!X&o-@NUZc4#^BSGnq#Etm9!h?N<4i^?Cvl$jt$0rs*Pm@)7~=)? z=6!Rf{M(SOQG*SiFFzRC@oB|9=R=#Ev`^T?`DK3!1f$2PtP*Mx&m(`1A3gOx=D=wg z4bl}TULGHLo|ybusM3-hnPD^=y9`nJ&0?F|HXDV=zvDP|_wn#xm>y2tqx>goLV@)dnc_I^^zuxhU%oO!VHff~A^7eaj;CKPnCwl}O{C~CDe!hf7gAKP}#=C9rtF^Oo Kw5+ti-TV`eu$o~2 literal 0 HcmV?d00001 diff --git a/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js b/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js index a97d0a5e..f9331074 100644 --- a/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +++ b/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js @@ -891,7 +891,7 @@ export default function BasicChatPageClient() {

diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js b/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js index 48962cca..6a7339d3 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +++ b/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js @@ -38,15 +38,10 @@ export default function AntigravityToolCard({ }, [initialStatus]); useEffect(() => { - if (isExpanded && !status) { - fetchStatus(); - loadSavedMappings(); - fetchModelAliases(); - } - if (isExpanded) { - loadSavedMappings(); - fetchModelAliases(); - } + if (!isExpanded) return; + if (!status) fetchStatus(); + loadSavedMappings(); + fetchModelAliases(); }, [isExpanded]); const loadSavedMappings = async () => { @@ -243,6 +238,8 @@ export default function AntigravityToolCard({ className="size-8 object-contain rounded-lg" sizes="32px" onError={(e) => { e.target.style.display = "none"; }} + loading="lazy" + decoding="async" />
@@ -467,15 +464,17 @@ export default function AntigravityToolCard({ {/* Model Select Modal */} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={currentEditingAlias ? modelMappings[currentEditingAlias] : null} - activeProviders={activeProviders} - modelAliases={modelAliases} - title={`Select model for ${currentEditingAlias}`} - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={currentEditingAlias ? modelMappings[currentEditingAlias] : null} + activeProviders={activeProviders} + modelAliases={modelAliases} + title={`Select model for ${currentEditingAlias}`} + /> + )} ); } diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js b/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js index 589d847a..9268475d 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +++ b/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js @@ -39,6 +39,7 @@ export default function ClaudeToolCard({ const [showManualConfigModal, setShowManualConfigModal] = useState(false); const [customBaseUrl, setCustomBaseUrl] = useState(""); const [ccFilterNaming, setCcFilterNaming] = useState(false); + const [exaMcpEnabled, setExaMcpEnabled] = useState(false); const hasInitializedModels = useRef(false); const getConfigStatus = () => { @@ -58,15 +59,17 @@ export default function ClaudeToolCard({ }, [apiKeys, selectedApiKey]); useEffect(() => { - if (initialStatus) setClaudeStatus(initialStatus); + if (initialStatus) { + setClaudeStatus(initialStatus); + setExaMcpEnabled(!!initialStatus.exaMcpEnabled); + } }, [initialStatus]); useEffect(() => { - if (isExpanded && !claudeStatus) { - checkClaudeStatus(); + if (isExpanded) { + if (!claudeStatus) checkClaudeStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); useEffect(() => { @@ -123,6 +126,7 @@ export default function ClaudeToolCard({ const res = await fetch("/api/cli-tools/claude-settings"); const data = await res.json(); setClaudeStatus(data); + setExaMcpEnabled(!!data.exaMcpEnabled); } catch (error) { setClaudeStatus({ installed: false, error: error.message }); } finally { @@ -162,12 +166,12 @@ export default function ClaudeToolCard({ const res = await fetch("/api/cli-tools/claude-settings", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ env }), + body: JSON.stringify({ env, exaMcpEnabled }), }); const data = await res.json(); if (res.ok) { setMessage({ type: "success", text: "Settings applied successfully!" }); - setClaudeStatus(prev => ({ ...prev, hasBackup: true, settings: { ...prev?.settings, env } })); + setClaudeStatus(prev => ({ ...prev, hasBackup: true, settings: { ...prev?.settings, env }, exaMcpEnabled })); } else { setMessage({ type: "error", text: data.error || "Failed to apply settings" }); } @@ -188,6 +192,7 @@ export default function ClaudeToolCard({ setMessage({ type: "success", text: "Settings reset successfully!" }); tool.defaultModels.forEach((model) => onModelMappingChange(model.alias, model.defaultValue || "")); setSelectedApiKey(""); + setExaMcpEnabled(false); } else { setMessage({ type: "error", text: data.error || "Failed to reset settings" }); } @@ -231,7 +236,7 @@ export default function ClaudeToolCard({
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -352,6 +357,19 @@ export default function ClaudeToolCard({
+ + {/* Exa MCP — ~/.claude.json mcpServers (not settings.json) */} +
+ Web Search + arrow_forward + +
{message && ( @@ -377,7 +395,9 @@ export default function ClaudeToolCard({
)} - setModalOpen(false)} onSelect={handleModelSelect} selectedModel={currentEditingAlias ? modelMappings[currentEditingAlias] : null} activeProviders={activeProviders} modelAliases={modelAliases} title={`Select model for ${currentEditingAlias}`} /> + {modalOpen && ( + setModalOpen(false)} onSelect={handleModelSelect} selectedModel={currentEditingAlias ? modelMappings[currentEditingAlias] : null} activeProviders={activeProviders} modelAliases={modelAliases} title={`Select model for ${currentEditingAlias}`} /> + )} { - if (isExpanded && !status) { - checkStatus(); + if (isExpanded) { + if (!status) checkStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); useEffect(() => { @@ -157,7 +156,7 @@ export default function ClineToolCard({ tool, isExpanded, onToggle, baseUrl, api
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -280,15 +279,17 @@ export default function ClineToolCard({ tool, isExpanded, onToggle, baseUrl, api
)} - setModalOpen(false)} - onSelect={(model) => { setSelectedModel(model.value); setModalOpen(false); }} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for Cline" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={(model) => { setSelectedModel(model.value); setModalOpen(false); }} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for Cline" + /> + )} { - if (isExpanded && !codexStatus) { - checkCodexStatus(); + if (isExpanded) { + if (!codexStatus) checkCodexStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -199,7 +198,7 @@ model = "${effectiveSubagentModel}"
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -371,25 +370,29 @@ model = "${effectiveSubagentModel}"
)} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for Codex" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for Codex" + /> + )} - setSubagentModalOpen(false)} - onSelect={(model) => { setSubagentModel(model.value); setSubagentModalOpen(false); }} - selectedModel={subagentModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Subagent Model for Codex" - /> + {subagentModalOpen && ( + setSubagentModalOpen(false)} + onSelect={(model) => { setSubagentModel(model.value); setSubagentModalOpen(false); }} + selectedModel={subagentModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Subagent Model for Codex" + /> + )} { - if (isExpanded && !status) { - checkStatus(); + if (isExpanded) { + if (!status) checkStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); // Pre-fill from existing config @@ -184,7 +183,7 @@ export default function CopilotToolCard({ tool, isExpanded, onToggle, baseUrl, a
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -290,27 +289,29 @@ export default function CopilotToolCard({ tool, isExpanded, onToggle, baseUrl, a
)} - { - setModalOpen(false); - saveModels(selectedModelsRef.current); - }} - onSelect={(model) => { - if (!selectedModels.includes(model.value)) { - setSelectedModels([...selectedModels, model.value]); - } - }} - onDeselect={(model) => { - setSelectedModels(selectedModels.filter(m => m !== model.value)); - }} - selectedModel={null} - activeProviders={activeProviders} - modelAliases={modelAliases} - addedModelValues={selectedModels} - closeOnSelect={false} - title="Add Model for GitHub Copilot" - /> + {modalOpen && ( + { + setModalOpen(false); + saveModels(selectedModelsRef.current); + }} + onSelect={(model) => { + if (!selectedModels.includes(model.value)) { + setSelectedModels([...selectedModels, model.value]); + } + }} + onDeselect={(model) => { + setSelectedModels(selectedModels.filter(m => m !== model.value)); + }} + selectedModel={null} + activeProviders={activeProviders} + modelAliases={modelAliases} + addedModelValues={selectedModels} + closeOnSelect={false} + title="Add Model for GitHub Copilot" + /> + )}
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -514,27 +514,31 @@ export default function CoworkToolCard({ configs={getManualConfigs()} /> - setComboModalOpen(false)} - onSave={handleCreateCombo} - activeProviders={activeProviders} - forcePrefix="claude-" - title="Create Cowork Combo" - /> + {comboModalOpen && ( + setComboModalOpen(false)} + onSave={handleCreateCombo} + activeProviders={activeProviders} + forcePrefix="claude-" + title="Create Cowork Combo" + /> + )} - setModelSelectOpen(false)} - onSelect={handleAddModel} - onDeselect={handleRemoveModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Cowork Model" - addedModelValues={selectedModels} - closeOnSelect={false} - /> + {modelSelectOpen && ( + setModelSelectOpen(false)} + onSelect={handleAddModel} + onDeselect={handleRemoveModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Cowork Model" + addedModelValues={selectedModels} + closeOnSelect={false} + /> + )} { - if (isExpanded && !deepseekStatus) { - checkStatus(); + if (isExpanded) { + if (!deepseekStatus) checkStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -187,7 +186,7 @@ model = "${selectedModel || "provider/model-id"}"
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -317,15 +316,17 @@ model = "${selectedModel || "provider/model-id"}"
)} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for DeepSeek TUI" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for DeepSeek TUI" + /> + )} { e.target.style.display = "none"; }} + loading="lazy" + decoding="async" /> ); } if (tool.icon) { return {tool.icon}; } + const iconSrc = getProviderIconSrc(toolId); + if (!iconSrc) { + return {(toolId || "?").slice(0, 2).toUpperCase()}; + } return ( {tool.name} { e.target.style.display = "none"; }} + onError={(e) => { + markProviderIconMissing(toolId); + e.target.style.display = "none"; + }} + loading="lazy" + decoding="async" /> ); }; @@ -257,14 +269,16 @@ export default function DefaultToolCard({ toolId, tool, isExpanded, onToggle, ba
)} - setShowModelModal(false)} - onSelect={handleSelectModel} - selectedModel={modelValue} - activeProviders={activeProviders} - title="Select Model" - /> + {showModelModal && ( + setShowModelModal(false)} + onSelect={handleSelectModel} + selectedModel={modelValue} + activeProviders={activeProviders} + title="Select Model" + /> + )} ); } diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js b/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js index 7e8e2eac..adc2a7ae 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +++ b/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js @@ -60,11 +60,10 @@ export default function DroidToolCard({ }, [initialStatus]); useEffect(() => { - if (isExpanded && !droidStatus) { - checkDroidStatus(); + if (isExpanded) { + if (!droidStatus) checkDroidStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -225,7 +224,7 @@ export default function DroidToolCard({
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -389,15 +388,17 @@ export default function DroidToolCard({
)} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={null} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for Factory Droid" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={null} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for Factory Droid" + /> + )} { - if (isExpanded && !grokStatus) { - checkStatus(); + if (isExpanded) { + if (!grokStatus) checkStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -203,6 +202,8 @@ api_key = "${keyToUse}" className="size-8 object-contain rounded-lg" sizes="32px" onError={(e) => { e.target.style.display = "none"; }} + loading="lazy" + decoding="async" />
@@ -366,15 +367,17 @@ api_key = "${keyToUse}"
)} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for Grok Build" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for Grok Build" + /> + )} { - if (isExpanded && !hermesStatus) { - checkStatus(); + if (isExpanded) { + if (!hermesStatus) checkStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -185,7 +184,7 @@ export default function HermesToolCard({
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -296,15 +295,17 @@ export default function HermesToolCard({
)} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for Hermes Agent" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for Hermes Agent" + /> + )} { - if (isExpanded && !jcodeStatus) { - checkJcodeStatus(); + if (isExpanded) { + if (!jcodeStatus) checkJcodeStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -215,7 +214,7 @@ id = "${selectedModel || "cc/claude-opus-4-7"}"`;
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -359,15 +358,17 @@ id = "${selectedModel || "cc/claude-opus-4-7"}"`;
)} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for jcode" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for jcode" + /> + )} { - if (isExpanded && !status) { - checkStatus(); + if (isExpanded) { + if (!status) checkStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -144,7 +143,7 @@ export default function KiloToolCard({ tool, isExpanded, onToggle, baseUrl, apiK
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -254,15 +253,17 @@ export default function KiloToolCard({ tool, isExpanded, onToggle, baseUrl, apiK
)} - setModalOpen(false)} - onSelect={(model) => { setSelectedModel(model.value); setModalOpen(false); }} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for Kilo Code" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={(model) => { setSelectedModel(model.value); setModalOpen(false); }} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for Kilo Code" + /> + )} { e.target.style.display = "none"; }} + loading="lazy" + decoding="async" />
diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js b/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js index 82384292..3ca51d2e 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +++ b/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js @@ -143,6 +143,8 @@ export default function MitmToolCard({ className="size-8 object-contain rounded-lg" sizes="32px" onError={(e) => { e.target.style.display = "none"; }} + loading="lazy" + decoding="async" />
@@ -304,15 +306,17 @@ export default function MitmToolCard({ )} {/* Model Select Modal */} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={currentEditingAlias ? modelMappings[currentEditingAlias] : null} - activeProviders={activeProviders} - modelAliases={modelAliases} - title={`Select model for ${currentEditingAlias}`} - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={currentEditingAlias ? modelMappings[currentEditingAlias] : null} + activeProviders={activeProviders} + modelAliases={modelAliases} + title={`Select model for ${currentEditingAlias}`} + /> + )} ); } diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js b/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js index 88a73c63..b646a6eb 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +++ b/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js @@ -57,11 +57,10 @@ export default function OpenClawToolCard({ }, [initialStatus]); useEffect(() => { - if (isExpanded && !openclawStatus) { - checkOpenclawStatus(); + if (isExpanded) { + if (!openclawStatus) checkOpenclawStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); const fetchModelAliases = async () => { @@ -233,7 +232,7 @@ export default function OpenClawToolCard({
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -367,15 +366,17 @@ export default function OpenClawToolCard({
)} - setModalOpen(false)} - onSelect={handleModelSelect} - selectedModel={selectedModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Model for Open Claw" - /> + {modalOpen && ( + setModalOpen(false)} + onSelect={handleModelSelect} + selectedModel={selectedModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Model for Open Claw" + /> + )} { - if (isExpanded && !status) { - checkStatus(); + if (isExpanded) { + if (!status) checkStatus(); fetchModelAliases(); } - if (isExpanded) fetchModelAliases(); }, [isExpanded]); // Sync models from existing config @@ -222,7 +221,7 @@ export default function OpenCodeToolCard({ tool, isExpanded, onToggle, baseUrl,
- {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" />
@@ -452,42 +451,46 @@ export default function OpenCodeToolCard({ tool, isExpanded, onToggle, baseUrl,
)} - { - setModalOpen(false); - saveModels(selectedModelsRef.current); - }} - onSelect={(model) => { - if (!selectedModels.includes(model.value)) { - setSelectedModels([...selectedModels, model.value]); - if (!activeModel) setActiveModel(model.value); - } - }} - onDeselect={(model) => { - const remaining = selectedModels.filter(m => m !== model.value); - setSelectedModels(remaining); - if (activeModel === model.value) { - setActiveModel(remaining[0] || ""); - } - }} - selectedModel={null} - activeProviders={activeProviders} - modelAliases={modelAliases} - addedModelValues={selectedModels} - closeOnSelect={false} - title="Add Model for OpenCode" - /> + {modalOpen && ( + { + setModalOpen(false); + saveModels(selectedModelsRef.current); + }} + onSelect={(model) => { + if (!selectedModels.includes(model.value)) { + setSelectedModels([...selectedModels, model.value]); + if (!activeModel) setActiveModel(model.value); + } + }} + onDeselect={(model) => { + const remaining = selectedModels.filter(m => m !== model.value); + setSelectedModels(remaining); + if (activeModel === model.value) { + setActiveModel(remaining[0] || ""); + } + }} + selectedModel={null} + activeProviders={activeProviders} + modelAliases={modelAliases} + addedModelValues={selectedModels} + closeOnSelect={false} + title="Add Model for OpenCode" + /> + )} - setSubagentModalOpen(false)} - onSelect={(model) => { setSubagentModel(model.value); setSubagentModalOpen(false); }} - selectedModel={subagentModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Select Subagent Model for OpenCode" - /> + {subagentModalOpen && ( + setSubagentModalOpen(false)} + onSelect={(model) => { setSubagentModel(model.value); setSubagentModalOpen(false); }} + selectedModel={subagentModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Select Subagent Model for OpenCode" + /> + )}
{tool.image ? ( - {tool.name} { e.target.style.display = "none"; }} /> + {tool.name} { e.target.style.display = "none"; }} loading="lazy" decoding="async" /> ) : tool.icon ? ( {tool.icon} ) : null} diff --git a/src/app/(dashboard)/dashboard/combos/page.js b/src/app/(dashboard)/dashboard/combos/page.js index abfc215c..fb4c17d6 100644 --- a/src/app/(dashboard)/dashboard/combos/page.js +++ b/src/app/(dashboard)/dashboard/combos/page.js @@ -7,6 +7,7 @@ import { CSS } from "@dnd-kit/utilities"; import { restrictToVerticalAxis, restrictToParentElement } from "@dnd-kit/modifiers"; import { Card, Button, Modal, Input, CardSkeleton, ModelSelectModal, ConfirmModal, CapacityBadges, Select } from "@/shared/components"; import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard"; +import { useModelCaps } from "@/shared/hooks/useModelCaps"; import { isOpenAICompatibleProvider, isAnthropicCompatibleProvider } from "@/shared/constants/providers"; // Validate combo name: only a-z, A-Z, 0-9, -, _ @@ -19,7 +20,7 @@ export default function CombosPage() { const [editingCombo, setEditingCombo] = useState(null); const [activeProviders, setActiveProviders] = useState([]); const [comboStrategies, setComboStrategies] = useState({}); - const [modelCaps, setModelCaps] = useState({}); + const { getCaps } = useModelCaps(); const [confirmState, setConfirmState] = useState(null); const { copied, copy } = useCopyToClipboard(); @@ -29,11 +30,10 @@ export default function CombosPage() { const fetchData = async () => { try { - const [combosRes, providersRes, settingsRes, modelsRes] = await Promise.all([ + const [combosRes, providersRes, settingsRes] = await Promise.all([ fetch("/api/combos"), fetch("/api/providers"), fetch("/api/settings"), - fetch("/api/models"), ]); const combosData = await combosRes.json(); const providersData = await providersRes.json(); @@ -44,13 +44,6 @@ export default function CombosPage() { if (providersRes.ok) { setActiveProviders(providersData.connections || []); } - if (modelsRes.ok) { - const md = await modelsRes.json(); - // Build fullModel -> caps map for badge lookup - const map = {}; - for (const m of md.models || []) if (m.caps) map[m.fullModel] = m.caps; - setModelCaps(map); - } setComboStrategies(settingsData.comboStrategies || {}); } catch (error) { console.log("Error fetching data:", error); @@ -189,7 +182,7 @@ export default function CombosPage() { setShowCreateModal(false)} - onSave={handleCreate} - activeProviders={activeProviders} - /> + {showCreateModal && ( + setShowCreateModal(false)} + onSave={handleCreate} + activeProviders={activeProviders} + /> + )} - {/* Edit Modal - Use key to force remount and reset state */} - setEditingCombo(null)} - onSave={(data) => handleUpdate(editingCombo.id, data)} - activeProviders={activeProviders} - /> + {editingCombo && ( + setEditingCombo(null)} + onSave={(data) => handleUpdate(editingCombo.id, data)} + activeProviders={activeProviders} + /> + )} {/* Confirm Delete Modal */} ( {model} - + )) )} @@ -340,15 +336,17 @@ function ComboCard({ combo, modelCaps = {}, activeProviders = [], copied, onCopy
{/* Judge model picker (single-select; combo members make natural judges too) */} - setShowJudgeSelect(false)} - onSelect={(m) => { onSetStrategy({ judgeModel: m?.value || "" }); setShowJudgeSelect(false); }} - activeProviders={activeProviders} - title="Select Judge Model" - addedModelValues={judge ? [judge] : []} - closeOnSelect={true} - /> + {showJudgeSelect && ( + setShowJudgeSelect(false)} + onSelect={(m) => { onSetStrategy({ judgeModel: m?.value || "" }); setShowJudgeSelect(false); }} + activeProviders={activeProviders} + title="Select Judge Model" + addedModelValues={judge ? [judge] : []} + closeOnSelect={true} + /> + )} ); } @@ -637,18 +635,20 @@ function ComboFormModal({ isOpen, combo, onClose, onSave, activeProviders, kindF {/* Model Select Modal */} - setShowModelSelect(false)} - onSelect={handleAddModel} - onDeselect={handleDeselectModel} - activeProviders={activeProviders} - modelAliases={modelAliases} - title="Add Model to Combo" - kindFilter={kindFilter} - addedModelValues={models} - closeOnSelect={false} - /> + {showModelSelect && ( + setShowModelSelect(false)} + onSelect={handleAddModel} + onDeselect={handleDeselectModel} + activeProviders={activeProviders} + modelAliases={modelAliases} + title="Add Model to Combo" + kindFilter={kindFilter} + addedModelValues={models} + closeOnSelect={false} + /> + )} ); } diff --git a/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/components/GenericExampleCard.js b/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/components/GenericExampleCard.js index 815528d7..76c571b8 100644 --- a/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/components/GenericExampleCard.js +++ b/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/components/GenericExampleCard.js @@ -350,6 +350,8 @@ export function GenericExampleCard({ providerId, kind }) { className="max-h-40 rounded-lg border border-border object-contain bg-sidebar" onError={(e) => { e.currentTarget.style.display = "none"; }} onLoad={(e) => { e.currentTarget.style.display = "block"; }} + loading="lazy" + decoding="async" /> )}
@@ -383,6 +385,8 @@ export function GenericExampleCard({ providerId, kind }) { className="max-h-40 rounded-lg border border-border object-contain bg-sidebar" onError={(e) => { e.currentTarget.style.display = "none"; }} onLoad={(e) => { e.currentTarget.style.display = "block"; }} + loading="lazy" + decoding="async" /> )}
@@ -487,6 +491,8 @@ export function GenericExampleCard({ providerId, kind }) { src={`data:image/png;base64,${partialImage.b64_json}`} alt="Partial" className="max-w-full rounded-lg border border-border mt-1.5 opacity-80" + loading="lazy" + decoding="async" />
)} @@ -529,6 +535,8 @@ export function GenericExampleCard({ providerId, kind }) { src={binaryImageUrl || (result?.data?.data?.[0]?.b64_json ? `data:image/png;base64,${result.data.data[0].b64_json}` : result?.data?.data?.[0]?.url)} alt="Generated" className="max-w-full rounded-lg border border-border" + loading="lazy" + decoding="async" />
)} diff --git a/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js b/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js index 45c15460..7ad8b673 100644 --- a/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +++ b/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js @@ -357,7 +357,7 @@ export default function ComboDetailPage() { Download
- Generated + Generated
)} {testResult.audioUrl && ( @@ -393,18 +393,20 @@ export default function ComboDetailPage() { )} - setShowPicker(false)} - onSelect={handleAddModel} - onDeselect={handleDeselectModel} - activeProviders={connections} - modelAliases={modelAliases} - title={`Add ${kindLabel} Model`} - kindFilter={combo.kind} - addedModelValues={providers} - closeOnSelect={false} - /> + {showPicker && ( + setShowPicker(false)} + onSelect={handleAddModel} + onDeselect={handleDeselectModel} + activeProviders={connections} + modelAliases={modelAliases} + title={`Add ${kindLabel} Model`} + kindFilter={combo.kind} + addedModelValues={providers} + closeOnSelect={false} + /> + )}
); } diff --git a/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js b/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js index a6d9533e..9bdf4b41 100644 --- a/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +++ b/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js @@ -116,26 +116,22 @@ export default function ModelsCard({ providerId, kindFilter, providerAliasOverri const [testingModelId, setTestingModelId] = useState(null); const [testError, setTestError] = useState(""); const [showAddCustomModel, setShowAddCustomModel] = useState(false); - const [connections, setConnections] = useState([]); const providerAlias = providerAliasOverride || getProviderAlias(providerId); const effectiveType = kindFilter || "llm"; const fetchData = useCallback(async () => { try { - const [aliasRes, connRes, customRes] = await Promise.all([ + const [aliasRes, customRes] = await Promise.all([ fetch("/api/models/alias"), - fetch("/api/providers", { cache: "no-store" }), fetch("/api/models/custom", { cache: "no-store" }), ]); const aliasData = await aliasRes.json(); - const connData = await connRes.json(); const customData = await customRes.json(); if (aliasRes.ok) setModelAliases(aliasData.aliases || {}); - if (connRes.ok) setConnections((connData.connections || []).filter((c) => c.provider === providerId)); if (customRes.ok) setCustomModels(customData.models || []); } catch (e) { console.log("ModelsCard fetch error:", e); } - }, [providerId]); + }, []); useEffect(() => { fetchData(); }, [fetchData]); @@ -242,7 +238,7 @@ export default function ModelsCard({ providerId, kindFilter, providerAliasOverri onSetAlias={(alias) => handleSetAlias(model.id, alias)} onDeleteAlias={() => handleDeleteAlias(existingAlias)} testStatus={modelTestResults[model.id]} - onTest={connections.length > 0 ? () => handleTestModel(model.id) : undefined} + onTest={() => handleTestModel(model.id)} isTesting={testingModelId === model.id} isFree={model.isFree} /> @@ -259,7 +255,7 @@ export default function ModelsCard({ providerId, kindFilter, providerAliasOverri onSetAlias={() => {}} onDeleteAlias={() => handleDeleteCustomModel(model.id)} testStatus={modelTestResults[model.id]} - onTest={connections.length > 0 ? () => handleTestModel(model.id) : undefined} + onTest={() => handleTestModel(model.id)} isTesting={testingModelId === model.id} isCustom /> diff --git a/src/app/(dashboard)/dashboard/providers/page.js b/src/app/(dashboard)/dashboard/providers/page.js index dd134f33..61461726 100644 --- a/src/app/(dashboard)/dashboard/providers/page.js +++ b/src/app/(dashboard)/dashboard/providers/page.js @@ -10,6 +10,7 @@ import { Toggle, } from "@/shared/components"; import ProviderIcon from "@/shared/components/ProviderIcon"; +import { getProviderIconSrc } from "@/shared/utils/providerIcon"; import { OAUTH_PROVIDERS, APIKEY_PROVIDERS } from "@/shared/constants/config"; import { FREE_PROVIDERS, @@ -756,12 +757,12 @@ function ApiKeyProviderCard({ }; const getIconPath = () => { - if (isCompatible) + if (isCompatible && provider.apiType) return provider.apiType === "responses" ? "/providers/oai-r.png" : "/providers/oai-cc.png"; if (isAnthropicCompatible) return "/providers/anthropic-m.png"; - return `/providers/${provider.id}.png`; + return getProviderIconSrc(provider.id); }; return ( diff --git a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js index babfa6e2..a0396897 100644 --- a/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +++ b/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js @@ -1265,22 +1265,24 @@ export default function ProviderLimits() { /> )} {hiddenQuotaRows.length > 0 && ( -
- +
+ visibility_off - Hidden: - {hiddenQuotaRows.map((quotaRow) => ( - - ))} + Hidden: +
+ {hiddenQuotaRows.map((quotaRow) => ( + + ))} +
)}
diff --git a/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js b/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js index 3827a0f8..57b217a3 100644 --- a/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +++ b/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js @@ -10,6 +10,7 @@ import { } from "@xyflow/react"; import "@xyflow/react/dist/style.css"; import { AI_PROVIDERS } from "@/shared/constants/providers"; +import { getProviderIconSrc, markProviderIconMissing } from "@/shared/utils/providerIcon"; // Force-stop FE animation if a provider stays active longer than this const FE_ACTIVE_TIMEOUT_MS = 60000; @@ -19,9 +20,8 @@ function getProviderConfig(providerId) { return AI_PROVIDERS[providerId] || { color: "#6b7280", name: providerId }; } -// Use local provider images from /public/providers/ function getProviderImageUrl(providerId) { - return `/providers/${providerId}.png`; + return getProviderIconSrc(providerId); } // Custom provider node - rectangle with image + name @@ -47,8 +47,19 @@ function ProviderNode({ data }) { className="w-8 h-8 rounded-md flex items-center justify-center shrink-0" style={{ backgroundColor: `${color}15` }} > - {!imgError ? ( - {label} setImgError(true)} /> + {imageUrl && !imgError ? ( + {label} { + const m = imageUrl?.match(/^\/providers\/([^/]+)\.png$/i); + if (m) markProviderIconMissing(m[1]); + setImgError(true); + }} + /> ) : ( {textIcon} )} @@ -86,7 +97,7 @@ function RouterNode({ data }) { - 9Router + 9Router 9Router {data.activeCount > 0 && ( diff --git a/src/app/api/cli-tools/claude-settings/route.js b/src/app/api/cli-tools/claude-settings/route.js index bb5fa06f..b831e395 100644 --- a/src/app/api/cli-tools/claude-settings/route.js +++ b/src/app/api/cli-tools/claude-settings/route.js @@ -6,15 +6,52 @@ import { promisify } from "util"; import fs from "fs/promises"; import path from "path"; import os from "os"; +import { DEFAULT_PLUGINS } from "@/shared/constants/coworkPlugins"; const execAsync = promisify(exec); +// Exa MCP def — reuse from coworkPlugins (DRY). +const EXA_PLUGIN = DEFAULT_PLUGINS.find((p) => p.name === "exa"); +const buildExaMcpEntry = () => ({ + type: EXA_PLUGIN.transport, + url: EXA_PLUGIN.url, +}); + // Get claude settings path based on OS const getClaudeSettingsPath = () => { const homeDir = os.homedir(); return path.join(homeDir, ".claude", "settings.json"); }; +// Claude Code CLI reads mcpServers from ~/.claude.json (NOT settings.json). +const getClaudeJsonPath = () => path.join(os.homedir(), ".claude.json"); + +const readClaudeJson = async () => { + try { + const content = await fs.readFile(getClaudeJsonPath(), "utf-8"); + return JSON.parse(content.replace(/,(\s*[}\]])/g, "$1")); + } catch { + return null; + } +}; + +const writeClaudeJsonMcp = async (mcpServers) => { + const filePath = getClaudeJsonPath(); + let data = {}; + try { + data = JSON.parse(await fs.readFile(filePath, "utf-8")); + } catch (error) { + if (error.code !== "ENOENT") throw error; + } + if (mcpServers && Object.keys(mcpServers).length > 0) { + data.mcpServers = { ...(data.mcpServers || {}), ...mcpServers }; + } else if (data.mcpServers) { + delete data.mcpServers.exa; + if (Object.keys(data.mcpServers).length === 0) delete data.mcpServers; + } + await fs.writeFile(filePath, JSON.stringify(data, null, 2)); +}; + // Check if claude CLI is installed (via which/where or config file exists) const checkClaudeInstalled = async () => { @@ -65,11 +102,13 @@ export async function GET() { const settings = await readSettings(); const has9Router = !!(settings?.env?.ANTHROPIC_BASE_URL); + const claudeJson = await readClaudeJson(); return NextResponse.json({ installed: true, settings: settings, has9Router: has9Router, + exaMcpEnabled: !!claudeJson?.mcpServers?.exa, settingsPath: getClaudeSettingsPath(), }); } catch (error) { @@ -84,7 +123,7 @@ export async function GET() { // POST - Backup old fields and write new settings export async function POST(request) { try { - const { env } = await request.json(); + const { env, exaMcpEnabled } = await request.json(); if (!env || typeof env !== "object") { return NextResponse.json( @@ -130,6 +169,11 @@ export async function POST(request) { // Write new settings await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2)); + // Exa MCP toggle — write to ~/.claude.json (CLI reads mcpServers from here). + if (EXA_PLUGIN) { + await writeClaudeJsonMcp(exaMcpEnabled ? { exa: buildExaMcpEntry() } : null); + } + return NextResponse.json({ success: true, message: "Settings updated successfully", @@ -185,6 +229,9 @@ export async function DELETE() { } } + // Remove injected MCP servers (Exa) from ~/.claude.json + await writeClaudeJsonMcp(null); + // Write updated settings await fs.writeFile(settingsPath, JSON.stringify(currentSettings, null, 2)); @@ -200,4 +247,3 @@ export async function DELETE() { ); } } - diff --git a/src/shared/components/ComboFormModal.js b/src/shared/components/ComboFormModal.js index d80732da..ca022f80 100644 --- a/src/shared/components/ComboFormModal.js +++ b/src/shared/components/ComboFormModal.js @@ -166,11 +166,13 @@ export default function ComboFormModal({ isOpen, combo, onClose, onSave, activeP
- setShowModelSelect(false)} - onSelect={handleAddModel} onDeselect={handleDeselectModel} - activeProviders={activeProviders} modelAliases={modelAliases} - title="Add Model to Combo" kindFilter={kindFilter} - addedModelValues={models} closeOnSelect={false} /> + {showModelSelect && ( + setShowModelSelect(false)} + onSelect={handleAddModel} onDeselect={handleDeselectModel} + activeProviders={activeProviders} modelAliases={modelAliases} + title="Add Model to Combo" kindFilter={kindFilter} + addedModelValues={models} closeOnSelect={false} /> + )} ); } diff --git a/src/shared/components/DonateModal.js b/src/shared/components/DonateModal.js index bf1e9af5..e4f3daea 100644 --- a/src/shared/components/DonateModal.js +++ b/src/shared/components/DonateModal.js @@ -106,6 +106,8 @@ function DonateChannelCard({ channel }) { src={qr} alt={`${label} QR`} className="w-full max-w-[180px] aspect-square object-contain rounded-lg bg-white p-1" + loading="lazy" + decoding="async" /> )} diff --git a/src/shared/components/Header.js b/src/shared/components/Header.js index f70a0128..c3bbe606 100644 --- a/src/shared/components/Header.js +++ b/src/shared/components/Header.js @@ -12,6 +12,7 @@ import DonateModal from "@/shared/components/DonateModal"; import { useHeaderSearchStore } from "@/store/headerSearchStore"; import { OAUTH_PROVIDERS, APIKEY_PROVIDERS } from "@/shared/constants/config"; import { MEDIA_PROVIDER_KINDS, AI_PROVIDERS } from "@/shared/constants/providers"; +import { getProviderIconSrc } from "@/shared/utils/providerIcon"; import { translate } from "@/i18n/runtime"; const getPageInfo = (pathname) => { @@ -30,7 +31,7 @@ const getPageInfo = (pathname) => { breadcrumbs: [ { label: "Media Providers", href: `/dashboard/media-providers/${kindId}` }, { label: kindConfig?.label || kindId, href: `/dashboard/media-providers/${kindId}` }, - { label: provider?.name || providerId, image: `/providers/${providerId}.png` }, + { label: provider?.name || providerId, image: getProviderIconSrc(providerId) }, ], }; } @@ -62,7 +63,7 @@ const getPageInfo = (pathname) => { { label: "Providers", href: "/dashboard/providers" }, { label: providerInfo.name, - image: `/providers/${providerInfo.id}.png`, + image: getProviderIconSrc(providerInfo.id), }, ], }; diff --git a/src/shared/components/McpMarketplaceModal.js b/src/shared/components/McpMarketplaceModal.js index 5b18dfb5..826ad260 100644 --- a/src/shared/components/McpMarketplaceModal.js +++ b/src/shared/components/McpMarketplaceModal.js @@ -154,7 +154,7 @@ export default function McpMarketplaceModal({ isOpen, onClose, onAdd, addedNames
{s.iconUrl ? ( // eslint-disable-next-line @next/next/no-img-element - { e.target.style.display = "none"; }} /> + { e.target.style.display = "none"; }} loading="lazy" decoding="async" /> ) : (
)} diff --git a/src/shared/components/ProviderIcon.js b/src/shared/components/ProviderIcon.js index ca558508..f69342e3 100644 --- a/src/shared/components/ProviderIcon.js +++ b/src/shared/components/ProviderIcon.js @@ -2,18 +2,29 @@ import { useState } from "react"; import PropTypes from "prop-types"; +import { getProviderIconSrc, markProviderIconMissing } from "@/shared/utils/providerIcon"; + +function resolveSrc(src, providerId) { + if (providerId) return getProviderIconSrc(providerId); + if (!src) return null; + const m = String(src).match(/^\/providers\/([^/]+)\.png$/i); + if (m) return getProviderIconSrc(m[1]); + return src; +} export default function ProviderIcon({ src, + providerId, alt, size = 32, className = "", fallbackText = "?", fallbackColor, }) { + const effectiveSrc = resolveSrc(src, providerId); const [errored, setErrored] = useState(false); - if (!src || errored) { + if (!effectiveSrc || errored) { return ( setErrored(true)} + loading="lazy" + decoding="async" + onError={() => { + const m = effectiveSrc.match(/^\/providers\/([^/]+)\.png$/i); + if (m) markProviderIconMissing(m[1]); + if (providerId) markProviderIconMissing(providerId); + setErrored(true); + }} /> ); } ProviderIcon.propTypes = { src: PropTypes.string, + providerId: PropTypes.string, alt: PropTypes.string, size: PropTypes.number, className: PropTypes.string, diff --git a/src/shared/hooks/useModelCaps.js b/src/shared/hooks/useModelCaps.js index 3dbdcdd4..e6fb4c52 100644 --- a/src/shared/hooks/useModelCaps.js +++ b/src/shared/hooks/useModelCaps.js @@ -1,44 +1,73 @@ "use client"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useCallback } from "react"; import { getCapabilitiesForModel } from "open-sse/providers/capabilities.js"; -// Fetch model capabilities once and expose a lookup by fullModel ("provider/model") or bare model id. +// Module cache: one /api/models fetch shared by every useModelCaps instance. +let cache = null; // { byFull, byId } | null +let inflight = null; + +function buildMaps(models) { + const byFull = {}; + const byId = {}; + for (const m of models || []) { + if (!m.caps) continue; + if (m.fullModel) byFull[m.fullModel] = m.caps; + if (m.model) byId[m.model] = m.caps; + } + return { byFull, byId }; +} + +function loadModelCaps() { + if (cache) return Promise.resolve(cache); + if (inflight) return inflight; + inflight = fetch("/api/models") + .then(async (res) => { + if (!res.ok) throw new Error(`models ${res.status}`); + const data = await res.json(); + cache = buildMaps(data.models); + return cache; + }) + .catch(() => { + // Keep null so a later mount can retry + return { byFull: {}, byId: {} }; + }) + .finally(() => { inflight = null; }); + return inflight; +} + +// Resolve caps from a "provider/model" string or a bare model id. +function resolveCaps(byFull, byId, key) { + if (!key) return null; + if (byFull[key]) return byFull[key]; + const bare = key.includes("/") ? key.slice(key.indexOf("/") + 1) : key; + if (byId[bare]) return byId[bare]; + const provider = key.includes("/") ? key.slice(0, key.indexOf("/")) : null; + const c = getCapabilitiesForModel(provider, bare); + return { vision: c.vision, search: c.search, reasoning: c.reasoning }; +} + export function useModelCaps() { - const [byFull, setByFull] = useState({}); - const [byId, setById] = useState({}); + const [byFull, setByFull] = useState(() => cache?.byFull || {}); + const [byId, setById] = useState(() => cache?.byId || {}); useEffect(() => { + if (cache) { + setByFull(cache.byFull); + setById(cache.byId); + return; + } let alive = true; - (async () => { - try { - const res = await fetch("/api/models"); - if (!res.ok) return; - const data = await res.json(); - const full = {}; - const id = {}; - for (const m of data.models || []) { - if (!m.caps) continue; - if (m.fullModel) full[m.fullModel] = m.caps; - if (m.model) id[m.model] = m.caps; - } - if (alive) { setByFull(full); setById(id); } - } catch { /* ignore */ } - })(); + loadModelCaps().then((maps) => { + if (alive) { setByFull(maps.byFull); setById(maps.byId); } + }); return () => { alive = false; }; }, []); - // Resolve caps from a "provider/model" string or a bare model id. - const getCaps = (key) => { - if (!key) return null; - if (byFull[key]) return byFull[key]; - const bare = key.includes("/") ? key.slice(key.indexOf("/") + 1) : key; - if (byId[bare]) return byId[bare]; - // Fallback: compute caps for dynamic models (passthrough/custom/suggested) not in static list - const provider = key.includes("/") ? key.slice(0, key.indexOf("/")) : null; - const c = getCapabilitiesForModel(provider, bare); - return { vision: c.vision, search: c.search, reasoning: c.reasoning }; - }; + const getCaps = useCallback( + (key) => resolveCaps(byFull, byId, key), + [byFull, byId], + ); return { getCaps }; } diff --git a/src/shared/utils/index.js b/src/shared/utils/index.js index f64461ab..72fc1a5a 100644 --- a/src/shared/utils/index.js +++ b/src/shared/utils/index.js @@ -1,6 +1,7 @@ // Shared Utils - Export all export { cn } from "./cn"; export * as api from "./api"; +export { getProviderIconSrc, markProviderIconMissing, resolveProviderIconId } from "./providerIcon"; import { v4 as uuidv4 } from "uuid"; diff --git a/src/shared/utils/providerIcon.js b/src/shared/utils/providerIcon.js new file mode 100644 index 00000000..32167d14 --- /dev/null +++ b/src/shared/utils/providerIcon.js @@ -0,0 +1,40 @@ +// Provider icon paths under /public/providers. +// Alias related brands; session-cache 404s so one miss never spams again. + +const ICON_ALIASES = { + "perplexity-agent": "perplexity", + "gitlab-duo": "gitlab", + "vercel-ai-gateway": "vercel", +}; + +// Runtime only — first 404 remembers id for the whole session +const failedIds = new Set(); + +function normalizeId(providerId) { + if (!providerId || typeof providerId !== "string") return ""; + return providerId.trim().toLowerCase(); +} + +/** Resolve icon file id (after alias). Empty if previously failed this session. */ +export function resolveProviderIconId(providerId) { + const id = normalizeId(providerId); + if (!id) return ""; + if (failedIds.has(id)) return ""; + const aliased = ICON_ALIASES[id] || id; + if (failedIds.has(aliased)) return ""; + return aliased; +} + +/** `/providers/{id}.png` or null when previously failed. */ +export function getProviderIconSrc(providerId) { + const id = resolveProviderIconId(providerId); + return id ? `/providers/${id}.png` : null; +} + +/** Call from img onError so later mounts skip the request. */ +export function markProviderIconMissing(providerId) { + const id = normalizeId(providerId); + if (id) failedIds.add(id); + const aliased = ICON_ALIASES[id]; + if (aliased) failedIds.add(aliased); +}