import { useState } from 'react' const TOOL_META = { write_file: { icon: '✎', label: 'Write file', summarize: (a) => a.path }, read_file: { icon: '↗', label: 'Read file', summarize: (a) => a.path }, delete_file: { icon: '✕', label: 'Delete file', summarize: (a) => a.path }, list_dir: { icon: '▤', label: 'List dir', summarize: (a) => a.path || '/' }, read_logs: { icon: '⌗', label: 'Read logs', summarize: (a) => `${a.kind}${a.lines ? ` (${a.lines})` : ''}` }, } const STATUS_DOT = { running: '#f59e0b', ok: '#22c55e', error: '#ef4444', } function tryPretty(s) { if (typeof s !== 'string') return '' try { return JSON.stringify(JSON.parse(s), null, 2) } catch { return s } } function ResultSummary({ result }) { if (!result) return null try { const parsed = JSON.parse(result) if (parsed.ok === false) return {parsed.error} // Compact summaries per tool if (parsed.bytes !== undefined) return {parsed.bytes} bytes written if (parsed.deleted) return deleted if (parsed.entries) return {parsed.count} entries if (parsed.lines !== undefined && parsed.content !== undefined) { return {parsed.lines} lines{parsed.truncated ? ' (truncated)' : ''} } if (parsed.lines_shown !== undefined) { return {parsed.lines_shown}/{parsed.lines_total} log lines } return ok } catch { return ok } } export default function ToolCallBlock({ tool }) { const [open, setOpen] = useState(false) const meta = TOOL_META[tool.name] || { icon: '⚙', label: tool.name, summarize: () => '' } const args = tool.args || {} const status = tool.status || 'running' const dot = STATUS_DOT[status] || STATUS_DOT.running return (
{JSON.stringify(args, null, 2)}
{tool.result && (
<>
{tryPretty(tool.result)}
>
)}