summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui')
-rw-r--r--packages/cli/src/ui/App.tsx15
-rw-r--r--packages/cli/src/ui/hooks/useStdin.ts84
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 };
-}