1use clap::{Parser, Subcommand};
7use anyhow::Result;
8use serde::{Serialize, Deserialize};
9use synaptic_qudag_core::QuDAGNetwork;
10use synaptic_neural_wasm::{NeuralNetwork, Layer};
11use synaptic_neural_mesh::{NeuralMesh, Agent};
12use synaptic_daa_swarm::{Swarm, SwarmBehavior};
13
14#[derive(Parser, Debug)]
16#[command(author, version, about, long_about = None)]
17pub struct Cli {
18 #[command(subcommand)]
19 pub command: Commands,
20}
21
22#[derive(Subcommand, Debug)]
24pub enum Commands {
25 Node {
27 #[command(subcommand)]
28 action: NodeAction,
29 },
30 Swarm {
32 #[command(subcommand)]
33 action: SwarmAction,
34 },
35 Neural {
37 #[command(subcommand)]
38 action: NeuralAction,
39 },
40 Mesh {
42 #[command(subcommand)]
43 action: MeshAction,
44 },
45 Status,
47}
48
49#[derive(Subcommand, Debug)]
51pub enum NodeAction {
52 Start {
54 #[arg(short, long, default_value = "8080")]
55 port: u16,
56 },
57 Stop,
59 List,
61}
62
63#[derive(Subcommand, Debug)]
65pub enum SwarmAction {
66 Create {
68 #[arg(short, long, default_value = "10")]
69 agents: usize,
70 #[arg(short, long)]
71 behavior: Option<String>,
72 },
73 Run {
75 #[arg(short, long)]
76 id: Option<String>,
77 },
78 List,
80}
81
82#[derive(Subcommand, Debug)]
84pub enum NeuralAction {
85 Create {
87 #[arg(short, long)]
88 layers: Vec<usize>,
89 #[arg(short, long)]
90 output: String,
91 },
92 Train {
94 #[arg(short, long)]
95 model: String,
96 #[arg(short, long)]
97 data: String,
98 },
99 Predict {
101 #[arg(short, long)]
102 model: String,
103 #[arg(short, long)]
104 input: Vec<f32>,
105 },
106}
107
108#[derive(Subcommand, Debug)]
110pub enum MeshAction {
111 Info,
113 AddAgent {
115 #[arg(short, long)]
116 name: String,
117 },
118 SubmitTask {
120 #[arg(short, long)]
121 name: String,
122 #[arg(short, long)]
123 compute: f64,
124 },
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize)]
129pub enum MeshCommand {
130 NodeStart { port: u16 },
131 NodeStop,
132 NodeList,
133 SwarmCreate { agents: usize, behavior: Option<SwarmBehavior> },
134 SwarmRun { id: Option<String> },
135 SwarmList,
136 NeuralCreate { layers: Vec<usize>, output: String },
137 NeuralTrain { model: String, data: String },
138 NeuralPredict { model: String, input: Vec<f32> },
139 MeshInfo,
140 MeshAddAgent { name: String },
141 MeshSubmitTask { name: String, compute: f64 },
142 Status,
143}
144
145pub async fn execute_command(command: MeshCommand) -> Result<CommandResult> {
147 match command {
148 MeshCommand::NodeStart { port } => {
149 let _network = QuDAGNetwork::new();
151 Ok(CommandResult::NodeStarted { port, id: "node-1".to_string() })
152 }
153
154 MeshCommand::NodeStop => {
155 Ok(CommandResult::NodeStopped)
156 }
157
158 MeshCommand::NodeList => {
159 Ok(CommandResult::NodeList { nodes: vec![] })
160 }
161
162 MeshCommand::SwarmCreate { agents, behavior } => {
163 let swarm = Swarm::new();
164 if let Some(b) = behavior {
165 swarm.add_behavior(b);
166 }
167 swarm.initialize(agents).await;
168 Ok(CommandResult::SwarmCreated { id: "swarm-1".to_string(), agents })
169 }
170
171 MeshCommand::SwarmRun { id } => {
172 let swarm = Swarm::new();
174 swarm.initialize(10).await;
175 Ok(CommandResult::SwarmRunning { id: id.unwrap_or("swarm-1".to_string()) })
177 }
178
179 MeshCommand::SwarmList => {
180 Ok(CommandResult::SwarmList { swarms: vec![] })
181 }
182
183 MeshCommand::NeuralCreate { layers, output } => {
184 let mut network = NeuralNetwork::new();
185
186 for i in 0..layers.len() - 1 {
188 let layer = Layer::dense(layers[i], layers[i + 1]);
189 network.add_layer(layer);
190 }
191
192 let json = network.to_json()?;
194 std::fs::write(&output, json)?;
195
196 Ok(CommandResult::NeuralCreated { path: output })
197 }
198
199 MeshCommand::NeuralTrain { model, data: _ } => {
200 let model_json = std::fs::read_to_string(&model)?;
202 let _network = NeuralNetwork::from_json(&model_json)?;
203
204 Ok(CommandResult::NeuralTrained { model, epochs: 100 })
206 }
207
208 MeshCommand::NeuralPredict { model, input } => {
209 let model_json = std::fs::read_to_string(&model)?;
210 let network = NeuralNetwork::from_json(&model_json)?;
211
212 let output_json = network.predict(&input)
214 .map_err(|e| anyhow::anyhow!("Prediction failed: {:?}", e))?;
215 let output: Vec<f32> = serde_json::from_str(&output_json)?;
216
217 Ok(CommandResult::NeuralPrediction { output })
218 }
219
220 MeshCommand::MeshInfo => {
221 let mesh = NeuralMesh::new();
222 let stats = mesh.get_stats();
223 Ok(CommandResult::MeshInfo {
224 agents: stats.total_agents,
225 tasks: stats.total_tasks,
226 })
227 }
228
229 MeshCommand::MeshAddAgent { name } => {
230 let mesh = NeuralMesh::new();
231 let agent = Agent::new(&name);
232 let id = mesh.add_agent(agent).await?;
233 Ok(CommandResult::AgentAdded { id: id.to_string(), name })
234 }
235
236 MeshCommand::MeshSubmitTask { name, compute } => {
237 let mesh = NeuralMesh::new();
238 let requirements = synaptic_neural_mesh::TaskRequirements {
239 min_compute_power: compute,
240 min_memory: 1024 * 1024,
241 required_specializations: vec!["general".to_string()],
242 max_latency_ms: 100.0,
243 };
244 let id = mesh.submit_task(&name, requirements).await?;
245 Ok(CommandResult::TaskSubmitted { id: id.to_string(), name })
246 }
247
248 MeshCommand::Status => {
249 Ok(CommandResult::Status {
250 mesh_active: true,
251 nodes: 1,
252 agents: 0,
253 swarms: 0,
254 })
255 }
256 }
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize)]
261pub enum CommandResult {
262 NodeStarted { port: u16, id: String },
263 NodeStopped,
264 NodeList { nodes: Vec<String> },
265 SwarmCreated { id: String, agents: usize },
266 SwarmRunning { id: String },
267 SwarmList { swarms: Vec<String> },
268 NeuralCreated { path: String },
269 NeuralTrained { model: String, epochs: usize },
270 NeuralPrediction { output: Vec<f32> },
271 MeshInfo { agents: usize, tasks: usize },
272 AgentAdded { id: String, name: String },
273 TaskSubmitted { id: String, name: String },
274 Status { mesh_active: bool, nodes: usize, agents: usize, swarms: usize },
275}
276
277pub fn cli_to_command(cli: Cli) -> MeshCommand {
279 match cli.command {
280 Commands::Node { action } => match action {
281 NodeAction::Start { port } => MeshCommand::NodeStart { port },
282 NodeAction::Stop => MeshCommand::NodeStop,
283 NodeAction::List => MeshCommand::NodeList,
284 },
285 Commands::Swarm { action } => match action {
286 SwarmAction::Create { agents, behavior } => {
287 let b = behavior.and_then(|s| match s.as_str() {
288 "flocking" => Some(SwarmBehavior::Flocking),
289 "foraging" => Some(SwarmBehavior::Foraging),
290 "exploration" => Some(SwarmBehavior::Exploration),
291 "consensus" => Some(SwarmBehavior::Consensus),
292 "optimization" => Some(SwarmBehavior::Optimization),
293 _ => None,
294 });
295 MeshCommand::SwarmCreate { agents, behavior: b }
296 },
297 SwarmAction::Run { id } => MeshCommand::SwarmRun { id },
298 SwarmAction::List => MeshCommand::SwarmList,
299 },
300 Commands::Neural { action } => match action {
301 NeuralAction::Create { layers, output } => MeshCommand::NeuralCreate { layers, output },
302 NeuralAction::Train { model, data } => MeshCommand::NeuralTrain { model, data },
303 NeuralAction::Predict { model, input } => MeshCommand::NeuralPredict { model, input },
304 },
305 Commands::Mesh { action } => match action {
306 MeshAction::Info => MeshCommand::MeshInfo,
307 MeshAction::AddAgent { name } => MeshCommand::MeshAddAgent { name },
308 MeshAction::SubmitTask { name, compute } => MeshCommand::MeshSubmitTask { name, compute },
309 },
310 Commands::Status => MeshCommand::Status,
311 }
312}
313
314pub fn init_tracing() {
316 tracing_subscriber::fmt()
317 .with_max_level(tracing::Level::DEBUG)
318 .init();
319}
320
321#[cfg(test)]
322mod tests {
323 use super::*;
324
325 #[tokio::test]
326 async fn test_node_start() {
327 let cmd = MeshCommand::NodeStart { port: 8080 };
328 let result = execute_command(cmd).await.unwrap();
329
330 match result {
331 CommandResult::NodeStarted { port, .. } => assert_eq!(port, 8080),
332 _ => panic!("Unexpected result"),
333 }
334 }
335
336 #[tokio::test]
337 async fn test_swarm_create() {
338 let cmd = MeshCommand::SwarmCreate {
339 agents: 5,
340 behavior: Some(SwarmBehavior::Flocking)
341 };
342 let result = execute_command(cmd).await.unwrap();
343
344 match result {
345 CommandResult::SwarmCreated { agents, .. } => assert_eq!(agents, 5),
346 _ => panic!("Unexpected result"),
347 }
348 }
349
350 #[tokio::test]
351 async fn test_neural_create() {
352 let cmd = MeshCommand::NeuralCreate {
353 layers: vec![10, 5, 2],
354 output: "/tmp/test_model.json".to_string(),
355 };
356 let result = execute_command(cmd).await.unwrap();
357
358 match result {
359 CommandResult::NeuralCreated { path } => {
360 assert_eq!(path, "/tmp/test_model.json");
361 std::fs::remove_file(path).ok();
363 },
364 _ => panic!("Unexpected result"),
365 }
366 }
367}