/** * El trigger de Todoist (`serviceConfig.todoist`, 2026-10-11): qué eventos de * la cuenta conectada lo disparan. En un solo sitio para el DTO del api y la * pantalla del dashboard. * * ## De dónde llegan * * Los webhooks de Todoist son de la APP, no del trigger: la app de HostWebhook * declara UNA URL y los eventos en la App Management Console, y Todoist manda * ahí los de TODOS los usuarios que conectaron la app por OAuth, cada uno con * su `user_id`. El api reparte cada evento a los triggers activos de las * credenciales de ese usuario. Por eso aquí sólo se elige QUÉ eventos (y, si se * quiere, de qué proyecto); la cuenta la dice la credencial. * * ⚠️ Todoist sólo manda los eventos de usuarios que hicieron el OAuth con la * app, y los 25 de aquí tienen que estar marcados en la consola: uno que no lo * esté no llega nunca. * * ## Nada viene elegido * * `events` no tiene defecto: `null` (o vacío) = sin contestar, y Activate no se * deja pulsar hasta que haya al menos uno ({@link todoistTriggerSinContestar}). */ /** El `service` del trigger. */ export declare const TODOIST_TRIGGER_SERVICE = "todoist"; export interface TodoistTriggerEventSpec { /** El `event_name` de Todoist, tal cual. */ type: string; label: string; description: string; } export interface TodoistTriggerEventGroup { label: string; /** Si el evento trae `project_id` y el filtro por proyecto le aplica. */ tieneProyecto: boolean; events: ReadonlyArray; } /** Los eventos que se pueden elegir, por grupo y en el orden de la pantalla. */ export declare const TODOIST_TRIGGER_EVENT_GROUPS: ReadonlyArray; /** Todos los tipos, en el orden de la pantalla. */ export declare const TODOIST_TRIGGER_EVENTS: ReadonlyArray; /** El spec de cada tipo, para el nombre en pantalla y los logs. */ export declare const TODOIST_TRIGGER_EVENT_BY_TYPE: Readonly>; /** Los tipos a los que el filtro por proyecto les aplica (traen `project_id`). */ export declare const TODOIST_TRIGGER_EVENTOS_CON_PROYECTO: ReadonlyArray; export interface TodoistTriggerConfig { /** Sin defecto: `null` o vacío = sin contestar. */ events: string[] | null; /** * Opcional: sólo los eventos de ESTE proyecto (el id). Vacío = de todos. A * los eventos sin proyecto (etiquetas, filtros, recordatorios) no les * aplica: pasan siempre. En los de proyecto, cuenta el propio proyecto. */ projectId?: string | null; /** El nombre del proyecto elegido, sólo para enseñarlo. */ projectName?: string | null; } /** * Lo que falta por contestar antes de activar. Vacío = se puede activar. Un * tipo que no está en la lista no cuenta como contestado: no llegaría nunca. */ export declare function todoistTriggerSinContestar(cfg: Partial | null | undefined): string[]; /** * El proyecto de un evento, para el filtro: el `project_id` del objeto, o el * propio `id` cuando el objeto ES un proyecto. `null` = el evento no tiene * proyecto (o no se sabe) y el filtro no le aplica. * * 🔥 [2026-10-11, medido en prod] Un comentario de TAREA (`note:*`) llega sin * `project_id`: trae `item_id` y la tarea entera en `item`, y el proyecto * está en `item.project_id`. Sin esto, con un proyecto elegido en el trigger * se descartaban TODOS los comentarios de tareas. Los de proyecto sí traen * `project_id` propio. */ export declare function todoistProyectoDelEvento(eventName: string, eventData: Readonly> | null | undefined): string | null;