diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx index 365a22445b4b..facceb253643 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx @@ -20,7 +20,7 @@ export function DialogAgent() { return ( { local.agent.set(option.value) diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx index ec3931b209ad..a944d0084c30 100644 --- a/packages/opencode/src/cli/cmd/tui/context/local.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx @@ -40,7 +40,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const [agentStore, setAgentStore] = createStore<{ current: string }>({ - current: agents()[0].name, + current: agents()[0]?.name ?? "", }) const { theme } = useTheme() const colors = createMemo(() => [ @@ -74,7 +74,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ if (next < 0) next = agents().length - 1 if (next >= agents().length) next = 0 const value = agents()[next] - setAgentStore("current", value.name) + if (value) setAgentStore("current", value.name) }) }, color(name: string) { diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx index 8047c26458c6..4e77bbed6e2d 100644 --- a/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx +++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/home/footer.tsx @@ -19,7 +19,7 @@ function Directory(props: { api: TuiPluginApi }) { function Mcp(props: { api: TuiPluginApi }) { const theme = () => props.api.theme.current - const list = createMemo(() => props.api.state.mcp()) + const list = createMemo(() => props.api.state.mcp() ?? []) const has = createMemo(() => list().length > 0) const err = createMemo(() => list().some((item) => item.status === "failed")) const count = createMemo(() => list().filter((item) => item.status === "connected").length) diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx index 391bf27b90e8..2cc315bb0788 100644 --- a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx @@ -6,7 +6,7 @@ const id = "internal:sidebar-mcp" function View(props: { api: TuiPluginApi }) { const [open, setOpen] = createSignal(true) const theme = () => props.api.theme.current - const list = createMemo(() => props.api.state.mcp()) + const list = createMemo(() => props.api.state.mcp() ?? []) const on = createMemo(() => list().filter((item) => item.status === "connected").length) const bad = createMemo( () => diff --git a/packages/opencode/src/cli/cmd/tui/plugin/api.tsx b/packages/opencode/src/cli/cmd/tui/plugin/api.tsx index 529c50cfa3f1..e900faeb7a22 100644 --- a/packages/opencode/src/cli/cmd/tui/plugin/api.tsx +++ b/packages/opencode/src/cli/cmd/tui/plugin/api.tsx @@ -187,6 +187,7 @@ function stateApi(sync: ReturnType): TuiPluginApi["state"] { return sync.data.lsp.map((item) => ({ id: item.id, root: item.root, status: item.status })) }, mcp() { + if (!sync.data.mcp) return [] return Object.entries(sync.data.mcp) .sort(([a], [b]) => a.localeCompare(b)) .map(([name, item]) => ({