Path: blob/main/extensions/copilot/src/extension/chatSessions/copilotcli/vscode-node/tools/getDiagnostics.ts
13406 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as vscode from 'vscode';6import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';7import { z } from 'zod';8import { makeTextResult } from './utils';9import { ILogger } from '../../../../../platform/log/common/logService';1011export function registerGetDiagnosticsTool(server: McpServer, logger: ILogger): void {12const schema = {13uri: z.string().optional().describe('File URI to get diagnostics for. Optional. If not provided, returns diagnostics for all files.'),14};15server.registerTool(16'get_diagnostics',17{18description: 'Gets language diagnostics (errors, warnings, hints) from VS Code',19inputSchema: schema,20},21// @ts-ignore - TS2589: zod type instantiation too deep for server.tool() generics22async (args: { uri?: string }) => {23const { uri } = args;24logger.debug(`Getting diagnostics${uri ? ` for: ${uri}` : ' for all files'}`);25let diagnostics: [vscode.Uri, readonly vscode.Diagnostic[]][];2627if (uri) {28const fileUri = vscode.Uri.parse(uri);29const fileDiagnostics = vscode.languages.getDiagnostics(fileUri);30diagnostics = [[fileUri, fileDiagnostics]];31} else {32diagnostics = vscode.languages.getDiagnostics();33}3435const result = diagnostics.map(([fileUri, fileDiagnostics]) => ({36uri: fileUri.toString(),37filePath: fileUri.fsPath,38diagnostics: fileDiagnostics.map(d => ({39message: d.message,40severity: vscode.DiagnosticSeverity[d.severity].toLowerCase(),41range: {42start: { line: d.range.start.line, character: d.range.start.character },43end: { line: d.range.end.line, character: d.range.end.character },44},45source: d.source,46code: typeof d.code === 'object' ? d.code.value : d.code,47})),48})).filter(item => item.diagnostics.length > 0);4950logger.trace(`Returning ${result.length} file(s) with diagnostics`);51return makeTextResult(result);52}53);54}555657