Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.ts
5237 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import { Event } from '../../../../base/common/event.js';
6
import { URI } from '../../../../base/common/uri.js';
7
import { IActiveCodeEditor, ICodeEditor } from '../../../../editor/browser/editorBrowser.js';
8
import { Position } from '../../../../editor/common/core/position.js';
9
import { Selection } from '../../../../editor/common/core/selection.js';
10
import { createDecorator, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
11
import { IChatWidgetService } from '../../chat/browser/chat.js';
12
import { IChatEditingSession } from '../../chat/common/editing/chatEditingService.js';
13
import { IChatModel, IChatModelInputState, IChatRequestModel } from '../../chat/common/model/chatModel.js';
14
import { IChatService } from '../../chat/common/chatService/chatService.js';
15
import { ChatAgentLocation } from '../../chat/common/constants.js';
16
17
18
export const IInlineChatSessionService = createDecorator<IInlineChatSessionService>('IInlineChatSessionService');
19
20
export interface IInlineChatSession2 {
21
readonly initialPosition: Position;
22
readonly initialSelection: Selection;
23
readonly uri: URI;
24
readonly chatModel: IChatModel;
25
readonly editingSession: IChatEditingSession;
26
dispose(): void;
27
}
28
29
export interface IInlineChatSessionService {
30
_serviceBrand: undefined;
31
32
readonly onWillStartSession: Event<IActiveCodeEditor>;
33
readonly onDidChangeSessions: Event<this>;
34
35
dispose(): void;
36
37
createSession(editor: ICodeEditor): IInlineChatSession2;
38
getSessionByTextModel(uri: URI): IInlineChatSession2 | undefined;
39
getSessionBySessionUri(uri: URI): IInlineChatSession2 | undefined;
40
}
41
42
export async function moveToPanelChat(accessor: ServicesAccessor, model: IChatModel | undefined, resend: boolean) {
43
44
const chatService = accessor.get(IChatService);
45
const widgetService = accessor.get(IChatWidgetService);
46
47
const widget = await widgetService.revealWidget();
48
49
if (widget && widget.viewModel && model) {
50
let lastRequest: IChatRequestModel | undefined;
51
for (const request of model.getRequests().slice()) {
52
await chatService.adoptRequest(widget.viewModel.model.sessionResource, request);
53
lastRequest = request;
54
}
55
56
if (lastRequest && resend) {
57
chatService.resendRequest(lastRequest, { location: widget.location });
58
}
59
60
widget.focusResponseItem();
61
}
62
}
63
64
export async function askInPanelChat(accessor: ServicesAccessor, request: IChatRequestModel, state: IChatModelInputState | undefined) {
65
66
const widgetService = accessor.get(IChatWidgetService);
67
const chatService = accessor.get(IChatService);
68
69
70
if (!request) {
71
return;
72
}
73
74
const newModelRef = chatService.startSession(ChatAgentLocation.Chat);
75
const newModel = newModelRef.object;
76
77
newModel.inputModel.setState({ ...state });
78
79
const widget = await widgetService.openSession(newModelRef.object.sessionResource);
80
81
newModelRef.dispose(); // can be freed after opening because the widget also holds a reference
82
widget?.acceptInput(request.message.text);
83
}
84
85