📅 Sync Calendar a Task Tracker (Secretario)
Archivo: /Users/user/rifai-agents/agentes/migrated/sync-calendar.ts · Plist: com.rifai.sync-calendar · Horario: cada hora (StartInterval 3600 s).
Qué hace
Sincroniza el Google Calendar principal del CEO hacia la base Notion "Tasks Tracker" del Secretario. Cada hora lee los eventos de los próximos 7 días del calendario primary y crea en Notion las tareas tipo Calendar que aún no existen, para que el resto del subsistema Sec (recordatorios) trabaje sobre una única fuente de verdad. Evita duplicados comparando por nombre y salta los cumpleaños automáticos de Google. Si crea tareas nuevas, lo notifica a CEOSEC (Sec).
Cómo funciona
1. Parsea .env.
2. Refresca el access token de Google haciendo POST a oauth2.googleapis.com/token con client_id/secret/refresh_token (grant_type refresh_token); si falla, sale con error.
3. GET a Calendar API calendars/primary/events con timeMin=now, timeMax=now+7d, singleEvents=true, orderBy=startTime.
4. Normaliza cada evento a { name, date, time, fullStart }; descarta los sin fecha y los titulados "¡Feliz cumpleaños!".
5. POST a Notion databases/<DB_ID>/query filtrando tareas Task type contiene Calendar con due entre hoy y +7d; construye un Set de nombres existentes (en minúsculas).
6. Filtra los eventos de calendario cuyo nombre no esté ya en Notion (los "nuevos").
7. Para cada nuevo, POST a api.notion.com/v1/pages creando la página con Status=Not started, Priority=Medium, Task type=[Calendar] y Due date=fullStart.
8. Si creó alguno, manda un resumen vía notify({ event: 'sec_calendar_synced', level: 'info', ... }).
Datos/APIs
- Google OAuth2 (
oauth2.googleapis.com/token) — refresh del access token. - Google Calendar API v3 (
calendar/v3/calendars/primary/events) — lectura de eventos próximos 7 días. - Notion API (
api.notion.com, versión2022-06-28) — base Tasks Tracker32602a86-b28a-80ab-9fbb-d88bbe3367db: query de existentes + creación de páginas. - Router de notificaciones (
tools/notify-router.ts) → Telegram CEOSEC vía eventosec_calendar_synced. - Variables
.env:GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GOOGLE_REFRESH_TOKEN,NOTION_TOKEN,TELEGRAM_BOT_TOKEN,TELEGRAM_CHAT_ID.
Cómo probarlo
cd /Users/user/rifai-agents && npx tsx agentes/migrated/sync-calendar.ts
No tiene ventana horaria ni flag FORCE: cada ejecución sincroniza de verdad. Es idempotente (no recrea eventos ya presentes en Notion), así que se puede lanzar a mano sin riesgo de duplicar. Para una prueba sin escribir, crea un evento de calendario nuevo y observa que aparece en Notion una sola vez.
Si se rompe / recuperar
launchctl unload ~/Library/LaunchAgents/com.rifai.sync-calendar.plist
launchctl load ~/Library/LaunchAgents/com.rifai.sync-calendar.plist
Logs en /Users/user/rifai-agents/logs/sync-calendar.log. Fallo más común: refresh_token de Google caducado/revocado (❌ refresh_token falló → exit 1) — hay que regenerar GOOGLE_REFRESH_TOKEN. Si crea duplicados, revisa que los nombres de evento/tarea coincidan (el dedupe es por nombre en minúsculas).
Cómo replicarlo
Origen n8n: workflow SnGN5hJTVG9RZEM6 "Sync Calendar a Task Tracker v2". Backup en /Users/user/rifai-agents/backups/n8n-export/02_sync-calendar.json. Piezas para rehacerlo:
1. Trigger cron horario.
2. Refresh OAuth2 de Google → access token.
3. Lectura de eventos Calendar próximos 7 días (singleEvents, orderBy startTime), filtrando cumpleaños.
4. Query Notion de tareas Calendar existentes en la ventana → dedupe por nombre.
5. Creación de páginas Notion para los eventos nuevos y notificación vía router (sec_calendar_synced).