From ed6eda7492131787d42e45b77bd21103231da6f4 Mon Sep 17 00:00:00 2001 From: Cliff Hall Date: Thu, 4 Jun 2026 08:49:47 -0400 Subject: [PATCH] =?UTF-8?q?feat(web):=20wire=20up=20MCP=20task=20support?= =?UTF-8?q?=20=E2=80=94=20Tasks=20screen,=20Run-as-task,=20status=20toasts?= =?UTF-8?q?=20(#1422)=20(#1424)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wires the ported Tasks screen + core task subsystem through App.tsx: sticky Clear Completed, cancel/refresh error toasts, core-side per-task progress correlation, Run-as-task on the Tools screen (gated on server support), per-server Task TTL, and live task-status toasts. --- clients/web/src/App.test.tsx | 260 ++++++++++++++++- clients/web/src/App.tsx | 264 ++++++++++++++++-- .../ServerSettingsForm.stories.tsx | 2 + .../ServerSettingsForm.test.tsx | 32 +++ .../ServerSettingsForm/ServerSettingsForm.tsx | 11 +- .../ServerSettingsModal.stories.tsx | 2 + .../ServerSettingsModal.test.tsx | 2 + .../ServerSettingsModal.tsx | 2 +- .../ToolDetailPanel.stories.tsx | 45 +++ .../ToolDetailPanel/ToolDetailPanel.test.tsx | 143 ++++++++++ .../ToolDetailPanel/ToolDetailPanel.tsx | 57 +++- .../ToolsScreen/ToolsScreen.stories.tsx | 1 + .../screens/ToolsScreen/ToolsScreen.test.tsx | 7 +- .../screens/ToolsScreen/ToolsScreen.tsx | 24 +- .../src/components/screens/screenUiState.ts | 1 + .../InspectorView/InspectorView.stories.tsx | 1 + .../InspectorView/InspectorView.test.tsx | 1 + .../views/InspectorView/InspectorView.tsx | 10 +- .../mcp/remote/remoteClientTransport.test.ts | 1 + .../web/src/test/core/mcp/serverList.test.ts | 5 + .../state/managedRequestorTasksState.test.ts | 97 +++++++ .../react/useManagedRequestorTasks.test.tsx | 29 ++ .../src/test/core/react/useServers.test.tsx | 6 + .../integration/mcp/inspectorClient.test.ts | 70 +++++ .../integration/mcp/node/transport.test.ts | 3 + .../integration/mcp/remote/transport.test.ts | 1 + core/mcp/inspectorClient.ts | 37 ++- core/mcp/inspectorClientEventTarget.ts | 7 + core/mcp/remote/node/server.ts | 25 ++ core/mcp/serverList.ts | 20 +- core/mcp/state/managedRequestorTasksState.ts | 49 +++- core/mcp/types.ts | 10 + core/react/useManagedRequestorTasks.ts | 7 +- 33 files changed, 1192 insertions(+), 40 deletions(-) diff --git a/clients/web/src/App.test.tsx b/clients/web/src/App.test.tsx index c66cb03b..75faad77 100644 --- a/clients/web/src/App.test.tsx +++ b/clients/web/src/App.test.tsx @@ -41,6 +41,10 @@ vi.mock("@inspector/core/mcp/index.js", () => { callTool = vi .fn() .mockResolvedValue({ success: true, result: { acts: [] } }); + callToolStream = vi + .fn() + .mockResolvedValue({ success: true, result: { acts: [] } }); + cancelRequestorTask = vi.fn().mockResolvedValue(undefined); getPrompt = vi.fn().mockResolvedValue({ result: { messages: [] } }); readResource = vi .fn() @@ -166,7 +170,11 @@ vi.mock("@inspector/core/react/useManagedResourceTemplates.js", () => ({ useManagedResourceTemplates: vi.fn(() => ({ resourceTemplates: [] })), })); vi.mock("@inspector/core/react/useManagedRequestorTasks.js", () => ({ - useManagedRequestorTasks: vi.fn(() => ({ tasks: [], refresh: vi.fn() })), + useManagedRequestorTasks: vi.fn(() => ({ + tasks: [], + refresh: vi.fn().mockResolvedValue([]), + clearCompleted: vi.fn(), + })), })); vi.mock("@inspector/core/react/useResourceSubscriptions.js", () => ({ useResourceSubscriptions: vi.fn(() => ({ subscriptions: [] })), @@ -223,15 +231,26 @@ vi.mock("./components/views/InspectorView/InspectorView", () => ({ filterText: string; visibleLevels: Record; }) => void; - onCallTool: (name: string, args: Record) => void; + progressByTaskId?: Record; + onCallTool: ( + name: string, + args: Record, + runAsTask?: boolean, + ) => void; onGetPrompt: (name: string, args: Record) => void; onReadResource: (uri: string) => void; onSetLogLevel: (level: string) => void; + onCancelTask: (taskId: string) => void; + onClearCompletedTasks: () => void; + onRefreshTasks: () => void; }) => (
{props.toolCallState?.status ?? "none"} + + {Object.keys(props.progressByTaskId ?? {}).join(",") || "none"} + {props.toolsUi?.selectedToolName ?? "none"} @@ -307,6 +326,14 @@ vi.mock("./components/views/InspectorView/InspectorView", () => ({ set-log-filter + + + +