@loop_ouroboros/mcp-hub-lite 1.0.2 → 1.1.1

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 (322) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/client/assets/{HomeView-7rMg9C6t.js → HomeView-BBwvy1oj.js} +1 -1
  3. package/dist/client/assets/ResourceDetailView-CZ2aB73w.js +1 -0
  4. package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
  5. package/dist/client/assets/ResourcesView-CN1NlhWs.js +1 -0
  6. package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
  7. package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
  8. package/dist/client/assets/ServerDashboard-k652Vw4Z.js +1 -0
  9. package/dist/client/assets/ServerDetail-BLQ-a4cO.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-BHrsFD5i.js +36 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHhwEuGe.js +1 -0
  14. package/dist/client/assets/SettingsView-CUOFNXrz.js +1 -0
  15. package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
  16. package/dist/client/assets/ToolCallDialog-BfPjLxfV.js +1 -0
  17. package/dist/client/assets/ToolsView-BxgXvPC3.css +1 -0
  18. package/dist/client/assets/ToolsView-CyuhYAE2.js +1 -0
  19. package/dist/client/assets/{_baseClone-5q1b0P3O.js → _baseClone-DO5qfalW.js} +1 -1
  20. package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
  21. package/dist/client/assets/el-form-item-CcGsD2K_.js +12 -0
  22. package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
  23. package/dist/client/assets/el-input-tYgeiaCT.js +1 -0
  24. package/dist/client/assets/{el-loading-H85n3BUC.js → el-loading-Dwl9E_Vr.js} +1 -1
  25. package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
  26. package/dist/client/assets/el-overlay-kqX_BABo.js +1 -0
  27. package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
  28. package/dist/client/assets/el-radio-group-D8aWBVOT.js +1 -0
  29. package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
  30. package/dist/client/assets/el-skeleton-item-BRwIFspE.js +1 -0
  31. package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
  32. package/dist/client/assets/el-switch-BF8c-xeU.js +1 -0
  33. package/dist/client/assets/el-tab-pane-C4Ep94cd.js +1 -0
  34. package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
  35. package/dist/client/assets/el-table-column-Cog6uCh-.js +1 -0
  36. package/dist/client/assets/index-ByNBhPAR.js +1 -0
  37. package/dist/client/assets/index-CTB6oe-9.js +2 -0
  38. package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
  39. package/dist/client/assets/omit-CUnDT6sS.js +1 -0
  40. package/dist/client/assets/{raf-DY5mgbuB.js → raf-CmzeRPMd.js} +1 -1
  41. package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-CbgVSHIh.js} +3 -3
  42. package/dist/client/index.html +3 -3
  43. package/dist/server/shared/models/resource.model.d.ts +2 -1
  44. package/dist/server/shared/models/resource.model.d.ts.map +1 -1
  45. package/dist/server/shared/models/server.model.d.ts +362 -5
  46. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  47. package/dist/server/shared/models/server.model.js +220 -1
  48. package/dist/server/shared/models/session.model.d.ts +1 -57
  49. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  50. package/dist/server/shared/models/session.model.js +1 -55
  51. package/dist/server/shared/models/tool.model.d.ts +4 -2
  52. package/dist/server/shared/models/tool.model.d.ts.map +1 -1
  53. package/dist/server/shared/types/session-context.types.d.ts +0 -2
  54. package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
  55. package/dist/server/shared/types/websocket.types.d.ts +17 -10
  56. package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
  57. package/dist/server/src/api/mcp/debug-response-wrapper.js +2 -2
  58. package/dist/server/src/api/mcp/gateway.d.ts +1 -3
  59. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  60. package/dist/server/src/api/mcp/gateway.js +32 -49
  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/server.d.ts +57 -0
  81. package/dist/server/src/cli/commands/server.d.ts.map +1 -0
  82. package/dist/server/src/cli/commands/server.js +169 -0
  83. package/dist/server/src/cli/commands/status.d.ts.map +1 -1
  84. package/dist/server/src/cli/commands/status.js +41 -30
  85. package/dist/server/src/cli/index.d.ts.map +1 -1
  86. package/dist/server/src/cli/index.js +2 -1
  87. package/dist/server/src/cli/server.d.ts +11 -2
  88. package/dist/server/src/cli/server.d.ts.map +1 -1
  89. package/dist/server/src/config/config-change-logger.d.ts +22 -0
  90. package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
  91. package/dist/server/src/config/config-change-logger.js +135 -11
  92. package/dist/server/src/config/config-loader.d.ts +6 -5
  93. package/dist/server/src/config/config-loader.d.ts.map +1 -1
  94. package/dist/server/src/config/config-loader.js +54 -16
  95. package/dist/server/src/config/config-manager.d.ts +51 -43
  96. package/dist/server/src/config/config-manager.d.ts.map +1 -1
  97. package/dist/server/src/config/config-manager.js +84 -66
  98. package/dist/server/src/config/config-migrator.d.ts +82 -0
  99. package/dist/server/src/config/config-migrator.d.ts.map +1 -0
  100. package/dist/server/src/config/config-migrator.js +348 -0
  101. package/dist/server/src/config/config-saver.d.ts +2 -0
  102. package/dist/server/src/config/config-saver.d.ts.map +1 -1
  103. package/dist/server/src/config/config-saver.js +8 -2
  104. package/dist/server/src/config/config.schema.d.ts +10 -104
  105. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  106. package/dist/server/src/config/config.schema.js +15 -99
  107. package/dist/server/src/config/path-validator.d.ts +27 -0
  108. package/dist/server/src/config/path-validator.d.ts.map +1 -0
  109. package/dist/server/src/config/path-validator.js +53 -0
  110. package/dist/server/src/config/server-config-manager.d.ts +37 -31
  111. package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
  112. package/dist/server/src/config/server-config-manager.js +222 -66
  113. package/dist/server/src/config/type-converter.d.ts.map +1 -1
  114. package/dist/server/src/config/type-converter.js +3 -2
  115. package/dist/server/src/models/event.model.d.ts +17 -10
  116. package/dist/server/src/models/event.model.d.ts.map +1 -1
  117. package/dist/server/src/models/server.model.d.ts +17 -3
  118. package/dist/server/src/models/server.model.d.ts.map +1 -1
  119. package/dist/server/src/models/server.model.js +2 -1
  120. package/dist/server/src/models/system-tools.constants.d.ts +10 -27
  121. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  122. package/dist/server/src/models/system-tools.constants.js +4 -8
  123. package/dist/server/src/pid/manager.d.ts.map +1 -1
  124. package/dist/server/src/pid/manager.js +2 -1
  125. package/dist/server/src/server/dev-server.js +34 -20
  126. package/dist/server/src/server/runner.d.ts.map +1 -1
  127. package/dist/server/src/server/runner.js +41 -26
  128. package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
  129. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  130. package/dist/server/src/services/connection/connection-manager.js +286 -241
  131. package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
  132. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  133. package/dist/server/src/services/connection/tool-cache.js +50 -55
  134. package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
  135. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  136. package/dist/server/src/services/gateway/gateway.service.js +53 -23
  137. package/dist/server/src/services/gateway/global-transport.d.ts +19 -0
  138. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
  139. package/dist/server/src/services/gateway/global-transport.js +66 -0
  140. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  141. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
  142. package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
  143. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
  144. package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
  145. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
  146. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  147. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +20 -80
  148. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
  149. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
  150. package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
  151. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  152. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
  153. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  154. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
  155. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  156. package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
  157. package/dist/server/src/services/gateway/types.d.ts +2 -1
  158. package/dist/server/src/services/gateway/types.d.ts.map +1 -1
  159. package/dist/server/src/services/hub-manager.service.d.ts +32 -238
  160. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  161. package/dist/server/src/services/hub-manager.service.js +89 -267
  162. package/dist/server/src/services/hub-tools/index.d.ts +1 -3
  163. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  164. package/dist/server/src/services/hub-tools/index.js +1 -2
  165. package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
  166. package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
  167. package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
  168. package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
  169. package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
  170. package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
  171. package/dist/server/src/services/hub-tools/resource-generator.d.ts +24 -1
  172. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  173. package/dist/server/src/services/hub-tools/resource-generator.js +259 -39
  174. package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
  175. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  176. package/dist/server/src/services/hub-tools/server-selector.js +44 -37
  177. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
  178. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  179. package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
  180. package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
  181. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
  182. package/dist/server/src/services/hub-tools/tool-search.js +10 -4
  183. package/dist/server/src/services/hub-tools/types.d.ts +2 -2
  184. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
  185. package/dist/server/src/services/hub-tools.service.d.ts +43 -72
  186. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  187. package/dist/server/src/services/hub-tools.service.js +185 -110
  188. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  189. package/dist/server/src/services/system-tool-handler.js +7 -17
  190. package/dist/server/src/utils/composite-key.d.ts +29 -0
  191. package/dist/server/src/utils/composite-key.d.ts.map +1 -0
  192. package/dist/server/src/utils/composite-key.js +39 -0
  193. package/dist/server/src/utils/error-handler.d.ts.map +1 -1
  194. package/dist/server/src/utils/error-handler.js +3 -2
  195. package/dist/server/src/utils/index.d.ts +2 -0
  196. package/dist/server/src/utils/index.d.ts.map +1 -1
  197. package/dist/server/src/utils/index.js +2 -0
  198. package/dist/server/src/utils/instance-id.d.ts +22 -0
  199. package/dist/server/src/utils/instance-id.d.ts.map +1 -0
  200. package/dist/server/src/utils/instance-id.js +59 -0
  201. package/dist/server/src/utils/json-utils.d.ts +4 -4
  202. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  203. package/dist/server/src/utils/json-utils.js +4 -4
  204. package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
  205. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
  206. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  207. package/dist/server/src/utils/logger/log-formatter.js +82 -5
  208. package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
  209. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  210. package/dist/server/src/utils/logger/log-modules.js +8 -6
  211. package/dist/server/src/utils/parameter-validator.d.ts +10 -0
  212. package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
  213. package/dist/server/src/utils/parameter-validator.js +53 -0
  214. package/dist/server/src/utils/process-tree.d.ts +49 -0
  215. package/dist/server/src/utils/process-tree.d.ts.map +1 -0
  216. package/dist/server/src/utils/process-tree.js +285 -0
  217. package/dist/server/src/utils/sort-utils.d.ts +40 -0
  218. package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
  219. package/dist/server/src/utils/sort-utils.js +131 -0
  220. package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
  221. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
  222. package/dist/server/src/utils/transports/sse-transport.js +55 -9
  223. package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
  224. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  225. package/dist/server/src/utils/transports/stdio-transport.js +66 -247
  226. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
  227. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
  228. package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
  229. package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
  230. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  231. package/dist/server/src/utils/transports/transport-factory.js +31 -11
  232. package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
  233. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
  234. package/dist/server/src/utils/version.d.ts +11 -0
  235. package/dist/server/src/utils/version.d.ts.map +1 -0
  236. package/dist/server/src/utils/version.js +57 -0
  237. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
  238. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
  239. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
  240. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
  241. package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
  242. package/dist/server/tests/server.test.js +27 -16
  243. package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
  244. package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
  245. package/dist/server/tests/temp/temp-run-docling.js +53 -0
  246. package/dist/server/tests/types/test-helpers.d.ts +1 -2
  247. package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
  248. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
  249. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
  250. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
  251. package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
  252. package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
  253. package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
  254. package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
  255. package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
  256. package/dist/server/tests/unit/config/config-saver.test.js +200 -0
  257. package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
  258. package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
  259. package/dist/server/tests/unit/config/config.schema.test.js +347 -0
  260. package/dist/server/tests/unit/server/runner.test.js +86 -62
  261. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
  262. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
  263. package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
  264. package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
  265. package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
  266. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
  267. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
  268. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
  269. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
  270. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
  271. package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
  272. package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -320
  273. package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
  274. package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
  275. package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
  276. package/dist/server/tests/unit/services/session-manager.test.js +26 -436
  277. package/dist/server/tests/unit/utils/config.test.js +88 -186
  278. package/dist/server/tests/unit/utils/json-utils.test.js +18 -18
  279. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
  280. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
  281. package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
  282. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
  283. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
  284. package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
  285. package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
  286. package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
  287. package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
  288. package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
  289. package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
  290. package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
  291. package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
  292. package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
  293. package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
  294. package/package.json +3 -1
  295. package/dist/client/assets/ResourceDetailView-Bf-1ffbk.js +0 -1
  296. package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
  297. package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
  298. package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
  299. package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
  300. package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
  301. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
  302. package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
  303. package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
  304. package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
  305. package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
  306. package/dist/client/assets/ToolsView-E3Ps9c7i.css +0 -1
  307. package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
  308. package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
  309. package/dist/client/assets/el-input-CDnuSKVZ.js +0 -1
  310. package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
  311. package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
  312. package/dist/client/assets/el-overlay-CzMkXyYy.js +0 -1
  313. package/dist/client/assets/el-select-DvjGddk_.js +0 -1
  314. package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
  315. package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
  316. package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
  317. package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
  318. package/dist/client/assets/el-tag-npbwux4f.js +0 -1
  319. package/dist/client/assets/index-CCnAxNF8.js +0 -2
  320. package/dist/client/assets/index-d1DZeSfz.js +0 -1
  321. package/dist/client/assets/omit-DPsOVNIJ.js +0 -1
  322. package/dist/client/assets/vnode-CHomNjgN.js +0 -1
@@ -1,6 +1,7 @@
1
1
  import { logger, LOG_MODULES } from '../logger.js';
2
2
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
3
  import { URL } from 'url';
4
+ import { ProxyAgent, fetch as undiciFetch } from 'undici';
4
5
  /**
5
6
  * Streamable HTTP Transport implementation for MCP (Model Context Protocol)
6
7
  *
@@ -30,6 +31,7 @@ export class StreamableHttpTransport {
30
31
  url;
31
32
  headers;
32
33
  timeout;
34
+ proxy;
33
35
  /**
34
36
  * Internal reference to the underlying MCP SDK transport instance
35
37
  * @private
@@ -41,6 +43,16 @@ export class StreamableHttpTransport {
41
43
  * @private
42
44
  */
43
45
  isClosing = false;
46
+ /**
47
+ * Server name for logging context
48
+ * @private
49
+ */
50
+ _serverName;
51
+ /**
52
+ * Composite key (serverName-serverIndex) for logging context
53
+ * @private
54
+ */
55
+ _compositeKey;
44
56
  /**
45
57
  * Event handler called when a JSON-RPC message is received from the server
46
58
  * @public
@@ -64,11 +76,34 @@ export class StreamableHttpTransport {
64
76
  * Commonly used for authentication tokens, API keys, or custom headers
65
77
  * @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
66
78
  * Controls how long to wait for HTTP responses before timing out
79
+ * @param proxy - Optional proxy configuration
80
+ * @param serverName - Optional server name for logging
81
+ * @param compositeKey - Optional composite key (serverName-serverIndex) for logging
67
82
  */
68
- constructor(url, headers = {}, timeout = 30000) {
83
+ constructor(url, headers = {}, timeout = 30000, proxy, serverName, compositeKey) {
69
84
  this.url = url;
70
85
  this.headers = headers;
71
86
  this.timeout = timeout;
87
+ this.proxy = proxy;
88
+ this._serverName = serverName;
89
+ this._compositeKey = compositeKey;
90
+ }
91
+ /**
92
+ * Helper method to format log messages with server context.
93
+ *
94
+ * @param message - The base message
95
+ * @returns Formatted message with server context if available
96
+ */
97
+ formatLogMessage(message) {
98
+ if (this._compositeKey) {
99
+ return `${message} (compositeKey=${this._compositeKey}, url=${this.url})`;
100
+ }
101
+ else if (this._serverName) {
102
+ return `${message} (server=${this._serverName}, url=${this.url})`;
103
+ }
104
+ else {
105
+ return `${message} (url=${this.url})`;
106
+ }
72
107
  }
73
108
  /**
74
109
  * Initializes and starts the Streamable HTTP transport connection
@@ -101,6 +136,8 @@ export class StreamableHttpTransport {
101
136
  throw new Error('Streamable HTTP Transport already started!');
102
137
  }
103
138
  this.isClosing = false;
139
+ const proxyInfo = this.proxy?.url ? `, proxy=${this.proxy.url}` : '';
140
+ logger.info(this.formatLogMessage(`Attempting to connect to Streamable HTTP server: timeout=${this.timeout}ms, headers=${JSON.stringify(Object.keys(this.headers))}${proxyInfo}`), LOG_MODULES.HTTP_TRANSPORT);
104
141
  try {
105
142
  const url = new URL(this.url);
106
143
  const requestInit = {
@@ -110,19 +147,37 @@ export class StreamableHttpTransport {
110
147
  },
111
148
  signal: AbortSignal.timeout(this.timeout)
112
149
  };
113
- this.transport = new StreamableHTTPClientTransport(url, {
150
+ // Create transport options
151
+ const transportOptions = {
114
152
  requestInit
115
- });
153
+ };
154
+ // Add proxy support if configured
155
+ if (this.proxy?.url) {
156
+ const agent = new ProxyAgent(this.proxy.url);
157
+ // Create custom fetch function with proxy
158
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
+ const customFetch = (input, init) => {
160
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
161
+ const fetchOptions = {
162
+ ...init,
163
+ dispatcher: agent
164
+ };
165
+ return undiciFetch(input, fetchOptions);
166
+ };
167
+ transportOptions.fetch = customFetch;
168
+ logger.info(this.formatLogMessage(`Streamable HTTP transport configured with proxy: ${this.proxy.url}`), LOG_MODULES.HTTP_TRANSPORT);
169
+ }
170
+ this.transport = new StreamableHTTPClientTransport(url, transportOptions);
116
171
  // Set up event handlers
117
172
  this.transport.onmessage = (message) => {
118
173
  this.onmessage?.(message);
119
174
  };
120
175
  this.transport.onerror = (error) => {
121
- logger.error('Streamable HTTP transport error:', error, LOG_MODULES.HTTP_TRANSPORT);
176
+ logger.error(this.formatLogMessage(`Streamable HTTP transport error occurred: errorType=${error.name || 'unknown'}, message=${error.message || 'no message'}`), error, LOG_MODULES.HTTP_TRANSPORT);
122
177
  this.onerror?.(error);
123
178
  };
124
179
  this.transport.onclose = () => {
125
- logger.info('Streamable HTTP transport closed', LOG_MODULES.HTTP_TRANSPORT);
180
+ logger.info(this.formatLogMessage('Streamable HTTP transport closed'), LOG_MODULES.HTTP_TRANSPORT);
126
181
  if (!this.isClosing) {
127
182
  // Unexpected close, trigger error
128
183
  const error = new Error('Streamable HTTP transport closed unexpectedly');
@@ -130,11 +185,13 @@ export class StreamableHttpTransport {
130
185
  }
131
186
  this.onclose?.();
132
187
  };
188
+ logger.debug(this.formatLogMessage('Starting underlying transport connection...'), LOG_MODULES.HTTP_TRANSPORT);
133
189
  await this.transport.start();
134
- logger.info(`Streamable HTTP transport initialized for ${this.url}`, LOG_MODULES.HTTP_TRANSPORT);
190
+ logger.info(this.formatLogMessage('Streamable HTTP transport successfully initialized'), LOG_MODULES.HTTP_TRANSPORT);
135
191
  }
136
192
  catch (error) {
137
- logger.error('Failed to create Streamable HTTP transport:', error, LOG_MODULES.HTTP_TRANSPORT);
193
+ logger.error(this.formatLogMessage(`Failed to create Streamable HTTP transport: error=${error instanceof Error ? error.message : String(error)}`), LOG_MODULES.HTTP_TRANSPORT);
194
+ logger.error('Complete error details:', error, LOG_MODULES.HTTP_TRANSPORT);
138
195
  throw error;
139
196
  }
140
197
  }
@@ -201,11 +258,14 @@ export class StreamableHttpTransport {
201
258
  if (!this.transport) {
202
259
  throw new Error('Streamable HTTP transport not started');
203
260
  }
261
+ const method = 'method' in message ? message.method : 'notification';
262
+ const proxyInfo = this.proxy?.url ? `, proxy=${this.proxy.url}` : '';
263
+ logger.debug(this.formatLogMessage(`Sending message via Streamable HTTP: method=${method}${proxyInfo}`), LOG_MODULES.HTTP_TRANSPORT);
204
264
  try {
205
265
  await this.transport.send(message);
206
266
  }
207
267
  catch (error) {
208
- logger.error('Failed to send message via Streamable HTTP:', error, LOG_MODULES.HTTP_TRANSPORT);
268
+ logger.error(this.formatLogMessage(`Failed to send message via Streamable HTTP: method=${method}${proxyInfo}, error=${error instanceof Error ? error.message : String(error)}`), error, LOG_MODULES.HTTP_TRANSPORT);
209
269
  throw error;
210
270
  }
211
271
  }
@@ -1,4 +1,4 @@
1
- import type { ServerConfig } from '../../config/config.schema.js';
1
+ import type { ServerRuntimeConfig } from '../../../shared/models/server.model.js';
2
2
  /**
3
3
  * Transport Factory - creates appropriate transport client based on server configuration
4
4
  */
@@ -6,18 +6,23 @@ export declare class TransportFactory {
6
6
  /**
7
7
  * Create transport client
8
8
  * @param server Server configuration, including base configuration and instance configuration
9
- * @param serverId Optional server ID for log storage integration
9
+ * @param compositeKey Optional composite key (serverName-serverIndex) for log storage integration
10
10
  * @returns Transport client instance
11
11
  * @throws Error if server type is not supported or configuration is invalid
12
12
  */
13
- static createTransport(server: ServerConfig & {
13
+ static createTransport(server: ServerRuntimeConfig & {
14
14
  name: string;
15
- }, serverId?: string): import('@modelcontextprotocol/sdk/shared/transport.js').Transport;
15
+ }, compositeKey?: string): import('@modelcontextprotocol/sdk/shared/transport.js').Transport;
16
16
  /**
17
17
  * Build system environment variables
18
18
  * Add necessary system environment variables for stdio transport
19
19
  */
20
20
  private static buildSystemEnv;
21
+ /**
22
+ * Check if a command is related to Python execution
23
+ * Detects python, python3, py, uv, uvx, and similar commands
24
+ */
25
+ private static isPythonCommand;
21
26
  /**
22
27
  * Validate and convert server configuration to transport configuration
23
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,YAAY,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EACvC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,+CAA+C,EAAE,SAAS;IAmDpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAI7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA4CxC"}
1
+ {"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC9C,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,+CAA+C,EAAE,SAAS;IA6DpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA8CxC"}
@@ -9,11 +9,11 @@ export class TransportFactory {
9
9
  /**
10
10
  * Create transport client
11
11
  * @param server Server configuration, including base configuration and instance configuration
12
- * @param serverId Optional server ID for log storage integration
12
+ * @param compositeKey Optional composite key (serverName-serverIndex) for log storage integration
13
13
  * @returns Transport client instance
14
14
  * @throws Error if server type is not supported or configuration is invalid
15
15
  */
16
- static createTransport(server, serverId) {
16
+ static createTransport(server, compositeKey) {
17
17
  const transportConfig = this.validateAndConvertConfig(server);
18
18
  // Use type assertion to ensure TypeScript can correctly infer types
19
19
  const config = transportConfig;
@@ -29,20 +29,20 @@ export class TransportFactory {
29
29
  cwd: process.cwd(),
30
30
  stderr: 'pipe'
31
31
  }, server.name, {
32
- serverId,
33
- logStorage: serverId ? logStorage : undefined
32
+ compositeKey,
33
+ logStorage: compositeKey ? logStorage : undefined
34
34
  });
35
35
  case 'sse':
36
36
  if (!config.url) {
37
37
  throw new Error('SSE transport requires a URL');
38
38
  }
39
- return new SseTransport(config.url, config.headers, config.reconnectInterval, config.maxReconnectAttempts);
39
+ return new SseTransport(config.url, config.headers, config.reconnectInterval, config.maxReconnectAttempts, config.proxy, server.name, compositeKey);
40
40
  case 'streamable-http':
41
41
  case 'http': // Compatibility with http type, treat as streamable-http
42
42
  if (!config.url) {
43
43
  throw new Error('Streamable HTTP transport requires a URL');
44
44
  }
45
- return new StreamableHttpTransport(config.url, config.headers, config.timeout);
45
+ return new StreamableHttpTransport(config.url, config.headers, config.timeout, config.proxy, server.name, compositeKey);
46
46
  default:
47
47
  throw new Error(`Unsupported transport type: ${config.type || 'undefined'}`);
48
48
  }
@@ -51,8 +51,26 @@ export class TransportFactory {
51
51
  * Build system environment variables
52
52
  * Add necessary system environment variables for stdio transport
53
53
  */
54
- static buildSystemEnv() {
55
- return {};
54
+ static buildSystemEnv(command) {
55
+ const env = {};
56
+ // For Python-related commands, set PYTHONUTF8=1 to ensure proper UTF-8 handling
57
+ if (command && this.isPythonCommand(command)) {
58
+ env.PYTHONUTF8 = '1';
59
+ }
60
+ return env;
61
+ }
62
+ /**
63
+ * Check if a command is related to Python execution
64
+ * Detects python, python3, py, uv, uvx, and similar commands
65
+ */
66
+ static isPythonCommand(command) {
67
+ const trimmedCommand = command.trim();
68
+ if (!trimmedCommand)
69
+ return false;
70
+ // Extract the basename (last part after / or \)
71
+ const parts = trimmedCommand.split(/[\\/]/);
72
+ const basename = parts[parts.length - 1].toLowerCase();
73
+ return basename.includes('python') || basename.startsWith('uv') || basename.startsWith('py');
56
74
  }
57
75
  /**
58
76
  * Validate and convert server configuration to transport configuration
@@ -65,7 +83,7 @@ export class TransportFactory {
65
83
  command: server.command || '',
66
84
  args: server.args,
67
85
  env: {
68
- ...this.buildSystemEnv(), // System environment variables
86
+ ...this.buildSystemEnv(server.command), // System environment variables
69
87
  ...(server.env || {}) // User-defined environment variables (can override system defaults)
70
88
  },
71
89
  cwd: process.cwd(),
@@ -78,7 +96,8 @@ export class TransportFactory {
78
96
  url: server.url || '',
79
97
  headers: server.headers || server.env, // Prefer headers, fallback to env for backward compatibility
80
98
  reconnectInterval: 3000,
81
- maxReconnectAttempts: 5
99
+ maxReconnectAttempts: 5,
100
+ proxy: server.proxy
82
101
  };
83
102
  }
84
103
  else if (type === 'streamable-http' || type === 'http') {
@@ -86,7 +105,8 @@ export class TransportFactory {
86
105
  type: 'streamable-http', // Unified conversion to streamable-http
87
106
  url: server.url || '',
88
107
  headers: server.headers || server.env, // Prefer headers, fallback to env for backward compatibility
89
- timeout: server.timeout || 30000
108
+ timeout: server.timeout || 30000,
109
+ proxy: server.proxy
90
110
  };
91
111
  }
92
112
  else {
@@ -18,6 +18,9 @@ export interface SseTransportConfig {
18
18
  headers?: Record<string, string>;
19
19
  reconnectInterval?: number;
20
20
  maxReconnectAttempts?: number;
21
+ proxy?: {
22
+ url: string;
23
+ };
21
24
  }
22
25
  /**
23
26
  * Streamable HTTP transport configuration
@@ -27,6 +30,9 @@ export interface StreamableHttpTransportConfig {
27
30
  url: string;
28
31
  headers?: Record<string, string>;
29
32
  timeout?: number;
33
+ proxy?: {
34
+ url: string;
35
+ };
30
36
  }
31
37
  /**
32
38
  * Generic server configuration
@@ -1 +1 @@
1
- {"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,oBAAoB,GACpB,kBAAkB,GAClB,6BAA6B,CAAC"}
1
+ {"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,oBAAoB,GACpB,kBAAkB,GAClB,6BAA6B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Get the application version from package.json.
3
+ *
4
+ * @returns The package version string or a safe fallback on failure.
5
+ */
6
+ export declare function getAppVersion(): string;
7
+ /**
8
+ * Get the MCP protocol version used by the gateway.
9
+ */
10
+ export declare function getProtocolVersion(): string;
11
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../src/utils/version.ts"],"names":[],"mappings":"AA8CA;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,57 @@
1
+ import fs from 'fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import path from 'node:path';
4
+ const FALLBACK_VERSION = '0.0.0';
5
+ const MCP_PROTOCOL_VERSION = '2024-11-05';
6
+ let cachedAppVersion;
7
+ /**
8
+ * Resolve package version from package.json with multiple fallback paths.
9
+ */
10
+ function resolvePackageVersion() {
11
+ const baseDirs = [
12
+ process.cwd(),
13
+ path.dirname(fileURLToPath(import.meta.url)),
14
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..')
15
+ ];
16
+ for (const baseDir of baseDirs) {
17
+ let currentDir = baseDir;
18
+ for (let depth = 0; depth < 6; depth += 1) {
19
+ const candidate = path.join(currentDir, 'package.json');
20
+ try {
21
+ if (fs.existsSync(candidate)) {
22
+ const packageText = fs.readFileSync(candidate, 'utf-8');
23
+ const parsed = JSON.parse(packageText);
24
+ if (parsed.version && typeof parsed.version === 'string') {
25
+ return parsed.version;
26
+ }
27
+ }
28
+ }
29
+ catch {
30
+ // Ignore parsing/file read errors and continue searching.
31
+ }
32
+ const parent = path.dirname(currentDir);
33
+ if (parent === currentDir) {
34
+ break;
35
+ }
36
+ currentDir = parent;
37
+ }
38
+ }
39
+ return FALLBACK_VERSION;
40
+ }
41
+ /**
42
+ * Get the application version from package.json.
43
+ *
44
+ * @returns The package version string or a safe fallback on failure.
45
+ */
46
+ export function getAppVersion() {
47
+ if (!cachedAppVersion) {
48
+ cachedAppVersion = resolvePackageVersion();
49
+ }
50
+ return cachedAppVersion;
51
+ }
52
+ /**
53
+ * Get the MCP protocol version used by the gateway.
54
+ */
55
+ export function getProtocolVersion() {
56
+ return MCP_PROTOCOL_VERSION;
57
+ }
@@ -1,6 +1,7 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
2
  import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
+ import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
4
5
  // Mock MCP SDK
5
6
  vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
6
7
  return {
@@ -39,22 +40,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
39
40
  describe('MCP Protocol Contract - initialize (with SDK)', () => {
40
41
  const serverName = 'test-sdk-server';
41
42
  let serverId;
43
+ let serverIndex;
42
44
  beforeEach(async () => {
43
- // Add to hub manager
45
+ // Add to hub manager (v1.1 format)
44
46
  await hubManager.addServer(serverName, {
45
47
  command: 'node',
46
48
  args: [],
47
- enabled: true,
48
49
  type: 'stdio',
49
50
  timeout: 60000,
50
- allowedTools: []
51
+ aggregatedTools: []
51
52
  });
52
53
  // Add server instance
53
54
  const instance = await hubManager.addServerInstance(serverName, {});
54
55
  serverId = instance.id;
56
+ serverIndex = instance.index ?? 0;
55
57
  });
56
58
  afterEach(async () => {
57
- await mcpConnectionManager.disconnect(serverId);
59
+ await mcpConnectionManager.disconnect(serverName, serverIndex);
58
60
  hubManager.removeServer(serverName);
59
61
  });
60
62
  it('should correctly initialize MCP connection with SDK', async () => {
@@ -63,18 +65,17 @@ describe('MCP Protocol Contract - initialize (with SDK)', () => {
63
65
  if (!serverInfo) {
64
66
  throw new Error('Server not found');
65
67
  }
66
- await mcpConnectionManager.connect({
68
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
69
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
70
+ if (!resolvedConfig) {
71
+ throw new Error('Failed to resolve server configuration');
72
+ }
73
+ await mcpConnectionManager.connect(serverName, serverIndex, {
74
+ ...resolvedConfig,
67
75
  id: serverId,
68
- command: serverInfo.config.command,
69
- args: serverInfo.config.args,
70
- enabled: serverInfo.config.enabled,
71
- type: serverInfo.config.type,
72
- timeout: serverInfo.config.timeout,
73
- allowedTools: serverInfo.config.allowedTools,
74
- timestamp: serverInfo.instance.timestamp,
75
- hash: serverInfo.instance.hash
76
+ timestamp: Date.now()
76
77
  });
77
- const status = mcpConnectionManager.getStatus(serverId);
78
+ const status = mcpConnectionManager.getStatus(serverName, serverIndex);
78
79
  expect(status?.connected).toBe(true);
79
80
  expect(status?.version).toBe('1.0.0');
80
81
  });
@@ -84,18 +85,17 @@ describe('MCP Protocol Contract - initialize (with SDK)', () => {
84
85
  if (!serverInfo) {
85
86
  throw new Error('Server not found');
86
87
  }
87
- await mcpConnectionManager.connect({
88
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
89
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
90
+ if (!resolvedConfig) {
91
+ throw new Error('Failed to resolve server configuration');
92
+ }
93
+ await mcpConnectionManager.connect(serverName, serverIndex, {
94
+ ...resolvedConfig,
88
95
  id: serverId,
89
- command: serverInfo.config.command,
90
- args: serverInfo.config.args,
91
- enabled: serverInfo.config.enabled,
92
- type: serverInfo.config.type,
93
- timeout: serverInfo.config.timeout,
94
- allowedTools: serverInfo.config.allowedTools,
95
- timestamp: serverInfo.instance.timestamp,
96
- hash: serverInfo.instance.hash
96
+ timestamp: Date.now()
97
97
  });
98
- const tools = mcpConnectionManager.getTools(serverId);
98
+ const tools = mcpConnectionManager.getTools(serverName, serverIndex);
99
99
  expect(tools).toHaveLength(1);
100
100
  expect(tools[0].name).toBe('echo');
101
101
  expect(tools[0].description).toBe('Echo the input');
@@ -1,12 +1,15 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
2
  import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
+ import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
4
5
  // Mock MCP SDK
6
+ const mockListTools = vi.fn().mockResolvedValue({ tools: [] });
5
7
  vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
6
8
  return {
7
9
  Client: class {
8
10
  connect = vi.fn().mockResolvedValue(undefined);
9
11
  close = vi.fn().mockResolvedValue(undefined);
12
+ listTools = mockListTools;
10
13
  callTool = vi.fn().mockImplementation((toolCall) => {
11
14
  if (toolCall.name === 'calculator') {
12
15
  const { a, b, operation } = toolCall.arguments;
@@ -67,22 +70,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
67
70
  describe('MCP Protocol Contract - tools/call (with SDK)', () => {
68
71
  const serverName = 'test-sdk-server';
69
72
  let serverId;
73
+ let serverIndex;
70
74
  beforeEach(async () => {
71
- // Add to hub manager
75
+ // Add to hub manager (v1.1 format)
72
76
  await hubManager.addServer(serverName, {
73
77
  command: 'node',
74
78
  args: [],
75
- enabled: true,
76
79
  type: 'stdio',
77
80
  timeout: 60000,
78
- allowedTools: []
81
+ aggregatedTools: []
79
82
  });
80
83
  // Add server instance
81
84
  const instance = await hubManager.addServerInstance(serverName, {});
82
85
  serverId = instance.id;
86
+ serverIndex = instance.index ?? 0;
83
87
  });
84
88
  afterEach(async () => {
85
- await mcpConnectionManager.disconnect(serverId);
89
+ await mcpConnectionManager.disconnect(serverName, serverIndex);
86
90
  hubManager.removeServer(serverName);
87
91
  });
88
92
  it('should execute tool with correct arguments', async () => {
@@ -91,18 +95,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
91
95
  if (!serverInfo) {
92
96
  throw new Error('Server not found');
93
97
  }
94
- await mcpConnectionManager.connect({
98
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
99
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
100
+ if (!resolvedConfig) {
101
+ throw new Error('Failed to resolve server configuration');
102
+ }
103
+ await mcpConnectionManager.connect(serverName, serverIndex, {
104
+ ...resolvedConfig,
95
105
  id: serverId,
96
- command: serverInfo.config.command,
97
- args: serverInfo.config.args,
98
- enabled: serverInfo.config.enabled,
99
- type: serverInfo.config.type,
100
- timeout: serverInfo.config.timeout,
101
- allowedTools: serverInfo.config.allowedTools,
102
- timestamp: serverInfo.instance.timestamp,
103
- hash: serverInfo.instance.hash
106
+ timestamp: Date.now()
104
107
  });
105
- const result = (await mcpConnectionManager.callTool(serverId, 'calculator', {
108
+ const result = (await mcpConnectionManager.callTool(serverName, serverIndex, 'calculator', {
106
109
  a: 5,
107
110
  b: 3,
108
111
  operation: 'add'
@@ -116,18 +119,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
116
119
  if (!serverInfo) {
117
120
  throw new Error('Server not found');
118
121
  }
119
- await mcpConnectionManager.connect({
122
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
123
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
124
+ if (!resolvedConfig) {
125
+ throw new Error('Failed to resolve server configuration');
126
+ }
127
+ await mcpConnectionManager.connect(serverName, serverIndex, {
128
+ ...resolvedConfig,
120
129
  id: serverId,
121
- command: serverInfo.config.command,
122
- args: serverInfo.config.args,
123
- enabled: serverInfo.config.enabled,
124
- type: serverInfo.config.type,
125
- timeout: serverInfo.config.timeout,
126
- allowedTools: serverInfo.config.allowedTools,
127
- timestamp: serverInfo.instance.timestamp,
128
- hash: serverInfo.instance.hash
130
+ timestamp: Date.now()
129
131
  });
130
- await expect(mcpConnectionManager.callTool(serverId, 'calculator', {
132
+ await expect(mcpConnectionManager.callTool(serverName, serverIndex, 'calculator', {
131
133
  a: 'invalid',
132
134
  b: 3,
133
135
  operation: 'add'
@@ -139,18 +141,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
139
141
  if (!serverInfo) {
140
142
  throw new Error('Server not found');
141
143
  }
142
- await mcpConnectionManager.connect({
144
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
145
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
146
+ if (!resolvedConfig) {
147
+ throw new Error('Failed to resolve server configuration');
148
+ }
149
+ await mcpConnectionManager.connect(serverName, serverIndex, {
150
+ ...resolvedConfig,
143
151
  id: serverId,
144
- command: serverInfo.config.command,
145
- args: serverInfo.config.args,
146
- enabled: serverInfo.config.enabled,
147
- type: serverInfo.config.type,
148
- timeout: serverInfo.config.timeout,
149
- allowedTools: serverInfo.config.allowedTools,
150
- timestamp: serverInfo.instance.timestamp,
151
- hash: serverInfo.instance.hash
152
+ timestamp: Date.now()
152
153
  });
153
- await expect(mcpConnectionManager.callTool(serverId, 'unknown_tool', {})).rejects.toThrow();
154
+ await expect(mcpConnectionManager.callTool(serverName, serverIndex, 'unknown_tool', {})).rejects.toThrow();
154
155
  });
155
156
  it('should support multiple concurrent tool calls', async () => {
156
157
  // Get server configuration and instance configuration
@@ -158,20 +159,23 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
158
159
  if (!serverInfo) {
159
160
  throw new Error('Server not found');
160
161
  }
161
- await mcpConnectionManager.connect({
162
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
163
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
164
+ if (!resolvedConfig) {
165
+ throw new Error('Failed to resolve server configuration');
166
+ }
167
+ await mcpConnectionManager.connect(serverName, serverIndex, {
168
+ ...resolvedConfig,
162
169
  id: serverId,
163
- command: serverInfo.config.command,
164
- args: serverInfo.config.args,
165
- enabled: serverInfo.config.enabled,
166
- type: serverInfo.config.type,
167
- timeout: serverInfo.config.timeout,
168
- allowedTools: serverInfo.config.allowedTools,
169
- timestamp: serverInfo.instance.timestamp,
170
- hash: serverInfo.instance.hash
170
+ timestamp: Date.now()
171
171
  });
172
172
  const [result1, result2] = await Promise.all([
173
- mcpConnectionManager.callTool(serverId, 'get_weather', { location: 'New York' }),
174
- mcpConnectionManager.callTool(serverId, 'search_news', { query: 'technology' })
173
+ mcpConnectionManager.callTool(serverName, serverIndex, 'get_weather', {
174
+ location: 'New York'
175
+ }),
176
+ mcpConnectionManager.callTool(serverName, serverIndex, 'search_news', {
177
+ query: 'technology'
178
+ })
175
179
  ]);
176
180
  expect(result1).toHaveProperty('temperature');
177
181
  expect(result1).toHaveProperty('condition');