diff --git a/src/components/mcp/McpFormModal.tsx b/src/components/mcp/McpFormModal.tsx index 93d12745d..70ab3b03a 100644 --- a/src/components/mcp/McpFormModal.tsx +++ b/src/components/mcp/McpFormModal.tsx @@ -66,6 +66,7 @@ const McpFormModal: React.FC = ({ codex: boolean; gemini: boolean; opencode: boolean; + openclaw: boolean; }>(() => { if (initialData?.apps) { return { ...initialData.apps }; @@ -75,6 +76,7 @@ const McpFormModal: React.FC = ({ codex: defaultEnabledApps.includes("codex"), gemini: defaultEnabledApps.includes("gemini"), opencode: defaultEnabledApps.includes("opencode"), + openclaw: defaultEnabledApps.includes("openclaw"), }; }); diff --git a/src/components/mcp/UnifiedMcpPanel.tsx b/src/components/mcp/UnifiedMcpPanel.tsx index bab09acd5..57e0cd85f 100644 --- a/src/components/mcp/UnifiedMcpPanel.tsx +++ b/src/components/mcp/UnifiedMcpPanel.tsx @@ -56,7 +56,7 @@ const UnifiedMcpPanel = React.forwardRef< }, [serversMap]); const enabledCounts = useMemo(() => { - const counts = { claude: 0, codex: 0, gemini: 0, opencode: 0 }; + const counts = { claude: 0, codex: 0, gemini: 0, opencode: 0, openclaw: 0 }; serverEntries.forEach(([_, server]) => { for (const app of APP_IDS) { if (server.apps[app]) counts[app]++; diff --git a/src/components/skills/UnifiedSkillsPanel.tsx b/src/components/skills/UnifiedSkillsPanel.tsx index 6d6f62ce2..aa647c70d 100644 --- a/src/components/skills/UnifiedSkillsPanel.tsx +++ b/src/components/skills/UnifiedSkillsPanel.tsx @@ -53,7 +53,7 @@ const UnifiedSkillsPanel = React.forwardRef< const installFromZipMutation = useInstallSkillsFromZip(); const enabledCounts = useMemo(() => { - const counts = { claude: 0, codex: 0, gemini: 0, opencode: 0 }; + const counts = { claude: 0, codex: 0, gemini: 0, opencode: 0, openclaw: 0 }; if (!skills) return counts; skills.forEach((skill) => { for (const app of APP_IDS) { diff --git a/src/config/appConfig.tsx b/src/config/appConfig.tsx index 6ab2b5046..9bb977462 100644 --- a/src/config/appConfig.tsx +++ b/src/config/appConfig.tsx @@ -1,6 +1,11 @@ import React from "react"; import type { AppId } from "@/lib/api/types"; -import { ClaudeIcon, CodexIcon, GeminiIcon } from "@/components/BrandIcons"; +import { + ClaudeIcon, + CodexIcon, + GeminiIcon, + OpenClawIcon, +} from "@/components/BrandIcons"; import { ProviderIcon } from "@/components/ProviderIcon"; export interface AppConfig { @@ -10,7 +15,7 @@ export interface AppConfig { badgeClass: string; } -export const APP_IDS: AppId[] = ["claude", "codex", "gemini", "opencode"]; +export const APP_IDS: AppId[] = ["claude", "codex", "gemini", "opencode", "openclaw"]; export const APP_ICON_MAP: Record = { claude: { @@ -52,4 +57,12 @@ export const APP_ICON_MAP: Record = { badgeClass: "bg-indigo-500/10 text-indigo-700 dark:text-indigo-300 hover:bg-indigo-500/20 border-0 gap-1.5", }, + openclaw: { + label: "OpenClaw", + icon: , + activeClass: + "bg-rose-500/10 ring-1 ring-rose-500/20 hover:bg-rose-500/20 text-rose-600 dark:text-rose-400", + badgeClass: + "bg-rose-500/10 text-rose-700 dark:text-rose-300 hover:bg-rose-500/20 border-0 gap-1.5", + }, }; diff --git a/src/types.ts b/src/types.ts index 4138cd766..45b22d620 100644 --- a/src/types.ts +++ b/src/types.ts @@ -288,6 +288,7 @@ export interface McpApps { codex: boolean; gemini: boolean; opencode: boolean; + openclaw: boolean; } // MCP 服务器条目(v3.7.0 统一结构) diff --git a/tests/msw/state.ts b/tests/msw/state.ts index bb08e101f..2db234840 100644 --- a/tests/msw/state.ts +++ b/tests/msw/state.ts @@ -86,7 +86,7 @@ let mcpConfigs: McpConfigState = { id: "sample", name: "Sample Claude Server", enabled: true, - apps: { claude: true, codex: false, gemini: false, opencode: false }, + apps: { claude: true, codex: false, gemini: false, opencode: false, openclaw: false }, server: { type: "stdio", command: "claude-server", @@ -98,7 +98,7 @@ let mcpConfigs: McpConfigState = { id: "httpServer", name: "HTTP Codex Server", enabled: false, - apps: { claude: false, codex: true, gemini: false, opencode: false }, + apps: { claude: false, codex: true, gemini: false, opencode: false, openclaw: false }, server: { type: "http", url: "http://localhost:3000", @@ -131,7 +131,7 @@ export const resetProviderState = () => { id: "sample", name: "Sample Claude Server", enabled: true, - apps: { claude: true, codex: false, gemini: false, opencode: false }, + apps: { claude: true, codex: false, gemini: false, opencode: false, openclaw: false }, server: { type: "stdio", command: "claude-server", @@ -143,7 +143,7 @@ export const resetProviderState = () => { id: "httpServer", name: "HTTP Codex Server", enabled: false, - apps: { claude: false, codex: true, gemini: false, opencode: false }, + apps: { claude: false, codex: true, gemini: false, opencode: false, openclaw: false }, server: { type: "http", url: "http://localhost:3000",