imcp 0.0.19 → 0.1.2
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/.roo/rules-code/rules.md +88 -0
- package/dist/cli/index.js +1 -45
- package/dist/core/installers/clients/BaseClientInstaller.d.ts +1 -5
- package/dist/core/installers/clients/BaseClientInstaller.js +40 -38
- package/dist/core/installers/clients/ClientInstaller.d.ts +9 -9
- package/dist/core/installers/clients/ClientInstaller.js +105 -99
- package/dist/core/installers/requirements/BaseInstaller.d.ts +9 -1
- package/dist/core/installers/requirements/CommandInstaller.d.ts +9 -1
- package/dist/core/installers/requirements/CommandInstaller.js +46 -12
- package/dist/core/installers/requirements/GeneralInstaller.d.ts +11 -1
- package/dist/core/installers/requirements/GeneralInstaller.js +46 -10
- package/dist/core/installers/requirements/InstallerFactory.d.ts +3 -1
- package/dist/core/installers/requirements/InstallerFactory.js +3 -2
- package/dist/core/installers/requirements/NpmInstaller.d.ts +4 -2
- package/dist/core/installers/requirements/NpmInstaller.js +38 -22
- package/dist/core/installers/requirements/PipInstaller.d.ts +3 -1
- package/dist/core/installers/requirements/PipInstaller.js +58 -36
- package/dist/core/installers/requirements/RequirementInstaller.d.ts +4 -1
- package/dist/core/loaders/InstallOperationManager.d.ts +115 -0
- package/dist/core/loaders/InstallOperationManager.js +311 -0
- package/dist/core/loaders/SystemSettingsManager.d.ts +54 -0
- package/dist/core/loaders/SystemSettingsManager.js +257 -0
- package/dist/core/metadatas/constants.d.ts +7 -0
- package/dist/core/metadatas/constants.js +7 -0
- package/dist/core/metadatas/recordingConstants.d.ts +44 -0
- package/dist/core/metadatas/recordingConstants.js +45 -0
- package/dist/core/metadatas/types.d.ts +21 -0
- package/dist/core/onboard/FeedOnboardService.d.ts +7 -3
- package/dist/core/onboard/FeedOnboardService.js +52 -5
- package/dist/core/onboard/InstallOperationManager.d.ts +23 -0
- package/dist/core/onboard/InstallOperationManager.js +144 -0
- package/dist/core/onboard/OnboardStatusManager.js +2 -1
- package/dist/core/validators/StdioServerValidator.js +4 -3
- package/dist/services/InstallationService.d.ts +2 -37
- package/dist/services/InstallationService.js +45 -313
- package/dist/services/MCPManager.d.ts +1 -1
- package/dist/services/MCPManager.js +53 -47
- package/dist/services/RequirementService.d.ts +85 -12
- package/dist/services/RequirementService.js +488 -49
- package/dist/services/ServerService.d.ts +0 -6
- package/dist/services/ServerService.js +0 -74
- package/dist/services/TelemetryService.d.ts +15 -0
- package/dist/services/TelemetryService.js +54 -0
- package/dist/utils/adoUtils.js +6 -3
- package/dist/utils/githubAuth.js +65 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.js +78 -1
- package/dist/utils/macroExpressionUtils.js +3 -25
- package/dist/utils/osUtils.d.ts +22 -1
- package/dist/utils/osUtils.js +92 -1
- package/dist/utils/versionUtils.d.ts +20 -0
- package/dist/utils/versionUtils.js +76 -0
- package/dist/web/public/css/modal.css +292 -1
- package/dist/web/public/css/serverCategoryList.css +120 -0
- package/dist/web/public/css/serverDetails.css +14 -1
- package/dist/web/public/index.html +126 -21
- package/dist/web/public/js/flights/flights.js +1 -1
- package/dist/web/public/js/modal/index.js +8 -14
- package/dist/web/public/js/modal/installModal.js +3 -4
- package/dist/web/public/js/modal/installation.js +122 -137
- package/dist/web/public/js/modal/loadingModal.js +155 -25
- package/dist/web/public/js/modal/messageQueue.js +45 -101
- package/dist/web/public/js/modal/modalSetup.js +125 -43
- package/dist/web/public/js/modal/modalUtils.js +0 -12
- package/dist/web/public/js/modal.js +23 -10
- package/dist/web/public/js/onboard/formProcessor.js +18 -11
- package/dist/web/public/js/onboard/publishHandler.js +35 -3
- package/dist/web/public/js/onboard/templates.js +5 -1
- package/dist/web/public/js/onboard/uiHandlers.js +266 -39
- package/dist/web/public/js/onboard/validationHandlers.js +71 -39
- package/dist/web/public/js/serverCategoryDetails.js +60 -11
- package/dist/web/public/js/serverCategoryList.js +93 -9
- package/dist/web/public/js/settings.js +314 -0
- package/dist/web/public/onboard.html +2 -2
- package/dist/web/public/settings.html +135 -0
- package/dist/web/public/styles.css +32 -0
- package/dist/web/server.js +93 -1
- package/{src/web/public/js/onboard → docs}/ONBOARDING_PAGE_DESIGN.md +15 -125
- package/docs/Telemetry.md +136 -0
- package/memory-bank/activeContext.md +26 -0
- package/memory-bank/decisionLog.md +91 -0
- package/memory-bank/productContext.md +41 -0
- package/memory-bank/progress.md +35 -0
- package/memory-bank/systemPatterns.md +10 -0
- package/package.json +2 -1
- package/src/cli/index.ts +1 -48
- package/src/core/installers/clients/BaseClientInstaller.ts +64 -50
- package/src/core/installers/clients/ClientInstaller.ts +130 -130
- package/src/core/installers/requirements/BaseInstaller.ts +9 -1
- package/src/core/installers/requirements/CommandInstaller.ts +47 -13
- package/src/core/installers/requirements/GeneralInstaller.ts +48 -10
- package/src/core/installers/requirements/InstallerFactory.ts +4 -3
- package/src/core/installers/requirements/NpmInstaller.ts +90 -68
- package/src/core/installers/requirements/PipInstaller.ts +81 -55
- package/src/core/installers/requirements/RequirementInstaller.ts +4 -3
- package/src/core/loaders/InstallOperationManager.ts +367 -0
- package/src/core/loaders/SystemSettingsManager.ts +278 -0
- package/src/core/metadatas/constants.ts +9 -0
- package/src/core/metadatas/recordingConstants.ts +62 -0
- package/src/core/metadatas/types.ts +23 -0
- package/src/core/onboard/FeedOnboardService.ts +59 -5
- package/src/core/onboard/OnboardStatusManager.ts +2 -1
- package/src/core/validators/StdioServerValidator.ts +4 -3
- package/src/services/InstallationService.ts +54 -399
- package/src/services/MCPManager.ts +61 -64
- package/src/services/RequirementService.ts +564 -67
- package/src/services/ServerService.ts +0 -90
- package/src/services/TelemetryService.ts +59 -0
- package/src/utils/adoUtils.ts +6 -4
- package/src/utils/githubAuth.ts +84 -1
- package/src/utils/logger.ts +83 -1
- package/src/utils/macroExpressionUtils.ts +4 -21
- package/src/utils/osUtils.ts +92 -1
- package/src/utils/versionUtils.ts +98 -13
- package/src/web/public/css/modal.css +292 -1
- package/src/web/public/css/serverCategoryList.css +120 -0
- package/src/web/public/css/serverDetails.css +14 -1
- package/src/web/public/index.html +126 -21
- package/src/web/public/js/flights/flights.js +1 -1
- package/src/web/public/js/modal/index.js +8 -14
- package/src/web/public/js/modal/installModal.js +3 -4
- package/src/web/public/js/modal/installation.js +122 -137
- package/src/web/public/js/modal/loadingModal.js +155 -25
- package/src/web/public/js/modal/modalSetup.js +125 -43
- package/src/web/public/js/modal/modalUtils.js +0 -12
- package/src/web/public/js/modal.js +23 -10
- package/src/web/public/js/onboard/formProcessor.js +18 -11
- package/src/web/public/js/onboard/publishHandler.js +35 -3
- package/src/web/public/js/onboard/templates.js +5 -1
- package/src/web/public/js/onboard/uiHandlers.js +266 -39
- package/src/web/public/js/onboard/validationHandlers.js +71 -39
- package/src/web/public/js/serverCategoryDetails.js +60 -11
- package/src/web/public/js/serverCategoryList.js +93 -9
- package/src/web/public/js/settings.js +314 -0
- package/src/web/public/onboard.html +2 -2
- package/src/web/public/settings.html +135 -0
- package/src/web/public/styles.css +32 -0
- package/src/web/server.ts +96 -1
- 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/modalUI.js +0 -214
- package/dist/web/public/js/modal/version.js +0 -20
- package/src/web/public/js/modal/messageQueue.js +0 -112
|
@@ -1,6 +1,66 @@
|
|
|
1
1
|
/* Import Inter font */
|
|
2
2
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
|
|
3
3
|
|
|
4
|
+
/* --- Custom: Loading Modal Overall Status Sizing --- */
|
|
5
|
+
.installation-status-header {
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
align-items: center;
|
|
9
|
+
margin-bottom: 2rem;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.overall-status-icon {
|
|
13
|
+
width: 80px !important;
|
|
14
|
+
height: 80px !important;
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
font-size: 3rem !important;
|
|
19
|
+
margin-bottom: 1rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.overall-status-icon .status-spinner,
|
|
23
|
+
.overall-status-icon .status-icon-circled,
|
|
24
|
+
.overall-status-icon .status-icon {
|
|
25
|
+
width: 80px !important;
|
|
26
|
+
height: 80px !important;
|
|
27
|
+
font-size: 3rem !important;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.overall-status-text {
|
|
31
|
+
font-size: 1.5rem !important; /* Reduced from 2.2rem */
|
|
32
|
+
font-weight: 600; /* Slightly lighter weight */
|
|
33
|
+
color: #2563eb;
|
|
34
|
+
margin: 0;
|
|
35
|
+
text-align: center;
|
|
36
|
+
letter-spacing: 0.01em;
|
|
37
|
+
padding: 0 1rem; /* Added padding for better spacing */
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.overall-status-icon {
|
|
41
|
+
width: 60px !important; /* Reduced from 80px */
|
|
42
|
+
height: 60px !important;
|
|
43
|
+
display: flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
justify-content: center;
|
|
46
|
+
font-size: 2.5rem !important; /* Reduced from 3rem */
|
|
47
|
+
margin-bottom: 0.75rem;
|
|
48
|
+
border-radius: 50%;
|
|
49
|
+
background: rgba(37, 99, 235, 0.1);
|
|
50
|
+
padding: 0.5rem;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.overall-status-icon .status-spinner,
|
|
54
|
+
.overall-status-icon .status-icon-circled,
|
|
55
|
+
.overall-status-icon .status-icon {
|
|
56
|
+
width: 100% !important;
|
|
57
|
+
height: 100% !important;
|
|
58
|
+
font-size: inherit !important;
|
|
59
|
+
display: flex;
|
|
60
|
+
align-items: center;
|
|
61
|
+
justify-content: center;
|
|
62
|
+
}
|
|
63
|
+
|
|
4
64
|
/* Base styles */
|
|
5
65
|
body {
|
|
6
66
|
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
|
@@ -31,7 +91,7 @@ body {
|
|
|
31
91
|
border: 3px solid #3498db !important;
|
|
32
92
|
color: #222 !important;
|
|
33
93
|
min-width: 320px;
|
|
34
|
-
min-height:
|
|
94
|
+
min-height: 320px; /* Increased height for larger modal */
|
|
35
95
|
opacity: 1 !important;
|
|
36
96
|
box-shadow: 0 0 16px #3498db;
|
|
37
97
|
position: relative;
|
|
@@ -463,4 +523,235 @@ body {
|
|
|
463
523
|
border-radius: 3px;
|
|
464
524
|
border: 1px solid #e2e8f0;
|
|
465
525
|
color: #2563eb;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/* Step message styling */
|
|
529
|
+
.message-line.step-message {
|
|
530
|
+
display: flex;
|
|
531
|
+
align-items: flex-start; /* Align items to the top for timestamp */
|
|
532
|
+
padding: 1px 0; /* Further reduced padding */
|
|
533
|
+
font-size: 0.75rem; /* Further reduced font size for steps */
|
|
534
|
+
margin-bottom: 2px; /* Further reduced margin */
|
|
535
|
+
line-height: 1.4; /* Adjust line height for compactness */
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
.step-icon {
|
|
539
|
+
margin-right: 6px; /* Reduced margin */
|
|
540
|
+
font-size: 0.8rem; /* Further smaller icon */
|
|
541
|
+
width: 14px; /* Fixed width for alignment */
|
|
542
|
+
text-align: center;
|
|
543
|
+
flex-shrink: 0; /* Prevent icon from shrinking */
|
|
544
|
+
margin-top: 1px; /* Align icon better with first line of text */
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
.step-icon.success-icon {
|
|
548
|
+
color: #10b981; /* Green */
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
.step-icon.error-icon {
|
|
552
|
+
color: #ef4444; /* Red */
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
.step-icon.pending-icon {
|
|
556
|
+
color: #6b7280; /* Gray */
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
.step-text-content {
|
|
560
|
+
flex-grow: 1;
|
|
561
|
+
display: flex;
|
|
562
|
+
flex-direction: column; /* Stack text and timestamp */
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
.step-text {
|
|
566
|
+
/* flex-grow: 1; */ /* Handled by step-text-content */
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.step-timestamp {
|
|
570
|
+
font-size: 0.65rem; /* Very small for timestamp */
|
|
571
|
+
color: #9ca3af; /* Lighter gray for timestamp */
|
|
572
|
+
margin-left: 0px; /* Align with step text, icon has its own margin */
|
|
573
|
+
padding-top: 1px;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/* New Loading Modal Styles */
|
|
577
|
+
.installation-status-header {
|
|
578
|
+
display: flex;
|
|
579
|
+
align-items: center;
|
|
580
|
+
padding-bottom: 1rem;
|
|
581
|
+
margin-bottom: 1rem;
|
|
582
|
+
border-bottom: 1px solid #e5e7eb; /* Light gray border */
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
.overall-status-icon {
|
|
586
|
+
margin-right: 1rem;
|
|
587
|
+
display: flex;
|
|
588
|
+
align-items: center;
|
|
589
|
+
justify-content: center;
|
|
590
|
+
width: 32px; /* Increased size for overall status icon */
|
|
591
|
+
height: 32px;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
.overall-status-icon .status-icon {
|
|
595
|
+
font-size: 24px; /* Larger icon */
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.overall-status-icon.completed .icon-check-container {
|
|
599
|
+
display: flex;
|
|
600
|
+
align-items: center;
|
|
601
|
+
justify-content: center;
|
|
602
|
+
width: 28px; /* Slightly larger to accommodate circle + check */
|
|
603
|
+
height: 28px;
|
|
604
|
+
border-radius: 50%;
|
|
605
|
+
background-color: #10b981; /* Green background for circle */
|
|
606
|
+
border: 2px solid #059669; /* Darker green border */
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
.overall-status-icon.completed .icon-check-container .icon-check {
|
|
610
|
+
color: #ffffff; /* White checkmark */
|
|
611
|
+
font-size: 18px; /* Adjust size of checkmark within circle */
|
|
612
|
+
line-height: 1; /* Ensure check is centered */
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
.overall-status-icon.failed .icon-cross {
|
|
616
|
+
color: #ef4444; /* Red */
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.status-spinner {
|
|
620
|
+
border: 3px solid #f3f3f3; /* Light grey */
|
|
621
|
+
border-top: 3px solid #3498db; /* Blue */
|
|
622
|
+
border-radius: 50%;
|
|
623
|
+
width: 24px;
|
|
624
|
+
height: 24px;
|
|
625
|
+
animation: spin 1s linear infinite;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
@keyframes spin {
|
|
629
|
+
0% { transform: rotate(0deg); }
|
|
630
|
+
100% { transform: rotate(360deg); }
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
.overall-status-text {
|
|
634
|
+
font-size: 1.125rem; /* Equivalent to text-lg in Tailwind */
|
|
635
|
+
font-weight: 600; /* semibold */
|
|
636
|
+
color: #374151; /* gray-700 */
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
.installation-steps-container {
|
|
640
|
+
/* Styles for the container of the steps list */
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
.steps-list-header {
|
|
644
|
+
font-size: 0.875rem; /* text-sm */
|
|
645
|
+
font-weight: 500; /* medium */
|
|
646
|
+
color: #6b7280; /* gray-500 */
|
|
647
|
+
margin-bottom: 0.5rem;
|
|
648
|
+
padding-left: 4px; /* Align with step items */
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
.install-step-details-list {
|
|
652
|
+
list-style: none;
|
|
653
|
+
padding: 0;
|
|
654
|
+
margin: 0;
|
|
655
|
+
max-height: 250px; /* Or any desired height */
|
|
656
|
+
overflow-y: auto;
|
|
657
|
+
scrollbar-width: thin;
|
|
658
|
+
scrollbar-color: #a0aec0 #e2e8f0; /* Adjust colors as needed */
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
.install-step-details-list::-webkit-scrollbar {
|
|
662
|
+
width: 6px;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
.install-step-details-list::-webkit-scrollbar-track {
|
|
666
|
+
background: #e2e8f0;
|
|
667
|
+
border-radius: 3px;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
.install-step-details-list::-webkit-scrollbar-thumb {
|
|
671
|
+
background-color: #a0aec0;
|
|
672
|
+
border-radius: 3px;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
.step-detail-item {
|
|
677
|
+
display: flex;
|
|
678
|
+
align-items: flex-start; /* Align icon with the top of the text block */
|
|
679
|
+
justify-content: flex-start; /* Explicitly align content to the start (left) */
|
|
680
|
+
padding: 0.3rem 0.25rem; /* Compact padding */
|
|
681
|
+
font-size: 0.8rem; /* text-xs or sm */
|
|
682
|
+
border-bottom: 1px solid #f3f4f6; /* very light separator */
|
|
683
|
+
}
|
|
684
|
+
.step-detail-item:last-child {
|
|
685
|
+
border-bottom: none;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.step-detail-item .step-icon { /* Re-using .step-icon from previous attempt, ensure it's general enough */
|
|
689
|
+
margin-right: 0.5rem;
|
|
690
|
+
font-size: 0.85rem;
|
|
691
|
+
width: 16px;
|
|
692
|
+
text-align: center;
|
|
693
|
+
flex-shrink: 0;
|
|
694
|
+
margin-top: 1px; /* Small adjustment for alignment */
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
.step-detail-item.success .icon-check-small {
|
|
698
|
+
color: #10b981;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.step-detail-item.error .icon-cross-small {
|
|
702
|
+
color: #ef4444;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
.step-info {
|
|
706
|
+
flex-grow: 1;
|
|
707
|
+
display: flex;
|
|
708
|
+
flex-direction: column;
|
|
709
|
+
align-items: flex-start; /* Ensure children (name, message) are left-aligned */
|
|
710
|
+
text-align: left; /* Ensure text within step-info defaults to left */
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
.step-name {
|
|
714
|
+
font-weight: 500; /* medium */
|
|
715
|
+
color: #4b5563; /* gray-600 */
|
|
716
|
+
/* text-align: left; */ /* Should be inherited from .step-info or default */
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
.step-message {
|
|
720
|
+
font-size: 0.75rem; /* text-xs */
|
|
721
|
+
color: #6b7280; /* gray-500 */
|
|
722
|
+
word-break: break-word;
|
|
723
|
+
text-align: left; /* Explicitly align the message text to the left */
|
|
724
|
+
width: 100%; /* Ensure it takes full available width if align-items: flex-start on parent isn't enough */
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
.step-detail-item.error .step-message {
|
|
728
|
+
color: #ef4444; /* Red for error messages */
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
.step-detail-item .step-timestamp { /* Re-using .step-timestamp */
|
|
732
|
+
font-size: 0.7rem; /* Slightly larger than before for readability */
|
|
733
|
+
color: #a0aec0; /* gray-400 */
|
|
734
|
+
margin-left: 0.75rem;
|
|
735
|
+
white-space: nowrap;
|
|
736
|
+
flex-shrink: 0;
|
|
737
|
+
padding-top: 1px; /* Align with step-name */
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
/* Close button for the loading modal specifically */
|
|
741
|
+
#installLoadingModal .modal-content .modal-close-btn {
|
|
742
|
+
position: absolute;
|
|
743
|
+
top: 10px;
|
|
744
|
+
right: 15px;
|
|
745
|
+
font-size: 1.8rem;
|
|
746
|
+
font-weight: bold;
|
|
747
|
+
color: #aaa;
|
|
748
|
+
background: none;
|
|
749
|
+
border: none;
|
|
750
|
+
cursor: pointer;
|
|
751
|
+
padding: 0;
|
|
752
|
+
line-height: 1;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
#installLoadingModal .modal-content .modal-close-btn:hover {
|
|
756
|
+
color: #333;
|
|
466
757
|
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* Server Category List Styles */
|
|
2
|
+
.category-toggle {
|
|
3
|
+
cursor: pointer;
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
color: #4b5563; /* gray-600 */
|
|
7
|
+
transition: all 0.2s;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.category-toggle:hover {
|
|
11
|
+
color: #1e40af; /* blue-800 */
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.category-toggle i {
|
|
15
|
+
font-size: 1.25rem;
|
|
16
|
+
transition: transform 0.2s;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.category-toggle.collapsed i {
|
|
20
|
+
transform: rotate(-90deg);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.server-list-container {
|
|
24
|
+
transition: height 0.3s ease, opacity 0.3s ease, margin 0.3s ease;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.server-list-container.collapsed {
|
|
29
|
+
height: 0 !important;
|
|
30
|
+
opacity: 0;
|
|
31
|
+
margin-top: 0;
|
|
32
|
+
margin-bottom: 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.category-section {
|
|
36
|
+
margin-bottom: 1rem;
|
|
37
|
+
border-bottom: 1px solid #e5e7eb; /* gray-200 */
|
|
38
|
+
padding-bottom: 0.5rem;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.category-section:last-child {
|
|
42
|
+
border-bottom: none;
|
|
43
|
+
margin-bottom: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.category-header {
|
|
47
|
+
display: flex;
|
|
48
|
+
justify-content: space-between;
|
|
49
|
+
align-items: center;
|
|
50
|
+
margin-bottom: 0.5rem;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Pin button styles */
|
|
54
|
+
.pin-button {
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
display: flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
color: #9ca3af; /* gray-400 */
|
|
59
|
+
margin-right: 8px;
|
|
60
|
+
transition: all 0.2s ease;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.pin-button:hover {
|
|
64
|
+
color: #4b5563; /* gray-600 */
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.pin-button.pinned {
|
|
68
|
+
color: #2563eb; /* blue-600 */
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.pin-button.pinned:hover {
|
|
72
|
+
color: #1d4ed8; /* blue-700 */
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Pinned server section */
|
|
76
|
+
.server-item.pinned {
|
|
77
|
+
border-left: 3px solid #2563eb; /* blue-600 */
|
|
78
|
+
background-color: #f0f7ff; /* very light blue */
|
|
79
|
+
position: relative;
|
|
80
|
+
transition: all 0.2s ease-in-out;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Pin animation */
|
|
84
|
+
.server-item {
|
|
85
|
+
transition: transform 0.3s ease, border-left 0.2s ease, background-color 0.2s ease;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Visual indicator for pinned items at the top */
|
|
89
|
+
.server-item.pinned::before {
|
|
90
|
+
content: "";
|
|
91
|
+
position: absolute;
|
|
92
|
+
top: -3px;
|
|
93
|
+
left: 0;
|
|
94
|
+
right: 0;
|
|
95
|
+
height: 3px;
|
|
96
|
+
background-color: #2563eb; /* blue-600 */
|
|
97
|
+
opacity: 0;
|
|
98
|
+
transition: opacity 0.2s ease;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Show top indicator for the first pinned item */
|
|
102
|
+
.server-item.pinned:first-child::before {
|
|
103
|
+
opacity: 1;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* Add hover effect to pinned items */
|
|
107
|
+
.server-item.pinned:hover {
|
|
108
|
+
background-color: #e6f0ff; /* slightly darker on hover */
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Pin animation effect */
|
|
112
|
+
@keyframes pin-animation {
|
|
113
|
+
0% { transform: scale(1); }
|
|
114
|
+
50% { transform: scale(1.03); }
|
|
115
|
+
100% { transform: scale(1); }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.pin-animation {
|
|
119
|
+
animation: pin-animation 0.3s ease;
|
|
120
|
+
}
|
|
@@ -110,10 +110,23 @@
|
|
|
110
110
|
padding: 0.5rem 1.5rem;
|
|
111
111
|
text-align: center;
|
|
112
112
|
font-weight: 600;
|
|
113
|
-
transition:
|
|
113
|
+
transition: none; /* No delay for hover effect */
|
|
114
114
|
white-space: nowrap;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
/* Update button (orange) */
|
|
118
|
+
.btn-update {
|
|
119
|
+
background-color: #fb923c; /* orange-400 */
|
|
120
|
+
color: #fff;
|
|
121
|
+
border: none;
|
|
122
|
+
}
|
|
123
|
+
.btn-update:hover, .btn-update:focus {
|
|
124
|
+
background-color: #f97316; /* orange-500 */
|
|
125
|
+
color: #fff;
|
|
126
|
+
border: none;
|
|
127
|
+
box-shadow: 0 0 0 2px #fed7aa;
|
|
128
|
+
}
|
|
129
|
+
|
|
117
130
|
/* Status badges */
|
|
118
131
|
.server-item-info .flex-wrap span {
|
|
119
132
|
display: inline-flex;
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
<link rel="stylesheet" href="css/notifications.css">
|
|
15
15
|
<link rel="stylesheet" href="css/serverDetails.css">
|
|
16
16
|
<link rel="stylesheet" href="css/detailsWidget.css">
|
|
17
|
+
<link rel="stylesheet" href="css/serverCategoryList.css">
|
|
17
18
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
18
19
|
|
|
19
20
|
<!-- Alert container for notifications -->
|
|
@@ -25,22 +26,26 @@
|
|
|
25
26
|
<div class="container mx-auto px-4 py-6">
|
|
26
27
|
<div class="flex items-center justify-between mb-8">
|
|
27
28
|
<h1 class="text-3xl font-bold text-gray-900 flex items-center">
|
|
28
|
-
<
|
|
29
|
-
|
|
29
|
+
<a href="index.html" class="flex items-center text-gray-900 hover:text-blue-600 transition-colors">
|
|
30
|
+
<i class='bx bx-server mr-3 text-blue-600'></i>
|
|
31
|
+
IMCP Server Manager
|
|
32
|
+
</a>
|
|
33
|
+
<button id="settingsButton"
|
|
34
|
+
class="text-gray-700 hover:text-blue-600 transition-colors flex items-center ml-3 mt-1">
|
|
35
|
+
<i class='bx bx-cog text-3xl'></i>
|
|
36
|
+
</button>
|
|
30
37
|
</h1>
|
|
31
38
|
<div class="lg:w-2/3 flex justify-end items-center gap-4">
|
|
32
39
|
<div class="relative w-48 focus-within:w-96 transition-all duration-300 ease-in-out">
|
|
33
|
-
<input type="text" id="searchBox"
|
|
34
|
-
placeholder="Search..."
|
|
35
|
-
data-expanded-placeholder="Search servers or tools..."
|
|
36
|
-
class="w-full px-10 py-2.5 bg-gray-50 border border-gray-200 rounded-lg
|
|
40
|
+
<input type="text" id="searchBox" placeholder="Search..."
|
|
41
|
+
data-expanded-placeholder="Search servers or tools..." class="w-full px-10 py-2.5 bg-gray-50 border border-gray-200 rounded-lg
|
|
37
42
|
text-gray-700 placeholder-gray-400
|
|
38
43
|
focus:border-blue-400 focus:ring-2 focus:ring-blue-100
|
|
39
44
|
transition-all duration-300 ease-in-out">
|
|
40
45
|
<i class='bx bx-search absolute left-3.5 top-1/2 transform -translate-y-1/2 text-gray-400'></i>
|
|
41
46
|
</div>
|
|
42
47
|
<button id="onboardButton" style="display: none;"
|
|
43
|
-
|
|
48
|
+
class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors flex items-center">
|
|
44
49
|
<i class='bx bx-plus-circle mr-2'></i>
|
|
45
50
|
Onboard
|
|
46
51
|
</button>
|
|
@@ -170,7 +175,7 @@
|
|
|
170
175
|
import { fetchServerCategories, handleInstallServer, uninstallTool } from './js/api.js';
|
|
171
176
|
import { setupSearch } from './js/serverCategoryList.js';
|
|
172
177
|
import { showServerDetails } from './js/serverCategoryDetails.js';
|
|
173
|
-
import { showInstallModal, closeModal
|
|
178
|
+
import { showInstallModal, closeModal } from './js/modal.js';
|
|
174
179
|
// import { showOnboardModal as navigateToOnboard } from './js/onboard/index.js'; // We are directly navigating
|
|
175
180
|
import flights, { getFlightQueryParameters, buildUrlWithFlights } from './js/flights/flights.js';
|
|
176
181
|
|
|
@@ -178,8 +183,8 @@
|
|
|
178
183
|
window.showServerDetails = showServerDetails;
|
|
179
184
|
window.showInstallModal = showInstallModal;
|
|
180
185
|
// window.showOnboardModal = showOnboardModal; // This might conflict if showOnboardModal is also in onboard/index.js
|
|
181
|
-
|
|
182
|
-
|
|
186
|
+
// We'll rely on the event listener above for the main page's onboard button.
|
|
187
|
+
// If other parts of the app call window.showOnboardModal, they'll need updating too.
|
|
183
188
|
window.closeModal = closeModal;
|
|
184
189
|
window.handleInstallServer = handleInstallServer;
|
|
185
190
|
window.uninstallTool = uninstallTool;
|
|
@@ -187,23 +192,20 @@
|
|
|
187
192
|
// Initialize
|
|
188
193
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
189
194
|
setupSearch();
|
|
190
|
-
setupModalOutsideClick();
|
|
191
|
-
|
|
192
195
|
const onboardButton = document.getElementById('onboardButton');
|
|
193
196
|
if (flights.enableOnboard) {
|
|
194
197
|
onboardButton.style.display = 'flex'; // Make it visible
|
|
195
198
|
onboardButton.addEventListener('click', () => {
|
|
196
|
-
// The original showOnboardModal in onboard/index.js likely does window.location.href = 'onboard.html';
|
|
197
|
-
// We need to preserve existing flight parameters.
|
|
198
199
|
const flightQueryString = getFlightQueryParameters();
|
|
199
|
-
// Assuming navigateToOnboard from onboard/index.js handles the actual navigation
|
|
200
|
-
// If it directly sets window.location.href, we might need to adjust how it's called or modify it.
|
|
201
|
-
// For now, let's assume we can adapt its usage or it's a simple navigation.
|
|
202
|
-
// The simplest way if showOnboardModal in onboard/index.js is just `window.location.href = 'onboard.html'`
|
|
203
|
-
// would be to directly navigate here.
|
|
204
200
|
window.location.href = buildUrlWithFlights('onboard.html');
|
|
205
201
|
});
|
|
206
202
|
}
|
|
203
|
+
|
|
204
|
+
const settingsButton = document.getElementById('settingsButton');
|
|
205
|
+
settingsButton.addEventListener('click', () => {
|
|
206
|
+
window.location.href = buildUrlWithFlights('settings.html');
|
|
207
|
+
});
|
|
208
|
+
|
|
207
209
|
// No 'else' block needed as it's hidden by default via inline style
|
|
208
210
|
|
|
209
211
|
try {
|
|
@@ -230,8 +232,6 @@
|
|
|
230
232
|
window.location.href = buildUrlWithFlights('index.html', { category: allServerCategoriesData[0].name });
|
|
231
233
|
return; // Stop further execution, page will reload
|
|
232
234
|
} else {
|
|
233
|
-
// No categories at all, or data still loading. Default placeholder will be shown.
|
|
234
|
-
// Or, if allServerCategoriesData is empty after fetch, the placeholder from HTML remains.
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
} catch (error) {
|
|
@@ -246,9 +246,114 @@
|
|
|
246
246
|
serverCategoryListDiv.innerHTML = `<p class="text-red-500">Could not load categories.</p>`;
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
|
+
|
|
250
|
+
// Fetch and display application version
|
|
251
|
+
try {
|
|
252
|
+
const versionResponse = await fetch('/api/version');
|
|
253
|
+
const appVersionSpan = document.getElementById('appVersion');
|
|
254
|
+
const versionInfoContainer = document.getElementById('versionInfoContainer');
|
|
255
|
+
const versionIcon = versionInfoContainer.querySelector('i');
|
|
256
|
+
|
|
257
|
+
// Create tooltip element
|
|
258
|
+
const tooltip = document.createElement('div');
|
|
259
|
+
tooltip.className = 'version-tooltip';
|
|
260
|
+
versionInfoContainer.appendChild(tooltip);
|
|
261
|
+
|
|
262
|
+
let tooltipMessage = "Loading version information...";
|
|
263
|
+
let isUpdateAvailable = false;
|
|
264
|
+
|
|
265
|
+
if (versionResponse.ok) {
|
|
266
|
+
const versionData = await versionResponse.json();
|
|
267
|
+
if (versionData.success && versionData.data) {
|
|
268
|
+
const currentVersion = versionData.data.version || 'N/A';
|
|
269
|
+
appVersionSpan.textContent = currentVersion;
|
|
270
|
+
|
|
271
|
+
if (versionData.data.availableUpdate) {
|
|
272
|
+
isUpdateAvailable = true;
|
|
273
|
+
tooltipMessage = versionData.data.availableUpdate.message;
|
|
274
|
+
} else {
|
|
275
|
+
tooltipMessage = "You're already up to date!";
|
|
276
|
+
}
|
|
277
|
+
} else {
|
|
278
|
+
appVersionSpan.textContent = 'N/A';
|
|
279
|
+
tooltipMessage = "Could not retrieve version information.";
|
|
280
|
+
}
|
|
281
|
+
} else {
|
|
282
|
+
console.error('Failed to fetch version:', versionResponse.status);
|
|
283
|
+
appVersionSpan.textContent = 'N/A';
|
|
284
|
+
tooltipMessage = "Failed to fetch version information.";
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
tooltip.textContent = tooltipMessage;
|
|
288
|
+
|
|
289
|
+
if (isUpdateAvailable) {
|
|
290
|
+
versionInfoContainer.classList.add('text-orange-500');
|
|
291
|
+
versionIcon.classList.add('text-orange-500');
|
|
292
|
+
appVersionSpan.classList.add('text-orange-500');
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
versionInfoContainer.addEventListener('mouseenter', () => {
|
|
296
|
+
tooltip.classList.add('visible');
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
versionInfoContainer.addEventListener('mouseleave', () => {
|
|
300
|
+
// Only hide if the mouse isn't over the tooltip itself
|
|
301
|
+
setTimeout(() => { // Add a small delay to allow moving to the tooltip
|
|
302
|
+
if (!tooltip.matches(':hover')) {
|
|
303
|
+
tooltip.classList.remove('visible');
|
|
304
|
+
}
|
|
305
|
+
}, 100);
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
tooltip.addEventListener('mouseleave', () => {
|
|
309
|
+
tooltip.classList.remove('visible');
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
// Keep tooltip visible if clicked, and allow clicking outside to close
|
|
313
|
+
versionInfoContainer.addEventListener('click', (event) => {
|
|
314
|
+
event.stopPropagation();
|
|
315
|
+
tooltip.classList.add('visible'); // Ensure it's visible on click
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
document.addEventListener('click', (event) => {
|
|
319
|
+
if (!versionInfoContainer.contains(event.target) && !tooltip.contains(event.target)) {
|
|
320
|
+
tooltip.classList.remove('visible');
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
} catch (error) {
|
|
326
|
+
console.error('Error fetching version:', error);
|
|
327
|
+
const appVersionSpan = document.getElementById('appVersion');
|
|
328
|
+
if (appVersionSpan) {
|
|
329
|
+
appVersionSpan.textContent = 'N/A';
|
|
330
|
+
const versionInfoContainer = document.getElementById('versionInfoContainer');
|
|
331
|
+
const tooltip = versionInfoContainer.querySelector('.version-tooltip');
|
|
332
|
+
if (tooltip) {
|
|
333
|
+
tooltip.textContent = "Error fetching version information.";
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
249
337
|
});
|
|
250
338
|
</script>
|
|
251
339
|
<script src="js/modal.js" type="module"></script>
|
|
340
|
+
|
|
341
|
+
<footer class="text-sm text-gray-600 py-6 mt-10 border-t border-gray-200">
|
|
342
|
+
<div class="container mx-auto px-4">
|
|
343
|
+
<div class="flex flex-col sm:flex-row justify-start items-start sm:items-center space-y-2 sm:space-y-0 sm:space-x-6 px-6">
|
|
344
|
+
<a href="https://github.com/ai-microsoft/imcp" target="_blank" rel="noopener noreferrer"
|
|
345
|
+
class="flex items-center text-blue-600 hover:text-blue-700 hover:underline transition-colors"
|
|
346
|
+
title="Welcome for any feedback.">
|
|
347
|
+
<i class='bx bxl-github mr-1.5'></i> GitHub
|
|
348
|
+
</a>
|
|
349
|
+
<span class="hidden sm:inline text-gray-300">|</span>
|
|
350
|
+
<span id="versionInfoContainer" class="version-info-container flex items-center text-gray-700">
|
|
351
|
+
<i class='bx bx-info-circle mr-1.5 text-gray-500'></i>
|
|
352
|
+
Version: <span id="appVersion" class="ml-1 font-medium">Loading...</span>
|
|
353
|
+
</span>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
</footer>
|
|
252
357
|
</body>
|
|
253
358
|
|
|
254
359
|
</html>
|
|
@@ -4,7 +4,7 @@ const FLIGHT_STORAGE_KEY = 'activeFlightSettings';
|
|
|
4
4
|
|
|
5
5
|
// Default flight settings
|
|
6
6
|
const defaultFlights = {
|
|
7
|
-
enableOnboard:
|
|
7
|
+
enableOnboard: true, // Default: Onboarding is enabled. Set to false to disable.
|
|
8
8
|
// Add other default flights here, e.g., newFeatureX: false,
|
|
9
9
|
};
|
|
10
10
|
|