Files
blackroad-cli/internal/commands/agents.go

213 lines
5.1 KiB
Go

package commands
import (
"fmt"
"os"
"strconv"
"github.com/BlackRoad-OS/blackroad-cli/internal/api"
"github.com/olekukonko/tablewriter"
"github.com/spf13/cobra"
)
var agentsCmd = &cobra.Command{
Use: "agents",
Short: "Manage agents",
Long: "List, view, register, and manage BlackRoad agents.",
}
var agentsListCmd = &cobra.Command{
Use: "list",
Short: "List agents",
Run: func(cmd *cobra.Command, args []string) {
client, err := api.NewClient()
if err != nil {
printError(err.Error())
return
}
division, _ := cmd.Flags().GetString("division")
level, _ := cmd.Flags().GetInt("level")
status, _ := cmd.Flags().GetString("status")
agents, err := client.ListAgents(division, level, status)
if err != nil {
printError(err.Error())
return
}
if len(agents) == 0 {
fmt.Println("No agents found")
return
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"ID", "Name", "Type", "Division", "Level", "Status"})
table.SetBorder(false)
table.SetHeaderColor(
tablewriter.Colors{tablewriter.FgCyanColor},
tablewriter.Colors{tablewriter.FgCyanColor},
tablewriter.Colors{tablewriter.FgCyanColor},
tablewriter.Colors{tablewriter.FgCyanColor},
tablewriter.Colors{tablewriter.FgCyanColor},
tablewriter.Colors{tablewriter.FgCyanColor},
)
for _, a := range agents {
div := a.Division
if div == "" {
div = "-"
}
table.Append([]string{
a.ID[:12],
a.Name,
a.Type,
div,
strconv.Itoa(a.Level),
a.Status,
})
}
table.Render()
fmt.Printf("\n%s %d agents\n", cyan("Total:"), len(agents))
},
}
var agentsGetCmd = &cobra.Command{
Use: "get <agent-id>",
Short: "Get agent details",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
client, err := api.NewClient()
if err != nil {
printError(err.Error())
return
}
agent, err := client.GetAgent(args[0])
if err != nil {
printError(err.Error())
return
}
fmt.Printf("%s %s\n", bold("ID:"), agent.ID)
fmt.Printf("%s %s\n", bold("Name:"), agent.Name)
fmt.Printf("%s %s\n", bold("Type:"), agent.Type)
fmt.Printf("%s %s\n", bold("Division:"), agent.Division)
fmt.Printf("%s %d\n", bold("Level:"), agent.Level)
fmt.Printf("%s %s\n", bold("Status:"), agent.Status)
fmt.Printf("%s %.1f%%\n", bold("Load:"), agent.Load*100)
fmt.Printf("%s %s\n", bold("Created:"), agent.CreatedAt.Format("2006-01-02 15:04:05"))
},
}
var agentsRegisterCmd = &cobra.Command{
Use: "register <name>",
Short: "Register a new agent",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
client, err := api.NewClient()
if err != nil {
printError(err.Error())
return
}
agentType, _ := cmd.Flags().GetString("type")
division, _ := cmd.Flags().GetString("division")
level, _ := cmd.Flags().GetInt("level")
agent, err := client.RegisterAgent(args[0], agentType, division, level)
if err != nil {
printError(err.Error())
return
}
printSuccess(fmt.Sprintf("Agent registered: %s", agent.ID))
},
}
var agentsHeartbeatCmd = &cobra.Command{
Use: "heartbeat <agent-id>",
Short: "Send heartbeat for an agent",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
client, err := api.NewClient()
if err != nil {
printError(err.Error())
return
}
load, _ := cmd.Flags().GetFloat64("load")
if err := client.SendHeartbeat(args[0], load); err != nil {
printError(err.Error())
return
}
printSuccess("Heartbeat sent")
},
}
var agentsDeleteCmd = &cobra.Command{
Use: "delete <agent-id>",
Short: "Delete an agent",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
client, err := api.NewClient()
if err != nil {
printError(err.Error())
return
}
if err := client.DeleteAgent(args[0]); err != nil {
printError(err.Error())
return
}
printSuccess("Agent deleted")
},
}
var agentsStatsCmd = &cobra.Command{
Use: "stats",
Short: "Show agent statistics",
Run: func(cmd *cobra.Command, args []string) {
client, err := api.NewClient()
if err != nil {
printError(err.Error())
return
}
stats, err := client.AgentStats()
if err != nil {
printError(err.Error())
return
}
fmt.Printf("%s\n", bold("Agent Statistics"))
fmt.Printf("%s %d\n", cyan("Total:"), stats.Total)
fmt.Printf("%s %d\n", green("Active:"), stats.Active)
},
}
func init() {
agentsCmd.AddCommand(agentsListCmd)
agentsCmd.AddCommand(agentsGetCmd)
agentsCmd.AddCommand(agentsRegisterCmd)
agentsCmd.AddCommand(agentsHeartbeatCmd)
agentsCmd.AddCommand(agentsDeleteCmd)
agentsCmd.AddCommand(agentsStatsCmd)
// List flags
agentsListCmd.Flags().StringP("division", "d", "", "Filter by division")
agentsListCmd.Flags().IntP("level", "l", 0, "Filter by level")
agentsListCmd.Flags().StringP("status", "s", "", "Filter by status")
// Register flags
agentsRegisterCmd.Flags().StringP("type", "t", "ai", "Agent type (ai, human, bot, service)")
agentsRegisterCmd.Flags().StringP("division", "d", "", "Division")
agentsRegisterCmd.Flags().IntP("level", "l", 4, "Agent level (1-4)")
// Heartbeat flags
agentsHeartbeatCmd.Flags().Float64("load", 0, "Current load (0.0 to 1.0)")
}