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
5263 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
activationEventsGenerator: function* (contributions: readonly IChatContextExtensionPoint[]) {
46
for (const contrib of contributions) {
47
yield `onChatContextProvider:${contrib.id}`;
48
}
49
},
50
});
51
52
export class ChatContextContribution extends Disposable implements IWorkbenchContribution {
53
public static readonly ID = 'workbench.contrib.chatContextContribution';
54
55
constructor(
56
@IChatContextService private readonly _chatContextService: IChatContextService
57
) {
58
super();
59
extensionPoint.setHandler(extensions => {
60
for (const ext of extensions) {
61
if (!isProposedApiEnabled(ext.description, 'chatContextProvider')) {
62
continue;
63
}
64
if (!Array.isArray(ext.value)) {
65
continue;
66
}
67
for (const contribution of ext.value) {
68
const icon = contribution.icon ? ThemeIcon.fromString(contribution.icon) : undefined;
69
if (!icon && contribution.icon) {
70
ext.collector.error(localize('chatContextExtPoint.invalidIcon', "Invalid icon format for chat context contribution '{0}'. Icon must be in the format '$(iconId)' or '$(iconId~spin)', e.g. '$(copilot)'.", contribution.id));
71
continue;
72
}
73
if (!icon) {
74
// Icon is required by schema, but handle defensively
75
continue;
76
}
77
78
this._chatContextService.setChatContextProvider(`${ext.description.id}-${contribution.id}`, { title: contribution.displayName, icon });
79
}
80
}
81
});
82
}
83
}
84
85
registerWorkbenchContribution2(ChatContextContribution.ID, ChatContextContribution, WorkbenchPhase.AfterRestored);
86
87