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,21 +4270,28 @@ 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) {
val replacementMessages = if (!latestPaging || response.messages.all { it.id != null }) {
withContext(historyDispatcher) { val replacementMessages =
mapServerMessages( withContext(historyDispatcher) {
sessionId = sessionId, mapServerMessages(
messages = response.messages, sessionId = sessionId,
offset = 0, messages = response.messages,
latestPaging = latestPaging, offset = 0,
liveMessages = emptyList(), latestPaging = latestPaging,
activeReplyTarget = ReplyNotificationTracker.getActiveTarget(getApplication()), liveMessages = emptyList(),
mediaUrl = ::gatewayMediaUrl, activeReplyTarget = ReplyNotificationTracker.getActiveTarget(getApplication()),
) mediaUrl = ::gatewayMediaUrl,
} )
_uiState.update { it.copy(messages = replacementMessages) } }
persistHistoryPage(replacementMessages, sessionId) _uiState.update { it.copy(messages = replacementMessages) }
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