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 compartido
  • X-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 HTTP
  • src/commands/pair.js — flujo de pairing
  • src/commands/agents.js — listado + remoción