修复多会话同时进行时可能导致部分Agent响应结束后消息不可见

This commit is contained in:
xintaofei
2026-03-11 13:41:59 +08:00
parent f74fe371da
commit 5f2ade067c

View File

@@ -223,7 +223,6 @@ function reduceHydrateDetail(
const acceptSnapshot = shouldAcceptPersistedSnapshot(current, detail) const acceptSnapshot = shouldAcceptPersistedSnapshot(current, detail)
const prevPersistedTurnCount = current?.persistedTurns.length ?? 0 const prevPersistedTurnCount = current?.persistedTurns.length ?? 0
const prevPersistedMessageCount = current?.persistedMessageCount ?? 0 const prevPersistedMessageCount = current?.persistedMessageCount ?? 0
const prevPersistedUpdatedAt = current?.persistedUpdatedAt ?? null
const optimisticTurns = current?.optimisticTurns ?? [] const optimisticTurns = current?.optimisticTurns ?? []
const persistedTurns = acceptSnapshot const persistedTurns = acceptSnapshot
? detail.turns ? detail.turns
@@ -237,21 +236,23 @@ function reduceHydrateDetail(
const shouldDropOptimistic = const shouldDropOptimistic =
optimisticTurns.length > 0 && optimisticTurns.length > 0 &&
persistedTurns.length >= (current?.persistedTurns.length ?? 0) + 1 persistedTurns.length >= (current?.persistedTurns.length ?? 0) + 1
const nextUpdatedAt = detail.summary.updated_at ?? null // Content advance: actual turns or messages grew — safe to clear
const hasPersistedAdvance = // liveMessage because persisted data now covers the streamed content.
const hasContentAdvance =
acceptSnapshot && acceptSnapshot &&
(detail.turns.length > prevPersistedTurnCount || (detail.turns.length > prevPersistedTurnCount ||
detail.summary.message_count > prevPersistedMessageCount || detail.summary.message_count > prevPersistedMessageCount)
(nextUpdatedAt !== null && // Note: updated_at changes (e.g. status update bumping the timestamp)
(prevPersistedUpdatedAt === null || // are NOT treated as content advance. Only actual turns / message_count
nextUpdatedAt > prevPersistedUpdatedAt))) // growth should clear liveMessage, because a metadata-only bump could
// arrive before the session file is flushed to disk.
const nextSession: ConversationRuntimeSession = { const nextSession: ConversationRuntimeSession = {
...(current ?? createEmptySession(conversationId)), ...(current ?? createEmptySession(conversationId)),
externalId: nextExternalId, externalId: nextExternalId,
persistedTurns, persistedTurns,
liveMessage: liveMessage:
hasPersistedAdvance && current?.syncState !== "awaiting_persist" hasContentAdvance && current?.syncState !== "awaiting_persist"
? null ? null
: (current?.liveMessage ?? null), : (current?.liveMessage ?? null),
optimisticTurns: shouldDropOptimistic ? [] : optimisticTurns, optimisticTurns: shouldDropOptimistic ? [] : optimisticTurns,