a3s_code_core/orchestrator/
events.rs1use crate::agent::AgentEvent;
4use crate::llm::TokenUsage;
5use crate::orchestrator::{ControlSignal, SubAgentConfig, SubAgentState};
6use crate::planning::ExecutionPlan;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(tag = "event_type", rename_all = "snake_case")]
12pub enum OrchestratorEvent {
13 SubAgentStarted {
15 id: String,
16 agent_type: String,
17 description: String,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 parent_id: Option<String>,
20 config: SubAgentConfig,
21 },
22
23 SubAgentCompleted {
25 id: String,
26 success: bool,
27 output: String,
28 duration_ms: u64,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 token_usage: Option<TokenUsage>,
31 },
32
33 SubAgentStateChanged {
35 id: String,
36 old_state: SubAgentState,
37 new_state: SubAgentState,
38 },
39
40 SubAgentProgress {
42 id: String,
43 step: usize,
44 total_steps: usize,
45 message: String,
46 },
47
48 SubAgentInternalEvent {
50 id: String,
51 #[serde(flatten)]
52 event: AgentEvent,
53 },
54
55 PlanningStarted { id: String, goal: String },
57
58 PlanningCompleted { id: String, plan: ExecutionPlan },
60
61 ToolExecutionStarted {
63 id: String,
64 tool_id: String,
65 tool_name: String,
66 args: serde_json::Value,
67 },
68
69 ToolExecutionCompleted {
71 id: String,
72 tool_id: String,
73 tool_name: String,
74 result: String,
75 exit_code: i32,
76 duration_ms: u64,
77 },
78
79 ControlSignalReceived { id: String, signal: ControlSignal },
81
82 ControlSignalApplied {
84 id: String,
85 signal: ControlSignal,
86 success: bool,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 error: Option<String>,
89 },
90}
91
92impl OrchestratorEvent {
93 pub fn subagent_id(&self) -> Option<&str> {
95 match self {
96 OrchestratorEvent::SubAgentStarted { id, .. }
97 | OrchestratorEvent::SubAgentCompleted { id, .. }
98 | OrchestratorEvent::SubAgentStateChanged { id, .. }
99 | OrchestratorEvent::SubAgentProgress { id, .. }
100 | OrchestratorEvent::SubAgentInternalEvent { id, .. }
101 | OrchestratorEvent::PlanningStarted { id, .. }
102 | OrchestratorEvent::PlanningCompleted { id, .. }
103 | OrchestratorEvent::ToolExecutionStarted { id, .. }
104 | OrchestratorEvent::ToolExecutionCompleted { id, .. }
105 | OrchestratorEvent::ControlSignalReceived { id, .. }
106 | OrchestratorEvent::ControlSignalApplied { id, .. } => Some(id),
107 }
108 }
109
110 pub fn event_name(&self) -> &'static str {
112 match self {
113 OrchestratorEvent::SubAgentStarted { .. } => "subagent_started",
114 OrchestratorEvent::SubAgentCompleted { .. } => "subagent_completed",
115 OrchestratorEvent::SubAgentStateChanged { .. } => "subagent_state_changed",
116 OrchestratorEvent::SubAgentProgress { .. } => "subagent_progress",
117 OrchestratorEvent::SubAgentInternalEvent { .. } => "subagent_internal_event",
118 OrchestratorEvent::PlanningStarted { .. } => "planning_started",
119 OrchestratorEvent::PlanningCompleted { .. } => "planning_completed",
120 OrchestratorEvent::ToolExecutionStarted { .. } => "tool_execution_started",
121 OrchestratorEvent::ToolExecutionCompleted { .. } => "tool_execution_completed",
122 OrchestratorEvent::ControlSignalReceived { .. } => "control_signal_received",
123 OrchestratorEvent::ControlSignalApplied { .. } => "control_signal_applied",
124 }
125 }
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct SubAgentEventPayload {
131 pub subagent_id: String,
132 pub event: OrchestratorEvent,
133 pub timestamp: i64,
134}