imcp 0.1.6 → 0.1.8-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/install.js +1 -106
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.js +1 -90
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/pull.js +1 -16
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/serve.js +1 -33
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/uninstall.js +1 -46
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.js +1 -65
- package/dist/cli/index.js.map +1 -0
- package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
- package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstaller.js +1 -163
- package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
- package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
- package/dist/core/installers/clients/ClineInstaller.js +1 -30
- package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
- package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
- package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
- package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
- package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
- package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
- package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
- package/dist/core/installers/index.js +1 -8
- package/dist/core/installers/index.js.map +1 -0
- package/dist/core/installers/requirements/BaseInstaller.js +1 -56
- package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
- package/dist/core/installers/requirements/CommandInstaller.js +1 -213
- package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
- package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
- package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
- package/dist/core/installers/requirements/InstallerFactory.js +1 -99
- package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
- package/dist/core/installers/requirements/NpmInstaller.js +1 -235
- package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
- package/dist/core/installers/requirements/NugetInstaller.js +1 -188
- package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
- package/dist/core/installers/requirements/PipInstaller.js +1 -192
- package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
- package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
- package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
- package/dist/core/loaders/ConfigurationLoader.js +1 -256
- package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
- package/dist/core/loaders/ConfigurationProvider.js +1 -383
- package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
- package/dist/core/loaders/InstallOperationManager.js +1 -310
- package/dist/core/loaders/InstallOperationManager.js.map +1 -0
- package/dist/core/loaders/ServerSchemaLoader.js +1 -108
- package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
- package/dist/core/loaders/ServerSchemaProvider.js +1 -89
- package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
- package/dist/core/loaders/SystemSettingsManager.js +1 -256
- package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
- package/dist/core/metadatas/constants.js +1 -100
- package/dist/core/metadatas/constants.js.map +1 -0
- package/dist/core/metadatas/recordingConstants.js +1 -46
- package/dist/core/metadatas/recordingConstants.js.map +1 -0
- package/dist/core/metadatas/types.js +1 -15
- package/dist/core/metadatas/types.js.map +1 -0
- package/dist/core/onboard/FeedOnboardService.js +1 -422
- package/dist/core/onboard/FeedOnboardService.js.map +1 -0
- package/dist/core/onboard/OnboardProcessor.js +1 -333
- package/dist/core/onboard/OnboardProcessor.js.map +1 -0
- package/dist/core/onboard/OnboardStatus.js +1 -9
- package/dist/core/onboard/OnboardStatus.js.map +1 -0
- package/dist/core/onboard/OnboardStatusManager.js +1 -360
- package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
- package/dist/core/validators/FeedValidator.js +1 -133
- package/dist/core/validators/FeedValidator.js.map +1 -0
- package/dist/core/validators/IServerValidator.js +1 -1
- package/dist/core/validators/IServerValidator.js.map +1 -0
- package/dist/core/validators/SSEServerValidator.js +1 -38
- package/dist/core/validators/SSEServerValidator.js.map +1 -0
- package/dist/core/validators/ServerValidatorFactory.js +1 -44
- package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
- package/dist/core/validators/StdioServerValidator.js +1 -281
- package/dist/core/validators/StdioServerValidator.js.map +1 -0
- package/dist/index.js +1 -18
- package/dist/index.js.map +1 -0
- package/dist/services/InstallationService.js +1 -81
- package/dist/services/InstallationService.js.map +1 -0
- package/dist/services/MCPManager.js +1 -197
- package/dist/services/MCPManager.js.map +1 -0
- package/dist/services/RequirementService.js +1 -548
- package/dist/services/RequirementService.js.map +1 -0
- package/dist/services/ServerService.js +1 -127
- package/dist/services/ServerService.js.map +1 -0
- package/dist/services/TelemetryService.js +1 -53
- package/dist/services/TelemetryService.js.map +1 -0
- package/dist/utils/UpdateCheckTracker.js +1 -79
- package/dist/utils/UpdateCheckTracker.js.map +1 -0
- package/dist/utils/adoUtils.js +1 -254
- package/dist/utils/adoUtils.js.map +1 -0
- package/dist/utils/clientUtils.js +1 -65
- package/dist/utils/clientUtils.js.map +1 -0
- package/dist/utils/feedUtils.js +1 -28
- package/dist/utils/feedUtils.js.map +1 -0
- package/dist/utils/githubAuth.js +1 -177
- package/dist/utils/githubAuth.js.map +1 -0
- package/dist/utils/githubUtils.js +1 -125
- package/dist/utils/githubUtils.js.map +1 -0
- package/dist/utils/logger.js +1 -176
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/macroExpressionUtils.js +1 -93
- package/dist/utils/macroExpressionUtils.js.map +1 -0
- package/dist/utils/osUtils.js +1 -664
- package/dist/utils/osUtils.js.map +1 -0
- package/dist/utils/versionUtils.js +1 -101
- package/dist/utils/versionUtils.js.map +1 -0
- package/dist/web/contract/serverContract.js +1 -1
- package/dist/web/contract/serverContract.js.map +1 -0
- package/dist/web/public/js/api.js +2 -132
- package/dist/web/public/js/api.js.map +1 -0
- package/dist/web/public/js/detailsWidget.js +2 -264
- package/dist/web/public/js/detailsWidget.js.map +1 -0
- package/dist/web/public/js/flights/flights.js +2 -127
- package/dist/web/public/js/flights/flights.js.map +1 -0
- package/dist/web/public/js/modal/index.js +2 -52
- package/dist/web/public/js/modal/index.js.map +1 -0
- package/dist/web/public/js/modal/installModal.js +2 -162
- package/dist/web/public/js/modal/installModal.js.map +1 -0
- package/dist/web/public/js/modal/installation.js +2 -266
- package/dist/web/public/js/modal/installation.js.map +1 -0
- package/dist/web/public/js/modal/loadingModal.js +2 -182
- package/dist/web/public/js/modal/loadingModal.js.map +1 -0
- package/dist/web/public/js/modal/modalSetup.js +2 -595
- package/dist/web/public/js/modal/modalSetup.js.map +1 -0
- package/dist/web/public/js/modal/modalUtils.js +2 -37
- package/dist/web/public/js/modal/modalUtils.js.map +1 -0
- package/dist/web/public/js/modal/versionUtils.js +2 -20
- package/dist/web/public/js/modal/versionUtils.js.map +1 -0
- package/dist/web/public/js/modal.js +2 -42
- package/dist/web/public/js/modal.js.map +1 -0
- package/dist/web/public/js/notifications.js +2 -137
- package/dist/web/public/js/notifications.js.map +1 -0
- package/dist/web/public/js/onboard/formProcessor.js +2 -1037
- package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
- package/dist/web/public/js/onboard/index.js +2 -374
- package/dist/web/public/js/onboard/index.js.map +1 -0
- package/dist/web/public/js/onboard/publishHandler.js +2 -172
- package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
- package/dist/web/public/js/onboard/state.js +2 -76
- package/dist/web/public/js/onboard/state.js.map +1 -0
- package/dist/web/public/js/onboard/templates.js +2 -342
- package/dist/web/public/js/onboard/templates.js.map +1 -0
- package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
- package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
- package/dist/web/public/js/onboard/validationHandlers.js +2 -493
- package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
- package/dist/web/public/js/serverCategoryDetails.js +2 -364
- package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
- package/dist/web/public/js/serverCategoryList.js +2 -241
- package/dist/web/public/js/serverCategoryList.js.map +1 -0
- package/dist/web/public/js/settings.js +2 -314
- package/dist/web/public/js/settings.js.map +1 -0
- package/dist/web/server.js +1 -404
- package/dist/web/server.js.map +1 -0
- package/package.json +8 -2
- package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
- package/.github/acl/access.yml +0 -20
- package/.github/compliance/inventory.yml +0 -5
- package/.github/policies/jit.yml +0 -19
- package/.github/workflows/build.yml +0 -28
- package/.roo/rules-code/rules.md +0 -88
- package/dist/cli/commands/start.d.ts +0 -2
- package/dist/cli/commands/start.js +0 -32
- package/dist/cli/commands/sync.d.ts +0 -2
- package/dist/cli/commands/sync.js +0 -17
- package/dist/core/ConfigurationLoader.d.ts +0 -32
- package/dist/core/ConfigurationLoader.js +0 -236
- package/dist/core/ConfigurationProvider.d.ts +0 -35
- package/dist/core/ConfigurationProvider.js +0 -375
- package/dist/core/InstallationService.d.ts +0 -50
- package/dist/core/InstallationService.js +0 -350
- package/dist/core/MCPManager.d.ts +0 -28
- package/dist/core/MCPManager.js +0 -188
- package/dist/core/RequirementService.d.ts +0 -40
- package/dist/core/RequirementService.js +0 -110
- package/dist/core/ServerSchemaLoader.d.ts +0 -11
- package/dist/core/ServerSchemaLoader.js +0 -43
- package/dist/core/ServerSchemaProvider.d.ts +0 -17
- package/dist/core/ServerSchemaProvider.js +0 -120
- package/dist/core/constants.d.ts +0 -47
- package/dist/core/constants.js +0 -94
- package/dist/core/installers/BaseInstaller.d.ts +0 -74
- package/dist/core/installers/BaseInstaller.js +0 -253
- package/dist/core/installers/ClientInstaller.d.ts +0 -23
- package/dist/core/installers/ClientInstaller.js +0 -564
- package/dist/core/installers/CommandInstaller.d.ts +0 -37
- package/dist/core/installers/CommandInstaller.js +0 -173
- package/dist/core/installers/GeneralInstaller.d.ts +0 -33
- package/dist/core/installers/GeneralInstaller.js +0 -85
- package/dist/core/installers/InstallerFactory.d.ts +0 -54
- package/dist/core/installers/InstallerFactory.js +0 -97
- package/dist/core/installers/NpmInstaller.d.ts +0 -26
- package/dist/core/installers/NpmInstaller.js +0 -127
- package/dist/core/installers/PipInstaller.d.ts +0 -28
- package/dist/core/installers/PipInstaller.js +0 -127
- package/dist/core/installers/RequirementInstaller.d.ts +0 -33
- package/dist/core/installers/RequirementInstaller.js +0 -3
- package/dist/core/types.d.ts +0 -166
- package/dist/core/types.js +0 -16
- package/dist/services/InstallRequestValidator.d.ts +0 -21
- package/dist/services/InstallRequestValidator.js +0 -99
- package/dist/web/public/js/modal/installHandler.js +0 -227
- package/dist/web/public/js/modal/loadingUI.js +0 -74
- package/dist/web/public/js/modal/messageQueue.js +0 -112
- package/dist/web/public/js/modal/modalUI.js +0 -214
- package/dist/web/public/js/modal/version.js +0 -20
- package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
- package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
- package/docs/Telemetry.md +0 -136
- package/memory-bank/activeContext.md +0 -26
- package/memory-bank/decisionLog.md +0 -91
- package/memory-bank/productContext.md +0 -41
- package/memory-bank/progress.md +0 -35
- package/memory-bank/systemPatterns.md +0 -10
- package/src/cli/commands/install.ts +0 -139
- package/src/cli/commands/list.ts +0 -113
- package/src/cli/commands/pull.ts +0 -16
- package/src/cli/commands/serve.ts +0 -39
- package/src/cli/commands/uninstall.ts +0 -64
- package/src/cli/index.ts +0 -82
- package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
- package/src/core/installers/clients/ClientInstaller.ts +0 -222
- package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
- package/src/core/installers/clients/ClineInstaller.ts +0 -35
- package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
- package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
- package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
- package/src/core/installers/index.ts +0 -11
- package/src/core/installers/requirements/BaseInstaller.ts +0 -85
- package/src/core/installers/requirements/CommandInstaller.ts +0 -231
- package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
- package/src/core/installers/requirements/InstallerFactory.ts +0 -114
- package/src/core/installers/requirements/NpmInstaller.ts +0 -271
- package/src/core/installers/requirements/NugetInstaller.ts +0 -203
- package/src/core/installers/requirements/PipInstaller.ts +0 -207
- package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
- package/src/core/loaders/ConfigurationLoader.ts +0 -298
- package/src/core/loaders/ConfigurationProvider.ts +0 -462
- package/src/core/loaders/InstallOperationManager.ts +0 -367
- package/src/core/loaders/ServerSchemaLoader.ts +0 -117
- package/src/core/loaders/ServerSchemaProvider.ts +0 -99
- package/src/core/loaders/SystemSettingsManager.ts +0 -278
- package/src/core/metadatas/constants.ts +0 -122
- package/src/core/metadatas/recordingConstants.ts +0 -65
- package/src/core/metadatas/types.ts +0 -202
- package/src/core/onboard/FeedOnboardService.ts +0 -501
- package/src/core/onboard/OnboardProcessor.ts +0 -356
- package/src/core/onboard/OnboardStatus.ts +0 -60
- package/src/core/onboard/OnboardStatusManager.ts +0 -416
- package/src/core/validators/FeedValidator.ts +0 -135
- package/src/core/validators/IServerValidator.ts +0 -21
- package/src/core/validators/SSEServerValidator.ts +0 -43
- package/src/core/validators/ServerValidatorFactory.ts +0 -51
- package/src/core/validators/StdioServerValidator.ts +0 -313
- package/src/index.ts +0 -44
- package/src/services/InstallationService.ts +0 -102
- package/src/services/MCPManager.ts +0 -249
- package/src/services/RequirementService.ts +0 -627
- package/src/services/ServerService.ts +0 -161
- package/src/services/TelemetryService.ts +0 -59
- package/src/utils/UpdateCheckTracker.ts +0 -86
- package/src/utils/adoUtils.ts +0 -293
- package/src/utils/clientUtils.ts +0 -72
- package/src/utils/feedUtils.ts +0 -31
- package/src/utils/githubAuth.ts +0 -212
- package/src/utils/githubUtils.ts +0 -164
- package/src/utils/logger.ts +0 -195
- package/src/utils/macroExpressionUtils.ts +0 -104
- package/src/utils/osUtils.ts +0 -700
- package/src/utils/versionUtils.ts +0 -114
- package/src/web/contract/serverContract.ts +0 -74
- package/src/web/public/css/detailsWidget.css +0 -235
- package/src/web/public/css/modal.css +0 -757
- package/src/web/public/css/notifications.css +0 -101
- package/src/web/public/css/onboard.css +0 -107
- package/src/web/public/css/serverCategoryList.css +0 -120
- package/src/web/public/css/serverDetails.css +0 -139
- package/src/web/public/index.html +0 -359
- package/src/web/public/js/api.js +0 -132
- package/src/web/public/js/detailsWidget.js +0 -264
- package/src/web/public/js/flights/flights.js +0 -127
- package/src/web/public/js/modal/index.js +0 -52
- package/src/web/public/js/modal/installModal.js +0 -162
- package/src/web/public/js/modal/installation.js +0 -266
- package/src/web/public/js/modal/loadingModal.js +0 -182
- package/src/web/public/js/modal/modalSetup.js +0 -595
- package/src/web/public/js/modal/modalUtils.js +0 -37
- package/src/web/public/js/modal/versionUtils.js +0 -20
- package/src/web/public/js/modal.js +0 -42
- package/src/web/public/js/notifications.js +0 -137
- package/src/web/public/js/onboard/formProcessor.js +0 -1037
- package/src/web/public/js/onboard/index.js +0 -374
- package/src/web/public/js/onboard/publishHandler.js +0 -172
- package/src/web/public/js/onboard/state.js +0 -76
- package/src/web/public/js/onboard/templates.js +0 -342
- package/src/web/public/js/onboard/uiHandlers.js +0 -1076
- package/src/web/public/js/onboard/validationHandlers.js +0 -493
- package/src/web/public/js/serverCategoryDetails.js +0 -364
- package/src/web/public/js/serverCategoryList.js +0 -241
- package/src/web/public/js/settings.js +0 -314
- package/src/web/public/modal.html +0 -84
- package/src/web/public/onboard.html +0 -296
- package/src/web/public/settings.html +0 -135
- package/src/web/public/styles.css +0 -277
- package/src/web/server.ts +0 -478
- package/tsconfig.json +0 -18
- package/wiki/Installation.md +0 -3
- package/wiki/Publish.md +0 -3
|
@@ -1,283 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { exec } from 'child_process';
|
|
3
|
-
import { promisify } from 'util';
|
|
4
|
-
import { isCommandAvailable, getNpmExecutablePath } from '../../../utils/osUtils.js';
|
|
5
|
-
import { ExtensionInstaller } from './ExtensionInstaller.js';
|
|
6
|
-
import { SUPPORTED_CLIENTS } from '../../metadatas/constants.js';
|
|
7
|
-
import { MACRO_EXPRESSIONS, MacroResolverFunctions } from '../../../utils/macroExpressionUtils.js';
|
|
8
|
-
import { InstallOperationManager } from '../../loaders/InstallOperationManager.js';
|
|
9
|
-
import * as RecordingConstants from '../../metadatas/recordingConstants.js';
|
|
10
|
-
const execAsync = promisify(exec);
|
|
11
|
-
/**
|
|
12
|
-
* Base class for client installers with shared functionality
|
|
13
|
-
*/
|
|
14
|
-
export class BaseClientInstaller {
|
|
15
|
-
/**
|
|
16
|
-
* Generate a unique operation ID for tracking installations
|
|
17
|
-
*/
|
|
18
|
-
generateOperationId() {
|
|
19
|
-
return `install-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Set up installation configuration with environment variables and arguments
|
|
23
|
-
* Handles Python environment configuration if specified
|
|
24
|
-
*/
|
|
25
|
-
async setupInstallConfig(serverConfig, options) {
|
|
26
|
-
const finalConfig = { ...serverConfig.installation };
|
|
27
|
-
finalConfig.mode = serverConfig.mode;
|
|
28
|
-
// Handle command line arguments
|
|
29
|
-
if (options.args && options.args.length > 0) {
|
|
30
|
-
Logger.debug(`Using args from ServerInstallOptions: ${options.args.join(' ')}`);
|
|
31
|
-
finalConfig.args = options.args;
|
|
32
|
-
}
|
|
33
|
-
// Handle environment variables
|
|
34
|
-
const baseEnv = finalConfig.env || {};
|
|
35
|
-
const defaultEnv = {};
|
|
36
|
-
for (const [key, config] of Object.entries(baseEnv)) {
|
|
37
|
-
const envConfig = config;
|
|
38
|
-
if (envConfig.Default) {
|
|
39
|
-
defaultEnv[key] = envConfig.Default;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
finalConfig.env = { ...defaultEnv, ...(options.env || {}) };
|
|
43
|
-
// Handle macro expressions
|
|
44
|
-
await this._resolveConfigMacros(finalConfig, options);
|
|
45
|
-
Logger.debug(`Final installation config: ${JSON.stringify(finalConfig)}`);
|
|
46
|
-
return finalConfig;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Resolves and replaces known macro expressions (e.g., ${PYTHON_PACKAGE}, ${NPMPATH}, ${BROWSER_PATH})
|
|
50
|
-
* in the provided configuration object's 'args' and 'env' properties.
|
|
51
|
-
* This method directly mutates the finalConfig object.
|
|
52
|
-
* @param finalConfig The configuration object to modify.
|
|
53
|
-
* @param options Server installation options which may contain settings like pythonEnv or npmPath.
|
|
54
|
-
*/
|
|
55
|
-
async _resolveConfigMacros(finalConfig, options) {
|
|
56
|
-
for (const macro of Object.values(MACRO_EXPRESSIONS)) {
|
|
57
|
-
const isMacroInArgs = finalConfig.args?.some((arg) => typeof arg === 'string' && arg.includes(macro));
|
|
58
|
-
const isMacroInEnv = Object.values(finalConfig.env || {}).some(value => typeof value === 'string' && value.includes(macro));
|
|
59
|
-
if (!isMacroInArgs && !isMacroInEnv) {
|
|
60
|
-
Logger.debug(`Macro ${macro} not found in args or env, skipping resolution.`);
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
const resolver = MacroResolverFunctions[macro];
|
|
64
|
-
if (resolver) {
|
|
65
|
-
const resolvedValue = await resolver(finalConfig, options);
|
|
66
|
-
if (resolvedValue !== undefined) {
|
|
67
|
-
// Replace in args
|
|
68
|
-
if (finalConfig.args) {
|
|
69
|
-
const originalArgsString = finalConfig.args.join(' ');
|
|
70
|
-
finalConfig.args = finalConfig.args.map((arg) => typeof arg === 'string' && arg.includes(macro)
|
|
71
|
-
? arg.replace(new RegExp(macro.replace(/[${}]/g, '\\$&'), 'g'), resolvedValue)
|
|
72
|
-
: arg);
|
|
73
|
-
if (finalConfig.args.join(' ') !== originalArgsString) {
|
|
74
|
-
Logger.debug(`Args after ${macro} ('${resolvedValue}') replacement: ${finalConfig.args.join(' ')}`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// Replace in env
|
|
78
|
-
if (finalConfig.env) {
|
|
79
|
-
const originalEnvJson = JSON.stringify(finalConfig.env);
|
|
80
|
-
for (const key in finalConfig.env) {
|
|
81
|
-
if (typeof finalConfig.env[key] === 'string' && finalConfig.env[key].includes(macro)) {
|
|
82
|
-
finalConfig.env[key] = finalConfig.env[key].replace(new RegExp(macro.replace(/[${}]/g, '\\$&'), 'g'), resolvedValue);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (JSON.stringify(finalConfig.env) !== originalEnvJson) {
|
|
86
|
-
Logger.debug(`Env after ${macro} ('${resolvedValue}') replacement: ${JSON.stringify(finalConfig.env)}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
Logger.debug(`Could not resolve value for macro: ${macro}. It will not be replaced.`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Handle NPX commands for Windows platform
|
|
98
|
-
*/
|
|
99
|
-
async handleWindowsNpx(config) {
|
|
100
|
-
if (process.platform === 'win32' && config.command === 'npx') {
|
|
101
|
-
const npmPath = await getNpmExecutablePath();
|
|
102
|
-
return {
|
|
103
|
-
...config,
|
|
104
|
-
command: 'cmd',
|
|
105
|
-
args: ['/c', 'npx', ...config.args],
|
|
106
|
-
env: {
|
|
107
|
-
...config.env,
|
|
108
|
-
'APPDATA': npmPath
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
return config;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Initialize settings object with client-specific structure
|
|
116
|
-
* Override in child classes to provide custom initialization
|
|
117
|
-
*/
|
|
118
|
-
initializeSettings(settings) {
|
|
119
|
-
if (!settings.mcpServers) {
|
|
120
|
-
settings.mcpServers = {};
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Handle stdio mode configuration
|
|
125
|
-
* Override in child classes to provide custom stdio configuration
|
|
126
|
-
*/
|
|
127
|
-
async handleStdioMode(settings, serverName, finalConfig) {
|
|
128
|
-
// Convert backslashes to forward slashes in args
|
|
129
|
-
if (finalConfig.args) {
|
|
130
|
-
finalConfig.args = finalConfig.args.map((arg) => typeof arg === 'string' ? arg.replace(/\\/g, '/') : arg);
|
|
131
|
-
}
|
|
132
|
-
settings.mcpServers[serverName] = {
|
|
133
|
-
command: finalConfig.command,
|
|
134
|
-
args: finalConfig.args,
|
|
135
|
-
env: finalConfig.env,
|
|
136
|
-
autoApprove: [],
|
|
137
|
-
disabled: false,
|
|
138
|
-
alwaysAllow: []
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Handle SSE mode configuration
|
|
143
|
-
* Override in child classes to provide custom SSE configuration
|
|
144
|
-
*/
|
|
145
|
-
handleSseMode(settings, serverName, installConfig) {
|
|
146
|
-
settings.mcpServers[serverName] = {
|
|
147
|
-
type: 'sse',
|
|
148
|
-
url: installConfig.url
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Checks if VS Code or VS Code Insiders is installed and installs the client extension.
|
|
153
|
-
* @param operationId The operation ID for tracking.
|
|
154
|
-
* @returns An OperationStatus object if checks fail or installation fails, otherwise undefined.
|
|
155
|
-
*/
|
|
156
|
-
async checkVSCodeAndInstallExtension(operationId) {
|
|
157
|
-
// Check if VS Code or VS Code Insiders is installed
|
|
158
|
-
const isVSCodeInstalled = await isCommandAvailable('code');
|
|
159
|
-
const isVSCodeInsidersInstalled = await isCommandAvailable('code-insiders');
|
|
160
|
-
if (!isVSCodeInstalled && !isVSCodeInsidersInstalled) {
|
|
161
|
-
return {
|
|
162
|
-
status: 'failed',
|
|
163
|
-
type: 'install',
|
|
164
|
-
target: 'server',
|
|
165
|
-
message: 'Failed to install as neither VS Code nor VS Code Insiders are installed on this system. Please run `code` or `code-insiders` to make sure they are installed. Relaunch imcp after installation.',
|
|
166
|
-
operationId
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
// Install extension
|
|
170
|
-
const extensionResult = await ExtensionInstaller.installExtension(this.clientName);
|
|
171
|
-
if (!extensionResult) {
|
|
172
|
-
Logger.debug(`Failed to install ${this.clientName} extension`);
|
|
173
|
-
return {
|
|
174
|
-
status: 'failed',
|
|
175
|
-
type: 'install',
|
|
176
|
-
target: 'server',
|
|
177
|
-
message: `Failed to install ${this.clientName} extension`,
|
|
178
|
-
operationId
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
return undefined;
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Update VS Code settings for both VS Code and VS Code Insiders if installed
|
|
185
|
-
* @param serverName The name of the server to configure
|
|
186
|
-
* @param installConfig The installation configuration
|
|
187
|
-
* @returns Array of results indicating success/failure for each VS Code variant
|
|
188
|
-
*/
|
|
189
|
-
async updateVSCodeSettings(serverName, installConfig) {
|
|
190
|
-
const results = [];
|
|
191
|
-
const isVSCodeInstalled = await isCommandAvailable('code');
|
|
192
|
-
const isVSCodeInsidersInstalled = await isCommandAvailable('code-insiders');
|
|
193
|
-
// Update settings for VS Code if installed
|
|
194
|
-
if (isVSCodeInstalled) {
|
|
195
|
-
try {
|
|
196
|
-
const settingPath = SUPPORTED_CLIENTS[this.clientName].codeSettingPath;
|
|
197
|
-
await this.setupClientSettings(settingPath, serverName, installConfig);
|
|
198
|
-
results.push({ success: true, path: settingPath });
|
|
199
|
-
}
|
|
200
|
-
catch (error) {
|
|
201
|
-
results.push({
|
|
202
|
-
success: false,
|
|
203
|
-
path: SUPPORTED_CLIENTS[this.clientName].codeSettingPath,
|
|
204
|
-
error: error instanceof Error ? error.message : String(error)
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
// Update settings for VS Code Insiders if installed
|
|
209
|
-
if (isVSCodeInsidersInstalled) {
|
|
210
|
-
try {
|
|
211
|
-
const settingPath = SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath;
|
|
212
|
-
await this.setupClientSettings(settingPath, serverName, installConfig);
|
|
213
|
-
results.push({ success: true, path: settingPath });
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
results.push({
|
|
217
|
-
success: false,
|
|
218
|
-
path: SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath,
|
|
219
|
-
error: error instanceof Error ? error.message : String(error)
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return results;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Install the client
|
|
227
|
-
* @param serverConfig Server configuration
|
|
228
|
-
* @param options Installation options including environment variables and arguments
|
|
229
|
-
*/
|
|
230
|
-
async install(serverConfig, options, categoryName) {
|
|
231
|
-
const operationId = this.generateOperationId();
|
|
232
|
-
const recorder = InstallOperationManager.getInstance(categoryName || serverConfig.name, serverConfig.name);
|
|
233
|
-
return await recorder.recording(async () => {
|
|
234
|
-
await recorder.recording(() => this.checkVSCodeAndInstallExtension(operationId), {
|
|
235
|
-
stepName: RecordingConstants.STEP_CHECK_VSCODE_AND_INSTALL_EXTENSION,
|
|
236
|
-
onResult: (result) => result?.status !== 'failed'
|
|
237
|
-
});
|
|
238
|
-
const installConfig = await recorder.recording(() => this.setupInstallConfig(serverConfig, options), {
|
|
239
|
-
stepName: RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG
|
|
240
|
-
});
|
|
241
|
-
if (serverConfig.mode) {
|
|
242
|
-
installConfig.mode = serverConfig.mode;
|
|
243
|
-
}
|
|
244
|
-
const results = await recorder.recording(() => this.updateVSCodeSettings(serverConfig.name, installConfig), {
|
|
245
|
-
stepName: RecordingConstants.STEP_UPDATE_VSCODE_SETTINGS,
|
|
246
|
-
onResult: (result) => result?.some(r => r.success)
|
|
247
|
-
});
|
|
248
|
-
// Determine overall success
|
|
249
|
-
const anySuccess = results.some(r => r.success);
|
|
250
|
-
const successPaths = results.filter(r => r.success).map(r => r.path);
|
|
251
|
-
const errors = results.filter(r => !r.success).map(r => r.error);
|
|
252
|
-
const finalMessage = anySuccess
|
|
253
|
-
? `Successfully installed ${this.clientName} client. Updated settings in: ${successPaths.join(', ')}`
|
|
254
|
-
: `Failed to install ${this.clientName} client. Errors: ${errors.join('; ')}`;
|
|
255
|
-
return {
|
|
256
|
-
status: anySuccess ? 'completed' : 'failed',
|
|
257
|
-
type: 'install',
|
|
258
|
-
target: 'server',
|
|
259
|
-
message: finalMessage,
|
|
260
|
-
operationId,
|
|
261
|
-
error: anySuccess ? undefined : errors.join('; ')
|
|
262
|
-
};
|
|
263
|
-
}, {
|
|
264
|
-
stepName: RecordingConstants.STEP_INSTALLATION,
|
|
265
|
-
onResult: (result) => result?.status !== 'failed',
|
|
266
|
-
endMessage: (result) => result?.message,
|
|
267
|
-
onError: (error) => {
|
|
268
|
-
const errorMsg = `Unexpected error installing ${this.clientName} client: ${error instanceof Error ? error.message : String(error)}`;
|
|
269
|
-
return {
|
|
270
|
-
result: {
|
|
271
|
-
status: 'failed',
|
|
272
|
-
type: 'install',
|
|
273
|
-
target: 'server',
|
|
274
|
-
message: errorMsg,
|
|
275
|
-
operationId,
|
|
276
|
-
error: error instanceof Error ? error.message : String(error)
|
|
277
|
-
}, message: errorMsg
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
}
|
|
1
|
+
import{Logger}from"../../../utils/logger.js";import{exec}from"child_process";import{promisify}from"util";import{isCommandAvailable,getNpmExecutablePath}from"../../../utils/osUtils.js";import{ExtensionInstaller}from"./ExtensionInstaller.js";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";import{MACRO_EXPRESSIONS,MacroResolverFunctions}from"../../../utils/macroExpressionUtils.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";import*as RecordingConstants from"../../metadatas/recordingConstants.js";const execAsync=promisify(exec);export class BaseClientInstaller{generateOperationId(){return`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}async setupInstallConfig(e,s){const t={...e.installation};t.mode=e.mode,s.args&&s.args.length>0&&(Logger.debug(`Using args from ServerInstallOptions: ${s.args.join(" ")}`),t.args=s.args);const n=t.env||{},a={};for(const[e,s]of Object.entries(n)){const t=s;t.Default&&(a[e]=t.Default)}return t.env={...a,...s.env||{}},await this._resolveConfigMacros(t,s),Logger.debug(`Final installation config: ${JSON.stringify(t)}`),t}async _resolveConfigMacros(e,s){for(const t of Object.values(MACRO_EXPRESSIONS)){const n=e.args?.some((e=>"string"==typeof e&&e.includes(t))),a=Object.values(e.env||{}).some((e=>"string"==typeof e&&e.includes(t)));if(!n&&!a){Logger.debug(`Macro ${t} not found in args or env, skipping resolution.`);continue}const r=MacroResolverFunctions[t];if(r){const n=await r(e,s);if(void 0!==n){if(e.args){const s=e.args.join(" ");e.args=e.args.map((e=>"string"==typeof e&&e.includes(t)?e.replace(new RegExp(t.replace(/[${}]/g,"\\$&"),"g"),n):e)),e.args.join(" ")!==s&&Logger.debug(`Args after ${t} ('${n}') replacement: ${e.args.join(" ")}`)}if(e.env){const s=JSON.stringify(e.env);for(const s in e.env)"string"==typeof e.env[s]&&e.env[s].includes(t)&&(e.env[s]=e.env[s].replace(new RegExp(t.replace(/[${}]/g,"\\$&"),"g"),n));JSON.stringify(e.env)!==s&&Logger.debug(`Env after ${t} ('${n}') replacement: ${JSON.stringify(e.env)}`)}}else Logger.debug(`Could not resolve value for macro: ${t}. It will not be replaced.`)}}}async handleWindowsNpx(e){if("win32"===process.platform&&"npx"===e.command){const s=await getNpmExecutablePath();return{...e,command:"cmd",args:["/c","npx",...e.args],env:{...e.env,APPDATA:s}}}return e}initializeSettings(e){e.mcpServers||(e.mcpServers={})}async handleStdioMode(e,s,t){t.args&&(t.args=t.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.mcpServers[s]={command:t.command,args:t.args,env:t.env,autoApprove:[],disabled:!1,alwaysAllow:[]}}handleSseMode(e,s,t){e.mcpServers[s]={type:"sse",url:t.url}}async checkVSCodeAndInstallExtension(e){const s=await isCommandAvailable("code"),t=await isCommandAvailable("code-insiders");return s||t?await ExtensionInstaller.installExtension(this.clientName)?void 0:(Logger.debug(`Failed to install ${this.clientName} extension`),{status:"failed",type:"install",target:"server",message:`Failed to install ${this.clientName} extension`,operationId:e}):{status:"failed",type:"install",target:"server",message:"Failed to install as neither VS Code nor VS Code Insiders are installed on this system. Please run `code` or `code-insiders` to make sure they are installed. Relaunch imcp after installation.",operationId:e}}async updateVSCodeSettings(e,s){const t=[],n=await isCommandAvailable("code"),a=await isCommandAvailable("code-insiders");if(n)try{const n=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;await this.setupClientSettings(n,e,s),t.push({success:!0,path:n})}catch(e){t.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:e instanceof Error?e.message:String(e)})}if(a)try{const n=SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath;await this.setupClientSettings(n,e,s),t.push({success:!0,path:n})}catch(e){t.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath,error:e instanceof Error?e.message:String(e)})}return t}async install(e,s,t){const n=this.generateOperationId(),a=InstallOperationManager.getInstance(t||e.name,e.name);return await a.recording((async()=>{await a.recording((()=>this.checkVSCodeAndInstallExtension(n)),{stepName:RecordingConstants.STEP_CHECK_VSCODE_AND_INSTALL_EXTENSION,onResult:e=>"failed"!==e?.status});const t=await a.recording((()=>this.setupInstallConfig(e,s)),{stepName:RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG});e.mode&&(t.mode=e.mode);const r=await a.recording((()=>this.updateVSCodeSettings(e.name,t)),{stepName:RecordingConstants.STEP_UPDATE_VSCODE_SETTINGS,onResult:e=>e?.some((e=>e.success))}),i=r.some((e=>e.success)),o=r.filter((e=>e.success)).map((e=>e.path)),l=r.filter((e=>!e.success)).map((e=>e.error));return{status:i?"completed":"failed",type:"install",target:"server",message:i?`Successfully installed ${this.clientName} client. Updated settings in: ${o.join(", ")}`:`Failed to install ${this.clientName} client. Errors: ${l.join("; ")}`,operationId:n,error:i?void 0:l.join("; ")}}),{stepName:RecordingConstants.STEP_INSTALLATION,onResult:e=>"failed"!==e?.status,endMessage:e=>e?.message,onError:e=>{const s=`Unexpected error installing ${this.clientName} client: ${e instanceof Error?e.message:String(e)}`;return{result:{status:"failed",type:"install",target:"server",message:s,operationId:n,error:e instanceof Error?e.message:String(e)},message:s}}})}}
|
|
283
2
|
//# sourceMappingURL=BaseClientInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Logger","exec","promisify","isCommandAvailable","getNpmExecutablePath","ExtensionInstaller","SUPPORTED_CLIENTS","MACRO_EXPRESSIONS","MacroResolverFunctions","InstallOperationManager","RecordingConstants","execAsync","BaseClientInstaller","generateOperationId","Date","now","Math","random","toString","substr","setupInstallConfig","serverConfig","options","finalConfig","installation","mode","args","length","debug","join","baseEnv","env","defaultEnv","key","config","Object","entries","envConfig","Default","this","_resolveConfigMacros","JSON","stringify","macro","values","isMacroInArgs","some","arg","includes","isMacroInEnv","value","resolver","resolvedValue","undefined","originalArgsString","map","replace","RegExp","originalEnvJson","handleWindowsNpx","process","platform","command","npmPath","APPDATA","initializeSettings","settings","mcpServers","handleStdioMode","serverName","autoApprove","disabled","alwaysAllow","handleSseMode","installConfig","type","url","checkVSCodeAndInstallExtension","operationId","isVSCodeInstalled","isVSCodeInsidersInstalled","installExtension","clientName","status","target","message","updateVSCodeSettings","results","settingPath","codeSettingPath","setupClientSettings","push","success","path","error","Error","String","codeInsiderSettingPath","install","categoryName","recorder","getInstance","name","recording","async","stepName","STEP_CHECK_VSCODE_AND_INSTALL_EXTENSION","onResult","result","STEP_SETUP_INSTALLATION_CONFIG","STEP_UPDATE_VSCODE_SETTINGS","r","anySuccess","successPaths","filter","errors","STEP_INSTALLATION","endMessage","onError","errorMsg"],"sources":["../../../../src/core/installers/clients/BaseClientInstaller.ts"],"mappings":"OAASA,WAAc,kCACdC,SAAY,uBACZC,cAAiB,cACjBC,mBAAoBC,yBAA4B,mCAChDC,uBAA0B,iCAC1BC,sBAAyB,sCAO9BC,kBACAC,2BACG,gDACEC,4BAA+B,qDAC5BC,uBAAwB,wCAEpC,MAAMC,UAAYT,UAAUD,aAKtB,MAAgBW,oBAKR,mBAAAC,GACN,MAAO,WAAWC,KAAKC,SAASC,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAG,IACzE,CAMU,wBAAMC,CACZC,EACAC,GAEA,MAAMC,EAAmB,IAAKF,EAAaG,cAC3CD,EAAYE,KAAOJ,EAAaI,KAG5BH,EAAQI,MAAQJ,EAAQI,KAAKC,OAAS,IACtC3B,OAAO4B,MAAM,yCAAyCN,EAAQI,KAAKG,KAAK,QACxEN,EAAYG,KAAOJ,EAAQI,MAI/B,MAAMI,EAAUP,EAAYQ,KAAO,GAC7BC,EAAqC,GAC3C,IAAK,MAAOC,EAAKC,KAAWC,OAAOC,QAAQN,GAAU,CACjD,MAAMO,EAAYH,EACdG,EAAUC,UACVN,EAAWC,GAAOI,EAAUC,QAEpC,CAOA,OANAf,EAAYQ,IAAM,IAAKC,KAAgBV,EAAQS,KAAO,UAGhDQ,KAAKC,qBAAqBjB,EAAaD,GAE7CtB,OAAO4B,MAAM,8BAA8Ba,KAAKC,UAAUnB,MACnDA,CACX,CASQ,0BAAMiB,CACVjB,EACAD,GAEA,IAAK,MAAMqB,KAASR,OAAOS,OAAOrC,mBAAoB,CAClD,MAAMsC,EAAgBtB,EAAYG,MAAMoB,MAAMC,GAA+B,iBAARA,GAAoBA,EAAIC,SAASL,KAChGM,EAAed,OAAOS,OAAOrB,EAAYQ,KAAO,IAAIe,MAAKI,GAA0B,iBAAVA,GAAsBA,EAAMF,SAASL,KAEpH,IAAKE,IAAkBI,EAAc,CACjCjD,OAAO4B,MAAM,SAASe,oDACtB,QACJ,CAEA,MAAMQ,EAAW3C,uBAAuBmC,GACxC,GAAIQ,EAAU,CACV,MAAMC,QAAsBD,EAAS5B,EAAaD,GAClD,QAAsB+B,IAAlBD,EAA6B,CAE7B,GAAI7B,EAAYG,KAAM,CAClB,MAAM4B,EAAqB/B,EAAYG,KAAKG,KAAK,KACjDN,EAAYG,KAAOH,EAAYG,KAAK6B,KAAKR,GACtB,iBAARA,GAAoBA,EAAIC,SAASL,GAClCI,EAAIS,QAAQ,IAAIC,OAAOd,EAAMa,QAAQ,SAAU,QAAS,KAAMJ,GAC9DL,IAENxB,EAAYG,KAAKG,KAAK,OAASyB,GAC/BtD,OAAO4B,MAAM,cAAce,OAAWS,oBAAgC7B,EAAYG,KAAKG,KAAK,OAEpG,CAEA,GAAIN,EAAYQ,IAAK,CACjB,MAAM2B,EAAkBjB,KAAKC,UAAUnB,EAAYQ,KACnD,IAAK,MAAME,KAAOV,EAAYQ,IACU,iBAAzBR,EAAYQ,IAAIE,IAAsBV,EAAYQ,IAAIE,GAAgBe,SAASL,KACtFpB,EAAYQ,IAAIE,GAAQV,EAAYQ,IAAIE,GAAgBuB,QAAQ,IAAIC,OAAOd,EAAMa,QAAQ,SAAU,QAAS,KAAMJ,IAGtHX,KAAKC,UAAUnB,EAAYQ,OAAS2B,GACpC1D,OAAO4B,MAAM,aAAae,OAAWS,oBAAgCX,KAAKC,UAAUnB,EAAYQ,OAExG,CACJ,MACI/B,OAAO4B,MAAM,sCAAsCe,8BAE3D,CACJ,CACJ,CAKU,sBAAMgB,CAAiBzB,GAC7B,GAAyB,UAArB0B,QAAQC,UAA2C,QAAnB3B,EAAO4B,QAAmB,CAC1D,MAAMC,QAAgB3D,uBACtB,MAAO,IACA8B,EACH4B,QAAS,MACTpC,KAAM,CAAC,KAAM,SAAUQ,EAAOR,MAC9BK,IAAK,IACEG,EAAOH,IACViC,QAAWD,GAGvB,CACA,OAAO7B,CACX,CAMU,kBAAA+B,CAAmBC,GACpBA,EAASC,aACVD,EAASC,WAAa,GAE9B,CAMU,qBAAMC,CAAgBF,EAAeG,EAAoB9C,GAE3DA,EAAYG,OACZH,EAAYG,KAAOH,EAAYG,KAAK6B,KAAKR,GACtB,iBAARA,EAAmBA,EAAIS,QAAQ,MAAO,KAAOT,KAG5DmB,EAASC,WAAWE,GAAc,CAC9BP,QAASvC,EAAYuC,QACrBpC,KAAMH,EAAYG,KAClBK,IAAKR,EAAYQ,IACjBuC,YAAa,GACbC,UAAU,EACVC,YAAa,GAErB,CAMU,aAAAC,CAAcP,EAAeG,EAAoBK,GACvDR,EAASC,WAAWE,GAAc,CAC9BM,KAAM,MACNC,IAAKF,EAAcE,IAE3B,CAOU,oCAAMC,CAA+BC,GAE3C,MAAMC,QAA0B5E,mBAAmB,QAC7C6E,QAAkC7E,mBAAmB,iBAE3D,OAAK4E,GAAsBC,QAWG3E,mBAAmB4E,iBAAiB1C,KAAK2C,iBACvE,GACIlF,OAAO4B,MAAM,qBAAqBW,KAAK2C,wBAChC,CACHC,OAAQ,SACRR,KAAM,UACNS,OAAQ,SACRC,QAAS,qBAAqB9C,KAAK2C,uBACnCJ,gBAlBG,CACHK,OAAQ,SACRR,KAAM,UACNS,OAAQ,SACRC,QAAS,kMACTP,cAiBZ,CAQU,0BAAMQ,CAAqBjB,EAAoBK,GACrD,MAAMa,EAAqE,GACrER,QAA0B5E,mBAAmB,QAC7C6E,QAAkC7E,mBAAmB,iBAG3D,GAAI4E,EACA,IACI,MAAMS,EAAclF,kBAAkBiC,KAAK2C,YAAYO,sBACjDlD,KAAKmD,oBAAoBF,EAAanB,EAAYK,GACxDa,EAAQI,KAAK,CAAEC,SAAS,EAAMC,KAAML,GACxC,CAAE,MAAOM,GACLP,EAAQI,KAAK,CACTC,SAAS,EACTC,KAAMvF,kBAAkBiC,KAAK2C,YAAYO,gBACzCK,MAAOA,aAAiBC,MAAQD,EAAMT,QAAUW,OAAOF,IAE/D,CAIJ,GAAId,EACA,IACI,MAAMQ,EAAclF,kBAAkBiC,KAAK2C,YAAYe,6BACjD1D,KAAKmD,oBAAoBF,EAAanB,EAAYK,GACxDa,EAAQI,KAAK,CAAEC,SAAS,EAAMC,KAAML,GACxC,CAAE,MAAOM,GACLP,EAAQI,KAAK,CACTC,SAAS,EACTC,KAAMvF,kBAAkBiC,KAAK2C,YAAYe,uBACzCH,MAAOA,aAAiBC,MAAQD,EAAMT,QAAUW,OAAOF,IAE/D,CAGJ,OAAOP,CACX,CAOA,aAAMW,CAAQ7E,EAAyBC,EAA+B6E,GAClE,MAAMrB,EAAcvC,KAAK1B,sBAEnBuF,EAAW3F,wBAAwB4F,YAAYF,GAAgB9E,EAAaiF,KAAMjF,EAAaiF,MACrG,aAAaF,EAASG,WAClBC,gBACUJ,EAASG,WACX,IAAMhE,KAAKsC,+BAA+BC,IAAc,CACxD2B,SAAU/F,mBAAmBgG,wCAC7BC,SAAWC,GAA8B,WAAnBA,GAAQzB,SAIlC,MAAMT,QAAsB0B,EAASG,WACjC,IAAMhE,KAAKnB,mBAAmBC,EAAcC,IAAU,CACtDmF,SAAU/F,mBAAmBmG,iCAG7BxF,EAAaI,OACbiD,EAAcjD,KAAOJ,EAAaI,MAGtC,MAAM8D,QAAgBa,EAASG,WAC3B,IAAMhE,KAAK+C,qBAAqBjE,EAAaiF,KAAM5B,IAAgB,CACnE+B,SAAU/F,mBAAmBoG,4BAC7BH,SAAWC,GAAWA,GAAQ9D,MAAKiE,GAAKA,EAAEnB,YAKxCoB,EAAazB,EAAQzC,MAAKiE,GAAKA,EAAEnB,UACjCqB,EAAe1B,EAAQ2B,QAAOH,GAAKA,EAAEnB,UAASrC,KAAIwD,GAAKA,EAAElB,OACzDsB,EAAS5B,EAAQ2B,QAAOH,IAAMA,EAAEnB,UAASrC,KAAIwD,GAAKA,EAAEjB,QAM1D,MAAO,CACHX,OAAQ6B,EAAa,YAAc,SACnCrC,KAAM,UACNS,OAAQ,SACRC,QARiB2B,EACf,0BAA0BzE,KAAK2C,2CAA2C+B,EAAapF,KAAK,QAC5F,qBAAqBU,KAAK2C,8BAA8BiC,EAAOtF,KAAK,QAOtEiD,cACAgB,MAAOkB,OAAa3D,EAAY8D,EAAOtF,KAAK,MAC/C,GAEL,CACI4E,SAAU/F,mBAAmB0G,kBAC7BT,SAAWC,GAA8B,WAAnBA,GAAQzB,OAC9BkC,WAAaT,GAAYA,GAA4BvB,QACrDiC,QAAUxB,IACN,MAAMyB,EAAW,+BAA+BhF,KAAK2C,sBAAsBY,aAAiBC,MAAQD,EAAMT,QAAUW,OAAOF,KAC3H,MAAO,CACHc,OAAQ,CACJzB,OAAQ,SACRR,KAAM,UACNS,OAAQ,SACRC,QAASkC,EACTzC,cACAgB,MAAOA,aAAiBC,MAAQD,EAAMT,QAAUW,OAAOF,IACxDT,QAASkC,EACf,GAKjB","ignoreList":[]}
|
|
@@ -1,164 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Logger } from '../../../utils/logger.js';
|
|
3
|
-
import { ClientInstallerFactory } from './ClientInstallerFactory.js';
|
|
4
|
-
import { InstallOperationManager } from '../../loaders/InstallOperationManager.js';
|
|
5
|
-
/**
|
|
6
|
-
* Main client installer class that orchestrates client installation process
|
|
7
|
-
* Handles requirements checking and delegates to specific client installers
|
|
8
|
-
*/
|
|
9
|
-
export class ClientInstaller {
|
|
10
|
-
categoryName;
|
|
11
|
-
serverName;
|
|
12
|
-
clients;
|
|
13
|
-
configProvider;
|
|
14
|
-
constructor(categoryName, serverName, clients) {
|
|
15
|
-
this.categoryName = categoryName;
|
|
16
|
-
this.serverName = serverName;
|
|
17
|
-
this.clients = clients;
|
|
18
|
-
this.configProvider = ConfigurationProvider.getInstance();
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Install all specified clients
|
|
22
|
-
*/
|
|
23
|
-
async install(options) {
|
|
24
|
-
const initialStatuses = [];
|
|
25
|
-
// Start installation for each client asynchronously
|
|
26
|
-
const installPromises = this.clients.map(async (clientName) => {
|
|
27
|
-
const status = await this.installClient(clientName, options);
|
|
28
|
-
initialStatuses.push(status);
|
|
29
|
-
return status;
|
|
30
|
-
});
|
|
31
|
-
// Wait for all installations to complete
|
|
32
|
-
await Promise.all(installPromises);
|
|
33
|
-
// Return result
|
|
34
|
-
return {
|
|
35
|
-
success: true,
|
|
36
|
-
message: 'Client installations completed',
|
|
37
|
-
status: initialStatuses
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Install client with requirements checking
|
|
42
|
-
*/
|
|
43
|
-
async installClient(clientName, options) {
|
|
44
|
-
const operationId = this.generateOperationId();
|
|
45
|
-
// Check if client is supported
|
|
46
|
-
if (!ClientInstallerFactory.isClientSupported(clientName)) {
|
|
47
|
-
return {
|
|
48
|
-
status: 'failed',
|
|
49
|
-
type: 'install',
|
|
50
|
-
target: 'server',
|
|
51
|
-
message: `Unsupported client: ${clientName}`,
|
|
52
|
-
operationId
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
// Create initial operation status
|
|
56
|
-
const initialStatus = {
|
|
57
|
-
status: 'pending',
|
|
58
|
-
type: 'install',
|
|
59
|
-
target: 'server',
|
|
60
|
-
message: `Initializing installation for client: ${clientName}`,
|
|
61
|
-
operationId
|
|
62
|
-
};
|
|
63
|
-
// Async installation process
|
|
64
|
-
this.processInstallation(clientName, operationId, options)
|
|
65
|
-
.then((status) => {
|
|
66
|
-
if (status.status === 'completed' || status.status === 'failed') {
|
|
67
|
-
InstallOperationManager
|
|
68
|
-
.getInstance(this.categoryName, this.serverName)
|
|
69
|
-
.markOverallStatus(status.status);
|
|
70
|
-
}
|
|
71
|
-
this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, status);
|
|
72
|
-
})
|
|
73
|
-
.catch((error) => {
|
|
74
|
-
this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, {
|
|
75
|
-
status: 'failed',
|
|
76
|
-
type: 'install',
|
|
77
|
-
target: 'server',
|
|
78
|
-
message: `Error installing client ${clientName}: ${error instanceof Error ? error.message : String(error)}`,
|
|
79
|
-
operationId,
|
|
80
|
-
error: error instanceof Error ? error.message : String(error)
|
|
81
|
-
});
|
|
82
|
-
Logger.error(`Error installing client ${clientName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
83
|
-
InstallOperationManager
|
|
84
|
-
.getInstance(this.categoryName, this.serverName)
|
|
85
|
-
.markOverallStatus('failed', error);
|
|
86
|
-
});
|
|
87
|
-
// Update server status with initial client installation status
|
|
88
|
-
await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, initialStatus);
|
|
89
|
-
return initialStatus;
|
|
90
|
-
}
|
|
91
|
-
async processInstallation(clientName, operationId, options) {
|
|
92
|
-
const requirementsReady = await this.checkRequirements(operationId, clientName, options);
|
|
93
|
-
if (!requirementsReady) {
|
|
94
|
-
const failedStatus = {
|
|
95
|
-
status: 'failed',
|
|
96
|
-
type: 'install',
|
|
97
|
-
target: 'server',
|
|
98
|
-
message: `Requirements not ready for client: ${clientName} after timeout`,
|
|
99
|
-
operationId
|
|
100
|
-
};
|
|
101
|
-
return failedStatus;
|
|
102
|
-
}
|
|
103
|
-
// Create client-specific installer
|
|
104
|
-
const installer = ClientInstallerFactory.getInstaller(clientName);
|
|
105
|
-
if (!installer) {
|
|
106
|
-
throw new Error(`Failed to create installer for client: ${clientName}`);
|
|
107
|
-
}
|
|
108
|
-
const serverConfig = await this.configProvider.getServerMcpConfig(this.categoryName, this.serverName);
|
|
109
|
-
if (!serverConfig) {
|
|
110
|
-
throw new Error(`Server configuration not found for category: ${this.categoryName}, server: ${this.serverName}`);
|
|
111
|
-
}
|
|
112
|
-
// If we've reached here, requirements are ready - update status to in-progress
|
|
113
|
-
const inProgressStatus = {
|
|
114
|
-
status: 'in-progress',
|
|
115
|
-
type: 'install',
|
|
116
|
-
target: 'server',
|
|
117
|
-
message: `Installing client: ${clientName}`,
|
|
118
|
-
operationId: operationId
|
|
119
|
-
};
|
|
120
|
-
await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, inProgressStatus);
|
|
121
|
-
// Install client
|
|
122
|
-
return await installer.install(serverConfig, options, this.categoryName);
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Generate a unique operation ID for tracking installations
|
|
126
|
-
*/
|
|
127
|
-
generateOperationId() {
|
|
128
|
-
return `install-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Check if server requirements are ready
|
|
132
|
-
* Waits for requirements to be ready with timeout
|
|
133
|
-
*/
|
|
134
|
-
async checkRequirements(operationId, clientName, options) {
|
|
135
|
-
let requirementsReady = await this.configProvider.isRequirementsReady(this.categoryName, this.serverName);
|
|
136
|
-
if (!requirementsReady) {
|
|
137
|
-
const pendingStatus = {
|
|
138
|
-
status: 'pending',
|
|
139
|
-
type: 'install',
|
|
140
|
-
target: 'server',
|
|
141
|
-
message: `Waiting for requirements to be ready for client: ${clientName}`,
|
|
142
|
-
operationId
|
|
143
|
-
};
|
|
144
|
-
await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, pendingStatus);
|
|
145
|
-
// Set up periodic checking with timeout
|
|
146
|
-
const startTime = Date.now();
|
|
147
|
-
const timeoutMs = 5 * 60 * 1000; // 5 minutes
|
|
148
|
-
const intervalMs = 5 * 1000; // 5 seconds
|
|
149
|
-
while (!requirementsReady && (Date.now() - startTime) < timeoutMs) {
|
|
150
|
-
await new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
151
|
-
requirementsReady = await this.configProvider.isRequirementsReady(this.categoryName, this.serverName);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
var requirementsStatus = await this.configProvider.GetServerRequirementStatus(this.categoryName, this.serverName);
|
|
155
|
-
// Find first non-empty npmPath from requirements status
|
|
156
|
-
const npmPathRequirement = requirementsStatus.find(status => status.npmPath && status.npmPath.length > 0);
|
|
157
|
-
if (npmPathRequirement && npmPathRequirement.npmPath) {
|
|
158
|
-
options.settings = options.settings || {};
|
|
159
|
-
options.settings.npmPath = npmPathRequirement.npmPath;
|
|
160
|
-
}
|
|
161
|
-
return requirementsReady;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
1
|
+
import{ConfigurationProvider}from"../../loaders/ConfigurationProvider.js";import{Logger}from"../../../utils/logger.js";import{ClientInstallerFactory}from"./ClientInstallerFactory.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";export class ClientInstaller{categoryName;serverName;clients;configProvider;constructor(e,t,r){this.categoryName=e,this.serverName=t,this.clients=r,this.configProvider=ConfigurationProvider.getInstance()}async install(e){const t=[],r=this.clients.map((async r=>{const a=await this.installClient(r,e);return t.push(a),a}));return await Promise.all(r),{success:!0,message:"Client installations completed",status:t}}async installClient(e,t){const r=this.generateOperationId();if(!ClientInstallerFactory.isClientSupported(e))return{status:"failed",type:"install",target:"server",message:`Unsupported client: ${e}`,operationId:r};const a={status:"pending",type:"install",target:"server",message:`Initializing installation for client: ${e}`,operationId:r};return this.processInstallation(e,r,t).then((t=>{"completed"!==t.status&&"failed"!==t.status||InstallOperationManager.getInstance(this.categoryName,this.serverName).markOverallStatus(t.status),this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,t)})).catch((t=>{this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,{status:"failed",type:"install",target:"server",message:`Error installing client ${e}: ${t instanceof Error?t.message:String(t)}`,operationId:r,error:t instanceof Error?t.message:String(t)}),Logger.error(`Error installing client ${e}: ${t instanceof Error?t.message:String(t)}`),InstallOperationManager.getInstance(this.categoryName,this.serverName).markOverallStatus("failed",t)})),await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,a),a}async processInstallation(e,t,r){if(!await this.checkRequirements(t,e,r))return{status:"failed",type:"install",target:"server",message:`Requirements not ready for client: ${e} after timeout`,operationId:t};const a=ClientInstallerFactory.getInstaller(e);if(!a)throw new Error(`Failed to create installer for client: ${e}`);const s=await this.configProvider.getServerMcpConfig(this.categoryName,this.serverName);if(!s)throw new Error(`Server configuration not found for category: ${this.categoryName}, server: ${this.serverName}`);const i={status:"in-progress",type:"install",target:"server",message:`Installing client: ${e}`,operationId:t};return await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,i),await a.install(s,r,this.categoryName)}generateOperationId(){return`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}async checkRequirements(e,t,r){let a=await this.configProvider.isRequirementsReady(this.categoryName,this.serverName);if(!a){const r={status:"pending",type:"install",target:"server",message:`Waiting for requirements to be ready for client: ${t}`,operationId:e};await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,t,r);const s=Date.now(),i=3e5,n=5e3;for(;!a&&Date.now()-s<i;)await new Promise((e=>setTimeout(e,n))),a=await this.configProvider.isRequirementsReady(this.categoryName,this.serverName)}const s=(await this.configProvider.GetServerRequirementStatus(this.categoryName,this.serverName)).find((e=>e.npmPath&&e.npmPath.length>0));return s&&s.npmPath&&(r.settings=r.settings||{},r.settings.npmPath=s.npmPath),a}}
|
|
164
2
|
//# sourceMappingURL=ClientInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ConfigurationProvider","Logger","ClientInstallerFactory","InstallOperationManager","ClientInstaller","categoryName","serverName","clients","configProvider","constructor","this","getInstance","install","options","initialStatuses","installPromises","map","async","clientName","status","installClient","push","Promise","all","success","message","operationId","generateOperationId","isClientSupported","type","target","initialStatus","processInstallation","then","markOverallStatus","updateServerOperationStatus","catch","error","Error","String","checkRequirements","installer","getInstaller","serverConfig","getServerMcpConfig","inProgressStatus","Date","now","Math","random","toString","substr","requirementsReady","isRequirementsReady","pendingStatus","startTime","timeoutMs","intervalMs","resolve","setTimeout","npmPathRequirement","GetServerRequirementStatus","find","npmPath","length","settings"],"sources":["../../../../src/core/installers/clients/ClientInstaller.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,37 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ClineInstaller } from './ClineInstaller.js';
|
|
3
|
-
import { GithubCopilotInstaller } from './GithubCopilotInstaller.js';
|
|
4
|
-
import { SUPPORTED_CLIENTS } from '../../metadatas/constants.js';
|
|
5
|
-
/**
|
|
6
|
-
* Factory for creating client-specific installers
|
|
7
|
-
* Handles creation of appropriate installer based on client type
|
|
8
|
-
*/
|
|
9
|
-
export class ClientInstallerFactory {
|
|
10
|
-
static installerMap = {
|
|
11
|
-
[Object.keys(SUPPORTED_CLIENTS)[0]]: MSRooCodeInstaller,
|
|
12
|
-
[Object.keys(SUPPORTED_CLIENTS)[1]]: ClineInstaller,
|
|
13
|
-
[Object.keys(SUPPORTED_CLIENTS)[2]]: GithubCopilotInstaller
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Get a client installer instance based on client type
|
|
17
|
-
* @param clientName Name of the client to get installer for
|
|
18
|
-
* @returns Client-specific installer instance or undefined if client not supported
|
|
19
|
-
*/
|
|
20
|
-
static getInstaller(clientName) {
|
|
21
|
-
// Check if client is supported
|
|
22
|
-
if (!SUPPORTED_CLIENTS[clientName]) {
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
const InstallerClass = this.installerMap[clientName];
|
|
26
|
-
return InstallerClass ? new InstallerClass() : undefined;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Check if a client is supported
|
|
30
|
-
* @param clientName Name of the client to check
|
|
31
|
-
* @returns True if client is supported, false otherwise
|
|
32
|
-
*/
|
|
33
|
-
static isClientSupported(clientName) {
|
|
34
|
-
return !!SUPPORTED_CLIENTS[clientName];
|
|
35
|
-
}
|
|
36
|
-
}
|
|
1
|
+
import{MSRooCodeInstaller}from"./MSRooCodeInstaller.js";import{ClineInstaller}from"./ClineInstaller.js";import{GithubCopilotInstaller}from"./GithubCopilotInstaller.js";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";export class ClientInstallerFactory{static installerMap={[Object.keys(SUPPORTED_CLIENTS)[0]]:MSRooCodeInstaller,[Object.keys(SUPPORTED_CLIENTS)[1]]:ClineInstaller,[Object.keys(SUPPORTED_CLIENTS)[2]]:GithubCopilotInstaller};static getInstaller(t){if(!SUPPORTED_CLIENTS[t])return;const e=this.installerMap[t];return e?new e:void 0}static isClientSupported(t){return!!SUPPORTED_CLIENTS[t]}}
|
|
37
2
|
//# sourceMappingURL=ClientInstallerFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MSRooCodeInstaller","ClineInstaller","GithubCopilotInstaller","SUPPORTED_CLIENTS","ClientInstallerFactory","static","Object","keys","getInstaller","clientName","InstallerClass","this","installerMap","undefined","isClientSupported"],"sources":["../../../../src/core/installers/clients/ClientInstallerFactory.ts"],"mappings":"OAASA,uBAA0B,iCAC1BC,mBAAsB,6BACtBC,2BAA8B,qCAE9BC,sBAAyB,sCAM5B,MAAOC,uBACDC,oBAA8E,CAClF,CAACC,OAAOC,KAAKJ,mBAAmB,IAAKH,mBACrC,CAACM,OAAOC,KAAKJ,mBAAmB,IAAKF,eACrC,CAACK,OAAOC,KAAKJ,mBAAmB,IAAKD,wBAQzC,mBAAOM,CACHC,GAGA,IAAKN,kBAAkBM,GACnB,OAGJ,MAAMC,EAAiBC,KAAKC,aAAaH,GACzC,OAAOC,EAAiB,IAAIA,OAAmBG,CACnD,CAOA,wBAAOC,CAAkBL,GACrB,QAASN,kBAAkBM,EAC/B","ignoreList":[]}
|
|
@@ -1,31 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { readJsonFile, writeJsonFile } from '../../../utils/clientUtils.js';
|
|
3
|
-
/**
|
|
4
|
-
* Cline client installer implementation
|
|
5
|
-
* Handles installation of Cline client including extension installation and settings configuration
|
|
6
|
-
*/
|
|
7
|
-
export class ClineInstaller extends BaseClientInstaller {
|
|
8
|
-
clientName = 'Cline';
|
|
9
|
-
/**
|
|
10
|
-
* Set up Cline client settings
|
|
11
|
-
* Updates VS Code settings with MCP server configuration
|
|
12
|
-
*/
|
|
13
|
-
async setupClientSettings(settingPath, serverName, installConfig) {
|
|
14
|
-
// Read existing settings
|
|
15
|
-
const settings = await readJsonFile(settingPath, true);
|
|
16
|
-
// Initialize settings with client-specific structure
|
|
17
|
-
this.initializeSettings(settings);
|
|
18
|
-
// Handle different modes
|
|
19
|
-
if (installConfig.mode === 'stdio') {
|
|
20
|
-
// Process config for Windows NPX if needed
|
|
21
|
-
const finalConfig = await this.handleWindowsNpx(installConfig);
|
|
22
|
-
await this.handleStdioMode(settings, serverName, finalConfig);
|
|
23
|
-
}
|
|
24
|
-
else if (installConfig.mode === 'sse') {
|
|
25
|
-
this.handleSseMode(settings, serverName, installConfig);
|
|
26
|
-
}
|
|
27
|
-
// Write updated settings
|
|
28
|
-
await writeJsonFile(settingPath, settings);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
1
|
+
import{BaseClientInstaller}from"./BaseClientInstaller.js";import{readJsonFile,writeJsonFile}from"../../../utils/clientUtils.js";export class ClineInstaller extends BaseClientInstaller{clientName="Cline";async setupClientSettings(e,i,t){const s=await readJsonFile(e,!0);if(this.initializeSettings(s),"stdio"===t.mode){const e=await this.handleWindowsNpx(t);await this.handleStdioMode(s,i,e)}else"sse"===t.mode&&this.handleSseMode(s,i,t);await writeJsonFile(e,s)}}
|
|
31
2
|
//# sourceMappingURL=ClineInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BaseClientInstaller","readJsonFile","writeJsonFile","ClineInstaller","clientName","setupClientSettings","settingPath","serverName","installConfig","settings","this","initializeSettings","mode","finalConfig","handleWindowsNpx","handleStdioMode","handleSseMode"],"sources":["../../../../src/core/installers/clients/ClineInstaller.ts"],"mappings":"OAASA,wBAA2B,kCAC3BC,aAAcC,kBAAqB,uCAMtC,MAAOC,uBAAuBH,oBACbI,WAAqB,QAMxC,yBAAMC,CAAoBC,EAAqBC,EAAoBC,GAE/D,MAAMC,QAAiBR,aAAaK,GAAa,GAMjD,GAHAI,KAAKC,mBAAmBF,GAGG,UAAvBD,EAAcI,KAAkB,CAEhC,MAAMC,QAAoBH,KAAKI,iBAAiBN,SAE1CE,KAAKK,gBAAgBN,EAAUF,EAAYM,EACrD,KAAkC,QAAvBL,EAAcI,MACrBF,KAAKM,cAAcP,EAAUF,EAAYC,SAIvCN,cAAcI,EAAaG,EACrC","ignoreList":[]}
|