feat: first cut at dev brain

This commit is contained in:
Georg Bauer
2026-07-27 21:16:10 +02:00
parent 56be87d288
commit cfc4fce8d7
14 changed files with 2119 additions and 141 deletions

View File

@@ -15,6 +15,7 @@ pub struct Config {
pub model: ModelChoice,
pub idle_timeout_minutes: i32,
pub a2ui_enabled: bool,
pub dev_brain: DevBrainConfig,
pub endpoint: EndpointConfig,
pub generation: GenerationPreferences,
pub runtime: RuntimePreferences,
@@ -27,6 +28,7 @@ impl Default for Config {
model: ModelChoice::default(),
idle_timeout_minutes: 10,
a2ui_enabled: true,
dev_brain: DevBrainConfig::default(),
endpoint: EndpointConfig::default(),
generation: GenerationPreferences::default(),
runtime: RuntimePreferences::default(),
@@ -35,6 +37,35 @@ impl Default for Config {
}
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct DevBrainConfig {
pub enabled: bool,
pub vault_path: Option<String>,
}
impl DevBrainConfig {
pub fn vault(&self) -> Result<std::path::PathBuf, String> {
if !self.enabled {
return Err("Dev Brain is disabled.".into());
}
let path = self
.vault_path
.as_deref()
.filter(|path| !path.trim().is_empty())
.ok_or_else(|| "Choose an Obsidian vault before enabling Dev Brain.".to_owned())?;
crate::dev_brain::validate_vault(Path::new(path))
}
fn validate(&self) -> Result<(), String> {
if self.enabled {
self.vault().map(|_| ())
} else {
Ok(())
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct EndpointConfig {
@@ -113,7 +144,8 @@ impl Config {
return Err("Endpoint port must be between 1 and 65535.".into());
}
self.generation.validate()?;
self.runtime.validate(self.model)
self.runtime.validate(self.model)?;
self.dev_brain.validate()
}
}