agents: define the work dir name once and test its creation
This commit is contained in:
parent
8e0597d41d
commit
6ff348d88b
5 changed files with 18 additions and 3 deletions
|
|
@ -1135,7 +1135,7 @@ impl Coordinator {
|
||||||
/// destroy/recreate. A sibling of `state/` rather than inside it, so a
|
/// destroy/recreate. A sibling of `state/` rather than inside it, so a
|
||||||
/// claude started under `work/` never walks up into `state/CLAUDE.md`.
|
/// claude started under `work/` never walks up into `state/CLAUDE.md`.
|
||||||
pub fn agent_work_dir(name: &hive_types::Ident) -> PathBuf {
|
pub fn agent_work_dir(name: &hive_types::Ident) -> PathBuf {
|
||||||
crate::paths::agent_state_dir(name).join("work")
|
crate::paths::agent_state_dir(name).join(crate::paths::WORK_SUBDIR)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Per-agent harness-internal state dir. Bind-mounted RW into the
|
/// Per-agent harness-internal state dir. Bind-mounted RW into the
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,7 @@ fn bind_own_agent_dirs(agent_name: &str, notes_dir: &Path, binds: &mut Vec<BindM
|
||||||
read_only: false,
|
read_only: false,
|
||||||
});
|
});
|
||||||
if let Some(state_parent) = notes_dir.parent() {
|
if let Some(state_parent) = notes_dir.parent() {
|
||||||
for sub in ["harness", "work"] {
|
for sub in ["harness", crate::paths::WORK_SUBDIR] {
|
||||||
let dir = state_parent.join(sub);
|
let dir = state_parent.join(sub);
|
||||||
if !dir.exists() {
|
if !dir.exists() {
|
||||||
let _ = std::fs::create_dir_all(&dir);
|
let _ = std::fs::create_dir_all(&dir);
|
||||||
|
|
|
||||||
|
|
@ -218,7 +218,7 @@ pub fn ensure_state_dir(notes_dir: &Path) -> Result<()> {
|
||||||
}
|
}
|
||||||
// Harness and work dirs are siblings of the agent-visible state dir.
|
// Harness and work dirs are siblings of the agent-visible state dir.
|
||||||
if let Some(parent) = notes_dir.parent() {
|
if let Some(parent) = notes_dir.parent() {
|
||||||
for sibling in ["harness", "work"] {
|
for sibling in ["harness", crate::paths::WORK_SUBDIR] {
|
||||||
let dir = parent.join(sibling);
|
let dir = parent.join(sibling);
|
||||||
if !dir.exists() {
|
if !dir.exists() {
|
||||||
std::fs::create_dir_all(&dir)
|
std::fs::create_dir_all(&dir)
|
||||||
|
|
|
||||||
|
|
@ -410,3 +410,14 @@ async fn a_prebuild_inside_its_limit_returns_its_status() {
|
||||||
.expect("a fast child must not time out");
|
.expect("a fast child must not time out");
|
||||||
assert_eq!(status.code(), Some(3));
|
assert_eq!(status.code(), Some(3));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The setup path creates the agent's `work/` dir beside `state/`, so the
|
||||||
|
/// bind source exists before nspawn starts the container.
|
||||||
|
#[test]
|
||||||
|
fn ensure_state_dir_creates_the_work_dir() {
|
||||||
|
let root = tempfile::tempdir().expect("tempdir");
|
||||||
|
let notes_dir = root.path().join("state");
|
||||||
|
ensure_state_dir(¬es_dir).expect("ensure_state_dir");
|
||||||
|
assert!(notes_dir.is_dir());
|
||||||
|
assert!(root.path().join(crate::paths::WORK_SUBDIR).is_dir());
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,10 @@ use std::path::{Path, PathBuf};
|
||||||
// its own callsites.
|
// its own callsites.
|
||||||
pub use hive_host_sock::{AGENTS_ROOT, GATEWAY_HTPASSWD, HOST_SOCKET, agent_state_dir};
|
pub use hive_host_sock::{AGENTS_ROOT, GATEWAY_HTPASSWD, HOST_SOCKET, agent_state_dir};
|
||||||
|
|
||||||
|
/// Name of the per-agent working dir under `agents/<name>/`, a sibling of
|
||||||
|
/// `state/`. Bound RW into the container at `/agents/<name>/work`.
|
||||||
|
pub const WORK_SUBDIR: &str = "work";
|
||||||
|
|
||||||
/// Root of all hive-c0re persistent state.
|
/// Root of all hive-c0re persistent state.
|
||||||
// nix: the same literal is written in `nix/host-modules/hive-c0re/default.nix` — must match.
|
// nix: the same literal is written in `nix/host-modules/hive-c0re/default.nix` — must match.
|
||||||
// Not option-driven: there is no `statePath` option, the path is hardcoded both sides.
|
// Not option-driven: there is no `statePath` option, the path is hardcoded both sides.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue