harness: surface hive + swarm display names to agents (#701)
This commit is contained in:
parent
04f69c1fe1
commit
c41bf1b562
5 changed files with 239 additions and 16 deletions
|
|
@ -280,6 +280,33 @@ fn render_flake(
|
|||
/// meta-level reference (#355).
|
||||
const CANONICAL_INPUTS: &[&str] = &["nixpkgs", "nixpkgs-unstable"];
|
||||
|
||||
/// Env vars hive-c0re forwards from its own systemd unit env into every
|
||||
/// sub-agent's harness service env. Each entry is `(env_var_name,
|
||||
/// host_value)`. Empty / unset vars are filtered out so absent options
|
||||
/// don't render no-op `FOO = ""` lines into the meta flake.
|
||||
///
|
||||
/// Returns owned `String` values so the result is `'static`-friendly +
|
||||
/// trivial to stub from tests (which build their own slice instead of
|
||||
/// touching process-wide env).
|
||||
const FORWARDED_VARS: &[&str] = &[
|
||||
"HIVE_FORGE_URL",
|
||||
"HYPERHIVE_HIVE_DOMAIN",
|
||||
"HYPERHIVE_HIVE_NAME",
|
||||
"HYPERHIVE_SWARM_NAME",
|
||||
];
|
||||
|
||||
fn forwarded_env_vars() -> Vec<(&'static str, String)> {
|
||||
FORWARDED_VARS
|
||||
.iter()
|
||||
.filter_map(|&name| {
|
||||
std::env::var(name)
|
||||
.ok()
|
||||
.filter(|v| !v.is_empty())
|
||||
.map(|v| (name, v))
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Read an agent's applied `flake.lock` and return the subset of
|
||||
/// `CANONICAL_INPUTS` it declares as direct (root-level) inputs.
|
||||
/// Returns an empty vec when the lock is missing or unparsable —
|
||||
|
|
@ -446,14 +473,21 @@ where
|
|||
" HIVE_CONTEXT_WINDOW_TOKENS_{upper_key} = \"{val}\";"
|
||||
);
|
||||
}
|
||||
// Forge URL — injected when hive-c0re itself has HIVE_FORGE_URL set
|
||||
// (the NixOS module derives it from hyperhive.forge.{domain,httpPort}).
|
||||
// Agents use it in forge_notify to poll Forgejo for PR/review events.
|
||||
if let Ok(forge_url) = std::env::var("HIVE_FORGE_URL")
|
||||
&& !forge_url.is_empty()
|
||||
{
|
||||
let escaped = forge_url.replace('\\', "\\\\").replace('"', "\\\"");
|
||||
let _ = writeln!(out, " HIVE_FORGE_URL = \"{escaped}\";");
|
||||
// Forwarded env vars — picked up from hive-c0re's own systemd unit
|
||||
// env (`services.hyperhive.*` options flow through nix/modules/
|
||||
// hive-c0re.nix into the host process). We copy whatever's set into
|
||||
// each sub-agent's harness service env so the in-container surfaces
|
||||
// (`identity.rs`, `forge_notify`) see a consistent view across the
|
||||
// whole hive. Absent host-side env (option not set) → skip emission
|
||||
// → in-container accessors fall back to None / defaults gracefully.
|
||||
//
|
||||
// - HIVE_FORGE_URL: agents poll this for Forgejo notifications.
|
||||
// - HYPERHIVE_HIVE_DOMAIN: machine-readable hive DNS (#589).
|
||||
// - HYPERHIVE_HIVE_NAME / HYPERHIVE_SWARM_NAME: human display
|
||||
// names for hive + swarm (#701).
|
||||
for (var, val) in forwarded_env_vars() {
|
||||
let escaped = val.replace('\\', "\\\\").replace('"', "\\\"");
|
||||
let _ = writeln!(out, " {var} = \"{escaped}\";");
|
||||
}
|
||||
out.push_str(
|
||||
r#" HYPERHIVE_STATE_DIR = "/agents/${name}/state";
|
||||
|
|
|
|||
Loading…
Reference in a new issue