7 Commits

Author SHA1 Message Date
oudecheng
a9429a5657 fix(web): 输入框/发送按钮状态按话题隔离,避免处理中仍可发送
将单一全局 isLoading 布尔值重构为按 topic_id 跟踪的 processingTopicIds
集合,isLoading 派生自当前选中话题是否在集合中。导航响应不再清空处理
状态,切换话题后切回原话题仍能正确禁用输入。重连时通过新增的
/api/executions 端点对账后端权威执行状态,修正断连期间丢失的
execution_completed 信号导致的状态漂移。
2026-08-07 11:45:47 +08:00
oudecheng
934c7aa804 test(web): 补充流式断连的对抗性测试(stream_end 幂等性 + 多周期循环)
对抗性审查 commit 30b7d90 的修复健壮性,新增两个边缘场景测试:

- 用例 18: 验证断连后 stream_end 到达是幂等的(不崩溃、不改变
  已 flush 内容),且后续 assistant_response 能正常按 id 替换
- 用例 19: 验证多次断连-重连循环下 finishStreaming 幂等
  (连续调用不崩溃,消息状态稳定)
2026-08-07 08:33:57 +08:00
oudecheng
c749df4e0a fix(web): WebSocket 断连时清理流式状态,防止重连后消息串流
流式优化引入的回归风险:当 WebSocket 在流式输出中途断连时,
streamingRef(contentChunks/index)不会被重置。重连后新消息的
delta 会通过 s.index >= 0 分支追加到旧消息的错误位置。

修复链路:useWebSocket 的 onDisconnect 回调 → useChat 的
finishStreaming → useMessages 的 finishStreaming(重置 ref +
flush pending chunks)。

- useMessages.ts: 在 UseMessagesReturn 接口和 return 对象暴露
  finishStreaming(原为内部函数)
- useChat.ts: 在返回对象透传 finishStreaming
- App.tsx: useWebSocket 调用新增 onDisconnect 回调触发 finishStreaming
- useChat.test.ts: 新增用例 17 验证断连后新 delta 不污染旧消息
2026-08-07 08:33:48 +08:00
oudecheng
00735395ca fix(web): 修复正在执行的会话消息泄露到定时任务视图
handleSchedulerMessage (Tier 1 路由) 原先无条件吞掉所有可转换的
chat 消息,导致用户打开定时任务历史视图时,当前主会话正在执行
的 stream_delta/assistant_response 等实时消息被错误追加到
schedulerView.messages。

修复:调度器视图是历史会话查看器,只接收不带 topic_id 的历史
加载消息;实时流式消息(stream_delta/stream_end)和带 topic_id
的实时消息 fall through 到 Tier 2/3 路由到主视图,不再泄露。

- useSchedulerView.ts: handleSchedulerMessage 增加流式和 topic_id
  过滤,实时消息 fall through
- useChat.test.ts: 新增用例 16 验证流式和带 topic_id 消息不进入
  schedulerView,无 topic_id 历史消息仍正常进入
2026-08-07 08:33:37 +08:00
oudecheng
f8c984aef4 perf(web): 优化流式 delta 处理,避免每 token 全数组拷贝
用 ref 累加 delta chunks + requestAnimationFrame 批量 flush,
将每秒数十次 O(n) 数组拷贝合并为一帧一次状态更新。

- useMessages.ts: 新增 streamingRef 累加器 + rAF 调度,所有 delta
  只 push 到 ref,由 flushStreaming 批量落盘;用 rafScheduledRef
  boolean 追踪调度状态(避免 rAF handle 为 0 时与 null 检查冲突);
  flushStreaming 基于 prev 实际状态判断创建/更新消息(批处理安全)
- useChat.ts: 5 处 setMessages([]) 改为 clearMessages(),切话题/
  会话/通道时重置流式 ref,避免脏状态残留
- test/setup.ts: 同步化 rAF 并返回递增非零 handle,保持测试同步语义
- useChat.test.ts: 新增对抗性测试(批量 delta 累加、stream_end 后
  assistant_response 替换含 reasoning)

复杂度:O(n²·L) → O(n) 每帧,15 个测试全部通过
2026-08-07 08:33:27 +08:00
oudecheng
c724bbf864 chore(web): prettier 一次性格式化并在 CI 启用 format:check
对 47 个前端文件统一执行 npm run format,消除存量格式差异。
随后在 CI 与 Makefile check 中启用 format:check,确保后续提交强制遵守 prettier 风格。
2026-08-03 23:25:22 +08:00
oudecheng
f3e3ebf55f test: 添加 useChat handleServerMessage 特征测试
新增 13 条特征测试,覆盖 handleServerMessage 全部 20 个 case 与 3 层路由(调度器→子智能体→主视图),锚定行为基线以保护后续组合根重写的回归风险。
2026-07-08 11:28:28 +08:00