Skip to main content

walrus_daemon/config/
default.rs

1//! Default configuration and first-run scaffolding.
2
3use crate::config::{AGENTS_DIR, CRON_DIR, DATA_DIR, DaemonConfig, SKILLS_DIR};
4use anyhow::{Context, Result};
5use model::ProviderConfig;
6use std::path::Path;
7
8impl Default for DaemonConfig {
9    fn default() -> Self {
10        Self {
11            models: vec![ProviderConfig {
12                model: "deepseek-chat".into(),
13                api_key: None,
14                base_url: None,
15                loader: None,
16                quantization: None,
17                chat_template: None,
18            }],
19            channels: Vec::new(),
20            mcp_servers: Vec::new(),
21        }
22    }
23}
24
25/// Default agent markdown content for first-run scaffold.
26pub const DEFAULT_AGENT_MD: &str = r#"---
27name: assistant
28description: A helpful assistant
29tools:
30  - remember
31---
32
33You are a helpful assistant. Be concise.
34"#;
35
36/// Scaffold the full config directory structure on first run.
37///
38/// Creates subdirectories (agents, skills, cron, data), writes a default
39/// walrus.toml and a default assistant agent markdown file.
40pub fn scaffold_config_dir(config_dir: &Path) -> Result<()> {
41    std::fs::create_dir_all(config_dir.join(AGENTS_DIR))
42        .context("failed to create agents directory")?;
43    std::fs::create_dir_all(config_dir.join(SKILLS_DIR))
44        .context("failed to create skills directory")?;
45    std::fs::create_dir_all(config_dir.join(CRON_DIR))
46        .context("failed to create cron directory")?;
47    std::fs::create_dir_all(config_dir.join(DATA_DIR))
48        .context("failed to create data directory")?;
49
50    let gateway_toml = config_dir.join("walrus.toml");
51    let contents = toml::to_string_pretty(&DaemonConfig::default())
52        .context("failed to serialize default config")?;
53    std::fs::write(&gateway_toml, contents)
54        .with_context(|| format!("failed to write {}", gateway_toml.display()))?;
55
56    let agent_path = config_dir.join(AGENTS_DIR).join("assistant.md");
57    std::fs::write(&agent_path, DEFAULT_AGENT_MD)
58        .with_context(|| format!("failed to write {}", agent_path.display()))?;
59
60    Ok(())
61}