Files
agents_and_robots/pkg/tui/model.go
T

90 lines
2.5 KiB
Go

// 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
)
// 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
}
// 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 servidor"},
{Label: "Quit", Desc: "Salir"},
}
}
// ServerMenuOptions returns the available server-wide actions.
func ServerMenuOptions() []MenuOption {
return []MenuOption{
{Label: "Start All", Desc: "Iniciar todos los agentes habilitados"},
{Label: "Stop All", Desc: "Detener todos los agentes"},
{Label: "Restart All", Desc: "Reiniciar todos los agentes"},
{Label: "Kill All", Desc: "SIGKILL forzado a todos"},
}
}
// AgentActionOptions returns the available actions based on agent state.
func AgentActionOptions(running bool) []MenuOption {
if running {
return []MenuOption{
{Label: "Stop", Desc: "Detener el agente"},
{Label: "Restart", Desc: "Reiniciar"},
{Label: "Kill", Desc: "SIGKILL forzado"},
{Label: "Logs", Desc: "Ver log del agente"},
}
}
return []MenuOption{
{Label: "Start", Desc: "Iniciar el agente"},
{Label: "Logs", Desc: "Ver log del agente"},
}
}
// InitialModel returns the starting state.
func InitialModel() Model {
return Model{Screen: ScreenMain}
}