@loop_ouroboros/mcp-hub-lite 1.2.9 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +405 -331
  3. package/dist/client/assets/{HomeView-CGezWc0j.js → HomeView-DplI3V-h.js} +1 -1
  4. package/dist/client/assets/{ResourceDetailView-CDmWGdAK.css → ResourceDetailView-BkTSg91z.css} +1 -1
  5. package/dist/client/assets/ResourceDetailView-CeHPn99Y.js +1 -0
  6. package/dist/client/assets/ResourcesView-C1ObRhYS.js +1 -0
  7. package/dist/client/assets/ResourcesView-zgV8Nq7w.css +1 -0
  8. package/dist/client/assets/{ServerDashboard-g5p4VC_-.js → ServerDashboard-D7wG4Gvt.js} +1 -1
  9. package/dist/client/assets/{ServerDetail-DCQH8HIb.css → ServerDetail-CPNAFBPM.css} +1 -1
  10. package/dist/client/assets/ServerDetail-G23phOcJ.js +2 -0
  11. package/dist/client/assets/{ServerListView-DZsy2gaQ.js → ServerListView-BFiZLtPO.js} +1 -1
  12. package/dist/client/assets/{ServerStatusTags.vue_vue_type_script_setup_true_lang-DmGg4uuV.js → ServerStatusTags.vue_vue_type_script_setup_true_lang-Deb_SbFw.js} +1 -1
  13. package/dist/client/assets/SettingsView-QBFLZ6fP.js +1 -0
  14. package/dist/client/assets/ToolCallDialog-BQ9UJZ_-.css +1 -0
  15. package/dist/client/assets/ToolCallDialog-DYS-ADCL.js +1 -0
  16. package/dist/client/assets/ToolsView-DYwgtm7W.js +1 -0
  17. package/dist/client/assets/ToolsView-cO61nMNr.css +1 -0
  18. package/dist/client/assets/_baseClone-DQno9YO3.js +1 -0
  19. package/dist/client/assets/{el-form-item-CTsVV8sm.js → el-form-item-DF0zzQdH.js} +2 -2
  20. package/dist/client/assets/el-input-C_p2Qw42.js +1 -0
  21. package/dist/client/assets/el-loading-BaenpNzU.js +1 -0
  22. package/dist/client/assets/el-overlay-MbIUXSQ7.js +1 -0
  23. package/dist/client/assets/el-radio-group-COnCjCcz.js +1 -0
  24. package/dist/client/assets/el-skeleton-item-qj0eQP4s.js +1 -0
  25. package/dist/client/assets/el-switch-BZbXqB3_.js +1 -0
  26. package/dist/client/assets/el-tab-pane-w7RltRLd.js +1 -0
  27. package/dist/client/assets/el-table-column-OD8zhFcD.js +1 -0
  28. package/dist/client/assets/index-DwhULJXZ.js +2 -0
  29. package/dist/client/assets/{index-BNmwPGMT.css → index-UtsV0Cvh.css} +1 -1
  30. package/dist/client/assets/{omit-Btci9mp3.js → omit-BAJQlviJ.js} +1 -1
  31. package/dist/client/assets/raf-B1Ry7ruA.js +1 -0
  32. package/dist/client/assets/{vue-vendor-Dwcr0jep.js → vue-vendor-ClSvefnQ.js} +1 -1
  33. package/dist/client/index.html +3 -3
  34. package/dist/server/shared/models/constants.d.ts +8 -0
  35. package/dist/server/shared/models/constants.d.ts.map +1 -0
  36. package/dist/server/shared/models/constants.js +6 -0
  37. package/dist/server/shared/models/index.d.ts +1 -0
  38. package/dist/server/shared/models/index.d.ts.map +1 -1
  39. package/dist/server/shared/models/index.js +1 -0
  40. package/dist/server/shared/models/server.model.d.ts +14 -0
  41. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  42. package/dist/server/shared/models/server.model.js +27 -4
  43. package/dist/server/shared/types/index.d.ts +0 -1
  44. package/dist/server/shared/types/index.d.ts.map +1 -1
  45. package/dist/server/shared/types/index.js +0 -1
  46. package/dist/server/src/api/mcp/debug-response-wrapper.js +1 -1
  47. package/dist/server/src/api/mcp/gateway.d.ts +10 -6
  48. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  49. package/dist/server/src/api/mcp/gateway.js +235 -87
  50. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  51. package/dist/server/src/api/web/hub-tools.js +11 -0
  52. package/dist/server/src/api/web/mcp-status.js +2 -2
  53. package/dist/server/src/api/web/search.d.ts +2 -16
  54. package/dist/server/src/api/web/search.d.ts.map +1 -1
  55. package/dist/server/src/api/web/search.js +22 -30
  56. package/dist/server/src/api/web/servers.js +1 -1
  57. package/dist/server/src/api/web/sessions.d.ts +1 -27
  58. package/dist/server/src/api/web/sessions.d.ts.map +1 -1
  59. package/dist/server/src/api/web/sessions.js +8 -97
  60. package/dist/server/src/api/ws/events.js +1 -1
  61. package/dist/server/src/api/ws/ws-handler.js +1 -1
  62. package/dist/server/src/app.d.ts.map +1 -1
  63. package/dist/server/src/app.js +6 -1
  64. package/dist/server/src/cli/commands/status.js +39 -1
  65. package/dist/server/src/cli/commands/tool-use.d.ts +10 -3
  66. package/dist/server/src/cli/commands/tool-use.d.ts.map +1 -1
  67. package/dist/server/src/cli/commands/tool-use.js +69 -30
  68. package/dist/server/src/cli/commands/use-guide.d.ts +0 -8
  69. package/dist/server/src/cli/commands/use-guide.d.ts.map +1 -1
  70. package/dist/server/src/cli/commands/use-guide.js +28 -170
  71. package/dist/server/src/cli/server.d.ts +10 -0
  72. package/dist/server/src/cli/server.d.ts.map +1 -1
  73. package/dist/server/src/cli/server.js +31 -1
  74. package/dist/server/src/config/config-change-logger.js +1 -1
  75. package/dist/server/src/config/config-loader.js +1 -1
  76. package/dist/server/src/config/config-manager.js +1 -1
  77. package/dist/server/src/config/config-migrator.d.ts +4 -48
  78. package/dist/server/src/config/config-migrator.d.ts.map +1 -1
  79. package/dist/server/src/config/config-migrator.js +2 -103
  80. package/dist/server/src/config/config-saver.js +1 -1
  81. package/dist/server/src/config/server-config-manager.js +1 -1
  82. package/dist/server/src/models/system-tools.constants.d.ts +2 -1
  83. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  84. package/dist/server/src/models/system-tools.constants.js +2 -1
  85. package/dist/server/src/pid/manager.js +1 -1
  86. package/dist/server/src/server/dev-server.js +4 -2
  87. package/dist/server/src/server/runner.d.ts.map +1 -1
  88. package/dist/server/src/server/runner.js +4 -2
  89. package/dist/server/src/server/startup.js +2 -2
  90. package/dist/server/src/services/connection/connection-manager.d.ts +2 -0
  91. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  92. package/dist/server/src/services/connection/connection-manager.js +27 -25
  93. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  94. package/dist/server/src/services/connection/tool-cache.js +10 -8
  95. package/dist/server/src/services/event-bus.service.d.ts +3 -1
  96. package/dist/server/src/services/event-bus.service.d.ts.map +1 -1
  97. package/dist/server/src/services/event-bus.service.js +1 -0
  98. package/dist/server/src/services/gateway/gateway.service.d.ts +14 -0
  99. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  100. package/dist/server/src/services/gateway/gateway.service.js +101 -7
  101. package/dist/server/src/services/gateway/global-transport.d.ts +20 -10
  102. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -1
  103. package/dist/server/src/services/gateway/global-transport.js +50 -34
  104. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +1 -2
  105. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  106. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +24 -13
  107. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  108. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +22 -6
  109. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  110. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +12 -4
  111. package/dist/server/src/services/gateway/session-manager.d.ts +101 -0
  112. package/dist/server/src/services/gateway/session-manager.d.ts.map +1 -0
  113. package/dist/server/src/services/gateway/session-manager.js +256 -0
  114. package/dist/server/src/services/gateway/tool-list-generator.d.ts +14 -19
  115. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  116. package/dist/server/src/services/gateway/tool-list-generator.js +221 -80
  117. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  118. package/dist/server/src/services/hub-manager.service.js +15 -2
  119. package/dist/server/src/services/hub-tools/instance-selector.js +1 -1
  120. package/dist/server/src/services/hub-tools/resource-generator.d.ts +1 -22
  121. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  122. package/dist/server/src/services/hub-tools/resource-generator.js +24 -22
  123. package/dist/server/src/services/hub-tools/server-selector.js +1 -1
  124. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  125. package/dist/server/src/services/hub-tools.service.js +18 -13
  126. package/dist/server/src/services/log-storage.service.js +1 -1
  127. package/dist/server/src/services/system-tool-handler.js +1 -1
  128. package/dist/server/src/utils/error-handler.js +1 -1
  129. package/dist/server/src/utils/index.d.ts +1 -1
  130. package/dist/server/src/utils/index.d.ts.map +1 -1
  131. package/dist/server/src/utils/index.js +1 -1
  132. package/dist/server/src/utils/json-utils.d.ts +9 -0
  133. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  134. package/dist/server/src/utils/json-utils.js +23 -4
  135. package/dist/server/src/utils/log-rotator.d.ts +0 -15
  136. package/dist/server/src/utils/log-rotator.d.ts.map +1 -1
  137. package/dist/server/src/utils/log-rotator.js +0 -18
  138. package/dist/server/src/utils/logger/index.d.ts +1 -1
  139. package/dist/server/src/utils/logger/index.d.ts.map +1 -1
  140. package/dist/server/src/utils/logger/index.js +1 -1
  141. package/dist/server/src/utils/logger/log-context.d.ts +1 -0
  142. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
  143. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  144. package/dist/server/src/utils/logger/log-formatter.js +25 -11
  145. package/dist/server/src/utils/logger/log-output.d.ts +17 -1
  146. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
  147. package/dist/server/src/utils/logger/log-output.js +46 -40
  148. package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
  149. package/dist/server/src/utils/logger/logger.js +18 -2
  150. package/dist/server/src/utils/port-checker.js +1 -1
  151. package/dist/server/src/utils/request-context.d.ts +8 -70
  152. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  153. package/dist/server/src/utils/request-context.js +11 -70
  154. package/dist/server/src/utils/transports/stdio-transport.js +1 -1
  155. package/dist/server/src/utils/transports/streamable-http-transport.js +1 -1
  156. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  157. package/dist/server/src/utils/transports/transport-factory.js +26 -3
  158. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +1 -1
  159. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +1 -1
  160. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +1 -1
  161. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +1 -1
  162. package/dist/server/tests/integration/gateway/mcp-connection.test.js +1 -1
  163. package/dist/server/tests/types/logger-test-helpers.d.ts +1 -1
  164. package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -1
  165. package/dist/server/tests/unit/config/config-migrator.test.js +45 -105
  166. package/dist/server/tests/unit/config/config-saver.test.js +1 -1
  167. package/dist/server/tests/unit/config/config.schema.test.js +2 -1
  168. package/dist/server/tests/unit/server/runner.test.js +19 -13
  169. package/dist/server/tests/unit/services/gateway-logging.test.js +1 -1
  170. package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts +2 -0
  171. package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts.map +1 -0
  172. package/dist/server/tests/unit/services/gateway-session-mode.test.js +174 -0
  173. package/dist/server/tests/unit/services/hub-manager-service.test.js +4 -5
  174. package/dist/server/tests/unit/services/hub-tools.service.test.js +82 -6
  175. package/dist/server/tests/unit/utils/config.test.js +14 -7
  176. package/dist/server/tests/unit/utils/log-output.test.d.ts +2 -0
  177. package/dist/server/tests/unit/utils/log-output.test.d.ts.map +1 -0
  178. package/dist/server/tests/unit/utils/log-output.test.js +198 -0
  179. package/dist/server/tests/unit/utils/log-rotator.test.js +1 -15
  180. package/dist/server/tests/unit/utils/logger.test.js +1 -1
  181. package/dist/server/vitest.config.d.ts.map +1 -1
  182. package/dist/server/vitest.config.js +0 -2
  183. package/package.json +1 -3
  184. package/dist/client/assets/ResourceDetailView-Bi5UsbFq.js +0 -1
  185. package/dist/client/assets/ResourcesView-B9anSm85.js +0 -1
  186. package/dist/client/assets/ResourcesView-Cc8RHtia.css +0 -1
  187. package/dist/client/assets/ServerDetail-DMoFqWCp.js +0 -2
  188. package/dist/client/assets/SettingsView-DQSWb9xM.js +0 -1
  189. package/dist/client/assets/ToolCallDialog-BEyRp_J3.js +0 -1
  190. package/dist/client/assets/ToolCallDialog-BhdPX-Kf.css +0 -1
  191. package/dist/client/assets/ToolsView-BU7PKJwt.js +0 -1
  192. package/dist/client/assets/ToolsView-BkrQLjH9.css +0 -1
  193. package/dist/client/assets/_baseClone-DsVtZfPm.js +0 -1
  194. package/dist/client/assets/el-input-Bh1VGJTU.js +0 -1
  195. package/dist/client/assets/el-loading-huOeK9cW.js +0 -1
  196. package/dist/client/assets/el-overlay-CR_KVhLU.js +0 -1
  197. package/dist/client/assets/el-radio-group-BSbtAW4k.js +0 -1
  198. package/dist/client/assets/el-skeleton-item-BSxOLPFM.js +0 -1
  199. package/dist/client/assets/el-switch-BaQUQWTL.js +0 -1
  200. package/dist/client/assets/el-tab-pane-9JxLgdS7.js +0 -1
  201. package/dist/client/assets/el-table-column-Du1l9Ww3.js +0 -1
  202. package/dist/client/assets/index-CsZoFRv1.js +0 -2
  203. package/dist/client/assets/raf-tUu4BwZS.js +0 -1
@@ -1,73 +1,14 @@
1
- /**
2
- * Request context management using AsyncLocalStorage for request-scoped data.
3
- *
4
- * This module provides a way to store and access request-specific context data
5
- * across asynchronous operations without having to pass context objects through
6
- * every function call. It uses Node.js AsyncLocalStorage to maintain context
7
- * throughout the request lifecycle.
8
- *
9
- * The primary use case is storing session context information (sessionId, clientName,
10
- * cwd, project, etc.) that needs to be accessible from any part of the application
11
- * during request processing.
12
- *
13
- * @module utils/request-context
14
- */
15
1
  import { AsyncLocalStorage } from 'async_hooks';
16
- /**
17
- * AsyncLocalStorage instance for storing request context.
18
- *
19
- * This storage holds the SessionContext object for the current request and
20
- * makes it available throughout the entire request processing chain,
21
- * including asynchronous operations and nested function calls.
22
- *
23
- * @example
24
- * ```typescript
25
- * // In route handler
26
- * await requestContext.run(sessionContext, async () => {
27
- * // Any code executed here can access the session context
28
- * const ctx = getSessionContext();
29
- * console.log(ctx.sessionId);
30
- * });
31
- * ```
32
- */
33
- export const requestContext = new AsyncLocalStorage();
34
- /**
35
- * Retrieves the current request's session context.
36
- *
37
- * This function returns the SessionContext object stored in the AsyncLocalStorage
38
- * for the current request. It should only be called within a request context
39
- * that has been established using requestContext.run().
40
- *
41
- * @returns {SessionContext | undefined} The current request's session context, or undefined if not in a request context
42
- *
43
- * @example
44
- * ```typescript
45
- * const context = getSessionContext();
46
- * if (context) {
47
- * console.log(`Processing request for session: ${context.sessionId}`);
48
- * }
49
- * ```
50
- */
51
- export function getSessionContext() {
52
- return requestContext.getStore();
2
+ const als = new AsyncLocalStorage();
3
+ export function runWithRequestContext(context, fn) {
4
+ return als.run(context, fn);
53
5
  }
54
- /**
55
- * Retrieves the current request's working directory (cwd).
56
- *
57
- * This is a convenience function that extracts the cwd property from the
58
- * current request's session context. It's commonly used in file operations
59
- * that need to respect the session's current working directory.
60
- *
61
- * @returns {string | undefined} The current request's working directory, or undefined if not available
62
- *
63
- * @example
64
- * ```typescript
65
- * const cwd = getSessionCwd();
66
- * if (cwd) {
67
- * const fullPath = path.join(cwd, relativePath);
68
- * }
69
- * ```
70
- */
71
- export function getSessionCwd() {
72
- return requestContext.getStore()?.cwd;
6
+ export function getSessionIdFromContext() {
7
+ return als.getStore()?.sessionId;
8
+ }
9
+ export function getTraceIdFromContext() {
10
+ return als.getStore()?.traceId;
11
+ }
12
+ export function isInRequestContext() {
13
+ return als.getStore() !== undefined;
73
14
  }
@@ -1,5 +1,5 @@
1
1
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
2
- import { logger, LOG_MODULES } from '../logger.js';
2
+ import { logger, LOG_MODULES } from '../logger/index.js';
3
3
  import { PassThrough } from 'stream';
4
4
  /**
5
5
  * A transport implementation for communicating with MCP (Model Context Protocol) servers
@@ -1,4 +1,4 @@
1
- import { logger, LOG_MODULES } from '../logger.js';
1
+ import { logger, LOG_MODULES } from '../logger/index.js';
2
2
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
3
  import { URL } from 'url';
4
4
  import { ProxyAgent, fetch as undiciFetch } from 'undici';
@@ -1 +1 @@
1
- {"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAKtE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC9C,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC;KACvC,GACA,OAAO,+CAA+C,EAAE,SAAS;IA4EpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA8CxC"}
1
+ {"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAMtE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC9C,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC;KACvC,GACA,OAAO,+CAA+C,EAAE,SAAS;IA8FpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA8CxC"}
@@ -1,8 +1,9 @@
1
1
  import { StdioTransport } from './stdio-transport.js';
2
- import { SseTransport } from './sse-transport.js';
2
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
3
3
  import { StreamableHttpTransport } from './streamable-http-transport.js';
4
4
  import { logStorage } from '../../services/log-storage.service.js';
5
5
  import { McpOAuthClientProvider } from '../../services/mcp-oauth/index.js';
6
+ import { ProxyAgent, fetch as undiciFetch } from 'undici';
6
7
  import { createHash } from 'node:crypto';
7
8
  import path from 'node:path';
8
9
  import os from 'node:os';
@@ -39,11 +40,33 @@ export class TransportFactory {
39
40
  readyPatterns: options?.readyPatterns,
40
41
  readyTimeout: options?.readyTimeout ?? 120000
41
42
  });
42
- case 'sse':
43
+ case 'sse': {
43
44
  if (!config.url) {
44
45
  throw new Error('SSE transport requires a URL');
45
46
  }
46
- return new SseTransport(config.url, config.headers, config.reconnectInterval, config.maxReconnectAttempts, config.proxy, server.name, compositeKey);
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ const sseOpts = {};
49
+ // Headers shared between SSE GET (eventSourceInit) and POST (requestInit)
50
+ if (config.headers && Object.keys(config.headers).length > 0) {
51
+ sseOpts.requestInit = { headers: config.headers };
52
+ sseOpts.eventSourceInit = { headers: config.headers };
53
+ }
54
+ // OAuth provider
55
+ if (options?.authProvider) {
56
+ sseOpts.authProvider = options.authProvider;
57
+ }
58
+ // Proxy support via custom fetch
59
+ if (config.proxy?.url) {
60
+ const agent = new ProxyAgent(config.proxy.url);
61
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
+ sseOpts.fetch = (input, init) => {
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ const fetchOptions = { ...init, dispatcher: agent };
65
+ return undiciFetch(input, fetchOptions);
66
+ };
67
+ }
68
+ return new SSEClientTransport(new URL(config.url), sseOpts);
69
+ }
47
70
  case 'streamable-http':
48
71
  case 'http': {
49
72
  // Compatibility with http type, treat as streamable-http
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
2
+ import { mcpConnectionManager } from '../../../src/services/connection/index.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
4
  import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
5
5
  // Mock MCP SDK
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
2
+ import { mcpConnectionManager } from '../../../src/services/connection/index.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
4
  import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
5
5
  // Mock MCP SDK
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
2
+ import { mcpConnectionManager } from '../../../src/services/connection/index.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
4
  import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
5
5
  // Mock MCP SDK
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
2
+ import { mcpConnectionManager } from '../../../src/services/connection/index.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
4
  import { configManager } from '../../../src/config/config-manager.js';
5
5
  import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
2
+ import { mcpConnectionManager } from '../../../src/services/connection/index.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
4
  import { configManager } from '../../../src/config/config-manager.js';
5
5
  import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
@@ -2,7 +2,7 @@
2
2
  * Logger test helper types for accessing private methods in tests
3
3
  */
4
4
  import type { LogLevel } from '../../shared/types/common.types.js';
5
- import type { LogContext } from '../../src/utils/logger.js';
5
+ import type { LogContext } from '../../src/utils/logger/index.js';
6
6
  import type { WriteStream } from 'node:fs';
7
7
  export interface LoggerWithPrivateMethods {
8
8
  shouldLog: (level: string) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"logger-test-helpers.d.ts","sourceRoot":"","sources":["../../../../tests/types/logger-test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACxC,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,uBAAuB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAC5F,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IACrF,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;CACnC"}
1
+ {"version":3,"file":"logger-test-helpers.d.ts","sourceRoot":"","sources":["../../../../tests/types/logger-test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACxC,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,uBAAuB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAC5F,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IACrF,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;CACnC"}
@@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import os from 'node:os';
5
- import { dryRunMigration, checkMigrationStatus, migrateConfig, rollbackMigration, resolveInstanceConfig, getEnabledInstances } from '../../../src/config/config-migrator.js';
5
+ import { migrateConfig, resolveInstanceConfig } from '../../../src/config/config-migrator.js';
6
6
  import { SystemConfigSchema, isLegacyV1Config } from '../../../src/config/config.schema.js';
7
7
  describe('Config Migrator', () => {
8
8
  let tempDir;
@@ -85,59 +85,15 @@ describe('Config Migrator', () => {
85
85
  const config = createLegacyV1Config();
86
86
  fs.writeFileSync(testConfigPath, JSON.stringify(config, null, 2));
87
87
  };
88
- describe('checkMigrationStatus', () => {
89
- it('should return "not found" for non-existent file', () => {
90
- const result = checkMigrationStatus(testConfigPath);
91
- expect(result.exists).toBe(false);
92
- expect(result.version).toBe('unknown');
93
- expect(result.canMigrate).toBe(false);
94
- });
95
- it('should detect v1.0 configuration', () => {
96
- writeLegacyV1Config();
97
- const result = checkMigrationStatus(testConfigPath);
98
- expect(result.exists).toBe(true);
99
- expect(result.version).toBe('v1');
100
- expect(result.canMigrate).toBe(true);
101
- });
102
- it('should detect v1.1 configuration', () => {
103
- const v1_1Config = {
104
- version: '1.1.0',
105
- system: {
106
- host: 'localhost',
107
- port: 7788,
108
- language: 'zh',
109
- theme: 'system',
110
- logging: {
111
- level: 'info',
112
- rotationAge: '7d',
113
- jsonPretty: true,
114
- mcpCommDebug: false,
115
- apiDebug: false,
116
- gatewayDebug: false
117
- }
118
- },
119
- security: {
120
- allowedNetworks: ['127.0.0.1'],
121
- maxConcurrentConnections: 50,
122
- connectionTimeout: 30000,
123
- idleConnectionTimeout: 300000,
124
- maxConnections: 50
125
- },
126
- servers: {},
127
- tagDefinitions: []
128
- };
129
- fs.writeFileSync(testConfigPath, JSON.stringify(v1_1Config, null, 2));
130
- const result = checkMigrationStatus(testConfigPath);
131
- expect(result.exists).toBe(true);
132
- expect(result.version).toBe('v1.1');
133
- expect(result.canMigrate).toBe(false);
134
- });
135
- });
136
- describe('dryRunMigration', () => {
137
- it('should perform migration without modifying files', () => {
88
+ describe('migrateConfig (actual migration)', () => {
89
+ it('should perform dry run without modifying files', () => {
138
90
  writeLegacyV1Config();
139
91
  const originalContent = fs.readFileSync(testConfigPath, 'utf8');
140
- const result = dryRunMigration(testConfigPath);
92
+ const result = migrateConfig(testConfigPath, {
93
+ dryRun: true,
94
+ createBackup: false,
95
+ validateAfterMigration: true
96
+ });
141
97
  expect(result.success).toBe(true);
142
98
  expect(result.migratedConfig).toBeDefined();
143
99
  expect(result.backupPath).toBeUndefined();
@@ -145,9 +101,13 @@ describe('Config Migrator', () => {
145
101
  const currentContent = fs.readFileSync(testConfigPath, 'utf8');
146
102
  expect(currentContent).toBe(originalContent);
147
103
  });
148
- it('should convert servers to servers correctly', () => {
104
+ it('should convert servers correctly (dry run)', () => {
149
105
  writeLegacyV1Config();
150
- const result = dryRunMigration(testConfigPath);
106
+ const result = migrateConfig(testConfigPath, {
107
+ dryRun: true,
108
+ createBackup: false,
109
+ validateAfterMigration: true
110
+ });
151
111
  expect(result.success).toBe(true);
152
112
  expect(result.migratedConfig).toBeDefined();
153
113
  const migrated = result.migratedConfig;
@@ -156,7 +116,6 @@ describe('Config Migrator', () => {
156
116
  expect(Object.keys(migrated.servers)).toHaveLength(2);
157
117
  expect(migrated.servers['test-server-1']).toBeDefined();
158
118
  expect(migrated.servers['test-server-2']).toBeDefined();
159
- // Check server 1
160
119
  const server1 = migrated.servers['test-server-1'];
161
120
  expect(server1.template.command).toBe('npx test-server-1');
162
121
  expect(server1.template.args).toEqual(['--verbose']);
@@ -167,17 +126,19 @@ describe('Config Migrator', () => {
167
126
  expect(server1.instances[0].id).toMatch(/test-server-1-[0-9a-f]{8}/);
168
127
  expect(server1.instances[0].enabled).toBe(true);
169
128
  });
170
- it('should preserve system and security config', () => {
129
+ it('should preserve system and security config (dry run)', () => {
171
130
  writeLegacyV1Config();
172
131
  const v1Config = createLegacyV1Config();
173
- const result = dryRunMigration(testConfigPath);
132
+ const result = migrateConfig(testConfigPath, {
133
+ dryRun: true,
134
+ createBackup: false,
135
+ validateAfterMigration: true
136
+ });
174
137
  expect(result.success).toBe(true);
175
138
  const migrated = result.migratedConfig;
176
139
  expect(migrated.system).toEqual(v1Config.system);
177
140
  expect(migrated.security).toEqual(v1Config.security);
178
141
  });
179
- });
180
- describe('migrateConfig (actual migration)', () => {
181
142
  it('should perform actual migration and validate the result', () => {
182
143
  writeLegacyV1Config();
183
144
  const originalContent = fs.readFileSync(testConfigPath, 'utf8');
@@ -208,40 +169,15 @@ describe('Config Migrator', () => {
208
169
  expect(validation.success).toBe(true);
209
170
  });
210
171
  });
211
- describe('rollbackMigration', () => {
212
- it('should rollback to v1.0 using backup', () => {
213
- writeLegacyV1Config();
214
- const originalContent = fs.readFileSync(testConfigPath, 'utf8');
215
- // Perform migration first
216
- const migrationResult = migrateConfig(testConfigPath, {
217
- createBackup: true,
218
- validateAfterMigration: true
219
- });
220
- expect(migrationResult.success).toBe(true);
221
- expect(migrationResult.backupPath).toBeDefined();
222
- // Verify file is v1.1
223
- const migratedContent = fs.readFileSync(testConfigPath, 'utf8');
224
- expect(migratedContent).not.toBe(originalContent);
225
- // Rollback
226
- const rollbackResult = rollbackMigration(testConfigPath, migrationResult.backupPath);
227
- expect(rollbackResult.success).toBe(true);
228
- // Verify file is back to original
229
- const rolledBackContent = fs.readFileSync(testConfigPath, 'utf8');
230
- expect(rolledBackContent).toBe(originalContent);
231
- });
232
- it('should fail rollback for non-existent backup', () => {
233
- writeLegacyV1Config();
234
- const nonExistentBackup = path.join(tempDir, 'non-existent-backup.json');
235
- const result = rollbackMigration(testConfigPath, nonExistentBackup);
236
- expect(result.success).toBe(false);
237
- expect(result.error).toContain('not found');
238
- });
239
- });
240
172
  describe('v1.1 Configuration Helpers', () => {
241
173
  describe('resolveInstanceConfig', () => {
242
174
  it('should resolve instance configuration by merging template and instance', () => {
243
175
  writeLegacyV1Config();
244
- const migrationResult = dryRunMigration(testConfigPath);
176
+ const migrationResult = migrateConfig(testConfigPath, {
177
+ dryRun: true,
178
+ createBackup: false,
179
+ validateAfterMigration: true
180
+ });
245
181
  expect(migrationResult.success).toBe(true);
246
182
  const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
247
183
  const resolved = resolveInstanceConfig(serverConfig);
@@ -255,7 +191,11 @@ describe('Config Migrator', () => {
255
191
  });
256
192
  it('should resolve specific instance by ID', () => {
257
193
  writeLegacyV1Config();
258
- const migrationResult = dryRunMigration(testConfigPath);
194
+ const migrationResult = migrateConfig(testConfigPath, {
195
+ dryRun: true,
196
+ createBackup: false,
197
+ validateAfterMigration: true
198
+ });
259
199
  expect(migrationResult.success).toBe(true);
260
200
  const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
261
201
  const instanceId = serverConfig.instances[0].id;
@@ -265,25 +205,17 @@ describe('Config Migrator', () => {
265
205
  });
266
206
  it('should return null for non-existent instance ID', () => {
267
207
  writeLegacyV1Config();
268
- const migrationResult = dryRunMigration(testConfigPath);
208
+ const migrationResult = migrateConfig(testConfigPath, {
209
+ dryRun: true,
210
+ createBackup: false,
211
+ validateAfterMigration: true
212
+ });
269
213
  expect(migrationResult.success).toBe(true);
270
214
  const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
271
215
  const resolved = resolveInstanceConfig(serverConfig, 'non-existent-id');
272
216
  expect(resolved).toBeNull();
273
217
  });
274
218
  });
275
- describe('getEnabledInstances', () => {
276
- it('should return only enabled instances', () => {
277
- writeLegacyV1Config();
278
- const migrationResult = dryRunMigration(testConfigPath);
279
- expect(migrationResult.success).toBe(true);
280
- const serverConfig = migrationResult.migratedConfig.servers['test-server-1'];
281
- const enabledInstances = getEnabledInstances(serverConfig);
282
- expect(enabledInstances).toHaveLength(1);
283
- expect(enabledInstances[0].instance.enabled).toBe(true);
284
- expect(enabledInstances[0].resolved).not.toBeNull();
285
- });
286
- });
287
219
  });
288
220
  describe('Migration Edge Cases', () => {
289
221
  it('should handle empty servers list', () => {
@@ -292,7 +224,11 @@ describe('Config Migrator', () => {
292
224
  servers: {}
293
225
  };
294
226
  fs.writeFileSync(testConfigPath, JSON.stringify(emptyV1Config, null, 2));
295
- const result = dryRunMigration(testConfigPath);
227
+ const result = migrateConfig(testConfigPath, {
228
+ dryRun: true,
229
+ createBackup: false,
230
+ validateAfterMigration: true
231
+ });
296
232
  expect(result.success).toBe(true);
297
233
  expect(result.migratedConfig.servers).toEqual({});
298
234
  });
@@ -310,7 +246,11 @@ describe('Config Migrator', () => {
310
246
  }
311
247
  };
312
248
  fs.writeFileSync(testConfigPath, JSON.stringify(minimalV1Config, null, 2));
313
- const result = dryRunMigration(testConfigPath);
249
+ const result = migrateConfig(testConfigPath, {
250
+ dryRun: true,
251
+ createBackup: false,
252
+ validateAfterMigration: true
253
+ });
314
254
  expect(result.success).toBe(true);
315
255
  expect(result.migratedConfig.servers['minimal-server']).toBeDefined();
316
256
  });
@@ -5,7 +5,7 @@ import path from 'path';
5
5
  // Mock fs module
6
6
  vi.mock('fs');
7
7
  vi.mock('path');
8
- vi.mock('@utils/logger.js', () => ({
8
+ vi.mock('@utils/logger/index.js', () => ({
9
9
  logger: {
10
10
  debug: vi.fn(),
11
11
  error: vi.fn()
@@ -218,7 +218,8 @@ describe('Config Schema (v1.1)', () => {
218
218
  jsonPretty: true,
219
219
  mcpCommDebug: false,
220
220
  apiDebug: false,
221
- gatewayDebug: false
221
+ gatewayDebug: false,
222
+ showTraceContext: true
222
223
  }
223
224
  },
224
225
  security: {
@@ -2,8 +2,8 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
2
  import { runServer } from '../../../src/server/runner.js';
3
3
  import { buildApp } from '../../../src/app.js';
4
4
  import { configManager } from '../../../src/config/config-manager.js';
5
- import { logger } from '../../../src/utils/logger.js';
6
- import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
5
+ import { logger } from '../../../src/utils/logger/index.js';
6
+ import { mcpConnectionManager } from '../../../src/services/connection/index.js';
7
7
  import { PidManager } from '../../../src/pid/manager.js';
8
8
  import { checkPort, checkPortWithExit } from '../../../src/utils/port-checker.js';
9
9
  // Mock resolveInstanceConfig to return a valid resolved config
@@ -16,8 +16,7 @@ vi.mock('@config/config-migrator.js', () => ({
16
16
  aggregatedTools: [],
17
17
  tags: {},
18
18
  enabled: true
19
- })),
20
- getEnabledInstances: vi.fn()
19
+ }))
21
20
  }));
22
21
  // Mock all dependencies
23
22
  vi.mock('@src/app.js', () => ({
@@ -31,7 +30,7 @@ vi.mock('@config/config-manager.js', () => ({
31
30
  addServerInstance: vi.fn()
32
31
  }
33
32
  }));
34
- vi.mock('@utils/logger.js', () => ({
33
+ vi.mock('@utils/logger/index.js', () => ({
35
34
  logger: {
36
35
  info: vi.fn(),
37
36
  error: vi.fn(),
@@ -43,7 +42,7 @@ vi.mock('@utils/logger.js', () => ({
43
42
  SERVER: { module: 'Server' }
44
43
  }
45
44
  }));
46
- vi.mock('@services/mcp-connection-manager.js', () => ({
45
+ vi.mock('@services/connection/index.js', () => ({
47
46
  mcpConnectionManager: {
48
47
  connect: vi.fn(() => Promise.resolve(true)),
49
48
  disconnectAll: vi.fn()
@@ -96,7 +95,8 @@ describe('Server Runner', () => {
96
95
  jsonPretty: true,
97
96
  mcpCommDebug: false,
98
97
  apiDebug: false,
99
- gatewayDebug: false
98
+ gatewayDebug: false,
99
+ showTraceContext: true
100
100
  }
101
101
  },
102
102
  security: {
@@ -137,7 +137,8 @@ describe('Server Runner', () => {
137
137
  jsonPretty: true,
138
138
  mcpCommDebug: false,
139
139
  apiDebug: false,
140
- gatewayDebug: false
140
+ gatewayDebug: false,
141
+ showTraceContext: true
141
142
  }
142
143
  },
143
144
  security: {
@@ -187,7 +188,8 @@ describe('Server Runner', () => {
187
188
  jsonPretty: true,
188
189
  mcpCommDebug: false,
189
190
  apiDebug: false,
190
- gatewayDebug: false
191
+ gatewayDebug: false,
192
+ showTraceContext: true
191
193
  }
192
194
  },
193
195
  security: {
@@ -242,7 +244,8 @@ describe('Server Runner', () => {
242
244
  jsonPretty: true,
243
245
  mcpCommDebug: false,
244
246
  apiDebug: false,
245
- gatewayDebug: false
247
+ gatewayDebug: false,
248
+ showTraceContext: true
246
249
  }
247
250
  },
248
251
  security: {
@@ -360,7 +363,8 @@ describe('Server Runner', () => {
360
363
  jsonPretty: true,
361
364
  mcpCommDebug: false,
362
365
  apiDebug: false,
363
- gatewayDebug: false
366
+ gatewayDebug: false,
367
+ showTraceContext: true
364
368
  }
365
369
  },
366
370
  security: {
@@ -415,7 +419,8 @@ describe('Server Runner', () => {
415
419
  jsonPretty: true,
416
420
  mcpCommDebug: false,
417
421
  apiDebug: false,
418
- gatewayDebug: false
422
+ gatewayDebug: false,
423
+ showTraceContext: true
419
424
  }
420
425
  },
421
426
  security: {
@@ -466,7 +471,8 @@ describe('Server Runner', () => {
466
471
  jsonPretty: true,
467
472
  mcpCommDebug: false,
468
473
  apiDebug: false,
469
- gatewayDebug: false
474
+ gatewayDebug: false,
475
+ showTraceContext: true
470
476
  }
471
477
  },
472
478
  security: {
@@ -1,5 +1,5 @@
1
1
  import { describe, test, expect } from 'vitest';
2
- import { GatewayService } from '../../../src/services/gateway.service.js';
2
+ import { GatewayService } from '../../../src/services/gateway/index.js';
3
3
  describe('GatewayService Logging Helpers', () => {
4
4
  // Access private methods using type assertion for testing
5
5
  const gateway = new GatewayService();
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gateway-session-mode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-session-mode.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/services/gateway-session-mode.test.ts"],"names":[],"mappings":""}