imcp 0.1.7 → 0.1.8-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/dist/cli/commands/install.js +1 -106
  2. package/dist/cli/commands/install.js.map +1 -0
  3. package/dist/cli/commands/list.js +1 -90
  4. package/dist/cli/commands/list.js.map +1 -0
  5. package/dist/cli/commands/pull.js +1 -16
  6. package/dist/cli/commands/pull.js.map +1 -0
  7. package/dist/cli/commands/serve.js +1 -33
  8. package/dist/cli/commands/serve.js.map +1 -0
  9. package/dist/cli/commands/uninstall.js +1 -46
  10. package/dist/cli/commands/uninstall.js.map +1 -0
  11. package/dist/cli/index.js +1 -65
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
  14. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
  15. package/dist/core/installers/clients/ClientInstaller.js +1 -163
  16. package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
  17. package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
  18. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
  19. package/dist/core/installers/clients/ClineInstaller.js +1 -30
  20. package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
  21. package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
  22. package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
  23. package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
  24. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
  25. package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
  26. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
  27. package/dist/core/installers/index.js +1 -8
  28. package/dist/core/installers/index.js.map +1 -0
  29. package/dist/core/installers/requirements/BaseInstaller.js +1 -56
  30. package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
  31. package/dist/core/installers/requirements/CommandInstaller.js +1 -213
  32. package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
  33. package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
  34. package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
  35. package/dist/core/installers/requirements/InstallerFactory.js +1 -99
  36. package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
  37. package/dist/core/installers/requirements/NpmInstaller.js +1 -235
  38. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  39. package/dist/core/installers/requirements/NugetInstaller.js +1 -188
  40. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  41. package/dist/core/installers/requirements/PipInstaller.js +1 -192
  42. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  43. package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
  44. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  45. package/dist/core/loaders/ConfigurationLoader.js +1 -256
  46. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  47. package/dist/core/loaders/ConfigurationProvider.js +1 -383
  48. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  49. package/dist/core/loaders/InstallOperationManager.js +1 -310
  50. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  51. package/dist/core/loaders/ServerSchemaLoader.js +1 -108
  52. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  53. package/dist/core/loaders/ServerSchemaProvider.js +1 -89
  54. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  55. package/dist/core/loaders/SystemSettingsManager.js +1 -256
  56. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  57. package/dist/core/metadatas/constants.js +1 -100
  58. package/dist/core/metadatas/constants.js.map +1 -0
  59. package/dist/core/metadatas/recordingConstants.js +1 -46
  60. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  61. package/dist/core/metadatas/types.js +1 -15
  62. package/dist/core/metadatas/types.js.map +1 -0
  63. package/dist/core/onboard/FeedOnboardService.js +1 -422
  64. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  65. package/dist/core/onboard/OnboardProcessor.js +1 -333
  66. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  67. package/dist/core/onboard/OnboardStatus.js +1 -9
  68. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  69. package/dist/core/onboard/OnboardStatusManager.js +1 -360
  70. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  71. package/dist/core/validators/FeedValidator.js +1 -133
  72. package/dist/core/validators/FeedValidator.js.map +1 -0
  73. package/dist/core/validators/IServerValidator.js +1 -1
  74. package/dist/core/validators/IServerValidator.js.map +1 -0
  75. package/dist/core/validators/SSEServerValidator.js +1 -38
  76. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  77. package/dist/core/validators/ServerValidatorFactory.js +1 -44
  78. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  79. package/dist/core/validators/StdioServerValidator.js +1 -281
  80. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  81. package/dist/index.js +1 -18
  82. package/dist/index.js.map +1 -0
  83. package/dist/services/InstallationService.js +1 -81
  84. package/dist/services/InstallationService.js.map +1 -0
  85. package/dist/services/MCPManager.js +1 -197
  86. package/dist/services/MCPManager.js.map +1 -0
  87. package/dist/services/RequirementService.js +1 -548
  88. package/dist/services/RequirementService.js.map +1 -0
  89. package/dist/services/ServerService.js +1 -127
  90. package/dist/services/ServerService.js.map +1 -0
  91. package/dist/services/TelemetryService.js +1 -53
  92. package/dist/services/TelemetryService.js.map +1 -0
  93. package/dist/utils/UpdateCheckTracker.js +1 -79
  94. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  95. package/dist/utils/adoUtils.js +1 -254
  96. package/dist/utils/adoUtils.js.map +1 -0
  97. package/dist/utils/clientUtils.js +1 -65
  98. package/dist/utils/clientUtils.js.map +1 -0
  99. package/dist/utils/feedUtils.js +1 -28
  100. package/dist/utils/feedUtils.js.map +1 -0
  101. package/dist/utils/githubAuth.js +1 -177
  102. package/dist/utils/githubAuth.js.map +1 -0
  103. package/dist/utils/githubUtils.js +1 -125
  104. package/dist/utils/githubUtils.js.map +1 -0
  105. package/dist/utils/logger.js +1 -176
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/macroExpressionUtils.js +1 -93
  108. package/dist/utils/macroExpressionUtils.js.map +1 -0
  109. package/dist/utils/osUtils.js +1 -664
  110. package/dist/utils/osUtils.js.map +1 -0
  111. package/dist/utils/versionUtils.js +1 -101
  112. package/dist/utils/versionUtils.js.map +1 -0
  113. package/dist/web/contract/serverContract.js +1 -1
  114. package/dist/web/contract/serverContract.js.map +1 -0
  115. package/dist/web/public/js/api.js +2 -132
  116. package/dist/web/public/js/api.js.map +1 -0
  117. package/dist/web/public/js/detailsWidget.js +2 -264
  118. package/dist/web/public/js/detailsWidget.js.map +1 -0
  119. package/dist/web/public/js/flights/flights.js +2 -127
  120. package/dist/web/public/js/flights/flights.js.map +1 -0
  121. package/dist/web/public/js/modal/index.js +2 -52
  122. package/dist/web/public/js/modal/index.js.map +1 -0
  123. package/dist/web/public/js/modal/installModal.js +2 -162
  124. package/dist/web/public/js/modal/installModal.js.map +1 -0
  125. package/dist/web/public/js/modal/installation.js +2 -266
  126. package/dist/web/public/js/modal/installation.js.map +1 -0
  127. package/dist/web/public/js/modal/loadingModal.js +2 -182
  128. package/dist/web/public/js/modal/loadingModal.js.map +1 -0
  129. package/dist/web/public/js/modal/modalSetup.js +2 -595
  130. package/dist/web/public/js/modal/modalSetup.js.map +1 -0
  131. package/dist/web/public/js/modal/modalUtils.js +2 -37
  132. package/dist/web/public/js/modal/modalUtils.js.map +1 -0
  133. package/dist/web/public/js/modal/versionUtils.js +2 -20
  134. package/dist/web/public/js/modal/versionUtils.js.map +1 -0
  135. package/dist/web/public/js/modal.js +2 -42
  136. package/dist/web/public/js/modal.js.map +1 -0
  137. package/dist/web/public/js/notifications.js +2 -137
  138. package/dist/web/public/js/notifications.js.map +1 -0
  139. package/dist/web/public/js/onboard/formProcessor.js +2 -1037
  140. package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
  141. package/dist/web/public/js/onboard/index.js +2 -374
  142. package/dist/web/public/js/onboard/index.js.map +1 -0
  143. package/dist/web/public/js/onboard/publishHandler.js +2 -172
  144. package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
  145. package/dist/web/public/js/onboard/state.js +2 -76
  146. package/dist/web/public/js/onboard/state.js.map +1 -0
  147. package/dist/web/public/js/onboard/templates.js +2 -342
  148. package/dist/web/public/js/onboard/templates.js.map +1 -0
  149. package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
  150. package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
  151. package/dist/web/public/js/onboard/validationHandlers.js +2 -493
  152. package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
  153. package/dist/web/public/js/serverCategoryDetails.js +2 -364
  154. package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
  155. package/dist/web/public/js/serverCategoryList.js +2 -241
  156. package/dist/web/public/js/serverCategoryList.js.map +1 -0
  157. package/dist/web/public/js/settings.js +2 -314
  158. package/dist/web/public/js/settings.js.map +1 -0
  159. package/dist/web/server.js +1 -404
  160. package/dist/web/server.js.map +1 -0
  161. package/package.json +8 -2
  162. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  163. package/.github/acl/access.yml +0 -20
  164. package/.github/compliance/inventory.yml +0 -5
  165. package/.github/policies/jit.yml +0 -19
  166. package/.github/workflows/build.yml +0 -28
  167. package/.roo/rules-code/rules.md +0 -88
  168. package/dist/cli/commands/start.d.ts +0 -2
  169. package/dist/cli/commands/start.js +0 -32
  170. package/dist/cli/commands/sync.d.ts +0 -2
  171. package/dist/cli/commands/sync.js +0 -17
  172. package/dist/core/ConfigurationLoader.d.ts +0 -32
  173. package/dist/core/ConfigurationLoader.js +0 -236
  174. package/dist/core/ConfigurationProvider.d.ts +0 -35
  175. package/dist/core/ConfigurationProvider.js +0 -375
  176. package/dist/core/InstallationService.d.ts +0 -50
  177. package/dist/core/InstallationService.js +0 -350
  178. package/dist/core/MCPManager.d.ts +0 -28
  179. package/dist/core/MCPManager.js +0 -188
  180. package/dist/core/RequirementService.d.ts +0 -40
  181. package/dist/core/RequirementService.js +0 -110
  182. package/dist/core/ServerSchemaLoader.d.ts +0 -11
  183. package/dist/core/ServerSchemaLoader.js +0 -43
  184. package/dist/core/ServerSchemaProvider.d.ts +0 -17
  185. package/dist/core/ServerSchemaProvider.js +0 -120
  186. package/dist/core/constants.d.ts +0 -47
  187. package/dist/core/constants.js +0 -94
  188. package/dist/core/installers/BaseInstaller.d.ts +0 -74
  189. package/dist/core/installers/BaseInstaller.js +0 -253
  190. package/dist/core/installers/ClientInstaller.d.ts +0 -23
  191. package/dist/core/installers/ClientInstaller.js +0 -564
  192. package/dist/core/installers/CommandInstaller.d.ts +0 -37
  193. package/dist/core/installers/CommandInstaller.js +0 -173
  194. package/dist/core/installers/GeneralInstaller.d.ts +0 -33
  195. package/dist/core/installers/GeneralInstaller.js +0 -85
  196. package/dist/core/installers/InstallerFactory.d.ts +0 -54
  197. package/dist/core/installers/InstallerFactory.js +0 -97
  198. package/dist/core/installers/NpmInstaller.d.ts +0 -26
  199. package/dist/core/installers/NpmInstaller.js +0 -127
  200. package/dist/core/installers/PipInstaller.d.ts +0 -28
  201. package/dist/core/installers/PipInstaller.js +0 -127
  202. package/dist/core/installers/RequirementInstaller.d.ts +0 -33
  203. package/dist/core/installers/RequirementInstaller.js +0 -3
  204. package/dist/core/types.d.ts +0 -166
  205. package/dist/core/types.js +0 -16
  206. package/dist/services/InstallRequestValidator.d.ts +0 -21
  207. package/dist/services/InstallRequestValidator.js +0 -99
  208. package/dist/web/public/js/modal/installHandler.js +0 -227
  209. package/dist/web/public/js/modal/loadingUI.js +0 -74
  210. package/dist/web/public/js/modal/messageQueue.js +0 -112
  211. package/dist/web/public/js/modal/modalUI.js +0 -214
  212. package/dist/web/public/js/modal/version.js +0 -20
  213. package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
  214. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  215. package/docs/Telemetry.md +0 -136
  216. package/memory-bank/activeContext.md +0 -26
  217. package/memory-bank/decisionLog.md +0 -91
  218. package/memory-bank/productContext.md +0 -41
  219. package/memory-bank/progress.md +0 -35
  220. package/memory-bank/systemPatterns.md +0 -10
  221. package/src/cli/commands/install.ts +0 -139
  222. package/src/cli/commands/list.ts +0 -113
  223. package/src/cli/commands/pull.ts +0 -16
  224. package/src/cli/commands/serve.ts +0 -39
  225. package/src/cli/commands/uninstall.ts +0 -64
  226. package/src/cli/index.ts +0 -82
  227. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  228. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  229. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  230. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  231. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  232. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  233. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  234. package/src/core/installers/index.ts +0 -11
  235. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  236. package/src/core/installers/requirements/CommandInstaller.ts +0 -231
  237. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  238. package/src/core/installers/requirements/InstallerFactory.ts +0 -114
  239. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  240. package/src/core/installers/requirements/NugetInstaller.ts +0 -203
  241. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  242. package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
  243. package/src/core/loaders/ConfigurationLoader.ts +0 -298
  244. package/src/core/loaders/ConfigurationProvider.ts +0 -462
  245. package/src/core/loaders/InstallOperationManager.ts +0 -367
  246. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  247. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  248. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  249. package/src/core/metadatas/constants.ts +0 -122
  250. package/src/core/metadatas/recordingConstants.ts +0 -65
  251. package/src/core/metadatas/types.ts +0 -202
  252. package/src/core/onboard/FeedOnboardService.ts +0 -501
  253. package/src/core/onboard/OnboardProcessor.ts +0 -356
  254. package/src/core/onboard/OnboardStatus.ts +0 -60
  255. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  256. package/src/core/validators/FeedValidator.ts +0 -135
  257. package/src/core/validators/IServerValidator.ts +0 -21
  258. package/src/core/validators/SSEServerValidator.ts +0 -43
  259. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  260. package/src/core/validators/StdioServerValidator.ts +0 -313
  261. package/src/index.ts +0 -44
  262. package/src/services/InstallationService.ts +0 -102
  263. package/src/services/MCPManager.ts +0 -249
  264. package/src/services/RequirementService.ts +0 -627
  265. package/src/services/ServerService.ts +0 -161
  266. package/src/services/TelemetryService.ts +0 -59
  267. package/src/utils/UpdateCheckTracker.ts +0 -86
  268. package/src/utils/adoUtils.ts +0 -293
  269. package/src/utils/clientUtils.ts +0 -72
  270. package/src/utils/feedUtils.ts +0 -31
  271. package/src/utils/githubAuth.ts +0 -212
  272. package/src/utils/githubUtils.ts +0 -164
  273. package/src/utils/logger.ts +0 -195
  274. package/src/utils/macroExpressionUtils.ts +0 -104
  275. package/src/utils/osUtils.ts +0 -700
  276. package/src/utils/versionUtils.ts +0 -114
  277. package/src/web/contract/serverContract.ts +0 -74
  278. package/src/web/public/css/detailsWidget.css +0 -235
  279. package/src/web/public/css/modal.css +0 -757
  280. package/src/web/public/css/notifications.css +0 -101
  281. package/src/web/public/css/onboard.css +0 -107
  282. package/src/web/public/css/serverCategoryList.css +0 -120
  283. package/src/web/public/css/serverDetails.css +0 -139
  284. package/src/web/public/index.html +0 -359
  285. package/src/web/public/js/api.js +0 -132
  286. package/src/web/public/js/detailsWidget.js +0 -264
  287. package/src/web/public/js/flights/flights.js +0 -127
  288. package/src/web/public/js/modal/index.js +0 -52
  289. package/src/web/public/js/modal/installModal.js +0 -162
  290. package/src/web/public/js/modal/installation.js +0 -266
  291. package/src/web/public/js/modal/loadingModal.js +0 -182
  292. package/src/web/public/js/modal/modalSetup.js +0 -595
  293. package/src/web/public/js/modal/modalUtils.js +0 -37
  294. package/src/web/public/js/modal/versionUtils.js +0 -20
  295. package/src/web/public/js/modal.js +0 -42
  296. package/src/web/public/js/notifications.js +0 -137
  297. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  298. package/src/web/public/js/onboard/index.js +0 -374
  299. package/src/web/public/js/onboard/publishHandler.js +0 -172
  300. package/src/web/public/js/onboard/state.js +0 -76
  301. package/src/web/public/js/onboard/templates.js +0 -342
  302. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  303. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  304. package/src/web/public/js/serverCategoryDetails.js +0 -364
  305. package/src/web/public/js/serverCategoryList.js +0 -241
  306. package/src/web/public/js/settings.js +0 -314
  307. package/src/web/public/modal.html +0 -84
  308. package/src/web/public/onboard.html +0 -296
  309. package/src/web/public/settings.html +0 -135
  310. package/src/web/public/styles.css +0 -277
  311. package/src/web/server.ts +0 -478
  312. package/tsconfig.json +0 -18
  313. package/wiki/Installation.md +0 -3
  314. package/wiki/Publish.md +0 -3
@@ -1,423 +1,2 @@
1
- import { configProvider } from '../loaders/ConfigurationProvider.js';
2
- import { ServerSchemaProvider } from '../loaders/ServerSchemaProvider.js';
3
- import { feedValidator } from '../validators/FeedValidator.js';
4
- import { Logger, EventType, EventStatus } from '../../utils/logger.js';
5
- import { OnboardingProcessStatus } from './OnboardStatus.js';
6
- import { onboardStatusManager } from './OnboardStatusManager.js';
7
- import { onboardProcessor } from './OnboardProcessor.js';
8
- /**
9
- * Service for handling feed onboarding operations
10
- */
11
- export class FeedOnboardService {
12
- // tempDir and repoDir will be generated per onboarding process
13
- constructor() {
14
- // No shared tempDir or repoDir at instance level
15
- }
16
- /**
17
- * Creates an operation ID that combines feed name and operation type.
18
- * @param feedName The name of the feed.
19
- * @param operationType The type of operation.
20
- * @returns Combined operation ID string.
21
- */
22
- createOperationId(feedName, operationType) {
23
- return `${feedName}_${operationType}`;
24
- }
25
- /**
26
- * Onboard a new feed configuration. This method performs validation and initiates the onboarding process.
27
- * @param config Feed configuration to onboard
28
- * @param forExistingCategory Whether this onboarding is for an existing category
29
- * @returns Promise resolving to operation status with optional feed configuration
30
- */
31
- async onboardFeed(config, forExistingCategory) {
32
- // Perform static validation first
33
- const serverList = await this.validateStaticConfig(config, forExistingCategory);
34
- // Check for an existing, succeeded VALIDATION_ONLY operation with an identical configuration.
35
- const existingSucceededValidation = await onboardStatusManager.findSucceededOperation(config.name, 'VALIDATION_ONLY', config);
36
- if (!existingSucceededValidation) {
37
- // If no matching successful validation is found, instruct user to validate first.
38
- Logger.log(`Feed ${config.name} has not been successfully validated with the current configuration. Publishing requires prior successful validation.`);
39
- // Return a specific status/message indicating validation is required.
40
- // This is not a FAILED state for an operation, but a prerequisite not met.
41
- // We'll use a custom message and potentially a specific status if we define one for "PREREQUISITE_FAILED" or similar.
42
- // For now, let's return a FAILED status for the attempted FULL_ONBOARDING initiation.
43
- // A more robust solution might involve a different return type or error code.
44
- const onboardingId = this.createOperationId(config.name, 'FULL_ONBOARDING'); // Hypothetical ID
45
- const errorMessage = `No prior successful validation found for feed: ${config.name}. Please validate the configuration before publishing.`;
46
- // Track failed event
47
- Logger.trackEvent(EventType.FEED_ONBOARD, {
48
- status: EventStatus.FAILED,
49
- feedName: config.name,
50
- errorMessage,
51
- onboardingId: onboardingId,
52
- feedConfiguration: config
53
- });
54
- return {
55
- onboardingId: onboardingId,
56
- status: OnboardingProcessStatus.FAILED, // Or a new status like 'VALIDATION_REQUIRED'
57
- message: errorMessage,
58
- lastQueried: new Date().toISOString(),
59
- feedConfiguration: config
60
- };
61
- }
62
- Logger.log(`Found existing successful validation for feed: ${config.name}. Proceeding with full onboarding.`);
63
- // If validation exists and matches, proceed to initiate FULL_ONBOARDING.
64
- // _initiateOperation will handle checks for existing non-completed or successfully completed FULL_ONBOARDING operations.
65
- const operationStatus = await this._initiateOperation(config, 'FULL_ONBOARDING', serverList, forExistingCategory);
66
- return {
67
- ...operationStatus,
68
- feedConfiguration: config
69
- };
70
- }
71
- /**
72
- * Validate a feed configuration without performing full onboarding.
73
- * This method performs static validation and initiates the validation process.
74
- * @param config Feed configuration to validate
75
- * @param forExistingCategory Whether this validation is for an existing category
76
- * @returns Promise resolving to operation status with optional feed configuration
77
- */
78
- async validateFeed(config, forExistingCategory) {
79
- // Perform static validation first
80
- const serverList = await this.validateStaticConfig(config, forExistingCategory);
81
- const operationStatus = await this._initiateOperation(config, 'VALIDATION_ONLY', serverList, forExistingCategory);
82
- return { ...operationStatus, feedConfiguration: config };
83
- }
84
- /**
85
- * Initiates either a full onboarding or a validation-only operation.
86
- * It checks for existing non-completed operations for the same feed and operation type.
87
- * If an existing operation is found, its status is returned. Otherwise, a new operation is created and started.
88
- * @param config The feed configuration.
89
- * @param operationType The type of operation to initiate (FULL_ONBOARDING or VALIDATION_ONLY).
90
- * @param serverList The list of server names to process.
91
- * @returns A promise that resolves to the operation status.
92
- */
93
- async _initiateOperation(config, operationType, serverList, forExistingCategory) {
94
- // Check for successful operations with matching configuration
95
- const succeededOperation = await onboardStatusManager.findSucceededOperation(config.name, operationType, config);
96
- if (succeededOperation) {
97
- Logger.log(`[${succeededOperation.onboardingId}] Found existing successful ${operationType} operation for feed: ${config.name} with matching configuration.`);
98
- const operationStatus = {
99
- onboardingId: succeededOperation.onboardingId,
100
- status: succeededOperation.status,
101
- message: `A successful ${operationType} already exists for this feed with identical configuration.`,
102
- lastQueried: new Date().toISOString(),
103
- };
104
- if (config) {
105
- operationStatus.feedConfiguration = config;
106
- }
107
- return operationStatus;
108
- }
109
- // If no existing or matching operations found, create a new one
110
- const onboardingId = this.createOperationId(config.name, operationType);
111
- const initialStatus = await onboardStatusManager.createInitialStatus(config.name, operationType);
112
- // Use config.name as categoryName for saveFeedConfiguration
113
- await onboardStatusManager.saveFeedConfiguration(config.name, operationType, config);
114
- if (operationType === 'FULL_ONBOARDING') {
115
- // For FULL_ONBOARDING, we assume all servers defined in the config are to be processed for PR creation.
116
- // The serverList from validateStaticConfig primarily influences validation.
117
- // If specific servers need to be excluded from the PR, this logic might need adjustment.
118
- this.processFullOnboarding(onboardingId, config, operationType, serverList).catch(async (error) => {
119
- Logger.error(`[${onboardingId}] Full feed onboarding process failed:`, error);
120
- await onboardStatusManager.recordStep(config.name, operationType, 'Failed during full onboarding process', undefined, // serverName
121
- OnboardingProcessStatus.FAILED, error instanceof Error ? error.message : String(error));
122
- });
123
- }
124
- else if (operationType === 'VALIDATION_ONLY') {
125
- this.processValidationOnly(onboardingId, config, operationType, serverList).catch(async (error) => {
126
- Logger.error(`[${onboardingId}] Feed validation process failed:`, error);
127
- await onboardStatusManager.recordStep(config.name, operationType, 'Failed during validation process', undefined, // serverName
128
- OnboardingProcessStatus.FAILED, error instanceof Error ? error.message : String(error)
129
- // TODO: Consider how to best store/pass 'validationStatus' if it's still needed at this specific failure point
130
- );
131
- });
132
- }
133
- return {
134
- onboardingId,
135
- status: OnboardingProcessStatus.PENDING,
136
- message: `New ${operationType} process started with ID: ${onboardingId}.`,
137
- lastQueried: new Date().toISOString(),
138
- };
139
- }
140
- /**
141
- * Performs static validation of the feed configuration.
142
- * @param config The feed configuration to validate.
143
- * @param forExistingCategory Whether this is for an existing category.
144
- * @returns A promise that resolves to a list of server names to be processed.
145
- * @throws Error if validation fails.
146
- */
147
- async validateStaticConfig(config, forExistingCategory) {
148
- // --- Start of moved and enhanced static validation ---
149
- if (!config || typeof config !== 'object') { // Check if config itself is a valid object
150
- throw new Error('Invalid configuration: Input must be a valid object.');
151
- }
152
- if (typeof config.name !== 'string' || !config.name.trim()) {
153
- throw new Error('Invalid configuration: "name" must be a non-empty string.');
154
- }
155
- if (!Array.isArray(config.requirements)) {
156
- throw new Error('Invalid configuration: "requirements" must be an array.');
157
- }
158
- if (!Array.isArray(config.mcpServers)) {
159
- throw new Error('Invalid configuration: "mcpServers" must be an array.');
160
- }
161
- // --- End of moved static validation ---
162
- const existingConfig = await configProvider.getFeedConfiguration(config.name);
163
- // Note: operationType validation is handled at the MCP server level
164
- let serverListToProcess;
165
- if (forExistingCategory) {
166
- if (!existingConfig) {
167
- throw new Error(`Cannot update non-existent category: ${config.name}. Please ensure the category name is correct or create it as a new category.`);
168
- }
169
- // For existing categories, mcpServers list must be present in the payload.
170
- if (!config.mcpServers || config.mcpServers.length === 0) {
171
- throw new Error('For an existing category, "mcpServers" must be provided and non-empty in the payload.');
172
- }
173
- const existingServerNames = new Set(existingConfig.mcpServers.map((s) => s.name));
174
- // Servers to process are those that are new OR existing ones marked as adhoc in the payload.
175
- const serversToProcessInPayload = config.mcpServers.filter(payloadServer => {
176
- const isNew = !existingServerNames.has(payloadServer.name);
177
- const isAdhocInPayload = payloadServer.systemTags?.adhoc === 'true';
178
- return isNew || (existingServerNames.has(payloadServer.name) && isAdhocInPayload);
179
- });
180
- if (serversToProcessInPayload.length === 0) {
181
- // If no new or editable (adhoc) servers are found in the payload for an existing category, it's an error.
182
- throw new Error(`No new or adhoc (editable) servers provided for the existing category "${config.name}". Ensure the "mcpServers" list in your payload contains at least one server not already in this category or an existing server marked with adhoc:true.`);
183
- }
184
- serverListToProcess = serversToProcessInPayload.map(s => s.name);
185
- }
186
- else { // For new categories
187
- if (existingConfig) {
188
- // If it's not for an existing category, but the category name already exists, this is an error.
189
- // Adhoc tags on servers are not relevant here as we are creating a new category.
190
- throw new Error(`Category "${config.name}" already exists. To modify an existing category, please set 'forExistingCategory' to true.`);
191
- }
192
- // For new categories, mcpServers list must be present and non-empty.
193
- if (!config.mcpServers || config.mcpServers.length === 0) {
194
- throw new Error('Server configuration ("mcpServers") must be provided and non-empty for new categories.');
195
- }
196
- // For new categories, all servers in the payload are considered.
197
- serverListToProcess = config.mcpServers.map(s => s.name);
198
- }
199
- // Remove systemTags from individual servers
200
- if (config.mcpServers && Array.isArray(config.mcpServers)) {
201
- config.mcpServers.forEach(server => {
202
- if (server.systemTags) {
203
- delete server.systemTags;
204
- }
205
- });
206
- }
207
- // Remove systemTags and PullRequest from the main config object
208
- if (config.systemTags) {
209
- delete config.systemTags;
210
- }
211
- if (config.PullRequest) {
212
- delete config.PullRequest;
213
- }
214
- return serverListToProcess;
215
- }
216
- /**
217
- * Validates the feed configuration.
218
- * Updates the onboarding status to VALIDATING, then to VALIDATED or FAILED based on the validation result.
219
- * @param onboardingId The ID of the onboarding process.
220
- * @param config The feed configuration to validate.
221
- * @param operationType The type of operation this validation is for.
222
- * @param serverList The list of server names to validate.
223
- * @throws Error if validation fails, to be caught by the calling process.
224
- */
225
- async _validateFeedConfiguration(onboardingId, config, operationType, serverList) {
226
- await onboardStatusManager.recordStep(config.name, operationType, 'Validating feed configuration', undefined, OnboardingProcessStatus.VALIDATING);
227
- let overallValidationStatus = { isValid: true, serverResults: [] };
228
- try {
229
- await feedValidator.validate(config, config.name, operationType);
230
- // Then, validate each MCP server specified in the serverList
231
- for (const serverConfig of config.mcpServers) {
232
- if (!serverList.includes(serverConfig.name)) {
233
- Logger.log(`[${onboardingId}] Skipping validation for server ${serverConfig.name} as it's not in the specified list for this operation.`);
234
- // Optionally, record a skipped status or add to serverResults as skipped
235
- overallValidationStatus.serverResults?.push({ serverName: serverConfig.name, isValid: true, message: "Skipped (existed)" });
236
- continue;
237
- }
238
- try {
239
- await feedValidator.validateServer(serverConfig, config, config.name, operationType);
240
- overallValidationStatus.serverResults?.push({ serverName: serverConfig.name, isValid: true });
241
- await onboardStatusManager.recordStep(config.name, operationType, `Validated server: ${serverConfig.name}`, serverConfig.name, OnboardingProcessStatus.VALIDATING);
242
- await onboardStatusManager.updateStatus(config.name, operationType, { validationStatus: overallValidationStatus });
243
- }
244
- catch (serverValidationError) {
245
- overallValidationStatus.isValid = false;
246
- overallValidationStatus.serverResults?.push({
247
- serverName: serverConfig.name,
248
- isValid: false,
249
- message: serverValidationError.message || String(serverValidationError)
250
- });
251
- await onboardStatusManager.recordStep(config.name, operationType, `Validation failed for server: ${serverConfig.name}`, serverConfig.name, OnboardingProcessStatus.FAILED, `Server ${serverConfig.name}: ${serverValidationError.message || String(serverValidationError)}`);
252
- await onboardStatusManager.updateStatus(config.name, operationType, { validationStatus: overallValidationStatus });
253
- throw serverValidationError; // Propagate the error to fail the whole validation
254
- }
255
- }
256
- // If all *processed* servers validated successfully
257
- await onboardStatusManager.recordStep(config.name, operationType, 'All servers in feed configuration validated successfully', undefined, OnboardingProcessStatus.VALIDATED);
258
- await onboardStatusManager.updateStatus(config.name, operationType, { validationStatus: overallValidationStatus });
259
- }
260
- catch (error) {
261
- const validationError = error; // Assuming error might have validation details
262
- await onboardStatusManager.recordStep(config.name, operationType, 'Feed configuration validation failed', undefined, OnboardingProcessStatus.FAILED, validationError.message || String(error));
263
- await onboardStatusManager.updateStatus(config.name, operationType, {
264
- validationStatus: {
265
- isValid: false,
266
- message: validationError.message || String(error),
267
- serverResults: overallValidationStatus.serverResults // Ensure this is up-to-date
268
- }
269
- });
270
- throw error; // Re-throw to be caught by the calling process
271
- }
272
- }
273
- /**
274
- * Processes a validation-only operation for a feed configuration.
275
- * It validates the configuration and updates the status to SUCCEEDED if validation is successful.
276
- * If validation fails, the error is handled by _validateFeedConfiguration and the calling _initiateOperation method.
277
- * @param onboardingId The ID of the onboarding process.
278
- * @param config The feed configuration.
279
- * @param operationType The type of operation (should be 'VALIDATION_ONLY').
280
- * @param serverList The list of server names to validate.
281
- */
282
- async processValidationOnly(onboardingId, config, operationType, serverList) {
283
- try {
284
- // Pass operationType and serverList to _validateFeedConfiguration
285
- await this._validateFeedConfiguration(onboardingId, config, operationType, serverList);
286
- // Use config.name and operationType for getStatus
287
- const finalStatus = await onboardStatusManager.getStatus(config.name, operationType);
288
- const result = {
289
- validationStatus: finalStatus?.validationStatus || { isValid: true, serverResults: [] },
290
- feedConfiguration: config
291
- };
292
- // Use config.name and operationType for recordStep and updateStatus
293
- await onboardStatusManager.recordStep(config.name, operationType, 'Feed configuration validated successfully', undefined, // serverName
294
- OnboardingProcessStatus.SUCCEEDED);
295
- await onboardStatusManager.updateStatus(config.name, operationType, {
296
- errorMessage: undefined, // Clear any previous error
297
- prInfo: undefined, // Clear PR info for validation-only
298
- result: result, // Set the result
299
- validationStatus: result.validationStatus // Ensure validationStatus is also updated on success
300
- });
301
- Logger.log(`[${onboardingId}] Successfully validated feed: ${config.name}`);
302
- // Track successful validation
303
- Logger.trackEvent(EventType.FEED_VALIDATE, {
304
- status: EventStatus.SUCCESS,
305
- feedName: config.name,
306
- operationType: 'VALIDATION_ONLY',
307
- onboardingId: onboardingId,
308
- feedConfiguration: config
309
- });
310
- }
311
- catch (error) {
312
- const errorMessage = error instanceof Error ? error.message : String(error);
313
- // Error is already logged and status updated by _validateFeedConfiguration or its callers
314
- Logger.error(`[${onboardingId}] Feed validation process failed for ${config.name} (already handled):`, error);
315
- // Track validation failure
316
- Logger.trackEvent(EventType.FEED_VALIDATE, {
317
- status: EventStatus.FAILED,
318
- feedName: config.name,
319
- operationType: 'VALIDATION_ONLY',
320
- errorMessage: errorMessage,
321
- onboardingId: onboardingId,
322
- feedConfiguration: config
323
- });
324
- }
325
- }
326
- /**
327
- * Processes the full onboarding for a feed configuration.
328
- * This includes validation, forking/cloning the repository, saving the config, and creating a pull request.
329
- * Manages status updates throughout the process and handles cleanup of temporary directories.
330
- * @param onboardingId The ID of the onboarding process.
331
- * @param config The feed configuration.
332
- * @param operationType The type of operation (should be 'FULL_ONBOARDING').
333
- * @throws Error if any step of the full onboarding process fails.
334
- */
335
- async processFullOnboarding(onboardingId, config, operationType, serverList) {
336
- const { tempDir, repoDir } = onboardProcessor.createDirectories(onboardingId);
337
- try {
338
- // Validation is now a prerequisite and assumed to be done if this process is initiated.
339
- // The status should be PENDING or a similar initial state from _initiateOperation.
340
- // We directly proceed to PR creation steps.
341
- // The first step recorded here will likely move status from PENDING to PR_CREATING.
342
- await onboardStatusManager.recordStep(config.name, operationType, 'Starting PR creation process (validation confirmed)', undefined, OnboardingProcessStatus.PR_CREATING);
343
- await onboardStatusManager.recordStep(config.name, operationType, 'Forking repository', undefined, OnboardingProcessStatus.PR_CREATING);
344
- await onboardProcessor.forkRepo(onboardingId, repoDir);
345
- await onboardStatusManager.recordStep(config.name, operationType, 'Cloning repository', undefined, OnboardingProcessStatus.PR_CREATING);
346
- await onboardProcessor.cloneRepo(onboardingId, tempDir, repoDir);
347
- await onboardStatusManager.recordStep(config.name, operationType, 'Setting up branch', undefined, OnboardingProcessStatus.PR_CREATING);
348
- const branchName = await onboardProcessor.setupBranch(onboardingId, config, repoDir);
349
- await onboardStatusManager.recordStep(config.name, operationType, 'Saving feed configuration to repository', undefined, OnboardingProcessStatus.PR_CREATING);
350
- const { feedFilePath, categorySchemasPath } = await onboardProcessor.saveFeedConfigToRepo(onboardingId, config, repoDir, serverList);
351
- await onboardStatusManager.recordStep(config.name, operationType, 'Creating pull request', undefined, OnboardingProcessStatus.PR_CREATING);
352
- const prInfo = await onboardProcessor.createPullRequest(onboardingId, config, repoDir, branchName);
353
- // Step 3: Finalize with SUCCEEDED status for PR creation
354
- await onboardStatusManager.recordStep(config.name, operationType, prInfo.prExists ? 'Successfully updated to existing pull request' : 'Successfully created pull request', undefined, OnboardingProcessStatus.SUCCEEDED);
355
- await onboardStatusManager.updateStatus(config.name, operationType, {
356
- errorMessage: undefined, // Clear any previous errors
357
- prInfo: prInfo,
358
- result: prInfo.url // Store PR URL as the result
359
- });
360
- Logger.log(`[${onboardingId}] Successfully created/updated PR for feed: ${config.name}. PR URL: ${prInfo.url}`);
361
- // After successful PR, re-initialize providers
362
- try {
363
- await onboardStatusManager.recordStep(config.name, operationType, 'Reloading server schemas', undefined, OnboardingProcessStatus.SUCCEEDED);
364
- Logger.log(`[${onboardingId}] Initializing ServerSchemaProvider with new schemas at ${categorySchemasPath}`);
365
- await ServerSchemaProvider.getInstance().initialize(categorySchemasPath);
366
- Logger.log(`[${onboardingId}] ServerSchemaProvider re-initialized.`);
367
- await onboardStatusManager.recordStep(config.name, operationType, 'Reloading configurations', undefined, OnboardingProcessStatus.SUCCEEDED);
368
- Logger.log(`[${onboardingId}] Initializing ConfigurationProvider with new feed file at ${feedFilePath}`);
369
- await configProvider.initialize(feedFilePath, { prLink: prInfo.url, adhocServers: serverList }); // configProvider is already an instance
370
- Logger.log(`[${onboardingId}] ConfigurationProvider re-initialized.`);
371
- Logger.log(`[${onboardingId}] Successfully completed full onboarding for feed: ${config.name}`);
372
- // Track successful onboarding
373
- Logger.trackEvent(EventType.FEED_ONBOARD, {
374
- status: EventStatus.SUCCESS,
375
- feedName: config.name,
376
- onboardingId: onboardingId,
377
- prUrl: prInfo.url,
378
- feedConfiguration: config
379
- });
380
- }
381
- catch (reinitError) {
382
- Logger.warn(`[${onboardingId}] Failed to re-initialize providers after PR creation for feed ${config.name}:`);
383
- Logger.warn(`Skipping re-initialization of providers due to error: ${reinitError}`);
384
- }
385
- }
386
- catch (error) {
387
- Logger.error(`[${onboardingId}] Full feed onboarding process failed:`, error);
388
- const errorMessage = error instanceof Error ? error.message : String(error);
389
- // Track onboarding failure
390
- Logger.trackEvent(EventType.FEED_ONBOARD, {
391
- status: EventStatus.FAILED,
392
- feedName: config.name,
393
- onboardingId: onboardingId,
394
- errorMessage,
395
- feedConfiguration: config
396
- });
397
- // Check if status is already FAILED (e.g., by _validateFeedConfiguration)
398
- // to avoid overwriting a more specific error message or step from validation.
399
- const currentStatus = await onboardStatusManager.getStatus(config.name, operationType);
400
- if (currentStatus?.status !== OnboardingProcessStatus.FAILED) {
401
- let stepName = 'Failed during full onboarding process';
402
- if (error instanceof Error && 'step' in error && typeof error.step === 'string') {
403
- stepName = `Failed at step: ${error.step}`;
404
- }
405
- else if (currentStatus?.steps && currentStatus.steps.length > 0) {
406
- // If not already failed by validation, use the last known good step before this error
407
- stepName = `Failed after step: ${currentStatus.steps[currentStatus.steps.length - 1].stepName}`;
408
- }
409
- await onboardStatusManager.recordStep(config.name, operationType, stepName, undefined, // serverName
410
- OnboardingProcessStatus.FAILED, errorMessage);
411
- }
412
- else {
413
- // If already FAILED, the error and step were likely recorded by _validateFeedConfiguration.
414
- // Log the current error context if it's different or provides more info.
415
- Logger.log(`[${onboardingId}] Process was already marked as FAILED. Additional context - Current error: ${errorMessage}. Initial error from status: ${currentStatus.errorMessage}`);
416
- }
417
- throw error; // Re-throw to ensure the promise from processFullOnboarding is rejected.
418
- }
419
- }
420
- }
421
- // Export singleton instance
422
- export const feedOnboardService = new FeedOnboardService();
1
+ import{configProvider}from"../loaders/ConfigurationProvider.js";import{ServerSchemaProvider}from"../loaders/ServerSchemaProvider.js";import{feedValidator}from"../validators/FeedValidator.js";import{Logger,EventType,EventStatus}from"../../utils/logger.js";import{OnboardingProcessStatus}from"./OnboardStatus.js";import{onboardStatusManager}from"./OnboardStatusManager.js";import{onboardProcessor}from"./OnboardProcessor.js";export class FeedOnboardService{constructor(){}createOperationId(e,a){return`${e}_${a}`}async onboardFeed(e,a){const r=await this.validateStaticConfig(e,a);if(!await onboardStatusManager.findSucceededOperation(e.name,"VALIDATION_ONLY",e)){Logger.log(`Feed ${e.name} has not been successfully validated with the current configuration. Publishing requires prior successful validation.`);const a=this.createOperationId(e.name,"FULL_ONBOARDING"),r=`No prior successful validation found for feed: ${e.name}. Please validate the configuration before publishing.`;return Logger.trackEvent(EventType.FEED_ONBOARD,{status:EventStatus.FAILED,feedName:e.name,errorMessage:r,onboardingId:a,feedConfiguration:e}),{onboardingId:a,status:OnboardingProcessStatus.FAILED,message:r,lastQueried:(new Date).toISOString(),feedConfiguration:e}}return Logger.log(`Found existing successful validation for feed: ${e.name}. Proceeding with full onboarding.`),{...await this._initiateOperation(e,"FULL_ONBOARDING",r,a),feedConfiguration:e}}async validateFeed(e,a){const r=await this.validateStaticConfig(e,a);return{...await this._initiateOperation(e,"VALIDATION_ONLY",r,a),feedConfiguration:e}}async _initiateOperation(e,a,r,t){const o=await onboardStatusManager.findSucceededOperation(e.name,a,e);if(o){Logger.log(`[${o.onboardingId}] Found existing successful ${a} operation for feed: ${e.name} with matching configuration.`);const r={onboardingId:o.onboardingId,status:o.status,message:`A successful ${a} already exists for this feed with identical configuration.`,lastQueried:(new Date).toISOString()};return e&&(r.feedConfiguration=e),r}const n=this.createOperationId(e.name,a);return await onboardStatusManager.createInitialStatus(e.name,a),await onboardStatusManager.saveFeedConfiguration(e.name,a,e),"FULL_ONBOARDING"===a?this.processFullOnboarding(n,e,a,r).catch((async r=>{Logger.error(`[${n}] Full feed onboarding process failed:`,r),await onboardStatusManager.recordStep(e.name,a,"Failed during full onboarding process",void 0,OnboardingProcessStatus.FAILED,r instanceof Error?r.message:String(r))})):"VALIDATION_ONLY"===a&&this.processValidationOnly(n,e,a,r).catch((async r=>{Logger.error(`[${n}] Feed validation process failed:`,r),await onboardStatusManager.recordStep(e.name,a,"Failed during validation process",void 0,OnboardingProcessStatus.FAILED,r instanceof Error?r.message:String(r))})),{onboardingId:n,status:OnboardingProcessStatus.PENDING,message:`New ${a} process started with ID: ${n}.`,lastQueried:(new Date).toISOString()}}async validateStaticConfig(e,a){if(!e||"object"!=typeof e)throw new Error("Invalid configuration: Input must be a valid object.");if("string"!=typeof e.name||!e.name.trim())throw new Error('Invalid configuration: "name" must be a non-empty string.');if(!Array.isArray(e.requirements))throw new Error('Invalid configuration: "requirements" must be an array.');if(!Array.isArray(e.mcpServers))throw new Error('Invalid configuration: "mcpServers" must be an array.');const r=await configProvider.getFeedConfiguration(e.name);let t;if(a){if(!r)throw new Error(`Cannot update non-existent category: ${e.name}. Please ensure the category name is correct or create it as a new category.`);if(!e.mcpServers||0===e.mcpServers.length)throw new Error('For an existing category, "mcpServers" must be provided and non-empty in the payload.');const a=new Set(r.mcpServers.map((e=>e.name))),o=e.mcpServers.filter((e=>{const r=!a.has(e.name),t="true"===e.systemTags?.adhoc;return r||a.has(e.name)&&t}));if(0===o.length)throw new Error(`No new or adhoc (editable) servers provided for the existing category "${e.name}". Ensure the "mcpServers" list in your payload contains at least one server not already in this category or an existing server marked with adhoc:true.`);t=o.map((e=>e.name))}else{if(r)throw new Error(`Category "${e.name}" already exists. To modify an existing category, please set 'forExistingCategory' to true.`);if(!e.mcpServers||0===e.mcpServers.length)throw new Error('Server configuration ("mcpServers") must be provided and non-empty for new categories.');t=e.mcpServers.map((e=>e.name))}return e.mcpServers&&Array.isArray(e.mcpServers)&&e.mcpServers.forEach((e=>{e.systemTags&&delete e.systemTags})),e.systemTags&&delete e.systemTags,e.PullRequest&&delete e.PullRequest,t}async _validateFeedConfiguration(e,a,r,t){await onboardStatusManager.recordStep(a.name,r,"Validating feed configuration",void 0,OnboardingProcessStatus.VALIDATING);let o={isValid:!0,serverResults:[]};try{await feedValidator.validate(a,a.name,r);for(const n of a.mcpServers)if(t.includes(n.name))try{await feedValidator.validateServer(n,a,a.name,r),o.serverResults?.push({serverName:n.name,isValid:!0}),await onboardStatusManager.recordStep(a.name,r,`Validated server: ${n.name}`,n.name,OnboardingProcessStatus.VALIDATING),await onboardStatusManager.updateStatus(a.name,r,{validationStatus:o})}catch(e){throw o.isValid=!1,o.serverResults?.push({serverName:n.name,isValid:!1,message:e.message||String(e)}),await onboardStatusManager.recordStep(a.name,r,`Validation failed for server: ${n.name}`,n.name,OnboardingProcessStatus.FAILED,`Server ${n.name}: ${e.message||String(e)}`),await onboardStatusManager.updateStatus(a.name,r,{validationStatus:o}),e}else Logger.log(`[${e}] Skipping validation for server ${n.name} as it's not in the specified list for this operation.`),o.serverResults?.push({serverName:n.name,isValid:!0,message:"Skipped (existed)"});await onboardStatusManager.recordStep(a.name,r,"All servers in feed configuration validated successfully",void 0,OnboardingProcessStatus.VALIDATED),await onboardStatusManager.updateStatus(a.name,r,{validationStatus:o})}catch(e){const t=e;throw await onboardStatusManager.recordStep(a.name,r,"Feed configuration validation failed",void 0,OnboardingProcessStatus.FAILED,t.message||String(e)),await onboardStatusManager.updateStatus(a.name,r,{validationStatus:{isValid:!1,message:t.message||String(e),serverResults:o.serverResults}}),e}}async processValidationOnly(e,a,r,t){try{await this._validateFeedConfiguration(e,a,r,t);const o=await onboardStatusManager.getStatus(a.name,r),n={validationStatus:o?.validationStatus||{isValid:!0,serverResults:[]},feedConfiguration:a};await onboardStatusManager.recordStep(a.name,r,"Feed configuration validated successfully",void 0,OnboardingProcessStatus.SUCCEEDED),await onboardStatusManager.updateStatus(a.name,r,{errorMessage:void 0,prInfo:void 0,result:n,validationStatus:n.validationStatus}),Logger.log(`[${e}] Successfully validated feed: ${a.name}`),Logger.trackEvent(EventType.FEED_VALIDATE,{status:EventStatus.SUCCESS,feedName:a.name,operationType:"VALIDATION_ONLY",onboardingId:e,feedConfiguration:a})}catch(r){const t=r instanceof Error?r.message:String(r);Logger.error(`[${e}] Feed validation process failed for ${a.name} (already handled):`,r),Logger.trackEvent(EventType.FEED_VALIDATE,{status:EventStatus.FAILED,feedName:a.name,operationType:"VALIDATION_ONLY",errorMessage:t,onboardingId:e,feedConfiguration:a})}}async processFullOnboarding(e,a,r,t){const{tempDir:o,repoDir:n}=onboardProcessor.createDirectories(e);try{await onboardStatusManager.recordStep(a.name,r,"Starting PR creation process (validation confirmed)",void 0,OnboardingProcessStatus.PR_CREATING),await onboardStatusManager.recordStep(a.name,r,"Forking repository",void 0,OnboardingProcessStatus.PR_CREATING),await onboardProcessor.forkRepo(e,n),await onboardStatusManager.recordStep(a.name,r,"Cloning repository",void 0,OnboardingProcessStatus.PR_CREATING),await onboardProcessor.cloneRepo(e,o,n),await onboardStatusManager.recordStep(a.name,r,"Setting up branch",void 0,OnboardingProcessStatus.PR_CREATING);const i=await onboardProcessor.setupBranch(e,a,n);await onboardStatusManager.recordStep(a.name,r,"Saving feed configuration to repository",void 0,OnboardingProcessStatus.PR_CREATING);const{feedFilePath:s,categorySchemasPath:d}=await onboardProcessor.saveFeedConfigToRepo(e,a,n,t);await onboardStatusManager.recordStep(a.name,r,"Creating pull request",void 0,OnboardingProcessStatus.PR_CREATING);const g=await onboardProcessor.createPullRequest(e,a,n,i);await onboardStatusManager.recordStep(a.name,r,g.prExists?"Successfully updated to existing pull request":"Successfully created pull request",void 0,OnboardingProcessStatus.SUCCEEDED),await onboardStatusManager.updateStatus(a.name,r,{errorMessage:void 0,prInfo:g,result:g.url}),Logger.log(`[${e}] Successfully created/updated PR for feed: ${a.name}. PR URL: ${g.url}`);try{await onboardStatusManager.recordStep(a.name,r,"Reloading server schemas",void 0,OnboardingProcessStatus.SUCCEEDED),Logger.log(`[${e}] Initializing ServerSchemaProvider with new schemas at ${d}`),await ServerSchemaProvider.getInstance().initialize(d),Logger.log(`[${e}] ServerSchemaProvider re-initialized.`),await onboardStatusManager.recordStep(a.name,r,"Reloading configurations",void 0,OnboardingProcessStatus.SUCCEEDED),Logger.log(`[${e}] Initializing ConfigurationProvider with new feed file at ${s}`),await configProvider.initialize(s,{prLink:g.url,adhocServers:t}),Logger.log(`[${e}] ConfigurationProvider re-initialized.`),Logger.log(`[${e}] Successfully completed full onboarding for feed: ${a.name}`),Logger.trackEvent(EventType.FEED_ONBOARD,{status:EventStatus.SUCCESS,feedName:a.name,onboardingId:e,prUrl:g.url,feedConfiguration:a})}catch(r){Logger.warn(`[${e}] Failed to re-initialize providers after PR creation for feed ${a.name}:`),Logger.warn(`Skipping re-initialization of providers due to error: ${r}`)}}catch(t){Logger.error(`[${e}] Full feed onboarding process failed:`,t);const o=t instanceof Error?t.message:String(t);Logger.trackEvent(EventType.FEED_ONBOARD,{status:EventStatus.FAILED,feedName:a.name,onboardingId:e,errorMessage:o,feedConfiguration:a});const n=await onboardStatusManager.getStatus(a.name,r);if(n?.status!==OnboardingProcessStatus.FAILED){let e="Failed during full onboarding process";t instanceof Error&&"step"in t&&"string"==typeof t.step?e=`Failed at step: ${t.step}`:n?.steps&&n.steps.length>0&&(e=`Failed after step: ${n.steps[n.steps.length-1].stepName}`),await onboardStatusManager.recordStep(a.name,r,e,void 0,OnboardingProcessStatus.FAILED,o)}else Logger.log(`[${e}] Process was already marked as FAILED. Additional context - Current error: ${o}. Initial error from status: ${n.errorMessage}`);throw t}}}export const feedOnboardService=new FeedOnboardService;
423
2
  //# sourceMappingURL=FeedOnboardService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["configProvider","ServerSchemaProvider","feedValidator","Logger","EventType","EventStatus","OnboardingProcessStatus","onboardStatusManager","onboardProcessor","FeedOnboardService","constructor","createOperationId","feedName","operationType","onboardFeed","config","forExistingCategory","serverList","this","validateStaticConfig","findSucceededOperation","name","log","onboardingId","errorMessage","trackEvent","FEED_ONBOARD","status","FAILED","feedConfiguration","message","lastQueried","Date","toISOString","_initiateOperation","validateFeed","succeededOperation","operationStatus","createInitialStatus","saveFeedConfiguration","processFullOnboarding","catch","async","error","recordStep","undefined","Error","String","processValidationOnly","PENDING","trim","Array","isArray","requirements","mcpServers","existingConfig","getFeedConfiguration","serverListToProcess","length","existingServerNames","Set","map","s","serversToProcessInPayload","filter","payloadServer","isNew","has","isAdhocInPayload","systemTags","adhoc","forEach","server","PullRequest","_validateFeedConfiguration","VALIDATING","overallValidationStatus","isValid","serverResults","validate","serverConfig","includes","validateServer","push","serverName","updateStatus","validationStatus","serverValidationError","VALIDATED","validationError","finalStatus","getStatus","result","SUCCEEDED","prInfo","FEED_VALIDATE","SUCCESS","tempDir","repoDir","createDirectories","PR_CREATING","forkRepo","cloneRepo","branchName","setupBranch","feedFilePath","categorySchemasPath","saveFeedConfigToRepo","createPullRequest","prExists","url","getInstance","initialize","prLink","adhocServers","prUrl","reinitError","warn","currentStatus","stepName","step","steps","feedOnboardService"],"sources":["../../../src/core/onboard/FeedOnboardService.ts"],"mappings":"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","ignoreList":[]}