diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx index 3b6b5ef2182..98fba4b70e9 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx @@ -3,7 +3,10 @@ import { fileURLToPath } from "bun" import { useTheme } from "../context/theme" import { useDialog } from "@tui/ui/dialog" import { useSync } from "@tui/context/sync" -import { For, Match, Switch, Show, createMemo } from "solid-js" +import { useLocal } from "@tui/context/local" +import { useSDK } from "@tui/context/sdk" +import { For, Match, Switch, Show, createMemo, createSignal } from "solid-js" +import { Log } from "@/util/log" export type DialogStatusProps = {} @@ -11,6 +14,27 @@ export function DialogStatus() { const sync = useSync() const { theme } = useTheme() const dialog = useDialog() + const local = useLocal() + const sdk = useSDK() + const [loading, setLoading] = createSignal(null) + + async function handleToggle(name: string) { + if (loading() !== null) return + setLoading(name) + try { + await local.mcp.toggle(name) + const status = await sdk.client.mcp.status() + if (status.data) sync.set("mcp", status.data) + } catch (error) { + Log.Default.error("Failed to toggle MCP", { + error: error instanceof Error ? error.message : String(error), + name: error instanceof Error ? error.name : undefined, + stack: error instanceof Error ? error.stack : undefined, + }) + } finally { + setLoading(null) + } + } const enabledFormatters = createMemo(() => sync.data.formatter.filter((f) => f.enabled)) @@ -54,7 +78,7 @@ export function DialogStatus() { {Object.keys(sync.data.mcp).length} MCP Servers {([key, item]) => ( - + handleToggle(key)}> • - + {key}{" "} + + Loading… + Connected {(val) => val().error} Disabled in configuration