diff --git a/hive-c0re/src/actions.rs b/hive-c0re/src/actions.rs index dfa733ea..b61b5f8b 100644 --- a/hive-c0re/src/actions.rs +++ b/hive-c0re/src/actions.rs @@ -6,10 +6,10 @@ use std::sync::Arc; use anyhow::{Context as _, Result, bail}; -use hive_sh4re::{ApprovalKind, ApprovalStatus, HelperEvent, MANAGER_AGENT}; +use hive_sh4re::{ApprovalKind, ApprovalStatus, HelperEvent}; use crate::coordinator::{Coordinator, TransientKind}; -use crate::lifecycle::{self, MANAGER_NAME}; +use crate::lifecycle; /// Approve a pending request. Marks the approval row durably, then /// either runs the work inline (`InitConfig`, sub-second git ops) or @@ -915,11 +915,11 @@ async fn deploy_applied_target( /// is cleared because its contents (the mcp socket) don't survive restarts /// anyway. With `purge=true` the persistent trees are also wiped — config /// history, claude creds, notes — there is no undo. -/// Refuses the manager (declarative; would fight with the host's nixos config). +/// The bootstrap/root container is destroyable like any other: it's +/// imperative infra that `auto_update::ensure_root_agent` recreates on the +/// next hive-c0re startup if absent, so destroying it is transient rather +/// than something to refuse at the API. pub async fn destroy(coord: &Arc, name: &str, purge: bool) -> Result<()> { - if name == MANAGER_NAME || name == MANAGER_AGENT { - bail!("refusing to destroy the manager ({name})"); - } tracing::info!(%name, purge, "destroy"); // Guard auto-clears on the success path's final scope exit and on // every early-return / cancellation along the way. diff --git a/hive-priv/src/main.rs b/hive-priv/src/main.rs index b23085f9..f3980dc2 100644 --- a/hive-priv/src/main.rs +++ b/hive-priv/src/main.rs @@ -21,9 +21,9 @@ use std::path::{Path, PathBuf}; use anyhow::{Context as _, Result, bail}; use hive_sh4re::priv_proto::{ - AGENT_PREFIX, AGENT_STATE_ROOT, BindMount, InfraAction, InfraContainer, JournalQuery, - MANAGER_NAME, META_DIR, NetworkIsolation, PRIV_SOCK, PrivEvent, PrivRequest, PrivResponse, - PrivStream, PrivStreamLine, SIBLING_CONTAINERS, + AGENT_PREFIX, AGENT_STATE_ROOT, BindMount, InfraAction, InfraContainer, JournalQuery, META_DIR, + NetworkIsolation, PRIV_SOCK, PrivEvent, PrivRequest, PrivResponse, PrivStream, PrivStreamLine, + SIBLING_CONTAINERS, }; use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; use tokio::net::unix::OwnedWriteHalf; @@ -1237,18 +1237,12 @@ fn socket_dir_path(agent_name: &str) -> PathBuf { /// Validate a logical agent name (the name hive-c0re uses internally, /// before the `h-` container prefix is applied). fn validate_agent_name(name: &str) -> Result<()> { - if name == MANAGER_NAME { - return Ok(()); - } validate_name_chars(name)?; Ok(()) } /// Validate a logical agent name and check it maps to a hive-managed container. fn validate_container_name(name: &str) -> Result<()> { - if name == MANAGER_NAME { - return Ok(()); - } if SIBLING_CONTAINERS.contains(&name) { return Ok(()); }