37 lines
1.3 KiB
JavaScript
37 lines
1.3 KiB
JavaScript
import { execa } from 'execa';
|
|
import { config } from '../config.js';
|
|
import { assertAllowedBinary } from './sandbox.js';
|
|
/**
|
|
* Runs a command to completion (foreground) and returns its combined,
|
|
* length-capped output. Intended for install/build/lint/test-style commands
|
|
* that the agent needs the final result of, as opposed to long-running dev
|
|
* servers (see processManager.ts for those).
|
|
*/
|
|
export async function runCommand(command, args, options) {
|
|
assertAllowedBinary(command);
|
|
const timeoutMs = options.timeoutMs ?? config.defaultCommandTimeoutMs;
|
|
const result = await execa(command, args, {
|
|
cwd: options.cwd,
|
|
env: options.env,
|
|
timeout: timeoutMs,
|
|
reject: false,
|
|
all: true,
|
|
});
|
|
const rawOutput = result.all ?? [result.stdout, result.stderr].filter(Boolean).join('\n');
|
|
return {
|
|
command,
|
|
args,
|
|
cwd: options.cwd,
|
|
exitCode: result.exitCode ?? null,
|
|
timedOut: result.timedOut,
|
|
failed: result.failed,
|
|
output: truncate(String(rawOutput ?? ''), config.maxToolOutputChars),
|
|
};
|
|
}
|
|
function truncate(text, max) {
|
|
if (text.length <= max)
|
|
return text;
|
|
const omitted = text.length - max;
|
|
return `${text.slice(0, max)}\n... [truncated ${omitted} more characters] ...`;
|
|
}
|
|
//# sourceMappingURL=runCommand.js.map
|