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}