a3s_code_core/orchestrator/
events.rs1use crate::agent::AgentEvent;
4use crate::llm::TokenUsage;
5use crate::orchestrator::{ControlSignal, SubAgentConfig, SubAgentState};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(tag = "event_type", rename_all = "snake_case")]
11#[allow(clippy::large_enum_variant)]
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 ToolExecutionStarted {
57 id: String,
58 tool_id: String,
59 tool_name: String,
60 args: serde_json::Value,
61 },
62
63 ToolExecutionCompleted {
65 id: String,
66 tool_id: String,
67 tool_name: String,
68 result: String,
69 exit_code: i32,
70 duration_ms: u64,
71 },
72
73 ControlSignalReceived { id: String, signal: ControlSignal },
75
76 ControlSignalApplied {
78 id: String,
79 signal: ControlSignal,
80 success: bool,
81 #[serde(skip_serializing_if = "Option::is_none")]
82 error: Option<String>,
83 },
84}
85
86impl OrchestratorEvent {
87 pub fn subagent_id(&self) -> Option<&str> {
89 match self {
90 OrchestratorEvent::SubAgentStarted { id, .. }
91 | OrchestratorEvent::SubAgentCompleted { id, .. }
92 | OrchestratorEvent::SubAgentStateChanged { id, .. }
93 | OrchestratorEvent::SubAgentProgress { id, .. }
94 | OrchestratorEvent::SubAgentInternalEvent { id, .. }
95 | OrchestratorEvent::ToolExecutionStarted { id, .. }
96 | OrchestratorEvent::ToolExecutionCompleted { id, .. }
97 | OrchestratorEvent::ControlSignalReceived { id, .. }
98 | OrchestratorEvent::ControlSignalApplied { id, .. } => Some(id),
99 }
100 }
101
102 pub fn event_name(&self) -> &'static str {
104 match self {
105 OrchestratorEvent::SubAgentStarted { .. } => "subagent_started",
106 OrchestratorEvent::SubAgentCompleted { .. } => "subagent_completed",
107 OrchestratorEvent::SubAgentStateChanged { .. } => "subagent_state_changed",
108 OrchestratorEvent::SubAgentProgress { .. } => "subagent_progress",
109 OrchestratorEvent::SubAgentInternalEvent { .. } => "subagent_internal_event",
110 OrchestratorEvent::ToolExecutionStarted { .. } => "tool_execution_started",
111 OrchestratorEvent::ToolExecutionCompleted { .. } => "tool_execution_completed",
112 OrchestratorEvent::ControlSignalReceived { .. } => "control_signal_received",
113 OrchestratorEvent::ControlSignalApplied { .. } => "control_signal_applied",
114 }
115 }
116}