Skip to content

Commit d704c62

Browse files
authored
Support for followups in InlineChat (#198500)
* followup * support provideFollowups in inline chat
1 parent 54b8f6a commit d704c62

File tree

6 files changed

+33
-4
lines changed

6 files changed

+33
-4
lines changed

src/vs/workbench/api/browser/mainThreadInlineChat.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class MainThreadInlineChat implements MainThreadInlineChatShape {
3131
this._registrations.dispose();
3232
}
3333

34-
async $registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportIssueReporting: boolean): Promise<void> {
34+
async $registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportsFollowups: boolean, supportIssueReporting: boolean): Promise<void> {
3535
const unreg = this._inlineChatService.addProvider({
3636
debugName,
3737
label,
@@ -60,6 +60,9 @@ export class MainThreadInlineChat implements MainThreadInlineChatShape {
6060
this._progresses.delete(request.requestId);
6161
}
6262
},
63+
provideFollowups: !supportsFollowups ? undefined : async (session, response, token) => {
64+
return this._proxy.$provideFollowups(handle, session.id, response.id, token);
65+
},
6366
handleInlineChatResponseFeedback: !supportsFeedback ? undefined : async (session, response, kind) => {
6467
this._proxy.$handleFeedback(handle, session.id, response.id, kind);
6568
}

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ export interface ExtHostChatVariablesShape {
11961196
}
11971197

11981198
export interface MainThreadInlineChatShape extends IDisposable {
1199-
$registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportsIssueReporting: boolean): Promise<void>;
1199+
$registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportsFollowups: boolean, supportsIssueReporting: boolean): Promise<void>;
12001200
$handleProgressChunk(requestId: string, chunk: Dto<IInlineChatProgressItem>): Promise<void>;
12011201
$unregisterInteractiveEditorProvider(handle: number): Promise<void>;
12021202
}
@@ -1206,6 +1206,7 @@ export type IInlineChatResponseDto = Dto<IInlineChatEditResponse | Omit<IInlineC
12061206
export interface ExtHostInlineChatShape {
12071207
$prepareSession(handle: number, uri: UriComponents, range: ISelection, token: CancellationToken): Promise<IInlineChatSession | undefined>;
12081208
$provideResponse(handle: number, session: IInlineChatSession, request: IInlineChatRequest, token: CancellationToken): Promise<IInlineChatResponseDto | undefined>;
1209+
$provideFollowups(handle: number, sessionId: number, responseId: number, token: CancellationToken): Promise<IChatReplyFollowup[] | undefined>;
12091210
$handleFeedback(handle: number, sessionId: number, responseId: number, kind: InlineChatResponseFeedbackKind): void;
12101211
$releaseSession(handle: number, sessionId: number): void;
12111212
}

src/vs/workbench/api/common/extHostInlineChat.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ApiCommand, ApiCommandArgument, ApiCommandResult, ExtHostCommands } fro
1919
import { IRange } from 'vs/editor/common/core/range';
2020
import { IPosition } from 'vs/editor/common/core/position';
2121
import { raceCancellation } from 'vs/base/common/async';
22+
import { IChatReplyFollowup } from 'vs/workbench/contrib/chat/common/chatService';
2223

2324
class ProviderWrapper {
2425

@@ -96,7 +97,7 @@ export class ExtHostInteractiveEditor implements ExtHostInlineChatShape {
9697
registerProvider(extension: Readonly<IRelaxedExtensionDescription>, provider: vscode.InteractiveEditorSessionProvider, metadata?: vscode.InteractiveEditorSessionProviderMetadata): vscode.Disposable {
9798
const wrapper = new ProviderWrapper(extension, provider);
9899
this._inputProvider.set(wrapper.handle, wrapper);
99-
this._proxy.$registerInteractiveEditorProvider(wrapper.handle, metadata?.label ?? extension.displayName ?? extension.name, extension.identifier.value, typeof provider.handleInteractiveEditorResponseFeedback === 'function', metadata?.supportReportIssue ?? false);
100+
this._proxy.$registerInteractiveEditorProvider(wrapper.handle, metadata?.label ?? extension.displayName ?? extension.name, extension.identifier.value, typeof provider.handleInteractiveEditorResponseFeedback === 'function', typeof provider.provideFollowups === 'function', metadata?.supportReportIssue ?? false);
100101
return toDisposable(() => {
101102
this._proxy.$unregisterInteractiveEditorProvider(wrapper.handle);
102103
this._inputProvider.delete(wrapper.handle);
@@ -223,6 +224,19 @@ export class ExtHostInteractiveEditor implements ExtHostInlineChatShape {
223224
};
224225
}
225226

227+
async $provideFollowups(handle: number, sessionId: number, responseId: number, token: CancellationToken): Promise<IChatReplyFollowup[] | undefined> {
228+
const entry = this._inputProvider.get(handle);
229+
const sessionData = this._inputSessions.get(sessionId);
230+
const response = sessionData?.responses[responseId];
231+
if (entry && response && entry.provider.provideFollowups) {
232+
const task = Promise.resolve(entry.provider.provideFollowups(sessionData.session, response, token));
233+
const followups = await raceCancellation(task, token);
234+
return followups?.map(typeConvert.ChatReplyFollowup.from);
235+
}
236+
return undefined;
237+
}
238+
239+
226240
$handleFeedback(handle: number, sessionId: number, responseId: number, kind: InlineChatResponseFeedbackKind): void {
227241
const entry = this._inputProvider.get(handle);
228242
const sessionData = this._inputSessions.get(sessionId);

src/vs/workbench/api/common/extHostTypeConverters.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2157,7 +2157,7 @@ export namespace DataTransfer {
21572157
}
21582158

21592159
export namespace ChatReplyFollowup {
2160-
export function from(followup: vscode.InteractiveSessionReplyFollowup): IChatReplyFollowup {
2160+
export function from(followup: vscode.InteractiveSessionReplyFollowup | vscode.InteractiveEditorReplyFollowup): IChatReplyFollowup {
21612161
return {
21622162
kind: 'reply',
21632163
message: followup.message,

src/vs/workbench/contrib/inlineChat/common/inlineChat.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { IProgress } from 'vs/platform/progress/common/progress';
2020
import { Registry } from 'vs/platform/registry/common/platform';
2121
import { diffInserted, diffRemoved, editorHoverHighlight, editorWidgetBackground, editorWidgetBorder, focusBorder, inputBackground, inputPlaceholderForeground, registerColor, transparent, widgetShadow } from 'vs/platform/theme/common/colorRegistry';
2222
import { Extensions as ExtensionsMigration, IConfigurationMigrationRegistry } from 'vs/workbench/common/configuration';
23+
import { IChatReplyFollowup } from 'vs/workbench/contrib/chat/common/chatService';
2324

2425
export interface IInlineChatSlashCommand {
2526
command: string;
@@ -112,6 +113,8 @@ export interface IInlineChatSessionProvider {
112113

113114
provideResponse(item: IInlineChatSession, request: IInlineChatRequest, progress: IProgress<IInlineChatProgressItem>, token: CancellationToken): ProviderResult<IInlineChatResponse>;
114115

116+
provideFollowups?(session: IInlineChatSession, response: IInlineChatResponse, token: CancellationToken): ProviderResult<IChatReplyFollowup[]>;
117+
115118
handleInlineChatResponseFeedback?(session: IInlineChatSession, response: IInlineChatResponse, kind: InlineChatResponseFeedbackKind): void;
116119
}
117120

src/vscode-dts/vscode.proposed.interactive.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,21 @@ declare module 'vscode' {
7676
supportReportIssue?: boolean;
7777
}
7878

79+
export interface InteractiveEditorReplyFollowup {
80+
message: string;
81+
tooltip?: string;
82+
title?: string;
83+
}
84+
7985
export interface InteractiveEditorSessionProvider<S extends InteractiveEditorSession = InteractiveEditorSession, R extends InteractiveEditorResponse | InteractiveEditorMessageResponse = InteractiveEditorResponse | InteractiveEditorMessageResponse> {
8086

8187
// Create a session. The lifetime of this session is the duration of the editing session with the input mode widget.
8288
prepareInteractiveEditorSession(context: TextDocumentContext, token: CancellationToken): ProviderResult<S>;
8389

8490
provideInteractiveEditorResponse(session: S, request: InteractiveEditorRequest, progress: Progress<InteractiveEditorProgressItem>, token: CancellationToken): ProviderResult<R>;
8591

92+
provideFollowups?(session: S, response: R, token: CancellationToken): ProviderResult<InteractiveEditorReplyFollowup[]>;
93+
8694
// eslint-disable-next-line local/vscode-dts-provider-naming
8795
handleInteractiveEditorResponseFeedback?(session: S, response: R, kind: InteractiveEditorResponseFeedbackKind): void;
8896
}

0 commit comments

Comments
 (0)