rebuild button on agent UI (cross-origin POST to dashboard /rebuild)
This commit is contained in:
parent
824914807a
commit
f1fd787f17
7 changed files with 42 additions and 6 deletions
|
|
@ -48,6 +48,7 @@ pub async fn approve(coord: Arc<Coordinator>, id: i64) -> Result<()> {
|
|||
&agent_dir,
|
||||
&applied_dir,
|
||||
&claude_dir,
|
||||
coord.dashboard_port,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
|
@ -69,6 +70,7 @@ pub async fn approve(coord: Arc<Coordinator>, id: i64) -> Result<()> {
|
|||
&proposed_dir,
|
||||
&applied_dir,
|
||||
&claude_dir,
|
||||
coord_bg.dashboard_port,
|
||||
)
|
||||
.await;
|
||||
coord_bg.clear_transient(&agent_bg);
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ pub async fn rebuild_agent(coord: &Arc<Coordinator>, name: &str, current_rev: &s
|
|||
&agent_dir,
|
||||
&applied_dir,
|
||||
&claude_dir,
|
||||
coord.dashboard_port,
|
||||
)
|
||||
.await?;
|
||||
std::fs::write(rev_marker_path(name), current_rev)
|
||||
|
|
@ -112,6 +113,7 @@ pub async fn ensure_manager(coord: &Arc<Coordinator>) -> Result<()> {
|
|||
&proposed,
|
||||
&applied,
|
||||
&claude_dir,
|
||||
coord.dashboard_port,
|
||||
)
|
||||
.await?;
|
||||
if let Some(rev) = current_rev {
|
||||
|
|
|
|||
|
|
@ -29,6 +29,10 @@ pub struct Coordinator {
|
|||
/// URL of the hyperhive flake (no fragment). Inlined into per-agent
|
||||
/// `flake.nix` files as `inputs.hyperhive.url`.
|
||||
pub hyperhive_flake: String,
|
||||
/// TCP port the host's hive-c0re dashboard listens on. Inlined into
|
||||
/// each per-agent flake so the agent's web UI can build the right
|
||||
/// rebuild-button URL pointing back at the dashboard.
|
||||
pub dashboard_port: u16,
|
||||
agents: Mutex<HashMap<String, AgentSocket>>,
|
||||
/// Agents whose lifecycle action (currently just spawn) is in flight.
|
||||
/// Read by the dashboard to render a spinner; cleared when the action
|
||||
|
|
@ -51,13 +55,14 @@ pub enum TransientKind {
|
|||
}
|
||||
|
||||
impl Coordinator {
|
||||
pub fn open(db_path: &Path, hyperhive_flake: String) -> Result<Self> {
|
||||
pub fn open(db_path: &Path, hyperhive_flake: String, dashboard_port: u16) -> Result<Self> {
|
||||
let broker = Broker::open(db_path).context("open broker")?;
|
||||
let approvals = Approvals::open(db_path).context("open approvals")?;
|
||||
Ok(Self {
|
||||
broker: Arc::new(broker),
|
||||
approvals: Arc::new(approvals),
|
||||
hyperhive_flake,
|
||||
dashboard_port,
|
||||
agents: Mutex::new(HashMap::new()),
|
||||
transient: Mutex::new(HashMap::new()),
|
||||
})
|
||||
|
|
|
|||
|
|
@ -101,10 +101,11 @@ pub async fn spawn(
|
|||
proposed_dir: &Path,
|
||||
applied_dir: &Path,
|
||||
claude_dir: &Path,
|
||||
dashboard_port: u16,
|
||||
) -> Result<()> {
|
||||
validate(name)?;
|
||||
setup_proposed(proposed_dir, name).await?;
|
||||
setup_applied(applied_dir, name, hyperhive_flake).await?;
|
||||
setup_applied(applied_dir, name, hyperhive_flake, dashboard_port).await?;
|
||||
ensure_claude_dir(claude_dir)?;
|
||||
let container = container_name(name);
|
||||
let flake_ref = format!("{}#default", applied_dir.display());
|
||||
|
|
@ -145,9 +146,10 @@ pub async fn rebuild(
|
|||
agent_dir: &Path,
|
||||
applied_dir: &Path,
|
||||
claude_dir: &Path,
|
||||
dashboard_port: u16,
|
||||
) -> Result<()> {
|
||||
validate(name)?;
|
||||
setup_applied(applied_dir, name, hyperhive_flake).await?;
|
||||
setup_applied(applied_dir, name, hyperhive_flake, dashboard_port).await?;
|
||||
ensure_claude_dir(claude_dir)?;
|
||||
let container = container_name(name);
|
||||
let flake_ref = format!("{}#default", applied_dir.display());
|
||||
|
|
@ -205,7 +207,12 @@ pub async fn setup_proposed(proposed_dir: &Path, name: &str) -> Result<()> {
|
|||
/// Maintain the authoritative applied repo. Rewrites `flake.nix` every call
|
||||
/// (so a new hyperhive flake URL propagates on rebuild); seeds `agent.nix`
|
||||
/// only on first call. `apply_commit` overwrites `agent.nix` later.
|
||||
pub async fn setup_applied(applied_dir: &Path, name: &str, hyperhive_flake: &str) -> Result<()> {
|
||||
pub async fn setup_applied(
|
||||
applied_dir: &Path,
|
||||
name: &str,
|
||||
hyperhive_flake: &str,
|
||||
dashboard_port: u16,
|
||||
) -> Result<()> {
|
||||
std::fs::create_dir_all(applied_dir)
|
||||
.with_context(|| format!("create {}", applied_dir.display()))?;
|
||||
|
||||
|
|
@ -242,6 +249,7 @@ pub async fn setup_applied(applied_dir: &Path, name: &str, hyperhive_flake: &str
|
|||
systemd.services.{service}.environment = {{
|
||||
HIVE_PORT = "{port}";
|
||||
HIVE_LABEL = "{name}";
|
||||
HIVE_DASHBOARD_PORT = "{dashboard_port}";
|
||||
}};
|
||||
}}
|
||||
];
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ async fn main() -> Result<()> {
|
|||
db,
|
||||
dashboard_port,
|
||||
} => {
|
||||
let coord = Arc::new(Coordinator::open(&db, hyperhive_flake)?);
|
||||
let coord = Arc::new(Coordinator::open(&db, hyperhive_flake, dashboard_port)?);
|
||||
manager_server::start(coord.clone())?;
|
||||
// Auto-create the manager container if it isn't there yet. Block
|
||||
// on this — without hm1nd the system has no manager harness.
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ async fn dispatch(req: &HostRequest, coord: Arc<Coordinator>) -> HostResponse {
|
|||
&proposed_dir,
|
||||
&applied_dir,
|
||||
&claude_dir,
|
||||
coord.dashboard_port,
|
||||
)
|
||||
.await
|
||||
{
|
||||
|
|
@ -110,6 +111,7 @@ async fn dispatch(req: &HostRequest, coord: Arc<Coordinator>) -> HostResponse {
|
|||
&agent_dir,
|
||||
&applied_dir,
|
||||
&claude_dir,
|
||||
coord.dashboard_port,
|
||||
)
|
||||
.await?;
|
||||
HostResponse::success()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue