imcp 0.1.3 → 0.1.5

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 (239) hide show
  1. package/README.md +21 -4
  2. package/dist/cli/commands/install.js.map +1 -0
  3. package/dist/cli/commands/list.js.map +1 -0
  4. package/dist/cli/commands/pull.js.map +1 -0
  5. package/dist/cli/commands/serve.js.map +1 -0
  6. package/dist/cli/commands/start.d.ts +2 -0
  7. package/dist/cli/commands/start.js +32 -0
  8. package/dist/cli/commands/start.js.map +1 -0
  9. package/dist/cli/commands/sync.d.ts +2 -0
  10. package/dist/cli/commands/sync.js +17 -0
  11. package/dist/cli/commands/sync.js.map +1 -0
  12. package/dist/cli/commands/uninstall.js.map +1 -0
  13. package/dist/cli/index.js +0 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/ConfigurationLoader.d.ts +32 -0
  16. package/{src/core/loaders/ConfigurationLoader.ts → dist/core/ConfigurationLoader.js} +236 -298
  17. package/dist/core/ConfigurationLoader.js.map +1 -0
  18. package/dist/core/ConfigurationProvider.d.ts +35 -0
  19. package/{src/core/loaders/ConfigurationProvider.ts → dist/core/ConfigurationProvider.js} +375 -462
  20. package/dist/core/ConfigurationProvider.js.map +1 -0
  21. package/dist/core/InstallationService.d.ts +50 -0
  22. package/dist/core/InstallationService.js +350 -0
  23. package/dist/core/InstallationService.js.map +1 -0
  24. package/dist/core/MCPManager.d.ts +28 -0
  25. package/dist/core/MCPManager.js +188 -0
  26. package/dist/core/MCPManager.js.map +1 -0
  27. package/dist/core/RequirementService.d.ts +40 -0
  28. package/dist/core/RequirementService.js +110 -0
  29. package/dist/core/RequirementService.js.map +1 -0
  30. package/dist/core/ServerSchemaLoader.d.ts +11 -0
  31. package/dist/core/ServerSchemaLoader.js +43 -0
  32. package/dist/core/ServerSchemaLoader.js.map +1 -0
  33. package/dist/core/ServerSchemaProvider.d.ts +17 -0
  34. package/dist/core/ServerSchemaProvider.js +120 -0
  35. package/dist/core/ServerSchemaProvider.js.map +1 -0
  36. package/dist/core/constants.d.ts +47 -0
  37. package/dist/core/constants.js +94 -0
  38. package/dist/core/constants.js.map +1 -0
  39. package/dist/core/installers/BaseInstaller.d.ts +74 -0
  40. package/dist/core/installers/BaseInstaller.js +253 -0
  41. package/dist/core/installers/BaseInstaller.js.map +1 -0
  42. package/dist/core/installers/ClientInstaller.d.ts +23 -0
  43. package/dist/core/installers/ClientInstaller.js +564 -0
  44. package/dist/core/installers/ClientInstaller.js.map +1 -0
  45. package/dist/core/installers/CommandInstaller.d.ts +37 -0
  46. package/{src/core/installers/requirements/CommandInstaller.ts → dist/core/installers/CommandInstaller.js} +173 -231
  47. package/dist/core/installers/CommandInstaller.js.map +1 -0
  48. package/dist/core/installers/GeneralInstaller.d.ts +33 -0
  49. package/dist/core/installers/GeneralInstaller.js +85 -0
  50. package/dist/core/installers/GeneralInstaller.js.map +1 -0
  51. package/dist/core/installers/InstallerFactory.d.ts +54 -0
  52. package/{src/core/installers/requirements/InstallerFactory.ts → dist/core/installers/InstallerFactory.js} +97 -112
  53. package/dist/core/installers/InstallerFactory.js.map +1 -0
  54. package/dist/core/installers/NpmInstaller.d.ts +26 -0
  55. package/dist/core/installers/NpmInstaller.js +127 -0
  56. package/dist/core/installers/NpmInstaller.js.map +1 -0
  57. package/dist/core/installers/PipInstaller.d.ts +28 -0
  58. package/dist/core/installers/PipInstaller.js +127 -0
  59. package/dist/core/installers/PipInstaller.js.map +1 -0
  60. package/{src/core/installers/requirements/RequirementInstaller.ts → dist/core/installers/RequirementInstaller.d.ts} +33 -42
  61. package/dist/core/installers/RequirementInstaller.js +3 -0
  62. package/dist/core/installers/RequirementInstaller.js.map +1 -0
  63. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
  64. package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
  65. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
  66. package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
  67. package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
  68. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
  69. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
  70. package/dist/core/installers/index.js.map +1 -0
  71. package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
  72. package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
  73. package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
  74. package/dist/core/installers/requirements/InstallerFactory.js +2 -0
  75. package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
  76. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  77. package/dist/core/installers/requirements/NugetInstaller.d.ts +37 -0
  78. package/dist/core/installers/requirements/NugetInstaller.js +189 -0
  79. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  80. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  81. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  82. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  83. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  84. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  85. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  86. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  87. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  88. package/dist/core/metadatas/constants.js.map +1 -0
  89. package/dist/core/metadatas/recordingConstants.d.ts +2 -0
  90. package/dist/core/metadatas/recordingConstants.js +2 -0
  91. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  92. package/dist/core/metadatas/types.d.ts +1 -1
  93. package/dist/core/metadatas/types.js.map +1 -0
  94. package/dist/core/onboard/FeedOnboardService.js +1 -22
  95. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  96. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  97. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  98. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  99. package/dist/core/types.d.ts +166 -0
  100. package/dist/core/types.js +16 -0
  101. package/dist/core/types.js.map +1 -0
  102. package/dist/core/validators/FeedValidator.js.map +1 -0
  103. package/dist/core/validators/IServerValidator.js.map +1 -0
  104. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  105. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  106. package/dist/core/validators/StdioServerValidator.js +5 -5
  107. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/services/InstallRequestValidator.d.ts +21 -0
  110. package/dist/services/InstallRequestValidator.js +99 -0
  111. package/dist/services/InstallRequestValidator.js.map +1 -0
  112. package/dist/services/InstallationService.js.map +1 -0
  113. package/dist/services/MCPManager.js.map +1 -0
  114. package/dist/services/RequirementService.js.map +1 -0
  115. package/dist/services/ServerService.js.map +1 -0
  116. package/dist/services/TelemetryService.js.map +1 -0
  117. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  118. package/dist/utils/adoUtils.js.map +1 -0
  119. package/dist/utils/clientUtils.js.map +1 -0
  120. package/dist/utils/feedUtils.js.map +1 -0
  121. package/dist/utils/githubAuth.js.map +1 -0
  122. package/dist/utils/githubUtils.js.map +1 -0
  123. package/dist/utils/logger.js.map +1 -0
  124. package/dist/utils/macroExpressionUtils.js.map +1 -0
  125. package/dist/utils/osUtils.d.ts +11 -0
  126. package/dist/utils/osUtils.js +100 -0
  127. package/dist/utils/osUtils.js.map +1 -0
  128. package/dist/utils/versionUtils.js.map +1 -0
  129. package/dist/web/contract/serverContract.js.map +1 -0
  130. package/dist/web/public/index.html +1 -1
  131. package/dist/web/public/js/modal/installHandler.js +227 -0
  132. package/dist/web/public/js/modal/loadingUI.js +74 -0
  133. package/dist/web/public/js/modal/messageQueue.js +101 -45
  134. package/dist/web/public/js/modal/modalUI.js +214 -0
  135. package/{src/web/public/js/modal/versionUtils.js → dist/web/public/js/modal/version.js} +1 -1
  136. package/dist/web/public/js/onboard/templates.js +1 -0
  137. package/dist/web/public/js/serverCategoryList.js +3 -3
  138. package/dist/web/public/onboard.html +4 -4
  139. package/dist/web/server.js.map +1 -0
  140. package/package.json +5 -1
  141. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  142. package/.github/acl/access.yml +0 -20
  143. package/.github/compliance/inventory.yml +0 -5
  144. package/.github/policies/jit.yml +0 -19
  145. package/.roo/rules-code/rules.md +0 -88
  146. package/dist/core/onboard/InstallOperationManager.d.ts +0 -23
  147. package/dist/core/onboard/InstallOperationManager.js +0 -144
  148. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  149. package/docs/Telemetry.md +0 -136
  150. package/memory-bank/activeContext.md +0 -26
  151. package/memory-bank/decisionLog.md +0 -91
  152. package/memory-bank/productContext.md +0 -41
  153. package/memory-bank/progress.md +0 -35
  154. package/memory-bank/systemPatterns.md +0 -10
  155. package/src/cli/commands/install.ts +0 -139
  156. package/src/cli/commands/list.ts +0 -113
  157. package/src/cli/commands/pull.ts +0 -16
  158. package/src/cli/commands/serve.ts +0 -39
  159. package/src/cli/commands/uninstall.ts +0 -64
  160. package/src/cli/index.ts +0 -82
  161. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  162. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  163. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  164. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  165. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  166. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  167. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  168. package/src/core/installers/index.ts +0 -11
  169. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  170. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  171. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  172. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  173. package/src/core/loaders/InstallOperationManager.ts +0 -367
  174. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  175. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  176. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  177. package/src/core/metadatas/constants.ts +0 -122
  178. package/src/core/metadatas/recordingConstants.ts +0 -62
  179. package/src/core/metadatas/types.ts +0 -202
  180. package/src/core/onboard/FeedOnboardService.ts +0 -524
  181. package/src/core/onboard/OnboardProcessor.ts +0 -356
  182. package/src/core/onboard/OnboardStatus.ts +0 -60
  183. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  184. package/src/core/validators/FeedValidator.ts +0 -135
  185. package/src/core/validators/IServerValidator.ts +0 -21
  186. package/src/core/validators/SSEServerValidator.ts +0 -43
  187. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  188. package/src/core/validators/StdioServerValidator.ts +0 -312
  189. package/src/index.ts +0 -44
  190. package/src/services/InstallationService.ts +0 -102
  191. package/src/services/MCPManager.ts +0 -249
  192. package/src/services/RequirementService.ts +0 -627
  193. package/src/services/ServerService.ts +0 -161
  194. package/src/services/TelemetryService.ts +0 -59
  195. package/src/utils/UpdateCheckTracker.ts +0 -86
  196. package/src/utils/adoUtils.ts +0 -293
  197. package/src/utils/clientUtils.ts +0 -72
  198. package/src/utils/feedUtils.ts +0 -31
  199. package/src/utils/githubAuth.ts +0 -212
  200. package/src/utils/githubUtils.ts +0 -164
  201. package/src/utils/logger.ts +0 -195
  202. package/src/utils/macroExpressionUtils.ts +0 -104
  203. package/src/utils/osUtils.ts +0 -597
  204. package/src/utils/versionUtils.ts +0 -114
  205. package/src/web/contract/serverContract.ts +0 -74
  206. package/src/web/public/css/detailsWidget.css +0 -235
  207. package/src/web/public/css/modal.css +0 -757
  208. package/src/web/public/css/notifications.css +0 -101
  209. package/src/web/public/css/onboard.css +0 -107
  210. package/src/web/public/css/serverCategoryList.css +0 -120
  211. package/src/web/public/css/serverDetails.css +0 -139
  212. package/src/web/public/index.html +0 -359
  213. package/src/web/public/js/api.js +0 -132
  214. package/src/web/public/js/detailsWidget.js +0 -264
  215. package/src/web/public/js/flights/flights.js +0 -127
  216. package/src/web/public/js/modal/index.js +0 -52
  217. package/src/web/public/js/modal/installModal.js +0 -162
  218. package/src/web/public/js/modal/installation.js +0 -266
  219. package/src/web/public/js/modal/loadingModal.js +0 -182
  220. package/src/web/public/js/modal/modalSetup.js +0 -595
  221. package/src/web/public/js/modal/modalUtils.js +0 -37
  222. package/src/web/public/js/modal.js +0 -42
  223. package/src/web/public/js/notifications.js +0 -137
  224. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  225. package/src/web/public/js/onboard/index.js +0 -374
  226. package/src/web/public/js/onboard/publishHandler.js +0 -172
  227. package/src/web/public/js/onboard/state.js +0 -76
  228. package/src/web/public/js/onboard/templates.js +0 -341
  229. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  230. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  231. package/src/web/public/js/serverCategoryDetails.js +0 -364
  232. package/src/web/public/js/serverCategoryList.js +0 -241
  233. package/src/web/public/js/settings.js +0 -314
  234. package/src/web/public/modal.html +0 -84
  235. package/src/web/public/onboard.html +0 -296
  236. package/src/web/public/settings.html +0 -135
  237. package/src/web/public/styles.css +0 -277
  238. package/src/web/server.ts +0 -478
  239. package/tsconfig.json +0 -18
@@ -0,0 +1,564 @@
1
+ import { GetBrowserPath } from '../../utils/osUtils.js';
2
+ import { ConfigurationProvider } from '../ConfigurationProvider.js';
3
+ import { SUPPORTED_CLIENTS } from '../constants.js';
4
+ import { resolveNpmModulePath, readJsonFile, writeJsonFile } from '../../utils/clientUtils.js';
5
+ import { exec } from 'child_process';
6
+ import { promisify } from 'util';
7
+ import { Logger } from '../../utils/logger.js';
8
+ import { getPythonPackagePath, getSystemPythonPackageDirectory } from '../../utils/osUtils.js';
9
+ const execAsync = promisify(exec); // Moved promisify here for reuse
10
+ export class ClientInstaller {
11
+ categoryName;
12
+ serverName;
13
+ clients;
14
+ configProvider;
15
+ operationStatuses;
16
+ constructor(categoryName, serverName, clients) {
17
+ this.categoryName = categoryName;
18
+ this.serverName = serverName;
19
+ this.clients = clients;
20
+ this.configProvider = ConfigurationProvider.getInstance();
21
+ this.operationStatuses = new Map();
22
+ }
23
+ generateOperationId() {
24
+ return `install-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
25
+ }
26
+ async getNpmPath() {
27
+ try {
28
+ // Execute the get-command npm command to find the npm path
29
+ const { stdout } = await execAsync('powershell -Command "get-command npm | Select-Object -ExpandProperty Source"');
30
+ // Extract the directory from the full path (removing npm.cmd)
31
+ const npmPath = stdout.trim().replace(/\\npm\.cmd$/, '');
32
+ return npmPath;
33
+ }
34
+ catch (error) {
35
+ console.error('Error getting npm path:', error);
36
+ // Return a default path if the command fails
37
+ return 'C:\\Program Files\\nodejs';
38
+ }
39
+ }
40
+ /**
41
+ * Check if a command is available on the system
42
+ * @param command The command to check
43
+ * @returns True if the command is available, false otherwise
44
+ */
45
+ async isCommandAvailable(command) {
46
+ try {
47
+ if (process.platform === 'win32') {
48
+ // Windows-specific command check
49
+ await execAsync(`where ${command}`);
50
+ }
51
+ else if (process.platform === 'darwin' && (command === 'code' || command === 'code-insiders')) {
52
+ // macOS-specific VS Code check
53
+ const vscodePath = command === 'code' ?
54
+ '/Applications/Visual Studio Code.app' :
55
+ '/Applications/Visual Studio Code - Insiders.app';
56
+ await execAsync(`test -d "${vscodePath}"`);
57
+ }
58
+ else {
59
+ // Unix-like systems
60
+ await execAsync(`which ${command}`);
61
+ }
62
+ return true;
63
+ }
64
+ catch (error) {
65
+ if (process.platform === 'darwin' && (command === 'code' || command === 'code-insiders')) {
66
+ // Try checking in ~/Applications as well for macOS
67
+ try {
68
+ const homedir = process.env.HOME;
69
+ const vscodePath = command === 'code' ?
70
+ `${homedir}/Applications/Visual Studio Code.app` :
71
+ `${homedir}/Applications/Visual Studio Code - Insiders.app`;
72
+ await execAsync(`test -d "${vscodePath}"`);
73
+ return true;
74
+ }
75
+ catch (error) {
76
+ return false;
77
+ }
78
+ }
79
+ return false;
80
+ }
81
+ }
82
+ // Modified to accept ServerInstallOptions
83
+ async installClient(clientName, options) {
84
+ // Check if client is supported
85
+ if (!SUPPORTED_CLIENTS[clientName]) {
86
+ return {
87
+ status: 'failed',
88
+ type: 'install',
89
+ target: 'server',
90
+ message: `Unsupported client: ${clientName}`,
91
+ operationId: this.generateOperationId()
92
+ };
93
+ }
94
+ // Create initial operation status
95
+ const operationId = this.generateOperationId();
96
+ const initialStatus = {
97
+ status: 'pending',
98
+ type: 'install',
99
+ target: 'server',
100
+ message: `Initializing installation for client: ${clientName}`,
101
+ operationId: operationId
102
+ };
103
+ // Update server status with initial client installation status
104
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, initialStatus);
105
+ // Start the asynchronous installation process without awaiting it
106
+ // Pass options down
107
+ this.processInstallation(clientName, operationId, options);
108
+ // Return the initial status immediately
109
+ return initialStatus;
110
+ }
111
+ // Modified to accept ServerInstallOptions
112
+ async processInstallation(clientName, operationId, options) {
113
+ try {
114
+ // Check requirements before installation
115
+ let requirementsReady = await this.configProvider.isRequirementsReady(this.categoryName, this.serverName);
116
+ // If requirements are not ready, periodically check with timeout
117
+ if (!requirementsReady) {
118
+ const pendingStatus = {
119
+ status: 'pending',
120
+ type: 'install',
121
+ target: 'server',
122
+ message: `Waiting for requirements to be ready for client: ${clientName}`,
123
+ operationId: operationId
124
+ };
125
+ // Update status to pending with reference to configProvider
126
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, pendingStatus);
127
+ // Set up periodic checking with timeout
128
+ const startTime = Date.now();
129
+ const timeoutMs = 5 * 60 * 1000; // 5 minutes in milliseconds
130
+ const intervalMs = 5 * 1000; // 5 seconds in milliseconds
131
+ while (!requirementsReady && (Date.now() - startTime) < timeoutMs) {
132
+ // Wait for the interval
133
+ await new Promise(resolve => setTimeout(resolve, intervalMs));
134
+ // Check again
135
+ requirementsReady = await this.configProvider.isRequirementsReady(this.categoryName, this.serverName);
136
+ }
137
+ // If still not ready after timeout, update status as failed and exit
138
+ if (!requirementsReady) {
139
+ const failedStatus = {
140
+ status: 'failed',
141
+ type: 'install',
142
+ target: 'server',
143
+ message: `Timed out waiting for requirements to be ready for client: ${clientName} after 5 minutes`,
144
+ operationId: operationId
145
+ };
146
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, failedStatus);
147
+ return; // Exit the installation process
148
+ }
149
+ }
150
+ // If we've reached here, requirements are ready - update status to in-progress
151
+ const inProgressStatus = {
152
+ status: 'in-progress',
153
+ type: 'install',
154
+ target: 'server',
155
+ message: `Installing client: ${clientName}`,
156
+ operationId: operationId
157
+ };
158
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, inProgressStatus);
159
+ // Get feed configuration for the server
160
+ const feedConfiguration = await this.configProvider.getFeedConfiguration(this.categoryName);
161
+ if (!feedConfiguration) {
162
+ const errorStatus = {
163
+ status: 'failed',
164
+ type: 'install',
165
+ target: 'server',
166
+ message: `Failed to get feed configuration for category: ${this.categoryName}`,
167
+ operationId: operationId
168
+ };
169
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, errorStatus);
170
+ return;
171
+ }
172
+ // Find the server config in the feed configuration
173
+ const serverConfig = feedConfiguration.mcpServers.find(s => s.name === this.serverName);
174
+ if (!serverConfig) {
175
+ const errorStatus = {
176
+ status: 'failed',
177
+ type: 'install',
178
+ target: 'server',
179
+ message: `Server ${this.serverName} not found in feed configuration`,
180
+ operationId: operationId
181
+ };
182
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, errorStatus);
183
+ return;
184
+ }
185
+ try {
186
+ // Install client-specific configuration, passing options down
187
+ const result = await this.installClientConfig(clientName, options, serverConfig, feedConfiguration);
188
+ const finalStatus = {
189
+ status: result.success ? 'completed' : 'failed',
190
+ type: 'install',
191
+ target: 'server',
192
+ message: result.message || `Installation for client ${clientName}: ${result.success ? 'successful' : 'failed'}`,
193
+ operationId: operationId,
194
+ error: result.success ? undefined : result.message
195
+ };
196
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, finalStatus);
197
+ if (result.success) {
198
+ await this.configProvider.reloadClientMCPSettings();
199
+ }
200
+ }
201
+ catch (error) {
202
+ const errorStatus = {
203
+ status: 'failed',
204
+ type: 'install',
205
+ target: 'server',
206
+ message: `Failed to install client: ${clientName}. Error: ${error instanceof Error ? error.message : String(error)}`,
207
+ operationId: operationId,
208
+ error: error instanceof Error ? error.message : String(error)
209
+ };
210
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, errorStatus);
211
+ }
212
+ }
213
+ catch (error) {
214
+ const errorStatus = {
215
+ status: 'failed',
216
+ type: 'install',
217
+ target: 'server',
218
+ message: `Unexpected error in installation process for client: ${clientName}. Error: ${error instanceof Error ? error.message : String(error)}`,
219
+ operationId: operationId,
220
+ error: error instanceof Error ? error.message : String(error)
221
+ };
222
+ await this.configProvider.updateServerOperationStatus(this.categoryName, this.serverName, clientName, errorStatus);
223
+ }
224
+ }
225
+ // Modified to accept ServerInstallOptions
226
+ async installClientConfig(clientName, options, // Use options directly
227
+ serverConfig, feedConfig) {
228
+ try {
229
+ if (!SUPPORTED_CLIENTS[clientName]) {
230
+ Logger.debug(`Client ${clientName} is not supported.`);
231
+ return { success: false, message: `Unsupported client: ${clientName}` };
232
+ }
233
+ const clientSettings = SUPPORTED_CLIENTS[clientName];
234
+ // Get both setting paths for VS Code and VS Code Insiders
235
+ const regularSettingPath = clientSettings.codeSettingPath;
236
+ const insidersSettingPath = clientSettings.codeInsiderSettingPath;
237
+ Logger.debug(`Starting installation of ${this.serverName} for client ${clientName}`);
238
+ Logger.debug(`VS Code settings path configured as: ${regularSettingPath}`);
239
+ Logger.debug(`VS Code Insiders settings path configured as: ${insidersSettingPath}`);
240
+ // Check if VS Code and VS Code Insiders are installed
241
+ const isVSCodeInstalled = await this.isCommandAvailable('code');
242
+ const isVSCodeInsidersInstalled = await this.isCommandAvailable('code-insiders');
243
+ Logger.debug(isVSCodeInstalled ? 'VS Code detected on system' : 'VS Code not detected on system');
244
+ Logger.debug(isVSCodeInsidersInstalled ? 'VS Code Insiders detected on system' : 'VS Code Insiders not detected on system');
245
+ // If neither is installed, we can't proceed
246
+ if (!isVSCodeInstalled && !isVSCodeInsidersInstalled) {
247
+ Logger.debug('No VS Code installations detected on system. Cannot update settings.');
248
+ return {
249
+ success: false,
250
+ message: `Neither VS Code nor VS Code Insiders are installed on this system. Cannot update settings for client: ${clientName}. Please install VS Code or VS Code Insiders and try again.`
251
+ };
252
+ }
253
+ // --- Start of new logic ---
254
+ // Clone the base installation configuration to avoid modifying the original serverConfig
255
+ const installConfig = JSON.parse(JSON.stringify(serverConfig.installation));
256
+ const pythonEnv = options.settings?.pythonEnv;
257
+ let pythonDir = null;
258
+ // 1. Determine which args to use and resolve npm paths
259
+ let finalArgs = [];
260
+ if (options.args && options.args.length > 0) {
261
+ Logger.debug(`Using args from ServerInstallOptions: ${options.args.join(' ')}`);
262
+ finalArgs = options.args.map(arg => resolveNpmModulePath(arg));
263
+ }
264
+ else if (installConfig.args && installConfig.args.length > 0) {
265
+ Logger.debug(`Using args from serverConfig.installation: ${installConfig.args.join(' ')}`);
266
+ finalArgs = installConfig.args.map((arg) => resolveNpmModulePath(arg));
267
+ }
268
+ else {
269
+ Logger.debug('No args found in options or serverConfig.installation.');
270
+ finalArgs = [];
271
+ }
272
+ // 2. Handle pythonEnv settings
273
+ if (pythonEnv) {
274
+ // 2.1 If pythonEnv is set
275
+ Logger.debug(`Python environment specified: ${pythonEnv}`);
276
+ pythonDir = getPythonPackagePath(pythonEnv);
277
+ // 2.1.1 Replace ${PYTHON_PACKAGE} in args
278
+ if (pythonDir) {
279
+ finalArgs = finalArgs.map(arg => arg.includes('${PYTHON_PACKAGE}') ? arg.replace('${PYTHON_PACKAGE}', pythonDir) : arg);
280
+ Logger.debug(`Args after PYTHON_PACKAGE replacement (using pythonEnv): ${finalArgs.join(' ')}`);
281
+ }
282
+ else {
283
+ Logger.debug(`Could not determine directory for pythonEnv: ${pythonEnv}`);
284
+ }
285
+ // 2.1.2 Replace command if it's 'python'
286
+ if (installConfig.command === 'python') {
287
+ Logger.debug(`Replacing command 'python' with specified pythonEnv: ${pythonEnv}`);
288
+ installConfig.command = pythonEnv;
289
+ }
290
+ }
291
+ else {
292
+ // 2.2 If pythonEnv is not set
293
+ Logger.debug('No Python environment specified in settings.');
294
+ // 2.2.1 Replace ${PYTHON_PACKAGE} with system python directory if needed
295
+ if (finalArgs.some(arg => arg.includes('${PYTHON_PACKAGE}'))) {
296
+ Logger.debug('Attempting to find system Python directory for ${PYTHON_PACKAGE} replacement.');
297
+ pythonDir = await getSystemPythonPackageDirectory();
298
+ if (pythonDir) {
299
+ finalArgs = finalArgs.map(arg => arg.includes('${PYTHON_PACKAGE}') ? arg.replace('${PYTHON_PACKAGE}', pythonDir) : arg);
300
+ Logger.debug(`Args after PYTHON_PACKAGE replacement (using system python): ${finalArgs.join(' ')}`);
301
+ }
302
+ else {
303
+ Logger.debug('Could not find system Python directory. ${PYTHON_PACKAGE} replacement skipped.');
304
+ // Optionally, remove or handle the arg containing ${PYTHON_PACKAGE} if Python is required
305
+ // finalArgs = finalArgs.filter(arg => !arg.includes('${PYTHON_PACKAGE}'));
306
+ }
307
+ }
308
+ }
309
+ // Update installConfig with potentially modified args
310
+ installConfig.args = finalArgs;
311
+ // 3. Handle environment variables (merge default, serverConfig, and options.env)
312
+ const baseEnv = serverConfig.installation.env || {};
313
+ const defaultEnv = {};
314
+ for (const [key, config] of Object.entries(baseEnv)) {
315
+ const envConfig = config; // Type assertion
316
+ if (envConfig.Default) {
317
+ defaultEnv[key] = envConfig.Default;
318
+ }
319
+ }
320
+ // Merge: options.env overrides defaultEnv
321
+ installConfig.env = { ...defaultEnv, ...(options.env || {}) };
322
+ // Replace ${BROWSER_PATH} with actual browser path
323
+ const replacements = Object.entries(installConfig.env)
324
+ .filter(([_, value]) => typeof value === 'string' && value.includes('${BROWSER_PATH}'))
325
+ .map(async ([key, value]) => {
326
+ try {
327
+ const browserPath = await GetBrowserPath();
328
+ return [key, value.replace('${BROWSER_PATH}', browserPath)];
329
+ }
330
+ catch (error) {
331
+ Logger.error(`Failed to get system browser path for env var ${key}:`, error);
332
+ return [key, value];
333
+ }
334
+ });
335
+ // Wait for all replacements to complete
336
+ const replacedValues = await Promise.all(replacements);
337
+ replacedValues.forEach(([key, value]) => {
338
+ installConfig.env[key] = value;
339
+ });
340
+ Logger.debug(`Final environment variables: ${JSON.stringify(installConfig.env)}`);
341
+ // --- End of new logic ---
342
+ // Keep track of success for both installations
343
+ let regularSuccess = false;
344
+ let insidersSuccess = false;
345
+ let errorMessages = [];
346
+ // Update client-specific settings for both VS Code and VS Code Insiders
347
+ if (clientName === 'MSRooCode' || clientName === 'Cline') {
348
+ // Update VS Code settings if VS Code is installed
349
+ if (isVSCodeInstalled) {
350
+ try {
351
+ Logger.debug(`Updating VS Code settings for ${clientName} at path: ${regularSettingPath}`);
352
+ // Pass the modified installConfig
353
+ await this.updateClineOrMSRooSettings(regularSettingPath, this.serverName, installConfig, clientName);
354
+ regularSuccess = true;
355
+ Logger.debug(`Settings successfully updated to ${regularSettingPath} for ${clientName} (VS Code)`);
356
+ }
357
+ catch (error) {
358
+ const errorMsg = `Error updating VS Code settings: ${error instanceof Error ? error.message : String(error)}`;
359
+ errorMessages.push(errorMsg);
360
+ console.error(errorMsg);
361
+ }
362
+ }
363
+ // Update VS Code Insiders settings if VS Code Insiders is installed
364
+ if (isVSCodeInsidersInstalled) {
365
+ try {
366
+ Logger.debug(`Updating VS Code Insiders settings for ${clientName} at path: ${insidersSettingPath}`);
367
+ // Pass the modified installConfig
368
+ await this.updateClineOrMSRooSettings(insidersSettingPath, this.serverName, installConfig, clientName);
369
+ insidersSuccess = true;
370
+ Logger.debug(`Settings successfully updated to ${insidersSettingPath} for ${clientName} (VS Code Insiders)`);
371
+ }
372
+ catch (error) {
373
+ const errorMsg = `Error updating VS Code Insiders settings: ${error instanceof Error ? error.message : String(error)}`;
374
+ errorMessages.push(errorMsg);
375
+ console.error(errorMsg);
376
+ }
377
+ }
378
+ }
379
+ else if (clientName === 'GithubCopilot') {
380
+ // Update VS Code settings if VS Code is installed
381
+ if (isVSCodeInstalled) {
382
+ try {
383
+ Logger.debug(`Updating VS Code settings for ${clientName} at path: ${regularSettingPath}`);
384
+ // Pass the modified installConfig
385
+ await this.updateGithubCopilotSettings(regularSettingPath, this.serverName, installConfig);
386
+ regularSuccess = true;
387
+ Logger.debug(`Settings successfully updated to ${regularSettingPath} for ${clientName} (VS Code)`);
388
+ }
389
+ catch (error) {
390
+ const errorMsg = `Error updating VS Code settings: ${error instanceof Error ? error.message : String(error)}`;
391
+ errorMessages.push(errorMsg);
392
+ console.error(errorMsg);
393
+ }
394
+ }
395
+ // Update VS Code Insiders settings if VS Code Insiders is installed
396
+ if (isVSCodeInsidersInstalled) {
397
+ try {
398
+ Logger.debug(`Updating VS Code Insiders settings for ${clientName} at path: ${insidersSettingPath}`);
399
+ // Pass the modified installConfig
400
+ await this.updateGithubCopilotSettings(insidersSettingPath, this.serverName, installConfig);
401
+ insidersSuccess = true;
402
+ Logger.debug(`Settings successfully updated to ${insidersSettingPath} for ${clientName} (VS Code Insiders)`);
403
+ }
404
+ catch (error) {
405
+ const errorMsg = `Error updating VS Code Insiders settings: ${error instanceof Error ? error.message : String(error)}`;
406
+ errorMessages.push(errorMsg);
407
+ console.error(errorMsg);
408
+ }
409
+ }
410
+ }
411
+ else {
412
+ Logger.debug(`No implementation exists for updating settings for client: ${clientName}`);
413
+ return {
414
+ success: false,
415
+ message: `Client ${clientName} is supported but no implementation exists for updating its settings`
416
+ };
417
+ }
418
+ // Determine overall success status and message
419
+ const overallSuccess = regularSuccess || insidersSuccess;
420
+ let message = '';
421
+ if (overallSuccess) {
422
+ const successDetails = [];
423
+ if (regularSuccess)
424
+ successDetails.push('VS Code');
425
+ if (insidersSuccess)
426
+ successDetails.push('VS Code Insiders');
427
+ // Create a more compact success message with specific paths
428
+ const pathDetails = [];
429
+ if (regularSuccess) {
430
+ pathDetails.push(`\n[VS Code]: ${regularSettingPath}`);
431
+ }
432
+ if (insidersSuccess) {
433
+ pathDetails.push(`\n[VS Code Insiders]: ${insidersSettingPath}`);
434
+ }
435
+ message = `Successfully installed ${this.serverName} for client: ${clientName}. ${pathDetails.join(' ')}`;
436
+ // Add partial failure information if applicable
437
+ if (errorMessages.length > 0) {
438
+ message += `\nHowever, some errors occurred:\n${errorMessages.join('\n- ')}`;
439
+ }
440
+ Logger.debug(`Installation complete: ${message}`);
441
+ }
442
+ else {
443
+ // Create a more detailed failure message that includes the detection results
444
+ const detectionInfo = [];
445
+ if (!isVSCodeInstalled)
446
+ detectionInfo.push('VS Code not detected');
447
+ if (!isVSCodeInsidersInstalled)
448
+ detectionInfo.push('VS Code Insiders not detected');
449
+ if (errorMessages.length > 0) {
450
+ message = `Failed to install ${this.serverName} for client: ${clientName}.\nDetection status: [${detectionInfo.join(', ')}].\nErrors:\n- ${errorMessages.join('\n- ')}`;
451
+ }
452
+ else {
453
+ message = `Failed to install ${this.serverName} for client: ${clientName}.\nDetection status: [${detectionInfo.join(', ')}]`;
454
+ }
455
+ console.error(`Installation failed: ${message}`);
456
+ }
457
+ return {
458
+ success: overallSuccess,
459
+ message: message
460
+ };
461
+ }
462
+ catch (error) {
463
+ const errorMsg = `Error installing client ${clientName}: ${error instanceof Error ? error.message : String(error)}`;
464
+ console.error(errorMsg);
465
+ return {
466
+ success: false,
467
+ message: errorMsg
468
+ };
469
+ }
470
+ }
471
+ async updateClineOrMSRooSettings(settingPath, serverName, installConfig, // Use the processed installConfig
472
+ clientName) {
473
+ // Read the Cline/MSRoo settings file
474
+ const settings = await readJsonFile(settingPath, true);
475
+ // Initialize mcpServers section if it doesn't exist
476
+ if (!settings.mcpServers) {
477
+ settings.mcpServers = {};
478
+ }
479
+ // Special handling for Windows when command is npx for Cline and MSROO clients
480
+ // Use a copy to avoid modifying the passed installConfig directly if needed elsewhere
481
+ const serverConfigForClient = { ...installConfig };
482
+ if (process.platform === 'win32' &&
483
+ serverConfigForClient.command === 'npx' &&
484
+ (clientName === 'Cline' || clientName === 'MSRooCode' || clientName === 'MSROO')) {
485
+ // Update command to cmd
486
+ serverConfigForClient.command = 'cmd';
487
+ // Add /c and npx at the beginning of args
488
+ serverConfigForClient.args = ['/c', 'npx', ...serverConfigForClient.args];
489
+ // Add APPDATA environment variable pointing to npm directory
490
+ if (!serverConfigForClient.env) {
491
+ serverConfigForClient.env = {};
492
+ }
493
+ // Dynamically get npm path and set APPDATA to it
494
+ const npmPath = await this.getNpmPath();
495
+ serverConfigForClient.env['APPDATA'] = npmPath;
496
+ Logger.debug(`Windows npx fix: command=${serverConfigForClient.command}, args=${serverConfigForClient.args.join(' ')}, env=${JSON.stringify(serverConfigForClient.env)}`);
497
+ }
498
+ // Convert backslashes to forward slashes in args paths
499
+ if (serverConfigForClient.args) {
500
+ serverConfigForClient.args = serverConfigForClient.args.map((arg) => typeof arg === 'string' ? arg.replace(/\\/g, '/') : arg);
501
+ }
502
+ // Add or update the server configuration
503
+ settings.mcpServers[serverName] = {
504
+ command: serverConfigForClient.command,
505
+ args: serverConfigForClient.args,
506
+ env: serverConfigForClient.env,
507
+ autoApprove: [],
508
+ disabled: false,
509
+ alwaysAllow: []
510
+ };
511
+ Logger.debug(`Updating ${settingPath} for ${serverName}: ${JSON.stringify(settings.mcpServers[serverName])}`);
512
+ // Write the updated settings back to the file
513
+ await writeJsonFile(settingPath, settings);
514
+ }
515
+ async updateGithubCopilotSettings(settingPath, serverName, installConfig // Use the processed installConfig
516
+ ) {
517
+ // Read the VS Code settings.json file
518
+ const settings = await readJsonFile(settingPath, true);
519
+ // Initialize the mcp section if it doesn't exist
520
+ if (!settings.mcp) {
521
+ settings.mcp = {
522
+ servers: {},
523
+ inputs: []
524
+ };
525
+ }
526
+ if (!settings.mcp.servers) {
527
+ settings.mcp.servers = {};
528
+ }
529
+ // Use a copy to avoid modifying the passed installConfig directly
530
+ const serverConfigForClient = { ...installConfig };
531
+ // Convert backslashes to forward slashes in args paths
532
+ if (serverConfigForClient.args) {
533
+ serverConfigForClient.args = serverConfigForClient.args.map((arg) => typeof arg === 'string' ? arg.replace(/\\/g, '/') : arg);
534
+ }
535
+ // Add or update the server configuration
536
+ settings.mcp.servers[serverName] = {
537
+ command: serverConfigForClient.command,
538
+ args: serverConfigForClient.args,
539
+ env: serverConfigForClient.env
540
+ };
541
+ Logger.debug(`Updating ${settingPath} for ${serverName}: ${JSON.stringify(settings.mcp.servers[serverName])}`);
542
+ // Write the updated settings back to the file
543
+ await writeJsonFile(settingPath, settings);
544
+ }
545
+ async install(options) {
546
+ const initialStatuses = [];
547
+ // Start installation for each client asynchronously and collect initial statuses
548
+ // Pass options down to installClient
549
+ const installPromises = this.clients.map(async (clientName) => {
550
+ const initialStatus = await this.installClient(clientName, options);
551
+ initialStatuses.push(initialStatus);
552
+ return initialStatus;
553
+ });
554
+ // Wait for all initial statuses (but actual installation continues asynchronously)
555
+ await Promise.all(installPromises);
556
+ // Return initial result showing installations have been initiated
557
+ return {
558
+ success: true,
559
+ message: 'Client installations initiated successfully',
560
+ status: initialStatuses
561
+ };
562
+ }
563
+ }
564
+ //# sourceMappingURL=ClientInstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClientInstaller.js","sourceRoot":"","sources":["../../../src/core/installers/ClientInstaller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { RequirementConfig, RequirementStatus } from '../types.js';
2
+ import { BaseInstaller } from './BaseInstaller.js';
3
+ /**
4
+ * Installer implementation for command-line tools
5
+ */
6
+ export declare class CommandInstaller extends BaseInstaller {
7
+ /**
8
+ * Mapping of command names to their package IDs
9
+ * This handles special cases where the command name differs from the package ID
10
+ */
11
+ private commandMappings;
12
+ /**
13
+ * Check if this installer can handle the given requirement type
14
+ * @param requirement The requirement to check
15
+ * @returns True if this installer can handle the requirement
16
+ */
17
+ canHandle(requirement: RequirementConfig): boolean;
18
+ supportCheckUpdates(): boolean;
19
+ /**
20
+ * Get the mapped package ID for a command
21
+ * @param commandName The command name to map
22
+ * @returns The mapped package ID
23
+ */
24
+ private getMappedPackageId;
25
+ /**
26
+ * Check if the command is already installed
27
+ * @param requirement The requirement to check
28
+ * @returns The status of the requirement
29
+ */
30
+ checkInstallation(requirement: RequirementConfig): Promise<RequirementStatus>;
31
+ /**
32
+ * Install the command
33
+ * @param requirement The requirement to install
34
+ * @returns The status of the installation
35
+ */
36
+ install(requirement: RequirementConfig): Promise<RequirementStatus>;
37
+ }