magi-code 0.77.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::support::*;

#[test]
fn nested_subagents_tool_call_is_rejected() {
    let temp = tempfile::TempDir::new().unwrap();
    let provider = Arc::new(NestedSubagentsProvider::ignoring_schema_hiding());
    let mut cfg = config(provider.clone(), temp.path());
    cfg.parent_tools = ToolRuntime::new_with_settings(
        temp.path(),
        crate::tools::ToolSettings {
            subagents: crate::tools::SubagentsToolSettings {
                max_depth: 1,
                ..crate::tools::SubagentsToolSettings::default()
            },
            ..crate::tools::ToolSettings::default()
        },
    )
    .unwrap();
    let output = run_subagents(
        SubagentsArgs {
            concurrency: Some(1),
            tasks: vec![SubagentTask {
                intent: "launch nested".into(),
                agent: None,
                identity: None,
                context: None,
                cwd: None,
            }],
        },
        cfg,
    )
    .unwrap();
    assert_eq!(output.summary.completed, 1);
    let requests = provider.requests.lock().unwrap();
    let all_tool_results = requests
        .iter()
        .flat_map(|request| request.tool_results())
        .collect::<Vec<_>>();
    let nested_result = all_tool_results
        .iter()
        .find(|result| result.call_id == "nested_1")
        .expect("nested tool result");
    assert!(!nested_result.success);
    assert!(nested_result.output.contains("nesting limit"));
}

#[test]
fn default_max_depth_allows_one_nested_batch_and_hides_schema_at_limit() {
    let temp = tempfile::TempDir::new().unwrap();
    let provider = Arc::new(NestedSubagentsProvider::new());
    let output = run_subagents(
        SubagentsArgs {
            concurrency: Some(1),
            tasks: vec![SubagentTask {
                intent: "launch nested".into(),
                agent: None,
                identity: None,
                context: None,
                cwd: None,
            }],
        },
        config(provider.clone(), temp.path()),
    )
    .unwrap();

    assert_eq!(output.summary.completed, 1);
    let requests = provider.requests.lock().unwrap();
    assert!(
        requests.iter().any(ProviderRequest::subagents_tool_enabled),
        "child request before max depth should expose subagents"
    );
    assert!(
        requests
            .iter()
            .any(|request| !request.subagents_tool_enabled()),
        "grandchild request at max depth should hide subagents"
    );
    let all_tool_results = requests
        .iter()
        .flat_map(|request| request.tool_results())
        .collect::<Vec<_>>();
    assert!(all_tool_results.iter().any(|result| {
        result.call_id == "nested_1" && result.success && result.output.contains("schema hidden")
    }));
}

#[test]
fn nested_child_at_subagents_tool_depth_limit_does_not_inherit_identity_list() {
    let temp = tempfile::TempDir::new().unwrap();
    let provider = Arc::new(NestedSubagentsProvider::new());
    let mut cfg = config(provider.clone(), temp.path());
    cfg.subagent_profiles_prompt = Some(
        "<Subagent-Identities>\n- `frontend-dev` — UI work\n</Subagent-Identities>".to_string(),
    );

    let output = run_subagents(
        SubagentsArgs {
            concurrency: Some(1),
            tasks: vec![SubagentTask {
                intent: "launch nested".into(),
                agent: None,
                identity: None,
                context: None,
                cwd: None,
            }],
        },
        cfg,
    )
    .unwrap();

    assert_eq!(output.summary.completed, 1);
    let requests = provider.requests.lock().unwrap();
    let enabled_systems = requests
        .iter()
        .filter(|request| request.subagents_tool_enabled())
        .map(|request| request.messages()[0].content.clone())
        .collect::<Vec<_>>();
    assert!(!enabled_systems.is_empty());
    assert!(
        enabled_systems
            .iter()
            .all(|system| system.contains("<Subagent-Identities>")),
        "{enabled_systems:?}"
    );
    let disabled_systems = requests
        .iter()
        .filter(|request| !request.subagents_tool_enabled())
        .map(|request| request.messages()[0].content.clone())
        .collect::<Vec<_>>();
    assert!(!disabled_systems.is_empty());
    assert!(
        disabled_systems
            .iter()
            .all(|system| !system.contains("<Subagent-Identities>")),
        "{disabled_systems:?}"
    );
}

#[test]
fn nesting_cap_rejects_recursive_batches() {
    let temp = tempfile::TempDir::new().unwrap();
    let provider = Arc::new(CountingProvider::new("never"));
    let mut cfg = config(provider, temp.path());
    cfg.depth = cfg.parent_tools.subagents_max_depth();
    let err = run_subagents(
        SubagentsArgs {
            concurrency: None,
            tasks: vec![SubagentTask {
                intent: "one".into(),
                agent: None,
                identity: None,
                context: None,
                cwd: None,
            }],
        },
        cfg,
    )
    .unwrap_err()
    .to_string();
    assert!(err.contains("nesting limit"));
}