fix(chat): /compress no longer drops feedback on id-less transcript rows (#1419)

This commit is contained in:
m57
2026-09-30 21:29:57 +03:00
committed by GitHub
parent 56bb3a88c2
commit 7b6aed4bcd
@@ -4270,7 +4270,11 @@ class ChatViewModel(
val sessionId = runtimeSessionId ?: _uiState.value.currentSessionId val sessionId = runtimeSessionId ?: _uiState.value.currentSessionId
// 1. Authoritative transcript replacement // 1. Authoritative transcript replacement
// Rows without a server id can't be keyed under newest-anchored paging; the mapper would throw and
// abort the whole result (feedback included). Fall back to a REST reload for those.
var needsReload = false
if (response?.messages != null && sessionId != null) { if (response?.messages != null && sessionId != null) {
if (!latestPaging || response.messages.all { it.id != null }) {
val replacementMessages = val replacementMessages =
withContext(historyDispatcher) { withContext(historyDispatcher) {
mapServerMessages( mapServerMessages(
@@ -4285,6 +4289,9 @@ class ChatViewModel(
} }
_uiState.update { it.copy(messages = replacementMessages) } _uiState.update { it.copy(messages = replacementMessages) }
persistHistoryPage(replacementMessages, sessionId) persistHistoryPage(replacementMessages, sessionId)
} else {
needsReload = true
}
} }
// 2. Display result summary via addAssistantMessage // 2. Display result summary via addAssistantMessage
@@ -4300,6 +4307,12 @@ class ChatViewModel(
} else { } else {
response?.message ?: "Context compressed." response?.message ?: "Context compressed."
} }
if (needsReload && sessionId != null) {
// Mirror handlePrefillResult: rehydrate from REST first, then post the feedback so it survives.
withContext(ioDispatcher) { repo.clearMessagesForSession(sessionId) }
_uiState.update { it.copy(messages = emptyList()) }
loadSessionMessages(sessionId, sessionGeneration)
}
addAssistantMessage(feedback) addAssistantMessage(feedback)
// 3. Refresh usage & sessions // 3. Refresh usage & sessions