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
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
addServer,
|
|
3
|
-
// removeServer, // Not directly used by index.js listeners, uiHandlers makes it global
|
|
4
|
-
// addEnvVariable, // Not directly used by index.js listeners, uiHandlers makes it global
|
|
5
|
-
// removeEnvVariable, // Not directly used by index.js listeners, uiHandlers makes it global
|
|
6
|
-
toggleViewMode,
|
|
7
|
-
saveJsonData,
|
|
8
|
-
copyJsonToClipboard,
|
|
9
|
-
toggleSectionContent
|
|
10
|
-
} from './uiHandlers.js';
|
|
11
|
-
|
|
12
|
-
import {
|
|
13
|
-
// submitForm, // Will be replaced by handlePublish for async behavior
|
|
14
|
-
populateForm,
|
|
15
|
-
resetOnboardFormDynamicContent,
|
|
16
|
-
// getFormData // Used internally by validation/publish handlers
|
|
17
|
-
} from './formProcessor.js';
|
|
18
|
-
|
|
19
|
-
// state and setServerCounter are likely not needed directly in index.js anymore
|
|
20
|
-
// import { state, setServerCounter } from './state.js';
|
|
21
|
-
import { showToast } from '../notifications.js';
|
|
22
|
-
import { handleValidation } from './validationHandlers.js';
|
|
23
|
-
import { handlePublish } from './publishHandler.js'; // Moved handlePublish to its own file
|
|
24
|
-
|
|
25
|
-
// Modal functions (as per original)
|
|
26
|
-
export function showOnboardModal() {
|
|
27
|
-
window.location.href = 'onboard.html';
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Make functions available globally (as per original)
|
|
31
|
-
window.showOnboardModal = showOnboardModal;
|
|
32
|
-
|
|
33
|
-
let activeTab = 'create-category'; // 'create-category' or 'create-server'
|
|
34
|
-
let categoriesLoaded = false;
|
|
35
|
-
let currentSelectedCategoryData = null;
|
|
36
|
-
window.isEditingCategory = false; // Flag to indicate if editing an existing category on the first tab
|
|
37
|
-
|
|
38
|
-
// Load existing category data if editing (primarily for "Create New Category" tab in edit mode)
|
|
39
|
-
async function loadExistingCategoryForEdit() {
|
|
40
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
41
|
-
const categoryName = urlParams.get('category');
|
|
42
|
-
const editMode = urlParams.get('action') === 'edit';
|
|
43
|
-
|
|
44
|
-
window.isEditingCategory = false; // Reset flag
|
|
45
|
-
|
|
46
|
-
if (categoryName && editMode) {
|
|
47
|
-
// This implies editing a whole category, so activate the first tab.
|
|
48
|
-
document.getElementById('tab-create-category').click();
|
|
49
|
-
try {
|
|
50
|
-
const response = await fetch(`/api/categories/${categoryName}`);
|
|
51
|
-
if (!response.ok) {
|
|
52
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
53
|
-
}
|
|
54
|
-
const result = await response.json();
|
|
55
|
-
if (result.success && result.data) {
|
|
56
|
-
// populateForm for the 'Create New Category' tab
|
|
57
|
-
populateForm(result.data.feedConfiguration, 'onboardForm');
|
|
58
|
-
// Set category name input as readonly if it's an update
|
|
59
|
-
const categoryNameInput = document.querySelector('#panel-create-category input[name="name"]');
|
|
60
|
-
if (categoryNameInput) {
|
|
61
|
-
categoryNameInput.readOnly = true;
|
|
62
|
-
categoryNameInput.classList.add('bg-gray-100', 'cursor-not-allowed');
|
|
63
|
-
}
|
|
64
|
-
window.isEditingCategory = true; // Set flag as we are editing
|
|
65
|
-
} else {
|
|
66
|
-
throw new Error(result.error || 'Failed to load category data.');
|
|
67
|
-
}
|
|
68
|
-
} catch (error) {
|
|
69
|
-
console.error('Error loading category for editing:', error);
|
|
70
|
-
showToast(`Error loading category for editing: ${error.message}`, 'error');
|
|
71
|
-
window.isEditingCategory = false;
|
|
72
|
-
}
|
|
73
|
-
} else if (categoryName && !editMode) {
|
|
74
|
-
// This could imply pre-selecting a category in the "Create New Server in Existing Category" tab
|
|
75
|
-
// For now, we handle this by just loading the categories and letting the user select.
|
|
76
|
-
// Future enhancement: pre-select if categoryName is provided without 'action=edit'.
|
|
77
|
-
if (document.getElementById('tab-create-server')) {
|
|
78
|
-
document.getElementById('tab-create-server').click(); // Switch to the correct tab
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
async function loadAndPopulateCategoriesDropdown() {
|
|
85
|
-
if (categoriesLoaded) return;
|
|
86
|
-
|
|
87
|
-
const selectElement = document.getElementById('existingCategorySelect');
|
|
88
|
-
if (!selectElement) return;
|
|
89
|
-
|
|
90
|
-
selectElement.innerHTML = '<option value="">Loading categories...</option>';
|
|
91
|
-
try {
|
|
92
|
-
const response = await fetch('/api/categories?local=true'); // Assuming local=true fetches editable categories
|
|
93
|
-
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
|
94
|
-
const result = await response.json();
|
|
95
|
-
|
|
96
|
-
if (result.success && Array.isArray(result.data)) {
|
|
97
|
-
selectElement.innerHTML = '<option value="">Select a category</option>';
|
|
98
|
-
result.data.forEach(category => {
|
|
99
|
-
const option = document.createElement('option');
|
|
100
|
-
option.value = category.name;
|
|
101
|
-
option.textContent = category.displayName || category.name;
|
|
102
|
-
selectElement.appendChild(option);
|
|
103
|
-
});
|
|
104
|
-
categoriesLoaded = true;
|
|
105
|
-
} else {
|
|
106
|
-
throw new Error(result.error || 'Failed to load categories.');
|
|
107
|
-
}
|
|
108
|
-
} catch (error) {
|
|
109
|
-
console.error('Error loading categories:', error);
|
|
110
|
-
selectElement.innerHTML = '<option value="">Error loading categories</option>';
|
|
111
|
-
showToast(`Error loading categories: ${error.message}`, 'error');
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
async function handleExistingCategorySelection(event) {
|
|
116
|
-
const categoryName = event.target.value;
|
|
117
|
-
// const selectElement = event.target; // Removed diagnostic log related variable
|
|
118
|
-
// console.log(`[index.js] handleExistingCategorySelection: Category '${categoryName}' selected. Dropdown display value: ${selectElement.options[selectElement.selectedIndex].text}, actual value: ${categoryName}`); // Removed diagnostic log
|
|
119
|
-
const basicInfoContainer = document.getElementById('existingCategoryBasicInfoContainer');
|
|
120
|
-
const mcpServersContainer = document.getElementById('existingCategoryMcpServersContainer');
|
|
121
|
-
const serversList = document.getElementById('existingCategoryServersList'); // Target for servers
|
|
122
|
-
// console.log(`[index.js] Before changes - mcpServersContainer hidden: ${mcpServersContainer.classList.contains('hidden')}, serversList children: ${serversList.children.length}`); // Removed diagnostic log
|
|
123
|
-
// Clear previous category details
|
|
124
|
-
serversList.innerHTML = ''; // Clear out old servers
|
|
125
|
-
document.querySelector('#existingCategoryBasicInfoContainer input[name="name"]').value = '';
|
|
126
|
-
document.querySelector('#existingCategoryBasicInfoContainer input[name="displayName"]').value = '';
|
|
127
|
-
document.querySelector('#existingCategoryBasicInfoContainer textarea[name="description"]').value = '';
|
|
128
|
-
document.querySelector('#existingCategoryBasicInfoContainer input[name="repository"]').value = '';
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if (!categoryName) {
|
|
132
|
-
basicInfoContainer.classList.add('hidden');
|
|
133
|
-
mcpServersContainer.classList.add('hidden');
|
|
134
|
-
currentSelectedCategoryData = null;
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
const response = await fetch(`/api/categories/${categoryName}`);
|
|
140
|
-
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
|
141
|
-
const result = await response.json();
|
|
142
|
-
|
|
143
|
-
if (result.success && result.data && result.data.feedConfiguration) {
|
|
144
|
-
currentSelectedCategoryData = result.data.feedConfiguration;
|
|
145
|
-
|
|
146
|
-
// Populate Basic Information (read-only)
|
|
147
|
-
const form = document.getElementById('onboardServerForm'); // Form for the second tab
|
|
148
|
-
form.querySelector('input[name="name"]').value = currentSelectedCategoryData.name || '';
|
|
149
|
-
form.querySelector('input[name="displayName"]').value = currentSelectedCategoryData.displayName || '';
|
|
150
|
-
form.querySelector('textarea[name="description"]').value = currentSelectedCategoryData.description || '';
|
|
151
|
-
form.querySelector('input[name="repository"]').value = currentSelectedCategoryData.repository || '';
|
|
152
|
-
|
|
153
|
-
basicInfoContainer.classList.remove('hidden');
|
|
154
|
-
mcpServersContainer.classList.remove('hidden');
|
|
155
|
-
// console.log(`[index.js] After making containers visible - mcpServersContainer hidden: ${mcpServersContainer.classList.contains('hidden')}`); // Ensure this is removed
|
|
156
|
-
|
|
157
|
-
// Populate MCP Servers (existing ones as read-only)
|
|
158
|
-
// populateForm will need to be adapted or a new function created to handle read-only state
|
|
159
|
-
// and target the correct server list.
|
|
160
|
-
// For now, let's assume populateForm can handle this or we'll call a specialized version.
|
|
161
|
-
if (currentSelectedCategoryData.mcpServers && currentSelectedCategoryData.mcpServers.length > 0) {
|
|
162
|
-
// This will call populateForm which needs to be aware of the context (read-only for existing servers)
|
|
163
|
-
// We pass 'onboardServerForm' to indicate the target form context.
|
|
164
|
-
// And 'existingCategoryServersList' for where servers should be rendered.
|
|
165
|
-
// The 'true' flag indicates these are existing servers and should be read-only.
|
|
166
|
-
populateForm(currentSelectedCategoryData, 'onboardServerForm', true); // This calls reset and then populates
|
|
167
|
-
|
|
168
|
-
// Ensure the container is visible after populating. This was the key fix.
|
|
169
|
-
mcpServersContainer.classList.remove('hidden');
|
|
170
|
-
// const isMcpContainerHiddenAfterPopulate = mcpServersContainer.classList.contains('hidden'); // Removed diagnostic log variable
|
|
171
|
-
// console.log(`[index.js] After populateForm AND EXPLICIT RE-SHOW - mcpServersContainer hidden: ${isMcpContainerHiddenAfterPopulate}, serversList children: ${serversList.children.length}`); // Removed diagnostic log
|
|
172
|
-
|
|
173
|
-
// const firstServerItem = serversList.querySelector('.server-item'); // Removed diagnostic log block
|
|
174
|
-
// if (firstServerItem) {
|
|
175
|
-
// const styles = window.getComputedStyle(firstServerItem);
|
|
176
|
-
// console.log(`[index.js] First server item in serversList computed display: ${styles.display}, visibility: ${styles.visibility}`);
|
|
177
|
-
// } else if (currentSelectedCategoryData.mcpServers && currentSelectedCategoryData.mcpServers.length > 0) {
|
|
178
|
-
// console.warn("[index.js] populateForm was called for servers, but no .server-item found in serversList afterwards.");
|
|
179
|
-
// }
|
|
180
|
-
} else {
|
|
181
|
-
serversList.innerHTML = '<p class="text-gray-500">No servers defined in this category yet. You can add new ones.</p>';
|
|
182
|
-
// console.log("[index.js] No MCP servers in this category (innerHTML set)."); // Removed diagnostic log
|
|
183
|
-
}
|
|
184
|
-
// Ensure "Add MCP Server" button is enabled for this tab
|
|
185
|
-
const addServerBtnExisting = mcpServersContainer.querySelector('button[onclick*="addServer"]');
|
|
186
|
-
if (addServerBtnExisting) addServerBtnExisting.disabled = false;
|
|
187
|
-
|
|
188
|
-
} else {
|
|
189
|
-
throw new Error(result.error || 'Failed to load category details.');
|
|
190
|
-
}
|
|
191
|
-
} catch (error) {
|
|
192
|
-
console.error('[index.js] Error in handleExistingCategorySelection (fetch/parse block):', error); // Keep this more specific error log
|
|
193
|
-
showToast(`Error fetching category details: ${error.message}`, 'error');
|
|
194
|
-
basicInfoContainer.classList.add('hidden');
|
|
195
|
-
mcpServersContainer.classList.add('hidden');
|
|
196
|
-
currentSelectedCategoryData = null;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Initialize event listeners
|
|
201
|
-
document.addEventListener('DOMContentLoaded', async () => {
|
|
202
|
-
// Load existing category data if URL indicates edit mode for the first tab
|
|
203
|
-
await loadExistingCategoryForEdit();
|
|
204
|
-
|
|
205
|
-
// Remove old form submit handlers, as publish buttons will now handle submission with polling
|
|
206
|
-
// const onboardForm = document.getElementById('onboardForm');
|
|
207
|
-
// if (onboardForm) {
|
|
208
|
-
// onboardForm.addEventListener('submit', (event) => submitForm(event, 'create-category', currentSelectedCategoryData));
|
|
209
|
-
// }
|
|
210
|
-
// const onboardServerForm = document.getElementById('onboardServerForm');
|
|
211
|
-
// if (onboardServerForm) {
|
|
212
|
-
// onboardServerForm.addEventListener('submit', (event) => submitForm(event, 'create-server', currentSelectedCategoryData));
|
|
213
|
-
// }
|
|
214
|
-
|
|
215
|
-
const existingCategorySelect = document.getElementById('existingCategorySelect');
|
|
216
|
-
if (existingCategorySelect) {
|
|
217
|
-
existingCategorySelect.addEventListener('change', handleExistingCategorySelection);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Setup tab switching functionality
|
|
221
|
-
const tabCreateCategory = document.getElementById('tab-create-category');
|
|
222
|
-
const tabCreateServer = document.getElementById('tab-create-server');
|
|
223
|
-
const panelCreateCategory = document.getElementById('panel-create-category');
|
|
224
|
-
const panelCreateServer = document.getElementById('panel-create-server');
|
|
225
|
-
|
|
226
|
-
if (tabCreateCategory && tabCreateServer && panelCreateCategory && panelCreateServer) {
|
|
227
|
-
function switchTab(targetTab) {
|
|
228
|
-
if (targetTab === activeTab) {
|
|
229
|
-
// If the clicked tab is already the active tab, do nothing.
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
const viewModeToggle = document.getElementById('viewModeToggle');
|
|
233
|
-
const isJsonView = viewModeToggle.checked;
|
|
234
|
-
|
|
235
|
-
if (isJsonView) {
|
|
236
|
-
// If JSON view is active, switch back to form view first.
|
|
237
|
-
// This will hide the JSON panel and show the form panel of the *currently active* tab.
|
|
238
|
-
const currentFormIdForJsonExit = activeTab === 'create-category' ? 'onboardForm' : 'onboardServerForm';
|
|
239
|
-
const currentServersListIdForJsonExit = activeTab === 'create-category' ? 'serversList' : 'existingCategoryServersList';
|
|
240
|
-
const baseDataForJsonExit = activeTab === 'create-server' ? currentSelectedCategoryData : null;
|
|
241
|
-
const isExistingCategoryForJsonExit = activeTab === 'create-server';
|
|
242
|
-
|
|
243
|
-
toggleViewMode(false, currentFormIdForJsonExit, currentServersListIdForJsonExit, baseDataForJsonExit, isExistingCategoryForJsonExit);
|
|
244
|
-
// Ensure the toggle reflects the change back to form view
|
|
245
|
-
viewModeToggle.checked = false;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (targetTab === 'create-category') {
|
|
249
|
-
activeTab = 'create-category';
|
|
250
|
-
tabCreateCategory.classList.add('text-blue-600', 'border-blue-600');
|
|
251
|
-
tabCreateCategory.classList.remove('text-gray-600', 'border-transparent', 'hover:border-blue-600');
|
|
252
|
-
tabCreateServer.classList.remove('text-blue-600', 'border-blue-600');
|
|
253
|
-
tabCreateServer.classList.add('text-gray-600', 'border-transparent', 'hover:border-blue-600');
|
|
254
|
-
|
|
255
|
-
panelCreateCategory.classList.remove('hidden');
|
|
256
|
-
panelCreateServer.classList.add('hidden');
|
|
257
|
-
// Removed automatic reset of 'onboardForm' when switching to 'create-category' tab
|
|
258
|
-
// to preserve form content when tabbing away and back in non-edit scenarios.
|
|
259
|
-
// The form is reset by default on page load if not editing,
|
|
260
|
-
// or specifically when loading an existing category for edit.
|
|
261
|
-
} else if (targetTab === 'create-server') {
|
|
262
|
-
activeTab = 'create-server';
|
|
263
|
-
tabCreateServer.classList.add('text-blue-600', 'border-blue-600');
|
|
264
|
-
tabCreateServer.classList.remove('text-gray-600', 'border-transparent', 'hover:border-blue-600');
|
|
265
|
-
tabCreateCategory.classList.remove('text-blue-600', 'border-blue-600');
|
|
266
|
-
tabCreateCategory.classList.add('text-gray-600', 'border-transparent', 'hover:border-blue-600');
|
|
267
|
-
|
|
268
|
-
panelCreateServer.classList.remove('hidden');
|
|
269
|
-
panelCreateCategory.classList.add('hidden');
|
|
270
|
-
// console.log(`[index.js] switchTab to 'create-server': panelCreateServer hidden: ${panelCreateServer.classList.contains('hidden')}, existingCategoryMcpServersContainer hidden: ${document.getElementById('existingCategoryMcpServersContainer').classList.contains('hidden')}`); // Ensure this is removed
|
|
271
|
-
loadAndPopulateCategoriesDropdown(); // Load categories if not already loaded
|
|
272
|
-
}
|
|
273
|
-
// At this point, we are definitely in a form view (either switched from JSON or was already in form view).
|
|
274
|
-
// The JSON editor panel should be hidden.
|
|
275
|
-
const jsonEditorPanel = document.getElementById('panel-json-editor');
|
|
276
|
-
if (jsonEditorPanel) { // Ensure it exists
|
|
277
|
-
jsonEditorPanel.classList.add('hidden');
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
tabCreateCategory.addEventListener('click', () => switchTab('create-category'));
|
|
282
|
-
tabCreateServer.addEventListener('click', () => switchTab('create-server'));
|
|
283
|
-
|
|
284
|
-
// Set initial tab based on activeTab (default 'create-category')
|
|
285
|
-
// switchTab(activeTab); // Initial call might be problematic if DOM isn't fully ready for it.
|
|
286
|
-
// loadExistingCategoryForEdit might click a tab, making this redundant or causing issues.
|
|
287
|
-
// Let's rely on default HTML state or explicit clicks.
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// Initialize button handlers
|
|
291
|
-
// const addRequirementBtn = document.getElementById('addRequirementBtn');
|
|
292
|
-
// if (addRequirementBtn) {
|
|
293
|
-
// addRequirementBtn.addEventListener('click', addRequirement); // addRequirement from uiHandlers.js
|
|
294
|
-
// }
|
|
295
|
-
|
|
296
|
-
const addServerBtnNewCategory = document.getElementById('addServerBtnNewCategory'); // For "Create New Category" tab
|
|
297
|
-
if (addServerBtnNewCategory) {
|
|
298
|
-
// addServer in uiHandlers defaults serversListId to 'serversList', which is correct for this button.
|
|
299
|
-
// It also defaults isReadOnly to false.
|
|
300
|
-
addServerBtnNewCategory.addEventListener('click', () => window.addServer('serversList', false, null));
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
const addServerBtnExistingCategory = document.getElementById('addServerToExistingCategoryBtn'); // For "Create Server in Existing Category" tab
|
|
304
|
-
if (addServerBtnExistingCategory) {
|
|
305
|
-
addServerBtnExistingCategory.addEventListener('click', () => {
|
|
306
|
-
// console.log('[index.js] "Add MCP Server" button clicked for EXISTING CATEGORY tab.'); // Kept for verbosity if needed
|
|
307
|
-
console.log('[index.js] "Add MCP Server" button clicked for EXISTING CATEGORY tab.');
|
|
308
|
-
// Explicitly pass the correct serversListId and ensure isReadOnly is false for new servers.
|
|
309
|
-
addServer('existingCategoryServersList', false, null);
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// Validation buttons
|
|
314
|
-
const validateButtonNewCategory = document.getElementById('validateButtonNewCategory');
|
|
315
|
-
if (validateButtonNewCategory) {
|
|
316
|
-
validateButtonNewCategory.addEventListener('click', (event) => handleValidation(event, 'create-category', currentSelectedCategoryData));
|
|
317
|
-
}
|
|
318
|
-
const validateButtonExistingCategory = document.getElementById('validateButtonExistingCategory');
|
|
319
|
-
if (validateButtonExistingCategory) {
|
|
320
|
-
validateButtonExistingCategory.addEventListener('click', (event) => handleValidation(event, 'create-server', currentSelectedCategoryData));
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Publish buttons
|
|
324
|
-
const publishButtonNewCategory = document.getElementById('publishButtonNewCategory');
|
|
325
|
-
if (publishButtonNewCategory) {
|
|
326
|
-
publishButtonNewCategory.addEventListener('click', (event) => {
|
|
327
|
-
handlePublish(event, 'create-category', currentSelectedCategoryData, window.isEditingCategory);
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
const publishButtonExistingCategory = document.getElementById('publishButtonExistingCategory');
|
|
331
|
-
if (publishButtonExistingCategory) {
|
|
332
|
-
publishButtonExistingCategory.addEventListener('click', (event) => {
|
|
333
|
-
// Publishing from "Create Server in Existing Category" tab is always an update to that category.
|
|
334
|
-
handlePublish(event, 'create-server', currentSelectedCategoryData, true);
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
const viewModeToggle = document.getElementById('viewModeToggle');
|
|
339
|
-
if (viewModeToggle) {
|
|
340
|
-
viewModeToggle.addEventListener('change', (event) => {
|
|
341
|
-
const currentFormId = activeTab === 'create-category' ? 'onboardForm' : 'onboardServerForm';
|
|
342
|
-
const currentServersListId = activeTab === 'create-category' ? 'serversList' : 'existingCategoryServersList';
|
|
343
|
-
toggleViewMode(event.target.checked, currentFormId, currentServersListId, activeTab === 'create-server' ? currentSelectedCategoryData : null, activeTab === 'create-server');
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
const saveJsonButton = document.getElementById('saveJsonButton');
|
|
348
|
-
if (saveJsonButton) {
|
|
349
|
-
saveJsonButton.addEventListener('click', () => saveJsonData(activeTab, currentSelectedCategoryData));
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// A button to trigger copyJsonToClipboard might exist, e.g.
|
|
353
|
-
const copyJsonBtn = document.getElementById('copyJsonButton'); // Assuming an ID like 'copyJsonButton'
|
|
354
|
-
if (copyJsonBtn) {
|
|
355
|
-
copyJsonBtn.addEventListener('click', copyJsonToClipboard); // copyJsonToClipboard from uiHandlers.js
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Expose necessary functions to window for HTML event handlers.
|
|
359
|
-
// Functions from uiHandlers.js (addServer, removeServer, etc., toggleSectionContent, copyJsonToClipboard)
|
|
360
|
-
// are already made global by uiHandlers.js itself.
|
|
361
|
-
// We only need to expose functions imported by index.js that were previously global
|
|
362
|
-
// and might still be called directly from HTML, and are not made global by their source module.
|
|
363
|
-
Object.assign(window, {
|
|
364
|
-
// handleValidation was originally in index.js and exposed.
|
|
365
|
-
// It's used by an event listener here, but exposing it maintains compatibility if HTML calls it.
|
|
366
|
-
handleValidation,
|
|
367
|
-
handlePublish, // Expose handlePublish globally
|
|
368
|
-
|
|
369
|
-
// showOnboardModal is defined in this file and already explicitly put on window.
|
|
370
|
-
|
|
371
|
-
// Other functions like addServer, copyJsonToClipboard, toggleSectionContent etc.
|
|
372
|
-
// are made global by uiHandlers.js.
|
|
373
|
-
});
|
|
374
|
-
});
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
// src/web/public/js/onboard/publishHandler.js
|
|
2
|
-
import { showToast } from '../notifications.js';
|
|
3
|
-
import { getFormData } from './formProcessor.js';
|
|
4
|
-
import {
|
|
5
|
-
validateFormFields,
|
|
6
|
-
pollOperationStatus,
|
|
7
|
-
updateOperationDisplay,
|
|
8
|
-
getElementIdsByTab,
|
|
9
|
-
ensureStatusPanelVisible
|
|
10
|
-
} from './validationHandlers.js';
|
|
11
|
-
|
|
12
|
-
const POLLING_INTERVAL = 3000; // 3 seconds
|
|
13
|
-
let pollingIntervalId = null;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Handles the publish process for the onboarding form.
|
|
17
|
-
* @param {Event} event - The click event.
|
|
18
|
-
* @param {string} activeTab - Identifier for the active tab ('create-category' or 'create-server').
|
|
19
|
-
* @param {object|null} currentSelectedCategoryData - Data for the currently selected category if activeTab is 'create-server'.
|
|
20
|
-
* @param {boolean} isUpdate - Flag indicating if this is an update to an existing category.
|
|
21
|
-
*/
|
|
22
|
-
export async function handlePublish(event, activeTab, currentSelectedCategoryData = null, isUpdate = false) {
|
|
23
|
-
const { panelId, contentId, formId, validateButtonId, publishButtonId } = getElementIdsByTab(activeTab);
|
|
24
|
-
|
|
25
|
-
const statusContentElement = document.getElementById(contentId);
|
|
26
|
-
// Ensure the progress toggle listener is attached when handlePublish is called
|
|
27
|
-
if (typeof ensureProgressToggleListener === 'function') { // Check if imported correctly
|
|
28
|
-
ensureProgressToggleListener(statusContentElement);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const onboardForm = document.getElementById(formId);
|
|
32
|
-
const validateButton = document.getElementById(validateButtonId);
|
|
33
|
-
const publishButton = document.getElementById(publishButtonId);
|
|
34
|
-
|
|
35
|
-
if (!onboardForm || !statusContentElement || !validateButton || !publishButton) {
|
|
36
|
-
console.error('Required form or panel elements not found for publishing.');
|
|
37
|
-
showToast('Required form or panel elements not found for publishing.', 'error');
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Validate form fields
|
|
42
|
-
const validationResult = validateFormFields(onboardForm, activeTab);
|
|
43
|
-
if (!validationResult.isValid) {
|
|
44
|
-
showToast('Please fix all validation errors before proceeding.', 'error');
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
let hasErrors = false;
|
|
49
|
-
|
|
50
|
-
if (activeTab === 'create-category') {
|
|
51
|
-
const formData = getFormData(onboardForm, false);
|
|
52
|
-
if (!formData.mcpServers || formData.mcpServers.length === 0) {
|
|
53
|
-
showToast('At least one MCP server must be configured for a new category.', 'error');
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Check category name format
|
|
58
|
-
const nameInput = onboardForm.querySelector('input[name="name"]');
|
|
59
|
-
if (nameInput && nameInput.value.trim()) {
|
|
60
|
-
if (!/^[a-zA-Z0-9-_]+$/.test(nameInput.value.trim())) {
|
|
61
|
-
showValidationMessage(nameInput, 'Only alphanumeric characters, hyphens, and underscores allowed', true);
|
|
62
|
-
hasErrors = true;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (hasErrors) {
|
|
68
|
-
showToast('Please fix all validation errors before proceeding.', 'error');
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
publishButton.disabled = true;
|
|
73
|
-
publishButton.innerHTML = "<i class='bx bx-loader-alt bx-spin mr-2'></i>Publishing...";
|
|
74
|
-
validateButton.disabled = true; // Also disable validate button during publish
|
|
75
|
-
|
|
76
|
-
if (pollingIntervalId) {
|
|
77
|
-
clearInterval(pollingIntervalId);
|
|
78
|
-
pollingIntervalId = null;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const forExistingCategoryTab = activeTab === 'create-server';
|
|
82
|
-
const newServersData = getFormData(onboardForm, forExistingCategoryTab, currentSelectedCategoryData);
|
|
83
|
-
let finalFeedConfiguration;
|
|
84
|
-
|
|
85
|
-
if (forExistingCategoryTab && currentSelectedCategoryData) {
|
|
86
|
-
finalFeedConfiguration = JSON.parse(JSON.stringify(currentSelectedCategoryData)); // Deep clone
|
|
87
|
-
|
|
88
|
-
// Replace MCP Servers and Requirements with the current state from the form (newServersData)
|
|
89
|
-
// This aligns with the logic in handleValidation
|
|
90
|
-
finalFeedConfiguration.mcpServers = newServersData.mcpServers || [];
|
|
91
|
-
finalFeedConfiguration.requirements = newServersData.requirements || [];
|
|
92
|
-
} else {
|
|
93
|
-
finalFeedConfiguration = newServersData;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
statusContentElement.innerHTML = '<p class="text-gray-500">Initiating publish...</p>';
|
|
97
|
-
ensureStatusPanelVisible(panelId, contentId);
|
|
98
|
-
|
|
99
|
-
try {
|
|
100
|
-
const payload = {
|
|
101
|
-
categoryData: finalFeedConfiguration,
|
|
102
|
-
isUpdate: isUpdate,
|
|
103
|
-
forExistingCategory: forExistingCategoryTab
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
const response = await fetch('/api/categories/onboard', {
|
|
107
|
-
method: 'POST',
|
|
108
|
-
headers: { 'Content-Type': 'application/json' },
|
|
109
|
-
body: JSON.stringify(payload),
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const result = await response.json();
|
|
113
|
-
|
|
114
|
-
if (result.success && result.data) {
|
|
115
|
-
updateOperationDisplay(result.data, statusContentElement);
|
|
116
|
-
const categoryName = finalFeedConfiguration.name; // Use the original category name for polling
|
|
117
|
-
const operationTypeForPolling = 'FULL_ONBOARDING'; // Publish always initiates 'FULL_ONBOARDING'
|
|
118
|
-
const initialStatus = result.data.status;
|
|
119
|
-
|
|
120
|
-
if (categoryName && typeof initialStatus === 'string' && initialStatus.toUpperCase() !== 'COMPLETED' && initialStatus.toUpperCase() !== 'FAILED' && initialStatus.toUpperCase() !== 'SUCCEEDED') {
|
|
121
|
-
pollingIntervalId = setInterval(async () => {
|
|
122
|
-
const shouldContinue = await pollOperationStatus(categoryName, contentId, validateButtonId, publishButtonId, 'publish', operationTypeForPolling);
|
|
123
|
-
if (!shouldContinue) {
|
|
124
|
-
clearInterval(pollingIntervalId);
|
|
125
|
-
pollingIntervalId = null;
|
|
126
|
-
}
|
|
127
|
-
}, POLLING_INTERVAL);
|
|
128
|
-
} else {
|
|
129
|
-
// Restore buttons to their original state fully
|
|
130
|
-
publishButton.disabled = false;
|
|
131
|
-
publishButton.innerHTML = "<i class='bx bx-cloud-upload mr-2'></i>Publish";
|
|
132
|
-
publishButton.classList.remove('opacity-50');
|
|
133
|
-
validateButton.disabled = false;
|
|
134
|
-
validateButton.innerHTML = "<i class='bx bx-check-shield mr-2'></i>Validate";
|
|
135
|
-
validateButton.classList.remove('opacity-50');
|
|
136
|
-
if (initialStatus.toUpperCase() === 'COMPLETED' || initialStatus.toUpperCase() === 'SUCCEEDED') {
|
|
137
|
-
showToast(result.data.message || 'Publish successful!', 'success');
|
|
138
|
-
} else if (initialStatus.toUpperCase() === 'FAILED') {
|
|
139
|
-
showToast(result.data.errorMessage || result.data.message || 'Publish failed.', 'error');
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
} else {
|
|
143
|
-
// Handle cases where result.success is false or result.data is missing
|
|
144
|
-
const errorMessage = (result.data && result.data.message) || result.error || result.message || 'Publish request failed: Unknown error';
|
|
145
|
-
if (result.data) { // If data is present (even if success is false), update display
|
|
146
|
-
updateOperationDisplay(result.data, statusContentElement);
|
|
147
|
-
} else {
|
|
148
|
-
statusContentElement.innerHTML = `<p class="text-red-500">${errorMessage}</p>`;
|
|
149
|
-
}
|
|
150
|
-
showToast(errorMessage, 'error');
|
|
151
|
-
|
|
152
|
-
// Restore buttons to their original state fully
|
|
153
|
-
publishButton.disabled = false;
|
|
154
|
-
publishButton.innerHTML = "<i class='bx bx-cloud-upload mr-2'></i>Publish";
|
|
155
|
-
publishButton.classList.remove('opacity-50');
|
|
156
|
-
validateButton.disabled = false;
|
|
157
|
-
validateButton.innerHTML = "<i class='bx bx-check-shield mr-2'></i>Validate";
|
|
158
|
-
validateButton.classList.remove('opacity-50');
|
|
159
|
-
}
|
|
160
|
-
} catch (error) {
|
|
161
|
-
console.error('Error during publish:', error);
|
|
162
|
-
statusContentElement.innerHTML = `<p class="text-red-500">An error occurred while initiating publish. Please check the console.</p>`;
|
|
163
|
-
showToast('An error occurred during publish. Check console.', 'error');
|
|
164
|
-
// Restore buttons to their original state fully
|
|
165
|
-
publishButton.disabled = false;
|
|
166
|
-
publishButton.innerHTML = "<i class='bx bx-cloud-upload mr-2'></i>Publish";
|
|
167
|
-
publishButton.classList.remove('opacity-50');
|
|
168
|
-
validateButton.disabled = false;
|
|
169
|
-
validateButton.innerHTML = "<i class='bx bx-check-shield mr-2'></i>Validate";
|
|
170
|
-
validateButton.classList.remove('opacity-50');
|
|
171
|
-
}
|
|
172
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// Global state management
|
|
2
|
-
export const state = {
|
|
3
|
-
serverCounters: new Map(), // Tracks server count per serversListId: serversListId -> serverCount
|
|
4
|
-
envCountersPerTab: new Map(), // Tracks env var count per server per tab: serversListId -> Map(serverIndex -> envCount)
|
|
5
|
-
serverRequirementCountersPerTab: new Map() // Tracks requirement count per server per tab: serversListId -> Map(serverIndex -> reqCount)
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
// export const incrementRequirementCounter = () => state.requirementCounter++; // Removed
|
|
9
|
-
// export const incrementServerCounter = () => state.serverCounter++; // Will be managed by counting elements
|
|
10
|
-
/**
|
|
11
|
-
* Sets the server counter for a specific serversListId.
|
|
12
|
-
* @param {string} serversListId - The ID of the server list.
|
|
13
|
-
* @param {number} count - The new server count for this list.
|
|
14
|
-
*/
|
|
15
|
-
export const setServerCounter = (serversListId, count) => {
|
|
16
|
-
state.serverCounters.set(serversListId, count);
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Gets the server counter for a specific serversListId.
|
|
21
|
-
* @param {string} serversListId - The ID of the server list.
|
|
22
|
-
* @returns {number} The server count for this list.
|
|
23
|
-
*/
|
|
24
|
-
export const getServerCounter = (serversListId) => {
|
|
25
|
-
return state.serverCounters.get(serversListId) || 0;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const setEnvCounter = (serversListId, serverIndex, value) => {
|
|
29
|
-
if (!state.envCountersPerTab.has(serversListId)) {
|
|
30
|
-
state.envCountersPerTab.set(serversListId, new Map());
|
|
31
|
-
}
|
|
32
|
-
state.envCountersPerTab.get(serversListId).set(serverIndex, value);
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export const getEnvCounter = (serversListId, serverIndex) => {
|
|
36
|
-
const tabCounters = state.envCountersPerTab.get(serversListId);
|
|
37
|
-
return tabCounters ? tabCounters.get(serverIndex) || 0 : 0;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
export const deleteEnvCounter = (serversListId, serverIndex) => {
|
|
41
|
-
const tabCounters = state.envCountersPerTab.get(serversListId);
|
|
42
|
-
if (tabCounters) {
|
|
43
|
-
tabCounters.delete(serverIndex);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export const clearEnvCountersForTab = (serversListId) => {
|
|
48
|
-
if (state.envCountersPerTab.has(serversListId)) {
|
|
49
|
-
state.envCountersPerTab.get(serversListId).clear();
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export const setServerRequirementCounter = (serversListId, serverIndex, value) => {
|
|
54
|
-
if (!state.serverRequirementCountersPerTab.has(serversListId)) {
|
|
55
|
-
state.serverRequirementCountersPerTab.set(serversListId, new Map());
|
|
56
|
-
}
|
|
57
|
-
state.serverRequirementCountersPerTab.get(serversListId).set(serverIndex, value);
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export const getServerRequirementCounter = (serversListId, serverIndex) => {
|
|
61
|
-
const tabCounters = state.serverRequirementCountersPerTab.get(serversListId);
|
|
62
|
-
return tabCounters ? tabCounters.get(serverIndex) || 0 : 0;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export const deleteServerRequirementCounter = (serversListId, serverIndex) => {
|
|
66
|
-
const tabCounters = state.serverRequirementCountersPerTab.get(serversListId);
|
|
67
|
-
if (tabCounters) {
|
|
68
|
-
tabCounters.delete(serverIndex);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export const clearServerRequirementCountersForTab = (serversListId) => {
|
|
73
|
-
if (state.serverRequirementCountersPerTab.has(serversListId)) {
|
|
74
|
-
state.serverRequirementCountersPerTab.get(serversListId).clear();
|
|
75
|
-
}
|
|
76
|
-
};
|