From 08eb475845de939bb4e392cddc69204c15cdf256 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Wed, 16 Sep 2026 00:53:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E9=87=8D=E8=BD=BD=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E5=90=8E=E5=B7=A5=E5=85=B7=E5=8D=A1=E7=89=87=E6=B6=88=E5=A4=B1?= =?UTF-8?q?=EF=BC=88=E8=80=81=E9=A1=B9=E7=9B=AE=E5=9B=9E=E9=80=80=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根因:没有 turn-stream.jsonl 的回合走回退路径,靠 direct-codex::assistant 合成 id 找锚点;老项目持久化的 assistant 消息 id 是 Codex 原始 id(如 0cef4af7-…),锚不上,工具调用被丢弃 - 修法:锚不上的工具按回合收集,渲染在消息列表末尾(按首个 startedAt 排序),绝不丢失 - 一并包含:文本段按"更长优先"合并(前后端两侧),修正文只剩前缀的问题 - tsc 0 错误、cargo build 0 error --- .../ProjectSupervisorView.tsx | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/ProjectSupervisorView.tsx b/apps/ai-game-creator-shell/src/features/project-workspace/ProjectSupervisorView.tsx index ac459702d..73b987cf8 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/ProjectSupervisorView.tsx +++ b/apps/ai-game-creator-shell/src/features/project-workspace/ProjectSupervisorView.tsx @@ -442,6 +442,9 @@ export function ProjectSupervisorView({ const toolCallsByAnchor = new Map(); const liveToolCalls: GameCreatorDirectToolCall[] = []; let liveToolCallTurnId = ''; + // 老项目里持久化的 assistant 消息 id 是 Codex 原始 id(不是 `direct-codex::assistant`), + // 因此锚不上;这些工具的回合不能丢,统一收集后渲染在列表末尾。 + const unanchoredToolCallsByTurn = new Map(); // 正在跑的回合:它的流条目直接渲染在消息列表末尾,直到用户消息落盘、由那条消息接管。 const liveStreamTurnId = streamTurnId && turnStreamByTurn.has(streamTurnId) ? streamTurnId @@ -472,9 +475,20 @@ export function ProjectSupervisorView({ liveToolCallTurnId = call.turnId; } liveToolCalls.push(call); + continue; } + const bucket = unanchoredToolCallsByTurn.get(call.turnId) ?? []; + bucket.push(call); + unanchoredToolCallsByTurn.set(call.turnId, bucket); } } + const unanchoredToolCalls = [...unanchoredToolCallsByTurn.entries()] + .sort((left, right) => { + const leftAt = Math.min(...left[1].map((call) => call.startedAt || 0)); + const rightAt = Math.min(...right[1].map((call) => call.startedAt || 0)); + return leftAt - rightAt; + }) + .map(([turnId, calls]) => ({ turnId, calls })); // 该回合用户消息的 `updatedAt`:拿得到就在块头显示「发送 → 结束」,拿不到只显示结束时间。 const userMessageUpdatedAtForTurn = (turnId: string) => { if (!turnId) { @@ -738,6 +752,14 @@ export function ProjectSupervisorView({ ); })} + {unanchoredToolCalls.map(({ turnId, calls }) => ( + + ))} {liveToolCalls.length > 0 ? (