// Package tui defines the pure TUI model, messages, update, and view. // Zero I/O, zero side effects. Only data transformations. package tui // Screen identifies the current TUI screen. type Screen int const ( ScreenMain Screen = iota ScreenAgentList // list all agents with status ScreenAgentActions // actions for a selected agent ScreenLogs // tail log output ScreenServer // server-wide process management ScreenTestOutput // test run output ) // Model is the complete TUI state — pure data. type Model struct { Screen Screen Agents []AgentView Cursor int Selected *AgentView // nil when no agent selected LogLines []string LogScroll int StatusMsg string // flash message ("Started OK", "Error: ...") WindowWidth int WindowHeight int // Unified launcher state LauncherRunning bool LauncherPID int LauncherUptime string LauncherMemory string LauncherCPU string LauncherLogSize string } // AgentView is a pre-formatted projection of an agent for display. type AgentView struct { ID string Name string Version string Desc string Enabled bool Running bool PID int Instances int // number of running instances (>1 means duplicates) Uptime string // formatted: "2h 15m" Memory string // formatted: "42 MB" CPU string // formatted: "1.2%" LogSize string // formatted: "350 KB" } // MenuOption represents a selectable menu item. type MenuOption struct { Label string Desc string } // MainMenuOptions returns the options for the main screen. func MainMenuOptions() []MenuOption { return []MenuOption{ {Label: "Agents", Desc: "Gestionar agentes"}, {Label: "Server", Desc: "Gestionar launcher unificado"}, {Label: "Quit", Desc: "Salir"}, } } // ServerMenuOptions returns the available server-wide actions. func ServerMenuOptions(running bool) []MenuOption { if running { return []MenuOption{ {Label: "Stop", Desc: "Detener el launcher"}, {Label: "Restart", Desc: "Reiniciar el launcher"}, {Label: "Kill", Desc: "SIGKILL forzado"}, {Label: "Rebuild & Restart", Desc: "Build + reiniciar"}, {Label: "Logs", Desc: "Ver log del launcher"}, {Label: "Run Tests", Desc: "Ejecutar todos los tests"}, } } return []MenuOption{ {Label: "Start", Desc: "Iniciar el launcher unificado"}, {Label: "Rebuild & Restart", Desc: "Build + iniciar"}, {Label: "Run Tests", Desc: "Ejecutar todos los tests"}, } } // AgentActionOptions returns the available actions based on agent state. func AgentActionOptions(enabled bool) []MenuOption { if enabled { return []MenuOption{ {Label: "Restart", Desc: "Reiniciar launcher para aplicar cambios"}, {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: "Enable", Desc: "Activar agente (requiere restart)"}, {Label: "Logs", Desc: "Ver log del launcher"}, } } // InitialModel returns the starting state. func InitialModel() Model { return Model{Screen: ScreenMain} }