Path: blob/main/src/vs/workbench/contrib/extensions/common/installExtensionsTool.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 { MarkdownString } from '../../../../base/common/htmlContent.js';7import { localize } from '../../../../nls.js';8import { areSameExtensions } from '../../../../platform/extensionManagement/common/extensionManagementUtil.js';9import { CountTokensCallback, IPreparedToolInvocation, IToolData, IToolImpl, IToolInvocation, IToolInvocationPreparationContext, IToolResult, ToolDataSource, ToolProgress } from '../../chat/common/languageModelToolsService.js';10import { IExtensionsWorkbenchService } from './extensions.js';1112export const InstallExtensionsToolId = 'vscode_installExtensions';1314export const InstallExtensionsToolData: IToolData = {15id: InstallExtensionsToolId,16toolReferenceName: 'installExtensions',17canBeReferencedInPrompt: true,18displayName: localize('installExtensionsTool.displayName', 'Install Extensions'),19modelDescription: localize('installExtensionsTool.modelDescription', "This is a tool for installing extensions in Visual Studio Code. You should provide the list of extension ids to install. The identifier of an extension is '\${ publisher }.\${ name }' for example: 'vscode.csharp'."),20userDescription: localize('installExtensionsTool.userDescription', 'Tool for installing extensions'),21source: ToolDataSource.Internal,22inputSchema: {23type: 'object',24properties: {25ids: {26type: 'array',27items: {28type: 'string',29},30description: 'The ids of the extensions to search for. The identifier of an extension is \'\${ publisher }.\${ name }\' for example: \'vscode.csharp\'.',31},32}33}34};3536type InputParams = {37ids: string[];38};3940export class InstallExtensionsTool implements IToolImpl {4142constructor(43@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService,44) { }4546async prepareToolInvocation(context: IToolInvocationPreparationContext, token: CancellationToken): Promise<IPreparedToolInvocation | undefined> {47const parameters = context.parameters as InputParams;48return {49confirmationMessages: {50title: localize('installExtensionsTool.confirmationTitle', 'Install Extensions'),51message: new MarkdownString(localize('installExtensionsTool.confirmationMessage', "Review the suggested extensions and click the **Install** button for each extension you wish to add. Once you have finished installing the selected extensions, click **Continue** to proceed.")),52},53toolSpecificData: {54kind: 'extensions',55extensions: parameters.ids56}57};58}5960async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, token: CancellationToken): Promise<IToolResult> {61const input = invocation.parameters as InputParams;62const installed = this.extensionsWorkbenchService.local.filter(e => input.ids.some(id => areSameExtensions({ id }, e.identifier)));63return {64content: [{65kind: 'text',66value: installed.length ? localize('installExtensionsTool.resultMessage', 'Following extensions are installed: {0}', installed.map(e => e.identifier.id).join(', ')) : localize('installExtensionsTool.noResultMessage', 'No extensions were installed.'),67}]68};69}70}717273