//! Operations that are exposed through more than one surface (the host admin //! socket *and* the dashboard's POST endpoints). Each function takes a //! `&Coordinator` and the request parameters; callers stitch the response //! shape they want (HTTP redirect vs JSON). use std::sync::Arc; use crate::coordinator::Coordinator; /// Tear down a sub-agent container. By default this is non-destructive to /// persistent state: the state dir and the Claude /// credentials dir under `/var/lib/hyperhive/agents//` are /// kept, so recreating an agent of the same name reuses prior notes + creds /// (no re-login). The ephemeral runtime dir under `/run/hyperhive/agents/` /// is cleared because its contents (the mcp socket) don't survive restarts /// anyway. With `purge=true` the persistent trees are also wiped — claude /// creds, notes — there is no undo. /// The bootstrap/root container is destroyable like any other. Nothing /// recreates it afterwards: ruth stays gone until she is created again from /// the swarm dashboard. /// /// Submits the teardown DAG and returns — it does not wait for the container to /// go away. Same contract as every other lifecycle op (`rebuild`, `kill`, /// `restart`, `start`): the queue owns the work, the caller gets an /// acknowledgement. Progress is visible as real nodes on the dashboard. pub fn destroy(coord: &Arc, name: &str, purge: bool) { tracing::info!(%name, purge, "destroy"); if let Err(e) = coord.job_queue.insert_job(|b| { crate::job_queue::templates::destroy(b, name, purge); Vec::new() }) { tracing::error!(agent = %name, error = ?e, "destroy: insert failed"); } coord.emit_rebuild_queue_snapshot(); }