diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index fdcc47d5092..d6b2c3a4fff 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1456,6 +1456,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I EditSessionIdentityMatch: EditSessionIdentityMatch, InteractiveSessionVoteDirection: extHostTypes.InteractiveSessionVoteDirection, InteractiveSessionCopyKind: extHostTypes.InteractiveSessionCopyKind, + InteractiveEditorResponseFeedbackKind: extHostTypes.InteractiveEditorResponseFeedbackKind }; }; } diff --git a/src/vs/workbench/api/common/extHostInteractiveEditor.ts b/src/vs/workbench/api/common/extHostInteractiveEditor.ts index 01a35d1bc21..83c9007662d 100644 --- a/src/vs/workbench/api/common/extHostInteractiveEditor.ts +++ b/src/vs/workbench/api/common/extHostInteractiveEditor.ts @@ -13,7 +13,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { ExtHostInteractiveEditorShape, IInteractiveEditorResponseDto, IMainContext, MainContext, MainThreadInteractiveEditorShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; -import { WorkspaceEdit } from 'vs/workbench/api/common/extHostTypes'; +import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import type * as vscode from 'vscode'; class ProviderWrapper { @@ -128,7 +128,7 @@ export class ExtHostInteractiveEditor implements ExtHostInteractiveEditorShape { } const { edits } = res; - if (edits instanceof WorkspaceEdit) { + if (edits instanceof extHostTypes.WorkspaceEdit) { return { ...stub, id, @@ -153,8 +153,23 @@ export class ExtHostInteractiveEditor implements ExtHostInteractiveEditorShape { const entry = this._inputProvider.get(handle); const sessionData = this._inputSessions.get(sessionId); const response = sessionData?.responses[responseId]; + if (entry && response) { - entry.provider.handleInteractiveEditorResponseFeedback?.(sessionData.session, response, kind === InteractiveEditorResponseFeedbackKind.Helpful ? true : false); + // todo@jrieken move to type converter + let apiKind: extHostTypes.InteractiveEditorResponseFeedbackKind; + switch (kind) { + case InteractiveEditorResponseFeedbackKind.Helpful: + apiKind = extHostTypes.InteractiveEditorResponseFeedbackKind.Helpful; + break; + case InteractiveEditorResponseFeedbackKind.Unhelpful: + apiKind = extHostTypes.InteractiveEditorResponseFeedbackKind.Unhelpful; + break; + case InteractiveEditorResponseFeedbackKind.Undone: + apiKind = extHostTypes.InteractiveEditorResponseFeedbackKind.Undone; + break; + } + + entry.provider.handleInteractiveEditorResponseFeedback?.(sessionData.session, response, apiKind); } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 873204a42b9..3ea4a313f2a 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -3974,3 +3974,13 @@ export enum InteractiveSessionCopyKind { } //#endregion + +//#region Interactive Editor + +export enum InteractiveEditorResponseFeedbackKind { + Unhelpful = 0, + Helpful = 1, + Undone = 2 +} + +//#endregion diff --git a/src/vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget.ts b/src/vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget.ts index 598f49c1e53..00ed596bbec 100644 --- a/src/vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget.ts +++ b/src/vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget.ts @@ -523,7 +523,7 @@ class UndoAction extends Action { private readonly _myAlternativeVersionId: number; - constructor(private readonly _model: ITextModel) { + constructor(private readonly _model: ITextModel, private readonly _provider: IInteractiveEditorSessionProvider, private readonly _session: IInteractiveEditorSession, private readonly _response: IInteractiveEditorResponse) { super('undo', localize('undo', "Undo"), ThemeIcon.asClassName(Codicon.discard), false); this._myAlternativeVersionId = _model.getAlternativeVersionId(); @@ -537,6 +537,10 @@ class UndoAction extends Action { override async run(): Promise { if (this._myAlternativeVersionId === this._model.getAlternativeVersionId()) { this._model.undo(); + + if (this._provider.handleInteractiveEditorResponseFeedback) { + this._provider.handleInteractiveEditorResponseFeedback(this._session, this._response, InteractiveEditorResponseFeedbackKind.Undone); + } } } } @@ -1015,7 +1019,7 @@ export class InteractiveEditorController implements IEditorContribution { inlineDiffDecorations.update(); const toggleAction = new ToggleInlineDiff(inlineDiffDecorations); - const fixedActions: Action[] = [new UndoAction(textModel), toggleAction]; + const fixedActions: Action[] = [new UndoAction(textModel, provider, session, reply), toggleAction]; roundStore.add(combinedDisposable(...fixedActions)); const feedback = new FeedbackToggles(provider, session, reply); diff --git a/src/vs/workbench/contrib/interactiveEditor/common/interactiveEditor.ts b/src/vs/workbench/contrib/interactiveEditor/common/interactiveEditor.ts index 3677488bc09..f83d66be592 100644 --- a/src/vs/workbench/contrib/interactiveEditor/common/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactiveEditor/common/interactiveEditor.ts @@ -63,8 +63,9 @@ export interface IInteractiveEditorMessageResponse { } export const enum InteractiveEditorResponseFeedbackKind { - Helpful, - Unhelpful + Unhelpful = 0, + Helpful = 1, + Undone = 2 } export interface IInteractiveEditorSessionProvider { diff --git a/src/vscode-dts/vscode.proposed.interactive.d.ts b/src/vscode-dts/vscode.proposed.interactive.d.ts index 1cac3ca7728..72b2facfd87 100644 --- a/src/vscode-dts/vscode.proposed.interactive.d.ts +++ b/src/vscode-dts/vscode.proposed.interactive.d.ts @@ -42,6 +42,12 @@ declare module 'vscode' { wholeRange?: Range; } + export enum InteractiveEditorResponseFeedbackKind { + Unhelpful = 0, + Helpful = 1, + Undone = 2 + } + export interface TextDocumentContext { document: TextDocument; selection: Selection; @@ -59,7 +65,7 @@ declare module 'vscode' { // todo@API use enum instead of boolean // eslint-disable-next-line local/vscode-dts-provider-naming - handleInteractiveEditorResponseFeedback?(session: InteractiveEditorSession, response: InteractiveEditorResponse | InteractiveEditorMessageResponse, helpful: boolean): void; + handleInteractiveEditorResponseFeedback?(session: InteractiveEditorSession, response: InteractiveEditorResponse | InteractiveEditorMessageResponse, kind: InteractiveEditorResponseFeedbackKind): void; }