use std::sync::Arc;
use tinyagents::harness::message::Message;
use tinyagents::harness::runtime::AgentHarness;
use tinyagents::harness::testkit::{EventRecorder, ScriptedModel, Trajectory};
use tinyagents::{SubAgent, SubAgentSession};
#[tokio::test]
async fn orchestrator_reuses_subagent_with_human_input_between() {
let model = Arc::new(ScriptedModel::replies(vec![
"Tokyo is a great choice for a spring trip.",
"For Tokyo in spring, pack light layers and a rain jacket.",
]));
let mut harness: AgentHarness<()> = AgentHarness::new();
harness.register_model("scripted", model.clone());
let subagent = Arc::new(
SubAgent::new(
"concierge",
"a persistent travel concierge",
Arc::new(harness),
)
.with_system_prompt("You are a helpful travel concierge."),
);
let subagent_handle = Arc::clone(&subagent);
let recorder = EventRecorder::new();
let mut session = SubAgentSession::new(subagent).with_events(recorder.sink());
let first = session
.send(
&(),
(),
vec![Message::user("Where should I travel this spring?")],
)
.await
.expect("first sub-agent run");
assert_eq!(
first.text(),
Some("Tokyo is a great choice for a spring trip.".to_string())
);
let human_followup = "Great — what should I pack for there?";
let second = session
.send(&(), (), vec![Message::user(human_followup)])
.await
.expect("second sub-agent run (reused)");
assert_eq!(
second.text(),
Some("For Tokyo in spring, pack light layers and a rain jacket.".to_string())
);
assert!(
Arc::ptr_eq(session.subagent(), &subagent_handle),
"the orchestrator reused the same sub-agent across turns"
);
assert_eq!(session.turns(), 2);
let requests = model.requests();
assert_eq!(requests.len(), 2, "one model request per reused send");
let second_texts: Vec<String> = requests[1].messages.iter().map(Message::text).collect();
assert!(second_texts.contains(&"Where should I travel this spring?".to_string()));
assert!(second_texts.contains(&"Tokyo is a great choice for a spring trip.".to_string()));
assert!(second_texts.contains(&human_followup.to_string()));
let transcript_texts: Vec<String> = session.transcript().iter().map(Message::text).collect();
assert!(transcript_texts.contains(&human_followup.to_string()));
assert!(
transcript_texts
.contains(&"For Tokyo in spring, pack light layers and a rain jacket.".to_string())
);
let traj = Trajectory::from_events(recorder.events());
traj.assert_completed();
traj.assert_order(&[
"subagent.started",
"subagent.completed",
"subagent.reused",
"subagent.completed",
])
.expect("first run completes, then the sub-agent is reused for the second");
}