Skip to main content

zeroclaw/config/
mod.rs

1//! Binary-side config module. Pure re-export surface — the real types and
2//! helpers live in `zeroclaw-config`. Everything the binary needs (schema,
3//! traits, property helpers) is pulled through here so `crate::config::*`
4//! continues to resolve for callers that predate the crate split.
5
6pub use zeroclaw_config::migration;
7pub use zeroclaw_config::providers;
8pub mod schema;
9pub mod traits;
10
11pub use schema::{
12    AliasedAgentConfig, AssemblyAiSttConfig, AuditConfig, BackupConfig, BrowserComputerUseConfig,
13    BrowserConfig, BuiltinHooksConfig, ChannelsConfig, ClassificationRule, ClaudeCodeConfig,
14    ClaudeCodeRunnerConfig, CloudOpsConfig, CodexCliConfig, ComposioConfig, Config,
15    ConversationalAiConfig, CostConfig, CronJobDecl, CronScheduleDecl, DEFAULT_GWS_SERVICES,
16    DataRetentionConfig, DeepgramSttConfig, DelegateToolConfig, DiscordConfig, DockerRuntimeConfig,
17    EmbeddingRouteConfig, EstopConfig, GatewayConfig, GeminiCliConfig, GoogleSttConfig,
18    GoogleWorkspaceAllowedOperation, GoogleWorkspaceConfig, HardwareConfig, HardwareTransport,
19    HeartbeatConfig, HooksConfig, HttpRequestConfig, IMessageConfig, IdentityConfig,
20    ImageGenConfig, ImageProviderDalleConfig, ImageProviderFluxConfig, ImageProviderImagenConfig,
21    ImageProviderStabilityConfig, JiraConfig, KnowledgeConfig, LarkConfig, LinkEnricherConfig,
22    LinkedInConfig, LinkedInContentConfig, LinkedInImageConfig, LocalWhisperConfig, MatrixConfig,
23    McpConfig, McpServerConfig, McpTransport, MediaPipelineConfig, MemoryConfig,
24    MemoryPolicyConfig, Microsoft365Config, ModelRouteConfig, MqttConfig, MultimodalConfig,
25    NextcloudTalkConfig, NodeTransportConfig, NodesConfig, NotionConfig, ObservabilityConfig,
26    OpenAiSttConfig, OpenCodeCliConfig, OpenVpnTunnelConfig, OtpConfig, OtpMethod, PacingConfig,
27    PeripheralBoardConfig, PeripheralsConfig, PipelineConfig, PluginsConfig, PostgresStorageConfig,
28    ProjectIntelConfig, ProxyConfig, ProxyScope, QdrantStorageConfig, QueryClassificationConfig,
29    ReliabilityConfig, RiskProfileConfig, RuntimeConfig, SandboxBackend, SandboxConfig,
30    SchedulerConfig, SearchMode, SecretsConfig, SecurityConfig, SecurityOpsConfig, ShellToolConfig,
31    SkillCreationConfig, SkillImprovementConfig, SkillsConfig, SkillsPromptInjectionMode,
32    SlackConfig, SopConfig, SqliteStorageConfig, StorageConfig, StreamMode, TelegramConfig,
33    TextBrowserConfig, ToolFilterGroup, ToolFilterGroupMode, TranscriptionConfig, TtsConfig,
34    TtsProviderConfig, TunnelConfig, VerifiableIntentConfig, WebFetchConfig, WebSearchConfig,
35    WebhookConfig, WhatsAppChatPolicy, WhatsAppWebMode, apply_channel_proxy_to_builder,
36    apply_runtime_proxy_to_builder, build_channel_proxy_client,
37    build_channel_proxy_client_with_timeouts, build_runtime_proxy_client,
38    build_runtime_proxy_client_with_timeouts, runtime_proxy_config, set_runtime_proxy_config,
39    ws_connect_with_proxy,
40};
41
42pub use schema::ModelProviderConfig;
43// Per-family model model_provider configs (typed split — #6273). Re-exported here
44// so tests + downstream binary callers can construct typed family entries
45// without reaching into `zeroclaw_config::schema` directly.
46pub use schema::{
47    Ai21ModelProviderConfig, AihubmixModelProviderConfig, AnthropicModelProviderConfig,
48    AnyscaleModelProviderConfig, AstraiModelProviderConfig, AvianModelProviderConfig,
49    AzureModelProviderConfig, BaichuanModelProviderConfig, BasetenModelProviderConfig,
50    BedrockModelProviderConfig, CerebrasModelProviderConfig, CloudflareModelProviderConfig,
51    CohereModelProviderConfig, CopilotModelProviderConfig, CustomModelProviderConfig,
52    DeepinfraModelProviderConfig, DeepmystModelProviderConfig, DeepseekModelProviderConfig,
53    DoubaoModelProviderConfig, FireworksModelProviderConfig, FriendliModelProviderConfig,
54    GeminiCliModelProviderConfig, GeminiModelProviderConfig, GlmModelProviderConfig,
55    GroqModelProviderConfig, HuggingfaceModelProviderConfig, HunyuanModelProviderConfig,
56    HyperbolicModelProviderConfig, KiloCliModelProviderConfig, LeptonModelProviderConfig,
57    LitellmModelProviderConfig, LlamacppModelProviderConfig, LmstudioModelProviderConfig,
58    MinimaxModelProviderConfig, MistralModelProviderConfig, MoonshotModelProviderConfig,
59    NebiusModelProviderConfig, NovitaModelProviderConfig, NscaleModelProviderConfig,
60    NvidiaModelProviderConfig, OllamaModelProviderConfig, OpenAIModelProviderConfig,
61    OpenRouterModelProviderConfig, OpencodeModelProviderConfig, OsaurusModelProviderConfig,
62    OvhModelProviderConfig, PerplexityModelProviderConfig, QianfanModelProviderConfig,
63    QwenModelProviderConfig, RekaModelProviderConfig, SambanovaModelProviderConfig,
64    SglangModelProviderConfig, SiliconflowModelProviderConfig, StepfunModelProviderConfig,
65    SyntheticModelProviderConfig, TelnyxModelProviderConfig, TogetherModelProviderConfig,
66    VeniceModelProviderConfig, VercelModelProviderConfig, VllmModelProviderConfig,
67    XaiModelProviderConfig, YiModelProviderConfig, ZaiModelProviderConfig,
68};
69pub use traits::HasPropKind;
70pub use traits::PropFieldInfo;
71pub use traits::PropKind;
72pub use traits::SecretFieldInfo;
73
74// Property helpers — single source of truth in zeroclaw-config.
75#[cfg(feature = "schema-export")]
76pub use zeroclaw_config::helpers::enum_variants;
77pub use zeroclaw_config::helpers::{
78    make_prop_field, route_hashmap_path, serde_get_prop, serde_set_prop,
79};
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84
85    #[test]
86    fn reexported_config_default_is_constructible() {
87        let config = Config::default();
88
89        assert!(config.providers.models.is_empty());
90    }
91
92    #[test]
93    fn reexported_channel_configs_are_constructible() {
94        let telegram = TelegramConfig {
95            enabled: true,
96            bot_token: "token".into(),
97            stream_mode: StreamMode::default(),
98            draft_update_interval_ms: 1000,
99            interrupt_on_new_message: false,
100            mention_only: false,
101            ack_reactions: None,
102            proxy_url: None,
103            approval_timeout_secs: 120,
104            excluded_tools: vec![],
105            default_target: None,
106        };
107
108        let discord = DiscordConfig {
109            enabled: true,
110            bot_token: "token".into(),
111            guild_ids: vec!["123".into()],
112            channel_ids: vec![],
113            archive: false,
114            listen_to_bots: false,
115            interrupt_on_new_message: false,
116            mention_only: false,
117            proxy_url: None,
118            stream_mode: StreamMode::default(),
119            draft_update_interval_ms: 1000,
120            multi_message_delay_ms: 800,
121            stall_timeout_secs: 0,
122            approval_timeout_secs: 300,
123            excluded_tools: vec![],
124            default_target: None,
125        };
126
127        let lark = LarkConfig {
128            enabled: true,
129            app_id: "app-id".into(),
130            app_secret: "app-secret".into(),
131            encrypt_key: None,
132            verification_token: None,
133            mention_only: false,
134            use_feishu: false,
135            receive_mode: crate::config::schema::LarkReceiveMode::Websocket,
136            port: None,
137            proxy_url: None,
138            excluded_tools: vec![],
139            default_target: None,
140        };
141        let nextcloud_talk = NextcloudTalkConfig {
142            enabled: true,
143            base_url: "https://cloud.example.com".into(),
144            app_token: "app-token".into(),
145            webhook_secret: None,
146            proxy_url: None,
147            bot_name: None,
148            excluded_tools: vec![],
149            stream_mode: StreamMode::default(),
150            draft_update_interval_ms: 1000,
151        };
152
153        assert_eq!(telegram.bot_token, "token");
154        assert_eq!(discord.guild_ids, vec!["123".to_string()]);
155        assert_eq!(lark.app_id, "app-id");
156        assert_eq!(nextcloud_talk.base_url, "https://cloud.example.com");
157    }
158}