Path: blob/main/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.ts
5237 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4import { Event } from '../../../../base/common/event.js';5import { URI } from '../../../../base/common/uri.js';6import { IActiveCodeEditor, ICodeEditor } from '../../../../editor/browser/editorBrowser.js';7import { Position } from '../../../../editor/common/core/position.js';8import { Selection } from '../../../../editor/common/core/selection.js';9import { createDecorator, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';10import { IChatWidgetService } from '../../chat/browser/chat.js';11import { IChatEditingSession } from '../../chat/common/editing/chatEditingService.js';12import { IChatModel, IChatModelInputState, IChatRequestModel } from '../../chat/common/model/chatModel.js';13import { IChatService } from '../../chat/common/chatService/chatService.js';14import { ChatAgentLocation } from '../../chat/common/constants.js';151617export const IInlineChatSessionService = createDecorator<IInlineChatSessionService>('IInlineChatSessionService');1819export interface IInlineChatSession2 {20readonly initialPosition: Position;21readonly initialSelection: Selection;22readonly uri: URI;23readonly chatModel: IChatModel;24readonly editingSession: IChatEditingSession;25dispose(): void;26}2728export interface IInlineChatSessionService {29_serviceBrand: undefined;3031readonly onWillStartSession: Event<IActiveCodeEditor>;32readonly onDidChangeSessions: Event<this>;3334dispose(): void;3536createSession(editor: ICodeEditor): IInlineChatSession2;37getSessionByTextModel(uri: URI): IInlineChatSession2 | undefined;38getSessionBySessionUri(uri: URI): IInlineChatSession2 | undefined;39}4041export async function moveToPanelChat(accessor: ServicesAccessor, model: IChatModel | undefined, resend: boolean) {4243const chatService = accessor.get(IChatService);44const widgetService = accessor.get(IChatWidgetService);4546const widget = await widgetService.revealWidget();4748if (widget && widget.viewModel && model) {49let lastRequest: IChatRequestModel | undefined;50for (const request of model.getRequests().slice()) {51await chatService.adoptRequest(widget.viewModel.model.sessionResource, request);52lastRequest = request;53}5455if (lastRequest && resend) {56chatService.resendRequest(lastRequest, { location: widget.location });57}5859widget.focusResponseItem();60}61}6263export async function askInPanelChat(accessor: ServicesAccessor, request: IChatRequestModel, state: IChatModelInputState | undefined) {6465const widgetService = accessor.get(IChatWidgetService);66const chatService = accessor.get(IChatService);676869if (!request) {70return;71}7273const newModelRef = chatService.startSession(ChatAgentLocation.Chat);74const newModel = newModelRef.object;7576newModel.inputModel.setState({ ...state });7778const widget = await widgetService.openSession(newModelRef.object.sessionResource);7980newModelRef.dispose(); // can be freed after opening because the widget also holds a reference81widget?.acceptInput(request.message.text);82}838485