@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
@@ -84,8 +84,8 @@ export const listCommand = new Command('list')
84
84
  Name: server.name,
85
85
  // Now need to display server instance information
86
86
  Instances: server.instances?.length || 0,
87
- Type: server.config.type,
88
- Enabled: server.config.enabled
87
+ Type: server.config.template.type,
88
+ Enabled: server.config.instances.some((i) => i.enabled !== false)
89
89
  })));
90
90
  }
91
91
  process.exit(0);
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,aAAa,SAYtB,CAAC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,aAAa,SAYtB,CAAC"}
@@ -82,38 +82,49 @@ function printFormattedStatus(status) {
82
82
  console.log(`📡 Web UI: ${cyan}${webUiUrl}${reset}`);
83
83
  console.log(`🔗 MCP Endpoint: ${cyan}${mcpEndpoint}${reset}`);
84
84
  console.log(`📄 PID File: ${dim}${formatPath(status.pidFilePath)}${reset}`);
85
- // MCP Servers section
85
+ // MCP Servers section - split into connected and disconnected
86
86
  if (status.mcpServers && status.mcpServers.length > 0) {
87
- console.log('');
88
- console.log(`${yellow}MCP Servers:${reset}`);
89
- console.log(`${dim}═════════════${reset}`);
90
- // Calculate column widths
91
- let maxNameLen = 'Server Name'.length;
92
- let maxTypeLen = 'Type'.length;
93
- const maxStatusLen = 'Disconnected'.length;
94
- for (const server of status.mcpServers) {
95
- maxNameLen = Math.max(maxNameLen, (server.name || '').length);
96
- maxTypeLen = Math.max(maxTypeLen, (server.type || '').length);
97
- }
98
- // Simple table without complex borders
99
- const headerName = 'Server Name'.padEnd(maxNameLen);
100
- const headerType = 'Type'.padEnd(maxTypeLen);
101
- const headerStatus = 'Status'.padEnd(maxStatusLen);
102
- console.log(`${cyan}${headerName} ${headerType} ${headerStatus} Tools Resources${reset}`);
103
- console.log(`${dim}${'─'.repeat(maxNameLen + maxTypeLen + maxStatusLen + 20)}${reset}`);
104
- for (const server of status.mcpServers) {
105
- const name = (server.name || '').padEnd(maxNameLen);
106
- const type = (server.type || '').padEnd(maxTypeLen);
107
- const statusText = server.connected
108
- ? `${green}Connected${reset}`.padEnd(maxStatusLen + 9)
109
- : `${red}Disconnected${reset}`.padEnd(maxStatusLen + 9);
110
- const tools = server.toolsCount.toString().padStart(5);
111
- const resources = server.resourcesCount.toString().padStart(9);
112
- console.log(`${name} ${type} ${statusText} ${tools} ${resources}`);
113
- if (server.error) {
114
- console.log(` ${red}Error: ${server.error}${reset}`);
87
+ const connectedServers = status.mcpServers.filter((s) => s.connected);
88
+ const disconnectedServers = status.mcpServers.filter((s) => !s.connected);
89
+ // Function to display a server list
90
+ const displayServerList = (servers, title, titleColor) => {
91
+ if (servers.length === 0)
92
+ return;
93
+ console.log('');
94
+ console.log(`${titleColor}${title}${reset}`);
95
+ console.log(`${dim}${''.repeat(title.length)}${reset}`);
96
+ // Calculate column widths
97
+ let maxNameLen = 'Server Name'.length;
98
+ let maxTypeLen = 'Type'.length;
99
+ const maxStatusLen = 'Disconnected'.length;
100
+ for (const server of servers) {
101
+ maxNameLen = Math.max(maxNameLen, (server.name || '').length);
102
+ maxTypeLen = Math.max(maxTypeLen, (server.type || '').length);
115
103
  }
116
- }
104
+ // Simple table without complex borders
105
+ const headerName = 'Server Name'.padEnd(maxNameLen);
106
+ const headerType = 'Type'.padEnd(maxTypeLen);
107
+ const headerStatus = 'Status'.padEnd(maxStatusLen);
108
+ console.log(`${cyan}${headerName} ${headerType} ${headerStatus} Tools Resources${reset}`);
109
+ console.log(`${dim}${'─'.repeat(maxNameLen + maxTypeLen + maxStatusLen + 20)}${reset}`);
110
+ for (const server of servers) {
111
+ const name = (server.name || '').padEnd(maxNameLen);
112
+ const type = (server.type || '').padEnd(maxTypeLen);
113
+ const statusText = server.connected
114
+ ? `${green}Connected${reset}`.padEnd(maxStatusLen + 9)
115
+ : `${red}Disconnected${reset}`.padEnd(maxStatusLen + 9);
116
+ const tools = server.toolsCount.toString().padStart(5);
117
+ const resources = server.resourcesCount.toString().padStart(9);
118
+ console.log(`${name} ${type} ${statusText} ${tools} ${resources}`);
119
+ if (server.error) {
120
+ console.log(` ${red}Error: ${server.error}${reset}`);
121
+ }
122
+ }
123
+ };
124
+ // Display connected servers first
125
+ displayServerList(connectedServers, 'MCP Servers (Connected):', green);
126
+ // Then display disconnected servers
127
+ displayServerList(disconnectedServers, 'MCP Servers (Disconnected):', red);
117
128
  }
118
129
  // MCP Client Configuration
119
130
  console.log('');
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAiBnC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAiBnC"}
@@ -6,6 +6,7 @@
6
6
  import { Command } from 'commander';
7
7
  import { argv } from 'node:process';
8
8
  import { pathToFileURL } from 'node:url';
9
+ import { getAppVersion } from '../utils/version.js';
9
10
  import { startCommand } from './commands/start.js';
10
11
  import { stopCommand } from './commands/stop.js';
11
12
  import { statusCommand } from './commands/status.js';
@@ -71,7 +72,7 @@ export function createCli() {
71
72
  program
72
73
  .name('mcp-hub-lite')
73
74
  .description('Lightweight MCP Gateway for managing MCP servers')
74
- .version('1.0.0');
75
+ .version(process.env.npm_package_version ?? getAppVersion(), '-v, --version');
75
76
  // Register all core commands
76
77
  program.addCommand(startCommand);
77
78
  program.addCommand(stopCommand);
@@ -159,10 +159,19 @@ export declare function restartServer(options: ServerOptions): Promise<void>;
159
159
  export declare function listServers(): Promise<{
160
160
  instances: {
161
161
  id: string;
162
- timestamp: number;
163
- hash: string;
162
+ enabled: boolean;
163
+ args: string[];
164
+ env: Record<string, string>;
165
+ headers: Record<string, string>;
166
+ tags: Record<string, string>;
167
+ index?: number | undefined;
168
+ displayName?: string | undefined;
169
+ timestamp?: number | undefined;
164
170
  pid?: number | undefined;
165
171
  startTime?: number | undefined;
172
+ proxy?: {
173
+ url: string;
174
+ } | undefined;
166
175
  }[];
167
176
  name: string;
168
177
  config: import("../config/config-manager.js").ServerConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,iBAO5C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CjF;AAgED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW;;;;;;;;;;KAUhC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,iBAO5C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CjF;AAgED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW;;;;;;;;;;;;;;;;;;;KAUhC"}
@@ -3,6 +3,28 @@
3
3
  * Handles comparison and logging of configuration changes.
4
4
  */
5
5
  import type { SystemConfig } from './config.schema.js';
6
+ /**
7
+ * Gets the changes between two objects.
8
+ *
9
+ * This function performs a deep comparison of two objects
10
+ * and returns all changes at the field level.
11
+ *
12
+ * @param oldObj - The original object
13
+ * @param newObj - The new object
14
+ * @returns An array of change strings
15
+ */
16
+ export declare function getObjectChanges(oldObj: unknown, newObj: unknown): string[];
17
+ /**
18
+ * Logs object changes with a custom title.
19
+ *
20
+ * @param title - The title to display before the changes
21
+ * @param oldObj - The original object
22
+ * @param newObj - The new object
23
+ * @param logModule - The log module to use
24
+ */
25
+ export declare function logObjectChangesWithTitle(title: string, oldObj: unknown, newObj: unknown, logModule?: {
26
+ module: string;
27
+ }): void;
6
28
  /**
7
29
  * Logs the differences between two system configurations.
8
30
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config-change-logger.d.ts","sourceRoot":"","sources":["../../../../src/config/config-change-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI,CAoCvF"}
1
+ {"version":3,"file":"config-change-logger.d.ts","sourceRoot":"","sources":["../../../../src/config/config-change-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgGvD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAwC3E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,SAAS,GAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAA+B,GACzD,IAAI,CAON;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI,CAOvF"}
@@ -4,15 +4,102 @@
4
4
  */
5
5
  import { logger, LOG_MODULES } from '../utils/logger.js';
6
6
  /**
7
- * Logs the differences between two system configurations.
7
+ * Sensitive KEY patterns (case-insensitive).
8
+ * Fields whose key contains any of these patterns will have their values masked.
9
+ */
10
+ const SENSITIVE_KEY_PATTERNS = [
11
+ 'token',
12
+ 'key',
13
+ 'authorization',
14
+ 'secret',
15
+ 'password',
16
+ 'credential'
17
+ ];
18
+ /**
19
+ * Sensitive VALUE patterns.
20
+ * String values containing any of these patterns will be masked.
21
+ */
22
+ const SENSITIVE_VALUE_PATTERNS = ['Bearer', 'sk-', 'sk_', 'api_key', 'apikey'];
23
+ /**
24
+ * Checks if a key looks sensitive based on its name.
8
25
  *
9
- * This function performs a deep comparison of two configuration objects
10
- * and logs all changes at the field level for audit purposes.
26
+ * @param key - The key to check
27
+ * @returns True if the key is sensitive
28
+ */
29
+ function isSensitiveKey(key) {
30
+ const lowerKey = key.toLowerCase();
31
+ return SENSITIVE_KEY_PATTERNS.some((pattern) => lowerKey.includes(pattern));
32
+ }
33
+ /**
34
+ * Checks if a value looks sensitive based on its content.
11
35
  *
12
- * @param oldConfig - The original configuration
13
- * @param newConfig - The new configuration
36
+ * @param value - The value to check
37
+ * @returns True if the value is sensitive
14
38
  */
15
- export function logConfigChanges(oldConfig, newConfig) {
39
+ function isSensitiveValue(value) {
40
+ return SENSITIVE_VALUE_PATTERNS.some((pattern) => value.includes(pattern));
41
+ }
42
+ /**
43
+ * Masks a sensitive value while preserving partial visibility.
44
+ * - For values with length < 8: preserves first and last character
45
+ * - For values with length >= 8: preserves first 4 and last 4 characters
46
+ *
47
+ * @param value - The value to mask
48
+ * @returns The masked value
49
+ */
50
+ function maskSensitiveValue(value) {
51
+ if (value.length < 8) {
52
+ return value[0] + '****' + value[value.length - 1];
53
+ }
54
+ return value.substring(0, 4) + '********' + value.substring(value.length - 4);
55
+ }
56
+ /**
57
+ * Normalizes a URL string by removing trailing slashes.
58
+ *
59
+ * @param url - The URL to normalize
60
+ * @returns Normalized URL
61
+ */
62
+ function normalizeUrl(url) {
63
+ return url.replace(/\/+$/, '');
64
+ }
65
+ /**
66
+ * Checks if a path looks like a URL field.
67
+ *
68
+ * @param path - The field path to check
69
+ * @returns True if the path looks like a URL field
70
+ */
71
+ function isUrlField(path) {
72
+ const urlPatterns = [/\.url$/, /^url$/, /\.proxy\.url$/];
73
+ return urlPatterns.some((pattern) => pattern.test(path));
74
+ }
75
+ /**
76
+ * Compares two values with URL normalization support.
77
+ *
78
+ * @param val1 - First value
79
+ * @param val2 - Second value
80
+ * @param path - The field path for context
81
+ * @returns True if values are considered equal
82
+ */
83
+ function areValuesEqual(val1, val2, path) {
84
+ // Special handling for URL fields
85
+ if (isUrlField(path)) {
86
+ if (typeof val1 === 'string' && typeof val2 === 'string') {
87
+ return normalizeUrl(val1) === normalizeUrl(val2);
88
+ }
89
+ }
90
+ return JSON.stringify(val1) === JSON.stringify(val2);
91
+ }
92
+ /**
93
+ * Gets the changes between two objects.
94
+ *
95
+ * This function performs a deep comparison of two objects
96
+ * and returns all changes at the field level.
97
+ *
98
+ * @param oldObj - The original object
99
+ * @param newObj - The new object
100
+ * @returns An array of change strings
101
+ */
102
+ export function getObjectChanges(oldObj, newObj) {
16
103
  const changes = [];
17
104
  const compare = (obj1, obj2, path) => {
18
105
  const allKeys = new Set([...Object.keys(obj1 || {}), ...Object.keys(obj2 || {})]);
@@ -20,7 +107,7 @@ export function logConfigChanges(oldConfig, newConfig) {
20
107
  const currentPath = path ? `${path}.${key}` : key;
21
108
  const val1 = obj1 && typeof obj1 === 'object' ? obj1[key] : undefined;
22
109
  const val2 = obj2 && typeof obj2 === 'object' ? obj2[key] : undefined;
23
- if (JSON.stringify(val1) === JSON.stringify(val2))
110
+ if (areValuesEqual(val1, val2, currentPath))
24
111
  continue;
25
112
  if (typeof val1 === 'object' &&
26
113
  val1 !== null &&
@@ -31,13 +118,50 @@ export function logConfigChanges(oldConfig, newConfig) {
31
118
  compare(val1, val2, currentPath);
32
119
  }
33
120
  else {
34
- const formatVal = (v) => (v === undefined ? 'undefined' : JSON.stringify(v));
35
- changes.push(`${currentPath} = ${formatVal(val1)} -> ${formatVal(val2)}`);
121
+ const formatVal = (key, v) => {
122
+ if (v === undefined)
123
+ return 'undefined';
124
+ const str = JSON.stringify(v);
125
+ if (typeof v === 'string' && (isSensitiveKey(key) || isSensitiveValue(v))) {
126
+ return `"${maskSensitiveValue(v)}"`;
127
+ }
128
+ return str;
129
+ };
130
+ changes.push(`${currentPath} = ${formatVal(key, val1)} -> ${formatVal(key, val2)}`);
36
131
  }
37
132
  }
38
133
  };
39
- compare(oldConfig, newConfig, '');
134
+ compare(oldObj, newObj, '');
135
+ return changes;
136
+ }
137
+ /**
138
+ * Logs object changes with a custom title.
139
+ *
140
+ * @param title - The title to display before the changes
141
+ * @param oldObj - The original object
142
+ * @param newObj - The new object
143
+ * @param logModule - The log module to use
144
+ */
145
+ export function logObjectChangesWithTitle(title, oldObj, newObj, logModule = LOG_MODULES.CONFIG_CHANGES) {
146
+ const changes = getObjectChanges(oldObj, newObj);
147
+ if (changes.length > 0) {
148
+ const message = `${title}\n${changes.join('\n')}`;
149
+ logger.info(message, logModule);
150
+ }
151
+ }
152
+ /**
153
+ * Logs the differences between two system configurations.
154
+ *
155
+ * This function performs a deep comparison of two configuration objects
156
+ * and logs all changes at the field level for audit purposes.
157
+ *
158
+ * @param oldConfig - The original configuration
159
+ * @param newConfig - The new configuration
160
+ */
161
+ export function logConfigChanges(oldConfig, newConfig) {
162
+ const changes = getObjectChanges(oldConfig, newConfig);
40
163
  if (changes.length > 0) {
41
- logger.info(`${changes.join('\n')}`, LOG_MODULES.CONFIG_CHANGES);
164
+ const message = `System Config Changes:\n${changes.join('\n')}`;
165
+ logger.info(message, LOG_MODULES.CONFIG_CHANGES);
42
166
  }
43
167
  }
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Configuration loading utilities.
2
+ * Configuration loading utilities (v1.1 only).
3
3
  * Handles loading and parsing configuration from files with validation.
4
+ * Supports automatic migration from v1.0 to v1.1.
4
5
  */
5
6
  import type { SystemConfig } from './config.schema.js';
6
7
  /**
@@ -9,14 +10,14 @@ import type { SystemConfig } from './config.schema.js';
9
10
  * This function handles the complete configuration loading process:
10
11
  * - Checks if the config file exists at the specified path
11
12
  * - Reads and parses the JSON configuration
13
+ * - Detects legacy v1.0 configuration and auto-migrates to v1.1
12
14
  * - Performs type conversion for compatibility (e.g., 'http' to 'streamable-http')
13
15
  * - Validates the configuration using Zod schema
14
16
  * - Handles validation failures gracefully by falling back to default configuration
15
17
  *
16
- * If the config file doesn't exist or fails to load, a default configuration is returned.
17
- *
18
18
  * @param configPath - Path to the configuration file
19
- * @returns The loaded and validated system configuration
19
+ * @param autoMigrate - Whether to automatically migrate v1.0 to v1.1 (default: true)
20
+ * @returns The loaded and validated system configuration (v1.1 format)
20
21
  */
21
- export declare function loadConfig(configPath: string): SystemConfig;
22
+ export declare function loadConfig(configPath: string, autoMigrate?: boolean): SystemConfig;
22
23
  //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CA0C3D"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,GAAE,OAAc,GAAG,YAAY,CAoGxF"}
@@ -1,66 +1,104 @@
1
1
  /**
2
- * Configuration loading utilities.
2
+ * Configuration loading utilities (v1.1 only).
3
3
  * Handles loading and parsing configuration from files with validation.
4
+ * Supports automatic migration from v1.0 to v1.1.
4
5
  */
5
6
  import * as fs from 'fs';
6
7
  import { logger, LOG_MODULES } from '../utils/logger.js';
7
- import { SystemConfigSchema } from './config.schema.js';
8
+ import { SystemConfigSchema, isLegacyV1Config } from './config.schema.js';
9
+ import { migrateConfig } from './config-migrator.js';
8
10
  import { convertHttpToStreamableHttp } from './type-converter.js';
11
+ import { reassignServerInstanceIndexes } from './server-config-manager.js';
9
12
  /**
10
13
  * Loads configuration from the specified file path.
11
14
  *
12
15
  * This function handles the complete configuration loading process:
13
16
  * - Checks if the config file exists at the specified path
14
17
  * - Reads and parses the JSON configuration
18
+ * - Detects legacy v1.0 configuration and auto-migrates to v1.1
15
19
  * - Performs type conversion for compatibility (e.g., 'http' to 'streamable-http')
16
20
  * - Validates the configuration using Zod schema
17
21
  * - Handles validation failures gracefully by falling back to default configuration
18
22
  *
19
- * If the config file doesn't exist or fails to load, a default configuration is returned.
20
- *
21
23
  * @param configPath - Path to the configuration file
22
- * @returns The loaded and validated system configuration
24
+ * @param autoMigrate - Whether to automatically migrate v1.0 to v1.1 (default: true)
25
+ * @returns The loaded and validated system configuration (v1.1 format)
23
26
  */
24
- export function loadConfig(configPath) {
27
+ export function loadConfig(configPath, autoMigrate = true) {
25
28
  try {
26
29
  if (fs.existsSync(configPath)) {
27
30
  logger.info(`Loading configuration from: ${configPath}`, LOG_MODULES.CONFIG_MANAGER);
28
31
  const content = fs.readFileSync(configPath, 'utf-8');
29
32
  let config = JSON.parse(content);
33
+ // Check if automatic migration is enabled and config is legacy v1.0
34
+ if (autoMigrate && isLegacyV1Config(config)) {
35
+ logger.info('Detected legacy v1.0 configuration, starting automatic migration to v1.1', LOG_MODULES.CONFIG_MANAGER);
36
+ const migrationResult = migrateConfig(configPath, {
37
+ dryRun: false,
38
+ createBackup: true,
39
+ validateAfterMigration: true
40
+ });
41
+ if (migrationResult.success && migrationResult.migratedConfig) {
42
+ logger.info('Configuration successfully migrated to v1.1', LOG_MODULES.CONFIG_MANAGER);
43
+ if (migrationResult.backupPath) {
44
+ logger.info(`Backup created at: ${migrationResult.backupPath}`, LOG_MODULES.CONFIG_MANAGER);
45
+ }
46
+ config = migrationResult.migratedConfig;
47
+ }
48
+ else {
49
+ logger.warn(`Migration failed, continuing with default config: ${migrationResult.error}`, LOG_MODULES.CONFIG_MANAGER);
50
+ return SystemConfigSchema.parse({});
51
+ }
52
+ }
30
53
  // Unified type conversion: convert http to streamable-http
31
54
  config = convertHttpToStreamableHttp(config);
32
- // Ensure defaults without validation errors blocking
55
+ // Handle backward compatibility for instanceSelectionStrategy in root level
56
+ if (config.servers) {
57
+ for (const [serverName, serverConfig] of Object.entries(config.servers)) {
58
+ if (serverConfig &&
59
+ typeof serverConfig === 'object' &&
60
+ 'instanceSelectionStrategy' in serverConfig &&
61
+ serverConfig.instanceSelectionStrategy !== undefined) {
62
+ const legacyConfig = serverConfig;
63
+ const strategy = legacyConfig.instanceSelectionStrategy;
64
+ if (typeof strategy === 'string') {
65
+ legacyConfig.template.instanceSelectionStrategy = strategy;
66
+ }
67
+ delete legacyConfig.instanceSelectionStrategy;
68
+ logger.debug(`Migrated instanceSelectionStrategy for server ${serverName} to template`, LOG_MODULES.CONFIG_LOADER);
69
+ }
70
+ }
71
+ }
72
+ // Validate and return configuration
33
73
  try {
34
- // Use safeParse to validate configuration
35
74
  const parsed = SystemConfigSchema.safeParse(config);
36
75
  if (parsed.success) {
37
- // Ensure server configurations are sorted by name
38
76
  const configWithSortedServers = {
39
77
  ...parsed.data,
40
78
  servers: Object.fromEntries(Object.entries(parsed.data.servers).sort(([a], [b]) => a.localeCompare(b)))
41
79
  };
80
+ // Ensure all server instances have proper indexes
81
+ for (const serverName of Object.keys(configWithSortedServers.servers)) {
82
+ reassignServerInstanceIndexes(serverName, configWithSortedServers.servers);
83
+ }
42
84
  return configWithSortedServers;
43
85
  }
44
86
  else {
45
- // On validation failure, log error and use default configuration
46
- logger.error(`Config validation failed: ${parsed.error}`);
87
+ logger.error(`Config validation failed: ${parsed.error}`, LOG_MODULES.CONFIG_LOADER);
47
88
  return SystemConfigSchema.parse({});
48
89
  }
49
90
  }
50
91
  catch (e) {
51
- logger.error(`Failed to parse config: ${e}`);
52
- // On parsing failure, use default configuration
92
+ logger.error(`Failed to parse config: ${e}`, LOG_MODULES.CONFIG_LOADER);
53
93
  return SystemConfigSchema.parse({});
54
94
  }
55
95
  }
56
96
  else {
57
- // When config file doesn't exist, create default config in memory only
58
97
  return SystemConfigSchema.parse({});
59
98
  }
60
99
  }
61
100
  catch (error) {
62
- logger.error(`Failed to load config: ${error}`);
63
- // On config file load failure, use default configuration
101
+ logger.error(`Failed to load config: ${error}`, LOG_MODULES.CONFIG_LOADER);
64
102
  return SystemConfigSchema.parse({});
65
103
  }
66
104
  }