imcp 0.1.5 → 0.1.6

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.
Files changed (186) hide show
  1. package/.github/ISSUE_TEMPLATE/JitAccess.yml +28 -0
  2. package/.github/acl/access.yml +20 -0
  3. package/.github/compliance/inventory.yml +5 -0
  4. package/.github/policies/jit.yml +19 -0
  5. package/.github/workflows/build.yml +28 -0
  6. package/.roo/rules-code/rules.md +88 -0
  7. package/docs/ONBOARDING_PAGE_DESIGN.md +260 -0
  8. package/docs/Telemetry.md +136 -0
  9. package/memory-bank/activeContext.md +26 -0
  10. package/memory-bank/decisionLog.md +91 -0
  11. package/memory-bank/productContext.md +41 -0
  12. package/memory-bank/progress.md +35 -0
  13. package/memory-bank/systemPatterns.md +10 -0
  14. package/package.json +1 -5
  15. package/src/cli/commands/install.ts +139 -0
  16. package/src/cli/commands/list.ts +113 -0
  17. package/src/cli/commands/pull.ts +16 -0
  18. package/src/cli/commands/serve.ts +39 -0
  19. package/src/cli/commands/uninstall.ts +64 -0
  20. package/src/cli/index.ts +82 -0
  21. package/src/core/installers/clients/BaseClientInstaller.ts +341 -0
  22. package/src/core/installers/clients/ClientInstaller.ts +222 -0
  23. package/src/core/installers/clients/ClientInstallerFactory.ts +43 -0
  24. package/src/core/installers/clients/ClineInstaller.ts +35 -0
  25. package/src/core/installers/clients/ExtensionInstaller.ts +165 -0
  26. package/src/core/installers/clients/GithubCopilotInstaller.ts +79 -0
  27. package/src/core/installers/clients/MSRooCodeInstaller.ts +32 -0
  28. package/src/core/installers/index.ts +11 -0
  29. package/src/core/installers/requirements/BaseInstaller.ts +85 -0
  30. package/src/core/installers/requirements/CommandInstaller.ts +231 -0
  31. package/src/core/installers/requirements/GeneralInstaller.ts +133 -0
  32. package/src/core/installers/requirements/InstallerFactory.ts +114 -0
  33. package/src/core/installers/requirements/NpmInstaller.ts +271 -0
  34. package/src/core/installers/requirements/NugetInstaller.ts +203 -0
  35. package/src/core/installers/requirements/PipInstaller.ts +207 -0
  36. package/src/core/installers/requirements/RequirementInstaller.ts +42 -0
  37. package/src/core/loaders/ConfigurationLoader.ts +298 -0
  38. package/src/core/loaders/ConfigurationProvider.ts +462 -0
  39. package/src/core/loaders/InstallOperationManager.ts +367 -0
  40. package/src/core/loaders/ServerSchemaLoader.ts +117 -0
  41. package/src/core/loaders/ServerSchemaProvider.ts +99 -0
  42. package/src/core/loaders/SystemSettingsManager.ts +278 -0
  43. package/src/core/metadatas/constants.ts +122 -0
  44. package/src/core/metadatas/recordingConstants.ts +65 -0
  45. package/src/core/metadatas/types.ts +202 -0
  46. package/src/core/onboard/FeedOnboardService.ts +501 -0
  47. package/src/core/onboard/OnboardProcessor.ts +356 -0
  48. package/src/core/onboard/OnboardStatus.ts +60 -0
  49. package/src/core/onboard/OnboardStatusManager.ts +416 -0
  50. package/src/core/validators/FeedValidator.ts +135 -0
  51. package/src/core/validators/IServerValidator.ts +21 -0
  52. package/src/core/validators/SSEServerValidator.ts +43 -0
  53. package/src/core/validators/ServerValidatorFactory.ts +51 -0
  54. package/src/core/validators/StdioServerValidator.ts +313 -0
  55. package/src/index.ts +44 -0
  56. package/src/services/InstallationService.ts +102 -0
  57. package/src/services/MCPManager.ts +249 -0
  58. package/src/services/RequirementService.ts +627 -0
  59. package/src/services/ServerService.ts +161 -0
  60. package/src/services/TelemetryService.ts +59 -0
  61. package/src/utils/UpdateCheckTracker.ts +86 -0
  62. package/src/utils/adoUtils.ts +293 -0
  63. package/src/utils/clientUtils.ts +72 -0
  64. package/src/utils/feedUtils.ts +31 -0
  65. package/src/utils/githubAuth.ts +212 -0
  66. package/src/utils/githubUtils.ts +164 -0
  67. package/src/utils/logger.ts +195 -0
  68. package/src/utils/macroExpressionUtils.ts +104 -0
  69. package/src/utils/osUtils.ts +700 -0
  70. package/src/utils/versionUtils.ts +114 -0
  71. package/src/web/contract/serverContract.ts +74 -0
  72. package/src/web/public/css/detailsWidget.css +235 -0
  73. package/src/web/public/css/modal.css +757 -0
  74. package/src/web/public/css/notifications.css +101 -0
  75. package/src/web/public/css/onboard.css +107 -0
  76. package/src/web/public/css/serverCategoryList.css +120 -0
  77. package/src/web/public/css/serverDetails.css +139 -0
  78. package/src/web/public/index.html +359 -0
  79. package/src/web/public/js/api.js +132 -0
  80. package/src/web/public/js/detailsWidget.js +264 -0
  81. package/src/web/public/js/flights/flights.js +127 -0
  82. package/src/web/public/js/modal/index.js +52 -0
  83. package/src/web/public/js/modal/installModal.js +162 -0
  84. package/src/web/public/js/modal/installation.js +266 -0
  85. package/src/web/public/js/modal/loadingModal.js +182 -0
  86. package/src/web/public/js/modal/modalSetup.js +595 -0
  87. package/src/web/public/js/modal/modalUtils.js +37 -0
  88. package/src/web/public/js/modal/versionUtils.js +20 -0
  89. package/src/web/public/js/modal.js +42 -0
  90. package/src/web/public/js/notifications.js +137 -0
  91. package/src/web/public/js/onboard/formProcessor.js +1037 -0
  92. package/src/web/public/js/onboard/index.js +374 -0
  93. package/src/web/public/js/onboard/publishHandler.js +172 -0
  94. package/src/web/public/js/onboard/state.js +76 -0
  95. package/src/web/public/js/onboard/templates.js +342 -0
  96. package/src/web/public/js/onboard/uiHandlers.js +1076 -0
  97. package/src/web/public/js/onboard/validationHandlers.js +493 -0
  98. package/src/web/public/js/serverCategoryDetails.js +364 -0
  99. package/src/web/public/js/serverCategoryList.js +241 -0
  100. package/src/web/public/js/settings.js +314 -0
  101. package/src/web/public/modal.html +84 -0
  102. package/src/web/public/onboard.html +296 -0
  103. package/src/web/public/settings.html +135 -0
  104. package/src/web/public/styles.css +277 -0
  105. package/src/web/server.ts +478 -0
  106. package/tsconfig.json +18 -0
  107. package/wiki/Installation.md +3 -0
  108. package/wiki/Publish.md +3 -0
  109. package/dist/cli/commands/install.js.map +0 -1
  110. package/dist/cli/commands/list.js.map +0 -1
  111. package/dist/cli/commands/pull.js.map +0 -1
  112. package/dist/cli/commands/serve.js.map +0 -1
  113. package/dist/cli/commands/start.js.map +0 -1
  114. package/dist/cli/commands/sync.js.map +0 -1
  115. package/dist/cli/commands/uninstall.js.map +0 -1
  116. package/dist/cli/index.js.map +0 -1
  117. package/dist/core/ConfigurationLoader.js.map +0 -1
  118. package/dist/core/ConfigurationProvider.js.map +0 -1
  119. package/dist/core/InstallationService.js.map +0 -1
  120. package/dist/core/MCPManager.js.map +0 -1
  121. package/dist/core/RequirementService.js.map +0 -1
  122. package/dist/core/ServerSchemaLoader.js.map +0 -1
  123. package/dist/core/ServerSchemaProvider.js.map +0 -1
  124. package/dist/core/constants.js.map +0 -1
  125. package/dist/core/installers/BaseInstaller.js.map +0 -1
  126. package/dist/core/installers/ClientInstaller.js.map +0 -1
  127. package/dist/core/installers/CommandInstaller.js.map +0 -1
  128. package/dist/core/installers/GeneralInstaller.js.map +0 -1
  129. package/dist/core/installers/InstallerFactory.js.map +0 -1
  130. package/dist/core/installers/NpmInstaller.js.map +0 -1
  131. package/dist/core/installers/PipInstaller.js.map +0 -1
  132. package/dist/core/installers/RequirementInstaller.js.map +0 -1
  133. package/dist/core/installers/clients/BaseClientInstaller.js.map +0 -1
  134. package/dist/core/installers/clients/ClientInstaller.js.map +0 -1
  135. package/dist/core/installers/clients/ClientInstallerFactory.js.map +0 -1
  136. package/dist/core/installers/clients/ClineInstaller.js.map +0 -1
  137. package/dist/core/installers/clients/ExtensionInstaller.js.map +0 -1
  138. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +0 -1
  139. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +0 -1
  140. package/dist/core/installers/index.js.map +0 -1
  141. package/dist/core/installers/requirements/BaseInstaller.js.map +0 -1
  142. package/dist/core/installers/requirements/CommandInstaller.js.map +0 -1
  143. package/dist/core/installers/requirements/GeneralInstaller.js.map +0 -1
  144. package/dist/core/installers/requirements/InstallerFactory.js.map +0 -1
  145. package/dist/core/installers/requirements/NpmInstaller.js.map +0 -1
  146. package/dist/core/installers/requirements/NugetInstaller.js.map +0 -1
  147. package/dist/core/installers/requirements/PipInstaller.js.map +0 -1
  148. package/dist/core/installers/requirements/RequirementInstaller.js.map +0 -1
  149. package/dist/core/loaders/ConfigurationLoader.js.map +0 -1
  150. package/dist/core/loaders/ConfigurationProvider.js.map +0 -1
  151. package/dist/core/loaders/InstallOperationManager.js.map +0 -1
  152. package/dist/core/loaders/ServerSchemaLoader.js.map +0 -1
  153. package/dist/core/loaders/ServerSchemaProvider.js.map +0 -1
  154. package/dist/core/loaders/SystemSettingsManager.js.map +0 -1
  155. package/dist/core/metadatas/constants.js.map +0 -1
  156. package/dist/core/metadatas/recordingConstants.js.map +0 -1
  157. package/dist/core/metadatas/types.js.map +0 -1
  158. package/dist/core/onboard/FeedOnboardService.js.map +0 -1
  159. package/dist/core/onboard/OnboardProcessor.js.map +0 -1
  160. package/dist/core/onboard/OnboardStatus.js.map +0 -1
  161. package/dist/core/onboard/OnboardStatusManager.js.map +0 -1
  162. package/dist/core/types.js.map +0 -1
  163. package/dist/core/validators/FeedValidator.js.map +0 -1
  164. package/dist/core/validators/IServerValidator.js.map +0 -1
  165. package/dist/core/validators/SSEServerValidator.js.map +0 -1
  166. package/dist/core/validators/ServerValidatorFactory.js.map +0 -1
  167. package/dist/core/validators/StdioServerValidator.js.map +0 -1
  168. package/dist/index.js.map +0 -1
  169. package/dist/services/InstallRequestValidator.js.map +0 -1
  170. package/dist/services/InstallationService.js.map +0 -1
  171. package/dist/services/MCPManager.js.map +0 -1
  172. package/dist/services/RequirementService.js.map +0 -1
  173. package/dist/services/ServerService.js.map +0 -1
  174. package/dist/services/TelemetryService.js.map +0 -1
  175. package/dist/utils/UpdateCheckTracker.js.map +0 -1
  176. package/dist/utils/adoUtils.js.map +0 -1
  177. package/dist/utils/clientUtils.js.map +0 -1
  178. package/dist/utils/feedUtils.js.map +0 -1
  179. package/dist/utils/githubAuth.js.map +0 -1
  180. package/dist/utils/githubUtils.js.map +0 -1
  181. package/dist/utils/logger.js.map +0 -1
  182. package/dist/utils/macroExpressionUtils.js.map +0 -1
  183. package/dist/utils/osUtils.js.map +0 -1
  184. package/dist/utils/versionUtils.js.map +0 -1
  185. package/dist/web/contract/serverContract.js.map +0 -1
  186. package/dist/web/server.js.map +0 -1
@@ -0,0 +1,757 @@
1
+ /* Import Inter font */
2
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
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
+
64
+ /* Base styles */
65
+ body {
66
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
67
+ }
68
+
69
+ /* Modal container */
70
+ .modal {
71
+ display: none;
72
+ position: fixed;
73
+ z-index: 50;
74
+ left: 0;
75
+ top: 0;
76
+ width: 100%;
77
+ height: 100%;
78
+ overflow: auto;
79
+ background-color: rgba(0, 0, 0, 0.5);
80
+ backdrop-filter: blur(4px);
81
+ animation: fadeIn 0.2s ease-out;
82
+ /* Debug: Ensure loading modal is always visible and content is not hidden */
83
+ #installLoadingModal {
84
+ z-index: 3000 !important;
85
+ display: none;
86
+ }
87
+ #installLoadingModal .modal-content {
88
+ z-index: 3100 !important;
89
+ pointer-events: auto;
90
+ background: #fff !important;
91
+ border: 3px solid #3498db !important;
92
+ color: #222 !important;
93
+ min-width: 320px;
94
+ min-height: 320px; /* Increased height for larger modal */
95
+ opacity: 1 !important;
96
+ box-shadow: 0 0 16px #3498db;
97
+ position: relative;
98
+ padding-top: 24px;
99
+ }
100
+
101
+ #installLoadingModal .modal-close-button {
102
+ z-index: 3200 !important;
103
+ }
104
+ /* Loading modal always on top */
105
+ #installLoadingModal {
106
+ z-index: 2000 !important;
107
+ display: none;
108
+ }
109
+ #installLoadingModal .modal-content {
110
+ z-index: 2100 !important;
111
+ pointer-events: auto;
112
+ }
113
+ }
114
+
115
+ /* Modal content */
116
+ .modal-content {
117
+ background-color: #ffffff;
118
+ margin: 10% auto;
119
+ padding: 2rem;
120
+ border: none;
121
+ border-radius: 1rem;
122
+ width: 90%;
123
+ max-width: 900px;
124
+ position: relative;
125
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
126
+ transform: translateY(0);
127
+ transition: all 0.3s ease-out;
128
+ animation: slideIn 0.3s ease-out;
129
+ }
130
+ /* Close button */
131
+ .modal-close-button {
132
+ position: absolute;
133
+ right: 12px;
134
+ top: 12px;
135
+ width: 32px;
136
+ height: 32px;
137
+ border-radius: 50%;
138
+ background: #ffffff;
139
+ border: 2px solid #3498db;
140
+ color: #3498db;
141
+ font-size: 22px;
142
+ cursor: pointer;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ transition: all 0.2s ease;
147
+ z-index: 10;
148
+ padding: 0;
149
+ line-height: 1;
150
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
151
+ }
152
+
153
+ .modal-close-button:hover {
154
+ background-color: #3498db;
155
+ color: #ffffff;
156
+ border-color: #3498db;
157
+ transform: scale(1.05);
158
+ box-shadow: 0 0 8px rgba(52, 152, 219, 0.4);
159
+ }
160
+
161
+ .close {
162
+ position: absolute;
163
+ right: 1.5rem;
164
+ top: 1.5rem;
165
+ font-size: 1.5rem;
166
+ font-weight: 600;
167
+ color: #6b7280;
168
+ cursor: pointer;
169
+ transition: color 0.2s ease;
170
+ }
171
+
172
+ .close:hover {
173
+ color: #111827;
174
+ }
175
+
176
+
177
+ /* Sections layout */
178
+ .modal-sections {
179
+ margin-top: 1.5rem;
180
+ display: grid;
181
+ grid-template-columns: 1fr 1fr;
182
+ gap: 1rem;
183
+ }
184
+
185
+ .section-container {
186
+ padding: 1.25rem;
187
+ margin-bottom: 1.5rem;
188
+ border: 1px solid #e5e7eb;
189
+ border-radius: 0.75rem;
190
+ background-color: #f9fafb;
191
+ transition: all 0.2s ease;
192
+ }
193
+
194
+ .section-title {
195
+ margin-bottom: 1rem;
196
+ }
197
+
198
+ /* Client grid */
199
+ .client-grid {
200
+ display: grid;
201
+ grid-template-columns: repeat(2, 1fr);
202
+ gap: 0.75rem;
203
+ }
204
+
205
+ /* Make sections take full width */
206
+ .section-container:first-child,
207
+ .section-container:nth-child(2) {
208
+ grid-column: 1 / -1;
209
+ }
210
+
211
+ /* Client item styling */
212
+ .client-item {
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: space-between;
216
+ padding: 0.75rem 1rem;
217
+ border-radius: 0.5rem;
218
+ border: 2px solid #e5e7eb;
219
+ background-color: #ffffff;
220
+ transition: all 0.2s ease;
221
+ cursor: pointer;
222
+ user-select: none;
223
+ gap: 0.5rem;
224
+ }
225
+
226
+ /* Client actions container */
227
+ .client-actions {
228
+ display: flex;
229
+ align-items: center;
230
+ gap: 0.5rem;
231
+ margin-left: auto;
232
+ }
233
+
234
+ .client-item:hover {
235
+ background-color: #f3f4f6;
236
+ transform: translateY(-1px);
237
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
238
+ }
239
+
240
+ .client-item.selected {
241
+ border-color: #2563eb;
242
+ background-color: #eff6ff;
243
+ }
244
+
245
+ /* Client item info section */
246
+ .client-info {
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 0.75rem;
250
+ }
251
+
252
+ /* Status container */
253
+ .status-container {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 0.5rem;
257
+ margin-left: auto;
258
+ }
259
+
260
+ /* Status badges */
261
+ .status-badge {
262
+ display: inline-flex;
263
+ align-items: center;
264
+ padding: 0.25rem 0.75rem;
265
+ border-radius: 9999px;
266
+ font-size: 0.75rem;
267
+ font-weight: 500;
268
+ }
269
+
270
+ .status-badge.installed {
271
+ background-color: #dcfce7;
272
+ color: #166534;
273
+ }
274
+
275
+ .status-badge.not-installed {
276
+ background-color: #fee2e2;
277
+ color: #991b1b;
278
+ }
279
+
280
+ .status-badge.pending {
281
+ background-color: #fef3c7;
282
+ color: #92400e;
283
+ }
284
+
285
+ /* Non-selectable items (installed or in-progress) */
286
+ .client-item.non-selectable {
287
+ background-color: #f9fafb;
288
+ cursor: default;
289
+ opacity: 0.85;
290
+ }
291
+
292
+ .client-item.non-selectable:hover {
293
+ transform: none;
294
+ box-shadow: none;
295
+ }
296
+
297
+ /* Specific styling for installed items */
298
+ .client-item.installed-item {
299
+ background-color: #f0fdf4;
300
+ }
301
+
302
+ /* Specific styling for in-progress items */
303
+ .client-item.in-progress-item {
304
+ background-color: #fef3c7;
305
+ }
306
+
307
+ /* Uninstall button styling */
308
+ .uninstall-btn {
309
+ display: inline-flex;
310
+ align-items: center;
311
+ justify-content: center;
312
+ width: 28px;
313
+ height: 28px;
314
+ border-radius: 6px;
315
+ border: 1px solid transparent;
316
+ background: transparent;
317
+ cursor: pointer;
318
+ transition: all 0.2s ease;
319
+ padding: 0;
320
+ }
321
+
322
+ .uninstall-btn:hover {
323
+ background-color: #fee2e2;
324
+ border-color: #ef4444;
325
+ transform: scale(1.05);
326
+ }
327
+
328
+ .uninstall-btn i {
329
+ font-size: 1.25rem;
330
+ }
331
+
332
+ /* Environment variables section */
333
+ #modalEnvInputs input {
334
+ width: 100%;
335
+ padding: 0.5rem 0.75rem;
336
+ border: 1px solid #e5e7eb;
337
+ border-radius: 0.5rem;
338
+ transition: all 0.2s ease;
339
+ height: 36px;
340
+ }
341
+
342
+ #modalEnvInputs input:focus {
343
+ outline: none;
344
+ border-color: #2563eb;
345
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
346
+ }
347
+
348
+ /* Arguments section styling */
349
+ .args-container {
350
+ display: flex;
351
+ flex-direction: column;
352
+ gap: 0.5rem;
353
+ }
354
+
355
+ .arg-input {
356
+ height: 36px !important;
357
+ padding: 0.5rem 0.75rem !important;
358
+ border: 1px solid #e5e7eb;
359
+ border-radius: 0.5rem;
360
+ transition: all 0.2s ease;
361
+ font-family: 'Consolas', 'Monaco', monospace;
362
+ font-size: 0.875rem;
363
+ }
364
+
365
+ .arg-input:focus {
366
+ outline: none;
367
+ border-color: #2563eb;
368
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
369
+ }
370
+
371
+ .add-arg-button {
372
+ align-self: flex-start;
373
+ display: inline-flex;
374
+ align-items: center;
375
+ gap: 0.25rem;
376
+ height: 32px;
377
+ }
378
+
379
+ .add-arg-button i {
380
+ font-size: 1.25rem;
381
+ }
382
+
383
+ .remove-arg-button {
384
+ padding: 0.25rem;
385
+ border-radius: 0.375rem;
386
+ transition: all 0.2s ease;
387
+ }
388
+
389
+ .remove-arg-button:hover {
390
+ background-color: rgba(239, 68, 68, 0.1);
391
+ }
392
+
393
+ .remove-arg-button i {
394
+ font-size: 1.25rem;
395
+ }
396
+
397
+ /* Arguments textarea styling */
398
+ #install_args {
399
+ font-family: 'Consolas', 'Monaco', monospace;
400
+ font-size: 0.875rem;
401
+ line-height: 1.5;
402
+ resize: vertical;
403
+ transition: all 0.2s ease;
404
+ margin-bottom: 0.5rem;
405
+ }
406
+
407
+ #install_args:focus {
408
+ outline: none;
409
+ border-color: #2563eb;
410
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
411
+ }
412
+
413
+ /* Python environment input styling */
414
+ #python_env {
415
+ height: 36px !important;
416
+ width: 100%;
417
+ padding: 0.75rem 1rem;
418
+ border: 1px solid #e5e7eb;
419
+ border-radius: 0.5rem;
420
+ transition: all 0.2s ease;
421
+ font-family: 'Consolas', 'Monaco', monospace;
422
+ font-size: 0.875rem;
423
+ }
424
+
425
+ #python_env:focus {
426
+ outline: none;
427
+ border-color: #2563eb;
428
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
429
+ }
430
+
431
+
432
+ /* Form buttons */
433
+ .submit-button {
434
+ background-color: #2563eb;
435
+ color: white;
436
+ padding: 0.625rem 1.25rem;
437
+ border-radius: 0.5rem;
438
+ font-weight: 500;
439
+ transition: all 0.2s ease;
440
+ }
441
+
442
+ .submit-button:hover {
443
+ background-color: #1d4ed8;
444
+ transform: translateY(-1px);
445
+ }
446
+
447
+ .submit-button:active {
448
+ transform: translateY(0);
449
+ }
450
+
451
+ /* Animations */
452
+ @keyframes fadeIn {
453
+ from { opacity: 0; }
454
+ to { opacity: 1; }
455
+ }
456
+
457
+ @keyframes slideIn {
458
+ from {
459
+ opacity: 0;
460
+ transform: translateY(-20px);
461
+ }
462
+ to {
463
+ opacity: 1;
464
+ transform: translateY(0);
465
+ }
466
+ }
467
+
468
+ /* Center loading icon in loading modal */
469
+ #installLoadingModal .loading-icon {
470
+ display: flex;
471
+ justify-content: center;
472
+ align-items: center;
473
+ width: 100%;
474
+ margin-bottom: 8px;
475
+ }
476
+
477
+ /* Loading message styles */
478
+ #installLoadingMessage {
479
+ font-size: 0.85rem !important;
480
+ line-height: 1.6;
481
+ word-break: break-word;
482
+ max-height: 200px;
483
+ overflow-y: auto;
484
+ scrollbar-width: thin;
485
+ scrollbar-color: #3498db #f0f0f0;
486
+ }
487
+
488
+ #installLoadingMessage::-webkit-scrollbar {
489
+ width: 6px;
490
+ }
491
+
492
+ #installLoadingMessage::-webkit-scrollbar-track {
493
+ background: #f0f0f0;
494
+ border-radius: 3px;
495
+ }
496
+
497
+ #installLoadingMessage::-webkit-scrollbar-thumb {
498
+ background-color: #3498db;
499
+ border-radius: 3px;
500
+ }
501
+
502
+ #installLoadingMessage div {
503
+ margin-bottom: 8px;
504
+ padding: 4px 0;
505
+ }
506
+
507
+ /* Error message styling */
508
+ #installLoadingMessage span[style*="color:red"] {
509
+ color: #f59e0b !important;
510
+ font-weight: 500;
511
+ display: block;
512
+ padding: 4px 8px;
513
+ background: rgba(245, 158, 11, 0.1);
514
+ border-radius: 4px;
515
+ margin: 4px 0;
516
+ }
517
+
518
+ /* File path styling */
519
+ #installLoadingMessage .file-path {
520
+ font-family: 'Consolas', monospace;
521
+ background: #f8fafc;
522
+ padding: 2px 4px;
523
+ border-radius: 3px;
524
+ border: 1px solid #e2e8f0;
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;
757
+ }