@loop_ouroboros/mcp-hub-lite 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/client/assets/{HomeView-Cr1jX73N.js → HomeView-Bu2joUvW.js} +1 -1
  3. package/dist/client/assets/ResourceDetailView-BvrhDCD1.js +1 -0
  4. package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
  5. package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
  6. package/dist/client/assets/ResourcesView-LjqioF_s.js +1 -0
  7. package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
  8. package/dist/client/assets/ServerDashboard-FhHJFvUi.js +1 -0
  9. package/dist/client/assets/ServerDetail-BKV-M4qT.js +2 -0
  10. package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
  11. package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
  12. package/dist/client/assets/ServerListView-BXgtDyt3.js +36 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-D-ooYNdN.js +1 -0
  14. package/dist/client/assets/SettingsView-CMFG91Z4.js +1 -0
  15. package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
  16. package/dist/client/assets/ToolCallDialog-Bf4Xe4gH.js +1 -0
  17. package/dist/client/assets/ToolsView-DFpha1z0.js +1 -0
  18. package/dist/client/assets/_baseClone-Bp9Rjwd7.js +1 -0
  19. package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
  20. package/dist/client/assets/el-form-item-DdSUWYsl.js +12 -0
  21. package/dist/client/assets/el-input-99gMrutP.js +1 -0
  22. package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
  23. package/dist/client/assets/{el-loading-Csv24uBk.js → el-loading-CIQ5pD5u.js} +1 -1
  24. package/dist/client/assets/el-overlay-BVM6msGX.js +1 -0
  25. package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
  26. package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
  27. package/dist/client/assets/el-radio-group-DhXWy7ry.js +1 -0
  28. package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
  29. package/dist/client/assets/el-skeleton-item-DJz-Us12.js +1 -0
  30. package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
  31. package/dist/client/assets/el-switch-Bu8AQ5uM.js +1 -0
  32. package/dist/client/assets/el-tab-pane-BnGMaV56.js +1 -0
  33. package/dist/client/assets/el-table-column-BMWOaLS_.js +1 -0
  34. package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
  35. package/dist/client/assets/index-C2V-ZGji.js +1 -0
  36. package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
  37. package/dist/client/assets/index-vhkqgpmN.js +2 -0
  38. package/dist/client/assets/omit-CqPQN3XP.js +1 -0
  39. package/dist/client/assets/{raf-DDfJOMYh.js → raf-C2wXzaVU.js} +1 -1
  40. package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-BLHLXXJK.js} +1 -1
  41. package/dist/client/index.html +3 -3
  42. package/dist/server/shared/models/resource.model.d.ts +2 -1
  43. package/dist/server/shared/models/resource.model.d.ts.map +1 -1
  44. package/dist/server/shared/models/server.model.d.ts +363 -5
  45. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  46. package/dist/server/shared/models/server.model.js +220 -1
  47. package/dist/server/shared/models/session.model.d.ts +2 -56
  48. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  49. package/dist/server/shared/models/session.model.js +2 -55
  50. package/dist/server/shared/models/tool.model.d.ts +4 -2
  51. package/dist/server/shared/models/tool.model.d.ts.map +1 -1
  52. package/dist/server/shared/types/client.types.d.ts +4 -32
  53. package/dist/server/shared/types/client.types.d.ts.map +1 -1
  54. package/dist/server/shared/types/client.types.js +3 -2
  55. package/dist/server/shared/types/index.d.ts +3 -3
  56. package/dist/server/shared/types/index.d.ts.map +1 -1
  57. package/dist/server/shared/types/index.js +3 -3
  58. package/dist/server/shared/types/session-context.types.d.ts +35 -0
  59. package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
  60. package/dist/server/shared/types/session-context.types.js +5 -0
  61. package/dist/server/shared/types/websocket.types.d.ts +17 -10
  62. package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
  63. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -1
  64. package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -1
  65. package/dist/server/src/api/mcp/gateway.d.ts +1 -3
  66. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  67. package/dist/server/src/api/mcp/gateway.js +34 -61
  68. package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
  69. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  70. package/dist/server/src/api/mcp/session-context-extractor.js +15 -39
  71. package/dist/server/src/api/web/clients.js +2 -2
  72. package/dist/server/src/api/web/hub-tools.d.ts +2 -2
  73. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  74. package/dist/server/src/api/web/hub-tools.js +3 -54
  75. package/dist/server/src/api/web/mcp-status.d.ts +1 -1
  76. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
  77. package/dist/server/src/api/web/mcp-status.js +71 -30
  78. package/dist/server/src/api/web/resources.d.ts.map +1 -1
  79. package/dist/server/src/api/web/resources.js +28 -22
  80. package/dist/server/src/api/web/search.d.ts +2 -16
  81. package/dist/server/src/api/web/search.d.ts.map +1 -1
  82. package/dist/server/src/api/web/search.js +24 -45
  83. package/dist/server/src/api/web/servers.d.ts +3 -3
  84. package/dist/server/src/api/web/servers.d.ts.map +1 -1
  85. package/dist/server/src/api/web/servers.js +70 -25
  86. package/dist/server/src/api/web/sessions.js +1 -1
  87. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
  88. package/dist/server/src/api/ws/ws-handler.js +4 -2
  89. package/dist/server/src/app.d.ts.map +1 -1
  90. package/dist/server/src/app.js +0 -4
  91. package/dist/server/src/cli/commands/list.js +2 -2
  92. package/dist/server/src/cli/commands/status.d.ts.map +1 -1
  93. package/dist/server/src/cli/commands/status.js +41 -30
  94. package/dist/server/src/cli/index.d.ts.map +1 -1
  95. package/dist/server/src/cli/index.js +2 -1
  96. package/dist/server/src/cli/server.d.ts +11 -2
  97. package/dist/server/src/cli/server.d.ts.map +1 -1
  98. package/dist/server/src/config/config-change-logger.d.ts +22 -0
  99. package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
  100. package/dist/server/src/config/config-change-logger.js +135 -11
  101. package/dist/server/src/config/config-loader.d.ts +6 -5
  102. package/dist/server/src/config/config-loader.d.ts.map +1 -1
  103. package/dist/server/src/config/config-loader.js +54 -16
  104. package/dist/server/src/config/config-manager.d.ts +51 -43
  105. package/dist/server/src/config/config-manager.d.ts.map +1 -1
  106. package/dist/server/src/config/config-manager.js +84 -66
  107. package/dist/server/src/config/config-migrator.d.ts +82 -0
  108. package/dist/server/src/config/config-migrator.d.ts.map +1 -0
  109. package/dist/server/src/config/config-migrator.js +348 -0
  110. package/dist/server/src/config/config-saver.d.ts +2 -0
  111. package/dist/server/src/config/config-saver.d.ts.map +1 -1
  112. package/dist/server/src/config/config-saver.js +8 -2
  113. package/dist/server/src/config/config.schema.d.ts +10 -102
  114. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  115. package/dist/server/src/config/config.schema.js +15 -98
  116. package/dist/server/src/config/path-validator.d.ts +27 -0
  117. package/dist/server/src/config/path-validator.d.ts.map +1 -0
  118. package/dist/server/src/config/path-validator.js +53 -0
  119. package/dist/server/src/config/server-config-manager.d.ts +37 -31
  120. package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
  121. package/dist/server/src/config/server-config-manager.js +222 -66
  122. package/dist/server/src/config/type-converter.d.ts.map +1 -1
  123. package/dist/server/src/config/type-converter.js +3 -2
  124. package/dist/server/src/index.js +1 -1
  125. package/dist/server/src/models/event.model.d.ts +17 -10
  126. package/dist/server/src/models/event.model.d.ts.map +1 -1
  127. package/dist/server/src/models/server.model.d.ts +17 -3
  128. package/dist/server/src/models/server.model.d.ts.map +1 -1
  129. package/dist/server/src/models/server.model.js +2 -1
  130. package/dist/server/src/models/system-tools.constants.d.ts +10 -27
  131. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  132. package/dist/server/src/models/system-tools.constants.js +4 -8
  133. package/dist/server/src/pid/manager.d.ts.map +1 -1
  134. package/dist/server/src/pid/manager.js +2 -1
  135. package/dist/server/src/server/dev-server.js +34 -20
  136. package/dist/server/src/server/runner.d.ts.map +1 -1
  137. package/dist/server/src/server/runner.js +41 -26
  138. package/dist/server/src/services/client-tracker.service.d.ts +3 -128
  139. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
  140. package/dist/server/src/services/client-tracker.service.js +4 -200
  141. package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
  142. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  143. package/dist/server/src/services/connection/connection-manager.js +286 -241
  144. package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
  145. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  146. package/dist/server/src/services/connection/tool-cache.js +50 -55
  147. package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
  148. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  149. package/dist/server/src/services/gateway/gateway.service.js +15 -19
  150. package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
  151. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
  152. package/dist/server/src/services/gateway/global-transport.js +42 -0
  153. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  154. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
  155. package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
  156. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
  157. package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
  158. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
  159. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  160. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +16 -55
  161. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
  162. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
  163. package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
  164. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  165. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
  166. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  167. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
  168. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
  169. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
  170. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  171. package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
  172. package/dist/server/src/services/gateway/types.d.ts +2 -1
  173. package/dist/server/src/services/gateway/types.d.ts.map +1 -1
  174. package/dist/server/src/services/hub-manager.service.d.ts +32 -238
  175. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  176. package/dist/server/src/services/hub-manager.service.js +89 -267
  177. package/dist/server/src/services/hub-tools/index.d.ts +1 -3
  178. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  179. package/dist/server/src/services/hub-tools/index.js +1 -2
  180. package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
  181. package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
  182. package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
  183. package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
  184. package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
  185. package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
  186. package/dist/server/src/services/hub-tools/resource-generator.d.ts +25 -5
  187. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  188. package/dist/server/src/services/hub-tools/resource-generator.js +259 -64
  189. package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
  190. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  191. package/dist/server/src/services/hub-tools/server-selector.js +44 -37
  192. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
  193. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  194. package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
  195. package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
  196. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
  197. package/dist/server/src/services/hub-tools/tool-search.js +10 -4
  198. package/dist/server/src/services/hub-tools/types.d.ts +2 -2
  199. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
  200. package/dist/server/src/services/hub-tools.service.d.ts +43 -72
  201. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  202. package/dist/server/src/services/hub-tools.service.js +185 -110
  203. package/dist/server/src/services/search/search-cache.d.ts +0 -19
  204. package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
  205. package/dist/server/src/services/search/search-cache.js +0 -24
  206. package/dist/server/src/services/search/search-core.service.d.ts +5 -5
  207. package/dist/server/src/services/search/search-core.service.js +11 -11
  208. package/dist/server/src/services/session/session-manager.d.ts +12 -256
  209. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  210. package/dist/server/src/services/session/session-manager.js +23 -583
  211. package/dist/server/src/services/session-tracker.service.d.ts +124 -0
  212. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
  213. package/dist/server/src/services/session-tracker.service.js +176 -0
  214. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  215. package/dist/server/src/services/system-tool-handler.js +7 -17
  216. package/dist/server/src/utils/composite-key.d.ts +29 -0
  217. package/dist/server/src/utils/composite-key.d.ts.map +1 -0
  218. package/dist/server/src/utils/composite-key.js +39 -0
  219. package/dist/server/src/utils/error-handler.d.ts.map +1 -1
  220. package/dist/server/src/utils/error-handler.js +3 -2
  221. package/dist/server/src/utils/index.d.ts +2 -0
  222. package/dist/server/src/utils/index.d.ts.map +1 -1
  223. package/dist/server/src/utils/index.js +2 -0
  224. package/dist/server/src/utils/instance-id.d.ts +22 -0
  225. package/dist/server/src/utils/instance-id.d.ts.map +1 -0
  226. package/dist/server/src/utils/instance-id.js +59 -0
  227. package/dist/server/src/utils/json-utils.d.ts +4 -4
  228. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  229. package/dist/server/src/utils/json-utils.js +10 -4
  230. package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
  231. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
  232. package/dist/server/src/utils/logger/log-colors.d.ts +1 -0
  233. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
  234. package/dist/server/src/utils/logger/log-colors.js +2 -1
  235. package/dist/server/src/utils/logger/log-context.d.ts +1 -0
  236. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
  237. package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
  238. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  239. package/dist/server/src/utils/logger/log-formatter.js +287 -5
  240. package/dist/server/src/utils/logger/log-modules.d.ts +15 -12
  241. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  242. package/dist/server/src/utils/logger/log-modules.js +8 -8
  243. package/dist/server/src/utils/logger/log-output.d.ts +2 -2
  244. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
  245. package/dist/server/src/utils/logger/log-output.js +27 -6
  246. package/dist/server/src/utils/logger/logger.d.ts +13 -0
  247. package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
  248. package/dist/server/src/utils/logger/logger.js +42 -7
  249. package/dist/server/src/utils/parameter-validator.d.ts +10 -0
  250. package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
  251. package/dist/server/src/utils/parameter-validator.js +53 -0
  252. package/dist/server/src/utils/process-tree.d.ts +49 -0
  253. package/dist/server/src/utils/process-tree.d.ts.map +1 -0
  254. package/dist/server/src/utils/process-tree.js +285 -0
  255. package/dist/server/src/utils/request-context.d.ts +12 -30
  256. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  257. package/dist/server/src/utils/request-context.js +10 -30
  258. package/dist/server/src/utils/sort-utils.d.ts +40 -0
  259. package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
  260. package/dist/server/src/utils/sort-utils.js +131 -0
  261. package/dist/server/src/utils/tool-args-parser.d.ts +0 -4
  262. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
  263. package/dist/server/src/utils/tool-args-parser.js +0 -7
  264. package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
  265. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
  266. package/dist/server/src/utils/transports/sse-transport.js +55 -9
  267. package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
  268. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  269. package/dist/server/src/utils/transports/stdio-transport.js +66 -247
  270. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
  271. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
  272. package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
  273. package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
  274. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  275. package/dist/server/src/utils/transports/transport-factory.js +33 -13
  276. package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
  277. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
  278. package/dist/server/src/utils/version.d.ts +11 -0
  279. package/dist/server/src/utils/version.d.ts.map +1 -0
  280. package/dist/server/src/utils/version.js +57 -0
  281. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
  282. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
  283. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
  284. package/dist/server/tests/evaluation/evaluation.test.js +10 -9
  285. package/dist/server/tests/integration/api/gateway.test.js +24 -39
  286. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
  287. package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
  288. package/dist/server/tests/server.test.js +27 -16
  289. package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
  290. package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
  291. package/dist/server/tests/temp/temp-run-docling.js +53 -0
  292. package/dist/server/tests/temp/test-stack.d.ts +6 -0
  293. package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
  294. package/dist/server/tests/temp/test-stack.js +40 -0
  295. package/dist/server/tests/types/test-helpers.d.ts +1 -2
  296. package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
  297. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
  298. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
  299. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
  300. package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
  301. package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
  302. package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
  303. package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
  304. package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
  305. package/dist/server/tests/unit/config/config-saver.test.js +200 -0
  306. package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
  307. package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
  308. package/dist/server/tests/unit/config/config.schema.test.js +347 -0
  309. package/dist/server/tests/unit/server/runner.test.js +86 -62
  310. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
  311. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
  312. package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
  313. package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
  314. package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
  315. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
  316. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
  317. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
  318. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
  319. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
  320. package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
  321. package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -334
  322. package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
  323. package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
  324. package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
  325. package/dist/server/tests/unit/services/session-manager.test.js +26 -436
  326. package/dist/server/tests/unit/utils/config.test.js +88 -186
  327. package/dist/server/tests/unit/utils/json-utils.test.js +107 -13
  328. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
  329. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
  330. package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
  331. package/dist/server/tests/unit/utils/logger.test.js +101 -0
  332. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
  333. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
  334. package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
  335. package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
  336. package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
  337. package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
  338. package/dist/server/tests/unit/utils/request-context.test.js +9 -28
  339. package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
  340. package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
  341. package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
  342. package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
  343. package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
  344. package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
  345. package/package.json +1 -1
  346. package/dist/client/assets/ResourceDetailView-BQ49hk0c.js +0 -1
  347. package/dist/client/assets/ResourcesView-BYZfWtia.js +0 -1
  348. package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
  349. package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +0 -1
  350. package/dist/client/assets/ServerDashboard-DHcxwKeh.js +0 -2
  351. package/dist/client/assets/ServerListView-DralUL71.js +0 -30
  352. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
  353. package/dist/client/assets/SessionsView-BCGRTqem.js +0 -1
  354. package/dist/client/assets/SettingsView-BLfxa6PZ.js +0 -1
  355. package/dist/client/assets/ToolCallDialog-DQ0OQ1mD.js +0 -1
  356. package/dist/client/assets/ToolsView-BLB6x3tC.js +0 -1
  357. package/dist/client/assets/_baseClone-Bo5mBgsT.js +0 -1
  358. package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
  359. package/dist/client/assets/el-form-item-BmeJKVSi.js +0 -12
  360. package/dist/client/assets/el-input-CeZiq23m.js +0 -1
  361. package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
  362. package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
  363. package/dist/client/assets/el-overlay-iw_hrrlC.js +0 -1
  364. package/dist/client/assets/el-select-B73uRP_Y.js +0 -1
  365. package/dist/client/assets/el-tab-pane-BgOTBn4X.js +0 -1
  366. package/dist/client/assets/el-table-column-Ld4GSD3x.js +0 -1
  367. package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
  368. package/dist/client/assets/el-tag-DYmSo8Bx.js +0 -1
  369. package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
  370. package/dist/client/assets/index-COYaYRbH.js +0 -1
  371. package/dist/client/assets/index-Cfcvxyee.js +0 -2
  372. package/dist/client/assets/index-PhuI36Zi.js +0 -1
  373. package/dist/client/assets/omit-7EL6VJO4.js +0 -1
  374. package/dist/client/assets/vnode-upjuIlvm.js +0 -1
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { requestContext, getClientContext, getClientCwd } from '../../../src/utils/request-context.js';
2
+ import { requestContext, getSessionContext } from '../../../src/utils/request-context.js';
3
3
  describe('Request Context', () => {
4
4
  beforeEach(() => {
5
5
  // Clean up any existing context
@@ -10,24 +10,19 @@ describe('Request Context', () => {
10
10
  requestContext.disable();
11
11
  });
12
12
  it('should return undefined when no context is set', () => {
13
- expect(getClientContext()).toBeUndefined();
14
- expect(getClientCwd()).toBeUndefined();
13
+ expect(getSessionContext()).toBeUndefined();
15
14
  });
16
- it('should store and retrieve client context correctly', async () => {
15
+ it('should store and retrieve session context correctly', async () => {
17
16
  const testContext = {
18
17
  sessionId: 'test-session',
19
18
  clientName: 'Test Client',
20
- cwd: '/test/cwd',
21
- project: 'test-project',
22
19
  ip: '127.0.0.1',
23
20
  userAgent: 'test-agent',
24
21
  timestamp: Date.now()
25
22
  };
26
23
  await requestContext.run(testContext, () => {
27
- const context = getClientContext();
24
+ const context = getSessionContext();
28
25
  expect(context).toEqual(testContext);
29
- const cwd = getClientCwd();
30
- expect(cwd).toBe('/test/cwd');
31
26
  });
32
27
  });
33
28
  it('should handle partial context correctly', async () => {
@@ -36,21 +31,17 @@ describe('Request Context', () => {
36
31
  timestamp: Date.now()
37
32
  };
38
33
  await requestContext.run(partialContext, () => {
39
- const context = getClientContext();
34
+ const context = getSessionContext();
40
35
  expect(context).toEqual(partialContext);
41
- const cwd = getClientCwd();
42
- expect(cwd).toBeUndefined();
43
36
  });
44
37
  });
45
38
  it('should maintain context isolation between async operations', async () => {
46
39
  const context1 = {
47
40
  sessionId: 'session-1',
48
- cwd: '/path/1',
49
41
  timestamp: Date.now()
50
42
  };
51
43
  const context2 = {
52
44
  sessionId: 'session-2',
53
- cwd: '/path/2',
54
45
  timestamp: Date.now()
55
46
  };
56
47
  let result1;
@@ -58,25 +49,15 @@ describe('Request Context', () => {
58
49
  const operation1 = requestContext.run(context1, async () => {
59
50
  // Simulate async operation
60
51
  await new Promise((resolve) => setTimeout(resolve, 10));
61
- result1 = getClientCwd();
52
+ result1 = getSessionContext();
62
53
  });
63
54
  const operation2 = requestContext.run(context2, async () => {
64
55
  // Simulate async operation
65
56
  await new Promise((resolve) => setTimeout(resolve, 5));
66
- result2 = getClientCwd();
57
+ result2 = getSessionContext();
67
58
  });
68
59
  await Promise.all([operation1, operation2]);
69
- expect(result1).toBe('/path/1');
70
- expect(result2).toBe('/path/2');
71
- });
72
- it('should return undefined for getClientCwd when cwd is not set', async () => {
73
- const contextWithoutCwd = {
74
- sessionId: 'no-cwd-session',
75
- timestamp: Date.now()
76
- };
77
- await requestContext.run(contextWithoutCwd, () => {
78
- const cwd = getClientCwd();
79
- expect(cwd).toBeUndefined();
80
- });
60
+ expect(result1).toEqual(context1);
61
+ expect(result2).toEqual(context2);
81
62
  });
82
63
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sort-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-utils.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/sort-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,220 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { sortObjectKeys, sortObjectKeysCaseInsensitive, sortObjectKeysDeep, sortServerConfigEnvHeaders } from '../../../src/utils/sort-utils.js';
3
+ describe('sort-utils', () => {
4
+ describe('sortObjectKeys', () => {
5
+ it('should sort object keys alphabetically using localeCompare', () => {
6
+ const obj = {
7
+ zebra: 'value3',
8
+ apple: 'value1',
9
+ banana: 'value2'
10
+ };
11
+ const result = sortObjectKeys(obj);
12
+ expect(Object.keys(result)).toEqual(['apple', 'banana', 'zebra']);
13
+ expect(result).toEqual({
14
+ apple: 'value1',
15
+ banana: 'value2',
16
+ zebra: 'value3'
17
+ });
18
+ });
19
+ it('should return the same object if input is null or undefined', () => {
20
+ expect(sortObjectKeys(null)).toBe(null);
21
+ expect(sortObjectKeys(undefined)).toBe(undefined);
22
+ });
23
+ it('should return the same object if input is an array', () => {
24
+ const arr = [3, 1, 2];
25
+ expect(sortObjectKeys(arr)).toBe(arr);
26
+ });
27
+ it('should return the same object if input is not an object', () => {
28
+ expect(sortObjectKeys('string')).toBe('string');
29
+ expect(sortObjectKeys(42)).toBe(42);
30
+ expect(sortObjectKeys(true)).toBe(true);
31
+ });
32
+ it('should preserve the original object (return a new object)', () => {
33
+ const obj = {
34
+ zebra: 'value3',
35
+ apple: 'value1'
36
+ };
37
+ const result = sortObjectKeys(obj);
38
+ expect(result).not.toBe(obj);
39
+ expect(obj).toEqual({
40
+ zebra: 'value3',
41
+ apple: 'value1'
42
+ });
43
+ });
44
+ it('should handle empty object', () => {
45
+ expect(sortObjectKeys({})).toEqual({});
46
+ });
47
+ });
48
+ describe('sortObjectKeysCaseInsensitive', () => {
49
+ it('should sort object keys alphabetically, case-insensitive', () => {
50
+ const obj = {
51
+ Zebra: 'value3',
52
+ apple: 'value1',
53
+ Banana: 'value2'
54
+ };
55
+ const result = sortObjectKeysCaseInsensitive(obj);
56
+ expect(Object.keys(result)).toEqual(['apple', 'Banana', 'Zebra']);
57
+ expect(result).toEqual({
58
+ apple: 'value1',
59
+ Banana: 'value2',
60
+ Zebra: 'value3'
61
+ });
62
+ });
63
+ it('should preserve original key case', () => {
64
+ const obj = {
65
+ CONTENT_TYPE: 'application/json',
66
+ Authorization: 'Bearer token',
67
+ accept: 'text/plain'
68
+ };
69
+ const result = sortObjectKeysCaseInsensitive(obj);
70
+ expect(Object.keys(result)).toEqual(['accept', 'Authorization', 'CONTENT_TYPE']);
71
+ expect(result.accept).toBe('text/plain');
72
+ expect(result.Authorization).toBe('Bearer token');
73
+ expect(result.CONTENT_TYPE).toBe('application/json');
74
+ });
75
+ it('should return the same object if input is null or undefined', () => {
76
+ expect(sortObjectKeysCaseInsensitive(null)).toBe(null);
77
+ expect(sortObjectKeysCaseInsensitive(undefined)).toBe(undefined);
78
+ });
79
+ });
80
+ describe('sortObjectKeysDeep', () => {
81
+ it('should recursively sort all object keys in a nested structure', () => {
82
+ const obj = {
83
+ zebra: {
84
+ delta: 'value4',
85
+ alpha: 'value1'
86
+ },
87
+ apple: {
88
+ charlie: 'value3',
89
+ bravo: 'value2'
90
+ }
91
+ };
92
+ const result = sortObjectKeysDeep(obj);
93
+ expect(Object.keys(result)).toEqual(['apple', 'zebra']);
94
+ expect(Object.keys(result.apple)).toEqual(['bravo', 'charlie']);
95
+ expect(Object.keys(result.zebra)).toEqual(['alpha', 'delta']);
96
+ });
97
+ it('should handle arrays and recursively sort objects within arrays', () => {
98
+ const obj = {
99
+ items: [
100
+ { zebra: 'value3', apple: 'value1' },
101
+ { delta: 'value4', alpha: 'value1' }
102
+ ]
103
+ };
104
+ const result = sortObjectKeysDeep(obj);
105
+ expect(Array.isArray(result.items)).toBe(true);
106
+ expect(Object.keys(result.items[0])).toEqual(['apple', 'zebra']);
107
+ expect(Object.keys(result.items[1])).toEqual(['alpha', 'delta']);
108
+ });
109
+ it('should handle mixed types in nested structure', () => {
110
+ const obj = {
111
+ number: 42,
112
+ string: 'hello',
113
+ boolean: true,
114
+ array: [1, 2, 3],
115
+ object: {
116
+ nested: {
117
+ z: 'last',
118
+ a: 'first'
119
+ }
120
+ }
121
+ };
122
+ const result = sortObjectKeysDeep(obj);
123
+ expect(Object.keys(result)).toEqual(['array', 'boolean', 'number', 'object', 'string']);
124
+ expect(Object.keys(result.object.nested)).toEqual(['a', 'z']);
125
+ });
126
+ });
127
+ describe('sortServerConfigEnvHeaders', () => {
128
+ it('should sort env and headers objects in a server configuration', () => {
129
+ const config = {
130
+ env: {
131
+ NODE_ENV: 'production',
132
+ API_KEY: 'secret',
133
+ DEBUG: 'false'
134
+ },
135
+ headers: {
136
+ 'X-Custom-Header': 'value',
137
+ Authorization: 'Bearer token',
138
+ 'Content-Type': 'application/json'
139
+ },
140
+ otherField: 'should not be affected'
141
+ };
142
+ const result = sortServerConfigEnvHeaders(config);
143
+ expect(Object.keys(result.env)).toEqual(['API_KEY', 'DEBUG', 'NODE_ENV']);
144
+ expect(Object.keys(result.headers)).toEqual([
145
+ 'Authorization',
146
+ 'Content-Type',
147
+ 'X-Custom-Header'
148
+ ]);
149
+ expect(result.otherField).toBe('should not be affected');
150
+ });
151
+ it('should handle case where env or headers is undefined', () => {
152
+ const config1 = { headers: { Z: '1', A: '2' } };
153
+ const result1 = sortServerConfigEnvHeaders(config1);
154
+ expect(Object.keys(result1.headers)).toEqual(['A', 'Z']);
155
+ expect(result1.env).toBeUndefined();
156
+ const config2 = { env: { Z: '1', A: '2' } };
157
+ const result2 = sortServerConfigEnvHeaders(config2);
158
+ expect(Object.keys(result2.env)).toEqual(['A', 'Z']);
159
+ expect(result2.headers).toBeUndefined();
160
+ });
161
+ it('should handle empty env or headers objects', () => {
162
+ const config = {
163
+ env: {},
164
+ headers: {}
165
+ };
166
+ const result = sortServerConfigEnvHeaders(config);
167
+ expect(result.env).toEqual({});
168
+ expect(result.headers).toEqual({});
169
+ });
170
+ it('should preserve the original object structure', () => {
171
+ const config = {
172
+ env: { B: '2', A: '1' },
173
+ headers: { Y: '2', X: '1' },
174
+ command: 'npm start',
175
+ args: ['--verbose']
176
+ };
177
+ const result = sortServerConfigEnvHeaders(config);
178
+ expect(result.command).toBe('npm start');
179
+ expect(result.args).toEqual(['--verbose']);
180
+ expect(Object.keys(result.env)).toEqual(['A', 'B']);
181
+ expect(Object.keys(result.headers)).toEqual(['X', 'Y']);
182
+ });
183
+ });
184
+ describe('integration tests', () => {
185
+ it('should work with realistic server configuration scenario', () => {
186
+ const serverConfig = {
187
+ type: 'stdio',
188
+ command: 'npx mcp-server',
189
+ args: ['--config', 'config.json'],
190
+ env: {
191
+ NODE_PATH: '/usr/local/lib/node_modules',
192
+ PATH: '/usr/bin:/bin',
193
+ HOME: '/home/user',
194
+ DEBUG: 'mcp:*',
195
+ API_KEY: 'sk-12345'
196
+ },
197
+ headers: {
198
+ 'User-Agent': 'MCP-Hub-Lite/1.0',
199
+ Accept: 'application/json',
200
+ Authorization: 'Bearer token123',
201
+ 'Content-Type': 'application/json'
202
+ }
203
+ };
204
+ const result = sortServerConfigEnvHeaders(serverConfig);
205
+ // Verify env is sorted case-insensitive
206
+ expect(Object.keys(result.env)).toEqual(['API_KEY', 'DEBUG', 'HOME', 'NODE_PATH', 'PATH']);
207
+ // Verify headers is sorted case-insensitive
208
+ expect(Object.keys(result.headers)).toEqual([
209
+ 'Accept',
210
+ 'Authorization',
211
+ 'Content-Type',
212
+ 'User-Agent'
213
+ ]);
214
+ // Verify other fields are preserved
215
+ expect(result.type).toBe('stdio');
216
+ expect(result.command).toBe('npx mcp-server');
217
+ expect(result.args).toEqual(['--config', 'config.json']);
218
+ });
219
+ });
220
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transport-factory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-factory.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/transport-factory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { TransportFactory } from '../../../src/utils/transports/transport-factory.js';
3
+ describe('TransportFactory', () => {
4
+ describe('isPythonCommand', () => {
5
+ it('should detect python commands', () => {
6
+ expect(TransportFactory['isPythonCommand']('python')).toBe(true);
7
+ expect(TransportFactory['isPythonCommand']('python3')).toBe(true);
8
+ expect(TransportFactory['isPythonCommand']('Python')).toBe(true);
9
+ expect(TransportFactory['isPythonCommand']('/usr/bin/python3')).toBe(true);
10
+ expect(TransportFactory['isPythonCommand']('C:\\Python39\\python.exe')).toBe(true);
11
+ });
12
+ it('should detect uv and uvx commands', () => {
13
+ expect(TransportFactory['isPythonCommand']('uv')).toBe(true);
14
+ expect(TransportFactory['isPythonCommand']('uvx')).toBe(true);
15
+ expect(TransportFactory['isPythonCommand']('UV')).toBe(true);
16
+ expect(TransportFactory['isPythonCommand']('/usr/bin/uvx')).toBe(true);
17
+ });
18
+ it('should detect py commands', () => {
19
+ expect(TransportFactory['isPythonCommand']('py')).toBe(true);
20
+ expect(TransportFactory['isPythonCommand']('PY')).toBe(true);
21
+ expect(TransportFactory['isPythonCommand']('py -3')).toBe(true);
22
+ });
23
+ it('should not detect non-python commands', () => {
24
+ expect(TransportFactory['isPythonCommand']('node')).toBe(false);
25
+ expect(TransportFactory['isPythonCommand']('npm')).toBe(false);
26
+ expect(TransportFactory['isPythonCommand']('npx')).toBe(false);
27
+ expect(TransportFactory['isPythonCommand']('java')).toBe(false);
28
+ expect(TransportFactory['isPythonCommand']('go')).toBe(false);
29
+ expect(TransportFactory['isPythonCommand']('rust')).toBe(false);
30
+ });
31
+ it('should handle edge cases', () => {
32
+ expect(TransportFactory['isPythonCommand']('')).toBe(false);
33
+ expect(TransportFactory['isPythonCommand'](' ')).toBe(false);
34
+ expect(TransportFactory['isPythonCommand']('my-python-tool')).toBe(true); // contains 'python'
35
+ });
36
+ });
37
+ describe('buildSystemEnv', () => {
38
+ it('should add PYTHONUTF8=1 for python commands', () => {
39
+ const env = TransportFactory['buildSystemEnv']('python');
40
+ expect(env.PYTHONUTF8).toBe('1');
41
+ });
42
+ it('should add PYTHONUTF8=1 for uv commands', () => {
43
+ const env = TransportFactory['buildSystemEnv']('uvx');
44
+ expect(env.PYTHONUTF8).toBe('1');
45
+ });
46
+ it('should not add PYTHONUTF8 for non-python commands', () => {
47
+ const env = TransportFactory['buildSystemEnv']('node');
48
+ expect(env.PYTHONUTF8).toBeUndefined();
49
+ });
50
+ it('should return empty object for undefined command', () => {
51
+ const env = TransportFactory['buildSystemEnv'](undefined);
52
+ expect(Object.keys(env)).toHaveLength(0);
53
+ });
54
+ });
55
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loop_ouroboros/mcp-hub-lite",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "A lightweight MCP management platform designed for independent developers",
5
5
  "license": "MIT",
6
6
  "author": "loop_ouroboros",
@@ -1 +0,0 @@
1
- import{F as j,az as ee,ac as W,$ as Q,aE as X,aG as pe,aA as ve,a9 as fe,_ as T,I as q,ay as be,G as Y,f as _e,aC as ye,aH as ge,aF as he,aD as xe,ad as oe,J as ke,u as we,p as Re,c as Ve,aT as Ce,a as Be,aU as Ee,C as Se,w as Ie}from"./index-Cfcvxyee.js";import{v as $e}from"./el-loading-Csv24uBk.js";import{a as Z,r as $,i as Ne,c as m,t as z,A as x,y,C as t,H as M,ap as te,u as e,I as U,J as E,k as ae,v as O,a9 as P,$ as d,n as se,K as Ge,f as le,q as Pe,Q as De,ah as Ue,w as je,P as ze,ak as Ae,x as Fe,B as Le,V as Te,a6 as qe,a8 as Me,O as V,G as S,U as Oe,a7 as Ke}from"./vue-vendor-6ny5zj9i.js";import{C as K,U as H}from"./event-BB_Ol6Sd.js";import{o as He}from"./omit-7EL6VJO4.js";import{_ as Je}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./_baseClone-Bo5mBgsT.js";const re=j({modelValue:{type:[String,Number,Boolean],default:void 0},size:ee,disabled:{type:Boolean,default:void 0},label:{type:[String,Number,Boolean],default:void 0},value:{type:[String,Number,Boolean],default:void 0},name:{type:String,default:void 0}}),We=j({...re,border:Boolean}),ne={[H]:n=>Z(n)||W(n)||Q(n),[K]:n=>Z(n)||W(n)||Q(n)},ie=Symbol("radioGroupKey"),de=(n,_)=>{const r=$(),p=Ne(ie,void 0),o=m(()=>!!p),w=m(()=>X(n.value)?n.label:n.value),g=m({get(){return o.value?p.modelValue:n.modelValue},set(f){o.value?p.changeEvent(f):_&&_(H,f),r.value.checked=n.modelValue===w.value}}),u=pe(m(()=>p?.size)),s=ve(m(()=>p?.disabled)),b=$(!1),v=m(()=>s.value||o.value&&g.value!==w.value?-1:0);return fe({from:"label act as value",replacement:"value",version:"3.0.0",scope:"el-radio",ref:"https://element-plus.org/en-US/component/radio.html"},m(()=>o.value&&X(n.value))),{radioRef:r,isGroup:o,radioGroup:p,focus:b,size:u,disabled:s,tabIndex:v,modelValue:g,actualValue:w}},Qe=["value","name","disabled","checked"],Xe=z({name:"ElRadio",__name:"radio",props:We,emits:ne,setup(n,{emit:_}){const r=n,p=_,o=q("radio"),{radioRef:w,radioGroup:g,focus:u,size:s,disabled:b,modelValue:v,actualValue:f}=de(r,p);function i(){se(()=>p(K,v.value))}return(k,c)=>{var l;return y(),x("label",{class:E([e(o).b(),e(o).is("disabled",e(b)),e(o).is("focus",e(u)),e(o).is("bordered",k.border),e(o).is("checked",e(v)===e(f)),e(o).m(e(s))])},[t("span",{class:E([e(o).e("input"),e(o).is("disabled",e(b)),e(o).is("checked",e(v)===e(f))])},[M(t("input",{ref_key:"radioRef",ref:w,"onUpdate:modelValue":c[0]||(c[0]=h=>ae(v)?v.value=h:null),class:E(e(o).e("original")),value:e(f),name:k.name||((l=e(g))==null?void 0:l.name),disabled:e(b),checked:e(v)===e(f),type:"radio",onFocus:c[1]||(c[1]=h=>u.value=!0),onBlur:c[2]||(c[2]=h=>u.value=!1),onChange:i,onClick:c[3]||(c[3]=U(()=>{},["stop"]))},null,42,Qe),[[te,e(v)]]),t("span",{class:E(e(o).e("inner"))},null,2)],2),t("span",{class:E(e(o).e("label")),onKeydown:c[4]||(c[4]=U(()=>{},["stop"]))},[O(k.$slots,"default",{},()=>[P(d(k.label),1)])],34)],2)}}});var ue=T(Xe,[["__file","/home/runner/work/element-plus/element-plus/packages/components/radio/src/radio.vue"]]);const Ye=j({...re}),Ze=["value","name","disabled"],eo=z({name:"ElRadioButton",__name:"radio-button",props:Ye,setup(n){const _=n,r=q("radio"),{radioRef:p,focus:o,size:w,disabled:g,modelValue:u,radioGroup:s,actualValue:b}=de(_),v=m(()=>({backgroundColor:s?.fill||"",borderColor:s?.fill||"",boxShadow:s?.fill?`-1px 0 0 0 ${s.fill}`:"",color:s?.textColor||""}));return(f,i)=>{var k;return y(),x("label",{class:E([e(r).b("button"),e(r).is("active",e(u)===e(b)),e(r).is("disabled",e(g)),e(r).is("focus",e(o)),e(r).bm("button",e(w))])},[M(t("input",{ref_key:"radioRef",ref:p,"onUpdate:modelValue":i[0]||(i[0]=c=>ae(u)?u.value=c:null),class:E(e(r).be("button","original-radio")),value:e(b),type:"radio",name:f.name||((k=e(s))==null?void 0:k.name),disabled:e(g),onFocus:i[1]||(i[1]=c=>o.value=!0),onBlur:i[2]||(i[2]=c=>o.value=!1),onClick:i[3]||(i[3]=U(()=>{},["stop"]))},null,42,Ze),[[te,e(u)]]),t("span",{class:E(e(r).be("button","inner")),style:Ge(e(u)===e(b)?v.value:{}),onKeydown:i[4]||(i[4]=U(()=>{},["stop"]))},[O(f.$slots,"default",{},()=>[P(d(f.label),1)])],38)],2)}}});var J=T(eo,[["__file","/home/runner/work/element-plus/element-plus/packages/components/radio/src/radio-button.vue"]]);const oo=j({id:{type:String,default:void 0},size:ee,disabled:{type:Boolean,default:void 0},modelValue:{type:[String,Number,Boolean],default:void 0},fill:{type:String,default:""},textColor:{type:String,default:""},name:{type:String,default:void 0},validateEvent:{type:Boolean,default:!0},options:{type:Y(Array)},props:{type:Y(Object),default:()=>ce},type:{type:String,values:["radio","button"],default:"radio"},...be(["ariaLabel"])}),to=ne,ce={label:"label",value:"value",disabled:"disabled"},ao=["id","aria-label","aria-labelledby"],so=z({name:"ElRadioGroup",__name:"radio-group",props:oo,emits:to,setup(n,{emit:_}){const r=n,p=_,o=q("radio"),w=_e(),g=$(),{formItem:u}=ye(),{inputId:s,isLabeledByFormItem:b}=ge(r,{formItemContext:u}),v=l=>{p(H,l),se(()=>p(K,l))};le(()=>{const l=g.value.querySelectorAll("[type=radio]"),h=l[0];!Array.from(l).some(C=>C.checked)&&h&&(h.tabIndex=0)});const f=m(()=>r.name||w.value),i=m(()=>({...ce,...r.props})),k=l=>{const{label:h,value:C,disabled:N}=i.value,A={label:l[h],value:l[C],disabled:l[N]};return{...He(l,[h,C,N]),...A}},c=m(()=>r.type==="button"?J:ue);return Pe(ie,De({...Ue(r),changeEvent:v,name:f})),je(()=>r.modelValue,(l,h)=>{r.validateEvent&&!he(l,h)&&u?.validate("change").catch(C=>xe())}),(l,h)=>(y(),x("div",{id:e(s),ref_key:"radioGroupRef",ref:g,class:E(e(o).b("group")),role:"radiogroup","aria-label":e(b)?void 0:l.ariaLabel||"radio-group","aria-labelledby":e(b)?e(u).labelId:void 0},[O(l.$slots,"default",{},()=>[(y(!0),x(ze,null,Ae(l.options,(C,N)=>(y(),Fe(Te(c.value),Le({key:N},{ref_for:!0},k(C)),null,16))),128))])],10,ao))}});var me=T(so,[["__file","/home/runner/work/element-plus/element-plus/packages/components/radio/src/radio-group.vue"]]);ke(ue,{RadioButton:J,RadioGroup:me});const lo=oe(me),ro=oe(J),no={class:"resource-detail py-6 px-4 sm:px-6 lg:px-8 max-w-7xl mx-auto w-full h-full flex flex-col overflow-hidden"},io={class:"flex items-center justify-between mb-6 shrink-0"},uo={class:"flex items-center gap-4"},co={class:"text-2xl font-bold text-gray-900 dark:text-white"},mo={class:"flex-1 flex flex-col gap-6 overflow-hidden"},po={class:"bg-white dark:bg-[#1e1e1e] rounded-lg shadow p-6 shrink-0 border border-gray-200 dark:border-gray-700"},vo={class:"grid grid-cols-1 md:grid-cols-2 gap-6"},fo={class:"text-sm font-medium text-gray-500 dark:text-gray-400 mb-1"},bo={class:"font-mono text-sm break-all select-all"},_o={class:"text-sm font-medium text-gray-500 dark:text-gray-400 mb-1"},yo={class:"font-mono text-sm"},go={class:"md:col-span-2"},ho={class:"text-sm font-medium text-gray-500 dark:text-gray-400 mb-1"},xo={class:"text-sm"},ko={class:"md:col-span-2"},wo={class:"text-sm font-medium text-gray-500 dark:text-gray-400 mb-1"},Ro={class:"text-sm"},Vo={class:"bg-white dark:bg-[#1e1e1e] rounded-lg shadow flex-1 flex flex-col overflow-hidden border border-gray-200 dark:border-gray-700"},Co={class:"px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex justify-between items-center bg-gray-50 dark:bg-[#2d2d2d]"},Bo={class:"font-medium"},Eo={class:"flex gap-2"},So={class:"flex-1 overflow-auto p-6 bg-gray-50 dark:bg-[#0f172a]"},Io={key:0,class:"mb-4 p-4 bg-blue-50 dark:bg-blue-900 rounded-lg border border-blue-200 dark:border-blue-800"},$o={class:"text-sm text-blue-700 dark:text-blue-300"},No={key:1,class:"h-full flex items-center justify-center text-gray-400"},Go={key:2,class:"h-full flex flex-col items-center justify-center text-red-500"},Po={key:3,class:"h-full"},Do={key:0,class:"h-full"},Uo={key:0,class:"h-full flex items-center justify-center"},jo=["src"],zo={key:1,class:"bg-white dark:bg-[#1e1e1e] p-4 rounded shadow-sm h-full overflow-auto font-mono text-sm whitespace-pre-wrap"},Ao={key:1,class:"h-full"},Fo={class:"bg-gray-900 text-gray-100 p-4 rounded-lg h-full overflow-auto font-mono text-sm"},Lo=z({__name:"ResourceDetailView",setup(n){const _=Me(),r=Ke(),p=we(),{t:o}=qe(),w=m(()=>_.params.name),g=m(()=>_.query.uri),u=m(()=>{if(_.query.name)return _.query.name;const a=_.query.uri;if(a){const B=a.split("/"),R=B[B.length-1];if(R&&R.length>0)return R}return"Unknown Resource"}),s=m(()=>_.query.mimeType||"application/octet-stream"),b=m(()=>_.query.description||o("resources.noDescription")),v=$(!1),f=$(null),i=$(null),k=$("preview"),c=m(()=>s.value.startsWith("image/")),l=m(()=>{if(!i.value)return"";const a=i.value;return a&&typeof a=="object"&&"text"in a&&typeof a.text=="string"?a.text:a&&typeof a=="object"&&"blob"in a?"[Binary Data]":""}),h=m(()=>{if(!c.value||!i.value)return"";const a=i.value;return a&&typeof a=="object"&&"blob"in a&&typeof a.blob=="string"?`data:${s.value};base64,${a.blob}`:""});function C(){r.back()}async function N(){v.value=!0,f.value=null;try{i.value=await p.readResource(w.value,g.value)}catch(a){f.value=a.message||"Failed to load resource content"}finally{v.value=!1}}function A(){const a=document.createElement("a"),B=new Blob([l.value],{type:s.value}),R=i.value;if(R&&typeof R=="object"&&"blob"in R&&typeof R.blob=="string"){const I=atob(R.blob),D=new Array(I.length);for(let G=0;G<I.length;G++)D[G]=I.charCodeAt(G);const F=new Uint8Array(D),L=new Blob([F],{type:s.value});a.href=URL.createObjectURL(L)}else a.href=URL.createObjectURL(B);a.download=u.value,document.body.appendChild(a),a.click(),document.body.removeChild(a)}return le(()=>{g.value&&N()}),(a,B)=>{const R=Ve,I=Be,D=ro,F=lo,L=$e;return y(),x("div",no,[t("div",io,[t("div",uo,[V(R,{icon:e(Re),plain:"",onClick:C,class:"shrink-0"},{default:S(()=>[P(d(e(o)("action.back")),1)]),_:1},8,["icon"]),t("h2",co," Resource Details: "+d(u.value),1)])]),M((y(),x("div",mo,[t("div",po,[t("div",vo,[t("div",null,[t("div",fo,d(e(o)("resources.uri")),1),t("div",bo,d(g.value),1)]),t("div",null,[t("div",_o,d(e(o)("resources.mimeType")),1),t("div",yo,d(s.value),1)]),t("div",go,[t("div",ho,d(e(o)("resources.description")),1),t("div",xo,d(b.value),1)]),t("div",ko,[t("div",wo,d(e(o)("resources.server")),1),t("div",Ro,d(w.value),1)])])]),t("div",Vo,[t("div",Co,[t("div",Bo,d(e(o)("resources.contentPreview")),1),t("div",Eo,[V(F,{modelValue:k.value,"onUpdate:modelValue":B[0]||(B[0]=G=>k.value=G),size:"small"},{default:S(()=>[V(D,{value:"preview"},{default:S(()=>[V(I,{class:"mr-1"},{default:S(()=>[V(e(Ee))]),_:1}),P(" "+d(e(o)("resources.preview")),1)]),_:1}),V(D,{value:"source"},{default:S(()=>[V(I,{class:"mr-1"},{default:S(()=>[V(e(Se))]),_:1}),P(" "+d(e(o)("resources.source")),1)]),_:1})]),_:1},8,["modelValue"]),V(R,{size:"small",icon:e(Ce),onClick:A},{default:S(()=>[P(d(e(o)("resources.download")),1)]),_:1},8,["icon"])])]),t("div",So,[b.value&&b.value!=="No description available"?(y(),x("div",Io,[B[1]||(B[1]=t("div",{class:"text-sm font-medium text-blue-900 dark:text-blue-100 mb-1"},"Description",-1)),t("div",$o,d(b.value),1)])):Oe("",!0),v.value?(y(),x("div",No,d(e(o)("resources.loadingContent")),1)):f.value?(y(),x("div",Go,[V(I,{class:"text-4xl mb-2"},{default:S(()=>[V(e(Ie))]),_:1}),t("div",null,d(f.value),1)])):(y(),x("div",Po,[k.value==="preview"?(y(),x("div",Do,[c.value?(y(),x("div",Uo,[t("img",{src:h.value,class:"max-w-full max-h-full object-contain rounded shadow-lg"},null,8,jo)])):(y(),x("div",zo,d(l.value),1))])):(y(),x("div",Ao,[t("pre",Fo,[t("code",null,d(l.value),1)])]))]))])])])),[[L,v.value]])])}}}),Wo=Je(Lo,[["__scopeId","data-v-41a7b24b"]]);export{Wo as default};
@@ -1 +0,0 @@
1
- import{u as D,N as O,a as P,ae as U,y as q,C as k,c as A}from"./index-Cfcvxyee.js";import{b as F,a as M}from"./el-table-column-Ld4GSD3x.js";import"./el-tag-DYmSo8Bx.js";import{E as W}from"./el-input-CeZiq23m.js";import{t as G,r as B,f as H,c as Q,A as u,C as a,$ as o,O as e,u as _,U as w,G as l,P as T,ak as J,a9 as c,a7 as K,y as d}from"./vue-vendor-6ny5zj9i.js";import{E as N}from"./index-PhuI36Zi.js";import{_ as X}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./_baseClone-Bo5mBgsT.js";import"./omit-7EL6VJO4.js";import"./event-BB_Ol6Sd.js";import"./raf-DDfJOMYh.js";import"./typescript-Bp3YSIOJ.js";const Y={class:"resources-view py-6 px-4 sm:px-6 lg:px-8 max-w-7xl mx-auto w-full h-full flex flex-col overflow-hidden bg-gray-50 dark:bg-[#0f172a] transition-colors duration-300"},Z={class:"mb-6 shrink-0"},ee={class:"text-2xl font-semibold text-gray-900 dark:text-white mb-4"},te={class:"relative"},se={class:"flex-1 overflow-y-auto custom-scrollbar space-y-8 pr-2"},le={key:0,class:"flex flex-col items-center justify-center py-12 text-gray-400"},ae={class:"flex items-center gap-2 mb-4"},oe={class:"text-lg font-bold text-gray-900 dark:text-white"},ie={class:"text-sm font-normal text-gray-500 ml-2"},ne={key:0,class:"mb-6 pl-4"},re={class:"text-sm font-semibold text-gray-500 dark:text-gray-400 mb-3 uppercase tracking-wider"},ce={class:"flex items-center gap-2"},ue=["title"],de=["title"],me={key:1,class:"mb-6 pl-4"},pe={class:"text-sm font-semibold text-gray-500 dark:text-gray-400 mb-3 uppercase tracking-wider"},fe={class:"flex items-center gap-2"},_e=["title"],he=["title"],be={key:2,class:"pl-4"},ye={class:"text-sm font-semibold text-gray-500 dark:text-gray-400 mb-3 uppercase tracking-wider"},ge={class:"flex items-center gap-2"},ke=["title"],we=["title"],ve={class:"flex items-center gap-2 mb-4"},xe={class:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4"},$e={class:"flex items-center gap-2"},Te=["title"],Re=["title"],Ce="mcp-hub-lite",ze=G({__name:"ResourcesView",setup(Ee){const L=K(),I=D(),h=B(""),v=B({});H(async()=>{await j()});async function j(){try{v.value=await I.fetchAllResources()}catch(t){console.error("Failed to load resources:",t)}}const R=Q(()=>{if(!h.value)return v.value;const t=h.value.toLowerCase(),i={};for(const[x,m]of Object.entries(v.value)){const n=m.filter(p=>p.name.toLowerCase().includes(t)||p.uri.toLowerCase().includes(t));n.length>0&&(i[x]=n)}return i});function C(t){return t.endsWith("/tools")}function z(t){return t.endsWith("/resources")}function E(t){return t.filter(i=>!C(i.uri)&&!z(i.uri))}function V(t){return t.filter(i=>C(i.uri))}function S(t){return t.filter(i=>z(i.uri))}function b(t,i){L.push({name:"resource-detail",params:{name:t},query:{uri:i.uri,name:i.name,mimeType:i.mimeType,description:i.description}})}return(t,i)=>{const x=W,m=P,n=F,p=N,y=A,g=M;return d(),u("div",Y,[a("div",Z,[a("h2",ee,o(t.$t("resources.title")),1),a("div",te,[e(x,{modelValue:h.value,"onUpdate:modelValue":i[0]||(i[0]=r=>h.value=r),placeholder:t.$t("resources.searchPlaceholder"),class:"w-full",size:"large","prefix-icon":_(O),clearable:""},null,8,["modelValue","placeholder","prefix-icon"])])]),a("div",se,[Object.keys(R.value).length===0?(d(),u("div",le,[e(m,{size:48,class:"mb-4 opacity-50"},{default:l(()=>[e(_(U))]),_:1}),a("p",null,o(t.$t("resources.noResources")),1)])):w("",!0),(d(!0),u(T,null,J(R.value,(r,f)=>(d(),u("section",{key:f,class:"animate-fade-in"},[f===Ce?(d(),u(T,{key:0},[a("div",ae,[e(m,{class:"text-gray-900 dark:text-white",size:20},{default:l(()=>[e(_(q))]),_:1}),a("h3",oe,[c(o(t.$t("resources.systemResources"))+" ",1),a("span",ie,"("+o(r.length)+")",1)]),i[1]||(i[1]=a("div",{class:"h-px flex-1 bg-gray-200 dark:bg-gray-700 ml-4"},null,-1))]),E(r).length>0?(d(),u("div",ne,[a("h4",re,o(t.$t("resources.serverResources")),1),e(g,{data:E(r),style:{width:"100%"},class:"custom-table mb-4"},{default:l(()=>[e(n,{prop:"name",label:t.$t("resources.name"),"min-width":"300"},{default:l(({row:s})=>[a("div",ce,[e(m,null,{default:l(()=>[e(_(k))]),_:1}),a("span",{class:"font-medium truncate",title:s.name},o(s.name),9,ue)])]),_:1},8,["label"]),e(n,{prop:"uri",label:t.$t("resources.uri"),"min-width":"300"},{default:l(({row:s})=>[a("span",{class:"truncate block",title:s.uri},o(s.uri),9,de)]),_:1},8,["label"]),e(n,{prop:"mimeType",label:t.$t("resources.mimeType"),width:"180"},{default:l(({row:s})=>[e(p,{size:"small",type:"success",effect:"plain"},{default:l(()=>[c(o(s.mimeType||"unknown"),1)]),_:2},1024)]),_:1},8,["label"]),e(n,{label:"",width:"100",align:"right"},{default:l(({row:s})=>[e(y,{size:"small",plain:"",onClick:$=>b(f,s)},{default:l(()=>[c(o(t.$t("action.view")),1)]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1032,["data"])])):w("",!0),S(r).length>0?(d(),u("div",me,[a("h4",pe,o(t.$t("resources.dataResources")),1),e(g,{data:S(r),style:{width:"100%"},class:"custom-table mb-4"},{default:l(()=>[e(n,{prop:"name",label:t.$t("resources.name"),"min-width":"300"},{default:l(({row:s})=>[a("div",fe,[e(m,null,{default:l(()=>[e(_(k))]),_:1}),a("span",{class:"font-medium truncate",title:s.name},o(s.name),9,_e)])]),_:1},8,["label"]),e(n,{prop:"uri",label:t.$t("resources.uri"),"min-width":"300"},{default:l(({row:s})=>[a("span",{class:"truncate block",title:s.uri},o(s.uri),9,he)]),_:1},8,["label"]),e(n,{prop:"mimeType",label:t.$t("resources.mimeType"),width:"180"},{default:l(({row:s})=>[e(p,{size:"small",type:"success",effect:"plain"},{default:l(()=>[c(o(s.mimeType||"unknown"),1)]),_:2},1024)]),_:1},8,["label"]),e(n,{label:"",width:"100",align:"right"},{default:l(({row:s})=>[e(y,{size:"small",plain:"",onClick:$=>b(f,s)},{default:l(()=>[c(o(t.$t("action.view")),1)]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1032,["data"])])):w("",!0),V(r).length>0?(d(),u("div",be,[a("h4",ye,o(t.$t("resources.toolResources")),1),e(g,{data:V(r),style:{width:"100%"},class:"custom-table mb-4"},{default:l(()=>[e(n,{prop:"name",label:t.$t("resources.name"),"min-width":"300"},{default:l(({row:s})=>[a("div",ge,[e(m,null,{default:l(()=>[e(_(k))]),_:1}),a("span",{class:"font-medium truncate",title:s.name},o(s.name),9,ke)])]),_:1},8,["label"]),e(n,{prop:"uri",label:t.$t("resources.uri"),"min-width":"300"},{default:l(({row:s})=>[a("span",{class:"truncate block",title:s.uri},o(s.uri),9,we)]),_:1},8,["label"]),e(n,{prop:"mimeType",label:t.$t("resources.mimeType"),width:"180"},{default:l(({row:s})=>[e(p,{size:"small",type:"success",effect:"plain"},{default:l(()=>[c(o(s.mimeType||"unknown"),1)]),_:2},1024)]),_:1},8,["label"]),e(n,{label:"",width:"100",align:"right"},{default:l(({row:s})=>[e(y,{size:"small",plain:"",onClick:$=>b(f,s)},{default:l(()=>[c(o(t.$t("action.view")),1)]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1032,["data"])])):w("",!0)],64)):(d(),u(T,{key:1},[a("div",ve,[e(p,{effect:"dark",type:"info",size:"default",class:"!text-sm font-medium"},{default:l(()=>[c(o(f),1)]),_:2},1024),i[2]||(i[2]=a("div",{class:"h-px flex-1 bg-gray-200 dark:bg-gray-700"},null,-1))]),a("div",xe,[e(g,{data:r,style:{width:"100%"},class:"custom-table col-span-full"},{default:l(()=>[e(n,{prop:"name",label:t.$t("resources.name"),"min-width":"300"},{default:l(({row:s})=>[a("div",$e,[e(m,null,{default:l(()=>[e(_(k))]),_:1}),a("span",{class:"font-medium truncate",title:s.name},o(s.name),9,Te)])]),_:1},8,["label"]),e(n,{prop:"uri",label:t.$t("resources.uri"),"min-width":"300"},{default:l(({row:s})=>[a("span",{class:"truncate block",title:s.uri},o(s.uri),9,Re)]),_:1},8,["label"]),e(n,{prop:"mimeType",label:t.$t("resources.mimeType"),width:"180"},{default:l(({row:s})=>[e(p,{size:"small",type:"success",effect:"plain"},{default:l(()=>[c(o(s.mimeType||"unknown"),1)]),_:2},1024)]),_:1},8,["label"]),e(n,{label:"",width:"100",align:"right"},{default:l(({row:s})=>[e(y,{size:"small",plain:"",onClick:$=>b(f,s)},{default:l(()=>[c(o(t.$t("action.view")),1)]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1032,["data"])])],64))]))),128))])])}}}),Fe=X(ze,[["__scopeId","data-v-b769732e"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- .custom-scrollbar[data-v-b769732e]::-webkit-scrollbar{width:6px}.custom-scrollbar[data-v-b769732e]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-b769732e]::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:3px}.dark .custom-scrollbar[data-v-b769732e]::-webkit-scrollbar-thumb{background-color:#4b556380}.animate-fade-in[data-v-b769732e]{animation:fadeIn-b769732e .3s ease-out}@keyframes fadeIn-b769732e{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
@@ -1 +0,0 @@
1
- .custom-scrollbar[data-v-0af924e8]::-webkit-scrollbar{width:6px}.custom-scrollbar[data-v-0af924e8]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-0af924e8]::-webkit-scrollbar-thumb{background-color:#cbd5e1;border-radius:3px}.dark .custom-scrollbar[data-v-0af924e8]::-webkit-scrollbar-thumb{background-color:#334155}.custom-tabs[data-v-9ecf6079] .el-tabs__header{margin-bottom:0}.custom-tabs[data-v-9ecf6079] .el-tabs__content{flex:1;overflow:hidden;padding-top:1rem}.custom-tabs-label .el-icon[data-v-9ecf6079]{vertical-align:middle}.custom-tabs-label span[data-v-9ecf6079]{vertical-align:middle;margin-left:4px}
@@ -1,2 +0,0 @@
1
- import{o as Oe,g as dt,E as ct,_ as ft,T as vt,a as Ie,b as mt,c as qe,d as gt,l as Le,e as ze,f as Re,i as pt,h as je,j as bt,u as xe,k as Ke,m as ht,n as Se,w as Pe,v as Ge,p as yt,r as wt,s as _t,q as me,t as Ne,x as kt,y as Ct,z as $t,A as St,B as Et,C as Vt,D as Dt}from"./index-Cfcvxyee.js";import{E as Tt,u as Bt,a as It,b as xt,c as Mt,d as At,e as Ut}from"./el-overlay-iw_hrrlC.js";import{n as X,t as be,a1 as ne,x as D,y as f,G as r,H as Ee,O as s,C as o,J as S,I as ge,K as Fe,A as p,U as R,V as te,$ as i,af as pe,v as Ot,L as Ve,a9 as T,M as Lt,c as z,r as B,Q as zt,ag as De,w as F,f as Me,F as Rt,p as Te,a as Ae,ah as jt,ai as We,aj as Qe,l as He,d as Xe,u as k,P as Q,ak as ae,a6 as Pt,Z as Nt,a8 as Ft,E as Ht,a7 as Jt}from"./vue-vendor-6ny5zj9i.js";import{_ as Ze}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{E as qt,a as Kt}from"./el-tab-pane-BgOTBn4X.js";import{E as Gt,a as Wt,b as Qt}from"./el-table-column-Ld4GSD3x.js";import"./el-tag-DYmSo8Bx.js";import{i as Xt,E as Zt,a as Yt,b as ea,c as ta}from"./el-form-item-BmeJKVSi.js";import{E as Ye}from"./el-input-CeZiq23m.js";import{E as aa,a as la}from"./el-select-B73uRP_Y.js";import{T as sa}from"./ToolCallDialog-DQ0OQ1mD.js";import{_ as oa,f as na}from"./ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js";import{E as $}from"./index-COYaYRbH.js";import"./vnode-upjuIlvm.js";import"./event-BB_Ol6Sd.js";import"./raf-DDfJOMYh.js";import"./typescript-Bp3YSIOJ.js";import"./omit-7EL6VJO4.js";import"./_baseClone-Bo5mBgsT.js";import"./index-PhuI36Zi.js";const Be="_trap-focus-children",Z=[],Je=e=>{if(Z.length===0)return;const l=dt(e),c=Z[Z.length-1][Be];if(c.length>0&&l===ct.tab){if(c.length===1){e.preventDefault(),document.activeElement!==c[0]&&c[0].focus();return}const h=e.shiftKey,w=e.target===c[0],g=e.target===c[c.length-1];w&&h&&(e.preventDefault(),c[c.length-1].focus()),g&&!h&&(e.preventDefault(),c[0].focus())}},ra={beforeMount(e){e[Be]=Oe(e),Z.push(e),Z.length<=1&&document.addEventListener("keydown",Je)},updated(e){X(()=>{e[Be]=Oe(e)})},unmounted(){Z.shift(),Z.length===0&&document.removeEventListener("keydown",Je)}},ia=be({name:"ElMessageBox",directives:{TrapFocus:ra},components:{ElButton:qe,ElFocusTrap:mt,ElInput:Ye,ElOverlay:Tt,ElIcon:Ie,...vt},inheritAttrs:!1,props:{buttonSize:{type:String,validator:Xt},modal:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},closeOnHashChange:{type:Boolean,default:!0},center:Boolean,draggable:Boolean,overflow:Boolean,roundButton:Boolean,container:{type:String,default:"body"},boxType:{type:String,default:""}},emits:["vanish","action"],setup(e,{emit:l}){const{locale:c,zIndex:h,ns:w,size:g}=gt("message-box",z(()=>e.buttonSize)),{t:I}=c,{nextZIndex:a}=h,_=B(!1),u=zt({autofocus:!0,beforeClose:null,callback:null,cancelButtonText:"",cancelButtonClass:"",confirmButtonText:"",confirmButtonClass:"",customClass:"",customStyle:{},dangerouslyUseHTMLString:!1,distinguishCancelAndClose:!1,icon:"",closeIcon:"",inputPattern:null,inputPlaceholder:"",inputType:"text",inputValue:"",inputValidator:void 0,inputErrorMessage:"",message:"",modalFade:!0,modalClass:"",showCancelButton:!1,showConfirmButton:!0,type:"",title:void 0,showInput:!1,action:"",confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonLoadingIcon:De(Le),cancelButtonLoadingIcon:De(Le),confirmButtonDisabled:!1,editorErrorMessage:"",validateError:!1,zIndex:a()}),U=z(()=>{const y=u.type;return{[w.bm("icon",y)]:y&&ze[y]}}),b=Re(),x=Re(),H=z(()=>{const y=u.type;return u.icon||y&&ze[y]||""}),O=z(()=>!!u.message),L=B(),G=B(),E=B(),J=B(),se=B(),he=z(()=>u.confirmButtonClass);F(()=>u.inputValue,async y=>{await X(),e.boxType==="prompt"&&y&&ue()},{immediate:!0}),F(()=>_.value,y=>{var M,A;y&&(e.boxType!=="prompt"&&(u.autofocus?E.value=(A=(M=se.value)==null?void 0:M.$el)!=null?A:L.value:E.value=L.value),u.zIndex=a()),e.boxType==="prompt"&&(y?X().then(()=>{var ce;J.value&&J.value.$el&&(u.autofocus?E.value=(ce=ke())!=null?ce:L.value:E.value=L.value)}):(u.editorErrorMessage="",u.validateError=!1))});const ye=z(()=>e.draggable),we=z(()=>e.overflow),{isDragging:ie}=Bt(L,G,ye,we);Me(async()=>{await X(),e.closeOnHashChange&&window.addEventListener("hashchange",q)}),Rt(()=>{e.closeOnHashChange&&window.removeEventListener("hashchange",q)});function q(){_.value&&(_.value=!1,X(()=>{u.action&&l("action",u.action)}))}const Y=()=>{e.closeOnClickModal&&ee(u.distinguishCancelAndClose?"close":"cancel")},oe=xt(Y),_e=y=>{if(u.inputType!=="textarea")return y.preventDefault(),ee("confirm")},ee=y=>{var M;e.boxType==="prompt"&&y==="confirm"&&!ue()||(u.action=y,u.beforeClose?(M=u.beforeClose)==null||M.call(u,y,u,q):q())},ue=()=>{if(e.boxType==="prompt"){const y=u.inputPattern;if(y&&!y.test(u.inputValue||""))return u.editorErrorMessage=u.inputErrorMessage||I("el.messagebox.error"),u.validateError=!0,!1;const M=u.inputValidator;if(Te(M)){const A=M(u.inputValue);if(A===!1)return u.editorErrorMessage=u.inputErrorMessage||I("el.messagebox.error"),u.validateError=!0,!1;if(Ae(A))return u.editorErrorMessage=A,u.validateError=!0,!1}}return u.editorErrorMessage="",u.validateError=!1,!0},ke=()=>{var y,M;const A=(y=J.value)==null?void 0:y.$refs;return(M=A?.input)!=null?M:A?.textarea},de=()=>{ee("close")},Ce=()=>{e.closeOnPressEscape&&de()};return e.lockScroll&&It(_,{ns:w}),{...jt(u),ns:w,overlayEvent:oe,visible:_,hasMessage:O,typeClass:U,contentId:b,inputId:x,btnSize:g,iconComponent:H,confirmButtonClasses:he,rootRef:L,focusStartRef:E,headerRef:G,inputRef:J,isDragging:ie,confirmRef:se,doClose:q,handleClose:de,onCloseRequested:Ce,handleWrapperClick:Y,handleInputEnter:_e,handleAction:ee,t:I}}}),ua=["aria-label","aria-describedby"],da=["aria-label"],ca=["id"];function fa(e,l,c,h,w,g){const I=ne("el-icon"),a=ne("el-input"),_=ne("el-button"),u=ne("el-focus-trap"),U=ne("el-overlay");return f(),D(Lt,{name:"fade-in-linear",onAfterLeave:l[11]||(l[11]=b=>e.$emit("vanish")),persisted:""},{default:r(()=>[Ee(s(U,{"z-index":e.zIndex,"overlay-class":[e.ns.is("message-box"),e.modalClass],mask:e.modal},{default:r(()=>[o("div",{role:"dialog","aria-label":e.title,"aria-modal":"true","aria-describedby":e.showInput?void 0:e.contentId,class:S(`${e.ns.namespace.value}-overlay-message-box`),onClick:l[8]||(l[8]=(...b)=>e.overlayEvent.onClick&&e.overlayEvent.onClick(...b)),onMousedown:l[9]||(l[9]=(...b)=>e.overlayEvent.onMousedown&&e.overlayEvent.onMousedown(...b)),onMouseup:l[10]||(l[10]=(...b)=>e.overlayEvent.onMouseup&&e.overlayEvent.onMouseup(...b))},[s(u,{loop:"",trapped:e.visible,"focus-trap-el":e.rootRef,"focus-start-el":e.focusStartRef,onReleaseRequested:e.onCloseRequested},{default:r(()=>[o("div",{ref:"rootRef",class:S([e.ns.b(),e.customClass,e.ns.is("draggable",e.draggable),e.ns.is("dragging",e.isDragging),{[e.ns.m("center")]:e.center}]),style:Fe(e.customStyle),tabindex:"-1",onClick:l[7]||(l[7]=ge(()=>{},["stop"]))},[e.title!==null&&e.title!==void 0?(f(),p("div",{key:0,ref:"headerRef",class:S([e.ns.e("header"),{"show-close":e.showClose}])},[o("div",{class:S(e.ns.e("title"))},[e.iconComponent&&e.center?(f(),D(I,{key:0,class:S([e.ns.e("status"),e.typeClass])},{default:r(()=>[(f(),D(te(e.iconComponent)))]),_:1},8,["class"])):R("v-if",!0),o("span",null,i(e.title),1)],2),e.showClose?(f(),p("button",{key:0,type:"button",class:S(e.ns.e("headerbtn")),"aria-label":e.t("el.messagebox.close"),onClick:l[0]||(l[0]=b=>e.handleAction(e.distinguishCancelAndClose?"close":"cancel")),onKeydown:l[1]||(l[1]=pe(ge(b=>e.handleAction(e.distinguishCancelAndClose?"close":"cancel"),["prevent"]),["enter"]))},[s(I,{class:S(e.ns.e("close"))},{default:r(()=>[(f(),D(te(e.closeIcon||"close")))]),_:1},8,["class"])],42,da)):R("v-if",!0)],2)):R("v-if",!0),o("div",{id:e.contentId,class:S(e.ns.e("content"))},[o("div",{class:S(e.ns.e("container"))},[e.iconComponent&&!e.center&&e.hasMessage?(f(),D(I,{key:0,class:S([e.ns.e("status"),e.typeClass])},{default:r(()=>[(f(),D(te(e.iconComponent)))]),_:1},8,["class"])):R("v-if",!0),e.hasMessage?(f(),p("div",{key:1,class:S(e.ns.e("message"))},[Ot(e.$slots,"default",{},()=>[e.dangerouslyUseHTMLString?(f(),D(te(e.showInput?"label":"p"),{key:1,for:e.showInput?e.inputId:void 0,innerHTML:e.message},null,8,["for","innerHTML"])):(f(),D(te(e.showInput?"label":"p"),{key:0,for:e.showInput?e.inputId:void 0,textContent:i(e.message)},null,8,["for","textContent"]))])],2)):R("v-if",!0)],2),Ee(o("div",{class:S(e.ns.e("input"))},[s(a,{id:e.inputId,ref:"inputRef",modelValue:e.inputValue,"onUpdate:modelValue":l[2]||(l[2]=b=>e.inputValue=b),type:e.inputType,placeholder:e.inputPlaceholder,"aria-invalid":e.validateError,class:S({invalid:e.validateError}),onKeydown:pe(e.handleInputEnter,["enter"])},null,8,["id","modelValue","type","placeholder","aria-invalid","class","onKeydown"]),o("div",{class:S(e.ns.e("errormsg")),style:Fe({visibility:e.editorErrorMessage?"visible":"hidden"})},i(e.editorErrorMessage),7)],2),[[Ve,e.showInput]])],10,ca),o("div",{class:S(e.ns.e("btns"))},[e.showCancelButton?(f(),D(_,{key:0,loading:e.cancelButtonLoading,"loading-icon":e.cancelButtonLoadingIcon,class:S([e.cancelButtonClass]),round:e.roundButton,size:e.btnSize,onClick:l[3]||(l[3]=b=>e.handleAction("cancel")),onKeydown:l[4]||(l[4]=pe(ge(b=>e.handleAction("cancel"),["prevent"]),["enter"]))},{default:r(()=>[T(i(e.cancelButtonText||e.t("el.messagebox.cancel")),1)]),_:1},8,["loading","loading-icon","class","round","size"])):R("v-if",!0),Ee(s(_,{ref:"confirmRef",type:"primary",loading:e.confirmButtonLoading,"loading-icon":e.confirmButtonLoadingIcon,class:S([e.confirmButtonClasses]),round:e.roundButton,disabled:e.confirmButtonDisabled,size:e.btnSize,onClick:l[5]||(l[5]=b=>e.handleAction("confirm")),onKeydown:l[6]||(l[6]=pe(ge(b=>e.handleAction("confirm"),["prevent"]),["enter"]))},{default:r(()=>[T(i(e.confirmButtonText||e.t("el.messagebox.confirm")),1)]),_:1},8,["loading","loading-icon","class","round","disabled","size"]),[[Ve,e.showConfirmButton]])],2)],6)]),_:3},8,["trapped","focus-trap-el","focus-start-el","onReleaseRequested"])],42,ua)]),_:3},8,["z-index","overlay-class","mask"]),[[Ve,e.visible]])]),_:3})}var va=ft(ia,[["render",fa],["__file","/home/runner/work/element-plus/element-plus/packages/components/message-box/src/index.vue"]]);const re=new Map,ma=e=>{let l=document.body;return e.appendTo&&(Ae(e.appendTo)&&(l=document.querySelector(e.appendTo)),je(e.appendTo)&&(l=e.appendTo),je(l)||(l=document.body)),l},ga=(e,l,c=null)=>{const h=s(va,e,Te(e.message)||We(e.message)?{default:Te(e.message)?e.message:()=>e.message}:null);return h.appContext=c,Qe(h,l),ma(e).appendChild(l.firstElementChild),h.component},pa=()=>document.createElement("div"),ba=(e,l)=>{const c=pa();e.onVanish=()=>{Qe(null,c),re.delete(w)},e.onAction=g=>{const I=re.get(w);let a;e.showInput?a={value:w.inputValue,action:g}:a=g,e.callback?e.callback(a,h.proxy):g==="cancel"||g==="close"?e.distinguishCancelAndClose&&g!=="cancel"?I.reject("close"):I.reject("cancel"):I.resolve(a)};const h=ga(e,c,l),w=h.proxy;for(const g in e)He(e,g)&&!He(w.$props,g)&&(g==="closeIcon"&&Xe(e[g])?w[g]=De(e[g]):w[g]=e[g]);return w.visible=!0,w};function le(e,l=null){if(!pt)return Promise.reject();let c;return Ae(e)||We(e)?e={message:e}:c=e.callback,new Promise((h,w)=>{const g=ba(e,l??le._context);re.set(g,{options:e,callback:c,resolve:h,reject:w})})}const ha=["alert","confirm","prompt"],ya={alert:{closeOnPressEscape:!1,closeOnClickModal:!1},confirm:{showCancelButton:!0},prompt:{showCancelButton:!0,showInput:!0}};ha.forEach(e=>{le[e]=wa(e)});function wa(e){return(l,c,h,w)=>{let g="";return Xe(c)?(h=c,g=""):bt(c)?g="":g=c,le(Object.assign({title:g,message:l,type:"",...ya[e]},h,{boxType:e}),w)}}le.close=()=>{re.forEach((e,l)=>{l.doClose()}),re.clear()};le._context=null;const K=le;K.install=e=>{K._context=e._context,e.config.globalProperties.$msgbox=K,e.config.globalProperties.$messageBox=K,e.config.globalProperties.$alert=K.alert,e.config.globalProperties.$confirm=K.confirm,e.config.globalProperties.$prompt=K.prompt};const _a=K,ka={class:"dashboard py-6 px-4 sm:px-6 lg:px-8 max-w-7xl mx-auto w-full h-full flex flex-col overflow-hidden transition-colors duration-300"},Ca={class:"text-2xl font-semibold text-gray-900 dark:text-white mb-6 shrink-0"},$a={key:0,class:"grid grid-cols-3 gap-6 mb-8 shrink-0"},Sa={class:"p-6 rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-[#1e293b] h-32"},Ea={key:1,class:"grid grid-cols-3 gap-6 mb-8 shrink-0"},Va={class:"stat-card bg-white dark:bg-[#1e293b] p-6 rounded-xl border border-gray-200 dark:border-gray-700 shadow-sm transition-colors duration-300"},Da={class:"text-gray-500 dark:text-gray-400 text-sm mb-2"},Ta={class:"text-4xl font-bold text-gray-900 dark:text-white"},Ba={class:"stat-card bg-white dark:bg-[#1e293b] p-6 rounded-xl border border-gray-200 dark:border-gray-700 shadow-sm transition-colors duration-300"},Ia={class:"text-gray-500 dark:text-gray-400 text-sm mb-2"},xa={class:"text-4xl font-bold text-gray-900 dark:text-white"},Ma={class:"stat-card bg-white dark:bg-[#1e293b] p-6 rounded-xl border border-gray-200 dark:border-gray-700 shadow-sm transition-colors duration-300"},Aa={class:"text-gray-500 dark:text-gray-400 text-sm mb-2"},Ua={class:"text-4xl font-bold text-red-500"},Oa={class:"activity-section bg-white dark:bg-[#1e293b] rounded-xl border border-gray-200 dark:border-gray-700 flex flex-col flex-1 min-h-0 shadow-sm transition-colors duration-300"},La={class:"p-4 border-b border-gray-200 dark:border-gray-700"},za={class:"text-lg font-medium text-gray-900 dark:text-white"},Ra={class:"flex items-center gap-2 mb-1"},ja={class:"font-medium text-gray-700 dark:text-gray-200"},Pa={class:"text-xs text-gray-400 ml-auto"},Na={class:"text-sm text-gray-600 dark:text-gray-400 font-mono pl-6 break-words"},Fa={key:0,class:"flex flex-col items-center justify-center h-full text-gray-400 dark:text-gray-500"},Ha=be({__name:"DashboardView",setup(e){const l=xe();Ke();const c=B(null);Me(()=>{!l.loading&&l.servers.length>0&&l.fetchAllLogs()}),F(()=>l.loading,a=>{!a&&l.servers.length>0&&l.fetchAllLogs()});const h=z(()=>{const a=[];return l.servers.forEach(_=>{_.logs.forEach((u,U)=>{a.push({serverName:_.name,serverStatus:_.status,message:u.message,time:w(u.timestamp),timestamp:u.timestamp,originalIndex:U})})}),a.sort((_,u)=>_.timestamp-u.timestamp)});F(()=>h.value.length,()=>{X(()=>{c.value&&(c.value.scrollTop=c.value.scrollHeight)})});function w(a){const _=new Date(a),u=String(_.getHours()).padStart(2,"0"),U=String(_.getMinutes()).padStart(2,"0"),b=String(_.getSeconds()).padStart(2,"0"),x=String(_.getMilliseconds()).padStart(3,"0");return`${u}:${U}:${b}.${x}`}function g(a){switch(a){case"online":return Ge;case"offline":return Se;case"stopping":return Se;case"error":return Pe;case"starting":return Pe;default:return Se}}function I(a){switch(a){case"online":return"text-green-500";case"offline":return"text-gray-400";case"stopping":return"text-gray-400";case"error":return"text-yellow-500";case"starting":return"text-yellow-500";default:return"text-gray-400"}}return(a,_)=>{const u=At,U=Mt,b=Ie;return f(),p("div",ka,[o("h2",Ca,i(a.$t("dashboard.title")),1),k(l).loading&&k(l).servers.length===0?(f(),p("div",$a,[s(U,{animated:"",count:3,class:"w-full h-full"},{template:r(()=>[o("div",Sa,[s(u,{variant:"text",style:{width:"30%"},class:"mb-2"}),s(u,{variant:"h1",style:{width:"50%"}})])]),_:1})])):(f(),p("div",Ea,[o("div",Va,[o("div",Da,i(a.$t("dashboard.totalServers")),1),o("div",Ta,i(k(l).stats.total),1)]),o("div",Ba,[o("div",Ia,i(a.$t("dashboard.running")),1),o("div",xa,i(k(l).stats.online),1)]),o("div",Ma,[o("div",Aa,i(a.$t("dashboard.errors")),1),o("div",Ua,i(k(l).stats.errors),1)])])),o("div",Oa,[o("div",La,[o("h3",za,i(a.$t("dashboard.recentActivity")),1)]),o("div",{ref_key:"activityContainer",ref:c,class:"p-4 overflow-y-auto flex-1 custom-scrollbar"},[(f(!0),p(Q,null,ae(h.value,(x,H)=>(f(),p("div",{key:H,class:"activity-item mb-4 pb-4 border-b border-gray-100 dark:border-gray-700/50 last:border-0"},[o("div",Ra,[s(b,{size:16,class:S(I(x.serverStatus))},{default:r(()=>[(f(),D(te(g(x.serverStatus))))]),_:2},1032,["class"]),o("span",ja,i(x.serverName),1),o("span",Pa,i(x.time),1)]),o("div",Na,i(x.message),1)]))),128)),h.value.length===0?(f(),p("div",Fa,[s(b,{size:40,class:"mb-2 opacity-50"},{default:r(()=>[s(k(ht))]),_:1}),_[0]||(_[0]=o("span",null,"No recent activity",-1))])):R("",!0)],512)])])}}}),Ja=Ze(Ha,[["__scopeId","data-v-0af924e8"]]),qa={key:0,class:"server-detail py-6 px-4 sm:px-6 lg:px-8 max-w-7xl mx-auto w-full h-full flex flex-col overflow-hidden transition-colors duration-300"},Ka={class:"flex items-center justify-between mb-6 shrink-0"},Ga={class:"flex items-center gap-4"},Wa={class:"flex flex-col items-start gap-2"},Qa={class:"text-2xl font-bold text-gray-900 dark:text-white"},Xa={class:"flex gap-2"},Za={class:"custom-tabs-label"},Ya={class:"max-w-3xl"},el={class:"w-full flex flex-col gap-2"},tl={class:"w-full flex flex-col gap-2"},al={class:"flex gap-2"},ll={class:"custom-tabs-label"},sl={class:"flex items-center justify-between gap-2 mb-2"},ol={class:"flex items-center gap-2"},nl={class:"text-sm text-gray-600 dark:text-gray-400 font-medium"},rl={class:"flex items-center justify-between w-full"},il={key:0,class:"text-blue-500 text-xs ml-2"},ul={class:"flex items-center gap-2"},dl={class:"custom-tabs-label"},cl={class:"flex h-full gap-4"},fl={class:"w-1/3 border-r border-gray-200 dark:border-gray-700 pr-4 overflow-y-auto"},vl={class:"font-bold mb-4"},ml={key:0,class:"space-y-2"},gl=["onClick"],pl={class:"min-w-0 flex-1 mr-2"},bl={class:"font-medium truncate"},hl={key:1,class:"text-gray-500 text-sm italic"},yl={class:"flex-1 min-h-0 overflow-y-auto px-4 flex flex-col"},wl={class:"flex justify-between items-center mb-4 shrink-0"},_l={class:"font-bold"},kl={key:0},Cl={class:"mb-4 text-gray-600 dark:text-gray-300"},$l={class:"font-medium mb-2"},Sl={class:"bg-gray-50 dark:bg-[#0f172a] p-4 rounded-lg overflow-x-auto text-sm font-mono border border-gray-200 dark:border-gray-700"},El={key:1,class:"flex-1 flex items-center justify-center text-gray-400"},Vl={class:"custom-tabs-label"},Dl={class:"h-full overflow-y-auto"},Tl={class:"flex items-center gap-2"},Bl={class:"font-medium"},Il={key:0,class:"text-center py-8 text-gray-500"},xl={class:"dialog-footer"},Ml={key:1,class:"h-full flex items-center justify-center text-gray-400"},Al=be({__name:"ServerDetail",setup(e){const l=xe();Ke();const{t:c}=Pt(),h=Jt(),w=Ft();function g(){l.selectedServerId=null,h.push({name:"servers"})}function I(t){a.value&&h.push({name:"resource-detail",params:{name:a.value.name},query:{uri:t.uri,name:t.name,mimeType:t.mimeType}})}const a=z(()=>l.selectedServer),_=z(()=>a.value?l.servers.filter(t=>t.name===a.value.name):[]),u=z({get:()=>a.value?.id||"",set:t=>{l.selectServer(t)}});function U(t){let n=t.id;return t.pid&&(n+=` (PID: ${t.pid})`),t.instance?.hash==="config-only"&&(n="Config (No Instance)"),t.status==="online"?n+=` (${c("serverDetail.status.running")})`:t.status==="offline"&&t.instance?.hash!=="config-only"&&(n+=` (${c("serverDetail.status.stopped")})`),n}const b=B("config"),x=B(!0),H=B(null),O=B({}),L=B(!1),G=B(""),E=B(null),J=B(!1);Nt(()=>{const t=w.query.tab;t&&["config","logs","tools","resources"].includes(t)&&(b.value=t)});const se=z({get:()=>a.value?.config.timeout?a.value.config.timeout/1e3:60,set:t=>{a.value&&(a.value.config.timeout=t*1e3)}});F(a,t=>{t?.config.env&&(O.value={},Object.keys(t.config.env).forEach(n=>{O.value[n]=n}))},{immediate:!0}),F(()=>a.value?.id,(t,n)=>{t&&t!==n&&(w.query.tab||(b.value=a.value?.status==="online"?"logs":"config"),E.value=null)},{immediate:!0}),F(()=>a.value?.logs.length,()=>{x.value&&X(()=>{H.value&&(H.value.scrollTop=H.value.scrollHeight)})}),F(b,async t=>{a.value?.id&&(t==="tools"?await l.fetchTools(a.value.id):t==="resources"?await l.fetchResources(a.value.id):t==="logs"&&l.fetchLogs(a.value.id))},{immediate:!0});function he(t){E.value=t}function ye(t){if(!a.value?.config)return!1;const n=a.value.config.allowedTools;return n==null||n.length===0?!1:Array.isArray(n)?n.includes(t):!1}function we(t){switch(t){case"debug":return"text-gray-400";case"info":return"text-blue-400";case"warn":return"text-yellow-400";case"error":return"text-red-400";default:return"text-gray-300"}}function ie(t){const n=new Date(t),v=n.getFullYear(),m=String(n.getMonth()+1).padStart(2,"0"),C=String(n.getDate()).padStart(2,"0"),W=String(n.getHours()).padStart(2,"0"),j=String(n.getMinutes()).padStart(2,"0"),P=String(n.getSeconds()).padStart(2,"0"),$e=String(n.getMilliseconds()).padStart(3,"0");return`${v}-${m}-${C} ${W}:${j}:${P}.${$e}`}const q=B("00:00:00");let Y=null;const oe=()=>{q.value=na(a.value?.startTime,a.value?.status)};Me(()=>{Y=setInterval(oe,1e3),oe()}),Ht(()=>{Y&&clearInterval(Y)}),F(()=>a.value?.startTime,()=>{oe()});const _e=async()=>{if(a.value)try{a.value.status==="online"&&await l.stopServer(a.value.id),await l.startServer(a.value.id),$.success(c("action.restarted"))}catch(t){t instanceof Error?$.error(t.message):$.error(String(t))}},ee=async()=>{if(a.value)try{await l.stopServer(a.value.id),$.success(c("action.stopped"))}catch(t){t instanceof Error?$.error(t.message):$.error(String(t))}},ue=async()=>{if(a.value)try{await l.startServer(a.value.id),$.success(c("action.started"))}catch(t){t instanceof Error?$.error(t.message):$.error(String(t))}},ke=async()=>{if(a.value)try{await _a.confirm(c("serverDetail.deleteConfirm"),c("action.delete"),{confirmButtonText:c("action.delete"),cancelButtonText:c("action.cancel"),type:"warning"}),await l.deleteServer(a.value.id),$.success(c("action.serverDeleted")),l.selectedServerId=null}catch(t){t!=="cancel"&&(t instanceof Error?$.error(t.message||"Failed to delete server"):$.error(String(t)||"Failed to delete server"))}},de=async(t,n)=>{if(!a.value)return;let v=a.value.config.allowedTools;v==null&&(a.value.tools?v=a.value.tools.map(m=>m.name):v=[]),n?v.includes(t)||(v=[...v,t]):v=v.filter(m=>m!==t),a.value.config.allowedTools=v;try{await l.updateServer(a.value.id,{config:a.value.config}),$.success(c("action.configSaved"))}catch(m){m instanceof Error?$.error(m.message):$.error(String(m))}},Ce=async()=>{if(a.value)try{await l.updateServer(a.value.id,{config:a.value.config}),$.success(c("action.configSaved"))}catch(t){t instanceof Error?$.error(t.message):$.error(String(t))}},y=()=>{if(!a.value)return;const t={env:a.value.config.env||{},enabled:a.value.config.enabled,description:a.value.config.description};a.value.config.timeout&&(t.timeout=a.value.config.timeout),a.value.config.type==="stdio"?(t.command=a.value.config.command,t.args=a.value.config.args||[]):t.url=a.value.config.url;const n={mcpServers:{[a.value.name]:t}};G.value=JSON.stringify(n,null,2),L.value=!0},M=async()=>{try{const t=JSON.parse(G.value);if(!t.mcpServers)throw new Error("Missing mcpServers key");const n=Object.keys(t.mcpServers);if(n.length===0)throw new Error("No server config found");const v=n[0]||"",m=t.mcpServers[v];if(a.value){const C={...a.value.config};m.command?(C.type="stdio",C.command=m.command,C.args=m.args||[],delete C.url):m.url&&(m.type==="streamable-http"||m.type==="http"?C.type="streamable-http":C.type="sse",C.url=m.url,delete C.command,delete C.args),m.env&&(C.env=m.env),m.timeout!==void 0&&(C.timeout=m.timeout),m.enabled!==void 0&&(C.enabled=m.enabled),m.description!==void 0&&(C.description=m.description),await l.updateServer(a.value.id,{name:v!==a.value.name?v:void 0,config:C}),C.env&&(O.value={},Object.keys(C.env).forEach(W=>{O.value[W]=W})),L.value=!1,$.success(c("action.configSaved"))}}catch(t){t instanceof Error?$.error("Invalid JSON: "+t.message):$.error("Invalid JSON: "+String(t))}},A=()=>{a.value.config.args||(a.value.config.args=[]),a.value.config.args.push("")},ce=t=>{a.value.config.args?.splice(t,1)},et=()=>{a.value.config.env||(a.value.config.env={});const t=`NEW_VAR_${Object.keys(a.value.config.env).length}`;a.value.config.env[t]="",O.value[t]=t},tt=t=>{delete a.value.config.env[t],delete O.value[t]},at=(t,n)=>{if(t===n)return;const v=a.value.config.env[t]||"";delete a.value.config.env[t],a.value.config.env[n]=v,delete O.value[t],O.value[n]=n},lt=async()=>{a.value&&(await l.clearLogs(a.value.id),$.success(c("action.logsCleared")))},st=()=>{if(a.value){const t=a.value.logs.map(n=>`${ie(n.timestamp)} [${n.level.toUpperCase()}] ${n.message}`).join(`
2
- `);navigator.clipboard.writeText(t),$.success(c("action.logsCopied"))}};return(t,n)=>{const v=qe,m=Ie,C=la,W=aa,j=Yt,P=Ye,$e=ea,Ue=ta,ot=Zt,fe=Kt,nt=Gt,ve=Qt,rt=Wt,it=qt,ut=Ut;return a.value?(f(),p("div",qa,[o("div",Ka,[o("div",Ga,[s(v,{icon:k(yt),plain:"",onClick:g,class:"shrink-0"},{default:r(()=>[T(i(t.$t("action.back")),1)]),_:1},8,["icon"]),o("div",Wa,[o("h2",Qa,i(a.value.name),1),s(oa,{server:a.value,"include-uptime":!0,"formatted-uptime":q.value},null,8,["server","formatted-uptime"])])]),o("div",Xa,[s(v,{icon:k(wt),plain:"",onClick:_e},{default:r(()=>[T(i(t.$t("action.restart")),1)]),_:1},8,["icon"]),a.value.status==="online"?(f(),D(v,{key:0,type:"warning",plain:"",icon:k(_t),onClick:ee},{default:r(()=>[T(i(t.$t("action.stop")),1)]),_:1},8,["icon"])):(f(),D(v,{key:1,type:"success",icon:k(Ge),onClick:ue},{default:r(()=>[T(i(t.$t("action.start")),1)]),_:1},8,["icon"])),s(v,{type:"danger",icon:k(me),onClick:ke},{default:r(()=>[T(i(t.$t("action.delete")),1)]),_:1},8,["icon"])])]),s(it,{modelValue:b.value,"onUpdate:modelValue":n[9]||(n[9]=d=>b.value=d),class:"flex-1 flex flex-col overflow-hidden custom-tabs"},{default:r(()=>[s(fe,{name:"config",class:"h-full overflow-y-auto"},{label:r(()=>[o("span",Za,[s(m,null,{default:r(()=>[s(k(Ct))]),_:1}),o("span",null,i(t.$t("serverDetail.tabs.config")),1)])]),default:r(()=>[o("div",Ya,[s(ot,{"label-position":"top",class:"mt-4"},{default:r(()=>[s(j,{label:t.$t("serverDetail.config.transport")},{default:r(()=>[s(W,{modelValue:a.value.config.type,"onUpdate:modelValue":n[0]||(n[0]=d=>a.value.config.type=d),class:"w-full"},{default:r(()=>[s(C,{label:t.$t("serverDetail.config.transportStdio"),value:"stdio"},null,8,["label"]),s(C,{label:t.$t("serverDetail.config.transportSse"),value:"sse"},null,8,["label"]),s(C,{label:t.$t("serverDetail.config.transportHttp"),value:"streamable-http"},null,8,["label"])]),_:1},8,["modelValue"])]),_:1},8,["label"]),a.value.config.type==="stdio"?(f(),p(Q,{key:0},[s(j,{label:t.$t("serverDetail.config.executable")},{default:r(()=>[s(P,{modelValue:a.value.config.command,"onUpdate:modelValue":n[1]||(n[1]=d=>a.value.config.command=d)},null,8,["modelValue"])]),_:1},8,["label"]),s(j,{label:t.$t("serverDetail.config.args")},{default:r(()=>[o("div",el,[(f(!0),p(Q,null,ae(a.value.config.args,(d,V)=>(f(),p("div",{key:V,class:"flex gap-2 w-full"},[s(P,{modelValue:a.value.config.args[V],"onUpdate:modelValue":N=>a.value.config.args[V]=N},null,8,["modelValue","onUpdate:modelValue"]),s(v,{icon:k(me),circle:"",plain:"",onClick:N=>ce(V)},null,8,["icon","onClick"])]))),128)),o("div",null,[s(v,{icon:k(Ne),plain:"",size:"small",onClick:A},{default:r(()=>[T("+ "+i(t.$t("serverDetail.config.addArg")),1)]),_:1},8,["icon"])])])]),_:1},8,["label"])],64)):(f(),D(j,{key:1,label:t.$t("serverDetail.config.url")},{default:r(()=>[s(P,{modelValue:a.value.config.url,"onUpdate:modelValue":n[2]||(n[2]=d=>a.value.config.url=d)},null,8,["modelValue"])]),_:1},8,["label"])),s(j,{label:t.$t("serverDetail.config.timeout")},{default:r(()=>[s($e,{modelValue:se.value,"onUpdate:modelValue":n[3]||(n[3]=d=>se.value=d),min:0,step:1},null,8,["modelValue"])]),_:1},8,["label"]),s(j,{label:t.$t("serverDetail.config.description")},{default:r(()=>[s(P,{modelValue:a.value.config.description,"onUpdate:modelValue":n[4]||(n[4]=d=>a.value.config.description=d),type:"textarea",rows:3,placeholder:t.$t("serverDetail.config.descriptionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),s(j,{label:t.$t("serverDetail.config.autoStart")},{default:r(()=>[s(Ue,{modelValue:a.value.config.enabled,"onUpdate:modelValue":n[5]||(n[5]=d=>a.value.config.enabled=d)},null,8,["modelValue"])]),_:1},8,["label"]),s(j,{label:t.$t("serverDetail.config.env")},{default:r(()=>[o("div",tl,[(f(!0),p(Q,null,ae(a.value.config.env,(d,V)=>(f(),p("div",{key:V,class:"flex gap-2 w-full"},[s(P,{modelValue:O.value[V],"onUpdate:modelValue":N=>O.value[V]=N,placeholder:t.$t("addServer.keyPlaceholder"),class:"w-1/3",onChange:N=>at(V,N)},null,8,["modelValue","onUpdate:modelValue","placeholder","onChange"]),s(P,{modelValue:a.value.config.env[V],"onUpdate:modelValue":N=>a.value.config.env[V]=N,placeholder:t.$t("addServer.valuePlaceholder"),class:"flex-1"},null,8,["modelValue","onUpdate:modelValue","placeholder"]),s(v,{icon:k(me),circle:"",plain:"",onClick:N=>tt(V)},null,8,["icon","onClick"])]))),128)),o("div",null,[s(v,{icon:k(Ne),plain:"",size:"small",onClick:et},{default:r(()=>[T("+ "+i(t.$t("serverDetail.config.addEnv")),1)]),_:1},8,["icon"])])])]),_:1},8,["label"]),o("div",al,[s(v,{type:"primary",class:"mt-4",onClick:Ce},{default:r(()=>[T(i(t.$t("serverDetail.config.save")),1)]),_:1}),s(v,{class:"mt-4",icon:k(kt),onClick:y},{default:r(()=>[T(i(t.$t("serverDetail.config.editByJson")),1)]),_:1},8,["icon"])])]),_:1})])]),_:1}),s(fe,{name:"logs",class:"h-full flex flex-col"},{label:r(()=>[o("span",ll,[s(m,null,{default:r(()=>[s(k(St))]),_:1}),o("span",null,i(t.$t("serverDetail.tabs.logs")),1)])]),default:r(()=>[o("div",sl,[o("div",ol,[o("span",nl,i(t.$t("serverDetail.logs.instance")),1),s(W,{modelValue:u.value,"onUpdate:modelValue":n[6]||(n[6]=d=>u.value=d),size:"small",style:{width:"450px"},placeholder:t.$t("serverDetail.logs.selectInstance")},{default:r(()=>[(f(!0),p(Q,null,ae(_.value,d=>(f(),D(C,{key:d.id,label:U(d),value:d.id},{default:r(()=>[o("div",rl,[o("span",null,i(U(d)),1),d.id===a.value.id?(f(),p("span",il,"Current")):R("",!0)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder"])]),o("div",ul,[s(nt,{modelValue:x.value,"onUpdate:modelValue":n[7]||(n[7]=d=>x.value=d),label:t.$t("serverDetail.logs.autoScroll"),class:"text-gray-600 dark:text-gray-400"},null,8,["modelValue","label"]),s(v,{size:"small",icon:k(me),plain:"",onClick:lt},{default:r(()=>[T(i(t.$t("serverDetail.logs.clear")),1)]),_:1},8,["icon"]),s(v,{size:"small",icon:k($t),plain:"",onClick:st},{default:r(()=>[T(i(t.$t("serverDetail.logs.copy")),1)]),_:1},8,["icon"])])]),o("div",{class:"bg-gray-900 dark:bg-black p-4 rounded-lg font-mono text-sm h-full overflow-y-auto text-gray-300",ref_key:"logsContainer",ref:H},[(f(!0),p(Q,null,ae(a.value.logs,(d,V)=>(f(),p("div",{key:V,class:"mb-1 break-words"},[o("span",{class:S(we(d.level))},i(ie(d.timestamp))+" ["+i(d.level.toUpperCase())+"] "+i(d.message),3)]))),128))],512)]),_:1}),s(fe,{name:"tools",class:"h-full flex flex-col"},{label:r(()=>[o("span",dl,[s(m,null,{default:r(()=>[s(k(Et))]),_:1}),o("span",null,i(t.$t("serverDetail.tabs.tools"))+" ("+i(a.value.toolsCount||0)+")",1)])]),default:r(()=>[o("div",cl,[o("div",fl,[o("h3",vl,i(t.$t("serverDetail.tools.available")),1),a.value.tools&&a.value.tools.length>0?(f(),p("div",ml,[(f(!0),p(Q,null,ae(a.value.tools,d=>(f(),p("div",{key:d.name,class:S(["p-3 rounded-lg cursor-pointer transition-colors flex items-center justify-between group",E.value?.name===d.name?"bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-800":"hover:bg-gray-100 dark:hover:bg-gray-800 border border-transparent"]),onClick:V=>he(d)},[o("div",pl,[o("div",bl,i(d.name),1)]),s(Ue,{"model-value":ye(d.name),"onUpdate:modelValue":V=>de(d.name,!!V),class:"mr-4","active-text":t.$t("serverDetail.tools.aggregated")},null,8,["model-value","onUpdate:modelValue","active-text"])],10,gl))),128))])):(f(),p("div",hl,i(t.$t("serverDetail.tools.none")),1))]),o("div",yl,[o("div",wl,[o("h3",_l,i(t.$t("serverDetail.tools.details"))+": "+i(E.value?.name||""),1),E.value?(f(),D(v,{key:0,type:"primary",size:"small",onClick:n[8]||(n[8]=d=>J.value=!0)},{default:r(()=>[T(i(t.$t("serverDetail.tools.call")),1)]),_:1})):R("",!0)]),E.value?(f(),p("div",kl,[o("p",Cl,i(E.value.description),1),o("h4",$l,i(t.$t("serverDetail.tools.schema")),1),o("pre",Sl,i(JSON.stringify(E.value.inputSchema,null,2)),1)])):(f(),p("div",El,i(t.$t("serverDetail.tools.selectHint")),1))])])]),_:1}),s(fe,{name:"resources",class:"h-full flex flex-col"},{label:r(()=>[o("span",Vl,[s(m,null,{default:r(()=>[s(k(Dt))]),_:1}),o("span",null,i(t.$t("serverDetail.tabs.resources"))+" ("+i(a.value.resourcesCount||0)+")",1)])]),default:r(()=>[o("div",Dl,[s(rt,{data:a.value.resources||[],style:{width:"100%"},class:"custom-table"},{default:r(()=>[s(ve,{prop:"name",label:t.$t("serverDetail.resources.name"),width:"200"},{default:r(({row:d})=>[o("div",Tl,[s(m,null,{default:r(()=>[s(k(Vt))]),_:1}),o("span",Bl,i(d.name),1)])]),_:1},8,["label"]),s(ve,{prop:"uri",label:t.$t("serverDetail.resources.uri"),"min-width":"300"},null,8,["label"]),s(ve,{prop:"mimeType",label:t.$t("serverDetail.resources.mimeType"),width:"150"},null,8,["label"]),s(ve,{label:"",width:"100",align:"right"},{default:r(({row:d})=>[s(v,{size:"small",plain:"",onClick:V=>I(d)},{default:r(()=>[T(i(t.$t("action.view")),1)]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"]),!a.value.resources||a.value.resources.length===0?(f(),p("div",Il,i(t.$t("serverDetail.resources.none")),1)):R("",!0)])]),_:1})]),_:1},8,["modelValue"]),s(ut,{modelValue:L.value,"onUpdate:modelValue":n[12]||(n[12]=d=>L.value=d),title:"Edit JSON Config",width:"600px"},{footer:r(()=>[o("span",xl,[s(v,{onClick:n[11]||(n[11]=d=>L.value=!1)},{default:r(()=>[T(i(t.$t("action.cancel")),1)]),_:1}),s(v,{type:"primary",onClick:M},{default:r(()=>[T(i(t.$t("action.save")),1)]),_:1})])]),default:r(()=>[s(P,{modelValue:G.value,"onUpdate:modelValue":n[10]||(n[10]=d=>G.value=d),type:"textarea",rows:15,"font-family":"monospace"},null,8,["modelValue"])]),_:1},8,["modelValue"]),E.value?(f(),D(sa,{key:0,modelValue:J.value,"onUpdate:modelValue":n[13]||(n[13]=d=>J.value=d),"server-id":a.value.id,"tool-name":E.value.name,description:E.value.description,"input-schema":E.value.inputSchema},null,8,["modelValue","server-id","tool-name","description","input-schema"])):R("",!0)])):(f(),p("div",Ml,i(t.$t("serverDetail.noServerSelected")),1))}}}),Ul=Ze(Al,[["__scopeId","data-v-9ecf6079"]]),Ol={class:"h-full w-full"},ls=be({__name:"ServerDashboard",setup(e){const l=xe();return(c,h)=>(f(),p("div",Ol,[k(l).selectedServerId?(f(),D(Ul,{key:1})):(f(),D(Ja,{key:0}))]))}});export{ls as default};