openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
47 lines (46 loc) • 2.87 kB
JavaScript
import { r as stripAnsi, t as sanitizeForLog } from "./ansi-DrXAcdMD.js";
import { n as sliceUtf16Safe, r as truncateUtf16Safe } from "./utf16-slice-D_ngcYKd.js";
import { n as sanitizeTerminalText } from "./safe-text-BGBqp1a4.js";
//#region src/process/command-error.ts
function formatCommandOutput(output, maxChars = 800) {
const text = stripAnsi(output.toString()).replace(/(^|[^\r])\r+(?=\n|$)/g, "$1").replace(/(^|\n)[^\n]*\r/g, "$1").trim().replace(/[^\n]+/g, sanitizeTerminalText);
const tail = text.split("\n").slice(-12).join("\n");
return `${tail.length < text.length || tail.length > maxChars ? "…\n" : ""}${sliceUtf16Safe(tail, Math.max(0, tail.length - maxChars))}`;
}
/** Use an operation label, never argv that may contain credentials. */
function formatCommandResult(command, result) {
const label = truncateUtf16Safe(sanitizeForLog(command.replace(/[\r\n]+/g, " ")), 256);
const termination = result.outputLimitExceeded ? "output-limit" : result.termination;
const signal = result.signal ? `, signal=${result.signal}` : "";
const killed = result.killed ? ", killed=true" : "";
return [`${label} ${result.code === 0 ? "exited" : "failed"} (code=${result.code}, termination=${termination}${signal}${killed})`, ...["stderr", "stdout"].flatMap((stream) => {
const output = formatCommandOutput(result[stream]);
return output ? [`${stream}: ${output}`] : [];
})].join("\n");
}
function createCommandError(command, result, options) {
const stderr = formatCommandOutput(result.stderr, 2e3);
const stdout = formatCommandOutput(result.stdout, 2e3);
let detail = stderr || stdout;
if (stderr && stdout) {
const budget = 1983;
const first = Math.min(stderr.length, Math.max(Math.ceil(budget / 2), budget - stdout.length));
const tail = (output, limit) => output.length <= limit ? output : `…\n${sliceUtf16Safe(output, 2 - limit)}`;
detail = `stderr: ${tail(stderr, first)}\nstdout: ${tail(stdout, budget - first)}`;
}
const signal = result.signal ? `signal ${result.signal}` : "";
const limited = "outputLimitExceeded" in result && result.outputLimitExceeded ? "output limit exceeded" : "";
const exitReason = limited || (!signal && result.code !== null ? `exit code ${result.code}` : "");
const reason = [{
timeout: `timed out after ${options.timeoutMs / 1e3} seconds`,
"no-output-timeout": "timed out waiting for output",
"output-limit": "output limit exceeded",
exit: exitReason,
error: exitReason,
signal: limited || (!signal ? "terminated" : "")
}[result.termination], signal].filter(Boolean).join("; ");
const label = truncateUtf16Safe(stripAnsi(command).replace(/[\r\n]+/g, " "), 256);
return /* @__PURE__ */ new Error(`${label} failed${reason ? ` (${reason})` : ""}${detail ? `:\n${detail}` : ""}`);
}
//#endregion
export { formatCommandOutput as n, formatCommandResult as r, createCommandError as t };