🔁 DM Re-engagement
Archivo: /Users/user/rifai-agents/agentes/social/dm-reengage.ts · Plist: com.rifai.dm-reengage (solo en ~/Library/LaunchAgents/, no en cron/) · Horario: diario a las 18:00 (StartCalendarInterval Hour 18 / Minute 0, RunAtLoad false)
Qué hace
Una vez al día reactiva leads templados/calientes que escribieron por DM hace 24-72h, recibieron respuesta de "Sergio" y no han vuelto a contestar. Lee el historial que deja el DM Responder y selecciona a quienes mostraron intent de compra (precio, comprar, envío, stock, oferta…). Genera un mensaje de re-engagement personalizado con un LLM local y lo envía por Messenger/IG. Limita a 10 envíos por ejecución para no parecer spam y marca a cada cliente como ya re-contactado para no insistir.
Cómo funciona
1. Carga .env; si no existe data/dm-responder-state.json (historial del DM Responder), sale.
2. Carga su propio estado data/dm-reengage-state.json (pinged: clientes ya re-contactados).
3. Filtra candidatos del historial: tienen sender_id y platform, no han sido pinged, su edad está entre 22h y 72h, y el mensaje del cliente matchea intent de compra (regex precio|comprar|cuánto|envío|stock|disponible|oferta|descuento).
4. Para máx 10 candidatos: construye prompt recordando su consulta original y la respuesta dada, genera mensaje (haiku, 2-3 frases, sin inventar descuentos) con claude().
5. Envía con Graph API (/me/messages FB, /{IG_ID}/messages IG), marca al cliente en pinged y guarda estado.
6. Si envió ≥1, notifica resumen por el router (evento cs_question).
Datos/APIs
- Meta Graph API v21.0 (Messenger + IG Direct) para enviar el ping.
- LLM local
tools/gemini-cli(haiku). - notify-router evento
cs_question. - Fuente de datos:
data/dm-responder-state.json(lo producedm-responder.ts). Estado propio:data/dm-reengage-state.json. - Vars
.env:META_PAGE_ID(fallback 112610281241802),META_PAGE_TOKEN/META_ACCESS_TOKEN,INSTAGRAM_BUSINESS_ID(fallback 17841401185807202).
Cómo probarlo
cd /Users/user/rifai-agents && npx tsx agentes/social/dm-reengage.ts
Sin flag FORCE; envía DMs reales a los candidatos que cumplan la ventana 22-72h. Si no hay historial o no hay candidatos en esa ventana, sale limpio sin enviar. Salida esperada: cabecera 🔁 DM Re-engagement, N candidatos warm/hot, líneas ✅ plataforma sender: mensaje, y 📊 Re-engagement enviados: N. Nota: requiere que el DM Responder haya generado historial y que la ventana de mensajería de 24h de Messenger siga abierta.
Si se rompe / recuperar
launchctl unload ~/Library/LaunchAgents/com.rifai.dm-reengage.plist
launchctl load ~/Library/LaunchAgents/com.rifai.dm-reengage.plist
Logs: /Users/user/rifai-agents/logs/dm-reengage.out.log y .err.log. Fallos típicos: no existe historial del DM Responder (sale en seguida), token Meta caducado, o la ventana de 24h de Messenger cerrada (Meta rechaza el envío fuera de ese plazo). Plist NO versionado en cron/.
Cómo replicarlo
- Que el
dm-responder.tsesté corriendo y generandodata/dm-responder-state.jsonconhistory(sender_id, platform, ts, user_msg, reply). - Token de Página Meta con permisos de mensajería + IDs en
.env. - LLM local
tools/gemini-cliytools/notify-router. - Estado JSON
dm-reengage-state.jsonpara no re-pinguear + plistStartCalendarInterval18:00.