import { Box, Text } from "ink"; import { memo } from "react"; import { useTerminalWidth } from "../hooks/useTerminalWidth"; import { BlinkDot } from "./BlinkDot.js"; import { colors } from "./colors.js"; import { MarkdownDisplay } from "./MarkdownDisplay.js"; type BashCommandLine = { kind: "bash_command"; id: string; input: string; output: string; phase?: "running" | "finished"; success?: boolean; }; /** * BashCommandMessage - Renders bash mode command output * Similar to CommandMessage but with red ! indicator instead of dot * * Features: * - Two-column layout with left gutter (2 chars) and right content area * - Red ! indicator (blinking when running) * - Proper terminal width calculation and wrapping * - Markdown rendering for output */ export const BashCommandMessage = memo( ({ line }: { line: BashCommandLine }) => { const columns = useTerminalWidth(); const rightWidth = Math.max(0, columns - 2); // gutter is 2 cols // Determine indicator state based on phase and success const getIndicatorElement = () => { if (!line.phase || line.phase === "finished") { // Show red ! for both success and failure (it's user-run, not agent-run) return !; } if (line.phase === "running") { return ; } return !; }; return ( {/* Command input */} {getIndicatorElement()} {line.input} {/* Command output (if present) */} {line.output && ( {" ⎿ "} )} ); }, ); BashCommandMessage.displayName = "BashCommandMessage";