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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["StdioServerValidator","SSEServerValidator","Logger","ServerValidatorFactory","static","Map","constructor","validators","size","debug","set","getValidator","mode","validator","get","error","Error","getValidatorForServer","serverConfig","this","serverValidatorFactory"],"sources":["../../../src/core/validators/ServerValidatorFactory.ts"],"mappings":"OAESA,yBAA4B,mCAC5BC,uBAA0B,iCAC1BC,WAAc,+BAMjB,MAAOC,uBACHC,kBAAoB,IAAIC,IAEhC,WAAAC,GAEiD,IAA3CH,uBAAuBI,WAAWC,OACpCN,OAAOO,MAAM,kCACbN,uBAAuBI,WAAWG,IAAI,QAAS,IAAIV,sBACnDG,uBAAuBI,WAAWG,IAAI,MAAO,IAAIT,oBAErD,CAQO,YAAAU,CAAaC,GAClB,MAAMC,EAAYV,uBAAuBI,WAAWO,IAAIF,GACxD,IAAKC,EAAW,CACd,MAAME,EAAQ,gCAAgCH,IAE9C,MADAV,OAAOa,MAAMA,GACP,IAAIC,MAAMD,EAClB,CAEA,OADAb,OAAOO,MAAM,aAAaG,eACnBC,CACT,CAOO,qBAAAI,CAAsBC,GAC3B,OAAOC,KAAKR,aAAaO,EAAaN,KACxC,SAIK,MAAMQ,uBAAyB,IAAIjB","ignoreList":[]}
|
|
@@ -1,282 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { createInstallerFactory } from "../installers/index.js";
|
|
3
|
-
import { exec, spawn } from 'child_process';
|
|
4
|
-
import util from 'util';
|
|
5
|
-
import { MACRO_EXPRESSIONS, resolveNpmModulePath } from "../../utils/macroExpressionUtils.js";
|
|
6
|
-
import { getSystemPythonPackageDirectory } from "../../utils/osUtils.js";
|
|
7
|
-
import { SETTINGS_DIR } from "../metadatas/constants.js";
|
|
8
|
-
import path from "path";
|
|
9
|
-
import { InstallOperationManager } from "../loaders/InstallOperationManager.js";
|
|
10
|
-
const execPromise = util.promisify(exec);
|
|
11
|
-
/**
|
|
12
|
-
* Validates MCP server configurations for stdio mode
|
|
13
|
-
*/
|
|
14
|
-
export class StdioServerValidator {
|
|
15
|
-
installerFactory = createInstallerFactory();
|
|
16
|
-
/**
|
|
17
|
-
* Tests if a command exists and is executable
|
|
18
|
-
* @param command The command to test
|
|
19
|
-
* @returns true if command exists and is executable
|
|
20
|
-
*/
|
|
21
|
-
async isCommandExecutable(command) {
|
|
22
|
-
try {
|
|
23
|
-
Logger.debug(`Testing if command is executable: ${command}`);
|
|
24
|
-
const testCmd = process.platform === 'win32' ?
|
|
25
|
-
`where ${command}` :
|
|
26
|
-
`command -v ${command}`;
|
|
27
|
-
await execPromise(testCmd);
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
Logger.debug(`Command not found: ${command}`);
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Generates a dedicated folder path for a requirement.
|
|
37
|
-
* @param requirement The requirement configuration.
|
|
38
|
-
* @returns The path to the requirement's dedicated folder.
|
|
39
|
-
* @private
|
|
40
|
-
*/
|
|
41
|
-
_getRequirementFolderPath(requirement) {
|
|
42
|
-
return path.join(SETTINGS_DIR, 'onboard', 'npm_requirements', requirement.name, requirement.version.includes('latest') ? 'latest' : requirement.version);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Validates and installs a requirement if needed
|
|
46
|
-
* @param requirement The requirement config to validate and install
|
|
47
|
-
* @returns true if requirement is successfully installed/validated
|
|
48
|
-
*/
|
|
49
|
-
async validateRequirement(requirement, recorder) {
|
|
50
|
-
try {
|
|
51
|
-
Logger.debug(`Validating/installing requirement: ${requirement.name}`);
|
|
52
|
-
const installer = this.installerFactory.getInstaller(requirement);
|
|
53
|
-
if (!installer) {
|
|
54
|
-
const msg = `No installer found for requirement type: ${requirement.type}`;
|
|
55
|
-
Logger.error(msg);
|
|
56
|
-
throw new Error(msg);
|
|
57
|
-
}
|
|
58
|
-
const targetDir = this._getRequirementFolderPath(requirement);
|
|
59
|
-
const status = await installer.install(requirement, recorder, { settings: { folderName: targetDir } });
|
|
60
|
-
if (!status.installed) {
|
|
61
|
-
const msg = `Failed to install requirement ${requirement.name}: ${status.error || 'Unknown error'}`;
|
|
62
|
-
Logger.error(msg);
|
|
63
|
-
throw new Error(msg);
|
|
64
|
-
}
|
|
65
|
-
Logger.debug(`Requirement ${requirement.name} is valid and installed`);
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
const errorMsg = `Error validating/installing requirement ${requirement.name}: ${error instanceof Error ? error.message : String(error)}`;
|
|
70
|
-
Logger.error(errorMsg);
|
|
71
|
-
throw error instanceof Error ? error : new Error(errorMsg);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Tests if a server can be started successfully with proper path resolution
|
|
76
|
-
* @param command The command to start the server
|
|
77
|
-
* @param args The command line arguments
|
|
78
|
-
* @returns Promise<boolean> true if server starts successfully, false otherwise
|
|
79
|
-
*
|
|
80
|
-
* Handles special cases:
|
|
81
|
-
* - For node commands: resolves ${NPMPATH} in arguments using resolveNpmModulePath
|
|
82
|
-
* - For python/python3 commands: resolves ${PYTHON_PACKAGE} in arguments using system Python packages
|
|
83
|
-
*/
|
|
84
|
-
async testServerStartup(command, args, requirement) {
|
|
85
|
-
try {
|
|
86
|
-
// Log initial command and args
|
|
87
|
-
Logger.debug(`Testing server startup with command: ${command}`);
|
|
88
|
-
Logger.debug(`Original arguments: ${args.join(' ')}`);
|
|
89
|
-
// Handle path resolution based on command type
|
|
90
|
-
let finalArgs = [...args];
|
|
91
|
-
if (command === 'node') {
|
|
92
|
-
// Resolve npm module paths in arguments
|
|
93
|
-
Logger.debug('Resolving npm module paths in arguments');
|
|
94
|
-
const npmPath = requirement ? this._getRequirementFolderPath(requirement) : undefined;
|
|
95
|
-
finalArgs = args.map(arg => arg
|
|
96
|
-
.replace(MACRO_EXPRESSIONS.NPMPATH, resolveNpmModulePath(npmPath))
|
|
97
|
-
.replace(/\\/g, '/'));
|
|
98
|
-
Logger.debug(`Resolved npm arguments: ${finalArgs.join(' ')}`);
|
|
99
|
-
}
|
|
100
|
-
else if (command === 'python' || command === 'python3') {
|
|
101
|
-
// Resolve Python package paths in arguments
|
|
102
|
-
Logger.debug('Resolving Python package paths in arguments');
|
|
103
|
-
const pythonDir = await getSystemPythonPackageDirectory();
|
|
104
|
-
if (pythonDir) {
|
|
105
|
-
finalArgs = args.map(arg => arg.includes('${PYTHON_PACKAGE}') ? arg.replace('${PYTHON_PACKAGE}', pythonDir) : arg);
|
|
106
|
-
Logger.debug(`Resolved Python arguments: ${finalArgs.join(' ')}`);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
const msg = 'Could not resolve system Python package directory';
|
|
110
|
-
Logger.error(msg);
|
|
111
|
-
throw new Error(msg);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return await new Promise((resolve, reject) => {
|
|
115
|
-
Logger.debug(`Starting process for server test with command: ${command} ${finalArgs.join(' ')}`);
|
|
116
|
-
const timeoutDuration = 20000; // 20 seconds for server startup test
|
|
117
|
-
const serverProcess = spawn(command, finalArgs, {
|
|
118
|
-
stdio: ['ignore', 'pipe', 'pipe'], // stdin, stdout, stderr
|
|
119
|
-
shell: true
|
|
120
|
-
});
|
|
121
|
-
let stdoutData = '';
|
|
122
|
-
let stderrData = '';
|
|
123
|
-
let settled = false;
|
|
124
|
-
const cleanupAndResolve = (value) => {
|
|
125
|
-
if (settled)
|
|
126
|
-
return;
|
|
127
|
-
settled = true;
|
|
128
|
-
clearTimeout(timeoutId);
|
|
129
|
-
serverProcess.stdout.removeAllListeners();
|
|
130
|
-
serverProcess.stderr.removeAllListeners();
|
|
131
|
-
serverProcess.removeAllListeners('exit');
|
|
132
|
-
serverProcess.removeAllListeners('error');
|
|
133
|
-
if (serverProcess.exitCode === null && !serverProcess.killed) {
|
|
134
|
-
serverProcess.kill();
|
|
135
|
-
}
|
|
136
|
-
resolve(value);
|
|
137
|
-
};
|
|
138
|
-
const cleanupAndReject = (err) => {
|
|
139
|
-
if (settled)
|
|
140
|
-
return;
|
|
141
|
-
settled = true;
|
|
142
|
-
clearTimeout(timeoutId);
|
|
143
|
-
serverProcess.stdout.removeAllListeners();
|
|
144
|
-
serverProcess.stderr.removeAllListeners();
|
|
145
|
-
serverProcess.removeAllListeners('exit');
|
|
146
|
-
serverProcess.removeAllListeners('error');
|
|
147
|
-
if (serverProcess.exitCode === null && !serverProcess.killed) {
|
|
148
|
-
serverProcess.kill();
|
|
149
|
-
}
|
|
150
|
-
reject(err);
|
|
151
|
-
};
|
|
152
|
-
const timeoutId = setTimeout(() => {
|
|
153
|
-
if (settled)
|
|
154
|
-
return;
|
|
155
|
-
if (serverProcess.exitCode === null) { // Process is still running
|
|
156
|
-
Logger.debug(`Server startup test: Process still running after ${timeoutDuration / 1000} seconds. Considering it successful.`);
|
|
157
|
-
Logger.debug(`Collected stdout:\n${stdoutData}`);
|
|
158
|
-
Logger.debug(`Collected stderr:\n${stderrData}`);
|
|
159
|
-
cleanupAndResolve(true);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
// Process exited before timeout, 'exit' handler should have caught it.
|
|
163
|
-
// This is a fallback or race condition handling.
|
|
164
|
-
const msg = `Server startup test: Process exited with code ${serverProcess.exitCode} before timeout completed.`;
|
|
165
|
-
Logger.error(msg);
|
|
166
|
-
Logger.debug(`Collected stdout:\n${stdoutData}`);
|
|
167
|
-
Logger.error(`Collected stderr:\n${stderrData}`); // Log stderr as error here
|
|
168
|
-
cleanupAndReject(new Error(msg + ` Stderr: ${stderrData}`));
|
|
169
|
-
}
|
|
170
|
-
}, timeoutDuration);
|
|
171
|
-
serverProcess.stdout.on('data', (data) => {
|
|
172
|
-
const messageChunk = data.toString();
|
|
173
|
-
stdoutData += messageChunk;
|
|
174
|
-
Logger.debug(`Server stdout: ${messageChunk.trim()}`);
|
|
175
|
-
});
|
|
176
|
-
serverProcess.stderr.on('data', (data) => {
|
|
177
|
-
const messageChunk = data.toString();
|
|
178
|
-
stderrData += messageChunk;
|
|
179
|
-
// Log stderr, but it doesn't automatically mean failure.
|
|
180
|
-
// The exit code or an 'error' event will determine failure.
|
|
181
|
-
Logger.debug(`Server stderr: ${messageChunk.trim()}`);
|
|
182
|
-
});
|
|
183
|
-
serverProcess.on('exit', (code, signal) => {
|
|
184
|
-
if (settled)
|
|
185
|
-
return;
|
|
186
|
-
Logger.debug(`Server process exited with code ${code}, signal: ${signal}.`);
|
|
187
|
-
Logger.debug(`Final stdout:\n${stdoutData}`);
|
|
188
|
-
Logger.debug(`Final stderr:\n${stderrData}`);
|
|
189
|
-
if (code === 0) {
|
|
190
|
-
cleanupAndResolve(true);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
const msg = `Server process exited with non-zero code ${code} or signal ${signal}. Stderr: ${stderrData.trim()}`;
|
|
194
|
-
Logger.error(msg);
|
|
195
|
-
cleanupAndReject(new Error(msg));
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
serverProcess.on('error', (error) => {
|
|
199
|
-
if (settled)
|
|
200
|
-
return;
|
|
201
|
-
const msg = `Server process failed to start or encountered an error: ${error.message}.`;
|
|
202
|
-
Logger.error(msg);
|
|
203
|
-
Logger.debug(`Stdout at error:\n${stdoutData}`);
|
|
204
|
-
Logger.error(`Stderr at error:\n${stderrData}`);
|
|
205
|
-
cleanupAndReject(new Error(`${msg} Stderr: ${stderrData.trim()}`));
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
const msg = `Failed to test server startup (outer catch): ${error instanceof Error ? error.message : String(error)}`;
|
|
211
|
-
Logger.error(msg);
|
|
212
|
-
// Ensure the error thrown is an instance of Error
|
|
213
|
-
throw error instanceof Error ? error : new Error(msg);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Validates stdio-specific MCP server configuration
|
|
218
|
-
* Checks command, arguments, dependencies and required environment variables
|
|
219
|
-
* @param server The MCP server configuration to validate
|
|
220
|
-
* @param config The feed configuration containing shared requirements
|
|
221
|
-
* @returns true if valid, throws error if invalid
|
|
222
|
-
*/
|
|
223
|
-
async validateServer(server, config) {
|
|
224
|
-
try {
|
|
225
|
-
Logger.debug(`Validating stdio server configuration: ${server.name}`);
|
|
226
|
-
// Check required installation command
|
|
227
|
-
if (!server.installation?.command) {
|
|
228
|
-
throw new Error('Server command is required in installation configuration');
|
|
229
|
-
}
|
|
230
|
-
// Validate server mode
|
|
231
|
-
if (server.mode !== 'stdio') {
|
|
232
|
-
throw new Error(`Invalid server mode for stdio validator: ${server.mode}`);
|
|
233
|
-
}
|
|
234
|
-
// Parse command and arguments
|
|
235
|
-
const fullCommand = server.installation.command;
|
|
236
|
-
const [baseCommand, ...defaultArgs] = fullCommand.split(' ');
|
|
237
|
-
const args = [...defaultArgs, ...(server.installation.args || [])];
|
|
238
|
-
// Validate required environment variables if specified
|
|
239
|
-
const envVars = server.installation.env;
|
|
240
|
-
if (envVars) {
|
|
241
|
-
for (const [name, varConfig] of Object.entries(envVars)) {
|
|
242
|
-
if (varConfig.Required && !varConfig.Default && !process.env[name]) {
|
|
243
|
-
throw new Error(`Required environment variable not set: ${name}`);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
// Validate dependencies if specified
|
|
248
|
-
if (server.dependencies?.requirements) {
|
|
249
|
-
Logger.debug(`Validating ${server.dependencies.requirements.length} requirements`);
|
|
250
|
-
for (const req of server.dependencies.requirements) {
|
|
251
|
-
const reqConfig = config.requirements?.find(r => r.name === req.name) || {
|
|
252
|
-
name: req.name,
|
|
253
|
-
version: req.version,
|
|
254
|
-
type: 'npm' // Default to npm if not specified
|
|
255
|
-
};
|
|
256
|
-
const isValid = await this.validateRequirement(reqConfig, InstallOperationManager.getInstance(config.name, server.name));
|
|
257
|
-
if (!isValid) {
|
|
258
|
-
throw new Error(`Dependency validation failed for: ${req.name}`);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
// Validate command exists and is executable
|
|
263
|
-
const isExecutable = await this.isCommandExecutable(baseCommand);
|
|
264
|
-
if (!isExecutable) {
|
|
265
|
-
throw new Error(`Command not found or not executable: ${baseCommand}`);
|
|
266
|
-
}
|
|
267
|
-
// Test server startup
|
|
268
|
-
const serverStarted = await this.testServerStartup(baseCommand, args, config.requirements?.find(r => r.type === 'npm'));
|
|
269
|
-
if (!serverStarted) {
|
|
270
|
-
throw new Error(`Failed to start server with command: ${fullCommand} ${args.join(' ')}`);
|
|
271
|
-
}
|
|
272
|
-
Logger.debug(`Stdio server validation successful: ${server.name}`);
|
|
273
|
-
return true;
|
|
274
|
-
}
|
|
275
|
-
catch (error) {
|
|
276
|
-
const errorMsg = `Server validation failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
277
|
-
Logger.error(errorMsg);
|
|
278
|
-
throw new Error(errorMsg);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
1
|
+
import{Logger}from"../../utils/logger.js";import{createInstallerFactory}from"../installers/index.js";import{exec,spawn}from"child_process";import util from"util";import{MACRO_EXPRESSIONS,resolveNpmModulePath}from"../../utils/macroExpressionUtils.js";import{getSystemPythonPackageDirectory}from"../../utils/osUtils.js";import{SETTINGS_DIR}from"../metadatas/constants.js";import path from"path";import{InstallOperationManager}from"../loaders/InstallOperationManager.js";const execPromise=util.promisify(exec);export class StdioServerValidator{installerFactory=createInstallerFactory();async isCommandExecutable(e){try{Logger.debug(`Testing if command is executable: ${e}`);const r="win32"===process.platform?`where ${e}`:`command -v ${e}`;return await execPromise(r),!0}catch(r){return Logger.debug(`Command not found: ${e}`),!1}}_getRequirementFolderPath(e){return path.join(SETTINGS_DIR,"onboard","npm_requirements",e.name,e.version.includes("latest")?"latest":e.version)}async validateRequirement(e,r){try{Logger.debug(`Validating/installing requirement: ${e.name}`);const t=this.installerFactory.getInstaller(e);if(!t){const r=`No installer found for requirement type: ${e.type}`;throw Logger.error(r),new Error(r)}const o=this._getRequirementFolderPath(e),n=await t.install(e,r,{settings:{folderName:o}});if(!n.installed){const r=`Failed to install requirement ${e.name}: ${n.error||"Unknown error"}`;throw Logger.error(r),new Error(r)}return Logger.debug(`Requirement ${e.name} is valid and installed`),!0}catch(r){const t=`Error validating/installing requirement ${e.name}: ${r instanceof Error?r.message:String(r)}`;throw Logger.error(t),r instanceof Error?r:new Error(t)}}async testServerStartup(e,r,t){try{Logger.debug(`Testing server startup with command: ${e}`),Logger.debug(`Original arguments: ${r.join(" ")}`);let o=[...r];if("node"===e){Logger.debug("Resolving npm module paths in arguments");const e=t?this._getRequirementFolderPath(t):void 0;o=r.map((r=>r.replace(MACRO_EXPRESSIONS.NPMPATH,resolveNpmModulePath(e)).replace(/\\/g,"/"))),Logger.debug(`Resolved npm arguments: ${o.join(" ")}`)}else if("python"===e||"python3"===e){Logger.debug("Resolving Python package paths in arguments");const e=await getSystemPythonPackageDirectory();if(!e){const e="Could not resolve system Python package directory";throw Logger.error(e),new Error(e)}o=r.map((r=>r.includes("${PYTHON_PACKAGE}")?r.replace("${PYTHON_PACKAGE}",e):r)),Logger.debug(`Resolved Python arguments: ${o.join(" ")}`)}return await new Promise(((r,t)=>{Logger.debug(`Starting process for server test with command: ${e} ${o.join(" ")}`);const n=spawn(e,o,{stdio:["ignore","pipe","pipe"],shell:!0});let i="",s="",a=!1;const l=e=>{a||(a=!0,clearTimeout(d),n.stdout.removeAllListeners(),n.stderr.removeAllListeners(),n.removeAllListeners("exit"),n.removeAllListeners("error"),null!==n.exitCode||n.killed||n.kill(),r(e))},g=e=>{a||(a=!0,clearTimeout(d),n.stdout.removeAllListeners(),n.stderr.removeAllListeners(),n.removeAllListeners("exit"),n.removeAllListeners("error"),null!==n.exitCode||n.killed||n.kill(),t(e))},d=setTimeout((()=>{if(!a)if(null===n.exitCode)Logger.debug("Server startup test: Process still running after 20 seconds. Considering it successful."),Logger.debug(`Collected stdout:\n${i}`),Logger.debug(`Collected stderr:\n${s}`),l(!0);else{const e=`Server startup test: Process exited with code ${n.exitCode} before timeout completed.`;Logger.error(e),Logger.debug(`Collected stdout:\n${i}`),Logger.error(`Collected stderr:\n${s}`),g(new Error(e+` Stderr: ${s}`))}}),2e4);n.stdout.on("data",(e=>{const r=e.toString();i+=r,Logger.debug(`Server stdout: ${r.trim()}`)})),n.stderr.on("data",(e=>{const r=e.toString();s+=r,Logger.debug(`Server stderr: ${r.trim()}`)})),n.on("exit",((e,r)=>{if(!a)if(Logger.debug(`Server process exited with code ${e}, signal: ${r}.`),Logger.debug(`Final stdout:\n${i}`),Logger.debug(`Final stderr:\n${s}`),0===e)l(!0);else{const t=`Server process exited with non-zero code ${e} or signal ${r}. Stderr: ${s.trim()}`;Logger.error(t),g(new Error(t))}})),n.on("error",(e=>{if(a)return;const r=`Server process failed to start or encountered an error: ${e.message}.`;Logger.error(r),Logger.debug(`Stdout at error:\n${i}`),Logger.error(`Stderr at error:\n${s}`),g(new Error(`${r} Stderr: ${s.trim()}`))}))}))}catch(e){const r=`Failed to test server startup (outer catch): ${e instanceof Error?e.message:String(e)}`;throw Logger.error(r),e instanceof Error?e:new Error(r)}}async validateServer(e,r){try{if(Logger.debug(`Validating stdio server configuration: ${e.name}`),!e.installation?.command)throw new Error("Server command is required in installation configuration");if("stdio"!==e.mode)throw new Error(`Invalid server mode for stdio validator: ${e.mode}`);const t=e.installation.command,[o,...n]=t.split(" "),i=[...n,...e.installation.args||[]],s=e.installation.env;if(s)for(const[e,r]of Object.entries(s))if(r.Required&&!r.Default&&!process.env[e])throw new Error(`Required environment variable not set: ${e}`);if(e.dependencies?.requirements){Logger.debug(`Validating ${e.dependencies.requirements.length} requirements`);for(const t of e.dependencies.requirements){const o=r.requirements?.find((e=>e.name===t.name))||{name:t.name,version:t.version,type:"npm"};if(!await this.validateRequirement(o,InstallOperationManager.getInstance(r.name,e.name)))throw new Error(`Dependency validation failed for: ${t.name}`)}}if(!await this.isCommandExecutable(o))throw new Error(`Command not found or not executable: ${o}`);if(!await this.testServerStartup(o,i,r.requirements?.find((e=>"npm"===e.type))))throw new Error(`Failed to start server with command: ${t} ${i.join(" ")}`);return Logger.debug(`Stdio server validation successful: ${e.name}`),!0}catch(e){const r=`Server validation failed: ${e instanceof Error?e.message:String(e)}`;throw Logger.error(r),new Error(r)}}}
|
|
282
2
|
//# sourceMappingURL=StdioServerValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Logger","createInstallerFactory","exec","spawn","util","MACRO_EXPRESSIONS","resolveNpmModulePath","getSystemPythonPackageDirectory","SETTINGS_DIR","path","InstallOperationManager","execPromise","promisify","StdioServerValidator","installerFactory","isCommandExecutable","command","debug","testCmd","process","platform","error","_getRequirementFolderPath","requirement","join","name","version","includes","validateRequirement","recorder","installer","this","getInstaller","msg","type","Error","targetDir","status","install","settings","folderName","installed","errorMsg","message","String","testServerStartup","args","finalArgs","npmPath","undefined","map","arg","replace","NPMPATH","pythonDir","Promise","resolve","reject","serverProcess","stdio","shell","stdoutData","stderrData","settled","cleanupAndResolve","value","clearTimeout","timeoutId","stdout","removeAllListeners","stderr","exitCode","killed","kill","cleanupAndReject","err","setTimeout","on","data","messageChunk","toString","trim","code","signal","validateServer","server","config","installation","mode","fullCommand","baseCommand","defaultArgs","split","envVars","env","varConfig","Object","entries","Required","Default","dependencies","requirements","length","req","reqConfig","find","r","getInstance"],"sources":["../../../src/core/validators/StdioServerValidator.ts"],"mappings":"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","ignoreList":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export { MCPEvent } from './core/metadatas/types.js';
|
|
3
|
-
// Core functionality
|
|
4
|
-
export { MCPManager, mcpManager } from './services/MCPManager.js';
|
|
5
|
-
// Services
|
|
6
|
-
export { ServerService, serverService } from './services/ServerService.js';
|
|
7
|
-
export { RequirementService, requirementService } from './services/RequirementService.js';
|
|
8
|
-
// Installer interfaces and implementations
|
|
9
|
-
export { BaseInstaller, NpmInstaller, PipInstaller, GeneralInstaller, InstallerFactory, createInstallerFactory } from './core/installers/index.js';
|
|
10
|
-
// Web server
|
|
11
|
-
export { startWebServer } from './web/server.js';
|
|
12
|
-
// Version information
|
|
13
|
-
export const VERSION = '0.0.1';
|
|
14
|
-
// Default configuration
|
|
15
|
-
export const DEFAULT_CONFIG = {
|
|
16
|
-
configPath: './config/servers.json',
|
|
17
|
-
webPort: 3000
|
|
18
|
-
};
|
|
1
|
+
export{MCPEvent}from"./core/metadatas/types.js";export{MCPManager,mcpManager}from"./services/MCPManager.js";export{ServerService,serverService}from"./services/ServerService.js";export{RequirementService,requirementService}from"./services/RequirementService.js";export{BaseInstaller,NpmInstaller,PipInstaller,GeneralInstaller,InstallerFactory,createInstallerFactory}from"./core/installers/index.js";export{startWebServer}from"./web/server.js";export const VERSION="0.0.1";export const DEFAULT_CONFIG={configPath:"./config/servers.json",webPort:3e3};
|
|
19
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MCPEvent","MCPManager","mcpManager","ServerService","serverService","RequirementService","requirementService","BaseInstaller","NpmInstaller","PipInstaller","GeneralInstaller","InstallerFactory","createInstallerFactory","startWebServer","VERSION","DEFAULT_CONFIG","configPath","webPort"],"sources":["../src/index.ts"],"mappings":"OAQEA,aAKK,mCAGEC,WAAYC,eAAkB,kCAG9BC,cAAeC,kBAAqB,qCACpCC,mBAAoBC,uBAA0B,0CAKrDC,cACAC,aACAC,aACAC,iBACAC,iBACAC,2BACK,oCAGEC,mBAAsB,yBAGxB,MAAMC,QAAU,eAGhB,MAAMC,eAAiB,CAC5BC,WAAY,wBACZC,QAAS","ignoreList":[]}
|
|
@@ -1,82 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ConfigurationProvider } from '../core/loaders/ConfigurationProvider.js';
|
|
3
|
-
import { Logger } from '../utils/logger.js';
|
|
4
|
-
import { requirementService } from './RequirementService.js';
|
|
5
|
-
import { InstallOperationManager } from '../core/loaders/InstallOperationManager.js';
|
|
6
|
-
import * as RecordingConstants from '../core/metadatas/recordingConstants.js';
|
|
7
|
-
/**
|
|
8
|
-
* Handles the actual installation process for an MCP server.
|
|
9
|
-
*/
|
|
10
|
-
export class InstallationService {
|
|
11
|
-
constructor() {
|
|
12
|
-
// Constructor is now empty after removing installerFactory initialization
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Installs a server based on the provided options.
|
|
16
|
-
* @param categoryName The category name of the server.
|
|
17
|
-
* @param serverName The name of the server to install.
|
|
18
|
-
* @param options The installation options.
|
|
19
|
-
* @returns A result object indicating success or failure.
|
|
20
|
-
*/
|
|
21
|
-
async install(categoryName, serverName, options) {
|
|
22
|
-
// Reset any previous operation status for this server before starting a new one.
|
|
23
|
-
const recoder = await InstallOperationManager.getInstance(categoryName, serverName).resetOperation();
|
|
24
|
-
const configProvider = ConfigurationProvider.getInstance();
|
|
25
|
-
const clients = options.targetClients || [];
|
|
26
|
-
// Process updates for requirements if specified in options
|
|
27
|
-
if (options.requirements && options.requirements.length > 0) {
|
|
28
|
-
recoder.recordingAsync(() => requirementService.processRequirementUpdates(categoryName, serverName, options), {
|
|
29
|
-
stepName: RecordingConstants.STEP_PROCESS_REQUIREMENT_UPDATES_SERVICE,
|
|
30
|
-
onError: (error) => {
|
|
31
|
-
const errorMsg = `Error in background requirement updates: ${error instanceof Error ? error.message : String(error)}`;
|
|
32
|
-
Logger.error(errorMsg);
|
|
33
|
-
return errorMsg;
|
|
34
|
-
},
|
|
35
|
-
onComplete: () => {
|
|
36
|
-
if (clients.length === 0)
|
|
37
|
-
recoder.markOverallStatus('completed', 'Requirement updates completed.');
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
if (!clients || clients.length === 0) {
|
|
42
|
-
const message = 'No clients specified for installation.';
|
|
43
|
-
return { success: true, message };
|
|
44
|
-
}
|
|
45
|
-
// Check if the server is already installed and ready
|
|
46
|
-
const readyMessage = 'Server and clients are already installed and ready';
|
|
47
|
-
const isReady = await recoder.recording(() => configProvider.isServerReady(categoryName, serverName, clients), {
|
|
48
|
-
stepName: RecordingConstants.STEP_CHECK_SERVER_READINESS,
|
|
49
|
-
inProgressMessage: 'Checking if server is already ready.',
|
|
50
|
-
endMessage: (ready) => ready ? 'Server and clients are already installed and ready' : 'Server is not ready. Proceeding with installation.',
|
|
51
|
-
});
|
|
52
|
-
if (isReady) {
|
|
53
|
-
return {
|
|
54
|
-
success: true, message: readyMessage,
|
|
55
|
-
status: [{
|
|
56
|
-
status: 'completed',
|
|
57
|
-
type: 'install',
|
|
58
|
-
target: 'server',
|
|
59
|
-
message: readyMessage,
|
|
60
|
-
}]
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// Create new ClientInstaller instance for handling installation
|
|
64
|
-
const clientInstaller = new ClientInstaller(categoryName, serverName, clients);
|
|
65
|
-
// Check and install requirements using RequirementService
|
|
66
|
-
const requirementsResult = await requirementService.checkAndInstallRequirements(categoryName, serverName, options);
|
|
67
|
-
// trigger a backend requirement check
|
|
68
|
-
await requirementService.checkServerRequirementForUpdateAsync(categoryName, serverName)
|
|
69
|
-
.then(() => {
|
|
70
|
-
Logger.info(`Requirement check for ${categoryName}:${serverName} completed successfully.`);
|
|
71
|
-
})
|
|
72
|
-
.catch((error) => {
|
|
73
|
-
Logger.error(`Requirement check for ${categoryName}:${serverName} failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
74
|
-
});
|
|
75
|
-
if (requirementsResult && !requirementsResult.success) {
|
|
76
|
-
await recoder.recordStep('RequirementInstallationCheck', 'failed', requirementsResult.error?.message || requirementsResult.message || 'Requirement installation failed.');
|
|
77
|
-
return requirementsResult;
|
|
78
|
-
}
|
|
79
|
-
return await clientInstaller.install(options);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
1
|
+
import{ClientInstaller}from"../core/installers/clients/ClientInstaller.js";import{ConfigurationProvider}from"../core/loaders/ConfigurationProvider.js";import{Logger}from"../utils/logger.js";import{requirementService}from"./RequirementService.js";import{InstallOperationManager}from"../core/loaders/InstallOperationManager.js";import*as RecordingConstants from"../core/metadatas/recordingConstants.js";export class InstallationService{constructor(){}async install(e,r,t){const n=await InstallOperationManager.getInstance(e,r).resetOperation(),s=ConfigurationProvider.getInstance(),a=t.targetClients||[];if(t.requirements&&t.requirements.length>0&&n.recordingAsync((()=>requirementService.processRequirementUpdates(e,r,t)),{stepName:RecordingConstants.STEP_PROCESS_REQUIREMENT_UPDATES_SERVICE,onError:e=>{const r=`Error in background requirement updates: ${e instanceof Error?e.message:String(e)}`;return Logger.error(r),r},onComplete:()=>{0===a.length&&n.markOverallStatus("completed","Requirement updates completed.")}}),!a||0===a.length)return{success:!0,message:"No clients specified for installation."};const i="Server and clients are already installed and ready";if(await n.recording((()=>s.isServerReady(e,r,a)),{stepName:RecordingConstants.STEP_CHECK_SERVER_READINESS,inProgressMessage:"Checking if server is already ready.",endMessage:e=>e?"Server and clients are already installed and ready":"Server is not ready. Proceeding with installation."}))return{success:!0,message:i,status:[{status:"completed",type:"install",target:"server",message:i}]};const o=new ClientInstaller(e,r,a),l=await requirementService.checkAndInstallRequirements(e,r,t);return await requirementService.checkServerRequirementForUpdateAsync(e,r).then((()=>{Logger.info(`Requirement check for ${e}:${r} completed successfully.`)})).catch((t=>{Logger.error(`Requirement check for ${e}:${r} failed: ${t instanceof Error?t.message:String(t)}`)})),l&&!l.success?(await n.recordStep("RequirementInstallationCheck","failed",l.error?.message||l.message||"Requirement installation failed."),l):await o.install(t)}}
|
|
82
2
|
//# sourceMappingURL=InstallationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ClientInstaller","ConfigurationProvider","Logger","requirementService","InstallOperationManager","RecordingConstants","InstallationService","constructor","install","categoryName","serverName","options","recoder","getInstance","resetOperation","configProvider","clients","targetClients","requirements","length","recordingAsync","processRequirementUpdates","stepName","STEP_PROCESS_REQUIREMENT_UPDATES_SERVICE","onError","error","errorMsg","Error","message","String","onComplete","markOverallStatus","success","readyMessage","recording","isServerReady","STEP_CHECK_SERVER_READINESS","inProgressMessage","endMessage","ready","status","type","target","clientInstaller","requirementsResult","checkAndInstallRequirements","checkServerRequirementForUpdateAsync","then","info","catch","recordStep"],"sources":["../../src/services/InstallationService.ts"],"mappings":"OAISA,oBAAuB,uDACvBC,0BAA6B,kDAC7BC,WAAc,4BACdC,uBAA0B,iCAC1BC,4BAA+B,uDAC5BC,uBAAwB,iDAK9B,MAAOC,oBAEX,WAAAC,GAEA,CASA,aAAMC,CAAQC,EAAsBC,EAAoBC,GAEtD,MAAMC,QAAgBR,wBAAwBS,YAAYJ,EAAcC,GAAYI,iBAC9EC,EAAiBd,sBAAsBY,cAEvCG,EAAUL,EAAQM,eAAiB,GAoBzC,GAjBIN,EAAQO,cAAgBP,EAAQO,aAAaC,OAAS,GACxDP,EAAQQ,gBACN,IAAMjB,mBAAmBkB,0BAA0BZ,EAAcC,EAAYC,IAC7E,CACEW,SAAUjB,mBAAmBkB,yCAC7BC,QAAUC,IACR,MAAMC,EAAW,4CAA4CD,aAAiBE,MAAQF,EAAMG,QAAUC,OAAOJ,KAE7G,OADAvB,OAAOuB,MAAMC,GACNA,CAAQ,EAEjBI,WAAY,KACa,IAAnBd,EAAQG,QAAcP,EAAQmB,kBAAkB,YAAa,iCAAiC,KAMrGf,GAA8B,IAAnBA,EAAQG,OAEtB,MAAO,CAAEa,SAAS,EAAMJ,QADR,0CAKlB,MAAMK,EAAe,qDASrB,SARsBrB,EAAQsB,WAC5B,IAAMnB,EAAeoB,cAAc1B,EAAcC,EAAYM,IAC7D,CACEM,SAAUjB,mBAAmB+B,4BAC7BC,kBAAmB,uCACnBC,WAAaC,GAAmBA,EAAQ,qDAAuD,uDAIjG,MAAO,CACLP,SAAS,EAAMJ,QAASK,EACxBO,OAAQ,CAAC,CACPA,OAAQ,YACRC,KAAM,UACNC,OAAQ,SACRd,QAASK,KAMf,MAAMU,EAAkB,IAAI3C,gBAAgBS,EAAcC,EAAYM,GAGhE4B,QAA2BzC,mBAAmB0C,4BAA4BpC,EAAcC,EAAYC,GAW1G,aARMR,mBAAmB2C,qCAAqCrC,EAAcC,GACzEqC,MAAK,KACJ7C,OAAO8C,KAAK,yBAAyBvC,KAAgBC,4BAAqC,IAE3FuC,OAAOxB,IACNvB,OAAOuB,MAAM,yBAAyBhB,KAAgBC,aAAsBe,aAAiBE,MAAQF,EAAMG,QAAUC,OAAOJ,KAAS,IAGrImB,IAAuBA,EAAmBZ,eACtCpB,EAAQsC,WAAW,+BAAgC,SAAUN,EAAmBnB,OAAOG,SAAWgB,EAAmBhB,SAAW,oCAC/HgB,SAGID,EAAgBnC,QAAQG,EACvC","ignoreList":[]}
|
|
@@ -1,198 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ConfigurationProvider } from '../core/loaders/ConfigurationProvider.js';
|
|
3
|
-
import { ServerSchemaProvider } from '../core/loaders/ServerSchemaProvider.js';
|
|
4
|
-
import { InstallationService } from './InstallationService.js';
|
|
5
|
-
import { MCPEvent, } from '../core/metadatas/types.js';
|
|
6
|
-
import { OnboardingProcessStatus } from '../core/onboard/OnboardStatus.js';
|
|
7
|
-
import { Logger, EventType, EventStatus } from '../utils/logger.js';
|
|
8
|
-
import { FeedOnboardService } from '../core/onboard/FeedOnboardService.js';
|
|
9
|
-
import { RequirementService } from './RequirementService.js';
|
|
10
|
-
export class MCPManager extends EventEmitter {
|
|
11
|
-
installationService;
|
|
12
|
-
configProvider;
|
|
13
|
-
feedOnboardService;
|
|
14
|
-
schemaProvider;
|
|
15
|
-
requirementsService;
|
|
16
|
-
constructor() {
|
|
17
|
-
super();
|
|
18
|
-
this.configProvider = ConfigurationProvider.getInstance();
|
|
19
|
-
this.schemaProvider = ServerSchemaProvider.getInstance();
|
|
20
|
-
this.installationService = new InstallationService();
|
|
21
|
-
this.feedOnboardService = new FeedOnboardService();
|
|
22
|
-
this.requirementsService = RequirementService.getInstance();
|
|
23
|
-
}
|
|
24
|
-
async syncFeeds() {
|
|
25
|
-
await this.configProvider.syncFeeds();
|
|
26
|
-
}
|
|
27
|
-
async initialize(feedFile, schemasDirectory) {
|
|
28
|
-
try {
|
|
29
|
-
await this.configProvider.initialize(feedFile);
|
|
30
|
-
await this.schemaProvider.initialize(schemasDirectory);
|
|
31
|
-
await this.requirementsService.checkRequirementForUpdateAsync();
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
console.error("Error during MCPManager initialization:", error);
|
|
35
|
-
throw error;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
async listServerCategories(options = {}) {
|
|
39
|
-
const { local = true } = options;
|
|
40
|
-
if (local) {
|
|
41
|
-
return await this.configProvider.getServerCategories();
|
|
42
|
-
}
|
|
43
|
-
return [];
|
|
44
|
-
}
|
|
45
|
-
async getFeedConfiguration(categoryName) {
|
|
46
|
-
return this.configProvider.getFeedConfiguration(categoryName);
|
|
47
|
-
}
|
|
48
|
-
async getServerMcpConfig(categoryName, serverName) {
|
|
49
|
-
return this.configProvider.getServerMcpConfig(categoryName, serverName);
|
|
50
|
-
}
|
|
51
|
-
async installServer(categoryName, serverName, requestOptions = {}) {
|
|
52
|
-
try {
|
|
53
|
-
const server = await this.configProvider.getServerCategory(categoryName);
|
|
54
|
-
if (!server) {
|
|
55
|
-
return {
|
|
56
|
-
success: false,
|
|
57
|
-
message: `Server category ${categoryName} is not onboarded`,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
const installResult = await this.installationService.install(categoryName, serverName, requestOptions);
|
|
61
|
-
// Log the event with appropriate status
|
|
62
|
-
Logger.trackEvent(EventType.SERVER_INSTALL, {
|
|
63
|
-
status: installResult.success ? EventStatus.SUCCESS : EventStatus.FAILED,
|
|
64
|
-
errorMessage: !installResult.success ? installResult.message : undefined,
|
|
65
|
-
categoryName,
|
|
66
|
-
serverName,
|
|
67
|
-
...requestOptions
|
|
68
|
-
});
|
|
69
|
-
if (!installResult.success) {
|
|
70
|
-
return installResult;
|
|
71
|
-
}
|
|
72
|
-
this.emit(MCPEvent.SERVER_INSTALLED, { server });
|
|
73
|
-
return installResult;
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
const errorMessage = `Failed to install ${serverName}: ${error instanceof Error ? error.message : String(error)}`;
|
|
77
|
-
Logger.error(errorMessage, error);
|
|
78
|
-
Logger.trackEvent(EventType.SERVER_INSTALL, {
|
|
79
|
-
status: EventStatus.FAILED,
|
|
80
|
-
errorMessage,
|
|
81
|
-
categoryName,
|
|
82
|
-
serverName,
|
|
83
|
-
...requestOptions
|
|
84
|
-
});
|
|
85
|
-
return {
|
|
86
|
-
success: false,
|
|
87
|
-
message: errorMessage,
|
|
88
|
-
error: error instanceof Error ? error : new Error(String(error)),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
async uninstallServer(categoryName, serverName, options = {}) {
|
|
93
|
-
const { targets = [], removeData = false } = options;
|
|
94
|
-
try {
|
|
95
|
-
const serverCategory = await this.configProvider.getServerCategory(categoryName);
|
|
96
|
-
if (!serverCategory) {
|
|
97
|
-
return {
|
|
98
|
-
success: false,
|
|
99
|
-
message: `Server category ${categoryName} is not onboarded`,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
// Clear installation status for specified targets
|
|
103
|
-
const currentStatus = serverCategory.installationStatus || {
|
|
104
|
-
requirementsStatus: {},
|
|
105
|
-
serversStatus: {},
|
|
106
|
-
lastUpdated: new Date().toISOString()
|
|
107
|
-
};
|
|
108
|
-
const serversStatus = currentStatus.serversStatus || {};
|
|
109
|
-
const serverStatus = serversStatus[serverName] || { installedStatus: {}, name: serverName };
|
|
110
|
-
// Only reset installedStatus for specified targets
|
|
111
|
-
for (const target of targets) {
|
|
112
|
-
if (serverStatus.installedStatus) {
|
|
113
|
-
delete serverStatus.installedStatus[target];
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (removeData) {
|
|
117
|
-
for (const target of targets) {
|
|
118
|
-
await this.configProvider.removeServerFromClientMCPSettings(serverName, target);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Update server status
|
|
122
|
-
serversStatus[serverName] = serverStatus;
|
|
123
|
-
// Update status keeping requirements
|
|
124
|
-
await this.configProvider.updateInstallationStatus(categoryName, currentStatus.requirementsStatus || {}, serversStatus);
|
|
125
|
-
Logger.trackEvent(EventType.SERVER_UNINSTALL, {
|
|
126
|
-
status: EventStatus.SUCCESS,
|
|
127
|
-
categoryName,
|
|
128
|
-
serverName,
|
|
129
|
-
targets,
|
|
130
|
-
removeData
|
|
131
|
-
});
|
|
132
|
-
this.emit(MCPEvent.SERVER_UNINSTALLED, { serverName, targets });
|
|
133
|
-
return {
|
|
134
|
-
success: true,
|
|
135
|
-
message: `Successfully uninstalled ${serverName} from ${targets.join(', ')}`,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
catch (error) {
|
|
139
|
-
const errorMessage = `Failed to uninstall ${serverName}: ${error instanceof Error ? error.message : String(error)}`;
|
|
140
|
-
Logger.trackEvent(EventType.SERVER_UNINSTALL, {
|
|
141
|
-
status: EventStatus.FAILED,
|
|
142
|
-
errorMessage,
|
|
143
|
-
categoryName,
|
|
144
|
-
serverName,
|
|
145
|
-
targets: targets || [],
|
|
146
|
-
removeData: removeData || false
|
|
147
|
-
});
|
|
148
|
-
return {
|
|
149
|
-
success: false,
|
|
150
|
-
message: errorMessage,
|
|
151
|
-
error: error,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Onboards a new feed configuration
|
|
157
|
-
* @param config The feed configuration to onboard
|
|
158
|
-
*/
|
|
159
|
-
async onboardFeed(config) {
|
|
160
|
-
try {
|
|
161
|
-
const result = await this.feedOnboardService.onboardFeed(config);
|
|
162
|
-
Logger.trackEvent(EventType.FEED_ONBOARD, {
|
|
163
|
-
status: result.status === OnboardingProcessStatus.SUCCEEDED ? EventStatus.SUCCESS : EventStatus.FAILED,
|
|
164
|
-
errorMessage: result.message,
|
|
165
|
-
feedConfig: config
|
|
166
|
-
});
|
|
167
|
-
// After successful onboarding initiation, sync feeds to get the latest changes
|
|
168
|
-
// Syncing should ideally happen after the PR is merged, but for now,
|
|
169
|
-
// syncing here makes the new (pending) category available locally if needed.
|
|
170
|
-
// Consider if syncFeeds should be conditional based on operation status or handled differently.
|
|
171
|
-
await this.syncFeeds();
|
|
172
|
-
return result;
|
|
173
|
-
}
|
|
174
|
-
catch (error) {
|
|
175
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
176
|
-
Logger.error('Failed to onboard feed in MCPManager:', error);
|
|
177
|
-
Logger.trackEvent(EventType.FEED_ONBOARD, {
|
|
178
|
-
status: EventStatus.FAILED,
|
|
179
|
-
errorMessage,
|
|
180
|
-
feedName: config.name
|
|
181
|
-
});
|
|
182
|
-
throw error; // Rethrow or handle by returning a failed OperationStatus
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
// Type-safe event emitter methods
|
|
186
|
-
emit(event, data) {
|
|
187
|
-
return super.emit(event, data);
|
|
188
|
-
}
|
|
189
|
-
on(event, listener) {
|
|
190
|
-
return super.on(event, listener);
|
|
191
|
-
}
|
|
192
|
-
off(event, listener) {
|
|
193
|
-
return super.off(event, listener);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// Export a singleton instance
|
|
197
|
-
export const mcpManager = new MCPManager();
|
|
1
|
+
import{EventEmitter}from"events";import{ConfigurationProvider}from"../core/loaders/ConfigurationProvider.js";import{ServerSchemaProvider}from"../core/loaders/ServerSchemaProvider.js";import{InstallationService}from"./InstallationService.js";import{MCPEvent}from"../core/metadatas/types.js";import{OnboardingProcessStatus}from"../core/onboard/OnboardStatus.js";import{Logger,EventType,EventStatus}from"../utils/logger.js";import{FeedOnboardService}from"../core/onboard/FeedOnboardService.js";import{RequirementService}from"./RequirementService.js";export class MCPManager extends EventEmitter{installationService;configProvider;feedOnboardService;schemaProvider;requirementsService;constructor(){super(),this.configProvider=ConfigurationProvider.getInstance(),this.schemaProvider=ServerSchemaProvider.getInstance(),this.installationService=new InstallationService,this.feedOnboardService=new FeedOnboardService,this.requirementsService=RequirementService.getInstance()}async syncFeeds(){await this.configProvider.syncFeeds()}async initialize(e,r){try{await this.configProvider.initialize(e),await this.schemaProvider.initialize(r),await this.requirementsService.checkRequirementForUpdateAsync()}catch(e){throw e}}async listServerCategories(e={}){const{local:r=!0}=e;return r?await this.configProvider.getServerCategories():[]}async getFeedConfiguration(e){return this.configProvider.getFeedConfiguration(e)}async getServerMcpConfig(e,r){return this.configProvider.getServerMcpConfig(e,r)}async installServer(e,r,t={}){try{const s=await this.configProvider.getServerCategory(e);if(!s)return{success:!1,message:`Server category ${e} is not onboarded`};const a=await this.installationService.install(e,r,t);return Logger.trackEvent(EventType.SERVER_INSTALL,{status:a.success?EventStatus.SUCCESS:EventStatus.FAILED,errorMessage:a.success?void 0:a.message,categoryName:e,serverName:r,...t}),a.success?(this.emit(MCPEvent.SERVER_INSTALLED,{server:s}),a):a}catch(s){const a=`Failed to install ${r}: ${s instanceof Error?s.message:String(s)}`;return Logger.error(a,s),Logger.trackEvent(EventType.SERVER_INSTALL,{status:EventStatus.FAILED,errorMessage:a,categoryName:e,serverName:r,...t}),{success:!1,message:a,error:s instanceof Error?s:new Error(String(s))}}}async uninstallServer(e,r,t={}){const{targets:s=[],removeData:a=!1}=t;try{const t=await this.configProvider.getServerCategory(e);if(!t)return{success:!1,message:`Server category ${e} is not onboarded`};const n=t.installationStatus||{requirementsStatus:{},serversStatus:{},lastUpdated:(new Date).toISOString()},o=n.serversStatus||{},i=o[r]||{installedStatus:{},name:r};for(const e of s)i.installedStatus&&delete i.installedStatus[e];if(a)for(const e of s)await this.configProvider.removeServerFromClientMCPSettings(r,e);return o[r]=i,await this.configProvider.updateInstallationStatus(e,n.requirementsStatus||{},o),Logger.trackEvent(EventType.SERVER_UNINSTALL,{status:EventStatus.SUCCESS,categoryName:e,serverName:r,targets:s,removeData:a}),this.emit(MCPEvent.SERVER_UNINSTALLED,{serverName:r,targets:s}),{success:!0,message:`Successfully uninstalled ${r} from ${s.join(", ")}`}}catch(t){const n=`Failed to uninstall ${r}: ${t instanceof Error?t.message:String(t)}`;return Logger.trackEvent(EventType.SERVER_UNINSTALL,{status:EventStatus.FAILED,errorMessage:n,categoryName:e,serverName:r,targets:s||[],removeData:a||!1}),{success:!1,message:n,error:t}}}async onboardFeed(e){try{const r=await this.feedOnboardService.onboardFeed(e);return Logger.trackEvent(EventType.FEED_ONBOARD,{status:r.status===OnboardingProcessStatus.SUCCEEDED?EventStatus.SUCCESS:EventStatus.FAILED,errorMessage:r.message,feedConfig:e}),await this.syncFeeds(),r}catch(r){const t=r instanceof Error?r.message:String(r);throw Logger.error("Failed to onboard feed in MCPManager:",r),Logger.trackEvent(EventType.FEED_ONBOARD,{status:EventStatus.FAILED,errorMessage:t,feedName:e.name}),r}}emit(e,r){return super.emit(e,r)}on(e,r){return super.on(e,r)}off(e,r){return super.off(e,r)}}export const mcpManager=new MCPManager;
|
|
198
2
|
//# sourceMappingURL=MCPManager.js.map
|