aether-agent-cli 0.7.26

CLI and ACP server for the Aether AI coding agent
Documentation
use std::error::Error;
use std::process::{Command, Output};

const INVALID_TRACEPARENT: &str = "00-00000000000000000000000000000000-0123456789abcdef-01";
const VALID_TRACEPARENT: &str = "00-00112233445566778899aabbccddeeff-0123456789abcdef-01";
const TELEMETRY_SETTINGS: &str = r#""telemetry":{"otlp":{"endpoint":"http://127.0.0.1:1"}}"#;

type TestResult = Result<(), Box<dyn Error>>;

#[test]
fn acp_rejects_an_invalid_trace_context_when_telemetry_is_enabled() -> TestResult {
    let options = format!(
        r#"{{"settings":{{"credentialsStore":{{"type":"memory"}},"agents":[],{TELEMETRY_SETTINGS}}},"traceContext":{{"traceparent":"{INVALID_TRACEPARENT}"}}}}"#
    );
    let output = aether(&["acp", "--options-json", &options]).output()?;
    assert_rejected(&output, "traceparent");
    Ok(())
}

#[test]
fn headless_rejects_an_invalid_trace_context_when_telemetry_is_enabled() -> TestResult {
    let options = format!(
        r#"{{"prompt":"hello","settings":{{"agents":[],{TELEMETRY_SETTINGS}}},"traceContext":{{"traceparent":"{INVALID_TRACEPARENT}"}}}}"#
    );
    let output = aether(&["headless", "--options-json", &options]).output()?;
    assert_rejected(&output, "traceparent");
    Ok(())
}

#[test]
fn headless_rejects_an_invalid_tracestate_when_telemetry_is_enabled() -> TestResult {
    let options = format!(
        r#"{{"prompt":"hello","settings":{{"agents":[],{TELEMETRY_SETTINGS}}},"traceContext":{{"traceparent":"{VALID_TRACEPARENT}","tracestate":"not a valid tracestate"}}}}"#
    );
    let output = aether(&["headless", "--options-json", &options]).output()?;
    assert_rejected(&output, "tracestate");
    Ok(())
}

fn aether(args: &[&str]) -> Command {
    let mut command = Command::new(env!("CARGO_BIN_EXE_aether"));
    command.args(args);
    command
}

fn assert_rejected(output: &Output, header: &str) {
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(!output.status.success(), "invalid trace context succeeded: {stderr}");
    assert!(stderr.contains(&format!("telemetry trace context has an invalid {header} header")), "stderr: {stderr}");
}