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,
}
}
}