"use client"; import { useState } from "react"; import { Wrench, ChevronDown, ChevronRight } from "lucide-react"; import type { Message, ToolCall } from "@/lib/types"; type Verbosity = "compact" | "normal" | "full"; interface Props { message: Message; toolResults: Map; verbosity?: Verbosity; } function ToolCallBlock({ tc, result, showResult }: { tc: ToolCall; result?: { name: string; content: string }; showResult: boolean }) { const [open, setOpen] = useState(showResult); let args: Record = {}; try { args = JSON.parse(tc.function.arguments); } catch {} return (
{open && (
            {JSON.stringify(args, null, 2)}
          
{showResult && result && (
              {result.content.slice(0, 1000)}{result.content.length > 1000 ? "..." : ""}
            
)}
)}
); } export function MessageBubble({ message, toolResults, verbosity = "normal" }: Props) { const isUser = message.role === "user"; const content = message.content || ""; let toolCalls: ToolCall[] = []; if (message.tool_calls) { try { toolCalls = JSON.parse(message.tool_calls); } catch {} } if (!content && toolCalls.length === 0) return null; // Compact: no tool calls at all const showTools = verbosity !== "compact" && toolCalls.length > 0; // Full: expand tool calls and show results const expandTools = verbosity === "full"; return (
{content && (

{verbosity === "compact" && content.length > 300 ? content.slice(0, 300) + "..." : content}

)} {showTools && (
{expandTools ? ( // Full: show all tool calls expanded with results toolCalls.map((tc) => ( )) ) : toolCalls.length <= 3 ? ( // Normal: collapsed tool calls, no results toolCalls.map((tc) => ( )) ) : ( // Normal with many tools: collapsed summary )}
)}
); } function CollapsedTools({ toolCalls, toolResults }: { toolCalls: ToolCall[]; toolResults: Map }) { const [open, setOpen] = useState(false); return (
{open && toolCalls.map((tc) => ( ))}
); }