diff --git a/hive-c0re/src/server.rs b/hive-c0re/src/server.rs index df86861..ee4bd06 100644 --- a/hive-c0re/src/server.rs +++ b/hive-c0re/src/server.rs @@ -129,7 +129,7 @@ async fn dispatch(req: &HostRequest, coord: Arc) -> HostResponse { let applied_dir = Coordinator::agent_applied_dir(name); let claude_dir = Coordinator::agent_claude_dir(name); let notes_dir = Coordinator::agent_notes_dir(name); - lifecycle::rebuild( + let result = lifecycle::rebuild( name, &coord.hyperhive_flake, &agent_dir, @@ -139,7 +139,30 @@ async fn dispatch(req: &HostRequest, coord: Arc) -> HostResponse { coord.dashboard_port, &coord.operator_pronouns, ) - .await?; + .await; + // Mirror auto_update::rebuild_agent — the manager wants + // to know about every rebuild attempt regardless of + // which surface triggered it, especially failures + // (build error → manager can adjust the agent's + // agent.nix). Without this the admin-socket CLI was + // a notify-gap. + match &result { + Ok(()) => coord.notify_manager(&hive_sh4re::HelperEvent::Rebuilt { + agent: name.clone(), + ok: true, + note: None, + sha: None, + tag: None, + }), + Err(e) => coord.notify_manager(&hive_sh4re::HelperEvent::Rebuilt { + agent: name.clone(), + ok: false, + note: Some(format!("{e:#}")), + sha: None, + tag: None, + }), + } + result?; HostResponse::success() } HostRequest::List => HostResponse::list(lifecycle::list().await?),