diff options
Diffstat (limited to 'packages/cli/src/gemini.ts')
| -rw-r--r-- | packages/cli/src/gemini.ts | 66 |
1 files changed, 60 insertions, 6 deletions
diff --git a/packages/cli/src/gemini.ts b/packages/cli/src/gemini.ts index 8df10aba..0d8b1ac7 100644 --- a/packages/cli/src/gemini.ts +++ b/packages/cli/src/gemini.ts @@ -8,16 +8,70 @@ import React from 'react'; import { render } from 'ink'; import { App } from './ui/App.js'; import { loadCliConfig } from './config/config.js'; +import { readStdin } from './utils/readStdin.js'; +import { GeminiClient, ServerTool } from '@gemini-code/server'; + +import { PartListUnion } from '@google/genai'; async function main() { + let initialInput: string | undefined = undefined; + + // Check if input is being piped + if (!process.stdin.isTTY) { + try { + initialInput = await readStdin(); + } catch (error) { + console.error('Error reading from stdin:', error); + process.exit(1); + } + } + // Load configuration const config = loadCliConfig(); - // Render UI, passing necessary config values - render( - React.createElement(App, { - config, - }), - ); + + // Render UI, passing necessary config values and initial input + if (process.stdin.isTTY) { + render( + React.createElement(App, { + config, + initialInput, + }), + ); + } else if (initialInput) { + // If not a TTY and we have initial input, process it directly + const geminiClient = new GeminiClient( + config.getApiKey(), + config.getModel(), + ); + const toolRegistry = config.getToolRegistry(); + const availableTools: ServerTool[] = toolRegistry.getAllTools(); + const toolDeclarations = toolRegistry.getFunctionDeclarations(); + const chat = await geminiClient.startChat(toolDeclarations); + + const request: PartListUnion = [{ text: initialInput }]; + + try { + for await (const event of geminiClient.sendMessageStream( + chat, + request, + availableTools, + )) { + if (event.type === 'content') { + process.stdout.write(event.value); + } + // We might need to handle other event types later, but for now, just content. + } + process.stdout.write('\n'); // Add a newline at the end + process.exit(0); + } catch (error) { + console.error('Error processing piped input:', error); + process.exit(1); + } + } else { + // If not a TTY and no initial input, exit with an error + console.error('No input provided via stdin.'); + process.exit(1); + } } // --- Global Unhandled Rejection Handler --- |
