Path: blob/main/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagement.contribution.ts
4780 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 { KeyCode } from '../../../../../base/common/keyCodes.js';6import { isObject, isString } from '../../../../../base/common/types.js';7import { localize, localize2 } from '../../../../../nls.js';8import { Action2, registerAction2 } from '../../../../../platform/actions/common/actions.js';9import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';10import { SyncDescriptor } from '../../../../../platform/instantiation/common/descriptors.js';11import { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';12import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';13import { Registry } from '../../../../../platform/registry/common/platform.js';14import { IEditorPaneRegistry, EditorPaneDescriptor } from '../../../../browser/editor.js';15import { EditorExtensions, IEditorFactoryRegistry, IEditorSerializer } from '../../../../common/editor.js';16import { EditorInput } from '../../../../common/editor/editorInput.js';17import { IEditorGroupsService } from '../../../../services/editor/common/editorGroupsService.js';18import { IEditorService } from '../../../../services/editor/common/editorService.js';19import { ChatContextKeys } from '../../common/actions/chatContextKeys.js';20import { CONTEXT_MODELS_EDITOR, CONTEXT_MODELS_SEARCH_FOCUS, MANAGE_CHAT_COMMAND_ID } from '../../common/constants.js';21import { CHAT_CATEGORY } from '../actions/chatActions.js';22import { ChatManagementEditor, ModelsManagementEditor } from './chatManagementEditor.js';23import { ChatManagementEditorInput, ModelsManagementEditorInput } from './chatManagementEditorInput.js';2425Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(26EditorPaneDescriptor.create(27ChatManagementEditor,28ChatManagementEditor.ID,29localize('chatManagementEditor', "Chat Management Editor")30),31[32new SyncDescriptor(ChatManagementEditorInput)33]34);3536Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(37EditorPaneDescriptor.create(38ModelsManagementEditor,39ModelsManagementEditor.ID,40localize('modelsManagementEditor', "Models Management Editor")41),42[43new SyncDescriptor(ModelsManagementEditorInput)44]45);4647class ChatManagementEditorInputSerializer implements IEditorSerializer {4849canSerialize(editorInput: EditorInput): boolean {50return true;51}5253serialize(input: ChatManagementEditorInput): string {54return '';55}5657deserialize(instantiationService: IInstantiationService): ChatManagementEditorInput {58return instantiationService.createInstance(ChatManagementEditorInput);59}60}6162class ModelsManagementEditorInputSerializer implements IEditorSerializer {6364canSerialize(editorInput: EditorInput): boolean {65return true;66}6768serialize(input: ModelsManagementEditorInput): string {69return '';70}7172deserialize(instantiationService: IInstantiationService): ModelsManagementEditorInput {73return instantiationService.createInstance(ModelsManagementEditorInput);74}75}7677Registry.as<IEditorFactoryRegistry>(EditorExtensions.EditorFactory).registerEditorSerializer(ChatManagementEditorInput.ID, ChatManagementEditorInputSerializer);78Registry.as<IEditorFactoryRegistry>(EditorExtensions.EditorFactory).registerEditorSerializer(ModelsManagementEditorInput.ID, ModelsManagementEditorInputSerializer);7980interface IOpenManageCopilotEditorActionOptions {81query?: string;82section?: string;83}8485function sanitizeString(arg: unknown): string | undefined {86return isString(arg) ? arg : undefined;87}8889function sanitizeOpenManageCopilotEditorArgs(input: unknown): IOpenManageCopilotEditorActionOptions {90if (!isObject(input)) {91input = {};92}9394const args = <IOpenManageCopilotEditorActionOptions>input;9596return {97query: sanitizeString(args?.query),98section: sanitizeString(args?.section)99};100}101102registerAction2(class extends Action2 {103constructor() {104super({105id: MANAGE_CHAT_COMMAND_ID,106title: localize2('openAiManagement', "Manage Language Models"),107category: CHAT_CATEGORY,108precondition: ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.or(109ChatContextKeys.Entitlement.planFree,110ChatContextKeys.Entitlement.planPro,111ChatContextKeys.Entitlement.planProPlus,112ChatContextKeys.Entitlement.internal113)),114f1: true,115});116}117async run(accessor: ServicesAccessor, args: string | IOpenManageCopilotEditorActionOptions) {118const editorGroupsService = accessor.get(IEditorGroupsService);119args = sanitizeOpenManageCopilotEditorArgs(args);120return editorGroupsService.activeGroup.openEditor(new ModelsManagementEditorInput(), { pinned: true });121}122});123124registerAction2(class extends Action2 {125constructor() {126super({127id: 'chat.models.action.clearSearchResults',128precondition: CONTEXT_MODELS_EDITOR,129keybinding: {130primary: KeyCode.Escape,131weight: KeybindingWeight.EditorContrib,132when: CONTEXT_MODELS_SEARCH_FOCUS133},134title: localize2('models.clearResults', "Clear Models Search Results")135});136}137138run(accessor: ServicesAccessor) {139const activeEditorPane = accessor.get(IEditorService).activeEditorPane;140if (activeEditorPane instanceof ModelsManagementEditor) {141activeEditorPane.clearSearch();142}143return null;144}145});146147148