(&mut self)
| 95 | } |
| 96 | |
| 97 | pub async fn run(&mut self) -> Result<()> { |
| 98 | tracing::info!( |
| 99 | "Executing command, Agent: {}, Message: {}", |
| 100 | self.agent_type, |
| 101 | self.message |
| 102 | ); |
| 103 | |
| 104 | let session_id = self.prepare_session().await?; |
| 105 | let event_queue = self.agent.event_queue().clone(); |
| 106 | |
| 107 | self.emit(json!({ |
| 108 | "type": "session", |
| 109 | "session_id": session_id, |
| 110 | "agent": self.agent_type, |
| 111 | }))?; |
| 112 | self.print_text(|| { |
| 113 | println!("Executing: {}", self.message); |
| 114 | println!(); |
| 115 | println!("Session: {}", session_id); |
| 116 | println!("Thinking..."); |
| 117 | }); |
| 118 | |
| 119 | let _turn_id = self |
| 120 | .agent |
| 121 | .send_message(self.message.clone(), &self.agent_type) |
| 122 | .await?; |
| 123 | |
| 124 | // Consume events from EventQueue until turn completes |
| 125 | let mut total_tool_calls = 0usize; |
| 126 | let mut subagent_parent_sessions: HashMap<String, String> = HashMap::new(); |
| 127 | |
| 128 | loop { |
| 129 | // Wait for events (efficient, uses Notify internally) |
| 130 | event_queue.wait_for_events().await; |
| 131 | let events = event_queue.dequeue_batch(20).await; |
| 132 | |
| 133 | for envelope in events { |
| 134 | let event = &envelope.event; |
| 135 | |
| 136 | if let AgenticEvent::SubagentSessionLinked { |
| 137 | session_id: subagent_session_id, |
| 138 | parent_session_id, |
| 139 | .. |
| 140 | } = event |
| 141 | { |
| 142 | subagent_parent_sessions |
| 143 | .insert(subagent_session_id.clone(), parent_session_id.clone()); |
| 144 | continue; |
| 145 | } |
| 146 | |
| 147 | // Only process events for our session |
| 148 | if event.session_id() != Some(&session_id) { |
| 149 | // Check if this is a subagent event whose parent is in our session |
| 150 | if let AgenticEvent::ToolEvent { tool_event, .. } = event { |
| 151 | let parent_session_id = event.session_id().and_then(|event_session_id| { |
| 152 | subagent_parent_sessions.get(event_session_id) |
| 153 | }); |
| 154 | if parent_session_id.map(String::as_str) == Some(session_id.as_str()) { |
nothing calls this directly
no test coverage detected