diff --git a/src/App.tsx b/src/App.tsx index 4f0d47785..713fc8e1e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -123,6 +123,7 @@ function App() { codex: true, gemini: true, opencode: true, + openclaw: true, }; const getFirstVisibleApp = (): AppId => { @@ -130,6 +131,7 @@ function App() { if (visibleApps.codex) return "codex"; if (visibleApps.gemini) return "gemini"; if (visibleApps.opencode) return "opencode"; + if (visibleApps.openclaw) return "openclaw"; return "claude"; // fallback }; @@ -586,7 +588,7 @@ function App() { return ( ); case "mcp": diff --git a/src/components/AppSwitcher.tsx b/src/components/AppSwitcher.tsx index b91c05273..717bb690c 100644 --- a/src/components/AppSwitcher.tsx +++ b/src/components/AppSwitcher.tsx @@ -29,12 +29,14 @@ export function AppSwitcher({ codex: "openai", gemini: "gemini", opencode: "opencode", + openclaw: "openclaw", }; const appDisplayName: Record = { claude: "Claude", codex: "Codex", gemini: "Gemini", opencode: "OpenCode", + openclaw: "OpenClaw", }; // Filter apps based on visibility settings (default all visible) 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/prompts/PromptFormModal.tsx b/src/components/prompts/PromptFormModal.tsx index 970265d06..195d856f4 100644 --- a/src/components/prompts/PromptFormModal.tsx +++ b/src/components/prompts/PromptFormModal.tsx @@ -35,6 +35,7 @@ const PromptFormModal: React.FC = ({ codex: "AGENTS.md", gemini: "GEMINI.md", opencode: "AGENTS.md", + openclaw: "AGENTS.md", }; const filename = filenameMap[appId]; const [name, setName] = useState(""); diff --git a/src/components/prompts/PromptFormPanel.tsx b/src/components/prompts/PromptFormPanel.tsx index 83a423209..c4481fa4c 100644 --- a/src/components/prompts/PromptFormPanel.tsx +++ b/src/components/prompts/PromptFormPanel.tsx @@ -29,6 +29,7 @@ const PromptFormPanel: React.FC = ({ codex: "AGENTS.md", gemini: "GEMINI.md", opencode: "AGENTS.md", + openclaw: "AGENTS.md", }; const filename = filenameMap[appId]; const [name, setName] = useState(""); diff --git a/src/components/providers/forms/EndpointSpeedTest.tsx b/src/components/providers/forms/EndpointSpeedTest.tsx index 1a0b39f99..2ede2f019 100644 --- a/src/components/providers/forms/EndpointSpeedTest.tsx +++ b/src/components/providers/forms/EndpointSpeedTest.tsx @@ -14,6 +14,7 @@ const ENDPOINT_TIMEOUT_SECS: Record = { claude: 8, gemini: 8, opencode: 8, + openclaw: 8, }; interface TestResult { diff --git a/src/components/providers/forms/hooks/useBaseUrlState.ts b/src/components/providers/forms/hooks/useBaseUrlState.ts index 75e39594a..037dfeb3b 100644 --- a/src/components/providers/forms/hooks/useBaseUrlState.ts +++ b/src/components/providers/forms/hooks/useBaseUrlState.ts @@ -4,9 +4,10 @@ import { setCodexBaseUrl as setCodexBaseUrlInConfig, } from "@/utils/providerConfigUtils"; import type { ProviderCategory } from "@/types"; +import type { AppId } from "@/lib/api"; interface UseBaseUrlStateProps { - appType: "claude" | "codex" | "gemini" | "opencode"; + appType: AppId; category: ProviderCategory | undefined; settingsConfig: string; codexConfig?: string; diff --git a/src/components/settings/AppVisibilitySettings.tsx b/src/components/settings/AppVisibilitySettings.tsx index 3ed80dc55..0c30472ce 100644 --- a/src/components/settings/AppVisibilitySettings.tsx +++ b/src/components/settings/AppVisibilitySettings.tsx @@ -20,6 +20,7 @@ const APP_CONFIG: Array<{ { id: "codex", icon: "openai", nameKey: "apps.codex" }, { id: "gemini", icon: "gemini", nameKey: "apps.gemini" }, { id: "opencode", icon: "opencode", nameKey: "apps.opencode" }, + { id: "openclaw", icon: "openclaw", nameKey: "apps.openclaw" }, ]; export function AppVisibilitySettings({ @@ -33,6 +34,7 @@ export function AppVisibilitySettings({ codex: true, gemini: true, opencode: true, + openclaw: true, }; // Count how many apps are currently visible diff --git a/tests/msw/state.ts b/tests/msw/state.ts index ac385a675..2db234840 100644 --- a/tests/msw/state.ts +++ b/tests/msw/state.ts @@ -58,6 +58,7 @@ const createDefaultProviders = (): ProvidersByApp => ({ }, }, opencode: {}, + openclaw: {}, }); const createDefaultCurrent = (): CurrentProviderState => ({ @@ -65,6 +66,7 @@ const createDefaultCurrent = (): CurrentProviderState => ({ codex: "codex-1", gemini: "gemini-1", opencode: "", + openclaw: "", }); let providers = createDefaultProviders(); @@ -84,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", @@ -96,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", @@ -105,6 +107,7 @@ let mcpConfigs: McpConfigState = { }, gemini: {}, opencode: {}, + openclaw: {}, }; const cloneProviders = (value: ProvidersByApp) => @@ -128,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", @@ -140,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", @@ -149,6 +152,7 @@ export const resetProviderState = () => { }, gemini: {}, opencode: {}, + openclaw: {}, }; };