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

@@ -14,7 +14,7 @@ use preferences::PreferenceDraft;
#[cfg(test)]
use preferences::{parse_optional_gib, parse_streaming_cache};
use crate::config::{Config, EndpointConfig};
use crate::config::{Config, DevBrainConfig, EndpointConfig};
use crate::database::{Database, ProjectWithSessions, SessionState, StoredMessage};
#[cfg(target_os = "macos")]
use crate::engine::ChatTurn;
@@ -247,6 +247,7 @@ pub(super) enum DetailTab {
pub(super) enum PreferenceSection {
Model,
Endpoint,
DevBrain,
Generation,
Execution,
Acceleration,
@@ -255,9 +256,10 @@ pub(super) enum PreferenceSection {
}
impl PreferenceSection {
const ALL: [Self; 7] = [
const ALL: [Self; 8] = [
Self::Model,
Self::Endpoint,
Self::DevBrain,
Self::Generation,
Self::Execution,
Self::Acceleration,
@@ -269,6 +271,7 @@ impl PreferenceSection {
match self {
Self::Model => "preferences-model",
Self::Endpoint => "preferences-endpoint",
Self::DevBrain => "preferences-dev-brain",
Self::Generation => "preferences-generation",
Self::Execution => "preferences-execution",
Self::Acceleration => "preferences-acceleration",
@@ -281,6 +284,7 @@ impl PreferenceSection {
match self {
Self::Model => "Model & lifecycle",
Self::Endpoint => "Local endpoint",
Self::DevBrain => "Dev Brain",
Self::Generation => "Generation",
Self::Execution => "Execution",
Self::Acceleration => "Acceleration & memory",
@@ -338,6 +342,10 @@ pub(crate) enum Message {
PreferenceEndpointPortChanged(String),
PreferenceEndpointEnabledChanged(bool),
PreferenceEndpointCorsChanged(bool),
PreferenceDevBrainEnabledChanged(bool),
PreferenceDevBrainVaultChanged(String),
ChooseDevBrainVault,
DevBrainVaultPicked(Option<PathBuf>),
PreferenceContextChanged(String),
PreferenceMaxTokensChanged(String),
PreferenceSystemPromptAction(text_editor::Action),
@@ -1157,6 +1165,33 @@ impl App {
self.preference_draft.endpoint_cors = enabled;
self.preference_error = None;
}
Message::PreferenceDevBrainEnabledChanged(enabled) => {
self.preference_draft.dev_brain_enabled = enabled;
self.preference_error = None;
}
Message::PreferenceDevBrainVaultChanged(value) => {
self.preference_draft.dev_brain_vault_path = value;
self.preference_error = None;
}
Message::ChooseDevBrainVault => {
return Task::perform(
async {
AsyncFileDialog::new()
.set_title("Choose an Obsidian vault")
.pick_folder()
.await
.map(|folder| folder.path().to_path_buf())
},
Message::DevBrainVaultPicked,
);
}
Message::DevBrainVaultPicked(path) => {
if let Some(path) = path {
self.preference_draft.dev_brain_vault_path =
path.to_string_lossy().into_owned();
self.preference_error = None;
}
}
Message::PreferenceContextChanged(value) => {
self.preference_draft.context_tokens = value;
self.preference_error = None;
@@ -1702,6 +1737,7 @@ impl App {
self.tokens_per_second = None;
}
self.reload_projects();
self.invalidate_dev_brain_context();
self.finish_cache_change();
}
Err(error) => self.error = Some(error),