crabtalk_daemon/config/
mod.rs1pub use crate::hook::{mcp::McpServerConfig, system::SystemConfig};
4pub use ::model::{ProviderDef, ProviderRegistry, validate_providers};
5use anyhow::Result;
6pub use loader::{DEFAULT_CONFIG, scaffold_config_dir};
7use serde::{Deserialize, Serialize};
8use std::collections::BTreeMap;
9pub use wcore::{
10 AgentConfig, HeartbeatConfig, ManifestConfig, ResolvedManifest, load_agents_dir,
11 load_agents_dirs,
12 paths::{AGENTS_DIR, CONFIG_DIR, CONFIG_FILE, SKILLS_DIR, SOCKET_PATH},
13 resolve_manifests,
14};
15
16mod loader;
17
18#[derive(Debug, Clone, Serialize, Deserialize, Default)]
24pub struct DaemonConfig {
25 #[serde(default)]
27 pub provider: BTreeMap<String, ProviderDef>,
28 #[serde(default)]
31 pub mcps: BTreeMap<String, McpServerConfig>,
32 #[serde(default)]
34 pub system: SystemConfig,
35 #[serde(default)]
38 pub agents: BTreeMap<String, AgentConfig>,
39 #[serde(default)]
41 pub env: BTreeMap<String, String>,
42}
43
44impl DaemonConfig {
45 pub fn from_toml(toml_str: &str) -> Result<Self> {
47 let mut config: Self = toml::from_str(toml_str)?;
48 config.mcps.iter_mut().for_each(|(name, server)| {
49 if server.name.is_empty() {
50 server.name = name.clone();
51 }
52 });
53 if !config.mcps.is_empty() {
54 tracing::warn!("[mcps] in config.toml is deprecated — move to local/CrabTalk.toml");
55 }
56 if !config.agents.is_empty() {
57 tracing::warn!("[agents] in config.toml is deprecated — move to local/CrabTalk.toml");
58 }
59 validate_providers(&config.provider)?;
60 Ok(config)
61 }
62
63 pub fn load(path: &std::path::Path) -> Result<Self> {
65 let content = std::fs::read_to_string(path)?;
66 Self::from_toml(&content)
67 }
68}