imcp 0.1.3 → 0.1.5

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 (239) hide show
  1. package/README.md +21 -4
  2. package/dist/cli/commands/install.js.map +1 -0
  3. package/dist/cli/commands/list.js.map +1 -0
  4. package/dist/cli/commands/pull.js.map +1 -0
  5. package/dist/cli/commands/serve.js.map +1 -0
  6. package/dist/cli/commands/start.d.ts +2 -0
  7. package/dist/cli/commands/start.js +32 -0
  8. package/dist/cli/commands/start.js.map +1 -0
  9. package/dist/cli/commands/sync.d.ts +2 -0
  10. package/dist/cli/commands/sync.js +17 -0
  11. package/dist/cli/commands/sync.js.map +1 -0
  12. package/dist/cli/commands/uninstall.js.map +1 -0
  13. package/dist/cli/index.js +0 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/ConfigurationLoader.d.ts +32 -0
  16. package/{src/core/loaders/ConfigurationLoader.ts → dist/core/ConfigurationLoader.js} +236 -298
  17. package/dist/core/ConfigurationLoader.js.map +1 -0
  18. package/dist/core/ConfigurationProvider.d.ts +35 -0
  19. package/{src/core/loaders/ConfigurationProvider.ts → dist/core/ConfigurationProvider.js} +375 -462
  20. package/dist/core/ConfigurationProvider.js.map +1 -0
  21. package/dist/core/InstallationService.d.ts +50 -0
  22. package/dist/core/InstallationService.js +350 -0
  23. package/dist/core/InstallationService.js.map +1 -0
  24. package/dist/core/MCPManager.d.ts +28 -0
  25. package/dist/core/MCPManager.js +188 -0
  26. package/dist/core/MCPManager.js.map +1 -0
  27. package/dist/core/RequirementService.d.ts +40 -0
  28. package/dist/core/RequirementService.js +110 -0
  29. package/dist/core/RequirementService.js.map +1 -0
  30. package/dist/core/ServerSchemaLoader.d.ts +11 -0
  31. package/dist/core/ServerSchemaLoader.js +43 -0
  32. package/dist/core/ServerSchemaLoader.js.map +1 -0
  33. package/dist/core/ServerSchemaProvider.d.ts +17 -0
  34. package/dist/core/ServerSchemaProvider.js +120 -0
  35. package/dist/core/ServerSchemaProvider.js.map +1 -0
  36. package/dist/core/constants.d.ts +47 -0
  37. package/dist/core/constants.js +94 -0
  38. package/dist/core/constants.js.map +1 -0
  39. package/dist/core/installers/BaseInstaller.d.ts +74 -0
  40. package/dist/core/installers/BaseInstaller.js +253 -0
  41. package/dist/core/installers/BaseInstaller.js.map +1 -0
  42. package/dist/core/installers/ClientInstaller.d.ts +23 -0
  43. package/dist/core/installers/ClientInstaller.js +564 -0
  44. package/dist/core/installers/ClientInstaller.js.map +1 -0
  45. package/dist/core/installers/CommandInstaller.d.ts +37 -0
  46. package/{src/core/installers/requirements/CommandInstaller.ts → dist/core/installers/CommandInstaller.js} +173 -231
  47. package/dist/core/installers/CommandInstaller.js.map +1 -0
  48. package/dist/core/installers/GeneralInstaller.d.ts +33 -0
  49. package/dist/core/installers/GeneralInstaller.js +85 -0
  50. package/dist/core/installers/GeneralInstaller.js.map +1 -0
  51. package/dist/core/installers/InstallerFactory.d.ts +54 -0
  52. package/{src/core/installers/requirements/InstallerFactory.ts → dist/core/installers/InstallerFactory.js} +97 -112
  53. package/dist/core/installers/InstallerFactory.js.map +1 -0
  54. package/dist/core/installers/NpmInstaller.d.ts +26 -0
  55. package/dist/core/installers/NpmInstaller.js +127 -0
  56. package/dist/core/installers/NpmInstaller.js.map +1 -0
  57. package/dist/core/installers/PipInstaller.d.ts +28 -0
  58. package/dist/core/installers/PipInstaller.js +127 -0
  59. package/dist/core/installers/PipInstaller.js.map +1 -0
  60. package/{src/core/installers/requirements/RequirementInstaller.ts → dist/core/installers/RequirementInstaller.d.ts} +33 -42
  61. package/dist/core/installers/RequirementInstaller.js +3 -0
  62. package/dist/core/installers/RequirementInstaller.js.map +1 -0
  63. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
  64. package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
  65. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
  66. package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
  67. package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
  68. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
  69. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
  70. package/dist/core/installers/index.js.map +1 -0
  71. package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
  72. package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
  73. package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
  74. package/dist/core/installers/requirements/InstallerFactory.js +2 -0
  75. package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
  76. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  77. package/dist/core/installers/requirements/NugetInstaller.d.ts +37 -0
  78. package/dist/core/installers/requirements/NugetInstaller.js +189 -0
  79. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  80. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  81. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  82. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  83. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  84. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  85. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  86. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  87. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  88. package/dist/core/metadatas/constants.js.map +1 -0
  89. package/dist/core/metadatas/recordingConstants.d.ts +2 -0
  90. package/dist/core/metadatas/recordingConstants.js +2 -0
  91. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  92. package/dist/core/metadatas/types.d.ts +1 -1
  93. package/dist/core/metadatas/types.js.map +1 -0
  94. package/dist/core/onboard/FeedOnboardService.js +1 -22
  95. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  96. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  97. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  98. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  99. package/dist/core/types.d.ts +166 -0
  100. package/dist/core/types.js +16 -0
  101. package/dist/core/types.js.map +1 -0
  102. package/dist/core/validators/FeedValidator.js.map +1 -0
  103. package/dist/core/validators/IServerValidator.js.map +1 -0
  104. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  105. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  106. package/dist/core/validators/StdioServerValidator.js +5 -5
  107. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/services/InstallRequestValidator.d.ts +21 -0
  110. package/dist/services/InstallRequestValidator.js +99 -0
  111. package/dist/services/InstallRequestValidator.js.map +1 -0
  112. package/dist/services/InstallationService.js.map +1 -0
  113. package/dist/services/MCPManager.js.map +1 -0
  114. package/dist/services/RequirementService.js.map +1 -0
  115. package/dist/services/ServerService.js.map +1 -0
  116. package/dist/services/TelemetryService.js.map +1 -0
  117. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  118. package/dist/utils/adoUtils.js.map +1 -0
  119. package/dist/utils/clientUtils.js.map +1 -0
  120. package/dist/utils/feedUtils.js.map +1 -0
  121. package/dist/utils/githubAuth.js.map +1 -0
  122. package/dist/utils/githubUtils.js.map +1 -0
  123. package/dist/utils/logger.js.map +1 -0
  124. package/dist/utils/macroExpressionUtils.js.map +1 -0
  125. package/dist/utils/osUtils.d.ts +11 -0
  126. package/dist/utils/osUtils.js +100 -0
  127. package/dist/utils/osUtils.js.map +1 -0
  128. package/dist/utils/versionUtils.js.map +1 -0
  129. package/dist/web/contract/serverContract.js.map +1 -0
  130. package/dist/web/public/index.html +1 -1
  131. package/dist/web/public/js/modal/installHandler.js +227 -0
  132. package/dist/web/public/js/modal/loadingUI.js +74 -0
  133. package/dist/web/public/js/modal/messageQueue.js +101 -45
  134. package/dist/web/public/js/modal/modalUI.js +214 -0
  135. package/{src/web/public/js/modal/versionUtils.js → dist/web/public/js/modal/version.js} +1 -1
  136. package/dist/web/public/js/onboard/templates.js +1 -0
  137. package/dist/web/public/js/serverCategoryList.js +3 -3
  138. package/dist/web/public/onboard.html +4 -4
  139. package/dist/web/server.js.map +1 -0
  140. package/package.json +5 -1
  141. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  142. package/.github/acl/access.yml +0 -20
  143. package/.github/compliance/inventory.yml +0 -5
  144. package/.github/policies/jit.yml +0 -19
  145. package/.roo/rules-code/rules.md +0 -88
  146. package/dist/core/onboard/InstallOperationManager.d.ts +0 -23
  147. package/dist/core/onboard/InstallOperationManager.js +0 -144
  148. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  149. package/docs/Telemetry.md +0 -136
  150. package/memory-bank/activeContext.md +0 -26
  151. package/memory-bank/decisionLog.md +0 -91
  152. package/memory-bank/productContext.md +0 -41
  153. package/memory-bank/progress.md +0 -35
  154. package/memory-bank/systemPatterns.md +0 -10
  155. package/src/cli/commands/install.ts +0 -139
  156. package/src/cli/commands/list.ts +0 -113
  157. package/src/cli/commands/pull.ts +0 -16
  158. package/src/cli/commands/serve.ts +0 -39
  159. package/src/cli/commands/uninstall.ts +0 -64
  160. package/src/cli/index.ts +0 -82
  161. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  162. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  163. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  164. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  165. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  166. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  167. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  168. package/src/core/installers/index.ts +0 -11
  169. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  170. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  171. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  172. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  173. package/src/core/loaders/InstallOperationManager.ts +0 -367
  174. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  175. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  176. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  177. package/src/core/metadatas/constants.ts +0 -122
  178. package/src/core/metadatas/recordingConstants.ts +0 -62
  179. package/src/core/metadatas/types.ts +0 -202
  180. package/src/core/onboard/FeedOnboardService.ts +0 -524
  181. package/src/core/onboard/OnboardProcessor.ts +0 -356
  182. package/src/core/onboard/OnboardStatus.ts +0 -60
  183. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  184. package/src/core/validators/FeedValidator.ts +0 -135
  185. package/src/core/validators/IServerValidator.ts +0 -21
  186. package/src/core/validators/SSEServerValidator.ts +0 -43
  187. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  188. package/src/core/validators/StdioServerValidator.ts +0 -312
  189. package/src/index.ts +0 -44
  190. package/src/services/InstallationService.ts +0 -102
  191. package/src/services/MCPManager.ts +0 -249
  192. package/src/services/RequirementService.ts +0 -627
  193. package/src/services/ServerService.ts +0 -161
  194. package/src/services/TelemetryService.ts +0 -59
  195. package/src/utils/UpdateCheckTracker.ts +0 -86
  196. package/src/utils/adoUtils.ts +0 -293
  197. package/src/utils/clientUtils.ts +0 -72
  198. package/src/utils/feedUtils.ts +0 -31
  199. package/src/utils/githubAuth.ts +0 -212
  200. package/src/utils/githubUtils.ts +0 -164
  201. package/src/utils/logger.ts +0 -195
  202. package/src/utils/macroExpressionUtils.ts +0 -104
  203. package/src/utils/osUtils.ts +0 -597
  204. package/src/utils/versionUtils.ts +0 -114
  205. package/src/web/contract/serverContract.ts +0 -74
  206. package/src/web/public/css/detailsWidget.css +0 -235
  207. package/src/web/public/css/modal.css +0 -757
  208. package/src/web/public/css/notifications.css +0 -101
  209. package/src/web/public/css/onboard.css +0 -107
  210. package/src/web/public/css/serverCategoryList.css +0 -120
  211. package/src/web/public/css/serverDetails.css +0 -139
  212. package/src/web/public/index.html +0 -359
  213. package/src/web/public/js/api.js +0 -132
  214. package/src/web/public/js/detailsWidget.js +0 -264
  215. package/src/web/public/js/flights/flights.js +0 -127
  216. package/src/web/public/js/modal/index.js +0 -52
  217. package/src/web/public/js/modal/installModal.js +0 -162
  218. package/src/web/public/js/modal/installation.js +0 -266
  219. package/src/web/public/js/modal/loadingModal.js +0 -182
  220. package/src/web/public/js/modal/modalSetup.js +0 -595
  221. package/src/web/public/js/modal/modalUtils.js +0 -37
  222. package/src/web/public/js/modal.js +0 -42
  223. package/src/web/public/js/notifications.js +0 -137
  224. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  225. package/src/web/public/js/onboard/index.js +0 -374
  226. package/src/web/public/js/onboard/publishHandler.js +0 -172
  227. package/src/web/public/js/onboard/state.js +0 -76
  228. package/src/web/public/js/onboard/templates.js +0 -341
  229. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  230. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  231. package/src/web/public/js/serverCategoryDetails.js +0 -364
  232. package/src/web/public/js/serverCategoryList.js +0 -241
  233. package/src/web/public/js/settings.js +0 -314
  234. package/src/web/public/modal.html +0 -84
  235. package/src/web/public/onboard.html +0 -296
  236. package/src/web/public/settings.html +0 -135
  237. package/src/web/public/styles.css +0 -277
  238. package/src/web/server.ts +0 -478
  239. package/tsconfig.json +0 -18
@@ -1,314 +0,0 @@
1
- import { buildUrlWithFlights } from './flights/flights.js';
2
-
3
- // Toast notification function
4
- function showToast(message, type = 'success') {
5
- const toastContainer = document.querySelector('.toast-container');
6
- if (!toastContainer) return;
7
-
8
- const toastId = `toast-${Date.now()}`;
9
- const toastHTML = `
10
- <div id="${toastId}" class="toast align-items-center text-white bg-${type === 'success' ? 'success' : 'danger'} border-0" role="alert" aria-live="assertive" aria-atomic="true">
11
- <div class="d-flex">
12
- <div class="toast-body">
13
- ${message}
14
- </div>
15
- <button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
16
- </div>
17
- </div>
18
- `;
19
- toastContainer.insertAdjacentHTML('beforeend', toastHTML);
20
- const toastElement = document.getElementById(toastId);
21
- const toast = new bootstrap.Toast(toastElement, { delay: 3000 });
22
- toast.show();
23
- toastElement.addEventListener('hidden.bs.toast', () => {
24
- toastElement.remove();
25
- });
26
- }
27
-
28
- document.addEventListener('DOMContentLoaded', () => {
29
- // All DOM element queries and event listeners must be inside this block!
30
- const settingsForm = document.getElementById('settingsForm');
31
- const nodePathInput = document.getElementById('nodePath');
32
- const browserPathInput = document.getElementById('browserPath');
33
- const systemEnvironmentsDiv = document.getElementById('systemEnvironments');
34
-
35
- // Python Environments elements
36
- const pythonEnvsContainer = document.getElementById('pythonEnvsContainer');
37
- const addPythonEnvButton = document.getElementById('addPythonEnvButton');
38
- const pythonEnvsLoadingMsg = document.getElementById('pythonEnvsLoadingMsg');
39
-
40
- // User Configurations elements
41
- const userConfigurationsContainer = document.getElementById('userConfigurationsContainer');
42
- const addUserConfigButton = document.getElementById('addUserConfigButton');
43
- const userConfigLoadingMsg = document.getElementById('userConfigLoadingMsg');
44
-
45
- const cancelButton = document.getElementById('cancelButton');
46
- const setupButton = document.getElementById('setupButton');
47
-
48
- // (Removed duplicate showToast function here)
49
-
50
-
51
- async function loadSettings() {
52
- try {
53
- const response = await fetch('/api/settings');
54
- if (!response.ok) {
55
- const errorData = await response.json();
56
- throw new Error(errorData.error || `HTTP error! status: ${response.status}`);
57
- }
58
- const apiResponse = await response.json();
59
- if (apiResponse.success && apiResponse.data) {
60
- const settings = apiResponse.data;
61
-
62
- // Populate Python Environments
63
- if(pythonEnvsLoadingMsg) pythonEnvsLoadingMsg.remove(); // Remove loading message
64
- pythonEnvsContainer.innerHTML = ''; // Clear previous entries
65
-
66
- if (settings.pythonEnvs && Object.keys(settings.pythonEnvs).length > 0) {
67
- Object.entries(settings.pythonEnvs).forEach(([server, path]) => {
68
- renderPythonEnvInput(server, path);
69
- });
70
- } else if (settings.pythonEnv) {
71
- // Handle legacy pythonEnv
72
- renderPythonEnvInput('system', settings.pythonEnv);
73
- } else {
74
- if (!pythonEnvsContainer.querySelector('.python-env-row')) { // Add placeholder if no rows exist
75
- const p = document.createElement('p');
76
- p.className = 'text-gray-500 python-env-placeholder';
77
- p.textContent = 'No Python environments defined. Click "Add Python Environment" to add one.';
78
- pythonEnvsContainer.appendChild(p);
79
- }
80
- }
81
-
82
- nodePathInput.value = settings.nodePath || '';
83
- browserPathInput.value = settings.browserPath || '';
84
-
85
- // Populate System Environments
86
- systemEnvironmentsDiv.innerHTML = ''; // Clear loading message
87
- if (settings.systemEnvironments && Object.keys(settings.systemEnvironments).length > 0) {
88
- // Create a modern, scrollable list (not a table)
89
- const list = document.createElement('div');
90
- list.className = 'flex flex-col';
91
-
92
- Object.entries(settings.systemEnvironments).forEach(([key, value], idx) => {
93
- const item = document.createElement('div');
94
- item.className =
95
- 'flex flex-col sm:flex-row sm:items-center bg-white rounded-md border border-gray-200 px-4 py-2 shadow-sm hover:shadow transition group';
96
- item.innerHTML = `
97
- <div class="flex items-center min-w-0 w-full sm:w-1/4 sm:mb-0">
98
- <i class='bx bx-cog text-blue-400 mr-2'></i>
99
- <span class="font-mono font-semibold text-gray-800 text-base truncate" title="${key}">${key}</span>
100
- </div>
101
- <div class="flex-1 min-w-0 break-all text-gray-700 text-sm pl-7 sm:pl-4">
102
- ${value}
103
- </div>
104
- `;
105
- list.appendChild(item);
106
- });
107
-
108
- // Restore frame styling for the new layout
109
- systemEnvironmentsDiv.classList.remove('shadow');
110
- systemEnvironmentsDiv.classList.add('rounded-lg', 'bg-white', 'border', 'border-gray-200', 'border-1');
111
- systemEnvironmentsDiv.classList.remove('border-2', 'border-4', 'border-8');
112
- systemEnvironmentsDiv.classList.add('p-0');
113
- systemEnvironmentsDiv.style.padding = '0.5rem 0.5rem 0.5rem 0.5rem';
114
- systemEnvironmentsDiv.appendChild(list);
115
- } else {
116
- systemEnvironmentsDiv.innerHTML = '<p class="text-gray-500">No system environment variables loaded or available.</p>';
117
- }
118
-
119
- // Populate User Configurations
120
- if(userConfigLoadingMsg) userConfigLoadingMsg.remove(); // Remove loading message
121
- userConfigurationsContainer.innerHTML = ''; // Clear previous entries
122
- if (settings.userConfigurations && Object.keys(settings.userConfigurations).length > 0) {
123
- Object.entries(settings.userConfigurations).forEach(([key, value]) => {
124
- renderUserConfigInput(key, value);
125
- });
126
- } else {
127
- if (!userConfigurationsContainer.querySelector('.user-config-row')) { // Add placeholder if no rows exist
128
- const p = document.createElement('p');
129
- p.className = 'text-gray-500 user-config-placeholder';
130
- p.textContent = 'No user configurations defined. Click "Add User Configuration" to add one.';
131
- userConfigurationsContainer.appendChild(p);
132
- }
133
- }
134
-
135
- } else {
136
- throw new Error(apiResponse.error || 'Failed to load settings.');
137
- }
138
- } catch (error) {
139
- console.error('Error loading settings:', error);
140
- showToast(`Error loading settings: ${error.message}`, 'danger');
141
- systemEnvironmentsDiv.innerHTML = `<p class="text-red-500">Error loading environment variables: ${error.message}</p>`;
142
- if(userConfigLoadingMsg) userConfigLoadingMsg.textContent = `Error loading user configurations: ${error.message}`;
143
- }
144
- }
145
-
146
- function renderPythonEnvInput(server = 'system', path = '') {
147
- const placeholder = pythonEnvsContainer.querySelector('.python-env-placeholder');
148
- if (placeholder) placeholder.remove();
149
-
150
- const uniqueId = `python-env-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
151
- const div = document.createElement('div');
152
- div.className = 'python-env-row flex items-center gap-3 mb-2';
153
- div.innerHTML = `
154
- <input type="text" value="${server}" class="form-input form-control w-1/3 px-3 py-2 rounded-md python-env-server" placeholder="Server Name (e.g., system)">
155
- <input type="text" value="${path}" class="form-input form-control w-2/3 px-3 py-2 rounded-md python-env-path" placeholder="e.g., /usr/bin/python3 or C:/Python39/python.exe">
156
- <button type="button" class="btn btn-danger btn-sm remove-python-env-button flex items-center">
157
- <i class='bx bx-trash'></i>
158
- </button>
159
- `;
160
- pythonEnvsContainer.appendChild(div);
161
- div.querySelector('.remove-python-env-button').addEventListener('click', function() {
162
- this.closest('.python-env-row').remove();
163
- if (!pythonEnvsContainer.querySelector('.python-env-row')) { // Add placeholder if no rows exist after removal
164
- const p = document.createElement('p');
165
- p.className = 'text-gray-500 python-env-placeholder';
166
- p.textContent = 'No Python environments defined. Click "Add Python Environment" to add one.';
167
- pythonEnvsContainer.appendChild(p);
168
- }
169
- });
170
- }
171
-
172
- function renderUserConfigInput(key = '', value = '') {
173
- const placeholder = userConfigurationsContainer.querySelector('.user-config-placeholder');
174
- if (placeholder) placeholder.remove();
175
-
176
- const uniqueId = `user-config-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
177
- const div = document.createElement('div');
178
- div.className = 'user-config-row flex items-center gap-3 mb-2';
179
- const isSecret = key.toLowerCase().includes('key');
180
- const valueInputType = isSecret ? 'password' : 'text';
181
-
182
- // Key Input
183
- const keyInputHTML = `<input type="text" value="${key}" class="form-input form-control w-1/3 px-3 py-2 rounded-md user-config-key" placeholder="Key">`;
184
-
185
- // Value Input & Eye Icon (if secret)
186
- let valueSectionHTML;
187
- if (isSecret) {
188
- valueSectionHTML = `
189
- <div class="relative w-2/3">
190
- <input type="${valueInputType}" value="${value}" class="form-input form-control w-full px-3 py-2 rounded-md user-config-value pr-10" placeholder="Value">
191
- <button type="button" class="absolute inset-y-0 right-0 flex items-center pr-3 text-gray-500 hover:text-gray-700 toggle-visibility-button" style="background: transparent; border: none;">
192
- <i class='bx bx-show text-lg'></i>
193
- </button>
194
- </div>
195
- `;
196
- } else {
197
- valueSectionHTML = `<input type="${valueInputType}" value="${value}" class="form-input form-control w-2/3 px-3 py-2 rounded-md user-config-value" placeholder="Value">`;
198
- }
199
-
200
- // Remove Button
201
- const removeButtonHTML = `
202
- <button type="button" class="btn btn-danger btn-sm remove-user-config-button flex items-center">
203
- <i class='bx bx-trash'></i>
204
- </button>
205
- `;
206
-
207
- div.innerHTML = keyInputHTML + valueSectionHTML + removeButtonHTML;
208
- userConfigurationsContainer.appendChild(div);
209
-
210
- if (isSecret) {
211
- const toggleButton = div.querySelector('.toggle-visibility-button');
212
- const valueInput = div.querySelector('.user-config-value');
213
- const eyeIcon = toggleButton.querySelector('i');
214
-
215
- toggleButton.addEventListener('click', (e) => {
216
- e.preventDefault(); // Prevent form submission if inside a form
217
- if (valueInput.type === 'password') {
218
- valueInput.type = 'text';
219
- eyeIcon.classList.remove('bx-show');
220
- eyeIcon.classList.add('bx-hide');
221
- } else {
222
- valueInput.type = 'password';
223
- eyeIcon.classList.remove('bx-hide');
224
- eyeIcon.classList.add('bx-show');
225
- }
226
- });
227
- }
228
-
229
- div.querySelector('.remove-user-config-button').addEventListener('click', function() {
230
- this.closest('.user-config-row').remove();
231
- if (!userConfigurationsContainer.querySelector('.user-config-row')) { // Add placeholder if no rows exist after removal
232
- const p = document.createElement('p');
233
- p.className = 'text-gray-500 user-config-placeholder';
234
- p.textContent = 'No user configurations defined. Click "Add User Configuration" to add one.';
235
- userConfigurationsContainer.appendChild(p);
236
- }
237
- });
238
- }
239
-
240
-
241
- async function saveSettings(event) {
242
- event.preventDefault();
243
- setupButton.disabled = true;
244
- setupButton.innerHTML = `<i class='bx bx-loader-alt bx-spin mr-2'></i>Saving...`;
245
-
246
- const pythonEnvs = {};
247
- document.querySelectorAll('.python-env-row').forEach(row => {
248
- const serverInput = row.querySelector('.python-env-server');
249
- const pathInput = row.querySelector('.python-env-path');
250
- if (serverInput && pathInput && serverInput.value.trim()) {
251
- pythonEnvs[serverInput.value.trim()] = pathInput.value.trim();
252
- }
253
- });
254
-
255
- const userConfigs = {};
256
- document.querySelectorAll('.user-config-row').forEach(row => {
257
- const keyInput = row.querySelector('.user-config-key');
258
- const valueInput = row.querySelector('.user-config-value');
259
- if (keyInput && valueInput && keyInput.value.trim()) {
260
- userConfigs[keyInput.value.trim()] = valueInput.value.trim();
261
- }
262
- });
263
-
264
- const settingsData = {
265
- pythonEnvs: pythonEnvs,
266
- // Include pythonEnv for backward compatibility (use system value if available)
267
- pythonEnv: pythonEnvs['system'] || null,
268
- nodePath: nodePathInput.value.trim() || null,
269
- browserPath: browserPathInput.value.trim() || null,
270
- userConfigurations: userConfigs,
271
- };
272
-
273
- try {
274
- const response = await fetch('/api/settings', {
275
- method: 'POST',
276
- headers: {
277
- 'Content-Type': 'application/json',
278
- },
279
- body: JSON.stringify(settingsData),
280
- });
281
-
282
- const apiResponse = await response.json();
283
-
284
- if (response.ok && apiResponse.success) {
285
- showToast('Settings saved successfully!', 'success');
286
- // Optionally, reload settings to reflect any backend-applied defaults
287
- await loadSettings();
288
- } else {
289
- throw new Error(apiResponse.error || `HTTP error! status: ${response.status}`);
290
- }
291
- } catch (error) {
292
- console.error('Error saving settings:', error);
293
- showToast(`Error saving settings: ${error.message}`, 'danger');
294
- } finally {
295
- setupButton.disabled = false;
296
- setupButton.innerHTML = `<i class='bx bx-save mr-2'></i>Save Settings`;
297
- }
298
- }
299
-
300
- cancelButton.addEventListener('click', () => {
301
- // Navigate back to index.html, preserving flight parameters
302
- window.location.href = buildUrlWithFlights('index.html');
303
- });
304
-
305
- addPythonEnvButton.addEventListener('click', () => renderPythonEnvInput());
306
- addUserConfigButton.addEventListener('click', () => renderUserConfigInput());
307
-
308
- settingsForm.addEventListener('submit', saveSettings);
309
-
310
- // Initial load
311
- loadSettings();
312
-
313
- // (Collapse/expand functionality removed as requested)
314
- });
@@ -1,84 +0,0 @@
1
- <div id="installModal" class="modal">
2
- <div class="modal-content">
3
- <span class="close" onclick="closeModal()">&times;</span>
4
- <div class="modal-header">
5
- <h2 id="modalTitle" class="text-2xl font-bold text-gray-800"></h2>
6
- <p class="text-gray-600 mt-2">Configure your installation settings below</p>
7
- </div>
8
-
9
- <div class="modal-sections">
10
- <!-- Requirements Section -->
11
- <div class="section-container">
12
- <div id="modalRequirements"></div>
13
- </div>
14
-
15
- <!-- Client Status Section -->
16
- <div class="section-container">
17
- <div id="modalTargets" class="client-grid"></div>
18
- </div>
19
-
20
- <div class="section-container">
21
- <div id="modalEnvInputs" class="space-y-4">
22
- <!-- Environment Variables will be injected here -->
23
- </div>
24
- </div>
25
-
26
- <div class="section-container">
27
- <div id="modalArguments" class="space-y-4">
28
- <!-- Arguments will be injected here -->
29
- </div>
30
- </div>
31
- </div>
32
- </div>
33
-
34
-
35
- <form id="installForm" class="mt-8">
36
- <!-- Arguments Section -->
37
- <div id="modalArguments" class="mb-6 space-y-4">
38
- <!-- Arguments will be injected here -->
39
- </div>
40
-
41
- <div class="flex justify-end space-x-4">
42
- <button type="button" onclick="closeModal()"
43
- class="px-6 py-2.5 text-gray-600 hover:text-gray-800 font-medium rounded-lg hover:bg-gray-100 transition-colors">
44
- Cancel
45
- </button>
46
- <button type="submit" class="submit-button">
47
- Apply
48
- </button>
49
- </div>
50
- </form>
51
- </div>
52
- </div>
53
-
54
- <!-- Loading Modal -->
55
- <div id="installLoadingModal" class="modal" style="display:none; z-index:2000;">
56
- <div class="modal-content"
57
- style="display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 340px; pointer-events:auto; position:relative;">
58
- <button class="modal-close-button" onclick="hideInstallLoadingModal()" aria-label="Close">&times;</button>
59
- <div style="width: 100%;">
60
- <div style="display: flex; flex-direction: column; align-items: center; width: 100%;">
61
- <div class="loading-icon" style="margin-bottom:8px;">
62
- <svg width="48" height="48" viewBox="0 0 48 48" fill="none"
63
- style="display: block; margin-left: auto; margin-right: auto;">
64
- <circle cx="24" cy="24" r="20" stroke="#888" stroke-width="4" opacity="0.2" />
65
- <circle cx="24" cy="24" r="20" stroke="#3498db" stroke-width="4" stroke-linecap="round"
66
- stroke-dasharray="100" stroke-dashoffset="60">
67
- <animateTransform attributeName="transform" type="rotate" from="0 24 24" to="360 24 24"
68
- dur="1s" repeatCount="indefinite" />
69
- </circle>
70
- </svg>
71
- </div>
72
- <div class="loading-title"
73
- style="font-size:1.5rem; font-weight:bold; margin-bottom:8px; text-align:center;">Installing...
74
- </div>
75
- <div id="installLoadingMessage"
76
- style="min-height:48px; max-height:160px; overflow:auto; background:#f8f8f8; border-radius:6px; padding:12px; font-size:1rem; color:#444; text-align:left; width:100%;">
77
- </div>
78
- </div>
79
- </div>
80
- </div>
81
- </div>
82
-
83
- <link rel="stylesheet" href="/css/modal.css">
84
- <link rel="stylesheet" href="/css/modal.css">