walrus_daemon/config/
mod.rs1pub use crate::hook::{
4 mcp::McpServerConfig,
5 memory::MemoryConfig,
6 os::{PermissionConfig, ToolPermission},
7 task::TasksConfig,
8};
9pub use ::model::{ModelConfig, ProviderConfig, ProviderManager};
10use anyhow::Result;
11pub use channel::ChannelConfig;
12pub use loader::{load_agents_dir, scaffold_config_dir};
13use serde::{Deserialize, Serialize};
14use std::collections::BTreeMap;
15pub use wcore::{
16 AgentConfig, HeartbeatConfig,
17 paths::{AGENTS_DIR, CONFIG_DIR, DATA_DIR, MEMORY_DB, SKILLS_DIR, SOCKET_PATH},
18};
19
20mod loader;
21
22#[derive(Debug, Clone, Serialize, Deserialize, Default)]
24pub struct DaemonConfig {
25 #[serde(default)]
27 pub walrus: AgentConfig,
28 #[serde(default)]
30 pub model: ModelConfig,
31 #[serde(default)]
33 pub channel: ChannelConfig,
34 #[serde(default)]
36 pub mcps: BTreeMap<String, McpServerConfig>,
37 #[serde(default)]
39 pub memory: MemoryConfig,
40 #[serde(default)]
42 pub tasks: TasksConfig,
43 #[serde(default)]
45 pub agents: BTreeMap<String, AgentConfig>,
46 #[serde(default)]
48 pub permissions: PermissionConfig,
49 #[serde(default)]
51 pub search: wsearch::config::Config,
52}
53
54impl DaemonConfig {
55 pub fn from_toml(toml_str: &str) -> Result<Self> {
57 let mut config: Self = toml::from_str(toml_str)?;
58 config
59 .model
60 .providers
61 .iter_mut()
62 .for_each(|(key, provider)| {
63 if provider.model.is_empty() {
64 provider.model = key.clone();
65 }
66 });
67 config.mcps.iter_mut().for_each(|(name, server)| {
68 if server.name.is_empty() {
69 server.name = name.clone().into();
70 }
71 });
72 if config.walrus.model.is_none() {
73 config.walrus.model = Some(::model::default_model().into());
74 }
75 Ok(config)
76 }
77
78 pub fn load(path: &std::path::Path) -> Result<Self> {
80 let content = std::fs::read_to_string(path)?;
81 Self::from_toml(&content)
82 }
83}