Sentō es el primer framework de agentes con mensajería agente-a-agente (A2A) como feature de primera clase. Dos agentes se emparejan una vez, intercambian un secreto compartido, y a partir de ahí se pueden mandar mensajes firmados por HTTP.
Sin servidor central. Sin broker pub/sub. Sin directorio hospedado. Sólo dos procesos Linux con endpoints HTTP y un secreto HMAC compartido.
Por qué tener esto
Casos de uso reales:
- Mira (marketing) necesita datos de Kai (personal): Mira le escribe a Kai, "¿cuáles fueron las tareas que Gabriel mencionó esta semana?" Kai le contesta con memoria relevante.
- Blair (casa) alerta a Porter (procesamiento de correo): Blair ve un mensaje de la escuela sobre un formulario nuevo; Porter maneja el escaneo y archivado.
- Load-shedding: un agente le pasa una sub-tarea a otro agente especializado.
Sin A2A, cada coordinación te necesita a vos como puente. Con esto, los agentes pueden cooperar directamente.
Cómo funciona el pairing
# En el agente A
sento pair
→ el agente imprime un código: SENTO-4F2K
→ el agente dice "que el dueño del otro agente corra `sento pair SENTO-4F2K`"
# En el agente B
sento pair SENTO-4F2K
→ el dueño de A ve en el chat: "El agente B quiere emparejarse. ¿Aprobar? (sí/no)"
→ el dueño de A escribe: sí
→ los dos agentes intercambian secretos HMAC
→ el pairing se guarda en ~/.sento-config.json en ambos lados
Ahora A y B se pueden mandar mensajes por HTTP.
El transporte
El Guardian de cada agente corre un listener HTTP en un puerto auto-seleccionado (9876, 9877, 9878…). Los mensajes son requests POST con:
X-Sento-Signature: HMAC-SHA256 del body usando el secreto compartidoX-Sento-Timestamp: timestamp RFC3339, se rechaza si es más viejo que 5 minutos- Rate limit: 10 requests / minuto por par, después 429
Los mensajes entregados se pipean a la sesión de tmux del agente destino como si fueran mensajes entrantes de chat marcados con ← agent <nombre>.
El modelo de seguridad
- Consentimiento mutuo: el pairing requiere que el dueño del agente receptor apruebe en el chat. El agente no puede auto-aceptar.
- Firmas HMAC: mensajes forjados sin el secreto compartido se rechazan.
- Ventana de timestamp: ataques de replay fallan después de 5 minutos.
- Rate limits: un agente mal comportado o comprometido no puede floodear a otro.
- Listen-only para pairings que aprobaste: remitentes desconocidos se caen en la capa HTTP antes de que Claude Code los vea.
Listar y des-emparejar
sento agents # lista agentes emparejados + puertos + último contacto
sento agents remove kai # revoca un pairing; rota nuestro lado del secreto
¿Qué mensajes se pueden mandar?
Cualquier texto. Patrones comunes:
- Preguntas / respuestas ("¿cuál es el top story de HN?")
- Handoffs estructurados de tareas ("escaneá esta factura: ")
- Pings de status ("¿estás?")
El agente destino recibe el texto como un mensaje entrante normal y responde como le respondería a un dueño humano, excepto que la respuesta vuelve por el canal A2A en vez de Discord/Telegram/Slack.
Dónde leer el código
src/templates/guardian.js— implementación del server HTTPsrc/commands/pair.js— flujo de pairingsrc/commands/agents.js— listado + remoción