From 5f01dda291e8354e779cc9220f38754fe0c3786f Mon Sep 17 00:00:00 2001 From: cyq <15000851237@163.com> Date: Mon, 1 Jun 2026 20:56:00 +0800 Subject: [PATCH] fix(tui): hold subagent cap until status reconciles --- crates/tui/src/tools/subagent/mod.rs | 10 ++++++---- crates/tui/src/tools/subagent/tests.rs | 15 ++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/crates/tui/src/tools/subagent/mod.rs b/crates/tui/src/tools/subagent/mod.rs index 67d3cd17f..c00e5e5c7 100644 --- a/crates/tui/src/tools/subagent/mod.rs +++ b/crates/tui/src/tools/subagent/mod.rs @@ -1249,11 +1249,13 @@ impl SubAgentManager { return false; } // Exclude persisted agents with no task_handle (they're not actually running) - let Some(handle) = agent.task_handle.as_ref() else { + if agent.task_handle.is_none() { return false; - }; - // Exclude agents whose task has finished (status will be updated to Completed shortly) - !handle.is_finished() + } + // Keep recently finished handles counted until the terminal + // status update has reconciled. Otherwise a fanout burst can + // refill the cap before the UI/state catches up (#2211). + true }) .count() } diff --git a/crates/tui/src/tools/subagent/tests.rs b/crates/tui/src/tools/subagent/tests.rs index 9c53604ed..29d5fc861 100644 --- a/crates/tui/src/tools/subagent/tests.rs +++ b/crates/tui/src/tools/subagent/tests.rs @@ -938,7 +938,7 @@ fn test_running_count_ignores_running_status_without_task_handle() { } #[tokio::test] -async fn test_running_count_ignores_finished_task_handles() { +async fn test_running_count_counts_running_agents_until_status_reconciles() { let mut manager = SubAgentManager::new(PathBuf::from("."), 1); let (input_tx, _input_rx) = mpsc::unbounded_channel(); let mut agent = SubAgent::new( @@ -953,17 +953,14 @@ async fn test_running_count_ignores_finished_task_handles() { "boot_test".to_string(), ); agent.status = SubAgentStatus::Running; - let handle = tokio::spawn(async {}); - handle.await.expect("dummy task should finish immediately"); - agent.task_handle = Some(tokio::spawn(async {})); - if let Some(handle) = agent.task_handle.as_ref() { - while !handle.is_finished() { - tokio::task::yield_now().await; - } + let finished_handle = tokio::spawn(async {}); + while !finished_handle.is_finished() { + tokio::task::yield_now().await; } + agent.task_handle = Some(finished_handle); manager.agents.insert(agent.id.clone(), agent); - assert_eq!(manager.running_count(), 0); + assert_eq!(manager.running_count(), 1); } #[test]