Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/extensions/common/installExtensionsTool.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 { MarkdownString } from '../../../../base/common/htmlContent.js';
8
import { localize } from '../../../../nls.js';
9
import { areSameExtensions } from '../../../../platform/extensionManagement/common/extensionManagementUtil.js';
10
import { CountTokensCallback, IPreparedToolInvocation, IToolData, IToolImpl, IToolInvocation, IToolInvocationPreparationContext, IToolResult, ToolDataSource, ToolProgress } from '../../chat/common/languageModelToolsService.js';
11
import { IExtensionsWorkbenchService } from './extensions.js';
12
13
export const InstallExtensionsToolId = 'vscode_installExtensions';
14
15
export const InstallExtensionsToolData: IToolData = {
16
id: InstallExtensionsToolId,
17
toolReferenceName: 'installExtensions',
18
canBeReferencedInPrompt: true,
19
displayName: localize('installExtensionsTool.displayName', 'Install Extensions'),
20
modelDescription: 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'."),
21
userDescription: localize('installExtensionsTool.userDescription', 'Tool for installing extensions'),
22
source: ToolDataSource.Internal,
23
inputSchema: {
24
type: 'object',
25
properties: {
26
ids: {
27
type: 'array',
28
items: {
29
type: 'string',
30
},
31
description: 'The ids of the extensions to search for. The identifier of an extension is \'\${ publisher }.\${ name }\' for example: \'vscode.csharp\'.',
32
},
33
}
34
}
35
};
36
37
type InputParams = {
38
ids: string[];
39
};
40
41
export class InstallExtensionsTool implements IToolImpl {
42
43
constructor(
44
@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService,
45
) { }
46
47
async prepareToolInvocation(context: IToolInvocationPreparationContext, token: CancellationToken): Promise<IPreparedToolInvocation | undefined> {
48
const parameters = context.parameters as InputParams;
49
return {
50
confirmationMessages: {
51
title: localize('installExtensionsTool.confirmationTitle', 'Install Extensions'),
52
message: 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.")),
53
},
54
toolSpecificData: {
55
kind: 'extensions',
56
extensions: parameters.ids
57
}
58
};
59
}
60
61
async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, _progress: ToolProgress, token: CancellationToken): Promise<IToolResult> {
62
const input = invocation.parameters as InputParams;
63
const installed = this.extensionsWorkbenchService.local.filter(e => input.ids.some(id => areSameExtensions({ id }, e.identifier)));
64
return {
65
content: [{
66
kind: 'text',
67
value: installed.length ? localize('installExtensionsTool.resultMessage', 'Following extensions are installed: {0}', installed.map(e => e.identifier.id).join(', ')) : localize('installExtensionsTool.noResultMessage', 'No extensions were installed.'),
68
}]
69
};
70
}
71
}
72
73