从叶节点沿 parent_uuid 链回溯,重建对话。 对应 Reference: EP09 §3 let currentMsg = leafMessage while (currentMsg) { if (seen.has(currentMsg.uuid)) break // 环检测 seen.add(currentMsg.uuid) transcript.push(currentMsg) currentMsg = messages.get(c
(
messages: dict[str, ConversationMessage],
leaf_uuid: str,
)
| 436 | # 3. 崩溃恢复:从叶节点沿链回溯,重建完整对话 |
| 437 | |
| 438 | def build_conversation_chain( |
| 439 | messages: dict[str, ConversationMessage], |
| 440 | leaf_uuid: str, |
| 441 | ) -> list[ConversationMessage]: |
| 442 | """ |
| 443 | 从叶节点沿 parent_uuid 链回溯,重建对话。 |
| 444 | |
| 445 | 对应 Reference: EP09 §3 |
| 446 | let currentMsg = leafMessage |
| 447 | while (currentMsg) { |
| 448 | if (seen.has(currentMsg.uuid)) break // 环检测 |
| 449 | seen.add(currentMsg.uuid) |
| 450 | transcript.push(currentMsg) |
| 451 | currentMsg = messages.get(currentMsg.parentUuid) |
| 452 | } |
| 453 | transcript.reverse() |
| 454 | """ |
| 455 | chain = [] |
| 456 | seen = set() # 环检测(防止损坏的链指针导致无限循环) |
| 457 | current_uuid = leaf_uuid |
| 458 | |
| 459 | while current_uuid: |
| 460 | if current_uuid in seen: |
| 461 | print(f" [WARNING] 检测到循环引用 {current_uuid},停止遍历") |
| 462 | break |
| 463 | seen.add(current_uuid) |
| 464 | |
| 465 | msg = messages.get(current_uuid) |
| 466 | if msg is None: |
| 467 | break |
| 468 | |
| 469 | chain.append(msg) |
| 470 | current_uuid = msg.parent_uuid if msg.parent_uuid else "" |
| 471 | |
| 472 | chain.reverse() # 从根到叶的顺序 |
| 473 | return chain |
| 474 | |
| 475 | |
| 476 | # ============================================================ |