From 667c274c7fd752e48d2ca19902882d402bc821ea Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Fri, 21 Aug 2026 19:00:06 -0400 Subject: [PATCH] fix(tui): contain MCP sidebar errors (#44003) --- packages/tui/src/component/dialog-mcp.tsx | 24 ++++++------ .../tui/src/feature-plugins/sidebar/mcp.tsx | 39 ++++++++++++------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/packages/tui/src/component/dialog-mcp.tsx b/packages/tui/src/component/dialog-mcp.tsx index 298b5fd33c6..7a2fc530ab3 100644 --- a/packages/tui/src/component/dialog-mcp.tsx +++ b/packages/tui/src/component/dialog-mcp.tsx @@ -33,14 +33,23 @@ function Status(props: { status: McpServer["status"]; loading: boolean }) { return <>Disabled ○ } -export function DialogMcp() { +export function DialogMcp(props: { initialServer?: string; details?: boolean } = {}) { const data = useData() const dialog = useDialog() const client = useClient() const toast = useToast() const theme = useTheme("elevated") - const [focused, setFocused] = createSignal() - const [detail, setDetail] = createSignal() + const servers = createMemo(() => + pipe( + data.location.mcp.server.list() ?? [], + sortBy((server) => server.name), + ), + ) + const initial = props.initialServer ? servers().find((server) => server.name === props.initialServer) : undefined + const [focused, setFocused] = createSignal(props.initialServer) + const [detail, setDetail] = createSignal( + props.details && initial?.status.status === "failed" ? initial : undefined, + ) const [loading, setLoading] = createSignal(null) const statusColor = (status: McpServer["status"]) => { @@ -50,13 +59,6 @@ export function DialogMcp() { return theme.text.subdued } - const servers = createMemo(() => - pipe( - data.location.mcp.server.list() ?? [], - sortBy((server) => server.name), - ), - ) - createEffect(() => { if (focused()) return const first = servers()[0] @@ -153,7 +155,7 @@ export function DialogMcp() { title={`MCP server: ${server().name}`} error={statusError(server().status) ?? "Unknown MCP connection error"} onBack={() => { - setDetail() + setDetail(undefined) dialog.setSize("medium") }} /> diff --git a/packages/tui/src/feature-plugins/sidebar/mcp.tsx b/packages/tui/src/feature-plugins/sidebar/mcp.tsx index 6e69976064e..0ea70a11301 100644 --- a/packages/tui/src/feature-plugins/sidebar/mcp.tsx +++ b/packages/tui/src/feature-plugins/sidebar/mcp.tsx @@ -1,5 +1,6 @@ import { Plugin } from "@opencode-ai/plugin/tui" import { createMemo, For, Match, Show, Switch, createSignal } from "solid-js" +import { DialogMcp } from "../../component/dialog-mcp" function View(props: { context: Plugin.Context; sessionID: string }) { const [open, setOpen] = createSignal(true) @@ -39,7 +40,16 @@ function View(props: { context: Plugin.Context; sessionID: string }) { {(item) => ( - + + props.context.ui.dialog.show(() => ( + + )) + } + > - - {item.name}{" "} - - - Connected - - {item.status.status === "failed" ? item.status.error : undefined} - - Disabled - Needs auth - - + + {item.name} + + + + Connected + Connecting + Error + Disabled + Sign in + )}