clawgarden-agent 0.4.0

Agent runtime with persona/memory loader, judge, and pi RPC for ClawGarden
Documentation
//! Persona loader - loads agent persona from filesystem

use anyhow::Result;
use std::path::Path;

/// Load persona for an agent from /workspace/agents/<name>/persona.md
///
/// Returns the persona content as a String.
/// Logs a warning if the file is missing and returns an empty string.
pub async fn load_persona(agent_name: &str) -> Result<String> {
    let path = Path::new("/workspace/agents")
        .join(agent_name)
        .join("persona.md");

    match tokio::fs::read_to_string(&path).await {
        Ok(content) => {
            log::info!(
                "Loaded persona for agent '{}' from {}",
                agent_name,
                path.display()
            );
            Ok(content)
        }
        Err(e) => {
            log::warn!(
                "Persona file not found for agent '{}' at {}: {}",
                agent_name,
                path.display(),
                e
            );
            Ok(String::new())
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn test_load_persona_missing_file() {
        let result = load_persona("nonexistent_agent").await;
        assert!(result.is_ok());
        assert!(result.unwrap().is_empty());
    }
}