feat: controles de hot-reload por agente en el dashboard TUI

Añade opciones de Reload (hot-reload) separadas de Restart (reinicio
completo) en el dashboard, usando el mecanismo SIGHUP implementado en
el issue 0013.

Cambios en pkg/tui/ (capa pura):
- IntentReloadAgent: hot-reload de un agente individual via SIGHUP
- IntentReloadAll: hot-reload de todos los agentes via SIGHUP
- AgentActionOptions: añade "Reload" antes de "Restart" con descripciones
  clarificadas ("sin interrumpir los demás" vs "launcher completo")
- ServerMenuOptions (running): añade "Reload All" como primera opción
- executeAction: maneja "Reload" → IntentReloadAgent
- executeServerAction: maneja "Reload All" → IntentReloadAll
- Mensajes de estado diferenciados: "Reload OK — X recargado sin
  interrupciones" vs "Restart OK — launcher reiniciado"

Cambios en shell/tui/ (capa impura):
- reloadAgent(id): escribe run/reload.txt + SIGHUP; error si launcher
  no está corriendo (no hay fallback a full restart)
- reloadAll(): elimina reload.txt + SIGHUP; error si no está corriendo
- restartAgent(id): restaurado a su comportamiento original de
  stop+start completo del launcher

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-08 18:49:00 +00:00
parent 6829de37c3
commit f459d4e255
3 changed files with 66 additions and 18 deletions
+5 -2
View File
@@ -96,6 +96,7 @@ func TestMenuOptions() []MenuOption {
func ServerMenuOptions(running bool) []MenuOption {
if running {
return []MenuOption{
{Label: "Reload All", Desc: "Hot-reload de todos los agentes (SIGHUP)"},
{Label: "Stop", Desc: "Detener el launcher"},
{Label: "Restart", Desc: "Reiniciar el launcher"},
{Label: "Kill", Desc: "SIGKILL forzado"},
@@ -115,13 +116,15 @@ func ServerMenuOptions(running bool) []MenuOption {
func AgentActionOptions(enabled bool) []MenuOption {
if enabled {
return []MenuOption{
{Label: "Restart", Desc: "Reiniciar launcher para aplicar cambios"},
{Label: "Reload", Desc: "Hot-reload este agente (SIGHUP, sin interrumpir los demás)"},
{Label: "Restart", Desc: "Reiniciar el launcher completo (todos los agentes)"},
{Label: "Disable", Desc: "Desactivar agente (requiere restart)"},
{Label: "Logs", Desc: "Ver log del launcher"},
}
}
return []MenuOption{
{Label: "Restart", Desc: "Reiniciar launcher para aplicar cambios"},
{Label: "Reload", Desc: "Hot-reload este agente (SIGHUP, sin interrumpir los demás)"},
{Label: "Restart", Desc: "Reiniciar el launcher completo (todos los agentes)"},
{Label: "Enable", Desc: "Activar agente (requiere restart)"},
{Label: "Logs", Desc: "Ver log del launcher"},
}