@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
@@ -2,8 +2,9 @@ import { hubManager } from '../../services/hub-manager.service.js';
2
2
  import { mcpConnectionManager } from '../../services/mcp-connection-manager.js';
3
3
  import { logger } from '../../utils/logger.js';
4
4
  import { LOG_MODULES } from '../../utils/logger/log-modules.js';
5
+ import { resolveInstanceConfig } from '../../config/config-migrator.js';
5
6
  /**
6
- * MCP Connection Status API Routes
7
+ * MCP Connection Status API Routes (v1.1 format)
7
8
  *
8
9
  * Provides real-time monitoring and management endpoints for MCP (Model Context Protocol) server connections.
9
10
  * This module enables administrators to check the health of connected servers, manage connection states,
@@ -33,16 +34,16 @@ export async function webMcpStatusRoutes(fastify) {
33
34
  fastify.get('/web/mcp/status', async (_request, reply) => {
34
35
  try {
35
36
  const servers = hubManager.getAllServers();
36
- const serverInstances = hubManager.getServerInstances();
37
37
  const statusList = [];
38
38
  servers.forEach((server) => {
39
- const instances = serverInstances[server.name] || [];
40
- instances.forEach((instance) => {
39
+ const instances = server.config.instances || [];
40
+ // If no instances, add a default disconnected entry for this server
41
+ if (instances.length === 0) {
41
42
  statusList.push({
42
- id: instance.id || '',
43
+ id: server.name,
43
44
  name: server.name,
44
- type: server.config.type,
45
- status: mcpConnectionManager.getStatus(instance.id || '') || {
45
+ type: server.config.template.type,
46
+ status: {
46
47
  connected: false,
47
48
  lastCheck: Date.now(),
48
49
  toolsCount: 0,
@@ -50,7 +51,25 @@ export async function webMcpStatusRoutes(fastify) {
50
51
  pid: undefined
51
52
  }
52
53
  });
53
- });
54
+ }
55
+ else {
56
+ // Add status for each instance
57
+ instances.forEach((instance) => {
58
+ const resolvedConfig = resolveInstanceConfig(server.config, instance.id);
59
+ statusList.push({
60
+ id: instance.id || '',
61
+ name: server.name,
62
+ type: resolvedConfig?.type || server.config.template.type,
63
+ status: mcpConnectionManager.getStatus(server.name, instance.index ?? 0) || {
64
+ connected: false,
65
+ lastCheck: Date.now(),
66
+ toolsCount: 0,
67
+ resourcesCount: 0,
68
+ pid: undefined
69
+ }
70
+ });
71
+ });
72
+ }
54
73
  });
55
74
  return statusList;
56
75
  }
@@ -62,19 +81,34 @@ export async function webMcpStatusRoutes(fastify) {
62
81
  // POST /web/mcp/servers/:id/connect - Connect to MCP server
63
82
  fastify.post('/web/mcp/servers/:id/connect', async (request, reply) => {
64
83
  try {
65
- const server = hubManager.getServerById(request.params.id);
66
- if (!server) {
84
+ const serverInfo = hubManager.getServerById(request.params.id);
85
+ if (!serverInfo) {
67
86
  return reply.code(404).send({ error: 'Server not found' });
68
87
  }
69
- const success = await mcpConnectionManager.connect({
70
- ...server.config,
71
- ...server.instance
72
- });
88
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverInfo.instance.id);
89
+ if (!resolvedConfig) {
90
+ return reply.code(404).send({ error: 'Server instance configuration not found' });
91
+ }
92
+ // Create a compatible config object with required instance fields
93
+ const connectConfig = {
94
+ ...resolvedConfig,
95
+ id: serverInfo.instance.id,
96
+ timestamp: Date.now(),
97
+ hash: '',
98
+ pid: undefined,
99
+ startTime: undefined,
100
+ index: serverInfo.instance.index,
101
+ displayName: serverInfo.instance.displayName
102
+ };
103
+ const instanceIndex = serverInfo.instance.index ?? 0;
104
+ const success = await mcpConnectionManager.connect(serverInfo.name, instanceIndex, connectConfig);
73
105
  if (!success) {
74
106
  return reply.code(500).send({ error: 'Failed to connect to server' });
75
107
  }
76
- // Update enabled status in config - The enabled field now belongs to server configuration, not instance configuration
77
- await hubManager.updateServer(server.name, { enabled: true });
108
+ // Note: Do NOT update the instance's enabled field here.
109
+ // The enabled field is a configuration parameter that should only be modified
110
+ // by the user explicitly via the configuration panel.
111
+ // Runtime connect/disconnect operations should not affect persistent configuration.
78
112
  return { success: true };
79
113
  }
80
114
  catch (error) {
@@ -85,13 +119,15 @@ export async function webMcpStatusRoutes(fastify) {
85
119
  // POST /web/mcp/servers/:id/disconnect - Disconnect from MCP server
86
120
  fastify.post('/web/mcp/servers/:id/disconnect', async (request, reply) => {
87
121
  try {
88
- await mcpConnectionManager.disconnect(request.params.id);
89
- // Update enabled status in config to ensure it doesn't show as "starting"
90
- // The enabled field now belongs to server configuration, not instance configuration
91
- const server = hubManager.getServerById(request.params.id);
92
- if (server) {
93
- await hubManager.updateServer(server.name, { enabled: false });
122
+ const serverInfo = hubManager.getServerById(request.params.id);
123
+ if (!serverInfo) {
124
+ return reply.code(404).send({ error: 'Server not found' });
94
125
  }
126
+ await mcpConnectionManager.disconnect(serverInfo.name, serverInfo.instance.index ?? 0);
127
+ // Note: Do NOT update the instance's enabled field here.
128
+ // The enabled field is a configuration parameter that should only be modified
129
+ // by the user explicitly via the configuration panel.
130
+ // Runtime connect/disconnect operations should not affect persistent configuration.
95
131
  return { success: true };
96
132
  }
97
133
  catch (error) {
@@ -99,11 +135,14 @@ export async function webMcpStatusRoutes(fastify) {
99
135
  return reply.code(500).send({ error: 'Internal Server Error' });
100
136
  }
101
137
  });
102
- // GET /web/mcp/servers/:id/tools - Get tools for a specific server
103
- fastify.get('/web/mcp/servers/:id/tools', async (request, reply) => {
138
+ // GET /web/mcp/servers/:name/tools - Get tools for a specific server
139
+ fastify.get('/web/mcp/servers/:name/tools', async (request, reply) => {
104
140
  try {
105
- logger.info(`API request tools for server: ${request.params.id}`, LOG_MODULES.MCP_STATUS);
106
- const tools = mcpConnectionManager.getTools(request.params.id);
141
+ const serverName = request.params.name;
142
+ logger.info(`API request tools for server: ${serverName}`, LOG_MODULES.MCP_STATUS);
143
+ // Use getToolsByServerName which queries serverNameToolCache
144
+ // This aggregates tools from all instances of the same server name
145
+ const tools = mcpConnectionManager.getToolsByServerName(serverName);
107
146
  return tools;
108
147
  }
109
148
  catch (error) {
@@ -111,11 +150,13 @@ export async function webMcpStatusRoutes(fastify) {
111
150
  return reply.code(500).send({ error: 'Internal Server Error' });
112
151
  }
113
152
  });
114
- // GET /web/mcp/servers/:id/resources - Get resources for a specific server
115
- fastify.get('/web/mcp/servers/:id/resources', async (request, reply) => {
153
+ // GET /web/mcp/servers/:name/resources - Get resources for a specific server
154
+ fastify.get('/web/mcp/servers/:name/resources', async (request, reply) => {
116
155
  try {
117
- logger.info(`API request resources for server: ${request.params.id}`, LOG_MODULES.MCP_STATUS);
118
- const resources = mcpConnectionManager.getResources(request.params.id);
156
+ const serverName = request.params.name;
157
+ logger.info(`API request resources for server: ${serverName}`, LOG_MODULES.MCP_STATUS);
158
+ // Use getResourcesByName which queries resourceCache by server name
159
+ const resources = mcpConnectionManager.getResourcesByName(serverName);
119
160
  return resources;
120
161
  }
121
162
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBA2E/D"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAkF/D"}
@@ -1,4 +1,3 @@
1
- import { mcpConnectionManager } from '../../services/mcp-connection-manager.js';
2
1
  import { hubToolsService } from '../../services/hub-tools.service.js';
3
2
  import { MCP_HUB_LITE_SERVER } from '../../models/system-tools.constants.js';
4
3
  /**
@@ -38,29 +37,44 @@ export async function webResourceRoutes(fastify) {
38
37
  // Handle system resources (mcp-hub-lite)
39
38
  if (name === MCP_HUB_LITE_SERVER) {
40
39
  const content = await hubToolsService.readResource(uri);
40
+ // Determine mimeType and format content appropriately
41
+ let mimeType = 'application/json';
42
+ let text;
43
+ // Use-guide is markdown
44
+ if (uri === 'hub://use-guide') {
45
+ mimeType = 'text/markdown';
46
+ text = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
47
+ }
48
+ else {
49
+ // Server metadata is JSON
50
+ mimeType = 'application/json';
51
+ text = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
52
+ }
41
53
  // Wrap content in MCP resource read format
42
54
  return {
43
55
  contents: [
44
56
  {
45
57
  uri,
46
- mimeType: 'application/json',
47
- text: JSON.stringify(content, null, 2)
58
+ mimeType,
59
+ text
48
60
  }
49
61
  ]
50
62
  };
51
63
  }
52
- // Find server ID
53
- const serverId = mcpConnectionManager.getServerIdByName(name);
54
- if (!serverId) {
55
- // Try using name directly as ID (unlikely but for robustness)
56
- if (mcpConnectionManager.getStatus(name)) {
57
- const result = await mcpConnectionManager.readResource(name, uri);
58
- return result;
64
+ // Use hubToolsService.readResource to handle Hub URI -> MCP URI conversion
65
+ // This properly maps hub://servers/{name}/{instanceIndex}/{mcpPath} to MCP native URI
66
+ try {
67
+ // hubToolsService.readResource already returns MCP format for forwarding case
68
+ return await hubToolsService.readResource(uri);
69
+ }
70
+ catch (error) {
71
+ const errorObj = error;
72
+ if (errorObj.message.includes('not found') ||
73
+ errorObj.message.includes('not connected')) {
74
+ return reply.code(404).send({ error: errorObj.message });
59
75
  }
60
- return reply.code(404).send({ error: 'Server not connected or not found' });
76
+ return reply.code(500).send({ error: errorObj.message });
61
77
  }
62
- const result = await mcpConnectionManager.readResource(serverId, uri);
63
- return result;
64
78
  }
65
79
  catch (error) {
66
80
  const errorObj = error;
@@ -69,20 +83,12 @@ export async function webResourceRoutes(fastify) {
69
83
  });
70
84
  fastify.get('/web/resources', async (_request, reply) => {
71
85
  try {
72
- const allResources = mcpConnectionManager.getAllResources();
73
- // Add Hub System resources
86
+ // Return only Hub System resources (dynamically generated hub:// format)
74
87
  const systemResources = await hubToolsService.listResources();
75
88
  const resources = {};
76
- // 1. Add Hub System resources first if they exist
77
89
  if (systemResources && systemResources.length > 0) {
78
90
  resources[MCP_HUB_LITE_SERVER] = systemResources;
79
91
  }
80
- // 2. Add other server resources, filtering out empty ones
81
- for (const [serverName, serverResources] of Object.entries(allResources)) {
82
- if (serverResources && serverResources.length > 0) {
83
- resources[serverName] = serverResources;
84
- }
85
- }
86
92
  return { resources };
87
93
  }
88
94
  catch (error) {
@@ -2,25 +2,11 @@ import { FastifyInstance } from 'fastify';
2
2
  /**
3
3
  * Tool Search API Routes
4
4
  *
5
- * Provides powerful fuzzy search capabilities for discovering tools across all connected MCP (Model Context Protocol) servers.
6
- * This module enables users to quickly find relevant tools based on name, description, or other metadata using
7
- * advanced search algorithms with pagination support.
8
- *
9
- * The search API supports flexible query parameters including result limits, offsets for pagination,
10
- * and various search modes. It integrates with the core search service to provide fast and accurate
11
- * tool discovery across the entire MCP ecosystem.
12
- *
13
- * Additionally includes a dedicated health check endpoint for monitoring the search service availability
14
- * in production environments.
5
+ * Provides simple string-based search for discovering tools across all connected MCP servers.
6
+ * Uses straightforward string matching on tool name and description.
15
7
  *
16
8
  * @param fastify - The Fastify instance to register routes on
17
9
  * @returns Promise that resolves when all routes are registered
18
- *
19
- * @example
20
- * ```typescript
21
- * // Register search routes
22
- * await webSearchRoutes(app);
23
- * ```
24
10
  */
25
11
  export declare function webSearchRoutes(fastify: FastifyInstance): Promise<void>;
26
12
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBA+C7D"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAsC7D"}
@@ -1,62 +1,41 @@
1
- import { searchCoreService } from '../../services/search/search-core.service.js';
1
+ import { mcpConnectionManager } from '../../services/mcp-connection-manager.js';
2
2
  /**
3
3
  * Tool Search API Routes
4
4
  *
5
- * Provides powerful fuzzy search capabilities for discovering tools across all connected MCP (Model Context Protocol) servers.
6
- * This module enables users to quickly find relevant tools based on name, description, or other metadata using
7
- * advanced search algorithms with pagination support.
8
- *
9
- * The search API supports flexible query parameters including result limits, offsets for pagination,
10
- * and various search modes. It integrates with the core search service to provide fast and accurate
11
- * tool discovery across the entire MCP ecosystem.
12
- *
13
- * Additionally includes a dedicated health check endpoint for monitoring the search service availability
14
- * in production environments.
5
+ * Provides simple string-based search for discovering tools across all connected MCP servers.
6
+ * Uses straightforward string matching on tool name and description.
15
7
  *
16
8
  * @param fastify - The Fastify instance to register routes on
17
9
  * @returns Promise that resolves when all routes are registered
18
- *
19
- * @example
20
- * ```typescript
21
- * // Register search routes
22
- * await webSearchRoutes(app);
23
- * ```
24
10
  */
25
11
  export async function webSearchRoutes(fastify) {
26
- // GET /web/search - Search for tools with query and optional filters
12
+ // GET /web/search - Search for tools with simple string matching
27
13
  fastify.get('/web/search', async (request) => {
28
- const { q, limit, offset } = request.query;
29
- // Parse search options
30
- const options = {
31
- mode: 'fuzzy',
32
- limit: limit ? Number(limit) : 50,
33
- offset: offset ? Number(offset) : 0,
34
- filters: {}
35
- };
36
- // Perform search
37
- const results = await searchCoreService.search(q || '', options);
14
+ const { q, limit = 50 } = request.query;
15
+ const allTools = mcpConnectionManager.getAllTools();
16
+ const query = q?.toLowerCase() || '';
17
+ const filtered = allTools.filter((tool) => {
18
+ if (!query)
19
+ return true;
20
+ const nameMatch = tool.name.toLowerCase().includes(query);
21
+ const descMatch = tool.description?.toLowerCase().includes(query);
22
+ return nameMatch || descMatch;
23
+ });
24
+ const results = filtered.slice(0, limit);
38
25
  return {
39
- results,
26
+ results: results.map((tool) => ({
27
+ name: tool.name,
28
+ description: tool.description,
29
+ serverName: tool.serverName
30
+ })),
40
31
  pagination: {
41
- total: results.length,
42
- limit: options.limit,
43
- offset: options.offset,
44
- hasMore: results.length >= options.limit
32
+ total: filtered.length,
33
+ limit,
34
+ returned: results.length
45
35
  },
46
36
  metadata: {
47
- query: q,
48
- filters: options.filters,
49
- processingTime: 0, // To be implemented: measure processing time
50
- cached: false // To be implemented: check cache status
37
+ query: q
51
38
  }
52
39
  };
53
40
  });
54
- // GET /web/search/health - Search service health check (for monitoring)
55
- fastify.get('/web/search/health', async () => {
56
- return {
57
- status: 'healthy',
58
- timestamp: new Date().toISOString(),
59
- service: 'search-core-service'
60
- };
61
- });
62
41
  }
@@ -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 +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":"AA4BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAoE7B"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAmE7B"}
@@ -15,7 +15,6 @@ 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
17
  import { webResourceRoutes } from './api/web/resources.js';
18
- import { webSessionRoutes } from './api/web/sessions.js';
19
18
  // WebSocket Routes
20
19
  import { webSocketRoutes } from './api/ws/events.js';
21
20
  // Get __dirname equivalent in ESM
@@ -77,7 +76,6 @@ export async function buildApp() {
77
76
  fastify.register(webLogRoutes);
78
77
  fastify.register(webHubToolsRoutes);
79
78
  fastify.register(webResourceRoutes);
80
- fastify.register(webSessionRoutes);
81
79
  fastify.register(webSocketRoutes);
82
80
  // Serve static files from dist/client (frontend build output)
83
81
  const clientPath = path.join(__dirname, '../../client');