@loop_ouroboros/mcp-hub-lite 1.0.1 → 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 (374) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/client/assets/{HomeView-Cr1jX73N.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-Bp9Rjwd7.js +1 -0
  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-Csv24uBk.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-CqPQN3XP.js +1 -0
  39. package/dist/client/assets/{raf-DDfJOMYh.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 +363 -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 +2 -56
  48. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  49. package/dist/server/shared/models/session.model.js +2 -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/client.types.d.ts +4 -32
  53. package/dist/server/shared/types/client.types.d.ts.map +1 -1
  54. package/dist/server/shared/types/client.types.js +3 -2
  55. package/dist/server/shared/types/index.d.ts +3 -3
  56. package/dist/server/shared/types/index.d.ts.map +1 -1
  57. package/dist/server/shared/types/index.js +3 -3
  58. package/dist/server/shared/types/session-context.types.d.ts +35 -0
  59. package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
  60. package/dist/server/shared/types/session-context.types.js +5 -0
  61. package/dist/server/shared/types/websocket.types.d.ts +17 -10
  62. package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
  63. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -1
  64. package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -1
  65. package/dist/server/src/api/mcp/gateway.d.ts +1 -3
  66. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  67. package/dist/server/src/api/mcp/gateway.js +34 -61
  68. package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
  69. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  70. package/dist/server/src/api/mcp/session-context-extractor.js +15 -39
  71. package/dist/server/src/api/web/clients.js +2 -2
  72. package/dist/server/src/api/web/hub-tools.d.ts +2 -2
  73. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  74. package/dist/server/src/api/web/hub-tools.js +3 -54
  75. package/dist/server/src/api/web/mcp-status.d.ts +1 -1
  76. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
  77. package/dist/server/src/api/web/mcp-status.js +71 -30
  78. package/dist/server/src/api/web/resources.d.ts.map +1 -1
  79. package/dist/server/src/api/web/resources.js +28 -22
  80. package/dist/server/src/api/web/search.d.ts +2 -16
  81. package/dist/server/src/api/web/search.d.ts.map +1 -1
  82. package/dist/server/src/api/web/search.js +24 -45
  83. package/dist/server/src/api/web/servers.d.ts +3 -3
  84. package/dist/server/src/api/web/servers.d.ts.map +1 -1
  85. package/dist/server/src/api/web/servers.js +70 -25
  86. package/dist/server/src/api/web/sessions.js +1 -1
  87. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
  88. package/dist/server/src/api/ws/ws-handler.js +4 -2
  89. package/dist/server/src/app.d.ts.map +1 -1
  90. package/dist/server/src/app.js +0 -4
  91. package/dist/server/src/cli/commands/list.js +2 -2
  92. package/dist/server/src/cli/commands/status.d.ts.map +1 -1
  93. package/dist/server/src/cli/commands/status.js +41 -30
  94. package/dist/server/src/cli/index.d.ts.map +1 -1
  95. package/dist/server/src/cli/index.js +2 -1
  96. package/dist/server/src/cli/server.d.ts +11 -2
  97. package/dist/server/src/cli/server.d.ts.map +1 -1
  98. package/dist/server/src/config/config-change-logger.d.ts +22 -0
  99. package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
  100. package/dist/server/src/config/config-change-logger.js +135 -11
  101. package/dist/server/src/config/config-loader.d.ts +6 -5
  102. package/dist/server/src/config/config-loader.d.ts.map +1 -1
  103. package/dist/server/src/config/config-loader.js +54 -16
  104. package/dist/server/src/config/config-manager.d.ts +51 -43
  105. package/dist/server/src/config/config-manager.d.ts.map +1 -1
  106. package/dist/server/src/config/config-manager.js +84 -66
  107. package/dist/server/src/config/config-migrator.d.ts +82 -0
  108. package/dist/server/src/config/config-migrator.d.ts.map +1 -0
  109. package/dist/server/src/config/config-migrator.js +348 -0
  110. package/dist/server/src/config/config-saver.d.ts +2 -0
  111. package/dist/server/src/config/config-saver.d.ts.map +1 -1
  112. package/dist/server/src/config/config-saver.js +8 -2
  113. package/dist/server/src/config/config.schema.d.ts +10 -102
  114. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  115. package/dist/server/src/config/config.schema.js +15 -98
  116. package/dist/server/src/config/path-validator.d.ts +27 -0
  117. package/dist/server/src/config/path-validator.d.ts.map +1 -0
  118. package/dist/server/src/config/path-validator.js +53 -0
  119. package/dist/server/src/config/server-config-manager.d.ts +37 -31
  120. package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
  121. package/dist/server/src/config/server-config-manager.js +222 -66
  122. package/dist/server/src/config/type-converter.d.ts.map +1 -1
  123. package/dist/server/src/config/type-converter.js +3 -2
  124. package/dist/server/src/index.js +1 -1
  125. package/dist/server/src/models/event.model.d.ts +17 -10
  126. package/dist/server/src/models/event.model.d.ts.map +1 -1
  127. package/dist/server/src/models/server.model.d.ts +17 -3
  128. package/dist/server/src/models/server.model.d.ts.map +1 -1
  129. package/dist/server/src/models/server.model.js +2 -1
  130. package/dist/server/src/models/system-tools.constants.d.ts +10 -27
  131. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  132. package/dist/server/src/models/system-tools.constants.js +4 -8
  133. package/dist/server/src/pid/manager.d.ts.map +1 -1
  134. package/dist/server/src/pid/manager.js +2 -1
  135. package/dist/server/src/server/dev-server.js +34 -20
  136. package/dist/server/src/server/runner.d.ts.map +1 -1
  137. package/dist/server/src/server/runner.js +41 -26
  138. package/dist/server/src/services/client-tracker.service.d.ts +3 -128
  139. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
  140. package/dist/server/src/services/client-tracker.service.js +4 -200
  141. package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
  142. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  143. package/dist/server/src/services/connection/connection-manager.js +286 -241
  144. package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
  145. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  146. package/dist/server/src/services/connection/tool-cache.js +50 -55
  147. package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
  148. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  149. package/dist/server/src/services/gateway/gateway.service.js +15 -19
  150. package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
  151. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
  152. package/dist/server/src/services/gateway/global-transport.js +42 -0
  153. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  154. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
  155. package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
  156. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
  157. package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
  158. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
  159. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  160. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +16 -55
  161. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
  162. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
  163. package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
  164. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  165. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
  166. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  167. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
  168. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
  169. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
  170. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  171. package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
  172. package/dist/server/src/services/gateway/types.d.ts +2 -1
  173. package/dist/server/src/services/gateway/types.d.ts.map +1 -1
  174. package/dist/server/src/services/hub-manager.service.d.ts +32 -238
  175. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  176. package/dist/server/src/services/hub-manager.service.js +89 -267
  177. package/dist/server/src/services/hub-tools/index.d.ts +1 -3
  178. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  179. package/dist/server/src/services/hub-tools/index.js +1 -2
  180. package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
  181. package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
  182. package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
  183. package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
  184. package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
  185. package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
  186. package/dist/server/src/services/hub-tools/resource-generator.d.ts +25 -5
  187. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  188. package/dist/server/src/services/hub-tools/resource-generator.js +259 -64
  189. package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
  190. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  191. package/dist/server/src/services/hub-tools/server-selector.js +44 -37
  192. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
  193. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  194. package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
  195. package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
  196. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
  197. package/dist/server/src/services/hub-tools/tool-search.js +10 -4
  198. package/dist/server/src/services/hub-tools/types.d.ts +2 -2
  199. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
  200. package/dist/server/src/services/hub-tools.service.d.ts +43 -72
  201. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  202. package/dist/server/src/services/hub-tools.service.js +185 -110
  203. package/dist/server/src/services/search/search-cache.d.ts +0 -19
  204. package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
  205. package/dist/server/src/services/search/search-cache.js +0 -24
  206. package/dist/server/src/services/search/search-core.service.d.ts +5 -5
  207. package/dist/server/src/services/search/search-core.service.js +11 -11
  208. package/dist/server/src/services/session/session-manager.d.ts +12 -256
  209. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  210. package/dist/server/src/services/session/session-manager.js +23 -583
  211. package/dist/server/src/services/session-tracker.service.d.ts +124 -0
  212. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
  213. package/dist/server/src/services/session-tracker.service.js +176 -0
  214. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  215. package/dist/server/src/services/system-tool-handler.js +7 -17
  216. package/dist/server/src/utils/composite-key.d.ts +29 -0
  217. package/dist/server/src/utils/composite-key.d.ts.map +1 -0
  218. package/dist/server/src/utils/composite-key.js +39 -0
  219. package/dist/server/src/utils/error-handler.d.ts.map +1 -1
  220. package/dist/server/src/utils/error-handler.js +3 -2
  221. package/dist/server/src/utils/index.d.ts +2 -0
  222. package/dist/server/src/utils/index.d.ts.map +1 -1
  223. package/dist/server/src/utils/index.js +2 -0
  224. package/dist/server/src/utils/instance-id.d.ts +22 -0
  225. package/dist/server/src/utils/instance-id.d.ts.map +1 -0
  226. package/dist/server/src/utils/instance-id.js +59 -0
  227. package/dist/server/src/utils/json-utils.d.ts +4 -4
  228. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  229. package/dist/server/src/utils/json-utils.js +10 -4
  230. package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
  231. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
  232. package/dist/server/src/utils/logger/log-colors.d.ts +1 -0
  233. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
  234. package/dist/server/src/utils/logger/log-colors.js +2 -1
  235. package/dist/server/src/utils/logger/log-context.d.ts +1 -0
  236. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
  237. package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
  238. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  239. package/dist/server/src/utils/logger/log-formatter.js +287 -5
  240. package/dist/server/src/utils/logger/log-modules.d.ts +15 -12
  241. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  242. package/dist/server/src/utils/logger/log-modules.js +8 -8
  243. package/dist/server/src/utils/logger/log-output.d.ts +2 -2
  244. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
  245. package/dist/server/src/utils/logger/log-output.js +27 -6
  246. package/dist/server/src/utils/logger/logger.d.ts +13 -0
  247. package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
  248. package/dist/server/src/utils/logger/logger.js +42 -7
  249. package/dist/server/src/utils/parameter-validator.d.ts +10 -0
  250. package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
  251. package/dist/server/src/utils/parameter-validator.js +53 -0
  252. package/dist/server/src/utils/process-tree.d.ts +49 -0
  253. package/dist/server/src/utils/process-tree.d.ts.map +1 -0
  254. package/dist/server/src/utils/process-tree.js +285 -0
  255. package/dist/server/src/utils/request-context.d.ts +12 -30
  256. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  257. package/dist/server/src/utils/request-context.js +10 -30
  258. package/dist/server/src/utils/sort-utils.d.ts +40 -0
  259. package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
  260. package/dist/server/src/utils/sort-utils.js +131 -0
  261. package/dist/server/src/utils/tool-args-parser.d.ts +0 -4
  262. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
  263. package/dist/server/src/utils/tool-args-parser.js +0 -7
  264. package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
  265. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
  266. package/dist/server/src/utils/transports/sse-transport.js +55 -9
  267. package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
  268. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  269. package/dist/server/src/utils/transports/stdio-transport.js +66 -247
  270. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
  271. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
  272. package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
  273. package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
  274. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  275. package/dist/server/src/utils/transports/transport-factory.js +33 -13
  276. package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
  277. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
  278. package/dist/server/src/utils/version.d.ts +11 -0
  279. package/dist/server/src/utils/version.d.ts.map +1 -0
  280. package/dist/server/src/utils/version.js +57 -0
  281. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
  282. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
  283. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
  284. package/dist/server/tests/evaluation/evaluation.test.js +10 -9
  285. package/dist/server/tests/integration/api/gateway.test.js +24 -39
  286. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
  287. package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
  288. package/dist/server/tests/server.test.js +27 -16
  289. package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
  290. package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
  291. package/dist/server/tests/temp/temp-run-docling.js +53 -0
  292. package/dist/server/tests/temp/test-stack.d.ts +6 -0
  293. package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
  294. package/dist/server/tests/temp/test-stack.js +40 -0
  295. package/dist/server/tests/types/test-helpers.d.ts +1 -2
  296. package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
  297. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
  298. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
  299. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
  300. package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
  301. package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
  302. package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
  303. package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
  304. package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
  305. package/dist/server/tests/unit/config/config-saver.test.js +200 -0
  306. package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
  307. package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
  308. package/dist/server/tests/unit/config/config.schema.test.js +347 -0
  309. package/dist/server/tests/unit/server/runner.test.js +86 -62
  310. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
  311. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
  312. package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
  313. package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
  314. package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
  315. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
  316. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
  317. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
  318. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
  319. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
  320. package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
  321. package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -334
  322. package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
  323. package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
  324. package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
  325. package/dist/server/tests/unit/services/session-manager.test.js +26 -436
  326. package/dist/server/tests/unit/utils/config.test.js +88 -186
  327. package/dist/server/tests/unit/utils/json-utils.test.js +107 -13
  328. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
  329. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
  330. package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
  331. package/dist/server/tests/unit/utils/logger.test.js +101 -0
  332. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
  333. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
  334. package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
  335. package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
  336. package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
  337. package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
  338. package/dist/server/tests/unit/utils/request-context.test.js +9 -28
  339. package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
  340. package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
  341. package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
  342. package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
  343. package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
  344. package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
  345. package/package.json +1 -1
  346. package/dist/client/assets/ResourceDetailView-BQ49hk0c.js +0 -1
  347. package/dist/client/assets/ResourcesView-BYZfWtia.js +0 -1
  348. package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
  349. package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +0 -1
  350. package/dist/client/assets/ServerDashboard-DHcxwKeh.js +0 -2
  351. package/dist/client/assets/ServerListView-DralUL71.js +0 -30
  352. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
  353. package/dist/client/assets/SessionsView-BCGRTqem.js +0 -1
  354. package/dist/client/assets/SettingsView-BLfxa6PZ.js +0 -1
  355. package/dist/client/assets/ToolCallDialog-DQ0OQ1mD.js +0 -1
  356. package/dist/client/assets/ToolsView-BLB6x3tC.js +0 -1
  357. package/dist/client/assets/_baseClone-Bo5mBgsT.js +0 -1
  358. package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
  359. package/dist/client/assets/el-form-item-BmeJKVSi.js +0 -12
  360. package/dist/client/assets/el-input-CeZiq23m.js +0 -1
  361. package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
  362. package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
  363. package/dist/client/assets/el-overlay-iw_hrrlC.js +0 -1
  364. package/dist/client/assets/el-select-B73uRP_Y.js +0 -1
  365. package/dist/client/assets/el-tab-pane-BgOTBn4X.js +0 -1
  366. package/dist/client/assets/el-table-column-Ld4GSD3x.js +0 -1
  367. package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
  368. package/dist/client/assets/el-tag-DYmSo8Bx.js +0 -1
  369. package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
  370. package/dist/client/assets/index-COYaYRbH.js +0 -1
  371. package/dist/client/assets/index-Cfcvxyee.js +0 -2
  372. package/dist/client/assets/index-PhuI36Zi.js +0 -1
  373. package/dist/client/assets/omit-7EL6VJO4.js +0 -1
  374. package/dist/client/assets/vnode-upjuIlvm.js +0 -1
@@ -1,18 +1,18 @@
1
1
  import { FastifyInstance } from 'fastify';
2
2
  /**
3
- * MCP Server Management API Routes
3
+ * MCP Server Management API Routes (v1.1 format)
4
4
  *
5
5
  * Provides comprehensive CRUD (Create, Read, Update, Delete) operations for managing MCP (Model Context Protocol) servers
6
6
  * and their runtime instances within the MCP Hub Lite system. This module serves as the primary interface for
7
7
  * server configuration management, process control, and bulk operations.
8
8
  *
9
- * The API supports both static server configuration (defining how servers should be configured) and dynamic
9
+ * The API supports both static server template configuration and dynamic
10
10
  * instance management (controlling actual running server processes). It includes sophisticated validation
11
11
  * using Zod schemas to ensure configuration integrity and provides detailed error handling with appropriate
12
12
  * HTTP status codes.
13
13
  *
14
14
  * Key features include:
15
- * - Full CRUD operations for server configurations
15
+ * - Full CRUD operations for server templates
16
16
  * - Instance-level management for running server processes
17
17
  * - Batch import/export capabilities for server configurations
18
18
  * - Automatic server startup based on enabled status
@@ -1 +1 @@
1
- {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/servers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAY1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBA4O7D"}
1
+ {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/servers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmB1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAwS7D"}
@@ -1,21 +1,27 @@
1
1
  import { z } from 'zod';
2
2
  import { hubManager } from '../../services/hub-manager.service.js';
3
- import { ServerConfigSchema, ServerInstanceConfigSchema } from '../../config/config.schema.js';
3
+ import { ServerTemplateSchema, ServerInstanceUpdateSchema } from '../../config/config.schema.js';
4
4
  import { logger } from '../../utils/logger.js';
5
+ import { LOG_MODULES } from '../../utils/logger/log-modules.js';
6
+ import { stringifyForLogging, getApiDebugSetting } from '../../utils/json-utils.js';
5
7
  /**
6
- * MCP Server Management API Routes
8
+ * Server update schema that supports template fields
9
+ */
10
+ const ServerUpdateSchema = ServerTemplateSchema.partial();
11
+ /**
12
+ * MCP Server Management API Routes (v1.1 format)
7
13
  *
8
14
  * Provides comprehensive CRUD (Create, Read, Update, Delete) operations for managing MCP (Model Context Protocol) servers
9
15
  * and their runtime instances within the MCP Hub Lite system. This module serves as the primary interface for
10
16
  * server configuration management, process control, and bulk operations.
11
17
  *
12
- * The API supports both static server configuration (defining how servers should be configured) and dynamic
18
+ * The API supports both static server template configuration and dynamic
13
19
  * instance management (controlling actual running server processes). It includes sophisticated validation
14
20
  * using Zod schemas to ensure configuration integrity and provides detailed error handling with appropriate
15
21
  * HTTP status codes.
16
22
  *
17
23
  * Key features include:
18
- * - Full CRUD operations for server configurations
24
+ * - Full CRUD operations for server templates
19
25
  * - Instance-level management for running server processes
20
26
  * - Batch import/export capabilities for server configurations
21
27
  * - Automatic server startup based on enabled status
@@ -47,34 +53,44 @@ export async function webServerRoutes(fastify) {
47
53
  });
48
54
  // GET /web/server-instances
49
55
  fastify.get('/web/server-instances', async () => {
50
- return hubManager.getServerInstances();
56
+ const allServers = hubManager.getAllServers();
57
+ const instances = {};
58
+ for (const { name, config } of allServers) {
59
+ instances[name] = config.instances;
60
+ }
61
+ return instances;
51
62
  });
52
63
  // GET /web/server-instances/:name
53
64
  fastify.get('/web/server-instances/:name', async (request, reply) => {
54
- const instances = hubManager.getServerInstanceByName(request.params.name);
65
+ const instances = hubManager.getServerInstancesByName(request.params.name);
55
66
  if (instances.length === 0) {
56
- return reply.code(404).send({ error: 'Server instances not found' });
67
+ // Check if server exists but has no instances
68
+ const server = hubManager.getServerByName(request.params.name);
69
+ if (!server) {
70
+ return reply.code(404).send({ error: 'Server not found' });
71
+ }
57
72
  }
58
73
  return instances;
59
74
  });
60
75
  // POST /web/servers
61
76
  fastify.post('/web/servers', async (request, reply) => {
62
77
  try {
63
- // Accept server name and configuration as request body
78
+ // Accept server name and template configuration as request body
64
79
  const postSchema = z.object({
65
80
  name: z.string().min(1).max(100),
66
- config: ServerConfigSchema.partial()
81
+ config: ServerTemplateSchema.partial()
67
82
  });
68
83
  const body = postSchema.parse(request.body);
69
84
  const newServer = await hubManager.addServer(body.name, body.config);
70
- // If auto-start is enabled, add server instance (addServerInstance will automatically check and handle startup)
71
- if (newServer.enabled !== false && newServer.enabled !== undefined) {
85
+ // If auto-start is enabled, check if we need to start the instance
86
+ const firstInstance = newServer.instances[0];
87
+ if (firstInstance && firstInstance.enabled !== false) {
72
88
  try {
73
- await hubManager.addServerInstance(body.name, {});
89
+ // Instance is already created by addServer, no need to create again
74
90
  }
75
91
  catch (error) {
76
92
  // Auto-start failure does not affect server addition operation
77
- logger.warn(`Failed to auto-start server instance for ${body.name}:`, error);
93
+ logger.warn(`Failed to auto-start server instance for ${body.name}:`, error, LOG_MODULES.SERVER_API);
78
94
  }
79
95
  }
80
96
  return reply.code(201).send({ name: body.name, config: newServer });
@@ -89,8 +105,13 @@ export async function webServerRoutes(fastify) {
89
105
  // POST /web/server-instances/:name
90
106
  fastify.post('/web/server-instances/:name', async (request, reply) => {
91
107
  try {
92
- const instanceSchema = ServerInstanceConfigSchema.partial();
93
- const body = instanceSchema.parse(request.body);
108
+ if (getApiDebugSetting()) {
109
+ logger.debug(`[API] POST /web/server-instances/${request.params.name} - raw body: ${stringifyForLogging(request.body)}`, LOG_MODULES.SERVER_API);
110
+ }
111
+ const body = ServerInstanceUpdateSchema.parse(request.body);
112
+ if (getApiDebugSetting()) {
113
+ logger.debug(`[API] POST /web/server-instances/${request.params.name} - parsed body: ${stringifyForLogging(body)}`, LOG_MODULES.SERVER_API);
114
+ }
94
115
  // Check if server exists
95
116
  const server = hubManager.getServerByName(request.params.name);
96
117
  if (!server) {
@@ -109,9 +130,10 @@ export async function webServerRoutes(fastify) {
109
130
  // PUT /web/servers/:name
110
131
  fastify.put('/web/servers/:name', async (request, reply) => {
111
132
  try {
112
- const partialSchema = ServerConfigSchema.partial();
113
- const body = partialSchema.parse(request.body);
114
- const updatedServer = await hubManager.updateServer(request.params.name, body);
133
+ const body = ServerUpdateSchema.parse(request.body);
134
+ // Update server template (includes instanceSelectionStrategy in template)
135
+ await hubManager.updateServer(request.params.name, body);
136
+ const updatedServer = hubManager.getServerByName(request.params.name);
115
137
  if (!updatedServer) {
116
138
  return reply.code(404).send({ error: 'Server not found' });
117
139
  }
@@ -127,8 +149,13 @@ export async function webServerRoutes(fastify) {
127
149
  // PUT /web/server-instances/:name/:index
128
150
  fastify.put('/web/server-instances/:name/:index', async (request, reply) => {
129
151
  try {
130
- const partialSchema = ServerInstanceConfigSchema.partial();
131
- const body = partialSchema.parse(request.body);
152
+ if (getApiDebugSetting()) {
153
+ logger.debug(`[API] PUT /web/server-instances/${request.params.name}/${request.params.index} - raw body: ${stringifyForLogging(request.body)}`, LOG_MODULES.SERVER_API);
154
+ }
155
+ const body = ServerInstanceUpdateSchema.parse(request.body);
156
+ if (getApiDebugSetting()) {
157
+ logger.debug(`[API] PUT /web/server-instances/${request.params.name}/${request.params.index} - parsed body: ${stringifyForLogging(body)}`, LOG_MODULES.SERVER_API);
158
+ }
132
159
  await hubManager.updateServerInstance(request.params.name, request.params.index, body);
133
160
  return reply.code(200).send({ message: 'Server instance updated' });
134
161
  }
@@ -160,6 +187,24 @@ export async function webServerRoutes(fastify) {
160
187
  return reply.code(500).send({ error: 'Internal Server Error' });
161
188
  }
162
189
  });
190
+ // POST /web/server-instances/:name/reassign-indexes
191
+ fastify.post('/web/server-instances/:name/reassign-indexes', async (request, reply) => {
192
+ try {
193
+ // Check if server exists
194
+ const server = hubManager.getServerByName(request.params.name);
195
+ if (!server) {
196
+ return reply.code(404).send({ error: 'Server not found' });
197
+ }
198
+ const success = await hubManager.reassignInstanceIndexes(request.params.name);
199
+ if (!success) {
200
+ return reply.code(404).send({ error: 'No server instances found' });
201
+ }
202
+ return reply.code(200).send({ message: 'Server instance indexes reassigned successfully' });
203
+ }
204
+ catch {
205
+ return reply.code(500).send({ error: 'Internal Server Error' });
206
+ }
207
+ });
163
208
  // POST /web/servers/batch
164
209
  fastify.post('/web/servers/batch', async (request, reply) => {
165
210
  try {
@@ -167,7 +212,7 @@ export async function webServerRoutes(fastify) {
167
212
  const batchSchema = z.object({
168
213
  mcpServers: z.array(z.object({
169
214
  name: z.string().min(1).max(100),
170
- config: ServerConfigSchema.partial()
215
+ config: ServerTemplateSchema.partial()
171
216
  }))
172
217
  });
173
218
  const body = batchSchema.parse(request.body);
@@ -192,11 +237,11 @@ export async function webServerRoutes(fastify) {
192
237
  continue;
193
238
  }
194
239
  // Validate server configuration using Zod (now supports "http" type)
195
- const validatedConfig = ServerConfigSchema.partial().parse(serverConfig);
240
+ const validatedConfig = ServerTemplateSchema.partial().parse(serverConfig);
196
241
  serversToAdd.push({ name: processedName, config: validatedConfig });
197
- if (validatedConfig.enabled !== false && validatedConfig.enabled !== undefined) {
198
- serversToConnect.push(processedName);
199
- }
242
+ // In v1.1, enabled is at instance level, not template level
243
+ // We'll connect all instances by default
244
+ serversToConnect.push(processedName);
200
245
  results.success.push({ name: processedName, config: validatedConfig });
201
246
  existingNames.add(processedName); // Prevent duplicates within the same batch
202
247
  }
@@ -1,4 +1,4 @@
1
- import { mcpSessionManager } from '../../services/mcp-session-manager.js';
1
+ import { mcpSessionManager } from '../../services/session/index.js';
2
2
  import { logger, LOG_MODULES } from '../../utils/logger.js';
3
3
  /**
4
4
  * Session Management API Routes
@@ -1 +1 @@
1
- {"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../../../../../src/api/ws/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAc,MAAM,gCAAgC,CAAC;AAgC7E,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,iBAAiB,CAAC,CAAiB;gBAGjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe;IAGnC;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,IAAI;IAMZ;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,aAAa;CAKtB"}
1
+ {"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../../../../../src/api/ws/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAc,MAAM,gCAAgC,CAAC;AAgC7E,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,iBAAiB,CAAC,CAAiB;gBAGjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe;IAGnC;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,IAAI;IAMZ;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,aAAa;CAKtB"}
@@ -99,14 +99,16 @@ export class WebSocketHandler {
99
99
  * Handle fetch historical logs request
100
100
  */
101
101
  handleFetchLogs(message) {
102
- const logs = logStorage.getLogs(message.serverId, {
102
+ const compositeKey = `${message.serverName}-${message.serverIndex}`;
103
+ const logs = logStorage.getLogs(compositeKey, {
103
104
  limit: message.limit || 100,
104
105
  since: message.since
105
106
  });
106
107
  this.send({
107
108
  type: 'log',
108
109
  data: {
109
- serverId: message.serverId,
110
+ serverName: message.serverName,
111
+ serverIndex: message.serverIndex,
110
112
  logs: logs
111
113
  }
112
114
  });
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAqE7B"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAmE7B"}
@@ -14,9 +14,7 @@ import { webMcpStatusRoutes } from './api/web/mcp-status.js';
14
14
  import { configRoutes } from './api/web/config.js';
15
15
  import { webLogRoutes } from './api/web/logs.js';
16
16
  import { webHubToolsRoutes } from './api/web/hub-tools.js';
17
- import { webClientRoutes } from './api/web/clients.js';
18
17
  import { webResourceRoutes } from './api/web/resources.js';
19
- import { webSessionRoutes } from './api/web/sessions.js';
20
18
  // WebSocket Routes
21
19
  import { webSocketRoutes } from './api/ws/events.js';
22
20
  // Get __dirname equivalent in ESM
@@ -77,9 +75,7 @@ export async function buildApp() {
77
75
  fastify.register(configRoutes);
78
76
  fastify.register(webLogRoutes);
79
77
  fastify.register(webHubToolsRoutes);
80
- fastify.register(webClientRoutes);
81
78
  fastify.register(webResourceRoutes);
82
- fastify.register(webSessionRoutes);
83
79
  fastify.register(webSocketRoutes);
84
80
  // Serve static files from dist/client (frontend build output)
85
81
  const clientPath = path.join(__dirname, '../../client');
@@ -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
  }