/* src/components/ask-ai/ask-ai.tsx */ import { useState, useEffect } from "react"; import { useLocalStorage } from "react-use"; import { toast } from "react-toastify"; import ChatInterface from "./ChatInterface"; import { defaultHTML } from "../../utils/consts"; import { v4 as uuidv4 } from "uuid"; import { AgentTask, ExecutionPlan } from "./AgentOrchestrator"; import { FiCpu, FiAlertCircle, FiCheckCircle, FiLoader } from "react-icons/fi"; export type AskAIProps = { agentId: string; html: string; setHtml: (h: string) => void; isAiWorking: boolean; setisAiWorking: (b: boolean) => void; onNewPrompt: (p: string) => void; onScrollToBottom: () => void; }; export default function AskAI(props: AskAIProps) { const { agentId, html, setHtml, isAiWorking, setisAiWorking, onNewPrompt, onScrollToBottom, } = props; /* lê as três chaves do localStorage ---------------------------- */ const [geminiKey] = useLocalStorage("geminiKey", ""); const [chatgptKey] = useLocalStorage("chatgptKey", ""); const [hfToken] = useLocalStorage("hfToken", ""); const [activeTasks, setActiveTasks] = useState([]); const [currentPlan, setCurrentPlan] = useState(null); // Funções para o orquestrador const handleTaskCreated = (task: AgentTask) => { setActiveTasks(prev => [...prev, task]); toast.info(`Nova tarefa criada: ${task.description.substring(0, 40)}...`); }; const handlePlanCreated = (plan: ExecutionPlan) => { setCurrentPlan(plan); toast.success(`Plano criado com ${plan.steps.length} passos`); }; const handleTaskUpdated = (taskId: string, status: AgentTask['status'], result?: string) => { setActiveTasks(prev => prev.map(task => task.id === taskId ? { ...task, status, result, completedAt: (status === 'completed' || status === 'failed') ? new Date() : undefined } : task ) ); }; // Limpa tarefas concluídas após 1 hora useEffect(() => { const interval = setInterval(() => { const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000); setActiveTasks(prev => prev.filter(task => task.status !== 'completed' || !task.completedAt || task.completedAt > oneHourAgo ) ); }, 15 * 60 * 1000); // Checa a cada 15 minutos return () => clearInterval(interval); }, []); // Determina a cor do status baseado no agentId const getAgentStatusColor = () => { switch (agentId) { case 'orchestrator': return 'bg-purple-600'; case 'mike': return 'bg-blue-600'; case 'alex': return 'bg-green-600'; case 'david': return 'bg-amber-600'; default: return 'bg-indigo-600'; } }; return (

Agente: {agentId}

{isAiWorking && (
)}
{currentPlan && (
Plano: {currentPlan.name}
{currentPlan.steps.length} passos planejados
)} {activeTasks.length > 0 && (
Tarefas:
{activeTasks .filter(t => t.status === 'in-progress') .slice(0, 2) .map(task => (
{task.description}
))} {activeTasks.filter(t => t.status === 'completed').length > 0 && (
{activeTasks.filter(t => t.status === 'completed').length} concluídas
)}
)}
); }