769f648778
Se mueve el issue a dev/issues/completed/ y se actualiza el índice en README.md. El estado cambia de 'pendiente' a 'completado'.
3.2 KiB
3.2 KiB
Plan: Cron scheduler para actividad autónoma de los bots
Objetivo
Que los bots puedan publicar mensajes, ejecutar tareas o interactuar en salas de forma autónoma según un horario — sin que el usuario tenga que escribirles.
Estado: pendiente
Casos de uso
- Bot saluda "buenos días" en una sala a las 9:00
- Devops-bot hace healthcheck de servidores cada hora y reporta
- Assistant-bot publica un resumen diario a las 18:00
- Bots conversan entre sí a horas fijas para simular actividad
Diseño
Config YAML — schedules (ya existe en el schema)
schedules:
- cron: "0 9 * * *" # cada día a las 9:00
action: send_message
room: "!roomid:server.com"
template: "prompts/good-morning.md" # se envía como mensaje o como prompt al LLM
- cron: "0 * * * *" # cada hora
action: run_tool
tool: ssh_command
args:
host: "prod-server"
command: "systemctl is-active myapp"
- cron: "0 18 * * *"
action: llm_prompt
room: "!roomid:server.com"
prompt: "Genera un resumen del día de hoy para el equipo."
Tipos de acción de cron
| Tipo | Descripción |
|---|---|
send_message |
Envía un mensaje literal o desde plantilla a una sala |
run_tool |
Ejecuta una herramienta (SSH, HTTP, etc.) |
llm_prompt |
Llama al LLM con un prompt y publica la respuesta |
Implementación: shell/cron/
// Scheduler lanza goroutines para cada schedule configurado
type Scheduler struct {
agent *agents.Agent
cfg []config.ScheduleCfg
effects *effects.Runner
}
func (s *Scheduler) Start(ctx context.Context)
func (s *Scheduler) Stop()
Usa time.AfterFunc o una librería cron mínima.
Librería cron recomendada
github.com/robfig/cron/v3 — ligera, soporta sintaxis cron estándar y @every 1h.
Sin dependencias de CGO.
Integración en agents/runtime.go
type Agent struct {
...
scheduler *cron.Scheduler // nil si no hay schedules
}
func (a *Agent) Start(ctx) error {
...
if len(a.cfg.Schedules) > 0 {
a.scheduler = cron.New(a, a.cfg.Schedules, a.runner)
a.scheduler.Start(ctx)
}
}
Flujo para llm_prompt
- El cron dispara
- Construir
CompletionRequestcon el prompt del schedule - Llamar al LLM (usando
shell/llm/) - Emitir
SendMessageActioncon la respuesta - El Runner lo envía a la sala Matrix configurada
Archivos a crear/modificar
shell/cron/scheduler.go— Scheduler, parseador de ScheduleCfgshell/cron/actions.go— ejecutores de cada tipo de acción de croninternal/config/schema.go— revisar/completarScheduleCfg(ya tiene campos)agents/runtime.go— instanciar y arrancar el Schedulergo.mod— añadirgithub.com/robfig/cron/v3
Notas
- El Scheduler corre en goroutines separadas; respetar el
ctxde shutdown - Los prompts de los schedules pueden ser strings inline o rutas a archivos
.md - Fase 1: solo
send_messageyllm_prompt - Fase 2:
run_toolcon resultado incluido en el mensaje - Fase 3: schedules de interacción entre bots (bot-A pide a bot-B que haga algo)