2.7 KiB
2.7 KiB
Plan: Interacción entre bots en una sala compartida
Objetivo
Que múltiples bots convivan en una sala Matrix, se "escuchen" entre sí y puedan colaborar en tareas — sin crear bucles infinitos.
Estado: pendiente
Problema central: evitar bucles
Si bot-A responde a bot-B y bot-B responde a bot-A, se genera un bucle.
Solución: reglas de anti-bucle en el motor de decisión
- Cada mensaje lleva metadatos
sendery opcionalmentem.relates_to - El
MatchFuncde las reglas puede filtrar porIsBot(sender)y aplicar lógica de cooldown o turno - El sistema de bus interno (
shell/bus/) puede coordinar turnos
Diseño
Nuevo tipo de sala: SharedRoom
Configurar en config.yaml bajo una sección rooms:
rooms:
- id: "!roomid:matrix.server.com"
type: "shared" # sala compartida entre bots
participants: # agentes que participan
- assistant-bot
- devops-bot
turn_based: false # si true, los bots se turnan por ronda
respond_to_bots: true # si false, solo responden a humanos
Lógica en agents/runtime.go
- Al recibir un evento en una sala compartida, verificar si
senderes un bot conocido - Aplicar una regla de "bot puede responder a bot" solo si:
- La sala tiene
respond_to_bots: true - No hay respuesta pendiente del mismo bot en los últimos N segundos (cooldown)
- No es una respuesta a un mensaje propio
- La sala tiene
Coordinación con el bus (shell/bus/)
- Publicar en el bus interno cuando un bot habla en una sala compartida
- Los otros bots suscritos al bus pueden reaccionar sin pasar por Matrix
- Posible uso: bot-A pide ayuda a bot-B por el bus, bot-B responde en Matrix
Reglas puras (pkg/decision/)
Nuevas funciones de match:
func SenderIsBot(knownBots []string) MatchFunc
func NotRepliedRecently(cooldown time.Duration) MatchFunc // requiere estado externo
func SenderIsHuman(knownBots []string) MatchFunc
Anti-bucle: cooldown simple
En agents/runtime.go mantener map[roomID]time.Time con el último mensaje enviado.
Si now - lastSent < cooldown, no responder en esa sala.
Cooldown configurable: rooms[].response_cooldown_seconds.
Archivos a crear/modificar
internal/config/schema.go— añadirRoomCfgcon campos shared roompkg/decision/matchers.go— SenderIsBot, SenderIsHumanagents/runtime.go— lógica de salas compartidas y cooldownshell/bus/bus.go— publicar eventos cross-botagents/<id>/agent.go— reglas específicas para salas compartidas
Notas
- Fase 1: solo cooldown simple — un bot no responde más de 1 vez por minuto en una sala compartida
- Fase 2: turno basado en bus interno
- Fase 3: colaboración estructurada (bot-A delega tarea a bot-B y espera resultado)