Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/browser/mainThreadChatContext.ts
5241 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
6
import { CancellationToken } from '../../../base/common/cancellation.js';
7
import { Disposable } from '../../../base/common/lifecycle.js';
8
import { IChatContextItem } from '../../contrib/chat/common/contextContrib/chatContext.js';
9
import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';
10
import { ExtHostChatContextShape, ExtHostContext, IChatContextItemDto, IDocumentFilterDto, MainContext, MainThreadChatContextShape } from '../common/extHost.protocol.js';
11
import { IChatContextService } from '../../contrib/chat/browser/contextContrib/chatContextService.js';
12
import { URI } from '../../../base/common/uri.js';
13
import { Proxied } from '../../services/extensions/common/proxyIdentifier.js';
14
15
function reviveContextItem(item: IChatContextItemDto): IChatContextItem {
16
return {
17
...item,
18
resourceUri: item.resourceUri ? URI.revive(item.resourceUri) : undefined
19
};
20
}
21
22
function reviveContextItems(items: IChatContextItemDto[]): IChatContextItem[] {
23
return items.map(reviveContextItem);
24
}
25
26
@extHostNamedCustomer(MainContext.MainThreadChatContext)
27
export class MainThreadChatContext extends Disposable implements MainThreadChatContextShape {
28
private readonly _proxy: Proxied<ExtHostChatContextShape>;
29
private readonly _providers = new Map<number, { id: string; selector?: IDocumentFilterDto[] }>();
30
31
constructor(
32
extHostContext: IExtHostContext,
33
@IChatContextService private readonly _chatContextService: IChatContextService
34
) {
35
super();
36
this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostChatContext);
37
this._chatContextService.setExecuteCommandCallback((itemHandle) => this._proxy.$executeChatContextItemCommand(itemHandle));
38
}
39
40
$registerChatWorkspaceContextProvider(handle: number, id: string): void {
41
this._providers.set(handle, { id });
42
this._chatContextService.registerChatWorkspaceContextProvider(id, {
43
provideWorkspaceChatContext: async (token: CancellationToken) => {
44
const items = await this._proxy.$provideWorkspaceChatContext(handle, token);
45
return reviveContextItems(items);
46
}
47
});
48
}
49
50
$registerChatExplicitContextProvider(handle: number, id: string): void {
51
this._providers.set(handle, { id });
52
this._chatContextService.registerChatExplicitContextProvider(id, {
53
provideChatContext: async (token: CancellationToken) => {
54
const items = await this._proxy.$provideExplicitChatContext(handle, token);
55
return reviveContextItems(items);
56
},
57
resolveChatContext: async (context: IChatContextItem, token: CancellationToken) => {
58
const result = await this._proxy.$resolveExplicitChatContext(handle, context, token);
59
return reviveContextItem(result);
60
}
61
});
62
}
63
64
$registerChatResourceContextProvider(handle: number, id: string, selector: IDocumentFilterDto[]): void {
65
this._providers.set(handle, { id, selector });
66
this._chatContextService.registerChatResourceContextProvider(id, selector, {
67
provideChatContext: async (resource: URI, withValue: boolean, token: CancellationToken) => {
68
const result = await this._proxy.$provideResourceChatContext(handle, { resource, withValue }, token);
69
return result ? reviveContextItem(result) : undefined;
70
},
71
resolveChatContext: async (context: IChatContextItem, token: CancellationToken) => {
72
const result = await this._proxy.$resolveResourceChatContext(handle, context, token);
73
return reviveContextItem(result);
74
}
75
});
76
}
77
78
$unregisterChatContextProvider(handle: number): void {
79
const provider = this._providers.get(handle);
80
if (!provider) {
81
return;
82
}
83
this._chatContextService.unregisterChatContextProvider(provider.id);
84
this._providers.delete(handle);
85
}
86
87
$updateWorkspaceContextItems(handle: number, items: IChatContextItemDto[]): void {
88
const provider = this._providers.get(handle);
89
if (!provider) {
90
return;
91
}
92
this._chatContextService.updateWorkspaceContextItems(provider.id, reviveContextItems(items));
93
}
94
95
$executeChatContextItemCommand(itemHandle: number): Promise<void> {
96
return this._proxy.$executeChatContextItemCommand(itemHandle);
97
}
98
}
99
100