mirror of
https://github.com/anomalyco/opencode.git
synced 2026-04-24 23:04:55 +00:00
When the client clock is ahead of the server, user message IDs (generated client-side) sort after assistant message IDs (generated server-side). This broke the prompt loop exit check and the UI message pairing logic. - Extract shouldExitLoop() into a pure function that uses parentID matching instead of relying on ID ordering - Extract findAssistantMessages() with forward+backward scan to handle messages sorted out of expected order due to clock skew - Remove debug console.log statements added during investigation - Add tests for both extracted functions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import type { AssistantMessage, Message as MessageType } from "@opencode-ai/sdk/v2/client"
|
|
|
|
/**
|
|
* Find assistant messages that are replies to a given user message.
|
|
*
|
|
* Scans forward from the user message index first, then falls back to scanning
|
|
* backward. The backward scan handles clock skew where assistant messages
|
|
* (generated server-side) sort before the user message (generated client-side
|
|
* with an ahead clock) in the ID-sorted array.
|
|
*/
|
|
export function findAssistantMessages(
|
|
messages: MessageType[],
|
|
userIndex: number,
|
|
userID: string,
|
|
): AssistantMessage[] {
|
|
if (userIndex < 0 || userIndex >= messages.length) return []
|
|
|
|
const result: AssistantMessage[] = []
|
|
|
|
// Scan forward from user message
|
|
for (let i = userIndex + 1; i < messages.length; i++) {
|
|
const item = messages[i]
|
|
if (!item) continue
|
|
if (item.role === "user") break
|
|
if (item.role === "assistant" && item.parentID === userID) result.push(item as AssistantMessage)
|
|
}
|
|
|
|
// Scan backward to find assistant messages that sort before the user
|
|
// message due to clock skew between client and server
|
|
if (result.length === 0) {
|
|
for (let i = userIndex - 1; i >= 0; i--) {
|
|
const item = messages[i]
|
|
if (!item) continue
|
|
if (item.role === "user") break
|
|
if (item.role === "assistant" && item.parentID === userID) result.push(item as AssistantMessage)
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|