@hashgraphonline/conversational-agent 0.2.216 → 0.2.218

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 (312) hide show
  1. package/cli/readme.md +181 -0
  2. package/dist/cjs/index.cjs +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/index.d.ts +1 -0
  5. package/dist/cjs/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
  6. package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
  7. package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
  8. package/dist/cjs/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
  9. package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
  10. package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
  11. package/dist/cjs/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
  12. package/dist/cjs/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
  13. package/dist/cjs/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
  14. package/dist/cjs/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
  15. package/dist/cjs/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
  16. package/dist/cjs/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
  17. package/dist/cjs/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
  18. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
  19. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
  20. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
  21. package/dist/cjs/plugins/community/swarm/config.d.ts +6 -0
  22. package/dist/cjs/plugins/community/swarm/constants.d.ts +8 -0
  23. package/dist/cjs/plugins/community/swarm/index.d.ts +2 -0
  24. package/dist/cjs/plugins/community/swarm/model.d.ts +23 -0
  25. package/dist/cjs/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
  26. package/dist/cjs/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
  27. package/dist/cjs/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
  28. package/dist/cjs/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
  29. package/dist/cjs/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
  30. package/dist/cjs/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
  31. package/dist/cjs/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
  32. package/dist/cjs/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
  33. package/dist/cjs/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
  34. package/dist/cjs/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
  35. package/dist/cjs/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
  36. package/dist/cjs/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
  37. package/dist/cjs/plugins/community/swarm/utils.d.ts +22 -0
  38. package/dist/cjs/plugins/index.d.ts +1 -0
  39. package/dist/esm/index.js +33 -31
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/index10.js +13 -677
  42. package/dist/esm/index10.js.map +1 -1
  43. package/dist/esm/index11.js +601 -234
  44. package/dist/esm/index11.js.map +1 -1
  45. package/dist/esm/index12.js +296 -136
  46. package/dist/esm/index12.js.map +1 -1
  47. package/dist/esm/index13.js +127 -235
  48. package/dist/esm/index13.js.map +1 -1
  49. package/dist/esm/index14.js +247 -84
  50. package/dist/esm/index14.js.map +1 -1
  51. package/dist/esm/index15.js +81 -159
  52. package/dist/esm/index15.js.map +1 -1
  53. package/dist/esm/index16.js +155 -229
  54. package/dist/esm/index16.js.map +1 -1
  55. package/dist/esm/index17.js +238 -140
  56. package/dist/esm/index17.js.map +1 -1
  57. package/dist/esm/index18.js +139 -493
  58. package/dist/esm/index18.js.map +1 -1
  59. package/dist/esm/index19.js +479 -91
  60. package/dist/esm/index19.js.map +1 -1
  61. package/dist/esm/index20.js +88 -147
  62. package/dist/esm/index20.js.map +1 -1
  63. package/dist/esm/index21.js +127 -666
  64. package/dist/esm/index21.js.map +1 -1
  65. package/dist/esm/index22.js +698 -44
  66. package/dist/esm/index22.js.map +1 -1
  67. package/dist/esm/index23.js +45 -304
  68. package/dist/esm/index23.js.map +1 -1
  69. package/dist/esm/index24.js +303 -153
  70. package/dist/esm/index24.js.map +1 -1
  71. package/dist/esm/index25.js +150 -117
  72. package/dist/esm/index25.js.map +1 -1
  73. package/dist/esm/index26.js +154 -18
  74. package/dist/esm/index26.js.map +1 -1
  75. package/dist/esm/index27.js +18 -22
  76. package/dist/esm/index27.js.map +1 -1
  77. package/dist/esm/index28.js +15 -74
  78. package/dist/esm/index28.js.map +1 -1
  79. package/dist/esm/index29.js +70 -295
  80. package/dist/esm/index29.js.map +1 -1
  81. package/dist/esm/index30.js +279 -100
  82. package/dist/esm/index30.js.map +1 -1
  83. package/dist/esm/index31.js +86 -922
  84. package/dist/esm/index31.js.map +1 -1
  85. package/dist/esm/index32.js +904 -189
  86. package/dist/esm/index32.js.map +1 -1
  87. package/dist/esm/index33.js +185 -1169
  88. package/dist/esm/index33.js.map +1 -1
  89. package/dist/esm/index34.js +1218 -112
  90. package/dist/esm/index34.js.map +1 -1
  91. package/dist/esm/index35.js +111 -99
  92. package/dist/esm/index35.js.map +1 -1
  93. package/dist/esm/index36.js +113 -8
  94. package/dist/esm/index36.js.map +1 -1
  95. package/dist/esm/index37.js +8 -45
  96. package/dist/esm/index37.js.map +1 -1
  97. package/dist/esm/index38.js +41 -102
  98. package/dist/esm/index38.js.map +1 -1
  99. package/dist/esm/index39.js +96 -55
  100. package/dist/esm/index39.js.map +1 -1
  101. package/dist/esm/index4.js +1 -1
  102. package/dist/esm/index40.js +58 -71
  103. package/dist/esm/index40.js.map +1 -1
  104. package/dist/esm/index41.js +79 -21
  105. package/dist/esm/index41.js.map +1 -1
  106. package/dist/esm/index42.js +21 -5
  107. package/dist/esm/index42.js.map +1 -1
  108. package/dist/esm/index43.js +26 -11
  109. package/dist/esm/index43.js.map +1 -1
  110. package/dist/esm/index44.js +12 -322
  111. package/dist/esm/index44.js.map +1 -1
  112. package/dist/esm/index45.js +66 -173
  113. package/dist/esm/index45.js.map +1 -1
  114. package/dist/esm/index46.js +69 -24
  115. package/dist/esm/index46.js.map +1 -1
  116. package/dist/esm/index47.js +47 -88
  117. package/dist/esm/index47.js.map +1 -1
  118. package/dist/esm/index48.js +100 -7
  119. package/dist/esm/index48.js.map +1 -1
  120. package/dist/esm/index49.js +79 -0
  121. package/dist/esm/index49.js.map +1 -0
  122. package/dist/esm/index5.js +2 -2
  123. package/dist/esm/index50.js +75 -0
  124. package/dist/esm/index50.js.map +1 -0
  125. package/dist/esm/index51.js +124 -0
  126. package/dist/esm/index51.js.map +1 -0
  127. package/dist/esm/index52.js +58 -0
  128. package/dist/esm/index52.js.map +1 -0
  129. package/dist/esm/index53.js +83 -0
  130. package/dist/esm/index53.js.map +1 -0
  131. package/dist/esm/index54.js +100 -0
  132. package/dist/esm/index54.js.map +1 -0
  133. package/dist/esm/index55.js +118 -0
  134. package/dist/esm/index55.js.map +1 -0
  135. package/dist/esm/index56.js +108 -0
  136. package/dist/esm/index56.js.map +1 -0
  137. package/dist/esm/index57.js +8 -0
  138. package/dist/esm/index57.js.map +1 -0
  139. package/dist/esm/index58.js +325 -0
  140. package/dist/esm/index58.js.map +1 -0
  141. package/dist/esm/index59.js +187 -0
  142. package/dist/esm/index59.js.map +1 -0
  143. package/dist/esm/index6.js +132 -833
  144. package/dist/esm/index6.js.map +1 -1
  145. package/dist/esm/index60.js +10 -0
  146. package/dist/esm/index60.js.map +1 -0
  147. package/dist/esm/index61.js +98 -0
  148. package/dist/esm/index61.js.map +1 -0
  149. package/dist/esm/index62.js +131 -0
  150. package/dist/esm/index62.js.map +1 -0
  151. package/dist/esm/index63.js +19 -0
  152. package/dist/esm/index63.js.map +1 -0
  153. package/dist/esm/index7.js +826 -75
  154. package/dist/esm/index7.js.map +1 -1
  155. package/dist/esm/index8.js +91 -13
  156. package/dist/esm/index8.js.map +1 -1
  157. package/dist/esm/index9.js +13 -17
  158. package/dist/esm/index9.js.map +1 -1
  159. package/dist/types/index.d.ts +1 -0
  160. package/dist/types/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
  161. package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
  162. package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
  163. package/dist/types/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
  164. package/dist/types/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
  165. package/dist/types/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
  166. package/dist/types/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
  167. package/dist/types/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
  168. package/dist/types/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
  169. package/dist/types/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
  170. package/dist/types/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
  171. package/dist/types/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
  172. package/dist/types/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
  173. package/dist/types/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
  174. package/dist/types/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
  175. package/dist/types/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
  176. package/dist/types/plugins/community/swarm/config.d.ts +6 -0
  177. package/dist/types/plugins/community/swarm/constants.d.ts +8 -0
  178. package/dist/types/plugins/community/swarm/index.d.ts +2 -0
  179. package/dist/types/plugins/community/swarm/model.d.ts +23 -0
  180. package/dist/types/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
  181. package/dist/types/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
  182. package/dist/types/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
  183. package/dist/types/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
  184. package/dist/types/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
  185. package/dist/types/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
  186. package/dist/types/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
  187. package/dist/types/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
  188. package/dist/types/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
  189. package/dist/types/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
  190. package/dist/types/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
  191. package/dist/types/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
  192. package/dist/types/plugins/community/swarm/utils.d.ts +22 -0
  193. package/dist/types/plugins/index.d.ts +1 -0
  194. package/package.json +37 -27
  195. package/src/index.ts +1 -0
  196. package/src/plugins/community/swarm/README.md +279 -0
  197. package/src/plugins/community/swarm/SwarmPlugin.ts +178 -0
  198. package/src/plugins/community/swarm/__tests__/SwarmPlugin.mocks.ts +105 -0
  199. package/src/plugins/community/swarm/__tests__/SwarmPlugin.test.ts +93 -0
  200. package/src/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.ts +152 -0
  201. package/src/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.ts +93 -0
  202. package/src/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.ts +163 -0
  203. package/src/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.ts +132 -0
  204. package/src/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.ts +83 -0
  205. package/src/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.ts +219 -0
  206. package/src/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.ts +169 -0
  207. package/src/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.ts +133 -0
  208. package/src/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.ts +67 -0
  209. package/src/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.ts +148 -0
  210. package/src/plugins/community/swarm/__tests__/tools/UploadDataTool.test.ts +125 -0
  211. package/src/plugins/community/swarm/__tests__/tools/UploadFileTool.test.ts +194 -0
  212. package/src/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.ts +118 -0
  213. package/src/plugins/community/swarm/config.ts +6 -0
  214. package/src/plugins/community/swarm/constants.ts +12 -0
  215. package/src/plugins/community/swarm/index.ts +2 -0
  216. package/src/plugins/community/swarm/model.ts +23 -0
  217. package/src/plugins/community/swarm/tools/CreatePostageStampTool.ts +137 -0
  218. package/src/plugins/community/swarm/tools/DownloadDataTool.ts +79 -0
  219. package/src/plugins/community/swarm/tools/DownloadFilesTool.ts +155 -0
  220. package/src/plugins/community/swarm/tools/ExtendPostageStampTool.ts +112 -0
  221. package/src/plugins/community/swarm/tools/GetPostageStampTool.ts +92 -0
  222. package/src/plugins/community/swarm/tools/ListPostageStampsTool.ts +124 -0
  223. package/src/plugins/community/swarm/tools/QueryUploadProgressTool.ts +109 -0
  224. package/src/plugins/community/swarm/tools/ReadFeedTool.ts +110 -0
  225. package/src/plugins/community/swarm/tools/UpdateFeedTool.ts +149 -0
  226. package/src/plugins/community/swarm/tools/UploadDataTool.ts +109 -0
  227. package/src/plugins/community/swarm/tools/UploadFileTool.ts +163 -0
  228. package/src/plugins/community/swarm/tools/UploadFolderTool.ts +150 -0
  229. package/src/plugins/community/swarm/utils.ts +172 -0
  230. package/src/plugins/index.ts +1 -0
  231. package/cli/dist/CLIApp.d.ts +0 -11
  232. package/cli/dist/CLIApp.d.ts.map +0 -1
  233. package/cli/dist/CLIApp.js +0 -128
  234. package/cli/dist/CLIApp.js.map +0 -1
  235. package/cli/dist/LocalConversationalAgent.d.ts +0 -37
  236. package/cli/dist/LocalConversationalAgent.js +0 -58
  237. package/cli/dist/app.d.ts +0 -18
  238. package/cli/dist/app.d.ts.map +0 -1
  239. package/cli/dist/app.js +0 -14
  240. package/cli/dist/app.js.map +0 -1
  241. package/cli/dist/cli.d.ts +0 -3
  242. package/cli/dist/cli.d.ts.map +0 -1
  243. package/cli/dist/cli.js +0 -87
  244. package/cli/dist/cli.js.map +0 -1
  245. package/cli/dist/components/AppContainer.d.ts +0 -16
  246. package/cli/dist/components/AppContainer.js +0 -24
  247. package/cli/dist/components/AppScreens.d.ts +0 -2
  248. package/cli/dist/components/AppScreens.js +0 -259
  249. package/cli/dist/components/ChatScreen.d.ts +0 -21
  250. package/cli/dist/components/ChatScreen.d.ts.map +0 -1
  251. package/cli/dist/components/ChatScreen.js +0 -40
  252. package/cli/dist/components/ChatScreen.js.map +0 -1
  253. package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
  254. package/cli/dist/components/DebugLoadingScreen.js +0 -31
  255. package/cli/dist/components/LoadingScreen.d.ts +0 -3
  256. package/cli/dist/components/LoadingScreen.d.ts.map +0 -1
  257. package/cli/dist/components/LoadingScreen.js +0 -17
  258. package/cli/dist/components/LoadingScreen.js.map +0 -1
  259. package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
  260. package/cli/dist/components/LoadingScreenDebug.js +0 -27
  261. package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
  262. package/cli/dist/components/MCPConfigScreen.d.ts.map +0 -1
  263. package/cli/dist/components/MCPConfigScreen.js +0 -186
  264. package/cli/dist/components/MCPConfigScreen.js.map +0 -1
  265. package/cli/dist/components/ScreenRouter.d.ts +0 -13
  266. package/cli/dist/components/ScreenRouter.d.ts.map +0 -1
  267. package/cli/dist/components/ScreenRouter.js +0 -23
  268. package/cli/dist/components/ScreenRouter.js.map +0 -1
  269. package/cli/dist/components/SetupScreen.d.ts +0 -16
  270. package/cli/dist/components/SetupScreen.d.ts.map +0 -1
  271. package/cli/dist/components/SetupScreen.js +0 -67
  272. package/cli/dist/components/SetupScreen.js.map +0 -1
  273. package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
  274. package/cli/dist/components/SingleLoadingScreen.js +0 -27
  275. package/cli/dist/components/StatusBadge.d.ts +0 -10
  276. package/cli/dist/components/StatusBadge.d.ts.map +0 -1
  277. package/cli/dist/components/StatusBadge.js +0 -24
  278. package/cli/dist/components/StatusBadge.js.map +0 -1
  279. package/cli/dist/components/TerminalWindow.d.ts +0 -9
  280. package/cli/dist/components/TerminalWindow.d.ts.map +0 -1
  281. package/cli/dist/components/TerminalWindow.js +0 -19
  282. package/cli/dist/components/TerminalWindow.js.map +0 -1
  283. package/cli/dist/components/WelcomeScreen.d.ts +0 -12
  284. package/cli/dist/components/WelcomeScreen.d.ts.map +0 -1
  285. package/cli/dist/components/WelcomeScreen.js +0 -47
  286. package/cli/dist/components/WelcomeScreen.js.map +0 -1
  287. package/cli/dist/context/AppContext.d.ts +0 -68
  288. package/cli/dist/context/AppContext.js +0 -363
  289. package/cli/dist/headless-runner.d.ts +0 -17
  290. package/cli/dist/headless-runner.d.ts.map +0 -1
  291. package/cli/dist/headless-runner.js +0 -128
  292. package/cli/dist/headless-runner.js.map +0 -1
  293. package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
  294. package/cli/dist/hooks/useInitializeAgent.d.ts.map +0 -1
  295. package/cli/dist/hooks/useInitializeAgent.js +0 -29
  296. package/cli/dist/hooks/useInitializeAgent.js.map +0 -1
  297. package/cli/dist/hooks/useStableState.d.ts +0 -38
  298. package/cli/dist/hooks/useStableState.d.ts.map +0 -1
  299. package/cli/dist/hooks/useStableState.js +0 -69
  300. package/cli/dist/hooks/useStableState.js.map +0 -1
  301. package/cli/dist/managers/AgentManager.d.ts +0 -58
  302. package/cli/dist/managers/AgentManager.d.ts.map +0 -1
  303. package/cli/dist/managers/AgentManager.js +0 -121
  304. package/cli/dist/managers/AgentManager.js.map +0 -1
  305. package/cli/dist/managers/ConfigManager.d.ts +0 -54
  306. package/cli/dist/managers/ConfigManager.d.ts.map +0 -1
  307. package/cli/dist/managers/ConfigManager.js +0 -188
  308. package/cli/dist/managers/ConfigManager.js.map +0 -1
  309. package/cli/dist/types.d.ts +0 -52
  310. package/cli/dist/types.d.ts.map +0 -1
  311. package/cli/dist/types.js +0 -34
  312. package/cli/dist/types.js.map +0 -1
@@ -1,256 +1,182 @@
1
- class MCPContentProcessor {
2
- constructor(contentStorage, logger) {
3
- this.contentStorage = contentStorage;
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { MCPContentProcessor } from "./index17.js";
4
+ class MCPClientManager {
5
+ constructor(logger, contentStorage) {
6
+ this.clients = /* @__PURE__ */ new Map();
7
+ this.tools = /* @__PURE__ */ new Map();
4
8
  this.logger = logger;
9
+ if (contentStorage) {
10
+ this.contentProcessor = new MCPContentProcessor(contentStorage, logger);
11
+ }
5
12
  }
6
- analyzeResponse(response) {
7
- const contents = [];
8
- let totalSize = 0;
9
- this.extractContentFromResponse(response, contents);
10
- totalSize = contents.reduce((sum, content) => sum + content.sizeBytes, 0);
11
- const largestContentSize = contents.reduce(
12
- (max, content) => Math.max(max, content.sizeBytes),
13
- 0
14
- );
15
- const shouldProcess = contents.some(
16
- (content) => this.contentStorage.shouldUseReference(
17
- typeof content.content === "string" ? content.content : JSON.stringify(content.content)
18
- )
19
- );
20
- return {
21
- shouldProcess,
22
- contents,
23
- totalSize,
24
- largestContentSize
25
- };
26
- }
27
- async processResponse(response, serverName, toolName) {
13
+ /**
14
+ * Connect to an MCP server and discover its tools
15
+ */
16
+ async connectServer(config) {
28
17
  try {
29
- const analysis = this.analyzeResponse(response);
30
- if (!analysis.shouldProcess) {
18
+ if (this.isServerConnected(config.name)) {
31
19
  return {
32
- content: response,
33
- wasProcessed: false
20
+ serverName: config.name,
21
+ connected: false,
22
+ error: `Server ${config.name} is already connected`,
23
+ tools: []
34
24
  };
35
25
  }
36
- const processedResponse = await this.createReferencedResponse(
37
- response,
38
- analysis,
39
- serverName,
40
- toolName
41
- );
42
- return processedResponse;
26
+ if (config.transport && config.transport !== "stdio") {
27
+ throw new Error(`Transport ${config.transport} not yet supported`);
28
+ }
29
+ const transport = new StdioClientTransport({
30
+ command: config.command,
31
+ args: config.args,
32
+ ...config.env && { env: config.env }
33
+ });
34
+ const client = new Client({
35
+ name: `conversational-agent-${config.name}`,
36
+ version: "1.0.0"
37
+ }, {
38
+ capabilities: {}
39
+ });
40
+ await client.connect(transport);
41
+ this.clients.set(config.name, client);
42
+ const toolsResponse = await client.listTools();
43
+ const toolsWithServer = toolsResponse.tools.map((tool) => {
44
+ const t = tool;
45
+ const { description, ...rest } = t;
46
+ const base = description !== void 0 && typeof description === "string" ? { ...rest, description } : { ...rest };
47
+ return {
48
+ ...base,
49
+ serverName: config.name
50
+ };
51
+ });
52
+ this.tools.set(config.name, toolsWithServer);
53
+ this.logger.info(`Connected to MCP server ${config.name} with ${toolsWithServer.length} tools`);
54
+ return {
55
+ serverName: config.name,
56
+ connected: true,
57
+ tools: toolsWithServer
58
+ };
43
59
  } catch (error) {
44
- this.logger.error("Error processing MCP response:", error);
60
+ this.logger.error(`Failed to connect to MCP server ${config.name}:`, error);
45
61
  return {
46
- content: response,
47
- wasProcessed: false,
48
- errors: [
49
- error instanceof Error ? error.message : "Unknown processing error"
50
- ]
62
+ serverName: config.name,
63
+ connected: false,
64
+ error: error instanceof Error ? error.message : "Unknown error",
65
+ tools: []
51
66
  };
52
67
  }
53
68
  }
54
- extractContentFromResponse(obj, contents) {
55
- if (obj === null || obj === void 0) {
56
- return;
57
- }
58
- if (Array.isArray(obj)) {
59
- obj.forEach((item) => this.extractContentFromResponse(item, contents));
60
- return;
61
- }
62
- if (typeof obj === "object") {
63
- const record = obj;
64
- if (record.type === "text" && typeof record.text === "string") {
65
- contents.push({
66
- content: record.text,
67
- type: "text",
68
- sizeBytes: Buffer.byteLength(record.text, "utf8"),
69
- mimeType: this.detectMimeType(record.text)
70
- });
71
- return;
72
- }
73
- if (record.type === "image" && typeof record.data === "string") {
74
- contents.push({
75
- content: record.data,
76
- type: "image",
77
- sizeBytes: Math.ceil(record.data.length * 0.75),
78
- mimeType: record.mimeType || "image/jpeg"
79
- });
80
- return;
81
- }
82
- if (record.type === "resource" && record.resource) {
83
- const resourceStr = JSON.stringify(record.resource);
84
- contents.push({
85
- content: resourceStr,
86
- type: "resource",
87
- sizeBytes: Buffer.byteLength(resourceStr, "utf8"),
88
- mimeType: "application/json"
89
- });
90
- return;
91
- }
92
- Object.values(record).forEach(
93
- (value) => this.extractContentFromResponse(value, contents)
94
- );
95
- return;
96
- }
97
- if (typeof obj === "string") {
98
- if (obj.length > 1e3) {
99
- contents.push({
100
- content: obj,
101
- type: "text",
102
- sizeBytes: Buffer.byteLength(obj, "utf8"),
103
- mimeType: this.detectMimeType(obj)
104
- });
105
- }
106
- }
107
- }
108
- async createReferencedResponse(originalResponse, analysis, serverName, toolName) {
109
- const processedResponse = this.deepClone(originalResponse);
110
- const errors = [];
111
- let referenceCreated = false;
112
- let totalReferenceSize = 0;
113
- for (const contentInfo of analysis.contents) {
114
- if (this.contentStorage.shouldUseReference(
115
- typeof contentInfo.content === "string" ? contentInfo.content : JSON.stringify(contentInfo.content)
116
- )) {
117
- try {
118
- const contentBuffer = Buffer.from(
119
- typeof contentInfo.content === "string" ? contentInfo.content : JSON.stringify(contentInfo.content),
120
- "utf8"
121
- );
122
- const contentType = this.mapMimeTypeToContentType(
123
- contentInfo.mimeType
124
- );
125
- const metadata = {
126
- contentType,
127
- source: "mcp_tool",
128
- mcpToolName: `${serverName}::${toolName}`,
129
- tags: ["mcp_response", serverName, toolName]
130
- };
131
- if (contentInfo.mimeType !== void 0) {
132
- metadata.mimeType = contentInfo.mimeType;
133
- }
134
- const reference = await this.contentStorage.storeContentIfLarge(
135
- contentBuffer,
136
- metadata
69
+ /**
70
+ * Execute a tool on a specific MCP server
71
+ */
72
+ async executeTool(serverName, toolName, args) {
73
+ const client = this.clients.get(serverName);
74
+ if (!client) {
75
+ throw new Error(`MCP server ${serverName} not connected`);
76
+ }
77
+ this.logger.debug(`Executing MCP tool ${toolName} on server ${serverName}`, args);
78
+ try {
79
+ const result = await client.callTool({
80
+ name: toolName,
81
+ arguments: args
82
+ });
83
+ if (this.contentProcessor) {
84
+ const processed = await this.contentProcessor.processResponse(result, serverName, toolName);
85
+ if (processed.wasProcessed) {
86
+ this.logger.debug(
87
+ `Processed MCP response from ${serverName}::${toolName}`,
88
+ {
89
+ referenceCreated: processed.referenceCreated,
90
+ originalSize: processed.originalSize,
91
+ errors: processed.errors
92
+ }
137
93
  );
138
- if (reference) {
139
- this.replaceContentInResponse(
140
- processedResponse,
141
- contentInfo.content,
142
- this.createLightweightReference(reference)
143
- );
144
- referenceCreated = true;
145
- totalReferenceSize += contentBuffer.length;
94
+ if (processed.errors && processed.errors.length > 0) {
95
+ this.logger.warn(`Content processing warnings for ${serverName}::${toolName}:`, processed.errors);
146
96
  }
147
- } catch (error) {
148
- errors.push(
149
- `Failed to create reference: ${error instanceof Error ? error.message : "Unknown error"}`
150
- );
151
97
  }
98
+ return processed.content;
152
99
  }
100
+ return result;
101
+ } catch (error) {
102
+ this.logger.error(`Error executing MCP tool ${toolName}:`, error);
103
+ throw error;
153
104
  }
154
- const result = {
155
- content: processedResponse,
156
- wasProcessed: true,
157
- referenceCreated,
158
- originalSize: totalReferenceSize
159
- };
160
- if (errors.length > 0) {
161
- result.errors = errors;
162
- }
163
- return result;
164
105
  }
165
- createLightweightReference(reference) {
166
- return {
167
- type: "content_reference",
168
- referenceId: reference.referenceId,
169
- preview: reference.preview,
170
- size: reference.metadata.sizeBytes,
171
- contentType: reference.metadata.contentType,
172
- format: "ref://{id}",
173
- _isReference: true
174
- };
175
- }
176
- replaceContentInResponse(obj, oldContent, newContent) {
177
- if (obj === null || obj === void 0) {
178
- return;
179
- }
180
- if (Array.isArray(obj)) {
181
- for (let i = 0; i < obj.length; i++) {
182
- if (obj[i] === oldContent) {
183
- obj[i] = newContent;
184
- } else {
185
- this.replaceContentInResponse(obj[i], oldContent, newContent);
186
- }
187
- }
188
- return;
189
- }
190
- if (typeof obj === "object") {
191
- const record = obj;
192
- if (record.type === "text" && record.text === oldContent) {
193
- for (const key of Object.keys(record)) {
194
- delete record[key];
195
- }
196
- if (typeof newContent === "object" && newContent !== null) {
197
- const newContentRecord = newContent;
198
- for (const key of Object.keys(newContentRecord)) {
199
- record[key] = newContentRecord[key];
200
- }
201
- }
202
- return;
203
- }
204
- for (const key in record) {
205
- if (record[key] === oldContent) {
206
- record[key] = newContent;
207
- } else {
208
- this.replaceContentInResponse(record[key], oldContent, newContent);
209
- }
106
+ /**
107
+ * Disconnect all MCP servers
108
+ */
109
+ async disconnectAll() {
110
+ for (const [name, client] of this.clients) {
111
+ try {
112
+ await client.close();
113
+ this.logger.info(`Disconnected from MCP server ${name}`);
114
+ } catch (error) {
115
+ this.logger.error(`Error disconnecting MCP server ${name}:`, error);
210
116
  }
211
117
  }
118
+ this.clients.clear();
119
+ this.tools.clear();
212
120
  }
213
- detectMimeType(content) {
214
- if (content.trim().startsWith("{") || content.trim().startsWith("[")) {
215
- return "application/json";
216
- }
217
- if (content.includes("<html>") || content.includes("<!DOCTYPE")) {
218
- return "text/html";
219
- }
220
- if (content.includes("# ") || content.includes("## ")) {
221
- return "text/markdown";
222
- }
223
- return "text/plain";
121
+ /**
122
+ * Get all discovered tools from all connected servers
123
+ */
124
+ getAllTools() {
125
+ const allTools = [];
126
+ for (const tools of this.tools.values()) {
127
+ allTools.push(...tools);
128
+ }
129
+ return allTools;
224
130
  }
225
- mapMimeTypeToContentType(mimeType) {
226
- if (!mimeType) return "text";
227
- if (mimeType.startsWith("text/plain")) return "text";
228
- if (mimeType === "application/json") return "json";
229
- if (mimeType === "text/html") return "html";
230
- if (mimeType === "text/markdown") return "markdown";
231
- if (mimeType.startsWith("text/")) return "text";
232
- return "binary";
131
+ /**
132
+ * Get tools from a specific server
133
+ */
134
+ getServerTools(serverName) {
135
+ return this.tools.get(serverName) || [];
233
136
  }
234
- deepClone(obj) {
235
- if (obj === null || typeof obj !== "object") {
236
- return obj;
237
- }
238
- if (obj instanceof Date) {
239
- return new Date(obj.getTime());
240
- }
241
- if (Array.isArray(obj)) {
242
- return obj.map((item) => this.deepClone(item));
243
- }
244
- const cloned = {};
245
- for (const key in obj) {
246
- if (obj.hasOwnProperty(key)) {
247
- cloned[key] = this.deepClone(obj[key]);
248
- }
249
- }
250
- return cloned;
137
+ /**
138
+ * Check if a server is connected
139
+ */
140
+ isServerConnected(serverName) {
141
+ return this.clients.has(serverName);
142
+ }
143
+ /**
144
+ * Get list of connected server names
145
+ */
146
+ getConnectedServers() {
147
+ return Array.from(this.clients.keys());
148
+ }
149
+ /**
150
+ * Enable content processing with content storage
151
+ */
152
+ enableContentProcessing(contentStorage) {
153
+ this.contentProcessor = new MCPContentProcessor(contentStorage, this.logger);
154
+ this.logger.info("Content processing enabled for MCP responses");
155
+ }
156
+ /**
157
+ * Disable content processing
158
+ */
159
+ disableContentProcessing() {
160
+ delete this.contentProcessor;
161
+ this.logger.info("Content processing disabled for MCP responses");
162
+ }
163
+ /**
164
+ * Check if content processing is enabled
165
+ */
166
+ isContentProcessingEnabled() {
167
+ return this.contentProcessor !== void 0;
168
+ }
169
+ /**
170
+ * Analyze a response without processing it (for testing/debugging)
171
+ */
172
+ analyzeResponseContent(response) {
173
+ if (!this.contentProcessor) {
174
+ throw new Error("Content processing is not enabled");
175
+ }
176
+ return this.contentProcessor.analyzeResponse(response);
251
177
  }
252
178
  }
253
179
  export {
254
- MCPContentProcessor
180
+ MCPClientManager
255
181
  };
256
182
  //# sourceMappingURL=index16.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index16.js","sources":["../../src/mcp/content-processor.ts"],"sourcesContent":["import type { ContentType, ContentSource } from '../types/content-reference';\nimport type { ContentStorage } from '../memory/content-storage';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\nexport interface MCPResponseContent {\n content: unknown;\n type: 'text' | 'image' | 'resource' | 'text[]' | 'image[]';\n sizeBytes: number;\n mimeType?: string;\n}\n\nexport interface ProcessedResponse {\n content: unknown;\n wasProcessed: boolean;\n referenceCreated?: boolean;\n referenceId?: string;\n originalSize?: number;\n errors?: string[];\n}\n\n/**\n * Content reference interface\n */\ninterface ContentReference {\n referenceId: string;\n preview?: string;\n metadata: {\n sizeBytes: number;\n contentType?: string;\n [key: string]: unknown;\n };\n}\n\nexport interface ContentAnalysis {\n shouldProcess: boolean;\n contents: MCPResponseContent[];\n totalSize: number;\n largestContentSize: number;\n}\n\nexport class MCPContentProcessor {\n private contentStorage: ContentStorage;\n private logger: Logger;\n\n constructor(contentStorage: ContentStorage, logger: Logger) {\n this.contentStorage = contentStorage;\n this.logger = logger;\n }\n\n analyzeResponse(response: unknown): ContentAnalysis {\n const contents: MCPResponseContent[] = [];\n let totalSize = 0;\n\n this.extractContentFromResponse(response, contents);\n\n totalSize = contents.reduce((sum, content) => sum + content.sizeBytes, 0);\n const largestContentSize = contents.reduce(\n (max, content) => Math.max(max, content.sizeBytes),\n 0\n );\n\n const shouldProcess = contents.some((content) =>\n this.contentStorage.shouldUseReference(\n typeof content.content === 'string'\n ? content.content\n : JSON.stringify(content.content)\n )\n );\n\n return {\n shouldProcess,\n contents,\n totalSize,\n largestContentSize,\n };\n }\n\n async processResponse(\n response: unknown,\n serverName: string,\n toolName: string\n ): Promise<ProcessedResponse> {\n try {\n const analysis = this.analyzeResponse(response);\n\n if (!analysis.shouldProcess) {\n return {\n content: response,\n wasProcessed: false,\n };\n }\n\n const processedResponse = await this.createReferencedResponse(\n response,\n analysis,\n serverName,\n toolName\n );\n\n return processedResponse;\n } catch (error) {\n this.logger.error('Error processing MCP response:', error);\n return {\n content: response,\n wasProcessed: false,\n errors: [\n error instanceof Error ? error.message : 'Unknown processing error',\n ],\n };\n }\n }\n\n private extractContentFromResponse(\n obj: unknown,\n contents: MCPResponseContent[]\n ): void {\n if (obj === null || obj === undefined) {\n return;\n }\n\n if (Array.isArray(obj)) {\n obj.forEach((item) => this.extractContentFromResponse(item, contents));\n return;\n }\n\n if (typeof obj === 'object') {\n const record = obj as Record<string, unknown>;\n\n if (record.type === 'text' && typeof record.text === 'string') {\n contents.push({\n content: record.text,\n type: 'text',\n sizeBytes: Buffer.byteLength(record.text, 'utf8'),\n mimeType: this.detectMimeType(record.text as string),\n });\n return;\n }\n\n if (record.type === 'image' && typeof record.data === 'string') {\n contents.push({\n content: record.data,\n type: 'image',\n sizeBytes: Math.ceil(record.data.length * 0.75),\n mimeType: (record.mimeType as string) || 'image/jpeg',\n });\n return;\n }\n\n if (record.type === 'resource' && record.resource) {\n const resourceStr = JSON.stringify(record.resource);\n contents.push({\n content: resourceStr,\n type: 'resource',\n sizeBytes: Buffer.byteLength(resourceStr, 'utf8'),\n mimeType: 'application/json',\n });\n return;\n }\n\n Object.values(record).forEach((value) =>\n this.extractContentFromResponse(value, contents)\n );\n return;\n }\n\n if (typeof obj === 'string') {\n if (obj.length > 1000) {\n contents.push({\n content: obj,\n type: 'text',\n sizeBytes: Buffer.byteLength(obj, 'utf8'),\n mimeType: this.detectMimeType(obj),\n });\n }\n }\n }\n\n private async createReferencedResponse(\n originalResponse: unknown,\n analysis: ContentAnalysis,\n serverName: string,\n toolName: string\n ): Promise<ProcessedResponse> {\n const processedResponse = this.deepClone(originalResponse);\n const errors: string[] = [];\n let referenceCreated = false;\n let totalReferenceSize = 0;\n\n for (const contentInfo of analysis.contents) {\n if (\n this.contentStorage.shouldUseReference(\n typeof contentInfo.content === 'string'\n ? contentInfo.content\n : JSON.stringify(contentInfo.content)\n )\n ) {\n try {\n const contentBuffer = Buffer.from(\n typeof contentInfo.content === 'string'\n ? contentInfo.content\n : JSON.stringify(contentInfo.content),\n 'utf8'\n );\n\n const contentType = this.mapMimeTypeToContentType(\n contentInfo.mimeType\n );\n\n const metadata: Parameters<\n typeof this.contentStorage.storeContentIfLarge\n >[1] = {\n contentType,\n source: 'mcp_tool' as ContentSource,\n mcpToolName: `${serverName}::${toolName}`,\n tags: ['mcp_response', serverName, toolName],\n };\n\n if (contentInfo.mimeType !== undefined) {\n metadata.mimeType = contentInfo.mimeType;\n }\n\n const reference = await this.contentStorage.storeContentIfLarge(\n contentBuffer,\n metadata\n );\n\n if (reference) {\n this.replaceContentInResponse(\n processedResponse,\n contentInfo.content,\n this.createLightweightReference(reference)\n );\n referenceCreated = true;\n totalReferenceSize += contentBuffer.length;\n }\n } catch (error) {\n errors.push(\n `Failed to create reference: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n }\n\n const result: ProcessedResponse = {\n content: processedResponse,\n wasProcessed: true,\n referenceCreated,\n originalSize: totalReferenceSize,\n };\n\n if (errors.length > 0) {\n result.errors = errors;\n }\n\n return result;\n }\n\n private createLightweightReference(\n reference: ContentReference\n ): Record<string, unknown> {\n return {\n type: 'content_reference',\n referenceId: reference.referenceId,\n preview: reference.preview,\n size: reference.metadata.sizeBytes,\n contentType: reference.metadata.contentType,\n format: 'ref://{id}',\n _isReference: true,\n };\n }\n\n private replaceContentInResponse(\n obj: unknown,\n oldContent: unknown,\n newContent: unknown\n ): void {\n if (obj === null || obj === undefined) {\n return;\n }\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (obj[i] === oldContent) {\n obj[i] = newContent;\n } else {\n this.replaceContentInResponse(obj[i], oldContent, newContent);\n }\n }\n return;\n }\n\n if (typeof obj === 'object') {\n const record = obj as Record<string, unknown>;\n if (record.type === 'text' && record.text === oldContent) {\n for (const key of Object.keys(record)) {\n delete record[key];\n }\n if (typeof newContent === 'object' && newContent !== null) {\n const newContentRecord = newContent as Record<string, unknown>;\n for (const key of Object.keys(newContentRecord)) {\n record[key] = newContentRecord[key];\n }\n }\n return;\n }\n for (const key in record) {\n if (record[key] === oldContent) {\n record[key] = newContent;\n } else {\n this.replaceContentInResponse(record[key], oldContent, newContent);\n }\n }\n }\n }\n\n private detectMimeType(content: string): string {\n if (content.trim().startsWith('{') || content.trim().startsWith('[')) {\n return 'application/json';\n }\n if (content.includes('<html>') || content.includes('<!DOCTYPE')) {\n return 'text/html';\n }\n if (content.includes('# ') || content.includes('## ')) {\n return 'text/markdown';\n }\n return 'text/plain';\n }\n\n private mapMimeTypeToContentType(mimeType?: string): ContentType {\n if (!mimeType) return 'text';\n\n if (mimeType.startsWith('text/plain')) return 'text';\n if (mimeType === 'application/json') return 'json';\n if (mimeType === 'text/html') return 'html';\n if (mimeType === 'text/markdown') return 'markdown';\n if (mimeType.startsWith('text/')) return 'text';\n\n return 'binary';\n }\n\n private deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.deepClone(item)) as T;\n }\n\n const cloned = {} as T;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n cloned[key] = this.deepClone(obj[key]);\n }\n }\n\n return cloned;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index16.js","sources":["../../src/mcp/mcp-client-manager.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { MCPServerConfig, MCPToolInfo, MCPConnectionStatus } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { ContentStorage } from '../memory/content-storage';\nimport { MCPContentProcessor } from './content-processor';\n\n/**\n * Manages connections to MCP servers and tool discovery\n */\nexport class MCPClientManager {\n private clients: Map<string, Client> = new Map();\n private tools: Map<string, MCPToolInfo[]> = new Map();\n private logger: Logger;\n private contentProcessor?: MCPContentProcessor;\n\n constructor(logger: Logger, contentStorage?: ContentStorage) {\n this.logger = logger;\n if (contentStorage) {\n this.contentProcessor = new MCPContentProcessor(contentStorage, logger);\n }\n }\n\n /**\n * Connect to an MCP server and discover its tools\n */\n async connectServer(config: MCPServerConfig): Promise<MCPConnectionStatus> {\n try {\n if (this.isServerConnected(config.name)) {\n return {\n serverName: config.name,\n connected: false,\n error: `Server ${config.name} is already connected`,\n tools: [],\n };\n }\n\n if (config.transport && config.transport !== 'stdio') {\n throw new Error(`Transport ${config.transport} not yet supported`);\n }\n\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n ...(config.env && { env: config.env }),\n });\n\n const client = new Client({\n name: `conversational-agent-${config.name}`,\n version: '1.0.0',\n }, {\n capabilities: {},\n });\n\n await client.connect(transport);\n this.clients.set(config.name, client);\n\n const toolsResponse = await client.listTools();\n const toolsWithServer: MCPToolInfo[] = toolsResponse.tools.map((tool: unknown) => {\n const t = tool as { description?: string } & Record<string, unknown>;\n const { description, ...rest } = t;\n const base = description !== undefined && typeof description === 'string'\n ? { ...rest, description }\n : { ...rest };\n return {\n ...(base as Omit<MCPToolInfo, 'serverName'>),\n serverName: config.name,\n } as MCPToolInfo;\n });\n\n this.tools.set(config.name, toolsWithServer);\n this.logger.info(`Connected to MCP server ${config.name} with ${toolsWithServer.length} tools`);\n\n return {\n serverName: config.name,\n connected: true,\n tools: toolsWithServer,\n };\n } catch (error) {\n this.logger.error(`Failed to connect to MCP server ${config.name}:`, error);\n return {\n serverName: config.name,\n connected: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n tools: [],\n };\n }\n }\n\n /**\n * Execute a tool on a specific MCP server\n */\n async executeTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<unknown> {\n const client = this.clients.get(serverName);\n if (!client) {\n throw new Error(`MCP server ${serverName} not connected`);\n }\n\n this.logger.debug(`Executing MCP tool ${toolName} on server ${serverName}`, args);\n\n try {\n const result = await client.callTool({\n name: toolName,\n arguments: args,\n });\n\n if (this.contentProcessor) {\n const processed = await this.contentProcessor.processResponse(result, serverName, toolName);\n \n if (processed.wasProcessed) {\n this.logger.debug(\n `Processed MCP response from ${serverName}::${toolName}`,\n {\n referenceCreated: processed.referenceCreated,\n originalSize: processed.originalSize,\n errors: processed.errors\n }\n );\n\n if (processed.errors && processed.errors.length > 0) {\n this.logger.warn(`Content processing warnings for ${serverName}::${toolName}:`, processed.errors);\n }\n }\n\n return processed.content;\n }\n\n return result;\n } catch (error) {\n this.logger.error(`Error executing MCP tool ${toolName}:`, error);\n throw error;\n }\n }\n\n /**\n * Disconnect all MCP servers\n */\n async disconnectAll(): Promise<void> {\n for (const [name, client] of this.clients) {\n try {\n await client.close();\n this.logger.info(`Disconnected from MCP server ${name}`);\n } catch (error) {\n this.logger.error(`Error disconnecting MCP server ${name}:`, error);\n }\n }\n this.clients.clear();\n this.tools.clear();\n }\n\n /**\n * Get all discovered tools from all connected servers\n */\n getAllTools(): MCPToolInfo[] {\n const allTools: MCPToolInfo[] = [];\n for (const tools of this.tools.values()) {\n allTools.push(...tools);\n }\n return allTools;\n }\n\n /**\n * Get tools from a specific server\n */\n getServerTools(serverName: string): MCPToolInfo[] {\n return this.tools.get(serverName) || [];\n }\n\n /**\n * Check if a server is connected\n */\n isServerConnected(serverName: string): boolean {\n return this.clients.has(serverName);\n }\n\n /**\n * Get list of connected server names\n */\n getConnectedServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Enable content processing with content storage\n */\n enableContentProcessing(contentStorage: ContentStorage): void {\n this.contentProcessor = new MCPContentProcessor(contentStorage, this.logger);\n this.logger.info('Content processing enabled for MCP responses');\n }\n\n /**\n * Disable content processing\n */\n disableContentProcessing(): void {\n delete this.contentProcessor;\n this.logger.info('Content processing disabled for MCP responses');\n }\n\n /**\n * Check if content processing is enabled\n */\n isContentProcessingEnabled(): boolean {\n return this.contentProcessor !== undefined;\n }\n\n /**\n * Analyze a response without processing it (for testing/debugging)\n */\n analyzeResponseContent(response: unknown): unknown {\n if (!this.contentProcessor) {\n throw new Error('Content processing is not enabled');\n }\n return this.contentProcessor.analyzeResponse(response);\n }\n}\n"],"names":[],"mappings":"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"}