@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
@@ -21,18 +21,17 @@ export const LOG_MODULES = {
21
21
  // Core system modules
22
22
  SERVER: { module: 'Server' },
23
23
  DEV_SERVER: { module: 'DevServer' },
24
+ RUNNER: { module: 'Runner' },
24
25
  // Config management
25
26
  CONFIG_MANAGER: { module: 'ConfigManager' },
26
27
  CONFIG_LOADER: { module: 'ConfigLoader' },
27
- CONFIG_CHANGES: { module: 'System Config Changes' },
28
- // Session management
29
- SESSION_MANAGER: { module: 'SessionManager' },
30
- SESSION: { module: 'Session' },
31
- SESSION_API: { module: 'Session API' },
32
- SESSION_TRACKER: { module: 'SessionTracker' },
28
+ CONFIG_SAVER: { module: 'ConfigSaver' },
29
+ CONFIG_CHANGES: { module: 'SystemConfigManager' },
30
+ SERVER_CONFIG_MANAGER: { module: 'ServerConfigManager' },
33
31
  // Connection management
34
32
  CONNECTION_MANAGER: { module: 'ConnectionManager' },
35
33
  HUB_MANAGER: { module: 'HubManager' },
34
+ SERVER_SELECTOR: { module: 'ServerSelector' },
36
35
  // Gateway related
37
36
  GATEWAY: { module: 'Gateway' },
38
37
  GATEWAY_SERVICE: { module: 'GatewayService' },
@@ -40,6 +39,7 @@ export const LOG_MODULES = {
40
39
  HUB_TOOLS: { module: 'HubTools' },
41
40
  SYSTEM_TOOL: { module: 'SystemTool' },
42
41
  TOOL_LIST: { module: 'ToolList' },
42
+ TOOL_LIST_GENERATOR: { module: 'ToolListGenerator' },
43
43
  // Gateway request handlers
44
44
  INITIALIZE_HANDLER: { module: 'Initialize' },
45
45
  SYSTEM_TOOLS_HANDLER: { module: 'SystemTools' },
@@ -47,6 +47,8 @@ export const LOG_MODULES = {
47
47
  TOOLS_HANDLER: { module: 'Tools' },
48
48
  // Search service
49
49
  SEARCH: { module: 'Search' },
50
+ // Error handling
51
+ ERROR_HANDLER: { module: 'ErrorHandler' },
50
52
  // Communication
51
53
  COMMUNICATION: { module: 'Communication' },
52
54
  CONTEXT: { module: 'Context' },
@@ -0,0 +1,10 @@
1
+ import type { JsonSchema } from '../../shared/models/tool.model.js';
2
+ /**
3
+ * Validates tool arguments against the provided JSON schema
4
+ *
5
+ * @param args - The tool arguments to validate
6
+ * @param schema - The JSON schema to validate against
7
+ * @returns null if valid, or an error message string if invalid
8
+ */
9
+ export declare function validateParameters(args: Record<string, unknown>, schema: JsonSchema): string | null;
10
+ //# sourceMappingURL=parameter-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-validator.d.ts","sourceRoot":"","sources":["../../../../src/utils/parameter-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,UAAU,GACjB,MAAM,GAAG,IAAI,CAyBf"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Validates tool arguments against the provided JSON schema
3
+ *
4
+ * @param args - The tool arguments to validate
5
+ * @param schema - The JSON schema to validate against
6
+ * @returns null if valid, or an error message string if invalid
7
+ */
8
+ export function validateParameters(args, schema) {
9
+ // Check required fields
10
+ if (schema.required && Array.isArray(schema.required)) {
11
+ for (const requiredField of schema.required) {
12
+ if (!(requiredField in args)) {
13
+ return `Missing required parameter: '${requiredField}'. Required parameters: [${schema.required.join(', ')}]`;
14
+ }
15
+ }
16
+ }
17
+ // Check parameter types (basic validation)
18
+ if (schema.properties) {
19
+ for (const [paramName, paramSchema] of Object.entries(schema.properties)) {
20
+ if (paramName in args) {
21
+ const argValue = args[paramName];
22
+ const expectedType = paramSchema.type;
23
+ if (expectedType && !isValidType(argValue, expectedType)) {
24
+ return `Invalid type for parameter '${paramName}'. Expected: ${expectedType}, got: ${typeof argValue}`;
25
+ }
26
+ }
27
+ }
28
+ }
29
+ return null;
30
+ }
31
+ /**
32
+ * Validates if a value matches the expected type
33
+ *
34
+ * @param value - The value to validate
35
+ * @param expectedType - The expected JSON schema type
36
+ * @returns true if valid, false otherwise
37
+ */
38
+ function isValidType(value, expectedType) {
39
+ switch (expectedType) {
40
+ case 'string':
41
+ return typeof value === 'string';
42
+ case 'number':
43
+ return typeof value === 'number';
44
+ case 'boolean':
45
+ return typeof value === 'boolean';
46
+ case 'object':
47
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
48
+ case 'array':
49
+ return Array.isArray(value);
50
+ default:
51
+ return true; // Cannot validate unknown types, so pass by default
52
+ }
53
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Windows Process Tree Utility Module
3
+ *
4
+ * This module provides process tree management utilities specifically for Windows.
5
+ * It handles the case where shell: true spawns cmd.exe which then spawns
6
+ * the actual working process (like node.exe, python.exe, etc.).
7
+ *
8
+ * On non-Windows platforms, all methods return safe default values
9
+ * and don't perform any actual operations.
10
+ */
11
+ /**
12
+ * Gets all child process IDs for a given parent PID on Windows.
13
+ *
14
+ * @param pid - Parent process ID
15
+ @returns Promise resolving to array of child PID
16
+ */
17
+ export declare function getChildren(pid: number): Promise<number[]>;
18
+ /**
19
+ * Gets the entire process tree (all descendants) for a given PID.
20
+ * Includes the original PID at the beginning of the array.
21
+ *
22
+ * @param pid - Root process ID
23
+ * @returns Array of all process IDs in the tree
24
+ */
25
+ export declare function getProcessTree(pid: number): Promise<number[]>;
26
+ /**
27
+ * Checks if any process in the process tree is still running.
28
+ *
29
+ * @param pid - Root process ID
30
+ * @returns True if any process in the tree is running
31
+ */
32
+ export declare function isAnyInTreeRunning(pid: number): Promise<boolean>;
33
+ /**
34
+ * Tries to find the actual working process PID in the tree.
35
+ * This looks for processes that are likely the actual worker
36
+ * (node.exe, python.exe, etc.) rather than shell processes.
37
+ *
38
+ * @param pid - Root process ID
39
+ * @returns Working process PID if found, undefined otherwise
40
+ */
41
+ export declare function getWorkingProcessPid(pid: number): Promise<number | undefined>;
42
+ /**
43
+ * Kills the entire process tree.
44
+ *
45
+ * @param pid - Root process ID
46
+ * @param signal - Signal to send (default: SIGTERM)
47
+ */
48
+ export declare function killProcessTree(pid: number, signal?: NodeJS.Signals): Promise<void>;
49
+ //# sourceMappingURL=process-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-tree.d.ts","sourceRoot":"","sources":["../../../../src/utils/process-tree.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBhE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBtE;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkCnF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,CAAC,OAAmB,GACjC,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -0,0 +1,285 @@
1
+ import { spawn } from 'child_process';
2
+ import { logger, LOG_MODULES } from './logger.js';
3
+ /**
4
+ * Windows Process Tree Utility Module
5
+ *
6
+ * This module provides process tree management utilities specifically for Windows.
7
+ * It handles the case where shell: true spawns cmd.exe which then spawns
8
+ * the actual working process (like node.exe, python.exe, etc.).
9
+ *
10
+ * On non-Windows platforms, all methods return safe default values
11
+ * and don't perform any actual operations.
12
+ */
13
+ /**
14
+ * Gets all child process IDs for a given parent PID on Windows.
15
+ *
16
+ * @param pid - Parent process ID
17
+ @returns Promise resolving to array of child PID
18
+ */
19
+ export async function getChildren(pid) {
20
+ if (process.platform !== 'win32') {
21
+ return [];
22
+ }
23
+ try {
24
+ const result = await executePowerShellCommand(`Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq ${pid} } | Select-Object -ExpandProperty ProcessId`);
25
+ const pids = parsePidList(result);
26
+ return pids;
27
+ }
28
+ catch (error) {
29
+ logger.debug(`Failed to get children for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
30
+ return [];
31
+ }
32
+ }
33
+ /**
34
+ * Gets the entire process tree (all descendants) for a given PID.
35
+ * Includes the original PID at the beginning of the array.
36
+ *
37
+ * @param pid - Root process ID
38
+ * @returns Array of all process IDs in the tree
39
+ */
40
+ export async function getProcessTree(pid) {
41
+ if (process.platform !== 'win32') {
42
+ return [pid];
43
+ }
44
+ const tree = [pid];
45
+ const queue = [pid];
46
+ while (queue.length > 0) {
47
+ const current = queue.shift();
48
+ const children = await getChildren(current);
49
+ for (const child of children) {
50
+ if (!tree.includes(child)) {
51
+ tree.push(child);
52
+ queue.push(child);
53
+ }
54
+ }
55
+ }
56
+ return tree;
57
+ }
58
+ /**
59
+ * Checks if any process in the process tree is still running.
60
+ *
61
+ * @param pid - Root process ID
62
+ * @returns True if any process in the tree is running
63
+ */
64
+ export async function isAnyInTreeRunning(pid) {
65
+ if (process.platform !== 'win32') {
66
+ return isProcessRunning(pid);
67
+ }
68
+ try {
69
+ const tree = await getProcessTree(pid);
70
+ for (const processId of tree) {
71
+ if (isProcessRunning(processId)) {
72
+ return true;
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ catch (error) {
78
+ logger.debug(`Error checking process tree for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
79
+ return isProcessRunning(pid);
80
+ }
81
+ }
82
+ /**
83
+ * Tries to find the actual working process PID in the tree.
84
+ * This looks for processes that are likely the actual worker
85
+ * (node.exe, python.exe, etc.) rather than shell processes.
86
+ *
87
+ * @param pid - Root process ID
88
+ * @returns Working process PID if found, undefined otherwise
89
+ */
90
+ export async function getWorkingProcessPid(pid) {
91
+ if (process.platform !== 'win32') {
92
+ return pid;
93
+ }
94
+ try {
95
+ const tree = await getProcessTree(pid);
96
+ // If only the root process is in the tree, return it
97
+ if (tree.length === 1) {
98
+ return pid;
99
+ }
100
+ // Get process names for all PIDs in the tree
101
+ const processInfo = await getProcessInfo(tree);
102
+ // Filter out shell processes (cmd.exe, powershell.exe, etc.)
103
+ const workerProcesses = processInfo.filter((info) => !isShellProcess(info.name));
104
+ if (workerProcesses.length > 0) {
105
+ // Prefer the deepest (last) worker process in the tree
106
+ return workerProcesses[workerProcesses.length - 1].pid;
107
+ }
108
+ // If no worker processes found, return the last process in the tree
109
+ return tree[tree.length - 1];
110
+ }
111
+ catch (error) {
112
+ logger.debug(`Error finding working process for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
113
+ return pid;
114
+ }
115
+ }
116
+ /**
117
+ * Kills the entire process tree.
118
+ *
119
+ * @param pid - Root process ID
120
+ * @param signal - Signal to send (default: SIGTERM)
121
+ */
122
+ export async function killProcessTree(pid, signal = 'SIGTERM') {
123
+ if (process.platform !== 'win32') {
124
+ // On non-Windows, just kill the single process
125
+ try {
126
+ process.kill(pid, signal);
127
+ }
128
+ catch {
129
+ // Process might already be dead
130
+ }
131
+ return;
132
+ }
133
+ try {
134
+ const tree = await getProcessTree(pid);
135
+ // Kill processes in reverse order (children first, parent last)
136
+ for (let i = tree.length - 1; i >= 0; i--) {
137
+ const processId = tree[i];
138
+ try {
139
+ process.kill(processId, signal);
140
+ }
141
+ catch {
142
+ // Process might already be dead
143
+ }
144
+ }
145
+ }
146
+ catch (error) {
147
+ logger.debug(`Error killing process tree for PID ${pid}:`, error, LOG_MODULES.STDIO_TRANSPORT);
148
+ // Fallback: try to kill just the root process
149
+ try {
150
+ process.kill(pid, signal);
151
+ }
152
+ catch {
153
+ // Process might already be dead
154
+ }
155
+ }
156
+ }
157
+ // ==================== Internal Helper Functions ====================
158
+ /**
159
+ * Checks if a single process is running.
160
+ *
161
+ * @param pid - Process ID
162
+ * @returns True if process is running
163
+ */
164
+ function isProcessRunning(pid) {
165
+ try {
166
+ process.kill(pid, 0);
167
+ return true;
168
+ }
169
+ catch {
170
+ return false;
171
+ }
172
+ }
173
+ /**
174
+ * Executes a PowerShell command and returns the output.
175
+ *
176
+ * @param command - PowerShell command
177
+ * @returns Command output
178
+ */
179
+ async function executePowerShellCommand(command) {
180
+ return new Promise((resolve, reject) => {
181
+ const ps = spawn('powershell.exe', ['-Command', command], {
182
+ windowsHide: true,
183
+ stdio: ['ignore', 'pipe', 'pipe']
184
+ });
185
+ let stdout = '';
186
+ let stderr = '';
187
+ ps.stdout?.on('data', (data) => {
188
+ stdout += data.toString();
189
+ });
190
+ ps.stderr?.on('data', (data) => {
191
+ stderr += data.toString();
192
+ });
193
+ ps.on('close', (code) => {
194
+ if (code === 0) {
195
+ resolve(stdout.trim());
196
+ }
197
+ else {
198
+ reject(new Error(`PowerShell command failed: ${stderr || stdout}`));
199
+ }
200
+ });
201
+ ps.on('error', (error) => {
202
+ reject(error);
203
+ });
204
+ });
205
+ }
206
+ /**
207
+ * Parses a list of PIDs from command output.
208
+ *
209
+ * @param output - Command output
210
+ * * @returns Array of PIDs
211
+ */
212
+ function parsePidList(output) {
213
+ const lines = output
214
+ .split('\n')
215
+ .map((line) => line.trim())
216
+ .filter((line) => line.length > 0);
217
+ const pids = [];
218
+ for (const line of lines) {
219
+ const pid = parseInt(line, 10);
220
+ if (!isNaN(pid) && pid > 0) {
221
+ pids.push(pid);
222
+ }
223
+ }
224
+ return pids;
225
+ }
226
+ /**
227
+ * Gets process information for multiple PIDs.
228
+ *
229
+ * @param pids - Array of process IDs
230
+ * @returns Array of process info objects
231
+ */
232
+ async function getProcessInfo(pids) {
233
+ if (pids.length === 0) {
234
+ return [];
235
+ }
236
+ const result = await executePowerShellCommand(`Get-CimInstance Win32_Process | Where-Object { ${pids.map((pid) => `$_.ProcessId -eq ${pid}`).join(' -or ')} } | Select-Object ProcessId, Name | ConvertTo-Csv -NoTypeInformation`);
237
+ return parseProcessInfoCsv(result);
238
+ }
239
+ /**
240
+ * Parses process info from CSV output.
241
+ *
242
+ * @param csvOutput - CSV output from PowerShell
243
+ * @ *returns Array of process info
244
+ */
245
+ function parseProcessInfoCsv(csvOutput) {
246
+ const lines = csvOutput
247
+ .split('\n')
248
+ .map((line) => line.trim())
249
+ .filter((line) => line.length > 0);
250
+ if (lines.length < 2) {
251
+ return [];
252
+ }
253
+ const info = [];
254
+ // Skip header line
255
+ for (let i = 1; i < lines.length; i++) {
256
+ const parts = lines[i].split(',').map((p) => p.trim().replace(/^"|"$/g, ''));
257
+ if (parts.length >= 2) {
258
+ const pid = parseInt(parts[0], 10);
259
+ if (!isNaN(pid) && pid > 0) {
260
+ info.push({
261
+ pid,
262
+ name: parts[1].toLowerCase()
263
+ });
264
+ }
265
+ }
266
+ }
267
+ return info;
268
+ }
269
+ /**
270
+ * Checks if a process name is a shell process.
271
+ *
272
+ * @param processName - Process name (should be lowercase)
273
+ * @returns True if it's a shell process
274
+ */
275
+ function isShellProcess(processName) {
276
+ const shellProcesses = [
277
+ 'cmd.exe',
278
+ 'powershell.exe',
279
+ 'pwsh.exe',
280
+ 'command.com',
281
+ 'sh.exe',
282
+ 'bash.exe'
283
+ ];
284
+ return shellProcesses.includes(processName.toLowerCase());
285
+ }
@@ -50,22 +50,4 @@ export declare const requestContext: AsyncLocalStorage<SessionContext>;
50
50
  * ```
51
51
  */
52
52
  export declare function getSessionContext(): SessionContext | undefined;
53
- /**
54
- * Retrieves the current request's working directory (cwd).
55
- *
56
- * This is a convenience function that extracts the cwd property from the
57
- * current request's session context. It's commonly used in file operations
58
- * that need to respect the session's current working directory.
59
- *
60
- * @returns {string | undefined} The current request's working directory, or undefined if not available
61
- *
62
- * @example
63
- * ```typescript
64
- * const cwd = getSessionCwd();
65
- * if (cwd) {
66
- * const fullPath = path.join(cwd, relativePath);
67
- * }
68
- * ```
69
- */
70
- export declare function getSessionCwd(): string | undefined;
71
53
  //# sourceMappingURL=request-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/utils/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAE7E;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD"}
1
+ {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/utils/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAE7E;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D"}
@@ -51,23 +51,3 @@ export const requestContext = new AsyncLocalStorage();
51
51
  export function getSessionContext() {
52
52
  return requestContext.getStore();
53
53
  }
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;
73
- }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Object key sorting utilities for consistent configuration.
3
+ */
4
+ /**
5
+ * Sorts object keys alphabetically using localeCompare.
6
+ * Returns a new object with sorted keys, preserving the original object.
7
+ *
8
+ * @param obj - Object to sort
9
+ * @returns New object with sorted keys
10
+ */
11
+ export declare function sortObjectKeys<T extends Record<string, unknown>>(obj: T): T;
12
+ /**
13
+ * Sorts object keys alphabetically, case-insensitive.
14
+ * Returns a new object with sorted keys, preserving the original object and original key case.
15
+ *
16
+ * @param obj - Object to sort
17
+ * @returns New object with sorted keys (case-insensitive sort)
18
+ */
19
+ export declare function sortObjectKeysCaseInsensitive<T extends Record<string, unknown>>(obj: T): T;
20
+ /**
21
+ * Recursively sorts all object keys in a nested structure.
22
+ * Returns a new object with all nested keys sorted, preserving the original object.
23
+ *
24
+ * @param obj - Object to sort recursively
25
+ * @returns New object with all nested keys sorted
26
+ */
27
+ export declare function sortObjectKeysDeep<T>(obj: T): T;
28
+ /**
29
+ * Sorts env and headers objects in a server configuration.
30
+ * This is a convenience function for server template/instance configurations.
31
+ * Also normalizes URL fields by removing trailing slashes.
32
+ *
33
+ * @param config - Server configuration object with optional env and headers
34
+ * @returns New object with sorted env and headers keys and normalized URLs
35
+ */
36
+ export declare function sortServerConfigEnvHeaders<T extends {
37
+ env?: Record<string, string>;
38
+ headers?: Record<string, string>;
39
+ }>(config: T): T;
40
+ //# sourceMappingURL=sort-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/sort-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoDH;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAW3E;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAa1F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAmB/C;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,CAAC,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAC5E,MAAM,EAAE,CAAC,GAAG,CAAC,CAcd"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Object key sorting utilities for consistent configuration.
3
+ */
4
+ /**
5
+ * Normalizes a URL string by removing trailing slashes.
6
+ *
7
+ * @param url - The URL to normalize
8
+ * @returns Normalized URL
9
+ */
10
+ function normalizeUrl(url) {
11
+ return url.replace(/\/+$/, '');
12
+ }
13
+ /**
14
+ * Normalizes URL fields in a configuration object.
15
+ * Currently handles:
16
+ * - url fields at any level
17
+ * - proxy.url fields
18
+ *
19
+ * @param obj - Object to normalize
20
+ * @returns New object with normalized URLs
21
+ */
22
+ function normalizeConfigUrls(obj) {
23
+ if (!obj) {
24
+ return obj;
25
+ }
26
+ if (Array.isArray(obj)) {
27
+ return obj.map((item) => normalizeConfigUrls(item));
28
+ }
29
+ if (typeof obj === 'object') {
30
+ const result = {};
31
+ for (const [key, value] of Object.entries(obj)) {
32
+ if (key === 'url' && typeof value === 'string') {
33
+ result[key] = normalizeUrl(value);
34
+ }
35
+ else if (key === 'proxy' && typeof value === 'object' && value !== null) {
36
+ const proxy = value;
37
+ if (typeof proxy.url === 'string') {
38
+ result[key] = { ...proxy, url: normalizeUrl(proxy.url) };
39
+ }
40
+ else {
41
+ result[key] = normalizeConfigUrls(value);
42
+ }
43
+ }
44
+ else {
45
+ result[key] = normalizeConfigUrls(value);
46
+ }
47
+ }
48
+ return result;
49
+ }
50
+ return obj;
51
+ }
52
+ /**
53
+ * Sorts object keys alphabetically using localeCompare.
54
+ * Returns a new object with sorted keys, preserving the original object.
55
+ *
56
+ * @param obj - Object to sort
57
+ * @returns New object with sorted keys
58
+ */
59
+ export function sortObjectKeys(obj) {
60
+ if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
61
+ return obj;
62
+ }
63
+ const sortedObj = {};
64
+ const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b));
65
+ for (const key of keys) {
66
+ sortedObj[key] = obj[key];
67
+ }
68
+ return sortedObj;
69
+ }
70
+ /**
71
+ * Sorts object keys alphabetically, case-insensitive.
72
+ * Returns a new object with sorted keys, preserving the original object and original key case.
73
+ *
74
+ * @param obj - Object to sort
75
+ * @returns New object with sorted keys (case-insensitive sort)
76
+ */
77
+ export function sortObjectKeysCaseInsensitive(obj) {
78
+ if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
79
+ return obj;
80
+ }
81
+ const sortedObj = {};
82
+ const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));
83
+ for (const key of keys) {
84
+ sortedObj[key] = obj[key];
85
+ }
86
+ return sortedObj;
87
+ }
88
+ /**
89
+ * Recursively sorts all object keys in a nested structure.
90
+ * Returns a new object with all nested keys sorted, preserving the original object.
91
+ *
92
+ * @param obj - Object to sort recursively
93
+ * @returns New object with all nested keys sorted
94
+ */
95
+ export function sortObjectKeysDeep(obj) {
96
+ if (!obj) {
97
+ return obj;
98
+ }
99
+ if (Array.isArray(obj)) {
100
+ return obj.map((item) => sortObjectKeysDeep(item));
101
+ }
102
+ if (typeof obj === 'object') {
103
+ const sortedObj = {};
104
+ const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b));
105
+ for (const key of keys) {
106
+ sortedObj[key] = sortObjectKeysDeep(obj[key]);
107
+ }
108
+ return sortedObj;
109
+ }
110
+ return obj;
111
+ }
112
+ /**
113
+ * Sorts env and headers objects in a server configuration.
114
+ * This is a convenience function for server template/instance configurations.
115
+ * Also normalizes URL fields by removing trailing slashes.
116
+ *
117
+ * @param config - Server configuration object with optional env and headers
118
+ * @returns New object with sorted env and headers keys and normalized URLs
119
+ */
120
+ export function sortServerConfigEnvHeaders(config) {
121
+ // First normalize URLs
122
+ const normalized = normalizeConfigUrls(config);
123
+ const result = { ...normalized };
124
+ if (result.env) {
125
+ result.env = sortObjectKeysCaseInsensitive(result.env);
126
+ }
127
+ if (result.headers) {
128
+ result.headers = sortObjectKeysCaseInsensitive(result.headers);
129
+ }
130
+ return result;
131
+ }