Skip to content

Commit 2a36a52

Browse files
authored
tools: remove 'any' type on confirmation buttons (microsoft#262946)
Caused some issues which we should avoid in the future
1 parent 3ae9caf commit 2a36a52

File tree

4 files changed

+38
-39
lines changed

4 files changed

+38
-39
lines changed

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ import { IViewsService } from '../../../../services/views/common/viewsService.js
2727
import { showChatView } from '../chat.js';
2828
import './media/chatConfirmationWidget.css';
2929

30-
export interface IChatConfirmationButton {
30+
export interface IChatConfirmationButton<T> {
3131
label: string;
3232
isSecondary?: boolean;
3333
tooltip?: string;
34-
data: any;
34+
data: T;
3535
disabled?: boolean;
3636
onDidChangeDisablement?: Event<boolean>;
37-
moreActions?: (IChatConfirmationButton | Separator)[];
37+
moreActions?: (IChatConfirmationButton<T> | Separator)[];
3838
}
3939

40-
export interface IChatConfirmationWidgetOptions {
40+
export interface IChatConfirmationWidgetOptions<T> {
4141
title: string | IMarkdownString;
4242
message: string | IMarkdownString;
4343
subtitle?: string | IMarkdownString;
44-
buttons: IChatConfirmationButton[];
44+
buttons: IChatConfirmationButton<T>[];
4545
toolbarData?: { arg: any; partType: string; partSource?: string };
4646
}
4747

@@ -105,9 +105,9 @@ export class ChatQueryTitlePart extends Disposable {
105105
}
106106
}
107107

108-
abstract class BaseSimpleChatConfirmationWidget extends Disposable {
109-
private _onDidClick = this._register(new Emitter<IChatConfirmationButton>());
110-
get onDidClick(): Event<IChatConfirmationButton> { return this._onDidClick.event; }
108+
abstract class BaseSimpleChatConfirmationWidget<T> extends Disposable {
109+
private _onDidClick = this._register(new Emitter<IChatConfirmationButton<T>>());
110+
get onDidClick(): Event<IChatConfirmationButton<T>> { return this._onDidClick.event; }
111111

112112
protected _onDidChangeHeight = this._register(new Emitter<void>());
113113
get onDidChangeHeight(): Event<void> { return this._onDidChangeHeight.event; }
@@ -132,7 +132,7 @@ abstract class BaseSimpleChatConfirmationWidget extends Disposable {
132132
private readonly notification = this._register(new MutableDisposable<DisposableStore>());
133133

134134
constructor(
135-
options: IChatConfirmationWidgetOptions,
135+
options: IChatConfirmationWidgetOptions<T>,
136136
@IInstantiationService protected readonly instantiationService: IInstantiationService,
137137
@IContextMenuService contextMenuService: IContextMenuService,
138138
@IConfigurationService private readonly _configurationService: IConfigurationService,
@@ -273,12 +273,12 @@ abstract class BaseSimpleChatConfirmationWidget extends Disposable {
273273
}
274274

275275
/** @deprecated Use ChatConfirmationWidget instead */
276-
export class SimpleChatConfirmationWidget extends BaseSimpleChatConfirmationWidget {
276+
export class SimpleChatConfirmationWidget<T> extends BaseSimpleChatConfirmationWidget<T> {
277277
private _renderedMessage: HTMLElement | undefined;
278278

279279
constructor(
280280
private readonly _container: HTMLElement,
281-
options: IChatConfirmationWidgetOptions,
281+
options: IChatConfirmationWidgetOptions<T>,
282282
@IInstantiationService instantiationService: IInstantiationService,
283283
@IContextMenuService contextMenuService: IContextMenuService,
284284
@IConfigurationService configurationService: IConfigurationService,
@@ -301,18 +301,18 @@ export class SimpleChatConfirmationWidget extends BaseSimpleChatConfirmationWidg
301301
}
302302
}
303303

304-
export interface IChatConfirmationWidget2Options {
304+
export interface IChatConfirmationWidget2Options<T> {
305305
title: string | IMarkdownString;
306306
message: string | IMarkdownString | HTMLElement;
307307
icon?: ThemeIcon;
308308
subtitle?: string | IMarkdownString;
309-
buttons: IChatConfirmationButton[];
309+
buttons: IChatConfirmationButton<T>[];
310310
toolbarData?: { arg: any; partType: string; partSource?: string };
311311
}
312312

313-
abstract class BaseChatConfirmationWidget extends Disposable {
314-
private _onDidClick = this._register(new Emitter<IChatConfirmationButton>());
315-
get onDidClick(): Event<IChatConfirmationButton> { return this._onDidClick.event; }
313+
abstract class BaseChatConfirmationWidget<T> extends Disposable {
314+
private _onDidClick = this._register(new Emitter<IChatConfirmationButton<T>>());
315+
get onDidClick(): Event<IChatConfirmationButton<T>> { return this._onDidClick.event; }
316316

317317
protected _onDidChangeHeight = this._register(new Emitter<void>());
318318
get onDidChangeHeight(): Event<void> { return this._onDidChangeHeight.event; }
@@ -339,7 +339,7 @@ abstract class BaseChatConfirmationWidget extends Disposable {
339339
private readonly notification = this._register(new MutableDisposable<DisposableStore>());
340340

341341
constructor(
342-
options: IChatConfirmationWidget2Options,
342+
options: IChatConfirmationWidget2Options<T>,
343343
@IInstantiationService protected readonly instantiationService: IInstantiationService,
344344
@IContextMenuService private readonly contextMenuService: IContextMenuService,
345345
@IConfigurationService private readonly _configurationService: IConfigurationService,
@@ -408,7 +408,7 @@ abstract class BaseChatConfirmationWidget extends Disposable {
408408
}
409409
}
410410

411-
updateButtons(buttons: IChatConfirmationButton[]) {
411+
updateButtons(buttons: IChatConfirmationButton<T>[]) {
412412
while (this._buttonsDomNode.children.length > 0) {
413413
this._buttonsDomNode.children[0].remove();
414414
}
@@ -501,12 +501,12 @@ abstract class BaseChatConfirmationWidget extends Disposable {
501501
}
502502
}
503503
}
504-
export class ChatConfirmationWidget extends BaseChatConfirmationWidget {
504+
export class ChatConfirmationWidget<T> extends BaseChatConfirmationWidget<T> {
505505
private _renderedMessage: HTMLElement | undefined;
506506

507507
constructor(
508508
private readonly _container: HTMLElement,
509-
options: IChatConfirmationWidget2Options,
509+
options: IChatConfirmationWidget2Options<T>,
510510
@IInstantiationService instantiationService: IInstantiationService,
511511
@IContextMenuService contextMenuService: IContextMenuService,
512512
@IConfigurationService configurationService: IConfigurationService,
@@ -528,10 +528,10 @@ export class ChatConfirmationWidget extends BaseChatConfirmationWidget {
528528
this._renderedMessage = renderedMessage.element;
529529
}
530530
}
531-
export class ChatCustomConfirmationWidget extends BaseChatConfirmationWidget {
531+
export class ChatCustomConfirmationWidget<T> extends BaseChatConfirmationWidget<T> {
532532
constructor(
533533
container: HTMLElement,
534-
options: IChatConfirmationWidget2Options,
534+
options: IChatConfirmationWidget2Options<T>,
535535
@IInstantiationService instantiationService: IInstantiationService,
536536
@IContextMenuService contextMenuService: IContextMenuService,
537537
@IConfigurationService configurationService: IConfigurationService,

src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { areSameExtensions } from '../../../../../../platform/extensionManagemen
1212
import { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';
1313
import { IKeybindingService } from '../../../../../../platform/keybinding/common/keybinding.js';
1414
import { ChatContextKeys } from '../../../common/chatContextKeys.js';
15-
import { IChatToolInvocation } from '../../../common/chatService.js';
15+
import { ConfirmedReason, IChatToolInvocation, ToolConfirmKind } from '../../../common/chatService.js';
1616
import { CancelChatActionId } from '../../actions/chatExecuteActions.js';
1717
import { AcceptToolConfirmationActionId } from '../../actions/chatToolActions.js';
1818
import { IChatCodeBlockInfo, IChatWidgetService } from '../../chat.js';
@@ -56,24 +56,24 @@ export class ExtensionsInstallConfirmationWidgetSubPart extends BaseChatToolInvo
5656
const cancelTooltip = cancelKeybinding ? `${cancelLabel} (${cancelKeybinding})` : cancelLabel;
5757
const enableContinueButtonEvent = this._register(new Emitter<boolean>());
5858

59-
const buttons: IChatConfirmationButton[] = [
59+
const buttons: IChatConfirmationButton<ConfirmedReason>[] = [
6060
{
6161
label: continueLabel,
62-
data: true,
62+
data: { type: ToolConfirmKind.UserAction },
6363
tooltip: continueTooltip,
6464
disabled: true,
6565
onDidChangeDisablement: enableContinueButtonEvent.event
6666
},
6767
{
6868
label: cancelLabel,
69-
data: false,
69+
data: { type: ToolConfirmKind.Denied },
7070
isSecondary: true,
7171
tooltip: cancelTooltip
7272
}
7373
];
7474

7575
const confirmWidget = this._register(instantiationService.createInstance(
76-
ChatConfirmationWidget,
76+
ChatConfirmationWidget<ConfirmedReason>,
7777
context.container,
7878
{
7979
title: toolInvocation.confirmationMessages?.title ?? localize('installExtensions', "Install Extensions"),

src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,15 @@ export class ChatTerminalToolConfirmationSubPart extends BaseChatToolInvocationS
107107

108108
const autoApproveEnabled = this.configurationService.getValue(TerminalContribSettingId.EnableAutoApprove) === 'on';
109109
const autoApproveWarningAccepted = this.storageService.getBoolean(TerminalToolConfirmationStorageKeys.TerminalAutoApproveWarningAccepted, StorageScope.APPLICATION, false);
110-
let moreActions: (IChatConfirmationButton | Separator)[] | undefined = undefined;
110+
let moreActions: (IChatConfirmationButton<TerminalNewAutoApproveButtonData> | Separator)[] | undefined = undefined;
111111
if (autoApproveEnabled) {
112112
moreActions = [];
113113
if (!autoApproveWarningAccepted) {
114114
moreActions.push({
115115
label: localize('autoApprove.enable', 'Enable Auto Approve...'),
116116
data: {
117117
type: 'enable'
118-
} satisfies TerminalNewAutoApproveButtonData
118+
}
119119
});
120120
moreActions.push(new Separator());
121121
if (terminalCustomActions) {
@@ -131,7 +131,7 @@ export class ChatTerminalToolConfirmationSubPart extends BaseChatToolInvocationS
131131
}
132132
}
133133

134-
const buttons: IChatConfirmationButton[] = [
134+
const buttons: IChatConfirmationButton<boolean | TerminalNewAutoApproveButtonData>[] = [
135135
{
136136
label: continueLabel,
137137
data: true,
@@ -201,7 +201,7 @@ export class ChatTerminalToolConfirmationSubPart extends BaseChatToolInvocationS
201201
appearance: { showPointer: true },
202202
}));
203203
const confirmWidget = this._register(this.instantiationService.createInstance(
204-
ChatCustomConfirmationWidget,
204+
ChatCustomConfirmationWidget<TerminalNewAutoApproveButtonData | boolean>,
205205
this.context.container,
206206
{
207207
title,
@@ -216,7 +216,7 @@ export class ChatTerminalToolConfirmationSubPart extends BaseChatToolInvocationS
216216
}
217217

218218
ChatContextKeys.Editing.hasToolConfirmation.bindTo(this.contextKeyService).set(true);
219-
this._register(confirmWidget.onDidClick(async (button: Omit<IChatConfirmationButton, 'data'> & { data: TerminalNewAutoApproveButtonData | boolean }) => {
219+
this._register(confirmWidget.onDidClick(async button => {
220220
let doComplete = true;
221221
const data = button.data;
222222
let toolConfirmKind: ToolConfirmKind = ToolConfirmKind.Denied;
@@ -249,7 +249,7 @@ export class ChatTerminalToolConfirmationSubPart extends BaseChatToolInvocationS
249249
}
250250
}
251251

252-
const buttons: IChatConfirmationButton[] = [
252+
confirmWidget.updateButtons([
253253
{
254254
label: continueLabel,
255255
data: true,
@@ -262,8 +262,7 @@ export class ChatTerminalToolConfirmationSubPart extends BaseChatToolInvocationS
262262
isSecondary: true,
263263
tooltip: cancelTooltip,
264264
}
265-
];
266-
confirmWidget.updateButtons(buttons);
265+
]);
267266
doComplete = false;
268267
}
269268
} else {

src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export class ToolConfirmationSubPart extends BaseChatToolInvocationSubPart {
8787
CustomAction,
8888
}
8989

90-
const buttons: IChatConfirmationButton[] = [
90+
const buttons: IChatConfirmationButton<ConfirmationOutcome>[] = [
9191
{
9292
label: continueLabel,
9393
data: ConfirmationOutcome.Allow,
@@ -105,11 +105,11 @@ export class ToolConfirmationSubPart extends BaseChatToolInvocationSubPart {
105105
tooltip: cancelTooltip
106106
}];
107107

108-
let confirmWidget: ChatCustomConfirmationWidget;
108+
let confirmWidget: ChatCustomConfirmationWidget<ConfirmationOutcome>;
109109
if (typeof message === 'string') {
110110
const tool = languageModelToolsService.getTool(toolInvocation.toolId);
111111
confirmWidget = this._register(this.instantiationService.createInstance(
112-
ChatConfirmationWidget,
112+
ChatConfirmationWidget<ConfirmationOutcome>,
113113
this.context.container,
114114
{
115115
title,
@@ -288,7 +288,7 @@ export class ToolConfirmationSubPart extends BaseChatToolInvocationSubPart {
288288

289289
const tool = languageModelToolsService.getTool(toolInvocation.toolId);
290290
confirmWidget = this._register(this.instantiationService.createInstance(
291-
ChatCustomConfirmationWidget,
291+
ChatCustomConfirmationWidget<ConfirmationOutcome>,
292292
this.context.container,
293293
{
294294
title,

0 commit comments

Comments
 (0)