/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import type React from 'react'; import { Box, Text } from 'ink'; import type { AnsiLine, AnsiOutput, AnsiToken } from '@google/gemini-cli-core'; const DEFAULT_HEIGHT = 24; interface AnsiOutputProps { data: AnsiOutput; availableTerminalHeight?: number; width: number; maxLines?: number; disableTruncation?: boolean; } export const AnsiOutputText: React.FC = ({ data, availableTerminalHeight, width, maxLines, disableTruncation, }) => { const availableHeightLimit = availableTerminalHeight && availableTerminalHeight > 0 ? availableTerminalHeight : undefined; const numLinesRetained = availableHeightLimit !== undefined && maxLines !== undefined ? Math.min(availableHeightLimit, maxLines) : (availableHeightLimit ?? maxLines ?? DEFAULT_HEIGHT); const lastLines = disableTruncation ? data : data.slice(-numLinesRetained); return ( {lastLines.map((line: AnsiLine, lineIndex: number) => ( ))} ); }; export const AnsiLineText: React.FC<{ line: AnsiLine }> = ({ line }) => ( {line.length > 0 ? line.map((token: AnsiToken, tokenIndex: number) => ( {token.text} )) : null} );