Skip to main content

walrus_core/agent/
parser.rs

1//! Agent markdown parsing.
2//!
3//! Parses YAML frontmatter + Markdown body into an [`AgentConfig`].
4
5use crate::{agent::config::AgentConfig, utils::split_yaml_frontmatter};
6use serde::Deserialize;
7
8/// YAML frontmatter for agent markdown files.
9#[derive(Deserialize)]
10struct AgentFrontmatter {
11    name: String,
12    #[serde(default)]
13    description: String,
14    #[serde(default)]
15    tools: Vec<String>,
16    #[serde(default)]
17    skill_tags: Vec<String>,
18    #[serde(default)]
19    model: Option<String>,
20}
21
22/// Parse an agent markdown file (YAML frontmatter + body) into an [`AgentConfig`].
23///
24/// The frontmatter provides name, description, tools, and skill_tags.
25/// The markdown body (trimmed) becomes the agent's system prompt.
26pub fn parse_agent_md(content: &str) -> anyhow::Result<AgentConfig> {
27    let (frontmatter, body) = split_yaml_frontmatter(content)?;
28    let fm: AgentFrontmatter = serde_yaml::from_str(frontmatter)?;
29
30    let config = AgentConfig {
31        name: fm.name.into(),
32        description: fm.description.into(),
33        system_prompt: body.trim().to_owned(),
34        model: fm.model.map(Into::into),
35        tools: fm.tools.into_iter().map(Into::into).collect(),
36        skill_tags: fm.skill_tags.into_iter().map(Into::into).collect(),
37        ..AgentConfig::default()
38    };
39
40    Ok(config)
41}