@@ -18,7 +18,7 @@ import { URI } from '../../../../../base/common/uri.js';
1818import { TextEdit } from '../../../../../editor/common/languages.js' ;
1919import { ITextModelService } from '../../../../../editor/common/services/resolverService.js' ;
2020import { localize , localize2 } from '../../../../../nls.js' ;
21- import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js' ;
21+ import { IContextKey , IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js' ;
2222import { EditorActivation } from '../../../../../platform/editor/common/editor.js' ;
2323import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js' ;
2424import { bindContextKey } from '../../../../../platform/observable/common/platformObservableUtils.js' ;
@@ -33,7 +33,7 @@ import { MultiDiffEditorInput } from '../../../multiDiffEditor/browser/multiDiff
3333import { IMultiDiffSourceResolver , IMultiDiffSourceResolverService , IResolvedMultiDiffSource , MultiDiffEditorItem } from '../../../multiDiffEditor/browser/multiDiffSourceResolverService.js' ;
3434import { ICodeMapperResponse , ICodeMapperService } from '../../common/chatCodeMapperService.js' ;
3535import { CONTEXT_CHAT_EDITING_CAN_REDO , CONTEXT_CHAT_EDITING_CAN_UNDO } from '../../common/chatContextKeys.js' ;
36- import { applyingChatEditsContextKey , CHAT_EDITING_MULTI_DIFF_SOURCE_RESOLVER_SCHEME , chatEditingMaxFileAssignmentName , chatEditingResourceContextKey , ChatEditingSessionState , decidedChatEditingResourceContextKey , defaultChatEditingMaxFileLimit , hasAppliedChatEditsContextKey , hasUndecidedChatEditingResourceContextKey , IChatEditingService , IChatEditingSession , IChatEditingSessionStream , inChatEditingSessionContextKey , WorkingSetEntryState } from '../../common/chatEditingService.js' ;
36+ import { applyingChatEditsContextKey , applyingChatEditsFailedContextKey , CHAT_EDITING_MULTI_DIFF_SOURCE_RESOLVER_SCHEME , chatEditingMaxFileAssignmentName , chatEditingResourceContextKey , ChatEditingSessionState , decidedChatEditingResourceContextKey , defaultChatEditingMaxFileLimit , hasAppliedChatEditsContextKey , hasUndecidedChatEditingResourceContextKey , IChatEditingService , IChatEditingSession , IChatEditingSessionStream , inChatEditingSessionContextKey , WorkingSetEntryState } from '../../common/chatEditingService.js' ;
3737import { IChatResponseModel , IChatTextEditGroup } from '../../common/chatModel.js' ;
3838import { IChatService } from '../../common/chatService.js' ;
3939import { ChatEditingSession } from './chatEditingSession.js' ;
@@ -73,6 +73,8 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
7373 return this . _editingSessionFileLimit ?? defaultChatEditingMaxFileLimit ;
7474 }
7575
76+ private _applyingChatEditsFailedContextKey : IContextKey < boolean | undefined > ;
77+
7678 constructor (
7779 @IEditorGroupsService private readonly _editorGroupsService : IEditorGroupsService ,
7880 @IInstantiationService private readonly _instantiationService : IInstantiationService ,
@@ -87,6 +89,8 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
8789 @IWorkbenchAssignmentService private readonly _workbenchAssignmentService : IWorkbenchAssignmentService
8890 ) {
8991 super ( ) ;
92+ this . _applyingChatEditsFailedContextKey = applyingChatEditsFailedContextKey . bindTo ( contextKeyService ) ;
93+ this . _applyingChatEditsFailedContextKey . set ( false ) ;
9094 this . _register ( decorationsService . registerDecorationsProvider ( new ChatDecorationsProvider ( this . _currentSessionObs ) ) ) ;
9195 this . _register ( multiDiffSourceResolverService . registerResolver ( _instantiationService . createInstance ( ChatEditingMultiDiffSourceResolver , this . _currentSessionObs ) ) ) ;
9296 textModelService . registerTextModelContentProvider ( ChatEditingTextModelContentProvider . scheme , _instantiationService . createInstance ( ChatEditingTextModelContentProvider , this . _currentSessionObs ) ) ;
@@ -241,7 +245,11 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
241245 const editsSeen = new ResourceMap < { seen : number } > ( ) ;
242246
243247 const onResponseComplete = ( responseModel : IChatResponseModel ) => {
244- if ( responseModel . result ?. metadata ?. autoApplyEdits ) {
248+ if ( responseModel . result ?. errorDetails ) {
249+ // Roll back everything
250+ this . restoreSnapshot ( responseModel . requestId ) ;
251+ this . _applyingChatEditsFailedContextKey . set ( true ) ;
252+ } else if ( responseModel . result ?. metadata ?. autoApplyEdits ) {
245253 this . triggerEditComputation ( responseModel ) ;
246254 }
247255
@@ -290,6 +298,7 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
290298
291299 observerDisposables . add ( chatModel . onDidChange ( e => {
292300 if ( e . kind === 'addRequest' ) {
301+ this . _applyingChatEditsFailedContextKey . set ( false ) ;
293302 const responseModel = e . request . response ;
294303 if ( responseModel ) {
295304 if ( responseModel . isComplete ) {
0 commit comments