"use client"; import { useState, useRef, useEffect } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Loader2, Play, X } from "lucide-react"; import { formatDistanceToNow } from "date-fns"; import { ptBR } from "date-fns/locale"; import { supabase } from "@/integrations/supabase/client"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Badge } from "@/components/ui/badge"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; interface Props { open: boolean; onOpenChange: (open: boolean) => void; skillName: string; skillVersionId: string; triggerKeywords?: string; // se não houver skill_version_id ainda (preview), passa o markdown direto e usa stateless mode stateless?: { markdown_content: string }; } interface TestResult { status: "success" | "error"; test_output?: string; duration_ms: number; error_message?: string; } export function SkillTestPanel({ open, onOpenChange, skillName, skillVersionId, triggerKeywords, stateless, }: Props) { const [input, setInput] = useState(""); const [result, setResult] = useState(null); const inputRef = useRef(null); const qc = useQueryClient(); useEffect(() => { if (open) setTimeout(() => inputRef.current?.focus(), 50); }, [open]); const placeholder = triggerKeywords ? `Ex: "${triggerKeywords.split(",")[0]?.trim() || "..."}"` : "Digite um exemplo de input que você daria ao Mika para acionar esta skill"; const history = useQuery({ queryKey: ["skill-test-runs", skillVersionId], enabled: open && !stateless, queryFn: async () => { const { data, error } = await supabase .from("skill_test_runs") .select("*") .eq("skill_version_id", skillVersionId) .order("created_at", { ascending: false }) .limit(5); if (error) throw error; return data ?? []; }, }); const runTest = useMutation({ mutationFn: async (): Promise => { if (stateless) { // Modo preview sem persistência: chama AI direto via edge function const runTest = useMutation({ mutationFn: async (): Promise => { const start = Date.now(); const requestBody: Record = { test_input: input }; if (stateless) { requestBody.markdown_content = stateless.markdown_content; } else { requestBody.skill_version_id = skillVersionId; } const { data, error } = await supabase.functions.invoke("test-skill-dry-run", { body: requestBody, }); if (error) { return { status: "error", duration_ms: Date.now() - start, error_message: error.message, }; } return data as TestResult; }, setResult({ status: "error", duration_ms: 0, error_message: e instanceof Error ? e.message : "Erro desconhecido", }); }, }); return ( Testar skill: {skillName}