use std::path::{Path, PathBuf};
pub(super) fn resolve_child_cwd(
parent_cwd: &Path,
child_cwd: Option<&Path>,
allow_absolute_paths: bool,
) -> anyhow::Result<PathBuf> {
let parent_canonical = parent_cwd.canonicalize()?;
if !parent_canonical.is_dir() {
anyhow::bail!(
"parent cwd is not a directory: {}",
parent_canonical.display()
);
}
let child_is_absolute = child_cwd.is_some_and(Path::is_absolute);
let cwd = match child_cwd {
Some(path) if path.is_absolute() => path.to_path_buf(),
Some(path) => parent_canonical.join(path),
None => parent_canonical.clone(),
};
let canonical = cwd.canonicalize()?;
if !canonical.is_dir() {
anyhow::bail!("subagent cwd is not a directory: {}", canonical.display());
}
if (!child_is_absolute || !allow_absolute_paths) && !canonical.starts_with(&parent_canonical) {
anyhow::bail!(
"subagent cwd '{}' escapes parent cwd '{}' (tools.subagents.absolute_paths is false)",
canonical.display(),
parent_canonical.display()
);
}
Ok(canonical)
}