@loop_ouroboros/mcp-hub-lite 1.0.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 (499) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/LICENSE +21 -0
  3. package/README.md +354 -0
  4. package/dist/client/assets/HomeView-f901HeKw.js +1 -0
  5. package/dist/client/assets/ResourceDetailView-BdOaL_-o.css +1 -0
  6. package/dist/client/assets/ResourceDetailView-Bz66ZjfY.js +1 -0
  7. package/dist/client/assets/ResourcesView-CjMklkyv.css +1 -0
  8. package/dist/client/assets/ResourcesView-lI_fItfA.js +1 -0
  9. package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +1 -0
  10. package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +2 -0
  11. package/dist/client/assets/ServerListView-Bws09jNR.css +1 -0
  12. package/dist/client/assets/ServerListView-CP6Ffkfx.js +30 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +1 -0
  14. package/dist/client/assets/SessionsView-D68qKR4D.js +1 -0
  15. package/dist/client/assets/SettingsView-BPYfO9BE.js +1 -0
  16. package/dist/client/assets/ToolCallDialog-Br8FNebN.js +1 -0
  17. package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +1 -0
  18. package/dist/client/assets/ToolsView-B6hUiR43.js +1 -0
  19. package/dist/client/assets/ToolsView-BLnU8cV6.css +1 -0
  20. package/dist/client/assets/_baseClone-DCmK847M.js +1 -0
  21. package/dist/client/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  22. package/dist/client/assets/el-form-item-BVMLpmVC.css +1 -0
  23. package/dist/client/assets/el-form-item-DM0q2hmO.js +12 -0
  24. package/dist/client/assets/el-input-BtI9NECe.js +1 -0
  25. package/dist/client/assets/el-input-CmuHb8HS.css +1 -0
  26. package/dist/client/assets/el-loading-CChNmKeI.js +1 -0
  27. package/dist/client/assets/el-loading-bpKhqqQq.css +1 -0
  28. package/dist/client/assets/el-overlay-B2ZKM6Up.css +1 -0
  29. package/dist/client/assets/el-overlay-lZZbPmsX.js +1 -0
  30. package/dist/client/assets/el-select-BXztu2b5.js +1 -0
  31. package/dist/client/assets/el-select-C0U_l4IZ.css +1 -0
  32. package/dist/client/assets/el-tab-pane-CnNoQHsR.css +1 -0
  33. package/dist/client/assets/el-tab-pane-Dy9ruaEX.js +1 -0
  34. package/dist/client/assets/el-table-column-98UyVgBH.js +1 -0
  35. package/dist/client/assets/el-table-column-T_mV9jNw.css +1 -0
  36. package/dist/client/assets/el-tag-B5lLT51E.js +1 -0
  37. package/dist/client/assets/el-tag-DjxZVOpb.css +1 -0
  38. package/dist/client/assets/event-BB_Ol6Sd.js +1 -0
  39. package/dist/client/assets/index-BgKcmWJr.js +1 -0
  40. package/dist/client/assets/index-BsDWtoIl.css +1 -0
  41. package/dist/client/assets/index-BzQXG7no.js +1 -0
  42. package/dist/client/assets/index-CSTs2jYk.js +2 -0
  43. package/dist/client/assets/omit-Bx5HJNV_.js +1 -0
  44. package/dist/client/assets/raf-B9VDMtMF.js +1 -0
  45. package/dist/client/assets/typescript-Bp3YSIOJ.js +1 -0
  46. package/dist/client/assets/vnode-B8aJx8u4.js +1 -0
  47. package/dist/client/assets/vue-vendor-6ny5zj9i.js +3 -0
  48. package/dist/client/index.html +15 -0
  49. package/dist/server/shared/index.d.ts +3 -0
  50. package/dist/server/shared/index.d.ts.map +1 -0
  51. package/dist/server/shared/index.js +2 -0
  52. package/dist/server/shared/models/index.d.ts +4 -0
  53. package/dist/server/shared/models/index.d.ts.map +1 -0
  54. package/dist/server/shared/models/index.js +3 -0
  55. package/dist/server/shared/models/resource.model.d.ts +8 -0
  56. package/dist/server/shared/models/resource.model.d.ts.map +1 -0
  57. package/dist/server/shared/models/resource.model.js +1 -0
  58. package/dist/server/shared/models/server.model.d.ts +57 -0
  59. package/dist/server/shared/models/server.model.d.ts.map +1 -0
  60. package/dist/server/shared/models/server.model.js +1 -0
  61. package/dist/server/shared/models/session.model.d.ts +73 -0
  62. package/dist/server/shared/models/session.model.d.ts.map +1 -0
  63. package/dist/server/shared/models/session.model.js +70 -0
  64. package/dist/server/shared/models/tool.model.d.ts +22 -0
  65. package/dist/server/shared/models/tool.model.d.ts.map +1 -0
  66. package/dist/server/shared/models/tool.model.js +1 -0
  67. package/dist/server/shared/types/client.types.d.ts +35 -0
  68. package/dist/server/shared/types/client.types.d.ts.map +1 -0
  69. package/dist/server/shared/types/client.types.js +5 -0
  70. package/dist/server/shared/types/common.types.d.ts +5 -0
  71. package/dist/server/shared/types/common.types.d.ts.map +1 -0
  72. package/dist/server/shared/types/common.types.js +2 -0
  73. package/dist/server/shared/types/index.d.ts +4 -0
  74. package/dist/server/shared/types/index.d.ts.map +1 -0
  75. package/dist/server/shared/types/index.js +3 -0
  76. package/dist/server/shared/types/session.types.d.ts +15 -0
  77. package/dist/server/shared/types/session.types.d.ts.map +1 -0
  78. package/dist/server/shared/types/session.types.js +5 -0
  79. package/dist/server/shared/types/websocket.types.d.ts +177 -0
  80. package/dist/server/shared/types/websocket.types.d.ts.map +1 -0
  81. package/dist/server/shared/types/websocket.types.js +25 -0
  82. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts +13 -0
  83. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -0
  84. package/dist/server/src/api/mcp/debug-response-wrapper.js +271 -0
  85. package/dist/server/src/api/mcp/gateway.d.ts +14 -0
  86. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -0
  87. package/dist/server/src/api/mcp/gateway.js +116 -0
  88. package/dist/server/src/api/mcp/session-context-extractor.d.ts +47 -0
  89. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -0
  90. package/dist/server/src/api/mcp/session-context-extractor.js +127 -0
  91. package/dist/server/src/api/mcp/sse-stream-manager.d.ts +13 -0
  92. package/dist/server/src/api/mcp/sse-stream-manager.d.ts.map +1 -0
  93. package/dist/server/src/api/mcp/sse-stream-manager.js +40 -0
  94. package/dist/server/src/api/web/clients.d.ts +30 -0
  95. package/dist/server/src/api/web/clients.d.ts.map +1 -0
  96. package/dist/server/src/api/web/clients.js +41 -0
  97. package/dist/server/src/api/web/config.d.ts +21 -0
  98. package/dist/server/src/api/web/config.d.ts.map +1 -0
  99. package/dist/server/src/api/web/config.js +119 -0
  100. package/dist/server/src/api/web/health.d.ts +21 -0
  101. package/dist/server/src/api/web/health.d.ts.map +1 -0
  102. package/dist/server/src/api/web/health.js +24 -0
  103. package/dist/server/src/api/web/hub-tools.d.ts +30 -0
  104. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -0
  105. package/dist/server/src/api/web/hub-tools.js +202 -0
  106. package/dist/server/src/api/web/logs.d.ts +30 -0
  107. package/dist/server/src/api/web/logs.d.ts.map +1 -0
  108. package/dist/server/src/api/web/logs.js +141 -0
  109. package/dist/server/src/api/web/mcp-status.d.ts +29 -0
  110. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -0
  111. package/dist/server/src/api/web/mcp-status.js +126 -0
  112. package/dist/server/src/api/web/resources.d.ts +28 -0
  113. package/dist/server/src/api/web/resources.d.ts.map +1 -0
  114. package/dist/server/src/api/web/resources.js +93 -0
  115. package/dist/server/src/api/web/search.d.ts +26 -0
  116. package/dist/server/src/api/web/search.d.ts.map +1 -0
  117. package/dist/server/src/api/web/search.js +62 -0
  118. package/dist/server/src/api/web/servers.d.ts +33 -0
  119. package/dist/server/src/api/web/servers.d.ts.map +1 -0
  120. package/dist/server/src/api/web/servers.js +235 -0
  121. package/dist/server/src/api/web/sessions.d.ts +29 -0
  122. package/dist/server/src/api/web/sessions.d.ts.map +1 -0
  123. package/dist/server/src/api/web/sessions.js +104 -0
  124. package/dist/server/src/api/ws/events.d.ts +29 -0
  125. package/dist/server/src/api/ws/events.d.ts.map +1 -0
  126. package/dist/server/src/api/ws/events.js +44 -0
  127. package/dist/server/src/api/ws/ws-handler.d.ts +83 -0
  128. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -0
  129. package/dist/server/src/api/ws/ws-handler.js +217 -0
  130. package/dist/server/src/app.d.ts +24 -0
  131. package/dist/server/src/app.d.ts.map +1 -0
  132. package/dist/server/src/app.js +108 -0
  133. package/dist/server/src/cli/commands/list.d.ts +71 -0
  134. package/dist/server/src/cli/commands/list.d.ts.map +1 -0
  135. package/dist/server/src/cli/commands/list.js +97 -0
  136. package/dist/server/src/cli/commands/restart.d.ts +42 -0
  137. package/dist/server/src/cli/commands/restart.d.ts.map +1 -0
  138. package/dist/server/src/cli/commands/restart.js +61 -0
  139. package/dist/server/src/cli/commands/start.d.ts +43 -0
  140. package/dist/server/src/cli/commands/start.d.ts.map +1 -0
  141. package/dist/server/src/cli/commands/start.js +160 -0
  142. package/dist/server/src/cli/commands/status.d.ts +39 -0
  143. package/dist/server/src/cli/commands/status.d.ts.map +1 -0
  144. package/dist/server/src/cli/commands/status.js +164 -0
  145. package/dist/server/src/cli/commands/stop.d.ts +34 -0
  146. package/dist/server/src/cli/commands/stop.d.ts.map +1 -0
  147. package/dist/server/src/cli/commands/stop.js +47 -0
  148. package/dist/server/src/cli/commands/ui.d.ts +44 -0
  149. package/dist/server/src/cli/commands/ui.d.ts.map +1 -0
  150. package/dist/server/src/cli/commands/ui.js +95 -0
  151. package/dist/server/src/cli/index.d.ts +62 -0
  152. package/dist/server/src/cli/index.d.ts.map +1 -0
  153. package/dist/server/src/cli/index.js +88 -0
  154. package/dist/server/src/cli/parse-args.d.ts +108 -0
  155. package/dist/server/src/cli/parse-args.d.ts.map +1 -0
  156. package/dist/server/src/cli/parse-args.js +131 -0
  157. package/dist/server/src/cli/server.d.ts +171 -0
  158. package/dist/server/src/cli/server.d.ts.map +1 -0
  159. package/dist/server/src/cli/server.js +246 -0
  160. package/dist/server/src/config/config-change-logger.d.ts +16 -0
  161. package/dist/server/src/config/config-change-logger.d.ts.map +1 -0
  162. package/dist/server/src/config/config-change-logger.js +43 -0
  163. package/dist/server/src/config/config-loader.d.ts +22 -0
  164. package/dist/server/src/config/config-loader.d.ts.map +1 -0
  165. package/dist/server/src/config/config-loader.js +66 -0
  166. package/dist/server/src/config/config-manager.d.ts +158 -0
  167. package/dist/server/src/config/config-manager.d.ts.map +1 -0
  168. package/dist/server/src/config/config-manager.js +246 -0
  169. package/dist/server/src/config/config-saver.d.ts +16 -0
  170. package/dist/server/src/config/config-saver.d.ts.map +1 -0
  171. package/dist/server/src/config/config-saver.js +28 -0
  172. package/dist/server/src/config/config.schema.d.ts +108 -0
  173. package/dist/server/src/config/config.schema.d.ts.map +1 -0
  174. package/dist/server/src/config/config.schema.js +103 -0
  175. package/dist/server/src/config/server-config-manager.d.ts +74 -0
  176. package/dist/server/src/config/server-config-manager.d.ts.map +1 -0
  177. package/dist/server/src/config/server-config-manager.js +157 -0
  178. package/dist/server/src/config/type-converter.d.ts +13 -0
  179. package/dist/server/src/config/type-converter.d.ts.map +1 -0
  180. package/dist/server/src/config/type-converter.js +37 -0
  181. package/dist/server/src/index.d.ts +3 -0
  182. package/dist/server/src/index.d.ts.map +1 -0
  183. package/dist/server/src/index.js +352 -0
  184. package/dist/server/src/models/event.model.d.ts +106 -0
  185. package/dist/server/src/models/event.model.d.ts.map +1 -0
  186. package/dist/server/src/models/event.model.js +5 -0
  187. package/dist/server/src/models/server.model.d.ts +19 -0
  188. package/dist/server/src/models/server.model.d.ts.map +1 -0
  189. package/dist/server/src/models/server.model.js +1 -0
  190. package/dist/server/src/models/system-tools.constants.d.ts +73 -0
  191. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -0
  192. package/dist/server/src/models/system-tools.constants.js +31 -0
  193. package/dist/server/src/models/types.d.ts +84 -0
  194. package/dist/server/src/models/types.d.ts.map +1 -0
  195. package/dist/server/src/models/types.js +67 -0
  196. package/dist/server/src/pid/file.d.ts +26 -0
  197. package/dist/server/src/pid/file.d.ts.map +1 -0
  198. package/dist/server/src/pid/file.js +68 -0
  199. package/dist/server/src/pid/manager.d.ts +98 -0
  200. package/dist/server/src/pid/manager.d.ts.map +1 -0
  201. package/dist/server/src/pid/manager.js +158 -0
  202. package/dist/server/src/pid/types.d.ts +13 -0
  203. package/dist/server/src/pid/types.d.ts.map +1 -0
  204. package/dist/server/src/pid/types.js +4 -0
  205. package/dist/server/src/server/dev-server.d.ts +2 -0
  206. package/dist/server/src/server/dev-server.d.ts.map +1 -0
  207. package/dist/server/src/server/dev-server.js +171 -0
  208. package/dist/server/src/server/runner.d.ts +57 -0
  209. package/dist/server/src/server/runner.d.ts.map +1 -0
  210. package/dist/server/src/server/runner.js +163 -0
  211. package/dist/server/src/services/client-tracker.service.d.ts +132 -0
  212. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -0
  213. package/dist/server/src/services/client-tracker.service.js +203 -0
  214. package/dist/server/src/services/connection/connection-manager.d.ts +478 -0
  215. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -0
  216. package/dist/server/src/services/connection/connection-manager.js +929 -0
  217. package/dist/server/src/services/connection/index.d.ts +6 -0
  218. package/dist/server/src/services/connection/index.d.ts.map +1 -0
  219. package/dist/server/src/services/connection/index.js +4 -0
  220. package/dist/server/src/services/connection/tool-cache.d.ts +122 -0
  221. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -0
  222. package/dist/server/src/services/connection/tool-cache.js +202 -0
  223. package/dist/server/src/services/connection/types.d.ts +30 -0
  224. package/dist/server/src/services/connection/types.d.ts.map +1 -0
  225. package/dist/server/src/services/connection/types.js +1 -0
  226. package/dist/server/src/services/event-bus.service.d.ts +169 -0
  227. package/dist/server/src/services/event-bus.service.d.ts.map +1 -0
  228. package/dist/server/src/services/event-bus.service.js +200 -0
  229. package/dist/server/src/services/gateway/gateway.service.d.ts +61 -0
  230. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -0
  231. package/dist/server/src/services/gateway/gateway.service.js +107 -0
  232. package/dist/server/src/services/gateway/index.d.ts +8 -0
  233. package/dist/server/src/services/gateway/index.d.ts.map +1 -0
  234. package/dist/server/src/services/gateway/index.js +6 -0
  235. package/dist/server/src/services/gateway/log-formatter.d.ts +26 -0
  236. package/dist/server/src/services/gateway/log-formatter.d.ts.map +1 -0
  237. package/dist/server/src/services/gateway/log-formatter.js +66 -0
  238. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +13 -0
  239. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -0
  240. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +131 -0
  241. package/dist/server/src/services/gateway/request-handlers/index.d.ts +9 -0
  242. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -0
  243. package/dist/server/src/services/gateway/request-handlers/index.js +8 -0
  244. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +11 -0
  245. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -0
  246. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +85 -0
  247. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts +11 -0
  248. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -0
  249. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +56 -0
  250. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts +11 -0
  251. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -0
  252. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +228 -0
  253. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts +11 -0
  254. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -0
  255. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +79 -0
  256. package/dist/server/src/services/gateway/tool-list-generator.d.ts +23 -0
  257. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -0
  258. package/dist/server/src/services/gateway/tool-list-generator.js +115 -0
  259. package/dist/server/src/services/gateway/types.d.ts +27 -0
  260. package/dist/server/src/services/gateway/types.d.ts.map +1 -0
  261. package/dist/server/src/services/gateway/types.js +4 -0
  262. package/dist/server/src/services/gateway.service.d.ts +7 -0
  263. package/dist/server/src/services/gateway.service.d.ts.map +1 -0
  264. package/dist/server/src/services/gateway.service.js +6 -0
  265. package/dist/server/src/services/hub-manager.service.d.ts +299 -0
  266. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -0
  267. package/dist/server/src/services/hub-manager.service.js +413 -0
  268. package/dist/server/src/services/hub-tools/index.d.ts +10 -0
  269. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -0
  270. package/dist/server/src/services/hub-tools/index.js +6 -0
  271. package/dist/server/src/services/hub-tools/resource-generator.d.ts +63 -0
  272. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -0
  273. package/dist/server/src/services/hub-tools/resource-generator.js +141 -0
  274. package/dist/server/src/services/hub-tools/server-selector.d.ts +63 -0
  275. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -0
  276. package/dist/server/src/services/hub-tools/server-selector.js +108 -0
  277. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +47 -0
  278. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -0
  279. package/dist/server/src/services/hub-tools/system-tool-definitions.js +225 -0
  280. package/dist/server/src/services/hub-tools/tool-search.d.ts +85 -0
  281. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -0
  282. package/dist/server/src/services/hub-tools/tool-search.js +115 -0
  283. package/dist/server/src/services/hub-tools/types.d.ts +42 -0
  284. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -0
  285. package/dist/server/src/services/hub-tools/types.js +1 -0
  286. package/dist/server/src/services/hub-tools.service.d.ts +235 -0
  287. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -0
  288. package/dist/server/src/services/hub-tools.service.js +457 -0
  289. package/dist/server/src/services/log-storage.service.d.ts +177 -0
  290. package/dist/server/src/services/log-storage.service.d.ts.map +1 -0
  291. package/dist/server/src/services/log-storage.service.js +243 -0
  292. package/dist/server/src/services/mcp-connection-manager.d.ts +7 -0
  293. package/dist/server/src/services/mcp-connection-manager.d.ts.map +1 -0
  294. package/dist/server/src/services/mcp-connection-manager.js +6 -0
  295. package/dist/server/src/services/mcp-session-manager.d.ts +6 -0
  296. package/dist/server/src/services/mcp-session-manager.d.ts.map +1 -0
  297. package/dist/server/src/services/mcp-session-manager.js +4 -0
  298. package/dist/server/src/services/search/index.d.ts +5 -0
  299. package/dist/server/src/services/search/index.d.ts.map +1 -0
  300. package/dist/server/src/services/search/index.js +5 -0
  301. package/dist/server/src/services/search/search-cache.d.ts +132 -0
  302. package/dist/server/src/services/search/search-cache.d.ts.map +1 -0
  303. package/dist/server/src/services/search/search-cache.js +151 -0
  304. package/dist/server/src/services/search/search-core.service.d.ts +108 -0
  305. package/dist/server/src/services/search/search-core.service.d.ts.map +1 -0
  306. package/dist/server/src/services/search/search-core.service.js +187 -0
  307. package/dist/server/src/services/search/search-scorer.d.ts +54 -0
  308. package/dist/server/src/services/search/search-scorer.d.ts.map +1 -0
  309. package/dist/server/src/services/search/search-scorer.js +83 -0
  310. package/dist/server/src/services/search/types.d.ts +20 -0
  311. package/dist/server/src/services/search/types.d.ts.map +1 -0
  312. package/dist/server/src/services/search/types.js +1 -0
  313. package/dist/server/src/services/session/index.d.ts +6 -0
  314. package/dist/server/src/services/session/index.d.ts.map +1 -0
  315. package/dist/server/src/services/session/index.js +4 -0
  316. package/dist/server/src/services/session/session-manager.d.ts +352 -0
  317. package/dist/server/src/services/session/session-manager.d.ts.map +1 -0
  318. package/dist/server/src/services/session/session-manager.js +835 -0
  319. package/dist/server/src/services/session/types.d.ts +32 -0
  320. package/dist/server/src/services/session/types.d.ts.map +1 -0
  321. package/dist/server/src/services/session/types.js +1 -0
  322. package/dist/server/src/services/simple-search.service.d.ts +67 -0
  323. package/dist/server/src/services/simple-search.service.d.ts.map +1 -0
  324. package/dist/server/src/services/simple-search.service.js +82 -0
  325. package/dist/server/src/services/system-tool-handler.d.ts +10 -0
  326. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -0
  327. package/dist/server/src/services/system-tool-handler.js +77 -0
  328. package/dist/server/src/utils/error-handler.d.ts +18 -0
  329. package/dist/server/src/utils/error-handler.d.ts.map +1 -0
  330. package/dist/server/src/utils/error-handler.js +59 -0
  331. package/dist/server/src/utils/format-utils.d.ts +23 -0
  332. package/dist/server/src/utils/format-utils.d.ts.map +1 -0
  333. package/dist/server/src/utils/format-utils.js +58 -0
  334. package/dist/server/src/utils/index.d.ts +2 -0
  335. package/dist/server/src/utils/index.d.ts.map +1 -0
  336. package/dist/server/src/utils/index.js +1 -0
  337. package/dist/server/src/utils/json-utils.d.ts +82 -0
  338. package/dist/server/src/utils/json-utils.d.ts.map +1 -0
  339. package/dist/server/src/utils/json-utils.js +204 -0
  340. package/dist/server/src/utils/log-rotator.d.ts +223 -0
  341. package/dist/server/src/utils/log-rotator.d.ts.map +1 -0
  342. package/dist/server/src/utils/log-rotator.js +306 -0
  343. package/dist/server/src/utils/logger/dev-logger.d.ts +39 -0
  344. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -0
  345. package/dist/server/src/utils/logger/dev-logger.js +63 -0
  346. package/dist/server/src/utils/logger/index.d.ts +36 -0
  347. package/dist/server/src/utils/logger/index.d.ts.map +1 -0
  348. package/dist/server/src/utils/logger/index.js +46 -0
  349. package/dist/server/src/utils/logger/log-colors.d.ts +27 -0
  350. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -0
  351. package/dist/server/src/utils/logger/log-colors.js +41 -0
  352. package/dist/server/src/utils/logger/log-context.d.ts +13 -0
  353. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -0
  354. package/dist/server/src/utils/logger/log-context.js +5 -0
  355. package/dist/server/src/utils/logger/log-formatter.d.ts +47 -0
  356. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -0
  357. package/dist/server/src/utils/logger/log-formatter.js +150 -0
  358. package/dist/server/src/utils/logger/log-modules.d.ts +141 -0
  359. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -0
  360. package/dist/server/src/utils/logger/log-modules.js +81 -0
  361. package/dist/server/src/utils/logger/log-output.d.ts +68 -0
  362. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -0
  363. package/dist/server/src/utils/logger/log-output.js +320 -0
  364. package/dist/server/src/utils/logger/logger.d.ts +190 -0
  365. package/dist/server/src/utils/logger/logger.d.ts.map +1 -0
  366. package/dist/server/src/utils/logger/logger.js +350 -0
  367. package/dist/server/src/utils/logger.d.ts +12 -0
  368. package/dist/server/src/utils/logger.d.ts.map +1 -0
  369. package/dist/server/src/utils/logger.js +12 -0
  370. package/dist/server/src/utils/mcp-error-handler.d.ts +162 -0
  371. package/dist/server/src/utils/mcp-error-handler.d.ts.map +1 -0
  372. package/dist/server/src/utils/mcp-error-handler.js +270 -0
  373. package/dist/server/src/utils/port-checker.d.ts +16 -0
  374. package/dist/server/src/utils/port-checker.d.ts.map +1 -0
  375. package/dist/server/src/utils/port-checker.js +242 -0
  376. package/dist/server/src/utils/request-context.d.ts +71 -0
  377. package/dist/server/src/utils/request-context.d.ts.map +1 -0
  378. package/dist/server/src/utils/request-context.js +73 -0
  379. package/dist/server/src/utils/tool-args-parser.d.ts +17 -0
  380. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -0
  381. package/dist/server/src/utils/tool-args-parser.js +34 -0
  382. package/dist/server/src/utils/transports/sse-transport.d.ts +104 -0
  383. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -0
  384. package/dist/server/src/utils/transports/sse-transport.js +189 -0
  385. package/dist/server/src/utils/transports/stdio-transport.d.ts +122 -0
  386. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -0
  387. package/dist/server/src/utils/transports/stdio-transport.js +324 -0
  388. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +146 -0
  389. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -0
  390. package/dist/server/src/utils/transports/streamable-http-transport.js +212 -0
  391. package/dist/server/src/utils/transports/transport-factory.d.ts +26 -0
  392. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -0
  393. package/dist/server/src/utils/transports/transport-factory.js +104 -0
  394. package/dist/server/src/utils/transports/transport.interface.d.ts +35 -0
  395. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -0
  396. package/dist/server/src/utils/transports/transport.interface.js +1 -0
  397. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts +2 -0
  398. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts.map +1 -0
  399. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +103 -0
  400. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts +2 -0
  401. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts.map +1 -0
  402. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +181 -0
  403. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts +2 -0
  404. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts.map +1 -0
  405. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +155 -0
  406. package/dist/server/tests/evaluation/evaluation.test.d.ts +2 -0
  407. package/dist/server/tests/evaluation/evaluation.test.d.ts.map +1 -0
  408. package/dist/server/tests/evaluation/evaluation.test.js +102 -0
  409. package/dist/server/tests/helpers/sdk-test-helpers.d.ts +32 -0
  410. package/dist/server/tests/helpers/sdk-test-helpers.d.ts.map +1 -0
  411. package/dist/server/tests/helpers/sdk-test-helpers.js +82 -0
  412. package/dist/server/tests/integration/api/gateway.test.d.ts +2 -0
  413. package/dist/server/tests/integration/api/gateway.test.d.ts.map +1 -0
  414. package/dist/server/tests/integration/api/gateway.test.js +366 -0
  415. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts +2 -0
  416. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts.map +1 -0
  417. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +109 -0
  418. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts +2 -0
  419. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts.map +1 -0
  420. package/dist/server/tests/integration/gateway/mcp-connection.test.js +149 -0
  421. package/dist/server/tests/server.test.d.ts +2 -0
  422. package/dist/server/tests/server.test.d.ts.map +1 -0
  423. package/dist/server/tests/server.test.js +95 -0
  424. package/dist/server/tests/setup.d.ts +7 -0
  425. package/dist/server/tests/setup.d.ts.map +1 -0
  426. package/dist/server/tests/setup.js +53 -0
  427. package/dist/server/tests/types/logger-test-helpers.d.ts +17 -0
  428. package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -0
  429. package/dist/server/tests/types/logger-test-helpers.js +4 -0
  430. package/dist/server/tests/types/test-helpers.d.ts +27 -0
  431. package/dist/server/tests/types/test-helpers.d.ts.map +1 -0
  432. package/dist/server/tests/types/test-helpers.js +4 -0
  433. package/dist/server/tests/unit/cli/basic-cli.test.d.ts +2 -0
  434. package/dist/server/tests/unit/cli/basic-cli.test.d.ts.map +1 -0
  435. package/dist/server/tests/unit/cli/basic-cli.test.js +33 -0
  436. package/dist/server/tests/unit/cli/cli.test.d.ts +2 -0
  437. package/dist/server/tests/unit/cli/cli.test.d.ts.map +1 -0
  438. package/dist/server/tests/unit/cli/cli.test.js +17 -0
  439. package/dist/server/tests/unit/cli/commands.test.d.ts +2 -0
  440. package/dist/server/tests/unit/cli/commands.test.d.ts.map +1 -0
  441. package/dist/server/tests/unit/cli/commands.test.js +75 -0
  442. package/dist/server/tests/unit/cli/server.test.d.ts +2 -0
  443. package/dist/server/tests/unit/cli/server.test.d.ts.map +1 -0
  444. package/dist/server/tests/unit/cli/server.test.js +68 -0
  445. package/dist/server/tests/unit/server/runner.test.d.ts +2 -0
  446. package/dist/server/tests/unit/server/runner.test.d.ts.map +1 -0
  447. package/dist/server/tests/unit/server/runner.test.js +488 -0
  448. package/dist/server/tests/unit/server/setup.d.ts +2 -0
  449. package/dist/server/tests/unit/server/setup.d.ts.map +1 -0
  450. package/dist/server/tests/unit/server/setup.js +21 -0
  451. package/dist/server/tests/unit/services/gateway-logging.test.d.ts +2 -0
  452. package/dist/server/tests/unit/services/gateway-logging.test.d.ts.map +1 -0
  453. package/dist/server/tests/unit/services/gateway-logging.test.js +47 -0
  454. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts +2 -0
  455. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts.map +1 -0
  456. package/dist/server/tests/unit/services/hub-manager-service.test.js +140 -0
  457. package/dist/server/tests/unit/services/hub-manager.test.d.ts +2 -0
  458. package/dist/server/tests/unit/services/hub-manager.test.d.ts.map +1 -0
  459. package/dist/server/tests/unit/services/hub-manager.test.js +98 -0
  460. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts +2 -0
  461. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts.map +1 -0
  462. package/dist/server/tests/unit/services/hub-tools.service.test.js +674 -0
  463. package/dist/server/tests/unit/services/search/search-cache.test.d.ts +2 -0
  464. package/dist/server/tests/unit/services/search/search-cache.test.d.ts.map +1 -0
  465. package/dist/server/tests/unit/services/search/search-cache.test.js +58 -0
  466. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts +2 -0
  467. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts.map +1 -0
  468. package/dist/server/tests/unit/services/search/search-core.service.test.js +84 -0
  469. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts +2 -0
  470. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts.map +1 -0
  471. package/dist/server/tests/unit/services/search/search-scorer.test.js +97 -0
  472. package/dist/server/tests/unit/services/session-manager.test.d.ts +2 -0
  473. package/dist/server/tests/unit/services/session-manager.test.d.ts.map +1 -0
  474. package/dist/server/tests/unit/services/session-manager.test.js +481 -0
  475. package/dist/server/tests/unit/utils/config.test.d.ts +2 -0
  476. package/dist/server/tests/unit/utils/config.test.d.ts.map +1 -0
  477. package/dist/server/tests/unit/utils/config.test.js +634 -0
  478. package/dist/server/tests/unit/utils/json-utils.test.d.ts +2 -0
  479. package/dist/server/tests/unit/utils/json-utils.test.d.ts.map +1 -0
  480. package/dist/server/tests/unit/utils/json-utils.test.js +296 -0
  481. package/dist/server/tests/unit/utils/log-rotator.test.d.ts +2 -0
  482. package/dist/server/tests/unit/utils/log-rotator.test.d.ts.map +1 -0
  483. package/dist/server/tests/unit/utils/log-rotator.test.js +296 -0
  484. package/dist/server/tests/unit/utils/logger.test.d.ts +2 -0
  485. package/dist/server/tests/unit/utils/logger.test.d.ts.map +1 -0
  486. package/dist/server/tests/unit/utils/logger.test.js +462 -0
  487. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts +2 -0
  488. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts.map +1 -0
  489. package/dist/server/tests/unit/utils/mcp-error-handler.test.js +163 -0
  490. package/dist/server/tests/unit/utils/request-context.test.d.ts +2 -0
  491. package/dist/server/tests/unit/utils/request-context.test.d.ts.map +1 -0
  492. package/dist/server/tests/unit/utils/request-context.test.js +82 -0
  493. package/dist/server/vite.config.d.ts +3 -0
  494. package/dist/server/vite.config.d.ts.map +1 -0
  495. package/dist/server/vite.config.js +160 -0
  496. package/dist/server/vitest.config.d.ts +3 -0
  497. package/dist/server/vitest.config.d.ts.map +1 -0
  498. package/dist/server/vitest.config.js +53 -0
  499. package/package.json +113 -0
@@ -0,0 +1,634 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+ import { ConfigManager } from '../../../src/config/config-manager.js';
6
+ // Reset module cache to ensure each import is fresh
7
+ vi.resetModules();
8
+ describe('ConfigManager', () => {
9
+ let configManager;
10
+ let tempConfigDir;
11
+ let tempConfigPath;
12
+ let originalEnv;
13
+ beforeEach(() => {
14
+ // Save original environment variables
15
+ originalEnv = { ...process.env };
16
+ // Create temporary config directory
17
+ const testRunId = `config-test-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
18
+ tempConfigDir = path.join(os.tmpdir(), `mcp-hub-config-test-${testRunId}`);
19
+ tempConfigPath = path.join(tempConfigDir, '.mcp-hub.json');
20
+ // Ensure temporary directory exists
21
+ fs.mkdirSync(tempConfigDir, { recursive: true });
22
+ // Set environment variable to point to temporary config file
23
+ process.env.MCP_HUB_CONFIG_PATH = tempConfigPath;
24
+ // Clear other environment variables that might affect tests
25
+ delete process.env.PORT;
26
+ delete process.env.HOST;
27
+ delete process.env.LOG_LEVEL;
28
+ // Create new instance directly, without using singleton pattern
29
+ configManager = new ConfigManager(tempConfigPath);
30
+ });
31
+ afterEach(() => {
32
+ // Force garbage collection to ensure config manager instance is destroyed
33
+ // Since tests need to frequently create and destroy instances, don't set to null here
34
+ // Instead, let each test case create a new instance
35
+ // Restore original environment variables
36
+ process.env = { ...originalEnv };
37
+ // Clean up temporary directory with retry mechanism to prevent permission issues
38
+ if (fs.existsSync(tempConfigDir)) {
39
+ let retries = 3;
40
+ while (retries > 0) {
41
+ try {
42
+ fs.rmSync(tempConfigDir, { recursive: true, force: true });
43
+ break;
44
+ }
45
+ catch (error) {
46
+ console.warn(`Failed to clean up test temp directory (retries left: ${retries - 1}): ${error}`);
47
+ retries--;
48
+ if (retries > 0) {
49
+ // Wait for a while before retrying
50
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
51
+ }
52
+ }
53
+ }
54
+ }
55
+ // Clean up mocks
56
+ vi.restoreAllMocks();
57
+ });
58
+ describe('Configuration Loading', () => {
59
+ it('should create default config when no config file exists', () => {
60
+ // Ensure config file doesn't exist
61
+ if (fs.existsSync(tempConfigPath)) {
62
+ fs.unlinkSync(tempConfigPath);
63
+ }
64
+ configManager = new ConfigManager(tempConfigPath);
65
+ const config = configManager.getConfig();
66
+ // Verify default configuration
67
+ expect(config).toBeDefined();
68
+ expect(config.version).toBe('1.0.0');
69
+ expect(config.system.host).toBe('localhost');
70
+ expect(config.system.port).toBe(7788);
71
+ expect(config.servers).toEqual({});
72
+ });
73
+ it('should load existing config file', () => {
74
+ const testConfig = {
75
+ version: '1.0.0',
76
+ system: {
77
+ host: 'test-host',
78
+ port: 8080,
79
+ language: 'en',
80
+ theme: 'light',
81
+ logging: {
82
+ level: 'debug',
83
+ rotation: {
84
+ enabled: true,
85
+ maxAge: '30d'
86
+ }
87
+ }
88
+ },
89
+ security: {
90
+ allowedNetworks: ['127.0.0.1'],
91
+ maxConcurrentConnections: 10,
92
+ connectionTimeout: 15000,
93
+ idleConnectionTimeout: 60000,
94
+ sessionTimeout: 30 * 60 * 1000,
95
+ maxConnections: 20
96
+ },
97
+ servers: {
98
+ 'test-server': {
99
+ command: 'test-command',
100
+ args: ['arg1', 'arg2'],
101
+ enabled: true,
102
+ type: 'stdio',
103
+ timeout: 30000
104
+ }
105
+ },
106
+ observability: {
107
+ tracing: {
108
+ enabled: true,
109
+ exporter: 'otlp',
110
+ endpoint: 'http://test:4318/v1/traces',
111
+ sampleRate: 0.5
112
+ }
113
+ }
114
+ };
115
+ // Write test config file
116
+ fs.writeFileSync(tempConfigPath, JSON.stringify(testConfig, null, 2));
117
+ configManager = new ConfigManager(tempConfigPath);
118
+ const config = configManager.getConfig();
119
+ // Verify loaded configuration
120
+ expect(config.system.host).toBe('test-host');
121
+ expect(config.system.port).toBe(8080);
122
+ expect(config.servers['test-server']).toBeDefined();
123
+ expect(config.servers['test-server'].command).toBe('test-command');
124
+ });
125
+ it('should handle invalid config file gracefully', () => {
126
+ // Write invalid JSON
127
+ fs.writeFileSync(tempConfigPath, 'invalid json content');
128
+ configManager = new ConfigManager(tempConfigPath);
129
+ const config = configManager.getConfig();
130
+ // Should fall back to default configuration
131
+ expect(config.version).toBe('1.0.0');
132
+ expect(config.system.host).toBe('localhost');
133
+ });
134
+ });
135
+ describe('Configuration Saving', () => {
136
+ it('should save config to file', () => {
137
+ console.log('[TEST] Starting "should save config to file" test');
138
+ console.log('[TEST] tempConfigPath:', tempConfigPath);
139
+ configManager = new ConfigManager(tempConfigPath);
140
+ // Log initial configuration
141
+ const initialConfig = configManager.getConfig();
142
+ console.log('[TEST] Initial config:', JSON.stringify(initialConfig));
143
+ // Modify configuration
144
+ configManager.updateConfig({
145
+ system: {
146
+ host: 'new-host',
147
+ port: 9090,
148
+ language: 'zh',
149
+ theme: 'system',
150
+ logging: {
151
+ level: 'info',
152
+ rotationAge: '7d',
153
+ jsonPretty: true,
154
+ mcpCommDebug: false,
155
+ sessionDebug: false
156
+ }
157
+ }
158
+ });
159
+ // Log in-memory configuration
160
+ const memoryConfig = configManager.getConfig();
161
+ console.log('[TEST] Memory config after update:', JSON.stringify(memoryConfig));
162
+ // Verify file was created and contains correct content
163
+ expect(fs.existsSync(tempConfigPath)).toBe(true);
164
+ const savedContent = fs.readFileSync(tempConfigPath, 'utf-8');
165
+ console.log('[TEST] File content:', savedContent);
166
+ const savedConfig = JSON.parse(savedContent);
167
+ console.log('[TEST] Parsed config from file:', JSON.stringify(savedConfig));
168
+ expect(savedConfig.system.host).toBe('new-host');
169
+ expect(savedConfig.system.port).toBe(9090);
170
+ console.log('[TEST] Test passed');
171
+ });
172
+ it('should create config directory if it does not exist', () => {
173
+ const testRunId = `non-existent-dir-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
174
+ const nonExistentPath = path.join(os.tmpdir(), testRunId, '.mcp-hub.json');
175
+ // Ensure directory doesn't exist
176
+ if (fs.existsSync(path.dirname(nonExistentPath))) {
177
+ let retries = 3;
178
+ while (retries > 0) {
179
+ try {
180
+ fs.rmSync(path.dirname(nonExistentPath), { recursive: true, force: true });
181
+ break;
182
+ }
183
+ catch (error) {
184
+ console.warn(`Failed to remove existing directory (retries left: ${retries - 1}): ${error}`);
185
+ retries--;
186
+ if (retries > 0) {
187
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
188
+ }
189
+ }
190
+ }
191
+ }
192
+ configManager = new ConfigManager(nonExistentPath);
193
+ // Modify configuration to trigger save
194
+ configManager.updateConfig({
195
+ system: {
196
+ host: 'test-host',
197
+ port: 7788,
198
+ language: 'zh',
199
+ theme: 'system',
200
+ logging: {
201
+ level: 'info',
202
+ rotationAge: '7d',
203
+ jsonPretty: true,
204
+ mcpCommDebug: false,
205
+ sessionDebug: false
206
+ }
207
+ }
208
+ });
209
+ // Verify both directory and file were created
210
+ expect(fs.existsSync(nonExistentPath)).toBe(true);
211
+ // Clean up
212
+ if (fs.existsSync(path.dirname(nonExistentPath))) {
213
+ let retries = 3;
214
+ while (retries > 0) {
215
+ try {
216
+ fs.rmSync(path.dirname(nonExistentPath), { recursive: true, force: true });
217
+ break;
218
+ }
219
+ catch (error) {
220
+ console.warn(`Failed to clean up test directory (retries left: ${retries - 1}): ${error}`);
221
+ retries--;
222
+ if (retries > 0) {
223
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
224
+ }
225
+ }
226
+ }
227
+ }
228
+ });
229
+ it('should handle save errors gracefully', async () => {
230
+ configManager = new ConfigManager(tempConfigPath);
231
+ // Mock fs.writeFileSync to throw error
232
+ vi.spyOn(fs, 'writeFileSync').mockImplementation(() => {
233
+ throw new Error('Permission denied');
234
+ });
235
+ // Provide complete system config to pass schema validation
236
+ const validConfig = {
237
+ system: {
238
+ host: 'test-host',
239
+ port: 8080,
240
+ language: 'en',
241
+ theme: 'light',
242
+ logging: {
243
+ level: 'info',
244
+ rotationAge: '7d',
245
+ jsonPretty: true,
246
+ mcpCommDebug: false,
247
+ sessionDebug: false
248
+ }
249
+ }
250
+ };
251
+ // This call should not throw an exception
252
+ await expect(configManager.updateConfig(validConfig)).resolves.not.toThrow();
253
+ // Restore mock
254
+ vi.restoreAllMocks();
255
+ });
256
+ });
257
+ describe('Server Management', () => {
258
+ beforeEach(() => {
259
+ configManager = new ConfigManager(tempConfigPath);
260
+ });
261
+ it('should add a new server', async () => {
262
+ const serverConfig = {
263
+ command: 'test-command',
264
+ args: ['arg1'],
265
+ enabled: true,
266
+ type: 'stdio'
267
+ };
268
+ await configManager.addServer('test-server', serverConfig);
269
+ const servers = configManager.getServers();
270
+ expect(servers).toHaveLength(1);
271
+ expect(servers[0].name).toBe('test-server');
272
+ expect(servers[0].config.command).toBe('test-command');
273
+ });
274
+ it('should validate server config when adding', async () => {
275
+ const invalidServerConfig = {
276
+ command: 'test-command',
277
+ type: 'invalid-type' // Invalid type
278
+ };
279
+ await expect(configManager.addServer('test-server', invalidServerConfig)).rejects.toThrow();
280
+ });
281
+ it('should get server by name', () => {
282
+ const serverConfig = {
283
+ command: 'test-command',
284
+ enabled: true,
285
+ type: 'stdio'
286
+ };
287
+ configManager.addServer('test-server', serverConfig);
288
+ const server = configManager.getServerByName('test-server');
289
+ expect(server).toBeDefined();
290
+ expect(server?.command).toBe('test-command');
291
+ const nonExistentServer = configManager.getServerByName('non-existent');
292
+ expect(nonExistentServer).toBeUndefined();
293
+ });
294
+ it('should update existing server', async () => {
295
+ const initialConfig = {
296
+ command: 'initial-command',
297
+ enabled: true,
298
+ type: 'stdio'
299
+ };
300
+ await configManager.addServer('test-server', initialConfig);
301
+ const updates = {
302
+ command: 'updated-command',
303
+ enabled: false
304
+ };
305
+ await configManager.updateServer('test-server', updates);
306
+ const updatedServer = configManager.getServerByName('test-server');
307
+ expect(updatedServer?.command).toBe('updated-command');
308
+ expect(updatedServer?.enabled).toBe(false);
309
+ });
310
+ it('should not update non-existent server', async () => {
311
+ await configManager.updateServer('non-existent', { enabled: false });
312
+ const server = configManager.getServerByName('non-existent');
313
+ expect(server).toBeUndefined();
314
+ });
315
+ it('should remove server', async () => {
316
+ await configManager.addServer('test-server', {
317
+ command: 'test-command',
318
+ enabled: true,
319
+ type: 'stdio'
320
+ });
321
+ await configManager.removeServer('test-server');
322
+ const server = configManager.getServerByName('test-server');
323
+ expect(server).toBeUndefined();
324
+ });
325
+ it('should not remove non-existent server', async () => {
326
+ await configManager.removeServer('non-existent');
327
+ // Should not throw an exception
328
+ });
329
+ });
330
+ describe('Server Instance Management', () => {
331
+ beforeEach(() => {
332
+ configManager = new ConfigManager(tempConfigPath);
333
+ });
334
+ it('should add server instance with auto-generated ID', async () => {
335
+ // Add server first
336
+ await configManager.addServer('test-server', {
337
+ command: 'test-command',
338
+ enabled: true,
339
+ type: 'stdio'
340
+ });
341
+ const instanceConfig = {
342
+ pid: 12345
343
+ };
344
+ const instance = await configManager.addServerInstance('test-server', instanceConfig);
345
+ expect(instance.id).toBeDefined();
346
+ expect(instance.pid).toBe(12345);
347
+ expect(instance.timestamp).toBeDefined();
348
+ expect(instance.hash).toBeDefined();
349
+ });
350
+ it('should add server instance with provided ID', async () => {
351
+ await configManager.addServer('test-server', {
352
+ command: 'test-command',
353
+ enabled: true,
354
+ type: 'stdio'
355
+ });
356
+ const instanceConfig = {
357
+ id: 'custom-id',
358
+ timestamp: 1234567890,
359
+ hash: 'custom-hash',
360
+ pid: 12345
361
+ };
362
+ const instance = await configManager.addServerInstance('test-server', instanceConfig);
363
+ expect(instance.id).toBe('custom-id');
364
+ expect(instance.timestamp).toBe(1234567890);
365
+ expect(instance.hash).toBe('custom-hash');
366
+ expect(instance.pid).toBe(12345);
367
+ });
368
+ it('should validate server instance config', async () => {
369
+ await configManager.addServer('test-server', {
370
+ command: 'test-command',
371
+ enabled: true,
372
+ type: 'stdio'
373
+ });
374
+ const invalidInstance = {
375
+ id: 'test-id',
376
+ timestamp: 'invalid-timestamp' // Should be a number
377
+ };
378
+ await expect(configManager.addServerInstance('test-server', invalidInstance)).rejects.toThrow();
379
+ });
380
+ it('should get server instances by name', () => {
381
+ const instances = configManager.getServerInstanceByName('non-existent');
382
+ expect(instances).toHaveLength(0);
383
+ // Add server and instance
384
+ configManager.addServer('test-server', {
385
+ command: 'test-command',
386
+ enabled: true,
387
+ type: 'stdio'
388
+ });
389
+ configManager.addServerInstance('test-server', { pid: 12345 });
390
+ const testInstances = configManager.getServerInstanceByName('test-server');
391
+ expect(testInstances).toHaveLength(1);
392
+ });
393
+ it('should get all server instances', () => {
394
+ const allInstances = configManager.getServerInstances();
395
+ expect(Object.keys(allInstances)).toHaveLength(0);
396
+ // Add server and instance
397
+ configManager.addServer('server1', {
398
+ command: 'cmd1',
399
+ enabled: true,
400
+ type: 'stdio'
401
+ });
402
+ configManager.addServer('server2', {
403
+ command: 'cmd2',
404
+ enabled: true,
405
+ type: 'stdio'
406
+ });
407
+ configManager.addServerInstance('server1', { pid: 12345 });
408
+ configManager.addServerInstance('server2', { pid: 67890 });
409
+ const allInstancesAfter = configManager.getServerInstances();
410
+ expect(Object.keys(allInstancesAfter)).toHaveLength(2);
411
+ expect(allInstancesAfter.server1).toHaveLength(1);
412
+ expect(allInstancesAfter.server2).toHaveLength(1);
413
+ });
414
+ it('should get server by instance ID', async () => {
415
+ await configManager.addServer('test-server', {
416
+ command: 'test-command',
417
+ enabled: true,
418
+ type: 'stdio'
419
+ });
420
+ await configManager.addServerInstance('test-server', {
421
+ id: 'test-instance-id',
422
+ timestamp: Date.now(),
423
+ hash: 'test-hash',
424
+ pid: 12345
425
+ });
426
+ const result = configManager.getServerById('test-instance-id');
427
+ expect(result).toBeDefined();
428
+ expect(result?.name).toBe('test-server');
429
+ expect(result?.instance.id).toBe('test-instance-id');
430
+ expect(result?.config.command).toBe('test-command');
431
+ const nonExistent = configManager.getServerById('non-existent');
432
+ expect(nonExistent).toBeUndefined();
433
+ });
434
+ it('should update server instance', async () => {
435
+ await configManager.addServer('test-server', {
436
+ command: 'test-command',
437
+ enabled: true,
438
+ type: 'stdio'
439
+ });
440
+ await configManager.addServerInstance('test-server', { pid: 12345 });
441
+ await configManager.updateServerInstance('test-server', 0, { pid: 54321 });
442
+ const instances = configManager.getServerInstanceByName('test-server');
443
+ expect(instances[0].pid).toBe(54321);
444
+ });
445
+ it('should remove server instance', async () => {
446
+ await configManager.addServer('test-server', {
447
+ command: 'test-command',
448
+ enabled: true,
449
+ type: 'stdio'
450
+ });
451
+ await configManager.addServerInstance('test-server', { pid: 12345 });
452
+ await configManager.addServerInstance('test-server', { pid: 67890 });
453
+ await configManager.removeServerInstance('test-server', 0);
454
+ const instances = configManager.getServerInstanceByName('test-server');
455
+ expect(instances).toHaveLength(1);
456
+ expect(instances[0].pid).toBe(67890);
457
+ });
458
+ });
459
+ describe('Configuration Updates and Change Logging', () => {
460
+ beforeEach(() => {
461
+ configManager = new ConfigManager(tempConfigPath);
462
+ });
463
+ it('should update system config', async () => {
464
+ const newConfig = {
465
+ system: {
466
+ host: 'new-host',
467
+ port: 9090,
468
+ language: 'zh',
469
+ theme: 'system',
470
+ logging: {
471
+ level: 'info',
472
+ rotationAge: '7d',
473
+ jsonPretty: true,
474
+ mcpCommDebug: false,
475
+ sessionDebug: false
476
+ }
477
+ },
478
+ security: {
479
+ allowedNetworks: ['127.0.0.1', '::1'],
480
+ maxConcurrentConnections: 100,
481
+ connectionTimeout: 30000,
482
+ idleConnectionTimeout: 60000,
483
+ sessionTimeout: 30 * 60 * 1000,
484
+ sessionFlushInterval: 15 * 60 * 1000,
485
+ maxConnections: 1000
486
+ }
487
+ };
488
+ await configManager.updateConfig(newConfig);
489
+ const config = configManager.getConfig();
490
+ expect(config.system.host).toBe('new-host');
491
+ expect(config.system.port).toBe(9090);
492
+ expect(config.security.maxConcurrentConnections).toBe(100);
493
+ });
494
+ it('should log configuration changes', async () => {
495
+ // Mock logger
496
+ const loggerInfoSpy = vi.spyOn(console, 'info').mockImplementation(() => { });
497
+ await configManager.updateConfig({
498
+ system: {
499
+ host: 'new-host',
500
+ port: 7788,
501
+ language: 'zh',
502
+ theme: 'system',
503
+ logging: {
504
+ level: 'info',
505
+ rotationAge: '7d',
506
+ jsonPretty: true,
507
+ mcpCommDebug: false,
508
+ sessionDebug: false
509
+ }
510
+ }
511
+ });
512
+ // Verify logger is called (note: actual logging happens in logger module)
513
+ // Since logger is an external dependency, we primarily verify the configuration update itself
514
+ const config = configManager.getConfig();
515
+ expect(config.system.host).toBe('new-host');
516
+ loggerInfoSpy.mockRestore();
517
+ });
518
+ it('should handle partial config updates', async () => {
519
+ // Initial configuration
520
+ const initialConfig = configManager.getConfig();
521
+ // Update only partial configuration
522
+ await configManager.updateConfig({
523
+ system: {
524
+ port: 9999,
525
+ host: initialConfig.system.host,
526
+ language: initialConfig.system.language,
527
+ theme: initialConfig.system.theme,
528
+ logging: initialConfig.system.logging
529
+ }
530
+ });
531
+ const updatedConfig = configManager.getConfig();
532
+ // Verify only the specified parts are updated
533
+ expect(updatedConfig.system.port).toBe(9999);
534
+ expect(updatedConfig.system.host).toBe(initialConfig.system.host); // Not changed
535
+ });
536
+ });
537
+ describe('Configuration Synchronization', () => {
538
+ it('should reload config from file', async () => {
539
+ configManager = new ConfigManager(tempConfigPath);
540
+ // Modify configuration in memory
541
+ await configManager.updateConfig({
542
+ system: {
543
+ host: 'memory-host',
544
+ port: 7788,
545
+ language: 'zh',
546
+ theme: 'system',
547
+ logging: {
548
+ level: 'info',
549
+ rotationAge: '7d',
550
+ jsonPretty: true,
551
+ mcpCommDebug: false,
552
+ sessionDebug: false
553
+ }
554
+ }
555
+ });
556
+ // Directly modify file content
557
+ const fileConfig = {
558
+ version: '1.0.0',
559
+ system: {
560
+ host: 'file-host',
561
+ port: 7788,
562
+ language: 'zh',
563
+ theme: 'system',
564
+ logging: {
565
+ level: 'info',
566
+ rotationAge: '7d',
567
+ jsonPretty: true,
568
+ mcpCommDebug: false,
569
+ sessionDebug: false
570
+ }
571
+ },
572
+ security: {
573
+ allowedNetworks: ['127.0.0.1'],
574
+ maxConcurrentConnections: 50,
575
+ connectionTimeout: 30000,
576
+ idleConnectionTimeout: 300000,
577
+ sessionTimeout: 30 * 60 * 1000,
578
+ maxConnections: 50
579
+ },
580
+ servers: {},
581
+ observability: {
582
+ tracing: {
583
+ enabled: false,
584
+ exporter: 'console',
585
+ endpoint: 'http://localhost:4318/v1/traces',
586
+ sampleRate: 1.0
587
+ }
588
+ }
589
+ };
590
+ fs.writeFileSync(tempConfigPath, JSON.stringify(fileConfig, null, 2));
591
+ // Synchronize configuration
592
+ await configManager.syncConfig();
593
+ const syncedConfig = configManager.getConfig();
594
+ expect(syncedConfig.system.host).toBe('file-host');
595
+ });
596
+ });
597
+ describe('Edge Cases and Error Handling', () => {
598
+ it('should handle constructor with temp config path', () => {
599
+ // Use temporary directory to create config file path
600
+ const tempDir = path.join(os.tmpdir(), `mcp-hub-test-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`);
601
+ fs.mkdirSync(tempDir, { recursive: true });
602
+ const testTempConfigPath = path.join(tempDir, '.mcp-hub.json');
603
+ // Write initial configuration
604
+ fs.writeFileSync(testTempConfigPath, JSON.stringify({ version: '1.0.0' }));
605
+ configManager = new ConfigManager(testTempConfigPath);
606
+ const config = configManager.getConfig();
607
+ expect(config).toBeDefined();
608
+ expect(config.version).toBe('1.0.0');
609
+ // Clean up, add retry mechanism
610
+ let retries = 3;
611
+ while (retries > 0) {
612
+ try {
613
+ fs.rmSync(tempDir, { recursive: true, force: true });
614
+ break;
615
+ }
616
+ catch (error) {
617
+ console.warn(`Failed to clean up temp directory (retries left: ${retries - 1}): ${error}`);
618
+ retries--;
619
+ if (retries > 0) {
620
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
621
+ }
622
+ }
623
+ }
624
+ });
625
+ it('should handle empty config object', () => {
626
+ fs.writeFileSync(tempConfigPath, '{}');
627
+ configManager = new ConfigManager(tempConfigPath);
628
+ const config = configManager.getConfig();
629
+ // Should fill in default values
630
+ expect(config.version).toBe('1.0.0');
631
+ expect(config.system.host).toBe('localhost');
632
+ });
633
+ });
634
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-utils.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/json-utils.test.ts"],"names":[],"mappings":""}