Skip to main content

construct/config/
mod.rs

1pub mod schema;
2pub mod traits;
3pub mod workspace;
4
5#[allow(unused_imports)]
6pub use schema::{
7    AgentConfig, AssemblyAiSttConfig, AuditConfig, AutonomyConfig, BackupConfig,
8    BrowserComputerUseConfig, BrowserConfig, BuiltinHooksConfig, ChannelsConfig,
9    ClassificationRule, ClaudeCodeConfig, ClaudeCodeRunnerConfig, ClawHubConfig, CloudOpsConfig,
10    CodexCliConfig, ComposioConfig, Config, ConversationalAiConfig, CostConfig, CronConfig,
11    CronJobDecl, CronScheduleDecl, DEFAULT_GWS_SERVICES, DataRetentionConfig, DeepgramSttConfig,
12    DelegateAgentConfig, DelegateToolConfig, DiscordConfig, DockerRuntimeConfig, EdgeTtsConfig,
13    ElevenLabsTtsConfig, EmbeddingRouteConfig, EstopConfig, FeishuConfig, GatewayConfig,
14    GeminiCliConfig, GoogleSttConfig, GoogleTtsConfig, GoogleWorkspaceAllowedOperation,
15    GoogleWorkspaceConfig, HardwareConfig, HardwareTransport, HeartbeatConfig, HooksConfig,
16    HttpRequestConfig, IMessageConfig, IdentityConfig, ImageGenConfig, ImageProviderDalleConfig,
17    ImageProviderFluxConfig, ImageProviderImagenConfig, ImageProviderStabilityConfig, JiraConfig,
18    KumihoConfig, LarkConfig, LinkEnricherConfig, LinkedInConfig, LinkedInContentConfig,
19    LinkedInImageConfig, LocalWhisperConfig, MatrixConfig, McpConfig, McpServerConfig,
20    McpTransport, MediaPipelineConfig, MemoryConfig, MemoryPolicyConfig, Microsoft365Config,
21    ModelRouteConfig, MultimodalConfig, NextcloudTalkConfig, NodeTransportConfig, NodesConfig,
22    NotionConfig, ObservabilityConfig, OpenAiSttConfig, OpenAiTtsConfig, OpenCodeCliConfig,
23    OpenVpnTunnelConfig, OperatorConfig, OtpConfig, OtpMethod, PacingConfig, PeripheralBoardConfig,
24    PeripheralsConfig, PipelineConfig, PiperTtsConfig, PluginsConfig, ProjectIntelConfig,
25    ProxyConfig, ProxyScope, QueryClassificationConfig, ReliabilityConfig, ResourceLimitsConfig,
26    RuntimeConfig, SandboxBackend, SandboxConfig, SchedulerConfig, SecretsConfig, SecurityConfig,
27    SecurityOpsConfig, ShellToolConfig, SkillCreationConfig, SkillImprovementConfig, SkillsConfig,
28    SkillsPromptInjectionMode, SlackConfig, SopConfig, StorageConfig, StorageProviderConfig,
29    StorageProviderSection, StreamMode, SwarmConfig, SwarmStrategy, TelegramConfig,
30    TextBrowserConfig, ToolFilterGroup, ToolFilterGroupMode, TranscriptionConfig, TtsConfig,
31    TunnelConfig, VerifiableIntentConfig, WebFetchConfig, WebSearchConfig, WebhookConfig,
32    WhatsAppChatPolicy, WhatsAppWebMode, WorkspaceConfig, apply_channel_proxy_to_builder,
33    apply_runtime_proxy_to_builder, build_channel_proxy_client,
34    build_channel_proxy_client_with_timeouts, build_runtime_proxy_client,
35    build_runtime_proxy_client_with_timeouts, runtime_proxy_config, set_runtime_proxy_config,
36    ws_connect_with_proxy,
37};
38
39pub fn name_and_presence<T: traits::ChannelConfig>(channel: Option<&T>) -> (&'static str, bool) {
40    (T::name(), channel.is_some())
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn reexported_config_default_is_constructible() {
49        let config = Config::default();
50
51        assert!(config.default_provider.is_some());
52        assert!(config.default_model.is_some());
53        assert!(config.default_temperature > 0.0);
54    }
55
56    #[test]
57    fn reexported_channel_configs_are_constructible() {
58        let telegram = TelegramConfig {
59            bot_token: "token".into(),
60            allowed_users: vec!["alice".into()],
61            stream_mode: StreamMode::default(),
62            draft_update_interval_ms: 1000,
63            interrupt_on_new_message: false,
64            mention_only: false,
65            ack_reactions: None,
66            proxy_url: None,
67            notification_chat_id: None,
68        };
69
70        let discord = DiscordConfig {
71            bot_token: "token".into(),
72            guild_id: Some("123".into()),
73            allowed_users: vec![],
74            listen_to_bots: false,
75            interrupt_on_new_message: false,
76            mention_only: false,
77            proxy_url: None,
78            stream_mode: StreamMode::default(),
79            draft_update_interval_ms: 1000,
80            multi_message_delay_ms: 800,
81            notification_channel_id: None,
82        };
83
84        let lark = LarkConfig {
85            app_id: "app-id".into(),
86            app_secret: "app-secret".into(),
87            encrypt_key: None,
88            verification_token: None,
89            allowed_users: vec![],
90            mention_only: false,
91            use_feishu: false,
92            receive_mode: crate::config::schema::LarkReceiveMode::Websocket,
93            port: None,
94            proxy_url: None,
95        };
96        let feishu = FeishuConfig {
97            app_id: "app-id".into(),
98            app_secret: "app-secret".into(),
99            encrypt_key: None,
100            verification_token: None,
101            allowed_users: vec![],
102            receive_mode: crate::config::schema::LarkReceiveMode::Websocket,
103            port: None,
104            proxy_url: None,
105        };
106
107        let nextcloud_talk = NextcloudTalkConfig {
108            base_url: "https://cloud.example.com".into(),
109            app_token: "app-token".into(),
110            webhook_secret: None,
111            allowed_users: vec!["*".into()],
112            proxy_url: None,
113            bot_name: None,
114        };
115
116        assert_eq!(telegram.allowed_users.len(), 1);
117        assert_eq!(discord.guild_id.as_deref(), Some("123"));
118        assert_eq!(lark.app_id, "app-id");
119        assert_eq!(feishu.app_id, "app-id");
120        assert_eq!(nextcloud_talk.base_url, "https://cloud.example.com");
121    }
122}