修复多会话同时进行时可能导致部分Agent响应结束后消息不可见
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user