Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/promptSyntax/promptToolsCodeLensProvider.ts
3296 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 { CancellationToken } from '../../../../../base/common/cancellation.js';
7
import { Disposable } from '../../../../../base/common/lifecycle.js';
8
import { generateUuid } from '../../../../../base/common/uuid.js';
9
import { CodeLens, CodeLensList, CodeLensProvider } from '../../../../../editor/common/languages.js';
10
import { isITextModel, ITextModel } from '../../../../../editor/common/model.js';
11
import { ILanguageFeaturesService } from '../../../../../editor/common/services/languageFeatures.js';
12
import { localize } from '../../../../../nls.js';
13
import { CommandsRegistry } from '../../../../../platform/commands/common/commands.js';
14
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
15
import { showToolsPicker } from '../actions/chatToolPicker.js';
16
import { ILanguageModelToolsService } from '../../common/languageModelToolsService.js';
17
import { ALL_PROMPTS_LANGUAGE_SELECTOR } from '../../common/promptSyntax/promptTypes.js';
18
import { PromptToolsMetadata } from '../../common/promptSyntax/parsers/promptHeader/metadata/tools.js';
19
import { IPromptsService } from '../../common/promptSyntax/service/promptsService.js';
20
import { registerEditorFeature } from '../../../../../editor/common/editorFeatures.js';
21
import { PromptFileRewriter } from './promptFileRewriter.js';
22
23
class PromptToolsCodeLensProvider extends Disposable implements CodeLensProvider {
24
25
// `_`-prefix marks this as private command
26
private readonly cmdId = `_configure/${generateUuid()}`;
27
28
constructor(
29
@IPromptsService private readonly promptsService: IPromptsService,
30
@ILanguageFeaturesService private readonly languageService: ILanguageFeaturesService,
31
@ILanguageModelToolsService private readonly languageModelToolsService: ILanguageModelToolsService,
32
@IInstantiationService private readonly instantiationService: IInstantiationService
33
) {
34
super();
35
36
37
this._register(this.languageService.codeLensProvider.register(ALL_PROMPTS_LANGUAGE_SELECTOR, this));
38
39
this._register(CommandsRegistry.registerCommand(this.cmdId, (_accessor, ...args) => {
40
const [first, second] = args;
41
if (isITextModel(first) && second instanceof PromptToolsMetadata) {
42
this.updateTools(first, second);
43
}
44
}));
45
}
46
47
async provideCodeLenses(model: ITextModel, token: CancellationToken): Promise<undefined | CodeLensList> {
48
49
const parser = this.promptsService.getSyntaxParserFor(model);
50
51
await parser.start(token).settled();
52
const { header } = parser;
53
if (!header) {
54
return undefined;
55
}
56
57
const completed = await header.settled;
58
if (!completed || token.isCancellationRequested) {
59
return undefined;
60
}
61
62
if (('tools' in header.metadataUtility) === false) {
63
return undefined;
64
}
65
66
const { tools } = header.metadataUtility;
67
if (tools === undefined) {
68
return undefined;
69
}
70
71
const codeLens: CodeLens = {
72
range: tools.range.collapseToStart(),
73
command: {
74
title: localize('configure-tools.capitalized.ellipsis', "Configure Tools..."),
75
id: this.cmdId,
76
arguments: [model, tools]
77
}
78
};
79
return { lenses: [codeLens] };
80
}
81
82
private async updateTools(model: ITextModel, tools: PromptToolsMetadata) {
83
84
const selectedToolsNow = tools.value ? this.languageModelToolsService.toToolAndToolSetEnablementMap(tools.value) : new Map();
85
const newSelectedAfter = await this.instantiationService.invokeFunction(showToolsPicker, localize('placeholder', "Select tools"), undefined, selectedToolsNow);
86
if (!newSelectedAfter) {
87
return;
88
}
89
await this.instantiationService.createInstance(PromptFileRewriter).rewriteTools(model, newSelectedAfter, tools.range);
90
}
91
}
92
93
registerEditorFeature(PromptToolsCodeLensProvider);
94
95