From 44dbe2711ddf8ce9fa70ebf7c3773523fc607841 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 26 May 2026 19:42:48 +1000 Subject: [PATCH] fix(mcp): start servers asynchronously for active directories --- .../app/src/components/dialog-select-mcp.tsx | 5 +- .../src/components/status-popover-body.tsx | 8 +- packages/app/src/context/directory-sync.ts | 3 +- .../src/context/global-sync/bootstrap.test.ts | 17 +- .../app/src/context/global-sync/bootstrap.ts | 5 +- .../context/global-sync/child-store.test.ts | 48 +++- .../src/context/global-sync/child-store.ts | 30 ++- .../src/context/global-sync/event-reducer.ts | 6 + packages/app/src/context/global-sync/types.ts | 1 + packages/app/src/context/server-sync.tsx | 18 +- packages/app/src/i18n/en.ts | 1 + packages/opencode/src/cli/cmd/mcp.ts | 3 + .../opencode/src/cli/cmd/tui/context/sync.tsx | 7 + packages/opencode/src/config/mcp.ts | 4 +- packages/opencode/src/mcp/index.ts | 195 +++++++++++----- .../opencode/test/cli/cmd/tui/sync.test.tsx | 44 +++- packages/opencode/test/mcp/lifecycle.test.ts | 208 +++++++++++++----- packages/sdk/js/src/v2/gen/types.gen.ts | 74 ++++--- 18 files changed, 515 insertions(+), 162 deletions(-) diff --git a/packages/app/src/components/dialog-select-mcp.tsx b/packages/app/src/components/dialog-select-mcp.tsx index 77cfcc039c..46320157ae 100644 --- a/packages/app/src/components/dialog-select-mcp.tsx +++ b/packages/app/src/components/dialog-select-mcp.tsx @@ -11,6 +11,7 @@ import { pathKey } from "@/utils/path-key" const statusLabels = { connected: "mcp.status.connected", + connecting: "mcp.status.connecting", failed: "mcp.status.failed", needs_auth: "mcp.status.needs_auth", needs_client_registration: "mcp.status.needs_client_registration", @@ -79,6 +80,7 @@ export const DialogSelectMcp: Component = () => { if (s?.status === "failed" || s?.status === "needs_client_registration") return s.error } const enabled = () => status() === "connected" + const connecting = () => status() === "connecting" return (
@@ -95,8 +97,9 @@ export const DialogSelectMcp: Component = () => {
e.stopPropagation()}> { + if (connecting()) return if (toggle.isPending) return toggle.mutate(i.name) }} diff --git a/packages/app/src/components/status-popover-body.tsx b/packages/app/src/components/status-popover-body.tsx index e0d1b01c89..6549dfd397 100644 --- a/packages/app/src/components/status-popover-body.tsx +++ b/packages/app/src/components/status-popover-body.tsx @@ -434,15 +434,17 @@ export function StatusPopoverBody(props: { shown: Accessor }) { {(name) => { const status = () => mcpStatus(name) const enabled = () => status() === "connected" + const connecting = () => status() === "connecting" return (