Enhance deployment system with retry functionality and improved UX
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>
This commit is contained in:
317
demo/minimal_hap.go
Normal file
317
demo/minimal_hap.go
Normal file
@@ -0,0 +1,317 @@
|
||||
// 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")
|
||||
}
|
||||
Reference in New Issue
Block a user