unified-agent-api 0.2.0

Agent-agnostic facade and registry for wrapper backends
Documentation
use super::*;

#[tokio::test]
async fn spawn_failures_surface_via_run_handle() {
    let adapter = std::sync::Arc::new(ToyAdapter { fail_spawn: true });
    let request = crate::AgentWrapperRunRequest {
        prompt: "hello".to_string(),
        ..Default::default()
    };

    let mut handle = run_harnessed_backend(adapter, BackendDefaults::default(), request)
        .await
        .expect("run should return a handle before startup resolves");

    let event = handle
        .events
        .next()
        .await
        .expect("spawn failure should surface as an error event");
    assert_eq!(event.kind, AgentWrapperEventKind::Error);
    assert_eq!(
        event.message.as_deref(),
        Some("toy backend error (redacted): phase=spawn")
    );

    assert!(
        handle.events.next().await.is_none(),
        "error event should be terminal for spawn failure"
    );

    let err = handle
        .completion
        .await
        .expect_err("completion should surface the spawn failure");
    assert!(matches!(
        err,
        crate::AgentWrapperError::Backend { ref message }
            if message == "toy backend error (redacted): phase=spawn"
    ));
}

#[tokio::test]
async fn spawn_failures_surface_via_control_handle_after_return() {
    let adapter = std::sync::Arc::new(ToyAdapter { fail_spawn: true });
    let request = crate::AgentWrapperRunRequest {
        prompt: "hello".to_string(),
        ..Default::default()
    };

    let crate::AgentWrapperRunControl {
        mut handle,
        cancel: _,
    } = run_harnessed_backend_control(adapter, BackendDefaults::default(), request, None)
        .await
        .expect("control entrypoint should return before startup resolves");

    let event = handle
        .events
        .next()
        .await
        .expect("spawn failure should surface as an error event");
    assert_eq!(event.kind, AgentWrapperEventKind::Error);
    assert_eq!(
        event.message.as_deref(),
        Some("toy backend error (redacted): phase=spawn")
    );

    assert!(
        handle.events.next().await.is_none(),
        "error event should be terminal for spawn failure"
    );

    let err = handle
        .completion
        .await
        .expect_err("completion should be backend error");
    assert!(matches!(
        err,
        crate::AgentWrapperError::Backend { ref message }
        if message == "toy backend error (redacted): phase=spawn"
    ));
}