Path: blob/main/src/vs/workbench/contrib/chat/browser/promptSyntax/promptToolsCodeLensProvider.ts
3296 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 { CancellationToken } from '../../../../../base/common/cancellation.js';6import { Disposable } from '../../../../../base/common/lifecycle.js';7import { generateUuid } from '../../../../../base/common/uuid.js';8import { CodeLens, CodeLensList, CodeLensProvider } from '../../../../../editor/common/languages.js';9import { isITextModel, ITextModel } from '../../../../../editor/common/model.js';10import { ILanguageFeaturesService } from '../../../../../editor/common/services/languageFeatures.js';11import { localize } from '../../../../../nls.js';12import { CommandsRegistry } from '../../../../../platform/commands/common/commands.js';13import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';14import { showToolsPicker } from '../actions/chatToolPicker.js';15import { ILanguageModelToolsService } from '../../common/languageModelToolsService.js';16import { ALL_PROMPTS_LANGUAGE_SELECTOR } from '../../common/promptSyntax/promptTypes.js';17import { PromptToolsMetadata } from '../../common/promptSyntax/parsers/promptHeader/metadata/tools.js';18import { IPromptsService } from '../../common/promptSyntax/service/promptsService.js';19import { registerEditorFeature } from '../../../../../editor/common/editorFeatures.js';20import { PromptFileRewriter } from './promptFileRewriter.js';2122class PromptToolsCodeLensProvider extends Disposable implements CodeLensProvider {2324// `_`-prefix marks this as private command25private readonly cmdId = `_configure/${generateUuid()}`;2627constructor(28@IPromptsService private readonly promptsService: IPromptsService,29@ILanguageFeaturesService private readonly languageService: ILanguageFeaturesService,30@ILanguageModelToolsService private readonly languageModelToolsService: ILanguageModelToolsService,31@IInstantiationService private readonly instantiationService: IInstantiationService32) {33super();343536this._register(this.languageService.codeLensProvider.register(ALL_PROMPTS_LANGUAGE_SELECTOR, this));3738this._register(CommandsRegistry.registerCommand(this.cmdId, (_accessor, ...args) => {39const [first, second] = args;40if (isITextModel(first) && second instanceof PromptToolsMetadata) {41this.updateTools(first, second);42}43}));44}4546async provideCodeLenses(model: ITextModel, token: CancellationToken): Promise<undefined | CodeLensList> {4748const parser = this.promptsService.getSyntaxParserFor(model);4950await parser.start(token).settled();51const { header } = parser;52if (!header) {53return undefined;54}5556const completed = await header.settled;57if (!completed || token.isCancellationRequested) {58return undefined;59}6061if (('tools' in header.metadataUtility) === false) {62return undefined;63}6465const { tools } = header.metadataUtility;66if (tools === undefined) {67return undefined;68}6970const codeLens: CodeLens = {71range: tools.range.collapseToStart(),72command: {73title: localize('configure-tools.capitalized.ellipsis', "Configure Tools..."),74id: this.cmdId,75arguments: [model, tools]76}77};78return { lenses: [codeLens] };79}8081private async updateTools(model: ITextModel, tools: PromptToolsMetadata) {8283const selectedToolsNow = tools.value ? this.languageModelToolsService.toToolAndToolSetEnablementMap(tools.value) : new Map();84const newSelectedAfter = await this.instantiationService.invokeFunction(showToolsPicker, localize('placeholder', "Select tools"), undefined, selectedToolsNow);85if (!newSelectedAfter) {86return;87}88await this.instantiationService.createInstance(PromptFileRewriter).rewriteTools(model, newSelectedAfter, tools.range);89}90}9192registerEditorFeature(PromptToolsCodeLensProvider);939495