.agents/design/bug/stream-resume-stop-state.md
流式对话暂停时,前端原本只把 stop 请求当作一次本地 abort 处理。若后端工作流尚未真正完成,用户立刻发送下一轮消息,会出现上一轮仍在写入、下一轮已经开始的并发状态,进而导致上下文混乱、侧栏生成态和输入框状态不一致。
本 PR 目标是让“暂停”从单纯的前端中断动作,升级为前后端共同确认的生成态切换:后端返回真实完成情况,前端在未完成时继续保持禁发。
/api/v2/chat/stop 只返回 success,前端不知道工作流是否已经结束。sendPrompt 只依赖局部 isChatting 判断,不能覆盖服务端仍为 generating 或最后一条 AI 记录未 finish 的情况。chatGenerateStatus 没有在 stop 结果返回后统一同步。/api/v2/chat/stop 在触发 finishWorkflow 并最多等待工作流完成后,重新读取 MongoChat.chatGenerateStatus,返回:
successcompletedchatGenerateStatus其中 completed = chatGenerateStatus !== generating。这样前端能区分“停止完成”和“停止请求已发出但后台还没完全收尾”。
ChatInput 调用 postStopV2Chat 后,把 chatGenerateStatus 和 completed 回传给 ChatBox。
ChatBox 统一处理 stop settle:
completed=true 时使用后端返回的状态。completed=false 时继续保持 generating。chatBoxData 和侧栏历史项生成态。新增 isChatRoundPending,统一判断本轮是否仍处于未完成状态:
isChatting=truechatGenerateStatus=generatingstatus !== finish只要任一条件成立,sendPrompt 和输入按钮都进入禁发状态。
OpenAPI schema 增加 stop response 字段定义,前端 API 类型跟随 schema 更新。
新增 chat:stopping_chat 国际化文案,用于 stop 未真正完成时的提示。
projects/app/src/pages/api/v2/chat/stop.ts
chatGenerateStatus,返回 completed 与生成态。packages/global/openapi/core/chat/controler/api.ts
projects/app/src/web/core/chat/api.ts
projects/app/src/components/core/chat/ChatContainer/ChatBox/chatStatus.ts
isChatRoundPending,集中维护禁发判断。projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx
isChatRoundPending 禁止下一轮发送,并处理 stop settle 后的状态同步。projects/app/src/components/core/chat/ChatContainer/ChatBox/Input/ChatInput.tsx
disableSend 控制。packages/web/i18n/en/chat.jsonpackages/web/i18n/zh-CN/chat.jsonpackages/web/i18n/zh-Hant/chat.json
packages/global/test/core/chat/controler.test.ts
projects/app/test/components/core/chat/ChatContainer/ChatBox/chatStatus.test.ts
completed 与 chatGenerateStatus。isChatting=false 但服务端生成态仍为 generating 时,不能发起下一轮。completed 和 chatGenerateStatus