import { useState } from 'react'; import { AlertTriangle, BarChart3, BookOpen, Calculator, Check, ChevronDown, FileEdit, FileSearch, FileSpreadsheet, FileText, Globe, ListChecks, Loader2, Ruler, Sigma, TerminalSquare, } from 'lucide-react'; import type { ToolCallView } from '@/lib/types'; import { fmtDuration } from '@/lib/format'; import { cn } from '@/lib/cn'; import { ToolCard } from '@/components/tools/tool-card'; export const TOOL_META: Record = { search_course_content: { label: 'Matériel du cours', icon: BookOpen, tint: 'bg-uqo-blue-light text-uqo-blue' }, execute_python: { label: 'Calcul Python', icon: TerminalSquare, tint: 'bg-[#e8f1ff] text-[#1d4ed8]' }, create_excel: { label: 'Classeur Excel', icon: FileSpreadsheet, tint: 'bg-[#e3f3e0] text-[#217346]' }, edit_excel: { label: 'Modification du classeur Excel', icon: FileEdit, tint: 'bg-[#e3f3e0] text-[#217346]' }, inspect_excel: { label: 'Lecture du classeur Excel', icon: FileSearch, tint: 'bg-[#e3f3e0] text-[#217346]' }, web_search: { label: 'Recherche web', icon: Globe, tint: 'bg-[#fff4e0] text-[#b45309]' }, analyze_file: { label: 'Analyse du fichier déposé', icon: FileSearch, tint: 'bg-uqo-blue-light text-uqo-blue' }, generate_quiz: { label: 'Quiz', icon: ListChecks, tint: 'bg-[#f3e8ff] text-[#7e22ce]' }, financial_calc: { label: 'Calcul financier', icon: Calculator, tint: 'bg-neutral-surface text-neutral-text' }, appraisal_calc: { label: "Calcul d'évaluation", icon: Sigma, tint: 'bg-neutral-surface text-neutral-text' }, unit_convert: { label: "Conversion d'unités", icon: Ruler, tint: 'bg-neutral-surface text-neutral-text' }, make_chart: { label: 'Graphique', icon: BarChart3, tint: 'bg-[#e8f1ff] text-[#1d4ed8]' }, create_docx: { label: 'Document Word', icon: FileText, tint: 'bg-[#e6ecfb] text-[#2b579a]' }, }; const COLLAPSED_BY_DEFAULT = new Set(['financial_calc', 'search_course_content', 'unit_convert', 'inspect_excel']); export function ToolCallTimeline({ calls, conversationId }: { calls: ToolCallView[]; conversationId: string }) { const [open, setOpen] = useState>({}); if (!calls.length) return null; return (
    {calls.map((c) => { const meta = TOOL_META[c.name] || { label: c.name, icon: Calculator, tint: 'bg-neutral-surface text-neutral-text' }; const Icon = meta.icon; const running = c.status === 'running'; const error = c.status === 'error'; const expanded = open[c.id] ?? !COLLAPSED_BY_DEFAULT.has(c.name); return (
  1. {expanded && !running && (
    )}
  2. ); })}
); }