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 crate::planning::ExecutionPlan;
7use serde::{Deserialize, Serialize};
8
9/// Orchestrator 事件 - 统一的事件类型
10#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(tag = "event_type", rename_all = "snake_case")]
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 内部事件(来自 AgentLoop)
49    SubAgentInternalEvent {
50        id: String,
51        #[serde(flatten)]
52        event: AgentEvent,
53    },
54
55    /// 规划开始
56    PlanningStarted { id: String, goal: String },
57
58    /// 规划完成
59    PlanningCompleted { id: String, plan: ExecutionPlan },
60
61    /// 工具执行开始
62    ToolExecutionStarted {
63        id: String,
64        tool_id: String,
65        tool_name: String,
66        args: serde_json::Value,
67    },
68
69    /// 工具执行完成
70    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    /// 控制信号接收
80    ControlSignalReceived { id: String, signal: ControlSignal },
81
82    /// 控制信号应用
83    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    /// 获取 SubAgent ID
94    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    /// 获取事件类型名称
111    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/// SubAgent 事件 Payload(用于 a3s-event)
129#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct SubAgentEventPayload {
131    pub subagent_id: String,
132    pub event: OrchestratorEvent,
133    pub timestamp: i64,
134}