Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/vs/workbench/api/browser/mainThreadInlineChat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export class MainThreadInlineChat implements MainThreadInlineChatShape {
this._registrations.dispose();
}

async $registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportIssueReporting: boolean): Promise<void> {
async $registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportsFollowups: boolean, supportIssueReporting: boolean): Promise<void> {
const unreg = this._inlineChatService.addProvider({
debugName,
label,
Expand Down Expand Up @@ -60,6 +60,9 @@ export class MainThreadInlineChat implements MainThreadInlineChatShape {
this._progresses.delete(request.requestId);
}
},
provideFollowups: !supportsFollowups ? undefined : async (session, response, token) => {
return this._proxy.$provideFollowups(handle, session.id, response.id, token);
},
handleInlineChatResponseFeedback: !supportsFeedback ? undefined : async (session, response, kind) => {
this._proxy.$handleFeedback(handle, session.id, response.id, kind);
}
Expand Down
3 changes: 2 additions & 1 deletion src/vs/workbench/api/common/extHost.protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1196,7 +1196,7 @@ export interface ExtHostChatVariablesShape {
}

export interface MainThreadInlineChatShape extends IDisposable {
$registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportsIssueReporting: boolean): Promise<void>;
$registerInteractiveEditorProvider(handle: number, label: string, debugName: string, supportsFeedback: boolean, supportsFollowups: boolean, supportsIssueReporting: boolean): Promise<void>;
$handleProgressChunk(requestId: string, chunk: Dto<IInlineChatProgressItem>): Promise<void>;
$unregisterInteractiveEditorProvider(handle: number): Promise<void>;
}
Expand All @@ -1206,6 +1206,7 @@ export type IInlineChatResponseDto = Dto<IInlineChatEditResponse | Omit<IInlineC
export interface ExtHostInlineChatShape {
$prepareSession(handle: number, uri: UriComponents, range: ISelection, token: CancellationToken): Promise<IInlineChatSession | undefined>;
$provideResponse(handle: number, session: IInlineChatSession, request: IInlineChatRequest, token: CancellationToken): Promise<IInlineChatResponseDto | undefined>;
$provideFollowups(handle: number, sessionId: number, responseId: number, token: CancellationToken): Promise<IChatReplyFollowup[] | undefined>;
$handleFeedback(handle: number, sessionId: number, responseId: number, kind: InlineChatResponseFeedbackKind): void;
$releaseSession(handle: number, sessionId: number): void;
}
Expand Down
16 changes: 15 additions & 1 deletion src/vs/workbench/api/common/extHostInlineChat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { ApiCommand, ApiCommandArgument, ApiCommandResult, ExtHostCommands } fro
import { IRange } from 'vs/editor/common/core/range';
import { IPosition } from 'vs/editor/common/core/position';
import { raceCancellation } from 'vs/base/common/async';
import { IChatReplyFollowup } from 'vs/workbench/contrib/chat/common/chatService';

class ProviderWrapper {

Expand Down Expand Up @@ -96,7 +97,7 @@ export class ExtHostInteractiveEditor implements ExtHostInlineChatShape {
registerProvider(extension: Readonly<IRelaxedExtensionDescription>, provider: vscode.InteractiveEditorSessionProvider, metadata?: vscode.InteractiveEditorSessionProviderMetadata): vscode.Disposable {
const wrapper = new ProviderWrapper(extension, provider);
this._inputProvider.set(wrapper.handle, wrapper);
this._proxy.$registerInteractiveEditorProvider(wrapper.handle, metadata?.label ?? extension.displayName ?? extension.name, extension.identifier.value, typeof provider.handleInteractiveEditorResponseFeedback === 'function', metadata?.supportReportIssue ?? false);
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);
return toDisposable(() => {
this._proxy.$unregisterInteractiveEditorProvider(wrapper.handle);
this._inputProvider.delete(wrapper.handle);
Expand Down Expand Up @@ -223,6 +224,19 @@ export class ExtHostInteractiveEditor implements ExtHostInlineChatShape {
};
}

async $provideFollowups(handle: number, sessionId: number, responseId: number, token: CancellationToken): Promise<IChatReplyFollowup[] | undefined> {
const entry = this._inputProvider.get(handle);
const sessionData = this._inputSessions.get(sessionId);
const response = sessionData?.responses[responseId];
if (entry && response && entry.provider.provideFollowups) {
const task = Promise.resolve(entry.provider.provideFollowups(sessionData.session, response, token));
const followups = await raceCancellation(task, token);
return followups?.map(typeConvert.ChatReplyFollowup.from);
}
return undefined;
}


$handleFeedback(handle: number, sessionId: number, responseId: number, kind: InlineChatResponseFeedbackKind): void {
const entry = this._inputProvider.get(handle);
const sessionData = this._inputSessions.get(sessionId);
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/api/common/extHostTypeConverters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2157,7 +2157,7 @@ export namespace DataTransfer {
}

export namespace ChatReplyFollowup {
export function from(followup: vscode.InteractiveSessionReplyFollowup): IChatReplyFollowup {
export function from(followup: vscode.InteractiveSessionReplyFollowup | vscode.InteractiveEditorReplyFollowup): IChatReplyFollowup {
return {
kind: 'reply',
message: followup.message,
Expand Down
3 changes: 3 additions & 0 deletions src/vs/workbench/contrib/inlineChat/common/inlineChat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { IProgress } from 'vs/platform/progress/common/progress';
import { Registry } from 'vs/platform/registry/common/platform';
import { diffInserted, diffRemoved, editorHoverHighlight, editorWidgetBackground, editorWidgetBorder, focusBorder, inputBackground, inputPlaceholderForeground, registerColor, transparent, widgetShadow } from 'vs/platform/theme/common/colorRegistry';
import { Extensions as ExtensionsMigration, IConfigurationMigrationRegistry } from 'vs/workbench/common/configuration';
import { IChatReplyFollowup } from 'vs/workbench/contrib/chat/common/chatService';

export interface IInlineChatSlashCommand {
command: string;
Expand Down Expand Up @@ -112,6 +113,8 @@ export interface IInlineChatSessionProvider {

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

provideFollowups?(session: IInlineChatSession, response: IInlineChatResponse, token: CancellationToken): ProviderResult<IChatReplyFollowup[]>;

handleInlineChatResponseFeedback?(session: IInlineChatSession, response: IInlineChatResponse, kind: InlineChatResponseFeedbackKind): void;
}

Expand Down
8 changes: 8 additions & 0 deletions src/vscode-dts/vscode.proposed.interactive.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,21 @@ declare module 'vscode' {
supportReportIssue?: boolean;
}

export interface InteractiveEditorReplyFollowup {
message: string;
tooltip?: string;
title?: string;
}

export interface InteractiveEditorSessionProvider<S extends InteractiveEditorSession = InteractiveEditorSession, R extends InteractiveEditorResponse | InteractiveEditorMessageResponse = InteractiveEditorResponse | InteractiveEditorMessageResponse> {

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

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

provideFollowups?(session: S, response: R, token: CancellationToken): ProviderResult<InteractiveEditorReplyFollowup[]>;

// eslint-disable-next-line local/vscode-dts-provider-naming
handleInteractiveEditorResponseFeedback?(session: S, response: R, kind: InteractiveEditorResponseFeedbackKind): void;
}
Expand Down