agent-fleet/src/config.rs
Zer4tul 1dacd17231 feat: Agent Adapter Interface (Task 7)
- AgentAdapter trait: register, heartbeat, execute, submit_receipt, deregister
- AdapterRunner: lifecycle management (start with health check, heartbeat loop, graceful stop)
- AdapterInstanceConfig: per-adapter config (type, work_dir, model, capabilities, env, connection)
- Config integration: adapters field in Config + config.example.toml
- 3 tests: config extraction, runner lifecycle, fake execute

22/22 tests pass.
2026-05-12 00:46:11 +08:00

81 lines
2.2 KiB
Rust

use serde::{Deserialize, Serialize};
use crate::adapters::AdapterInstanceConfig;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
pub server: ServerConfig,
pub forgejo: ForgejoConfig,
pub matrix: MatrixConfig,
pub orchestrator: OrchestratorConfig,
#[serde(default)]
pub adapters: Vec<AdapterInstanceConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerConfig {
pub bind: String,
pub port: u16,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ForgejoConfig {
pub url: String,
pub token: String,
pub webhook_secret: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MatrixConfig {
pub homeserver_url: String,
pub user_id: String,
pub access_token: String,
pub room_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrchestratorConfig {
pub db_path: String,
pub heartbeat_interval_secs: u64,
pub heartbeat_timeout_threshold: u32,
pub task_timeout_secs: u64,
pub default_max_retries: u32,
}
impl Default for Config {
fn default() -> Self {
Self {
server: ServerConfig {
bind: "0.0.0.0".into(),
port: 9090,
},
forgejo: ForgejoConfig {
url: "https://git.0x08.org".into(),
token: String::new(),
webhook_secret: String::new(),
},
matrix: MatrixConfig {
homeserver_url: "https://matrix.0x08.org".into(),
user_id: "@jeeves:0x08.org".into(),
access_token: String::new(),
room_id: String::new(),
},
orchestrator: OrchestratorConfig {
db_path: "data/agent-fleet.db".into(),
heartbeat_interval_secs: 60,
heartbeat_timeout_threshold: 3,
task_timeout_secs: 1800,
default_max_retries: 2,
},
adapters: vec![],
}
}
}
impl Config {
pub fn load(path: &str) -> Result<Self, Box<dyn std::error::Error>> {
let content = std::fs::read_to_string(path)?;
let config: Config = toml::from_str(&content)?;
Ok(config)
}
}