From 3f558bc1c14e1715096090935d52fc0493af3dad Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Wed, 16 Sep 2026 01:07:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=8E=86=E5=8F=B2=E5=9B=9E=E5=90=88?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=8D=A1=E7=89=87=E4=B8=8E=E5=9B=9E=E5=90=88?= =?UTF-8?q?=E6=B5=81=E8=A2=AB=E6=95=B4=E6=89=B9=E8=BF=87=E6=BB=A4=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根因:App 侧 visibleTurnIds 用 directCodexTurnIdFromAssistantMessageId 解析消息 id,该函数要求 direct-codex: 前缀且 :assistant 结尾;实际数据里用户消息是 :user 结尾、assistant 消息是 Codex 原始 id(08ca3ef7-…),一个都解不出来 → visibleToolCalls / visibleTurnStreamItems 双双被过滤为空 → 视图拿不到工具与流(实机:groups=0,重进会话后工具消失) - 修法一:新增 directCodexTurnIdFromConversationMessageId,:user / :assistant 两种后缀都认 - 修法二:一个回合都解不出来时(老历史)不过滤,交给视图的位置配对与兜底渲染决定位置 - 已删除诊断用的 window.__AGC_DEBUG 临时钩子 - tsc 0 错误 --- apps/ai-game-creator-shell/src/App.tsx | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/apps/ai-game-creator-shell/src/App.tsx b/apps/ai-game-creator-shell/src/App.tsx index 78cb692fb..820528d4c 100644 --- a/apps/ai-game-creator-shell/src/App.tsx +++ b/apps/ai-game-creator-shell/src/App.tsx @@ -489,6 +489,26 @@ function directCodexConversationMessageId( } /** 从 `direct-codex::assistant` 反解回合 id;不是这个形状就返回 `null`。 */ +/** + * 从任意 direct-codex 消息 id 解出回合 id:`direct-codex::user` / `:assistant` 都认。 + * + * 历史里 assistant 消息存的是 Codex 原始 id(没有前缀),解不出来就返回 null—— + * 调用方必须容忍"全部解不出来"的情况,不能因此把数据整批过滤掉。 + */ +function directCodexTurnIdFromConversationMessageId(messageId: string) { + if (!messageId.startsWith(DIRECT_CODEX_CONVERSATION_MESSAGE_ID_PREFIX)) { + return null; + } + const rest = messageId.slice(DIRECT_CODEX_CONVERSATION_MESSAGE_ID_PREFIX.length); + for (const suffix of [':user', ':assistant']) { + if (rest.endsWith(suffix)) { + const turnId = rest.slice(0, -suffix.length).trim(); + return turnId || null; + } + } + return rest.trim() || null; +} + function directCodexTurnIdFromAssistantMessageId(messageId: string) { const suffix = ':assistant'; if ( @@ -12250,11 +12270,15 @@ export function App({ messages .map((message) => message.messageId) .filter((messageId): messageId is string => Boolean(messageId)) - .map(directCodexTurnIdFromAssistantMessageId) + .map(directCodexTurnIdFromConversationMessageId) .filter((turnId): turnId is string => Boolean(turnId)), ); + // 老历史里 assistant 消息是 Codex 原始 id,一个回合都解不出来:此时**不过滤**, + // 否则工具卡片与回合流会被整批丢掉(实机表现:重进会话后工具与流全部消失)。 + const keepAllDirectCodexTurns = visibleTurnIds.size === 0; const visibleToolCalls = directToolCalls.filter( (call) => + keepAllDirectCodexTurns || visibleTurnIds.has(call.turnId) || call.turnId === activeDirectCodexTurnRef.current?.turnId, ); @@ -12262,6 +12286,7 @@ export function App({ // 没有流条目的回合由视图自己回退到原来的渲染。 const visibleTurnStreamItems = directTurnStream.filter( (item) => + keepAllDirectCodexTurns || visibleTurnIds.has(item.turnId) || item.turnId === activeDirectCodexTurnRef.current?.turnId, );