/** * ToolOutputItem - Single tool output item with expandable breakdown. */ import React, { useState } from 'react'; import { COLOR_TEXT_MUTED, COLOR_TEXT_SECONDARY } from '@renderer/constants/cssVariables'; import { ChevronRight, Wrench } from 'lucide-react'; import { formatTokens } from '../utils/formatting'; import { ToolBreakdownItem } from './ToolBreakdownItem'; import type { ToolOutputInjection } from '@renderer/types/contextInjection'; interface ToolOutputItemProps { injection: ToolOutputInjection; onNavigateToTurn?: (turnIndex: number) => void; } export const ToolOutputItem = ({ injection, onNavigateToTurn, }: Readonly): React.ReactElement => { const [expanded, setExpanded] = useState(false); const turnIndex = injection.turnIndex; const isClickable = onNavigateToTurn && turnIndex >= 0; const hasBreakdown = injection.toolBreakdown.length > 0; const containerContent = ( <> {hasBreakdown && ( )} {isClickable ? ( { e.stopPropagation(); onNavigateToTurn(turnIndex); }} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onNavigateToTurn(turnIndex); } }} > @Turn {turnIndex + 1} ) : ( @Turn {turnIndex + 1} )} ~{formatTokens(injection.estimatedTokens)} tokens {injection.toolCount} tool{injection.toolCount !== 1 ? 's' : ''} ); return (
{hasBreakdown ? ( ) : (
{containerContent}
)} {expanded && hasBreakdown && (
{injection.toolBreakdown.map((tool, idx) => ( ))}
)}
); };