Merge nucleic/humble-river-dingo-foad into dev
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user