Skip to main content

systemprompt_sync/export/
agents.rs

1use 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}