Path: blob/main/src/vs/sessions/contrib/chat/browser/chat.contribution.ts
13401 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 { Codicon } from '../../../../base/common/codicons.js';6import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';7import { ServicesAccessor } from '../../../../editor/browser/editorExtensions.js';8import { localize, localize2 } from '../../../../nls.js';9import { Action2, registerAction2 } from '../../../../platform/actions/common/actions.js';10import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';11import { IViewContainersRegistry, IViewsRegistry, ViewContainerLocation, Extensions as ViewExtensions, WindowEnablement } from '../../../../workbench/common/views.js';12import { Registry } from '../../../../platform/registry/common/platform.js';13import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js';14import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js';15import { IsNewChatInSessionContext, IsNewChatSessionContext } from '../../../common/contextkeys.js';16import { BranchChatSessionAction } from './branchChatSessionAction.js';17import { RunScriptContribution } from './runScriptAction.js';18import './nullInlineChatSessionService.js';19import './openInVSCodeWidget.js';20import './nullChatTipService.js';21import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';22import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';23import { ISessionsConfigurationService, SessionsConfigurationService } from './sessionsConfigurationService.js';24import { AgenticPromptsService } from './promptsService.js';25import { IPromptsService } from '../../../../workbench/contrib/chat/common/promptSyntax/service/promptsService.js';26import { IAICustomizationWorkspaceService } from '../../../../workbench/contrib/chat/common/aiCustomizationWorkspaceService.js';27import { ICustomizationHarnessService } from '../../../../workbench/contrib/chat/common/customizationHarnessService.js';28import { SessionsAICustomizationWorkspaceService } from './aiCustomizationWorkspaceService.js';29import { SessionsCustomizationHarnessService } from './customizationHarnessService.js';30import { ChatViewContainerId, ChatViewId } from '../../../../workbench/contrib/chat/browser/chat.js';31import { CHAT_CATEGORY } from '../../../../workbench/contrib/chat/browser/actions/chatActions.js';32import { NewChatViewPane, SessionsViewId } from './newChatViewPane.js';33import { NewChatInSessionViewPane, NewChatInSessionViewId } from './newChatInSessionViewPane.js';34import { ViewPaneContainer } from '../../../../workbench/browser/parts/views/viewPaneContainer.js';35import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';36import { ChatViewPane } from '../../../../workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js';37import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';38import { AccessibleViewRegistry } from '../../../../platform/accessibility/browser/accessibleViewRegistry.js';39import { SessionsChatAccessibilityHelp } from './sessionsChatAccessibilityHelp.js';40import { SessionsOpenerParticipantContribution } from './sessionsOpenerParticipant.js';41import '../../sessions/browser/mobile/mobileOverlayContribution.js';424344class NewChatInSessionsWindowAction extends Action2 {4546constructor() {47super({48id: 'workbench.action.sessions.newChat',49title: localize2('chat.newEdits.label', "New Chat"),50category: CHAT_CATEGORY,51keybinding: {52weight: KeybindingWeight.WorkbenchContrib + 2,53primary: KeyMod.CtrlCmd | KeyCode.KeyN,54secondary: [KeyMod.CtrlCmd | KeyCode.KeyL],55mac: {56primary: KeyMod.CtrlCmd | KeyCode.KeyN,57secondary: [KeyMod.WinCtrl | KeyCode.KeyL]58},59}60});61}6263override run(accessor: ServicesAccessor): void {64const sessionsManagementService = accessor.get(ISessionsManagementService);65sessionsManagementService.openNewSessionView();66}67}6869registerAction2(NewChatInSessionsWindowAction);707172737475// --- Sessions New Chat View Registration ---76// Registers in the same ChatBar container as the existing ChatViewPane.77// The `when` clause ensures only the new-session pane shows when no active session exists.7879const chatViewIcon = registerIcon('chat-view-icon', Codicon.chatSparkle, localize('chatViewIcon', 'View icon of the chat view.'));8081class RegisterChatViewContainerContribution implements IWorkbenchContribution {8283static ID = 'sessions.registerChatViewContainer';8485constructor() {86const viewContainerRegistry = Registry.as<IViewContainersRegistry>(ViewExtensions.ViewContainersRegistry);87const viewsRegistry = Registry.as<IViewsRegistry>(ViewExtensions.ViewsRegistry);88let chatViewContainer = viewContainerRegistry.get(ChatViewContainerId);89if (chatViewContainer) {90const view = viewsRegistry.getView(ChatViewId);91if (view) {92viewsRegistry.deregisterViews([view], chatViewContainer);93}94viewContainerRegistry.deregisterViewContainer(chatViewContainer);95}9697chatViewContainer = viewContainerRegistry.registerViewContainer({98id: ChatViewContainerId,99title: localize2('chat.viewContainer.label', "Chat"),100icon: chatViewIcon,101ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [ChatViewContainerId, { mergeViewWithContainerWhenSingleView: true }]),102storageId: ChatViewContainerId,103hideIfEmpty: true,104order: 1,105windowEnablement: WindowEnablement.Sessions,106}, ViewContainerLocation.ChatBar, { isDefault: true, doNotRegisterOpenCommand: true });107108viewsRegistry.registerViews([{109id: ChatViewId,110containerIcon: chatViewContainer.icon,111containerTitle: chatViewContainer.title.value,112singleViewPaneContainerTitle: chatViewContainer.title.value,113name: localize2('chat.viewContainer.label', "Chat"),114canToggleVisibility: false,115canMoveView: false,116ctorDescriptor: new SyncDescriptor(ChatViewPane),117when: ContextKeyExpr.and(IsNewChatSessionContext.negate(), IsNewChatInSessionContext.negate()),118windowEnablement: WindowEnablement.Sessions119}, {120id: SessionsViewId,121containerIcon: chatViewContainer.icon,122containerTitle: chatViewContainer.title.value,123singleViewPaneContainerTitle: chatViewContainer.title.value,124name: localize2('sessions.newChat.view', "New Session"),125canToggleVisibility: false,126canMoveView: false,127ctorDescriptor: new SyncDescriptor(NewChatViewPane),128when: IsNewChatSessionContext,129windowEnablement: WindowEnablement.Sessions,130}, {131id: NewChatInSessionViewId,132containerIcon: chatViewContainer.icon,133containerTitle: chatViewContainer.title.value,134singleViewPaneContainerTitle: chatViewContainer.title.value,135name: localize2('sessions.newChatInSession.view', "New Chat"),136canToggleVisibility: false,137canMoveView: false,138ctorDescriptor: new SyncDescriptor(NewChatInSessionViewPane),139when: ContextKeyExpr.and(IsNewChatSessionContext.negate(), IsNewChatInSessionContext),140windowEnablement: WindowEnablement.Sessions,141}], chatViewContainer);142}143}144145146// register actions147registerAction2(BranchChatSessionAction);148149// register workbench contributions150registerWorkbenchContribution2(RegisterChatViewContainerContribution.ID, RegisterChatViewContainerContribution, WorkbenchPhase.BlockStartup);151registerWorkbenchContribution2(RunScriptContribution.ID, RunScriptContribution, WorkbenchPhase.AfterRestored);152registerWorkbenchContribution2(SessionsOpenerParticipantContribution.ID, SessionsOpenerParticipantContribution, WorkbenchPhase.BlockStartup);153154// register services155registerSingleton(IPromptsService, AgenticPromptsService, InstantiationType.Delayed);156registerSingleton(ISessionsConfigurationService, SessionsConfigurationService, InstantiationType.Delayed);157registerSingleton(IAICustomizationWorkspaceService, SessionsAICustomizationWorkspaceService, InstantiationType.Delayed);158registerSingleton(ICustomizationHarnessService, SessionsCustomizationHarnessService, InstantiationType.Delayed);159160// register accessibility help161AccessibleViewRegistry.register(new SessionsChatAccessibilityHelp());162163164