orquesta-cli 0.2.118 → 0.2.119
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.
|
@@ -4,7 +4,8 @@ import { logger } from '../../../utils/logger.js';
|
|
|
4
4
|
import { isNativeWindows, findNativePowerShellPath, isDangerousPowerShellCommand, } from '../../../utils/platform-utils.js';
|
|
5
5
|
import { filterSafeEnv } from '../../../utils/env-filter.js';
|
|
6
6
|
import { configManager } from '../../../core/config/config-manager.js';
|
|
7
|
-
|
|
7
|
+
const DEFAULT_POWERSHELL_TIMEOUT = 120000;
|
|
8
|
+
async function executePowerShell(command, cwd, timeout = DEFAULT_POWERSHELL_TIMEOUT, explicitEnv) {
|
|
8
9
|
return new Promise((resolve, reject) => {
|
|
9
10
|
const psPath = findNativePowerShellPath();
|
|
10
11
|
const userSafeVars = configManager.getSafeEnvVars();
|
|
@@ -15,32 +16,55 @@ async function executePowerShell(command, cwd, timeout = 30000, explicitEnv) {
|
|
|
15
16
|
let stdout = '';
|
|
16
17
|
let stderr = '';
|
|
17
18
|
let killed = false;
|
|
19
|
+
let settled = false;
|
|
20
|
+
const finish = (code) => {
|
|
21
|
+
if (settled)
|
|
22
|
+
return;
|
|
23
|
+
settled = true;
|
|
24
|
+
clearTimeout(timer);
|
|
25
|
+
clearTimeout(hardTimer);
|
|
26
|
+
resolve({
|
|
27
|
+
stdout: stdout.trim(),
|
|
28
|
+
stderr: stderr.trim(),
|
|
29
|
+
exitCode: code ?? (killed ? 124 : 0),
|
|
30
|
+
timedOut: killed,
|
|
31
|
+
});
|
|
32
|
+
};
|
|
18
33
|
child.stdout?.on('data', (data) => {
|
|
19
34
|
stdout += data.toString();
|
|
20
35
|
});
|
|
21
36
|
child.stderr?.on('data', (data) => {
|
|
22
37
|
stderr += data.toString();
|
|
23
38
|
});
|
|
24
|
-
child.on('close', (code) =>
|
|
25
|
-
if (!killed) {
|
|
26
|
-
resolve({
|
|
27
|
-
stdout: stdout.trim(),
|
|
28
|
-
stderr: stderr.trim(),
|
|
29
|
-
exitCode: code ?? 0,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
});
|
|
39
|
+
child.on('close', (code) => finish(code));
|
|
33
40
|
child.on('error', (error) => {
|
|
41
|
+
if (settled)
|
|
42
|
+
return;
|
|
43
|
+
settled = true;
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
clearTimeout(hardTimer);
|
|
34
46
|
reject(error);
|
|
35
47
|
});
|
|
36
48
|
const timer = setTimeout(() => {
|
|
37
49
|
killed = true;
|
|
38
|
-
|
|
39
|
-
|
|
50
|
+
try {
|
|
51
|
+
child.kill('SIGTERM');
|
|
52
|
+
}
|
|
53
|
+
catch { }
|
|
54
|
+
setTimeout(() => { try {
|
|
55
|
+
child.kill('SIGKILL');
|
|
56
|
+
}
|
|
57
|
+
catch { } }, 2000).unref?.();
|
|
40
58
|
}, timeout);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
59
|
+
const hardTimer = setTimeout(() => {
|
|
60
|
+
killed = true;
|
|
61
|
+
try {
|
|
62
|
+
child.kill('SIGKILL');
|
|
63
|
+
}
|
|
64
|
+
catch { }
|
|
65
|
+
finish(124);
|
|
66
|
+
}, timeout + 5000);
|
|
67
|
+
hardTimer.unref?.();
|
|
44
68
|
});
|
|
45
69
|
}
|
|
46
70
|
const POWERSHELL_TOOL_DEFINITION = {
|
|
@@ -51,7 +75,7 @@ const POWERSHELL_TOOL_DEFINITION = {
|
|
|
51
75
|
|
|
52
76
|
IMPORTANT:
|
|
53
77
|
- Do NOT use for file reading/writing - use read_file, create_file, edit_file instead
|
|
54
|
-
- Commands have a
|
|
78
|
+
- Commands have a 120 second timeout by default
|
|
55
79
|
- Dangerous commands (Remove-Item -Recurse -Force C:\\, Stop-Computer, etc.) are blocked
|
|
56
80
|
- Output is truncated if too long
|
|
57
81
|
- PowerShell 7 (pwsh) is used if available, otherwise PowerShell 5.1`,
|
|
@@ -78,7 +102,7 @@ Examples:
|
|
|
78
102
|
},
|
|
79
103
|
timeout: {
|
|
80
104
|
type: 'number',
|
|
81
|
-
description: 'Timeout in milliseconds (optional, default:
|
|
105
|
+
description: 'Timeout in milliseconds (optional, default: 120000)',
|
|
82
106
|
},
|
|
83
107
|
env: {
|
|
84
108
|
type: 'object',
|
|
@@ -98,7 +122,7 @@ export const powershellTool = {
|
|
|
98
122
|
async execute(args) {
|
|
99
123
|
const command = args['command'];
|
|
100
124
|
const cwd = args['cwd'];
|
|
101
|
-
const timeout = args['timeout'] ||
|
|
125
|
+
const timeout = args['timeout'] || DEFAULT_POWERSHELL_TIMEOUT;
|
|
102
126
|
const env = args['env'];
|
|
103
127
|
logger.enter('powershellTool.execute', { command, cwd, timeout, envKeys: env ? Object.keys(env) : [] });
|
|
104
128
|
if (!isNativeWindows()) {
|
|
@@ -149,6 +173,16 @@ export const powershellTool = {
|
|
|
149
173
|
if (output.length > MAX_OUTPUT_LENGTH) {
|
|
150
174
|
output = output.slice(0, MAX_OUTPUT_LENGTH) + '\n\n... [output truncated]';
|
|
151
175
|
}
|
|
176
|
+
if (execResult.timedOut) {
|
|
177
|
+
const secs = Math.round(timeout / 1000);
|
|
178
|
+
const partial = output ? `\n\nPartial output before timeout:\n${output}` : '';
|
|
179
|
+
logger.exit('powershellTool.execute', { timedOut: true, outputLength: output.length });
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
error: `Command timed out after ${secs}s. For long-running commands, pass a larger \`timeout\` ` +
|
|
183
|
+
`(in ms) or run it in the background.${partial}`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
152
186
|
if (execResult.exitCode !== 0) {
|
|
153
187
|
output += `\n\n[Exit code: ${execResult.exitCode}]`;
|
|
154
188
|
}
|