Skip to main content

a3s_code_core/orchestrator/
events.rs

1//! Orchestrator 事件定义
2
3use crate::agent::AgentEvent;
4use crate::llm::TokenUsage;
5use crate::orchestrator::{ControlSignal, SubAgentConfig, SubAgentState};
6use serde::{Deserialize, Serialize};
7
8/// Orchestrator 事件 - 统一的事件类型
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(tag = "event_type", rename_all = "snake_case")]
11#[allow(clippy::large_enum_variant)]
12pub enum OrchestratorEvent {
13    /// SubAgent 启动
14    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    /// SubAgent 完成
24    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    /// SubAgent 状态变更
34    SubAgentStateChanged {
35        id: String,
36        old_state: SubAgentState,
37        new_state: SubAgentState,
38    },
39
40    /// SubAgent 进度更新
41    SubAgentProgress {
42        id: String,
43        step: usize,
44        total_steps: usize,
45        message: String,
46    },
47
48    /// SubAgent 内部事件(来自 AgentSession stream)
49    SubAgentInternalEvent {
50        id: String,
51        #[serde(flatten)]
52        event: AgentEvent,
53    },
54
55    /// 工具执行开始
56    ToolExecutionStarted {
57        id: String,
58        tool_id: String,
59        tool_name: String,
60        args: serde_json::Value,
61    },
62
63    /// 工具执行完成
64    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    /// 控制信号接收
74    ControlSignalReceived { id: String, signal: ControlSignal },
75
76    /// 控制信号应用
77    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    /// 获取 SubAgent ID
88    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    /// 获取事件类型名称
103    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}