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.
- package/dist/cli/commands/install.js +1 -106
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.js +1 -90
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/pull.js +1 -16
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/serve.js +1 -33
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/uninstall.js +1 -46
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.js +1 -65
- package/dist/cli/index.js.map +1 -0
- package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
- package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstaller.js +1 -163
- package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
- package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
- package/dist/core/installers/clients/ClineInstaller.js +1 -30
- package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
- package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
- package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
- package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
- package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
- package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
- package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
- package/dist/core/installers/index.js +1 -8
- package/dist/core/installers/index.js.map +1 -0
- package/dist/core/installers/requirements/BaseInstaller.js +1 -56
- package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
- package/dist/core/installers/requirements/CommandInstaller.js +1 -213
- package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
- package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
- package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
- package/dist/core/installers/requirements/InstallerFactory.js +1 -99
- package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
- package/dist/core/installers/requirements/NpmInstaller.js +1 -235
- package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
- package/dist/core/installers/requirements/NugetInstaller.js +1 -188
- package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
- package/dist/core/installers/requirements/PipInstaller.js +1 -192
- package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
- package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
- package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
- package/dist/core/loaders/ConfigurationLoader.js +1 -256
- package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
- package/dist/core/loaders/ConfigurationProvider.js +1 -383
- package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
- package/dist/core/loaders/InstallOperationManager.js +1 -310
- package/dist/core/loaders/InstallOperationManager.js.map +1 -0
- package/dist/core/loaders/ServerSchemaLoader.js +1 -108
- package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
- package/dist/core/loaders/ServerSchemaProvider.js +1 -89
- package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
- package/dist/core/loaders/SystemSettingsManager.js +1 -256
- package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
- package/dist/core/metadatas/constants.js +1 -100
- package/dist/core/metadatas/constants.js.map +1 -0
- package/dist/core/metadatas/recordingConstants.js +1 -46
- package/dist/core/metadatas/recordingConstants.js.map +1 -0
- package/dist/core/metadatas/types.js +1 -15
- package/dist/core/metadatas/types.js.map +1 -0
- package/dist/core/onboard/FeedOnboardService.js +1 -422
- package/dist/core/onboard/FeedOnboardService.js.map +1 -0
- package/dist/core/onboard/OnboardProcessor.js +1 -333
- package/dist/core/onboard/OnboardProcessor.js.map +1 -0
- package/dist/core/onboard/OnboardStatus.js +1 -9
- package/dist/core/onboard/OnboardStatus.js.map +1 -0
- package/dist/core/onboard/OnboardStatusManager.js +1 -360
- package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
- package/dist/core/validators/FeedValidator.js +1 -133
- package/dist/core/validators/FeedValidator.js.map +1 -0
- package/dist/core/validators/IServerValidator.js +1 -1
- package/dist/core/validators/IServerValidator.js.map +1 -0
- package/dist/core/validators/SSEServerValidator.js +1 -38
- package/dist/core/validators/SSEServerValidator.js.map +1 -0
- package/dist/core/validators/ServerValidatorFactory.js +1 -44
- package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
- package/dist/core/validators/StdioServerValidator.js +1 -281
- package/dist/core/validators/StdioServerValidator.js.map +1 -0
- package/dist/index.js +1 -18
- package/dist/index.js.map +1 -0
- package/dist/services/InstallationService.js +1 -81
- package/dist/services/InstallationService.js.map +1 -0
- package/dist/services/MCPManager.js +1 -197
- package/dist/services/MCPManager.js.map +1 -0
- package/dist/services/RequirementService.js +1 -548
- package/dist/services/RequirementService.js.map +1 -0
- package/dist/services/ServerService.js +1 -127
- package/dist/services/ServerService.js.map +1 -0
- package/dist/services/TelemetryService.js +1 -53
- package/dist/services/TelemetryService.js.map +1 -0
- package/dist/utils/UpdateCheckTracker.js +1 -79
- package/dist/utils/UpdateCheckTracker.js.map +1 -0
- package/dist/utils/adoUtils.js +1 -254
- package/dist/utils/adoUtils.js.map +1 -0
- package/dist/utils/clientUtils.js +1 -65
- package/dist/utils/clientUtils.js.map +1 -0
- package/dist/utils/feedUtils.js +1 -28
- package/dist/utils/feedUtils.js.map +1 -0
- package/dist/utils/githubAuth.js +1 -177
- package/dist/utils/githubAuth.js.map +1 -0
- package/dist/utils/githubUtils.js +1 -125
- package/dist/utils/githubUtils.js.map +1 -0
- package/dist/utils/logger.js +1 -176
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/macroExpressionUtils.js +1 -93
- package/dist/utils/macroExpressionUtils.js.map +1 -0
- package/dist/utils/osUtils.js +1 -664
- package/dist/utils/osUtils.js.map +1 -0
- package/dist/utils/versionUtils.js +1 -101
- package/dist/utils/versionUtils.js.map +1 -0
- package/dist/web/contract/serverContract.js +1 -1
- package/dist/web/contract/serverContract.js.map +1 -0
- package/dist/web/public/js/api.js +2 -132
- package/dist/web/public/js/api.js.map +1 -0
- package/dist/web/public/js/detailsWidget.js +2 -264
- package/dist/web/public/js/detailsWidget.js.map +1 -0
- package/dist/web/public/js/flights/flights.js +2 -127
- package/dist/web/public/js/flights/flights.js.map +1 -0
- package/dist/web/public/js/modal/index.js +2 -52
- package/dist/web/public/js/modal/index.js.map +1 -0
- package/dist/web/public/js/modal/installModal.js +2 -162
- package/dist/web/public/js/modal/installModal.js.map +1 -0
- package/dist/web/public/js/modal/installation.js +2 -266
- package/dist/web/public/js/modal/installation.js.map +1 -0
- package/dist/web/public/js/modal/loadingModal.js +2 -182
- package/dist/web/public/js/modal/loadingModal.js.map +1 -0
- package/dist/web/public/js/modal/modalSetup.js +2 -595
- package/dist/web/public/js/modal/modalSetup.js.map +1 -0
- package/dist/web/public/js/modal/modalUtils.js +2 -37
- package/dist/web/public/js/modal/modalUtils.js.map +1 -0
- package/dist/web/public/js/modal/versionUtils.js +2 -20
- package/dist/web/public/js/modal/versionUtils.js.map +1 -0
- package/dist/web/public/js/modal.js +2 -42
- package/dist/web/public/js/modal.js.map +1 -0
- package/dist/web/public/js/notifications.js +2 -137
- package/dist/web/public/js/notifications.js.map +1 -0
- package/dist/web/public/js/onboard/formProcessor.js +2 -1037
- package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
- package/dist/web/public/js/onboard/index.js +2 -374
- package/dist/web/public/js/onboard/index.js.map +1 -0
- package/dist/web/public/js/onboard/publishHandler.js +2 -172
- package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
- package/dist/web/public/js/onboard/state.js +2 -76
- package/dist/web/public/js/onboard/state.js.map +1 -0
- package/dist/web/public/js/onboard/templates.js +2 -342
- package/dist/web/public/js/onboard/templates.js.map +1 -0
- package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
- package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
- package/dist/web/public/js/onboard/validationHandlers.js +2 -493
- package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
- package/dist/web/public/js/serverCategoryDetails.js +2 -364
- package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
- package/dist/web/public/js/serverCategoryList.js +2 -241
- package/dist/web/public/js/serverCategoryList.js.map +1 -0
- package/dist/web/public/js/settings.js +2 -314
- package/dist/web/public/js/settings.js.map +1 -0
- package/dist/web/server.js +1 -404
- package/dist/web/server.js.map +1 -0
- package/package.json +8 -2
- package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
- package/.github/acl/access.yml +0 -20
- package/.github/compliance/inventory.yml +0 -5
- package/.github/policies/jit.yml +0 -19
- package/.github/workflows/build.yml +0 -28
- package/.roo/rules-code/rules.md +0 -88
- package/dist/cli/commands/start.d.ts +0 -2
- package/dist/cli/commands/start.js +0 -32
- package/dist/cli/commands/sync.d.ts +0 -2
- package/dist/cli/commands/sync.js +0 -17
- package/dist/core/ConfigurationLoader.d.ts +0 -32
- package/dist/core/ConfigurationLoader.js +0 -236
- package/dist/core/ConfigurationProvider.d.ts +0 -35
- package/dist/core/ConfigurationProvider.js +0 -375
- package/dist/core/InstallationService.d.ts +0 -50
- package/dist/core/InstallationService.js +0 -350
- package/dist/core/MCPManager.d.ts +0 -28
- package/dist/core/MCPManager.js +0 -188
- package/dist/core/RequirementService.d.ts +0 -40
- package/dist/core/RequirementService.js +0 -110
- package/dist/core/ServerSchemaLoader.d.ts +0 -11
- package/dist/core/ServerSchemaLoader.js +0 -43
- package/dist/core/ServerSchemaProvider.d.ts +0 -17
- package/dist/core/ServerSchemaProvider.js +0 -120
- package/dist/core/constants.d.ts +0 -47
- package/dist/core/constants.js +0 -94
- package/dist/core/installers/BaseInstaller.d.ts +0 -74
- package/dist/core/installers/BaseInstaller.js +0 -253
- package/dist/core/installers/ClientInstaller.d.ts +0 -23
- package/dist/core/installers/ClientInstaller.js +0 -564
- package/dist/core/installers/CommandInstaller.d.ts +0 -37
- package/dist/core/installers/CommandInstaller.js +0 -173
- package/dist/core/installers/GeneralInstaller.d.ts +0 -33
- package/dist/core/installers/GeneralInstaller.js +0 -85
- package/dist/core/installers/InstallerFactory.d.ts +0 -54
- package/dist/core/installers/InstallerFactory.js +0 -97
- package/dist/core/installers/NpmInstaller.d.ts +0 -26
- package/dist/core/installers/NpmInstaller.js +0 -127
- package/dist/core/installers/PipInstaller.d.ts +0 -28
- package/dist/core/installers/PipInstaller.js +0 -127
- package/dist/core/installers/RequirementInstaller.d.ts +0 -33
- package/dist/core/installers/RequirementInstaller.js +0 -3
- package/dist/core/types.d.ts +0 -166
- package/dist/core/types.js +0 -16
- package/dist/services/InstallRequestValidator.d.ts +0 -21
- package/dist/services/InstallRequestValidator.js +0 -99
- package/dist/web/public/js/modal/installHandler.js +0 -227
- package/dist/web/public/js/modal/loadingUI.js +0 -74
- package/dist/web/public/js/modal/messageQueue.js +0 -112
- package/dist/web/public/js/modal/modalUI.js +0 -214
- package/dist/web/public/js/modal/version.js +0 -20
- package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
- package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
- package/docs/Telemetry.md +0 -136
- package/memory-bank/activeContext.md +0 -26
- package/memory-bank/decisionLog.md +0 -91
- package/memory-bank/productContext.md +0 -41
- package/memory-bank/progress.md +0 -35
- package/memory-bank/systemPatterns.md +0 -10
- package/src/cli/commands/install.ts +0 -139
- package/src/cli/commands/list.ts +0 -113
- package/src/cli/commands/pull.ts +0 -16
- package/src/cli/commands/serve.ts +0 -39
- package/src/cli/commands/uninstall.ts +0 -64
- package/src/cli/index.ts +0 -82
- package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
- package/src/core/installers/clients/ClientInstaller.ts +0 -222
- package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
- package/src/core/installers/clients/ClineInstaller.ts +0 -35
- package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
- package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
- package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
- package/src/core/installers/index.ts +0 -11
- package/src/core/installers/requirements/BaseInstaller.ts +0 -85
- package/src/core/installers/requirements/CommandInstaller.ts +0 -231
- package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
- package/src/core/installers/requirements/InstallerFactory.ts +0 -114
- package/src/core/installers/requirements/NpmInstaller.ts +0 -271
- package/src/core/installers/requirements/NugetInstaller.ts +0 -203
- package/src/core/installers/requirements/PipInstaller.ts +0 -207
- package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
- package/src/core/loaders/ConfigurationLoader.ts +0 -298
- package/src/core/loaders/ConfigurationProvider.ts +0 -462
- package/src/core/loaders/InstallOperationManager.ts +0 -367
- package/src/core/loaders/ServerSchemaLoader.ts +0 -117
- package/src/core/loaders/ServerSchemaProvider.ts +0 -99
- package/src/core/loaders/SystemSettingsManager.ts +0 -278
- package/src/core/metadatas/constants.ts +0 -122
- package/src/core/metadatas/recordingConstants.ts +0 -65
- package/src/core/metadatas/types.ts +0 -202
- package/src/core/onboard/FeedOnboardService.ts +0 -501
- package/src/core/onboard/OnboardProcessor.ts +0 -356
- package/src/core/onboard/OnboardStatus.ts +0 -60
- package/src/core/onboard/OnboardStatusManager.ts +0 -416
- package/src/core/validators/FeedValidator.ts +0 -135
- package/src/core/validators/IServerValidator.ts +0 -21
- package/src/core/validators/SSEServerValidator.ts +0 -43
- package/src/core/validators/ServerValidatorFactory.ts +0 -51
- package/src/core/validators/StdioServerValidator.ts +0 -313
- package/src/index.ts +0 -44
- package/src/services/InstallationService.ts +0 -102
- package/src/services/MCPManager.ts +0 -249
- package/src/services/RequirementService.ts +0 -627
- package/src/services/ServerService.ts +0 -161
- package/src/services/TelemetryService.ts +0 -59
- package/src/utils/UpdateCheckTracker.ts +0 -86
- package/src/utils/adoUtils.ts +0 -293
- package/src/utils/clientUtils.ts +0 -72
- package/src/utils/feedUtils.ts +0 -31
- package/src/utils/githubAuth.ts +0 -212
- package/src/utils/githubUtils.ts +0 -164
- package/src/utils/logger.ts +0 -195
- package/src/utils/macroExpressionUtils.ts +0 -104
- package/src/utils/osUtils.ts +0 -700
- package/src/utils/versionUtils.ts +0 -114
- package/src/web/contract/serverContract.ts +0 -74
- package/src/web/public/css/detailsWidget.css +0 -235
- package/src/web/public/css/modal.css +0 -757
- package/src/web/public/css/notifications.css +0 -101
- package/src/web/public/css/onboard.css +0 -107
- package/src/web/public/css/serverCategoryList.css +0 -120
- package/src/web/public/css/serverDetails.css +0 -139
- package/src/web/public/index.html +0 -359
- package/src/web/public/js/api.js +0 -132
- package/src/web/public/js/detailsWidget.js +0 -264
- package/src/web/public/js/flights/flights.js +0 -127
- package/src/web/public/js/modal/index.js +0 -52
- package/src/web/public/js/modal/installModal.js +0 -162
- package/src/web/public/js/modal/installation.js +0 -266
- package/src/web/public/js/modal/loadingModal.js +0 -182
- package/src/web/public/js/modal/modalSetup.js +0 -595
- package/src/web/public/js/modal/modalUtils.js +0 -37
- package/src/web/public/js/modal/versionUtils.js +0 -20
- package/src/web/public/js/modal.js +0 -42
- package/src/web/public/js/notifications.js +0 -137
- package/src/web/public/js/onboard/formProcessor.js +0 -1037
- package/src/web/public/js/onboard/index.js +0 -374
- package/src/web/public/js/onboard/publishHandler.js +0 -172
- package/src/web/public/js/onboard/state.js +0 -76
- package/src/web/public/js/onboard/templates.js +0 -342
- package/src/web/public/js/onboard/uiHandlers.js +0 -1076
- package/src/web/public/js/onboard/validationHandlers.js +0 -493
- package/src/web/public/js/serverCategoryDetails.js +0 -364
- package/src/web/public/js/serverCategoryList.js +0 -241
- package/src/web/public/js/settings.js +0 -314
- package/src/web/public/modal.html +0 -84
- package/src/web/public/onboard.html +0 -296
- package/src/web/public/settings.html +0 -135
- package/src/web/public/styles.css +0 -277
- package/src/web/server.ts +0 -478
- package/tsconfig.json +0 -18
- package/wiki/Installation.md +0 -3
- package/wiki/Publish.md +0 -3
package/src/utils/feedUtils.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import { Logger } from './logger.js';
|
|
3
|
-
import { LOCAL_FEEDS_DIR } from '../core/metadatas/constants.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Checks if local feeds exist in the LOCAL_FEEDS_DIR
|
|
7
|
-
* Returns true if the directory exists and contains at least one .json file
|
|
8
|
-
*/
|
|
9
|
-
export async function hasLocalFeeds(): Promise<boolean> {
|
|
10
|
-
try {
|
|
11
|
-
Logger.debug('Checking for local feeds existence');
|
|
12
|
-
const feedsExist = await fs.access(LOCAL_FEEDS_DIR)
|
|
13
|
-
.then(() => true)
|
|
14
|
-
.catch(() => false);
|
|
15
|
-
|
|
16
|
-
if (!feedsExist) {
|
|
17
|
-
Logger.debug('Local feeds directory does not exist');
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Check if directory contains any json files
|
|
22
|
-
const files = await fs.readdir(LOCAL_FEEDS_DIR);
|
|
23
|
-
const hasJsonFiles = files.some(file => file.endsWith('.json'));
|
|
24
|
-
|
|
25
|
-
Logger.debug(`Local feeds directory ${hasJsonFiles ? 'contains' : 'does not contain'} JSON files`);
|
|
26
|
-
return hasJsonFiles;
|
|
27
|
-
} catch (error) {
|
|
28
|
-
Logger.error('Error checking local feeds:', error);
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
package/src/utils/githubAuth.ts
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import { isToolInstalled, installCLI } from './osUtils.js';
|
|
2
|
-
import { exec, spawn } from 'child_process';
|
|
3
|
-
import util from 'util';
|
|
4
|
-
import { Logger } from './logger.js';
|
|
5
|
-
import fs from 'fs/promises';
|
|
6
|
-
import path from 'path';
|
|
7
|
-
import { USER_INFO_PATH } from '../core/metadatas/constants.js';
|
|
8
|
-
|
|
9
|
-
interface UserInfo {
|
|
10
|
-
alias?: string;
|
|
11
|
-
name?: string;
|
|
12
|
-
email?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const execAsync = util.promisify(exec);
|
|
17
|
-
|
|
18
|
-
// Create a promisified version of spawn that returns a Promise
|
|
19
|
-
const spawnAsync = (command: string, args: string[], options: any = {}) => {
|
|
20
|
-
return new Promise((resolve, reject) => {
|
|
21
|
-
const childProcess = spawn(command, args, options);
|
|
22
|
-
|
|
23
|
-
childProcess.on('close', (code) => {
|
|
24
|
-
if (code === 0) {
|
|
25
|
-
resolve(code);
|
|
26
|
-
} else {
|
|
27
|
-
reject(new Error(`Process exited with code ${code}`));
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
childProcess.on('error', (err) => {
|
|
32
|
-
reject(err);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
class GithubAuthError extends Error {
|
|
38
|
-
constructor(message: string) {
|
|
39
|
-
super(message);
|
|
40
|
-
this.name = 'GithubAuthError';
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function checkGithubAuth(): Promise<void> {
|
|
45
|
-
Logger.debug('Starting GitHub authentication check');
|
|
46
|
-
|
|
47
|
-
try {
|
|
48
|
-
// Check if gh CLI is installed
|
|
49
|
-
if (!await isToolInstalled('gh')) {
|
|
50
|
-
Logger.log('Installing required GitHub CLI...');
|
|
51
|
-
await installCLI('gh');
|
|
52
|
-
|
|
53
|
-
// Verify gh CLI was installed correctly, with retry mechanism
|
|
54
|
-
if (!await isToolInstalled('gh')) {
|
|
55
|
-
throw new Error('Failed to install GitHub CLI. Please install it manually and try again.');
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
Logger.debug('GitHub CLI installed successfully and verified');
|
|
59
|
-
}
|
|
60
|
-
} catch (error) {
|
|
61
|
-
Logger.error('Error during tool installation:', error);
|
|
62
|
-
throw new Error(`Tool installation failed: ${(error as Error).message}`);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
Logger.debug('Checking GitHub authentication status');
|
|
67
|
-
// Check if user is authenticated
|
|
68
|
-
const { stdout: viewerData } = await execAsync('gh api user');
|
|
69
|
-
const viewer = JSON.parse(viewerData);
|
|
70
|
-
|
|
71
|
-
Logger.debug({
|
|
72
|
-
action: 'github_auth_check',
|
|
73
|
-
username: viewer.login
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Check if user is using company account (ends with _microsoft)
|
|
77
|
-
if (!viewer.login.toLowerCase().endsWith('_microsoft')) {
|
|
78
|
-
const error = 'Error: You must be logged in with a Microsoft account (username should end with _microsoft). ' +
|
|
79
|
-
'Please run "gh auth logout" and then "gh auth login" with your Microsoft account. Current username: ' +
|
|
80
|
-
viewer.login;
|
|
81
|
-
Logger.error(error, {
|
|
82
|
-
username: viewer.login
|
|
83
|
-
});
|
|
84
|
-
throw new GithubAuthError(error);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// After Microsoft account verification, persist user information
|
|
88
|
-
await persistUserInfo();
|
|
89
|
-
|
|
90
|
-
Logger.debug('GitHub authentication verified successfully with Microsoft account');
|
|
91
|
-
} catch (error) {
|
|
92
|
-
if (error instanceof GithubAuthError) {
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// If the error is due to not being authenticated
|
|
97
|
-
const errorMessage = (error as any)?.stderr || (error as Error).message;
|
|
98
|
-
if (errorMessage.includes('please run: gh auth login') || errorMessage.includes('GH_TOKEN')) {
|
|
99
|
-
Logger.log('GitHub authentication required at the first run. Please login account end with _microsoft.');
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
// Use spawnAsync for interactive authentication
|
|
103
|
-
await spawnAsync('gh', ['auth', 'login', '--web', '--hostname', 'github.com', '--git-protocol', 'https'], {
|
|
104
|
-
stdio: 'inherit' // User sees & interacts directly with the process
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
Logger.debug('GitHub authentication process completed');
|
|
108
|
-
|
|
109
|
-
// Verify the authentication was successful
|
|
110
|
-
const { stdout: viewerData } = await execAsync('gh api user');
|
|
111
|
-
const viewer = JSON.parse(viewerData);
|
|
112
|
-
|
|
113
|
-
// Check if user is using company account (ends with _microsoft)
|
|
114
|
-
if (!viewer.login.toLowerCase().endsWith('_microsoft')) {
|
|
115
|
-
throw new GithubAuthError('You must be logged in with a Microsoft account (username should end with _microsoft).');
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// After Microsoft account verification, persist user information
|
|
119
|
-
await persistUserInfo();
|
|
120
|
-
Logger.debug(`Successfully authenticated as ${viewer.login}`);
|
|
121
|
-
return; // Auth successful, continue execution
|
|
122
|
-
} catch (loginError) {
|
|
123
|
-
Logger.error('Error during GitHub authentication process', loginError);
|
|
124
|
-
|
|
125
|
-
// If the interactive login failed, provide manual instructions
|
|
126
|
-
const authInstructions =
|
|
127
|
-
'\nError: GitHub authentication required. Please follow these steps:\n\n' +
|
|
128
|
-
'1. Run this command:\n' +
|
|
129
|
-
' gh auth login --web --hostname github.com --git-protocol https\n' +
|
|
130
|
-
'2. Choose Y when prompted authenticating Git with your GitHub credentials.\n' +
|
|
131
|
-
'3. Follow the prompts to login with your Microsoft account (username must end with _microsoft)\n' +
|
|
132
|
-
'4. Authorize ai-microsoft organization.\n' +
|
|
133
|
-
'5. After successful login, run imcp command again.\n\n';
|
|
134
|
-
|
|
135
|
-
Logger.log(authInstructions);
|
|
136
|
-
throw new GithubAuthError('GitHub authentication required. Please login first and try again.');
|
|
137
|
-
}
|
|
138
|
-
} else {
|
|
139
|
-
const errorMessage = `Failed to verify GitHub authentication: ${(error as Error).message}`;
|
|
140
|
-
Logger.error(errorMessage, error);
|
|
141
|
-
throw new GithubAuthError(errorMessage);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Persists GitHub user information to the system-specific settings directory.
|
|
148
|
-
* Only performs persistence on non-Windows systems (Linux/macOS).
|
|
149
|
-
*/
|
|
150
|
-
async function persistUserInfo(): Promise<void> {
|
|
151
|
-
try {
|
|
152
|
-
Logger.debug('Starting user information persistence check');
|
|
153
|
-
|
|
154
|
-
// 1. Skip persistence on Windows systems
|
|
155
|
-
if (process.platform === 'win32') {
|
|
156
|
-
Logger.debug('Skipping user info persistence on Windows system');
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// 2. Check if file exists and has all required keys
|
|
161
|
-
try {
|
|
162
|
-
if (await fs.access(USER_INFO_PATH).then(() => true).catch(() => false)) {
|
|
163
|
-
const existingContent = await fs.readFile(USER_INFO_PATH, 'utf8');
|
|
164
|
-
const existingData: UserInfo = JSON.parse(existingContent);
|
|
165
|
-
|
|
166
|
-
if (existingData.alias && existingData.name && existingData.email) {
|
|
167
|
-
Logger.debug('User info already exists with all required fields, skipping update');
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
} catch (err) {
|
|
172
|
-
Logger.debug('No valid existing user info found, proceeding with persistence');
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Proceed with persistence since both checks passed
|
|
176
|
-
Logger.debug('Proceeding with user information persistence');
|
|
177
|
-
|
|
178
|
-
// Get user info from GitHub API
|
|
179
|
-
const { stdout: userDataStr } = await execAsync('gh api user');
|
|
180
|
-
const userData = JSON.parse(userDataStr);
|
|
181
|
-
const { login, name, email } = userData;
|
|
182
|
-
|
|
183
|
-
Logger.debug({ message: 'Retrieved user information from GitHub API', login, name, email });
|
|
184
|
-
|
|
185
|
-
// Check if login ends with _microsoft
|
|
186
|
-
if (!login.toLowerCase().endsWith('_microsoft')) {
|
|
187
|
-
Logger.log(`GitHub login "${login}" does not end with _microsoft, skipping user information persistence`);
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Create directory if it doesn't exist
|
|
192
|
-
await fs.mkdir(path.dirname(USER_INFO_PATH), { recursive: true });
|
|
193
|
-
Logger.debug(`Ensuring directory exists for user info at ${USER_INFO_PATH}`);
|
|
194
|
-
|
|
195
|
-
// Extract alias from login (remove _microsoft suffix)
|
|
196
|
-
const alias = login.toLowerCase().replace(/_microsoft$/, '');
|
|
197
|
-
|
|
198
|
-
// Prepare user information
|
|
199
|
-
const userInfo: UserInfo = {
|
|
200
|
-
alias,
|
|
201
|
-
name,
|
|
202
|
-
email
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
// Write user information to file
|
|
206
|
-
await fs.writeFile(USER_INFO_PATH, JSON.stringify(userInfo, null, 2));
|
|
207
|
-
Logger.debug({ message: 'User information persisted successfully', path: USER_INFO_PATH, alias });
|
|
208
|
-
} catch (error) {
|
|
209
|
-
Logger.error('Failed to persist user information:', error);
|
|
210
|
-
// Don't throw - persistence failure shouldn't block auth flow
|
|
211
|
-
}
|
|
212
|
-
}
|
package/src/utils/githubUtils.ts
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { RegistryConfig, RequirementConfig } from '../core/metadatas/types.js';
|
|
2
|
-
import { exec } from 'child_process';
|
|
3
|
-
import util from 'util';
|
|
4
|
-
import fs from 'fs/promises';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import { extractZipFile } from './clientUtils.js';
|
|
7
|
-
import { Logger } from './logger.js';
|
|
8
|
-
import { SETTINGS_DIR } from '../core/metadatas/constants.js';
|
|
9
|
-
|
|
10
|
-
const execAsync = util.promisify(exec);
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Get the latest version available for a GitHub repository
|
|
14
|
-
* @param execPromise The promise-based exec function
|
|
15
|
-
* @param repository The GitHub repository in format 'owner/repo'
|
|
16
|
-
* @returns The latest version or tag
|
|
17
|
-
*/
|
|
18
|
-
export async function getGitHubLatestVersion(execPromise: (command: string) => Promise<{ stdout: string; stderr: string }>, repository: string): Promise<string> {
|
|
19
|
-
try {
|
|
20
|
-
// Use GitHub CLI to get the latest release
|
|
21
|
-
const { stdout } = await execPromise(`gh release view --repo ${repository} --json tagName --jq .tagName`);
|
|
22
|
-
const latestTag = stdout.trim();
|
|
23
|
-
|
|
24
|
-
// Remove 'v' prefix if present
|
|
25
|
-
return latestTag.startsWith('v') ? latestTag.substring(1) : latestTag;
|
|
26
|
-
} catch (error) {
|
|
27
|
-
// If gh command fails, try to get the latest tag
|
|
28
|
-
const { stdout } = await execPromise(`git ls-remote --tags --refs https://github.com/${repository}.git | sort -t '/' -k 3 -V | tail -n 1 | awk -F/ '{print $3}'`);
|
|
29
|
-
let latestTag = stdout.trim();
|
|
30
|
-
|
|
31
|
-
// Remove 'v' prefix if present
|
|
32
|
-
return latestTag.startsWith('v') ? latestTag.substring(1) : latestTag;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
interface DownloadGithubReleaseResult {
|
|
37
|
-
version: string;
|
|
38
|
-
downloadPath: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Downloads a GitHub release asset
|
|
43
|
-
* @param repo GitHub repository in format owner/repo
|
|
44
|
-
* @param version Version to download, can be "latest"
|
|
45
|
-
* @param assetsName Assets name pattern (optional, but either assetsName or assetName must be provided)
|
|
46
|
-
* @param assetName Asset name pattern (optional, but either assetsName or assetName must be provided)
|
|
47
|
-
* @param isFolder Whether to treat the downloaded asset as a folder (default: false)
|
|
48
|
-
* @param targetDirectory Target directory for downloads (default: SETTINGS_DIR/downloads)
|
|
49
|
-
* @returns Object containing version and download path
|
|
50
|
-
*/
|
|
51
|
-
export async function downloadGithubRelease(
|
|
52
|
-
repo: string,
|
|
53
|
-
version: string,
|
|
54
|
-
assetsName?: string,
|
|
55
|
-
assetName?: string,
|
|
56
|
-
isFolder: boolean = false,
|
|
57
|
-
targetDirectory?: string
|
|
58
|
-
): Promise<DownloadGithubReleaseResult> {
|
|
59
|
-
if (!repo) {
|
|
60
|
-
throw new Error('GitHub repository is required');
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (!assetsName && !assetName) {
|
|
64
|
-
throw new Error('Either assetsName or assetName must be specified');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const downloadsDir = targetDirectory || path.join(SETTINGS_DIR, 'downloads');
|
|
68
|
-
await fs.mkdir(downloadsDir, { recursive: true });
|
|
69
|
-
|
|
70
|
-
// Get latest version if needed
|
|
71
|
-
const { stdout } = await execAsync(`gh release view --repo ${repo} --json tagName --jq .tagName`);
|
|
72
|
-
const latestTag = stdout.trim();
|
|
73
|
-
let latestVersion = latestTag;
|
|
74
|
-
|
|
75
|
-
const tagWithVPrefix = latestVersion.startsWith('v');
|
|
76
|
-
if (tagWithVPrefix) latestVersion = latestVersion.substring(1); // Remove 'v' prefix if present
|
|
77
|
-
const resolvedVersion = version.includes("latest") ? latestVersion : version;
|
|
78
|
-
|
|
79
|
-
// Resolve asset names
|
|
80
|
-
let resolvedAssetsName = '';
|
|
81
|
-
let resolvedAssetName = '';
|
|
82
|
-
if (assetsName) {
|
|
83
|
-
resolvedAssetsName = assetsName.replace('${latest}', resolvedVersion).replace('${version}', resolvedVersion);
|
|
84
|
-
}
|
|
85
|
-
if (assetName) {
|
|
86
|
-
resolvedAssetName = assetName.replace('${latest}', resolvedVersion).replace('${version}', resolvedVersion);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Validate zip requirement for isFolder
|
|
90
|
-
const pattern = resolvedAssetsName || resolvedAssetName;
|
|
91
|
-
if (isFolder && (!resolvedAssetsName || !resolvedAssetsName.endsWith('.zip'))) {
|
|
92
|
-
throw new Error('When isFolder is true, assetsName must be provided and end with .zip');
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Download the release asset
|
|
96
|
-
const downloadPath = path.join(downloadsDir, path.basename(pattern));
|
|
97
|
-
if (!await fileExists(downloadPath)) {
|
|
98
|
-
await execAsync(`gh release download ${tagWithVPrefix ? `v${resolvedVersion}` : resolvedVersion} --repo ${repo} --pattern "${pattern}" -O "${downloadPath}"`);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Handle zip extraction if needed
|
|
102
|
-
if (isFolder && downloadPath.endsWith('.zip')) {
|
|
103
|
-
const extractDir = path.join(downloadsDir, path.basename(pattern, '.zip'));
|
|
104
|
-
await fs.mkdir(extractDir, { recursive: true });
|
|
105
|
-
await extractZipFile(downloadPath, { dir: extractDir });
|
|
106
|
-
|
|
107
|
-
// If resolvedAssetName is specified, look for it in the extracted directory
|
|
108
|
-
if (resolvedAssetName) {
|
|
109
|
-
const assetPath = path.join(extractDir, resolvedAssetName);
|
|
110
|
-
try {
|
|
111
|
-
await fs.access(assetPath);
|
|
112
|
-
return { version: resolvedVersion, downloadPath: assetPath };
|
|
113
|
-
} catch (error) {
|
|
114
|
-
throw new Error(`Asset ${resolvedAssetName} not found in extracted directory ${extractDir}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return { version: resolvedVersion, downloadPath: extractDir };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return { version: resolvedVersion, downloadPath };
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Helper to handle GitHub release downloads
|
|
125
|
-
* @param requirement The requirement configuration
|
|
126
|
-
* @param registry The GitHub release registry configuration
|
|
127
|
-
* @returns The path to the downloaded file
|
|
128
|
-
*/
|
|
129
|
-
export async function handleGitHubRelease(
|
|
130
|
-
requirement: RequirementConfig,
|
|
131
|
-
registry: RegistryConfig['githubRelease']
|
|
132
|
-
): Promise<{ resolvedVersion: string; resolvedPath: string }> {
|
|
133
|
-
if (!registry) {
|
|
134
|
-
throw new Error('GitHub release registry configuration is required');
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const { repository, assetsName, assetName } = registry;
|
|
138
|
-
if (!repository) {
|
|
139
|
-
throw new Error('GitHub repository is required for GitHub release downloads');
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const isZipAsset = assetsName?.endsWith('.zip') || false;
|
|
143
|
-
const result = await downloadGithubRelease(
|
|
144
|
-
repository,
|
|
145
|
-
requirement.version,
|
|
146
|
-
assetsName,
|
|
147
|
-
assetName,
|
|
148
|
-
isZipAsset
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
resolvedVersion: result.version,
|
|
153
|
-
resolvedPath: result.downloadPath
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async function fileExists(filePath: string): Promise<boolean> {
|
|
158
|
-
try {
|
|
159
|
-
await fs.access(filePath);
|
|
160
|
-
return true;
|
|
161
|
-
} catch {
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
}
|
package/src/utils/logger.ts
DELETED
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import { SETTINGS_DIR, USER_INFO_PATH } from '../core/metadatas/constants.js';
|
|
5
|
-
import { TelemetryService } from '../services/TelemetryService.js';
|
|
6
|
-
import { getPackageVersion } from './versionUtils.js';
|
|
7
|
-
|
|
8
|
-
export enum EventType {
|
|
9
|
-
IMCP_SERVE = 'imcp_serve',
|
|
10
|
-
SERVER_INSTALL = 'server_install',
|
|
11
|
-
SERVER_UNINSTALL = 'server_uninstall',
|
|
12
|
-
REQUIREMENT_UPDATE = 'requirement_update',
|
|
13
|
-
FEED_ONBOARD = 'feed_onboard',
|
|
14
|
-
FEED_VALIDATE = 'feed_validate'
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export enum EventStatus {
|
|
18
|
-
SUCCESS = 'success',
|
|
19
|
-
FAILED = 'failed'
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export class Logger {
|
|
23
|
-
private static verbose = false;
|
|
24
|
-
private static fileLoggingEnabled = true;
|
|
25
|
-
private static logsDir = path.join(SETTINGS_DIR, 'logs');
|
|
26
|
-
private static isTestEnvironment: boolean = false;
|
|
27
|
-
private static packageVersion = getPackageVersion().packageVersion;
|
|
28
|
-
|
|
29
|
-
static setVerbose(isVerbose: boolean): void {
|
|
30
|
-
this.verbose = isVerbose;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
static setFileLogging(enabled: boolean): void {
|
|
34
|
-
this.fileLoggingEnabled = enabled;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
private static async ensureLogsDirExists(): Promise<void> {
|
|
38
|
-
try {
|
|
39
|
-
await fs.promises.mkdir(this.logsDir, { recursive: true });
|
|
40
|
-
} catch (error) {
|
|
41
|
-
console.error(`Failed to create logs directory: ${error instanceof Error ? error.message : String(error)}`);
|
|
42
|
-
// Disable file logging if directory creation fails
|
|
43
|
-
this.fileLoggingEnabled = false;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
private static getLogFileName(): string {
|
|
48
|
-
const now = new Date();
|
|
49
|
-
const year = now.getFullYear();
|
|
50
|
-
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
51
|
-
const day = String(now.getDate()).padStart(2, '0');
|
|
52
|
-
return `${year}-${month}-${day}.log`;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
private static getTimestamp(): string {
|
|
56
|
-
return new Date().toISOString();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
private static async writeToLogFile(level: string, content: string): Promise<void> {
|
|
60
|
-
if (!this.fileLoggingEnabled) return;
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
await this.ensureLogsDirExists();
|
|
64
|
-
const logFile = path.join(this.logsDir, this.getLogFileName());
|
|
65
|
-
const logEntry = `[${this.getTimestamp()}] [${level}] ${content}\n`;
|
|
66
|
-
|
|
67
|
-
await fs.promises.appendFile(logFile, logEntry, { encoding: 'utf8' });
|
|
68
|
-
} catch (error) {
|
|
69
|
-
console.error(`Failed to write to log file: ${error instanceof Error ? error.message : String(error)}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
static async log(message: string): Promise<void> {
|
|
74
|
-
console.log(message);
|
|
75
|
-
await this.writeToLogFile('INFO', message);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
static async info(message: string): Promise<void> {
|
|
79
|
-
console.info(message);
|
|
80
|
-
await this.writeToLogFile('INFO', message);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
static async warn(message: string): Promise<void> {
|
|
84
|
-
const yellowColor = '\x1b[33m';
|
|
85
|
-
const resetColor = '\x1b[0m';
|
|
86
|
-
console.warn(`${yellowColor}${message}${resetColor}`);
|
|
87
|
-
await this.writeToLogFile('WARN', message);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
static async debug(message: string | object): Promise<void> {
|
|
91
|
-
let formattedMessage: string;
|
|
92
|
-
|
|
93
|
-
if (typeof message === 'object') {
|
|
94
|
-
formattedMessage = JSON.stringify(message, null, 2);
|
|
95
|
-
if (this.verbose) {
|
|
96
|
-
console.log(formattedMessage);
|
|
97
|
-
}
|
|
98
|
-
} else {
|
|
99
|
-
formattedMessage = message;
|
|
100
|
-
if (this.verbose) {
|
|
101
|
-
console.log(message);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (this.verbose) {
|
|
106
|
-
await this.writeToLogFile('DEBUG', formattedMessage);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
static async error(message: string, error?: unknown): Promise<void> {
|
|
111
|
-
console.error(message);
|
|
112
|
-
|
|
113
|
-
let logMessage = message;
|
|
114
|
-
|
|
115
|
-
if (this.verbose && error) {
|
|
116
|
-
if (error instanceof Error) {
|
|
117
|
-
const errorDetails = {
|
|
118
|
-
name: error.name,
|
|
119
|
-
message: error.message,
|
|
120
|
-
stack: error.stack
|
|
121
|
-
};
|
|
122
|
-
console.error('Error details:', errorDetails);
|
|
123
|
-
logMessage += `\nError details: ${JSON.stringify(errorDetails, null, 2)}`;
|
|
124
|
-
} else {
|
|
125
|
-
console.error('Error details:', error);
|
|
126
|
-
logMessage += `\nError details: ${JSON.stringify(error, null, 2)}`;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
await this.writeToLogFile('ERROR', logMessage);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
private static getUsername(): string {
|
|
134
|
-
try {
|
|
135
|
-
// If on Windows, use os username directly
|
|
136
|
-
if (process.platform === 'win32') {
|
|
137
|
-
return os.userInfo().username;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// For Mac/Linux users
|
|
141
|
-
try {
|
|
142
|
-
const userInfoPath = USER_INFO_PATH;
|
|
143
|
-
|
|
144
|
-
if (fs.existsSync(userInfoPath)) {
|
|
145
|
-
const userInfo = JSON.parse(fs.readFileSync(userInfoPath, 'utf8'));
|
|
146
|
-
if (userInfo.alias) {
|
|
147
|
-
return userInfo.alias;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
} catch (error) {
|
|
151
|
-
this.error('Failed to get user info from file', error);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Fall back to os username if all else fails
|
|
155
|
-
return os.userInfo().username;
|
|
156
|
-
} catch (error) {
|
|
157
|
-
this.error('Failed to get username', error);
|
|
158
|
-
return 'unknown';
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
static trackEvent(eventType: EventType, dimensions: Record<string, any>): void {
|
|
163
|
-
try {
|
|
164
|
-
const username = this.getUsername();
|
|
165
|
-
|
|
166
|
-
// Add username and package version to dimensions
|
|
167
|
-
const allDimensions = {
|
|
168
|
-
username,
|
|
169
|
-
packageVersion: this.packageVersion,
|
|
170
|
-
...dimensions
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
// Log to file
|
|
174
|
-
if (this.verbose) {
|
|
175
|
-
this.log(`Event: ${eventType}`);
|
|
176
|
-
this.log(JSON.stringify(allDimensions, null, 2));
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Skip AppInsights in test environment
|
|
180
|
-
if (Logger.isTestEnvironment) {
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Log to Application Insights
|
|
185
|
-
try {
|
|
186
|
-
TelemetryService.trackEvent(eventType, allDimensions);
|
|
187
|
-
TelemetryService.flush();
|
|
188
|
-
} catch (insightsError) {
|
|
189
|
-
this.error('Failed to track event in Application Insights', insightsError);
|
|
190
|
-
}
|
|
191
|
-
} catch (error) {
|
|
192
|
-
this.error('Failed to log event', error);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|