import { useMemo, useState, useEffect, memo } from "react"; import { Code2, Globe, PenLine, BarChart3, Map, Zap, CloudSun, Search, DollarSign, Newspaper, Calculator, BookOpen } from "lucide-react"; import AgentAvatar from "@/components/AgentAvatar"; import { getProactiveSuggestions, getTimeBasedGreeting } from "@/lib/agent/ProactiveAgent"; import { generateSuggestions } from "@/lib/agent/SmartSuggestions"; // Z7 import type { AgentStep } from "@/lib/storage"; // Z7 interface EmptyStateProps { onSend?: (text: string) => void; } const CATEGORIES = [ { icon: Code2, label: "Codice", desc: "Scrivi, debugga e analizza", color: "#38bdf8", prompt: "Scrivi uno script Python che ordina file per data di modifica", }, { icon: Globe, label: "Web", desc: "Cerca info e aggiornamenti", color: "#4ade80", prompt: "Ultime notizie tech di oggi", }, { icon: PenLine, label: "Testi", desc: "Email, documenti, contenuti", color: "#a78bfa", prompt: "Scrivi una email professionale di presentazione aziendale", }, { icon: BarChart3, label: "Analisi", desc: "Dati, calcoli e confronti", color: "#fbbf24", prompt: "Analizza i pro e contro di React vs Vue nel 2026", }, { icon: Map, label: "Pianifica", desc: "Itinerari, task, liste", color: "#f97316", prompt: "Pianifica un itinerario di 7 giorni in Giappone a maggio", }, { icon: Zap, label: "Quick", desc: "Domande e conversazione", color: "#60a5fa", prompt: "Spiega come funziona la fusione nucleare in modo semplice", } ]; const TEST_SCENARIOS = [ { icon: CloudSun, label: "Meteo Milano", color: "#38bdf8", tool: "get_weather", prompt: "Che tempo fa a Milano oggi? Dammi temperatura, condizioni e previsioni per domani.", }, { icon: Search, label: "Web search", color: "#4ade80", tool: "web_search", prompt: "Cerca le ultime notizie sull'intelligenza artificiale e i modelli LLM più recenti.", }, { icon: DollarSign, label: "Valuta EUR/USD", color: "#fbbf24", tool: "get_currency", prompt: "Quanto vale 100 euro in dollari americani oggi? Mostrami anche il cambio con yen giapponese.", }, { icon: Newspaper, label: "Notizie tech", color: "#f97316", tool: "get_news", prompt: "Top 5 notizie tecnologia di oggi. Fonti, titoli e breve riassunto di ognuna.", }, { icon: Calculator, label: "Calcolo + codice", color: "#a78bfa", tool: "run_code", prompt: "Scrivi ed esegui un script Python che calcola i primi 20 numeri di Fibonacci e mostra il risultato.", }, { icon: BookOpen, label: "Wikipedia", color: "#60a5fa", tool: "search_wikipedia", prompt: "Cerca su Wikipedia la storia dei Large Language Model (LLM) e spiegami i punti principali.", }, ]; // S459: colori priorità per i chip proattivi const PRIORITY_COLOR: Record = { high: "#f472b6", medium: "#60a5fa", low: "rgba(255,255,255,0.35)", }; const EmptyState = memo(function EmptyState({ onSend }: EmptyStateProps) { // S459: ProactiveAgent — saluto temporale + suggerimenti contestuali (sync, no LLM) const greeting = useMemo(() => { try { return getTimeBasedGreeting(); } catch { return ""; } }, []); const proactiveSugs = useMemo(() => { try { return getProactiveSuggestions(3); } catch { return []; } }, []); const [testScenariosOpen, setTestScenariosOpen] = useState(false); // Z7: SmartSuggestions basate sull'ultima conversazione const [smartSugs, setSmartSugs] = useState>([]); useEffect(() => { try { const raw = localStorage.getItem("agent_conversations"); if (!raw) return; const convs = JSON.parse(raw) as Array<{ messages?: Array<{role: string; content: string}>; steps?: AgentStep[]; }>; const last = convs[convs.length - 1]; if (!last) return; const lastUser = [...(last.messages ?? [])].reverse().find(m => m.role === "user"); if (!lastUser?.content || lastUser.content.length < 5) return; const sugs = generateSuggestions(lastUser.content, last.steps ?? [], 3); if (sugs.length > 0) setSmartSugs(sugs); } catch { /* non blocca il rendering */ } }, []); return (
{/* ── Brand ── */}
{/* S459: saluto temporale (Buongiorno / Buon pomeriggio / ecc.) */} {greeting && (

{greeting}

)}

AGENTE AI PRO

web · codice · github · memoria · strumenti

{/* ── S459: Proactive Suggestions — contestuali all'ora e alla sessione ── */} {proactiveSugs.length > 0 && (
💡 Suggeriti ora — basati su ora e sessione
{proactiveSugs.map((sug, i) => ( ))}
)} {/* ── Test Scenari — collapsible accordion ── */}
{testScenariosOpen &&
{TEST_SCENARIOS.map((sc, i) => { const Icon = sc.icon; return ( ); })}
}
{/* ── Z7: SmartSuggestions — continua da dove hai lasciato ── */} {smartSugs.length > 0 && (
✨ Continua da dove hai lasciato
{smartSugs.map((s, i) => ( ))}
)} {/* ── Category cards ── */}
Categorie
{CATEGORIES.map((cat, i) => { const Icon = cat.icon; return ( ); })}
{/* ── Footer ── */}

Enter {" "}invia ·{" "} ⇧ Enter {" "}a capo ·{" "} / {" "}comandi

); }); export default EmptyState;