Path: blob/main/extensions/copilot/src/extension/chatSessions/copilotcli/vscode-node/tools/closeDiff.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 type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';6import { z } from 'zod';7import { DiffStateManager } from '../diffState';8import { makeTextResult } from './utils';9import { ILogger } from '../../../../../platform/log/common/logService';1011export function registerCloseDiffTool(server: McpServer, logger: ILogger, diffState: DiffStateManager): void {12const schema = {13tab_name: z.string().describe('The tab name of the diff to close (must match the tab_name used when opening the diff)'),14};15server.registerTool(16'close_diff',17{18description: 'Closes a diff tab by its tab name. Use this when the client rejects an edit to close the corresponding diff view.',19inputSchema: schema,20},21// @ts-ignore - TS2589: zod type instantiation too deep for server.tool() generics22async (args: { tab_name: string }) => {23const { tab_name } = args;24logger.debug(`Closing diff: ${tab_name}`);25const diff = diffState.getByTabName(tab_name);2627if (!diff) {28logger.debug(`No active diff found with tab name: ${tab_name}`);29return makeTextResult({30success: true,31already_closed: true,32tab_name: tab_name,33message: `No active diff found with tab name "${tab_name}" (may already be closed)`,34});35}3637// Trigger the rejection flow which will clean up and close the tab38diff.resolve({ status: 'REJECTED', trigger: 'closed_via_tool' });39logger.info(`Diff closed via tool: ${tab_name}`);4041return makeTextResult({42success: true,43already_closed: false,44tab_name: tab_name,45message: `Diff "${tab_name}" closed successfully`,46});47}48);49}505152