1use serde::Serialize;
2use tokio::sync::mpsc;
3
4#[derive(Debug, Clone, Serialize)]
5#[serde(tag = "type", rename_all = "snake_case")]
6pub enum AgentStreamEvent {
7 Status {
8 message: String,
9 },
10 ToolStart {
11 name: String,
12 hint: String,
13 },
14 ToolEnd {
15 name: String,
16 ok: bool,
17 elapsed_secs: u64,
18 },
19 Delta {
20 text: String,
21 },
22 Done {
23 response: String,
24 },
25 Error {
26 message: String,
27 },
28}
29
30pub type AgentStreamTx = mpsc::UnboundedSender<AgentStreamEvent>;
31
32pub fn emit(tx: &Option<AgentStreamTx>, event: AgentStreamEvent) {
33 if let Some(tx) = tx {
34 let _ = tx.send(event);
35 }
36}