From b072e78c741b9a20ec0e3cc2474424b506004a2a Mon Sep 17 00:00:00 2001 From: justschen Date: Fri, 31 Oct 2025 13:03:48 -0700 Subject: [PATCH 1/2] fix off by one error for edits and checkpoints --- .../chat/browser/actions/chatExecuteActions.ts | 11 ++++++++--- .../chat/browser/chatEditing/chatEditingActions.ts | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts index 2ccea1a6f3aad..4d0988c736a83 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts @@ -80,7 +80,7 @@ abstract class SubmitAction extends Action2 { if (requestId) { const chatRequests = chatModel.getRequests(); - const itemIndex = chatRequests.findIndex(request => request.id === requestId); + const itemIndex = chatRequests.findIndex(request => request.id === requestId) - 1; const editsToUndo = chatRequests.length - itemIndex; const requestsToRemove = chatRequests.slice(itemIndex); @@ -149,8 +149,13 @@ abstract class SubmitAction extends Action2 { } // Restore the snapshot to what it was before the request(s) that we deleted - const snapshotRequestId = chatRequests[itemIndex].id; - await session.restoreSnapshot(snapshotRequestId, undefined); + if (itemIndex < 0) { + const snapshotRequestId = chatRequests[0].id; + chatService.removeRequest(widget.viewModel.sessionResource, snapshotRequestId); + } else { + const snapshotRequestId = chatRequests[itemIndex].id; + await session.restoreSnapshot(snapshotRequestId, undefined); + } } } else if (widget?.viewModel?.model.checkpoint) { widget.viewModel.model.setCheckpoint(undefined); diff --git a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts index 015bec3ada53f..8bdc92589a4fd 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts @@ -322,7 +322,7 @@ async function restoreSnapshotWithConfirmation(accessor: ServicesAccessor, item: if (requestId) { const chatRequests = chatModel.getRequests(); - const itemIndex = chatRequests.findIndex(request => request.id === requestId); + const itemIndex = chatRequests.findIndex(request => request.id === requestId) - 1; const editsToUndo = chatRequests.length - itemIndex; const requestsToRemove = chatRequests.slice(itemIndex); @@ -367,8 +367,13 @@ async function restoreSnapshotWithConfirmation(accessor: ServicesAccessor, item: } // Restore the snapshot to what it was before the request(s) that we deleted - const snapshotRequestId = chatRequests[itemIndex].id; - await session.restoreSnapshot(snapshotRequestId, undefined); + if (itemIndex < 0 && widget?.viewModel?.sessionResource) { + const snapshotRequestId = chatRequests[0].id; + chatService.removeRequest(widget.viewModel.sessionResource, snapshotRequestId); + } else { + const snapshotRequestId = chatRequests[itemIndex].id; + await session.restoreSnapshot(snapshotRequestId, undefined); + } } } From ad9fbf81d248ca490fc5da431616118f4d7e3dd9 Mon Sep 17 00:00:00 2001 From: justschen Date: Fri, 31 Oct 2025 13:19:31 -0700 Subject: [PATCH 2/2] address some copilot comments --- .../contrib/chat/browser/actions/chatExecuteActions.ts | 2 +- .../contrib/chat/browser/chatEditing/chatEditingActions.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts index 4d0988c736a83..fe3f0c34649d5 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts @@ -83,7 +83,7 @@ abstract class SubmitAction extends Action2 { const itemIndex = chatRequests.findIndex(request => request.id === requestId) - 1; const editsToUndo = chatRequests.length - itemIndex; - const requestsToRemove = chatRequests.slice(itemIndex); + const requestsToRemove = itemIndex < 0 ? chatRequests : chatRequests.slice(itemIndex); const requestIdsToRemove = new Set(requestsToRemove.map(request => request.id)); const entriesModifiedInRequestsToRemove = session.entries.get().filter((entry) => requestIdsToRemove.has(entry.lastModifyingRequestId)) ?? []; const shouldPrompt = entriesModifiedInRequestsToRemove.length > 0 && configurationService.getValue('chat.editing.confirmEditRequestRemoval') === true; diff --git a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts index 8bdc92589a4fd..5a7d51dca6c46 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.ts @@ -325,7 +325,7 @@ async function restoreSnapshotWithConfirmation(accessor: ServicesAccessor, item: const itemIndex = chatRequests.findIndex(request => request.id === requestId) - 1; const editsToUndo = chatRequests.length - itemIndex; - const requestsToRemove = chatRequests.slice(itemIndex); + const requestsToRemove = itemIndex < 0 ? chatRequests : chatRequests.slice(itemIndex); const requestIdsToRemove = new Set(requestsToRemove.map(request => request.id)); const entriesModifiedInRequestsToRemove = session.entries.get().filter((entry) => requestIdsToRemove.has(entry.lastModifyingRequestId)) ?? []; const shouldPrompt = entriesModifiedInRequestsToRemove.length > 0 && configurationService.getValue('chat.editing.confirmEditRequestRemoval') === true; @@ -367,7 +367,7 @@ async function restoreSnapshotWithConfirmation(accessor: ServicesAccessor, item: } // Restore the snapshot to what it was before the request(s) that we deleted - if (itemIndex < 0 && widget?.viewModel?.sessionResource) { + if (itemIndex < 0 && widget?.viewModel) { const snapshotRequestId = chatRequests[0].id; chatService.removeRequest(widget.viewModel.sessionResource, snapshotRequestId); } else {