imcp 0.1.7 → 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":["EventEmitter","ConfigurationProvider","ServerSchemaProvider","InstallationService","MCPEvent","OnboardingProcessStatus","Logger","EventType","EventStatus","FeedOnboardService","RequirementService","MCPManager","installationService","configProvider","feedOnboardService","schemaProvider","requirementsService","constructor","super","this","getInstance","syncFeeds","initialize","feedFile","schemasDirectory","checkRequirementForUpdateAsync","error","listServerCategories","options","local","getServerCategories","getFeedConfiguration","categoryName","getServerMcpConfig","serverName","installServer","requestOptions","server","getServerCategory","success","message","installResult","install","trackEvent","SERVER_INSTALL","status","SUCCESS","FAILED","errorMessage","undefined","emit","SERVER_INSTALLED","Error","String","uninstallServer","targets","removeData","serverCategory","currentStatus","installationStatus","requirementsStatus","serversStatus","lastUpdated","Date","toISOString","serverStatus","installedStatus","name","target","removeServerFromClientMCPSettings","updateInstallationStatus","SERVER_UNINSTALL","SERVER_UNINSTALLED","join","onboardFeed","config","result","FEED_ONBOARD","SUCCEEDED","feedConfig","feedName","event","data","on","listener","off","mcpManager"],"sources":["../../src/services/MCPManager.ts"],"mappings":"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","ignoreList":[]}
@@ -1,549 +1,2 @@
1
- import { createInstallerFactory } from '../core/installers/index.js';
2
- import { exec } from 'child_process';
3
- import util from 'util';
4
- import { configProvider, ConfigurationProvider } from '../core/loaders/ConfigurationProvider.js';
5
- import { Logger } from '../utils/logger.js';
6
- import { updateCheckTracker } from '../utils/UpdateCheckTracker.js';
7
- import { InstallOperationManager } from '../core/loaders/InstallOperationManager.js';
8
- import * as RecordingConstants from '../core/metadatas/recordingConstants.js';
9
- import { systemSettingsManager } from '../core/loaders/SystemSettingsManager.js';
10
- /**
11
- * Service responsible for managing requirements installation and status
12
- */
13
- export class RequirementService {
14
- static instance;
15
- installerFactory;
16
- constructor() {
17
- this.installerFactory = createInstallerFactory(util.promisify(exec));
18
- }
19
- /**
20
- * Get the singleton instance of RequirementService
21
- * @returns The RequirementService instance
22
- */
23
- static getInstance() {
24
- if (!RequirementService.instance) {
25
- RequirementService.instance = new RequirementService();
26
- }
27
- return RequirementService.instance;
28
- }
29
- generateOperationId() {
30
- return `install-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
31
- }
32
- /**
33
- * Checks and installs requirements for a server if needed.
34
- * @param categoryName The category name.
35
- * @param serverName The server name.
36
- * @param options The installation options.
37
- * @returns A failure result if requirements check fails, null if requirements are satisfied or installation started in background.
38
- */
39
- async checkAndInstallRequirements(categoryName, serverName, options) {
40
- const recoder = InstallOperationManager.getInstance(categoryName, serverName);
41
- return recoder.recording(async () => {
42
- const configProvider = ConfigurationProvider.getInstance();
43
- const feedConfig = await configProvider.getFeedConfiguration(categoryName);
44
- if (!feedConfig) {
45
- const errorMsg = 'Feed configuration not found';
46
- // No need to record step here, recoder.recording will handle failure
47
- return {
48
- success: false, message: errorMsg,
49
- status: [{ status: 'failed', type: 'install', target: 'server', message: errorMsg }]
50
- };
51
- }
52
- const serverConfig = feedConfig.mcpServers.find((s) => s.name === serverName);
53
- if (!serverConfig?.dependencies?.requirements || serverConfig.dependencies.requirements.length === 0) {
54
- const msg = `No requirements for ${serverName} in category ${categoryName}`;
55
- Logger.debug(msg);
56
- await recoder.recordStep(RecordingConstants.STEP_CHECKING_REQUIREMENT_STATUS, 'completed', msg);
57
- return null;
58
- }
59
- const ready = await recoder.recording(async () => {
60
- await recoder.recordStep(RecordingConstants.STEP_CHECKING_REQUIREMENT_STATUS, 'in-progress', 'Checking status of all requirements.');
61
- const requirementStatuses = await Promise.all(serverConfig.dependencies.requirements.map(async (req) => {
62
- const reqConfig = feedConfig.requirements?.find((r) => r.name === req.name) || {
63
- name: req.name, version: req.version, type: 'npm' // Default to npm if not fully defined
64
- };
65
- return await this.installerFactory.checkInstallation(reqConfig, options);
66
- }));
67
- const requirementsReady = await configProvider.isRequirementsReady(categoryName, serverName);
68
- for (const status of requirementStatuses) {
69
- if (status.installed && !requirementsReady) {
70
- await configProvider.updateRequirementStatus(categoryName, status.name, { ...status, installed: true });
71
- }
72
- else if (!status.installed && requirementsReady) {
73
- await configProvider.updateRequirementStatus(categoryName, status.name, { ...status, installed: false });
74
- }
75
- }
76
- return requirementStatuses.every(status => status.installed);
77
- }, {
78
- stepName: RecordingConstants.STEP_CHECKING_REQUIREMENT_STATUS,
79
- inProgressMessage: `Checking status of all requirements for ${serverName}`,
80
- endMessage: (ready) => ready ? `Requirements for ${serverName} in ${categoryName} are already installed.` : 'Requirements check completed. Some requirements need installation.',
81
- });
82
- // If requirements are already installed, return null
83
- if (ready)
84
- return null;
85
- const sortedRequirements = [...serverConfig.dependencies.requirements].sort((a, b) => {
86
- const orderA = a.order ?? Infinity;
87
- const orderB = b.order ?? Infinity;
88
- return orderA - orderB;
89
- });
90
- // Use recordingAsync for the background task
91
- recoder.recordingAsync(() => this.installRequirementsInBackground(categoryName, serverName, feedConfig, sortedRequirements, options, recoder), {
92
- stepName: RecordingConstants.STEP_INSTALLING_REQUIREMENTS_IN_BACKGROUND,
93
- inProgressMessage: 'Starting background installation of requirements.',
94
- endMessage: () => 'Background installation of requirements completed.',
95
- onError: (err) => {
96
- const errorMsg = `Error in background requirement installations for ${serverName} in ${categoryName}: ${err instanceof Error ? err.message : String(err)}`;
97
- Logger.error(errorMsg);
98
- return errorMsg; // This message will be recorded for the 'failed' step
99
- }
100
- });
101
- // The main operation returns null as installation is happening in background
102
- return null;
103
- }, {
104
- stepName: RecordingConstants.STEP_CHECK_AND_INSTALL_REQUIREMENTS,
105
- inProgressMessage: `Checking and installing requirements for ${serverName}`,
106
- endMessage: (result) => result?.success === false ? `Requirement check/install failed: ${result.message}` : `Requirement check and install process for ${serverName} completed.`,
107
- onResult: (result) => result === null || result.success !== false // Success if null (bg install) or result.success is not false
108
- });
109
- }
110
- /**
111
- * Installs requirements in background without blocking the main thread.
112
- * Requirements with the same order are installed in parallel.
113
- * @param categoryName The category name.
114
- * @param feedConfig The feed configuration.
115
- * @param sortedRequirements Array of requirements sorted by order.
116
- * @param options The installation options.
117
- */
118
- async installRequirementsInBackground(categoryName, serverName, feedConfig, sortedRequirements, options, recoder // Added recoder parameter
119
- ) {
120
- const configProvider = ConfigurationProvider.getInstance();
121
- const requirementGroups = sortedRequirements.reduce((groups, req) => {
122
- const order = req.order ?? Infinity;
123
- if (!groups[order]) {
124
- groups[order] = [];
125
- }
126
- groups[order].push(req);
127
- return groups;
128
- }, {});
129
- const orderKeys = Object.keys(requirementGroups).map(Number).sort((a, b) => a - b);
130
- for (const order of orderKeys) {
131
- const group = requirementGroups[order];
132
- await Promise.all(group.map(async (requirement) => {
133
- const stepName = `InstallRequirement_${requirement.name}`;
134
- return recoder.recording(async () => {
135
- let requirementConfig = feedConfig.requirements?.find((r) => r.name === requirement.name);
136
- if (!requirementConfig) {
137
- requirementConfig = { name: requirement.name, version: requirement.version, type: 'npm' }; // Default
138
- const warnMsg = `Requirement ${requirement.name} not found in feed's requirements definitions for category ${categoryName}. Using default config.`;
139
- Logger.warn(warnMsg);
140
- // This case is a "completion" of this specific step with a warning, not a failure.
141
- // The recording will mark it completed, and the message will be this warning.
142
- return { installed: true, message: warnMsg, type: requirementConfig.type, name: requirement.name, version: requirement.version };
143
- }
144
- let currentOptions = { ...options };
145
- const currentStatus = await configProvider.getRequirementStatus(categoryName, requirement.name);
146
- if (requirementConfig.type === 'pip' && currentStatus?.pythonEnv && !currentOptions?.settings?.pythonEnv) {
147
- currentOptions = {
148
- ...currentOptions,
149
- settings: { ...currentOptions?.settings, pythonEnv: currentStatus.pythonEnv }
150
- };
151
- }
152
- const installer = this.installerFactory.getInstaller(requirementConfig);
153
- if (!installer) {
154
- const errorMsg = `No installer found for requirement type: ${requirementConfig.type}`;
155
- await this.updateRequirementFailureStatus(categoryName, requirement.name, requirementConfig.type, errorMsg);
156
- throw new Error(errorMsg); // Caught by recoder.recording
157
- }
158
- const operationId = this.generateOperationId();
159
- await this.updateRequirementProgressStatus(categoryName, requirement.name, requirementConfig.type, operationId);
160
- const installStatus = await installer.install(requirementConfig, recoder, currentOptions);
161
- const success = installStatus.installed;
162
- const message = success ? `Requirement ${requirement.name} installed successfully` : `Failed to install ${requirement.name}: ${installStatus.error || 'Unknown error'}`;
163
- await this.updateRequirementCompletionStatus(categoryName, requirement.name, installStatus, operationId);
164
- if (!success) {
165
- throw new Error(message); // Caught by recoder.recording
166
- }
167
- return { ...installStatus, message };
168
- }, {
169
- stepName: stepName,
170
- inProgressMessage: `Starting installation of ${requirement.name}`,
171
- onResult: (status) => status.installed,
172
- endMessage: (status) => status.message // Use the message from the installStatus
173
- });
174
- }));
175
- }
176
- }
177
- /**
178
- * Helper to update requirement status for failure case.
179
- * @param categoryName The category name.
180
- * @param requirementName The name of the requirement.
181
- * @param requirementType The type of the requirement.
182
- * @param errorMessage The error message.
183
- */
184
- async updateRequirementFailureStatus(categoryName, requirementName, requirementType, errorMessage) {
185
- const configProvider = ConfigurationProvider.getInstance();
186
- await configProvider.updateRequirementStatus(categoryName, requirementName, {
187
- name: requirementName, type: requirementType, installed: false, error: errorMessage,
188
- operationStatus: {
189
- status: 'failed', type: 'install', target: 'requirement',
190
- message: `Error installing requirement: ${errorMessage}`,
191
- operationId: this.generateOperationId()
192
- }
193
- });
194
- }
195
- /**
196
- * Helper to update requirement status for in-progress case.
197
- * @param categoryName The category name.
198
- * @param requirementName The name of the requirement.
199
- * @param requirementType The type of the requirement.
200
- * @param operationId The operation ID.
201
- */
202
- async updateRequirementProgressStatus(categoryName, requirementName, requirementType, operationId) {
203
- const configProvider = ConfigurationProvider.getInstance();
204
- await configProvider.updateRequirementStatus(categoryName, requirementName, {
205
- name: requirementName, type: requirementType, installed: false, inProgress: true,
206
- operationStatus: {
207
- status: 'in-progress', type: 'install', target: 'requirement',
208
- message: `Installing requirement: ${requirementName}`, operationId
209
- }
210
- });
211
- }
212
- /**
213
- * Helper to update requirement status for completion case.
214
- * @param categoryName The category name.
215
- * @param requirementName The name of the requirement.
216
- * @param installStatus The installation status.
217
- * @param operationId The operation ID.
218
- */
219
- async updateRequirementCompletionStatus(categoryName, requirementName, installStatus, operationId) {
220
- const configProvider = ConfigurationProvider.getInstance();
221
- await configProvider.updateRequirementStatus(categoryName, requirementName, {
222
- ...installStatus,
223
- operationStatus: {
224
- status: installStatus.installed ? 'completed' : 'failed',
225
- type: 'install', target: 'requirement',
226
- message: installStatus.installed
227
- ? `Requirement ${requirementName} installed successfully`
228
- : `Failed to install ${requirementName}`,
229
- operationId
230
- }
231
- });
232
- }
233
- /**
234
- * Validate a requirement configuration.
235
- * @param requirement The requirement to validate.
236
- * @throws Error if the requirement is invalid.
237
- */
238
- validateRequirement(requirement) {
239
- if (!requirement.name) {
240
- throw new Error('Requirement name is required');
241
- }
242
- if (!requirement.type) {
243
- throw new Error('Requirement type is required');
244
- }
245
- if (requirement.type === 'other' && !requirement.registry) {
246
- throw new Error('Registry must be specified for requirement type "other"');
247
- }
248
- if (requirement.registry) {
249
- const { githubRelease, artifacts } = requirement.registry;
250
- if (githubRelease) {
251
- if (!githubRelease.repository) {
252
- throw new Error('Repository is required for GitHub release registry');
253
- }
254
- if (!githubRelease.assetName) {
255
- throw new Error('Asset name is required for GitHub release registry');
256
- }
257
- }
258
- if (artifacts) {
259
- if (!artifacts.registryUrl) {
260
- throw new Error('Registry URL is required for artifacts registry');
261
- }
262
- }
263
- }
264
- }
265
- /**
266
- * Check for updates to requirements for all server categories
267
- * This method is called periodically to check for updates
268
- */
269
- async checkRequirementForUpdateAsync() {
270
- const allCategories = await configProvider.getServerCategories();
271
- allCategories.forEach(async (serverCategory) => {
272
- // Start async check for requirement updates if one isn't already in progress
273
- if (serverCategory && serverCategory.feedConfiguration && serverCategory.name) {
274
- // Check if update is already in progress using the tracker
275
- const shouldCheckForUpdates = await updateCheckTracker.startOperation(serverCategory.name);
276
- if (shouldCheckForUpdates) {
277
- Logger.info(`Checking the status of requirements in ${serverCategory.name}`);
278
- this.checkRequirementsForUpdateInternal(serverCategory).catch(error => {
279
- // Ensure we mark the operation as complete on error
280
- if (serverCategory.name) {
281
- updateCheckTracker.endOperation(serverCategory.name)
282
- .catch(lockError => console.error(`Failed to mark update check as complete: ${lockError.message}`));
283
- }
284
- Logger.error(`Error checking requirements for updates: ${error.message}`);
285
- });
286
- }
287
- else {
288
- Logger.debug(`Update check already in progress for ${serverCategory.name}, skipping`);
289
- }
290
- }
291
- });
292
- }
293
- /**
294
- * Check for updates to requirements for a specific server category
295
- * @param categoryName The name of the server category
296
- * @param serverName The name of the server (optional)
297
- */
298
- async checkServerRequirementForUpdateAsync(categoryName, serverName) {
299
- const serverCategory = await configProvider.getServerCategory(categoryName);
300
- if (!serverCategory) {
301
- Logger.error(`Server category ${categoryName} not found`);
302
- return;
303
- }
304
- const shouldCheckForUpdates = await updateCheckTracker.startOperation(`${serverCategory.name}:${serverName}`);
305
- if (shouldCheckForUpdates) {
306
- this.checkRequirementsForUpdateInternal(serverCategory, serverName)
307
- .then(() => {
308
- // Mark the operation as complete
309
- updateCheckTracker.endOperation(`${serverCategory.name}:${serverName}`)
310
- .catch(lockError => console.error(`Failed to mark update check as complete: ${lockError.message}`));
311
- })
312
- .catch(error => {
313
- // Ensure we mark the operation as complete on error
314
- updateCheckTracker.endOperation(`${serverCategory.name}:${serverName}`)
315
- .catch(lockError => console.error(`Failed to mark update check as complete: ${lockError.message}`));
316
- Logger.error(`Error checking requirements for updates: ${error.message}`);
317
- });
318
- }
319
- }
320
- /**
321
- * Check for updates to requirements for a server category
322
- * @param serverCategory The server category to check
323
- * @param serverName The name of the server (optional). When serverName is provided, check the requirement always
324
- * @private
325
- */
326
- async checkRequirementsForUpdateInternal(serverCategory, serverName) {
327
- if (!serverCategory.name || !serverCategory.feedConfiguration?.requirements?.length) {
328
- return;
329
- }
330
- try {
331
- for (const requirement of serverCategory.feedConfiguration.requirements) {
332
- if (requirement.version.includes('latest')) {
333
- // Get current status if available
334
- const currentStatus = serverCategory.installationStatus?.requirementsStatus[requirement.name];
335
- if (!currentStatus)
336
- continue;
337
- let providedServerName = serverName;
338
- if (providedServerName) {
339
- // If serverName is provided, check if the requirement is associated with that server
340
- Logger.debug(`Checking whether requirement ${requirement.name} has update for server ${serverName}`);
341
- const serverConfig = serverCategory.feedConfiguration.mcpServers.find((s) => s.name === serverName);
342
- if (!serverConfig?.dependencies?.requirements?.some((r) => r.name == requirement.name)) {
343
- Logger.debug(`Requirement ${requirement.name} is not associated with server ${serverName}. Skipping update check.`);
344
- continue;
345
- }
346
- }
347
- else {
348
- providedServerName = serverCategory.feedConfiguration.mcpServers.find((s) => s.dependencies?.requirements?.some((r) => r.name == requirement.name))?.name;
349
- }
350
- if (!providedServerName) {
351
- // We need to find the server name for the requirement, if not able to find, skip as the requirement is not associated with any server
352
- Logger.debug(`No server using requirement ${requirement.name}. Skipping update check.`);
353
- continue;
354
- }
355
- // Check for updates
356
- const updatedStatus = await this.checkRequirementForUpdates(requirement, currentStatus, serverCategory.name, providedServerName);
357
- // If update information is found, update the configuration
358
- if (updatedStatus.availableUpdate && serverCategory.name) {
359
- await configProvider.updateRequirementStatus(serverCategory.name, requirement.name, updatedStatus);
360
- // Also update the in-memory status for immediate use
361
- if (serverCategory.installationStatus?.requirementsStatus) {
362
- serverCategory.installationStatus.requirementsStatus[requirement.name] = updatedStatus;
363
- }
364
- }
365
- currentStatus.lastCheckTime = new Date().toISOString();
366
- await configProvider.updateRequirementStatus(serverCategory.name, requirement.name, currentStatus);
367
- if (serverCategory.installationStatus?.requirementsStatus) {
368
- serverCategory.installationStatus.requirementsStatus[requirement.name] = updatedStatus;
369
- }
370
- }
371
- }
372
- }
373
- catch (error) {
374
- Logger.error(`Error checking requirements for updates: ${error instanceof Error ? error.message : String(error)}`);
375
- throw error; // Re-throw the error to be handled by the caller
376
- }
377
- }
378
- /**
379
- * Check the installation status of a requirement
380
- * @param requirement The requirement to check
381
- * @param options Optional installation options
382
- * @returns The installation status
383
- */
384
- async checkRequirementStatus(requirement, options) {
385
- this.validateRequirement(requirement);
386
- return await this.installerFactory.checkInstallation(requirement, options);
387
- }
388
- /**
389
- * Check if updates are available for a requirement
390
- * @param requirement The requirement to check for updates
391
- * @param currentStatus The current status of the requirement
392
- * @param categoryName The category name
393
- * @param serverName The server name (optional)
394
- * @returns Updated status with available updates information
395
- */
396
- async checkRequirementForUpdates(requirement, currentStatus, categoryName, serverName) {
397
- this.validateRequirement(requirement);
398
- const installer = this.installerFactory.getInstaller(requirement);
399
- if (!installer || !installer.supportCheckUpdates()) {
400
- return currentStatus;
401
- }
402
- var systemSettings = await systemSettingsManager.getSystemSettings();
403
- const options = requirement.type === 'pip'
404
- ? { settings: { pythonEnv: systemSettings.pythonEnvs?.[`${categoryName}:${serverName}`] || systemSettings.pythonEnvs?.system || currentStatus.pythonEnv } }
405
- : undefined;
406
- const status = await this.checkRequirementStatus(requirement, options);
407
- return await installer.checkForUpdates(requirement, status);
408
- }
409
- /**
410
- * Process requirement updates specified in serverInstallOptions.
411
- * All updates are processed in parallel for maximum efficiency.
412
- * @param categoryName The category name.
413
- * @param serverName The server name.
414
- * @param options The installation options.
415
- */
416
- async processRequirementUpdates(categoryName, serverName, options) {
417
- const operationKey = `requirement-updates-${categoryName}-${serverName}`;
418
- const canProceed = await updateCheckTracker.startOperation(operationKey);
419
- if (!canProceed) {
420
- Logger.info(`Requirement updates for ${categoryName}/${serverName} already in progress, skipping`);
421
- return;
422
- }
423
- const recoder = InstallOperationManager.getInstance(categoryName, serverName);
424
- try {
425
- await recoder.recording(async () => {
426
- const configProvider = ConfigurationProvider.getInstance();
427
- const feedConfig = await configProvider.getFeedConfiguration(categoryName);
428
- if (!feedConfig) {
429
- const errorMsg = `Feed configuration not found for category: ${categoryName}`;
430
- Logger.error(errorMsg);
431
- throw new Error(errorMsg); // This will be caught by recoder.recording
432
- }
433
- const updatePromises = options.requirements?.map(async (reqToUpdate) => {
434
- const stepName = `${RecordingConstants.STEP_INSTALL_REQUIREMENT_PREFIX}: ${reqToUpdate.name}`;
435
- return recoder.recording(async () => {
436
- let reqConfig;
437
- let currentStatus;
438
- try {
439
- reqConfig = feedConfig.requirements?.find((r) => r.name === reqToUpdate.name);
440
- if (!reqConfig) {
441
- const errorMsg = `Requirement configuration not found for: ${reqToUpdate.name}`;
442
- Logger.error(errorMsg);
443
- await configProvider.updateRequirementStatus(categoryName, reqToUpdate.name, {
444
- name: reqToUpdate.name, type: 'unknown', installed: false, inProgress: false,
445
- error: errorMsg,
446
- operationStatus: { status: 'failed', type: 'update', target: 'requirement', message: errorMsg }
447
- });
448
- throw new Error(errorMsg);
449
- }
450
- currentStatus = await configProvider.getRequirementStatus(categoryName, reqToUpdate.name);
451
- if (!currentStatus) {
452
- const errorMsg = `No current status found for requirement: ${reqToUpdate.name}`;
453
- Logger.error(errorMsg);
454
- await configProvider.updateRequirementStatus(categoryName, reqToUpdate.name, {
455
- name: reqToUpdate.name, type: reqConfig.type, installed: false, inProgress: false,
456
- error: errorMsg,
457
- operationStatus: { status: 'failed', type: 'update', target: 'requirement', message: errorMsg }
458
- });
459
- throw new Error(errorMsg);
460
- }
461
- Logger.info(`Updating ${reqToUpdate.name} from ${currentStatus.version || 'unknown'} to ${reqToUpdate.version}`);
462
- await configProvider.updateRequirementStatus(categoryName, reqToUpdate.name, {
463
- ...currentStatus, name: reqToUpdate.name,
464
- type: currentStatus.type || reqConfig.type || 'unknown',
465
- installed: currentStatus.installed || false, inProgress: true,
466
- operationStatus: {
467
- status: 'in-progress', type: 'update', target: 'requirement',
468
- message: `Updating ${reqToUpdate.name} from ${currentStatus.version || 'unknown'} to ${reqToUpdate.version}`
469
- }
470
- });
471
- let currentOptions = { ...options };
472
- if (reqConfig.type === 'pip' && currentStatus.pythonEnv && !currentOptions?.settings?.pythonEnv) {
473
- currentOptions = {
474
- ...currentOptions,
475
- settings: { ...currentOptions?.settings, pythonEnv: currentStatus.pythonEnv }
476
- };
477
- }
478
- const updatedStatus = await this.updateRequirement(reqConfig, reqToUpdate.version, recoder, currentOptions);
479
- const successMessage = `Successfully updated ${reqToUpdate.name} to version ${reqToUpdate.version}`;
480
- const failureMessage = `Failed to update ${reqToUpdate.name} to version ${reqToUpdate.version}. Error: ${updatedStatus.error || 'Unknown'}`;
481
- await configProvider.updateRequirementStatus(categoryName, reqToUpdate.name, {
482
- ...updatedStatus, name: reqToUpdate.name,
483
- type: updatedStatus.type || currentStatus.type || reqConfig.type || 'unknown',
484
- installed: updatedStatus.installed, inProgress: false,
485
- operationStatus: {
486
- status: updatedStatus.installed ? 'completed' : 'failed',
487
- type: 'update', target: 'requirement',
488
- message: updatedStatus.installed ? successMessage : failureMessage
489
- },
490
- availableUpdate: updatedStatus.installed ? undefined : currentStatus.availableUpdate
491
- });
492
- if (!updatedStatus.installed) {
493
- Logger.error(failureMessage);
494
- throw new Error(failureMessage);
495
- }
496
- Logger.info(successMessage);
497
- return updatedStatus;
498
- }
499
- catch (error) {
500
- const errorMsg = `Error updating requirement ${reqToUpdate.name}: ${error instanceof Error ? error.message : String(error)}`;
501
- Logger.error(errorMsg);
502
- await configProvider.updateRequirementStatus(categoryName, reqToUpdate.name, {
503
- name: reqToUpdate.name,
504
- type: reqConfig?.type || currentStatus?.type || 'unknown',
505
- installed: false, inProgress: false,
506
- error: error instanceof Error ? error.message : String(error),
507
- operationStatus: { status: 'failed', type: 'update', target: 'requirement', message: errorMsg }
508
- });
509
- throw error; // Re-throw to be handled by recoder.recording
510
- }
511
- }, {
512
- stepName: stepName,
513
- inProgressMessage: `Processing update for requirement ${reqToUpdate.name}`,
514
- onResult: (status) => status.installed, // status is the returned updatedStatus
515
- });
516
- });
517
- if (updatePromises) {
518
- await Promise.all(updatePromises);
519
- }
520
- }, {
521
- stepName: RecordingConstants.STEP_PROCESS_REQUIREMENT_UPDATES,
522
- inProgressMessage: `Starting to process requirement updates for ${serverName}`,
523
- // If fn() succeeds, data is void. If fn() throws, recording() uses the error message.
524
- endMessage: () => `Finished processing requirement updates for ${serverName}`
525
- });
526
- }
527
- finally {
528
- await updateCheckTracker.endOperation(operationKey);
529
- }
530
- }
531
- /**
532
- * Update a requirement to a new version
533
- * @param requirement The requirement configuration
534
- * @param updateVersion The version to update to
535
- * @param options Optional installation options
536
- * @returns The updated requirement status
537
- */
538
- async updateRequirement(requirement, updateVersion, recorder, options) {
539
- this.validateRequirement(requirement);
540
- const updatedRequirement = {
541
- ...requirement,
542
- version: requirement.version.includes('latest') ? requirement.version : updateVersion,
543
- };
544
- return await this.installerFactory.install(updatedRequirement, recorder, options);
545
- }
546
- }
547
- // Export a singleton instance
548
- export const requirementService = RequirementService.getInstance();
1
+ import{createInstallerFactory}from"../core/installers/index.js";import{exec}from"child_process";import util from"util";import{configProvider,ConfigurationProvider}from"../core/loaders/ConfigurationProvider.js";import{Logger}from"../utils/logger.js";import{updateCheckTracker}from"../utils/UpdateCheckTracker.js";import{InstallOperationManager}from"../core/loaders/InstallOperationManager.js";import*as RecordingConstants from"../core/metadatas/recordingConstants.js";import{systemSettingsManager}from"../core/loaders/SystemSettingsManager.js";export class RequirementService{static instance;installerFactory;constructor(){this.installerFactory=createInstallerFactory(util.promisify(exec))}static getInstance(){return RequirementService.instance||(RequirementService.instance=new RequirementService),RequirementService.instance}generateOperationId(){return`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}async checkAndInstallRequirements(e,t,r){const n=InstallOperationManager.getInstance(e,t);return n.recording((async()=>{const a=ConfigurationProvider.getInstance(),s=await a.getFeedConfiguration(e);if(!s){const e="Feed configuration not found";return{success:!1,message:e,status:[{status:"failed",type:"install",target:"server",message:e}]}}const i=s.mcpServers.find((e=>e.name===t));if(!i?.dependencies?.requirements||0===i.dependencies.requirements.length){const r=`No requirements for ${t} in category ${e}`;return Logger.debug(r),await n.recordStep(RecordingConstants.STEP_CHECKING_REQUIREMENT_STATUS,"completed",r),null}if(await n.recording((async()=>{await n.recordStep(RecordingConstants.STEP_CHECKING_REQUIREMENT_STATUS,"in-progress","Checking status of all requirements.");const o=await Promise.all(i.dependencies.requirements.map((async e=>{const t=s.requirements?.find((t=>t.name===e.name))||{name:e.name,version:e.version,type:"npm"};return await this.installerFactory.checkInstallation(t,r)}))),u=await a.isRequirementsReady(e,t);for(const t of o)t.installed&&!u?await a.updateRequirementStatus(e,t.name,{...t,installed:!0}):!t.installed&&u&&await a.updateRequirementStatus(e,t.name,{...t,installed:!1});return o.every((e=>e.installed))}),{stepName:RecordingConstants.STEP_CHECKING_REQUIREMENT_STATUS,inProgressMessage:`Checking status of all requirements for ${t}`,endMessage:r=>r?`Requirements for ${t} in ${e} are already installed.`:"Requirements check completed. Some requirements need installation."}))return null;const o=[...i.dependencies.requirements].sort(((e,t)=>(e.order??1/0)-(t.order??1/0)));return n.recordingAsync((()=>this.installRequirementsInBackground(e,t,s,o,r,n)),{stepName:RecordingConstants.STEP_INSTALLING_REQUIREMENTS_IN_BACKGROUND,inProgressMessage:"Starting background installation of requirements.",endMessage:()=>"Background installation of requirements completed.",onError:r=>{const n=`Error in background requirement installations for ${t} in ${e}: ${r instanceof Error?r.message:String(r)}`;return Logger.error(n),n}}),null}),{stepName:RecordingConstants.STEP_CHECK_AND_INSTALL_REQUIREMENTS,inProgressMessage:`Checking and installing requirements for ${t}`,endMessage:e=>!1===e?.success?`Requirement check/install failed: ${e.message}`:`Requirement check and install process for ${t} completed.`,onResult:e=>null===e||!1!==e.success})}async installRequirementsInBackground(e,t,r,n,a,s){const i=ConfigurationProvider.getInstance(),o=n.reduce(((e,t)=>{const r=t.order??1/0;return e[r]||(e[r]=[]),e[r].push(t),e}),{}),u=Object.keys(o).map(Number).sort(((e,t)=>e-t));for(const t of u){const n=o[t];await Promise.all(n.map((async t=>{const n=`InstallRequirement_${t.name}`;return s.recording((async()=>{let n=r.requirements?.find((e=>e.name===t.name));if(!n){n={name:t.name,version:t.version,type:"npm"};const r=`Requirement ${t.name} not found in feed's requirements definitions for category ${e}. Using default config.`;return Logger.warn(r),{installed:!0,message:r,type:n.type,name:t.name,version:t.version}}let o={...a};const u=await i.getRequirementStatus(e,t.name);"pip"===n.type&&u?.pythonEnv&&!o?.settings?.pythonEnv&&(o={...o,settings:{...o?.settings,pythonEnv:u.pythonEnv}});const c=this.installerFactory.getInstaller(n);if(!c){const r=`No installer found for requirement type: ${n.type}`;throw await this.updateRequirementFailureStatus(e,t.name,n.type,r),new Error(r)}const m=this.generateOperationId();await this.updateRequirementProgressStatus(e,t.name,n.type,m);const l=await c.install(n,s,o),g=l.installed,d=g?`Requirement ${t.name} installed successfully`:`Failed to install ${t.name}: ${l.error||"Unknown error"}`;if(await this.updateRequirementCompletionStatus(e,t.name,l,m),!g)throw new Error(d);return{...l,message:d}}),{stepName:n,inProgressMessage:`Starting installation of ${t.name}`,onResult:e=>e.installed,endMessage:e=>e.message})})))}}async updateRequirementFailureStatus(e,t,r,n){const a=ConfigurationProvider.getInstance();await a.updateRequirementStatus(e,t,{name:t,type:r,installed:!1,error:n,operationStatus:{status:"failed",type:"install",target:"requirement",message:`Error installing requirement: ${n}`,operationId:this.generateOperationId()}})}async updateRequirementProgressStatus(e,t,r,n){const a=ConfigurationProvider.getInstance();await a.updateRequirementStatus(e,t,{name:t,type:r,installed:!1,inProgress:!0,operationStatus:{status:"in-progress",type:"install",target:"requirement",message:`Installing requirement: ${t}`,operationId:n}})}async updateRequirementCompletionStatus(e,t,r,n){const a=ConfigurationProvider.getInstance();await a.updateRequirementStatus(e,t,{...r,operationStatus:{status:r.installed?"completed":"failed",type:"install",target:"requirement",message:r.installed?`Requirement ${t} installed successfully`:`Failed to install ${t}`,operationId:n}})}validateRequirement(e){if(!e.name)throw new Error("Requirement name is required");if(!e.type)throw new Error("Requirement type is required");if("other"===e.type&&!e.registry)throw new Error('Registry must be specified for requirement type "other"');if(e.registry){const{githubRelease:t,artifacts:r}=e.registry;if(t){if(!t.repository)throw new Error("Repository is required for GitHub release registry");if(!t.assetName)throw new Error("Asset name is required for GitHub release registry")}if(r&&!r.registryUrl)throw new Error("Registry URL is required for artifacts registry")}}async checkRequirementForUpdateAsync(){(await configProvider.getServerCategories()).forEach((async e=>{e&&e.feedConfiguration&&e.name&&(await updateCheckTracker.startOperation(e.name)?(Logger.info(`Checking the status of requirements in ${e.name}`),this.checkRequirementsForUpdateInternal(e).catch((t=>{e.name&&updateCheckTracker.endOperation(e.name).catch((e=>{})),Logger.error(`Error checking requirements for updates: ${t.message}`)}))):Logger.debug(`Update check already in progress for ${e.name}, skipping`))}))}async checkServerRequirementForUpdateAsync(e,t){const r=await configProvider.getServerCategory(e);r?await updateCheckTracker.startOperation(`${r.name}:${t}`)&&this.checkRequirementsForUpdateInternal(r,t).then((()=>{updateCheckTracker.endOperation(`${r.name}:${t}`).catch((e=>{}))})).catch((e=>{updateCheckTracker.endOperation(`${r.name}:${t}`).catch((e=>{})),Logger.error(`Error checking requirements for updates: ${e.message}`)})):Logger.error(`Server category ${e} not found`)}async checkRequirementsForUpdateInternal(e,t){if(e.name&&e.feedConfiguration?.requirements?.length)try{for(const r of e.feedConfiguration.requirements)if(r.version.includes("latest")){const n=e.installationStatus?.requirementsStatus[r.name];if(!n)continue;let a=t;if(a){Logger.debug(`Checking whether requirement ${r.name} has update for server ${t}`);const n=e.feedConfiguration.mcpServers.find((e=>e.name===t));if(!n?.dependencies?.requirements?.some((e=>e.name==r.name))){Logger.debug(`Requirement ${r.name} is not associated with server ${t}. Skipping update check.`);continue}}else a=e.feedConfiguration.mcpServers.find((e=>e.dependencies?.requirements?.some((e=>e.name==r.name))))?.name;if(!a){Logger.debug(`No server using requirement ${r.name}. Skipping update check.`);continue}const s=await this.checkRequirementForUpdates(r,n,e.name,a);s.availableUpdate&&e.name&&(await configProvider.updateRequirementStatus(e.name,r.name,s),e.installationStatus?.requirementsStatus&&(e.installationStatus.requirementsStatus[r.name]=s)),n.lastCheckTime=(new Date).toISOString(),await configProvider.updateRequirementStatus(e.name,r.name,n),e.installationStatus?.requirementsStatus&&(e.installationStatus.requirementsStatus[r.name]=s)}}catch(e){throw Logger.error(`Error checking requirements for updates: ${e instanceof Error?e.message:String(e)}`),e}}async checkRequirementStatus(e,t){return this.validateRequirement(e),await this.installerFactory.checkInstallation(e,t)}async checkRequirementForUpdates(e,t,r,n){this.validateRequirement(e);const a=this.installerFactory.getInstaller(e);if(!a||!a.supportCheckUpdates())return t;var s=await systemSettingsManager.getSystemSettings();const i="pip"===e.type?{settings:{pythonEnv:s.pythonEnvs?.[`${r}:${n}`]||s.pythonEnvs?.system||t.pythonEnv}}:void 0,o=await this.checkRequirementStatus(e,i);return await a.checkForUpdates(e,o)}async processRequirementUpdates(e,t,r){const n=`requirement-updates-${e}-${t}`;if(!await updateCheckTracker.startOperation(n))return void Logger.info(`Requirement updates for ${e}/${t} already in progress, skipping`);const a=InstallOperationManager.getInstance(e,t);try{await a.recording((async()=>{const t=ConfigurationProvider.getInstance(),n=await t.getFeedConfiguration(e);if(!n){const t=`Feed configuration not found for category: ${e}`;throw Logger.error(t),new Error(t)}const s=r.requirements?.map((async s=>{const i=`${RecordingConstants.STEP_INSTALL_REQUIREMENT_PREFIX}: ${s.name}`;return a.recording((async()=>{let i,o;try{if(i=n.requirements?.find((e=>e.name===s.name)),!i){const r=`Requirement configuration not found for: ${s.name}`;throw Logger.error(r),await t.updateRequirementStatus(e,s.name,{name:s.name,type:"unknown",installed:!1,inProgress:!1,error:r,operationStatus:{status:"failed",type:"update",target:"requirement",message:r}}),new Error(r)}if(o=await t.getRequirementStatus(e,s.name),!o){const r=`No current status found for requirement: ${s.name}`;throw Logger.error(r),await t.updateRequirementStatus(e,s.name,{name:s.name,type:i.type,installed:!1,inProgress:!1,error:r,operationStatus:{status:"failed",type:"update",target:"requirement",message:r}}),new Error(r)}Logger.info(`Updating ${s.name} from ${o.version||"unknown"} to ${s.version}`),await t.updateRequirementStatus(e,s.name,{...o,name:s.name,type:o.type||i.type||"unknown",installed:o.installed||!1,inProgress:!0,operationStatus:{status:"in-progress",type:"update",target:"requirement",message:`Updating ${s.name} from ${o.version||"unknown"} to ${s.version}`}});let u={...r};"pip"===i.type&&o.pythonEnv&&!u?.settings?.pythonEnv&&(u={...u,settings:{...u?.settings,pythonEnv:o.pythonEnv}});const c=await this.updateRequirement(i,s.version,a,u),m=`Successfully updated ${s.name} to version ${s.version}`,l=`Failed to update ${s.name} to version ${s.version}. Error: ${c.error||"Unknown"}`;if(await t.updateRequirementStatus(e,s.name,{...c,name:s.name,type:c.type||o.type||i.type||"unknown",installed:c.installed,inProgress:!1,operationStatus:{status:c.installed?"completed":"failed",type:"update",target:"requirement",message:c.installed?m:l},availableUpdate:c.installed?void 0:o.availableUpdate}),!c.installed)throw Logger.error(l),new Error(l);return Logger.info(m),c}catch(r){const n=`Error updating requirement ${s.name}: ${r instanceof Error?r.message:String(r)}`;throw Logger.error(n),await t.updateRequirementStatus(e,s.name,{name:s.name,type:i?.type||o?.type||"unknown",installed:!1,inProgress:!1,error:r instanceof Error?r.message:String(r),operationStatus:{status:"failed",type:"update",target:"requirement",message:n}}),r}}),{stepName:i,inProgressMessage:`Processing update for requirement ${s.name}`,onResult:e=>e.installed})}));s&&await Promise.all(s)}),{stepName:RecordingConstants.STEP_PROCESS_REQUIREMENT_UPDATES,inProgressMessage:`Starting to process requirement updates for ${t}`,endMessage:()=>`Finished processing requirement updates for ${t}`})}finally{await updateCheckTracker.endOperation(n)}}async updateRequirement(e,t,r,n){this.validateRequirement(e);const a={...e,version:e.version.includes("latest")?e.version:t};return await this.installerFactory.install(a,r,n)}}export const requirementService=RequirementService.getInstance();
549
2
  //# sourceMappingURL=RequirementService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createInstallerFactory","exec","util","configProvider","ConfigurationProvider","Logger","updateCheckTracker","InstallOperationManager","RecordingConstants","systemSettingsManager","RequirementService","static","installerFactory","constructor","this","promisify","getInstance","instance","generateOperationId","Date","now","Math","random","toString","substr","checkAndInstallRequirements","categoryName","serverName","options","recoder","recording","async","feedConfig","getFeedConfiguration","errorMsg","success","message","status","type","target","serverConfig","mcpServers","find","s","name","dependencies","requirements","length","msg","debug","recordStep","STEP_CHECKING_REQUIREMENT_STATUS","requirementStatuses","Promise","all","map","req","reqConfig","r","version","checkInstallation","requirementsReady","isRequirementsReady","installed","updateRequirementStatus","every","stepName","inProgressMessage","endMessage","ready","sortedRequirements","sort","a","b","order","Infinity","recordingAsync","installRequirementsInBackground","STEP_INSTALLING_REQUIREMENTS_IN_BACKGROUND","onError","err","Error","String","error","STEP_CHECK_AND_INSTALL_REQUIREMENTS","result","onResult","requirementGroups","reduce","groups","push","orderKeys","Object","keys","Number","group","requirement","requirementConfig","warnMsg","warn","currentOptions","currentStatus","getRequirementStatus","pythonEnv","settings","installer","getInstaller","updateRequirementFailureStatus","operationId","updateRequirementProgressStatus","installStatus","install","updateRequirementCompletionStatus","requirementName","requirementType","errorMessage","operationStatus","inProgress","validateRequirement","registry","githubRelease","artifacts","repository","assetName","registryUrl","checkRequirementForUpdateAsync","getServerCategories","forEach","serverCategory","feedConfiguration","startOperation","info","checkRequirementsForUpdateInternal","catch","endOperation","lockError","checkServerRequirementForUpdateAsync","getServerCategory","then","includes","installationStatus","requirementsStatus","providedServerName","some","updatedStatus","checkRequirementForUpdates","availableUpdate","lastCheckTime","toISOString","checkRequirementStatus","supportCheckUpdates","systemSettings","getSystemSettings","pythonEnvs","system","undefined","checkForUpdates","processRequirementUpdates","operationKey","updatePromises","reqToUpdate","STEP_INSTALL_REQUIREMENT_PREFIX","updateRequirement","successMessage","failureMessage","STEP_PROCESS_REQUIREMENT_UPDATES","updateVersion","recorder","updatedRequirement","requirementService"],"sources":["../../src/services/RequirementService.ts"],"mappings":"OAUSA,2BAAgD,qCAChDC,SAAY,uBACdC,SAAU,cACRC,eAAgBC,0BAA6B,kDAC7CC,WAAc,4BACdC,uBAA0B,wCAC1BC,4BAA+B,uDAE5BC,uBAAwB,iDAC3BC,0BAA6B,kDAIhC,MAAOC,mBACDC,gBACAC,iBAER,WAAAC,GACIC,KAAKF,iBAAmBZ,uBAAuBE,KAAKa,UAAUd,MAClE,CAMO,kBAAOe,GAIV,OAHKN,mBAAmBO,WACpBP,mBAAmBO,SAAW,IAAIP,oBAE/BA,mBAAmBO,QAC9B,CAEQ,mBAAAC,GACJ,MAAO,WAAWC,KAAKC,SAASC,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAG,IACzE,CASO,iCAAMC,CAA4BC,EAAsBC,EAAoBC,GAC/E,MAAMC,EAAUtB,wBAAwBS,YAAYU,EAAcC,GAElE,OAAOE,EAAQC,WAAUC,UACrB,MAAM5B,EAAiBC,sBAAsBY,cACvCgB,QAAmB7B,EAAe8B,qBAAqBP,GAE7D,IAAKM,EAAY,CACb,MAAME,EAAW,+BAEjB,MAAO,CACHC,SAAS,EAAOC,QAASF,EACzBG,OAAQ,CAAC,CAAEA,OAAQ,SAAUC,KAAM,UAAWC,OAAQ,SAAUH,QAASF,IAEjF,CAGA,MAAMM,EAAeR,EAAWS,WAAWC,MAAMC,GAAiBA,EAAEC,OAASjB,IAC7E,IAAKa,GAAcK,cAAcC,cAAkE,IAAlDN,EAAaK,aAAaC,aAAaC,OAAc,CAClG,MAAMC,EAAM,uBAAuBrB,iBAA0BD,IAG7D,OAFArB,OAAO4C,MAAMD,SACPnB,EAAQqB,WAAW1C,mBAAmB2C,iCAAkC,YAAaH,GACpF,IACX,CAiCA,SA/BoBnB,EAAQC,WACxBC,gBACUF,EAAQqB,WAAW1C,mBAAmB2C,iCAAkC,cAAe,wCAC7F,MAAMC,QAA4BC,QAAQC,IACtCd,EAAaK,aAAcC,aAAcS,KAAIxB,MAAOyB,IAChD,MAAMC,EAAYzB,EAAWc,cAAcJ,MAAMgB,GAAyBA,EAAEd,OAASY,EAAIZ,QAAS,CAC9FA,KAAMY,EAAIZ,KAAMe,QAASH,EAAIG,QAASrB,KAAM,OAEhD,aAAaxB,KAAKF,iBAAiBgD,kBAAkBH,EAAW7B,EAAQ,KAI1EiC,QAA0B1D,EAAe2D,oBAAoBpC,EAAcC,GACjF,IAAK,MAAMU,KAAUe,EACbf,EAAO0B,YAAcF,QACf1D,EAAe6D,wBAAwBtC,EAAcW,EAAOO,KAAM,IAAKP,EAAQ0B,WAAW,KACxF1B,EAAO0B,WAAaF,SACtB1D,EAAe6D,wBAAwBtC,EAAcW,EAAOO,KAAM,IAAKP,EAAQ0B,WAAW,IAIxG,OAAOX,EAAoBa,OAAM5B,GAAUA,EAAO0B,WAAU,GAEhE,CACIG,SAAU1D,mBAAmB2C,iCAC7BgB,kBAAmB,2CAA2CxC,IAC9DyC,WAAaC,GAAUA,EAAQ,oBAAoB1C,QAAiBD,2BAAwC,uEAKzG,OAAO,KAElB,MAAM4C,EAAqB,IAAI9B,EAAaK,aAAaC,cAAcyB,MAAK,CAACC,EAAGC,KAC7DD,EAAEE,OAASC,MACXF,EAAEC,OAASC,OAmB9B,OAdA9C,EAAQ+C,gBACJ,IAAM9D,KAAK+D,gCAAgCnD,EAAcC,EAAYK,EAAYsC,EAAoB1C,EAASC,IAC9G,CACIqC,SAAU1D,mBAAmBsE,2CAC7BX,kBAAmB,oDACnBC,WAAY,IAAM,qDAClBW,QAAUC,IACN,MAAM9C,EAAW,qDAAqDP,QAAiBD,MAAiBsD,aAAeC,MAAQD,EAAI5C,QAAU8C,OAAOF,KAEpJ,OADA3E,OAAO8E,MAAMjD,GACNA,CAAQ,IAKpB,IAAI,GACZ,CACCgC,SAAU1D,mBAAmB4E,oCAC7BjB,kBAAmB,4CAA4CxC,IAC/DyC,WAAaiB,IAA+B,IAApBA,GAAQlD,QAAoB,qCAAqCkD,EAAOjD,UAAY,6CAA6CT,eACzJ2D,SAAWD,GAAsB,OAAXA,IAAsC,IAAnBA,EAAOlD,SAExD,CAUQ,qCAAM0C,CACVnD,EACAC,EACAK,EACAsC,EACA1C,EACAC,GAEA,MAAM1B,EAAiBC,sBAAsBY,cAEvCuE,EAAoBjB,EAAmBkB,QAA0C,CAACC,EAAQjC,KAC5F,MAAMkB,EAAQlB,EAAIkB,OAASC,IAK3B,OAJKc,EAAOf,KACRe,EAAOf,GAAS,IAEpBe,EAAOf,GAAOgB,KAAKlC,GACZiC,CAAM,GACd,IAEGE,EAAYC,OAAOC,KAAKN,GAAmBhC,IAAIuC,QAAQvB,MAAK,CAACC,EAAGC,IAAMD,EAAIC,IAChF,IAAK,MAAMC,KAASiB,EAAW,CAC3B,MAAMI,EAAQR,EAAkBb,SAC1BrB,QAAQC,IAAIyC,EAAMxC,KAAIxB,MAAMiE,IAC9B,MAAM9B,EAAW,sBAAsB8B,EAAYpD,OACnD,OAAOf,EAAQC,WAAUC,UACrB,IAAIkE,EAAoBjE,EAAWc,cAAcJ,MAAMgB,GAAyBA,EAAEd,OAASoD,EAAYpD,OACvG,IAAKqD,EAAmB,CACpBA,EAAoB,CAAErD,KAAMoD,EAAYpD,KAAMe,QAASqC,EAAYrC,QAASrB,KAAM,OAClF,MAAM4D,EAAU,eAAeF,EAAYpD,kEAAkElB,2BAI7G,OAHArB,OAAO8F,KAAKD,GAGL,CAAEnC,WAAW,EAAM3B,QAAS8D,EAAS5D,KAAM2D,EAAkB3D,KAAMM,KAAMoD,EAAYpD,KAAMe,QAASqC,EAAYrC,QAC3H,CAEA,IAAIyC,EAAiB,IAAKxE,GAC1B,MAAMyE,QAAsBlG,EAAemG,qBAAqB5E,EAAcsE,EAAYpD,MAC3D,QAA3BqD,EAAkB3D,MAAkB+D,GAAeE,YAAcH,GAAgBI,UAAUD,YAC3FH,EAAiB,IACVA,EACHI,SAAU,IAAKJ,GAAgBI,SAAUD,UAAWF,EAAcE,aAI1E,MAAME,EAAY3F,KAAKF,iBAAiB8F,aAAaT,GACrD,IAAKQ,EAAW,CACZ,MAAMvE,EAAW,4CAA4C+D,EAAkB3D,OAE/E,YADMxB,KAAK6F,+BAA+BjF,EAAcsE,EAAYpD,KAAMqD,EAAkB3D,KAAMJ,GAC5F,IAAI+C,MAAM/C,EACpB,CAEA,MAAM0E,EAAc9F,KAAKI,4BACnBJ,KAAK+F,gCAAgCnF,EAAcsE,EAAYpD,KAAMqD,EAAkB3D,KAAMsE,GAEnG,MAAME,QAAsBL,EAAUM,QAAQd,EAAmBpE,EAASuE,GACpEjE,EAAU2E,EAAc/C,UACxB3B,EAAUD,EAAU,eAAe6D,EAAYpD,8BAAgC,qBAAqBoD,EAAYpD,SAASkE,EAAc3B,OAAS,kBAGtJ,SADMrE,KAAKkG,kCAAkCtF,EAAcsE,EAAYpD,KAAMkE,EAAeF,IACvFzE,EACD,MAAM,IAAI8C,MAAM7C,GAEpB,MAAO,IAAK0E,EAAe1E,UAAS,GACrC,CACC8B,SAAUA,EACVC,kBAAmB,4BAA4B6B,EAAYpD,OAC3D0C,SAAWjD,GAAWA,EAAO0B,UAC7BK,WAAa/B,GAAWA,EAAOD,SACjC,IAEV,CACJ,CASQ,oCAAMuE,CACVjF,EAAsBuF,EAAyBC,EAAyBC,GAExE,MAAMhH,EAAiBC,sBAAsBY,oBACvCb,EAAe6D,wBAAwBtC,EAAcuF,EAAiB,CACxErE,KAAMqE,EAAiB3E,KAAM4E,EAAiBnD,WAAW,EAAOoB,MAAOgC,EACvEC,gBAAiB,CACb/E,OAAQ,SAAUC,KAAM,UAAWC,OAAQ,cAC3CH,QAAS,iCAAiC+E,IAC1CP,YAAa9F,KAAKI,wBAG9B,CASQ,qCAAM2F,CACVnF,EAAsBuF,EAAyBC,EAAyBN,GAExE,MAAMzG,EAAiBC,sBAAsBY,oBACvCb,EAAe6D,wBAAwBtC,EAAcuF,EAAiB,CACxErE,KAAMqE,EAAiB3E,KAAM4E,EAAiBnD,WAAW,EAAOsD,YAAY,EAC5ED,gBAAiB,CACb/E,OAAQ,cAAeC,KAAM,UAAWC,OAAQ,cAChDH,QAAS,2BAA2B6E,IAAmBL,gBAGnE,CASQ,uCAAMI,CACVtF,EAAsBuF,EAAyBH,EAAkCF,GAEjF,MAAMzG,EAAiBC,sBAAsBY,oBACvCb,EAAe6D,wBAAwBtC,EAAcuF,EAAiB,IACrEH,EACHM,gBAAiB,CACb/E,OAAQyE,EAAc/C,UAAY,YAAc,SAChDzB,KAAM,UAAWC,OAAQ,cACzBH,QAAS0E,EAAc/C,UACjB,eAAekD,2BACf,qBAAqBA,IAC3BL,gBAGZ,CAOQ,mBAAAU,CAAoBtB,GACxB,IAAKA,EAAYpD,KAAQ,MAAM,IAAIqC,MAAM,gCACzC,IAAKe,EAAY1D,KAAQ,MAAM,IAAI2C,MAAM,gCACzC,GAAyB,UAArBe,EAAY1D,OAAqB0D,EAAYuB,SAC7C,MAAM,IAAItC,MAAM,2DAEpB,GAAIe,EAAYuB,SAAU,CACtB,MAAMC,cAAEA,EAAaC,UAAEA,GAAczB,EAAYuB,SACjD,GAAIC,EAAe,CACf,IAAKA,EAAcE,WAAc,MAAM,IAAIzC,MAAM,sDACjD,IAAKuC,EAAcG,UAAa,MAAM,IAAI1C,MAAM,qDACpD,CACA,GAAIwC,IACKA,EAAUG,YAAe,MAAM,IAAI3C,MAAM,kDAEtD,CACJ,CAMO,oCAAM4C,UACmB1H,eAAe2H,uBAC7BC,SACVhG,MAAOiG,IAECA,GAAkBA,EAAeC,mBAAqBD,EAAepF,aAEjCtC,mBAAmB4H,eAAeF,EAAepF,OAGjFvC,OAAO8H,KAAK,0CAA0CH,EAAepF,QACrE9B,KAAKsH,mCAAmCJ,GAAgBK,OAAMlD,IAEtD6C,EAAepF,MACftC,mBAAmBgI,aAAaN,EAAepF,MAC1CyF,OAAME,IAA2F,IAE1GlI,OAAO8E,MAAM,4CAA4CA,EAAM/C,UAAU,KAG7E/B,OAAO4C,MAAM,wCAAwC+E,EAAepF,kBAE5E,GAGZ,CAOO,0CAAM4F,CAAqC9G,EAAsBC,GACpE,MAAMqG,QAAuB7H,eAAesI,kBAAkB/G,GACzDsG,QAI+B1H,mBAAmB4H,eAAe,GAAGF,EAAepF,QAAQjB,MAE5Fb,KAAKsH,mCAAmCJ,EAAgBrG,GACnD+G,MAAK,KAEFpI,mBAAmBgI,aAAa,GAAGN,EAAepF,QAAQjB,KACrD0G,OAAME,IAA2F,GAAC,IAG1GF,OAAMlD,IAEH7E,mBAAmBgI,aAAa,GAAGN,EAAepF,QAAQjB,KACrD0G,OAAME,IAA2F,IAEtGlI,OAAO8E,MAAM,4CAA4CA,EAAM/C,UAAU,IAjBjF/B,OAAO8E,MAAM,mBAAmBzD,cAoBxC,CAQQ,wCAAM0G,CAAmCJ,EAAmCrG,GAChF,GAAKqG,EAAepF,MAASoF,EAAeC,mBAAmBnF,cAAcC,OAG7E,IAEI,IAAK,MAAMiD,KAAegC,EAAeC,kBAAkBnF,aACvD,GAAIkD,EAAYrC,QAAQgF,SAAS,UAAW,CAExC,MAAMtC,EAAgB2B,EAAeY,oBAAoBC,mBAAmB7C,EAAYpD,MACxF,IAAKyD,EAAe,SAEpB,IAAIyC,EAAyCnH,EAC7C,GAAImH,EAAoB,CAEpBzI,OAAO4C,MAAM,gCAAgC+C,EAAYpD,8BAA8BjB,KACvF,MAAMa,EAAewF,EAAeC,kBAAkBxF,WAAWC,MAAMC,GAAiBA,EAAEC,OAASjB,IACnG,IAAKa,GAAcK,cAAcC,cAAciG,MAAMrF,GAAMA,EAAEd,MAAQoD,EAAYpD,OAAO,CACpFvC,OAAO4C,MAAM,eAAe+C,EAAYpD,sCAAsCjB,6BAC9E,QACJ,CACJ,MACImH,EAAqBd,EAAeC,kBAAkBxF,WAAWC,MAAMC,GAAiBA,EAAEE,cAAcC,cAAciG,MAAMrF,GAAMA,EAAEd,MAAQoD,EAAYpD,UAAQA,KAGpK,IAAKkG,EAAoB,CAErBzI,OAAO4C,MAAM,+BAA+B+C,EAAYpD,gCACxD,QACJ,CAEA,MAAMoG,QAAsBlI,KAAKmI,2BAA2BjD,EAAaK,EAAe2B,EAAepF,KAAMkG,GAGzGE,EAAcE,iBAAmBlB,EAAepF,aAC1CzC,eAAe6D,wBACjBgE,EAAepF,KACfoD,EAAYpD,KACZoG,GAIAhB,EAAeY,oBAAoBC,qBACnCb,EAAeY,mBAAmBC,mBAAmB7C,EAAYpD,MAAQoG,IAGjF3C,EAAc8C,eAAgB,IAAIhI,MAAOiI,oBACnCjJ,eAAe6D,wBACjBgE,EAAepF,KACfoD,EAAYpD,KACZyD,GAEA2B,EAAeY,oBAAoBC,qBACnCb,EAAeY,mBAAmBC,mBAAmB7C,EAAYpD,MAAQoG,EAEjF,CAER,CAAE,MAAO7D,GAEL,MADA9E,OAAO8E,MAAM,4CAA4CA,aAAiBF,MAAQE,EAAM/C,QAAU8C,OAAOC,MACnGA,CACV,CACJ,CAOO,4BAAMkE,CAAuBrD,EAAgCpE,GAEhE,OADAd,KAAKwG,oBAAoBtB,SACZlF,KAAKF,iBAAiBgD,kBAAkBoC,EAAapE,EACtE,CAUO,gCAAMqH,CAA2BjD,EAAgCK,EAAkC3E,EAAsBC,GAC5Hb,KAAKwG,oBAAoBtB,GACzB,MAAMS,EAAY3F,KAAKF,iBAAiB8F,aAAaV,GACrD,IAAKS,IAAcA,EAAU6C,sBACzB,OAAOjD,EAEX,IAAIkD,QAAuB9I,sBAAsB+I,oBACjD,MAAM5H,EAA+B,QAArBoE,EAAY1D,KACtB,CAAEkE,SAAU,CAAED,UAAWgD,EAAeE,aAAa,GAAG/H,KAAgBC,MAAiB4H,EAAeE,YAAYC,QAAUrD,EAAcE,iBAC5IoD,EACAtH,QAAevB,KAAKuI,uBAAuBrD,EAAapE,GAC9D,aAAc6E,EAAkBmD,gBAAgB5D,EAAa3D,EACjE,CASO,+BAAMwH,CAA0BnI,EAAsBC,EAAoBC,GAC7E,MAAMkI,EAAe,uBAAuBpI,KAAgBC,IAE5D,UADyBrB,mBAAmB4H,eAAe4B,GAGvD,YADAzJ,OAAO8H,KAAK,2BAA2BzG,KAAgBC,mCAI3D,MAAME,EAAUtB,wBAAwBS,YAAYU,EAAcC,GAElE,UACUE,EAAQC,WAAUC,UACpB,MAAM5B,EAAiBC,sBAAsBY,cACvCgB,QAAmB7B,EAAe8B,qBAAqBP,GAE7D,IAAKM,EAAY,CACb,MAAME,EAAW,8CAA8CR,IAE/D,MADArB,OAAO8E,MAAMjD,GACP,IAAI+C,MAAM/C,EACpB,CAEA,MAAM6H,EAAiBnI,EAAQkB,cAAcS,KAAIxB,MAAOiI,IACpD,MAAM9F,EAAW,GAAG1D,mBAAmByJ,oCAAoCD,EAAYpH,OACvF,OAAOf,EAAQC,WACXC,UACI,IAAI0B,EACA4C,EACJ,IAEI,GADA5C,EAAYzB,EAAWc,cAAcJ,MAAMgB,GAAyBA,EAAEd,OAASoH,EAAYpH,QACtFa,EAAW,CACZ,MAAMvB,EAAW,4CAA4C8H,EAAYpH,OAOzE,MANAvC,OAAO8E,MAAMjD,SACP/B,EAAe6D,wBAAwBtC,EAAcsI,EAAYpH,KAAM,CACzEA,KAAMoH,EAAYpH,KAAMN,KAAM,UAAWyB,WAAW,EAAOsD,YAAY,EACvElC,MAAOjD,EACPkF,gBAAiB,CAAE/E,OAAQ,SAAUC,KAAM,SAAUC,OAAQ,cAAeH,QAASF,KAEnF,IAAI+C,MAAM/C,EACpB,CAGA,GADAmE,QAAsBlG,EAAemG,qBAAqB5E,EAAcsI,EAAYpH,OAC/EyD,EAAe,CAChB,MAAMnE,EAAW,4CAA4C8H,EAAYpH,OAOzE,MANAvC,OAAO8E,MAAMjD,SACP/B,EAAe6D,wBAAwBtC,EAAcsI,EAAYpH,KAAM,CACzEA,KAAMoH,EAAYpH,KAAMN,KAAMmB,EAAUnB,KAAMyB,WAAW,EAAOsD,YAAY,EAC5ElC,MAAOjD,EACPkF,gBAAiB,CAAE/E,OAAQ,SAAUC,KAAM,SAAUC,OAAQ,cAAeH,QAASF,KAEnF,IAAI+C,MAAM/C,EACpB,CAEA7B,OAAO8H,KAAK,YAAY6B,EAAYpH,aAAayD,EAAc1C,SAAW,gBAAgBqG,EAAYrG,iBAChGxD,EAAe6D,wBAAwBtC,EAAcsI,EAAYpH,KAAM,IACtEyD,EAAezD,KAAMoH,EAAYpH,KACpCN,KAAM+D,EAAc/D,MAAQmB,EAAUnB,MAAQ,UAC9CyB,UAAWsC,EAActC,YAAa,EAAOsD,YAAY,EACzDD,gBAAiB,CACb/E,OAAQ,cAAeC,KAAM,SAAUC,OAAQ,cAC/CH,QAAS,YAAY4H,EAAYpH,aAAayD,EAAc1C,SAAW,gBAAgBqG,EAAYrG,aAI3G,IAAIyC,EAAiB,IAAKxE,GACH,QAAnB6B,EAAUnB,MAAkB+D,EAAcE,YAAcH,GAAgBI,UAAUD,YAClFH,EAAiB,IACVA,EACHI,SAAU,IAAKJ,GAAgBI,SAAUD,UAAWF,EAAcE,aAI1E,MAAMyC,QAAsBlI,KAAKoJ,kBAAkBzG,EAAWuG,EAAYrG,QAAS9B,EAASuE,GAEtF+D,EAAiB,wBAAwBH,EAAYpH,mBAAmBoH,EAAYrG,UACpFyG,EAAiB,oBAAoBJ,EAAYpH,mBAAmBoH,EAAYrG,mBAAmBqF,EAAc7D,OAAS,YAchI,SAZMhF,EAAe6D,wBAAwBtC,EAAcsI,EAAYpH,KAAM,IACtEoG,EAAepG,KAAMoH,EAAYpH,KACpCN,KAAM0G,EAAc1G,MAAQ+D,EAAc/D,MAAQmB,EAAUnB,MAAQ,UACpEyB,UAAWiF,EAAcjF,UAAWsD,YAAY,EAChDD,gBAAiB,CACb/E,OAAQ2G,EAAcjF,UAAY,YAAc,SAChDzB,KAAM,SAAUC,OAAQ,cACxBH,QAAS4G,EAAcjF,UAAYoG,EAAiBC,GAExDlB,gBAAiBF,EAAcjF,eAAY4F,EAAYtD,EAAc6C,mBAGpEF,EAAcjF,UAEf,MADA1D,OAAO8E,MAAMiF,GACP,IAAInF,MAAMmF,GAGpB,OADA/J,OAAO8H,KAAKgC,GACLnB,CACX,CAAE,MAAO7D,GACL,MAAMjD,EAAW,8BAA8B8H,EAAYpH,SAASuC,aAAiBF,MAAQE,EAAM/C,QAAU8C,OAAOC,KASpH,MARA9E,OAAO8E,MAAMjD,SACP/B,EAAe6D,wBAAwBtC,EAAcsI,EAAYpH,KAAM,CACzEA,KAAMoH,EAAYpH,KAClBN,KAAMmB,GAAWnB,MAAQ+D,GAAe/D,MAAQ,UAChDyB,WAAW,EAAOsD,YAAY,EAC9BlC,MAAOA,aAAiBF,MAAQE,EAAM/C,QAAU8C,OAAOC,GACvDiC,gBAAiB,CAAE/E,OAAQ,SAAUC,KAAM,SAAUC,OAAQ,cAAeH,QAASF,KAEnFiD,CACV,IAEJ,CACIjB,SAAUA,EACVC,kBAAmB,qCAAqC6F,EAAYpH,OACpE0C,SAAWjD,GAAWA,EAAO0B,WAEpC,IAGDgG,SACM1G,QAAQC,IAAIyG,EACtB,GACD,CACC7F,SAAU1D,mBAAmB6J,iCAC7BlG,kBAAmB,+CAA+CxC,IAElEyC,WAAY,IAAM,+CAA+CzC,KAEzE,C,cACUrB,mBAAmBgI,aAAawB,EAC1C,CACJ,CASQ,uBAAMI,CAAkBlE,EAAgCsE,EAAuBC,EAAmC3I,GACtHd,KAAKwG,oBAAoBtB,GACzB,MAAMwE,EAAwC,IACvCxE,EACHrC,QAASqC,EAAYrC,QAAQgF,SAAS,UAAY3C,EAAYrC,QAAU2G,GAE5E,aAAaxJ,KAAKF,iBAAiBmG,QAAQyD,EAAoBD,EAAU3I,EAC7E,SAIG,MAAM6I,mBAAqB/J,mBAAmBM","ignoreList":[]}