@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,603 @@
1
+ import { spawn } from 'child_process';
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import * as os from 'os';
5
+ import { fileURLToPath } from 'url';
6
+ // Safe read-only commands that are auto-approved
7
+ const SAFE_READ_COMMANDS = new Set([
8
+ 'ls', 'wc', 'pwd', 'echo', 'date', 'whoami', 'which',
9
+ 'env', 'printenv', 'cat', 'head', 'tail', 'grep', 'find',
10
+ 'ps', 'df', 'du', 'hostname', 'uname', 'id', 'groups'
11
+ ]);
12
+ // Extend safe commands for Windows environments
13
+ const SAFE_READ_COMMANDS_WINDOWS = new Set([
14
+ 'dir', 'echo', 'ver', 'where', 'whoami', 'hostname'
15
+ ]);
16
+ const DEFAULT_TIMEOUT = 30000; // 30 seconds
17
+ // Cache for shell path to avoid repeated filesystem checks
18
+ let cachedShellPath = null;
19
+ function getPreferredShell() {
20
+ if (cachedShellPath) {
21
+ return cachedShellPath;
22
+ }
23
+ // On Windows, prefer cmd.exe (from COMSPEC) or PowerShell
24
+ if (os.platform() === 'win32') {
25
+ const comspec = process.env.ComSpec || process.env.COMSPEC;
26
+ if (comspec && fs.existsSync(comspec)) {
27
+ cachedShellPath = comspec;
28
+ return comspec;
29
+ }
30
+ // Fallback to powershell
31
+ cachedShellPath = 'powershell.exe';
32
+ return cachedShellPath;
33
+ }
34
+ // Check if bash exists first (preferred)
35
+ const bashPaths = ['/bin/bash', '/usr/bin/bash', '/usr/local/bin/bash'];
36
+ for (const bashPath of bashPaths) {
37
+ if (fs.existsSync(bashPath)) {
38
+ cachedShellPath = bashPath;
39
+ return bashPath;
40
+ }
41
+ }
42
+ // Fall back to sh
43
+ const shPaths = ['/bin/sh', '/usr/bin/sh'];
44
+ for (const shPath of shPaths) {
45
+ if (fs.existsSync(shPath)) {
46
+ cachedShellPath = shPath;
47
+ return shPath;
48
+ }
49
+ }
50
+ // Default fallback
51
+ cachedShellPath = '/bin/sh';
52
+ return '/bin/sh';
53
+ }
54
+ function isCommandSafe(command) {
55
+ // Extract the base command name (handle cases like C:\\Windows\\System32\\where.exe)
56
+ const baseCommand = path.basename(command).toLowerCase();
57
+ if (os.platform() === 'win32') {
58
+ return SAFE_READ_COMMANDS_WINDOWS.has(baseCommand);
59
+ }
60
+ return SAFE_READ_COMMANDS.has(baseCommand);
61
+ }
62
+ // Get the directory containing this file for locating sandbox profiles
63
+ function getSandboxProfilePath(profile) {
64
+ // Check if we're running from webpack bundle
65
+ // @ts-ignore - webpack DefinePlugin will replace this
66
+ const isWebpackBuild = typeof __IS_WEBPACK_BUILD__ !== 'undefined' && __IS_WEBPACK_BUILD__ === 'true';
67
+ if (isWebpackBuild) {
68
+ // In webpack build, try multiple strategies to find the sandbox profiles
69
+ // Strategy 1: Use process.argv[1] to find the cli.js location
70
+ // This is the most reliable method for both local and global installations
71
+ const cliPath = process.argv[1];
72
+ if (cliPath) {
73
+ // For global npm installations, process.argv[1] might be a symlink
74
+ // We need to resolve it to get the actual location
75
+ let actualCliPath = cliPath;
76
+ try {
77
+ actualCliPath = fs.realpathSync(cliPath);
78
+ }
79
+ catch (e) {
80
+ // If realpath fails, use the original path
81
+ }
82
+ const distDir = path.dirname(actualCliPath);
83
+ const profilePath = path.join(distDir, 'mcp', 'builtinTools', 'sandbox-profiles', `shell-${profile}.sb`);
84
+ if (fs.existsSync(profilePath)) {
85
+ return profilePath;
86
+ }
87
+ }
88
+ // Strategy 2: Look for __dirname (webpack may provide this)
89
+ // @ts-ignore
90
+ if (typeof __dirname !== 'undefined') {
91
+ // @ts-ignore
92
+ const profilePath = path.join(__dirname, 'mcp', 'builtinTools', 'sandbox-profiles', `shell-${profile}.sb`);
93
+ if (fs.existsSync(profilePath)) {
94
+ return profilePath;
95
+ }
96
+ }
97
+ // Strategy 3: Check common global npm installation locations
98
+ const globalPaths = [
99
+ // Standard npm global locations
100
+ path.join('/usr/local/lib/node_modules', '@qodo', 'command'),
101
+ path.join('/usr/lib/node_modules', '@qodo', 'command'),
102
+ // User-specific npm global location
103
+ path.join(os.homedir(), '.npm-global', 'lib', 'node_modules', '@qodo', 'command'),
104
+ // nvm global location
105
+ path.join(os.homedir(), '.nvm', 'versions', 'node', process.version, 'lib', 'node_modules', '@qodo', 'command'),
106
+ // Homebrew npm location on macOS
107
+ path.join('/opt/homebrew/lib/node_modules', '@qodo', 'command'),
108
+ // Windows global npm location
109
+ path.join(process.env.APPDATA || '', 'npm', 'node_modules', '@qodo', 'command'),
110
+ ];
111
+ for (const globalPath of globalPaths) {
112
+ const profilePath = path.join(globalPath, 'dist', 'mcp', 'builtinTools', 'sandbox-profiles', `shell-${profile}.sb`);
113
+ if (fs.existsSync(profilePath)) {
114
+ return profilePath;
115
+ }
116
+ }
117
+ // Strategy 4: Use npm global prefix if available
118
+ try {
119
+ const npmPrefix = process.env.npm_config_prefix || process.env.NPM_CONFIG_PREFIX;
120
+ if (npmPrefix) {
121
+ const profilePath = path.join(npmPrefix, 'lib', 'node_modules', '@qodo', 'command', 'dist', 'mcp', 'builtinTools', 'sandbox-profiles', `shell-${profile}.sb`);
122
+ if (fs.existsSync(profilePath)) {
123
+ return profilePath;
124
+ }
125
+ }
126
+ }
127
+ catch (e) {
128
+ // Ignore errors
129
+ }
130
+ // Strategy 5: Look relative to node_modules/@qodo/command (for local installations)
131
+ const moduleDir = path.join(process.cwd(), 'node_modules', '@qodo', 'command', 'dist');
132
+ const profilePath = path.join(moduleDir, 'mcp', 'builtinTools', 'sandbox-profiles', `shell-${profile}.sb`);
133
+ if (fs.existsSync(profilePath)) {
134
+ return profilePath;
135
+ }
136
+ // Strategy 6: Walk up from cwd looking for the profile
137
+ let currentDir = process.cwd();
138
+ while (currentDir !== path.dirname(currentDir)) {
139
+ const tryPath = path.join(currentDir, 'node_modules', '@qodo', 'command', 'dist', 'mcp', 'builtinTools', 'sandbox-profiles', `shell-${profile}.sb`);
140
+ if (fs.existsSync(tryPath)) {
141
+ return tryPath;
142
+ }
143
+ currentDir = path.dirname(currentDir);
144
+ }
145
+ // Fallback: return the expected path even if not found
146
+ return path.join(path.dirname(process.argv[1] || ''), 'mcp', 'builtinTools', 'sandbox-profiles', `shell-${profile}.sb`);
147
+ }
148
+ else {
149
+ // In development, use import.meta.url
150
+ const currentFileUrl = import.meta.url;
151
+ const currentFilePath = fileURLToPath(currentFileUrl);
152
+ const currentDir = path.dirname(currentFilePath);
153
+ return path.join(currentDir, 'sandbox-profiles', `shell-${profile}.sb`);
154
+ }
155
+ }
156
+ async function executeShellCommand(args) {
157
+ const { command, args: cmdArgs = [], cwd = process.cwd(), timeout = DEFAULT_TIMEOUT, use_shell = false } = args;
158
+ // Check if sandbox is enabled via environment variable
159
+ const sandboxMode = process.env.QODO_SHELL_SANDBOX || 'off';
160
+ const isMacOS = os.platform() === 'darwin';
161
+ const isWindows = os.platform() === 'win32';
162
+ const shouldUseSandbox = isMacOS && sandboxMode !== 'off';
163
+ return new Promise((resolve) => {
164
+ let child;
165
+ if (shouldUseSandbox) {
166
+ // Determine the profile path
167
+ let profilePath;
168
+ if (sandboxMode === 'permissive' || sandboxMode === 'restrictive') {
169
+ // Use built-in profiles
170
+ profilePath = getSandboxProfilePath(sandboxMode);
171
+ }
172
+ else {
173
+ // Use custom profile file
174
+ profilePath = path.resolve(sandboxMode);
175
+ }
176
+ // Check if sandbox profile exists
177
+ if (!fs.existsSync(profilePath)) {
178
+ const errorMsg = `Sandbox profile not found: ${profilePath}\n` +
179
+ `Profile type: ${sandboxMode}\n` +
180
+ `Current directory: ${process.cwd()}\n` +
181
+ `CLI path: ${process.argv[1] || 'unknown'}\n` +
182
+ `Please ensure the package was built with 'npm run build:prod' to include sandbox profiles.`;
183
+ resolve({
184
+ stdout: '',
185
+ stderr: errorMsg,
186
+ code: 1,
187
+ signal: null,
188
+ timedOut: false
189
+ });
190
+ return;
191
+ }
192
+ if (use_shell) {
193
+ // When using shell with sandbox, we need to execute the shell command through sandbox-exec
194
+ const fullCommand = cmdArgs.length > 0 ? `${command} ${cmdArgs.join(' ')}` : command;
195
+ const preferredShell = getPreferredShell();
196
+ const sandboxArgs = [
197
+ '-D', `CWD=${fs.realpathSync(cwd)}`,
198
+ '-D', `TMP_DIR=${fs.realpathSync(os.tmpdir())}`,
199
+ '-D', `HOME_DIR=${fs.realpathSync(os.homedir())}`,
200
+ '-f', profilePath,
201
+ preferredShell,
202
+ '-c',
203
+ fullCommand
204
+ ];
205
+ child = spawn('sandbox-exec', sandboxArgs, {
206
+ cwd,
207
+ shell: false,
208
+ stdio: ['ignore', 'pipe', 'pipe'],
209
+ detached: !isWindows
210
+ });
211
+ }
212
+ else {
213
+ // Build sandbox-exec command
214
+ const sandboxArgs = [
215
+ '-D', `CWD=${fs.realpathSync(cwd)}`,
216
+ '-D', `TMP_DIR=${fs.realpathSync(os.tmpdir())}`,
217
+ '-D', `HOME_DIR=${fs.realpathSync(os.homedir())}`,
218
+ '-f', profilePath,
219
+ command,
220
+ ...cmdArgs
221
+ ];
222
+ child = spawn('sandbox-exec', sandboxArgs, {
223
+ cwd,
224
+ // Don't use shell to avoid injection attacks
225
+ shell: false,
226
+ // Capture output
227
+ stdio: ['ignore', 'pipe', 'pipe'],
228
+ // Create new process group to ensure all child processes are killed
229
+ detached: !isWindows
230
+ });
231
+ }
232
+ }
233
+ else {
234
+ // Normal execution without sandbox
235
+ if (use_shell) {
236
+ // When using shell, combine command and args into a single shell command
237
+ const fullCommand = cmdArgs.length > 0 ? `${command} ${cmdArgs.join(' ')}` : command;
238
+ if (isWindows) {
239
+ // On Windows, let Node use the default shell (cmd.exe) for proper handling of built-ins and pipes
240
+ child = spawn(fullCommand, {
241
+ cwd,
242
+ shell: true,
243
+ stdio: ['ignore', 'pipe', 'pipe'],
244
+ detached: false,
245
+ });
246
+ }
247
+ else {
248
+ const preferredShell = getPreferredShell();
249
+ child = spawn(preferredShell, ['-c', fullCommand], {
250
+ cwd,
251
+ shell: false,
252
+ stdio: ['ignore', 'pipe', 'pipe'],
253
+ detached: true,
254
+ });
255
+ }
256
+ }
257
+ else {
258
+ child = spawn(command, cmdArgs, {
259
+ cwd,
260
+ // Don't use shell to avoid injection attacks
261
+ shell: false,
262
+ // Capture output
263
+ stdio: ['ignore', 'pipe', 'pipe'],
264
+ // Create new process group to ensure all child processes are killed
265
+ detached: !isWindows
266
+ });
267
+ }
268
+ }
269
+ let stdout = '';
270
+ let stderr = '';
271
+ let timedOut = false;
272
+ // Set up timeout
273
+ const timer = setTimeout(() => {
274
+ timedOut = true;
275
+ // Kill the entire process group on non-Windows platforms
276
+ if (!isWindows && child.pid) {
277
+ try {
278
+ // Kill the process group (negative PID)
279
+ process.kill(-child.pid, 'SIGTERM');
280
+ // Force kill after 5 seconds if still running
281
+ setTimeout(() => {
282
+ if (!child.killed) {
283
+ try {
284
+ process.kill(-child.pid, 'SIGKILL');
285
+ }
286
+ catch (e) {
287
+ // Process might already be dead
288
+ }
289
+ }
290
+ }, 5000);
291
+ }
292
+ catch (e) {
293
+ // Fallback to regular kill if process group kill fails
294
+ child.kill('SIGTERM');
295
+ setTimeout(() => {
296
+ if (!child.killed) {
297
+ child.kill('SIGKILL');
298
+ }
299
+ }, 5000);
300
+ }
301
+ }
302
+ else {
303
+ // Windows or no PID - use regular kill
304
+ child.kill('SIGTERM');
305
+ // Force kill after 5 seconds if still running
306
+ setTimeout(() => {
307
+ if (!child.killed) {
308
+ child.kill('SIGKILL');
309
+ }
310
+ }, 5000);
311
+ }
312
+ }, timeout);
313
+ // Capture stdout
314
+ child.stdout.on('data', (data) => {
315
+ stdout += data.toString();
316
+ });
317
+ // Capture stderr
318
+ child.stderr.on('data', (data) => {
319
+ stderr += data.toString();
320
+ });
321
+ // Handle process exit
322
+ child.on('close', (code, signal) => {
323
+ clearTimeout(timer);
324
+ resolve({
325
+ stdout,
326
+ stderr,
327
+ code,
328
+ signal,
329
+ timedOut
330
+ });
331
+ });
332
+ // Handle spawn errors
333
+ child.on('error', (error) => {
334
+ clearTimeout(timer);
335
+ resolve({
336
+ stdout,
337
+ stderr: error.message,
338
+ code: 1,
339
+ signal: null,
340
+ timedOut: false
341
+ });
342
+ });
343
+ });
344
+ }
345
+ export class ShellServerEnhanced {
346
+ name = 'shell';
347
+ version = '1.0.0';
348
+ // Health status tracked asynchronously to avoid blocking initialize handshake
349
+ health = null;
350
+ async performHealthCheck() {
351
+ try {
352
+ const isWindows = os.platform() === 'win32';
353
+ const checkTimeout = 1500; // short, non-blocking
354
+ const cwd = process.cwd();
355
+ const result = await new Promise((resolve) => {
356
+ let child;
357
+ let stdout = '';
358
+ let stderr = '';
359
+ let finished = false;
360
+ // Command: echo OK (handled by shell)
361
+ if (isWindows) {
362
+ child = spawn('echo OK', { cwd, shell: true, stdio: ['ignore', 'pipe', 'pipe'], detached: false });
363
+ }
364
+ else {
365
+ const preferredShell = getPreferredShell();
366
+ child = spawn(preferredShell, ['-c', 'echo OK'], { cwd, shell: false, stdio: ['ignore', 'pipe', 'pipe'], detached: true });
367
+ }
368
+ const timer = setTimeout(() => {
369
+ if (!finished) {
370
+ finished = true;
371
+ try {
372
+ child.kill('SIGTERM');
373
+ }
374
+ catch { }
375
+ resolve({ stdout, stderr: stderr || 'health check timeout', code: 1, signal: null, timedOut: true });
376
+ }
377
+ }, checkTimeout);
378
+ child.stdout.on('data', (d) => { stdout += d.toString(); });
379
+ child.stderr.on('data', (d) => { stderr += d.toString(); });
380
+ child.on('close', (code) => {
381
+ if (finished)
382
+ return;
383
+ finished = true;
384
+ clearTimeout(timer);
385
+ resolve({ stdout, stderr, code, signal: null, timedOut: false });
386
+ });
387
+ child.on('error', (err) => {
388
+ if (finished)
389
+ return;
390
+ finished = true;
391
+ clearTimeout(timer);
392
+ resolve({ stdout, stderr: err.message, code: 1, signal: null, timedOut: false });
393
+ });
394
+ });
395
+ const ok = result.code === 0 && /OK\s*$/i.test(result.stdout.trim());
396
+ this.health = {
397
+ ok,
398
+ message: ok ? undefined : (result.stderr || `exit ${result.code}`),
399
+ shell: isWindows ? 'cmd.exe' : path.basename(getPreferredShell()),
400
+ lastChecked: new Date().toISOString(),
401
+ };
402
+ }
403
+ catch (e) {
404
+ this.health = {
405
+ ok: false,
406
+ message: e?.message || String(e),
407
+ shell: os.platform() === 'win32' ? 'cmd.exe' : path.basename(getPreferredShell()),
408
+ lastChecked: new Date().toISOString(),
409
+ };
410
+ }
411
+ }
412
+ async initialize() {
413
+ // Do not block initialization on OS-specific command availability
414
+ try {
415
+ // Kick off a background health check (non-blocking)
416
+ setTimeout(() => { this.performHealthCheck().catch(() => { }); }, 0);
417
+ return true;
418
+ }
419
+ catch (error) {
420
+ // Never fail initialization to avoid MCP handshake timeout
421
+ console.error('[ShellServer] initialize encountered an error (ignored):', error);
422
+ return true;
423
+ }
424
+ }
425
+ isToolAutoApprovedForArgs(toolName, args) {
426
+ if (toolName !== 'shell_execute') {
427
+ return false;
428
+ }
429
+ const { command, use_shell } = args;
430
+ if (!command || typeof command !== 'string') {
431
+ return false;
432
+ }
433
+ // If using shell, be more conservative - only auto-approve very basic commands
434
+ if (use_shell) {
435
+ // Only auto-approve very simple read-only commands when using shell
436
+ const veryBasicCommands = new Set([
437
+ 'pwd', 'whoami', 'date', 'echo',
438
+ ...(os.platform() === 'win32' ? ['dir'] : [])
439
+ ]);
440
+ const baseCommand = path.basename(command.split(' ')[0]).toLowerCase(); // Get first word of command
441
+ return veryBasicCommands.has(baseCommand);
442
+ }
443
+ return isCommandSafe(command);
444
+ }
445
+ async listTools() {
446
+ const tools = [
447
+ {
448
+ name: 'shell_execute',
449
+ description: 'Execute a shell command. Safe read-only commands (ls, pwd, etc.) run without confirmation. Other commands require user approval.',
450
+ inputSchema: {
451
+ type: 'object',
452
+ properties: {
453
+ command: {
454
+ type: 'string',
455
+ description: 'The command to execute (e.g., "ls", "git", "python")'
456
+ },
457
+ args: {
458
+ type: 'array',
459
+ items: { type: 'string' },
460
+ description: 'Command arguments as an array (e.g., ["-la", "/tmp"])'
461
+ },
462
+ cwd: {
463
+ type: 'string',
464
+ description: 'Working directory for command execution (defaults to current directory)'
465
+ },
466
+ timeout: {
467
+ type: 'number',
468
+ description: 'Command timeout in milliseconds (default: 30000)'
469
+ },
470
+ use_shell: {
471
+ type: 'boolean',
472
+ description: 'If true, execute through shell (prefers bash, falls back to sh) allowing piping, redirection, and other shell features. When false (default), executes command directly for better security.'
473
+ }
474
+ },
475
+ required: ['command']
476
+ },
477
+ // Auto-approval is determined per command
478
+ autoApproved: false
479
+ }
480
+ ];
481
+ return { tools };
482
+ }
483
+ async callTool(request, _extra) {
484
+ const { name, arguments: args } = request;
485
+ try {
486
+ switch (name) {
487
+ case 'shell_execute': {
488
+ const { command, args: cmdArgs, cwd, timeout, use_shell } = args;
489
+ // Validate command
490
+ if (!command || typeof command !== 'string') {
491
+ throw new Error('Command must be a non-empty string');
492
+ }
493
+ // Validate working directory if provided
494
+ if (cwd) {
495
+ const resolvedCwd = path.resolve(cwd);
496
+ if (!fs.existsSync(resolvedCwd)) {
497
+ throw new Error(`Working directory does not exist: ${cwd}`);
498
+ }
499
+ if (!fs.statSync(resolvedCwd).isDirectory()) {
500
+ throw new Error(`Working directory is not a directory: ${cwd}`);
501
+ }
502
+ }
503
+ // Execute the command
504
+ const result = await executeShellCommand({
505
+ command,
506
+ args: cmdArgs,
507
+ cwd,
508
+ timeout,
509
+ use_shell
510
+ });
511
+ // Format the response
512
+ let responseText = '';
513
+ // Add command info
514
+ if (use_shell) {
515
+ const fullCommand = cmdArgs && cmdArgs.length > 0 ? `${command} ${cmdArgs.join(' ')}` : command;
516
+ const shellUsed = os.platform() === 'win32' ? 'cmd.exe' : path.basename(getPreferredShell());
517
+ responseText += `Shell Command (${shellUsed}): ${fullCommand}\n`;
518
+ }
519
+ else {
520
+ responseText += `Command: ${command}`;
521
+ if (cmdArgs && cmdArgs.length > 0) {
522
+ responseText += ` ${cmdArgs.join(' ')}`;
523
+ }
524
+ responseText += '\n';
525
+ }
526
+ if (cwd) {
527
+ responseText += `Working Directory: ${cwd}\n`;
528
+ }
529
+ // Add sandbox status if on macOS
530
+ const sandboxMode = process.env.QODO_SHELL_SANDBOX || 'off';
531
+ if (os.platform() === 'darwin' && sandboxMode !== 'off') {
532
+ if (sandboxMode === 'permissive' || sandboxMode === 'restrictive') {
533
+ responseText += `Sandbox: ${sandboxMode}\n`;
534
+ }
535
+ else {
536
+ responseText += `Sandbox: custom (${path.basename(sandboxMode)})\n`;
537
+ }
538
+ }
539
+ responseText += `Exit Code: ${result.code}\n`;
540
+ if (result.signal) {
541
+ responseText += `Signal: ${result.signal}\n`;
542
+ }
543
+ if (result.timedOut) {
544
+ responseText += `Status: Command timed out after ${timeout || DEFAULT_TIMEOUT}ms\n`;
545
+ }
546
+ responseText += '\n';
547
+ if (result.stdout) {
548
+ responseText += `=== Output ===\n${result.stdout}`;
549
+ if (!result.stdout.endsWith('\n')) {
550
+ responseText += '\n';
551
+ }
552
+ }
553
+ if (result.stderr) {
554
+ responseText += `\n=== Error Output ===\n${result.stderr}`;
555
+ if (!result.stderr.endsWith('\n')) {
556
+ responseText += '\n';
557
+ }
558
+ }
559
+ // Return in MCP format
560
+ return {
561
+ content: [{ type: 'text', text: responseText }],
562
+ isError: result.code !== 0 || result.timedOut
563
+ };
564
+ }
565
+ default:
566
+ throw new Error(`Unknown tool: ${name}`);
567
+ }
568
+ }
569
+ catch (error) {
570
+ return {
571
+ content: [{ type: 'text', text: `Error: ${error.message || String(error)}` }],
572
+ isError: true
573
+ };
574
+ }
575
+ }
576
+ }
577
+ // Recent enhancements:
578
+ // - Shell execution support via use_shell parameter:
579
+ // - Enables piping, redirection, and other shell features
580
+ // - Prefers bash over sh when available for better feature support
581
+ // - More conservative auto-approval when shell is used
582
+ // - Works with both sandbox and non-sandbox execution
583
+ //
584
+ // Future enhancements (to be implemented later):
585
+ // 1. Sandbox execution support:
586
+ // - Docker/Podman container execution
587
+ // - macOS Seatbelt (sandbox-exec) integration
588
+ // - Linux seccomp/AppArmor support
589
+ //
590
+ // 2. Advanced features:
591
+ // - Background process management
592
+ // - Process groups for better signal handling
593
+ // - Resource limits (CPU, memory, disk I/O)
594
+ // - Audit logging with timestamps and user info
595
+ // - Command history and replay
596
+ //
597
+ // 3. Security enhancements:
598
+ // - Command blacklisting (rm -rf, format, etc.)
599
+ // - Path sanitization and validation
600
+ // - Environment variable filtering
601
+ // - Restricted shells (rbash, etc.)
602
+ // - SELinux/AppArmor profiles
603
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/mcp/servers/shell.ts"],"names":[],"mappings":"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"}