diff options
Diffstat (limited to 'packages/cli/src')
| -rw-r--r-- | packages/cli/src/gemini.ts | 68 | ||||
| -rw-r--r-- | packages/cli/src/ui/App.tsx | 14 | ||||
| -rw-r--r-- | packages/cli/src/ui/hooks/useGeminiStream.ts | 38 |
3 files changed, 28 insertions, 92 deletions
diff --git a/packages/cli/src/gemini.ts b/packages/cli/src/gemini.ts index 0d8b1ac7..56a44e30 100644 --- a/packages/cli/src/gemini.ts +++ b/packages/cli/src/gemini.ts @@ -9,24 +9,9 @@ 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'; +import { GeminiClient } from '@gemini-code/server'; 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 and initial input @@ -34,42 +19,33 @@ async function main() { 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); + return; + } - const request: PartListUnion = [{ text: initialInput }]; + const input = await readStdin(); + if (!input) { + console.error('No input provided via stdin.'); + process.exit(1); + } - 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. + // If not a TTY and we have initial input, process it directly + const geminiClient = new GeminiClient(config); + const chat = await geminiClient.startChat(); + try { + for await (const event of geminiClient.sendMessageStream(chat, [ + { text: input }, + ])) { + if (event.type === 'content') { + process.stdout.write(event.value); } - 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); + // We might need to handle other event types later, but for now, just content. } - } else { - // If not a TTY and no initial input, exit with an error - console.error('No input provided via stdin.'); + 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); } } diff --git a/packages/cli/src/ui/App.tsx b/packages/cli/src/ui/App.tsx index b99a57c3..43a1d1e6 100644 --- a/packages/cli/src/ui/App.tsx +++ b/packages/cli/src/ui/App.tsx @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React, { useState, useMemo, useEffect } from 'react'; // Added useEffect +import React, { useState, useMemo } from 'react'; import { Box, Text } from 'ink'; import { StreamingState, type HistoryItem } from './types.js'; import { useGeminiStream } from './hooks/useGeminiStream.js'; @@ -25,10 +25,9 @@ import { Colors } from './colors.js'; interface AppProps { config: Config; - initialInput?: string; // Added optional prop } -export const App = ({ config, initialInput }: AppProps) => { +export const App = ({ config }: AppProps) => { // Destructured prop const [history, setHistory] = useState<HistoryItem[]>([]); const [startupWarnings, setStartupWarnings] = useState<string[]>([]); @@ -40,15 +39,6 @@ export const App = ({ config, initialInput }: AppProps) => { useStartupWarnings(setStartupWarnings); useInitializationErrorEffect(initError, history, setHistory); - // Effect to handle initial piped input - useEffect(() => { - if (initialInput && initialInput.trim() !== '') { - submitQuery(initialInput); - } - // Run only once on mount - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - const userMessages = useMemo( () => history diff --git a/packages/cli/src/ui/hooks/useGeminiStream.ts b/packages/cli/src/ui/hooks/useGeminiStream.ts index b8d13269..c4d44749 100644 --- a/packages/cli/src/ui/hooks/useGeminiStream.ts +++ b/packages/cli/src/ui/hooks/useGeminiStream.ts @@ -7,13 +7,11 @@ import { exec as _exec } from 'child_process'; import { useState, useRef, useCallback, useEffect } from 'react'; import { useInput } from 'ink'; -// Import server-side client and types import { GeminiClient, GeminiEventType as ServerGeminiEventType, // Rename to avoid conflict getErrorMessage, isNodeError, - ToolResult, Config, ToolCallConfirmationDetails, ToolCallResponseInfo, @@ -23,12 +21,7 @@ import { ToolEditConfirmationDetails, ToolExecuteConfirmationDetails, } from '@gemini-code/server'; -import { - type Chat, - type PartListUnion, - type FunctionDeclaration, - type Part, -} from '@google/genai'; +import { type Chat, type PartListUnion, type Part } from '@google/genai'; import { StreamingState, HistoryItem, @@ -69,10 +62,7 @@ export const useGeminiStream = ( setInitError(null); if (!geminiClientRef.current) { try { - geminiClientRef.current = new GeminiClient( - config.getApiKey(), - config.getModel(), - ); + geminiClientRef.current = new GeminiClient(config); } catch (error: unknown) { setInitError( `Failed to initialize client: ${getErrorMessage(error) || 'Unknown error'}`, @@ -166,9 +156,7 @@ export const useGeminiStream = ( if (!chatSessionRef.current) { try { - // Use getFunctionDeclarations for startChat - const toolSchemas = toolRegistry.getFunctionDeclarations(); - chatSessionRef.current = await client.startChat(toolSchemas); + chatSessionRef.current = await client.startChat(); } catch (err: unknown) { setInitError(`Failed to start chat: ${getErrorMessage(err)}`); setStreamingState(StreamingState.Idle); @@ -196,15 +184,7 @@ export const useGeminiStream = ( abortControllerRef.current = new AbortController(); const signal = abortControllerRef.current.signal; - // Get ServerTool descriptions for the server call - const serverTools: ServerTool[] = toolRegistry.getAllTools(); - - const stream = client.sendMessageStream( - chat, - query, - serverTools, - signal, - ); + const stream = client.sendMessageStream(chat, query, signal); // Process the stream events from the server logic let currentGeminiText = ''; // To accumulate message content @@ -477,13 +457,3 @@ export const useGeminiStream = ( return { streamingState, submitQuery, initError, debugMessage }; }; - -// Define ServerTool interface here if not importing from server (circular dep issue?) -interface ServerTool { - name: string; - schema: FunctionDeclaration; - shouldConfirmExecute( - params: Record<string, unknown>, - ): Promise<ToolCallConfirmationDetails | false>; - execute(params: Record<string, unknown>): Promise<ToolResult>; -} |
