agtrace_types/event/
stream.rs

1use serde::{Deserialize, Serialize};
2
3/// Stream identifier for multi-stream sessions
4/// Enables parallel conversation streams within same session (e.g., background reasoning, subagents)
5#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
6#[serde(tag = "stream_type", content = "stream_data")]
7#[serde(rename_all = "snake_case")]
8pub enum StreamId {
9    /// Main conversation stream (default)
10    #[default]
11    Main,
12    /// Claude sidechain (background agent with specific ID)
13    Sidechain { agent_id: String },
14    /// Codex subagent (e.g., "review", "test", etc.)
15    Subagent { name: String },
16}
17
18impl StreamId {
19    /// Get string representation for debugging/logging
20    pub fn as_str(&self) -> String {
21        match self {
22            StreamId::Main => "main".to_string(),
23            StreamId::Sidechain { agent_id } => format!("sidechain:{}", agent_id),
24            StreamId::Subagent { name } => format!("subagent:{}", name),
25        }
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn test_stream_id_variants() {
35        let main_stream = StreamId::Main;
36        assert_eq!(main_stream.as_str(), "main");
37
38        let sidechain_stream = StreamId::Sidechain {
39            agent_id: "abc123".to_string(),
40        };
41        assert_eq!(sidechain_stream.as_str(), "sidechain:abc123");
42
43        let subagent_stream = StreamId::Subagent {
44            name: "review".to_string(),
45        };
46        assert_eq!(subagent_stream.as_str(), "subagent:review");
47    }
48}