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