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.
Files changed (314) hide show
  1. package/dist/cli/commands/install.js +1 -106
  2. package/dist/cli/commands/install.js.map +1 -0
  3. package/dist/cli/commands/list.js +1 -90
  4. package/dist/cli/commands/list.js.map +1 -0
  5. package/dist/cli/commands/pull.js +1 -16
  6. package/dist/cli/commands/pull.js.map +1 -0
  7. package/dist/cli/commands/serve.js +1 -33
  8. package/dist/cli/commands/serve.js.map +1 -0
  9. package/dist/cli/commands/uninstall.js +1 -46
  10. package/dist/cli/commands/uninstall.js.map +1 -0
  11. package/dist/cli/index.js +1 -65
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
  14. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
  15. package/dist/core/installers/clients/ClientInstaller.js +1 -163
  16. package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
  17. package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
  18. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
  19. package/dist/core/installers/clients/ClineInstaller.js +1 -30
  20. package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
  21. package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
  22. package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
  23. package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
  24. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
  25. package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
  26. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
  27. package/dist/core/installers/index.js +1 -8
  28. package/dist/core/installers/index.js.map +1 -0
  29. package/dist/core/installers/requirements/BaseInstaller.js +1 -56
  30. package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
  31. package/dist/core/installers/requirements/CommandInstaller.js +1 -213
  32. package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
  33. package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
  34. package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
  35. package/dist/core/installers/requirements/InstallerFactory.js +1 -99
  36. package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
  37. package/dist/core/installers/requirements/NpmInstaller.js +1 -235
  38. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  39. package/dist/core/installers/requirements/NugetInstaller.js +1 -188
  40. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  41. package/dist/core/installers/requirements/PipInstaller.js +1 -192
  42. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  43. package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
  44. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  45. package/dist/core/loaders/ConfigurationLoader.js +1 -256
  46. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  47. package/dist/core/loaders/ConfigurationProvider.js +1 -383
  48. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  49. package/dist/core/loaders/InstallOperationManager.js +1 -310
  50. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  51. package/dist/core/loaders/ServerSchemaLoader.js +1 -108
  52. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  53. package/dist/core/loaders/ServerSchemaProvider.js +1 -89
  54. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  55. package/dist/core/loaders/SystemSettingsManager.js +1 -256
  56. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  57. package/dist/core/metadatas/constants.js +1 -100
  58. package/dist/core/metadatas/constants.js.map +1 -0
  59. package/dist/core/metadatas/recordingConstants.js +1 -46
  60. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  61. package/dist/core/metadatas/types.js +1 -15
  62. package/dist/core/metadatas/types.js.map +1 -0
  63. package/dist/core/onboard/FeedOnboardService.js +1 -422
  64. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  65. package/dist/core/onboard/OnboardProcessor.js +1 -333
  66. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  67. package/dist/core/onboard/OnboardStatus.js +1 -9
  68. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  69. package/dist/core/onboard/OnboardStatusManager.js +1 -360
  70. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  71. package/dist/core/validators/FeedValidator.js +1 -133
  72. package/dist/core/validators/FeedValidator.js.map +1 -0
  73. package/dist/core/validators/IServerValidator.js +1 -1
  74. package/dist/core/validators/IServerValidator.js.map +1 -0
  75. package/dist/core/validators/SSEServerValidator.js +1 -38
  76. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  77. package/dist/core/validators/ServerValidatorFactory.js +1 -44
  78. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  79. package/dist/core/validators/StdioServerValidator.js +1 -281
  80. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  81. package/dist/index.js +1 -18
  82. package/dist/index.js.map +1 -0
  83. package/dist/services/InstallationService.js +1 -81
  84. package/dist/services/InstallationService.js.map +1 -0
  85. package/dist/services/MCPManager.js +1 -197
  86. package/dist/services/MCPManager.js.map +1 -0
  87. package/dist/services/RequirementService.js +1 -548
  88. package/dist/services/RequirementService.js.map +1 -0
  89. package/dist/services/ServerService.js +1 -127
  90. package/dist/services/ServerService.js.map +1 -0
  91. package/dist/services/TelemetryService.js +1 -53
  92. package/dist/services/TelemetryService.js.map +1 -0
  93. package/dist/utils/UpdateCheckTracker.js +1 -79
  94. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  95. package/dist/utils/adoUtils.js +1 -254
  96. package/dist/utils/adoUtils.js.map +1 -0
  97. package/dist/utils/clientUtils.js +1 -65
  98. package/dist/utils/clientUtils.js.map +1 -0
  99. package/dist/utils/feedUtils.js +1 -28
  100. package/dist/utils/feedUtils.js.map +1 -0
  101. package/dist/utils/githubAuth.js +1 -177
  102. package/dist/utils/githubAuth.js.map +1 -0
  103. package/dist/utils/githubUtils.js +1 -125
  104. package/dist/utils/githubUtils.js.map +1 -0
  105. package/dist/utils/logger.js +1 -176
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/macroExpressionUtils.js +1 -93
  108. package/dist/utils/macroExpressionUtils.js.map +1 -0
  109. package/dist/utils/osUtils.js +1 -664
  110. package/dist/utils/osUtils.js.map +1 -0
  111. package/dist/utils/versionUtils.js +1 -101
  112. package/dist/utils/versionUtils.js.map +1 -0
  113. package/dist/web/contract/serverContract.js +1 -1
  114. package/dist/web/contract/serverContract.js.map +1 -0
  115. package/dist/web/public/js/api.js +2 -132
  116. package/dist/web/public/js/api.js.map +1 -0
  117. package/dist/web/public/js/detailsWidget.js +2 -264
  118. package/dist/web/public/js/detailsWidget.js.map +1 -0
  119. package/dist/web/public/js/flights/flights.js +2 -127
  120. package/dist/web/public/js/flights/flights.js.map +1 -0
  121. package/dist/web/public/js/modal/index.js +2 -52
  122. package/dist/web/public/js/modal/index.js.map +1 -0
  123. package/dist/web/public/js/modal/installModal.js +2 -162
  124. package/dist/web/public/js/modal/installModal.js.map +1 -0
  125. package/dist/web/public/js/modal/installation.js +2 -266
  126. package/dist/web/public/js/modal/installation.js.map +1 -0
  127. package/dist/web/public/js/modal/loadingModal.js +2 -182
  128. package/dist/web/public/js/modal/loadingModal.js.map +1 -0
  129. package/dist/web/public/js/modal/modalSetup.js +2 -595
  130. package/dist/web/public/js/modal/modalSetup.js.map +1 -0
  131. package/dist/web/public/js/modal/modalUtils.js +2 -37
  132. package/dist/web/public/js/modal/modalUtils.js.map +1 -0
  133. package/dist/web/public/js/modal/versionUtils.js +2 -20
  134. package/dist/web/public/js/modal/versionUtils.js.map +1 -0
  135. package/dist/web/public/js/modal.js +2 -42
  136. package/dist/web/public/js/modal.js.map +1 -0
  137. package/dist/web/public/js/notifications.js +2 -137
  138. package/dist/web/public/js/notifications.js.map +1 -0
  139. package/dist/web/public/js/onboard/formProcessor.js +2 -1037
  140. package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
  141. package/dist/web/public/js/onboard/index.js +2 -374
  142. package/dist/web/public/js/onboard/index.js.map +1 -0
  143. package/dist/web/public/js/onboard/publishHandler.js +2 -172
  144. package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
  145. package/dist/web/public/js/onboard/state.js +2 -76
  146. package/dist/web/public/js/onboard/state.js.map +1 -0
  147. package/dist/web/public/js/onboard/templates.js +2 -342
  148. package/dist/web/public/js/onboard/templates.js.map +1 -0
  149. package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
  150. package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
  151. package/dist/web/public/js/onboard/validationHandlers.js +2 -493
  152. package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
  153. package/dist/web/public/js/serverCategoryDetails.js +2 -364
  154. package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
  155. package/dist/web/public/js/serverCategoryList.js +2 -241
  156. package/dist/web/public/js/serverCategoryList.js.map +1 -0
  157. package/dist/web/public/js/settings.js +2 -314
  158. package/dist/web/public/js/settings.js.map +1 -0
  159. package/dist/web/server.js +1 -404
  160. package/dist/web/server.js.map +1 -0
  161. package/package.json +8 -2
  162. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  163. package/.github/acl/access.yml +0 -20
  164. package/.github/compliance/inventory.yml +0 -5
  165. package/.github/policies/jit.yml +0 -19
  166. package/.github/workflows/build.yml +0 -28
  167. package/.roo/rules-code/rules.md +0 -88
  168. package/dist/cli/commands/start.d.ts +0 -2
  169. package/dist/cli/commands/start.js +0 -32
  170. package/dist/cli/commands/sync.d.ts +0 -2
  171. package/dist/cli/commands/sync.js +0 -17
  172. package/dist/core/ConfigurationLoader.d.ts +0 -32
  173. package/dist/core/ConfigurationLoader.js +0 -236
  174. package/dist/core/ConfigurationProvider.d.ts +0 -35
  175. package/dist/core/ConfigurationProvider.js +0 -375
  176. package/dist/core/InstallationService.d.ts +0 -50
  177. package/dist/core/InstallationService.js +0 -350
  178. package/dist/core/MCPManager.d.ts +0 -28
  179. package/dist/core/MCPManager.js +0 -188
  180. package/dist/core/RequirementService.d.ts +0 -40
  181. package/dist/core/RequirementService.js +0 -110
  182. package/dist/core/ServerSchemaLoader.d.ts +0 -11
  183. package/dist/core/ServerSchemaLoader.js +0 -43
  184. package/dist/core/ServerSchemaProvider.d.ts +0 -17
  185. package/dist/core/ServerSchemaProvider.js +0 -120
  186. package/dist/core/constants.d.ts +0 -47
  187. package/dist/core/constants.js +0 -94
  188. package/dist/core/installers/BaseInstaller.d.ts +0 -74
  189. package/dist/core/installers/BaseInstaller.js +0 -253
  190. package/dist/core/installers/ClientInstaller.d.ts +0 -23
  191. package/dist/core/installers/ClientInstaller.js +0 -564
  192. package/dist/core/installers/CommandInstaller.d.ts +0 -37
  193. package/dist/core/installers/CommandInstaller.js +0 -173
  194. package/dist/core/installers/GeneralInstaller.d.ts +0 -33
  195. package/dist/core/installers/GeneralInstaller.js +0 -85
  196. package/dist/core/installers/InstallerFactory.d.ts +0 -54
  197. package/dist/core/installers/InstallerFactory.js +0 -97
  198. package/dist/core/installers/NpmInstaller.d.ts +0 -26
  199. package/dist/core/installers/NpmInstaller.js +0 -127
  200. package/dist/core/installers/PipInstaller.d.ts +0 -28
  201. package/dist/core/installers/PipInstaller.js +0 -127
  202. package/dist/core/installers/RequirementInstaller.d.ts +0 -33
  203. package/dist/core/installers/RequirementInstaller.js +0 -3
  204. package/dist/core/types.d.ts +0 -166
  205. package/dist/core/types.js +0 -16
  206. package/dist/services/InstallRequestValidator.d.ts +0 -21
  207. package/dist/services/InstallRequestValidator.js +0 -99
  208. package/dist/web/public/js/modal/installHandler.js +0 -227
  209. package/dist/web/public/js/modal/loadingUI.js +0 -74
  210. package/dist/web/public/js/modal/messageQueue.js +0 -112
  211. package/dist/web/public/js/modal/modalUI.js +0 -214
  212. package/dist/web/public/js/modal/version.js +0 -20
  213. package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
  214. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  215. package/docs/Telemetry.md +0 -136
  216. package/memory-bank/activeContext.md +0 -26
  217. package/memory-bank/decisionLog.md +0 -91
  218. package/memory-bank/productContext.md +0 -41
  219. package/memory-bank/progress.md +0 -35
  220. package/memory-bank/systemPatterns.md +0 -10
  221. package/src/cli/commands/install.ts +0 -139
  222. package/src/cli/commands/list.ts +0 -113
  223. package/src/cli/commands/pull.ts +0 -16
  224. package/src/cli/commands/serve.ts +0 -39
  225. package/src/cli/commands/uninstall.ts +0 -64
  226. package/src/cli/index.ts +0 -82
  227. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  228. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  229. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  230. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  231. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  232. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  233. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  234. package/src/core/installers/index.ts +0 -11
  235. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  236. package/src/core/installers/requirements/CommandInstaller.ts +0 -231
  237. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  238. package/src/core/installers/requirements/InstallerFactory.ts +0 -114
  239. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  240. package/src/core/installers/requirements/NugetInstaller.ts +0 -203
  241. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  242. package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
  243. package/src/core/loaders/ConfigurationLoader.ts +0 -298
  244. package/src/core/loaders/ConfigurationProvider.ts +0 -462
  245. package/src/core/loaders/InstallOperationManager.ts +0 -367
  246. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  247. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  248. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  249. package/src/core/metadatas/constants.ts +0 -122
  250. package/src/core/metadatas/recordingConstants.ts +0 -65
  251. package/src/core/metadatas/types.ts +0 -202
  252. package/src/core/onboard/FeedOnboardService.ts +0 -501
  253. package/src/core/onboard/OnboardProcessor.ts +0 -356
  254. package/src/core/onboard/OnboardStatus.ts +0 -60
  255. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  256. package/src/core/validators/FeedValidator.ts +0 -135
  257. package/src/core/validators/IServerValidator.ts +0 -21
  258. package/src/core/validators/SSEServerValidator.ts +0 -43
  259. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  260. package/src/core/validators/StdioServerValidator.ts +0 -313
  261. package/src/index.ts +0 -44
  262. package/src/services/InstallationService.ts +0 -102
  263. package/src/services/MCPManager.ts +0 -249
  264. package/src/services/RequirementService.ts +0 -627
  265. package/src/services/ServerService.ts +0 -161
  266. package/src/services/TelemetryService.ts +0 -59
  267. package/src/utils/UpdateCheckTracker.ts +0 -86
  268. package/src/utils/adoUtils.ts +0 -293
  269. package/src/utils/clientUtils.ts +0 -72
  270. package/src/utils/feedUtils.ts +0 -31
  271. package/src/utils/githubAuth.ts +0 -212
  272. package/src/utils/githubUtils.ts +0 -164
  273. package/src/utils/logger.ts +0 -195
  274. package/src/utils/macroExpressionUtils.ts +0 -104
  275. package/src/utils/osUtils.ts +0 -700
  276. package/src/utils/versionUtils.ts +0 -114
  277. package/src/web/contract/serverContract.ts +0 -74
  278. package/src/web/public/css/detailsWidget.css +0 -235
  279. package/src/web/public/css/modal.css +0 -757
  280. package/src/web/public/css/notifications.css +0 -101
  281. package/src/web/public/css/onboard.css +0 -107
  282. package/src/web/public/css/serverCategoryList.css +0 -120
  283. package/src/web/public/css/serverDetails.css +0 -139
  284. package/src/web/public/index.html +0 -359
  285. package/src/web/public/js/api.js +0 -132
  286. package/src/web/public/js/detailsWidget.js +0 -264
  287. package/src/web/public/js/flights/flights.js +0 -127
  288. package/src/web/public/js/modal/index.js +0 -52
  289. package/src/web/public/js/modal/installModal.js +0 -162
  290. package/src/web/public/js/modal/installation.js +0 -266
  291. package/src/web/public/js/modal/loadingModal.js +0 -182
  292. package/src/web/public/js/modal/modalSetup.js +0 -595
  293. package/src/web/public/js/modal/modalUtils.js +0 -37
  294. package/src/web/public/js/modal/versionUtils.js +0 -20
  295. package/src/web/public/js/modal.js +0 -42
  296. package/src/web/public/js/notifications.js +0 -137
  297. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  298. package/src/web/public/js/onboard/index.js +0 -374
  299. package/src/web/public/js/onboard/publishHandler.js +0 -172
  300. package/src/web/public/js/onboard/state.js +0 -76
  301. package/src/web/public/js/onboard/templates.js +0 -342
  302. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  303. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  304. package/src/web/public/js/serverCategoryDetails.js +0 -364
  305. package/src/web/public/js/serverCategoryList.js +0 -241
  306. package/src/web/public/js/settings.js +0 -314
  307. package/src/web/public/modal.html +0 -84
  308. package/src/web/public/onboard.html +0 -296
  309. package/src/web/public/settings.html +0 -135
  310. package/src/web/public/styles.css +0 -277
  311. package/src/web/server.ts +0 -478
  312. package/tsconfig.json +0 -18
  313. package/wiki/Installation.md +0 -3
  314. 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 { Logger } from "../../utils/logger.js";
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
- // Public types
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 { ClientInstaller } from '../core/installers/clients/ClientInstaller.js';
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 { EventEmitter } from 'events';
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