Skip to main content

zagens_core/subagent/
mailbox.rs

1//! Structured sub-agent mailbox envelopes for engine events (P2 PR4).
2
3use serde::{Deserialize, Serialize};
4
5use crate::models::Usage;
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8#[serde(tag = "kind", rename_all = "snake_case")]
9pub enum MailboxMessage {
10    Started {
11        agent_id: String,
12        agent_type: String,
13    },
14    Progress {
15        agent_id: String,
16        status: String,
17    },
18    ToolCallStarted {
19        agent_id: String,
20        tool_name: String,
21        step: u32,
22    },
23    ToolCallCompleted {
24        agent_id: String,
25        tool_name: String,
26        step: u32,
27        ok: bool,
28    },
29    ChildSpawned {
30        parent_id: String,
31        child_id: String,
32    },
33    Completed {
34        agent_id: String,
35        summary: String,
36    },
37    Failed {
38        agent_id: String,
39        error: String,
40    },
41    Cancelled {
42        agent_id: String,
43    },
44    TokenUsage {
45        agent_id: String,
46        model: String,
47        usage: Usage,
48    },
49}
50
51impl MailboxMessage {
52    #[must_use]
53    pub fn started(agent_id: impl Into<String>, agent_type: impl AsRef<str>) -> Self {
54        Self::Started {
55            agent_id: agent_id.into(),
56            agent_type: agent_type.as_ref().to_string(),
57        }
58    }
59
60    #[must_use]
61    pub fn progress(agent_id: impl Into<String>, status: impl Into<String>) -> Self {
62        Self::Progress {
63            agent_id: agent_id.into(),
64            status: status.into(),
65        }
66    }
67
68    #[must_use]
69    pub fn token_usage(
70        agent_id: impl Into<String>,
71        model: impl Into<String>,
72        usage: Usage,
73    ) -> Self {
74        Self::TokenUsage {
75            agent_id: agent_id.into(),
76            model: model.into(),
77            usage,
78        }
79    }
80
81    #[must_use]
82    pub fn agent_id(&self) -> &str {
83        match self {
84            Self::Started { agent_id, .. }
85            | Self::Progress { agent_id, .. }
86            | Self::ToolCallStarted { agent_id, .. }
87            | Self::ToolCallCompleted { agent_id, .. }
88            | Self::Completed { agent_id, .. }
89            | Self::Failed { agent_id, .. }
90            | Self::Cancelled { agent_id }
91            | Self::TokenUsage { agent_id, .. } => agent_id,
92            Self::ChildSpawned { child_id, .. } => child_id,
93        }
94    }
95}