claude_agent/agent/
events.rs

1//! Agent events and result types.
2
3use super::state::{AgentMetrics, AgentState};
4use crate::types::{Message, StopReason, Usage};
5
6/// Events emitted during agent execution.
7#[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/// Result of agent execution.
31#[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    /// Unique identifier for this result (like CLI's uuid).
44    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}