From 36405a46f010346f5608f85e2212d317ba6c44da Mon Sep 17 00:00:00 2001 From: VPS 4 Deploy Agent Date: Sun, 28 Jun 2026 06:59:57 +0200 Subject: [PATCH] =?UTF-8?q?feat(secretaria):=20bot=C3=A3o=20"Usar=20este?= =?UTF-8?q?=20modelo"=20nos=20modelos=20de=20ajuda?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cada modelo do modal de ajuda ganha um botão que cria o nó correspondente no Cérebro (persona/knowledge/rules/calendar/escalation) já preenchido com o conteúdo de exemplo. Desabilitado se nenhum agente estiver selecionado. Co-Authored-By: Claude Opus 4.8 --- .../frontend/pages/secretaria/index.tsx | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/newwhats.clube67.com/newwhats.local/frontend/pages/secretaria/index.tsx b/newwhats.clube67.com/newwhats.local/frontend/pages/secretaria/index.tsx index a552ebe..8dd5717 100644 --- a/newwhats.clube67.com/newwhats.local/frontend/pages/secretaria/index.tsx +++ b/newwhats.clube67.com/newwhats.local/frontend/pages/secretaria/index.tsx @@ -1410,9 +1410,9 @@ function NewSlotModal({ // ─── Modal de Ajuda ───────────────────────────────────────────────────────── -const HELP_MODELOS: { titulo: string; icon: React.ElementType; cor: string; descricao: string; exemplo: string }[] = [ +const HELP_MODELOS: { titulo: string; type: BrainNodeType; icon: React.ElementType; cor: string; descricao: string; exemplo: string }[] = [ { - titulo: 'Persona', icon: Sparkles, cor: 'text-purple-400', + titulo: 'Persona', type: 'persona', icon: Sparkles, cor: 'text-purple-400', descricao: 'Identidade, tom de voz e personalidade da secretária — a base de como ela se comunica.', exemplo: `Você é a Ana, atendente da Clínica X. Seu jeito: calorosa, paciente e direta — nunca robótica. Adapte o tom ao do cliente. Use o nome dele com naturalidade, não em toda mensagem. @@ -1420,7 +1420,7 @@ Quando o cliente estiver frustrado, reconheça o sentimento antes de resolver. Nunca use linguagem corporativa ("prezado", "informamos que"). Varie as respostas.`, }, { - titulo: 'Conhecimento', icon: BookOpen, cor: 'text-blue-400', + titulo: 'Conhecimento', type: 'knowledge', icon: BookOpen, cor: 'text-blue-400', descricao: 'Fatos que a secretária precisa saber: horários, serviços, preços, endereço, políticas.', exemplo: `Horário: Seg a Sex, 08h–18h. Sáb 08h–12h. Endereço: Rua X, 123 — Centro. Estacionamento gratuito. @@ -1429,7 +1429,7 @@ Convênios: Unimed, Bradesco Saúde. Não atendemos outros convênios. Política: remarcação com 24h de antecedência.`, }, { - titulo: 'Regras', icon: ShieldCheck, cor: 'text-orange-400', + titulo: 'Regras', type: 'rules', icon: ShieldCheck, cor: 'text-orange-400', descricao: 'Comportamentos obrigatórios e proibições. Numere para a IA seguir à risca.', exemplo: `1. Sempre confirme nome completo e telefone antes de agendar. 2. Nunca invente preços ou horários — se não souber, diga que vai verificar. @@ -1438,7 +1438,7 @@ Política: remarcação com 24h de antecedência.`, 5. Para cobrança/estorno, encaminhe para um humano.`, }, { - titulo: 'Agenda', icon: Calendar, cor: 'text-green-400', + titulo: 'Agenda', type: 'calendar', icon: Calendar, cor: 'text-green-400', descricao: 'Autoriza consultar horários e agendar. Cadastre os horários na aba "Agenda".', exemplo: `Você pode consultar a agenda e oferecer horários livres. Ao agendar, confirme data, horário e nome, e repita o resumo: @@ -1446,7 +1446,7 @@ Ao agendar, confirme data, horário e nome, e repita o resumo: Ofereça opções concretas ("tenho 14h ou 16h"), não pergunte de forma vaga.`, }, { - titulo: 'Escalada', icon: AlertTriangle, cor: 'text-red-400', + titulo: 'Escalada', type: 'escalation', icon: AlertTriangle, cor: 'text-red-400', descricao: 'Quando e como passar o atendimento para um humano.', exemplo: `Transfira para humano quando: - O cliente pedir explicitamente. @@ -1456,7 +1456,11 @@ Como: "Vou chamar a equipe que resolve isso melhor pra você, um momento."`, }, ] -function HelpModal({ onClose }: { onClose: () => void }) { +function HelpModal({ onClose, onUseModel, canUse }: { + onClose: () => void + onUseModel: (type: BrainNodeType, title: string, content: string) => void + canUse: boolean +}) { return (
void }) {

{m.descricao}

{m.exemplo}
+
) })} @@ -1591,7 +1603,18 @@ export default function SecretariaPage() { {/* Thin Nav */} setShowHelp(true)} /> - {showHelp && setShowHelp(false)} />} + {showHelp && ( + setShowHelp(false)} + canUse={!!store.selectedAgent} + onUseModel={async (type, title, content) => { + if (!store.selectedAgent) return + await store.createNode(store.selectedAgent.id, { type, title, content, sort_order: store.nodes.length }) + setShowHelp(false) + setActiveTab('brain') + }} + /> + )} {/* Left Panel */}