feat: Display default model in dropdowns and consolidate Git settings menu (#135)

* types: add commitMessageModel to DesktopSettings

* store: add commitMessageModel state and fetch logic

* lib: implement persistence for commitMessageModel setting

* ui: create GitSettings component for model selection

* ui: add Git section to OpenChamber settings sidebar

* ui: register GitSectionContent in OpenChamberPage

* server: use commitMessageModel setting for AI generation

* tauri: sanitize commitMessageModel in settings commands

* tauri: use commitMessageModel for desktop message generation

* build: update lockfile and package configuration

* refactor(openchamber): improve default model parsing with fallback logic

* feat(openchamber): improve model selection fallback logic

* refactor: move worktree settings into git section

* refactor(openchamber): merge worktree into git section

* refactor[worktree]: simplify empty state layout

* revert: rollback bun.lock and package.json to main

* feat(git): restrict model selection to OpenCode provider
This commit is contained in:
Nelson Pires
2026-01-14 00:21:16 +02:00
committed by GitHub
parent fbb058ed97
commit 279efb28b3
12 changed files with 319 additions and 49 deletions
+18 -1
View File
@@ -2089,13 +2089,30 @@ Diff summary:
{}"#,
diff_summaries
);
let settings = state.settings().load().await.unwrap_or(serde_json::Value::Null);
let raw_model = settings.get("commitMessageModel")
.and_then(|v| v.as_str())
.unwrap_or("");
let model_candidate = raw_model
.split('/')
.last()
.unwrap_or(raw_model)
.trim();
let model = if model_candidate.is_empty() {
"big-pickle"
} else {
model_candidate
};
// 3. Call API
let client = Client::new();
let res = client
.post("https://opencode.ai/zen/v1/chat/completions")
.json(&serde_json::json!({
"model": "big-pickle",
"model": model,
"messages": [{ "role": "user", "content": prompt }],
"max_tokens": 3000,
"stream": false,
@@ -257,6 +257,14 @@ fn sanitize_settings_update(payload: &Value) -> Value {
result_obj.insert("defaultAgent".to_string(), json!(trimmed));
}
}
if let Some(Value::String(s)) = obj.get("commitMessageModel") {
let trimmed = s.trim();
if trimmed.is_empty() {
result_obj.insert("commitMessageModel".to_string(), Value::Null);
} else {
result_obj.insert("commitMessageModel".to_string(), json!(trimmed));
}
}
// Boolean fields
if let Some(Value::Bool(b)) = obj.get("useSystemTheme") {