1
>
/*---------------------------------------------------------------------------------------------
chatModelStore.ts
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
>
6
>
import { Emitter } from '../../../../../base/common/event.js';
7
>
import { Disposable, IReference, ReferenceCollection } from '../../../../../base/common/lifecycle.js';
8
>
import { IObservable, ObservableMap } from '../../../../../base/common/observable.js';
9
>
import { URI } from '../../../../../base/common/uri.js';
10
>
import { ILogService } from '../../../../../platform/log/common/log.js';
11
>
import { ChatAgentLocation } from '../constants.js';
12
>
import { IChatEditingSession, ModifiedFileEntryState } from '../editing/chatEditingService.js';
13
>
import { ChatModel, ISerializableChatModelInputState, ISerializedChatDataReference } from './chatModel.js';
14
>
15
>
export interface IStartSessionProps {
16
>
readonly initialData?: ISerializedChatDataReference;
17
>
readonly location: ChatAgentLocation;
18
>
readonly sessionResource: URI;
19
>
readonly canUseTools: boolean;
20
>
readonly transferEditingSession?: IChatEditingSession;
21
>
readonly disableBackgroundKeepAlive?: boolean;
22
>
readonly inputState?: ISerializableChatModelInputState;
23
>
readonly isReadOnly?: IObservable<boolean>;
24
>
}
25
>
26
>
export interface ChatModelStoreDelegate {
27
>
createModel: (props: IStartSessionProps) => ChatModel;
28
>
willDisposeModel: (model: ChatModel) => Promise<void>;
29
>
}
30
>
31
>
export interface IChatModelReferenceDebugHolder {
32
>
readonly holder: string;
33
>
readonly count: number;
34
>
}
35
>
36
>
export interface IChatModelReferenceDebugInfo {
37
>
readonly sessionResource: URI;
38
>
readonly title: string;
39
>
readonly createdBy: string;
40
>
readonly initialLocation: ChatAgentLocation;
41
>
readonly isImported: boolean;
42
>
readonly willKeepAlive: boolean;
43
>
readonly hasPendingEdits: boolean;
44
>
readonly pendingDisposal: boolean;
45
>
readonly referenceCount: number;
46
>
readonly holders: readonly IChatModelReferenceDebugHolder[];
47
>
}
48
>
49
>
export interface IChatModelReferenceDebugSnapshot {
50
>
readonly totalModels: number;
51
>
readonly totalReferences: number;
52
>
readonly models: readonly IChatModelReferenceDebugInfo[];
53
>
}
54
>
55
>
export class ChatModelStore extends Disposable {
56
>
private readonly _refCollection: ReferenceCollection<ChatModel>;
57
>
58
>
private readonly _models = new ObservableMap<string, ChatModel>();
59
>
private readonly _modelsToDispose = new Set<string>();
60
>
private readonly _pendingDisposals = new Set<Promise<void>>();
61
>
private readonly _modelCreateOwners = new Map<string, string>();
62
>
private readonly _referenceOwners = new Map<string, Map<number, string>>();
63
>
private _referenceOwnerIds = 0;
64
>
65
>
private readonly _onDidDisposeModel = this._register(new Emitter<ChatModel>());
66
>
public readonly onDidDisposeModel = this._onDidDisposeModel.event;
67
>
68
>
private readonly _onDidCreateModel = this._register(new Emitter<ChatModel>());
69
>
public readonly onDidCreateModel = this._onDidCreateModel.event;
70
>
71
>
constructor(
72
private readonly delegate: ChatModelStoreDelegate,
73
@ILogService private readonly logService: ILogService,