Path: blob/main/src/vs/workbench/contrib/chat/browser/contextContrib/chatContext.contribution.ts
5263 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Disposable } from '../../../../../base/common/lifecycle.js';6import { ThemeIcon } from '../../../../../base/common/themables.js';7import { localize } from '../../../../../nls.js';89import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../common/contributions.js';10import { IChatContextService } from './chatContextService.js';11import { isProposedApiEnabled } from '../../../../services/extensions/common/extensions.js';12import { ExtensionsRegistry } from '../../../../services/extensions/common/extensionsRegistry.js';1314interface IChatContextExtensionPoint {15id: string;16icon: string;17displayName: string;18}1920const extensionPoint = ExtensionsRegistry.registerExtensionPoint<IChatContextExtensionPoint[]>({21extensionPoint: 'chatContext',22jsonSchema: {23description: localize('chatContextExtPoint', 'Contributes chat context integrations to the chat widget.'),24type: 'array',25items: {26type: 'object',27properties: {28id: {29description: localize('chatContextExtPoint.id', 'A unique identifier for this item.'),30type: 'string',31},32icon: {33description: localize('chatContextExtPoint.icon', 'The icon associated with this chat context item.'),34type: 'string'35},36displayName: {37description: localize('chatContextExtPoint.title', 'A user-friendly name for this item which is used for display in menus.'),38type: 'string'39}40},41required: ['id', 'icon', 'displayName'],42}43},44activationEventsGenerator: function* (contributions: readonly IChatContextExtensionPoint[]) {45for (const contrib of contributions) {46yield `onChatContextProvider:${contrib.id}`;47}48},49});5051export class ChatContextContribution extends Disposable implements IWorkbenchContribution {52public static readonly ID = 'workbench.contrib.chatContextContribution';5354constructor(55@IChatContextService private readonly _chatContextService: IChatContextService56) {57super();58extensionPoint.setHandler(extensions => {59for (const ext of extensions) {60if (!isProposedApiEnabled(ext.description, 'chatContextProvider')) {61continue;62}63if (!Array.isArray(ext.value)) {64continue;65}66for (const contribution of ext.value) {67const icon = contribution.icon ? ThemeIcon.fromString(contribution.icon) : undefined;68if (!icon && contribution.icon) {69ext.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));70continue;71}72if (!icon) {73// Icon is required by schema, but handle defensively74continue;75}7677this._chatContextService.setChatContextProvider(`${ext.description.id}-${contribution.id}`, { title: contribution.displayName, icon });78}79}80});81}82}8384registerWorkbenchContribution2(ChatContextContribution.ID, ChatContextContribution, WorkbenchPhase.AfterRestored);858687