213 lines
5.1 KiB
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)")
|
|
}
|