| 404 | } |
| 405 | |
| 406 | pub async fn stats(&self) -> crate::queue::SessionQueueStats { |
| 407 | let lane_stats = self.manager.stats().await.ok(); |
| 408 | let external_tasks = self.external_tasks.read().await; |
| 409 | let mut total_pending = 0; |
| 410 | let mut total_active = 0; |
| 411 | let mut lanes = HashMap::new(); |
| 412 | if let Some(stats) = lane_stats { |
| 413 | for (lane_id, lane_stat) in stats.lanes { |
| 414 | total_pending += lane_stat.pending; |
| 415 | total_active += lane_stat.active; |
| 416 | let session_lane = match lane_id.as_str() { |
| 417 | "control" => SessionLane::Control, |
| 418 | "query" => SessionLane::Query, |
| 419 | "skill" => SessionLane::Execute, |
| 420 | "prompt" => SessionLane::Generate, |
| 421 | _ => continue, |
| 422 | }; |
| 423 | let handler_mode = self.get_lane_handler(session_lane).await.mode; |
| 424 | lanes.insert( |
| 425 | format!("{:?}", session_lane), |
| 426 | crate::queue::LaneStatus { |
| 427 | lane: session_lane, |
| 428 | pending: lane_stat.pending, |
| 429 | active: lane_stat.active, |
| 430 | max_concurrency: lane_stat.max, |
| 431 | handler_mode, |
| 432 | }, |
| 433 | ); |
| 434 | } |
| 435 | } |
| 436 | crate::queue::SessionQueueStats { |
| 437 | total_pending, |
| 438 | total_active, |
| 439 | external_pending: external_tasks.len(), |
| 440 | lanes, |
| 441 | } |
| 442 | } |
| 443 | |
| 444 | pub async fn pending_external_tasks(&self) -> Vec<ExternalTask> { |
| 445 | self.external_tasks |