Skip to content

Commit 6d2755d

Browse files
authored
save files on accept (#244244)
* update milestones * save files on accept fixes microsoft/vscode-copilot#11498
1 parent a10f30d commit 6d2755d

File tree

5 files changed

+22
-44
lines changed

5 files changed

+22
-44
lines changed

.vscode/notebooks/my-endgame.github-issues

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{
88
"kind": 2,
99
"language": "github-issues",
10-
"value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"February 2025\"\n\n$MINE=assignee:@me"
10+
"value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"March 2025\"\n\n$MINE=assignee:@me"
1111
},
1212
{
1313
"kind": 1,

.vscode/notebooks/my-work.github-issues

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{
88
"kind": 2,
99
"language": "github-issues",
10-
"value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n// current milestone name\n$MILESTONE=milestone:\"February 2025\"\n"
10+
"value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n// current milestone name\n$MILESTONE=milestone:\"March 2025\"\n"
1111
},
1212
{
1313
"kind": 1,

src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedDocumentEntry.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import { editorSelectionBackground } from '../../../../../platform/theme/common/
3838
import { IUndoRedoElement, IUndoRedoService } from '../../../../../platform/undoRedo/common/undoRedo.js';
3939
import { SaveReason, IEditorPane } from '../../../../common/editor.js';
4040
import { IFilesConfigurationService } from '../../../../services/filesConfiguration/common/filesConfigurationService.js';
41-
import { IResolvedTextFileEditorModel, stringToSnapshot } from '../../../../services/textfile/common/textfiles.js';
41+
import { IResolvedTextFileEditorModel, ITextFileService, stringToSnapshot } from '../../../../services/textfile/common/textfiles.js';
4242
import { ICellEditOperation } from '../../../notebook/common/notebookCommon.js';
4343
import { IModifiedFileEntry, ChatEditKind, WorkingSetEntryState, IModifiedFileEntryEditorIntegration } from '../../common/chatEditingService.js';
4444
import { IChatResponseModel } from '../../common/chatModel.js';
@@ -110,6 +110,7 @@ export class ChatEditingModifiedDocumentEntry extends AbstractChatEditingModifie
110110
@IFilesConfigurationService fileConfigService: IFilesConfigurationService,
111111
@IChatService chatService: IChatService,
112112
@IEditorWorkerService private readonly _editorWorkerService: IEditorWorkerService,
113+
@ITextFileService private readonly _textFileService: ITextFileService,
113114
@IFileService fileService: IFileService,
114115
@IUndoRedoService undoRedoService: IUndoRedoService,
115116
@IInstantiationService instantiationService: IInstantiationService,
@@ -431,6 +432,21 @@ export class ChatEditingModifiedDocumentEntry extends AbstractChatEditingModifie
431432
this._diffInfo.set(nullDocumentDiff, tx);
432433
this._edit = OffsetEdit.empty;
433434
await this._collapse(tx);
435+
436+
const config = this._fileConfigService.getAutoSaveConfiguration(this.modifiedURI);
437+
if (!config.autoSave || !this._textFileService.isDirty(this.modifiedURI)) {
438+
// SAVE after accept for manual-savers, for auto-savers
439+
// trigger explict save to get save participants going
440+
try {
441+
await this._textFileService.save(this.modifiedURI, {
442+
reason: SaveReason.EXPLICIT,
443+
force: true,
444+
ignoreErrorHandler: true
445+
});
446+
} catch {
447+
// ignored
448+
}
449+
}
434450
}
435451

436452
protected override async _doReject(tx: ITransaction | undefined): Promise<void> {

src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export abstract class AbstractChatEditingModifiedFileEntry extends Disposable im
8686
protected _telemetryInfo: IModifiedEntryTelemetryInfo,
8787
kind: ChatEditKind,
8888
@IConfigurationService configService: IConfigurationService,
89-
@IFilesConfigurationService fileConfigService: IFilesConfigurationService,
89+
@IFilesConfigurationService protected _fileConfigService: IFilesConfigurationService,
9090
@IChatService protected readonly _chatService: IChatService,
9191
@IFileService protected readonly _fileService: IFileService,
9292
@IUndoRedoService private readonly _undoRedoService: IUndoRedoService,
@@ -122,7 +122,7 @@ export abstract class AbstractChatEditingModifiedFileEntry extends Disposable im
122122
const autoSaveOff = this._store.add(new MutableDisposable());
123123
this._store.add(autorun(r => {
124124
if (this.isCurrentlyBeingModifiedBy.read(r)) {
125-
autoSaveOff.value = fileConfigService.disableAutoSave(this.modifiedURI);
125+
autoSaveOff.value = _fileConfigService.disableAutoSave(this.modifiedURI);
126126
} else {
127127
autoSaveOff.clear();
128128
}

src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.ts

+1-39
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ import { BugIndicatingError } from '../../../../../base/common/errors.js';
1010
import { Emitter } from '../../../../../base/common/event.js';
1111
import { StringSHA1 } from '../../../../../base/common/hash.js';
1212
import { Iterable } from '../../../../../base/common/iterator.js';
13-
import { Disposable, DisposableMap, dispose } from '../../../../../base/common/lifecycle.js';
13+
import { Disposable, dispose } from '../../../../../base/common/lifecycle.js';
1414
import { ResourceMap } from '../../../../../base/common/map.js';
1515
import { asyncTransaction, autorun, derived, derivedOpts, derivedWithStore, IObservable, IReader, ITransaction, ObservablePromise, observableValue, transaction } from '../../../../../base/common/observable.js';
16-
import { autorunDelta, autorunIterableDelta } from '../../../../../base/common/observableInternal/autorun.js';
1716
import { isEqual, joinPath } from '../../../../../base/common/resources.js';
1817
import { URI } from '../../../../../base/common/uri.js';
1918
import { IBulkEditService } from '../../../../../editor/browser/services/bulkEditService.js';
@@ -33,11 +32,9 @@ import { IInstantiationService } from '../../../../../platform/instantiation/com
3332
import { ILogService } from '../../../../../platform/log/common/log.js';
3433
import { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js';
3534
import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js';
36-
import { SaveReason } from '../../../../common/editor.js';
3735
import { DiffEditorInput } from '../../../../common/editor/diffEditorInput.js';
3836
import { IEditorGroupsService } from '../../../../services/editor/common/editorGroupsService.js';
3937
import { IEditorService } from '../../../../services/editor/common/editorService.js';
40-
import { ITextFileService } from '../../../../services/textfile/common/textfiles.js';
4138
import { MultiDiffEditor } from '../../../multiDiffEditor/browser/multiDiffEditor.js';
4239
import { MultiDiffEditorInput } from '../../../multiDiffEditor/browser/multiDiffEditorInput.js';
4340
import { INotebookService } from '../../../notebook/common/notebookService.js';
@@ -196,7 +193,6 @@ export class ChatEditingSession extends Disposable implements IChatEditingSessio
196193
@IEditorService private readonly _editorService: IEditorService,
197194
@IChatService private readonly _chatService: IChatService,
198195
@INotebookService private readonly _notebookService: INotebookService,
199-
@ITextFileService private readonly _textFileService: ITextFileService,
200196
@IEditorWorkerService private readonly _editorWorkerService: IEditorWorkerService,
201197
@IConfigurationService private readonly _configurationService: IConfigurationService,
202198
@IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService,
@@ -219,7 +215,6 @@ export class ChatEditingSession extends Disposable implements IChatEditingSessio
219215
});
220216
}
221217

222-
this._triggerSaveParticipantsOnAccept();
223218
this._register(autorun(reader => {
224219
const entries = this.entries.read(reader);
225220
entries.forEach(entry => {
@@ -255,39 +250,6 @@ export class ChatEditingSession extends Disposable implements IChatEditingSessio
255250
return storage.storeState(state);
256251
}
257252

258-
private _triggerSaveParticipantsOnAccept() {
259-
const im = this._register(new DisposableMap<IModifiedFileEntry>());
260-
const attachToEntry = (entry: IModifiedFileEntry) => {
261-
return autorunDelta(entry.state, ({ lastValue, newValue }) => {
262-
if (newValue === WorkingSetEntryState.Accepted && lastValue === WorkingSetEntryState.Modified) {
263-
// Don't save a file if there's still pending changes. If there's not (e.g.
264-
// the agentic flow with autosave) then save again to trigger participants.
265-
if (!this._textFileService.isDirty(entry.modifiedURI)) {
266-
this._textFileService.save(entry.modifiedURI, {
267-
reason: SaveReason.EXPLICIT,
268-
force: true,
269-
ignoreErrorHandler: true,
270-
}).catch(() => {
271-
// ignored
272-
});
273-
}
274-
}
275-
});
276-
};
277-
278-
this._register(autorunIterableDelta(
279-
reader => this._entriesObs.read(reader),
280-
({ addedValues, removedValues }) => {
281-
for (const entry of addedValues) {
282-
im.set(entry, attachToEntry(entry));
283-
}
284-
for (const entry of removedValues) {
285-
im.deleteAndDispose(entry);
286-
}
287-
}
288-
));
289-
}
290-
291253
private _findSnapshot(requestId: string): IChatEditingSessionSnapshot | undefined {
292254
return this._linearHistory.get().find(s => s.requestId === requestId);
293255
}

0 commit comments

Comments
 (0)