From eb6e06c589dc00568f3d796d38fdedb748d42879 Mon Sep 17 00:00:00 2001 From: coso Date: Sun, 14 Dec 2025 18:44:38 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E8=BF=90=E8=A1=8C=20prettier=20?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复了 26 个文件的代码格式问题,确保符合项目的 prettier 配置。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- src/components/Dashboard.tsx | 16 +- src/components/api-server/ApiServerPage.tsx | 19 +- src/components/clients/AppTabs.tsx | 2 +- src/components/clients/LiveConfigModal.tsx | 13 +- src/components/clients/ProviderCard.tsx | 4 +- src/components/clients/ProviderForm.tsx | 187 +++++++++++++----- src/components/clients/ProviderList.tsx | 6 +- .../credentials/CredentialsPage.tsx | 16 +- src/components/mcp/McpPage.tsx | 28 ++- src/components/prompts/PromptCard.tsx | 17 +- src/components/prompts/PromptForm.tsx | 7 +- src/components/prompts/PromptsPage.tsx | 55 ++++-- src/components/settings/AboutSection.tsx | 11 +- src/components/settings/DirectorySettings.tsx | 4 +- src/components/settings/GeneralSettings.tsx | 18 +- src/components/settings/ProxySettings.tsx | 56 ++++-- src/components/settings/SettingsPage.tsx | 2 +- src/components/switch/AppTabs.tsx | 2 +- src/components/switch/LiveConfigModal.tsx | 13 +- src/components/switch/ProviderCard.tsx | 4 +- src/components/switch/ProviderForm.tsx | 187 +++++++++++++----- src/components/switch/ProviderList.tsx | 6 +- src/hooks/useMcpServers.ts | 6 +- src/hooks/usePrompts.ts | 4 +- src/hooks/useSwitch.ts | 4 +- src/lib/api/mcp.ts | 13 +- 26 files changed, 508 insertions(+), 192 deletions(-) diff --git a/src/components/Dashboard.tsx b/src/components/Dashboard.tsx index af6f954e0..3ad1213e0 100644 --- a/src/components/Dashboard.tsx +++ b/src/components/Dashboard.tsx @@ -123,7 +123,9 @@ export function Dashboard() { 默认 Provider -
{getProviderName(defaultProvider)}
+
+ {getProviderName(defaultProvider)} +
@@ -169,7 +171,9 @@ export function Dashboard() { className="flex items-center justify-between rounded-lg border bg-background p-3" >
-
{getProviderName(cred.provider)}
+
+ {getProviderName(cred.provider)} +
{cred.has_access_token ? "Token 已加载" : "未配置"}
@@ -195,7 +199,9 @@ export function Dashboard() {
API 地址: - {serverUrl} + + {serverUrl} +
API Key: @@ -245,7 +251,9 @@ function QuickLinkCard({

{description}

-
+
{statusText}
diff --git a/src/components/api-server/ApiServerPage.tsx b/src/components/api-server/ApiServerPage.tsx index d5f8dc337..7c81b1b8f 100644 --- a/src/components/api-server/ApiServerPage.tsx +++ b/src/components/api-server/ApiServerPage.tsx @@ -197,7 +197,10 @@ export function ApiServerPage() { try { await setDefaultProvider(providerId); setDefaultProviderState(providerId); - setMessage({ type: "success", text: `默认 Provider 已切换为: ${providerId}` }); + setMessage({ + type: "success", + text: `默认 Provider 已切换为: ${providerId}`, + }); } catch (e: unknown) { const errMsg = e instanceof Error ? e.message : String(e); setMessage({ type: "error", text: `切换失败: ${errMsg}` }); @@ -288,7 +291,12 @@ export function ApiServerPage() { body: JSON.stringify({ model: "claude-sonnet-4-5", max_tokens: 100, - messages: [{ role: "user", content: "What is 1+1? Answer with just the number." }], + messages: [ + { + role: "user", + content: "What is 1+1? Answer with just the number.", + }, + ], }), }, ]; @@ -501,7 +509,9 @@ export function ApiServerPage() { />
- +

响应{" "} - {result.httpStatus && `(HTTP ${result.httpStatus})`} + {result.httpStatus && + `(HTTP ${result.httpStatus})`}

diff --git a/src/components/clients/LiveConfigModal.tsx b/src/components/clients/LiveConfigModal.tsx
index 9acac4dec..2f60d4037 100644
--- a/src/components/clients/LiveConfigModal.tsx
+++ b/src/components/clients/LiveConfigModal.tsx
@@ -51,7 +51,9 @@ export function LiveConfigModal({ appType, onClose }: LiveConfigModalProps) {
               className="p-1.5 rounded hover:bg-muted"
               title="刷新"
             >
-              
+              
             
             
) : ( -

- 无配置数据 -

+

无配置数据

)}

- 配置文件路径: {configPaths[appType]} + 配置文件路径:{" "} + + {configPaths[appType]} +

diff --git a/src/components/clients/ProviderCard.tsx b/src/components/clients/ProviderCard.tsx index 3aa024bf0..3ad4669d1 100644 --- a/src/components/clients/ProviderCard.tsx +++ b/src/components/clients/ProviderCard.tsx @@ -23,7 +23,7 @@ export function ProviderCard({ "relative rounded-lg border p-4 transition-all", isCurrent ? "border-primary bg-primary/5 ring-1 ring-primary" - : "hover:border-muted-foreground/50" + : "hover:border-muted-foreground/50", )} > {isCurrent && ( @@ -70,7 +70,7 @@ export function ProviderCard({ "p-1.5 rounded text-destructive", isCurrent ? "opacity-30 cursor-not-allowed" - : "hover:bg-destructive/10" + : "hover:bg-destructive/10", )} title={isCurrent ? "无法删除当前使用中的配置" : "删除"} > diff --git a/src/components/clients/ProviderForm.tsx b/src/components/clients/ProviderForm.tsx index f4aeda1f9..052bb87b0 100644 --- a/src/components/clients/ProviderForm.tsx +++ b/src/components/clients/ProviderForm.tsx @@ -7,12 +7,20 @@ import { cn } from "@/lib/utils"; interface ProviderFormProps { appType: AppType; provider: Provider | null; - onSave: (data: Omit) => Promise; + onSave: ( + data: Omit, + ) => Promise; onCancel: () => void; } // 供应商分类 -type ProviderCategory = "official" | "cn_official" | "aggregator" | "third_party" | "proxy" | "custom"; +type ProviderCategory = + | "official" + | "cn_official" + | "aggregator" + | "third_party" + | "proxy" + | "custom"; // 预设供应商接口 interface ProviderPreset { @@ -70,7 +78,8 @@ const presets: Record = { iconColor: "#6B4FBB", websiteUrl: "https://bailian.console.aliyun.com", apiKeyUrl: "https://bailian.console.aliyun.com/?apiKey=1#/api-key", - defaultBaseUrl: "https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy", + defaultBaseUrl: + "https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy", }, { id: "kimi", @@ -96,7 +105,8 @@ const presets: Record = { category: "cn_official", iconColor: "#F97316", websiteUrl: "https://platform.minimaxi.com", - apiKeyUrl: "https://platform.minimaxi.com/user-center/basic-information/interface-key", + apiKeyUrl: + "https://platform.minimaxi.com/user-center/basic-information/interface-key", defaultBaseUrl: "https://api.minimaxi.com/anthropic", }, { @@ -105,7 +115,8 @@ const presets: Record = { category: "cn_official", iconColor: "#5DADEC", websiteUrl: "https://www.volcengine.com/product/doubao", - apiKeyUrl: "https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey", + apiKeyUrl: + "https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey", defaultBaseUrl: "https://ark.cn-beijing.volces.com/api/coding", }, // 聚合服务 @@ -221,10 +232,14 @@ const categoryLabels: Record = { }; // 默认 Codex auth.json 模板 -const defaultCodexAuth = JSON.stringify({ - api_key: "", - api_base_url: "" -}, null, 2); +const defaultCodexAuth = JSON.stringify( + { + api_key: "", + api_base_url: "", + }, + null, + 2, +); // 默认 Codex config.toml 模板 const defaultCodexConfig = `# Codex 配置文件 @@ -237,17 +252,26 @@ GOOGLE_GEMINI_BASE_URL= GEMINI_MODEL=gemini-2.0-flash`; // 默认 Gemini settings.json 模板 -const defaultGeminiSettings = JSON.stringify({ - mcpServers: {} -}, null, 2); +const defaultGeminiSettings = JSON.stringify( + { + mcpServers: {}, + }, + null, + 2, +); -export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFormProps) { +export function ProviderForm({ + appType, + provider, + onSave, + onCancel, +}: ProviderFormProps) { const isEditMode = Boolean(provider); const appPresets = useMemo(() => presets[appType] || [], [appType]); // 基础字段 const [selectedPresetId, setSelectedPresetId] = useState( - isEditMode ? null : "custom" + isEditMode ? null : "custom", ); const [name, setName] = useState(provider?.name || ""); const [notes, setNotes] = useState(provider?.notes || ""); @@ -255,12 +279,31 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo // 从 provider.settings_config 中提取 Claude 配置 const extractClaudeConfig = () => { - if (!provider?.settings_config || typeof provider.settings_config !== 'object') { - return { apiKey: "", baseUrl: "", primaryModel: "claude-sonnet-4-20250514", haikuModel: "", sonnetModel: "", opusModel: "" }; + if ( + !provider?.settings_config || + typeof provider.settings_config !== "object" + ) { + return { + apiKey: "", + baseUrl: "", + primaryModel: "claude-sonnet-4-20250514", + haikuModel: "", + sonnetModel: "", + opusModel: "", + }; } - const env = (provider.settings_config as Record).env as Record | undefined; + const env = (provider.settings_config as Record).env as + | Record + | undefined; if (!env) { - return { apiKey: "", baseUrl: "", primaryModel: "claude-sonnet-4-20250514", haikuModel: "", sonnetModel: "", opusModel: "" }; + return { + apiKey: "", + baseUrl: "", + primaryModel: "claude-sonnet-4-20250514", + haikuModel: "", + sonnetModel: "", + opusModel: "", + }; } return { apiKey: env.ANTHROPIC_API_KEY || env.ANTHROPIC_AUTH_TOKEN || "", @@ -284,7 +327,10 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo // Claude 配置 JSON(可编辑) const [claudeConfigJson, setClaudeConfigJson] = useState(() => { - if (provider?.settings_config && typeof provider.settings_config === 'object') { + if ( + provider?.settings_config && + typeof provider.settings_config === "object" + ) { return JSON.stringify(provider.settings_config, null, 2); } return JSON.stringify({ env: {} }, null, 2); @@ -350,36 +396,50 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo // Codex 专属字段 - 使用代码编辑器 const [codexAuth, setCodexAuth] = useState(() => { - if (provider?.settings_config && typeof provider.settings_config === 'object') { + if ( + provider?.settings_config && + typeof provider.settings_config === "object" + ) { const auth = (provider.settings_config as Record).auth; if (auth) return JSON.stringify(auth, null, 2); } return defaultCodexAuth; }); const [codexConfig, setCodexConfig] = useState(() => { - if (provider?.settings_config && typeof provider.settings_config === 'object') { - const config = (provider.settings_config as Record).config; - if (typeof config === 'string') return config; + if ( + provider?.settings_config && + typeof provider.settings_config === "object" + ) { + const config = (provider.settings_config as Record) + .config; + if (typeof config === "string") return config; } return defaultCodexConfig; }); // Gemini 专属字段 - 使用代码编辑器 const [geminiEnv, setGeminiEnv] = useState(() => { - if (provider?.settings_config && typeof provider.settings_config === 'object') { + if ( + provider?.settings_config && + typeof provider.settings_config === "object" + ) { const env = (provider.settings_config as Record).env; - if (env && typeof env === 'object') { + if (env && typeof env === "object") { return Object.entries(env as Record) .map(([k, v]) => `${k}=${v}`) - .join('\n'); + .join("\n"); } } return defaultGeminiEnv; }); const [geminiSettings, setGeminiSettings] = useState(() => { - if (provider?.settings_config && typeof provider.settings_config === 'object') { - const config = (provider.settings_config as Record).config; - if (config && typeof config === 'object') { + if ( + provider?.settings_config && + typeof provider.settings_config === "object" + ) { + const config = (provider.settings_config as Record) + .config; + if (config && typeof config === "object") { return JSON.stringify(config, null, 2); } } @@ -431,12 +491,20 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo // 重置 JSON 手动编辑标记,让表单同步到 JSON setJsonManuallyEdited(false); } else if (appType === "codex") { - setCodexAuth(JSON.stringify({ - api_key: proxyApiKey, - api_base_url: `${proxyBaseUrl}/v1`, - }, null, 2)); + setCodexAuth( + JSON.stringify( + { + api_key: proxyApiKey, + api_base_url: `${proxyBaseUrl}/v1`, + }, + null, + 2, + ), + ); } else if (appType === "gemini") { - setGeminiEnv(`GEMINI_API_KEY=${proxyApiKey}\nGOOGLE_GEMINI_BASE_URL=${proxyBaseUrl}\nGEMINI_MODEL=gemini-2.0-flash`); + setGeminiEnv( + `GEMINI_API_KEY=${proxyApiKey}\nGOOGLE_GEMINI_BASE_URL=${proxyBaseUrl}\nGEMINI_MODEL=gemini-2.0-flash`, + ); } return; } catch (e) { @@ -474,7 +542,7 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo if (preset.defaultGeminiEnv) { const envLines = Object.entries(preset.defaultGeminiEnv) .map(([k, v]) => `${k}=${v}`) - .join('\n'); + .join("\n"); setGeminiEnv(envLines); } else { setGeminiEnv(defaultGeminiEnv); @@ -504,10 +572,10 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo if (appType === "gemini") { const env: Record = {}; - for (const line of geminiEnv.split('\n')) { + for (const line of geminiEnv.split("\n")) { const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith('#')) continue; - const idx = trimmed.indexOf('='); + if (!trimmed || trimmed.startsWith("#")) continue; + const idx = trimmed.indexOf("="); if (idx > 0) { const key = trimmed.slice(0, idx).trim(); const value = trimmed.slice(idx + 1).trim(); @@ -535,7 +603,12 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo } // 非官方供应商必填校验(新增模式必填,编辑模式可留空保持原值) - if (!isEditMode && showApiFields && appType === "claude" && !apiKey.trim()) { + if ( + !isEditMode && + showApiFields && + appType === "claude" && + !apiKey.trim() + ) { setError("请填写 API Key"); return; } @@ -590,7 +663,7 @@ export function ProviderForm({ appType, provider, onSave, onCancel }: ProviderFo "flex items-center gap-2 px-3 py-2 rounded-lg border text-sm transition-all", selectedPresetId === preset.id ? "border-primary bg-primary/10 text-primary" - : "border-border hover:border-muted-foreground/50" + : "border-border hover:border-muted-foreground/50", )} > API Key * - {(selectedPreset?.apiKeyUrl || selectedPreset?.websiteUrl) && ( + {(selectedPreset?.apiKeyUrl || + selectedPreset?.websiteUrl) && (
- + -

留空使用默认端点

+

+ 留空使用默认端点 +

- +
- +
- +
- + handleJsonChange(e.target.value)} className={cn( "w-full px-3 py-2 rounded-lg border bg-muted/50 font-mono text-sm focus:ring-2 focus:ring-primary/20 focus:border-primary outline-none resize-none", - jsonError && "border-destructive focus:ring-destructive/20 focus:border-destructive" + jsonError && + "border-destructive focus:ring-destructive/20 focus:border-destructive", )} rows={10} placeholder='{"env": {}}' diff --git a/src/components/clients/ProviderList.tsx b/src/components/clients/ProviderList.tsx index cf38e2687..ffefad460 100644 --- a/src/components/clients/ProviderList.tsx +++ b/src/components/clients/ProviderList.tsx @@ -24,7 +24,9 @@ export function ProviderList({ appType }: ProviderListProps) { } = useSwitch(appType); const [showForm, setShowForm] = useState(false); - const [editingProvider, setEditingProvider] = useState(null); + const [editingProvider, setEditingProvider] = useState< + (typeof providers)[0] | null + >(null); const [showLiveConfig, setShowLiveConfig] = useState(false); const handleAdd = () => { @@ -32,7 +34,7 @@ export function ProviderList({ appType }: ProviderListProps) { setShowForm(true); }; - const handleEdit = (provider: typeof providers[0]) => { + const handleEdit = (provider: (typeof providers)[0]) => { setEditingProvider(provider); setShowForm(true); }; diff --git a/src/components/credentials/CredentialsPage.tsx b/src/components/credentials/CredentialsPage.tsx index 332232a10..cc548690b 100644 --- a/src/components/credentials/CredentialsPage.tsx +++ b/src/components/credentials/CredentialsPage.tsx @@ -225,7 +225,9 @@ function CredentialPanel({ provider }: { provider: OAuthProvider }) { disabled={isLoading || !credentials?.has_refresh_token} className="flex items-center gap-2 rounded-lg border px-4 py-2 text-sm font-medium hover:bg-muted disabled:opacity-50" > - + 刷新 Token {showImportMenu && ( @@ -305,7 +307,9 @@ export function McpPage() { className="p-1.5 rounded hover:bg-muted" title="刷新" > - +
- + - 同步到: + + 同步到: + - {(selectedPreset?.apiKeyUrl || selectedPreset?.websiteUrl) && ( + {(selectedPreset?.apiKeyUrl || + selectedPreset?.websiteUrl) && (
- + -

留空使用默认端点

+

+ 留空使用默认端点 +

- +
- +
- +
- + handleJsonChange(e.target.value)} className={cn( "w-full px-3 py-2 rounded-lg border bg-muted/50 font-mono text-sm focus:ring-2 focus:ring-primary/20 focus:border-primary outline-none resize-none", - jsonError && "border-destructive focus:ring-destructive/20 focus:border-destructive" + jsonError && + "border-destructive focus:ring-destructive/20 focus:border-destructive", )} rows={10} placeholder='{"env": {}}' diff --git a/src/components/switch/ProviderList.tsx b/src/components/switch/ProviderList.tsx index cf38e2687..ffefad460 100644 --- a/src/components/switch/ProviderList.tsx +++ b/src/components/switch/ProviderList.tsx @@ -24,7 +24,9 @@ export function ProviderList({ appType }: ProviderListProps) { } = useSwitch(appType); const [showForm, setShowForm] = useState(false); - const [editingProvider, setEditingProvider] = useState(null); + const [editingProvider, setEditingProvider] = useState< + (typeof providers)[0] | null + >(null); const [showLiveConfig, setShowLiveConfig] = useState(false); const handleAdd = () => { @@ -32,7 +34,7 @@ export function ProviderList({ appType }: ProviderListProps) { setShowForm(true); }; - const handleEdit = (provider: typeof providers[0]) => { + const handleEdit = (provider: (typeof providers)[0]) => { setEditingProvider(provider); setShowForm(true); }; diff --git a/src/hooks/useMcpServers.ts b/src/hooks/useMcpServers.ts index a74c7623d..f5c87c5e0 100644 --- a/src/hooks/useMcpServers.ts +++ b/src/hooks/useMcpServers.ts @@ -89,7 +89,11 @@ export function useMcpServers() { await fetchServers(); }; - const toggleServer = async (id: string, appType: string, enabled: boolean) => { + const toggleServer = async ( + id: string, + appType: string, + enabled: boolean, + ) => { await mcpApi.toggleServer(id, appType, enabled); await fetchServers(); }; diff --git a/src/hooks/usePrompts.ts b/src/hooks/usePrompts.ts index b9f5f17d9..afd3865e4 100644 --- a/src/hooks/usePrompts.ts +++ b/src/hooks/usePrompts.ts @@ -3,7 +3,9 @@ import { promptsApi, Prompt, AppType } from "@/lib/api/prompts"; export function usePrompts(appType: AppType) { const [prompts, setPrompts] = useState>({}); - const [currentFileContent, setCurrentFileContent] = useState(null); + const [currentFileContent, setCurrentFileContent] = useState( + null, + ); const [loading, setLoading] = useState(false); const hasAutoImported = useRef>({}); diff --git a/src/hooks/useSwitch.ts b/src/hooks/useSwitch.ts index 6f13b114e..dc4f18b88 100644 --- a/src/hooks/useSwitch.ts +++ b/src/hooks/useSwitch.ts @@ -28,7 +28,9 @@ export function useSwitch(appType: AppType) { fetchProviders(); }, [fetchProviders]); - const addProvider = async (provider: Omit) => { + const addProvider = async ( + provider: Omit, + ) => { const newProvider: Provider = { ...provider, id: crypto.randomUUID(), diff --git a/src/lib/api/mcp.ts b/src/lib/api/mcp.ts index 252708b51..35425ce84 100644 --- a/src/lib/api/mcp.ts +++ b/src/lib/api/mcp.ts @@ -17,8 +17,7 @@ export interface McpServer { } export const mcpApi = { - getServers: (): Promise => - invoke("get_mcp_servers"), + getServers: (): Promise => invoke("get_mcp_servers"), addServer: (server: McpServer): Promise => invoke("add_mcp_server", { server }), @@ -29,14 +28,16 @@ export const mcpApi = { deleteServer: (id: string): Promise => invoke("delete_mcp_server", { id }), - toggleServer: (id: string, appType: string, enabled: boolean): Promise => - invoke("toggle_mcp_server", { id, appType, enabled }), + toggleServer: ( + id: string, + appType: string, + enabled: boolean, + ): Promise => invoke("toggle_mcp_server", { id, appType, enabled }), /** 从外部应用导入 MCP 配置 */ importFromApp: (appType: string): Promise => invoke("import_mcp_from_app", { appType }), /** 同步所有 MCP 配置到实际配置文件 */ - syncAllToLive: (): Promise => - invoke("sync_all_mcp_to_live"), + syncAllToLive: (): Promise => invoke("sync_all_mcp_to_live"), };