From c9bd3ecf6a46acb15dbeb44805e2a4858fa15e46 Mon Sep 17 00:00:00 2001 From: Shreya Keshive Date: Tue, 2 Sep 2025 21:24:44 -0700 Subject: [PATCH] fix(ide): prevent race condition when diff accepted through CLI (#7633) --- .../vscode-ide-companion/src/diff-manager.ts | 24 ++++++++++--------- .../vscode-ide-companion/src/ide-server.ts | 14 +++++++++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/vscode-ide-companion/src/diff-manager.ts b/packages/vscode-ide-companion/src/diff-manager.ts index ec71347816..7acce07a61 100644 --- a/packages/vscode-ide-companion/src/diff-manager.ts +++ b/packages/vscode-ide-companion/src/diff-manager.ts @@ -132,7 +132,7 @@ export class DiffManager { /** * Closes an open diff view for a specific file. */ - async closeDiff(filePath: string) { + async closeDiff(filePath: string, suppressNotification = false) { let uriToClose: vscode.Uri | undefined; for (const [uriString, diffInfo] of this.diffDocuments.entries()) { if (diffInfo.originalFilePath === filePath) { @@ -145,16 +145,18 @@ export class DiffManager { const rightDoc = await vscode.workspace.openTextDocument(uriToClose); const modifiedContent = rightDoc.getText(); await this.closeDiffEditor(uriToClose); - this.onDidChangeEmitter.fire( - IdeDiffClosedNotificationSchema.parse({ - jsonrpc: '2.0', - method: 'ide/diffClosed', - params: { - filePath, - content: modifiedContent, - }, - }), - ); + if (!suppressNotification) { + this.onDidChangeEmitter.fire( + IdeDiffClosedNotificationSchema.parse({ + jsonrpc: '2.0', + method: 'ide/diffClosed', + params: { + filePath, + content: modifiedContent, + }, + }), + ); + } return modifiedContent; } return; diff --git a/packages/vscode-ide-companion/src/ide-server.ts b/packages/vscode-ide-companion/src/ide-server.ts index add6bad0bf..6b4c1689ae 100644 --- a/packages/vscode-ide-companion/src/ide-server.ts +++ b/packages/vscode-ide-companion/src/ide-server.ts @@ -356,10 +356,20 @@ const createMcpServer = (diffManager: DiffManager) => { description: '(IDE Tool) Close an open diff view for a specific file.', inputSchema: z.object({ filePath: z.string(), + suppressNotification: z.boolean().optional(), }).shape, }, - async ({ filePath }: { filePath: string }) => { - const content = await diffManager.closeDiff(filePath); + async ({ + filePath, + suppressNotification, + }: { + filePath: string; + suppressNotification?: boolean; + }) => { + const content = await diffManager.closeDiff( + filePath, + suppressNotification, + ); const response = { content: content ?? undefined }; return { content: [