🔔 Recordatorios Smart (Secretario)
Archivo: /Users/user/rifai-agents/agentes/migrated/recordatorios-smart.ts · Plist: com.rifai.recordatorios-smart · Horario: cada 15 min (StartInterval 900 s); el propio script salta los domingos.
Qué hace
Es el motor de recordatorios temporizados del Secretario (Sec). Cada 15 minutos lee la base Notion "Tasks Tracker" buscando tareas con vencimiento hoy o mañana que no estén en estado Done. Según la antelación, manda avisos escalonados: la noche de antes (24h), por la mañana a las 9 y 14 para tareas sin hora, y 2h / 30min / 15min antes para citas con hora concreta. Cada aviso se envía una sola vez gracias a un fichero anti-repetición. Los recordatorios salen por el router hacia CEOSEC (Sec).
Cómo funciona
1. Parsea .env y fija la zona horaria a Europe/Madrid; si es domingo (dow === 0) sale sin hacer nada.
2. Calcula today y tomorrow y el minuto total del día actual.
3. Carga data/recordatorios-sent.json (mapa clave→fecha de aviso ya enviado), limpia claves viejas y define fresh(key) para no repetir.
4. Hace POST a la API de Notion (databases/<DB_ID>/query) filtrando Status != Done y Due date = hoy o mañana.
5. Para cada tarea extrae nombre, fecha/hora de vencimiento, prioridad (emoji 🔴/🟡/🟢) y tipo (Task type multi_select, detecta si es cita/calendar).
6. Genera mensajes según reglas de ventana:
- 24h: tareas con due = mañana, a partir de las 20:00, una vez.
- Hoy sin hora: a las 9 y a las 14 (
minutes < 15), una vez por franja. - Citas con hora: 2h antes, 30min antes y (solo citas) 15min antes, cada uno una sola vez, con ventana de 15 min.
7. Si hay mensajes, los une y llama a notify({ event: 'sec_reminder', level: 'info', ... }). Solo marca como enviados (persistiendo en el JSON) si el router confirma entrega a ceosec; si falla, se reintenta en el siguiente ciclo.
Datos/APIs
- Notion API (
api.notion.com, versión2022-06-28) — base Tasks Tracker32602a86-b28a-80ab-9fbb-d88bbe3367db(propiedadesTask name,Status,Due date,Priority,Task type). - Router de notificaciones (
tools/notify-router.ts) → Telegram CEOSEC vía eventosec_reminder. - Estado local:
/Users/user/rifai-agents/data/recordatorios-sent.json(anti-repetición). - Variables
.env:NOTION_TOKEN,TELEGRAM_BOT_TOKEN,TELEGRAM_CHAT_ID.
Cómo probarlo
cd /Users/user/rifai-agents && npx tsx agentes/migrated/recordatorios-smart.ts
No tiene flag FORCE: solo emite avisos si la hora actual (Madrid) cae dentro de alguna ventana (20h+, 9h, 14h, o 2h/30min/15min antes de una cita) y la clave está "fresh". Para forzar salida en pruebas, crea una tarea Notion con hora a +2h y ejecuta, o borra/edita data/recordatorios-sent.json para resetear lo ya enviado.
Si se rompe / recuperar
launchctl unload ~/Library/LaunchAgents/com.rifai.recordatorios-smart.plist
launchctl load ~/Library/LaunchAgents/com.rifai.recordatorios-smart.plist
Logs en /Users/user/rifai-agents/logs/recordatorios-smart.log. Si manda avisos repetidos, revisa que data/recordatorios-sent.json exista y sea escribible. Si no manda nada, comprueba el token Notion y que las tareas tengan Due date con hora.
Cómo replicarlo
Origen n8n: workflow ldAmGHBn6KZfahCt "Secretario - Recordatorios Smart". Backup en /Users/user/rifai-agents/backups/n8n-export/01_recordatorios-smart.json. Piezas para rehacerlo:
1. Trigger cron cada 15 min, con guarda de domingo y zona horaria Madrid.
2. Query Notion filtrando Status != Done y due hoy/mañana.
3. Lógica de ventanas de antelación (24h / 9h+14h sin hora / 2h / 30min / 15min citas).
4. Deduplicación persistente en disco (una sola alerta por clave pageId:tipo:fecha).
5. Envío vía router (sec_reminder) marcando enviado solo tras confirmación de entrega.