import { clienteConecta, verificarRelay, normalizarWebhook, enviarTexto, cifrar } from "@/lib/agente/core/canal";
Todo usa WebCrypto y fetch: funciona en Workers, Deno, Bun y Node 20+.
| Función |
|
clienteConecta(apiKey, base?) |
.crearSesion({client_name?, tenant_ref?}), .verSesion(id), .reclamar(id), .activar(id). Cada una devuelve { ok, status, json } |
esMensajeConecta(evento, sessionId) |
Valida el postMessage del pop-up (origen https://agentes.lemabot.com, type: "lema:conecta") |
CONECTA_URL |
https://agentes.lemabot.com |
| Función |
|
verificarRelay({ cuerpo, timestamp, firma, claveHex, ahora?, toleranciaSeg? }) |
{ ok: true } o { ok: false, motivo: "timestamp_viejo" | "firma_invalida" } |
CABECERAS_RELAY |
Nombres de las cabeceras x-lema-* |
normalizarWebhook(cuerpo) |
EventoWhatsApp[]: entrante, eco (respuesta desde la app), estado |
numerosDelCuerpo(cuerpo) |
phone_number_id presentes (comparar con la conexión → 403) |
textoDeMensaje(msg) |
Texto legible de cualquier tipo ([audio], [image], título de botón…) |
| Función |
|
enviarTexto({ token, phoneNumberId, to, texto }) |
Teléfono (to) o BSUID (recipient). Devuelve { ok, wamid } o { ok:false, error, codigo } |
marcarLeidoYEscribiendo({ token, phoneNumberId, wamid }) |
Leído + “escribiendo…” (máx. 25 s) |
dentroDeVentana(ultimoEntrante) |
Ventana de 24 h |
| Función |
|
cifrar(texto, ENCRYPTION_KEY) / descifrar(cifrado, ENCRYPTION_KEY) |
AES-GCM, formato iv:ct base64. Compatible con lo que guardó Minerales |
hmacSha256Hex, hexABytes, igualSeguro |
Utilidades |