@loop_ouroboros/mcp-hub-lite 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/LICENSE +21 -0
  3. package/README.md +354 -0
  4. package/dist/client/assets/HomeView-f901HeKw.js +1 -0
  5. package/dist/client/assets/ResourceDetailView-BdOaL_-o.css +1 -0
  6. package/dist/client/assets/ResourceDetailView-Bz66ZjfY.js +1 -0
  7. package/dist/client/assets/ResourcesView-CjMklkyv.css +1 -0
  8. package/dist/client/assets/ResourcesView-lI_fItfA.js +1 -0
  9. package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +1 -0
  10. package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +2 -0
  11. package/dist/client/assets/ServerListView-Bws09jNR.css +1 -0
  12. package/dist/client/assets/ServerListView-CP6Ffkfx.js +30 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +1 -0
  14. package/dist/client/assets/SessionsView-D68qKR4D.js +1 -0
  15. package/dist/client/assets/SettingsView-BPYfO9BE.js +1 -0
  16. package/dist/client/assets/ToolCallDialog-Br8FNebN.js +1 -0
  17. package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +1 -0
  18. package/dist/client/assets/ToolsView-B6hUiR43.js +1 -0
  19. package/dist/client/assets/ToolsView-BLnU8cV6.css +1 -0
  20. package/dist/client/assets/_baseClone-DCmK847M.js +1 -0
  21. package/dist/client/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  22. package/dist/client/assets/el-form-item-BVMLpmVC.css +1 -0
  23. package/dist/client/assets/el-form-item-DM0q2hmO.js +12 -0
  24. package/dist/client/assets/el-input-BtI9NECe.js +1 -0
  25. package/dist/client/assets/el-input-CmuHb8HS.css +1 -0
  26. package/dist/client/assets/el-loading-CChNmKeI.js +1 -0
  27. package/dist/client/assets/el-loading-bpKhqqQq.css +1 -0
  28. package/dist/client/assets/el-overlay-B2ZKM6Up.css +1 -0
  29. package/dist/client/assets/el-overlay-lZZbPmsX.js +1 -0
  30. package/dist/client/assets/el-select-BXztu2b5.js +1 -0
  31. package/dist/client/assets/el-select-C0U_l4IZ.css +1 -0
  32. package/dist/client/assets/el-tab-pane-CnNoQHsR.css +1 -0
  33. package/dist/client/assets/el-tab-pane-Dy9ruaEX.js +1 -0
  34. package/dist/client/assets/el-table-column-98UyVgBH.js +1 -0
  35. package/dist/client/assets/el-table-column-T_mV9jNw.css +1 -0
  36. package/dist/client/assets/el-tag-B5lLT51E.js +1 -0
  37. package/dist/client/assets/el-tag-DjxZVOpb.css +1 -0
  38. package/dist/client/assets/event-BB_Ol6Sd.js +1 -0
  39. package/dist/client/assets/index-BgKcmWJr.js +1 -0
  40. package/dist/client/assets/index-BsDWtoIl.css +1 -0
  41. package/dist/client/assets/index-BzQXG7no.js +1 -0
  42. package/dist/client/assets/index-CSTs2jYk.js +2 -0
  43. package/dist/client/assets/omit-Bx5HJNV_.js +1 -0
  44. package/dist/client/assets/raf-B9VDMtMF.js +1 -0
  45. package/dist/client/assets/typescript-Bp3YSIOJ.js +1 -0
  46. package/dist/client/assets/vnode-B8aJx8u4.js +1 -0
  47. package/dist/client/assets/vue-vendor-6ny5zj9i.js +3 -0
  48. package/dist/client/index.html +15 -0
  49. package/dist/server/shared/index.d.ts +3 -0
  50. package/dist/server/shared/index.d.ts.map +1 -0
  51. package/dist/server/shared/index.js +2 -0
  52. package/dist/server/shared/models/index.d.ts +4 -0
  53. package/dist/server/shared/models/index.d.ts.map +1 -0
  54. package/dist/server/shared/models/index.js +3 -0
  55. package/dist/server/shared/models/resource.model.d.ts +8 -0
  56. package/dist/server/shared/models/resource.model.d.ts.map +1 -0
  57. package/dist/server/shared/models/resource.model.js +1 -0
  58. package/dist/server/shared/models/server.model.d.ts +57 -0
  59. package/dist/server/shared/models/server.model.d.ts.map +1 -0
  60. package/dist/server/shared/models/server.model.js +1 -0
  61. package/dist/server/shared/models/session.model.d.ts +73 -0
  62. package/dist/server/shared/models/session.model.d.ts.map +1 -0
  63. package/dist/server/shared/models/session.model.js +70 -0
  64. package/dist/server/shared/models/tool.model.d.ts +22 -0
  65. package/dist/server/shared/models/tool.model.d.ts.map +1 -0
  66. package/dist/server/shared/models/tool.model.js +1 -0
  67. package/dist/server/shared/types/client.types.d.ts +35 -0
  68. package/dist/server/shared/types/client.types.d.ts.map +1 -0
  69. package/dist/server/shared/types/client.types.js +5 -0
  70. package/dist/server/shared/types/common.types.d.ts +5 -0
  71. package/dist/server/shared/types/common.types.d.ts.map +1 -0
  72. package/dist/server/shared/types/common.types.js +2 -0
  73. package/dist/server/shared/types/index.d.ts +4 -0
  74. package/dist/server/shared/types/index.d.ts.map +1 -0
  75. package/dist/server/shared/types/index.js +3 -0
  76. package/dist/server/shared/types/session.types.d.ts +15 -0
  77. package/dist/server/shared/types/session.types.d.ts.map +1 -0
  78. package/dist/server/shared/types/session.types.js +5 -0
  79. package/dist/server/shared/types/websocket.types.d.ts +177 -0
  80. package/dist/server/shared/types/websocket.types.d.ts.map +1 -0
  81. package/dist/server/shared/types/websocket.types.js +25 -0
  82. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts +13 -0
  83. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -0
  84. package/dist/server/src/api/mcp/debug-response-wrapper.js +271 -0
  85. package/dist/server/src/api/mcp/gateway.d.ts +14 -0
  86. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -0
  87. package/dist/server/src/api/mcp/gateway.js +116 -0
  88. package/dist/server/src/api/mcp/session-context-extractor.d.ts +47 -0
  89. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -0
  90. package/dist/server/src/api/mcp/session-context-extractor.js +127 -0
  91. package/dist/server/src/api/mcp/sse-stream-manager.d.ts +13 -0
  92. package/dist/server/src/api/mcp/sse-stream-manager.d.ts.map +1 -0
  93. package/dist/server/src/api/mcp/sse-stream-manager.js +40 -0
  94. package/dist/server/src/api/web/clients.d.ts +30 -0
  95. package/dist/server/src/api/web/clients.d.ts.map +1 -0
  96. package/dist/server/src/api/web/clients.js +41 -0
  97. package/dist/server/src/api/web/config.d.ts +21 -0
  98. package/dist/server/src/api/web/config.d.ts.map +1 -0
  99. package/dist/server/src/api/web/config.js +119 -0
  100. package/dist/server/src/api/web/health.d.ts +21 -0
  101. package/dist/server/src/api/web/health.d.ts.map +1 -0
  102. package/dist/server/src/api/web/health.js +24 -0
  103. package/dist/server/src/api/web/hub-tools.d.ts +30 -0
  104. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -0
  105. package/dist/server/src/api/web/hub-tools.js +202 -0
  106. package/dist/server/src/api/web/logs.d.ts +30 -0
  107. package/dist/server/src/api/web/logs.d.ts.map +1 -0
  108. package/dist/server/src/api/web/logs.js +141 -0
  109. package/dist/server/src/api/web/mcp-status.d.ts +29 -0
  110. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -0
  111. package/dist/server/src/api/web/mcp-status.js +126 -0
  112. package/dist/server/src/api/web/resources.d.ts +28 -0
  113. package/dist/server/src/api/web/resources.d.ts.map +1 -0
  114. package/dist/server/src/api/web/resources.js +93 -0
  115. package/dist/server/src/api/web/search.d.ts +26 -0
  116. package/dist/server/src/api/web/search.d.ts.map +1 -0
  117. package/dist/server/src/api/web/search.js +62 -0
  118. package/dist/server/src/api/web/servers.d.ts +33 -0
  119. package/dist/server/src/api/web/servers.d.ts.map +1 -0
  120. package/dist/server/src/api/web/servers.js +235 -0
  121. package/dist/server/src/api/web/sessions.d.ts +29 -0
  122. package/dist/server/src/api/web/sessions.d.ts.map +1 -0
  123. package/dist/server/src/api/web/sessions.js +104 -0
  124. package/dist/server/src/api/ws/events.d.ts +29 -0
  125. package/dist/server/src/api/ws/events.d.ts.map +1 -0
  126. package/dist/server/src/api/ws/events.js +44 -0
  127. package/dist/server/src/api/ws/ws-handler.d.ts +83 -0
  128. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -0
  129. package/dist/server/src/api/ws/ws-handler.js +217 -0
  130. package/dist/server/src/app.d.ts +24 -0
  131. package/dist/server/src/app.d.ts.map +1 -0
  132. package/dist/server/src/app.js +108 -0
  133. package/dist/server/src/cli/commands/list.d.ts +71 -0
  134. package/dist/server/src/cli/commands/list.d.ts.map +1 -0
  135. package/dist/server/src/cli/commands/list.js +97 -0
  136. package/dist/server/src/cli/commands/restart.d.ts +42 -0
  137. package/dist/server/src/cli/commands/restart.d.ts.map +1 -0
  138. package/dist/server/src/cli/commands/restart.js +61 -0
  139. package/dist/server/src/cli/commands/start.d.ts +43 -0
  140. package/dist/server/src/cli/commands/start.d.ts.map +1 -0
  141. package/dist/server/src/cli/commands/start.js +160 -0
  142. package/dist/server/src/cli/commands/status.d.ts +39 -0
  143. package/dist/server/src/cli/commands/status.d.ts.map +1 -0
  144. package/dist/server/src/cli/commands/status.js +164 -0
  145. package/dist/server/src/cli/commands/stop.d.ts +34 -0
  146. package/dist/server/src/cli/commands/stop.d.ts.map +1 -0
  147. package/dist/server/src/cli/commands/stop.js +47 -0
  148. package/dist/server/src/cli/commands/ui.d.ts +44 -0
  149. package/dist/server/src/cli/commands/ui.d.ts.map +1 -0
  150. package/dist/server/src/cli/commands/ui.js +95 -0
  151. package/dist/server/src/cli/index.d.ts +62 -0
  152. package/dist/server/src/cli/index.d.ts.map +1 -0
  153. package/dist/server/src/cli/index.js +88 -0
  154. package/dist/server/src/cli/parse-args.d.ts +108 -0
  155. package/dist/server/src/cli/parse-args.d.ts.map +1 -0
  156. package/dist/server/src/cli/parse-args.js +131 -0
  157. package/dist/server/src/cli/server.d.ts +171 -0
  158. package/dist/server/src/cli/server.d.ts.map +1 -0
  159. package/dist/server/src/cli/server.js +246 -0
  160. package/dist/server/src/config/config-change-logger.d.ts +16 -0
  161. package/dist/server/src/config/config-change-logger.d.ts.map +1 -0
  162. package/dist/server/src/config/config-change-logger.js +43 -0
  163. package/dist/server/src/config/config-loader.d.ts +22 -0
  164. package/dist/server/src/config/config-loader.d.ts.map +1 -0
  165. package/dist/server/src/config/config-loader.js +66 -0
  166. package/dist/server/src/config/config-manager.d.ts +158 -0
  167. package/dist/server/src/config/config-manager.d.ts.map +1 -0
  168. package/dist/server/src/config/config-manager.js +246 -0
  169. package/dist/server/src/config/config-saver.d.ts +16 -0
  170. package/dist/server/src/config/config-saver.d.ts.map +1 -0
  171. package/dist/server/src/config/config-saver.js +28 -0
  172. package/dist/server/src/config/config.schema.d.ts +108 -0
  173. package/dist/server/src/config/config.schema.d.ts.map +1 -0
  174. package/dist/server/src/config/config.schema.js +103 -0
  175. package/dist/server/src/config/server-config-manager.d.ts +74 -0
  176. package/dist/server/src/config/server-config-manager.d.ts.map +1 -0
  177. package/dist/server/src/config/server-config-manager.js +157 -0
  178. package/dist/server/src/config/type-converter.d.ts +13 -0
  179. package/dist/server/src/config/type-converter.d.ts.map +1 -0
  180. package/dist/server/src/config/type-converter.js +37 -0
  181. package/dist/server/src/index.d.ts +3 -0
  182. package/dist/server/src/index.d.ts.map +1 -0
  183. package/dist/server/src/index.js +352 -0
  184. package/dist/server/src/models/event.model.d.ts +106 -0
  185. package/dist/server/src/models/event.model.d.ts.map +1 -0
  186. package/dist/server/src/models/event.model.js +5 -0
  187. package/dist/server/src/models/server.model.d.ts +19 -0
  188. package/dist/server/src/models/server.model.d.ts.map +1 -0
  189. package/dist/server/src/models/server.model.js +1 -0
  190. package/dist/server/src/models/system-tools.constants.d.ts +73 -0
  191. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -0
  192. package/dist/server/src/models/system-tools.constants.js +31 -0
  193. package/dist/server/src/models/types.d.ts +84 -0
  194. package/dist/server/src/models/types.d.ts.map +1 -0
  195. package/dist/server/src/models/types.js +67 -0
  196. package/dist/server/src/pid/file.d.ts +26 -0
  197. package/dist/server/src/pid/file.d.ts.map +1 -0
  198. package/dist/server/src/pid/file.js +68 -0
  199. package/dist/server/src/pid/manager.d.ts +98 -0
  200. package/dist/server/src/pid/manager.d.ts.map +1 -0
  201. package/dist/server/src/pid/manager.js +158 -0
  202. package/dist/server/src/pid/types.d.ts +13 -0
  203. package/dist/server/src/pid/types.d.ts.map +1 -0
  204. package/dist/server/src/pid/types.js +4 -0
  205. package/dist/server/src/server/dev-server.d.ts +2 -0
  206. package/dist/server/src/server/dev-server.d.ts.map +1 -0
  207. package/dist/server/src/server/dev-server.js +171 -0
  208. package/dist/server/src/server/runner.d.ts +57 -0
  209. package/dist/server/src/server/runner.d.ts.map +1 -0
  210. package/dist/server/src/server/runner.js +163 -0
  211. package/dist/server/src/services/client-tracker.service.d.ts +132 -0
  212. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -0
  213. package/dist/server/src/services/client-tracker.service.js +203 -0
  214. package/dist/server/src/services/connection/connection-manager.d.ts +478 -0
  215. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -0
  216. package/dist/server/src/services/connection/connection-manager.js +929 -0
  217. package/dist/server/src/services/connection/index.d.ts +6 -0
  218. package/dist/server/src/services/connection/index.d.ts.map +1 -0
  219. package/dist/server/src/services/connection/index.js +4 -0
  220. package/dist/server/src/services/connection/tool-cache.d.ts +122 -0
  221. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -0
  222. package/dist/server/src/services/connection/tool-cache.js +202 -0
  223. package/dist/server/src/services/connection/types.d.ts +30 -0
  224. package/dist/server/src/services/connection/types.d.ts.map +1 -0
  225. package/dist/server/src/services/connection/types.js +1 -0
  226. package/dist/server/src/services/event-bus.service.d.ts +169 -0
  227. package/dist/server/src/services/event-bus.service.d.ts.map +1 -0
  228. package/dist/server/src/services/event-bus.service.js +200 -0
  229. package/dist/server/src/services/gateway/gateway.service.d.ts +61 -0
  230. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -0
  231. package/dist/server/src/services/gateway/gateway.service.js +107 -0
  232. package/dist/server/src/services/gateway/index.d.ts +8 -0
  233. package/dist/server/src/services/gateway/index.d.ts.map +1 -0
  234. package/dist/server/src/services/gateway/index.js +6 -0
  235. package/dist/server/src/services/gateway/log-formatter.d.ts +26 -0
  236. package/dist/server/src/services/gateway/log-formatter.d.ts.map +1 -0
  237. package/dist/server/src/services/gateway/log-formatter.js +66 -0
  238. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +13 -0
  239. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -0
  240. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +131 -0
  241. package/dist/server/src/services/gateway/request-handlers/index.d.ts +9 -0
  242. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -0
  243. package/dist/server/src/services/gateway/request-handlers/index.js +8 -0
  244. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +11 -0
  245. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -0
  246. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +85 -0
  247. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts +11 -0
  248. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -0
  249. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +56 -0
  250. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts +11 -0
  251. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -0
  252. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +228 -0
  253. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts +11 -0
  254. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -0
  255. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +79 -0
  256. package/dist/server/src/services/gateway/tool-list-generator.d.ts +23 -0
  257. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -0
  258. package/dist/server/src/services/gateway/tool-list-generator.js +115 -0
  259. package/dist/server/src/services/gateway/types.d.ts +27 -0
  260. package/dist/server/src/services/gateway/types.d.ts.map +1 -0
  261. package/dist/server/src/services/gateway/types.js +4 -0
  262. package/dist/server/src/services/gateway.service.d.ts +7 -0
  263. package/dist/server/src/services/gateway.service.d.ts.map +1 -0
  264. package/dist/server/src/services/gateway.service.js +6 -0
  265. package/dist/server/src/services/hub-manager.service.d.ts +299 -0
  266. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -0
  267. package/dist/server/src/services/hub-manager.service.js +413 -0
  268. package/dist/server/src/services/hub-tools/index.d.ts +10 -0
  269. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -0
  270. package/dist/server/src/services/hub-tools/index.js +6 -0
  271. package/dist/server/src/services/hub-tools/resource-generator.d.ts +63 -0
  272. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -0
  273. package/dist/server/src/services/hub-tools/resource-generator.js +141 -0
  274. package/dist/server/src/services/hub-tools/server-selector.d.ts +63 -0
  275. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -0
  276. package/dist/server/src/services/hub-tools/server-selector.js +108 -0
  277. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +47 -0
  278. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -0
  279. package/dist/server/src/services/hub-tools/system-tool-definitions.js +225 -0
  280. package/dist/server/src/services/hub-tools/tool-search.d.ts +85 -0
  281. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -0
  282. package/dist/server/src/services/hub-tools/tool-search.js +115 -0
  283. package/dist/server/src/services/hub-tools/types.d.ts +42 -0
  284. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -0
  285. package/dist/server/src/services/hub-tools/types.js +1 -0
  286. package/dist/server/src/services/hub-tools.service.d.ts +235 -0
  287. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -0
  288. package/dist/server/src/services/hub-tools.service.js +457 -0
  289. package/dist/server/src/services/log-storage.service.d.ts +177 -0
  290. package/dist/server/src/services/log-storage.service.d.ts.map +1 -0
  291. package/dist/server/src/services/log-storage.service.js +243 -0
  292. package/dist/server/src/services/mcp-connection-manager.d.ts +7 -0
  293. package/dist/server/src/services/mcp-connection-manager.d.ts.map +1 -0
  294. package/dist/server/src/services/mcp-connection-manager.js +6 -0
  295. package/dist/server/src/services/mcp-session-manager.d.ts +6 -0
  296. package/dist/server/src/services/mcp-session-manager.d.ts.map +1 -0
  297. package/dist/server/src/services/mcp-session-manager.js +4 -0
  298. package/dist/server/src/services/search/index.d.ts +5 -0
  299. package/dist/server/src/services/search/index.d.ts.map +1 -0
  300. package/dist/server/src/services/search/index.js +5 -0
  301. package/dist/server/src/services/search/search-cache.d.ts +132 -0
  302. package/dist/server/src/services/search/search-cache.d.ts.map +1 -0
  303. package/dist/server/src/services/search/search-cache.js +151 -0
  304. package/dist/server/src/services/search/search-core.service.d.ts +108 -0
  305. package/dist/server/src/services/search/search-core.service.d.ts.map +1 -0
  306. package/dist/server/src/services/search/search-core.service.js +187 -0
  307. package/dist/server/src/services/search/search-scorer.d.ts +54 -0
  308. package/dist/server/src/services/search/search-scorer.d.ts.map +1 -0
  309. package/dist/server/src/services/search/search-scorer.js +83 -0
  310. package/dist/server/src/services/search/types.d.ts +20 -0
  311. package/dist/server/src/services/search/types.d.ts.map +1 -0
  312. package/dist/server/src/services/search/types.js +1 -0
  313. package/dist/server/src/services/session/index.d.ts +6 -0
  314. package/dist/server/src/services/session/index.d.ts.map +1 -0
  315. package/dist/server/src/services/session/index.js +4 -0
  316. package/dist/server/src/services/session/session-manager.d.ts +352 -0
  317. package/dist/server/src/services/session/session-manager.d.ts.map +1 -0
  318. package/dist/server/src/services/session/session-manager.js +835 -0
  319. package/dist/server/src/services/session/types.d.ts +32 -0
  320. package/dist/server/src/services/session/types.d.ts.map +1 -0
  321. package/dist/server/src/services/session/types.js +1 -0
  322. package/dist/server/src/services/simple-search.service.d.ts +67 -0
  323. package/dist/server/src/services/simple-search.service.d.ts.map +1 -0
  324. package/dist/server/src/services/simple-search.service.js +82 -0
  325. package/dist/server/src/services/system-tool-handler.d.ts +10 -0
  326. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -0
  327. package/dist/server/src/services/system-tool-handler.js +77 -0
  328. package/dist/server/src/utils/error-handler.d.ts +18 -0
  329. package/dist/server/src/utils/error-handler.d.ts.map +1 -0
  330. package/dist/server/src/utils/error-handler.js +59 -0
  331. package/dist/server/src/utils/format-utils.d.ts +23 -0
  332. package/dist/server/src/utils/format-utils.d.ts.map +1 -0
  333. package/dist/server/src/utils/format-utils.js +58 -0
  334. package/dist/server/src/utils/index.d.ts +2 -0
  335. package/dist/server/src/utils/index.d.ts.map +1 -0
  336. package/dist/server/src/utils/index.js +1 -0
  337. package/dist/server/src/utils/json-utils.d.ts +82 -0
  338. package/dist/server/src/utils/json-utils.d.ts.map +1 -0
  339. package/dist/server/src/utils/json-utils.js +204 -0
  340. package/dist/server/src/utils/log-rotator.d.ts +223 -0
  341. package/dist/server/src/utils/log-rotator.d.ts.map +1 -0
  342. package/dist/server/src/utils/log-rotator.js +306 -0
  343. package/dist/server/src/utils/logger/dev-logger.d.ts +39 -0
  344. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -0
  345. package/dist/server/src/utils/logger/dev-logger.js +63 -0
  346. package/dist/server/src/utils/logger/index.d.ts +36 -0
  347. package/dist/server/src/utils/logger/index.d.ts.map +1 -0
  348. package/dist/server/src/utils/logger/index.js +46 -0
  349. package/dist/server/src/utils/logger/log-colors.d.ts +27 -0
  350. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -0
  351. package/dist/server/src/utils/logger/log-colors.js +41 -0
  352. package/dist/server/src/utils/logger/log-context.d.ts +13 -0
  353. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -0
  354. package/dist/server/src/utils/logger/log-context.js +5 -0
  355. package/dist/server/src/utils/logger/log-formatter.d.ts +47 -0
  356. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -0
  357. package/dist/server/src/utils/logger/log-formatter.js +150 -0
  358. package/dist/server/src/utils/logger/log-modules.d.ts +141 -0
  359. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -0
  360. package/dist/server/src/utils/logger/log-modules.js +81 -0
  361. package/dist/server/src/utils/logger/log-output.d.ts +68 -0
  362. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -0
  363. package/dist/server/src/utils/logger/log-output.js +320 -0
  364. package/dist/server/src/utils/logger/logger.d.ts +190 -0
  365. package/dist/server/src/utils/logger/logger.d.ts.map +1 -0
  366. package/dist/server/src/utils/logger/logger.js +350 -0
  367. package/dist/server/src/utils/logger.d.ts +12 -0
  368. package/dist/server/src/utils/logger.d.ts.map +1 -0
  369. package/dist/server/src/utils/logger.js +12 -0
  370. package/dist/server/src/utils/mcp-error-handler.d.ts +162 -0
  371. package/dist/server/src/utils/mcp-error-handler.d.ts.map +1 -0
  372. package/dist/server/src/utils/mcp-error-handler.js +270 -0
  373. package/dist/server/src/utils/port-checker.d.ts +16 -0
  374. package/dist/server/src/utils/port-checker.d.ts.map +1 -0
  375. package/dist/server/src/utils/port-checker.js +242 -0
  376. package/dist/server/src/utils/request-context.d.ts +71 -0
  377. package/dist/server/src/utils/request-context.d.ts.map +1 -0
  378. package/dist/server/src/utils/request-context.js +73 -0
  379. package/dist/server/src/utils/tool-args-parser.d.ts +17 -0
  380. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -0
  381. package/dist/server/src/utils/tool-args-parser.js +34 -0
  382. package/dist/server/src/utils/transports/sse-transport.d.ts +104 -0
  383. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -0
  384. package/dist/server/src/utils/transports/sse-transport.js +189 -0
  385. package/dist/server/src/utils/transports/stdio-transport.d.ts +122 -0
  386. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -0
  387. package/dist/server/src/utils/transports/stdio-transport.js +324 -0
  388. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +146 -0
  389. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -0
  390. package/dist/server/src/utils/transports/streamable-http-transport.js +212 -0
  391. package/dist/server/src/utils/transports/transport-factory.d.ts +26 -0
  392. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -0
  393. package/dist/server/src/utils/transports/transport-factory.js +104 -0
  394. package/dist/server/src/utils/transports/transport.interface.d.ts +35 -0
  395. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -0
  396. package/dist/server/src/utils/transports/transport.interface.js +1 -0
  397. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts +2 -0
  398. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts.map +1 -0
  399. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +103 -0
  400. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts +2 -0
  401. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts.map +1 -0
  402. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +181 -0
  403. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts +2 -0
  404. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts.map +1 -0
  405. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +155 -0
  406. package/dist/server/tests/evaluation/evaluation.test.d.ts +2 -0
  407. package/dist/server/tests/evaluation/evaluation.test.d.ts.map +1 -0
  408. package/dist/server/tests/evaluation/evaluation.test.js +102 -0
  409. package/dist/server/tests/helpers/sdk-test-helpers.d.ts +32 -0
  410. package/dist/server/tests/helpers/sdk-test-helpers.d.ts.map +1 -0
  411. package/dist/server/tests/helpers/sdk-test-helpers.js +82 -0
  412. package/dist/server/tests/integration/api/gateway.test.d.ts +2 -0
  413. package/dist/server/tests/integration/api/gateway.test.d.ts.map +1 -0
  414. package/dist/server/tests/integration/api/gateway.test.js +366 -0
  415. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts +2 -0
  416. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts.map +1 -0
  417. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +109 -0
  418. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts +2 -0
  419. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts.map +1 -0
  420. package/dist/server/tests/integration/gateway/mcp-connection.test.js +149 -0
  421. package/dist/server/tests/server.test.d.ts +2 -0
  422. package/dist/server/tests/server.test.d.ts.map +1 -0
  423. package/dist/server/tests/server.test.js +95 -0
  424. package/dist/server/tests/setup.d.ts +7 -0
  425. package/dist/server/tests/setup.d.ts.map +1 -0
  426. package/dist/server/tests/setup.js +53 -0
  427. package/dist/server/tests/types/logger-test-helpers.d.ts +17 -0
  428. package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -0
  429. package/dist/server/tests/types/logger-test-helpers.js +4 -0
  430. package/dist/server/tests/types/test-helpers.d.ts +27 -0
  431. package/dist/server/tests/types/test-helpers.d.ts.map +1 -0
  432. package/dist/server/tests/types/test-helpers.js +4 -0
  433. package/dist/server/tests/unit/cli/basic-cli.test.d.ts +2 -0
  434. package/dist/server/tests/unit/cli/basic-cli.test.d.ts.map +1 -0
  435. package/dist/server/tests/unit/cli/basic-cli.test.js +33 -0
  436. package/dist/server/tests/unit/cli/cli.test.d.ts +2 -0
  437. package/dist/server/tests/unit/cli/cli.test.d.ts.map +1 -0
  438. package/dist/server/tests/unit/cli/cli.test.js +17 -0
  439. package/dist/server/tests/unit/cli/commands.test.d.ts +2 -0
  440. package/dist/server/tests/unit/cli/commands.test.d.ts.map +1 -0
  441. package/dist/server/tests/unit/cli/commands.test.js +75 -0
  442. package/dist/server/tests/unit/cli/server.test.d.ts +2 -0
  443. package/dist/server/tests/unit/cli/server.test.d.ts.map +1 -0
  444. package/dist/server/tests/unit/cli/server.test.js +68 -0
  445. package/dist/server/tests/unit/server/runner.test.d.ts +2 -0
  446. package/dist/server/tests/unit/server/runner.test.d.ts.map +1 -0
  447. package/dist/server/tests/unit/server/runner.test.js +488 -0
  448. package/dist/server/tests/unit/server/setup.d.ts +2 -0
  449. package/dist/server/tests/unit/server/setup.d.ts.map +1 -0
  450. package/dist/server/tests/unit/server/setup.js +21 -0
  451. package/dist/server/tests/unit/services/gateway-logging.test.d.ts +2 -0
  452. package/dist/server/tests/unit/services/gateway-logging.test.d.ts.map +1 -0
  453. package/dist/server/tests/unit/services/gateway-logging.test.js +47 -0
  454. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts +2 -0
  455. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts.map +1 -0
  456. package/dist/server/tests/unit/services/hub-manager-service.test.js +140 -0
  457. package/dist/server/tests/unit/services/hub-manager.test.d.ts +2 -0
  458. package/dist/server/tests/unit/services/hub-manager.test.d.ts.map +1 -0
  459. package/dist/server/tests/unit/services/hub-manager.test.js +98 -0
  460. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts +2 -0
  461. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts.map +1 -0
  462. package/dist/server/tests/unit/services/hub-tools.service.test.js +674 -0
  463. package/dist/server/tests/unit/services/search/search-cache.test.d.ts +2 -0
  464. package/dist/server/tests/unit/services/search/search-cache.test.d.ts.map +1 -0
  465. package/dist/server/tests/unit/services/search/search-cache.test.js +58 -0
  466. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts +2 -0
  467. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts.map +1 -0
  468. package/dist/server/tests/unit/services/search/search-core.service.test.js +84 -0
  469. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts +2 -0
  470. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts.map +1 -0
  471. package/dist/server/tests/unit/services/search/search-scorer.test.js +97 -0
  472. package/dist/server/tests/unit/services/session-manager.test.d.ts +2 -0
  473. package/dist/server/tests/unit/services/session-manager.test.d.ts.map +1 -0
  474. package/dist/server/tests/unit/services/session-manager.test.js +481 -0
  475. package/dist/server/tests/unit/utils/config.test.d.ts +2 -0
  476. package/dist/server/tests/unit/utils/config.test.d.ts.map +1 -0
  477. package/dist/server/tests/unit/utils/config.test.js +634 -0
  478. package/dist/server/tests/unit/utils/json-utils.test.d.ts +2 -0
  479. package/dist/server/tests/unit/utils/json-utils.test.d.ts.map +1 -0
  480. package/dist/server/tests/unit/utils/json-utils.test.js +296 -0
  481. package/dist/server/tests/unit/utils/log-rotator.test.d.ts +2 -0
  482. package/dist/server/tests/unit/utils/log-rotator.test.d.ts.map +1 -0
  483. package/dist/server/tests/unit/utils/log-rotator.test.js +296 -0
  484. package/dist/server/tests/unit/utils/logger.test.d.ts +2 -0
  485. package/dist/server/tests/unit/utils/logger.test.d.ts.map +1 -0
  486. package/dist/server/tests/unit/utils/logger.test.js +462 -0
  487. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts +2 -0
  488. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts.map +1 -0
  489. package/dist/server/tests/unit/utils/mcp-error-handler.test.js +163 -0
  490. package/dist/server/tests/unit/utils/request-context.test.d.ts +2 -0
  491. package/dist/server/tests/unit/utils/request-context.test.d.ts.map +1 -0
  492. package/dist/server/tests/unit/utils/request-context.test.js +82 -0
  493. package/dist/server/vite.config.d.ts +3 -0
  494. package/dist/server/vite.config.d.ts.map +1 -0
  495. package/dist/server/vite.config.js +160 -0
  496. package/dist/server/vitest.config.d.ts +3 -0
  497. package/dist/server/vitest.config.d.ts.map +1 -0
  498. package/dist/server/vitest.config.js +53 -0
  499. package/package.json +113 -0
@@ -0,0 +1,296 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { stringifyForLogging, stringifyForLoggingWithReplacer, setJsonPrettyConfigGetter, rawHeadersToObject, stringifyRawHeadersForLogging, getJsonPrettySetting, getMcpCommDebugSetting, getSessionDebugSetting } from '../../../src/utils/json-utils.js';
3
+ describe('json-utils', () => {
4
+ beforeEach(() => {
5
+ // Reset config getter
6
+ setJsonPrettyConfigGetter(null);
7
+ });
8
+ describe('processPrettyJsonForLogging (internal)', () => {
9
+ it('should convert \\n to actual newlines in string values (basic newline processing)', () => {
10
+ // Enable pretty mode via config getter
11
+ setJsonPrettyConfigGetter(() => ({
12
+ system: {
13
+ logging: {
14
+ jsonPretty: true,
15
+ mcpCommDebug: false,
16
+ sessionDebug: false
17
+ }
18
+ }
19
+ }));
20
+ const obj = {
21
+ text: 'line1\nline2\nline3'
22
+ };
23
+ const result = stringifyForLogging(obj);
24
+ // The result should have actual newlines, not escaped \n
25
+ expect(result).toContain('"text": "line1');
26
+ expect(result).toContain('line2');
27
+ expect(result).toContain('line3"');
28
+ // Should not contain escaped \n in the string value
29
+ expect(result).not.toContain('line1\\nline2');
30
+ });
31
+ it('should keep escaped newlines (\\\\n) unchanged', () => {
32
+ // Enable pretty mode via config getter
33
+ setJsonPrettyConfigGetter(() => ({
34
+ system: {
35
+ logging: {
36
+ jsonPretty: true,
37
+ mcpCommDebug: false,
38
+ sessionDebug: false
39
+ }
40
+ }
41
+ }));
42
+ const obj = {
43
+ text: 'literal backslash n: \\n'
44
+ };
45
+ const result = stringifyForLogging(obj);
46
+ // The escaped newline should remain as \\n in the output (but in the string, we need to escape it)
47
+ expect(result).toContain('literal backslash n: \\\\n');
48
+ });
49
+ it('should handle mixed scenario with both \\n and \\\\n', () => {
50
+ // Enable pretty mode via config getter
51
+ setJsonPrettyConfigGetter(() => ({
52
+ system: {
53
+ logging: {
54
+ jsonPretty: true,
55
+ mcpCommDebug: false,
56
+ sessionDebug: false
57
+ }
58
+ }
59
+ }));
60
+ const obj = {
61
+ text: 'first line\nsecond line with \\n literal'
62
+ };
63
+ const result = stringifyForLogging(obj);
64
+ // The first \n should be actual newline, the \\n should remain as \\n
65
+ expect(result).toContain('first line');
66
+ expect(result).toContain('second line with \\\\n literal');
67
+ });
68
+ it('should preserve JSON structure integrity', () => {
69
+ // Enable pretty mode via config getter
70
+ setJsonPrettyConfigGetter(() => ({
71
+ system: {
72
+ logging: {
73
+ jsonPretty: true,
74
+ mcpCommDebug: false,
75
+ sessionDebug: false
76
+ }
77
+ }
78
+ }));
79
+ const obj = {
80
+ key1: 'value\\nwith\\nnewlines',
81
+ key2: 'normal value',
82
+ key3: {
83
+ nested: 'nested\\nvalue'
84
+ },
85
+ key4: ['array\\nitem1', 'array\\nitem2']
86
+ };
87
+ const result = stringifyForLogging(obj);
88
+ // Should still be valid JSON structure
89
+ expect(result).toContain('"key1":');
90
+ expect(result).toContain('"key2":');
91
+ expect(result).toContain('"key3":');
92
+ expect(result).toContain('"nested":');
93
+ expect(result).toContain('"key4":');
94
+ // Parse back should work (even with actual newlines in strings)
95
+ // Note: We can't directly JSON.parse the result because it has actual newlines,
96
+ // but we can verify the structure is correct
97
+ });
98
+ it('should not affect compact mode (non-PRETTY mode)', () => {
99
+ // Disable pretty mode via config getter
100
+ setJsonPrettyConfigGetter(() => ({
101
+ system: {
102
+ logging: {
103
+ jsonPretty: false,
104
+ mcpCommDebug: false,
105
+ sessionDebug: false
106
+ }
107
+ }
108
+ }));
109
+ const obj = {
110
+ text: 'line1\nline2'
111
+ };
112
+ const result = stringifyForLogging(obj);
113
+ // In compact mode, should keep \n as escaped sequence
114
+ expect(result).toContain('line1\\nline2');
115
+ // Compact mode should not be pretty printed
116
+ expect(result).not.toContain('\n "text":');
117
+ });
118
+ it('should work with stringifyForLoggingWithReplacer', () => {
119
+ const obj = {
120
+ text: 'line1\\nline2',
121
+ sensitive: 'should be redacted'
122
+ };
123
+ const replacer = (key, value) => {
124
+ if (key === 'sensitive') {
125
+ return '[REDACTED]';
126
+ }
127
+ return value;
128
+ };
129
+ const result = stringifyForLoggingWithReplacer(obj, replacer);
130
+ expect(result).toContain('"text": "line1');
131
+ expect(result).toContain('line2"');
132
+ expect(result).toContain('"sensitive": "[REDACTED]"');
133
+ });
134
+ it('should handle multiple newline sequences', () => {
135
+ const obj = {
136
+ text: 'start\n\n\nmiddle\n\nend'
137
+ };
138
+ const result = stringifyForLogging(obj);
139
+ expect(result).toContain('start');
140
+ expect(result).toContain('middle');
141
+ expect(result).toContain('end');
142
+ });
143
+ it('should handle newlines at beginning and end', () => {
144
+ const obj = {
145
+ text: '\nstart with newline\nend with newline\n'
146
+ };
147
+ const result = stringifyForLogging(obj);
148
+ expect(result).toContain('"text": "');
149
+ expect(result).toContain('start with newline');
150
+ expect(result).toContain('end with newline');
151
+ });
152
+ it('should not process if there are no \\n in the string', () => {
153
+ const obj = {
154
+ text: 'no newlines here',
155
+ number: 42,
156
+ bool: true
157
+ };
158
+ const result = stringifyForLogging(obj);
159
+ expect(result).toContain('"text": "no newlines here"');
160
+ expect(result).toContain('"number": 42');
161
+ expect(result).toContain('"bool": true');
162
+ });
163
+ it('should handle edge case with trailing backslash', () => {
164
+ // Note: A single trailing backslash is not valid in a JavaScript string,
165
+ // JSON.stringify will handle it properly by escaping it
166
+ const obj = {
167
+ text: 'ends with backslash'
168
+ };
169
+ const result = stringifyForLogging(obj);
170
+ // Should handle gracefully
171
+ expect(result).toBeDefined();
172
+ expect(result).toContain('ends with backslash');
173
+ });
174
+ });
175
+ describe('getJsonPrettySetting', () => {
176
+ it('should return true by default', () => {
177
+ expect(getJsonPrettySetting()).toBe(true);
178
+ });
179
+ it('should use config getter if available', () => {
180
+ setJsonPrettyConfigGetter(() => ({
181
+ system: {
182
+ logging: {
183
+ jsonPretty: false,
184
+ mcpCommDebug: false,
185
+ sessionDebug: false
186
+ }
187
+ }
188
+ }));
189
+ expect(getJsonPrettySetting()).toBe(false);
190
+ setJsonPrettyConfigGetter(() => ({
191
+ system: {
192
+ logging: {
193
+ jsonPretty: true,
194
+ mcpCommDebug: false,
195
+ sessionDebug: false
196
+ }
197
+ }
198
+ }));
199
+ expect(getJsonPrettySetting()).toBe(true);
200
+ });
201
+ it('should fall back to default value when config getter fails', () => {
202
+ setJsonPrettyConfigGetter(() => {
203
+ throw new Error('Config getter failed');
204
+ });
205
+ expect(getJsonPrettySetting()).toBe(true);
206
+ });
207
+ });
208
+ describe('all setting getters', () => {
209
+ it('should return correct defaults when no config getter is set', () => {
210
+ expect(getJsonPrettySetting()).toBe(true);
211
+ expect(getMcpCommDebugSetting()).toBe(false);
212
+ expect(getSessionDebugSetting()).toBe(false);
213
+ });
214
+ it('should return values from config getter when available', () => {
215
+ setJsonPrettyConfigGetter(() => ({
216
+ system: {
217
+ logging: {
218
+ jsonPretty: false,
219
+ mcpCommDebug: true,
220
+ sessionDebug: true
221
+ }
222
+ }
223
+ }));
224
+ expect(getJsonPrettySetting()).toBe(false);
225
+ expect(getMcpCommDebugSetting()).toBe(true);
226
+ expect(getSessionDebugSetting()).toBe(true);
227
+ });
228
+ it('should fall back to defaults when config getter fails', () => {
229
+ setJsonPrettyConfigGetter(() => {
230
+ throw new Error('Config getter failed');
231
+ });
232
+ expect(getJsonPrettySetting()).toBe(true);
233
+ expect(getMcpCommDebugSetting()).toBe(false);
234
+ expect(getSessionDebugSetting()).toBe(false);
235
+ });
236
+ });
237
+ describe('rawHeadersToObject', () => {
238
+ it('should convert rawHeaders array to object', () => {
239
+ const rawHeaders = ['Host', 'example.com', 'Content-Type', 'application/json'];
240
+ const result = rawHeadersToObject(rawHeaders);
241
+ expect(result).toEqual({
242
+ Host: 'example.com',
243
+ 'Content-Type': 'application/json'
244
+ });
245
+ });
246
+ it('should handle empty array', () => {
247
+ expect(rawHeadersToObject([])).toEqual({});
248
+ });
249
+ it('should skip undefined pairs', () => {
250
+ const rawHeaders = ['Host', 'example.com', 'Only-Key'];
251
+ const result = rawHeadersToObject(rawHeaders);
252
+ expect(result).toEqual({ Host: 'example.com' });
253
+ });
254
+ });
255
+ describe('stringifyRawHeadersForLogging', () => {
256
+ it('should stringify raw headers for logging', () => {
257
+ const rawHeaders = ['Host', 'example.com', 'Content-Type', 'application/json'];
258
+ const result = stringifyRawHeadersForLogging(rawHeaders);
259
+ expect(result).toContain('Host');
260
+ expect(result).toContain('example.com');
261
+ expect(result).toContain('Content-Type');
262
+ expect(result).toContain('application/json');
263
+ });
264
+ });
265
+ describe('integration tests', () => {
266
+ it('should work with realistic debug response scenario', () => {
267
+ // Enable pretty mode via config getter
268
+ setJsonPrettyConfigGetter(() => ({
269
+ system: {
270
+ logging: {
271
+ jsonPretty: true,
272
+ mcpCommDebug: false,
273
+ sessionDebug: false
274
+ }
275
+ }
276
+ }));
277
+ const debugResponse = {
278
+ jsonrpc: '2.0',
279
+ id: 1,
280
+ result: {
281
+ content: [
282
+ {
283
+ type: 'text',
284
+ text: '# click response\nSuccessfully clicked on the element\nAction completed'
285
+ }
286
+ ]
287
+ }
288
+ };
289
+ const result = stringifyForLogging(debugResponse);
290
+ // Should have actual newlines in the text field
291
+ expect(result).toContain('"text": "# click response');
292
+ expect(result).toContain('Successfully clicked on the element');
293
+ expect(result).toContain('Action completed"');
294
+ });
295
+ });
296
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=log-rotator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-rotator.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/log-rotator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,296 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+ import { LogRotator } from '../../../src/utils/log-rotator.js';
6
+ // Helper function to create a complete system config with custom logging rotation
7
+ function createTestConfig(rotationConfig = {}) {
8
+ return {
9
+ system: {
10
+ logging: {
11
+ rotationAge: rotationConfig.rotationAge ?? '7d'
12
+ }
13
+ }
14
+ };
15
+ }
16
+ describe('LogRotator', () => {
17
+ let logRotator;
18
+ let tempLogDir;
19
+ let originalConfig;
20
+ beforeEach(() => {
21
+ // Create temporary log directory
22
+ tempLogDir = path.join(os.tmpdir(), `log-rotator-test-${Date.now()}`);
23
+ fs.mkdirSync(tempLogDir, { recursive: true });
24
+ // Set default configuration
25
+ originalConfig = createTestConfig();
26
+ });
27
+ afterEach(() => {
28
+ // Clean up temporary directory
29
+ if (fs.existsSync(tempLogDir)) {
30
+ fs.rmSync(tempLogDir, { recursive: true, force: true });
31
+ }
32
+ vi.clearAllMocks();
33
+ });
34
+ it('should create log rotator with default base name', () => {
35
+ logRotator = new LogRotator(tempLogDir);
36
+ expect(logRotator).toBeDefined();
37
+ });
38
+ it('should create log rotator with custom base name', () => {
39
+ logRotator = new LogRotator(tempLogDir, 'custom-log');
40
+ expect(logRotator).toBeDefined();
41
+ });
42
+ it('should create log directory if it does not exist', () => {
43
+ const newDir = path.join(tempLogDir, 'new-subdir');
44
+ logRotator = new LogRotator(newDir);
45
+ expect(fs.existsSync(newDir)).toBe(true);
46
+ });
47
+ it('should create new log file path with timestamp format', () => {
48
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
49
+ const logPath = logRotator.createNewLogFilePath();
50
+ // Should match format: mcp-hub.YYYYMMDD_HHmmSSZZZ.log
51
+ const basename = path.basename(logPath);
52
+ expect(basename).toMatch(/^mcp-hub\.\d{8}_\d{9}\.log$/);
53
+ });
54
+ it('should create different file paths on subsequent calls', () => {
55
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
56
+ // Use fake timers to ensure different timestamps
57
+ const path1 = logRotator.createNewLogFilePath();
58
+ // Advance time by 1ms
59
+ vi.useFakeTimers();
60
+ vi.advanceTimersByTime(1);
61
+ const path2 = logRotator.createNewLogFilePath();
62
+ vi.useRealTimers();
63
+ expect(path1).not.toBe(path2);
64
+ });
65
+ it('should get latest log file path', () => {
66
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
67
+ // Create some log files
68
+ const file1 = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
69
+ const file2 = path.join(tempLogDir, 'mcp-hub.20260301_110000000.log');
70
+ const file3 = path.join(tempLogDir, 'mcp-hub.20260301_120000000.log');
71
+ fs.writeFileSync(file1, 'test content');
72
+ fs.writeFileSync(file2, 'test content');
73
+ fs.writeFileSync(file3, 'test content');
74
+ const latest = logRotator.getLatestLogFilePath();
75
+ expect(latest).toBe(file3);
76
+ });
77
+ it('should return null for latest log file when none exist', () => {
78
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
79
+ const latest = logRotator.getLatestLogFilePath();
80
+ expect(latest).toBeNull();
81
+ });
82
+ it('should maintain backward compatibility with getCurrentLogFilePath', () => {
83
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
84
+ // When no files exist, getCurrentLogFilePath will create a new path (but not the file)
85
+ const path1 = logRotator.getCurrentLogFilePath();
86
+ expect(path.basename(path1)).toMatch(/^mcp-hub\.\d{8}_\d{9}\.log$/);
87
+ // Actually create the file on disk
88
+ fs.writeFileSync(path1, 'test content 1');
89
+ // Create an older file
90
+ const oldFile = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
91
+ fs.writeFileSync(oldFile, 'test content 2');
92
+ // When files exist, getCurrentLogFilePath should return the latest one
93
+ const path2 = logRotator.getCurrentLogFilePath();
94
+ expect(path2).toBe(path1); // Should return the newer one we just created
95
+ });
96
+ it('should get current log file path with custom base name', () => {
97
+ logRotator = new LogRotator(tempLogDir, 'custom-log', undefined, () => originalConfig);
98
+ const currentPath = logRotator.createNewLogFilePath();
99
+ const basename = path.basename(currentPath);
100
+ expect(basename).toMatch(/^custom-log\.\d{8}_\d{9}\.log$/);
101
+ });
102
+ it('should parse retention days correctly for days', () => {
103
+ const configWithDays = createTestConfig({ rotationAge: '30d' });
104
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithDays);
105
+ // @ts-expect-error - accessing private method for testing
106
+ const retentionDays = logRotator.getRetentionDays();
107
+ expect(retentionDays).toBe(30);
108
+ });
109
+ it('should parse retention days correctly for hours', () => {
110
+ const configWithHours = createTestConfig({ rotationAge: '48h' });
111
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithHours);
112
+ // @ts-expect-error - accessing private method for testing
113
+ const retentionDays = logRotator.getRetentionDays();
114
+ expect(retentionDays).toBe(2); // 48 hours = 2 days
115
+ });
116
+ it('should parse retention days correctly for minutes', () => {
117
+ const configWithMinutes = createTestConfig({ rotationAge: '1440m' });
118
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithMinutes);
119
+ // @ts-expect-error - accessing private method for testing
120
+ const retentionDays = logRotator.getRetentionDays();
121
+ expect(retentionDays).toBe(1); // 1440 minutes = 1 day
122
+ });
123
+ it('should return default retention days for invalid format', () => {
124
+ const configWithInvalid = createTestConfig({ rotationAge: 'invalid' });
125
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => configWithInvalid);
126
+ // @ts-expect-error - accessing private method for testing
127
+ const retentionDays = logRotator.getRetentionDays();
128
+ expect(retentionDays).toBe(7); // default
129
+ });
130
+ it('should use default 7 days when no config provided', () => {
131
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub');
132
+ // @ts-expect-error - accessing private method for testing
133
+ const retentionDays = logRotator.getRetentionDays();
134
+ expect(retentionDays).toBe(7); // default
135
+ });
136
+ it('should extract date from new format filename correctly', () => {
137
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
138
+ const filename = 'mcp-hub.20251201_143022123.log';
139
+ // @ts-expect-error - accessing private method for testing
140
+ const date = logRotator.extractDateFromFilename(filename);
141
+ expect(date).toBeInstanceOf(Date);
142
+ expect(date?.getFullYear()).toBe(2025);
143
+ expect(date?.getMonth()).toBe(11); // months are 0-indexed
144
+ expect(date?.getDate()).toBe(1);
145
+ expect(date?.getHours()).toBe(14);
146
+ expect(date?.getMinutes()).toBe(30);
147
+ expect(date?.getSeconds()).toBe(22);
148
+ expect(date?.getMilliseconds()).toBe(123);
149
+ });
150
+ it('should extract date from old format filename correctly (backward compatibility)', () => {
151
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
152
+ const filename = 'mcp-hub.2025-12-01.log';
153
+ // @ts-expect-error - accessing private method for testing
154
+ const date = logRotator.extractDateFromFilename(filename);
155
+ expect(date).toBeInstanceOf(Date);
156
+ expect(date?.getFullYear()).toBe(2025);
157
+ expect(date?.getMonth()).toBe(11); // months are 0-indexed
158
+ expect(date?.getDate()).toBe(1);
159
+ });
160
+ it('should return null for invalid filename', () => {
161
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
162
+ const filename = 'invalid-filename.txt';
163
+ // @ts-expect-error - accessing private method for testing
164
+ const date = logRotator.extractDateFromFilename(filename);
165
+ expect(date).toBeNull();
166
+ });
167
+ it('should get log files sorted by date (newest first)', () => {
168
+ // Create mock log files with new format
169
+ const newFormatDates = ['20260301_100000000', '20260301_120000000', '20260301_110000000'];
170
+ for (const date of newFormatDates) {
171
+ const filePath = path.join(tempLogDir, `mcp-hub.${date}.log`);
172
+ fs.writeFileSync(filePath, 'test content');
173
+ }
174
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
175
+ const logFiles = logRotator.getLogFiles();
176
+ expect(logFiles).toHaveLength(3);
177
+ // Should be sorted newest first
178
+ expect(path.basename(logFiles[0])).toBe('mcp-hub.20260301_120000000.log');
179
+ expect(path.basename(logFiles[1])).toBe('mcp-hub.20260301_110000000.log');
180
+ expect(path.basename(logFiles[2])).toBe('mcp-hub.20260301_100000000.log');
181
+ });
182
+ it('should sort mixed format log files correctly', () => {
183
+ // Create both old and new format files
184
+ const oldFile = path.join(tempLogDir, 'mcp-hub.2026-02-28.log');
185
+ const newFile1 = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
186
+ const newFile2 = path.join(tempLogDir, 'mcp-hub.20260301_120000000.log');
187
+ fs.writeFileSync(oldFile, 'old format');
188
+ fs.writeFileSync(newFile1, 'new format 1');
189
+ fs.writeFileSync(newFile2, 'new format 2');
190
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
191
+ const logFiles = logRotator.getLogFiles();
192
+ expect(logFiles).toHaveLength(3);
193
+ expect(path.basename(logFiles[0])).toBe('mcp-hub.20260301_120000000.log');
194
+ expect(path.basename(logFiles[1])).toBe('mcp-hub.20260301_100000000.log');
195
+ expect(path.basename(logFiles[2])).toBe('mcp-hub.2026-02-28.log');
196
+ });
197
+ it('should handle empty log directory', () => {
198
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
199
+ const logFiles = logRotator.getLogFiles();
200
+ expect(logFiles).toHaveLength(0);
201
+ });
202
+ it('should rotate logs and remove old files', () => {
203
+ // Create old log files (beyond retention period)
204
+ const oldDate = new Date('2025-01-01'); // Fixed date in the past
205
+ const oldFilePath = path.join(tempLogDir, 'mcp-hub.20250101_100000000.log');
206
+ fs.writeFileSync(oldFilePath, 'old log content');
207
+ // Set file modification time to old date
208
+ fs.utimesSync(oldFilePath, oldDate, oldDate);
209
+ // Create recent log file (within retention period)
210
+ const recentFilePath = path.join(tempLogDir, 'mcp-hub.20260301_100000000.log');
211
+ fs.writeFileSync(recentFilePath, 'recent log content');
212
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
213
+ logRotator.rotateLogs();
214
+ // Old file should be deleted, recent file should remain
215
+ expect(fs.existsSync(oldFilePath)).toBe(false);
216
+ expect(fs.existsSync(recentFilePath)).toBe(true);
217
+ });
218
+ it('should handle rotation errors gracefully', () => {
219
+ // Mock fs.readdirSync to throw an error
220
+ const readdirSyncSpy = vi.spyOn(fs, 'readdirSync').mockImplementation(() => {
221
+ throw new Error('Permission denied');
222
+ });
223
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
224
+ // Should not throw an error
225
+ expect(() => logRotator.rotateLogs()).not.toThrow();
226
+ readdirSyncSpy.mockRestore();
227
+ });
228
+ it('should handle getLogFiles errors gracefully', () => {
229
+ // Mock fs.readdirSync to throw an error
230
+ const readdirSyncSpy = vi.spyOn(fs, 'readdirSync').mockImplementation(() => {
231
+ throw new Error('Permission denied');
232
+ });
233
+ logRotator = new LogRotator(tempLogDir, 'mcp-hub', undefined, () => originalConfig);
234
+ const logFiles = logRotator.getLogFiles();
235
+ expect(logFiles).toHaveLength(0);
236
+ readdirSyncSpy.mockRestore();
237
+ });
238
+ describe('with custom config', () => {
239
+ it('should create log rotator with custom configuration', () => {
240
+ logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '14d' });
241
+ expect(logRotator).toBeDefined();
242
+ });
243
+ it('should use custom rotation age when provided', () => {
244
+ logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '30d' });
245
+ // @ts-expect-error - accessing private method for testing
246
+ const retentionDays = logRotator.getRetentionDays();
247
+ expect(retentionDays).toBe(30);
248
+ });
249
+ it('should parse custom rotation age in hours', () => {
250
+ logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '48h' });
251
+ // @ts-expect-error - accessing private method for testing
252
+ const retentionDays = logRotator.getRetentionDays();
253
+ expect(retentionDays).toBe(2);
254
+ });
255
+ it('should parse custom rotation age in minutes', () => {
256
+ logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: '2880m' });
257
+ // @ts-expect-error - accessing private method for testing
258
+ const retentionDays = logRotator.getRetentionDays();
259
+ expect(retentionDays).toBe(2); // 2880 minutes = 2 days
260
+ });
261
+ it('should return default 7 days for invalid custom format', () => {
262
+ logRotator = new LogRotator(tempLogDir, 'custom-log', { rotationAge: 'invalid' });
263
+ // @ts-expect-error - accessing private method for testing
264
+ const retentionDays = logRotator.getRetentionDays();
265
+ expect(retentionDays).toBe(7);
266
+ });
267
+ it('should use default 7 days when no custom rotation age provided', () => {
268
+ logRotator = new LogRotator(tempLogDir, 'custom-log', {});
269
+ // @ts-expect-error - accessing private method for testing
270
+ const retentionDays = logRotator.getRetentionDays();
271
+ expect(retentionDays).toBe(7);
272
+ });
273
+ it('should create new log file path with custom base name and custom config', () => {
274
+ logRotator = new LogRotator(tempLogDir, 'dev-server', { rotationAge: '7d' });
275
+ const logPath = logRotator.createNewLogFilePath();
276
+ const basename = path.basename(logPath);
277
+ expect(basename).toMatch(/^dev-server\.\d{8}_\d{9}\.log$/);
278
+ });
279
+ it('should rotate logs with custom retention period', () => {
280
+ // Create old log files (beyond custom 2-day retention period)
281
+ const oldDate = new Date();
282
+ oldDate.setDate(oldDate.getDate() - 3); // 3 days old
283
+ const oldFilePath = path.join(tempLogDir, 'dev-server.20260228_100000000.log');
284
+ fs.writeFileSync(oldFilePath, 'old log content');
285
+ fs.utimesSync(oldFilePath, oldDate, oldDate);
286
+ // Create recent log file (within custom 2-day retention period)
287
+ const recentFilePath = path.join(tempLogDir, 'dev-server.20260301_100000000.log');
288
+ fs.writeFileSync(recentFilePath, 'recent log content');
289
+ logRotator = new LogRotator(tempLogDir, 'dev-server', { rotationAge: '2d' });
290
+ logRotator.rotateLogs();
291
+ // Old file should be deleted, recent file should remain
292
+ expect(fs.existsSync(oldFilePath)).toBe(false);
293
+ expect(fs.existsSync(recentFilePath)).toBe(true);
294
+ });
295
+ });
296
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/logger.test.ts"],"names":[],"mappings":""}