use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::approval::ApprovalRequest;
use super::checkpoint::CheckpointData;
use super::plan_update::PlanItem;
use super::session::SessionId;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(tag = "userEventType", rename_all = "camelCase")]
pub enum UserEvent {
Progress { text: String },
SubAgentEvent { subagent: String, event: Box<RuntimeEvent> },
Structured { event_type: String, data: Value },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(tag = "runtimeEventType", rename_all = "camelCase")]
pub enum RuntimeEvent {
TextDelta { session_id: SessionId, text: String },
ThoughtDelta { session_id: SessionId, text: String },
ToolCallStarted { session_id: SessionId, tool_name: String, args_json: String },
ToolCallFinished { session_id: SessionId, tool_name: String, summary: String },
AwaitingApproval { session_id: SessionId, request: ApprovalRequest },
Checkpoint { session_id: SessionId, checkpoint: CheckpointData },
RunFinished { session_id: SessionId },
RunCancelled { session_id: SessionId },
PlanUpdated { session_id: SessionId, objective: String, explanation: Option<String>, plan: Vec<PlanItem> },
UserEvent { session_id: SessionId, event: UserEvent },
}
impl RuntimeEvent {
pub fn session_id(&self) -> &SessionId {
match self {
RuntimeEvent::TextDelta { session_id, .. } => session_id,
RuntimeEvent::ThoughtDelta { session_id, .. } => session_id,
RuntimeEvent::ToolCallStarted { session_id, .. } => session_id,
RuntimeEvent::ToolCallFinished { session_id, .. } => session_id,
RuntimeEvent::AwaitingApproval { session_id, .. } => session_id,
RuntimeEvent::Checkpoint { session_id, .. } => session_id,
RuntimeEvent::RunFinished { session_id, .. } => session_id,
RuntimeEvent::RunCancelled { session_id, .. } => session_id,
RuntimeEvent::PlanUpdated { session_id, .. } => session_id,
RuntimeEvent::UserEvent { session_id, .. } => session_id,
}
}
}