diff --git a/packages/cli/src/gemini.tsx b/packages/cli/src/gemini.tsx index 54e58f72..565625d8 100644 --- a/packages/cli/src/gemini.tsx +++ b/packages/cli/src/gemini.tsx @@ -297,8 +297,11 @@ export async function main() { } // If not a TTY, read from stdin // This is for cases where the user pipes input directly into the command - if (!process.stdin.isTTY && !input) { - input += await readStdin(); + if (!process.stdin.isTTY) { + const stdinData = await readStdin(); + if (stdinData) { + input = `${stdinData}\n\n${input}`; + } } if (!input) { console.error('No input provided via stdin.'); diff --git a/packages/cli/src/utils/readStdin.ts b/packages/cli/src/utils/readStdin.ts index 2e005526..f309c53e 100644 --- a/packages/cli/src/utils/readStdin.ts +++ b/packages/cli/src/utils/readStdin.ts @@ -5,14 +5,26 @@ */ export async function readStdin(): Promise { + const MAX_STDIN_SIZE = 8 * 1024 * 1024; // 8MB return new Promise((resolve, reject) => { let data = ''; + let totalSize = 0; process.stdin.setEncoding('utf8'); const onReadable = () => { let chunk; while ((chunk = process.stdin.read()) !== null) { + if (totalSize + chunk.length > MAX_STDIN_SIZE) { + const remainingSize = MAX_STDIN_SIZE - totalSize; + data += chunk.slice(0, remainingSize); + console.warn( + `Warning: stdin input truncated to ${MAX_STDIN_SIZE} bytes.`, + ); + process.stdin.destroy(); // Stop reading further + break; + } data += chunk; + totalSize += chunk.length; } };