/** * WhatsApp Action en modo AI toolkit — las herramientas que ve un AI Node. * * ## Se muda al paquete (2026-09-29) * * Vivían escritas a mano en la api (`mcp-servers/toolkit-specs.ts`) y otra vez * en el dashboard. Ahora hay una sola copia, aquí, como las de los demás. * * ## Las decisiones de Ariel (2026-09-29) * * - **El modelo sólo contesta a quien escribió.** Ninguna herramienta tiene * `to`: el destinatario es el remitente del mensaje de WhatsApp que * disparó el flujo, y el AI Node se lo pasa al nodo por el CONTEXTO de la * llamada (`executorContext.conversacion`), no por los argumentos — así el * modelo no lo puede cambiar ni inventar. Sin un mensaje de WhatsApp en el * flujo (un Run Test suelto, un cliente MCP), las herramientas que mandan * se niegan diciendo por qué. Ver {@link conversacionDeWhatsapp}. * - **Nace bloqueada sólo la plantilla.** Una plantilla abre una * conversación iniciada por la empresa y Meta la cobra; contestar dentro * de las 24 h que abre el mensaje recibido es gratis. * * ## Los argumentos SON la configuración * * Los nombres (`text`, `previewUrl`, `templateName`…) son los mismos campos * que lee el envío (`whatsapp-operations.service.ts`, gemelo api/hw-nodes), así * que no hace falta traducirlos. `replyToMessageId` y `messageId` son * opcionales: sin ellos, el mensaje que disparó el flujo. */ import type { WhatsAppOperation } from './whatsapp-operations.js'; export interface WhatsappToolkitParameter { name: string; type: 'string' | 'number' | 'boolean'; description: string; required: boolean; } export interface WhatsappToolkitSpec { operation: WhatsAppOperation; label: string; toolName: string; description: string; parameters: WhatsappToolkitParameter[]; destructive?: boolean; /** Nace bloqueada en el nodo; el dueño la desbloquea. Ver `toolkits.ts`. */ bloqueadaPorDefecto?: boolean; /** Manda algo a una persona: necesita la conversación del flujo. */ necesitaConversacion: boolean; } export declare const WHATSAPP_TOOLKIT_SPECS: WhatsappToolkitSpec[]; export declare const WHATSAPP_TOOLKIT_SPECS_BY_TOOL_NAME: Readonly>; /** El canal del payload de un mensaje entrante del trigger de WhatsApp. */ export declare const WHATSAPP_CANAL = "whatsapp"; /** * A quién contesta el toolkit: el remitente del mensaje de WhatsApp que * disparó el flujo, y el mensaje y el número que lo recibieron. * * Viaja en `executorContext.conversacion` (node-sdk), NO en los argumentos: lo * pone el AI Node a partir de SU payload, y el modelo no lo ve ni lo toca. */ export interface ConversacionDeWhatsapp { canal: 'whatsapp'; /** El número de quien escribió (wa_id: sin `+`). */ de: string; /** El id del mensaje que disparó el flujo (`wamid…`). */ mensajeId: string | null; /** El Phone number ID que lo recibió. */ numeroId: string | null; } /** * La conversación de un payload, si es un mensaje entrante del trigger de * WhatsApp (`channel: 'whatsapp'`, `event: 'message'`, `from`). Si no lo es, * `null`: no hay a quién contestar. * * Es la MISMA forma que despacha el trigger (api, `whatsapp-evento.ts`); un * spec de allí la fija contra esta función. */ export declare function conversacionDeWhatsapp(payload: unknown): ConversacionDeWhatsapp | null;