@qodo/sdk 0.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 (303) hide show
  1. package/LICENSE +118 -0
  2. package/README.md +121 -0
  3. package/dist/api/agent.d.ts +69 -0
  4. package/dist/api/agent.d.ts.map +1 -0
  5. package/dist/api/agent.js +1034 -0
  6. package/dist/api/agent.js.map +1 -0
  7. package/dist/api/analytics.d.ts +43 -0
  8. package/dist/api/analytics.d.ts.map +1 -0
  9. package/dist/api/analytics.js +163 -0
  10. package/dist/api/analytics.js.map +1 -0
  11. package/dist/api/http.d.ts +5 -0
  12. package/dist/api/http.d.ts.map +1 -0
  13. package/dist/api/http.js +59 -0
  14. package/dist/api/http.js.map +1 -0
  15. package/dist/api/index.d.ts +12 -0
  16. package/dist/api/index.d.ts.map +1 -0
  17. package/dist/api/index.js +17 -0
  18. package/dist/api/index.js.map +1 -0
  19. package/dist/api/taskTracking.d.ts +54 -0
  20. package/dist/api/taskTracking.d.ts.map +1 -0
  21. package/dist/api/taskTracking.js +208 -0
  22. package/dist/api/taskTracking.js.map +1 -0
  23. package/dist/api/types.d.ts +92 -0
  24. package/dist/api/types.d.ts.map +1 -0
  25. package/dist/api/types.js +2 -0
  26. package/dist/api/types.js.map +1 -0
  27. package/dist/api/utils.d.ts +8 -0
  28. package/dist/api/utils.d.ts.map +1 -0
  29. package/dist/api/utils.js +54 -0
  30. package/dist/api/utils.js.map +1 -0
  31. package/dist/api/websocket.d.ts +74 -0
  32. package/dist/api/websocket.d.ts.map +1 -0
  33. package/dist/api/websocket.js +685 -0
  34. package/dist/api/websocket.js.map +1 -0
  35. package/dist/auth/index.d.ts +25 -0
  36. package/dist/auth/index.d.ts.map +1 -0
  37. package/dist/auth/index.js +85 -0
  38. package/dist/auth/index.js.map +1 -0
  39. package/dist/clients/index.d.ts +8 -0
  40. package/dist/clients/index.d.ts.map +1 -0
  41. package/dist/clients/index.js +7 -0
  42. package/dist/clients/index.js.map +1 -0
  43. package/dist/clients/info/InfoClient.d.ts +37 -0
  44. package/dist/clients/info/InfoClient.d.ts.map +1 -0
  45. package/dist/clients/info/InfoClient.js +69 -0
  46. package/dist/clients/info/InfoClient.js.map +1 -0
  47. package/dist/clients/info/index.d.ts +4 -0
  48. package/dist/clients/info/index.d.ts.map +1 -0
  49. package/dist/clients/info/index.js +2 -0
  50. package/dist/clients/info/index.js.map +1 -0
  51. package/dist/clients/info/types.d.ts +21 -0
  52. package/dist/clients/info/types.d.ts.map +1 -0
  53. package/dist/clients/info/types.js +2 -0
  54. package/dist/clients/info/types.js.map +1 -0
  55. package/dist/clients/sessions/SessionsClient.d.ts +34 -0
  56. package/dist/clients/sessions/SessionsClient.d.ts.map +1 -0
  57. package/dist/clients/sessions/SessionsClient.js +71 -0
  58. package/dist/clients/sessions/SessionsClient.js.map +1 -0
  59. package/dist/clients/sessions/index.d.ts +4 -0
  60. package/dist/clients/sessions/index.d.ts.map +1 -0
  61. package/dist/clients/sessions/index.js +2 -0
  62. package/dist/clients/sessions/index.js.map +1 -0
  63. package/dist/clients/sessions/types.d.ts +20 -0
  64. package/dist/clients/sessions/types.d.ts.map +1 -0
  65. package/dist/clients/sessions/types.js +2 -0
  66. package/dist/clients/sessions/types.js.map +1 -0
  67. package/dist/config/ConfigManager.d.ts +43 -0
  68. package/dist/config/ConfigManager.d.ts.map +1 -0
  69. package/dist/config/ConfigManager.js +472 -0
  70. package/dist/config/ConfigManager.js.map +1 -0
  71. package/dist/config/index.d.ts +6 -0
  72. package/dist/config/index.d.ts.map +1 -0
  73. package/dist/config/index.js +7 -0
  74. package/dist/config/index.js.map +1 -0
  75. package/dist/config/urlConfig.d.ts +15 -0
  76. package/dist/config/urlConfig.d.ts.map +1 -0
  77. package/dist/config/urlConfig.js +75 -0
  78. package/dist/config/urlConfig.js.map +1 -0
  79. package/dist/constants/errors.d.ts +2 -0
  80. package/dist/constants/errors.d.ts.map +1 -0
  81. package/dist/constants/errors.js +2 -0
  82. package/dist/constants/errors.js.map +1 -0
  83. package/dist/constants/index.d.ts +7 -0
  84. package/dist/constants/index.d.ts.map +1 -0
  85. package/dist/constants/index.js +11 -0
  86. package/dist/constants/index.js.map +1 -0
  87. package/dist/constants/tools.d.ts +4 -0
  88. package/dist/constants/tools.d.ts.map +1 -0
  89. package/dist/constants/tools.js +4 -0
  90. package/dist/constants/tools.js.map +1 -0
  91. package/dist/constants/versions.d.ts +2 -0
  92. package/dist/constants/versions.d.ts.map +1 -0
  93. package/dist/constants/versions.js +2 -0
  94. package/dist/constants/versions.js.map +1 -0
  95. package/dist/context/buildUserContext.d.ts +18 -0
  96. package/dist/context/buildUserContext.d.ts.map +1 -0
  97. package/dist/context/buildUserContext.js +34 -0
  98. package/dist/context/buildUserContext.js.map +1 -0
  99. package/dist/context/index.d.ts +9 -0
  100. package/dist/context/index.d.ts.map +1 -0
  101. package/dist/context/index.js +9 -0
  102. package/dist/context/index.js.map +1 -0
  103. package/dist/context/messageManager.d.ts +42 -0
  104. package/dist/context/messageManager.d.ts.map +1 -0
  105. package/dist/context/messageManager.js +322 -0
  106. package/dist/context/messageManager.js.map +1 -0
  107. package/dist/context/taskFocus.d.ts +2 -0
  108. package/dist/context/taskFocus.d.ts.map +1 -0
  109. package/dist/context/taskFocus.js +26 -0
  110. package/dist/context/taskFocus.js.map +1 -0
  111. package/dist/context/userInput.d.ts +3 -0
  112. package/dist/context/userInput.d.ts.map +1 -0
  113. package/dist/context/userInput.js +20 -0
  114. package/dist/context/userInput.js.map +1 -0
  115. package/dist/index.d.ts +18 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +21 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/mcp/MCPManager.d.ts +125 -0
  120. package/dist/mcp/MCPManager.d.ts.map +1 -0
  121. package/dist/mcp/MCPManager.js +616 -0
  122. package/dist/mcp/MCPManager.js.map +1 -0
  123. package/dist/mcp/approvedTools.d.ts +4 -0
  124. package/dist/mcp/approvedTools.d.ts.map +1 -0
  125. package/dist/mcp/approvedTools.js +19 -0
  126. package/dist/mcp/approvedTools.js.map +1 -0
  127. package/dist/mcp/baseServer.d.ts +75 -0
  128. package/dist/mcp/baseServer.d.ts.map +1 -0
  129. package/dist/mcp/baseServer.js +107 -0
  130. package/dist/mcp/baseServer.js.map +1 -0
  131. package/dist/mcp/builtinServers.d.ts +15 -0
  132. package/dist/mcp/builtinServers.d.ts.map +1 -0
  133. package/dist/mcp/builtinServers.js +155 -0
  134. package/dist/mcp/builtinServers.js.map +1 -0
  135. package/dist/mcp/dynamicBEServer.d.ts +20 -0
  136. package/dist/mcp/dynamicBEServer.d.ts.map +1 -0
  137. package/dist/mcp/dynamicBEServer.js +52 -0
  138. package/dist/mcp/dynamicBEServer.js.map +1 -0
  139. package/dist/mcp/index.d.ts +19 -0
  140. package/dist/mcp/index.d.ts.map +1 -0
  141. package/dist/mcp/index.js +24 -0
  142. package/dist/mcp/index.js.map +1 -0
  143. package/dist/mcp/mcpInitialization.d.ts +2 -0
  144. package/dist/mcp/mcpInitialization.d.ts.map +1 -0
  145. package/dist/mcp/mcpInitialization.js +56 -0
  146. package/dist/mcp/mcpInitialization.js.map +1 -0
  147. package/dist/mcp/servers/filesystem.d.ts +75 -0
  148. package/dist/mcp/servers/filesystem.d.ts.map +1 -0
  149. package/dist/mcp/servers/filesystem.js +992 -0
  150. package/dist/mcp/servers/filesystem.js.map +1 -0
  151. package/dist/mcp/servers/gerrit.d.ts +19 -0
  152. package/dist/mcp/servers/gerrit.d.ts.map +1 -0
  153. package/dist/mcp/servers/gerrit.js +515 -0
  154. package/dist/mcp/servers/gerrit.js.map +1 -0
  155. package/dist/mcp/servers/git.d.ts +18 -0
  156. package/dist/mcp/servers/git.d.ts.map +1 -0
  157. package/dist/mcp/servers/git.js +441 -0
  158. package/dist/mcp/servers/git.js.map +1 -0
  159. package/dist/mcp/servers/ripgrep.d.ts +34 -0
  160. package/dist/mcp/servers/ripgrep.d.ts.map +1 -0
  161. package/dist/mcp/servers/ripgrep.js +517 -0
  162. package/dist/mcp/servers/ripgrep.js.map +1 -0
  163. package/dist/mcp/servers/shell.d.ts +20 -0
  164. package/dist/mcp/servers/shell.d.ts.map +1 -0
  165. package/dist/mcp/servers/shell.js +603 -0
  166. package/dist/mcp/servers/shell.js.map +1 -0
  167. package/dist/mcp/serversRegistry.d.ts +55 -0
  168. package/dist/mcp/serversRegistry.d.ts.map +1 -0
  169. package/dist/mcp/serversRegistry.js +410 -0
  170. package/dist/mcp/serversRegistry.js.map +1 -0
  171. package/dist/mcp/toolProcessor.d.ts +42 -0
  172. package/dist/mcp/toolProcessor.d.ts.map +1 -0
  173. package/dist/mcp/toolProcessor.js +200 -0
  174. package/dist/mcp/toolProcessor.js.map +1 -0
  175. package/dist/mcp/types.d.ts +29 -0
  176. package/dist/mcp/types.d.ts.map +1 -0
  177. package/dist/mcp/types.js +2 -0
  178. package/dist/mcp/types.js.map +1 -0
  179. package/dist/parser/index.d.ts +72 -0
  180. package/dist/parser/index.d.ts.map +1 -0
  181. package/dist/parser/index.js +967 -0
  182. package/dist/parser/index.js.map +1 -0
  183. package/dist/parser/types.d.ts +153 -0
  184. package/dist/parser/types.d.ts.map +1 -0
  185. package/dist/parser/types.js +6 -0
  186. package/dist/parser/types.js.map +1 -0
  187. package/dist/parser/utils.d.ts +18 -0
  188. package/dist/parser/utils.d.ts.map +1 -0
  189. package/dist/parser/utils.js +64 -0
  190. package/dist/parser/utils.js.map +1 -0
  191. package/dist/sdk/QodoSDK.d.ts +152 -0
  192. package/dist/sdk/QodoSDK.d.ts.map +1 -0
  193. package/dist/sdk/QodoSDK.js +786 -0
  194. package/dist/sdk/QodoSDK.js.map +1 -0
  195. package/dist/sdk/bootstrap.d.ts +16 -0
  196. package/dist/sdk/bootstrap.d.ts.map +1 -0
  197. package/dist/sdk/bootstrap.js +21 -0
  198. package/dist/sdk/bootstrap.js.map +1 -0
  199. package/dist/sdk/builders.d.ts +54 -0
  200. package/dist/sdk/builders.d.ts.map +1 -0
  201. package/dist/sdk/builders.js +117 -0
  202. package/dist/sdk/builders.js.map +1 -0
  203. package/dist/sdk/defaults.d.ts +11 -0
  204. package/dist/sdk/defaults.d.ts.map +1 -0
  205. package/dist/sdk/defaults.js +39 -0
  206. package/dist/sdk/defaults.js.map +1 -0
  207. package/dist/sdk/discovery.d.ts +2 -0
  208. package/dist/sdk/discovery.d.ts.map +1 -0
  209. package/dist/sdk/discovery.js +25 -0
  210. package/dist/sdk/discovery.js.map +1 -0
  211. package/dist/sdk/events.d.ts +168 -0
  212. package/dist/sdk/events.d.ts.map +1 -0
  213. package/dist/sdk/events.js +52 -0
  214. package/dist/sdk/events.js.map +1 -0
  215. package/dist/sdk/index.d.ts +17 -0
  216. package/dist/sdk/index.d.ts.map +1 -0
  217. package/dist/sdk/index.js +17 -0
  218. package/dist/sdk/index.js.map +1 -0
  219. package/dist/sdk/runner/AgentRunner.d.ts +22 -0
  220. package/dist/sdk/runner/AgentRunner.d.ts.map +1 -0
  221. package/dist/sdk/runner/AgentRunner.js +222 -0
  222. package/dist/sdk/runner/AgentRunner.js.map +1 -0
  223. package/dist/sdk/runner/finalize.d.ts +9 -0
  224. package/dist/sdk/runner/finalize.d.ts.map +1 -0
  225. package/dist/sdk/runner/finalize.js +115 -0
  226. package/dist/sdk/runner/finalize.js.map +1 -0
  227. package/dist/sdk/runner/formats.d.ts +7 -0
  228. package/dist/sdk/runner/formats.d.ts.map +1 -0
  229. package/dist/sdk/runner/formats.js +91 -0
  230. package/dist/sdk/runner/formats.js.map +1 -0
  231. package/dist/sdk/runner/index.d.ts +9 -0
  232. package/dist/sdk/runner/index.d.ts.map +1 -0
  233. package/dist/sdk/runner/index.js +9 -0
  234. package/dist/sdk/runner/index.js.map +1 -0
  235. package/dist/sdk/runner/progress.d.ts +3 -0
  236. package/dist/sdk/runner/progress.d.ts.map +1 -0
  237. package/dist/sdk/runner/progress.js +16 -0
  238. package/dist/sdk/runner/progress.js.map +1 -0
  239. package/dist/sdk/schemas.d.ts +50 -0
  240. package/dist/sdk/schemas.d.ts.map +1 -0
  241. package/dist/sdk/schemas.js +145 -0
  242. package/dist/sdk/schemas.js.map +1 -0
  243. package/dist/session/SessionContext.d.ts +86 -0
  244. package/dist/session/SessionContext.d.ts.map +1 -0
  245. package/dist/session/SessionContext.js +395 -0
  246. package/dist/session/SessionContext.js.map +1 -0
  247. package/dist/session/environment.d.ts +42 -0
  248. package/dist/session/environment.d.ts.map +1 -0
  249. package/dist/session/environment.js +27 -0
  250. package/dist/session/environment.js.map +1 -0
  251. package/dist/session/history.d.ts +3 -0
  252. package/dist/session/history.d.ts.map +1 -0
  253. package/dist/session/history.js +67 -0
  254. package/dist/session/history.js.map +1 -0
  255. package/dist/session/index.d.ts +10 -0
  256. package/dist/session/index.d.ts.map +1 -0
  257. package/dist/session/index.js +9 -0
  258. package/dist/session/index.js.map +1 -0
  259. package/dist/session/serverData.d.ts +38 -0
  260. package/dist/session/serverData.d.ts.map +1 -0
  261. package/dist/session/serverData.js +241 -0
  262. package/dist/session/serverData.js.map +1 -0
  263. package/dist/tracking/Tracker.d.ts +55 -0
  264. package/dist/tracking/Tracker.d.ts.map +1 -0
  265. package/dist/tracking/Tracker.js +217 -0
  266. package/dist/tracking/Tracker.js.map +1 -0
  267. package/dist/tracking/index.d.ts +8 -0
  268. package/dist/tracking/index.d.ts.map +1 -0
  269. package/dist/tracking/index.js +8 -0
  270. package/dist/tracking/index.js.map +1 -0
  271. package/dist/tracking/schemas.d.ts +292 -0
  272. package/dist/tracking/schemas.d.ts.map +1 -0
  273. package/dist/tracking/schemas.js +91 -0
  274. package/dist/tracking/schemas.js.map +1 -0
  275. package/dist/types.d.ts +4 -0
  276. package/dist/types.d.ts.map +1 -0
  277. package/dist/types.js +2 -0
  278. package/dist/types.js.map +1 -0
  279. package/dist/utils/extractSetFlags.d.ts +6 -0
  280. package/dist/utils/extractSetFlags.d.ts.map +1 -0
  281. package/dist/utils/extractSetFlags.js +16 -0
  282. package/dist/utils/extractSetFlags.js.map +1 -0
  283. package/dist/utils/formatTimeAgo.d.ts +2 -0
  284. package/dist/utils/formatTimeAgo.d.ts.map +1 -0
  285. package/dist/utils/formatTimeAgo.js +20 -0
  286. package/dist/utils/formatTimeAgo.js.map +1 -0
  287. package/dist/utils/index.d.ts +12 -0
  288. package/dist/utils/index.d.ts.map +1 -0
  289. package/dist/utils/index.js +12 -0
  290. package/dist/utils/index.js.map +1 -0
  291. package/dist/utils/machineId.d.ts +14 -0
  292. package/dist/utils/machineId.d.ts.map +1 -0
  293. package/dist/utils/machineId.js +66 -0
  294. package/dist/utils/machineId.js.map +1 -0
  295. package/dist/utils/pathUtils.d.ts +22 -0
  296. package/dist/utils/pathUtils.d.ts.map +1 -0
  297. package/dist/utils/pathUtils.js +54 -0
  298. package/dist/utils/pathUtils.js.map +1 -0
  299. package/dist/version.d.ts +2 -0
  300. package/dist/version.d.ts.map +1 -0
  301. package/dist/version.js +23 -0
  302. package/dist/version.js.map +1 -0
  303. package/package.json +93 -0
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { ServerConfig } from "./types.js";
3
+ import { MCPConfig } from "../parser/types.js";
4
+ import { InternalMCPBaseServer } from "./baseServer.js";
5
+ export declare const serverTypes: {
6
+ BUILTIN: string;
7
+ CUSTOM: string;
8
+ BACKEND: string;
9
+ };
10
+ export declare class ConfigValidationError extends Error {
11
+ details: z.ZodError;
12
+ constructor(message: string, details: z.ZodError);
13
+ }
14
+ export declare class ServerRegistry {
15
+ private static instance;
16
+ private readonly builtInServers;
17
+ private servers;
18
+ private readonly mcpConfigPath;
19
+ private tomlMCPConfigs;
20
+ private noBuiltin;
21
+ private constructor();
22
+ static init(mcpConfigPath?: string): ServerRegistry;
23
+ static getInstance(): ServerRegistry;
24
+ setNoBuiltin(value: boolean): void;
25
+ /**
26
+ * Set tool configurations from TOML file
27
+ *
28
+ * @param mcpConfigs Tool configurations from TOML file
29
+ */
30
+ setTomlMCPConfigs(mcpConfigs: Record<string, MCPConfig>): void;
31
+ getValidatedDirectories(): string[];
32
+ loadAllServers(): Promise<void>;
33
+ private validateServerConfig;
34
+ private loadServersFromTomlConfigs;
35
+ private loadServersFromBackend;
36
+ private loadBuiltInServers;
37
+ private findRepositoryRoot;
38
+ private findNearestMCPConfig;
39
+ private getMCPConfigPath;
40
+ private readMCPConfig;
41
+ private loadServersFromConfig;
42
+ getAllServers(): ServerConfig[];
43
+ getServer(id: string): ServerConfig | undefined;
44
+ getBuiltInServer(serverId: string): InternalMCPBaseServer | undefined;
45
+ /**
46
+ * Check for duplicate server IDs across different server sources and log warnings
47
+ *
48
+ * @param builtInServers Map of built-in servers
49
+ * @param backendServers Map of backend servers (also considered built-in)
50
+ * @param customServers Map of custom servers from mcp.json
51
+ * @param tomlServers Map of servers from TOML configuration
52
+ */
53
+ private checkForDuplicateServerIds;
54
+ }
55
+ //# sourceMappingURL=serversRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serversRegistry.d.ts","sourceRoot":"","sources":["../../src/mcp/serversRegistry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAC;AAExC,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,qBAAqB,EAAC,MAAM,iBAAiB,CAAC;AAKtD,eAAO,MAAM,WAAW;;;;CAIvB,CAAC;AAWF,qBAAa,qBAAsB,SAAQ,KAAK;IACV,OAAO,EAAE,CAAC,CAAC,QAAQ;gBAA3C,OAAO,EAAE,MAAM,EAAS,OAAO,EAAE,CAAC,CAAC,QAAQ;CAIxD;AAED,qBAAa,cAAc;IAIzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,SAAS,CAAkB;IAEnC,OAAO;WAQO,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,cAAc;WA0B5C,WAAW,IAAI,cAAc;IAkBpC,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIzC;;;;OAIG;IACI,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI;IAI9D,uBAAuB,IAAI,MAAM,EAAE;IAI7B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5C,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,0BAA0B;YAiCpB,sBAAsB;YAyBtB,kBAAkB;YASlB,kBAAkB;YA4BlB,oBAAoB;YAgCpB,gBAAgB;YAYhB,aAAa;YAcb,qBAAqB;IAgC5B,aAAa,IAAI,YAAY,EAAE;IA6D/B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI/C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAI5E;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;CA0CnC"}
@@ -0,0 +1,410 @@
1
+ import * as path from 'path';
2
+ import * as fs from 'fs/promises';
3
+ import { z } from "zod";
4
+ import { DynamicBEMCPServer } from "./dynamicBEServer.js";
5
+ import { BuiltInServers } from "./builtinServers.js";
6
+ import { handle401Error } from "../auth/index.js";
7
+ import { ServerData } from "../session/index.js";
8
+ import { SessionContext } from "../session/index.js";
9
+ import { getCurrentEnvironment, getGlobalEnvironment } from "../session/index.js";
10
+ export const serverTypes = {
11
+ BUILTIN: "BUILTIN",
12
+ CUSTOM: "CUSTOM",
13
+ BACKEND: "BACKEND",
14
+ };
15
+ // Strong type validation for server configuration
16
+ const ServerConfigSchema = z.object({
17
+ command: z.string().min(1).optional(),
18
+ url: z.string().url().optional(),
19
+ args: z.array(z.string()).optional(),
20
+ env: z.record(z.string(), z.string()).optional(),
21
+ });
22
+ export class ConfigValidationError extends Error {
23
+ details;
24
+ constructor(message, details) {
25
+ super(message);
26
+ this.details = details;
27
+ this.name = "ConfigValidationError";
28
+ }
29
+ }
30
+ export class ServerRegistry {
31
+ // NOTE: The static instance is retained only as a fallback; environment-
32
+ // scoped instances are preferred so that different logical sessions can
33
+ // maintain independent MCP server views.
34
+ static instance;
35
+ builtInServers = new BuiltInServers();
36
+ servers = new Map();
37
+ mcpConfigPath;
38
+ tomlMCPConfigs = new Map();
39
+ noBuiltin = false;
40
+ constructor(mcpConfigPath) {
41
+ this.mcpConfigPath = mcpConfigPath;
42
+ // Check environment variable for noBuiltin flag
43
+ if (process.env.QODO_NO_BUILTIN === 'true') {
44
+ this.noBuiltin = true;
45
+ }
46
+ }
47
+ static init(mcpConfigPath) {
48
+ const env = getCurrentEnvironment();
49
+ const globalEnv = getGlobalEnvironment();
50
+ // For non-global environments (e.g. in-process SDK clients), keep a
51
+ // completely independent ServerRegistry instance so each environment can
52
+ // have its own MCP server set and TOML configuration.
53
+ if (env !== globalEnv) {
54
+ let instance = env.serverRegistry;
55
+ if (!instance) {
56
+ instance = new ServerRegistry(mcpConfigPath);
57
+ env.serverRegistry = instance;
58
+ }
59
+ return instance;
60
+ }
61
+ // Global (CLI/webapp) path: preserve legacy singleton behavior
62
+ if (!ServerRegistry.instance) {
63
+ ServerRegistry.instance = new ServerRegistry(mcpConfigPath);
64
+ if (!globalEnv.serverRegistry) {
65
+ globalEnv.serverRegistry = ServerRegistry.instance;
66
+ }
67
+ }
68
+ return ServerRegistry.instance;
69
+ }
70
+ static getInstance() {
71
+ const env = getCurrentEnvironment();
72
+ const globalEnv = getGlobalEnvironment();
73
+ if (env !== globalEnv) {
74
+ const instance = env.serverRegistry;
75
+ if (!instance) {
76
+ throw new Error("ServerRegistry not initialized for this environment. Call ServerRegistry.init() first");
77
+ }
78
+ return instance;
79
+ }
80
+ if (!ServerRegistry.instance) {
81
+ throw new Error("ServerRegistry not initialized. Call ServerRegistry.init() first");
82
+ }
83
+ return ServerRegistry.instance;
84
+ }
85
+ setNoBuiltin(value) {
86
+ this.noBuiltin = value;
87
+ }
88
+ /**
89
+ * Set tool configurations from TOML file
90
+ *
91
+ * @param mcpConfigs Tool configurations from TOML file
92
+ */
93
+ setTomlMCPConfigs(mcpConfigs) {
94
+ this.tomlMCPConfigs = new Map(Object.entries(mcpConfigs));
95
+ }
96
+ getValidatedDirectories() {
97
+ return this.builtInServers.getValidatedDirectories();
98
+ }
99
+ async loadAllServers() {
100
+ // If servers are already loaded, don't reload them
101
+ if (this.servers.size > 0) {
102
+ return;
103
+ }
104
+ if (this.noBuiltin) {
105
+ console.log('Built-in MCP servers disabled via --no-builtin flag');
106
+ }
107
+ const builtInServers = this.noBuiltin ? new Map() : await this.loadBuiltInServers();
108
+ const backendServers = this.noBuiltin ? new Map() : await this.loadServersFromBackend();
109
+ const customServers = await this.loadServersFromConfig();
110
+ const tomlServers = this.loadServersFromTomlConfigs();
111
+ // Check for duplicate server IDs and log warnings
112
+ this.checkForDuplicateServerIds(builtInServers, backendServers, customServers, tomlServers);
113
+ this.servers = new Map([...builtInServers, ...backendServers, ...customServers, ...tomlServers]);
114
+ }
115
+ validateServerConfig(config) {
116
+ try {
117
+ return ServerConfigSchema.parse(config);
118
+ }
119
+ catch (error) {
120
+ if (error instanceof z.ZodError) {
121
+ throw new ConfigValidationError("Invalid server configuration", error);
122
+ }
123
+ throw error;
124
+ }
125
+ }
126
+ loadServersFromTomlConfigs() {
127
+ const tempServers = new Map();
128
+ // Process each tool config from TOML
129
+ this.tomlMCPConfigs.forEach((serverConfig, serverId) => {
130
+ try {
131
+ const validConfig = {
132
+ command: serverConfig.command,
133
+ url: serverConfig.url,
134
+ args: serverConfig.args ?? [],
135
+ env: serverConfig.env ?? {},
136
+ };
137
+ tempServers.set(serverId, {
138
+ id: serverId,
139
+ type: serverTypes.CUSTOM,
140
+ command: validConfig.command,
141
+ url: validConfig.url,
142
+ getArgs: async () => validConfig.args || [],
143
+ getEnv: async () => validConfig.env || {},
144
+ headers: serverConfig.headers,
145
+ });
146
+ }
147
+ catch (error) {
148
+ if (error instanceof ConfigValidationError) {
149
+ console.error(`Invalid TOML tool configuration for ${serverId}:`, error.details);
150
+ }
151
+ else {
152
+ console.error(`Error loading TOML tool configuration for ${serverId}:`, error);
153
+ }
154
+ }
155
+ });
156
+ return tempServers;
157
+ }
158
+ async loadServersFromBackend() {
159
+ const tempServers = new Map();
160
+ try {
161
+ // Use ServerData to get MCP tools from get-things API
162
+ const serverData = ServerData.getInstance();
163
+ const backendServers = serverData.getMCPTools();
164
+ for (const [serverId, tools] of Object.entries(backendServers)) {
165
+ tempServers.set(serverId, {
166
+ id: serverId,
167
+ type: serverTypes.BACKEND,
168
+ command: serverTypes.BACKEND,
169
+ serverClass: new DynamicBEMCPServer(serverId, tools),
170
+ });
171
+ }
172
+ }
173
+ catch (error) {
174
+ if (error?.response?.status === 401) {
175
+ handle401Error();
176
+ return tempServers;
177
+ }
178
+ console.error("Failed to load Qodo MCP servers");
179
+ }
180
+ return tempServers;
181
+ }
182
+ async loadBuiltInServers() {
183
+ const tempServers = new Map();
184
+ const servers = await this.builtInServers.getServers();
185
+ for (const server of servers) {
186
+ tempServers.set(server.id, server);
187
+ }
188
+ return tempServers;
189
+ }
190
+ async findRepositoryRoot(startPath) {
191
+ let currentPath = path.resolve(startPath);
192
+ // If startPath is a file, start from its directory
193
+ try {
194
+ const stat = await fs.stat(currentPath);
195
+ if (stat.isFile()) {
196
+ currentPath = path.dirname(currentPath);
197
+ }
198
+ }
199
+ catch {
200
+ // If we can't stat the path, assume it's a directory
201
+ }
202
+ // Traverse up the directory tree looking for .git
203
+ while (currentPath !== path.dirname(currentPath)) { // Stop at filesystem root
204
+ try {
205
+ const gitPath = path.join(currentPath, '.git');
206
+ await fs.access(gitPath);
207
+ return currentPath; // Found .git directory
208
+ }
209
+ catch {
210
+ // .git not found, continue up
211
+ }
212
+ currentPath = path.dirname(currentPath);
213
+ }
214
+ return null; // No repository root found
215
+ }
216
+ async findNearestMCPConfig() {
217
+ // Start with the current working directory
218
+ let currentDir = process.cwd();
219
+ const rootDir = await this.findRepositoryRoot(currentDir) || path.parse(currentDir).root;
220
+ // Keep traversing up until we hit the root directory
221
+ while (currentDir !== rootDir) {
222
+ // Check if mcp.json exists in the current directory
223
+ const configPath = path.join(currentDir, 'mcp.json');
224
+ try {
225
+ // Check if the file exists and is readable
226
+ await fs.access(configPath, fs.constants.R_OK);
227
+ // If we reach here, the file exists and is readable
228
+ return configPath;
229
+ }
230
+ catch (error) {
231
+ // File doesn't exist or isn't readable, move up to parent directory
232
+ currentDir = path.dirname(currentDir);
233
+ }
234
+ }
235
+ // Check the root directory as our final attempt
236
+ const rootConfigPath = path.join(rootDir, 'mcp.json');
237
+ try {
238
+ await fs.access(rootConfigPath, fs.constants.R_OK);
239
+ return rootConfigPath;
240
+ }
241
+ catch (error) {
242
+ // No mcp.json found in any parent directory
243
+ return undefined;
244
+ }
245
+ }
246
+ async getMCPConfigPath() {
247
+ if (this.mcpConfigPath) {
248
+ return this.mcpConfigPath;
249
+ }
250
+ // Find the nearest mcp.json file to the current working directory
251
+ const mcpConfigPath = await this.findNearestMCPConfig();
252
+ if (!mcpConfigPath) {
253
+ return undefined;
254
+ }
255
+ return mcpConfigPath;
256
+ }
257
+ async readMCPConfig() {
258
+ const mcpConfigPath = await this.getMCPConfigPath();
259
+ if (!mcpConfigPath) {
260
+ return {};
261
+ }
262
+ try {
263
+ const data = await fs.readFile(mcpConfigPath, 'utf-8');
264
+ return JSON.parse(data);
265
+ }
266
+ catch (error) {
267
+ console.error("Error reading MCP config file:", error);
268
+ throw error;
269
+ }
270
+ }
271
+ async loadServersFromConfig() {
272
+ const tempServers = new Map();
273
+ const mcpServersFromFile = await this.readMCPConfig();
274
+ if (!mcpServersFromFile?.mcpServers) {
275
+ // Silently continue without warning
276
+ return tempServers;
277
+ }
278
+ for (const [id, rawConfig] of Object.entries(mcpServersFromFile.mcpServers)) {
279
+ try {
280
+ const validConfig = this.validateServerConfig(rawConfig);
281
+ tempServers.set(id, {
282
+ id,
283
+ type: serverTypes.CUSTOM,
284
+ command: validConfig.command,
285
+ url: validConfig.url,
286
+ getArgs: async () => validConfig.args ?? [],
287
+ getEnv: async () => validConfig.env ?? {},
288
+ headers: rawConfig.headers,
289
+ });
290
+ }
291
+ catch (error) {
292
+ if (error instanceof ConfigValidationError) {
293
+ console.error(`Invalid server configuration for ${id}:`, error.details);
294
+ }
295
+ else {
296
+ console.error(`Error loading server configuration for ${id}:`, error);
297
+ }
298
+ }
299
+ }
300
+ return tempServers;
301
+ }
302
+ getAllServers() {
303
+ let sessionAvailableTools;
304
+ let sessionIgnoredTools;
305
+ try {
306
+ const sessionContext = SessionContext.getInstance();
307
+ sessionAvailableTools = sessionContext.getAvailableTools();
308
+ sessionIgnoredTools = sessionContext.getIgnoreTools();
309
+ }
310
+ catch {
311
+ // SessionContext not initialized (e.g., in-process SDK init ordering). Fall back to no filtering.
312
+ }
313
+ let availableServers;
314
+ let ignoredServers;
315
+ if (sessionAvailableTools && sessionAvailableTools.length > 0) {
316
+ availableServers = sessionAvailableTools.map((tool) => tool.split('.')[0]);
317
+ // if "Qodo Merge" is available, we need to add "git" server
318
+ if (availableServers.includes("qodo_merge") && !availableServers.includes("git")) {
319
+ availableServers.push("git");
320
+ }
321
+ }
322
+ if (sessionIgnoredTools && sessionIgnoredTools.length > 0) {
323
+ ignoredServers = sessionIgnoredTools.map((tool) => tool.split('.')[0]);
324
+ // if "git" is ignored, we need to ignore "Qodo Merge" too
325
+ if (ignoredServers.includes("git") && !ignoredServers.includes("qodo_merge")) {
326
+ console.warn('Warning: Ignoring "git" server, so "Qodo Merge" will be ignored too.');
327
+ ignoredServers.push("qodo_merge");
328
+ }
329
+ }
330
+ // Special-case: "subagents" server should not start by default.
331
+ // It is enabled only when explicitly requested via agent available_tools or by --subagents flag.
332
+ const enableSubagents = (() => {
333
+ const explicitlyListed = !!availableServers?.includes('subagents');
334
+ let flagEnabled = false;
335
+ try {
336
+ flagEnabled = SessionContext.getInstance().getFlags()?.subagents === true;
337
+ }
338
+ catch {
339
+ // SessionContext might not be initialized in some early init paths
340
+ }
341
+ return explicitlyListed || flagEnabled;
342
+ })();
343
+ return Array.from(this.servers.values()).filter((server) => {
344
+ if (server.id === 'subagents') {
345
+ // Explicit opt-in only
346
+ if (!enableSubagents)
347
+ return false;
348
+ // If availableServers is set (explicit allow-list) but user enabled via flag,
349
+ // still allow starting the subagents server.
350
+ if (availableServers && !availableServers.includes('subagents'))
351
+ return true;
352
+ }
353
+ if (availableServers) {
354
+ return availableServers.includes(server.id);
355
+ }
356
+ if (ignoredServers) {
357
+ return !ignoredServers.includes(server.id);
358
+ }
359
+ return true;
360
+ });
361
+ }
362
+ getServer(id) {
363
+ return this.servers.get(id);
364
+ }
365
+ getBuiltInServer(serverId) {
366
+ return this.builtInServers.getBuiltInServer(serverId);
367
+ }
368
+ /**
369
+ * Check for duplicate server IDs across different server sources and log warnings
370
+ *
371
+ * @param builtInServers Map of built-in servers
372
+ * @param backendServers Map of backend servers (also considered built-in)
373
+ * @param customServers Map of custom servers from mcp.json
374
+ * @param tomlServers Map of servers from TOML configuration
375
+ */
376
+ checkForDuplicateServerIds(builtInServers, backendServers, customServers, tomlServers) {
377
+ const serverSources = [
378
+ { name: 'built-in', servers: builtInServers, isBuiltIn: true },
379
+ { name: 'backend', servers: backendServers, isBuiltIn: true },
380
+ { name: 'mcp.json file', servers: customServers, isBuiltIn: false },
381
+ { name: 'agent configuration', servers: tomlServers, isBuiltIn: false }
382
+ ];
383
+ const seenIds = new Map();
384
+ // Collect all server IDs and their sources
385
+ for (const source of serverSources) {
386
+ for (const serverId of source.servers.keys()) {
387
+ if (!seenIds.has(serverId)) {
388
+ seenIds.set(serverId, []);
389
+ }
390
+ seenIds.get(serverId).push({ name: source.name, isBuiltIn: source.isBuiltIn });
391
+ }
392
+ }
393
+ // Check for duplicates and handle appropriately
394
+ for (const [serverId, sources] of seenIds.entries()) {
395
+ if (sources.length > 1) {
396
+ const sourcesList = sources.filter(s => !s.isBuiltIn).map(s => s.name).join(', ');
397
+ const hasBuiltIn = sources.some(s => s.isBuiltIn);
398
+ if (hasBuiltIn) {
399
+ // Fatal error: built-in server conflict
400
+ throw new Error(`MCP server conflict: Server '${serverId}' conflicts with a built-in server. Found in: ${sourcesList}. Change the server ID or use noBuiltin option.`);
401
+ }
402
+ else {
403
+ // Warning: custom server override
404
+ console.warn(`MCP Server Override: Duplicate server ID '${serverId}' found in: ${sourcesList}. Agent configuration will override mcp.json configuration.`);
405
+ }
406
+ }
407
+ }
408
+ }
409
+ }
410
+ //# sourceMappingURL=serversRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serversRegistry.js","sourceRoot":"","sources":["../../src/mcp/serversRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { ToolData, ToolResult } from "../api/types.js";
2
+ import { SessionContext } from "../session/index.js";
3
+ /**
4
+ * Interface for tool processors that can handle pre/post processing
5
+ */
6
+ interface ToolProcessor {
7
+ /**
8
+ * Process tool data before execution (e.g., validation, UI enhancements, logging)
9
+ */
10
+ preProcess?(toolData: ToolData, sessionContext?: SessionContext): Promise<Partial<ToolData>>;
11
+ /**
12
+ * Process tool result after execution (e.g., formatting, additional data, cleanup)
13
+ */
14
+ postProcess?(toolData: ToolData, result: ToolResult, sessionContext?: SessionContext): Promise<ToolResult>;
15
+ /**
16
+ * Optional dry run method to simulate tool execution without side effects
17
+ */
18
+ dryRun?(toolData: ToolData, sessionContext?: SessionContext): Promise<ToolResult>;
19
+ }
20
+ /**
21
+ * Central tool processor that manages all tool-specific processors
22
+ */
23
+ export declare class ToolProcessorManager {
24
+ private processors;
25
+ constructor();
26
+ /**
27
+ * Pre-process tool data before execution
28
+ */
29
+ preProcessTool(toolData: ToolData, sessionContext?: SessionContext): Promise<ToolData>;
30
+ /**
31
+ * Post-process tool result after execution
32
+ */
33
+ postProcessTool(toolData: ToolData, result: ToolResult, sessionContext?: SessionContext): Promise<ToolResult>;
34
+ /**
35
+ * Perform a dry run of a tool without actually executing it
36
+ * Returns a simulated result indicating what would happen
37
+ */
38
+ dryRunTool(toolData: ToolData, sessionContext?: SessionContext): Promise<ToolResult>;
39
+ }
40
+ export declare const toolProcessorManager: ToolProcessorManager;
41
+ export type { ToolProcessor };
42
+ //# sourceMappingURL=toolProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolProcessor.d.ts","sourceRoot":"","sources":["../../src/mcp/toolProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIvD,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAGnD;;GAEG;AACH,UAAU,aAAa;IACrB;;OAEG;IACH,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE7F;;OAEG;IACH,WAAW,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3G;;OAEG;IACH,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnF;AA0ID;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,UAAU,CAAyC;;IAS3D;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IAe5F;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAcnH;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CA2B3F;AAGD,eAAO,MAAM,oBAAoB,sBAA6B,CAAC;AAG/D,YAAY,EAAE,aAAa,EAAE,CAAC"}