rho-coding-agent 1.25.1

A lightweight agent harness inspired by Pi
Documentation
use pretty_assertions::assert_eq;

use super::*;

fn reader<'a>(pairs: &'a [(&'a str, &'a str)]) -> impl FnMut(&str) -> Option<String> + 'a {
    move |name| {
        pairs
            .iter()
            .find(|(key, _)| *key == name)
            .map(|(_, value)| (*value).to_owned())
    }
}

#[test]
fn the_child_gets_the_base_set_plus_its_allowlist_and_nothing_else() {
    let ambient = [
        ("PATH", "/usr/bin"),
        ("MY_HOOK_TOKEN", "token"),
        ("ANTHROPIC_API_KEY", "secret"),
        ("UNRELATED", "value"),
    ];

    let environment = child_environment(&["MY_HOOK_TOKEN".to_owned()], reader(&ambient));

    assert_eq!(
        environment.get("PATH").map(String::as_str),
        Some("/usr/bin")
    );
    assert_eq!(
        environment.get("MY_HOOK_TOKEN").map(String::as_str),
        Some("token")
    );
    assert_eq!(environment.get("ANTHROPIC_API_KEY"), None);
    assert_eq!(environment.get("UNRELATED"), None);
}

#[test]
fn a_variable_missing_from_the_parent_is_simply_absent() {
    let environment = child_environment(&["NOT_SET".to_owned()], reader(&[("PATH", "/usr/bin")]));

    assert_eq!(environment.get("NOT_SET"), None);
    assert!(environment.contains_key("PATH"));
}

#[test]
fn the_recursion_marker_is_always_set() {
    let environment = child_environment(&[], reader(&[]));

    assert_eq!(
        environment
            .get(super::super::IN_HOOK_ENV)
            .map(String::as_str),
        Some("1")
    );
}

#[test]
fn an_allowlist_cannot_override_the_recursion_marker() {
    let environment = child_environment(
        &[super::super::IN_HOOK_ENV.to_owned()],
        reader(&[(super::super::IN_HOOK_ENV, "0")]),
    );

    assert_eq!(
        environment
            .get(super::super::IN_HOOK_ENV)
            .map(String::as_str),
        Some("1")
    );
}