错误出现已结束信息 #458
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题定位
现象原因:发送提示词后到宿主真正回报回合开始之间存在一个空窗期,这期间最新回合被投影成“已结束”。
具体链路:
注意 turnBusy(本地 invoke 忙态)从发送瞬间就置 true,但它没有参与 buildDirectChatTurns 的 turnRunning,所以覆盖不了这个窗口。
引入的 commit
33ddb5de2— “DirectProject 聊天框改用线程订阅作为唯一运行态来源”(9 月 16 日,#384 前后)。这个 commit 之前,active 由 activeTurnId 驱动,而 activeDirectCodexTurnRef 是在发送路径里同步设置的(App.tsx 发送时立即写入),按下发送的瞬间回合就是 active,不存在空窗。改成“订阅是唯一运行态来源”后,active 只能等订阅事件回放,于是引入了这段空窗。Math.max(endedAt, startedAt) 的兜底又把缺失的 endedAt 伪装成了“0.0 秒结束”,让假象更显眼。
问题定位
现象原因:发送提示词后到宿主真正回报回合开始之间存在一个空窗期,这期间最新回合被投影成“已结束”。
具体链路:
turn.active只由directTurnRunning(reducer 里的state.turnRunning)决定,而turnRunning只有在订阅循环 consume 到原生turn.started事件时才变 true(directThreadChat.ts 的reduceDirectThreadEvent)。turn.started→ notify → consume 回前端,这个窗口通常有几百毫秒到数秒。窗口内turnRunning=false、endedAt=0。DirectProjectTurnUsage渲染条件是!turn.active && turn.startedAt,此时满足;并且endedAt = Math.max(turn.endedAt, turn.startedAt)把缺失的终态时间(0)用开始时间顶替,于是显示“本轮结束于 12:52:41 · 耗时 0.0秒”。turn.started事件到达后active=true,这行消失,回合正常推进 —— 正好对应你看到的“过一会儿会正常推进”。注意
turnBusy(本地 invoke 忙态)从发送瞬间就置 true,但它没有参与buildDirectChatTurns的turnRunning,所以覆盖不了这个窗口。引入的 commit
33ddb5de2— “DirectProject 聊天框改用线程订阅作为唯一运行态来源”(9 月 16 日,#384前后)。这个 commit 之前,
active由activeTurnId驱动,而activeDirectCodexTurnRef是在发送路径里同步设置的(App.tsx 发送时立即写入),按下发送的瞬间回合就是 active,不存在空窗。改成“订阅是唯一运行态来源”后,active 只能等订阅事件回放,于是引入了这段空窗。Math.max(endedAt, startedAt)的兜底又把缺失的 endedAt 伪装成了“0.0 秒结束”,让假象更显眼。修复建议(最小改动)
两个方向,任选其一:
DirectProjectTurnUsage在endedAt === 0时不渲染 ——directThreadChat.ts里本来就写明“缺失就是缺失,宁可不显示总耗时”,endedAt=0且非 active 就是不可证明已结束,不该出这行。DirectProjectChatView里传turnRunning: directTurnRunning || turnBusy,让本地发送忙态也算回合进行中,覆盖 invoke 到turn.started的窗口。我建议两个一起改也行,但单做 1 就能消除你看到的错误文案。需要我直接改掉的话告诉我。