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    model: Option<String>,
16}
17
18/// Parse an agent markdown file (YAML frontmatter + body) into an [`AgentConfig`].
19///
20/// The frontmatter provides name, description, and optional model.
21/// The markdown body (trimmed) becomes the agent's system prompt.
22pub fn parse_agent_md(content: &str) -> anyhow::Result<AgentConfig> {
23    let (frontmatter, body) = split_yaml_frontmatter(content)?;
24    let fm: AgentFrontmatter = serde_yaml::from_str(frontmatter)?;
25
26    let config = AgentConfig {
27        name: fm.name.into(),
28        description: fm.description.into(),
29        system_prompt: body.trim().to_owned(),
30        model: fm.model.map(Into::into),
31        ..AgentConfig::default()
32    };
33
34    Ok(config)
35}