Skip to content

Commit 2748445

Browse files
committed
Fix resetting Idle state after canceling agent
1 parent 5bbe5c8 commit 2748445

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

crates/code_assistant/src/session/instance.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -429,19 +429,22 @@ impl UserInterface for ProxyUI {
429429
// Update activity state to waiting for response
430430
self.update_activity_state(SessionActivityState::WaitingForResponse);
431431
}
432-
UiEvent::StreamingStopped { .. } => {
432+
UiEvent::StreamingStopped { cancelled, .. } => {
433433
// Clear fragment buffer when LLM request ends - fragments are now part of message history
434434
if let Ok(mut buffer) = self.fragment_buffer.lock() {
435435
buffer.clear();
436436
}
437-
// Update activity state back to agent running (it will be set to idle when agent completes)
438-
let current_state = self.session_activity_state.lock().unwrap().clone();
439-
if matches!(
440-
current_state,
441-
SessionActivityState::WaitingForResponse
442-
| SessionActivityState::RateLimited { .. }
443-
) {
444-
self.update_activity_state(SessionActivityState::AgentRunning);
437+
// Only update activity state back to agent running if streaming was not cancelled
438+
// If cancelled, the agent task will end soon and set state to Idle
439+
if !cancelled {
440+
let current_state = self.session_activity_state.lock().unwrap().clone();
441+
if matches!(
442+
current_state,
443+
SessionActivityState::WaitingForResponse
444+
| SessionActivityState::RateLimited { .. }
445+
) {
446+
self.update_activity_state(SessionActivityState::AgentRunning);
447+
}
445448
}
446449
}
447450
_ => {}

crates/code_assistant/src/session/manager.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,19 +280,27 @@ impl SessionManager {
280280
debug!("Starting agent for session {}", session_id_clone);
281281
let result = agent.run_single_iteration().await;
282282

283-
// Set session state back to Idle when agent completes and broadcast
283+
// Always set session state back to Idle when agent task ends (regardless of success/failure/cancellation)
284+
debug!("Agent task ending for session {}, setting state to Idle", session_id_clone);
284285
if let Ok(mut state) = activity_state_ref.lock() {
285286
*state = crate::session::instance::SessionActivityState::Idle;
286287
}
287288

288-
let _ = ui_clone
289+
// Always broadcast the state change to UI
290+
let send_result = ui_clone
289291
.send_event(crate::ui::UiEvent::UpdateSessionActivityState {
290292
session_id: session_id_clone.clone(),
291293
activity_state: crate::session::instance::SessionActivityState::Idle,
292294
})
293295
.await;
294296

295-
debug!("Agent completed for session {}", session_id_clone);
297+
if let Err(e) = send_result {
298+
debug!("Failed to send UpdateSessionActivityState event for session {}: {}", session_id_clone, e);
299+
} else {
300+
debug!("Successfully sent UpdateSessionActivityState(Idle) event for session {}", session_id_clone);
301+
}
302+
303+
debug!("Agent completed for session {} with result: {:?}", session_id_clone, result.is_ok());
296304
result
297305
});
298306

0 commit comments

Comments
 (0)