@loop_ouroboros/mcp-hub-lite 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/client/assets/{HomeView-7rMg9C6t.js → HomeView-Bu2joUvW.js} +1 -1
  3. package/dist/client/assets/ResourceDetailView-BvrhDCD1.js +1 -0
  4. package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
  5. package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
  6. package/dist/client/assets/ResourcesView-LjqioF_s.js +1 -0
  7. package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
  8. package/dist/client/assets/ServerDashboard-FhHJFvUi.js +1 -0
  9. package/dist/client/assets/ServerDetail-BKV-M4qT.js +2 -0
  10. package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
  11. package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
  12. package/dist/client/assets/ServerListView-BXgtDyt3.js +36 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-D-ooYNdN.js +1 -0
  14. package/dist/client/assets/SettingsView-CMFG91Z4.js +1 -0
  15. package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
  16. package/dist/client/assets/ToolCallDialog-Bf4Xe4gH.js +1 -0
  17. package/dist/client/assets/ToolsView-DFpha1z0.js +1 -0
  18. package/dist/client/assets/{_baseClone-5q1b0P3O.js → _baseClone-Bp9Rjwd7.js} +1 -1
  19. package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
  20. package/dist/client/assets/el-form-item-DdSUWYsl.js +12 -0
  21. package/dist/client/assets/el-input-99gMrutP.js +1 -0
  22. package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
  23. package/dist/client/assets/{el-loading-H85n3BUC.js → el-loading-CIQ5pD5u.js} +1 -1
  24. package/dist/client/assets/el-overlay-BVM6msGX.js +1 -0
  25. package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
  26. package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
  27. package/dist/client/assets/el-radio-group-DhXWy7ry.js +1 -0
  28. package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
  29. package/dist/client/assets/el-skeleton-item-DJz-Us12.js +1 -0
  30. package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
  31. package/dist/client/assets/el-switch-Bu8AQ5uM.js +1 -0
  32. package/dist/client/assets/el-tab-pane-BnGMaV56.js +1 -0
  33. package/dist/client/assets/el-table-column-BMWOaLS_.js +1 -0
  34. package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
  35. package/dist/client/assets/index-C2V-ZGji.js +1 -0
  36. package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
  37. package/dist/client/assets/index-vhkqgpmN.js +2 -0
  38. package/dist/client/assets/{omit-DPsOVNIJ.js → omit-CqPQN3XP.js} +1 -1
  39. package/dist/client/assets/{raf-DY5mgbuB.js → raf-C2wXzaVU.js} +1 -1
  40. package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-BLHLXXJK.js} +1 -1
  41. package/dist/client/index.html +3 -3
  42. package/dist/server/shared/models/resource.model.d.ts +2 -1
  43. package/dist/server/shared/models/resource.model.d.ts.map +1 -1
  44. package/dist/server/shared/models/server.model.d.ts +362 -5
  45. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  46. package/dist/server/shared/models/server.model.js +220 -1
  47. package/dist/server/shared/models/session.model.d.ts +1 -57
  48. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  49. package/dist/server/shared/models/session.model.js +1 -55
  50. package/dist/server/shared/models/tool.model.d.ts +4 -2
  51. package/dist/server/shared/models/tool.model.d.ts.map +1 -1
  52. package/dist/server/shared/types/session-context.types.d.ts +0 -2
  53. package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
  54. package/dist/server/shared/types/websocket.types.d.ts +17 -10
  55. package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
  56. package/dist/server/src/api/mcp/gateway.d.ts +1 -3
  57. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  58. package/dist/server/src/api/mcp/gateway.js +19 -50
  59. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  60. package/dist/server/src/api/mcp/session-context-extractor.js +5 -14
  61. package/dist/server/src/api/web/hub-tools.d.ts +2 -2
  62. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  63. package/dist/server/src/api/web/hub-tools.js +3 -54
  64. package/dist/server/src/api/web/mcp-status.d.ts +1 -1
  65. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
  66. package/dist/server/src/api/web/mcp-status.js +71 -30
  67. package/dist/server/src/api/web/resources.d.ts.map +1 -1
  68. package/dist/server/src/api/web/resources.js +28 -22
  69. package/dist/server/src/api/web/search.d.ts +2 -16
  70. package/dist/server/src/api/web/search.d.ts.map +1 -1
  71. package/dist/server/src/api/web/search.js +24 -45
  72. package/dist/server/src/api/web/servers.d.ts +3 -3
  73. package/dist/server/src/api/web/servers.d.ts.map +1 -1
  74. package/dist/server/src/api/web/servers.js +70 -25
  75. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
  76. package/dist/server/src/api/ws/ws-handler.js +4 -2
  77. package/dist/server/src/app.d.ts.map +1 -1
  78. package/dist/server/src/app.js +0 -2
  79. package/dist/server/src/cli/commands/list.js +2 -2
  80. package/dist/server/src/cli/commands/status.d.ts.map +1 -1
  81. package/dist/server/src/cli/commands/status.js +41 -30
  82. package/dist/server/src/cli/index.d.ts.map +1 -1
  83. package/dist/server/src/cli/index.js +2 -1
  84. package/dist/server/src/cli/server.d.ts +11 -2
  85. package/dist/server/src/cli/server.d.ts.map +1 -1
  86. package/dist/server/src/config/config-change-logger.d.ts +22 -0
  87. package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
  88. package/dist/server/src/config/config-change-logger.js +135 -11
  89. package/dist/server/src/config/config-loader.d.ts +6 -5
  90. package/dist/server/src/config/config-loader.d.ts.map +1 -1
  91. package/dist/server/src/config/config-loader.js +54 -16
  92. package/dist/server/src/config/config-manager.d.ts +51 -43
  93. package/dist/server/src/config/config-manager.d.ts.map +1 -1
  94. package/dist/server/src/config/config-manager.js +84 -66
  95. package/dist/server/src/config/config-migrator.d.ts +82 -0
  96. package/dist/server/src/config/config-migrator.d.ts.map +1 -0
  97. package/dist/server/src/config/config-migrator.js +348 -0
  98. package/dist/server/src/config/config-saver.d.ts +2 -0
  99. package/dist/server/src/config/config-saver.d.ts.map +1 -1
  100. package/dist/server/src/config/config-saver.js +8 -2
  101. package/dist/server/src/config/config.schema.d.ts +10 -104
  102. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  103. package/dist/server/src/config/config.schema.js +15 -99
  104. package/dist/server/src/config/path-validator.d.ts +27 -0
  105. package/dist/server/src/config/path-validator.d.ts.map +1 -0
  106. package/dist/server/src/config/path-validator.js +53 -0
  107. package/dist/server/src/config/server-config-manager.d.ts +37 -31
  108. package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
  109. package/dist/server/src/config/server-config-manager.js +222 -66
  110. package/dist/server/src/config/type-converter.d.ts.map +1 -1
  111. package/dist/server/src/config/type-converter.js +3 -2
  112. package/dist/server/src/models/event.model.d.ts +17 -10
  113. package/dist/server/src/models/event.model.d.ts.map +1 -1
  114. package/dist/server/src/models/server.model.d.ts +17 -3
  115. package/dist/server/src/models/server.model.d.ts.map +1 -1
  116. package/dist/server/src/models/server.model.js +2 -1
  117. package/dist/server/src/models/system-tools.constants.d.ts +10 -27
  118. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  119. package/dist/server/src/models/system-tools.constants.js +4 -8
  120. package/dist/server/src/pid/manager.d.ts.map +1 -1
  121. package/dist/server/src/pid/manager.js +2 -1
  122. package/dist/server/src/server/dev-server.js +34 -20
  123. package/dist/server/src/server/runner.d.ts.map +1 -1
  124. package/dist/server/src/server/runner.js +41 -26
  125. package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
  126. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  127. package/dist/server/src/services/connection/connection-manager.js +286 -241
  128. package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
  129. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  130. package/dist/server/src/services/connection/tool-cache.js +50 -55
  131. package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
  132. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  133. package/dist/server/src/services/gateway/gateway.service.js +15 -19
  134. package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
  135. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
  136. package/dist/server/src/services/gateway/global-transport.js +42 -0
  137. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  138. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
  139. package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
  140. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
  141. package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
  142. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
  143. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  144. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +10 -81
  145. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
  146. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
  147. package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
  148. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  149. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
  150. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  151. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
  152. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
  153. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
  154. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  155. package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
  156. package/dist/server/src/services/gateway/types.d.ts +2 -1
  157. package/dist/server/src/services/gateway/types.d.ts.map +1 -1
  158. package/dist/server/src/services/hub-manager.service.d.ts +32 -238
  159. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  160. package/dist/server/src/services/hub-manager.service.js +89 -267
  161. package/dist/server/src/services/hub-tools/index.d.ts +1 -3
  162. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  163. package/dist/server/src/services/hub-tools/index.js +1 -2
  164. package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
  165. package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
  166. package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
  167. package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
  168. package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
  169. package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
  170. package/dist/server/src/services/hub-tools/resource-generator.d.ts +24 -1
  171. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  172. package/dist/server/src/services/hub-tools/resource-generator.js +259 -39
  173. package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
  174. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  175. package/dist/server/src/services/hub-tools/server-selector.js +44 -37
  176. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
  177. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  178. package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
  179. package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
  180. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
  181. package/dist/server/src/services/hub-tools/tool-search.js +10 -4
  182. package/dist/server/src/services/hub-tools/types.d.ts +2 -2
  183. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
  184. package/dist/server/src/services/hub-tools.service.d.ts +43 -72
  185. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  186. package/dist/server/src/services/hub-tools.service.js +185 -110
  187. package/dist/server/src/services/search/search-core.service.d.ts +5 -5
  188. package/dist/server/src/services/search/search-core.service.js +11 -11
  189. package/dist/server/src/services/session/session-manager.d.ts +12 -256
  190. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  191. package/dist/server/src/services/session/session-manager.js +23 -585
  192. package/dist/server/src/services/session-tracker.service.d.ts +2 -10
  193. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -1
  194. package/dist/server/src/services/session-tracker.service.js +2 -53
  195. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  196. package/dist/server/src/services/system-tool-handler.js +7 -17
  197. package/dist/server/src/utils/composite-key.d.ts +29 -0
  198. package/dist/server/src/utils/composite-key.d.ts.map +1 -0
  199. package/dist/server/src/utils/composite-key.js +39 -0
  200. package/dist/server/src/utils/error-handler.d.ts.map +1 -1
  201. package/dist/server/src/utils/error-handler.js +3 -2
  202. package/dist/server/src/utils/index.d.ts +2 -0
  203. package/dist/server/src/utils/index.d.ts.map +1 -1
  204. package/dist/server/src/utils/index.js +2 -0
  205. package/dist/server/src/utils/instance-id.d.ts +22 -0
  206. package/dist/server/src/utils/instance-id.d.ts.map +1 -0
  207. package/dist/server/src/utils/instance-id.js +59 -0
  208. package/dist/server/src/utils/json-utils.d.ts +4 -4
  209. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  210. package/dist/server/src/utils/json-utils.js +4 -4
  211. package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
  212. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
  213. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  214. package/dist/server/src/utils/logger/log-formatter.js +82 -5
  215. package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
  216. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  217. package/dist/server/src/utils/logger/log-modules.js +8 -6
  218. package/dist/server/src/utils/parameter-validator.d.ts +10 -0
  219. package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
  220. package/dist/server/src/utils/parameter-validator.js +53 -0
  221. package/dist/server/src/utils/process-tree.d.ts +49 -0
  222. package/dist/server/src/utils/process-tree.d.ts.map +1 -0
  223. package/dist/server/src/utils/process-tree.js +285 -0
  224. package/dist/server/src/utils/request-context.d.ts +0 -18
  225. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  226. package/dist/server/src/utils/request-context.js +0 -20
  227. package/dist/server/src/utils/sort-utils.d.ts +40 -0
  228. package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
  229. package/dist/server/src/utils/sort-utils.js +131 -0
  230. package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
  231. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
  232. package/dist/server/src/utils/transports/sse-transport.js +55 -9
  233. package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
  234. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  235. package/dist/server/src/utils/transports/stdio-transport.js +66 -247
  236. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
  237. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
  238. package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
  239. package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
  240. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  241. package/dist/server/src/utils/transports/transport-factory.js +31 -11
  242. package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
  243. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
  244. package/dist/server/src/utils/version.d.ts +11 -0
  245. package/dist/server/src/utils/version.d.ts.map +1 -0
  246. package/dist/server/src/utils/version.js +57 -0
  247. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
  248. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
  249. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
  250. package/dist/server/tests/evaluation/evaluation.test.js +10 -9
  251. package/dist/server/tests/integration/api/gateway.test.js +2 -2
  252. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
  253. package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
  254. package/dist/server/tests/server.test.js +27 -16
  255. package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
  256. package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
  257. package/dist/server/tests/temp/temp-run-docling.js +53 -0
  258. package/dist/server/tests/types/test-helpers.d.ts +1 -2
  259. package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
  260. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
  261. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
  262. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
  263. package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
  264. package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
  265. package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
  266. package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
  267. package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
  268. package/dist/server/tests/unit/config/config-saver.test.js +200 -0
  269. package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
  270. package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
  271. package/dist/server/tests/unit/config/config.schema.test.js +347 -0
  272. package/dist/server/tests/unit/server/runner.test.js +86 -62
  273. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
  274. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
  275. package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
  276. package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
  277. package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
  278. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
  279. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
  280. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
  281. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
  282. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
  283. package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
  284. package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -320
  285. package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
  286. package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
  287. package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
  288. package/dist/server/tests/unit/services/session-manager.test.js +26 -436
  289. package/dist/server/tests/unit/utils/config.test.js +88 -186
  290. package/dist/server/tests/unit/utils/json-utils.test.js +18 -18
  291. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
  292. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
  293. package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
  294. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
  295. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
  296. package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
  297. package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
  298. package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
  299. package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
  300. package/dist/server/tests/unit/utils/request-context.test.js +5 -24
  301. package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
  302. package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
  303. package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
  304. package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
  305. package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
  306. package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
  307. package/package.json +1 -1
  308. package/dist/client/assets/ResourceDetailView-Bf-1ffbk.js +0 -1
  309. package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
  310. package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
  311. package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
  312. package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
  313. package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
  314. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
  315. package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
  316. package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
  317. package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
  318. package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
  319. package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
  320. package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
  321. package/dist/client/assets/el-input-CDnuSKVZ.js +0 -1
  322. package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
  323. package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
  324. package/dist/client/assets/el-overlay-CzMkXyYy.js +0 -1
  325. package/dist/client/assets/el-select-DvjGddk_.js +0 -1
  326. package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
  327. package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
  328. package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
  329. package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
  330. package/dist/client/assets/el-tag-npbwux4f.js +0 -1
  331. package/dist/client/assets/index-CCnAxNF8.js +0 -2
  332. package/dist/client/assets/index-d1DZeSfz.js +0 -1
  333. package/dist/client/assets/vnode-CHomNjgN.js +0 -1
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Path validation utilities for configuration files.
3
+ * Provides basic path validation to prevent path traversal attacks.
4
+ */
5
+ import { resolve, normalize } from 'node:path';
6
+ /**
7
+ * Validates that a path is within an allowed directory.
8
+ *
9
+ * @param configPath - The path to validate
10
+ * @param allowedDirs - Array of allowed parent directories
11
+ * @returns true if path is valid, false otherwise
12
+ */
13
+ export function isValidConfigPath(configPath, allowedDirs) {
14
+ try {
15
+ const normalizedPath = normalize(resolve(configPath));
16
+ for (const allowedDir of allowedDirs) {
17
+ const normalizedAllowedDir = normalize(resolve(allowedDir));
18
+ if (normalizedPath.startsWith(normalizedAllowedDir)) {
19
+ return true;
20
+ }
21
+ }
22
+ return false;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ /**
29
+ * Ensures a path is absolute and normalized.
30
+ *
31
+ * @param configPath - The path to sanitize
32
+ * @returns Normalized absolute path
33
+ */
34
+ export function sanitizeConfigPath(configPath) {
35
+ return normalize(resolve(configPath));
36
+ }
37
+ /**
38
+ * Validates that a filename doesn't contain path traversal characters.
39
+ *
40
+ * @param filename - The filename to validate
41
+ * @returns true if filename is safe, false otherwise
42
+ */
43
+ export function isSafeFilename(filename) {
44
+ // Block path traversal patterns
45
+ if (filename.includes('..'))
46
+ return false;
47
+ if (filename.includes('/') || filename.includes('\\'))
48
+ return false;
49
+ // Block null bytes
50
+ if (filename.includes('\0'))
51
+ return false;
52
+ return true;
53
+ }
@@ -1,74 +1,80 @@
1
1
  /**
2
- * Server configuration management utilities.
3
- * Handles CRUD operations for server configurations and instances.
2
+ * Server configuration management utilities for v1.1 format.
3
+ * Handles CRUD operations for server templates and instances.
4
4
  */
5
- import type { ServerConfig, ServerInstanceConfig } from './config.schema.js';
5
+ import type { ServerTemplate, ServerInstance, ServerConfig } from './config.schema.js';
6
6
  /**
7
7
  * Adds multiple server configurations to the system in a single operation.
8
8
  *
9
- * @param servers - Array of server objects containing name and partial configuration
9
+ * @param servers - Array of server objects containing name and partial template configuration
10
10
  * @param currentServers - Current servers configuration object (will be modified)
11
- * @param serverInstances - Current server instances record (will be modified)
12
11
  * @returns The updated servers configuration
13
12
  */
14
13
  export declare function addServers(servers: Array<{
15
14
  name: string;
16
- config: Partial<ServerConfig>;
17
- }>, currentServers: Record<string, ServerConfig>, serverInstances: Record<string, ServerInstanceConfig[]>): Record<string, ServerConfig>;
15
+ config: Partial<ServerTemplate>;
16
+ }>, currentServers: Record<string, ServerConfig>): Record<string, ServerConfig>;
18
17
  /**
19
- * Adds a new server configuration to the system.
18
+ * Adds a new server configuration to the system (v1.1 format).
19
+ * Creates a template and a default instance.
20
20
  *
21
21
  * @param name - The unique name for the server
22
- * @param config - The server configuration (partial, will be validated)
22
+ * @param config - The server template configuration (partial, will be validated)
23
23
  * @param currentServers - Current servers configuration object (will be modified)
24
- * @param serverInstances - Current server instances record (will be modified)
25
- * @returns The validated and complete server configuration
24
+ * @returns The complete server configuration (v1.1)
26
25
  */
27
- export declare function addServer(name: string, config: Partial<ServerConfig>, currentServers: Record<string, ServerConfig>, serverInstances: Record<string, ServerInstanceConfig[]>): ServerConfig;
26
+ export declare function addServer(name: string, config: Partial<ServerTemplate>, currentServers: Record<string, ServerConfig>): ServerConfig;
28
27
  /**
29
28
  * Adds a new server instance for the specified server.
30
29
  *
31
30
  * @param name - The name of the server to add an instance for
32
31
  * @param instance - The server instance configuration (partial, will be validated)
33
- * @param serverInstances - Current server instances record (will be modified)
32
+ * @param currentServers - Current servers configuration object (will be modified)
34
33
  * @returns The validated and complete server instance configuration
35
34
  */
36
- export declare function addServerInstance(name: string, instance: Partial<ServerInstanceConfig>, serverInstances: Record<string, ServerInstanceConfig[]>): ServerInstanceConfig;
35
+ export declare function addServerInstance(name: string, instance: Partial<ServerInstance>, currentServers: Record<string, ServerConfig>): ServerInstance;
37
36
  /**
38
- * Updates an existing server configuration with the provided changes.
37
+ * Reassigns server instance indexes to be consecutive (0, 1, 2, ...).
38
+ *
39
+ * @param name - The name of the server to reassign indexes for
40
+ * @param currentServers - Current servers configuration object (will be modified)
41
+ * @returns True if the server exists and indexes were reassigned
42
+ */
43
+ export declare function reassignServerInstanceIndexes(name: string, currentServers: Record<string, ServerConfig>): boolean;
44
+ /**
45
+ * Updates an existing server configuration (template and/or instance selection strategy).
39
46
  *
40
47
  * @param name - The name of the server to update
41
- * @param updates - The partial configuration updates to apply
48
+ * @param updates - The partial server configuration updates to apply (can include template and instanceSelectionStrategy)
42
49
  * @param currentServers - Current servers configuration object (will be modified)
43
- * @returns True if the server was updated, false if it didn't exist
50
+ * @returns True if the server was updated
44
51
  */
45
- export declare function updateServer(name: string, updates: Partial<ServerConfig>, currentServers: Record<string, ServerConfig>): boolean;
52
+ export declare function updateServerTemplate(name: string, updates: Partial<ServerTemplate>, currentServers: Record<string, ServerConfig>): boolean;
46
53
  /**
47
- * Updates an existing server instance configuration with the provided changes.
54
+ * Updates an existing server instance configuration.
48
55
  *
49
56
  * @param name - The name of the server containing the instance to update
50
- * @param index - The index of the instance to update in the instances array
51
- * @param updates - The partial instance configuration updates to apply
52
- * @param serverInstances - Current server instances record (will be modified)
53
- * @returns True if the instance was updated, false if it didn't exist
57
+ * @param index - The index of the instance to update
58
+ * @param updates - The partial instance updates to apply
59
+ * @param currentServers - Current servers configuration object (will be modified)
60
+ * @returns True if the instance was updated
54
61
  */
55
- export declare function updateServerInstance(name: string, index: number, updates: Partial<ServerInstanceConfig>, serverInstances: Record<string, ServerInstanceConfig[]>): boolean;
62
+ export declare function updateServerInstance(name: string, index: number | string, updates: Partial<ServerInstance>, currentServers: Record<string, ServerConfig>): boolean;
56
63
  /**
57
64
  * Removes a server configuration and all its instances from the system.
58
65
  *
59
66
  * @param name - The name of the server to remove
60
67
  * @param currentServers - Current servers configuration object (will be modified)
61
- * @param serverInstances - Current server instances record (will be modified)
62
- * @returns True if the server was removed, false if it didn't exist
68
+ * @returns True if the server was removed
63
69
  */
64
- export declare function removeServer(name: string, currentServers: Record<string, ServerConfig>, serverInstances: Record<string, ServerInstanceConfig[]>): boolean;
70
+ export declare function removeServer(name: string, currentServers: Record<string, ServerConfig>): boolean;
65
71
  /**
66
72
  * Removes a specific server instance from the system.
67
73
  *
68
74
  * @param name - The name of the server containing the instance to remove
69
- * @param index - The index of the instance to remove from the instances array
70
- * @param serverInstances - Current server instances record (will be modified)
71
- * @returns True if the instance was removed, false if it didn't exist
75
+ * @param index - The index of the instance to remove
76
+ * @param currentServers - Current servers configuration object (will be modified)
77
+ * @returns True if the instance was removed
72
78
  */
73
- export declare function removeServerInstance(name: string, index: number, serverInstances: Record<string, ServerInstanceConfig[]>): boolean;
79
+ export declare function removeServerInstance(name: string, index: number | string, currentServers: Record<string, ServerConfig>): boolean;
74
80
  //# sourceMappingURL=server-config-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-config-manager.d.ts","sourceRoot":"","sources":["../../../../src/config/server-config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAc7E;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CAAE,CAAC,EAC/D,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACtD,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAU9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACtD,YAAY,CAiBd;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,EACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACtD,oBAAoB,CActB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,EAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAkBT;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,EACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACtD,OAAO,CAMT;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACtD,OAAO,CAiBT;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,GACtD,OAAO,CAST"}
1
+ {"version":3,"file":"server-config-manager.d.ts","sourceRoot":"","sources":["../../../../src/config/server-config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAmDvF;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE,CAAC,EACjE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CA+B9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,YAAY,CAuCd;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,EACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,cAAc,CAahB;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAkBT;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,EAChC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAwCT;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,EAChC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAiGT;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,OAAO,CAgBhG;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAeT"}
@@ -1,118 +1,272 @@
1
1
  /**
2
- * Server configuration management utilities.
3
- * Handles CRUD operations for server configurations and instances.
2
+ * Server configuration management utilities for v1.1 format.
3
+ * Handles CRUD operations for server templates and instances.
4
4
  */
5
- import { ServerConfigSchema, ServerInstanceConfigSchema } from './config.schema.js';
5
+ import { ServerTemplateSchema, ServerInstanceSchema, ServerConfigSchema } from './config.schema.js';
6
6
  import { convertHttpToStreamableHttp } from './type-converter.js';
7
+ import { logger, LOG_MODULES } from '../utils/logger.js';
8
+ import { getObjectChanges, logObjectChangesWithTitle } from './config-change-logger.js';
9
+ import { sortServerConfigEnvHeaders } from '../utils/sort-utils.js';
10
+ import { generateInstanceId } from '../utils/instance-id.js';
7
11
  /**
8
- * Generates a unique server instance ID.
12
+ * Creates a default server instance with index assignment.
9
13
  *
10
14
  * @param serverName - Name of the server
11
- * @returns A unique instance ID
15
+ * @param existingInstances - Existing instances for index calculation
16
+ * @param partialInstance - Partial instance configuration
17
+ * @returns A complete server instance
12
18
  */
13
- function generateInstanceId(serverName) {
14
- const ts = Date.now();
15
- return `${serverName}-${ts}-${Math.random().toString(36).substr(2, 5)}`;
19
+ function createDefaultInstance(serverName, existingInstances, partialInstance = {}) {
20
+ const instance = {
21
+ ...partialInstance
22
+ };
23
+ // Generate content-based ID with deduplication
24
+ if (!instance.id) {
25
+ const baseId = generateInstanceId(serverName, partialInstance);
26
+ let id = baseId;
27
+ let suffix = 2;
28
+ while (existingInstances.some((inst) => inst.id === id)) {
29
+ id = `${baseId}-${suffix}`;
30
+ suffix++;
31
+ }
32
+ instance.id = id;
33
+ }
34
+ // Assign index: max index + 1, or 0 if no existing instances
35
+ if (instance.index === undefined) {
36
+ if (existingInstances.length === 0) {
37
+ instance.index = 0;
38
+ }
39
+ else {
40
+ const indexes = existingInstances.map((inst) => inst.index ?? 0);
41
+ const maxIndex = Math.max(...indexes);
42
+ instance.index = maxIndex + 1;
43
+ }
44
+ }
45
+ return ServerInstanceSchema.parse(instance);
16
46
  }
17
47
  /**
18
48
  * Adds multiple server configurations to the system in a single operation.
19
49
  *
20
- * @param servers - Array of server objects containing name and partial configuration
50
+ * @param servers - Array of server objects containing name and partial template configuration
21
51
  * @param currentServers - Current servers configuration object (will be modified)
22
- * @param serverInstances - Current server instances record (will be modified)
23
52
  * @returns The updated servers configuration
24
53
  */
25
- export function addServers(servers, currentServers, serverInstances) {
54
+ export function addServers(servers, currentServers) {
26
55
  for (const { name, config } of servers) {
27
56
  // Unified type conversion: convert http to streamable-http
28
57
  const convertedConfig = convertHttpToStreamableHttp(config);
29
- currentServers[name] = ServerConfigSchema.parse(convertedConfig);
30
- if (!serverInstances[name])
31
- serverInstances[name] = [];
58
+ let template = ServerTemplateSchema.parse(convertedConfig);
59
+ // Sort env and headers keys for consistency
60
+ template = sortServerConfigEnvHeaders(template);
61
+ // Create default instance
62
+ let defaultInstance = createDefaultInstance(name, []);
63
+ // Sort env and headers keys for consistency
64
+ defaultInstance = sortServerConfigEnvHeaders(defaultInstance);
65
+ // Extract instance selection strategy from config if provided, otherwise default to random
66
+ const { instanceSelectionStrategy = 'random' } = config;
67
+ // Add instance selection strategy to template
68
+ template.instanceSelectionStrategy = instanceSelectionStrategy;
69
+ currentServers[name] = ServerConfigSchema.parse({
70
+ template,
71
+ instances: [defaultInstance]
72
+ });
32
73
  }
33
74
  // Ensure server configurations are sorted by name
34
75
  return Object.fromEntries(Object.entries(currentServers).sort(([a], [b]) => a.localeCompare(b)));
35
76
  }
36
77
  /**
37
- * Adds a new server configuration to the system.
78
+ * Adds a new server configuration to the system (v1.1 format).
79
+ * Creates a template and a default instance.
38
80
  *
39
81
  * @param name - The unique name for the server
40
- * @param config - The server configuration (partial, will be validated)
82
+ * @param config - The server template configuration (partial, will be validated)
41
83
  * @param currentServers - Current servers configuration object (will be modified)
42
- * @param serverInstances - Current server instances record (will be modified)
43
- * @returns The validated and complete server configuration
84
+ * @returns The complete server configuration (v1.1)
44
85
  */
45
- export function addServer(name, config, currentServers, serverInstances) {
86
+ export function addServer(name, config, currentServers) {
46
87
  // Unified type conversion: convert http to streamable-http
47
88
  const convertedConfig = convertHttpToStreamableHttp(config);
48
- const validated = ServerConfigSchema.parse(convertedConfig);
49
- currentServers[name] = validated;
50
- if (!serverInstances[name])
51
- serverInstances[name] = [];
89
+ let template = ServerTemplateSchema.parse(convertedConfig);
90
+ // Sort env and headers keys for consistency
91
+ template = sortServerConfigEnvHeaders(template);
92
+ // Create default instance
93
+ let defaultInstance = createDefaultInstance(name, []);
94
+ // Sort env and headers keys for consistency
95
+ defaultInstance = sortServerConfigEnvHeaders(defaultInstance);
96
+ // Extract instance selection strategy from config if provided, otherwise default to random
97
+ const { instanceSelectionStrategy = 'random' } = config;
98
+ // Add instance selection strategy to template
99
+ template.instanceSelectionStrategy = instanceSelectionStrategy;
100
+ const serverConfig = ServerConfigSchema.parse({
101
+ template,
102
+ instances: [defaultInstance]
103
+ });
104
+ currentServers[name] = serverConfig;
52
105
  // Ensure server configurations are sorted by name
53
106
  const sortedServers = Object.fromEntries(Object.entries(currentServers).sort(([a], [b]) => a.localeCompare(b)));
54
107
  // Update the reference
55
108
  Object.keys(currentServers).forEach((key) => delete currentServers[key]);
56
109
  Object.assign(currentServers, sortedServers);
57
- return validated;
110
+ return serverConfig;
58
111
  }
59
112
  /**
60
113
  * Adds a new server instance for the specified server.
61
114
  *
62
115
  * @param name - The name of the server to add an instance for
63
116
  * @param instance - The server instance configuration (partial, will be validated)
64
- * @param serverInstances - Current server instances record (will be modified)
117
+ * @param currentServers - Current servers configuration object (will be modified)
65
118
  * @returns The validated and complete server instance configuration
66
119
  */
67
- export function addServerInstance(name, instance, serverInstances) {
68
- if (!serverInstances[name])
69
- serverInstances[name] = [];
70
- // Minimal identity generation logic
71
- if (!instance.id) {
72
- const ts = Date.now();
73
- instance.id = generateInstanceId(name);
74
- instance.timestamp = ts;
75
- instance.hash = Math.random().toString(36);
120
+ export function addServerInstance(name, instance, currentServers) {
121
+ if (!currentServers[name]) {
122
+ throw new Error(`Server not found: ${name}`);
123
+ }
124
+ const existingInstances = currentServers[name].instances || [];
125
+ let newInstance = createDefaultInstance(name, existingInstances, instance);
126
+ // Sort env and headers keys for consistency
127
+ newInstance = sortServerConfigEnvHeaders(newInstance);
128
+ currentServers[name].instances = [...existingInstances, newInstance];
129
+ return newInstance;
130
+ }
131
+ /**
132
+ * Reassigns server instance indexes to be consecutive (0, 1, 2, ...).
133
+ *
134
+ * @param name - The name of the server to reassign indexes for
135
+ * @param currentServers - Current servers configuration object (will be modified)
136
+ * @returns True if the server exists and indexes were reassigned
137
+ */
138
+ export function reassignServerInstanceIndexes(name, currentServers) {
139
+ if (!currentServers[name] || currentServers[name].instances.length === 0) {
140
+ return false;
76
141
  }
77
- const validated = ServerInstanceConfigSchema.parse(instance);
78
- serverInstances[name].push(validated);
79
- return validated;
142
+ // Sort instances by their current index
143
+ const sortedInstances = [...currentServers[name].instances].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
144
+ // Reassign indexes to be consecutive starting from 0
145
+ sortedInstances.forEach((instance, newIndex) => {
146
+ instance.index = newIndex;
147
+ });
148
+ // Update the server instances array
149
+ currentServers[name].instances = sortedInstances;
150
+ return true;
80
151
  }
81
152
  /**
82
- * Updates an existing server configuration with the provided changes.
153
+ * Updates an existing server configuration (template and/or instance selection strategy).
83
154
  *
84
155
  * @param name - The name of the server to update
85
- * @param updates - The partial configuration updates to apply
156
+ * @param updates - The partial server configuration updates to apply (can include template and instanceSelectionStrategy)
86
157
  * @param currentServers - Current servers configuration object (will be modified)
87
- * @returns True if the server was updated, false if it didn't exist
158
+ * @returns True if the server was updated
88
159
  */
89
- export function updateServer(name, updates, currentServers) {
160
+ export function updateServerTemplate(name, updates, currentServers) {
90
161
  if (currentServers[name]) {
91
- // Unified type conversion: convert http to streamable-http
92
- const convertedUpdates = convertHttpToStreamableHttp(updates);
93
- currentServers[name] = { ...currentServers[name], ...convertedUpdates };
162
+ const oldServerConfig = JSON.parse(JSON.stringify(currentServers[name]));
163
+ // Handle template updates
164
+ if (Object.keys(updates).length > 0) {
165
+ // Unified type conversion: convert http to streamable-http
166
+ const convertedUpdates = convertHttpToStreamableHttp(updates);
167
+ currentServers[name].template = {
168
+ ...currentServers[name].template,
169
+ ...convertedUpdates
170
+ };
171
+ // Sort env and headers keys for consistency
172
+ currentServers[name].template = sortServerConfigEnvHeaders(currentServers[name].template);
173
+ }
94
174
  // Ensure server configurations are sorted by name
95
175
  const sortedServers = Object.fromEntries(Object.entries(currentServers).sort(([a], [b]) => a.localeCompare(b)));
96
176
  // Update the reference
97
177
  Object.keys(currentServers).forEach((key) => delete currentServers[key]);
98
178
  Object.assign(currentServers, sortedServers);
179
+ // Log template changes
180
+ const changes = getObjectChanges(oldServerConfig, currentServers[name]);
181
+ if (changes.length > 0) {
182
+ const title = `Template updated: ${name}`;
183
+ logObjectChangesWithTitle(title, oldServerConfig, currentServers[name], LOG_MODULES.SERVER_CONFIG_MANAGER);
184
+ }
99
185
  return true;
100
186
  }
101
187
  return false;
102
188
  }
103
189
  /**
104
- * Updates an existing server instance configuration with the provided changes.
190
+ * Updates an existing server instance configuration.
105
191
  *
106
192
  * @param name - The name of the server containing the instance to update
107
- * @param index - The index of the instance to update in the instances array
108
- * @param updates - The partial instance configuration updates to apply
109
- * @param serverInstances - Current server instances record (will be modified)
110
- * @returns True if the instance was updated, false if it didn't exist
193
+ * @param index - The index of the instance to update
194
+ * @param updates - The partial instance updates to apply
195
+ * @param currentServers - Current servers configuration object (will be modified)
196
+ * @returns True if the instance was updated
111
197
  */
112
- export function updateServerInstance(name, index, updates, serverInstances) {
113
- if (serverInstances[name]?.[index]) {
114
- serverInstances[name][index] = { ...serverInstances[name][index], ...updates };
115
- return true;
198
+ export function updateServerInstance(name, index, updates, currentServers) {
199
+ const numericIndex = typeof index === 'string' ? parseInt(index, 10) : index;
200
+ logger.debug(`updateServerInstance called: server=${name}, index=${numericIndex}`, LOG_MODULES.SERVER_CONFIG_MANAGER);
201
+ if (currentServers[name]?.instances) {
202
+ const instances = currentServers[name].instances;
203
+ const instanceIndex = instances.findIndex((inst) => inst.index === numericIndex);
204
+ if (instanceIndex !== -1) {
205
+ const originalInstance = JSON.parse(JSON.stringify(instances[instanceIndex]));
206
+ let updatedInstance = {
207
+ ...instances[instanceIndex],
208
+ ...updates,
209
+ // Explicitly preserve the original index field
210
+ index: originalInstance.index
211
+ };
212
+ // Sort env and headers keys for consistency
213
+ updatedInstance = sortServerConfigEnvHeaders(updatedInstance);
214
+ // Always recalculate ID based on current content
215
+ const newId = generateInstanceId(name, updatedInstance);
216
+ let finalId = newId;
217
+ let suffix = 2;
218
+ while (instances.some((inst, i) => i !== instanceIndex && inst.id === finalId)) {
219
+ finalId = `${newId}-${suffix}`;
220
+ suffix++;
221
+ }
222
+ updatedInstance.id = finalId;
223
+ instances[instanceIndex] = updatedInstance;
224
+ // Log instance changes
225
+ const changes = getObjectChanges(originalInstance, instances[instanceIndex]);
226
+ if (changes.length > 0) {
227
+ const title = originalInstance.displayName
228
+ ? `Instance [id=${originalInstance.id}, displayName=${originalInstance.displayName}] updated:`
229
+ : `Instance [id=${originalInstance.id}] updated:`;
230
+ logObjectChangesWithTitle(title, originalInstance, instances[instanceIndex], LOG_MODULES.SERVER_CONFIG_MANAGER);
231
+ }
232
+ return true;
233
+ }
234
+ else {
235
+ // Fallback: try array index directly
236
+ if (numericIndex >= 0 && numericIndex < instances.length) {
237
+ const originalInstance = JSON.parse(JSON.stringify(instances[numericIndex]));
238
+ let updatedInstance = {
239
+ ...instances[numericIndex],
240
+ ...updates,
241
+ // Ensure index field is set to the numericIndex when using array index fallback
242
+ index: numericIndex
243
+ };
244
+ // Sort env and headers keys for consistency
245
+ updatedInstance = sortServerConfigEnvHeaders(updatedInstance);
246
+ // Always recalculate ID based on current content
247
+ const newId = generateInstanceId(name, updatedInstance);
248
+ let finalId = newId;
249
+ let suffix = 2;
250
+ while (instances.some((inst, i) => i !== numericIndex && inst.id === finalId)) {
251
+ finalId = `${newId}-${suffix}`;
252
+ suffix++;
253
+ }
254
+ updatedInstance.id = finalId;
255
+ instances[numericIndex] = updatedInstance;
256
+ // Log instance changes
257
+ const changes = getObjectChanges(originalInstance, instances[numericIndex]);
258
+ if (changes.length > 0) {
259
+ const title = originalInstance.displayName
260
+ ? `Instance [id=${originalInstance.id}, displayName=${originalInstance.displayName}] updated:`
261
+ : `Instance [id=${originalInstance.id}] updated:`;
262
+ logObjectChangesWithTitle(title, originalInstance, instances[numericIndex], LOG_MODULES.SERVER_CONFIG_MANAGER);
263
+ }
264
+ return true;
265
+ }
266
+ }
267
+ }
268
+ else {
269
+ logger.debug(`Server ${name} not found or has no instances`, LOG_MODULES.SERVER_CONFIG_MANAGER);
116
270
  }
117
271
  return false;
118
272
  }
@@ -121,13 +275,11 @@ export function updateServerInstance(name, index, updates, serverInstances) {
121
275
  *
122
276
  * @param name - The name of the server to remove
123
277
  * @param currentServers - Current servers configuration object (will be modified)
124
- * @param serverInstances - Current server instances record (will be modified)
125
- * @returns True if the server was removed, false if it didn't exist
278
+ * @returns True if the server was removed
126
279
  */
127
- export function removeServer(name, currentServers, serverInstances) {
280
+ export function removeServer(name, currentServers) {
128
281
  if (currentServers[name]) {
129
282
  delete currentServers[name];
130
- delete serverInstances[name];
131
283
  // Ensure server configurations are sorted by name
132
284
  const sortedServers = Object.fromEntries(Object.entries(currentServers).sort(([a], [b]) => a.localeCompare(b)));
133
285
  // Update the reference
@@ -141,17 +293,21 @@ export function removeServer(name, currentServers, serverInstances) {
141
293
  * Removes a specific server instance from the system.
142
294
  *
143
295
  * @param name - The name of the server containing the instance to remove
144
- * @param index - The index of the instance to remove from the instances array
145
- * @param serverInstances - Current server instances record (will be modified)
146
- * @returns True if the instance was removed, false if it didn't exist
296
+ * @param index - The index of the instance to remove
297
+ * @param currentServers - Current servers configuration object (will be modified)
298
+ * @returns True if the instance was removed
147
299
  */
148
- export function removeServerInstance(name, index, serverInstances) {
149
- if (serverInstances[name]) {
150
- serverInstances[name].splice(index, 1);
151
- if (serverInstances[name].length === 0) {
152
- delete serverInstances[name];
300
+ export function removeServerInstance(name, index, currentServers) {
301
+ if (currentServers[name]?.instances) {
302
+ const numericIndex = typeof index === 'string' ? parseInt(index, 10) : index;
303
+ const instanceIndex = currentServers[name].instances.findIndex((inst) => inst.index === numericIndex);
304
+ if (instanceIndex !== -1) {
305
+ currentServers[name].instances.splice(instanceIndex, 1);
306
+ if (currentServers[name].instances.length === 0) {
307
+ // Keep the server even if it has no instances
308
+ }
309
+ return true;
153
310
  }
154
- return true;
155
311
  }
156
312
  return false;
157
313
  }
@@ -1 +1 @@
1
- {"version":3,"file":"type-converter.d.ts","sourceRoot":"","sources":["../../../../src/config/type-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CA2BpE"}
1
+ {"version":3,"file":"type-converter.d.ts","sourceRoot":"","sources":["../../../../src/config/type-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CA2BpE"}
@@ -2,6 +2,7 @@
2
2
  * Type conversion utilities for configuration management.
3
3
  * Handles backward compatibility type conversions.
4
4
  */
5
+ import { TransportType } from './config.schema.js';
5
6
  /**
6
7
  * Unified type conversion method: convert type: 'http' to type: 'streamable-http'
7
8
  * Ensure compatibility across all scenarios (loading, adding, updating)
@@ -20,8 +21,8 @@ export function convertHttpToStreamableHttp(config) {
20
21
  if (typeof config === 'object' && config !== null) {
21
22
  const result = {};
22
23
  for (const [key, value] of Object.entries(config)) {
23
- if (key === 'type' && value === 'http') {
24
- result[key] = 'streamable-http';
24
+ if (key === 'type' && value === TransportType.HTTP) {
25
+ result[key] = TransportType.STREAMABLE_HTTP;
25
26
  }
26
27
  else if (typeof value === 'object' && value !== null) {
27
28
  result[key] = convertHttpToStreamableHttp(value);