| 382 | } |
| 383 | |
| 384 | pub async fn complete_external_task(&self, task_id: &str, result: ExternalTaskResult) -> bool { |
| 385 | let pending = { self.external_tasks.write().await.remove(task_id) }; |
| 386 | if let Some(pending) = pending { |
| 387 | let _ = self.event_tx.send(AgentEvent::ExternalTaskCompleted { |
| 388 | task_id: task_id.to_string(), |
| 389 | session_id: self.session_id.clone(), |
| 390 | success: result.success, |
| 391 | }); |
| 392 | let final_result = if result.success { |
| 393 | Ok(result.result) |
| 394 | } else { |
| 395 | Err(anyhow::anyhow!(result |
| 396 | .error |
| 397 | .unwrap_or_else(|| "External task failed".to_string()))) |
| 398 | }; |
| 399 | let _ = pending.result_tx.send(final_result); |
| 400 | true |
| 401 | } else { |
| 402 | false |
| 403 | } |
| 404 | } |
| 405 | |
| 406 | pub async fn stats(&self) -> crate::queue::SessionQueueStats { |
| 407 | let lane_stats = self.manager.stats().await.ok(); |