# 7-61 Page AI Pi 历史回放真源混用 ## 问题 Pi Lab 实时对话正常,但重新打开历史 session 后,同一条 assistant 结果可能重复显示多次;工具过程没有同步重复。 ## 根因 历史打开链路同时读取并合并两个来源: - `/api/page-ai/pi/sessions/{id}/tree`:Pi Rust JSONL session tree,会话消息真源。 - `/api/page-ai/pi/sessions/{id}/events`:control-plane runtime events,用于 SSE backlog、导出和诊断。 `events` 中同一次回复可能以 `message_update/text_delta`、`message_end`、`agent_end` 等形式记录运行过程;它不是历史消息 UI 的 canonical source。前端把 `tree` 和 `events` 合并回放后,就会把同一 assistant 结果渲染成多条消息。 ## 修复 - `sidebar-page-ai-pi-lab-runtime.js` - `openHistorySession()` 只从 `/tree` 读取并回放消息。 - 移除历史回放消息层面的 `eventsToReplayMessages()` / `mergeReplayMessages()` / `replayMessageKey()`,避免用去重掩盖多真源。 - `/events` 继续保留给实时 SSE backlog、导出和诊断,不参与历史消息回放。 - `scripts/task-pi-lab-history-tail-smoke.js` - 构造 JSONL 只有 1 条 assistant 回复,但 runtime events 中包含多段同文结果事件。 - 打开历史后断言 UI 只显示 JSONL 中的 1 条 assistant 回复。 ## 验证 - `node --check rust/crates/mnote-web/browser/sidebar-page-ai-pi-lab-runtime.js` - `node --check scripts/task-pi-lab-history-tail-smoke.js` - `node scripts/task-pi-lab-static-smoke.js` - `node scripts/task-pi-lab-history-tail-smoke.js`