imcp 0.1.6 → 0.1.8-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["buildUrlWithFlights"],"sources":["0"],"sourcesContent":["import { buildUrlWithFlights } from './flights/flights.js';\n\n// Toast notification function\nfunction showToast(message, type = 'success') {\n const toastContainer = document.querySelector('.toast-container');\n if (!toastContainer) return;\n\n const toastId = `toast-${Date.now()}`;\n const toastHTML = `\n <div id=\"${toastId}\" class=\"toast align-items-center text-white bg-${type === 'success' ? 'success' : 'danger'} border-0\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n <div class=\"d-flex\">\n <div class=\"toast-body\">\n ${message}\n </div>\n <button type=\"button\" class=\"btn-close btn-close-white me-2 m-auto\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n </div>\n </div>\n `;\n toastContainer.insertAdjacentHTML('beforeend', toastHTML);\n const toastElement = document.getElementById(toastId);\n const toast = new bootstrap.Toast(toastElement, { delay: 3000 });\n toast.show();\n toastElement.addEventListener('hidden.bs.toast', () => {\n toastElement.remove();\n });\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n // All DOM element queries and event listeners must be inside this block!\n const settingsForm = document.getElementById('settingsForm');\n const nodePathInput = document.getElementById('nodePath');\n const browserPathInput = document.getElementById('browserPath');\n const systemEnvironmentsDiv = document.getElementById('systemEnvironments');\n \n // Python Environments elements\n const pythonEnvsContainer = document.getElementById('pythonEnvsContainer');\n const addPythonEnvButton = document.getElementById('addPythonEnvButton');\n const pythonEnvsLoadingMsg = document.getElementById('pythonEnvsLoadingMsg');\n \n // User Configurations elements\n const userConfigurationsContainer = document.getElementById('userConfigurationsContainer');\n const addUserConfigButton = document.getElementById('addUserConfigButton');\n const userConfigLoadingMsg = document.getElementById('userConfigLoadingMsg');\n \n const cancelButton = document.getElementById('cancelButton');\n const setupButton = document.getElementById('setupButton');\n\n// (Removed duplicate showToast function here)\n\n\n async function loadSettings() {\n try {\n const response = await fetch('/api/settings');\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || `HTTP error! status: ${response.status}`);\n }\n const apiResponse = await response.json();\n if (apiResponse.success && apiResponse.data) {\n const settings = apiResponse.data;\n \n // Populate Python Environments\n if(pythonEnvsLoadingMsg) pythonEnvsLoadingMsg.remove(); // Remove loading message\n pythonEnvsContainer.innerHTML = ''; // Clear previous entries\n \n if (settings.pythonEnvs && Object.keys(settings.pythonEnvs).length > 0) {\n Object.entries(settings.pythonEnvs).forEach(([server, path]) => {\n renderPythonEnvInput(server, path);\n });\n } else if (settings.pythonEnv) {\n // Handle legacy pythonEnv\n renderPythonEnvInput('system', settings.pythonEnv);\n } else {\n if (!pythonEnvsContainer.querySelector('.python-env-row')) { // Add placeholder if no rows exist\n const p = document.createElement('p');\n p.className = 'text-gray-500 python-env-placeholder';\n p.textContent = 'No Python environments defined. Click \"Add Python Environment\" to add one.';\n pythonEnvsContainer.appendChild(p);\n }\n }\n \n nodePathInput.value = settings.nodePath || '';\n browserPathInput.value = settings.browserPath || '';\n\n // Populate System Environments\n systemEnvironmentsDiv.innerHTML = ''; // Clear loading message\n if (settings.systemEnvironments && Object.keys(settings.systemEnvironments).length > 0) {\n // Create a modern, scrollable list (not a table)\n const list = document.createElement('div');\n list.className = 'flex flex-col';\n\n Object.entries(settings.systemEnvironments).forEach(([key, value], idx) => {\n const item = document.createElement('div');\n item.className =\n 'flex flex-col sm:flex-row sm:items-center bg-white rounded-md border border-gray-200 px-4 py-2 shadow-sm hover:shadow transition group';\n item.innerHTML = `\n <div class=\"flex items-center min-w-0 w-full sm:w-1/4 sm:mb-0\">\n <i class='bx bx-cog text-blue-400 mr-2'></i>\n <span class=\"font-mono font-semibold text-gray-800 text-base truncate\" title=\"${key}\">${key}</span>\n </div>\n <div class=\"flex-1 min-w-0 break-all text-gray-700 text-sm pl-7 sm:pl-4\">\n ${value}\n </div>\n `;\n list.appendChild(item);\n });\n\n // Restore frame styling for the new layout\n systemEnvironmentsDiv.classList.remove('shadow');\n systemEnvironmentsDiv.classList.add('rounded-lg', 'bg-white', 'border', 'border-gray-200', 'border-1');\n systemEnvironmentsDiv.classList.remove('border-2', 'border-4', 'border-8');\n systemEnvironmentsDiv.classList.add('p-0');\n systemEnvironmentsDiv.style.padding = '0.5rem 0.5rem 0.5rem 0.5rem';\n systemEnvironmentsDiv.appendChild(list);\n } else {\n systemEnvironmentsDiv.innerHTML = '<p class=\"text-gray-500\">No system environment variables loaded or available.</p>';\n }\n\n // Populate User Configurations\n if(userConfigLoadingMsg) userConfigLoadingMsg.remove(); // Remove loading message\n userConfigurationsContainer.innerHTML = ''; // Clear previous entries\n if (settings.userConfigurations && Object.keys(settings.userConfigurations).length > 0) {\n Object.entries(settings.userConfigurations).forEach(([key, value]) => {\n renderUserConfigInput(key, value);\n });\n } else {\n if (!userConfigurationsContainer.querySelector('.user-config-row')) { // Add placeholder if no rows exist\n const p = document.createElement('p');\n p.className = 'text-gray-500 user-config-placeholder';\n p.textContent = 'No user configurations defined. Click \"Add User Configuration\" to add one.';\n userConfigurationsContainer.appendChild(p);\n }\n }\n\n } else {\n throw new Error(apiResponse.error || 'Failed to load settings.');\n }\n } catch (error) {\n console.error('Error loading settings:', error);\n showToast(`Error loading settings: ${error.message}`, 'danger');\n systemEnvironmentsDiv.innerHTML = `<p class=\"text-red-500\">Error loading environment variables: ${error.message}</p>`;\n if(userConfigLoadingMsg) userConfigLoadingMsg.textContent = `Error loading user configurations: ${error.message}`;\n }\n }\n\n function renderPythonEnvInput(server = 'system', path = '') {\n const placeholder = pythonEnvsContainer.querySelector('.python-env-placeholder');\n if (placeholder) placeholder.remove();\n\n const uniqueId = `python-env-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;\n const div = document.createElement('div');\n div.className = 'python-env-row flex items-center gap-3 mb-2';\n div.innerHTML = `\n <input type=\"text\" value=\"${server}\" class=\"form-input form-control w-1/3 px-3 py-2 rounded-md python-env-server\" placeholder=\"Server Name (e.g., system)\">\n <input type=\"text\" value=\"${path}\" class=\"form-input form-control w-2/3 px-3 py-2 rounded-md python-env-path\" placeholder=\"e.g., /usr/bin/python3 or C:/Python39/python.exe\">\n <button type=\"button\" class=\"btn btn-danger btn-sm remove-python-env-button flex items-center\">\n <i class='bx bx-trash'></i>\n </button>\n `;\n pythonEnvsContainer.appendChild(div);\n div.querySelector('.remove-python-env-button').addEventListener('click', function() {\n this.closest('.python-env-row').remove();\n if (!pythonEnvsContainer.querySelector('.python-env-row')) { // Add placeholder if no rows exist after removal\n const p = document.createElement('p');\n p.className = 'text-gray-500 python-env-placeholder';\n p.textContent = 'No Python environments defined. Click \"Add Python Environment\" to add one.';\n pythonEnvsContainer.appendChild(p);\n }\n });\n }\n\n function renderUserConfigInput(key = '', value = '') {\n const placeholder = userConfigurationsContainer.querySelector('.user-config-placeholder');\n if (placeholder) placeholder.remove();\n\n const uniqueId = `user-config-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;\n const div = document.createElement('div');\n div.className = 'user-config-row flex items-center gap-3 mb-2';\n const isSecret = key.toLowerCase().includes('key');\n const valueInputType = isSecret ? 'password' : 'text';\n\n // Key Input\n const keyInputHTML = `<input type=\"text\" value=\"${key}\" class=\"form-input form-control w-1/3 px-3 py-2 rounded-md user-config-key\" placeholder=\"Key\">`;\n\n // Value Input & Eye Icon (if secret)\n let valueSectionHTML;\n if (isSecret) {\n valueSectionHTML = `\n <div class=\"relative w-2/3\">\n <input type=\"${valueInputType}\" value=\"${value}\" class=\"form-input form-control w-full px-3 py-2 rounded-md user-config-value pr-10\" placeholder=\"Value\">\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-500 hover:text-gray-700 toggle-visibility-button\" style=\"background: transparent; border: none;\">\n <i class='bx bx-show text-lg'></i>\n </button>\n </div>\n `;\n } else {\n valueSectionHTML = `<input type=\"${valueInputType}\" value=\"${value}\" class=\"form-input form-control w-2/3 px-3 py-2 rounded-md user-config-value\" placeholder=\"Value\">`;\n }\n\n // Remove Button\n const removeButtonHTML = `\n <button type=\"button\" class=\"btn btn-danger btn-sm remove-user-config-button flex items-center\">\n <i class='bx bx-trash'></i>\n </button>\n `;\n\n div.innerHTML = keyInputHTML + valueSectionHTML + removeButtonHTML;\n userConfigurationsContainer.appendChild(div);\n\n if (isSecret) {\n const toggleButton = div.querySelector('.toggle-visibility-button');\n const valueInput = div.querySelector('.user-config-value');\n const eyeIcon = toggleButton.querySelector('i');\n\n toggleButton.addEventListener('click', (e) => {\n e.preventDefault(); // Prevent form submission if inside a form\n if (valueInput.type === 'password') {\n valueInput.type = 'text';\n eyeIcon.classList.remove('bx-show');\n eyeIcon.classList.add('bx-hide');\n } else {\n valueInput.type = 'password';\n eyeIcon.classList.remove('bx-hide');\n eyeIcon.classList.add('bx-show');\n }\n });\n }\n\n div.querySelector('.remove-user-config-button').addEventListener('click', function() {\n this.closest('.user-config-row').remove();\n if (!userConfigurationsContainer.querySelector('.user-config-row')) { // Add placeholder if no rows exist after removal\n const p = document.createElement('p');\n p.className = 'text-gray-500 user-config-placeholder';\n p.textContent = 'No user configurations defined. Click \"Add User Configuration\" to add one.';\n userConfigurationsContainer.appendChild(p);\n }\n });\n }\n\n\n async function saveSettings(event) {\n event.preventDefault();\n setupButton.disabled = true;\n setupButton.innerHTML = `<i class='bx bx-loader-alt bx-spin mr-2'></i>Saving...`;\n\n const pythonEnvs = {};\n document.querySelectorAll('.python-env-row').forEach(row => {\n const serverInput = row.querySelector('.python-env-server');\n const pathInput = row.querySelector('.python-env-path');\n if (serverInput && pathInput && serverInput.value.trim()) {\n pythonEnvs[serverInput.value.trim()] = pathInput.value.trim();\n }\n });\n \n const userConfigs = {};\n document.querySelectorAll('.user-config-row').forEach(row => {\n const keyInput = row.querySelector('.user-config-key');\n const valueInput = row.querySelector('.user-config-value');\n if (keyInput && valueInput && keyInput.value.trim()) {\n userConfigs[keyInput.value.trim()] = valueInput.value.trim();\n }\n });\n\n const settingsData = {\n pythonEnvs: pythonEnvs,\n // Include pythonEnv for backward compatibility (use system value if available)\n pythonEnv: pythonEnvs['system'] || null,\n nodePath: nodePathInput.value.trim() || null,\n browserPath: browserPathInput.value.trim() || null,\n userConfigurations: userConfigs,\n };\n\n try {\n const response = await fetch('/api/settings', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(settingsData),\n });\n\n const apiResponse = await response.json();\n\n if (response.ok && apiResponse.success) {\n showToast('Settings saved successfully!', 'success');\n // Optionally, reload settings to reflect any backend-applied defaults\n await loadSettings();\n } else {\n throw new Error(apiResponse.error || `HTTP error! status: ${response.status}`);\n }\n } catch (error) {\n console.error('Error saving settings:', error);\n showToast(`Error saving settings: ${error.message}`, 'danger');\n } finally {\n setupButton.disabled = false;\n setupButton.innerHTML = `<i class='bx bx-save mr-2'></i>Save Settings`;\n }\n }\n\n cancelButton.addEventListener('click', () => {\n // Navigate back to index.html, preserving flight parameters\n window.location.href = buildUrlWithFlights('index.html');\n });\n\n addPythonEnvButton.addEventListener('click', () => renderPythonEnvInput());\n addUserConfigButton.addEventListener('click', () => renderUserConfigInput());\n\n settingsForm.addEventListener('submit', saveSettings);\n\n // Initial load\n loadSettings();\n\n // (Collapse/expand functionality removed as requested)\n});"],"mappings":"OAASA,wBAA2B,uB","ignoreList":[]}
|
package/dist/web/server.js
CHANGED
|
@@ -1,405 +1,2 @@
|
|
|
1
|
-
import express from
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { OnboardingProcessStatus } from '../core/onboard/OnboardStatus.js';
|
|
5
|
-
import { SUPPORTED_CLIENT_NAMES } from '../core/metadatas/constants.js';
|
|
6
|
-
import { serverService } from '../services/ServerService.js';
|
|
7
|
-
import { feedOnboardService } from '../core/onboard/FeedOnboardService.js';
|
|
8
|
-
import { openBrowser } from '../utils/osUtils.js';
|
|
9
|
-
import { Logger, EventType, EventStatus } from '../utils/logger.js';
|
|
10
|
-
import { configProvider } from '../core/loaders/ConfigurationProvider.js';
|
|
11
|
-
import { onboardStatusManager } from '../core/onboard/OnboardStatusManager.js';
|
|
12
|
-
import { InstallOperationManager } from '../core/loaders/InstallOperationManager.js';
|
|
13
|
-
import { systemSettingsManager } from '../core/loaders/SystemSettingsManager.js';
|
|
14
|
-
import { getAppVersion } from '../utils/versionUtils.js';
|
|
15
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
const app = express();
|
|
17
|
-
// Middleware
|
|
18
|
-
app.use('/', express.static(path.join(__dirname, '..', '..', 'src', 'web', 'public')));
|
|
19
|
-
app.use(express.json());
|
|
20
|
-
// Get available targets
|
|
21
|
-
app.get('/api/targets', async (req, res) => {
|
|
22
|
-
try {
|
|
23
|
-
// Get clientMcpSettings
|
|
24
|
-
const clientMcpSettings = await configProvider.getClientMcpSettings();
|
|
25
|
-
// Keep original format but add clientMcpSettings as additional property
|
|
26
|
-
const response = {
|
|
27
|
-
success: true,
|
|
28
|
-
data: SUPPORTED_CLIENT_NAMES,
|
|
29
|
-
clientMcpSettings: clientMcpSettings
|
|
30
|
-
};
|
|
31
|
-
res.json(response);
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
35
|
-
res.status(500).json({
|
|
36
|
-
success: false,
|
|
37
|
-
error: message
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
// List server categories
|
|
42
|
-
app.get('/api/categories', async (req, res) => {
|
|
43
|
-
try {
|
|
44
|
-
const { local } = req.query;
|
|
45
|
-
const servers = await serverService.listServerCategories({
|
|
46
|
-
local: local !== 'false'
|
|
47
|
-
});
|
|
48
|
-
const response = {
|
|
49
|
-
success: true,
|
|
50
|
-
data: servers
|
|
51
|
-
};
|
|
52
|
-
res.json(response);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
56
|
-
res.status(500).json({
|
|
57
|
-
success: false,
|
|
58
|
-
error: message
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
// Get server schema
|
|
63
|
-
app.get('/api/categories/:categoryName/servers/:serverName/schema', async (req, res) => {
|
|
64
|
-
try {
|
|
65
|
-
const { categoryName, serverName } = req.params;
|
|
66
|
-
const schema = await serverService.getServerSchema(categoryName, serverName);
|
|
67
|
-
if (!schema) {
|
|
68
|
-
return res.status(404).json({
|
|
69
|
-
success: false,
|
|
70
|
-
error: `Schema not found for server ${serverName} in category ${categoryName}`
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
const response = {
|
|
74
|
-
success: true,
|
|
75
|
-
data: schema
|
|
76
|
-
};
|
|
77
|
-
res.json(response);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
81
|
-
res.status(500).json({
|
|
82
|
-
success: false,
|
|
83
|
-
error: `Failed to get schema for server ${req.params.serverName} in category ${req.params.categoryName}: ${message}`
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
// Get categories data (including feed configuration)
|
|
88
|
-
app.get('/api/categories/:categoryName', async (req, res) => {
|
|
89
|
-
try {
|
|
90
|
-
const { categoryName } = req.params;
|
|
91
|
-
const serverData = await serverService.getServerCategory(categoryName);
|
|
92
|
-
if (!serverData) {
|
|
93
|
-
return res.status(404).json({
|
|
94
|
-
success: false,
|
|
95
|
-
error: `Server category ${categoryName} not found`
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
const response = {
|
|
99
|
-
success: true,
|
|
100
|
-
data: serverData
|
|
101
|
-
};
|
|
102
|
-
res.json(response);
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
106
|
-
res.status(500).json({
|
|
107
|
-
success: false,
|
|
108
|
-
error: `Failed to get server category data for ${req.params.categoryName}: ${message}`
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
// Handle server category onboarding
|
|
113
|
-
// Install servers for a category
|
|
114
|
-
app.post('/api/categories/:categoryName/install', async (req, res) => {
|
|
115
|
-
try {
|
|
116
|
-
const { categoryName } = req.params;
|
|
117
|
-
const { serverList } = req.body;
|
|
118
|
-
if (!serverList || Object.keys(serverList).length === 0) {
|
|
119
|
-
return res.status(400).json({
|
|
120
|
-
success: false,
|
|
121
|
-
error: 'Invalid server list provided'
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
const results = await Promise.all(Object.entries(serverList).map(([serverName, options]) => serverService.installMcpServer(categoryName, serverName, options)));
|
|
125
|
-
const { success, messages } = serverService.formatOperationResults(results);
|
|
126
|
-
const response = {
|
|
127
|
-
success,
|
|
128
|
-
data: { messages }
|
|
129
|
-
};
|
|
130
|
-
res.json(response);
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
134
|
-
res.status(500).json({
|
|
135
|
-
success: false,
|
|
136
|
-
error: `Failed to install server for ${req.params.categoryName}: ${message}`
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
// Handle server category onboarding
|
|
141
|
-
app.post('/api/categories/onboard', async (req, res) => {
|
|
142
|
-
try {
|
|
143
|
-
const { categoryData, forExistingCategory } = req.body; // Extract forExistingCategory from request body
|
|
144
|
-
// Basic validation for categoryData presence and essential fields for this endpoint
|
|
145
|
-
if (!categoryData || !categoryData.name || !categoryData.displayName) {
|
|
146
|
-
return res.status(400).json({
|
|
147
|
-
success: false,
|
|
148
|
-
error: 'Category data, including name and display name, is required.'
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
// categoryData is now expected to be a FeedConfiguration object directly from the client
|
|
152
|
-
const feedConfiguration = categoryData;
|
|
153
|
-
// Structural validation is now primarily handled by FeedOnboardService.validateStaticConfig
|
|
154
|
-
// The service will throw an error if the structure is invalid, which will be caught by the catch block below.
|
|
155
|
-
const operationResult = await feedOnboardService.onboardFeed(feedConfiguration, forExistingCategory);
|
|
156
|
-
// The response now directly reflects the OperationStatus returned by the service.
|
|
157
|
-
// The client will use data.onboardingId (which is the categoryName) to poll for status updates.
|
|
158
|
-
const response = {
|
|
159
|
-
success: operationResult.status !== OnboardingProcessStatus.FAILED, // Or a more nuanced success check
|
|
160
|
-
// Ensure data.onboardingId is the categoryName for polling
|
|
161
|
-
data: { ...operationResult, onboardingId: feedConfiguration.name }
|
|
162
|
-
};
|
|
163
|
-
res.status(operationResult.status === OnboardingProcessStatus.FAILED ? 500 : 200).json(response);
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
167
|
-
res.status(500).json({
|
|
168
|
-
success: false,
|
|
169
|
-
error: `Failed to ${req.body.isUpdate ? 'update' : 'create'} server category: ${message}`
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
// Validate feed configuration
|
|
174
|
-
app.post('/api/categories/onboard/validate', async (req, res) => {
|
|
175
|
-
try {
|
|
176
|
-
const { categoryData, forExistingCategory } = req.body;
|
|
177
|
-
if (!categoryData || !categoryData.name) {
|
|
178
|
-
return res.status(400).json({
|
|
179
|
-
success: false,
|
|
180
|
-
error: 'Category name is required in categoryData for validation.'
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
// categoryData is now expected to be a FeedConfiguration object directly from the client
|
|
184
|
-
const feedConfigurationToValidate = categoryData;
|
|
185
|
-
// Structural validation is now primarily handled by FeedOnboardService.validateStaticConfig
|
|
186
|
-
// The service will throw an error if the structure is invalid, which will be caught by the catch block below.
|
|
187
|
-
// Call the service, which now returns OperationStatus & { feedConfiguration? }
|
|
188
|
-
// serverName parameter has been removed from validateFeed
|
|
189
|
-
const validationOperationResult = await feedOnboardService.validateFeed(feedConfigurationToValidate, forExistingCategory);
|
|
190
|
-
// The response includes the operation status and the feed configuration that was validated.
|
|
191
|
-
// The client will use data.onboardingId (which is the categoryName) to poll for status updates.
|
|
192
|
-
const response = {
|
|
193
|
-
success: validationOperationResult.status !== OnboardingProcessStatus.FAILED,
|
|
194
|
-
// Ensure data.onboardingId is the categoryName for polling
|
|
195
|
-
data: { ...validationOperationResult, onboardingId: feedConfigurationToValidate.name }
|
|
196
|
-
};
|
|
197
|
-
res.status(validationOperationResult.status === OnboardingProcessStatus.FAILED ? 500 : 200).json(response);
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
201
|
-
res.status(500).json({
|
|
202
|
-
success: false,
|
|
203
|
-
error: `Failed to validate server category: ${message}`
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
// Get category onboarding/validation operation status
|
|
208
|
-
app.get('/api/categories/:categoryName/onboard/status', async (req, res) => {
|
|
209
|
-
try {
|
|
210
|
-
const { categoryName } = req.params;
|
|
211
|
-
const { operationType } = req.query;
|
|
212
|
-
if (!operationType) {
|
|
213
|
-
return res.status(400).json({
|
|
214
|
-
success: false,
|
|
215
|
-
error: 'operationType query parameter is required.'
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
// Validate operationType if necessary (e.g., check against known OperationType values)
|
|
219
|
-
// For now, we'll assume it's a valid OperationType string.
|
|
220
|
-
const validOperationType = operationType;
|
|
221
|
-
const status = await onboardStatusManager.getStatus(categoryName, validOperationType);
|
|
222
|
-
if (!status) {
|
|
223
|
-
return res.status(404).json({
|
|
224
|
-
success: false,
|
|
225
|
-
error: `No active operation found for category ${categoryName} with operation type ${validOperationType}`
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
// Construct the response data based on the retrieved OnboardStatus
|
|
229
|
-
const lastStepName = status.steps && status.steps.length > 0 ? status.steps[status.steps.length - 1].stepName : undefined;
|
|
230
|
-
const responseData = {
|
|
231
|
-
onboardingId: status.onboardingId, // This is categoryName_operationType
|
|
232
|
-
status: status.status,
|
|
233
|
-
message: lastStepName || status.errorMessage || 'Processing...',
|
|
234
|
-
lastQueried: new Date().toISOString(),
|
|
235
|
-
steps: status.steps, // Include the steps array in the response
|
|
236
|
-
...(status.validationStatus && { validationStatus: status.validationStatus }),
|
|
237
|
-
...(status.prInfo && { prInfo: status.prInfo }),
|
|
238
|
-
...(status.result && { result: status.result }),
|
|
239
|
-
...(status.errorMessage && { errorMessage: status.errorMessage }),
|
|
240
|
-
operationType: status.operationType, // Always include operationType from the status object
|
|
241
|
-
// Attempt to include feedConfiguration if available, especially for SUCCEEDED VALIDATION_ONLY
|
|
242
|
-
...(status.operationType === 'VALIDATION_ONLY' && status.status === OnboardingProcessStatus.SUCCEEDED && status.result?.feedConfiguration && { feedConfiguration: status.result.feedConfiguration }),
|
|
243
|
-
};
|
|
244
|
-
const response = {
|
|
245
|
-
success: true,
|
|
246
|
-
data: responseData
|
|
247
|
-
};
|
|
248
|
-
res.json(response);
|
|
249
|
-
}
|
|
250
|
-
catch (error) {
|
|
251
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
252
|
-
res.status(500).json({
|
|
253
|
-
success: false,
|
|
254
|
-
error: `Failed to get operation status for category ${req.params.categoryName}: ${message}`
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
// Get installation operation status
|
|
259
|
-
app.get('/api/categories/:categoryName/servers/:serverName/installation/status', async (req, res) => {
|
|
260
|
-
try {
|
|
261
|
-
const { categoryName, serverName } = req.params;
|
|
262
|
-
const details = await InstallOperationManager.getInstance(categoryName, serverName).getDetails();
|
|
263
|
-
if (!details) {
|
|
264
|
-
return res.status(404).json({
|
|
265
|
-
success: false,
|
|
266
|
-
error: `No installation operation found for server ${serverName} in category ${categoryName}`
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
const response = {
|
|
270
|
-
success: true,
|
|
271
|
-
data: details
|
|
272
|
-
};
|
|
273
|
-
res.json(response);
|
|
274
|
-
}
|
|
275
|
-
catch (error) {
|
|
276
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
277
|
-
res.status(500).json({
|
|
278
|
-
success: false,
|
|
279
|
-
error: `Failed to get installation operation status for server ${req.params.serverName} in category ${req.params.categoryName}: ${message}`
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
// Uninstall tools from a server
|
|
284
|
-
app.post('/api/categories/:categoryName/uninstall', async (req, res) => {
|
|
285
|
-
try {
|
|
286
|
-
const { categoryName } = req.params;
|
|
287
|
-
const { serverList } = req.body;
|
|
288
|
-
if (!serverList || Object.keys(serverList).length === 0) {
|
|
289
|
-
return res.status(400).json({
|
|
290
|
-
success: false,
|
|
291
|
-
error: 'Invalid tool list provided'
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
const { options } = req.body;
|
|
295
|
-
if (!options?.targets || options.targets.length === 0) {
|
|
296
|
-
return res.status(400).json({
|
|
297
|
-
success: false,
|
|
298
|
-
error: 'No target clients specified'
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
const results = await Promise.all(Object.entries(serverList).map(([serverName, serverOptions]) => serverService.uninstallMcpServer(categoryName, serverName, {
|
|
302
|
-
...serverOptions,
|
|
303
|
-
targets: options.targets,
|
|
304
|
-
removeData: options.removeData ?? serverOptions.removeData
|
|
305
|
-
})));
|
|
306
|
-
const { success, messages } = serverService.formatOperationResults(results);
|
|
307
|
-
const response = {
|
|
308
|
-
success,
|
|
309
|
-
data: { messages }
|
|
310
|
-
};
|
|
311
|
-
res.json(response);
|
|
312
|
-
}
|
|
313
|
-
catch (error) {
|
|
314
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
315
|
-
res.status(500).json({
|
|
316
|
-
success: false,
|
|
317
|
-
error: `Failed to uninstall servers from ${req.params.categoryName}: ${message}`
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
});
|
|
321
|
-
// System Settings API
|
|
322
|
-
app.get('/api/settings', async (req, res) => {
|
|
323
|
-
try {
|
|
324
|
-
const settings = await systemSettingsManager.getSystemSettings();
|
|
325
|
-
const response = {
|
|
326
|
-
success: true,
|
|
327
|
-
data: settings
|
|
328
|
-
};
|
|
329
|
-
res.json(response);
|
|
330
|
-
}
|
|
331
|
-
catch (error) {
|
|
332
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
333
|
-
res.status(500).json({
|
|
334
|
-
success: false,
|
|
335
|
-
error: `Failed to get system settings: ${message}`
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
app.post('/api/settings', async (req, res) => {
|
|
340
|
-
try {
|
|
341
|
-
const newSettings = req.body;
|
|
342
|
-
const updatedSettings = await systemSettingsManager.createOrUpdateSystemSettings(newSettings);
|
|
343
|
-
const response = {
|
|
344
|
-
success: true,
|
|
345
|
-
data: updatedSettings
|
|
346
|
-
};
|
|
347
|
-
res.json(response);
|
|
348
|
-
}
|
|
349
|
-
catch (error) {
|
|
350
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
351
|
-
res.status(500).json({
|
|
352
|
-
success: false,
|
|
353
|
-
error: `Failed to update system settings: ${message}`
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
});
|
|
357
|
-
// API to get package version
|
|
358
|
-
app.get('/api/version', async (req, res) => {
|
|
359
|
-
try {
|
|
360
|
-
const appVersionData = await getAppVersion();
|
|
361
|
-
const response = {
|
|
362
|
-
success: true,
|
|
363
|
-
data: appVersionData
|
|
364
|
-
};
|
|
365
|
-
res.json(response);
|
|
366
|
-
}
|
|
367
|
-
catch (error) {
|
|
368
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
369
|
-
res.status(500).json({
|
|
370
|
-
success: false,
|
|
371
|
-
error: `Failed to get package version: ${message}`
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
|
-
export async function startWebServer(port = 3000) {
|
|
376
|
-
return new Promise((resolve, reject) => {
|
|
377
|
-
const server = app.listen(port, () => {
|
|
378
|
-
const url = `http://localhost:${port}`;
|
|
379
|
-
Logger.log(`IMCP web interface running at ${url}`);
|
|
380
|
-
// Open the URL in the default browser
|
|
381
|
-
openBrowser(url).catch(err => {
|
|
382
|
-
console.warn(`Failed to open browser: ${err.message}`);
|
|
383
|
-
});
|
|
384
|
-
// Track IMCP serve event
|
|
385
|
-
Logger.trackEvent(EventType.IMCP_SERVE, {
|
|
386
|
-
status: EventStatus.SUCCESS,
|
|
387
|
-
port: port,
|
|
388
|
-
});
|
|
389
|
-
resolve();
|
|
390
|
-
});
|
|
391
|
-
server.on('error', (error) => {
|
|
392
|
-
Logger.trackEvent(EventType.IMCP_SERVE, {
|
|
393
|
-
status: EventStatus.FAILED,
|
|
394
|
-
errorMessage: error instanceof Error ? error.message : String(error),
|
|
395
|
-
port: port
|
|
396
|
-
});
|
|
397
|
-
reject(error);
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
// Allow running directly
|
|
402
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
403
|
-
startWebServer().catch(console.error);
|
|
404
|
-
}
|
|
1
|
+
import express from"express";import path from"path";import{fileURLToPath}from"url";import{OnboardingProcessStatus}from"../core/onboard/OnboardStatus.js";import{SUPPORTED_CLIENT_NAMES}from"../core/metadatas/constants.js";import{serverService}from"../services/ServerService.js";import{feedOnboardService}from"../core/onboard/FeedOnboardService.js";import{openBrowser}from"../utils/osUtils.js";import{Logger,EventType,EventStatus}from"../utils/logger.js";import{configProvider}from"../core/loaders/ConfigurationProvider.js";import{onboardStatusManager}from"../core/onboard/OnboardStatusManager.js";import{InstallOperationManager}from"../core/loaders/InstallOperationManager.js";import{systemSettingsManager}from"../core/loaders/SystemSettingsManager.js";import{getAppVersion}from"../utils/versionUtils.js";const __dirname=path.dirname(fileURLToPath(import.meta.url)),app=express();app.use("/",express.static(path.join(__dirname,"public"))),app.use(express.json()),app.get("/api/targets",(async(e,s)=>{try{const e=await configProvider.getClientMcpSettings(),r={success:!0,data:SUPPORTED_CLIENT_NAMES,clientMcpSettings:e};s.json(r)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:r})}})),app.get("/api/categories",(async(e,s)=>{try{const{local:r}=e.query,t={success:!0,data:await serverService.listServerCategories({local:"false"!==r})};s.json(t)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:r})}})),app.get("/api/categories/:categoryName/servers/:serverName/schema",(async(e,s)=>{try{const{categoryName:r,serverName:t}=e.params,a=await serverService.getServerSchema(r,t);if(!a)return s.status(404).json({success:!1,error:`Schema not found for server ${t} in category ${r}`});const o={success:!0,data:a};s.json(o)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get schema for server ${e.params.serverName} in category ${e.params.categoryName}: ${t}`})}})),app.get("/api/categories/:categoryName",(async(e,s)=>{try{const{categoryName:r}=e.params,t=await serverService.getServerCategory(r);if(!t)return s.status(404).json({success:!1,error:`Server category ${r} not found`});const a={success:!0,data:t};s.json(a)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get server category data for ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/:categoryName/install",(async(e,s)=>{try{const{categoryName:r}=e.params,{serverList:t}=e.body;if(!t||0===Object.keys(t).length)return s.status(400).json({success:!1,error:"Invalid server list provided"});const a=await Promise.all(Object.entries(t).map((([e,s])=>serverService.installMcpServer(r,e,s)))),{success:o,messages:n}=serverService.formatOperationResults(a),c={success:o,data:{messages:n}};s.json(c)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to install server for ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/onboard",(async(e,s)=>{try{const{categoryData:r,forExistingCategory:t}=e.body;if(!r||!r.name||!r.displayName)return s.status(400).json({success:!1,error:"Category data, including name and display name, is required."});const a=r,o=await feedOnboardService.onboardFeed(a,t),n={success:o.status!==OnboardingProcessStatus.FAILED,data:{...o,onboardingId:a.name}};s.status(o.status===OnboardingProcessStatus.FAILED?500:200).json(n)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to ${e.body.isUpdate?"update":"create"} server category: ${t}`})}})),app.post("/api/categories/onboard/validate",(async(e,s)=>{try{const{categoryData:r,forExistingCategory:t}=e.body;if(!r||!r.name)return s.status(400).json({success:!1,error:"Category name is required in categoryData for validation."});const a=r,o=await feedOnboardService.validateFeed(a,t),n={success:o.status!==OnboardingProcessStatus.FAILED,data:{...o,onboardingId:a.name}};s.status(o.status===OnboardingProcessStatus.FAILED?500:200).json(n)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to validate server category: ${r}`})}})),app.get("/api/categories/:categoryName/onboard/status",(async(e,s)=>{try{const{categoryName:r}=e.params,{operationType:t}=e.query;if(!t)return s.status(400).json({success:!1,error:"operationType query parameter is required."});const a=t,o=await onboardStatusManager.getStatus(r,a);if(!o)return s.status(404).json({success:!1,error:`No active operation found for category ${r} with operation type ${a}`});const n=o.steps&&o.steps.length>0?o.steps[o.steps.length-1].stepName:void 0,c={success:!0,data:{onboardingId:o.onboardingId,status:o.status,message:n||o.errorMessage||"Processing...",lastQueried:(new Date).toISOString(),steps:o.steps,...o.validationStatus&&{validationStatus:o.validationStatus},...o.prInfo&&{prInfo:o.prInfo},...o.result&&{result:o.result},...o.errorMessage&&{errorMessage:o.errorMessage},operationType:o.operationType,..."VALIDATION_ONLY"===o.operationType&&o.status===OnboardingProcessStatus.SUCCEEDED&&o.result?.feedConfiguration&&{feedConfiguration:o.result.feedConfiguration}}};s.json(c)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get operation status for category ${e.params.categoryName}: ${t}`})}})),app.get("/api/categories/:categoryName/servers/:serverName/installation/status",(async(e,s)=>{try{const{categoryName:r,serverName:t}=e.params,a=await InstallOperationManager.getInstance(r,t).getDetails();if(!a)return s.status(404).json({success:!1,error:`No installation operation found for server ${t} in category ${r}`});const o={success:!0,data:a};s.json(o)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get installation operation status for server ${e.params.serverName} in category ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/:categoryName/uninstall",(async(e,s)=>{try{const{categoryName:r}=e.params,{serverList:t}=e.body;if(!t||0===Object.keys(t).length)return s.status(400).json({success:!1,error:"Invalid tool list provided"});const{options:a}=e.body;if(!a?.targets||0===a.targets.length)return s.status(400).json({success:!1,error:"No target clients specified"});const o=await Promise.all(Object.entries(t).map((([e,s])=>serverService.uninstallMcpServer(r,e,{...s,targets:a.targets,removeData:a.removeData??s.removeData})))),{success:n,messages:c}=serverService.formatOperationResults(o),i={success:n,data:{messages:c}};s.json(i)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to uninstall servers from ${e.params.categoryName}: ${t}`})}})),app.get("/api/settings",(async(e,s)=>{try{const e={success:!0,data:await systemSettingsManager.getSystemSettings()};s.json(e)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get system settings: ${r}`})}})),app.post("/api/settings",(async(e,s)=>{try{const r=e.body,t={success:!0,data:await systemSettingsManager.createOrUpdateSystemSettings(r)};s.json(t)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to update system settings: ${r}`})}})),app.get("/api/version",(async(e,s)=>{try{const e={success:!0,data:await getAppVersion()};s.json(e)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get package version: ${r}`})}}));export async function startWebServer(e=3e3){return new Promise(((s,r)=>{app.listen(e,(()=>{const r=`http://localhost:${e}`;Logger.log(`IMCP web interface running at ${r}`),openBrowser(r).catch((e=>{})),Logger.trackEvent(EventType.IMCP_SERVE,{status:EventStatus.SUCCESS,port:e}),s()})).on("error",(s=>{Logger.trackEvent(EventType.IMCP_SERVE,{status:EventStatus.FAILED,errorMessage:s instanceof Error?s.message:String(s),port:e}),r(s)}))}))}import.meta.url===`file://${process.argv[1]}`&&startWebServer().catch(console.error);
|
|
405
2
|
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["express","path","fileURLToPath","OnboardingProcessStatus","SUPPORTED_CLIENT_NAMES","serverService","feedOnboardService","openBrowser","Logger","EventType","EventStatus","configProvider","onboardStatusManager","InstallOperationManager","systemSettingsManager","getAppVersion","__dirname","dirname","url","app","use","static","join","json","get","async","req","res","clientMcpSettings","getClientMcpSettings","response","success","data","error","message","Error","status","local","query","listServerCategories","categoryName","serverName","params","schema","getServerSchema","serverData","getServerCategory","post","serverList","body","Object","keys","length","results","Promise","all","entries","map","options","installMcpServer","messages","formatOperationResults","categoryData","forExistingCategory","name","displayName","feedConfiguration","operationResult","onboardFeed","FAILED","onboardingId","isUpdate","feedConfigurationToValidate","validationOperationResult","validateFeed","operationType","validOperationType","getStatus","lastStepName","steps","stepName","undefined","errorMessage","lastQueried","Date","toISOString","validationStatus","prInfo","result","SUCCEEDED","details","getInstance","getDetails","targets","serverOptions","uninstallMcpServer","removeData","getSystemSettings","newSettings","createOrUpdateSystemSettings","startWebServer","port","resolve","reject","listen","log","catch","err","trackEvent","IMCP_SERVE","SUCCESS","on","String","process","argv","console"],"sources":["../../src/web/server.ts"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "imcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8-dev",
|
|
4
4
|
"description": "Node.js SDK for Model Context Protocol (MCP)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
8
8
|
"imcp": "./dist/cli/index.js"
|
|
9
9
|
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
10
14
|
"scripts": {
|
|
11
|
-
"build": "tsc && npm run copy-public",
|
|
15
|
+
"build": "tsc && npm run copy-public && node scripts/minify.js",
|
|
12
16
|
"dev": "tsc -w",
|
|
13
17
|
"start": "node dist/web/server.js",
|
|
14
18
|
"dev:server": "ts-node-dev --respawn --transpile-only src/cli/index.ts start",
|
|
@@ -40,8 +44,10 @@
|
|
|
40
44
|
"@typescript-eslint/eslint-plugin": "^6.15.0",
|
|
41
45
|
"@typescript-eslint/parser": "^6.15.0",
|
|
42
46
|
"eslint": "^8.56.0",
|
|
47
|
+
"glob": "^11.0.2",
|
|
43
48
|
"jest": "^29.7.0",
|
|
44
49
|
"prettier": "^3.1.1",
|
|
50
|
+
"terser": "^5.39.2",
|
|
45
51
|
"ts-jest": "^29.1.1",
|
|
46
52
|
"ts-node": "^10.9.2",
|
|
47
53
|
"ts-node-dev": "^2.0.0",
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
name: Temporary administrator access request
|
|
2
|
-
description: Request for temporary repository administrator access to this repository, a.k.a Just-in-Time (JIT) access.
|
|
3
|
-
title: "JIT Request"
|
|
4
|
-
labels: ["jit"]
|
|
5
|
-
assignees:
|
|
6
|
-
- gimsvc_microsoft
|
|
7
|
-
-
|
|
8
|
-
body:
|
|
9
|
-
- type: markdown
|
|
10
|
-
attributes:
|
|
11
|
-
value: |
|
|
12
|
-
:closed_lock_with_key: Permanent repository administrator access is not allowed as per Microsoft security policy. You can use this form to request for temporary administrator access to this repository.
|
|
13
|
-
- type: textarea
|
|
14
|
-
id: justification
|
|
15
|
-
attributes:
|
|
16
|
-
label: Justification
|
|
17
|
-
description: Describe the actions that you will perform with your temporary administrator access.
|
|
18
|
-
placeholder: I need to create secrets.
|
|
19
|
-
validations:
|
|
20
|
-
required: true
|
|
21
|
-
- type: dropdown
|
|
22
|
-
id: duration
|
|
23
|
-
attributes:
|
|
24
|
-
label: Duration (hours)
|
|
25
|
-
description: How long do you need access for? The duration you select is in hours.
|
|
26
|
-
options:
|
|
27
|
-
- 1
|
|
28
|
-
- 2
|
package/.github/acl/access.yml
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Documentation for ACL policy: https://aka.ms/gim/docs/policy/acl
|
|
2
|
-
|
|
3
|
-
name: Access control list
|
|
4
|
-
description: List of teams and their permission levels
|
|
5
|
-
resource: repository
|
|
6
|
-
where:
|
|
7
|
-
configuration:
|
|
8
|
-
manageAccess:
|
|
9
|
-
- team: aicodervteam
|
|
10
|
-
role: Triage
|
|
11
|
-
- member: hod
|
|
12
|
-
role: Maintain
|
|
13
|
-
- member: penwa
|
|
14
|
-
role: Maintain
|
|
15
|
-
- member: anthu
|
|
16
|
-
role: Maintain
|
|
17
|
-
- member: enbaowang
|
|
18
|
-
role: Maintain
|
|
19
|
-
- member: xinli7
|
|
20
|
-
role: Maintain
|
package/.github/policies/jit.yml
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Documentation for JIT policy: https://aka.ms/gim/docs/policy/jit
|
|
2
|
-
|
|
3
|
-
# metadata
|
|
4
|
-
id: id
|
|
5
|
-
name: JIT_Access
|
|
6
|
-
description: Policy for admin JIT for repos in this org
|
|
7
|
-
|
|
8
|
-
# filters
|
|
9
|
-
resource: repository
|
|
10
|
-
|
|
11
|
-
# primitive configuration
|
|
12
|
-
configuration:
|
|
13
|
-
jitAccess:
|
|
14
|
-
enabled: true
|
|
15
|
-
maxHours: 2
|
|
16
|
-
approvers:
|
|
17
|
-
role: Maintain
|
|
18
|
-
requestors:
|
|
19
|
-
role: Write
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
name: Node.js CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches: [main] # Or your default branch
|
|
6
|
-
|
|
7
|
-
jobs:
|
|
8
|
-
build:
|
|
9
|
-
runs-on: ubuntu-latest
|
|
10
|
-
|
|
11
|
-
strategy:
|
|
12
|
-
matrix:
|
|
13
|
-
node-version: [20.x, 22.x] # Specify Node.js versions to test against
|
|
14
|
-
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v3
|
|
17
|
-
|
|
18
|
-
- name: Use Node.js ${{ matrix.node-version }}
|
|
19
|
-
uses: actions/setup-node@v3
|
|
20
|
-
with:
|
|
21
|
-
node-version: ${{ matrix.node-version }}
|
|
22
|
-
cache: "npm"
|
|
23
|
-
|
|
24
|
-
- name: Install dependencies
|
|
25
|
-
run: npm ci
|
|
26
|
-
|
|
27
|
-
- name: Build project
|
|
28
|
-
run: npm run build
|