defect-agent 0.1.0-alpha.4

Core agent runtime for defect: turn loop, context compaction, tools and session orchestration.
Documentation
use super::*;

fn hosted(web_search: bool) -> HostedCapabilities {
    HostedCapabilities { web_search }
}

fn config(mode: WebSearchCapabilityMode) -> SessionCapabilitiesConfig {
    SessionCapabilitiesConfig {
        web_search: WebSearchCapabilityConfig { mode },
    }
}

#[test]
fn delegate_with_supported_provider_enables_hosted() {
    let resolved = ResolvedSessionCapabilities::resolve(
        config(WebSearchCapabilityMode::Delegate),
        hosted(true),
        "anthropic",
    )
    .expect("should succeed");
    assert!(resolved.hosted.web_search);
}

#[test]
fn delegate_with_unsupported_provider_fails() {
    let err = ResolvedSessionCapabilities::resolve(
        config(WebSearchCapabilityMode::Delegate),
        hosted(false),
        "deepseek",
    )
    .expect_err("should reject");
    match err {
        SessionInitError::CapabilityUnsatisfied {
            capability,
            provider,
        } => {
            assert_eq!(capability, "web_search");
            assert_eq!(provider, "deepseek");
        }
    }
}

#[test]
fn disabled_exposes_nothing() {
    for support in [true, false] {
        let resolved = ResolvedSessionCapabilities::resolve(
            config(WebSearchCapabilityMode::Disabled),
            hosted(support),
            "any",
        )
        .expect("should succeed");
        assert!(!resolved.hosted.web_search);
    }
}

#[test]
fn unsatisfied_error_message_includes_actionable_hint() {
    let err = ResolvedSessionCapabilities::resolve(
        config(WebSearchCapabilityMode::Delegate),
        hosted(false),
        "deepseek",
    )
    .expect_err("should reject");
    let msg = err.to_string();
    assert!(msg.contains("provider `deepseek` does not support hosted web_search"));
    assert!(msg.contains("[providers.deepseek.capabilities.web_search]"));
    assert!(msg.contains("mode = \"disabled\""));
    assert!(msg.contains("[capabilities.web_search]"));
}