oudecheng
|
a629486ad3
|
perf(chat): 长话题历史分页——messages 按 seq keyset 增量加载
后端新增 load_messages_for_topic_page(seq < cursor + limit 分页,走 (session_id, seq) 索引替代 OFFSET 深翻页),ChatMessage 增加 seq 游标;历史批次消息带 topic_id 下发,前端以 seq+topic_id 双重判定批次归属,规避切话题瞬间在途旧批次污染。
前端触顶增量加载:批次缓存在 pendingHistoryRef,收到 topic_history_end 一次性去重 prepend,scrollTop 按新增高度补偿锚定原头部消息;不足一屏自动补页,loading 超时 10s 自愈;流式输出中加载历史不清空流式累加器,避免已流出文本丢失。
|
2026-08-18 07:51:31 +08:00 |
|
oudecheng
|
daf973a7dc
|
fix(web): 子代理状态显示与渲染崩溃修复
MessageBubble:
- taskStatusConfig 补全 running/completed/cancelled/interrupted 状态配色,
修复未知状态访问 undefined.borderColor 导致的白屏崩溃
- 添加安全回退到 failed 状态
main.tsx:
- 添加 ErrorBoundary 捕获 React 渲染错误,防止白屏并提供错误详情与恢复入口
useMessages:
- 收到子代理 execution_completed 事件后,更新主视图中 task tool result 占位消息的
status 字段(running->completed/failed/cancelled),消除永久黄色转圈
protocol.ts:
- ExecutionCompleted 接口添加 subagent_status 和 subagent_summary 字段
|
2026-08-13 22:12:43 +08:00 |
|
oudecheng
|
a9429a5657
|
fix(web): 输入框/发送按钮状态按话题隔离,避免处理中仍可发送
将单一全局 isLoading 布尔值重构为按 topic_id 跟踪的 processingTopicIds
集合,isLoading 派生自当前选中话题是否在集合中。导航响应不再清空处理
状态,切换话题后切回原话题仍能正确禁用输入。重连时通过新增的
/api/executions 端点对账后端权威执行状态,修正断连期间丢失的
execution_completed 信号导致的状态漂移。
|
2026-08-07 11:45:47 +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
|
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
|
bb2774c6b5
|
feat(web): token 统计从侧边栏迁移到右侧面板,支持子代理每轮刷新
- 新增 TopicTokenStatsPanel 面板,显示五字段 + 上下文占用进度条
- 移除 TopicList 侧边栏的 token 统计显示
- 后端新增 get_session_token_stats,按 session_id 精确查询子代理 token
- TaskMessagesLoaded 协议扩展 token_stats 字段,ws.rs 转发至前端
- useMessages/useSubAgentView 每轮 assistant_response/execution_completed 触发刷新
- App.tsx 根据当前视图分派 list_topics(主代理)或 load_task_messages(子代理)
- 抽取 utils/tokenStats.ts 共享格式化与占用率计算函数
|
2026-08-05 12:09:40 +08:00 |
|
oudecheng
|
beb7b581a6
|
fix(web): 主代理执行结束时刷新 topic 列表以更新 token 统计
LLM usage 在消息持久化后已写入 DB,主代理本次执行结束时触发 bumpTopicRefreshTrigger,list_topics 重新读取最新 token 统计并更新侧边栏。
|
2026-08-05 11:15:12 +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
|
7038d58207
|
refactor: 抽取 useChat 的领域子 hook 与 messageMappers
将原上帝 Hook 的状态域拆分为 7 个职责单一的子 hook:useConnection/useSessions/useTopics/useMessages/useSubAgentView/useSchedulerView/useSideData,并将消息映射纯函数提取到 messageMappers.ts。各子 hook 自管 ref 同步 effect,跨域依赖通过 options 注入,为组合根重写奠定基础。
|
2026-07-08 11:24:42 +08:00 |
|