Plataforma
Disparadores
Un disparador (trigger) es lo que arranca un flujo. Cada flujo declara un único tipo de disparador — la puerta por la que algo del mundo real le pide al flujo que corra. Daguito tiene diez tipos, cada uno con su contrato de datos.
¿Qué es un disparador?
Un disparador es la fuente de un evento entrante. No hace trabajo: solo recibe la señal (un mensaje, un webhook, una hora del reloj) y entrega al motor una entrada normalizada para que el flujo empiece a ejecutarse.
Los tipos viven como un array de constantes tipado (CANONICAL_TRIGGER_TYPES), nunca como literales sueltos. Así un flujo solo puede declarar un disparador válido.
// Canonical trigger types — apps/api/src/flows/architecture.ts
const CANONICAL_TRIGGER_TYPES = [
'message', // inbound message from a channel
'media', // image / audio / document / video file
'stream', // real-time voice turn
'webhook', // external HTTP POST
'schedule', // cron / scheduled
'manual', // manual run from the dashboard or API
'flow_completed', // another flow finished
'record', // data record change (reserved)
'timeout', // a wait expired
'event_delayed', // delayed business event (abandoned cart, reminder)
] as const Los diez tipos
Agrupados por cómo se activan:
Desde una conversación
- message — un usuario envía un mensaje de texto desde cualquier canal (WhatsApp, Instagram, el widget…). Es el disparador más común.
- media — llega un archivo: imagen, audio, documento o video. Habilita OCR, análisis de documentos o descripción de imágenes.
- stream — audio de voz en vivo (streaming). Para flujos de voz en tiempo real con transcripción y síntesis.
Desde un sistema externo
- webhook — un sistema externo hace un POST HTTP (o abre un WebSocket) a una URL con token. Sin auth: el token es el secreto.
- manual — disparo explícito desde el panel o la API. Útil para probar un flujo o ejecutarlo bajo demanda.
- event_delayed — observa un evento de negocio, espera una ventana de tiempo y dispara (cancelándose si llega otro evento). Potencia carrito abandonado, recordatorios y seguimientos sin respuesta.
Del tiempo y del propio motor
- schedule — ejecución por cron, a una hora o intervalo. Para reportes, sincronizaciones o campañas programadas.
- timeout — venció una espera de un nodo y el flujo retoma. Por ejemplo, un seguimiento tras varios minutos de inactividad.
- flow_completed — otro flujo terminó y encadena al siguiente. Así compones flujos grandes con piezas pequeñas.
record está definido en el modelo (un cambio en un registro de datos: alta o modificación) pero aún no tiene adaptador. Es un tipo reservado para una versión futura; hoy no se puede declarar en producción.
Contrato de datos
Cada disparador entrega un objeto tipado al motor. Esto es lo que recibe tu flujo según el disparador que declare:
message → { text, sender, channel, session_key, metadata }
media → { file_url, mime_type, size, sender, channel, session_key }
stream → { stream_id, codec, sample_rate, session_key }
webhook → { method, headers, body, source }
schedule → { cron, last_run, scheduled_at }
manual → { triggered_by, params }
flow_completed → { source_flow_id, execution_id, status, output }
record → { table, action, record, old_record } // reserved
timeout → { node_id, wait_key, resume_at, reason }
event_delayed → { watch_event, delay_minutes, cancel_events, payload_filter? } Canales y disparadores
Un canal no es lo mismo que un disparador. El canal es la fuente (WhatsApp, Instagram, el widget, un webhook); el disparador es el tipo de evento que arranca el flujo. Varios canales pueden producir el mismo disparador: un mensaje del widget y uno de WhatsApp llegan ambos como message.
Cada canal se conecta a su disparador mediante un adaptador, que normaliza la carga específica de la plataforma en un InboundMessage antes de pasarla al pipeline de ingesta unificado. Así el motor nunca tiene que saber de dónde vino el evento.