Major Improvements: - Added retry deployment buttons in machine list for failed deployments - Added retry button in SSH console modal footer for enhanced UX - Enhanced deployment process with comprehensive cleanup of existing services - Improved binary installation with password-based sudo authentication - Updated configuration generation to include all required sections (agent, ai, network, security) - Fixed deployment verification and error handling Security Enhancements: - Enhanced verifiedStopExistingServices with thorough cleanup process - Improved binary copying with proper sudo authentication - Added comprehensive configuration validation UX Improvements: - Users can retry deployments without re-running machine discovery - Retry buttons available from both machine list and console modal - Real-time deployment progress with detailed console output - Clear error states with actionable retry options Technical Changes: - Modified ServiceDeployment.tsx with retry button components - Enhanced api/setup_manager.go with improved deployment functions - Updated main.go with command line argument support (--config, --setup) - Added comprehensive zero-trust security validation system 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
317 lines
8.4 KiB
Go
317 lines
8.4 KiB
Go
// Demo: Minimal HAP Binary
|
|
// This demonstrates the core architecture without problematic dependencies
|
|
|
|
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
// Minimal types to demonstrate the architecture
|
|
type BinaryType int
|
|
|
|
const (
|
|
BinaryTypeAgent BinaryType = iota
|
|
BinaryTypeHAP
|
|
)
|
|
|
|
func (bt BinaryType) String() string {
|
|
switch bt {
|
|
case BinaryTypeAgent:
|
|
return "agent"
|
|
case BinaryTypeHAP:
|
|
return "hap"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
// Minimal runtime config
|
|
type RuntimeConfig struct {
|
|
BinaryType BinaryType
|
|
HTTPPort int
|
|
HealthPort int
|
|
}
|
|
|
|
// Minimal services
|
|
type RuntimeServices struct {
|
|
Config *Config
|
|
NodeID string
|
|
BinaryType BinaryType
|
|
HTTPPort int
|
|
HealthPort int
|
|
}
|
|
|
|
type Config struct {
|
|
Agent struct {
|
|
ID string
|
|
Role string
|
|
Specialization string
|
|
}
|
|
}
|
|
|
|
// Minimal runtime interface
|
|
type Runtime interface {
|
|
Initialize(ctx context.Context, cfg RuntimeConfig) (*RuntimeServices, error)
|
|
Start(ctx context.Context, services *RuntimeServices) error
|
|
Stop(ctx context.Context, services *RuntimeServices) error
|
|
}
|
|
|
|
// Implementation
|
|
type StandardRuntime struct {
|
|
services *RuntimeServices
|
|
}
|
|
|
|
func NewRuntime() Runtime {
|
|
return &StandardRuntime{}
|
|
}
|
|
|
|
func (r *StandardRuntime) Initialize(ctx context.Context, cfg RuntimeConfig) (*RuntimeServices, error) {
|
|
fmt.Printf("🚀 Initializing BZZZ runtime (%s mode)\n", cfg.BinaryType.String())
|
|
|
|
services := &RuntimeServices{
|
|
Config: &Config{},
|
|
NodeID: fmt.Sprintf("node-%d", time.Now().Unix()),
|
|
BinaryType: cfg.BinaryType,
|
|
HTTPPort: cfg.HTTPPort,
|
|
HealthPort: cfg.HealthPort,
|
|
}
|
|
|
|
// Set some demo config
|
|
services.Config.Agent.ID = fmt.Sprintf("agent-%s-%d", cfg.BinaryType.String(), time.Now().Unix())
|
|
services.Config.Agent.Role = "human_coordinator"
|
|
services.Config.Agent.Specialization = "human_interaction"
|
|
|
|
r.services = services
|
|
fmt.Println("✅ Runtime initialization completed successfully")
|
|
return services, nil
|
|
}
|
|
|
|
func (r *StandardRuntime) Start(ctx context.Context, services *RuntimeServices) error {
|
|
fmt.Println("🚀 Starting BZZZ runtime services")
|
|
|
|
// Simulate service startup
|
|
fmt.Printf("🌐 HTTP API server started on :%d\n", services.HTTPPort)
|
|
fmt.Printf("🏥 Health endpoints available at http://localhost:%d/health\n", services.HealthPort)
|
|
|
|
fmt.Println("✅ All runtime services started successfully")
|
|
return nil
|
|
}
|
|
|
|
func (r *StandardRuntime) Stop(ctx context.Context, services *RuntimeServices) error {
|
|
fmt.Println("🛑 Shutting down BZZZ runtime services")
|
|
fmt.Println("✅ Graceful shutdown completed")
|
|
return nil
|
|
}
|
|
|
|
// HAP-specific terminal interface
|
|
type TerminalInterface struct {
|
|
services *RuntimeServices
|
|
running bool
|
|
scanner *bufio.Scanner
|
|
}
|
|
|
|
func NewTerminalInterface(services *RuntimeServices) *TerminalInterface {
|
|
return &TerminalInterface{
|
|
services: services,
|
|
running: false,
|
|
scanner: bufio.NewScanner(os.Stdin),
|
|
}
|
|
}
|
|
|
|
func (ti *TerminalInterface) Start(ctx context.Context) error {
|
|
fmt.Println("👤 Starting Human Agent Portal terminal interface")
|
|
|
|
ti.displayWelcome()
|
|
|
|
// Start command processing in background
|
|
go ti.processCommands(ctx)
|
|
|
|
ti.running = true
|
|
fmt.Println("✅ Terminal interface ready for human interaction")
|
|
return nil
|
|
}
|
|
|
|
func (ti *TerminalInterface) displayWelcome() {
|
|
fmt.Println("\n" + strings.Repeat("=", 60))
|
|
fmt.Println("🎯 BZZZ Human Agent Portal (HAP) - Demo")
|
|
fmt.Println(" Welcome to collaborative AI task coordination")
|
|
fmt.Println(strings.Repeat("=", 60))
|
|
fmt.Printf("📍 Node ID: %s\n", ti.services.NodeID)
|
|
fmt.Printf("🤖 Agent ID: %s\n", ti.services.Config.Agent.ID)
|
|
fmt.Printf("🎭 Role: %s\n", ti.services.Config.Agent.Role)
|
|
|
|
fmt.Println("\n📋 Available Commands:")
|
|
fmt.Println(" status - Show system status")
|
|
fmt.Println(" send <msg> - Send message (simulated)")
|
|
fmt.Println(" help - Show this help message")
|
|
fmt.Println(" quit/exit - Exit the interface")
|
|
fmt.Println(strings.Repeat("-", 60))
|
|
fmt.Print("HAP> ")
|
|
}
|
|
|
|
func (ti *TerminalInterface) processCommands(ctx context.Context) {
|
|
for ti.running && ti.scanner.Scan() {
|
|
input := strings.TrimSpace(ti.scanner.Text())
|
|
if input == "" {
|
|
fmt.Print("HAP> ")
|
|
continue
|
|
}
|
|
|
|
parts := strings.Fields(input)
|
|
command := strings.ToLower(parts[0])
|
|
|
|
switch command {
|
|
case "quit", "exit":
|
|
ti.running = false
|
|
return
|
|
|
|
case "help":
|
|
ti.showHelp()
|
|
|
|
case "status":
|
|
ti.showStatus()
|
|
|
|
case "send":
|
|
if len(parts) < 2 {
|
|
fmt.Println("❌ Usage: send <message>")
|
|
} else {
|
|
message := strings.Join(parts[1:], " ")
|
|
ti.sendMessage(message)
|
|
}
|
|
|
|
default:
|
|
fmt.Printf("❌ Unknown command: %s (type 'help' for available commands)\n", command)
|
|
}
|
|
|
|
fmt.Print("HAP> ")
|
|
}
|
|
}
|
|
|
|
func (ti *TerminalInterface) showHelp() {
|
|
fmt.Println("\n📋 HAP Commands:")
|
|
fmt.Println(" status - Show current system status")
|
|
fmt.Println(" send <msg> - Send message to coordination channel")
|
|
fmt.Println(" help - Show this help message")
|
|
fmt.Println(" quit/exit - Exit the Human Agent Portal")
|
|
}
|
|
|
|
func (ti *TerminalInterface) showStatus() {
|
|
fmt.Println("\n📊 System Status:")
|
|
fmt.Println(strings.Repeat("-", 40))
|
|
fmt.Printf("🌐 P2P Status: Connected (simulated)\n")
|
|
fmt.Printf("📍 Node ID: %s\n", ti.services.NodeID)
|
|
fmt.Printf("🤖 Agent ID: %s\n", ti.services.Config.Agent.ID)
|
|
fmt.Printf("🎭 Role: %s\n", ti.services.Config.Agent.Role)
|
|
fmt.Printf("📡 PubSub: ✅ Active (simulated)\n")
|
|
fmt.Printf("🔗 UCXI: ✅ Active (simulated)\n")
|
|
fmt.Printf("❤️ Health: ✅ Healthy\n")
|
|
fmt.Printf("⏰ Uptime: %s\n", "5m30s (simulated)")
|
|
}
|
|
|
|
func (ti *TerminalInterface) sendMessage(message string) {
|
|
fmt.Printf("📤 Message sent to coordination channel (simulated)\n")
|
|
fmt.Printf("💬 \"%s\"\n", message)
|
|
fmt.Printf("🎯 Broadcasting to P2P network...\n")
|
|
}
|
|
|
|
func (ti *TerminalInterface) Stop(ctx context.Context) error {
|
|
fmt.Println("🛑 Stopping terminal interface")
|
|
ti.running = false
|
|
return nil
|
|
}
|
|
|
|
func (ti *TerminalInterface) IsRunning() bool {
|
|
return ti.running
|
|
}
|
|
|
|
func main() {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
fmt.Println("👤 BZZZ Human Agent Portal (Demo)")
|
|
fmt.Println("==================================")
|
|
|
|
// Create runtime
|
|
rt := NewRuntime()
|
|
|
|
// Initialize with HAP-specific config (different ports to avoid conflicts)
|
|
runtimeConfig := RuntimeConfig{
|
|
BinaryType: BinaryTypeHAP,
|
|
HTTPPort: 8090, // Different from agent
|
|
HealthPort: 8091, // Different from agent
|
|
}
|
|
|
|
// Initialize runtime services
|
|
services, err := rt.Initialize(ctx, runtimeConfig)
|
|
if err != nil {
|
|
log.Fatalf("Failed to initialize runtime: %v", err)
|
|
}
|
|
|
|
// Start shared services
|
|
if err := rt.Start(ctx, services); err != nil {
|
|
log.Fatalf("Failed to start runtime: %v", err)
|
|
}
|
|
|
|
// Initialize HAP-specific components
|
|
hapInterface := NewTerminalInterface(services)
|
|
if err := hapInterface.Start(ctx); err != nil {
|
|
log.Fatalf("Failed to start HAP interface: %v", err)
|
|
}
|
|
|
|
fmt.Println("💬 Terminal interface ready for human interaction")
|
|
fmt.Println("🔍 HAP monitoring P2P network for collaboration opportunities")
|
|
fmt.Println("✅ BZZZ Human Agent Portal fully operational")
|
|
|
|
// Show architecture separation
|
|
fmt.Printf("\n📊 Architecture Demo:\n")
|
|
fmt.Printf(" Binary Type: %s\n", services.BinaryType.String())
|
|
fmt.Printf(" Shared Runtime: ✅ Initialized\n")
|
|
fmt.Printf(" HAP Interface: ✅ Started\n")
|
|
fmt.Printf(" HTTP Port: %d (different from agent)\n", services.HTTPPort)
|
|
fmt.Printf(" Health Port: %d (different from agent)\n", services.HealthPort)
|
|
fmt.Printf(" P2P Ready: ✅ (simulated)\n")
|
|
|
|
// Wait for shutdown signals or terminal interface to stop
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
// Wait for either signal or terminal interface to stop
|
|
go func() {
|
|
for hapInterface.IsRunning() {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
default:
|
|
time.Sleep(100 * time.Millisecond)
|
|
continue
|
|
}
|
|
}
|
|
// If terminal interface stops, trigger shutdown
|
|
sigChan <- syscall.SIGTERM
|
|
}()
|
|
|
|
<-sigChan
|
|
|
|
fmt.Println("\n🛑 Shutting down Human Agent Portal...")
|
|
|
|
// Stop HAP interface
|
|
if err := hapInterface.Stop(ctx); err != nil {
|
|
fmt.Printf("HAP interface shutdown error: %v\n", err)
|
|
}
|
|
|
|
// Stop runtime services
|
|
if err := rt.Stop(ctx, services); err != nil {
|
|
fmt.Printf("Runtime shutdown error: %v\n", err)
|
|
}
|
|
|
|
fmt.Println("✅ BZZZ Human Agent Portal shutdown completed")
|
|
} |