@@ -18,7 +18,7 @@ import { URI } from '../../../../../base/common/uri.js';
18
18
import { TextEdit } from '../../../../../editor/common/languages.js' ;
19
19
import { ITextModelService } from '../../../../../editor/common/services/resolverService.js' ;
20
20
import { localize , localize2 } from '../../../../../nls.js' ;
21
- import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js' ;
21
+ import { IContextKey , IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js' ;
22
22
import { EditorActivation } from '../../../../../platform/editor/common/editor.js' ;
23
23
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js' ;
24
24
import { bindContextKey } from '../../../../../platform/observable/common/platformObservableUtils.js' ;
@@ -33,7 +33,7 @@ import { MultiDiffEditorInput } from '../../../multiDiffEditor/browser/multiDiff
33
33
import { IMultiDiffSourceResolver , IMultiDiffSourceResolverService , IResolvedMultiDiffSource , MultiDiffEditorItem } from '../../../multiDiffEditor/browser/multiDiffSourceResolverService.js' ;
34
34
import { ICodeMapperResponse , ICodeMapperService } from '../../common/chatCodeMapperService.js' ;
35
35
import { 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' ;
37
37
import { IChatResponseModel , IChatTextEditGroup } from '../../common/chatModel.js' ;
38
38
import { IChatService } from '../../common/chatService.js' ;
39
39
import { ChatEditingSession } from './chatEditingSession.js' ;
@@ -73,6 +73,8 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
73
73
return this . _editingSessionFileLimit ?? defaultChatEditingMaxFileLimit ;
74
74
}
75
75
76
+ private _applyingChatEditsFailedContextKey : IContextKey < boolean | undefined > ;
77
+
76
78
constructor (
77
79
@IEditorGroupsService private readonly _editorGroupsService : IEditorGroupsService ,
78
80
@IInstantiationService private readonly _instantiationService : IInstantiationService ,
@@ -87,6 +89,8 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
87
89
@IWorkbenchAssignmentService private readonly _workbenchAssignmentService : IWorkbenchAssignmentService
88
90
) {
89
91
super ( ) ;
92
+ this . _applyingChatEditsFailedContextKey = applyingChatEditsFailedContextKey . bindTo ( contextKeyService ) ;
93
+ this . _applyingChatEditsFailedContextKey . set ( false ) ;
90
94
this . _register ( decorationsService . registerDecorationsProvider ( new ChatDecorationsProvider ( this . _currentSessionObs ) ) ) ;
91
95
this . _register ( multiDiffSourceResolverService . registerResolver ( _instantiationService . createInstance ( ChatEditingMultiDiffSourceResolver , this . _currentSessionObs ) ) ) ;
92
96
textModelService . registerTextModelContentProvider ( ChatEditingTextModelContentProvider . scheme , _instantiationService . createInstance ( ChatEditingTextModelContentProvider , this . _currentSessionObs ) ) ;
@@ -241,7 +245,11 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
241
245
const editsSeen = new ResourceMap < { seen : number } > ( ) ;
242
246
243
247
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 ) {
245
253
this . triggerEditComputation ( responseModel ) ;
246
254
}
247
255
@@ -290,6 +298,7 @@ export class ChatEditingService extends Disposable implements IChatEditingServic
290
298
291
299
observerDisposables . add ( chatModel . onDidChange ( e => {
292
300
if ( e . kind === 'addRequest' ) {
301
+ this . _applyingChatEditsFailedContextKey . set ( false ) ;
293
302
const responseModel = e . request . response ;
294
303
if ( responseModel ) {
295
304
if ( responseModel . isComplete ) {
0 commit comments