mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-16 00:00:52 -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,12 +70,27 @@ describe('run_shell_command streaming to file regression', () => {
|
||||
files.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
|
||||
|
||||
for (const p of files) {
|
||||
const stat = fs.statSync(p);
|
||||
if (stat.size >= 20000000) {
|
||||
savedFilePath = p;
|
||||
break;
|
||||
try {
|
||||
const stat = fs.statSync(p);
|
||||
if (stat.size >= 20000000) {
|
||||
savedFilePath = p;
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
expect(
|
||||
@@ -144,12 +159,27 @@ describe('run_shell_command streaming to file regression', () => {
|
||||
files.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
|
||||
|
||||
for (const p of files) {
|
||||
const stat = fs.statSync(p);
|
||||
if (stat.size >= 20000000) {
|
||||
savedFilePath = p;
|
||||
break;
|
||||
try {
|
||||
const stat = fs.statSync(p);
|
||||
if (stat.size >= 20000000) {
|
||||
savedFilePath = p;
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
expect(
|
||||
|
||||
@@ -532,10 +532,8 @@ export class ShellToolInvocation extends BaseToolInvocation<
|
||||
// We rely on 'file_data' for the clean output stream.
|
||||
break;
|
||||
case 'file_data':
|
||||
if (!isBinaryStream) {
|
||||
totalBytesWritten += Buffer.byteLength(event.chunk);
|
||||
outputStream.write(event.chunk);
|
||||
}
|
||||
totalBytesWritten += Buffer.byteLength(event.chunk);
|
||||
outputStream.write(event.chunk);
|
||||
break;
|
||||
case 'data':
|
||||
if (isBinaryStream) break;
|
||||
@@ -676,6 +674,11 @@ export class ShellToolInvocation extends BaseToolInvocation<
|
||||
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[] = [];
|
||||
if (os.platform() !== 'win32') {
|
||||
let tempFileExists = false;
|
||||
|
||||
Reference in New Issue
Block a user