@loop_ouroboros/mcp-hub-lite 1.0.2 → 1.1.0

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 (333) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/client/assets/{HomeView-7rMg9C6t.js → HomeView-Bu2joUvW.js} +1 -1
  3. package/dist/client/assets/ResourceDetailView-BvrhDCD1.js +1 -0
  4. package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
  5. package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
  6. package/dist/client/assets/ResourcesView-LjqioF_s.js +1 -0
  7. package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
  8. package/dist/client/assets/ServerDashboard-FhHJFvUi.js +1 -0
  9. package/dist/client/assets/ServerDetail-BKV-M4qT.js +2 -0
  10. package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
  11. package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
  12. package/dist/client/assets/ServerListView-BXgtDyt3.js +36 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-D-ooYNdN.js +1 -0
  14. package/dist/client/assets/SettingsView-CMFG91Z4.js +1 -0
  15. package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
  16. package/dist/client/assets/ToolCallDialog-Bf4Xe4gH.js +1 -0
  17. package/dist/client/assets/ToolsView-DFpha1z0.js +1 -0
  18. package/dist/client/assets/{_baseClone-5q1b0P3O.js → _baseClone-Bp9Rjwd7.js} +1 -1
  19. package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
  20. package/dist/client/assets/el-form-item-DdSUWYsl.js +12 -0
  21. package/dist/client/assets/el-input-99gMrutP.js +1 -0
  22. package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
  23. package/dist/client/assets/{el-loading-H85n3BUC.js → el-loading-CIQ5pD5u.js} +1 -1
  24. package/dist/client/assets/el-overlay-BVM6msGX.js +1 -0
  25. package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
  26. package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
  27. package/dist/client/assets/el-radio-group-DhXWy7ry.js +1 -0
  28. package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
  29. package/dist/client/assets/el-skeleton-item-DJz-Us12.js +1 -0
  30. package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
  31. package/dist/client/assets/el-switch-Bu8AQ5uM.js +1 -0
  32. package/dist/client/assets/el-tab-pane-BnGMaV56.js +1 -0
  33. package/dist/client/assets/el-table-column-BMWOaLS_.js +1 -0
  34. package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
  35. package/dist/client/assets/index-C2V-ZGji.js +1 -0
  36. package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
  37. package/dist/client/assets/index-vhkqgpmN.js +2 -0
  38. package/dist/client/assets/{omit-DPsOVNIJ.js → omit-CqPQN3XP.js} +1 -1
  39. package/dist/client/assets/{raf-DY5mgbuB.js → raf-C2wXzaVU.js} +1 -1
  40. package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-BLHLXXJK.js} +1 -1
  41. package/dist/client/index.html +3 -3
  42. package/dist/server/shared/models/resource.model.d.ts +2 -1
  43. package/dist/server/shared/models/resource.model.d.ts.map +1 -1
  44. package/dist/server/shared/models/server.model.d.ts +362 -5
  45. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  46. package/dist/server/shared/models/server.model.js +220 -1
  47. package/dist/server/shared/models/session.model.d.ts +1 -57
  48. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  49. package/dist/server/shared/models/session.model.js +1 -55
  50. package/dist/server/shared/models/tool.model.d.ts +4 -2
  51. package/dist/server/shared/models/tool.model.d.ts.map +1 -1
  52. package/dist/server/shared/types/session-context.types.d.ts +0 -2
  53. package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
  54. package/dist/server/shared/types/websocket.types.d.ts +17 -10
  55. package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
  56. package/dist/server/src/api/mcp/gateway.d.ts +1 -3
  57. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  58. package/dist/server/src/api/mcp/gateway.js +19 -50
  59. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  60. package/dist/server/src/api/mcp/session-context-extractor.js +5 -14
  61. package/dist/server/src/api/web/hub-tools.d.ts +2 -2
  62. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  63. package/dist/server/src/api/web/hub-tools.js +3 -54
  64. package/dist/server/src/api/web/mcp-status.d.ts +1 -1
  65. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
  66. package/dist/server/src/api/web/mcp-status.js +71 -30
  67. package/dist/server/src/api/web/resources.d.ts.map +1 -1
  68. package/dist/server/src/api/web/resources.js +28 -22
  69. package/dist/server/src/api/web/search.d.ts +2 -16
  70. package/dist/server/src/api/web/search.d.ts.map +1 -1
  71. package/dist/server/src/api/web/search.js +24 -45
  72. package/dist/server/src/api/web/servers.d.ts +3 -3
  73. package/dist/server/src/api/web/servers.d.ts.map +1 -1
  74. package/dist/server/src/api/web/servers.js +70 -25
  75. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
  76. package/dist/server/src/api/ws/ws-handler.js +4 -2
  77. package/dist/server/src/app.d.ts.map +1 -1
  78. package/dist/server/src/app.js +0 -2
  79. package/dist/server/src/cli/commands/list.js +2 -2
  80. package/dist/server/src/cli/commands/status.d.ts.map +1 -1
  81. package/dist/server/src/cli/commands/status.js +41 -30
  82. package/dist/server/src/cli/index.d.ts.map +1 -1
  83. package/dist/server/src/cli/index.js +2 -1
  84. package/dist/server/src/cli/server.d.ts +11 -2
  85. package/dist/server/src/cli/server.d.ts.map +1 -1
  86. package/dist/server/src/config/config-change-logger.d.ts +22 -0
  87. package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
  88. package/dist/server/src/config/config-change-logger.js +135 -11
  89. package/dist/server/src/config/config-loader.d.ts +6 -5
  90. package/dist/server/src/config/config-loader.d.ts.map +1 -1
  91. package/dist/server/src/config/config-loader.js +54 -16
  92. package/dist/server/src/config/config-manager.d.ts +51 -43
  93. package/dist/server/src/config/config-manager.d.ts.map +1 -1
  94. package/dist/server/src/config/config-manager.js +84 -66
  95. package/dist/server/src/config/config-migrator.d.ts +82 -0
  96. package/dist/server/src/config/config-migrator.d.ts.map +1 -0
  97. package/dist/server/src/config/config-migrator.js +348 -0
  98. package/dist/server/src/config/config-saver.d.ts +2 -0
  99. package/dist/server/src/config/config-saver.d.ts.map +1 -1
  100. package/dist/server/src/config/config-saver.js +8 -2
  101. package/dist/server/src/config/config.schema.d.ts +10 -104
  102. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  103. package/dist/server/src/config/config.schema.js +15 -99
  104. package/dist/server/src/config/path-validator.d.ts +27 -0
  105. package/dist/server/src/config/path-validator.d.ts.map +1 -0
  106. package/dist/server/src/config/path-validator.js +53 -0
  107. package/dist/server/src/config/server-config-manager.d.ts +37 -31
  108. package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
  109. package/dist/server/src/config/server-config-manager.js +222 -66
  110. package/dist/server/src/config/type-converter.d.ts.map +1 -1
  111. package/dist/server/src/config/type-converter.js +3 -2
  112. package/dist/server/src/models/event.model.d.ts +17 -10
  113. package/dist/server/src/models/event.model.d.ts.map +1 -1
  114. package/dist/server/src/models/server.model.d.ts +17 -3
  115. package/dist/server/src/models/server.model.d.ts.map +1 -1
  116. package/dist/server/src/models/server.model.js +2 -1
  117. package/dist/server/src/models/system-tools.constants.d.ts +10 -27
  118. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  119. package/dist/server/src/models/system-tools.constants.js +4 -8
  120. package/dist/server/src/pid/manager.d.ts.map +1 -1
  121. package/dist/server/src/pid/manager.js +2 -1
  122. package/dist/server/src/server/dev-server.js +34 -20
  123. package/dist/server/src/server/runner.d.ts.map +1 -1
  124. package/dist/server/src/server/runner.js +41 -26
  125. package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
  126. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  127. package/dist/server/src/services/connection/connection-manager.js +286 -241
  128. package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
  129. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  130. package/dist/server/src/services/connection/tool-cache.js +50 -55
  131. package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
  132. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  133. package/dist/server/src/services/gateway/gateway.service.js +15 -19
  134. package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
  135. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
  136. package/dist/server/src/services/gateway/global-transport.js +42 -0
  137. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  138. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
  139. package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
  140. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
  141. package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
  142. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
  143. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  144. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +10 -81
  145. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
  146. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
  147. package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
  148. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  149. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
  150. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  151. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
  152. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
  153. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
  154. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  155. package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
  156. package/dist/server/src/services/gateway/types.d.ts +2 -1
  157. package/dist/server/src/services/gateway/types.d.ts.map +1 -1
  158. package/dist/server/src/services/hub-manager.service.d.ts +32 -238
  159. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  160. package/dist/server/src/services/hub-manager.service.js +89 -267
  161. package/dist/server/src/services/hub-tools/index.d.ts +1 -3
  162. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  163. package/dist/server/src/services/hub-tools/index.js +1 -2
  164. package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
  165. package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
  166. package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
  167. package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
  168. package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
  169. package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
  170. package/dist/server/src/services/hub-tools/resource-generator.d.ts +24 -1
  171. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  172. package/dist/server/src/services/hub-tools/resource-generator.js +259 -39
  173. package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
  174. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  175. package/dist/server/src/services/hub-tools/server-selector.js +44 -37
  176. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
  177. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  178. package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
  179. package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
  180. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
  181. package/dist/server/src/services/hub-tools/tool-search.js +10 -4
  182. package/dist/server/src/services/hub-tools/types.d.ts +2 -2
  183. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
  184. package/dist/server/src/services/hub-tools.service.d.ts +43 -72
  185. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  186. package/dist/server/src/services/hub-tools.service.js +185 -110
  187. package/dist/server/src/services/search/search-core.service.d.ts +5 -5
  188. package/dist/server/src/services/search/search-core.service.js +11 -11
  189. package/dist/server/src/services/session/session-manager.d.ts +12 -256
  190. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  191. package/dist/server/src/services/session/session-manager.js +23 -585
  192. package/dist/server/src/services/session-tracker.service.d.ts +2 -10
  193. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -1
  194. package/dist/server/src/services/session-tracker.service.js +2 -53
  195. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  196. package/dist/server/src/services/system-tool-handler.js +7 -17
  197. package/dist/server/src/utils/composite-key.d.ts +29 -0
  198. package/dist/server/src/utils/composite-key.d.ts.map +1 -0
  199. package/dist/server/src/utils/composite-key.js +39 -0
  200. package/dist/server/src/utils/error-handler.d.ts.map +1 -1
  201. package/dist/server/src/utils/error-handler.js +3 -2
  202. package/dist/server/src/utils/index.d.ts +2 -0
  203. package/dist/server/src/utils/index.d.ts.map +1 -1
  204. package/dist/server/src/utils/index.js +2 -0
  205. package/dist/server/src/utils/instance-id.d.ts +22 -0
  206. package/dist/server/src/utils/instance-id.d.ts.map +1 -0
  207. package/dist/server/src/utils/instance-id.js +59 -0
  208. package/dist/server/src/utils/json-utils.d.ts +4 -4
  209. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  210. package/dist/server/src/utils/json-utils.js +4 -4
  211. package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
  212. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
  213. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  214. package/dist/server/src/utils/logger/log-formatter.js +82 -5
  215. package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
  216. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  217. package/dist/server/src/utils/logger/log-modules.js +8 -6
  218. package/dist/server/src/utils/parameter-validator.d.ts +10 -0
  219. package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
  220. package/dist/server/src/utils/parameter-validator.js +53 -0
  221. package/dist/server/src/utils/process-tree.d.ts +49 -0
  222. package/dist/server/src/utils/process-tree.d.ts.map +1 -0
  223. package/dist/server/src/utils/process-tree.js +285 -0
  224. package/dist/server/src/utils/request-context.d.ts +0 -18
  225. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  226. package/dist/server/src/utils/request-context.js +0 -20
  227. package/dist/server/src/utils/sort-utils.d.ts +40 -0
  228. package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
  229. package/dist/server/src/utils/sort-utils.js +131 -0
  230. package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
  231. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
  232. package/dist/server/src/utils/transports/sse-transport.js +55 -9
  233. package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
  234. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  235. package/dist/server/src/utils/transports/stdio-transport.js +66 -247
  236. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
  237. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
  238. package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
  239. package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
  240. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  241. package/dist/server/src/utils/transports/transport-factory.js +31 -11
  242. package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
  243. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
  244. package/dist/server/src/utils/version.d.ts +11 -0
  245. package/dist/server/src/utils/version.d.ts.map +1 -0
  246. package/dist/server/src/utils/version.js +57 -0
  247. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
  248. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
  249. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
  250. package/dist/server/tests/evaluation/evaluation.test.js +10 -9
  251. package/dist/server/tests/integration/api/gateway.test.js +2 -2
  252. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
  253. package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
  254. package/dist/server/tests/server.test.js +27 -16
  255. package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
  256. package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
  257. package/dist/server/tests/temp/temp-run-docling.js +53 -0
  258. package/dist/server/tests/types/test-helpers.d.ts +1 -2
  259. package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
  260. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
  261. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
  262. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
  263. package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
  264. package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
  265. package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
  266. package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
  267. package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
  268. package/dist/server/tests/unit/config/config-saver.test.js +200 -0
  269. package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
  270. package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
  271. package/dist/server/tests/unit/config/config.schema.test.js +347 -0
  272. package/dist/server/tests/unit/server/runner.test.js +86 -62
  273. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
  274. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
  275. package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
  276. package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
  277. package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
  278. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
  279. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
  280. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
  281. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
  282. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
  283. package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
  284. package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -320
  285. package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
  286. package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
  287. package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
  288. package/dist/server/tests/unit/services/session-manager.test.js +26 -436
  289. package/dist/server/tests/unit/utils/config.test.js +88 -186
  290. package/dist/server/tests/unit/utils/json-utils.test.js +18 -18
  291. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
  292. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
  293. package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
  294. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
  295. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
  296. package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
  297. package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
  298. package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
  299. package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
  300. package/dist/server/tests/unit/utils/request-context.test.js +5 -24
  301. package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
  302. package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
  303. package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
  304. package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
  305. package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
  306. package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
  307. package/package.json +1 -1
  308. package/dist/client/assets/ResourceDetailView-Bf-1ffbk.js +0 -1
  309. package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
  310. package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
  311. package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
  312. package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
  313. package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
  314. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
  315. package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
  316. package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
  317. package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
  318. package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
  319. package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
  320. package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
  321. package/dist/client/assets/el-input-CDnuSKVZ.js +0 -1
  322. package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
  323. package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
  324. package/dist/client/assets/el-overlay-CzMkXyYy.js +0 -1
  325. package/dist/client/assets/el-select-DvjGddk_.js +0 -1
  326. package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
  327. package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
  328. package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
  329. package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
  330. package/dist/client/assets/el-tag-npbwux4f.js +0 -1
  331. package/dist/client/assets/index-CCnAxNF8.js +0 -2
  332. package/dist/client/assets/index-d1DZeSfz.js +0 -1
  333. package/dist/client/assets/vnode-CHomNjgN.js +0 -1
@@ -0,0 +1,199 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+ import { loadConfig } from '../../../src/config/config-loader.js';
6
+ import { SystemConfigSchema, isV1Config, isV1_1Config } from '../../../src/config/config.schema.js';
7
+ import { migrateConfig, checkMigrationStatus } from '../../../src/config/config-migrator.js';
8
+ describe('Config Loader Automatic Migration (Backward Compatible)', () => {
9
+ let tempDir;
10
+ let testConfigPath;
11
+ beforeEach(() => {
12
+ // Create temporary directory
13
+ const testId = `auto-migration-test-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
14
+ tempDir = path.join(os.tmpdir(), testId);
15
+ fs.mkdirSync(tempDir, { recursive: true });
16
+ testConfigPath = path.join(tempDir, '.mcp-hub.json');
17
+ });
18
+ afterEach(() => {
19
+ // Clean up temporary directory
20
+ if (fs.existsSync(tempDir)) {
21
+ let retries = 3;
22
+ while (retries > 0) {
23
+ try {
24
+ fs.rmSync(tempDir, { recursive: true, force: true });
25
+ break;
26
+ }
27
+ catch {
28
+ retries--;
29
+ if (retries > 0) {
30
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 50);
31
+ }
32
+ }
33
+ }
34
+ }
35
+ vi.restoreAllMocks();
36
+ });
37
+ const createV1Config = () => ({
38
+ version: '1.0.0',
39
+ system: {
40
+ host: 'localhost',
41
+ port: 7788,
42
+ language: 'zh',
43
+ theme: 'system',
44
+ logging: {
45
+ level: 'info',
46
+ rotationAge: '7d',
47
+ jsonPretty: true,
48
+ mcpCommDebug: false,
49
+ sessionDebug: false
50
+ }
51
+ },
52
+ security: {
53
+ allowedNetworks: ['127.0.0.1'],
54
+ maxConcurrentConnections: 50,
55
+ connectionTimeout: 30000,
56
+ idleConnectionTimeout: 300000,
57
+ sessionTimeout: 1800000,
58
+ sessionFlushInterval: 900000,
59
+ maxConnections: 50
60
+ },
61
+ servers: {
62
+ 'test-server-1': {
63
+ command: 'npx test-server-1',
64
+ args: ['--verbose'],
65
+ env: { NODE_ENV: 'development' },
66
+ enabled: true,
67
+ tags: { environment: 'dev' },
68
+ type: 'stdio',
69
+ timeout: 60000,
70
+ allowedTools: ['tool1', 'tool2'],
71
+ description: 'Test server 1'
72
+ }
73
+ },
74
+ tagDefinitions: []
75
+ });
76
+ const writeV1Config = () => {
77
+ const config = createV1Config();
78
+ fs.writeFileSync(testConfigPath, JSON.stringify(config, null, 2));
79
+ };
80
+ describe('Backward Compatible Loading (Default Behavior)', () => {
81
+ it('should load v1.0 config without migration by default', () => {
82
+ writeV1Config();
83
+ const originalContent = fs.readFileSync(testConfigPath, 'utf-8');
84
+ // Load config with default settings (no auto-migration)
85
+ const loadedConfig = loadConfig(testConfigPath);
86
+ // Verify loaded config is still v1.0 format
87
+ expect(loadedConfig.version).toBe('1.0.0');
88
+ expect(isV1Config(loadedConfig)).toBe(true);
89
+ expect(loadedConfig.servers).toBeDefined();
90
+ expect(loadedConfig.servers['test-server-1']).toBeDefined();
91
+ // Verify file was not modified
92
+ const currentContent = fs.readFileSync(testConfigPath, 'utf-8');
93
+ expect(currentContent).toBe(originalContent);
94
+ });
95
+ it('should validate loaded config with v1.0 schema', () => {
96
+ writeV1Config();
97
+ const loadedConfig = loadConfig(testConfigPath);
98
+ // Validate with Zod schema
99
+ const validation = SystemConfigSchema.safeParse(loadedConfig);
100
+ expect(validation.success).toBe(true);
101
+ });
102
+ it('should sort servers by name when loading', () => {
103
+ const v1Config = createV1Config();
104
+ v1Config.servers = {
105
+ 'zebra-server': {
106
+ enabled: true,
107
+ type: 'stdio',
108
+ args: [],
109
+ timeout: 60000,
110
+ allowedTools: []
111
+ },
112
+ 'alpha-server': {
113
+ enabled: true,
114
+ type: 'stdio',
115
+ args: [],
116
+ timeout: 60000,
117
+ allowedTools: []
118
+ },
119
+ 'mike-server': {
120
+ enabled: true,
121
+ type: 'stdio',
122
+ args: [],
123
+ timeout: 60000,
124
+ allowedTools: []
125
+ }
126
+ };
127
+ fs.writeFileSync(testConfigPath, JSON.stringify(v1Config, null, 2));
128
+ const loadedConfig = loadConfig(testConfigPath);
129
+ // Check that servers are sorted
130
+ const serverNames = Object.keys(loadedConfig.servers);
131
+ expect(serverNames).toEqual(['alpha-server', 'mike-server', 'zebra-server']);
132
+ });
133
+ });
134
+ describe('Optional Auto-Migration', () => {
135
+ it('should migrate v1.0 to v1.1 when autoMigrate=true', () => {
136
+ writeV1Config();
137
+ const originalContent = fs.readFileSync(testConfigPath, 'utf-8');
138
+ // Load config with auto-migration enabled
139
+ const loadedConfig = loadConfig(testConfigPath, true);
140
+ // Even though migration happened, the returned config should be v1.0 compatible
141
+ expect(loadedConfig.version).toBe('1.0.0');
142
+ expect(isV1Config(loadedConfig)).toBe(true);
143
+ // But the file on disk should be migrated to v1.1
144
+ const newContent = fs.readFileSync(testConfigPath, 'utf-8');
145
+ expect(newContent).not.toBe(originalContent);
146
+ const newParsed = JSON.parse(newContent);
147
+ expect(isV1_1Config(newParsed)).toBe(true);
148
+ expect(newParsed.version).toBe('1.1.0');
149
+ });
150
+ it('should create backup when migrating with autoMigrate=true', () => {
151
+ writeV1Config();
152
+ // Load config with auto-migration enabled
153
+ loadConfig(testConfigPath, true);
154
+ // Check for backup files in the same directory
155
+ const files = fs.readdirSync(tempDir);
156
+ const backupFiles = files.filter((f) => f.includes('.backup.'));
157
+ expect(backupFiles.length).toBeGreaterThan(0);
158
+ // Verify backup file contains original v1.0 config
159
+ const backupPath = path.join(tempDir, backupFiles[0]);
160
+ const backupContent = fs.readFileSync(backupPath, 'utf-8');
161
+ const backupParsed = JSON.parse(backupContent);
162
+ expect(isV1Config(backupParsed)).toBe(true);
163
+ expect(backupParsed.version).toBe('1.0.0');
164
+ });
165
+ it('should return v1.0 compatible config even when file is v1.1', () => {
166
+ // First, create a v1.1 file by migrating
167
+ writeV1Config();
168
+ loadConfig(testConfigPath, true);
169
+ // Now load again - file is already v1.1 but should return v1.0 compatible
170
+ const loadedConfig = loadConfig(testConfigPath);
171
+ expect(loadedConfig.version).toBe('1.0.0');
172
+ expect(isV1Config(loadedConfig)).toBe(true);
173
+ expect(loadedConfig.servers).toBeDefined();
174
+ });
175
+ });
176
+ describe('Direct Migration Functions', () => {
177
+ it('should check migration status correctly', () => {
178
+ writeV1Config();
179
+ const status = checkMigrationStatus(testConfigPath);
180
+ expect(status.exists).toBe(true);
181
+ expect(status.version).toBe('v1');
182
+ expect(status.canMigrate).toBe(true);
183
+ });
184
+ it('should perform dry run migration without modifying files', () => {
185
+ writeV1Config();
186
+ const originalContent = fs.readFileSync(testConfigPath, 'utf-8');
187
+ const result = migrateConfig(testConfigPath, {
188
+ dryRun: true,
189
+ createBackup: false,
190
+ validateAfterMigration: true
191
+ });
192
+ expect(result.success).toBe(true);
193
+ expect(result.migratedConfig).toBeDefined();
194
+ // Verify file wasn't modified
195
+ const currentContent = fs.readFileSync(testConfigPath, 'utf-8');
196
+ expect(currentContent).toBe(originalContent);
197
+ });
198
+ });
199
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-migrator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-migrator.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/config/config-migrator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,316 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+ import { dryRunMigration, checkMigrationStatus, migrateConfig, rollbackMigration, resolveInstanceConfig, getEnabledInstances } from '../../../src/config/config-migrator.js';
6
+ import { SystemConfigSchema, isLegacyV1Config } from '../../../src/config/config.schema.js';
7
+ describe('Config Migrator', () => {
8
+ let tempDir;
9
+ let testConfigPath;
10
+ beforeEach(() => {
11
+ // Create temporary directory
12
+ const testId = `migration-test-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
13
+ tempDir = path.join(os.tmpdir(), testId);
14
+ fs.mkdirSync(tempDir, { recursive: true });
15
+ testConfigPath = path.join(tempDir, '.mcp-hub.json');
16
+ });
17
+ afterEach(() => {
18
+ // Clean up temporary directory
19
+ if (fs.existsSync(tempDir)) {
20
+ let retries = 3;
21
+ while (retries > 0) {
22
+ try {
23
+ fs.rmSync(tempDir, { recursive: true, force: true });
24
+ break;
25
+ }
26
+ catch {
27
+ retries--;
28
+ if (retries > 0) {
29
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 50);
30
+ }
31
+ }
32
+ }
33
+ }
34
+ vi.restoreAllMocks();
35
+ });
36
+ const createLegacyV1Config = () => ({
37
+ version: '1.0.0',
38
+ system: {
39
+ host: 'localhost',
40
+ port: 7788,
41
+ language: 'zh',
42
+ theme: 'system',
43
+ logging: {
44
+ level: 'info',
45
+ rotationAge: '7d',
46
+ jsonPretty: true,
47
+ mcpCommDebug: false,
48
+ apiDebug: false
49
+ }
50
+ },
51
+ security: {
52
+ allowedNetworks: ['127.0.0.1'],
53
+ maxConcurrentConnections: 50,
54
+ connectionTimeout: 30000,
55
+ idleConnectionTimeout: 300000,
56
+ maxConnections: 50
57
+ },
58
+ servers: {
59
+ 'test-server-1': {
60
+ command: 'npx test-server-1',
61
+ args: ['--verbose'],
62
+ env: { NODE_ENV: 'development' },
63
+ enabled: true,
64
+ tags: { environment: 'dev' },
65
+ type: 'stdio',
66
+ timeout: 60000,
67
+ aggregatedTools: ['tool1', 'tool2'],
68
+ description: 'Test server 1'
69
+ },
70
+ 'test-server-2': {
71
+ command: 'npx test-server-2',
72
+ args: [],
73
+ enabled: false,
74
+ type: 'sse',
75
+ url: 'http://localhost:8080',
76
+ timeout: 60000,
77
+ aggregatedTools: [],
78
+ description: 'Test server 2'
79
+ }
80
+ },
81
+ tagDefinitions: []
82
+ });
83
+ const writeLegacyV1Config = () => {
84
+ const config = createLegacyV1Config();
85
+ fs.writeFileSync(testConfigPath, JSON.stringify(config, null, 2));
86
+ };
87
+ describe('checkMigrationStatus', () => {
88
+ it('should return "not found" for non-existent file', () => {
89
+ const result = checkMigrationStatus(testConfigPath);
90
+ expect(result.exists).toBe(false);
91
+ expect(result.version).toBe('unknown');
92
+ expect(result.canMigrate).toBe(false);
93
+ });
94
+ it('should detect v1.0 configuration', () => {
95
+ writeLegacyV1Config();
96
+ const result = checkMigrationStatus(testConfigPath);
97
+ expect(result.exists).toBe(true);
98
+ expect(result.version).toBe('v1');
99
+ expect(result.canMigrate).toBe(true);
100
+ });
101
+ it('should detect v1.1 configuration', () => {
102
+ const v1_1Config = {
103
+ version: '1.1.0',
104
+ system: {
105
+ host: 'localhost',
106
+ port: 7788,
107
+ language: 'zh',
108
+ theme: 'system',
109
+ logging: {
110
+ level: 'info',
111
+ rotationAge: '7d',
112
+ jsonPretty: true,
113
+ mcpCommDebug: false,
114
+ apiDebug: false
115
+ }
116
+ },
117
+ security: {
118
+ allowedNetworks: ['127.0.0.1'],
119
+ maxConcurrentConnections: 50,
120
+ connectionTimeout: 30000,
121
+ idleConnectionTimeout: 300000,
122
+ maxConnections: 50
123
+ },
124
+ servers: {},
125
+ tagDefinitions: []
126
+ };
127
+ fs.writeFileSync(testConfigPath, JSON.stringify(v1_1Config, null, 2));
128
+ const result = checkMigrationStatus(testConfigPath);
129
+ expect(result.exists).toBe(true);
130
+ expect(result.version).toBe('v1.1');
131
+ expect(result.canMigrate).toBe(false);
132
+ });
133
+ });
134
+ describe('dryRunMigration', () => {
135
+ it('should perform migration without modifying files', () => {
136
+ writeLegacyV1Config();
137
+ const originalContent = fs.readFileSync(testConfigPath, 'utf8');
138
+ const result = dryRunMigration(testConfigPath);
139
+ expect(result.success).toBe(true);
140
+ expect(result.migratedConfig).toBeDefined();
141
+ expect(result.backupPath).toBeUndefined();
142
+ // Verify file wasn't modified
143
+ const currentContent = fs.readFileSync(testConfigPath, 'utf8');
144
+ expect(currentContent).toBe(originalContent);
145
+ });
146
+ it('should convert servers to servers correctly', () => {
147
+ writeLegacyV1Config();
148
+ const result = dryRunMigration(testConfigPath);
149
+ expect(result.success).toBe(true);
150
+ expect(result.migratedConfig).toBeDefined();
151
+ const migrated = result.migratedConfig;
152
+ expect(migrated.version).toBe('1.1.0');
153
+ expect(migrated.servers).toBeDefined();
154
+ expect(Object.keys(migrated.servers)).toHaveLength(2);
155
+ expect(migrated.servers['test-server-1']).toBeDefined();
156
+ expect(migrated.servers['test-server-2']).toBeDefined();
157
+ // Check server 1
158
+ const server1 = migrated.servers['test-server-1'];
159
+ expect(server1.template.command).toBe('npx test-server-1');
160
+ expect(server1.template.args).toEqual(['--verbose']);
161
+ expect(server1.template.env).toEqual({ NODE_ENV: 'development' });
162
+ expect(server1.template.type).toBe('stdio');
163
+ expect(server1.instances[0].tags).toEqual({ environment: 'dev' });
164
+ expect(server1.instances).toHaveLength(1);
165
+ expect(server1.instances[0].id).toMatch(/test-server-1-[0-9a-f]{8}/);
166
+ expect(server1.instances[0].enabled).toBe(true);
167
+ });
168
+ it('should preserve system and security config', () => {
169
+ writeLegacyV1Config();
170
+ const v1Config = createLegacyV1Config();
171
+ const result = dryRunMigration(testConfigPath);
172
+ expect(result.success).toBe(true);
173
+ const migrated = result.migratedConfig;
174
+ expect(migrated.system).toEqual(v1Config.system);
175
+ expect(migrated.security).toEqual(v1Config.security);
176
+ });
177
+ });
178
+ describe('migrateConfig (actual migration)', () => {
179
+ it('should perform actual migration and validate the result', () => {
180
+ writeLegacyV1Config();
181
+ const originalContent = fs.readFileSync(testConfigPath, 'utf8');
182
+ const result = migrateConfig(testConfigPath, {
183
+ createBackup: true,
184
+ validateAfterMigration: true
185
+ });
186
+ expect(result.success).toBe(true);
187
+ expect(result.migratedConfig).toBeDefined();
188
+ expect(result.backupPath).toBeDefined();
189
+ // Verify file was modified to v1.1
190
+ const newContent = fs.readFileSync(testConfigPath, 'utf8');
191
+ expect(newContent).not.toBe(originalContent);
192
+ const migratedConfig = JSON.parse(newContent);
193
+ expect(isLegacyV1Config(migratedConfig)).toBe(false);
194
+ expect(migratedConfig.version).toBe('1.1.0');
195
+ });
196
+ it('should validate migrated config with v1.1 schema', () => {
197
+ writeLegacyV1Config();
198
+ const result = migrateConfig(testConfigPath, {
199
+ createBackup: false,
200
+ validateAfterMigration: true
201
+ });
202
+ expect(result.success).toBe(true);
203
+ expect(result.migratedConfig).toBeDefined();
204
+ // Validate with Zod schema
205
+ const validation = SystemConfigSchema.safeParse(result.migratedConfig);
206
+ expect(validation.success).toBe(true);
207
+ });
208
+ });
209
+ describe('rollbackMigration', () => {
210
+ it('should rollback to v1.0 using backup', () => {
211
+ writeLegacyV1Config();
212
+ const originalContent = fs.readFileSync(testConfigPath, 'utf8');
213
+ // Perform migration first
214
+ const migrationResult = migrateConfig(testConfigPath, {
215
+ createBackup: true,
216
+ validateAfterMigration: true
217
+ });
218
+ expect(migrationResult.success).toBe(true);
219
+ expect(migrationResult.backupPath).toBeDefined();
220
+ // Verify file is v1.1
221
+ const migratedContent = fs.readFileSync(testConfigPath, 'utf8');
222
+ expect(migratedContent).not.toBe(originalContent);
223
+ // Rollback
224
+ const rollbackResult = rollbackMigration(testConfigPath, migrationResult.backupPath);
225
+ expect(rollbackResult.success).toBe(true);
226
+ // Verify file is back to original
227
+ const rolledBackContent = fs.readFileSync(testConfigPath, 'utf8');
228
+ expect(rolledBackContent).toBe(originalContent);
229
+ });
230
+ it('should fail rollback for non-existent backup', () => {
231
+ writeLegacyV1Config();
232
+ const nonExistentBackup = path.join(tempDir, 'non-existent-backup.json');
233
+ const result = rollbackMigration(testConfigPath, nonExistentBackup);
234
+ expect(result.success).toBe(false);
235
+ expect(result.error).toContain('not found');
236
+ });
237
+ });
238
+ describe('v1.1 Configuration Helpers', () => {
239
+ describe('resolveInstanceConfig', () => {
240
+ it('should resolve instance configuration by merging template and instance', () => {
241
+ writeLegacyV1Config();
242
+ const migrationResult = dryRunMigration(testConfigPath);
243
+ expect(migrationResult.success).toBe(true);
244
+ const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
245
+ const resolved = resolveInstanceConfig(serverConfig);
246
+ expect(resolved).not.toBeNull();
247
+ expect(resolved.command).toBe('npx test-server-1');
248
+ expect(resolved.args).toEqual(['--verbose']);
249
+ expect(resolved.env).toEqual({ NODE_ENV: 'development' });
250
+ expect(resolved.type).toBe('stdio');
251
+ expect(resolved.tags).toEqual({ environment: 'dev' });
252
+ expect(resolved.enabled).toBe(true);
253
+ });
254
+ it('should resolve specific instance by ID', () => {
255
+ writeLegacyV1Config();
256
+ const migrationResult = dryRunMigration(testConfigPath);
257
+ expect(migrationResult.success).toBe(true);
258
+ const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
259
+ const instanceId = serverConfig.instances[0].id;
260
+ const resolved = resolveInstanceConfig(serverConfig, instanceId);
261
+ expect(resolved).not.toBeNull();
262
+ expect(resolved.command).toBe('npx test-server-1');
263
+ });
264
+ it('should return null for non-existent instance ID', () => {
265
+ writeLegacyV1Config();
266
+ const migrationResult = dryRunMigration(testConfigPath);
267
+ expect(migrationResult.success).toBe(true);
268
+ const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
269
+ const resolved = resolveInstanceConfig(serverConfig, 'non-existent-id');
270
+ expect(resolved).toBeNull();
271
+ });
272
+ });
273
+ describe('getEnabledInstances', () => {
274
+ it('should return only enabled instances', () => {
275
+ writeLegacyV1Config();
276
+ const migrationResult = dryRunMigration(testConfigPath);
277
+ expect(migrationResult.success).toBe(true);
278
+ const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
279
+ const enabledInstances = getEnabledInstances(serverConfig);
280
+ expect(enabledInstances).toHaveLength(1);
281
+ expect(enabledInstances[0].instance.enabled).toBe(true);
282
+ expect(enabledInstances[0].resolved).not.toBeNull();
283
+ });
284
+ });
285
+ });
286
+ describe('Migration Edge Cases', () => {
287
+ it('should handle empty servers list', () => {
288
+ const emptyV1Config = {
289
+ ...createLegacyV1Config(),
290
+ servers: {}
291
+ };
292
+ fs.writeFileSync(testConfigPath, JSON.stringify(emptyV1Config, null, 2));
293
+ const result = dryRunMigration(testConfigPath);
294
+ expect(result.success).toBe(true);
295
+ expect(result.migratedConfig.servers).toEqual({});
296
+ });
297
+ it('should handle server with minimal configuration', () => {
298
+ const minimalV1Config = {
299
+ ...createLegacyV1Config(),
300
+ servers: {
301
+ 'minimal-server': {
302
+ enabled: true,
303
+ type: 'stdio',
304
+ args: [],
305
+ timeout: 30000,
306
+ aggregatedTools: []
307
+ }
308
+ }
309
+ };
310
+ fs.writeFileSync(testConfigPath, JSON.stringify(minimalV1Config, null, 2));
311
+ const result = dryRunMigration(testConfigPath);
312
+ expect(result.success).toBe(true);
313
+ expect(result.migratedConfig.servers['minimal-server']).toBeDefined();
314
+ });
315
+ });
316
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-saver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-saver.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/config/config-saver.test.ts"],"names":[],"mappings":""}