From 689843d8920d0f6cbe5812f1423ddcba95605a89 Mon Sep 17 00:00:00 2001 From: uinstinct <61635505+uinstinct@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:48:46 +0530 Subject: [PATCH 1/2] fix: accept multiple diffs when with cmd+shift+enter --- extensions/vscode/src/diff/processDiff.ts | 81 ++++++++++++------- .../vscode/src/diff/vertical/manager.ts | 12 +++ 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/extensions/vscode/src/diff/processDiff.ts b/extensions/vscode/src/diff/processDiff.ts index cbff6f4a363..a134a9421c8 100644 --- a/extensions/vscode/src/diff/processDiff.ts +++ b/extensions/vscode/src/diff/processDiff.ts @@ -8,47 +8,29 @@ import { VsCodeIde } from "../VsCodeIde"; import { VerticalDiffManager } from "./vertical/manager"; -export async function processDiff( +async function processSingleFileDiff( action: "accept" | "reject", sidebar: ContinueGUIWebviewViewProvider, ide: VsCodeIde, - core: Core, verticalDiffManager: VerticalDiffManager, - newFileUri?: string, + fileUri: string, streamId?: string, toolCallId?: string, ) { - let newOrCurrentUri = newFileUri; - if (!newOrCurrentUri) { - const currentFile = await ide.getCurrentFile(); - newOrCurrentUri = currentFile?.path; - } - if (!newOrCurrentUri) { - console.warn( - `No file provided or current file open while attempting to resolve diff`, - ); - return; - } - - await ide.openFile(newOrCurrentUri); + await ide.openFile(fileUri); // If streamId is not provided, try to get it from the VerticalDiffManager if (!streamId) { - streamId = verticalDiffManager.getStreamIdForFile(newOrCurrentUri); + streamId = verticalDiffManager.getStreamIdForFile(fileUri); } // Clear vertical diffs depending on action - verticalDiffManager.clearForfileUri(newOrCurrentUri, action === "accept"); - if (action === "reject") { - // this is so that IDE reject diff command can also cancel apply - core.invoke("cancelApply", undefined); - } + verticalDiffManager.clearForfileUri(fileUri, action === "accept"); if (streamId) { // Capture file content before save to detect autoformatting - const preSaveContent = await ide.readFile(newOrCurrentUri); + const preSaveContent = await ide.readFile(fileUri); - // Record the edit outcome before updating the apply state await editOutcomeTracker.recordEditOutcome( streamId, action === "accept", @@ -56,10 +38,10 @@ export async function processDiff( ); // Save the file - await ide.saveFile(newOrCurrentUri); + await ide.saveFile(fileUri); // Capture file content after save to detect autoformatting - const postSaveContent = await ide.readFile(newOrCurrentUri); + const postSaveContent = await ide.readFile(fileUri); // Detect autoformatting by comparing normalized content let autoFormattingDiff: string | undefined; @@ -85,7 +67,7 @@ export async function processDiff( await sidebar.webviewProtocol.request("updateApplyState", { fileContent: postSaveContent, // Use post-save content - filepath: newOrCurrentUri, + filepath: fileUri, streamId, status: "closed", numDiffs: 0, @@ -94,6 +76,49 @@ export async function processDiff( }); } else { // Save the file even if no streamId - await ide.saveFile(newOrCurrentUri); + await ide.saveFile(fileUri); + } +} + +export async function processDiff( + action: "accept" | "reject", + sidebar: ContinueGUIWebviewViewProvider, + ide: VsCodeIde, + core: Core, + verticalDiffManager: VerticalDiffManager, + newFileUri?: string, + streamId?: string, + toolCallId?: string, +) { + if (action === "reject") { + core.invoke("cancelApply", undefined); + } + + if (newFileUri) { + await processSingleFileDiff( + action, + sidebar, + ide, + verticalDiffManager, + newFileUri, + streamId, + toolCallId, + ); + return; + } + + const allFilesWithDiffs = verticalDiffManager.getAllFilesWithDiffs(); + + // accept all diffs in the files + for (const { fileUri, streamId: fileStreamId } of allFilesWithDiffs) { + await processSingleFileDiff( + action, + sidebar, + ide, + verticalDiffManager, + fileUri, + fileStreamId, + toolCallId, + ); } } diff --git a/extensions/vscode/src/diff/vertical/manager.ts b/extensions/vscode/src/diff/vertical/manager.ts index 059efe0aee4..57b39892306 100644 --- a/extensions/vscode/src/diff/vertical/manager.ts +++ b/extensions/vscode/src/diff/vertical/manager.ts @@ -79,6 +79,18 @@ export class VerticalDiffManager { return this.fileUriToHandler.get(fileUri)?.streamId; } + getAllFilesWithDiffs(): Array<{ + fileUri: string; + streamId: string | undefined; + }> { + return Array.from(this.fileUriToHandler.entries()).map( + ([fileUri, handler]) => ({ + fileUri, + streamId: handler.streamId, + }), + ); + } + // Creates a listener for document changes by user. private enableDocumentChangeListener(): vscode.Disposable | undefined { if (this.userChangeListener) { From e343eb5d191601eff549625053dcb576f5a1740d Mon Sep 17 00:00:00 2001 From: uinstinct <61635505+uinstinct@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:32:24 +0530 Subject: [PATCH 2/2] process visible diff --- extensions/vscode/src/diff/processDiff.ts | 45 +++++++++---------- .../vscode/src/diff/vertical/manager.ts | 13 +++--- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/extensions/vscode/src/diff/processDiff.ts b/extensions/vscode/src/diff/processDiff.ts index a134a9421c8..7274cdd7063 100644 --- a/extensions/vscode/src/diff/processDiff.ts +++ b/extensions/vscode/src/diff/processDiff.ts @@ -94,31 +94,30 @@ export async function processDiff( core.invoke("cancelApply", undefined); } - if (newFileUri) { - await processSingleFileDiff( - action, - sidebar, - ide, - verticalDiffManager, - newFileUri, - streamId, - toolCallId, - ); - return; + let fileUriToProcess = newFileUri; + + if (!fileUriToProcess) { + const allFilesWithDiffs = verticalDiffManager.getAllFilesWithDiffs(); + if (allFilesWithDiffs.length > 0) { + fileUriToProcess = allFilesWithDiffs[0].fileUri; + streamId = allFilesWithDiffs[0].streamId; + } } - const allFilesWithDiffs = verticalDiffManager.getAllFilesWithDiffs(); - - // accept all diffs in the files - for (const { fileUri, streamId: fileStreamId } of allFilesWithDiffs) { - await processSingleFileDiff( - action, - sidebar, - ide, - verticalDiffManager, - fileUri, - fileStreamId, - toolCallId, + if (!fileUriToProcess) { + console.warn( + `No file provided or current file open while attempting to resolve diff`, ); + return; } + + await processSingleFileDiff( + action, + sidebar, + ide, + verticalDiffManager, + fileUriToProcess, + streamId, + toolCallId, + ); } diff --git a/extensions/vscode/src/diff/vertical/manager.ts b/extensions/vscode/src/diff/vertical/manager.ts index 57b39892306..8117b9b04d7 100644 --- a/extensions/vscode/src/diff/vertical/manager.ts +++ b/extensions/vscode/src/diff/vertical/manager.ts @@ -156,16 +156,19 @@ export class VerticalDiffManager { this.disableDocumentChangeListener(); + const hasRemainingDiffs = this.fileUriToHandler.size > 0; void vscode.commands.executeCommand( "setContext", "continue.diffVisible", - false, + hasRemainingDiffs, ); - void this.webviewProtocol.request( - "focusContinueInputWithoutClear", - undefined, - ); + if (!hasRemainingDiffs) { + void this.webviewProtocol.request( + "focusContinueInputWithoutClear", + undefined, + ); + } } async acceptRejectVerticalDiffBlock(