Files
AgentLab/frontend
ThearchyHelios 5fdb55defe 修三处订阅缺陷:审批恢复后事件重复、订阅泄漏、取消误杀
UI 重构前置。这三条都是新界面会放大的问题——时间线要常驻显示事件流,
重复累积和泄漏在旧界面里藏得住,在新界面里就是明显的错。

## 审批恢复后事件重复收一遍

streamRun 里 `let lastSeq = 0` 是每次调用新建的闭包局部量,注释写着"重连时
带上已收到的最大 seq 所以不会重复"——那只在同一次调用内的断线重连成立。
审批放行会调 attachRun 重新订阅,lastSeq 归零,后端按 `seq > after` 把整条
历史再推一遍,而 applyEvent 是无条件 `[...events, event]`。

实测:一个带审批的运行中断时有 6 条事件,放行后共 15 条。修复前 attachRun
用 after=0 会把那 6 条再收一遍;现在传 max(seq)=6,只收 9 条新的。

把 after 提成 streamRun 的参数比在客户端做去重干净——省掉服务端的重发本身。

## chat store 的订阅泄漏

cancel 是 store 上的单值,下一轮 ask 直接覆盖,上一轮的 WebSocket 再也关不掉。
句柄下放到 turn 级,clear 时逐个关。

## stop() 误杀等待审批的历史轮次

原来把所有非终态 turn 一律标成"已取消"。正等人工介入的轮次是等着用户回来
处理的,不是卡住的——把它们标成已取消,用户回来就找不到那个审批了。
现在只停最后一轮,且跳过 waiting。

## ApprovalCard 解除对 studio store 的硬依赖

它被对话页和运行页复用,而"恢复后重新接上事件流"默认走 studio.attachRun——
在对话页用就是同时开两条订阅(chat 一条、studio 一条),两边各收一份事件。
加 onResolved 回调,谁用谁负责重新接流。
2026-09-17 16:16:14 +08:00
..