swarm-engine-ui 0.1.6

CLI and Desktop UI for SwarmEngine
//! Desktop GUI

use std::time::Duration;

use swarm_engine_core::prelude::*;
use swarm_engine_core::telemetry::create_swarm_layer;
use tracing_subscriber::prelude::*;

use crate::demo_agents::{CounterWorker, SimpleManager};

/// Run Desktop GUI
pub fn run_gui() {
    // Create SwarmLayer for telemetry
    let (swarm_layer, _tx, rx) = create_swarm_layer(2048);

    // Initialize tracing with SwarmLayer
    tracing_subscriber::registry()
        .with(swarm_layer)
        .with(
            tracing_subscriber::fmt::layer()
                .with_target(false)
                .with_level(true)
                .compact(),
        )
        .init();

    println!("=== SwarmEngine GUI ===");
    println!("Starting...");
    println!();

    // Spawn Orchestrator in background thread
    let _orchestrator_handle = std::thread::spawn(move || {
        let rt = tokio::runtime::Runtime::new().expect("Failed to create Tokio runtime");

        let mut orchestrator = OrchestratorBuilder::new()
            .add_worker(CounterWorker::new(0, "worker-alpha"))
            .add_worker(CounterWorker::new(1, "worker-beta"))
            .add_worker(CounterWorker::new(2, "worker-gamma"))
            .add_worker(CounterWorker::new(3, "worker-delta"))
            .add_worker(CounterWorker::new(4, "worker-epsilon"))
            .manager(SimpleManager::new())
            .tick_duration(Duration::from_millis(50))
            .max_ticks(0) // Run forever until UI closes
            .build(rt.handle().clone());

        orchestrator.run()
    });

    // Run UI on main thread with event receiver
    if let Err(e) = swarm_engine_ui::ui::run_with_receiver(rx) {
        eprintln!("UI error: {}", e);
    }

    println!("\nGUI closed.");
}