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"));
}