mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-13 05:12:55 -07:00
fix(core): ensure binary shell output files are still written to disk for 20MB files, and wait for stream close
This commit is contained in:
@@ -70,11 +70,26 @@ describe('run_shell_command streaming to file regression', () => {
|
|||||||
files.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
|
files.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
|
||||||
|
|
||||||
for (const p of files) {
|
for (const p of files) {
|
||||||
|
try {
|
||||||
const stat = fs.statSync(p);
|
const stat = fs.statSync(p);
|
||||||
if (stat.size >= 20000000) {
|
if (stat.size >= 20000000) {
|
||||||
savedFilePath = p;
|
savedFilePath = p;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!savedFilePath) {
|
||||||
|
const fileStats = files.map((p) => {
|
||||||
|
try {
|
||||||
|
return { p, size: fs.statSync(p).size };
|
||||||
|
} catch {
|
||||||
|
return { p, size: 'error' };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.error('Available files:', JSON.stringify(fileStats, null, 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,11 +159,26 @@ describe('run_shell_command streaming to file regression', () => {
|
|||||||
files.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
|
files.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
|
||||||
|
|
||||||
for (const p of files) {
|
for (const p of files) {
|
||||||
|
try {
|
||||||
const stat = fs.statSync(p);
|
const stat = fs.statSync(p);
|
||||||
if (stat.size >= 20000000) {
|
if (stat.size >= 20000000) {
|
||||||
savedFilePath = p;
|
savedFilePath = p;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!savedFilePath) {
|
||||||
|
const fileStats = files.map((p) => {
|
||||||
|
try {
|
||||||
|
return { p, size: fs.statSync(p).size };
|
||||||
|
} catch {
|
||||||
|
return { p, size: 'error' };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.error('Available files:', JSON.stringify(fileStats, null, 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -532,10 +532,8 @@ export class ShellToolInvocation extends BaseToolInvocation<
|
|||||||
// We rely on 'file_data' for the clean output stream.
|
// We rely on 'file_data' for the clean output stream.
|
||||||
break;
|
break;
|
||||||
case 'file_data':
|
case 'file_data':
|
||||||
if (!isBinaryStream) {
|
|
||||||
totalBytesWritten += Buffer.byteLength(event.chunk);
|
totalBytesWritten += Buffer.byteLength(event.chunk);
|
||||||
outputStream.write(event.chunk);
|
outputStream.write(event.chunk);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'data':
|
case 'data':
|
||||||
if (isBinaryStream) break;
|
if (isBinaryStream) break;
|
||||||
@@ -676,6 +674,11 @@ export class ShellToolInvocation extends BaseToolInvocation<
|
|||||||
outputStream.end(resolve);
|
outputStream.end(resolve);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Ensure the stream is fully closed before we proceed
|
||||||
|
if (!outputStream.closed) {
|
||||||
|
await new Promise<void>((resolve) => outputStream.on('close', resolve));
|
||||||
|
}
|
||||||
|
|
||||||
const backgroundPIDs: number[] = [];
|
const backgroundPIDs: number[] = [];
|
||||||
if (os.platform() !== 'win32') {
|
if (os.platform() !== 'win32') {
|
||||||
let tempFileExists = false;
|
let tempFileExists = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user