feat(secretaria): ícone de ajuda com modelos de uso e configuração

Adiciona botão de ajuda (HelpCircle) na barra da /secretaria que abre um modal
detalhado: como funciona (agente + cérebro) + modelos prontos para Persona,
Conhecimento, Regras, Agenda e Escalada (copie e adapte) + dicas de uso.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Deploy Agent
2026-06-28 06:50:43 +02:00
parent fdae8beb06
commit 7d191c0cf7
@@ -8,7 +8,7 @@ import {
Sparkles, BookOpen, ShieldCheck, Calendar, AlertTriangle, Sparkles, BookOpen, ShieldCheck, Calendar, AlertTriangle,
CheckCircle, Clock, User, RefreshCw, MoreVertical, Power, Cpu, CheckCircle, Clock, User, RefreshCw, MoreVertical, Power, Cpu,
Phone, Shield, Star, Repeat, UserCheck, Building2, Stethoscope, Phone, Shield, Star, Repeat, UserCheck, Building2, Stethoscope,
Maximize2, Save, Maximize2, Save, HelpCircle,
} from 'lucide-react' } from 'lucide-react'
import { useSecretariaStore } from '../../store/secretariaStore' import { useSecretariaStore } from '../../store/secretariaStore'
import type { SecAgent, BrainNode, SecConversation, BrainNodeType, CalendarSlot, SecNumber, NumberRole } from '../../services/secretariaApi' import type { SecAgent, BrainNode, SecConversation, BrainNodeType, CalendarSlot, SecNumber, NumberRole } from '../../services/secretariaApi'
@@ -25,7 +25,7 @@ const NAV_ITEMS: { id: NavTab; icon: React.ElementType; label: string }[] = [
{ id: 'numbers', icon: Phone, label: 'Números' }, { id: 'numbers', icon: Phone, label: 'Números' },
] ]
function ThinNav({ active, onChange }: { active: NavTab; onChange: (t: NavTab) => void }) { function ThinNav({ active, onChange, onHelp }: { active: NavTab; onChange: (t: NavTab) => void; onHelp: () => void }) {
return ( return (
<div className="w-[60px] h-full bg-[#0c0e14] border-r border-white/5 flex flex-col items-center py-4 shrink-0 z-30 gap-1"> <div className="w-[60px] h-full bg-[#0c0e14] border-r border-white/5 flex flex-col items-center py-4 shrink-0 z-30 gap-1">
{NAV_ITEMS.map(({ id, icon: Icon, label }) => ( {NAV_ITEMS.map(({ id, icon: Icon, label }) => (
@@ -42,6 +42,17 @@ function ThinNav({ active, onChange }: { active: NavTab; onChange: (t: NavTab) =
<Icon size={20} /> <Icon size={20} />
</button> </button>
))} ))}
<div className="flex-1" />
{/* Ajuda — modelos de como usar e configurar a secretária */}
<button
title="Ajuda — como usar"
onClick={onHelp}
className="w-10 h-10 rounded-xl flex items-center justify-center text-slate-600 hover:text-brand-400 hover:bg-white/5 transition-all"
>
<HelpCircle size={20} />
</button>
</div> </div>
) )
} }
@@ -1397,6 +1408,118 @@ function NewSlotModal({
) )
} }
// ─── Modal de Ajuda ─────────────────────────────────────────────────────────
const HELP_MODELOS: { titulo: string; icon: React.ElementType; cor: string; descricao: string; exemplo: string }[] = [
{
titulo: '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.
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',
descricao: 'Fatos que a secretária precisa saber: horários, serviços, preços, endereço, políticas.',
exemplo: `Horário: Seg a Sex, 08h18h. Sáb 08h12h.
Endereço: Rua X, 123 — Centro. Estacionamento gratuito.
Serviços: Consulta (R$200), Retorno (grátis em 30 dias), Exames.
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',
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.
3. Não revele que é uma IA, a menos que perguntado diretamente.
4. Respostas curtas e objetivas; detalhe só quando necessário.
5. Para cobrança/estorno, encaminhe para um humano.`,
},
{
titulo: 'Agenda', 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:
"Ficou marcado para 12/04 às 15h, certo?".
Ofereça opções concretas ("tenho 14h ou 16h"), não pergunte de forma vaga.`,
},
{
titulo: 'Escalada', 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.
- Envolver cobrança, estorno ou reclamação grave.
- Você não souber responder após 2 tentativas.
Como: "Vou chamar a equipe que resolve isso melhor pra você, um momento."`,
},
]
function HelpModal({ onClose }: { onClose: () => void }) {
return (
<div className="fixed inset-0 z-[100] bg-black/70 flex items-center justify-center p-4" onClick={onClose}>
<div
className="bg-[#0c0e14] border border-white/10 rounded-2xl w-full max-w-2xl max-h-[85vh] flex flex-col"
onClick={(e) => e.stopPropagation()}
>
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10 shrink-0">
<div className="flex items-center gap-3">
<div className="w-9 h-9 rounded-xl bg-brand-500/20 flex items-center justify-center">
<HelpCircle size={18} className="text-brand-400" />
</div>
<h2 className="text-lg font-bold text-white">Como usar e configurar a Secretária</h2>
</div>
<button onClick={onClose} className="text-slate-500 hover:text-white"><X size={20} /></button>
</div>
<div className="overflow-y-auto px-6 py-5 space-y-6">
<section>
<h3 className="text-sm font-bold text-brand-400 uppercase tracking-wide mb-2">Como funciona</h3>
<p className="text-sm text-slate-300 leading-relaxed">
A secretária é um <strong>Agente</strong> de IA cujo comportamento vem do <strong>Cérebro</strong>
um conjunto de nós. Cada ensina algo: quem ela é (Persona), o que sabe (Conhecimento),
o que deve/não deve fazer (Regras), como agendar (Agenda) e quando chamar um humano (Escalada).
Configure os nós, cadastre os horários na aba <strong>Agenda</strong>, vincule um número na aba
<strong> Números</strong> e <strong>teste em Conversas</strong> antes de ativar no WhatsApp.
</p>
</section>
<section>
<h3 className="text-sm font-bold text-brand-400 uppercase tracking-wide mb-3">Modelos de configuração (copie e adapte)</h3>
<div className="space-y-4">
{HELP_MODELOS.map((m) => {
const Icon = m.icon
return (
<div key={m.titulo} className="rounded-xl border border-white/10 bg-white/[0.02] p-4">
<div className="flex items-center gap-2 mb-1">
<Icon size={16} className={m.cor} />
<span className="text-sm font-semibold text-white">{m.titulo}</span>
</div>
<p className="text-xs text-slate-400 mb-2">{m.descricao}</p>
<pre className="text-xs text-slate-300 bg-black/40 rounded-lg p-3 whitespace-pre-wrap font-mono leading-relaxed">{m.exemplo}</pre>
</div>
)
})}
</div>
</section>
<section>
<h3 className="text-sm font-bold text-brand-400 uppercase tracking-wide mb-2">Dicas</h3>
<ul className="text-sm text-slate-300 space-y-1.5 list-disc list-inside">
<li>Comece pela <strong>Persona</strong> e pelo <strong>Conhecimento</strong> são os que mais mudam a qualidade.</li>
<li>Seja específico: a IA segue o que está escrito. Numere as <strong>Regras</strong>.</li>
<li>Sempre <strong>teste em Conversas</strong> antes de ativar para clientes reais.</li>
<li>Mantenha o Conhecimento <strong>atualizado</strong> (preços, horários) info errada gera atendimento errado.</li>
<li>Use a <strong>Escalada</strong> para a IA não insistir quando não sabe.</li>
</ul>
</section>
</div>
</div>
</div>
)
}
// ─── Main Page ──────────────────────────────────────────────────────────────── // ─── Main Page ────────────────────────────────────────────────────────────────
export default function SecretariaPage() { export default function SecretariaPage() {
@@ -1405,6 +1528,7 @@ export default function SecretariaPage() {
const [showNewConv, setShowNewConv] = useState(false) const [showNewConv, setShowNewConv] = useState(false)
const [showNewSlot, setShowNewSlot] = useState(false) const [showNewSlot, setShowNewSlot] = useState(false)
const [openNode, setOpenNode] = useState<BrainNode | null>(null) const [openNode, setOpenNode] = useState<BrainNode | null>(null)
const [showHelp, setShowHelp] = useState(false)
// Boot // Boot
useEffect(() => { useEffect(() => {
@@ -1465,7 +1589,9 @@ export default function SecretariaPage() {
<div className="flex h-screen w-full bg-[#080b10] overflow-hidden font-sans"> <div className="flex h-screen w-full bg-[#080b10] overflow-hidden font-sans">
{/* Thin Nav */} {/* Thin Nav */}
<ThinNav active={activeTab} onChange={handleTabChange} /> <ThinNav active={activeTab} onChange={handleTabChange} onHelp={() => setShowHelp(true)} />
{showHelp && <HelpModal onClose={() => setShowHelp(false)} />}
{/* Left Panel */} {/* Left Panel */}
<div className="w-[280px] h-full bg-[#0a0d15] border-r border-white/5 flex flex-col shrink-0"> <div className="w-[280px] h-full bg-[#0a0d15] border-r border-white/5 flex flex-col shrink-0">