Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/contextContrib/chatContext.contribution.ts
4780 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 { Disposable } from '../../../../../base/common/lifecycle.js';
7
import { ThemeIcon } from '../../../../../base/common/themables.js';
8
import { localize } from '../../../../../nls.js';
9
10
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../common/contributions.js';
11
import { IChatContextService } from './chatContextService.js';
12
import { isProposedApiEnabled } from '../../../../services/extensions/common/extensions.js';
13
import { ExtensionsRegistry } from '../../../../services/extensions/common/extensionsRegistry.js';
14
15
interface IChatContextExtensionPoint {
16
id: string;
17
icon: string;
18
displayName: string;
19
}
20
21
const extensionPoint = ExtensionsRegistry.registerExtensionPoint<IChatContextExtensionPoint[]>({
22
extensionPoint: 'chatContext',
23
jsonSchema: {
24
description: localize('chatContextExtPoint', 'Contributes chat context integrations to the chat widget.'),
25
type: 'array',
26
items: {
27
type: 'object',
28
properties: {
29
id: {
30
description: localize('chatContextExtPoint.id', 'A unique identifier for this item.'),
31
type: 'string',
32
},
33
icon: {
34
description: localize('chatContextExtPoint.icon', 'The icon associated with this chat context item.'),
35
type: 'string'
36
},
37
displayName: {
38
description: localize('chatContextExtPoint.title', 'A user-friendly name for this item which is used for display in menus.'),
39
type: 'string'
40
}
41
},
42
required: ['id', 'icon', 'displayName'],
43
}
44
}
45
});
46
47
export class ChatContextContribution extends Disposable implements IWorkbenchContribution {
48
public static readonly ID = 'workbench.contrib.chatContextContribution';
49
50
constructor(
51
@IChatContextService private readonly _chatContextService: IChatContextService
52
) {
53
super();
54
extensionPoint.setHandler(extensions => {
55
for (const ext of extensions) {
56
if (!isProposedApiEnabled(ext.description, 'chatContextProvider')) {
57
continue;
58
}
59
if (!Array.isArray(ext.value)) {
60
continue;
61
}
62
for (const contribution of ext.value) {
63
const icon = contribution.icon ? ThemeIcon.fromString(contribution.icon) : undefined;
64
if (!icon) {
65
continue;
66
}
67
68
this._chatContextService.setChatContextProvider(`${ext.description.id}-${contribution.id}`, { title: contribution.displayName, icon });
69
}
70
}
71
});
72
}
73
}
74
75
registerWorkbenchContribution2(ChatContextContribution.ID, ChatContextContribution, WorkbenchPhase.AfterRestored);
76
77