diff options
| author | Allen Hutchison <[email protected]> | 2025-08-20 16:52:27 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-20 23:52:27 +0000 |
| commit | a590a033be9cb35e7a51f7114b1c138b94b84156 (patch) | |
| tree | 1080c8228ee1d0a43bf5332ba7fe26b01d5e733d /packages/cli/src | |
| parent | 653267a64f8cd3b270176ec90b37a34383bf5bf2 (diff) | |
test(integration): add failing test for stdin context with prompt (#6158)
Diffstat (limited to 'packages/cli/src')
| -rw-r--r-- | packages/cli/src/gemini.tsx | 32 | ||||
| -rw-r--r-- | packages/cli/src/utils/sandbox.ts | 15 |
2 files changed, 40 insertions, 7 deletions
diff --git a/packages/cli/src/gemini.tsx b/packages/cli/src/gemini.tsx index f7089e28..6661d3ef 100644 --- a/packages/cli/src/gemini.tsx +++ b/packages/cli/src/gemini.tsx @@ -239,7 +239,37 @@ export async function main() { process.exit(1); } } - await start_sandbox(sandboxConfig, memoryArgs, config); + let stdinData = ''; + if (!process.stdin.isTTY) { + stdinData = await readStdin(); + } + + // This function is a copy of the one from sandbox.ts + // It is moved here to decouple sandbox.ts from the CLI's argument structure. + const injectStdinIntoArgs = ( + args: string[], + stdinData?: string, + ): string[] => { + const finalArgs = [...args]; + if (stdinData) { + const promptIndex = finalArgs.findIndex( + (arg) => arg === '--prompt' || arg === '-p', + ); + if (promptIndex > -1 && finalArgs.length > promptIndex + 1) { + // If there's a prompt argument, prepend stdin to it + finalArgs[promptIndex + 1] = + `${stdinData}\n\n${finalArgs[promptIndex + 1]}`; + } else { + // If there's no prompt argument, add stdin as the prompt + finalArgs.push('--prompt', stdinData); + } + } + return finalArgs; + }; + + const sandboxArgs = injectStdinIntoArgs(process.argv, stdinData); + + await start_sandbox(sandboxConfig, memoryArgs, config, sandboxArgs); process.exit(0); } else { // Not in a sandbox and not entering one, so relaunch with additional diff --git a/packages/cli/src/utils/sandbox.ts b/packages/cli/src/utils/sandbox.ts index dac34778..30006422 100644 --- a/packages/cli/src/utils/sandbox.ts +++ b/packages/cli/src/utils/sandbox.ts @@ -24,6 +24,7 @@ function getContainerPath(hostPath: string): string { if (os.platform() !== 'win32') { return hostPath; } + const withForwardSlashes = hostPath.replace(/\\/g, '/'); const match = withForwardSlashes.match(/^([A-Z]):\/(.*)/i); if (match) { @@ -114,7 +115,7 @@ function ports(): string[] { .map((p) => p.trim()); } -function entrypoint(workdir: string): string[] { +function entrypoint(workdir: string, cliArgs: string[]): string[] { const isWindows = os.platform() === 'win32'; const containerWorkdir = getContainerPath(workdir); const shellCmds = []; @@ -166,7 +167,7 @@ function entrypoint(workdir: string): string[] { ), ); - const cliArgs = process.argv.slice(2).map((arg) => quote([arg])); + const quotedCliArgs = cliArgs.slice(2).map((arg) => quote([arg])); const cliCmd = process.env['NODE_ENV'] === 'development' ? process.env['DEBUG'] @@ -176,8 +177,7 @@ function entrypoint(workdir: string): string[] { ? `node --inspect-brk=0.0.0.0:${process.env['DEBUG_PORT'] || '9229'} $(which gemini)` : 'gemini'; - const args = [...shellCmds, cliCmd, ...cliArgs]; - + const args = [...shellCmds, cliCmd, ...quotedCliArgs]; return ['bash', '-c', args.join(' ')]; } @@ -185,6 +185,7 @@ export async function start_sandbox( config: SandboxConfig, nodeArgs: string[] = [], cliConfig?: Config, + cliArgs: string[] = [], ) { const patcher = new ConsolePatcher({ debugMode: cliConfig?.getDebugMode() || !!process.env['DEBUG'], @@ -263,6 +264,8 @@ export async function start_sandbox( args.push('-D', `INCLUDE_DIR_${i}=${dirPath}`); } + const finalArgv = cliArgs; + args.push( '-f', profileFile, @@ -271,7 +274,7 @@ export async function start_sandbox( [ `SANDBOX=sandbox-exec`, `NODE_OPTIONS="${nodeOptions}"`, - ...process.argv.map((arg) => quote([arg])), + ...finalArgv.map((arg) => quote([arg])), ].join(' '), ); // start and set up proxy if GEMINI_SANDBOX_PROXY_COMMAND is set @@ -692,7 +695,7 @@ export async function start_sandbox( // Determine if the current user's UID/GID should be passed to the sandbox. // See shouldUseCurrentUserInSandbox for more details. let userFlag = ''; - const finalEntrypoint = entrypoint(workdir); + const finalEntrypoint = entrypoint(workdir, cliArgs); if (process.env['GEMINI_CLI_INTEGRATION_TEST'] === 'true') { args.push('--user', 'root'); |
