use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use uuid::Uuid;
use crate::provider::{FinishReason, ModelName, ProviderId, TokenUsage, ToolCall};
use super::run::RunId;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AgentEvent {
RunStarted(RunStarted),
ContextBuilt(ContextBuilt),
ModelStarted(ModelStarted),
TextDelta(TextDelta),
ToolCallStarted(ToolCallStarted),
ToolCallDelta(ToolCallDelta),
ToolCallCompleted(ToolCallCompleted),
ToolExecutionStarted(ToolExecutionStarted),
ToolExecutionFinished(ToolExecutionFinished),
AssistantMessageCommitted(MessageCommitted),
ToolMessageCommitted(MessageCommitted),
UsageRecorded(UsageRecorded),
RunCompleted(RunCompleted),
RunFailed(RunFailed),
RunCancelled(RunCancelled),
DoomLoopDetected(DoomLoopDetected),
CompactionCircuitOpened(CompactionCircuitOpened),
}
impl AgentEvent {
#[must_use]
pub fn run_id(&self) -> RunId {
match self {
AgentEvent::RunStarted(e) => e.run_id,
AgentEvent::ContextBuilt(e) => e.run_id,
AgentEvent::ModelStarted(e) => e.run_id,
AgentEvent::TextDelta(e) => e.run_id,
AgentEvent::ToolCallStarted(e) => e.run_id,
AgentEvent::ToolCallDelta(e) => e.run_id,
AgentEvent::ToolCallCompleted(e) => e.run_id,
AgentEvent::ToolExecutionStarted(e) => e.run_id,
AgentEvent::ToolExecutionFinished(e) => e.run_id,
AgentEvent::AssistantMessageCommitted(e) | AgentEvent::ToolMessageCommitted(e) => {
e.run_id
}
AgentEvent::UsageRecorded(e) => e.run_id,
AgentEvent::RunCompleted(e) => e.run_id,
AgentEvent::RunFailed(e) => e.run_id,
AgentEvent::RunCancelled(e) => e.run_id,
AgentEvent::DoomLoopDetected(e) => e.run_id,
AgentEvent::CompactionCircuitOpened(e) => e.run_id,
}
}
#[must_use]
pub fn is_terminal(&self) -> bool {
matches!(
self,
AgentEvent::RunCompleted(_) | AgentEvent::RunFailed(_) | AgentEvent::RunCancelled(_)
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunStarted {
pub run_id: RunId,
pub session_id: Uuid,
pub provider: ProviderId,
pub model: ModelName,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContextBuilt {
pub run_id: RunId,
pub message_count: usize,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelStarted {
pub run_id: RunId,
pub provider: ProviderId,
pub model: ModelName,
pub iteration: usize,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextDelta {
pub run_id: RunId,
pub delta: String,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallStarted {
pub run_id: RunId,
pub call_id: String,
pub tool_name: String,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallDelta {
pub run_id: RunId,
pub call_id: String,
pub delta: String,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallCompleted {
pub run_id: RunId,
pub call: ToolCall,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolExecutionStarted {
pub run_id: RunId,
pub call_id: String,
pub tool_name: String,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolExecutionFinished {
pub run_id: RunId,
pub call_id: String,
pub tool_name: String,
pub result: ToolExecutionResult,
pub duration_ms: u64,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ToolExecutionResult {
Success {
output: Value,
},
Failure {
error: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageCommitted {
pub run_id: RunId,
pub message_id: Uuid,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageRecorded {
pub run_id: RunId,
pub usage: TokenUsage,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunCompleted {
pub run_id: RunId,
pub finish_reason: FinishReason,
pub iterations: usize,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunFailed {
pub run_id: RunId,
pub error: String,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunCancelled {
pub run_id: RunId,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DoomLoopDetected {
pub run_id: RunId,
pub description: String,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompactionCircuitOpened {
pub run_id: RunId,
pub consecutive_failures: u32,
pub timestamp: DateTime<Utc>,
}