Show session selector popup with all available sessions
(
&self,
chat_view: &mut ChatView,
chat_state: &mut ChatState,
rt_handle: &tokio::runtime::Handle,
)
| 3308 | |
| 3309 | /// Show session selector popup with all available sessions |
| 3310 | fn show_session_selector( |
| 3311 | &self, |
| 3312 | chat_view: &mut ChatView, |
| 3313 | chat_state: &mut ChatState, |
| 3314 | rt_handle: &tokio::runtime::Handle, |
| 3315 | ) { |
| 3316 | let agent = self.agent.clone(); |
| 3317 | let current_session_id = chat_state.core_session_id.clone(); |
| 3318 | |
| 3319 | let sessions = tokio::task::block_in_place(|| { |
| 3320 | rt_handle.block_on(async { |
| 3321 | agent |
| 3322 | .coordinator() |
| 3323 | .list_sessions(&agent.workspace_path_buf()) |
| 3324 | .await |
| 3325 | .unwrap_or_default() |
| 3326 | }) |
| 3327 | }); |
| 3328 | |
| 3329 | if sessions.is_empty() { |
| 3330 | chat_state.add_system_message("No sessions found.".to_string()); |
| 3331 | return; |
| 3332 | } |
| 3333 | |
| 3334 | let session_items: Vec<SessionItem> = sessions |
| 3335 | .into_iter() |
| 3336 | .map(|s| { |
| 3337 | let last_activity = { |
| 3338 | let elapsed = s.last_activity_at.elapsed().unwrap_or_default(); |
| 3339 | if elapsed.as_secs() < 60 { |
| 3340 | "just now".to_string() |
| 3341 | } else if elapsed.as_secs() < 3600 { |
| 3342 | format!("{}m ago", elapsed.as_secs() / 60) |
| 3343 | } else if elapsed.as_secs() < 86400 { |
| 3344 | format!("{}h ago", elapsed.as_secs() / 3600) |
| 3345 | } else { |
| 3346 | format!("{}d ago", elapsed.as_secs() / 86400) |
| 3347 | } |
| 3348 | }; |
| 3349 | SessionItem { |
| 3350 | session_id: s.session_id, |
| 3351 | session_name: s.session_name, |
| 3352 | last_activity, |
| 3353 | workspace: self.workspace.clone(), |
| 3354 | } |
| 3355 | }) |
| 3356 | .collect(); |
| 3357 | |
| 3358 | chat_view.show_session_selector(session_items, Some(current_session_id)); |
| 3359 | } |
| 3360 | |
| 3361 | /// Handle session deletion from the session selector |
| 3362 | fn handle_session_delete( |
no test coverage detected