Skip to content

Commit 99ad9fa

Browse files
authored
edits: move edit confirmations to extension tools (microsoft#262196)
Goes with microsoft/vscode-copilot-chat#646
1 parent b77b01d commit 99ad9fa

File tree

8 files changed

+10
-66
lines changed

8 files changed

+10
-66
lines changed

src/vs/workbench/contrib/chat/browser/chat.contribution.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import { ChatTodoListService, IChatTodoListService } from '../common/chatTodoLis
4444
import { ChatTransferService, IChatTransferService } from '../common/chatTransferService.js';
4545
import { IChatVariablesService } from '../common/chatVariables.js';
4646
import { ChatWidgetHistoryService, IChatWidgetHistoryService } from '../common/chatWidgetHistoryService.js';
47-
import { ChatAgentLocation, chatAutoApproveEditsDefaultConfiguration, ChatConfiguration, ChatModeKind } from '../common/constants.js';
47+
import { ChatAgentLocation, ChatConfiguration, ChatModeKind } from '../common/constants.js';
4848
import { ILanguageModelIgnoredFilesService, LanguageModelIgnoredFilesService } from '../common/ignoredFiles.js';
4949
import { ILanguageModelsService, LanguageModelsService } from '../common/languageModels.js';
5050
import { ILanguageModelStatsService, LanguageModelStatsService } from '../common/languageModelStats.js';
@@ -236,7 +236,10 @@ configurationRegistry.registerConfiguration({
236236
}
237237
},
238238
[ChatConfiguration.AutoApproveEdits]: {
239-
default: chatAutoApproveEditsDefaultConfiguration,
239+
default: {
240+
'**/*': true,
241+
'**/.vscode/*.json': false,
242+
},
240243
markdownDescription: nls.localize('chat.tools.autoApprove.edits', "Controls whether edits made by chat are automatically approved. The default is to approve all edits except those made to certain files which have the potential to cause immediate unintened side-effects, such as `**/.vscode/*.json`.\n\nFiles are matched against the glob patterns in the order they are specified."),
241244
type: 'object',
242245
additionalProperties: {

src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,6 @@ class CollapsibleListRenderer implements IListRenderer<IChatCollapsibleListItem,
385385
range: 'range' in reference ? reference.range : undefined,
386386
title: data.options?.status?.description ?? data.title,
387387
strikethrough: data.excluded,
388-
icon: ThemeIcon.isThemeIcon(data.iconPath) ? data.iconPath : undefined,
389-
descriptionTitle: data.description,
390388
extraClasses
391389
});
392390
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,7 @@ export class ChatEditingModifiedDocumentEntry extends AbstractChatEditingModifie
223223
this._rewriteRatioObs.set(1, tx);
224224
}
225225
});
226-
227-
if (isLastEdits && !this.editsRequireManualApproval.get()) {
226+
if (isLastEdits) {
228227
await this._textFileService.save(this.modifiedModel.uri, {
229228
reason: SaveReason.AUTO,
230229
skipSaveParticipants: true,

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

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import { RunOnceScheduler } from '../../../../../base/common/async.js';
77
import { Emitter } from '../../../../../base/common/event.js';
8-
import * as glob from '../../../../../base/common/glob.js';
98
import { Disposable, DisposableMap, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';
109
import { Schemas } from '../../../../../base/common/network.js';
1110
import { clamp } from '../../../../../base/common/numbers.js';
@@ -25,7 +24,6 @@ import { ICellEditOperation } from '../../../notebook/common/notebookCommon.js';
2524
import { ChatEditKind, IModifiedEntryTelemetryInfo, IModifiedFileEntry, IModifiedFileEntryEditorIntegration, ISnapshotEntry, ModifiedFileEntryState } from '../../common/chatEditingService.js';
2625
import { IChatResponseModel } from '../../common/chatModel.js';
2726
import { ChatUserAction, IChatService } from '../../common/chatService.js';
28-
import { chatAutoApproveEditsDefaultConfiguration, ChatConfiguration } from '../../common/constants.js';
2927

3028
class AutoAcceptControl {
3129
constructor(
@@ -76,8 +74,6 @@ export abstract class AbstractChatEditingModifiedFileEntry extends Disposable im
7674
private readonly _autoAcceptCtrl = observableValue<AutoAcceptControl | undefined>(this, undefined);
7775
readonly autoAcceptController: IObservable<AutoAcceptControl | undefined> = this._autoAcceptCtrl;
7876

79-
readonly editsRequireManualApproval: IObservable<boolean>;
80-
8177
protected readonly _autoAcceptTimeout: IObservable<number>;
8278

8379
get telemetryInfo(): IModifiedEntryTelemetryInfo {
@@ -122,20 +118,6 @@ export abstract class AbstractChatEditingModifiedFileEntry extends Disposable im
122118
}));
123119
}
124120

125-
const autoApproveConfig = observableConfigValue(ChatConfiguration.AutoApproveEdits, chatAutoApproveEditsDefaultConfiguration, configService);
126-
this.editsRequireManualApproval = autoApproveConfig.map(config => {
127-
let autoApprove = true;
128-
for (const [pattern, value] of Object.entries(config)) {
129-
if (value === autoApprove) {
130-
continue; // would not change match anyway
131-
}
132-
if (glob.match(pattern, this.modifiedURI.fsPath)) {
133-
autoApprove = value;
134-
}
135-
}
136-
return !autoApprove;
137-
});
138-
139121
// review mode depends on setting and temporary override
140122
const autoAcceptRaw = observableConfigValue('chat.editing.autoAcceptDelay', 0, configService);
141123
this._autoAcceptTimeout = derived(r => {
@@ -152,7 +134,7 @@ export abstract class AbstractChatEditingModifiedFileEntry extends Disposable im
152134

153135
const autoSaveOff = this._store.add(new MutableDisposable());
154136
this._store.add(autorun(r => {
155-
if (this._waitsForLastEdits.read(r) || (this.state.read(r) === ModifiedFileEntryState.Modified && this.editsRequireManualApproval.read(r))) {
137+
if (this._waitsForLastEdits.read(r)) {
156138
autoSaveOff.value = _fileConfigService.disableAutoSave(this.modifiedURI);
157139
} else {
158140
autoSaveOff.clear();

src/vs/workbench/contrib/chat/browser/chatInputPart.ts

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge
330330

331331
private readonly _chatEditsActionsDisposables: DisposableStore;
332332
private readonly _chatEditsDisposables: DisposableStore;
333-
private _chatEditsContainer?: HTMLElement;
334-
private _chatEditsApprovalContainer?: HTMLElement;
335333
private _chatEditsListPool: CollapsibleListPool;
336334
private _chatEditList: IDisposableReference<WorkbenchList<IChatCollapsibleListItem>> | undefined;
337335
get selectedElements(): URI[] {
@@ -1524,7 +1522,6 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge
15241522

15251523
const seenEntries = new ResourceSet();
15261524
const entries: IChatCollapsibleListItem[] = [];
1527-
let manualApprovalNeeded = false;
15281525
if (chatEditingSession) {
15291526
for (const entry of chatEditingSession.entries.get()) {
15301527
if (entry.state.get() !== ModifiedFileEntryState.Modified) {
@@ -1533,19 +1530,11 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge
15331530

15341531
if (!seenEntries.has(entry.modifiedURI)) {
15351532
seenEntries.add(entry.modifiedURI);
1536-
const item: IChatCollapsibleListItem = {
1533+
entries.push({
15371534
reference: entry.modifiedURI,
15381535
state: entry.state.get(),
15391536
kind: 'reference',
1540-
};
1541-
1542-
if (entry.editsRequireManualApproval.get()) {
1543-
item.iconPath = Codicon.warning;
1544-
item.description = localize('chatEditingSession.fileRequiresManualApproval', 'Edits requires manual approval');
1545-
manualApprovalNeeded = true;
1546-
}
1547-
1548-
entries.push(item);
1537+
});
15491538
}
15501539
}
15511540
}
@@ -1554,21 +1543,11 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge
15541543
dom.clearNode(this.chatEditingSessionWidgetContainer);
15551544
this._chatEditsDisposables.clear();
15561545
this._chatEditList = undefined;
1557-
this._chatEditsContainer = undefined;
1558-
this._chatEditsApprovalContainer = undefined;
15591546
return;
15601547
}
15611548

15621549
// Summary of number of files changed
1563-
const approvalNotice = (this._chatEditsApprovalContainer ??= dom.append(this.chatEditingSessionWidgetContainer, $('.chat-editing-session-approval-notice')));
1564-
const innerContainer = (this._chatEditsContainer ??= dom.append(this.chatEditingSessionWidgetContainer, $('.chat-editing-session-container.show-file-icons')));
1565-
1566-
if (manualApprovalNeeded) {
1567-
approvalNotice.style.display = 'block';
1568-
approvalNotice.textContent = localize('chatEditingSession.manualApprovalNeeded', 'One or more file edits require manual approval');
1569-
} else {
1570-
approvalNotice.style.display = 'none';
1571-
}
1550+
const innerContainer = this.chatEditingSessionWidgetContainer.querySelector('.chat-editing-session-container.show-file-icons') as HTMLElement ?? dom.append(this.chatEditingSessionWidgetContainer, $('.chat-editing-session-container.show-file-icons'));
15721551

15731552
entries.sort((a, b) => {
15741553
if (a.kind === 'reference' && b.kind === 'reference') {

src/vs/workbench/contrib/chat/browser/media/chat.css

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -724,13 +724,6 @@ have to be updated for changes to the rules above, or to support more deeply nes
724724
display: inherit;
725725
}
726726

727-
.interactive-session .chat-editing-session .chat-editing-session-approval-notice {
728-
font-size: 12px;
729-
padding: 4px 8px;
730-
color: var(--vscode-list-warningForeground);
731-
text-align: center;
732-
}
733-
734727
.interactive-session .chat-editing-session .chat-editing-session-container.show-file-icons .monaco-scrollable-element .monaco-list-rows .monaco-list-row {
735728
border-radius: 2px;
736729
}
@@ -1774,10 +1767,6 @@ have to be updated for changes to the rules above, or to support more deeply nes
17741767
padding: 0px 3px;
17751768
}
17761769

1777-
.monaco-icon-label.codicon-warning::before {
1778-
color: var(--vscode-list-warningForeground);
1779-
}
1780-
17811770
.monaco-icon-label.excluded {
17821771
color: var(--vscode-notificationsWarningIcon-foreground)
17831772
}

src/vs/workbench/contrib/chat/common/chatEditingService.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,6 @@ export interface IModifiedFileEntry {
238238
readonly lastModifyingRequestId: string;
239239

240240
readonly state: IObservable<ModifiedFileEntryState>;
241-
readonly editsRequireManualApproval: IObservable<boolean>;
242241
readonly isCurrentlyBeingModifiedBy: IObservable<IChatResponseModel | undefined>;
243242
readonly lastModifyingResponse: IObservable<IChatResponseModel | undefined>;
244243
readonly rewriteRatio: IObservable<number>;

src/vs/workbench/contrib/chat/common/constants.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,3 @@ export namespace ChatAgentLocation {
6060
return ChatAgentLocation.Panel;
6161
}
6262
}
63-
64-
export const chatAutoApproveEditsDefaultConfiguration = {
65-
'**/*': true,
66-
'**/.vscode/*.json': false,
67-
};

0 commit comments

Comments
 (0)