//! Resolve the on-disk path to hyperhive's static assets (branding + //! claude prompts). Single source of truth for both the host daemon //! (`hive-c0re`) and the in-container harness binaries so they agree //! on the lookup contract. //! //! At runtime, the path is read from `$HIVE_ASSETS_DIR`. In nix //! builds that env var is set by the `hive-c0re` / `harness-base` modules //! to `${pkgs.hyperhive-assets}/share/hyperhive` (see `nix/assets.nix`). //! For `cargo run` outside nix, set it yourself: //! //! ```sh //! HIVE_ASSETS_DIR=$(pwd)/dev-assets cargo run ... //! ``` //! //! where `dev-assets/` mirrors the nix output's `branding/` + `prompts/` //! layout. //! //! Each crate that wants a specific asset goes through one of the //! typed helpers (currently just `prompt_template()` — the branding //! SVG used to live here too; the per-agent icon now 404s server-side //! when unconfigured and falls back to a frontend-bundled default //! client-side instead of a server-resolved runtime path, see //! `hive-agent::web_ui::screen::serve_icon`) so the lookup contract is //! centralised. Missing files panic at first call with a clear "set //! `HIVE_ASSETS_DIR` + put the file at …" message. use std::path::PathBuf; /// Read `$HIVE_ASSETS_DIR`. Panics with a clear remediation message /// when unset — every code path that calls into this module is one /// the binary cannot run without, so a hard early failure is the /// right shape. fn dir() -> PathBuf { match std::env::var("HIVE_ASSETS_DIR") { Ok(v) if !v.is_empty() => PathBuf::from(v), _ => panic!( "HIVE_ASSETS_DIR is not set. Inside the nix-built systemd \ units this is wired automatically from \ `pkgs.hyperhive-assets`; for `cargo run` outside nix, \ set it to a directory laid out like \ `nix/assets.nix`'s output (branding/ + prompts/ \ subdirs). See hive-sh4re/src/assets.rs for the contract.", ), } } /// `$HIVE_ASSETS_DIR/prompts/system.md` — the claude system prompt /// template. `hive-agent::prompt::render` filters the role markers /// inside it per agent / manager flavor. #[must_use] pub fn prompt_template() -> PathBuf { dir().join("prompts/system.md") }