From f4557ef6a88fd3367481411a2296afe7901e0a6a Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Thu, 29 May 2025 03:03:12 -0700 Subject: [PATCH] opus 4 edits: ---- 1. parse id code { "code": -32602, "name": "McpError" } out and display it to the user 2. deleting an mcp server from the mcp file doesnt work, the server remains 3. ui - non-wrapping tooltips should wrap --- .../react/src/void-settings-tsx/Settings.tsx | 4 +- .../react/src/void-tooltip/VoidTooltip.tsx | 2 + .../contrib/void/common/mcpService.ts | 20 ++++++--- .../contrib/void/electron-main/mcpChannel.ts | 44 ++++++++++++++++++- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx index c48912bf..c7855359 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx @@ -948,7 +948,7 @@ const MCPServerComponent = ({ name, server }: { name: string, server: MCPServer data-tooltip-id='void-tooltip' data-tooltip-content={tool.description || ''} - data-tooltip-class-name='void-max-w-[20px]' + data-tooltip-class-name='void-max-w-[300px]' > {removeUniquePrefix(tool.name)} @@ -1140,7 +1140,7 @@ export const Settings = () => { className='hover:brightness-110' data-tooltip-id='void-tooltip' data-tooltip-content='We recommend using the largest qwen2.5-coder model you can with Ollama (try qwen2.5-coder:3b).' - data-tooltip-class-name='void-max-w-[20px]' + data-tooltip-class-name='void-max-w-[300px]' > Only works with FIM models.* diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx index ad80dfb5..7128adf4 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx @@ -50,6 +50,8 @@ export const VoidTooltip = () => { padding: 0px 8px; border-radius: 6px; z-index: 999999; + max-width: 300px; + word-wrap: break-word; } #void-tooltip { diff --git a/src/vs/workbench/contrib/void/common/mcpService.ts b/src/vs/workbench/contrib/void/common/mcpService.ts index 03785e8e..c40afb43 100644 --- a/src/vs/workbench/contrib/void/common/mcpService.ts +++ b/src/vs/workbench/contrib/void/common/mcpService.ts @@ -118,11 +118,21 @@ class MCPService extends Disposable implements IMCPService { } private readonly _setMCPServerState = async (serverName: string, newServer: MCPServer | undefined) => { - this.state = { - ...this.state, - mcpServerOfName: { - ...this.state.mcpServerOfName, - ...newServer === undefined ? {} : { [serverName]: newServer, } + if (newServer === undefined) { + // Remove the server from the state + const { [serverName]: removed, ...remainingServers } = this.state.mcpServerOfName; + this.state = { + ...this.state, + mcpServerOfName: remainingServers + } + } else { + // Add or update the server + this.state = { + ...this.state, + mcpServerOfName: { + ...this.state.mcpServerOfName, + [serverName]: newServer + } } } this._onDidChangeState.fire(); diff --git a/src/vs/workbench/contrib/void/electron-main/mcpChannel.ts b/src/vs/workbench/contrib/void/electron-main/mcpChannel.ts index 440a2af8..68c345d2 100644 --- a/src/vs/workbench/contrib/void/electron-main/mcpChannel.ts +++ b/src/vs/workbench/contrib/void/electron-main/mcpChannel.ts @@ -354,7 +354,49 @@ export class MCPChannel implements IServerChannel { const response = await this._callTool(serverName, toolName, params) return response } catch (err) { - const fullErrorMessage = `❌ Failed to call tool "${toolName}" on server "${serverName}": ${typeof err === 'string' ? err : JSON.stringify(err, null, 2)}` + let errorMessage: string; + + // Check if it's an MCP error with a code + if (err && typeof err === 'object' && 'code' in err) { + const errorCode = (err as any).code; + const errorName = (err as any).name || 'Unknown Error'; + const errorMsg = (err as any).message || ''; + + // Map common JSON-RPC error codes to user-friendly messages + let codeDescription = ''; + switch (errorCode) { + case -32700: + codeDescription = 'Parse Error'; + break; + case -32600: + codeDescription = 'Invalid Request'; + break; + case -32601: + codeDescription = 'Method Not Found'; + break; + case -32602: + codeDescription = 'Invalid Parameters'; + break; + case -32603: + codeDescription = 'Internal Error'; + break; + default: + codeDescription = `Error Code ${errorCode}`; + } + + errorMessage = `${errorName} (${codeDescription})${errorMsg ? ': ' + errorMsg : ''}`; + } else if (err && typeof err === 'object' && 'message' in err) { + // Standard error with message + errorMessage = (err as any).message; + } else if (typeof err === 'string') { + // String error + errorMessage = err; + } else { + // Unknown error format + errorMessage = JSON.stringify(err, null, 2); + } + + const fullErrorMessage = `❌ Failed to call tool "${toolName}" on server "${serverName}": ${errorMessage}`; const errorResponse: MCPToolErrorResponse = { event: 'error', text: fullErrorMessage,