claude_agent/agent/
events.rs1use super::state::{AgentMetrics, AgentState};
4use crate::types::{Message, StopReason, Usage};
5
6#[derive(Debug, Clone)]
8pub enum AgentEvent {
9 Text(String),
10 Thinking(String),
11 ToolComplete {
12 id: String,
13 name: String,
14 output: String,
15 is_error: bool,
16 duration_ms: u64,
17 },
18 ToolBlocked {
19 id: String,
20 name: String,
21 reason: String,
22 },
23 ContextUpdate {
24 used_tokens: u64,
25 max_tokens: u64,
26 },
27 Complete(Box<AgentResult>),
28}
29
30#[derive(Debug, Clone)]
32pub struct AgentResult {
33 pub text: String,
34 pub usage: Usage,
35 pub tool_calls: usize,
36 pub iterations: usize,
37 pub stop_reason: StopReason,
38 pub state: AgentState,
39 pub metrics: AgentMetrics,
40 pub session_id: String,
41 pub structured_output: Option<serde_json::Value>,
42 pub messages: Vec<Message>,
43 pub uuid: String,
45}
46
47impl AgentResult {
48 #[must_use]
49 pub fn text(&self) -> &str {
50 &self.text
51 }
52
53 #[must_use]
54 pub fn total_tokens(&self) -> u32 {
55 self.usage.total()
56 }
57
58 #[must_use]
59 pub fn metrics(&self) -> &AgentMetrics {
60 &self.metrics
61 }
62
63 #[must_use]
64 pub fn session_id(&self) -> &str {
65 &self.session_id
66 }
67
68 pub fn extract<T: serde::de::DeserializeOwned>(&self) -> crate::Result<T> {
69 let value = self
70 .structured_output
71 .as_ref()
72 .ok_or_else(|| crate::Error::Parse("No structured output available".to_string()))?;
73 serde_json::from_value(value.clone()).map_err(|e| crate::Error::Parse(e.to_string()))
74 }
75}