1use std::collections::HashMap;
5use std::num::NonZeroUsize;
6
7use crate::tools::ToolsConfig;
8use serde::{Deserialize, Serialize};
9use zeph_common::secret::Secret;
10
11use crate::agent::{AgentConfig, FocusConfig, GoalConfig, SubAgentConfig};
12use crate::channels::{A2aServerConfig, DiscordConfig, McpConfig, SlackConfig, TelegramConfig};
13use crate::classifiers::ClassifiersConfig;
14use crate::cli::CliConfig;
15use crate::cocoon::CocoonConfig;
16use crate::defaults::{default_skill_paths, default_sqlite_path_field};
17use crate::execution::ExecutionConfig;
18use crate::experiment::{ExperimentConfig, OrchestrationConfig};
19use crate::features::{
20 CostConfig, DaemonConfig, DebugConfig, GatewayConfig, IndexConfig, SchedulerConfig,
21 SkillPromptMode, SkillsConfig, VaultConfig,
22};
23use crate::hooks::HooksConfig;
24use crate::learning::LearningConfig;
25use crate::logging::LoggingConfig;
26use crate::memory::{
27 CompressionConfig, DocumentConfig, GraphConfig, MagicDocsConfig, MemoryConfig, SemanticConfig,
28 SessionsConfig, SidequestConfig, TierConfig, VectorBackend,
29};
30use crate::metrics::MetricsConfig;
31use crate::notifications::NotificationsConfig;
32use crate::providers::{
33 LlmConfig, get_default_embedding_model, get_default_response_cache_ttl_secs,
34 get_default_router_ema_alpha, get_default_router_reorder_interval,
35};
36use crate::security::TrustConfig;
37use crate::security::{SecurityConfig, TimeoutConfig};
38use crate::telemetry::TelemetryConfig;
39use crate::ui::LspConfig;
40use crate::ui::{AcpConfig, TuiConfig};
41
42#[derive(Debug, Deserialize, Serialize)]
48pub struct Config {
49 pub agent: AgentConfig,
50 pub llm: LlmConfig,
51 pub skills: SkillsConfig,
52 pub memory: MemoryConfig,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub telegram: Option<TelegramConfig>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub discord: Option<DiscordConfig>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub slack: Option<SlackConfig>,
59 #[serde(default)]
60 pub tools: ToolsConfig,
61 #[serde(default)]
65 pub execution: ExecutionConfig,
66 #[serde(default)]
67 pub a2a: A2aServerConfig,
68 #[serde(default)]
69 pub mcp: McpConfig,
70 #[serde(default)]
71 pub index: IndexConfig,
72 #[serde(default)]
73 pub vault: VaultConfig,
74 #[serde(default)]
75 pub security: SecurityConfig,
76 #[serde(default)]
77 pub timeouts: TimeoutConfig,
78 #[serde(default)]
79 pub cost: CostConfig,
80 #[serde(default)]
81 pub gateway: GatewayConfig,
82 #[serde(default)]
83 pub daemon: DaemonConfig,
84 #[serde(default)]
85 pub scheduler: SchedulerConfig,
86 #[serde(default)]
87 pub tui: TuiConfig,
88 #[serde(default)]
89 pub acp: AcpConfig,
90 #[serde(default)]
91 pub agents: SubAgentConfig,
92 #[serde(default)]
93 pub orchestration: OrchestrationConfig,
94 #[serde(default)]
95 pub classifiers: ClassifiersConfig,
96 #[serde(default)]
97 pub experiments: ExperimentConfig,
98 #[serde(default)]
99 pub debug: DebugConfig,
100 #[serde(default)]
101 pub logging: LoggingConfig,
102 #[serde(default)]
103 pub hooks: HooksConfig,
104 #[serde(default)]
105 pub lsp: LspConfig,
106 #[serde(default)]
108 pub magic_docs: MagicDocsConfig,
109 #[serde(default)]
111 pub telemetry: TelemetryConfig,
112 #[serde(default)]
114 pub metrics: MetricsConfig,
115 #[serde(default)]
117 pub session: crate::session::SessionConfig,
118 #[serde(default)]
120 pub cli: CliConfig,
121 #[serde(default)]
123 pub quality: crate::quality::QualityConfig,
124 #[serde(default)]
126 pub notifications: NotificationsConfig,
127 #[serde(default)]
129 pub goals: GoalConfig,
130 #[serde(default)]
132 pub cocoon: CocoonConfig,
133 #[serde(skip)]
135 pub secrets: ResolvedSecrets,
136 #[serde(default)]
138 pub worktree: crate::worktree::WorktreeConfig,
139}
140
141#[derive(Debug, Default)]
146pub struct ResolvedSecrets {
147 pub claude_api_key: Option<Secret>,
148 pub openai_api_key: Option<Secret>,
149 pub gemini_api_key: Option<Secret>,
150 pub compatible_api_keys: HashMap<String, Secret>,
151 pub discord_token: Option<Secret>,
152 pub slack_bot_token: Option<Secret>,
153 pub slack_signing_secret: Option<Secret>,
154 pub gonka_private_key: Option<Secret>,
156 pub gonka_address: Option<Secret>,
158 pub cocoon_access_hash: Option<Secret>,
160 pub custom: HashMap<String, Secret>,
163}
164
165impl Default for Config {
166 #[allow(clippy::too_many_lines)] fn default() -> Self {
168 Self {
169 agent: AgentConfig {
170 name: "Zeph".into(),
171 max_tool_iterations: 10,
172 auto_update_check: true,
173 instruction_files: Vec::new(),
174 instruction_auto_detect: true,
175 max_tool_retries: 2,
176 tool_repeat_threshold: 2,
177 max_retry_duration_secs: 30,
178 focus: FocusConfig::default(),
179 tool_filter: crate::agent::ToolFilterConfig::default(),
180 budget_hint_enabled: true,
181 supervisor: crate::agent::TaskSupervisorConfig::default(),
182 },
183 llm: LlmConfig {
184 providers: Vec::new(),
185 routing: crate::providers::LlmRoutingStrategy::None,
186 embedding_model: get_default_embedding_model(),
187 candle: None,
188 stt: None,
189 response_cache_enabled: false,
190 response_cache_ttl_secs: get_default_response_cache_ttl_secs(),
191 semantic_cache_enabled: false,
192 semantic_cache_threshold: 0.95,
193 semantic_cache_max_candidates: 10,
194 router_ema_enabled: false,
195 router_ema_alpha: get_default_router_ema_alpha(),
196 router_reorder_interval: get_default_router_reorder_interval(),
197 router: None,
198 instruction_file: None,
199 summary_model: None,
200 summary_provider: None,
201 complexity_routing: None,
202 coe: None,
203 stream_limits: crate::StreamLimits::default(),
204 },
205 skills: SkillsConfig {
206 paths: default_skill_paths(),
207 max_active_skills: NonZeroUsize::new(5).expect("5 is non-zero"),
208 disambiguation_threshold: 0.20,
209 min_injection_score: 0.20,
210 cosine_weight: 0.7,
211 hybrid_search: true,
212 bm25_alpha: 0.7,
213 learning: LearningConfig::default(),
214 trust: TrustConfig::default(),
215 prompt_mode: SkillPromptMode::Auto,
216 two_stage_matching: false,
217 confusability_threshold: 0.0,
218 rl_routing_enabled: false,
219 rl_learning_rate: 0.01,
220 rl_weight: 0.3,
221 rl_persist_interval: 10,
222 rl_warmup_updates: 50,
223 rl_embed_dim: None,
224 query_rewrite_provider: crate::providers::ProviderName::default(),
225 generation_provider: crate::providers::ProviderName::default(),
226 generation_timeout_ms: 60_000,
227 generation_output_dir: None,
228 mining: crate::features::SkillMiningConfig::default(),
229 evaluation: crate::features::SkillEvaluationConfig::default(),
230 proactive_exploration: crate::features::ProactiveExplorationConfig::default(),
231 disambiguate_provider: crate::providers::ProviderName::default(),
232 semantic_scan: false,
233 semantic_scan_provider: crate::providers::ProviderName::default(),
234 group_structured: false,
235 support_similarity_threshold: 0.50,
236 },
237 memory: MemoryConfig {
238 sqlite_path: default_sqlite_path_field(),
239 history_limit: 50,
240 qdrant_url: "http://localhost:6334".into(),
241 qdrant_api_key: None,
242 semantic: SemanticConfig::default(),
243 summarization_threshold: 50,
244 summarization_llm_timeout_secs: 60,
245 context_budget_tokens: 0,
246 soft_compaction_threshold: 0.60,
247 hard_compaction_threshold: 0.90,
248 compaction_preserve_tail: 6,
249 compaction_cooldown_turns: 2,
250 auto_budget: true,
251 prune_protect_tokens: 40_000,
252 cross_session_score_threshold: 0.35,
253 vector_backend: VectorBackend::default(),
254 token_safety_margin: 1.0,
255 redact_credentials: true,
256 autosave_assistant: true,
257 autosave_min_length: 20,
258 tool_call_cutoff: 6,
259 sqlite_pool_size: 5,
260 sessions: SessionsConfig::default(),
261 documents: DocumentConfig::default(),
262 eviction: crate::memory::EvictionConfig::default(),
263 compression: CompressionConfig::default(),
264 sidequest: SidequestConfig::default(),
265 graph: GraphConfig::default(),
266 compression_guidelines: crate::memory::CompressionGuidelinesConfig::default(),
267 shutdown_summary: true,
268 shutdown_summary_min_messages: 4,
269 shutdown_summary_max_messages: 20,
270 shutdown_summary_timeout_secs: 30,
271 shutdown_summary_provider: crate::providers::ProviderName::default(),
272 compaction_provider: crate::providers::ProviderName::default(),
273 structured_summaries: false,
274 tiers: TierConfig::default(),
275 admission: crate::memory::AdmissionConfig::default(),
276 digest: crate::memory::DigestConfig::default(),
277 context_strategy: crate::memory::ContextStrategy::default(),
278 crossover_turn_threshold: 20,
279 consolidation: crate::memory::ConsolidationConfig::default(),
280 forgetting: crate::memory::ForgettingConfig::default(),
281 database_url: None,
282 store_routing: crate::memory::StoreRoutingConfig::default(),
283 persona: crate::memory::PersonaConfig::default(),
284 trajectory: crate::memory::TrajectoryConfig::default(),
285 category: crate::memory::CategoryConfig::default(),
286 tree: crate::memory::TreeConfig::default(),
287 microcompact: crate::memory::MicrocompactConfig::default(),
288 autodream: crate::memory::AutoDreamConfig::default(),
289 key_facts_dedup_threshold: 0.95,
290 compression_spectrum: crate::features::CompressionSpectrumConfig::default(),
291 retrieval: crate::memory::RetrievalConfig::default(),
292 reasoning: crate::memory::ReasoningConfig::default(),
293 hebbian: crate::memory::HebbianConfig::default(),
294 memcot: crate::memory::MemCotConfig::default(),
295 retrieval_failures: crate::memory::RetrievalFailuresConfig::default(),
296 quality_gate: crate::memory::WriteQualityGateConfig::default(),
297 tiered_retrieval: crate::memory::TieredRetrievalConfig::default(),
298 optical_forgetting: crate::memory::OpticalForgettingConfig::default(),
299 em_graph: crate::memory::EmGraphConfig::default(),
300 episodic_consolidation: crate::memory::EpisodicConsolidationConfig::default(),
301 shadow_memory: crate::memory::TrajectoryRiskAccumulatorConfig::default(),
302 five_signal: crate::memory::FiveSignalConfig::default(),
303 fidelity: None,
304 },
305 telegram: None,
306 discord: None,
307 slack: None,
308 tools: ToolsConfig::default(),
309 execution: ExecutionConfig::default(),
310 a2a: A2aServerConfig::default(),
311 mcp: McpConfig::default(),
312 index: IndexConfig::default(),
313 vault: VaultConfig::default(),
314 security: SecurityConfig::default(),
315 timeouts: TimeoutConfig::default(),
316 cost: CostConfig::default(),
317 gateway: GatewayConfig::default(),
318 daemon: DaemonConfig::default(),
319 scheduler: SchedulerConfig::default(),
320 tui: TuiConfig::default(),
321 acp: AcpConfig::default(),
322 agents: SubAgentConfig::default(),
323 orchestration: OrchestrationConfig::default(),
324 classifiers: ClassifiersConfig::default(),
325 experiments: ExperimentConfig::default(),
326 debug: DebugConfig::default(),
327 logging: LoggingConfig::default(),
328 lsp: LspConfig::default(),
329 hooks: HooksConfig::default(),
330 magic_docs: MagicDocsConfig::default(),
331 telemetry: TelemetryConfig::default(),
332 metrics: MetricsConfig::default(),
333 session: crate::session::SessionConfig::default(),
334 cli: CliConfig::default(),
335 quality: crate::quality::QualityConfig::default(),
336 notifications: NotificationsConfig::default(),
337 goals: GoalConfig::default(),
338 cocoon: CocoonConfig::default(),
339 secrets: ResolvedSecrets::default(),
340 worktree: crate::worktree::WorktreeConfig::default(),
341 }
342 }
343}