From b2b9a244602d998f3e4561c1853be409a0916310 Mon Sep 17 00:00:00 2001 From: Felipe Domingues <53182096+domfelipe@users.noreply.github.com> Date: Thu, 28 May 2026 18:53:40 -0300 Subject: [PATCH] fix: harden skill defaults and dry-run preview (#4) --- src/components/mika/SkillsDashboardWidget.tsx | 10 +- src/components/mika/skills/SkillCard.tsx | 22 +- src/components/mika/skills/SkillTestPanel.tsx | 44 ++-- src/integrations/supabase/types.ts | 3 + src/routes/painel.agente.tsx | 30 ++- src/routes/painel.skills.$id.tsx | 75 ++++-- src/routes/painel.skills.index.tsx | 16 +- src/routes/painel.skills.preview.tsx | 224 ++++++++++-------- supabase/functions/_shared/default-skills.ts | 21 +- .../functions/test-skill-dry-run/index.ts | 178 ++++++++------ .../20260528203000_default_skills_quota.sql | 126 ++++++++++ 11 files changed, 495 insertions(+), 254 deletions(-) create mode 100644 supabase/migrations/20260528203000_default_skills_quota.sql diff --git a/src/components/mika/SkillsDashboardWidget.tsx b/src/components/mika/SkillsDashboardWidget.tsx index 4f643f8..531676c 100644 --- a/src/components/mika/SkillsDashboardWidget.tsx +++ b/src/components/mika/SkillsDashboardWidget.tsx @@ -33,7 +33,9 @@ export function SkillsDashboardWidget() {

Suas skills

{activeCount} ativa{activeCount === 1 ? "" : "s"} - {limits?.max_skills ? ` de ${limits.max_skills} disponíveis` : ""} + {limits?.max_skills + ? ` · ${limits.current_skills_count} de ${limits.max_skills} personalizadas` + : ""}

@@ -67,7 +69,11 @@ export function SkillsDashboardWidget() {

{skill.name}

- Atualizada {formatDistanceToNow(new Date(skill.updated_at), { addSuffix: true, locale: ptBR })} + Atualizada{" "} + {formatDistanceToNow(new Date(skill.updated_at), { + addSuffix: true, + locale: ptBR, + })}

diff --git a/src/components/mika/skills/SkillCard.tsx b/src/components/mika/skills/SkillCard.tsx index 687071f..f0d60ff 100644 --- a/src/components/mika/skills/SkillCard.tsx +++ b/src/components/mika/skills/SkillCard.tsx @@ -10,6 +10,7 @@ import { toast } from "sonner"; import { supabase } from "@/integrations/supabase/client"; import { syncAgentSkills } from "@/lib/sync-agent-skills"; import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; import { DropdownMenu, DropdownMenuContent, @@ -128,9 +129,7 @@ export function SkillCard({ skill }: { skill: Skill }) { > {skill.name} -

- {skill.description} -

+

{skill.description}

@@ -191,7 +190,14 @@ export function SkillCard({ skill }: { skill: Skill }) {
- +
+ + {skill.is_default && ( + + Padrão + + )} +
{formatDistanceToNow(new Date(skill.updated_at), { addSuffix: true, locale: ptBR })} @@ -203,8 +209,8 @@ export function SkillCard({ skill }: { skill: Skill }) { Arquivar esta skill? - A skill {skill.name} ficará invisível para o agente. Você - poderá restaurá-la depois sem perder o histórico. + A skill {skill.name} ficará invisível para o agente. Você poderá + restaurá-la depois sem perder o histórico. @@ -219,8 +225,8 @@ export function SkillCard({ skill }: { skill: Skill }) { Deletar definitivamente? - Esta ação remove {skill.name} e todo o histórico de versões. - Não é possível desfazer. + Esta ação remove {skill.name} e todo o histórico de versões. Não é + possível desfazer. diff --git a/src/components/mika/skills/SkillTestPanel.tsx b/src/components/mika/skills/SkillTestPanel.tsx index 98d9ddb..53d14a4 100644 --- a/src/components/mika/skills/SkillTestPanel.tsx +++ b/src/components/mika/skills/SkillTestPanel.tsx @@ -6,20 +6,11 @@ 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 { 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"; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; interface Props { open: boolean; @@ -80,7 +71,7 @@ export function SkillTestPanel({ // Modo preview sem persistência: chama AI direto via edge function const start = Date.now(); const { data, error } = await supabase.functions.invoke("test-skill-dry-run", { - body: { skill_version_id: skillVersionId, test_input: input }, + body: { markdown_content: stateless.markdown_content, test_input: input }, }); if (error) { return { @@ -122,9 +113,7 @@ export function SkillTestPanel({
- +