diff options
Diffstat (limited to 'packages/cli/src/ui')
| -rw-r--r-- | packages/cli/src/ui/App.tsx | 15 | ||||
| -rw-r--r-- | packages/cli/src/ui/hooks/useStdin.ts | 84 |
2 files changed, 13 insertions, 86 deletions
diff --git a/packages/cli/src/ui/App.tsx b/packages/cli/src/ui/App.tsx index f3e8b742..3bfb73db 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 } from 'react'; +import React, { useState, useMemo, useEffect } from 'react'; // Added useEffect import { Box, Text } from 'ink'; import { StreamingState, type HistoryItem } from './types.js'; import { useGeminiStream } from './hooks/useGeminiStream.js'; @@ -25,9 +25,11 @@ import { Colors } from './colors.js'; interface AppProps { config: Config; + initialInput?: string; // Added optional prop } -export const App = ({ config }: AppProps) => { +export const App = ({ config, initialInput }: AppProps) => { + // Destructured prop const [history, setHistory] = useState<HistoryItem[]>([]); const [startupWarnings, setStartupWarnings] = useState<string[]>([]); const { streamingState, submitQuery, initError, debugMessage } = @@ -38,6 +40,15 @@ export const App = ({ config }: 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/useStdin.ts b/packages/cli/src/ui/hooks/useStdin.ts deleted file mode 100644 index dc245254..00000000 --- a/packages/cli/src/ui/hooks/useStdin.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @license - * Copyright 2025 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import { useState, useEffect } from 'react'; -import { useStdin } from 'ink'; - -export interface PipedInputState { - data: string | null; // Use null initially to distinguish from empty string - isLoading: boolean; - error: string | null; - isPiped: boolean; // Flag to indicate if input was piped -} - -export function usePipedInput(): PipedInputState { - const { stdin, setRawMode, isRawModeSupported } = useStdin(); - // Keep exit available if needed, e.g., for error handling, but maybe let consumer handle it - // const { exit } = useApp(); - - const [pipedData, setPipedData] = useState<string | null>(null); - const [isLoading, setIsLoading] = useState<boolean>(true); // Assume loading until checked - const [error, setError] = useState<string | null>(null); - const [isPiped, setIsPiped] = useState<boolean>(false); - - useEffect(() => { - // Determine if input is piped ONLY ONCE - const checkIsPiped = !stdin || !stdin.isTTY; - setIsPiped(checkIsPiped); - - if (checkIsPiped) { - // Piped input detected - if (isRawModeSupported) { - setRawMode(false); // Ensure raw mode is off for stream reading - } - - // Ensure stdin is available (it should be if !isTTY) - if (!stdin) { - setError('Stdin stream is unavailable.'); - setIsLoading(false); - return; // Cannot proceed - } - - let data = ''; - const handleData = (chunk: Buffer) => { - data += chunk.toString(); - }; - - const handleError = (err: Error) => { - setError('Error reading from stdin: ' + err.message); - setIsLoading(false); - // Decide if the hook should trigger exit or just report the error - // exit(); - }; - - const handleEnd = () => { - setPipedData(data); - setIsLoading(false); - // Don't exit here, let the component using the hook decide - }; - - stdin.on('data', handleData); - stdin.on('error', handleError); - stdin.on('end', handleEnd); - - // Cleanup listeners - return () => { - stdin.removeListener('data', handleData); - stdin.removeListener('error', handleError); - stdin.removeListener('end', handleEnd); - }; - } - - // No piped input (running interactively) - setIsLoading(false); - // Optionally set an 'info' state or just let isLoading=false & isPiped=false suffice - // setError('No piped input detected.'); // Maybe don't treat this as an 'error' - - // Intentionally run only once on mount or when stdin theoretically changes - }, [stdin, isRawModeSupported, setRawMode /*, exit */]); - - return { data: pipedData, isLoading, error, isPiped }; -} |
