/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 */ import type React from 'react'; import { Box, Text } from 'ink'; import { ToolCallStatus } from '../../types.js'; import { RespondingSpinner } from '../RespondingSpinner.js'; import { SHELL_COMMAND_NAME, SHELL_NAME, TOOL_STATUS, } from '../../constants.js'; import { Colors } from '../../colors.js'; export const STATUS_INDICATOR_WIDTH = 3; export type TextEmphasis = 'high' | 'medium' | 'low'; type ToolStatusIndicatorProps = { status: ToolCallStatus; name: string; }; export const ToolStatusIndicator: React.FC = ({ status, name, }) => { const isShell = name === SHELL_COMMAND_NAME || name === SHELL_NAME; const warningColor = isShell ? Colors.Foreground : Colors.AccentYellow; return ( {status === ToolCallStatus.Pending && ( {TOOL_STATUS.PENDING} )} {status === ToolCallStatus.Executing && ( )} {status === ToolCallStatus.Success && ( {TOOL_STATUS.SUCCESS} )} {status === ToolCallStatus.Confirming && ( {TOOL_STATUS.CONFIRMING} )} {status === ToolCallStatus.Canceled && ( {TOOL_STATUS.CANCELED} )} {status === ToolCallStatus.Error && ( {TOOL_STATUS.ERROR} )} ); }; type ToolInfoProps = { name: string; description: string; status: ToolCallStatus; emphasis: TextEmphasis; showFullDescription?: boolean; }; export const ToolInfo: React.FC = ({ name, description, status, emphasis, showFullDescription = false, }) => { const nameColor = emphasis === 'low' ? Colors.Gray : Colors.Foreground; return ( {name} {' '} {description} ); }; export const TrailingIndicator: React.FC = () => ( {' '} ← );