a3s_code_core/config/mod.rs
1//! Configuration module for A3S Code
2//!
3//! Provides configuration for:
4//! - LLM providers and models (defaultModel in "provider/model" format, providers)
5//! - Queue configuration (a3s-lane integration)
6//! - Search configuration (a3s-search integration)
7//! - Directories for dynamic skill and agent loading
8//!
9//! Configuration is loaded from ACL-compatible files or strings.
10//! Existing `.acl` config filenames are still accepted for compatibility.
11//! JSON support has been removed.
12
13mod loader;
14mod provider;
15mod search;
16#[cfg(test)]
17mod tests;
18
19pub use provider::{ModelConfig, ModelCost, ModelLimit, ModelModalities, ProviderConfig};
20pub use search::{
21 BrowserBackend, DocumentCacheConfig, DocumentOcrConfig, DocumentParserConfig, HeadlessConfig,
22 SearchConfig, SearchEngineConfig, SearchHealthConfig,
23};
24
25use crate::memory::MemoryConfig;
26use serde::{Deserialize, Serialize};
27use std::path::PathBuf;
28
29// ============================================================================
30// Storage Configuration
31// ============================================================================
32
33/// Session storage backend type
34#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq, Hash)]
35#[serde(rename_all = "lowercase")]
36pub enum StorageBackend {
37 /// In-memory storage (no persistence)
38 Memory,
39 /// File-based storage (JSON files)
40 #[default]
41 File,
42 /// Custom external storage (Redis, PostgreSQL, etc.)
43 ///
44 /// Requires a `SessionStore` implementation registered on `AgentSession` options.
45 /// Use `storage_url` in config to pass connection details.
46 Custom,
47}
48
49// ============================================================================
50// Main Configuration
51// ============================================================================
52
53/// Configuration for A3S Code
54#[derive(Debug, Clone, Serialize, Deserialize, Default)]
55#[serde(rename_all = "camelCase")]
56pub struct CodeConfig {
57 /// Default model in "provider/model" format (e.g., "anthropic/claude-sonnet-4-20250514")
58 #[serde(default, alias = "default_model")]
59 pub default_model: Option<String>,
60
61 /// Provider configurations
62 #[serde(default)]
63 pub providers: Vec<ProviderConfig>,
64
65 /// Session storage backend
66 #[serde(default)]
67 pub storage_backend: StorageBackend,
68
69 /// Sessions directory (for file backend)
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub sessions_dir: Option<PathBuf>,
72
73 /// Connection URL for custom storage backend (e.g., "redis://localhost:6379", "postgres://user:pass@localhost/a3s")
74 #[serde(default, skip_serializing_if = "Option::is_none")]
75 pub storage_url: Option<String>,
76
77 /// Directories to scan for skill files (*.md with tool definitions)
78 #[serde(default, alias = "skill_dirs")]
79 pub skill_dirs: Vec<PathBuf>,
80
81 /// Directories to scan for agent files (*.yaml or *.md)
82 #[serde(default, alias = "agent_dirs")]
83 pub agent_dirs: Vec<PathBuf>,
84
85 /// Maximum tool execution rounds per turn (default: 25)
86 #[serde(default, alias = "max_tool_rounds")]
87 pub max_tool_rounds: Option<usize>,
88
89 /// Thinking/reasoning budget in tokens
90 #[serde(default, alias = "thinking_budget")]
91 pub thinking_budget: Option<usize>,
92
93 /// Memory system configuration
94 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub memory: Option<MemoryConfig>,
96
97 /// Queue configuration (a3s-lane integration)
98 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub queue: Option<crate::queue::SessionQueueConfig>,
100
101 /// Search configuration (a3s-search integration)
102 #[serde(default, skip_serializing_if = "Option::is_none")]
103 pub search: Option<SearchConfig>,
104
105 /// Built-in document context extraction configuration.
106 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub document_parser: Option<DocumentParserConfig>,
108
109 /// MCP server configurations
110 #[serde(default, alias = "mcp_servers")]
111 pub mcp_servers: Vec<crate::mcp::McpServerConfig>,
112}