fix(apple): surface rejected chat session settings (#128737)

This commit is contained in:
Peter Steinberger
2026-08-24 06:49:50 -07:00
committed by GitHub
parent dea053e32f
commit 2b8fe12f0b
3 changed files with 16 additions and 2 deletions
@@ -85,6 +85,7 @@ extension OpenClawChatViewModel {
guard clearsOverride ? baselineSessionLevel != nil : Self.normalizedVerboseLevel(baselineSessionLevel) != next
else { return }
self.errorText = nil
if self.acceptedVerboseLevelsByTarget[target] == nil {
self.acceptedVerboseLevelsByTarget[target] = baselineSessionLevel.map(VerboseLevelState.value)
?? VerboseLevelState.none
@@ -133,6 +134,7 @@ extension OpenClawChatViewModel {
self.acceptedVerboseLevelsByTarget[target]?.level,
sessionKey: state.key,
exactMatchOnly: state.exactMatchOnly)
if !state.exactMatchOnly { self.errorText = error.localizedDescription }
}
}
}
@@ -177,6 +179,7 @@ extension OpenClawChatViewModel {
let baselineEffectiveFastMode = self.currentSessionEntry()?.effectiveFastMode
guard baselineFastMode != next else { return }
self.errorText = nil
if self.acceptedFastModesByTarget[target] == nil {
self.acceptedFastModesByTarget[target] = FastModeState(
override: baselineFastMode,
@@ -225,6 +228,7 @@ extension OpenClawChatViewModel {
effective: accepted?.effective,
sessionKey: state.key,
exactMatchOnly: state.exactMatchOnly)
if !state.exactMatchOnly { self.errorText = error.localizedDescription }
}
}
}
@@ -25,6 +25,7 @@ extension OpenClawChatViewModel {
guard next != preferredThinkingLevel || self.thinkingOverrideIsInherited else { return }
}
self.errorText = nil
let sessionKey = self.sessionKey
let acceptedBaseline = Self.normalizedThinkingLevel(currentSessionEntry()?.thinkingLevel)
?? Self.normalizedThinkingLevel(thinkingLevel)
@@ -159,6 +160,7 @@ extension OpenClawChatViewModel {
self.updateCurrentSessionThinkingLevel(
self.acceptedThinkingOverrideClearedByTarget[target] == true ? nil : rollbackLevel,
sessionKey: sessionKey)
self.errorText = error.localizedDescription
}
}
}
@@ -2748,13 +2748,17 @@ struct ChatViewModelTests {
viewModel.sessions = [running]
let omitted = try JSONDecoder().decode(
OpenClawSessionMessageEventPayload.self,
from: Data(#"{"sessionKey":"main","hasActiveRun":true,"messageId":"message-1","message":{"role":"assistant","content":[{"type":"text","text":"working"}],"timestamp":2}}"#.utf8))
from: Data(
#"{"sessionKey":"main","hasActiveRun":true,"messageId":"message-1","message":{"role":"assistant","content":[{"type":"text","text":"working"}],"timestamp":2}}"#
.utf8))
viewModel.handleTransportEvent(.sessionMessage(omitted))
#expect(viewModel.currentSessionEntry()?.activeRunIds == ["run-stale"])
let payload = try JSONDecoder().decode(
OpenClawSessionMessageEventPayload.self,
from: Data(#"{"sessionKey":"main","hasActiveRun":true,"activeRunIds":null,"messageId":"message-2","message":{"role":"assistant","content":[{"type":"text","text":"still working"}],"timestamp":3}}"#.utf8))
from: Data(
#"{"sessionKey":"main","hasActiveRun":true,"activeRunIds":null,"messageId":"message-2","message":{"role":"assistant","content":[{"type":"text","text":"still working"}],"timestamp":3}}"#
.utf8))
viewModel.handleTransportEvent(.sessionMessage(payload))
@@ -10408,6 +10412,7 @@ struct ChatViewModelTests {
#expect(await MainActor.run {
vm.sessions.first(where: { $0.key == "main" })?.thinkingLevel
} == "high")
#expect(await MainActor.run { vm.errorText } == nil)
}
@Test func `older pending thinking choice becomes preference fallback`() async throws {
@@ -10486,12 +10491,14 @@ struct ChatViewModelTests {
try await loadAndWaitBootstrap(vm: vm, sessionId: "sess-main")
await MainActor.run { vm.selectFastMode("off") }
await vm.waitForPendingSessionSettings(in: "main")
#expect(await MainActor.run { vm.errorText } == "rejected")
#expect(await MainActor.run { vm.fastModeSelectionID } == OpenClawChatViewModel.inheritedThinkingSelectionID)
#expect(await MainActor.run { vm.sessions.first?.fastMode } == nil)
#expect(await MainActor.run { vm.sessions.first?.effectiveFastMode } == .on)
await MainActor.run { vm.selectVerboseLevel("full") }
await vm.waitForPendingSessionSettings(in: "main")
#expect(await MainActor.run { vm.errorText } == "rejected")
#expect(await MainActor.run { vm.verboseLevel } == OpenClawChatViewModel.inheritedThinkingSelectionID)
#expect(await MainActor.run { vm.sessions.first?.verboseLevel } == nil)
}
@@ -10763,6 +10770,7 @@ struct ChatViewModelTests {
#expect(await MainActor.run { vm.preferredThinkingLevel } == "off")
#expect(await MainActor.run { !vm.prefersExplicitThinkingLevel })
#expect(await MainActor.run { callbackState.values } == ["medium", "off"])
#expect(await MainActor.run { vm.errorText } == "rejected")
}
@Test func `two failed queued thinking patches restore the confirmed level`() async throws {