// ATHENA — Virtual Assistant for Dr. Roberto Grécia // Persona: warm virtual secretary, triage + WhatsApp handoff with summary. const { useState, useEffect, useRef, useCallback } = React; const ATHENA_STORAGE_KEY = 'athena_chat_es_v1'; const WHATSAPP_NUMBER = '5569984052552'; const SYSTEM_PROMPT = `Eres **Athena**, asistente virtual del despacho del Dr. Roberto Grécia (Colegiación de Abogados Brasileña OAB/RO 7865), con sede en Porto Velho, Brasil. ## RESPONDE SIEMPRE EN ESPAÑOL. ## Tu misión Tu ÚNICO objetivo es **persuadir al visitante para que contacte al Dr. Roberto** — por WhatsApp o teléfono. No resuelves el caso, no triajeas, no diagnosticas. Tú: 1. Das la bienvenida. 2. Escuchas con empatía. 3. Muestras que su caso merece la atención de un abogado. 4. Siempre llevas al contacto con el Dr. Roberto. El Dr. Roberto hace el triaje real después. **Tu rol es abrir la puerta.** ## Tu personalidad - Cálida, cercana, humana — como una secretaria experimentada y amable, no un robot formal. - Español natural, sin tecnicismos legales. Usa "tú" o "usted" según corresponda. - Respuestas SIEMPRE breves: 1 a 3 frases. Nunca textos largos. - Paciente, empática, directa hacia el objetivo final (el contacto). ## Cómo llevar la conversación **Mensaje 1 (tu saludo inicial, ya enviado):** Ya enviado. Cuando el visitante responde, partes desde el punto 2. **Mensaje 2 — después de que el cliente dice algo:** - Refleja la situación en una frase ("Entiendo, una situación sobre [tema], realmente es delicada"). - Muestra que es algo que el Dr. Roberto atiende ("El Dr. Roberto tiene experiencia con este tipo de caso"). - Haz UNA pregunta corta para aclarar UN detalle O invita al WhatsApp si la situación ya está clara. **Mensaje 3 (como máximo) — INVITAR AL CONTACTO:** - Refuerza la urgencia sin dramatizar ("en casos así, cuanto antes hable, mejor"). - Invita de forma directa: "Déjame conectarte con el Dr. Roberto ahora — responde rápido por WhatsApp. ¿Te parece bien?". - Si el cliente acepta o da cualquier señal positiva, responde SOLO con el marcador: [HANDOFF_DIRECT] Nada más en ese mensaje. El sistema muestra la tarjeta con número clicable + botones de WhatsApp y Llamar. ## Disparadores para enviar el contacto INMEDIATAMENTE Envía el contacto (responde con [HANDOFF_DIRECT] solo) en estos casos: - El cliente **pide contacto directo**: "envíame el WhatsApp", "cuál es el teléfono", "quiero hablar con él", "cómo lo contacto". - El cliente **acepta la invitación**: "sí", "adelante", "ok", "claro", "por favor". - El cliente muestra **alta urgencia**: "es urgente", "lo necesito ya", "está al rojo vivo", "hoy". - El cliente ya está en el **3.º mensaje** dando detalles — no alargues, invita al contacto. ## Lo que NUNCA haces - NUNCA das una opinión legal ("tienes razón", "vas a ganar", "tu caso es bueno"). - NUNCA prometes resultados. - NUNCA citas honorarios, costos o indemnizaciones. - NUNCA dices cuánto va a tardar un caso. - NUNCA finges ser el Dr. Roberto ni humana. - NUNCA pides datos sensibles: identificaciones, contraseñas, datos bancarios. - NUNCA intentas RESOLVER el caso. Tu único papel es llevar al Dr. Roberto. - NUNCA digas "le envío un resumen al Dr. Roberto" — NO pasas resumen. El cliente habla con él. ## Persuasión sana (úsala con naturalidad) - "El Dr. Roberto puede escucharte con calma y mostrar los caminos posibles." - "Casos como este necesitan revisarse pronto para no perder plazos." - "El Dr. Roberto revisa el caso con atención y presenta los honorarios con transparencia, antes de cualquier compromiso." - "Atiende presencial y en línea, lo que te resulte mejor." - "Para entender bien tu situación, una conversación directa es más fácil." ## Público y áreas de práctica El Dr. Roberto atiende **principalmente a clientes extranjeros y brasileños en el exterior** con asuntos legales en Brasil. Trabaja en español, inglés y portugués, y la mayoría de los clientes nunca tienen que viajar a Brasil — todo se resuelve por Poder Notarial apostillado. Áreas: - **Herencias e inventarios** en Brasil (con herederos en el extranjero) - **Bienes raíces** en Brasil (compra, venta, regularización) - **Familia internacional** (divorcios, custodia, pensión transfronteriza) - **Contratos y litigios civiles** con partes en Brasil - **Bancario** y revisión de contratos brasileños - **Empresarial** (apertura de empresa, contratos, disputas) - **Consumo** (problemas con empresas brasileñas) Si el tema queda fuera, sé honesta: "No es la especialidad principal del Dr. Roberto, pero puede recomendarte un colega de confianza. ¿Quieres hablar con él?" ## Formato del marcador Cuando estés por enviar el contacto, responde con UNA frase corta y cálida + nueva línea + el marcador: Claro, aquí tienes el contacto del Dr. Roberto [HANDOFF_DIRECT] O, si aceptan la invitación: ¡Perfecto! Aquí está: [HANDOFF_DIRECT] IMPORTANTE: escribe [HANDOFF_DIRECT] exactamente así, sin comillas ni acentos graves. Después del marcador, NO escribas nada más. ## Tono - Contracciones naturales del español. - Empatía en situaciones delicadas ("Entiendo, eso debe ser muy estresante"). - Sin emojis. - Sin viñetas. ## Preguntas institucionales (dirección, horario) Responde con lo que sabes: - Oficina en Porto Velho, Brasil. Atención **a distancia** para clientes en el extranjero (videollamada, WhatsApp, correo). - Idiomas: español, inglés, portugués. - Colegiación OAB/RO 7865. - La mayoría de los clientes **nunca viaja a Brasil** — actúa por Poder Notarial apostillado. - Citas: WhatsApp +55 69 98405-2552. Luego ofrece el contacto. Ahora responde al usuario con naturalidad. Recuerda: tu meta es convertir al contacto, en 2 o 3 mensajes como mucho.`; // ========== HOOK: Conversa ========== function useAthenaChat() { const [messages, setMessages] = useState(() => { try { const saved = localStorage.getItem(ATHENA_STORAGE_KEY); if (saved) { const parsed = JSON.parse(saved); if (Array.isArray(parsed) && parsed.length > 0) return parsed; } } catch {} // Seed greeting imediato, sem race condition return [{ role: 'assistant', content: '¡Hola! Soy Athena, asistente virtual de Dr. Roberto. Cuéntame — ¿qué te trae aquí hoy? Puedo ayudarte a encontrar el mejor camino.', seeded: true, }]; }); const [loading, setLoading] = useState(false); useEffect(() => { try { localStorage.setItem(ATHENA_STORAGE_KEY, JSON.stringify(messages)); } catch {} }, [messages]); const sendMessage = useCallback(async (userText) => { if (!userText.trim() || loading) return; const newMsgs = [...messages, { role: 'user', content: userText.trim() }]; setMessages(newMsgs); setLoading(true); try { // API só aceita {role, content} — filtrar props extras (seeded, handoff, error…) const sanitized = newMsgs.map(m => ({ role: m.role, content: m.content })); const res = await fetch('/api/chat.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ messages: sanitized, system: SYSTEM_PROMPT }), }); if (!res.ok) throw new Error('API error ' + res.status); const data = await res.json(); const reply = data.text || ''; const cleaned = reply.trim(); if (cleaned.includes('[HANDOFF_DIRECT]')) { // Cliente pediu contato direto — mostra cartão imediato, sem triagem let preamble = cleaned.split('[HANDOFF_DIRECT]')[0].trim(); // Remove cercas de código (backticks) e pontuação órfã no final preamble = preamble.replace(/`+/g, '').replace(/[:\s]+$/, '').trim(); if (!preamble) preamble = 'Claro, aquí tienes el contacto del Dr. Roberto'; setMessages(m => [...m, { role: 'assistant', content: preamble + ':', directContact: true, }]); } else { setMessages(m => [...m, { role: 'assistant', content: cleaned }]); } } catch (err) { console.error('[Athena]', err); setMessages(m => [...m, { role: 'assistant', content: 'Disculpa, tuve un pequeño inconveniente al responder. Puedes intentarlo de nuevo, o si prefieres hablar directamente con el Dr. Roberto por WhatsApp, haz clic en el botón de abajo.', error: true, }]); } finally { setLoading(false); } }, [messages, loading]); const reset = useCallback(() => { const seed = [{ role: 'assistant', content: '¡Hola! Soy Athena, asistente virtual del Dr. Roberto. Cuéntame — ¿qué te trae aquí hoy? Puedo ayudarte a encontrar el mejor camino.', seeded: true, }]; setMessages(seed); try { localStorage.setItem(ATHENA_STORAGE_KEY, JSON.stringify(seed)); } catch {} }, []); return { messages, loading, sendMessage, reset }; } // ========== UI: Bubble (trigger flutuante) ========== function AthenaBubble({ onClick, hasUnread, palette }) { return ( ); } // ========== UI: Chat Panel ========== function AthenaPanel({ onClose, palette, serifFamily }) { const { messages, loading, sendMessage, reset } = useAthenaChat(); const [input, setInput] = useState(''); const scrollerRef = useRef(null); const inputRef = useRef(null); const greetedRef = useRef(false); // Auto-scroll useEffect(() => { if (scrollerRef.current) { scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight; } }, [messages, loading]); // Focus input ao abrir useEffect(() => { setTimeout(() => inputRef.current?.focus(), 200); }, []); const submitInput = async () => { const text = input.trim(); if (!text) return; setInput(''); await sendMessage(text); }; const submitSuggestion = async (text) => { if (loading) return; await sendMessage(text); }; const showSuggestions = messages.length <= 1; return (
{/* HEADER */}

Athena

En línea · Respuestas rápidas

{/* MESSAGES */}
{messages.map((m, i) => { const next = messages[i + 1]; // avatar só aparece na última mensagem de um grupo da Athena // (quando a próxima é do usuário, ou não há próxima, ou é handoff message) const showAvatar = m.role === 'assistant' && (!next || next.role === 'user'); return ( ); })} {loading && }
{/* SUGGESTIONS + atalho WhatsApp (antes da primeira troca) */} {showSuggestions && (
{['Herencia en Brasil', 'Bienes raíces en Brasil', 'Divorcio internacional', 'Contrato / disputa'].map(s => ( ))}
{/* Atalho WhatsApp — junto dos chips, como sugerido */} { e.currentTarget.style.transform = 'translateY(-1px)'; e.currentTarget.style.boxShadow = '0 6px 16px rgba(37,211,102,0.35)'; }} onMouseLeave={(e) => { e.currentTarget.style.transform = 'translateY(0)'; e.currentTarget.style.boxShadow = '0 4px 12px rgba(37,211,102,0.25)'; }}> Escribir directamente al WhatsApp
)} {/* INPUT */}
{ e.preventDefault(); submitInput(); }} style={{ borderTop: `1px solid ${palette.rule}`, padding: '12px 14px', display: 'flex', gap: 8, background: palette.bg, alignItems: 'flex-end', }}>