Merge nucleic/humble-river-dingo-foad into dev

This commit is contained in:
2026-08-01 04:23:44 -07:00
parent d38fb7fac2
commit 5035e48787
+1 -43
View File
@@ -2383,14 +2383,10 @@ private struct ChatSettingsTab: View {
}
}
/// Defaults applied to new chats (model/effort/auto), synced to `AppStore` via
/// `pushDefaults()`. The default model also picks the backend (`BackendID.forModel`): a Claude
/// SKU runs on Claude Code, a GPT SKU on Codex.
/// Agent defaults synced to `AppStore` via `pushDefaults()`.
private struct AgentsSettingsTab: View {
@Environment(AppStore.self) private var store
@AppStorage(ModelCatalog.defaultModelKey) private var defaultModel = ModelCatalog.fallbackModel
@AppStorage(ModelCatalog.defaultEffortKey) private var defaultEffort = ModelCatalog.fallbackEffort
@AppStorage(ModelCatalog.defaultSupervisorModelKey) private var defaultSupervisorModel = ModelCatalog.fallbackSupervisorModel
@AppStorage(ModelCatalog.defaultSupervisorEffortKey) private var defaultSupervisorEffort = ModelCatalog.fallbackSupervisorEffort
@AppStorage(ModelCatalog.defaultOrchestraWorkerModelKey) private var defaultOrchestraWorkerModel = ModelCatalog.fallbackOrchestraWorkerModel
@@ -2468,26 +2464,6 @@ private struct AgentsSettingsTab: View {
}
Section("New chats") {
Picker("Default model", selection: $defaultModel) {
ForEach(ModelCatalog.models, id: \.self) { sku in
let badge = ModelCatalog.contextBadge(for: sku).map { Text(" \($0)").foregroundColor(.secondary) } ?? Text("")
Text("\(ModelCatalog.displayName(sku))\(badge)")
.tag(sku)
}
}
Picker("Default \(ModelCatalog.effortNoun(for: defaultModel).lowercased())", selection: $defaultEffort) {
ForEach(
ModelCatalog.efforts(for: defaultModel, codexPro: store.isCodexPro),
id: \.self
) { Text(ModelCatalog.effortDisplayName($0)).tag($0) }
}
if intelligenceSliderEnabled {
// The manual defaults stay visible (grayed) while routing is on: they
// remain the router's last-resort fallback and the manual-mode seed.
Text("With the Intelligence slider on, the default model and effort are "
+ "used only when routing can't resolve (e.g. no provider connected).")
.settingsCaption()
}
Toggle("Start new chats in Auto mode", isOn: $defaultAuto)
}
@@ -2590,24 +2566,8 @@ private struct AgentsSettingsTab: View {
}
.formStyle(.grouped)
.onAppear {
defaultEffort = ModelCatalog.clampedEffort(
defaultEffort, for: defaultModel, codexPro: store.isCodexPro)
pushDefaults()
}
.onChange(of: defaultModel) { _, _ in
// A new default model may not support the stored effort (e.g. switching to Codex
// drops "max" "xhigh").
defaultEffort = ModelCatalog.clampedEffort(
defaultEffort, for: defaultModel, codexPro: store.isCodexPro)
pushDefaults()
}
.onChange(of: store.codexSubscriptionPlan) { _, _ in
// A login can add or remove Sol's Pro-only level while Settings is already open.
defaultEffort = ModelCatalog.clampedEffort(
defaultEffort, for: defaultModel, codexPro: store.isCodexPro)
pushDefaults()
}
.onChange(of: defaultEffort) { _, _ in pushDefaults() }
.onChange(of: defaultSupervisorModel) { _, _ in pushDefaults() }
.onChange(of: defaultSupervisorEffort) { _, _ in pushDefaults() }
.onChange(of: defaultOrchestraWorkerModel) { _, _ in pushDefaults() }
@@ -2686,8 +2646,6 @@ private struct AgentsSettingsTab: View {
}
private func pushDefaults() {
store.defaultModel = defaultModel
store.defaultEffort = defaultEffort
store.defaultSupervisorModel = defaultSupervisorModel
store.defaultSupervisorEffort = defaultSupervisorEffort
store.defaultOrchestraWorkerModel = defaultOrchestraWorkerModel