( messages: Map<UUID, TranscriptMessage>, leafMessage: TranscriptMessage, )
| 2067 | * @returns Array of messages from root to leaf |
| 2068 | */ |
| 2069 | export function buildConversationChain( |
| 2070 | messages: Map<UUID, TranscriptMessage>, |
| 2071 | leafMessage: TranscriptMessage, |
| 2072 | ): TranscriptMessage[] { |
| 2073 | const transcript: TranscriptMessage[] = [] |
| 2074 | const seen = new Set<UUID>() |
| 2075 | let currentMsg: TranscriptMessage | undefined = leafMessage |
| 2076 | while (currentMsg) { |
| 2077 | if (seen.has(currentMsg.uuid)) { |
| 2078 | logError( |
| 2079 | new Error( |
| 2080 | `Cycle detected in parentUuid chain at message ${currentMsg.uuid}. Returning partial transcript.`, |
| 2081 | ), |
| 2082 | ) |
| 2083 | logEvent('tengu_chain_parent_cycle', {}) |
| 2084 | break |
| 2085 | } |
| 2086 | seen.add(currentMsg.uuid) |
| 2087 | transcript.push(currentMsg) |
| 2088 | currentMsg = currentMsg.parentUuid |
| 2089 | ? messages.get(currentMsg.parentUuid) |
| 2090 | : undefined |
| 2091 | } |
| 2092 | transcript.reverse() |
| 2093 | return recoverOrphanedParallelToolResults(messages, transcript, seen) |
| 2094 | } |
| 2095 | |
| 2096 | /** |
| 2097 | * Post-pass for buildConversationChain: recover sibling assistant blocks and |
no test coverage detected