Skip to main content

claw_spawn/infrastructure/
config.rs

1use config::{Config, ConfigError, Environment, File};
2use serde::Deserialize;
3
4#[derive(Debug, Deserialize, Clone)]
5pub struct AppConfig {
6    pub database_url: String,
7    pub digitalocean_token: String,
8    pub encryption_key: String,
9    pub server_host: String,
10    pub server_port: u16,
11    pub openclaw_image: String,
12    pub control_plane_url: String,
13
14    // Workspace/customization (janebot-cli)
15    pub customizer_repo_url: String,
16    pub customizer_ref: String,
17    pub customizer_workspace_dir: String,
18    pub customizer_agent_name: String,
19    pub customizer_owner_name: String,
20    pub customizer_skip_qmd: bool,
21    pub customizer_skip_cron: bool,
22    pub customizer_skip_git: bool,
23    pub customizer_skip_heartbeat: bool,
24
25    // Droplet toolchain/bootstrap customization
26    pub toolchain_node_major: u8,
27    pub toolchain_install_pnpm: bool,
28    pub toolchain_pnpm_version: String,
29    pub toolchain_install_rust: bool,
30    pub toolchain_rust_toolchain: String,
31    pub toolchain_extra_apt_packages: String,
32    pub toolchain_global_npm_packages: String,
33    pub toolchain_cargo_crates: String,
34}
35
36impl AppConfig {
37    pub fn from_env() -> Result<Self, ConfigError> {
38        let config = Config::builder()
39            .add_source(File::with_name("config/default").required(false))
40            .add_source(File::with_name("config/local").required(false))
41            .add_source(Environment::with_prefix("CLAW").separator("_"))
42            .set_default("server_host", "0.0.0.0")?
43            .set_default("server_port", 8080)?
44            .set_default("openclaw_image", "ubuntu-22-04-x64")?
45            .set_default("control_plane_url", "https://api.example.com")?
46            // janebot-cli customization defaults (pinned for reproducibility)
47            .set_default(
48                "customizer_repo_url",
49                "https://github.com/janebot2026/janebot-cli.git",
50            )?
51            .set_default("customizer_ref", "4b170b4aa31f79bda84f7383b3992ca8681d06d3")?
52            .set_default("customizer_workspace_dir", "/opt/openclaw/workspace")?
53            .set_default("customizer_agent_name", "Jane")?
54            .set_default("customizer_owner_name", "Cedros")?
55            .set_default("customizer_skip_qmd", true)?
56            .set_default("customizer_skip_cron", true)?
57            .set_default("customizer_skip_git", true)?
58            .set_default("customizer_skip_heartbeat", true)?
59            // Droplet toolchain/bootstrap defaults
60            .set_default("toolchain_node_major", 20)?
61            .set_default("toolchain_install_pnpm", true)?
62            .set_default("toolchain_pnpm_version", "")?
63            .set_default("toolchain_install_rust", true)?
64            .set_default("toolchain_rust_toolchain", "stable")?
65            .set_default("toolchain_extra_apt_packages", "")?
66            .set_default("toolchain_global_npm_packages", "")?
67            .set_default("toolchain_cargo_crates", "")?
68            .build()?;
69
70        config.try_deserialize()
71    }
72}