@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 } from 'vitest';
2
- import { stringifyForLogging, stringifyForLoggingWithReplacer, setJsonPrettyConfigGetter, rawHeadersToObject, stringifyRawHeadersForLogging, getJsonPrettySetting, getMcpCommDebugSetting, getSessionDebugSetting } from '../../../src/utils/json-utils.js';
2
+ import { stringifyForLogging, stringifyForLoggingWithReplacer, setJsonPrettyConfigGetter, rawHeadersToObject, stringifyRawHeadersForLogging, getJsonPrettySetting, getMcpCommDebugSetting, getApiDebugSetting } from '../../../src/utils/json-utils.js';
3
3
  describe('json-utils', () => {
4
4
  beforeEach(() => {
5
5
  // Reset config getter
@@ -13,7 +13,7 @@ describe('json-utils', () => {
13
13
  logging: {
14
14
  jsonPretty: true,
15
15
  mcpCommDebug: false,
16
- sessionDebug: false
16
+ apiDebug: false
17
17
  }
18
18
  }
19
19
  }));
@@ -35,7 +35,7 @@ describe('json-utils', () => {
35
35
  logging: {
36
36
  jsonPretty: true,
37
37
  mcpCommDebug: false,
38
- sessionDebug: false
38
+ apiDebug: false
39
39
  }
40
40
  }
41
41
  }));
@@ -53,7 +53,7 @@ describe('json-utils', () => {
53
53
  logging: {
54
54
  jsonPretty: true,
55
55
  mcpCommDebug: false,
56
- sessionDebug: false
56
+ apiDebug: false
57
57
  }
58
58
  }
59
59
  }));
@@ -72,7 +72,7 @@ describe('json-utils', () => {
72
72
  logging: {
73
73
  jsonPretty: true,
74
74
  mcpCommDebug: false,
75
- sessionDebug: false
75
+ apiDebug: false
76
76
  }
77
77
  }
78
78
  }));
@@ -102,7 +102,7 @@ describe('json-utils', () => {
102
102
  logging: {
103
103
  jsonPretty: false,
104
104
  mcpCommDebug: false,
105
- sessionDebug: false
105
+ apiDebug: false
106
106
  }
107
107
  }
108
108
  }));
@@ -182,7 +182,7 @@ describe('json-utils', () => {
182
182
  logging: {
183
183
  jsonPretty: false,
184
184
  mcpCommDebug: false,
185
- sessionDebug: false
185
+ apiDebug: false
186
186
  }
187
187
  }
188
188
  }));
@@ -192,7 +192,7 @@ describe('json-utils', () => {
192
192
  logging: {
193
193
  jsonPretty: true,
194
194
  mcpCommDebug: false,
195
- sessionDebug: false
195
+ apiDebug: false
196
196
  }
197
197
  }
198
198
  }));
@@ -204,12 +204,106 @@ describe('json-utils', () => {
204
204
  });
205
205
  expect(getJsonPrettySetting()).toBe(true);
206
206
  });
207
+ it('should respect LOG_JSON_PRETTY environment variable when set to "true"', () => {
208
+ try {
209
+ process.env.LOG_JSON_PRETTY = 'true';
210
+ setJsonPrettyConfigGetter(() => ({
211
+ system: {
212
+ logging: {
213
+ jsonPretty: false, // Config says false, but env should override
214
+ mcpCommDebug: false,
215
+ apiDebug: false
216
+ }
217
+ }
218
+ }));
219
+ expect(getJsonPrettySetting()).toBe(true);
220
+ }
221
+ finally {
222
+ delete process.env.LOG_JSON_PRETTY;
223
+ setJsonPrettyConfigGetter(null);
224
+ }
225
+ });
226
+ it('should respect LOG_JSON_PRETTY environment variable when set to "1"', () => {
227
+ try {
228
+ process.env.LOG_JSON_PRETTY = '1';
229
+ setJsonPrettyConfigGetter(() => ({
230
+ system: {
231
+ logging: {
232
+ jsonPretty: false, // Config says false, but env should override
233
+ mcpCommDebug: false,
234
+ apiDebug: false
235
+ }
236
+ }
237
+ }));
238
+ expect(getJsonPrettySetting()).toBe(true);
239
+ }
240
+ finally {
241
+ delete process.env.LOG_JSON_PRETTY;
242
+ setJsonPrettyConfigGetter(null);
243
+ }
244
+ });
245
+ it('should respect LOG_JSON_PRETTY environment variable when set to "false"', () => {
246
+ try {
247
+ process.env.LOG_JSON_PRETTY = 'false';
248
+ setJsonPrettyConfigGetter(() => ({
249
+ system: {
250
+ logging: {
251
+ jsonPretty: true, // Config says true, but env should override
252
+ mcpCommDebug: false,
253
+ apiDebug: false
254
+ }
255
+ }
256
+ }));
257
+ expect(getJsonPrettySetting()).toBe(false);
258
+ }
259
+ finally {
260
+ delete process.env.LOG_JSON_PRETTY;
261
+ setJsonPrettyConfigGetter(null);
262
+ }
263
+ });
264
+ it('should respect LOG_JSON_PRETTY environment variable when set to "0"', () => {
265
+ try {
266
+ process.env.LOG_JSON_PRETTY = '0';
267
+ setJsonPrettyConfigGetter(() => ({
268
+ system: {
269
+ logging: {
270
+ jsonPretty: true, // Config says true, but env should override
271
+ mcpCommDebug: false,
272
+ apiDebug: false
273
+ }
274
+ }
275
+ }));
276
+ expect(getJsonPrettySetting()).toBe(false);
277
+ }
278
+ finally {
279
+ delete process.env.LOG_JSON_PRETTY;
280
+ setJsonPrettyConfigGetter(null);
281
+ }
282
+ });
283
+ it('should use config getter when LOG_JSON_PRETTY is not set', () => {
284
+ try {
285
+ delete process.env.LOG_JSON_PRETTY;
286
+ setJsonPrettyConfigGetter(() => ({
287
+ system: {
288
+ logging: {
289
+ jsonPretty: false,
290
+ mcpCommDebug: false,
291
+ apiDebug: false
292
+ }
293
+ }
294
+ }));
295
+ expect(getJsonPrettySetting()).toBe(false);
296
+ }
297
+ finally {
298
+ setJsonPrettyConfigGetter(null);
299
+ }
300
+ });
207
301
  });
208
302
  describe('all setting getters', () => {
209
303
  it('should return correct defaults when no config getter is set', () => {
210
304
  expect(getJsonPrettySetting()).toBe(true);
211
305
  expect(getMcpCommDebugSetting()).toBe(false);
212
- expect(getSessionDebugSetting()).toBe(false);
306
+ expect(getApiDebugSetting()).toBe(false);
213
307
  });
214
308
  it('should return values from config getter when available', () => {
215
309
  setJsonPrettyConfigGetter(() => ({
@@ -217,13 +311,13 @@ describe('json-utils', () => {
217
311
  logging: {
218
312
  jsonPretty: false,
219
313
  mcpCommDebug: true,
220
- sessionDebug: true
314
+ apiDebug: true
221
315
  }
222
316
  }
223
317
  }));
224
318
  expect(getJsonPrettySetting()).toBe(false);
225
319
  expect(getMcpCommDebugSetting()).toBe(true);
226
- expect(getSessionDebugSetting()).toBe(true);
320
+ expect(getApiDebugSetting()).toBe(true);
227
321
  });
228
322
  it('should fall back to defaults when config getter fails', () => {
229
323
  setJsonPrettyConfigGetter(() => {
@@ -231,7 +325,7 @@ describe('json-utils', () => {
231
325
  });
232
326
  expect(getJsonPrettySetting()).toBe(true);
233
327
  expect(getMcpCommDebugSetting()).toBe(false);
234
- expect(getSessionDebugSetting()).toBe(false);
328
+ expect(getApiDebugSetting()).toBe(false);
235
329
  });
236
330
  });
237
331
  describe('rawHeadersToObject', () => {
@@ -270,7 +364,7 @@ describe('json-utils', () => {
270
364
  logging: {
271
365
  jsonPretty: true,
272
366
  mcpCommDebug: false,
273
- sessionDebug: false
367
+ apiDebug: false
274
368
  }
275
369
  }
276
370
  }));
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger-formatter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-formatter.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/logger-formatter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { formatError } from '../../../src/utils/logger/log-formatter.js';
3
+ describe('Logger Formatter - formatError', () => {
4
+ it('should return empty string for array containing exactly one empty object ([{}])', () => {
5
+ const error = [{}];
6
+ const result = formatError(error);
7
+ expect(result).toBe('');
8
+ });
9
+ it('should return formatted string for array containing multiple empty objects ([{}, {}, {}])', () => {
10
+ const error = [{}, {}, {}];
11
+ const result = formatError(error);
12
+ expect(result).toContain('{}');
13
+ });
14
+ it('should return formatted string for array containing non-empty objects', () => {
15
+ const error = [{ message: 'test' }];
16
+ const result = formatError(error);
17
+ expect(result).toContain('message');
18
+ expect(result).toContain('test');
19
+ });
20
+ it('should return formatted string for array containing mixed objects (empty and non-empty)', () => {
21
+ const error = [{}, { message: 'test' }, {}];
22
+ const result = formatError(error);
23
+ expect(result).toContain('message');
24
+ expect(result).toContain('test');
25
+ });
26
+ it('should return empty string for empty array', () => {
27
+ const error = [];
28
+ const result = formatError(error);
29
+ expect(result).toBe('');
30
+ });
31
+ it('should handle Error objects with message correctly', () => {
32
+ const error = new Error('Test error');
33
+ const result = formatError(error);
34
+ expect(result).toContain('Test error');
35
+ });
36
+ it('should handle Error objects without message correctly', () => {
37
+ const error = new Error();
38
+ const result = formatError(error);
39
+ expect(result).toContain('Error');
40
+ });
41
+ it('should handle Error objects with custom name correctly', () => {
42
+ const error = Object.assign(new Error(), { name: 'NetworkError' });
43
+ const result = formatError(error);
44
+ expect(result).toContain('NetworkError');
45
+ });
46
+ it('should handle string errors correctly', () => {
47
+ const error = 'string error';
48
+ const result = formatError(error);
49
+ expect(result).toBe('string error');
50
+ });
51
+ it('should handle empty objects correctly', () => {
52
+ const error = {};
53
+ const result = formatError(error);
54
+ expect(result).toBe('{}');
55
+ });
56
+ it('should handle null values correctly', () => {
57
+ const error = null;
58
+ const result = formatError(error);
59
+ expect(result).toBe('null');
60
+ });
61
+ it('should handle undefined values correctly', () => {
62
+ const error = undefined;
63
+ const result = formatError(error);
64
+ expect(result).toBe('undefined');
65
+ });
66
+ });
@@ -4,6 +4,7 @@ import path from 'node:path';
4
4
  import os from 'node:os';
5
5
  import { Logger, logWithColor } from '../../../src/utils/logger.js';
6
6
  import { setJsonPrettyConfigGetter, setDevModeEnabled } from '../../../src/utils/json-utils.js';
7
+ import { createColoredLogMessage, createLogMessage, getCallerInfo, formatCallerInfo } from '../../../src/utils/logger/log-formatter.js';
7
8
  describe('Logger', () => {
8
9
  let logger;
9
10
  let tempLogDir;
@@ -459,4 +460,104 @@ describe('Logger', () => {
459
460
  createWriteStreamSpy.mockRestore();
460
461
  });
461
462
  });
463
+ describe('caller information', () => {
464
+ it('should enable caller information by default', () => {
465
+ logger = new Logger();
466
+ // Since showCaller is private, we test through behavior
467
+ const consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(() => { });
468
+ logger.info('test message');
469
+ expect(consoleInfoSpy).toHaveBeenCalled();
470
+ consoleInfoSpy.mockRestore();
471
+ });
472
+ it('should allow disabling caller information', () => {
473
+ logger = new Logger();
474
+ logger.setShowCaller(false);
475
+ const consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(() => { });
476
+ logger.info('test message');
477
+ expect(consoleInfoSpy).toHaveBeenCalled();
478
+ consoleInfoSpy.mockRestore();
479
+ });
480
+ it('should respect LOG_CALLER environment variable when set to "false"', () => {
481
+ try {
482
+ process.env.LOG_CALLER = 'false';
483
+ logger = new Logger();
484
+ // Verify the logger was created without errors
485
+ expect(logger).toBeDefined();
486
+ }
487
+ finally {
488
+ delete process.env.LOG_CALLER;
489
+ }
490
+ });
491
+ it('should respect LOG_CALLER environment variable when set to "0"', () => {
492
+ try {
493
+ process.env.LOG_CALLER = '0';
494
+ logger = new Logger();
495
+ expect(logger).toBeDefined();
496
+ }
497
+ finally {
498
+ delete process.env.LOG_CALLER;
499
+ }
500
+ });
501
+ it('should include caller information in log messages when enabled', () => {
502
+ const message = createLogMessage('info', 'test message', {
503
+ caller: 'test-file.ts:123'
504
+ });
505
+ expect(message).toContain('[test-file.ts:123]');
506
+ });
507
+ it('should include caller information in colored log messages when enabled', () => {
508
+ const message = createColoredLogMessage('info', 'test message', {
509
+ caller: 'test-file.ts:123'
510
+ });
511
+ expect(message).toContain('[test-file.ts:123]');
512
+ });
513
+ it('should format caller info correctly', () => {
514
+ const formatted = formatCallerInfo({
515
+ fileName: 'logger.ts',
516
+ lineNumber: 42,
517
+ columnNumber: 10
518
+ });
519
+ expect(formatted).toBe('logger.ts:42');
520
+ });
521
+ it('should format caller info without line number when lineNumber is 0', () => {
522
+ const formatted = formatCallerInfo({
523
+ fileName: 'logger.ts',
524
+ lineNumber: 0,
525
+ columnNumber: 0
526
+ });
527
+ expect(formatted).toBe('logger.ts');
528
+ });
529
+ it('should get caller info (best effort)', () => {
530
+ // We can't assert specific values, but we can verify it doesn't throw
531
+ // and either returns null or a valid object
532
+ getCallerInfo(0);
533
+ expect(true).toBe(true);
534
+ });
535
+ describe('getCallerInfo with project file detection', () => {
536
+ // Save original prepareStackTrace
537
+ const originalPrepareStackTrace = Error.prepareStackTrace;
538
+ afterEach(() => {
539
+ // Restore original prepareStackTrace
540
+ Error.prepareStackTrace = originalPrepareStackTrace;
541
+ });
542
+ it('should extract clean file path from full path with /src/', () => {
543
+ // We need to test the internal logic indirectly
544
+ // Since we can't easily mock the stack, we'll verify our function
545
+ // doesn't throw and handles the basic case
546
+ const result = getCallerInfo(0);
547
+ // Just verify it returns something (null or object)
548
+ expect(result === null || typeof result === 'object').toBe(true);
549
+ });
550
+ it('should prefer project source files over external files', () => {
551
+ // This test verifies the concept - we trust that our implementation
552
+ // will search for /src/ in the file paths
553
+ const result = getCallerInfo(0);
554
+ expect(result === null || typeof result === 'object').toBe(true);
555
+ });
556
+ it('should handle Windows paths with \\src\\', () => {
557
+ // Test the function can be called without errors
558
+ const result = getCallerInfo(0);
559
+ expect(result === null || typeof result === 'object').toBe(true);
560
+ });
561
+ });
562
+ });
462
563
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parameter-validator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-validator.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/parameter-validator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateParameters } from '../../../src/utils/parameter-validator.js';
3
+ describe('Parameter Validator', () => {
4
+ it('should return null for valid parameters', () => {
5
+ const schema = {
6
+ type: 'object',
7
+ properties: {
8
+ name: { type: 'string' },
9
+ age: { type: 'number' }
10
+ },
11
+ required: ['name']
12
+ };
13
+ const args = { name: 'test', age: 25 };
14
+ const result = validateParameters(args, schema);
15
+ expect(result).toBeNull();
16
+ });
17
+ it('should return error for missing required parameter', () => {
18
+ const schema = {
19
+ type: 'object',
20
+ properties: {
21
+ name: { type: 'string' },
22
+ age: { type: 'number' }
23
+ },
24
+ required: ['name', 'age']
25
+ };
26
+ const args = { name: 'test' };
27
+ const result = validateParameters(args, schema);
28
+ expect(result).toContain('Missing required parameter');
29
+ expect(result).toContain('age');
30
+ });
31
+ it('should return error for invalid parameter type', () => {
32
+ const schema = {
33
+ type: 'object',
34
+ properties: {
35
+ name: { type: 'string' },
36
+ age: { type: 'number' }
37
+ }
38
+ };
39
+ const args = { name: 'test', age: '25' }; // age should be number, not string
40
+ const result = validateParameters(args, schema);
41
+ expect(result).toContain('Invalid type for parameter');
42
+ expect(result).toContain('Expected: number');
43
+ });
44
+ it('should handle schema without required fields', () => {
45
+ const schema = {
46
+ type: 'object',
47
+ properties: {
48
+ optionalField: { type: 'string' }
49
+ }
50
+ };
51
+ const args = {};
52
+ const result = validateParameters(args, schema);
53
+ expect(result).toBeNull();
54
+ });
55
+ it('should handle schema without properties', () => {
56
+ const schema = {
57
+ type: 'object'
58
+ };
59
+ const args = { any: 'value' };
60
+ const result = validateParameters(args, schema);
61
+ expect(result).toBeNull();
62
+ });
63
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-tree.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-tree.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/process-tree.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { getChildren, getProcessTree, isAnyInTreeRunning, getWorkingProcessPid, killProcessTree } from '../../../src/utils/process-tree.js';
3
+ // Mock child_process module
4
+ vi.mock('child_process', () => ({
5
+ spawn: vi.fn()
6
+ }));
7
+ describe('process-tree (non-Windows platform)', () => {
8
+ // Save original platform
9
+ const originalPlatform = process.platform;
10
+ beforeEach(() => {
11
+ // Mock non-Windows platform
12
+ Object.defineProperty(process, 'platform', {
13
+ value: 'linux',
14
+ configurable: true
15
+ });
16
+ vi.clearAllMocks();
17
+ });
18
+ describe('getChildren', () => {
19
+ it('should return empty array on non-Windows platform', async () => {
20
+ const result = await getChildren(1234);
21
+ expect(result).toEqual([]);
22
+ });
23
+ });
24
+ describe('getProcessTree', () => {
25
+ it('should return array with just the original PID on non-Windows platform', async () => {
26
+ const result = await getProcessTree(1234);
27
+ expect(result).toEqual([1234]);
28
+ });
29
+ });
30
+ describe('getWorkingProcessPid', () => {
31
+ it('should return the original PID on non-Windows platform', async () => {
32
+ const result = await getWorkingProcessPid(1234);
33
+ expect(result).toEqual(1234);
34
+ });
35
+ });
36
+ describe('isAnyInTreeRunning', () => {
37
+ it('should check just the single process on non-Windows platform', async () => {
38
+ // Mock process.kill to return true (process running)
39
+ const originalKill = process.kill;
40
+ process.kill = vi.fn();
41
+ const result = await isAnyInTreeRunning(1234);
42
+ expect(result).toBeDefined();
43
+ // Restore original
44
+ process.kill = originalKill;
45
+ });
46
+ });
47
+ describe('killProcessTree', () => {
48
+ it('should just kill the single process on non-Windows platform', async () => {
49
+ // Mock process.kill
50
+ const originalKill = process.kill;
51
+ process.kill = vi.fn();
52
+ await killProcessTree(1234);
53
+ // Restore original
54
+ process.kill = originalKill;
55
+ });
56
+ });
57
+ // Restore original platform after all tests
58
+ afterAll(() => {
59
+ Object.defineProperty(process, 'platform', {
60
+ value: originalPlatform,
61
+ configurable: true
62
+ });
63
+ });
64
+ });
65
+ describe('process-tree (Windows platform)', () => {
66
+ // Save original platform
67
+ const originalPlatform = process.platform;
68
+ beforeEach(() => {
69
+ // Mock Windows platform
70
+ Object.defineProperty(process, 'platform', {
71
+ value: 'win32',
72
+ configurable: true
73
+ });
74
+ vi.clearAllMocks();
75
+ });
76
+ describe('isProcessRunning (internal helper behavior)', () => {
77
+ it('should handle process.kill correctly', async () => {
78
+ const originalKill = process.kill;
79
+ // isAnyInTreeRunning will call our mocked kill
80
+ // We'll test this indirectly
81
+ const pidToCheck = 99999; // A PID that doesn't exist
82
+ process.kill = vi.fn((checkPid, signal) => {
83
+ if (checkPid === pidToCheck && signal === 0) {
84
+ throw new Error('ESRCH');
85
+ }
86
+ return true;
87
+ });
88
+ const result = await isAnyInTreeRunning(pidToCheck);
89
+ expect(result !== undefined).toBe(true);
90
+ // Restore original
91
+ process.kill = originalKill;
92
+ });
93
+ });
94
+ describe('edge cases and error handling', () => {
95
+ it('should handle invalid PID gracefully', async () => {
96
+ const result = await getChildren(0);
97
+ expect(Array.isArray(result)).toBe(true);
98
+ });
99
+ it('should handle negative PID gracefully', async () => {
100
+ const result = await getProcessTree(-1);
101
+ expect(Array.isArray(result)).toBe(true);
102
+ });
103
+ it('should handle errors in getWorkingProcessPid gracefully', async () => {
104
+ const pid = 12345;
105
+ const result = await getWorkingProcessPid(pid);
106
+ // When PowerShell fails, it should fall back to returning the original PID
107
+ expect(result).toEqual(pid);
108
+ });
109
+ });
110
+ describe('killProcessTree error handling', () => {
111
+ it('should handle errors in killProcessTree gracefully', async () => {
112
+ const originalKill = process.kill;
113
+ process.kill = vi.fn(() => {
114
+ throw new Error('Access denied');
115
+ });
116
+ // This should not throw, errors should be caught
117
+ await expect(killProcessTree(1234)).resolves.not.toThrow();
118
+ // Restore original
119
+ process.kill = originalKill;
120
+ });
121
+ });
122
+ // Restore original platform after all tests
123
+ afterAll(() => {
124
+ Object.defineProperty(process, 'platform', {
125
+ value: originalPlatform,
126
+ configurable: true
127
+ });
128
+ });
129
+ });