use std::sync::Arc;
use agent_client_protocol_schema::{
ContentBlock, PermissionOptionId, StopReason as AcpStopReason, ToolCallId, ToolCallUpdateFields,
};
use serde::{Deserialize, Serialize};
use crate::llm::{Message, Usage};
use crate::policy::PolicyDecision;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AgentEvent {
TurnStarted,
UserPromptCommitted { content: Vec<ContentBlock> },
TurnEnded {
reason: AcpStopReason,
usage: Usage,
},
AssistantText { content: ContentBlock },
AssistantThought { content: ContentBlock },
ToolCallStarted {
id: ToolCallId,
name: String,
fields: ToolCallUpdateFields,
},
ToolCallProgress {
id: ToolCallId,
fields: ToolCallUpdateFields,
},
ToolCallFinished {
id: ToolCallId,
fields: ToolCallUpdateFields,
},
PolicyDecision {
id: ToolCallId,
decision: PolicyDecision,
},
PermissionResolved {
id: ToolCallId,
outcome: PermissionResolution,
},
LlmCallStarted {
model: String,
attempt: u32,
#[serde(skip)]
request: Arc<LlmRequestSnapshot>,
},
LlmCallFinished {
model: String,
attempt: u32,
usage: Usage,
error: Option<String>,
},
ContextCompressed {
tokens_before: u64,
tokens_after: u64,
},
ContextMicrocompacted {
tokens_before: u64,
tokens_after: u64,
cleared: usize,
},
Subagent {
ancestor_path: Vec<ToolCallId>,
agent_type: String,
inner: Box<AgentEvent>,
},
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct LlmRequestSnapshot {
pub system: Option<Arc<str>>,
pub messages: Vec<Message>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum PermissionResolution {
Selected { option_id: PermissionOptionId },
Cancelled,
}