Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions crates/aura-cli/src/repl/mcp/wizard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -400,9 +400,7 @@ fn verify_server(
(info.status.clone(), tools)
})
.ok_or_else(|| format!("`{name}` missing from the connection status snapshot"));
manager
.cancel_and_close_all("mcp-add-verify", "verification complete")
.await;
manager.close_all().await;
result
})
}
Expand Down
63 changes: 50 additions & 13 deletions crates/aura-test-utils/src/mock_agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,9 @@ impl StreamingAgent for MockAgent {
_query: &str,
_chat_history: Vec<Message>,
options: aura::streaming::RunOptions,
request_id: &str,
request_id: &aura::RequestId,
) -> AgentRun {
let stream = self.start(request_id).await;
let stream = self.start(request_id.as_str()).await;
// Carries a caller-supplied token so `cancel_token()` returns the one the
// caller named. The scripts do not race it, so cancelling does not end a
// mock stream.
Expand All @@ -186,7 +186,7 @@ impl StreamingAgent for MockAgent {
)
}

async fn cancel_and_close_mcp(&self, _request_id: &str, _reason: &str) -> usize {
async fn cancel_and_close_mcp(&self, _request_id: &aura::RequestId, _reason: &str) -> usize {
0
}
}
Expand All @@ -200,7 +200,12 @@ mod tests {
async fn a_pending_agent_never_yields() {
let agent = MockAgent::pending();
let mut stream = agent
.stream("q", vec![], aura::streaming::RunOptions::default(), "req_1")
.stream(
"q",
vec![],
aura::streaming::RunOptions::default(),
&aura::RequestId::generate(),
)
.await
.into_events();
assert!(
Expand All @@ -216,7 +221,12 @@ mod tests {
async fn a_yielding_agent_produces_its_items_then_ends() {
let agent = MockAgent::yielding(vec![items::text("hello "), items::text("world")]);
let mut stream = agent
.stream("q", vec![], aura::streaming::RunOptions::default(), "req_1")
.stream(
"q",
vec![],
aura::streaming::RunOptions::default(),
&aura::RequestId::generate(),
)
.await
.into_events();

Expand All @@ -235,16 +245,24 @@ mod tests {
async fn the_start_hook_runs_before_the_stream() {
let ran = Arc::new(AtomicBool::new(false));
let flag = Arc::clone(&ran);
let agent = MockAgent::pending().on_stream_start(move |request_id| {
let request_id = aura::RequestId::generate();
let expected = request_id.to_string();
let agent = MockAgent::pending().on_stream_start(move |seen| {
let flag = Arc::clone(&flag);
let expected = expected.clone();
async move {
assert_eq!(request_id, "req_1");
assert_eq!(seen, expected);
flag.store(true, Ordering::SeqCst);
}
});

let _ = agent
.stream("q", vec![], aura::streaming::RunOptions::default(), "req_1")
.stream(
"q",
vec![],
aura::streaming::RunOptions::default(),
&request_id,
)
.await
.into_events();

Expand All @@ -253,6 +271,7 @@ mod tests {

#[tokio::test(start_paused = true)]
async fn effects_run_in_script_order_and_see_the_request_id() {
let request_id = aura::RequestId::generate();
let order = Arc::new(Mutex::new(Vec::new()));
let effect_order = Arc::clone(&order);
let agent = MockAgent::scripted(vec![
Expand All @@ -270,13 +289,16 @@ mod tests {
"q",
vec![],
aura::streaming::RunOptions::default(),
"req_42",
&request_id,
)
.await
.into_events();
let items: Vec<_> = stream.collect().await;

assert_eq!(order.lock().expect("order lock").as_slice(), ["req_42"]);
assert_eq!(
order.lock().expect("order lock").as_slice(),
[request_id.to_string()]
);
assert_eq!(items.len(), 1, "effects do not yield stream items");
}

Expand All @@ -285,13 +307,23 @@ mod tests {
let agent = MockAgent::yielding([items::text("once")]);

let first: Vec<_> = agent
.stream("q", vec![], aura::streaming::RunOptions::default(), "req_1")
.stream(
"q",
vec![],
aura::streaming::RunOptions::default(),
&aura::RequestId::generate(),
)
.await
.into_events()
.collect()
.await;
let second: Vec<_> = agent
.stream("q", vec![], aura::streaming::RunOptions::default(), "req_1")
.stream(
"q",
vec![],
aura::streaming::RunOptions::default(),
&aura::RequestId::generate(),
)
.await
.into_events()
.collect()
Expand All @@ -318,7 +350,12 @@ mod tests {
]);

let mut stream = agent
.stream("q", vec![], aura::streaming::RunOptions::default(), "req_1")
.stream(
"q",
vec![],
aura::streaming::RunOptions::default(),
&aura::RequestId::generate(),
)
.await
.into_events();
while stream.next().await.is_some() {
Expand Down
Loading
Loading