systemprompt_sync/export/
agents.rs1use super::escape_yaml;
2use anyhow::Result;
3use std::fs;
4use std::path::Path;
5use systemprompt_agent::models::Agent;
6
7pub fn generate_agent_system_prompt(agent: &Agent) -> Option<String> {
8 agent.system_prompt.as_ref().map(|sp| {
9 format!(
10 "---\ndescription: \"{}\"\n---\n\n{}",
11 escape_yaml(&agent.description),
12 sp
13 )
14 })
15}
16
17pub fn generate_agent_config(agent: &Agent) -> String {
18 let tags_yaml = if agent.tags.is_empty() {
19 "[]".to_string()
20 } else {
21 agent
22 .tags
23 .iter()
24 .map(|t| format!(" - {}", t))
25 .collect::<Vec<_>>()
26 .join("\n")
27 };
28
29 let mcp_servers_yaml = if agent.mcp_servers.is_empty() {
30 "[]".to_string()
31 } else {
32 agent
33 .mcp_servers
34 .iter()
35 .map(|s| format!(" - {}", s))
36 .collect::<Vec<_>>()
37 .join("\n")
38 };
39
40 let skills_yaml = if agent.skills.is_empty() {
41 "[]".to_string()
42 } else {
43 agent
44 .skills
45 .iter()
46 .map(|s| format!(" - {}", s))
47 .collect::<Vec<_>>()
48 .join("\n")
49 };
50
51 format!(
52 r#"id: {}
53name: "{}"
54display_name: "{}"
55description: "{}"
56version: "{}"
57enabled: {}
58port: {}
59tags:
60{}
61mcp_servers:
62{}
63skills:
64{}"#,
65 agent.agent_id.as_str(),
66 escape_yaml(&agent.name),
67 escape_yaml(&agent.display_name),
68 escape_yaml(&agent.description),
69 escape_yaml(&agent.version),
70 agent.enabled,
71 agent.port,
72 tags_yaml,
73 mcp_servers_yaml,
74 skills_yaml
75 )
76}
77
78pub fn export_agent_to_disk(agent: &Agent, base_path: &Path) -> Result<()> {
79 let agent_dir = base_path.join(&agent.name);
80 fs::create_dir_all(&agent_dir)?;
81
82 let config_content = generate_agent_config(agent);
83 fs::write(agent_dir.join("config.yaml"), config_content)?;
84
85 if let Some(system_prompt) = generate_agent_system_prompt(agent) {
86 fs::write(agent_dir.join("system_prompt.md"), system_prompt)?;
87 }
88
89 Ok(())
90}