fix(chat): preserve midturn steer and session marker ordering (#1241)

This commit is contained in:
M57 committed 2026-09-23 17:30:47 +03:00
1 parent 8cd1ec5298
commit 22fe1290a5
12 files changed
+246 -9

No files matched your search

@@ -53,7 +53,12 @@ interface ChatMessageDao {
suspend fun upsert(message: ChatMessageEntity) {
val existing = getMessage(message.id)
val restId = message.restId ?: existing?.restId
val canonicalOrder = canonicalMessageOrder(restId ?: message.id, message.sessionId)
val canonicalOrder =
if (message.isSessionStartMarker()) {
-1L
} else {
canonicalMessageOrder(restId ?: message.id, message.sessionId)
}
writeMessage(
message.copy(
restId = restId,
@@ -56,6 +56,9 @@ data class ChatMessageEntity(
val sortOrder: Long = 0,
)
internal fun ChatMessageEntity.isSessionStartMarker(): Boolean =
role == "SYSTEM" && (content == "Session created" || content == "Session branched")
/** Only the exact session prefix and a nonnegative decimal suffix identify a canonical row. */
internal fun canonicalMessageOrder(
id: String,
@@ -39,7 +39,7 @@ fun ChatMessageEntity.toUiModel(): ChatMessage =
tps = tps,
completionId = completionId,
restId = restId,
localOrder = sortOrder.takeIf { sortGroup == 1 && it > 0 },
localOrder = sortOrder.takeIf { sortGroup == 1 && it > 0 && !isSessionStartMarker() },
)
fun ChatMessage.toEntity(sessionId: String): ChatMessageEntity =