@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.
- package/LICENSE +118 -0
- package/README.md +121 -0
- package/dist/api/agent.d.ts +69 -0
- package/dist/api/agent.d.ts.map +1 -0
- package/dist/api/agent.js +1034 -0
- package/dist/api/agent.js.map +1 -0
- package/dist/api/analytics.d.ts +43 -0
- package/dist/api/analytics.d.ts.map +1 -0
- package/dist/api/analytics.js +163 -0
- package/dist/api/analytics.js.map +1 -0
- package/dist/api/http.d.ts +5 -0
- package/dist/api/http.d.ts.map +1 -0
- package/dist/api/http.js +59 -0
- package/dist/api/http.js.map +1 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +17 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/taskTracking.d.ts +54 -0
- package/dist/api/taskTracking.d.ts.map +1 -0
- package/dist/api/taskTracking.js +208 -0
- package/dist/api/taskTracking.js.map +1 -0
- package/dist/api/types.d.ts +92 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/utils.d.ts +8 -0
- package/dist/api/utils.d.ts.map +1 -0
- package/dist/api/utils.js +54 -0
- package/dist/api/utils.js.map +1 -0
- package/dist/api/websocket.d.ts +74 -0
- package/dist/api/websocket.d.ts.map +1 -0
- package/dist/api/websocket.js +685 -0
- package/dist/api/websocket.js.map +1 -0
- package/dist/auth/index.d.ts +25 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +85 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/clients/index.d.ts +8 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +7 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/info/InfoClient.d.ts +37 -0
- package/dist/clients/info/InfoClient.d.ts.map +1 -0
- package/dist/clients/info/InfoClient.js +69 -0
- package/dist/clients/info/InfoClient.js.map +1 -0
- package/dist/clients/info/index.d.ts +4 -0
- package/dist/clients/info/index.d.ts.map +1 -0
- package/dist/clients/info/index.js +2 -0
- package/dist/clients/info/index.js.map +1 -0
- package/dist/clients/info/types.d.ts +21 -0
- package/dist/clients/info/types.d.ts.map +1 -0
- package/dist/clients/info/types.js +2 -0
- package/dist/clients/info/types.js.map +1 -0
- package/dist/clients/sessions/SessionsClient.d.ts +34 -0
- package/dist/clients/sessions/SessionsClient.d.ts.map +1 -0
- package/dist/clients/sessions/SessionsClient.js +71 -0
- package/dist/clients/sessions/SessionsClient.js.map +1 -0
- package/dist/clients/sessions/index.d.ts +4 -0
- package/dist/clients/sessions/index.d.ts.map +1 -0
- package/dist/clients/sessions/index.js +2 -0
- package/dist/clients/sessions/index.js.map +1 -0
- package/dist/clients/sessions/types.d.ts +20 -0
- package/dist/clients/sessions/types.d.ts.map +1 -0
- package/dist/clients/sessions/types.js +2 -0
- package/dist/clients/sessions/types.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +43 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +472 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/urlConfig.d.ts +15 -0
- package/dist/config/urlConfig.d.ts.map +1 -0
- package/dist/config/urlConfig.js +75 -0
- package/dist/config/urlConfig.js.map +1 -0
- package/dist/constants/errors.d.ts +2 -0
- package/dist/constants/errors.d.ts.map +1 -0
- package/dist/constants/errors.js +2 -0
- package/dist/constants/errors.js.map +1 -0
- package/dist/constants/index.d.ts +7 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +11 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/tools.d.ts +4 -0
- package/dist/constants/tools.d.ts.map +1 -0
- package/dist/constants/tools.js +4 -0
- package/dist/constants/tools.js.map +1 -0
- package/dist/constants/versions.d.ts +2 -0
- package/dist/constants/versions.d.ts.map +1 -0
- package/dist/constants/versions.js +2 -0
- package/dist/constants/versions.js.map +1 -0
- package/dist/context/buildUserContext.d.ts +18 -0
- package/dist/context/buildUserContext.d.ts.map +1 -0
- package/dist/context/buildUserContext.js +34 -0
- package/dist/context/buildUserContext.js.map +1 -0
- package/dist/context/index.d.ts +9 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +9 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/messageManager.d.ts +42 -0
- package/dist/context/messageManager.d.ts.map +1 -0
- package/dist/context/messageManager.js +322 -0
- package/dist/context/messageManager.js.map +1 -0
- package/dist/context/taskFocus.d.ts +2 -0
- package/dist/context/taskFocus.d.ts.map +1 -0
- package/dist/context/taskFocus.js +26 -0
- package/dist/context/taskFocus.js.map +1 -0
- package/dist/context/userInput.d.ts +3 -0
- package/dist/context/userInput.d.ts.map +1 -0
- package/dist/context/userInput.js +20 -0
- package/dist/context/userInput.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/MCPManager.d.ts +125 -0
- package/dist/mcp/MCPManager.d.ts.map +1 -0
- package/dist/mcp/MCPManager.js +616 -0
- package/dist/mcp/MCPManager.js.map +1 -0
- package/dist/mcp/approvedTools.d.ts +4 -0
- package/dist/mcp/approvedTools.d.ts.map +1 -0
- package/dist/mcp/approvedTools.js +19 -0
- package/dist/mcp/approvedTools.js.map +1 -0
- package/dist/mcp/baseServer.d.ts +75 -0
- package/dist/mcp/baseServer.d.ts.map +1 -0
- package/dist/mcp/baseServer.js +107 -0
- package/dist/mcp/baseServer.js.map +1 -0
- package/dist/mcp/builtinServers.d.ts +15 -0
- package/dist/mcp/builtinServers.d.ts.map +1 -0
- package/dist/mcp/builtinServers.js +155 -0
- package/dist/mcp/builtinServers.js.map +1 -0
- package/dist/mcp/dynamicBEServer.d.ts +20 -0
- package/dist/mcp/dynamicBEServer.d.ts.map +1 -0
- package/dist/mcp/dynamicBEServer.js +52 -0
- package/dist/mcp/dynamicBEServer.js.map +1 -0
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +24 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcpInitialization.d.ts +2 -0
- package/dist/mcp/mcpInitialization.d.ts.map +1 -0
- package/dist/mcp/mcpInitialization.js +56 -0
- package/dist/mcp/mcpInitialization.js.map +1 -0
- package/dist/mcp/servers/filesystem.d.ts +75 -0
- package/dist/mcp/servers/filesystem.d.ts.map +1 -0
- package/dist/mcp/servers/filesystem.js +992 -0
- package/dist/mcp/servers/filesystem.js.map +1 -0
- package/dist/mcp/servers/gerrit.d.ts +19 -0
- package/dist/mcp/servers/gerrit.d.ts.map +1 -0
- package/dist/mcp/servers/gerrit.js +515 -0
- package/dist/mcp/servers/gerrit.js.map +1 -0
- package/dist/mcp/servers/git.d.ts +18 -0
- package/dist/mcp/servers/git.d.ts.map +1 -0
- package/dist/mcp/servers/git.js +441 -0
- package/dist/mcp/servers/git.js.map +1 -0
- package/dist/mcp/servers/ripgrep.d.ts +34 -0
- package/dist/mcp/servers/ripgrep.d.ts.map +1 -0
- package/dist/mcp/servers/ripgrep.js +517 -0
- package/dist/mcp/servers/ripgrep.js.map +1 -0
- package/dist/mcp/servers/shell.d.ts +20 -0
- package/dist/mcp/servers/shell.d.ts.map +1 -0
- package/dist/mcp/servers/shell.js +603 -0
- package/dist/mcp/servers/shell.js.map +1 -0
- package/dist/mcp/serversRegistry.d.ts +55 -0
- package/dist/mcp/serversRegistry.d.ts.map +1 -0
- package/dist/mcp/serversRegistry.js +410 -0
- package/dist/mcp/serversRegistry.js.map +1 -0
- package/dist/mcp/toolProcessor.d.ts +42 -0
- package/dist/mcp/toolProcessor.d.ts.map +1 -0
- package/dist/mcp/toolProcessor.js +200 -0
- package/dist/mcp/toolProcessor.js.map +1 -0
- package/dist/mcp/types.d.ts +29 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/parser/index.d.ts +72 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +967 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/types.d.ts +153 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +6 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/parser/utils.d.ts +18 -0
- package/dist/parser/utils.d.ts.map +1 -0
- package/dist/parser/utils.js +64 -0
- package/dist/parser/utils.js.map +1 -0
- package/dist/sdk/QodoSDK.d.ts +152 -0
- package/dist/sdk/QodoSDK.d.ts.map +1 -0
- package/dist/sdk/QodoSDK.js +786 -0
- package/dist/sdk/QodoSDK.js.map +1 -0
- package/dist/sdk/bootstrap.d.ts +16 -0
- package/dist/sdk/bootstrap.d.ts.map +1 -0
- package/dist/sdk/bootstrap.js +21 -0
- package/dist/sdk/bootstrap.js.map +1 -0
- package/dist/sdk/builders.d.ts +54 -0
- package/dist/sdk/builders.d.ts.map +1 -0
- package/dist/sdk/builders.js +117 -0
- package/dist/sdk/builders.js.map +1 -0
- package/dist/sdk/defaults.d.ts +11 -0
- package/dist/sdk/defaults.d.ts.map +1 -0
- package/dist/sdk/defaults.js +39 -0
- package/dist/sdk/defaults.js.map +1 -0
- package/dist/sdk/discovery.d.ts +2 -0
- package/dist/sdk/discovery.d.ts.map +1 -0
- package/dist/sdk/discovery.js +25 -0
- package/dist/sdk/discovery.js.map +1 -0
- package/dist/sdk/events.d.ts +168 -0
- package/dist/sdk/events.d.ts.map +1 -0
- package/dist/sdk/events.js +52 -0
- package/dist/sdk/events.js.map +1 -0
- package/dist/sdk/index.d.ts +17 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +17 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/runner/AgentRunner.d.ts +22 -0
- package/dist/sdk/runner/AgentRunner.d.ts.map +1 -0
- package/dist/sdk/runner/AgentRunner.js +222 -0
- package/dist/sdk/runner/AgentRunner.js.map +1 -0
- package/dist/sdk/runner/finalize.d.ts +9 -0
- package/dist/sdk/runner/finalize.d.ts.map +1 -0
- package/dist/sdk/runner/finalize.js +115 -0
- package/dist/sdk/runner/finalize.js.map +1 -0
- package/dist/sdk/runner/formats.d.ts +7 -0
- package/dist/sdk/runner/formats.d.ts.map +1 -0
- package/dist/sdk/runner/formats.js +91 -0
- package/dist/sdk/runner/formats.js.map +1 -0
- package/dist/sdk/runner/index.d.ts +9 -0
- package/dist/sdk/runner/index.d.ts.map +1 -0
- package/dist/sdk/runner/index.js +9 -0
- package/dist/sdk/runner/index.js.map +1 -0
- package/dist/sdk/runner/progress.d.ts +3 -0
- package/dist/sdk/runner/progress.d.ts.map +1 -0
- package/dist/sdk/runner/progress.js +16 -0
- package/dist/sdk/runner/progress.js.map +1 -0
- package/dist/sdk/schemas.d.ts +50 -0
- package/dist/sdk/schemas.d.ts.map +1 -0
- package/dist/sdk/schemas.js +145 -0
- package/dist/sdk/schemas.js.map +1 -0
- package/dist/session/SessionContext.d.ts +86 -0
- package/dist/session/SessionContext.d.ts.map +1 -0
- package/dist/session/SessionContext.js +395 -0
- package/dist/session/SessionContext.js.map +1 -0
- package/dist/session/environment.d.ts +42 -0
- package/dist/session/environment.d.ts.map +1 -0
- package/dist/session/environment.js +27 -0
- package/dist/session/environment.js.map +1 -0
- package/dist/session/history.d.ts +3 -0
- package/dist/session/history.d.ts.map +1 -0
- package/dist/session/history.js +67 -0
- package/dist/session/history.js.map +1 -0
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +9 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/serverData.d.ts +38 -0
- package/dist/session/serverData.d.ts.map +1 -0
- package/dist/session/serverData.js +241 -0
- package/dist/session/serverData.js.map +1 -0
- package/dist/tracking/Tracker.d.ts +55 -0
- package/dist/tracking/Tracker.d.ts.map +1 -0
- package/dist/tracking/Tracker.js +217 -0
- package/dist/tracking/Tracker.js.map +1 -0
- package/dist/tracking/index.d.ts +8 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +8 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/schemas.d.ts +292 -0
- package/dist/tracking/schemas.d.ts.map +1 -0
- package/dist/tracking/schemas.js +91 -0
- package/dist/tracking/schemas.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/extractSetFlags.d.ts +6 -0
- package/dist/utils/extractSetFlags.d.ts.map +1 -0
- package/dist/utils/extractSetFlags.js +16 -0
- package/dist/utils/extractSetFlags.js.map +1 -0
- package/dist/utils/formatTimeAgo.d.ts +2 -0
- package/dist/utils/formatTimeAgo.d.ts.map +1 -0
- package/dist/utils/formatTimeAgo.js +20 -0
- package/dist/utils/formatTimeAgo.js.map +1 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/machineId.d.ts +14 -0
- package/dist/utils/machineId.d.ts.map +1 -0
- package/dist/utils/machineId.js +66 -0
- package/dist/utils/machineId.js.map +1 -0
- package/dist/utils/pathUtils.d.ts +22 -0
- package/dist/utils/pathUtils.d.ts.map +1 -0
- package/dist/utils/pathUtils.js +54 -0
- package/dist/utils/pathUtils.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- 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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"}
|