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>
147 lines
4.4 KiB
Go
147 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"chorus.services/bzzz/internal/common/runtime"
|
|
"chorus.services/bzzz/internal/hap"
|
|
"chorus.services/bzzz/logging"
|
|
)
|
|
|
|
func main() {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
// Create logger for HAP
|
|
logger := logging.NewStandardLogger("bzzz-hap")
|
|
|
|
// Create runtime
|
|
rt := runtime.NewRuntime(logger)
|
|
|
|
// Initialize shared runtime with HAP-specific configuration
|
|
runtimeConfig := runtime.RuntimeConfig{
|
|
ConfigPath: getConfigPath(),
|
|
BinaryType: runtime.BinaryTypeHAP,
|
|
EnableSetupMode: needsSetup(),
|
|
CustomPorts: runtime.PortConfig{
|
|
HTTPPort: 8090, // Different from agent to avoid conflicts
|
|
HealthPort: 8091,
|
|
UCXIPort: 8092,
|
|
},
|
|
}
|
|
|
|
// Check for instance collision
|
|
if err := runtime.CheckForRunningInstance("hap", runtime.BinaryTypeHAP); err != nil {
|
|
log.Fatalf("Instance check failed: %v", err)
|
|
}
|
|
defer runtime.RemoveInstanceLock("hap", runtime.BinaryTypeHAP)
|
|
|
|
// 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 := hap.NewTerminalInterface(services, logger)
|
|
if err := hapInterface.Start(ctx); err != nil {
|
|
log.Fatalf("Failed to start HAP interface: %v", err)
|
|
}
|
|
|
|
logger.Info("👤 BZZZ Human Agent Portal started successfully")
|
|
logger.Info("📍 Node ID: %s", services.Node.ID().ShortString())
|
|
logger.Info("🎯 Agent ID: %s", services.Config.Agent.ID)
|
|
|
|
if services.Config.Agent.Role != "" {
|
|
authority, err := services.Config.GetRoleAuthority(services.Config.Agent.Role)
|
|
if err == nil {
|
|
logger.Info("🎭 Role: %s (Authority: %s)", services.Config.Agent.Role, authority)
|
|
}
|
|
}
|
|
|
|
logger.Info("💬 Terminal interface ready for human interaction")
|
|
logger.Info("🌐 HTTP API available at http://localhost:%d", runtimeConfig.CustomPorts.HTTPPort)
|
|
logger.Info("🏥 Health endpoints at http://localhost:%d/health", runtimeConfig.CustomPorts.HealthPort)
|
|
|
|
if services.UCXIServer != nil {
|
|
logger.Info("🔗 UCXI server available at http://localhost:%d", runtimeConfig.CustomPorts.UCXIPort)
|
|
}
|
|
|
|
// Start HAP-specific background processes
|
|
startHAPBackgroundProcesses(hapInterface, services, logger)
|
|
|
|
logger.Info("✅ BZZZ Human Agent Portal fully operational")
|
|
logger.Info("💡 Use the terminal interface to interact with the P2P network")
|
|
|
|
// 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:
|
|
// Keep checking if terminal interface is still running
|
|
continue
|
|
}
|
|
}
|
|
// If terminal interface stops, trigger shutdown
|
|
sigChan <- syscall.SIGTERM
|
|
}()
|
|
|
|
<-sigChan
|
|
|
|
logger.Info("🛑 Shutting down Human Agent Portal...")
|
|
|
|
// Stop HAP interface
|
|
if err := hapInterface.Stop(ctx); err != nil {
|
|
logger.Error("HAP interface shutdown error: %v", err)
|
|
}
|
|
|
|
// Stop runtime services
|
|
if err := rt.Stop(ctx, services); err != nil {
|
|
logger.Error("Runtime shutdown error: %v", err)
|
|
}
|
|
|
|
logger.Info("✅ BZZZ Human Agent Portal shutdown completed")
|
|
}
|
|
|
|
// startHAPBackgroundProcesses starts HAP-specific background processes
|
|
func startHAPBackgroundProcesses(hapInterface *hap.TerminalInterface, services *runtime.RuntimeServices, logger logging.Logger) {
|
|
// HAP-specific background processes can be added here
|
|
// For example: message monitoring, peer discovery notifications, etc.
|
|
|
|
logger.Info("🔍 HAP monitoring P2P network for collaboration opportunities")
|
|
logger.Info("📡 Ready to facilitate human-AI coordination")
|
|
logger.Info("🎯 HMMM collaborative reasoning monitoring active")
|
|
logger.Info("💬 Interactive terminal ready for commands")
|
|
|
|
// Example: Start monitoring for important P2P events
|
|
go func() {
|
|
// This could monitor for specific message types or events
|
|
// and display notifications to the human user
|
|
logger.Info("📊 Background monitoring started")
|
|
}()
|
|
}
|
|
|
|
// getConfigPath determines the configuration file path
|
|
func getConfigPath() string {
|
|
return runtime.GetConfigPath()
|
|
}
|
|
|
|
// needsSetup checks if the system needs to run setup mode
|
|
func needsSetup() bool {
|
|
return runtime.NeedsSetup()
|
|
} |