agent_stream_kit/
spec.rs

1use std::ops::Not;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use crate::FnvIndexMap;
7use crate::config::AgentConfigs;
8use crate::definition::AgentConfigSpecs;
9use crate::error::AgentError;
10
11pub type AgentStreamSpecs = FnvIndexMap<String, AgentStreamSpec>;
12
13#[derive(Clone, Debug, Default, Deserialize, Serialize)]
14pub struct AgentStreamSpec {
15    pub agents: im::Vector<AgentSpec>,
16
17    pub channels: im::Vector<ChannelSpec>,
18
19    #[serde(default, skip_serializing_if = "<&bool>::not")]
20    pub run_on_start: bool,
21
22    #[serde(flatten)]
23    pub extensions: im::HashMap<String, Value>,
24}
25
26impl AgentStreamSpec {
27    pub fn add_agent(&mut self, agent: AgentSpec) {
28        self.agents.push_back(agent);
29    }
30
31    pub fn remove_agent(&mut self, agent_id: &str) {
32        self.agents.retain(|agent| agent.id != agent_id);
33    }
34
35    pub fn add_channels(&mut self, channel: ChannelSpec) {
36        self.channels.push_back(channel);
37    }
38
39    pub fn remove_channel(&mut self, channel: &ChannelSpec) -> Option<ChannelSpec> {
40        let Some(index) = self.channels.index_of(channel) else {
41            return None;
42        };
43        Some(self.channels.remove(index))
44    }
45
46    pub fn to_json(&self) -> Result<String, AgentError> {
47        let json = serde_json::to_string_pretty(self)
48            .map_err(|e| AgentError::SerializationError(e.to_string()))?;
49        Ok(json)
50    }
51
52    pub fn from_json(json_str: &str) -> Result<Self, AgentError> {
53        let stream: AgentStreamSpec = serde_json::from_str(json_str)
54            .map_err(|e| AgentError::SerializationError(e.to_string()))?;
55        Ok(stream)
56    }
57}
58
59/// Information held by each agent.
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct AgentSpec {
62    #[serde(skip_serializing_if = "String::is_empty", default)]
63    pub id: String,
64
65    /// Name of the AgentDefinition.
66    #[serde(skip_serializing_if = "String::is_empty", default)]
67    pub def_name: String,
68
69    /// List of input pin names.
70    #[serde(skip_serializing_if = "Option::is_none", default)]
71    pub inputs: Option<Vec<String>>,
72
73    /// List of output pin names.
74    #[serde(skip_serializing_if = "Option::is_none", default)]
75    pub outputs: Option<Vec<String>>,
76
77    /// Config values.
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub configs: Option<AgentConfigs>,
80
81    /// Config specs.
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub config_specs: Option<AgentConfigSpecs>,
84
85    #[deprecated(note = "Use `disabled` instead")]
86    #[serde(default, skip_serializing_if = "<&bool>::not")]
87    pub enabled: bool,
88
89    #[serde(default, skip_serializing_if = "<&bool>::not")]
90    pub disabled: bool,
91
92    #[serde(flatten)]
93    pub extensions: FnvIndexMap<String, serde_json::Value>,
94}
95
96// ChannelSpec
97
98#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
99pub struct ChannelSpec {
100    pub source: String,
101    pub source_handle: String,
102    pub target: String,
103    pub target_handle: String,
104}