fix(coding-agent): persist bash output on line truncation closes #2852

This commit is contained in:
Mario Zechner
2026-04-05 23:28:49 +02:00
parent 0c98d5a54a
commit 52d16d5a31
4 changed files with 80 additions and 15 deletions

View File

@@ -78,6 +78,18 @@ export async function executeBashWithOperations(
let tempFileStream: WriteStream | undefined;
let totalBytes = 0;
const ensureTempFile = () => {
if (tempFilePath) {
return;
}
const id = randomBytes(8).toString("hex");
tempFilePath = join(tmpdir(), `pi-bash-${id}.log`);
tempFileStream = createWriteStream(tempFilePath);
for (const chunk of outputChunks) {
tempFileStream.write(chunk);
}
};
const decoder = new TextDecoder();
const onData = (data: Buffer) => {
@@ -87,13 +99,8 @@ export async function executeBashWithOperations(
const text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\r/g, "");
// Start writing to temp file if exceeds threshold
if (totalBytes > DEFAULT_MAX_BYTES && !tempFilePath) {
const id = randomBytes(8).toString("hex");
tempFilePath = join(tmpdir(), `pi-bash-${id}.log`);
tempFileStream = createWriteStream(tempFilePath);
for (const chunk of outputChunks) {
tempFileStream.write(chunk);
}
if (totalBytes > DEFAULT_MAX_BYTES) {
ensureTempFile();
}
if (tempFileStream) {
@@ -126,6 +133,9 @@ export async function executeBashWithOperations(
const fullOutput = outputChunks.join("");
const truncationResult = truncateTail(fullOutput);
if (truncationResult.truncated) {
ensureTempFile();
}
const cancelled = options?.signal?.aborted ?? false;
return {
@@ -144,6 +154,9 @@ export async function executeBashWithOperations(
if (options?.signal?.aborted) {
const fullOutput = outputChunks.join("");
const truncationResult = truncateTail(fullOutput);
if (truncationResult.truncated) {
ensureTempFile();
}
return {
output: truncationResult.truncated ? truncationResult.content : fullOutput,
exitCode: undefined,