Skip to content

Commit 6ccdb0f

Browse files
authored
edit requests onExp and added telemetry (microsoft#252922)
* add telemetry and switch setting to exp * fix names * change to onExp * clean up telemetry call * change telemetry name again
1 parent d41280b commit 6ccdb0f

File tree

4 files changed

+61
-5
lines changed

4 files changed

+61
-5
lines changed

src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { ContextKeyExpr, IContextKeyService } from '../../../../../platform/cont
2020
import { IDialogService } from '../../../../../platform/dialogs/common/dialogs.js';
2121
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
2222
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
23+
import { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';
2324
import { IRemoteCodingAgentsService } from '../../../remoteCodingAgents/common/remoteCodingAgentsService.js';
2425
import { IChatAgentHistoryEntry, IChatAgentService } from '../../common/chatAgents.js';
2526
import { ChatContextKeys } from '../../common/chatContextKeys.js';
@@ -48,7 +49,7 @@ export interface IChatExecuteActionContext {
4849
abstract class SubmitAction extends Action2 {
4950
async run(accessor: ServicesAccessor, ...args: any[]) {
5051
const context: IChatExecuteActionContext | undefined = args[0];
51-
52+
const telemetryService = accessor.get(ITelemetryService);
5253
const widgetService = accessor.get(IChatWidgetService);
5354
const widget = context?.widget ?? widgetService.lastFocusedWidget;
5455
if (widget?.viewModel?.editing) {
@@ -104,8 +105,33 @@ abstract class SubmitAction extends Action2 {
104105
})
105106
: { confirmed: true };
106107

108+
type EditUndoEvent = {
109+
editRequestType: string;
110+
outcome: 'cancelled' | 'applied';
111+
editsUndoCount: number;
112+
};
113+
114+
type EditUndoEventClassification = {
115+
owner: 'justschen';
116+
comment: 'Event used to gain insights into when there are pending changes to undo, and whether edited requests are applied or cancelled.';
117+
editRequestType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Current entry point for editing a request.' };
118+
outcome: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the edit was cancelled or applied.' };
119+
editsUndoCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Number of edits that would be undone.'; 'isMeasurement': true };
120+
};
121+
107122
if (!confirmation.confirmed) {
123+
telemetryService.publicLog2<EditUndoEvent, EditUndoEventClassification>('chat.undoEditsConfirmation', {
124+
editRequestType: configurationService.getValue<string>('chat.editRequests'),
125+
outcome: 'cancelled',
126+
editsUndoCount: editsToUndo
127+
});
108128
return;
129+
} else if (editsToUndo > 0) {
130+
telemetryService.publicLog2<EditUndoEvent, EditUndoEventClassification>('chat.undoEditsConfirmation', {
131+
editRequestType: configurationService.getValue<string>('chat.editRequests'),
132+
outcome: 'applied',
133+
editsUndoCount: editsToUndo
134+
});
109135
}
110136

111137
if (confirmation.checkboxChecked) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ configurationRegistry.registerConfiguration({
252252
type: 'string',
253253
enum: ['inline', 'hover', 'input', 'none'],
254254
default: 'inline',
255-
tags: ['experimental'],
255+
tags: ['experimental', 'onExp'],
256256
},
257257
[mcpEnabledSection]: {
258258
type: 'boolean',

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ export interface IChatWidget {
201201
logInputHistory(): void;
202202
acceptInput(query?: string, options?: IChatAcceptInputOptions): Promise<IChatResponseModel | undefined>;
203203
startEditing(requestId: string): void;
204-
finishedEditing(): void;
204+
finishedEditing(completedEdit?: boolean): void;
205205
rerunLastRequest(): Promise<void>;
206206
setInputPlaceholder(placeholder: string): void;
207207
resetInputPlaceholder(): void;

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,7 @@ export class ChatWidget extends Disposable implements IChatWidget {
10351035
this.input.attachmentModel.addContext(...currentContext);
10361036
}
10371037

1038+
10381039
// rerenders
10391040
this.inputPart.dnd.setDisabledOverlay(!isInput);
10401041
this.input.renderAttachedContext();
@@ -1060,9 +1061,21 @@ export class ChatWidget extends Disposable implements IChatWidget {
10601061
}));
10611062
}
10621063
}
1064+
1065+
type StartRequestEvent = { editRequestType: string };
1066+
1067+
type StartRequestEventClassification = {
1068+
owner: 'justschen';
1069+
comment: 'Event used to gain insights into when edits are being pressed.';
1070+
editRequestType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Current entry point for editing a request.' };
1071+
};
1072+
1073+
this.telemetryService.publicLog2<StartRequestEvent, StartRequestEventClassification>('chat.startEditingRequests', {
1074+
editRequestType: this.configurationService.getValue<string>('chat.editRequests'),
1075+
});
10631076
}
10641077

1065-
finishedEditing(currentRequest?: IChatListItemTemplate | undefined): void {
1078+
finishedEditing(completedEdit?: boolean): void {
10661079
// reset states
10671080
const editedRequest = this.renderer.getTemplateDataForRequestId(this.viewModel?.editing?.id);
10681081
this.viewModel?.model.setCheckpoint(undefined);
@@ -1096,6 +1109,23 @@ export class ChatWidget extends Disposable implements IChatWidget {
10961109
this.renderer.updateItemHeightOnRender(editedRequest.currentElement, editedRequest);
10971110
}
10981111

1112+
type CancelRequestEditEvent = {
1113+
editRequestType: string;
1114+
editCanceled: boolean;
1115+
};
1116+
1117+
type CancelRequestEventEditClassification = {
1118+
owner: 'justschen';
1119+
editRequestType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Current entry point for editing a request.' };
1120+
editCanceled: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Indicates whether the edit was canceled.' };
1121+
comment: 'Event used to gain insights into when edits are being canceled.';
1122+
};
1123+
1124+
this.telemetryService.publicLog2<CancelRequestEditEvent, CancelRequestEventEditClassification>('chat.editRequestsFinished', {
1125+
editRequestType: this.configurationService.getValue<string>('chat.editRequests'),
1126+
editCanceled: !completedEdit
1127+
});
1128+
10991129
this.inputPart.focus();
11001130
}
11011131

@@ -1631,7 +1661,7 @@ export class ChatWidget extends Disposable implements IChatWidget {
16311661
});
16321662

16331663
if (this.viewModel?.editing) {
1634-
this.finishedEditing();
1664+
this.finishedEditing(true);
16351665
}
16361666
return result.responseCreatedPromise;
16371667
}

0 commit comments

Comments
 (0)