diff --git a/src/vs/workbench/contrib/chat/common/chatAgents.ts b/src/vs/workbench/contrib/chat/common/chatAgents.ts index 83530ec46c7..89beecd07bb 100644 --- a/src/vs/workbench/contrib/chat/common/chatAgents.ts +++ b/src/vs/workbench/contrib/chat/common/chatAgents.ts @@ -16,9 +16,12 @@ import { IChatRequestVariableValue } from 'vs/workbench/contrib/chat/common/chat //#region agent service, commands etc -export interface IChatAgent { +export interface IChatAgentData { id: string; metadata: IChatAgentMetadata; +} + +export interface IChatAgent extends IChatAgentData { invoke(request: IChatAgentRequest, progress: (part: IChatProgress) => void, history: IChatMessage[], token: CancellationToken): Promise; provideFollowups?(sessionId: string, token: CancellationToken): Promise; provideSlashCommands(token: CancellationToken): Promise; diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index e1cc5cce29e..353420a7274 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -8,12 +8,13 @@ import { DeferredPromise } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { IMarkdownString, MarkdownString, isMarkdownString } from 'vs/base/common/htmlContent'; import { Disposable } from 'vs/base/common/lifecycle'; +import { revive } from 'vs/base/common/marshalling'; import { basename } from 'vs/base/common/resources'; -import { URI, UriComponents } from 'vs/base/common/uri'; +import { URI, UriComponents, UriDto } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { OffsetRange } from 'vs/editor/common/core/offsetRange'; import { ILogService } from 'vs/platform/log/common/log'; -import { IChatAgent, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { IChatAgentData } from 'vs/workbench/contrib/chat/common/chatAgents'; import { ChatRequestTextPart, IParsedChatRequest, reviveParsedChatRequest } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { IChat, IChatContentInlineReference, IChatContentReference, IChatFollowup, IChatProgress, IChatReplyFollowup, IChatResponse, IChatResponseErrorDetails, IChatResponseProgressFileTreeData, IUsedContext, InteractiveSessionVoteDirection, isIUsedContext } from 'vs/workbench/contrib/chat/common/chatService'; @@ -57,7 +58,7 @@ export interface IChatResponseModel { readonly username: string; readonly avatarIconUri?: URI; readonly session: IChatModel; - readonly agent?: IChatAgent; + readonly agent?: IChatAgentData; readonly response: IResponse; readonly isComplete: boolean; readonly isCanceled: boolean; @@ -294,7 +295,7 @@ export class ChatResponseModel extends Disposable implements IChatResponseModel constructor( _response: IMarkdownString | ReadonlyArray, public readonly session: ChatModel, - public readonly agent: IChatAgent | undefined, + public readonly agent: IChatAgentData | undefined, public readonly requestId: string, private _isComplete: boolean = false, private _isCanceled = false, @@ -364,12 +365,7 @@ export interface ISerializableChatsData { [sessionId: string]: ISerializableChatData; } -export interface ISerializableChatAgentData { - id: string; - description?: string; - fullName?: string; - icon?: UriComponents; -} +export type ISerializableChatAgentData = UriDto; export interface ISerializableChatRequestData { providerRequestId: string | undefined; @@ -532,7 +528,6 @@ export class ChatModel extends Disposable implements IChatModel { public readonly providerId: string, private readonly initialData: ISerializableChatData | IExportableChatData | undefined, @ILogService private readonly logService: ILogService, - @IChatAgentService private readonly chatAgentService: IChatAgentService, ) { super(); @@ -566,7 +561,8 @@ export class ChatModel extends Disposable implements IChatModel { : reviveParsedChatRequest(raw.message); const request = new ChatRequestModel(this, parsedRequest, raw.providerRequestId); if (raw.response || raw.responseErrorDetails) { - const agent = raw.agent && this.chatAgentService.getAgents().find(a => a.id === raw.agent!.id); // TODO do something reasonable if this agent has disappeared since the last session + const agent = (raw.agent && 'metadata' in raw.agent) ? // Check for the new format, ignore entries in the old format + revive(raw.agent) : undefined; request.response = new ChatResponseModel(raw.response ?? [new MarkdownString(raw.response)], this, agent, request.id, true, raw.isCanceled, raw.vote, raw.providerRequestId, raw.responseErrorDetails, raw.followups); if (raw.usedContext) { // @ulugbekna: if this's a new vscode sessions, doc versions are incorrect anyway? request.response.updateContent(raw.usedContext); @@ -648,7 +644,7 @@ export class ChatModel extends Disposable implements IChatModel { return this._requests; } - addRequest(message: IParsedChatRequest, chatAgent?: IChatAgent): ChatRequestModel { + addRequest(message: IParsedChatRequest, chatAgent?: IChatAgentData): ChatRequestModel { if (!this._session) { throw new Error('addRequest: No session'); } @@ -762,12 +758,7 @@ export class ChatModel extends Disposable implements IChatModel { followups: r.response?.followups, isCanceled: r.response?.isCanceled, vote: r.response?.vote, - agent: r.response?.agent ? { - id: r.response.agent.id, - description: r.response.agent.metadata.description, - fullName: r.response.agent.metadata.fullName, - icon: r.response.agent.metadata.icon - } : undefined, + agent: r.response?.agent, usedContext: r.response?.response.usedContext, contentReferences: r.response?.response.contentReferences }; diff --git a/src/vs/workbench/contrib/chat/common/chatViewModel.ts b/src/vs/workbench/contrib/chat/common/chatViewModel.ts index 7043b5a54a8..81cd931f203 100644 --- a/src/vs/workbench/contrib/chat/common/chatViewModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatViewModel.ts @@ -8,7 +8,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; -import { IChatAgent } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { IChatAgentData } from 'vs/workbench/contrib/chat/common/chatAgents'; import { ChatModelInitState, IChatModel, IChatRequestModel, IChatResponseModel, IChatWelcomeMessageContent, IResponse } from 'vs/workbench/contrib/chat/common/chatModel'; import { IParsedChatRequest } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { IChatReplyFollowup, IChatResponseCommandFollowup, IChatResponseErrorDetails, IChatResponseProgressFileTreeData, InteractiveSessionVoteDirection } from 'vs/workbench/contrib/chat/common/chatService'; @@ -89,7 +89,7 @@ export interface IChatResponseViewModel { readonly requestId: string; readonly username: string; readonly avatarIconUri?: URI; - readonly agent?: IChatAgent; + readonly agent?: IChatAgentData; readonly response: IResponse; readonly isComplete: boolean; readonly isCanceled: boolean;