fix(web): keep composer enabled while generating and treat stop as neutral (BUG-551, BUG-552)

Enter now queues one follow-up instead of dropping it, and a rectification stop leaves the streamed reply with a grey notice instead of an error alert.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-06 13:08:43 +08:00
co-authored by Cursor
parent f5566c06ef
commit 055b7adca9
18 changed files with 534 additions and 74 deletions
+33
View File
@@ -8517,3 +8517,36 @@
- 复发自:BUG-546(计划层继续采集,决策层已经可采用)
- 修复版本:`ca4e2408`
## BUG-551 | 生成中禁用输入框,焦点丢失,回车消息被丢弃
- 状态:resolved
- 首次发现:2026-09-06
- 最近更新:2026-09-06
- 影响面:`ChatComposer`、主咨询 `page.tsx``use-consultation-run.ts`、生时校正 `rectification-agentic-chat.tsx`
- 用户现象:发出消息后输入框变灰,不能继续打字;回答结束后必须再点一次输入框。生成中按回车,消息被丢掉。
- 触发条件:任一对话面正在生成回答时打字或按回车。
- 根因:两个对话面把 `isLoading` / `busy` 写进 `<textarea disabled>`。浏览器会立刻移走焦点且解禁后不归还。`send()` 在已有请求时直接 `return false`,没有任何排队。
- 修复:输入框只在只读、会话加载、onboarding 或另一面打开时禁用。生成中回车把文字排成一条待发送,正常结算后自动发出;停止、失败或断线恢复时放回输入框。发送键在有排队时禁用。
- 验证:`frontend/tests/chat-composer-queue.test.ts``composer-ime-contract``composer-isolation-contract``rectification-surface-contract`
- 防复发:不得再用生成中状态禁用 textarea;生成中的发送必须进入排队或明确放回草稿,不得静默丢弃。
- 相关记录:BUG-216、BUG-329
- 复发自:无
- 修复版本:待发布
## BUG-552 | 生时校正停止穿报错衣服,选择题与采用等待中停止无效
- 状态:resolved
- 首次发现:2026-09-06
- 最近更新:2026-09-06
- 影响面:`rectification-agentic-chat.tsx``ChatMessageRow`、选择题与采用 `fetch`
- 用户现象:生成中点停止后对话区出现红色告警,气泡按失败处理;还没有正文时思考行消失。回答选择题或点采用后的等待里,停止键在但点了没反应。
- 触发条件:生时校正流式回答中点停止;或选择题 / 采用请求尚未回到 `send()` 时点停止。
- 根因:`AbortError` 把气泡写成 `failed``setError(RECTIFICATION_STOPPED_NOTICE)`,唯一出口是 `role="alert"``.error-message`。空正文时 `flatMap` 丢掉该行。选择题与采用两条 `fetch` 没有挂 `AbortController``runAbort`,停止是空操作。BUG-329 的防复发只锁了 `send()` 那一路 fetch abort。
- 修复:停止后气泡 `settled` + `stopped`,灰字说明已停止且不扣点,不再 `setError`。无正文也保留气泡。选择题与采用的 fetch 挂上同一个 `runAbort`
- 验证:`frontend/tests/chat-composer-queue.test.ts``rectification-agentic-entry.test.ts``rectification-surface-contract.test.ts``chat-notice-and-scroll-contract.test.ts`
- 防复发:停止不得走 `role="alert"``busy` 时可见的停止键必须 abort 当前 fetch,包括选择题与采用,而不仅是 `send()`
- 相关记录:BUG-329、BUG-551
- 复发自:BUG-329(停止按钮只绑了 `send()` 的 abort,没覆盖选择题与采用)
- 修复版本:待发布