use std::sync::Arc;
use crate::stream::AssistantMessageDelta;
use crate::tool::AgentToolResult;
use crate::types::{AgentMessage, AssistantMessage, LlmMessage, ModelSpec, ToolResultMessage};
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TurnEndReason {
Complete,
ToolsExecuted,
SteeringInterrupt,
Error,
Cancelled,
Aborted,
Transfer,
}
#[non_exhaustive]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(tag = "event", rename_all = "snake_case")]
#[allow(clippy::large_enum_variant)]
pub enum AgentEvent {
AgentStart,
AgentEnd { messages: Arc<Vec<AgentMessage>> },
TurnStart,
TurnEnd {
assistant_message: AssistantMessage,
tool_results: Vec<ToolResultMessage>,
reason: TurnEndReason,
snapshot: crate::types::TurnSnapshot,
},
BeforeLlmCall {
system_prompt: String,
messages: Vec<LlmMessage>,
model: ModelSpec,
},
MessageStart,
MessageUpdate { delta: AssistantMessageDelta },
MessageEnd { message: AssistantMessage },
ToolExecutionStart {
id: String,
name: String,
arguments: serde_json::Value,
},
ToolExecutionUpdate {
id: String,
name: String,
partial: AgentToolResult,
},
ToolApprovalRequested {
id: String,
name: String,
arguments: serde_json::Value,
},
ToolApprovalResolved {
id: String,
name: String,
approved: bool,
},
ToolExecutionEnd {
id: String,
name: String,
result: AgentToolResult,
is_error: bool,
},
ContextCompacted {
report: crate::context::CompactionReport,
},
ModelFallback {
from_model: ModelSpec,
to_model: ModelSpec,
},
ModelCycled {
old: ModelSpec,
new: ModelSpec,
reason: String,
},
StateChanged { delta: crate::StateDelta },
CacheAction {
hint: crate::context_cache::CacheHint,
prefix_tokens: usize,
},
McpServerConnected { server_name: String },
McpServerDisconnected { server_name: String, reason: String },
McpToolsDiscovered {
server_name: String,
tool_count: usize,
},
McpToolCallStarted {
server_name: String,
tool_name: String,
},
McpToolCallCompleted {
server_name: String,
tool_name: String,
is_error: bool,
},
#[cfg(feature = "artifact-store")]
ArtifactSaved {
session_id: String,
name: String,
version: u32,
},
TransferInitiated {
signal: crate::transfer::TransferSignal,
},
Custom(crate::emit::Emission),
}