修正工具组独立计时并移除重复整轮耗时

每个工具组只计算自身调用跨度,已完成组立即停止增长与进行中标记。
整轮总耗时仅在回合状态或完成小结显示一次,单工具仍按百毫秒动态更新。
补齐前组已完成后组运行、边界缺失与倒序的回归及浏览器证据。
This commit is contained in:
2026-09-18 13:45:27 +08:00
parent 2d90b73b94
commit 21b059bd41
8 changed files with 392 additions and 140 deletions
@@ -12,7 +12,7 @@
3. 前端事件 reducer 保留工具开始、完成边界以及本轮终态时间;完成边界可附在本轮聊天条目展示元数据上,沿用现有用户条目划分回合,不新增 turnId 或第二套生命周期。无时间旧历史不编造准确总耗时。
- 整轮起点:该轮用户消息的实际发送时间优先,缺失才取 `turn.started.at`;与用户要求的“发送到完成”一致,不能改为第一条工具的起点。终点只取明确终态事件,不能取最后一条正文的创建时间或最后工具更新时间。
- 只有完成没有开始事件的工具隐藏未知耗时;缺失、0、非有限或倒序边界隐藏,正常运行的零时长显示 `0.0`。
4. 视图传递同轮起止时间到各工具块,以共享或局部有界的 100ms 时钟驱动展示,不把整棵 App 状态每 100ms 重建。只在有运行中计时目标时订阅,结束/切项目/卸载清理。
4. 回合状态/小结消费整轮起止时间,各工具块仅消费本组工具阶段时间,以局部有界的 100ms 时钟驱动展示,不把整棵 App 状态每 100ms 重建。只在该层有运行中计时目标时订阅,结束/切项目/卸载清理。
5. 测试先覆盖静止事件输入下推进时钟、工具完成但回合仍运行、终态与重复事件;补阶段字段与回放时间测试。独立 review 后主 Agent 核对并返修。
6. 同视图的追加局部修复:初始消息占位判定应读取实际 Direct 用户条目/乐观用户条目和分页状态,不只检查旧 conversationMessages;增加正式气泡只出现一次、合法同文消息不被去重的回归。
@@ -34,6 +34,12 @@
## PR 补审返修(2026-09-18)
### 用户截图澄清:工具组必须独立计时
上一版把整轮总耗时复用到各组,导致已完成的前组仍显示进行中并与后组同步增长。按最新主规范返修:整轮总耗时留在回合状态/小结一处;ToolCallGroup 只消费自身 calls 的阶段边界,显示“本组用时”,完成组停止 ticker,运行组与内部运行工具按 100ms 更新。删除不再使用的回合时间 props,更新原先锁定“各组相同总耗时”的错误测试,补前组已完成/后组运行、LLM 仍运行、并行、缺失/倒序边界与独立冻结回归。此为用户明确修正表现语义,不改变原生生命周期或真实发送时间修复。
已完成并经独立复核:组内每条原始时间边界先校验再聚合,防止单条倒序被其他工具或舍入掩盖。Edge 真实浏览器中前组固定 5.0 秒且无进行中,后组从 2.1 秒增长至 3.0 秒、完成后固定;整轮总耗时仅在回合状态/小结显示。合入主线 `b137f1759` 后 appSurface 463 项通过、17 项跳过,聊天/插件 45 项及发布构建脚本 27 项通过,Rust all-targets check 通过。全量中曾有一条精确用时断言依赖等待 IPC 后重新取 Date.now,已改为读取同身份用户气泡真实发送时间,单独回归通过,不放宽断言。
用户确认修复补审发现:保留同身份乐观消息的真实发送时间;live 为空时仍向明确的本轮用户条目保存终态边界。先补失败回归,再最小修改原 reducer/回合投影与必要的 App 接线,不新增持久化 schema 或平行回合状态源。取消后迟到终态只补可验证测试,不能仅凭时间大小改变现役事件顺序合同。独立复核后运行定向与集成验证。本次 fix 不自动授权新的远程写入。
补审返修中已复现 bootstrap 只有生命周期事件、用户消息经 history slice 回读且 live 恒为空的缺口。前端无法证明归属,因此批准原生在 turn.started/turn.completed 上透传现有用户条目 userItemId;沿用原事件与已有消息身份,不另造 turnId。前端按精确 itemId 补时间边界,移除按历史尾项或时间戳相等猜测用户归属的兜底;完成先于历史到达时,在历史回读后同样按该身份补齐。原生与 TypeScript 绑定同批更新并验证重放。
@@ -9,13 +9,13 @@
## 目标与边界
工具组显示整轮请求总耗时,单条显示自身调用耗时,运行中均以 100 毫秒粒度动态增长并保留一位小数。沿用 Thread Manager,不新增业务状态源或计时账本。保留既有画布功能和本地未提交锁文件;用户后续已授权更新 Issue/PR 与推送本分支,不合并 PR、不发布、不写飞书、不调用真实付费 Provider。
整轮总耗时只在回合状态/小结显示一次,工具组显示本组历时,单条显示自身调用耗时;运行中均以 100 毫秒粒度动态增长并保留一位小数,各自完成后固定。沿用 Thread Manager,不新增业务状态源或计时账本。保留既有画布功能和本地未提交锁文件;不自动合并 PR、发布、写飞书或调用真实付费 Provider。
## 验收
前置独立评审已完成:事件级时间与条目展示时间分离、缺失/倒序判据、章节结构及格式示例已明确。主 Agent 决定整轮起点以用户发送为优先、原生 turn.started 为缺失兜底,不采用会排除发送后准备时间的起点替换。
- [x] 总耗时从用户发送到回合终态,跨多个工具块共享边界,包含无工具运行时的 LLM 等待。
- [x] 总耗时从用户发送到回合终态,仅显示一次并包含无工具运行时的 LLM 等待;各工具组单独计时,前组完成后不得跟随后组增长(组件回归与 Edge 模拟事件验证)。
- [x] 工具运行中无事件亦增长,已完成工具与完成回合均冻结,失败/终止通过既有明确收口路径冻结。
- [x] 原生开始/完成时间不混用,事件重放不重新取当前时间。
- [x] 重复、迟到条目不抬高已冻结用时;缺失/倒序时间不伪造耗时。同秒新回合仍按事件顺序正常开始。