imcp 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +1 -45
- package/dist/core/installers/clients/BaseClientInstaller.d.ts +1 -5
- package/dist/core/installers/clients/BaseClientInstaller.js +40 -38
- package/dist/core/installers/clients/ClientInstaller.d.ts +9 -9
- package/dist/core/installers/clients/ClientInstaller.js +105 -99
- package/dist/core/installers/requirements/BaseInstaller.d.ts +9 -1
- package/dist/core/installers/requirements/CommandInstaller.d.ts +9 -1
- package/dist/core/installers/requirements/CommandInstaller.js +46 -12
- package/dist/core/installers/requirements/GeneralInstaller.d.ts +11 -1
- package/dist/core/installers/requirements/GeneralInstaller.js +46 -10
- package/dist/core/installers/requirements/InstallerFactory.d.ts +3 -1
- package/dist/core/installers/requirements/InstallerFactory.js +3 -2
- package/dist/core/installers/requirements/NpmInstaller.d.ts +4 -2
- package/dist/core/installers/requirements/NpmInstaller.js +38 -22
- package/dist/core/installers/requirements/PipInstaller.d.ts +3 -1
- package/dist/core/installers/requirements/PipInstaller.js +58 -36
- package/dist/core/installers/requirements/RequirementInstaller.d.ts +4 -1
- package/dist/core/loaders/InstallOperationManager.d.ts +115 -0
- package/dist/core/loaders/InstallOperationManager.js +311 -0
- package/dist/core/loaders/SystemSettingsManager.d.ts +54 -0
- package/dist/core/loaders/SystemSettingsManager.js +257 -0
- package/dist/core/metadatas/recordingConstants.d.ts +44 -0
- package/dist/core/metadatas/recordingConstants.js +45 -0
- package/dist/core/metadatas/types.d.ts +21 -0
- package/dist/core/onboard/InstallOperationManager.d.ts +23 -0
- package/dist/core/onboard/InstallOperationManager.js +144 -0
- package/dist/core/onboard/OnboardStatusManager.js +2 -1
- package/dist/core/validators/StdioServerValidator.js +4 -3
- package/dist/services/InstallationService.d.ts +2 -37
- package/dist/services/InstallationService.js +45 -313
- package/dist/services/MCPManager.d.ts +1 -1
- package/dist/services/MCPManager.js +4 -58
- package/dist/services/RequirementService.d.ts +85 -12
- package/dist/services/RequirementService.js +488 -49
- package/dist/services/ServerService.d.ts +0 -6
- package/dist/services/ServerService.js +0 -74
- package/dist/utils/adoUtils.js +6 -3
- package/dist/utils/logger.js +1 -1
- package/dist/utils/macroExpressionUtils.js +3 -25
- package/dist/utils/osUtils.d.ts +22 -1
- package/dist/utils/osUtils.js +92 -1
- package/dist/utils/versionUtils.d.ts +20 -1
- package/dist/utils/versionUtils.js +51 -4
- package/dist/web/public/css/modal.css +292 -1
- package/dist/web/public/css/serverDetails.css +14 -1
- package/dist/web/public/index.html +122 -20
- package/dist/web/public/js/flights/flights.js +1 -0
- package/dist/web/public/js/modal/index.js +8 -14
- package/dist/web/public/js/modal/installModal.js +3 -4
- package/dist/web/public/js/modal/installation.js +122 -137
- package/dist/web/public/js/modal/loadingModal.js +155 -25
- package/dist/web/public/js/modal/messageQueue.js +45 -101
- package/dist/web/public/js/modal/modalSetup.js +125 -43
- package/dist/web/public/js/modal/modalUtils.js +0 -12
- package/dist/web/public/js/modal.js +23 -10
- package/dist/web/public/js/onboard/publishHandler.js +22 -20
- package/dist/web/public/js/serverCategoryDetails.js +60 -11
- package/dist/web/public/js/serverCategoryList.js +2 -2
- package/dist/web/public/js/settings.js +314 -0
- package/dist/web/public/settings.html +135 -0
- package/dist/web/public/styles.css +32 -0
- package/dist/web/server.js +82 -0
- package/memory-bank/activeContext.md +13 -1
- package/memory-bank/decisionLog.md +63 -0
- package/memory-bank/progress.md +30 -0
- package/memory-bank/systemPatterns.md +7 -0
- package/package.json +1 -1
- package/src/cli/index.ts +1 -48
- package/src/core/installers/clients/BaseClientInstaller.ts +64 -50
- package/src/core/installers/clients/ClientInstaller.ts +130 -130
- package/src/core/installers/requirements/BaseInstaller.ts +9 -1
- package/src/core/installers/requirements/CommandInstaller.ts +47 -13
- package/src/core/installers/requirements/GeneralInstaller.ts +48 -10
- package/src/core/installers/requirements/InstallerFactory.ts +4 -3
- package/src/core/installers/requirements/NpmInstaller.ts +90 -68
- package/src/core/installers/requirements/PipInstaller.ts +81 -55
- package/src/core/installers/requirements/RequirementInstaller.ts +4 -3
- package/src/core/loaders/InstallOperationManager.ts +367 -0
- package/src/core/loaders/SystemSettingsManager.ts +278 -0
- package/src/core/metadatas/recordingConstants.ts +62 -0
- package/src/core/metadatas/types.ts +23 -0
- package/src/core/onboard/OnboardStatusManager.ts +2 -1
- package/src/core/validators/StdioServerValidator.ts +4 -3
- package/src/services/InstallationService.ts +54 -399
- package/src/services/MCPManager.ts +4 -77
- package/src/services/RequirementService.ts +564 -67
- package/src/services/ServerService.ts +0 -90
- package/src/utils/adoUtils.ts +6 -4
- package/src/utils/logger.ts +1 -1
- package/src/utils/macroExpressionUtils.ts +4 -21
- package/src/utils/osUtils.ts +92 -1
- package/src/utils/versionUtils.ts +71 -19
- package/src/web/public/css/modal.css +292 -1
- package/src/web/public/css/serverDetails.css +14 -1
- package/src/web/public/index.html +122 -20
- package/src/web/public/js/flights/flights.js +1 -1
- package/src/web/public/js/modal/index.js +8 -14
- package/src/web/public/js/modal/installModal.js +3 -4
- package/src/web/public/js/modal/installation.js +122 -137
- package/src/web/public/js/modal/loadingModal.js +155 -25
- package/src/web/public/js/modal/modalSetup.js +125 -43
- package/src/web/public/js/modal/modalUtils.js +0 -12
- package/src/web/public/js/modal.js +23 -10
- package/src/web/public/js/onboard/publishHandler.js +22 -20
- package/src/web/public/js/serverCategoryDetails.js +60 -11
- package/src/web/public/js/serverCategoryList.js +5 -5
- package/src/web/public/js/settings.js +314 -0
- package/src/web/public/settings.html +135 -0
- package/src/web/public/styles.css +32 -0
- package/src/web/server.ts +85 -0
- package/src/web/public/js/modal/messageQueue.js +0 -112
|
@@ -8,6 +8,9 @@ import path from 'path';
|
|
|
8
8
|
import fs from 'fs/promises';
|
|
9
9
|
import { SETTINGS_DIR } from '../../metadatas/constants.js'; // Corrected path
|
|
10
10
|
import { Logger } from '../../../utils/logger.js';
|
|
11
|
+
import { InstallOperationManager } from '../../loaders/InstallOperationManager.js';
|
|
12
|
+
import * as RecordingConstants from '../../metadatas/recordingConstants.js';
|
|
13
|
+
|
|
11
14
|
/**
|
|
12
15
|
* Installer implementation for NPM packages
|
|
13
16
|
*/
|
|
@@ -152,7 +155,8 @@ export class NpmInstaller extends BaseInstaller {
|
|
|
152
155
|
private async _installPackage(
|
|
153
156
|
requirement: RequirementConfig,
|
|
154
157
|
packageSource: string,
|
|
155
|
-
targetDir: string
|
|
158
|
+
targetDir: string,
|
|
159
|
+
recorder: InstallOperationManager
|
|
156
160
|
): Promise<{ version: string }> {
|
|
157
161
|
Logger.debug(`Installing NPM package from "${packageSource}" into "${targetDir}"`);
|
|
158
162
|
await fs.mkdir(targetDir, { recursive: true });
|
|
@@ -161,89 +165,107 @@ export class NpmInstaller extends BaseInstaller {
|
|
|
161
165
|
Logger.debug(`Executing install command: ${installCommand}`);
|
|
162
166
|
const requirementName = this._getRequirementName(requirement);
|
|
163
167
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
168
|
+
return await recorder.recording(
|
|
169
|
+
async () => {
|
|
170
|
+
const { stdout: installStdout, stderr: installStderr } = await this.execPromise(installCommand);
|
|
171
|
+
Logger.debug(`NPM install stdout for ${packageSource} in ${targetDir}: ${installStdout}`);
|
|
172
|
+
if (installStderr && !installStderr.toLowerCase().includes('added') && !installStderr.toLowerCase().includes('updated') && !installStderr.toLowerCase().includes('found 0 vulnerabilities')) {
|
|
173
|
+
// Log stderr if it's not just typical success noise
|
|
174
|
+
Logger.log(`NPM install stderr for ${packageSource} in ${targetDir}: ${installStderr}`);
|
|
175
|
+
}
|
|
171
176
|
|
|
172
177
|
|
|
173
|
-
|
|
178
|
+
const installedVersion = await this._getInstalledVersion(requirementName, targetDir);
|
|
174
179
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
+
if (installedVersion) {
|
|
181
|
+
Logger.log(`Successfully installed and verified ${requirementName}@${installedVersion} into ${targetDir}`);
|
|
182
|
+
return { version: installedVersion };
|
|
183
|
+
} else {
|
|
184
|
+
throw new Error(`Successfully ran npm install for ${packageSource}, but ${requirement.name} version could not be determined via npm list in ${targetDir}, stderr: ${installStderr}`);
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
stepName: RecordingConstants.STEP_INSTALLATION_COMMAND_EXECUTION,
|
|
189
|
+
inProgressMessage: `Running: ${installCommand}`,
|
|
190
|
+
onError: (error) => {
|
|
191
|
+
Logger.error(`Error during NPM installation: ${error instanceof Error ? error.message : String(error)}`);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
180
194
|
}
|
|
181
|
-
|
|
182
|
-
} catch (error) {
|
|
183
|
-
Logger.error(`Failed to install or verify NPM package ${packageSource} into ${targetDir}`, error);
|
|
184
|
-
throw error;
|
|
185
|
-
}
|
|
195
|
+
)
|
|
186
196
|
}
|
|
187
197
|
|
|
188
|
-
|
|
189
198
|
/**
|
|
190
199
|
* Install the NPM package.
|
|
191
200
|
* @param requirement The requirement to install.
|
|
192
|
-
* @param
|
|
201
|
+
* @param recorder Optional InstallOperationManager for recording steps.
|
|
202
|
+
* @param options Installation options.
|
|
193
203
|
* @returns The status of the installation.
|
|
194
204
|
*/
|
|
195
|
-
async install(requirement: RequirementConfig, options?: ServerInstallOptions): Promise<RequirementStatus> {
|
|
205
|
+
async install(requirement: RequirementConfig, recorder: InstallOperationManager, options?: ServerInstallOptions): Promise<RequirementStatus> {
|
|
196
206
|
const targetDir = options?.settings?.folderName || this._getRequirementFolderPath(requirement);
|
|
197
207
|
await fs.mkdir(targetDir, { recursive: true });
|
|
208
|
+
return recorder.recording(
|
|
209
|
+
async (): Promise<RequirementStatus> => {
|
|
210
|
+
const status = await this.checkInstallation(requirement, { settings: { folderName: targetDir } });
|
|
211
|
+
if (status.installed && status.version && compareVersions(status.version, requirement.version) === 0 && !requirement.version.toLowerCase().includes('latest')) {
|
|
212
|
+
Logger.log(`${requirement.name}@${status.version} already installed in ${targetDir}.`);
|
|
213
|
+
return status;
|
|
214
|
+
}
|
|
198
215
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if (status.installed && status.version && compareVersions(status.version, requirement.version) === 0 && !requirement.version.toLowerCase().includes('latest')) {
|
|
202
|
-
Logger.log(`${requirement.name}@${status.version} already installed in ${targetDir}.`);
|
|
203
|
-
return status;
|
|
204
|
-
}
|
|
216
|
+
let resolvedVersion = requirement.version;
|
|
217
|
+
let packageToInstall: string = `${requirement.name}@${requirement.version}`;
|
|
205
218
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
throw new Error('Invalid registry configuration for npm.');
|
|
219
|
+
if (requirement.registry) {
|
|
220
|
+
if (requirement.registry.githubRelease) {
|
|
221
|
+
const result = await handleGitHubRelease(requirement, requirement.registry.githubRelease);
|
|
222
|
+
packageToInstall = result.resolvedPath;
|
|
223
|
+
resolvedVersion = result.resolvedVersion;
|
|
224
|
+
} else if (requirement.registry.artifacts) {
|
|
225
|
+
const adoResult: AdoArtifactResult = await handleAdoArtifact(
|
|
226
|
+
requirement,
|
|
227
|
+
requirement.registry.artifacts,
|
|
228
|
+
options?.settings?.pythonCommand,
|
|
229
|
+
targetDir
|
|
230
|
+
);
|
|
231
|
+
packageToInstall = `${adoResult.package}@${adoResult.version}`;
|
|
232
|
+
resolvedVersion = adoResult.version;
|
|
233
|
+
} else {
|
|
234
|
+
if (recorder) await recorder.recordStep('NpmInstaller:RegistryConfig', 'failed', 'Invalid registry configuration for npm.');
|
|
235
|
+
throw new Error('Invalid registry configuration for npm.');
|
|
236
|
+
}
|
|
225
237
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
resolvedVersion = finalInstallResult.version;
|
|
238
|
+
const finalInstallResult = await this._installPackage(requirement, packageToInstall, targetDir, recorder);
|
|
239
|
+
resolvedVersion = finalInstallResult.version;
|
|
229
240
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
241
|
+
return {
|
|
242
|
+
name: requirement.name,
|
|
243
|
+
type: 'npm',
|
|
244
|
+
installed: true,
|
|
245
|
+
version: resolvedVersion,
|
|
246
|
+
inProgress: false,
|
|
247
|
+
npmPath: targetDir
|
|
248
|
+
};
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
stepName: RecordingConstants.STEP_NPM_INSTALLER_INSTALL,
|
|
252
|
+
inProgressMessage: `Installing npm package: ${requirement.name}`,
|
|
253
|
+
endMessage: (result) =>
|
|
254
|
+
result.installed
|
|
255
|
+
? `Install completed for ${requirement.name}`
|
|
256
|
+
: `Install failed for ${requirement.name}`,
|
|
257
|
+
onError: (error) => {
|
|
258
|
+
return {
|
|
259
|
+
result: {
|
|
260
|
+
name: requirement.name,
|
|
261
|
+
type: 'npm',
|
|
262
|
+
installed: false,
|
|
263
|
+
error: error instanceof Error ? error.message : String(error),
|
|
264
|
+
inProgress: false
|
|
265
|
+
},
|
|
266
|
+
message: error instanceof Error ? error.message : String(error),
|
|
267
|
+
};
|
|
268
|
+
},
|
|
269
|
+
});
|
|
248
270
|
}
|
|
249
271
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { RequirementConfig, RequirementStatus, ServerInstallOptions } from '../../metadatas/types.js';
|
|
2
2
|
import { BaseInstaller } from './BaseInstaller.js';
|
|
3
3
|
import { handleGitHubRelease, getGitHubLatestVersion } from '../../../utils/githubUtils.js';
|
|
4
|
-
// Assuming getArtifactLatestVersion will be available in adoUtils.ts
|
|
5
4
|
import { handleArtifact as handleAdoArtifact, getArtifactLatestVersion } from '../../../utils/adoUtils.js';
|
|
6
5
|
import { compareVersions } from '../../../utils/versionUtils.js';
|
|
7
6
|
import { Logger } from '../../../utils/logger.js';
|
|
8
|
-
|
|
7
|
+
import { InstallOperationManager } from '../../loaders/InstallOperationManager.js';
|
|
8
|
+
import * as RecordingConstants from '../../metadatas/recordingConstants.js';
|
|
9
9
|
/**
|
|
10
10
|
* Installer implementation for Python packages using pip
|
|
11
11
|
*/
|
|
@@ -113,69 +113,95 @@ export class PipInstaller extends BaseInstaller {
|
|
|
113
113
|
/**
|
|
114
114
|
* Install the Python package
|
|
115
115
|
* @param requirement The requirement to install
|
|
116
|
+
* @param recorder Optional InstallOperationManager for recording steps
|
|
116
117
|
* @param options Optional server install options
|
|
117
118
|
* @returns The status of the installation
|
|
118
119
|
*/
|
|
119
|
-
async install(requirement: RequirementConfig, options?: ServerInstallOptions): Promise<RequirementStatus> {
|
|
120
|
-
try {
|
|
121
|
-
const status = await this.checkInstallation(requirement, options);
|
|
122
|
-
if (status.installed && status.version && compareVersions(status.version, requirement.version) === 0 && !requirement.version.toLowerCase().includes('latest')) {
|
|
123
|
-
Logger.log(`${requirement.name}==${status.version} already installed for ${this.getPythonCommand}.`);
|
|
124
|
-
return status;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const pipCmd = this.getPipCommand(options);
|
|
120
|
+
async install(requirement: RequirementConfig, recorder: InstallOperationManager, options?: ServerInstallOptions): Promise<RequirementStatus> {
|
|
128
121
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
122
|
+
return await recorder.recording(
|
|
123
|
+
async (): Promise<RequirementStatus> => {
|
|
124
|
+
const status = await this.checkInstallation(requirement, options);
|
|
125
|
+
if (status.installed && status.version && compareVersions(status.version, requirement.version) === 0 && !requirement.version.toLowerCase().includes('latest')) {
|
|
126
|
+
Logger.log(`${requirement.name}==${status.version} already installed for ${this.getPythonCommand}.`);
|
|
127
|
+
return status;
|
|
133
128
|
}
|
|
134
|
-
} else {
|
|
135
|
-
let packageSource: string;
|
|
136
129
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
packageSource = result.resolvedPath;
|
|
140
|
-
const { stderr } = await this.execPromise(`${pipCmd} install "${packageSource}"`);
|
|
141
|
-
if (stderr && stderr.toLowerCase().includes('error')) {
|
|
142
|
-
throw new Error(stderr);
|
|
143
|
-
}
|
|
144
|
-
} else if (requirement.registry.artifacts) {
|
|
145
|
-
const pythonCmd = this.getPythonCommand(options);
|
|
146
|
-
const adoArtifactResult = await handleAdoArtifact(requirement, requirement.registry.artifacts, pythonCmd);
|
|
130
|
+
const pipCmd = this.getPipCommand(options);
|
|
131
|
+
let command: string
|
|
147
132
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (!checkStatus.installed) {
|
|
154
|
-
throw new Error(`Pip installation failed with: ${stderr}`);
|
|
155
|
-
}
|
|
133
|
+
if (!requirement.registry) {
|
|
134
|
+
if (requirement.version && !requirement.version.includes('latest')) {
|
|
135
|
+
command = `${pipCmd} install ${requirement.name}==${requirement.version}`;
|
|
136
|
+
} else {
|
|
137
|
+
command = `${pipCmd} install --upgrade ${requirement.name}`;
|
|
156
138
|
}
|
|
157
139
|
} else {
|
|
158
|
-
|
|
140
|
+
let packageSource: string;
|
|
141
|
+
if (requirement.registry.githubRelease) {
|
|
142
|
+
const result = await handleGitHubRelease(requirement, requirement.registry.githubRelease);
|
|
143
|
+
packageSource = result.resolvedPath;
|
|
144
|
+
command = `${pipCmd} install "${packageSource}"`
|
|
145
|
+
} else if (requirement.registry.artifacts) {
|
|
146
|
+
const pythonCmd = this.getPythonCommand(options);
|
|
147
|
+
const adoArtifactResult = await handleAdoArtifact(requirement, requirement.registry.artifacts, pythonCmd);
|
|
148
|
+
|
|
149
|
+
command = `${pipCmd} install ${adoArtifactResult.package} --extra-index-url ${adoArtifactResult.registryUrl}`;
|
|
150
|
+
} else {
|
|
151
|
+
await recorder.recordStep('PipInstaller:RegistryConfig', 'failed', 'Invalid registry configuration');
|
|
152
|
+
throw new Error('Invalid registry configuration');
|
|
153
|
+
}
|
|
159
154
|
}
|
|
160
|
-
|
|
155
|
+
return await recorder.recording(
|
|
156
|
+
async () => {
|
|
157
|
+
const { stderr } = await this.execPromise(command);
|
|
158
|
+
if (stderr && stderr.toLowerCase().includes('error')) {
|
|
159
|
+
Logger.debug(`Pip installation error: ${stderr}`);
|
|
161
160
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
161
|
+
// wait for 5 seconds as python pip would be little delayed
|
|
162
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
163
|
+
const checkStatus = await this.checkInstallation(requirement, options);
|
|
164
|
+
if (!checkStatus.installed) {
|
|
165
|
+
Logger.error(`Package not found after the command, ${stderr}`);
|
|
166
|
+
throw new Error(`Pip installation failed with: ${stderr}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
name: requirement.name,
|
|
172
|
+
type: 'pip',
|
|
173
|
+
installed: true,
|
|
174
|
+
version: requirement.version, // This might need to be updated to actual installed version
|
|
175
|
+
inProgress: false,
|
|
176
|
+
pythonEnv: this.getPythonCommand(options)
|
|
177
|
+
};
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
stepName: `${RecordingConstants.STEP_INSTALL_COMMAND_PREFIX}: ${requirement.name} : ${requirement.version}`,
|
|
181
|
+
inProgressMessage: `Running: ${command}`,
|
|
182
|
+
endMessage: (result) => result.installed ? `Succeeded: ${command}` : `Failed: ${command}`,
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
stepName: RecordingConstants.STEP_PIP_INSTALLER_INSTALL,
|
|
188
|
+
inProgressMessage: `Installing pip package: ${requirement.name}`,
|
|
189
|
+
endMessage: (result) => result.installed
|
|
190
|
+
? `Install completed for ${requirement.name} with version ${result.version}`
|
|
191
|
+
: `Install failed for ${requirement.name}`,
|
|
192
|
+
onError: (error) => {
|
|
193
|
+
return {
|
|
194
|
+
result: {
|
|
195
|
+
name: requirement.name,
|
|
196
|
+
type: 'pip',
|
|
197
|
+
installed: false,
|
|
198
|
+
error: error instanceof Error ? error.message : String(error),
|
|
199
|
+
inProgress: false,
|
|
200
|
+
pythonEnv: this.getPythonCommand(options)
|
|
201
|
+
},
|
|
202
|
+
message: error instanceof Error ? error.message : String(error),
|
|
203
|
+
};
|
|
204
|
+
},
|
|
205
|
+
});
|
|
180
206
|
}
|
|
181
207
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RequirementConfig, RequirementStatus, ServerInstallOptions } from '../../metadatas/types.js';
|
|
2
|
+
import { InstallOperationManager } from '../../loaders/InstallOperationManager.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Interface for requirement installers.
|
|
@@ -12,15 +13,15 @@ export interface RequirementInstaller {
|
|
|
12
13
|
*/
|
|
13
14
|
canHandle(requirement: RequirementConfig): boolean;
|
|
14
15
|
|
|
15
|
-
|
|
16
16
|
supportCheckUpdates(): boolean;
|
|
17
|
-
|
|
18
17
|
/**
|
|
19
18
|
* Install the requirement
|
|
20
19
|
* @param requirement The requirement to install
|
|
20
|
+
* @param options Optional install options
|
|
21
|
+
* @param recorder Optional InstallOperationManager for recording steps
|
|
21
22
|
* @returns The status of the installation
|
|
22
23
|
*/
|
|
23
|
-
install(requirement: RequirementConfig, options?: ServerInstallOptions): Promise<RequirementStatus>;
|
|
24
|
+
install(requirement: RequirementConfig, recorder: InstallOperationManager, options?: ServerInstallOptions): Promise<RequirementStatus>;
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* Check if the requirement is already installed
|