Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagement.contribution.ts
5267 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 { KeyCode } from '../../../../../base/common/keyCodes.js';
7
import { isObject, isString } from '../../../../../base/common/types.js';
8
import { localize, localize2 } from '../../../../../nls.js';
9
import { Action2, MenuId, MenuRegistry, registerAction2 } from '../../../../../platform/actions/common/actions.js';
10
import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';
11
import { SyncDescriptor } from '../../../../../platform/instantiation/common/descriptors.js';
12
import { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';
13
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
14
import { Registry } from '../../../../../platform/registry/common/platform.js';
15
import { IEditorPaneRegistry, EditorPaneDescriptor } from '../../../../browser/editor.js';
16
import { EditorExtensions, IEditorFactoryRegistry, IEditorSerializer } from '../../../../common/editor.js';
17
import { EditorInput } from '../../../../common/editor/editorInput.js';
18
import { IEditorService, MODAL_GROUP } from '../../../../services/editor/common/editorService.js';
19
import { ResourceContextKey } from '../../../../common/contextkeys.js';
20
import { ChatContextKeys } from '../../common/actions/chatContextKeys.js';
21
import { CONTEXT_MODELS_EDITOR, CONTEXT_MODELS_SEARCH_FOCUS, MANAGE_CHAT_COMMAND_ID } from '../../common/constants.js';
22
import { CHAT_CATEGORY } from '../actions/chatActions.js';
23
import { ChatManagementEditor, ModelsManagementEditor } from './chatManagementEditor.js';
24
import { ChatManagementEditorInput, ModelsManagementEditorInput } from './chatManagementEditorInput.js';
25
import { ILanguageModelsConfigurationService } from '../../common/languageModelsConfiguration.js';
26
import { Codicon } from '../../../../../base/common/codicons.js';
27
import { registerIcon } from '../../../../../platform/theme/common/iconRegistry.js';
28
import { Disposable } from '../../../../../base/common/lifecycle.js';
29
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../common/contributions.js';
30
31
const languageModelsOpenSettingsIcon = registerIcon('language-models-open-settings', Codicon.goToFile, localize('languageModelsOpenSettings', 'Icon for open language models settings commands.'));
32
33
const LANGUAGE_MODELS_ENTITLEMENT_PRECONDITION = ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.or(
34
ChatContextKeys.Entitlement.planFree,
35
ChatContextKeys.Entitlement.planPro,
36
ChatContextKeys.Entitlement.planProPlus,
37
ChatContextKeys.Entitlement.planBusiness,
38
ChatContextKeys.Entitlement.planEnterprise,
39
ChatContextKeys.Entitlement.internal
40
));
41
42
Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(
43
EditorPaneDescriptor.create(
44
ChatManagementEditor,
45
ChatManagementEditor.ID,
46
localize('chatManagementEditor', "Chat Management Editor")
47
),
48
[
49
new SyncDescriptor(ChatManagementEditorInput)
50
]
51
);
52
53
Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(
54
EditorPaneDescriptor.create(
55
ModelsManagementEditor,
56
ModelsManagementEditor.ID,
57
localize('modelsManagementEditor', "Models Management Editor")
58
),
59
[
60
new SyncDescriptor(ModelsManagementEditorInput)
61
]
62
);
63
64
class ChatManagementEditorInputSerializer implements IEditorSerializer {
65
66
canSerialize(editorInput: EditorInput): boolean {
67
return true;
68
}
69
70
serialize(input: ChatManagementEditorInput): string {
71
return '';
72
}
73
74
deserialize(instantiationService: IInstantiationService): ChatManagementEditorInput {
75
return instantiationService.createInstance(ChatManagementEditorInput);
76
}
77
}
78
79
class ModelsManagementEditorInputSerializer implements IEditorSerializer {
80
81
canSerialize(editorInput: EditorInput): boolean {
82
return true;
83
}
84
85
serialize(input: ModelsManagementEditorInput): string {
86
return '';
87
}
88
89
deserialize(instantiationService: IInstantiationService): ModelsManagementEditorInput {
90
return instantiationService.createInstance(ModelsManagementEditorInput);
91
}
92
}
93
94
Registry.as<IEditorFactoryRegistry>(EditorExtensions.EditorFactory).registerEditorSerializer(ChatManagementEditorInput.ID, ChatManagementEditorInputSerializer);
95
Registry.as<IEditorFactoryRegistry>(EditorExtensions.EditorFactory).registerEditorSerializer(ModelsManagementEditorInput.ID, ModelsManagementEditorInputSerializer);
96
97
interface IOpenManageCopilotEditorActionOptions {
98
query?: string;
99
section?: string;
100
}
101
102
function sanitizeString(arg: unknown): string | undefined {
103
return isString(arg) ? arg : undefined;
104
}
105
106
function sanitizeOpenManageCopilotEditorArgs(input: unknown): IOpenManageCopilotEditorActionOptions {
107
if (!isObject(input)) {
108
input = {};
109
}
110
111
const args = <IOpenManageCopilotEditorActionOptions>input;
112
113
return {
114
query: sanitizeString(args?.query),
115
section: sanitizeString(args?.section)
116
};
117
}
118
119
class ChatManagementActionsContribution extends Disposable implements IWorkbenchContribution {
120
121
static readonly ID = 'workbench.contrib.chatManagementActions';
122
123
constructor(
124
@ILanguageModelsConfigurationService private readonly languageModelsConfigurationService: ILanguageModelsConfigurationService,
125
) {
126
super();
127
this.registerChatManagementActions();
128
this.registerLanguageModelsEditorTitleActions();
129
}
130
131
private registerChatManagementActions() {
132
this._register(registerAction2(class extends Action2 {
133
constructor() {
134
super({
135
id: MANAGE_CHAT_COMMAND_ID,
136
title: localize2('openAiManagement', "Manage Language Models"),
137
category: CHAT_CATEGORY,
138
precondition: LANGUAGE_MODELS_ENTITLEMENT_PRECONDITION,
139
f1: true,
140
});
141
}
142
async run(accessor: ServicesAccessor, args: string | IOpenManageCopilotEditorActionOptions) {
143
const editorService = accessor.get(IEditorService);
144
args = sanitizeOpenManageCopilotEditorArgs(args);
145
return editorService.openEditor(new ModelsManagementEditorInput(), { pinned: true }, MODAL_GROUP);
146
}
147
}));
148
149
this._register(registerAction2(class extends Action2 {
150
constructor() {
151
super({
152
id: 'chat.models.action.clearSearchResults',
153
precondition: CONTEXT_MODELS_EDITOR,
154
keybinding: {
155
primary: KeyCode.Escape,
156
weight: KeybindingWeight.EditorContrib,
157
when: CONTEXT_MODELS_SEARCH_FOCUS
158
},
159
title: localize2('models.clearResults', "Clear Models Search Results")
160
});
161
}
162
163
run(accessor: ServicesAccessor) {
164
const activeEditorPane = accessor.get(IEditorService).activeEditorPane;
165
if (activeEditorPane instanceof ModelsManagementEditor) {
166
activeEditorPane.clearSearch();
167
}
168
return null;
169
}
170
}));
171
172
this._register(registerAction2(class extends Action2 {
173
constructor() {
174
super({
175
id: 'workbench.action.openLanguageModelsJson',
176
title: localize2('openLanguageModelsJson', "Open Language Models (JSON)"),
177
category: CHAT_CATEGORY,
178
precondition: LANGUAGE_MODELS_ENTITLEMENT_PRECONDITION,
179
f1: true,
180
});
181
}
182
183
async run(accessor: ServicesAccessor) {
184
const languageModelsConfigurationService = accessor.get(ILanguageModelsConfigurationService);
185
await languageModelsConfigurationService.configureLanguageModels();
186
}
187
}));
188
}
189
190
private registerLanguageModelsEditorTitleActions() {
191
const modelsConfigurationFile = this.languageModelsConfigurationService.configurationFile;
192
const openModelsManagementEditorWhen = ContextKeyExpr.and(
193
CONTEXT_MODELS_EDITOR.toNegated(),
194
ResourceContextKey.Resource.isEqualTo(modelsConfigurationFile.toString()),
195
ContextKeyExpr.not('isInDiffEditor'),
196
LANGUAGE_MODELS_ENTITLEMENT_PRECONDITION
197
);
198
199
MenuRegistry.appendMenuItem(MenuId.EditorTitle, {
200
command: {
201
id: MANAGE_CHAT_COMMAND_ID,
202
title: localize2('openAiManagement', "Manage Language Models"),
203
icon: languageModelsOpenSettingsIcon
204
},
205
when: openModelsManagementEditorWhen,
206
group: 'navigation',
207
order: 1
208
});
209
210
const openLanguageModelsJsonWhen = ContextKeyExpr.and(
211
CONTEXT_MODELS_EDITOR,
212
LANGUAGE_MODELS_ENTITLEMENT_PRECONDITION
213
);
214
215
MenuRegistry.appendMenuItem(MenuId.EditorTitle, {
216
command: {
217
id: 'workbench.action.openLanguageModelsJson',
218
title: localize2('openLanguageModelsJson', "Open Language Models (JSON)"),
219
icon: languageModelsOpenSettingsIcon
220
},
221
when: openLanguageModelsJsonWhen,
222
group: 'navigation',
223
order: 1
224
});
225
}
226
}
227
228
registerWorkbenchContribution2(ChatManagementActionsContribution.ID, ChatManagementActionsContribution, WorkbenchPhase.AfterRestored);
229
230