修复策划回复重复播放并保留伪流式 #501
Reference in New Issue
Block a user
Delete Branch "fix/design-agent-fe"
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?
按消息 ID 合并实时正文与正式消息,保留逐步显示进度
分离请求收尾与动画结束,隔离旧回合事件及异步返回
独立展示工具状态,保留 Provider 重试的正文重置语义
补充重复终态、整块回复、多消息及回合隔离回归测试
同步更新策划展示规范与排障记录
代码审查(master...fix/design-agent-fe,单提交 688cf7a)
总体结论
改动方向正确,可以合并。核心收益:正文动画按
messageId与正式消息共用一个气泡,重复终态(状态事件 + 命令返回)幂等,不再出现「正式回复旁重播一遍后消失」;请求收尾与动画结束解耦,旧回合的迟到事件和finally不会污染新回合。已核对后端design_runtime.rs:805-897,所有text事件均携带message_id,前端对payload.messageId的强依赖成立;applyDesignView中messageId: message.id的映射(App.tsx:514)与动画键一致。本地验证:
tests/designReplyAnimation.test.tsx2 项通过;appSurface.test.ts -t "Design Agent"8 项通过。发现的问题
1.(建议修复)项目切换中途回合可能导致
chatAgentBusy卡死回合进行中切换项目时,
resetChatState(App.tsx:1294-1307)清空了designAgentTurnRef但不清chatAgentBusy;旧 invoke 返回后finally因isCurrentDesignTurn为 false 跳过清理(App.tsx:610-613,decide_design_phase路径同理 App.tsx:2269-2276)。chatAgentBusy只剩applyDesignView里的setChatAgentBusy(view.running)会复位(App.tsx:539)——若新项目没有可 hydrate 的策划会话(hydrateDesignAgentSession返回 null,App.tsx:571-573),忙碌态无人清除,输入框和提交永久禁用(App.tsx:2146、2307)。旧实现finally无条件清 busy,这是本次收尾隔离引入的一个窄回归。建议在resetChatState里补setChatAgentBusy(false)(该函数本就把 turnRef 置空,语义一致)。次要观察(不阻塞)
receiveText对已持久化条目直接忽略(useDesignReplyAnimation.ts:38-40),与后端「空文本仅在 attempt 开始、消息持久化之前发出」的顺序吻合;注释已说明,逻辑正确。覆盖确认
文档同步符合仓库规范(实施计划 + pitfalls 均已更新);新增回归覆盖重复终态、整块返回、工具间多条正文、重试空串、旧请求不能结束新回合,与 PR 描述一致。