QinLuza/dsh-rollback-visual ↗★ 0
@dsh-external/dsh-client-ui-rollback-visual
Hot-pluggable rollback visualization for the dsh web GUI: turn-anchor badges injected into the trajectory view, click-to-rollback with confirmation, auto-activation of the derived child session
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:QinLuza/dsh-rollback-visual说明文档
阅读完整 README ↗dsh-rollback-visual
DeepSeek Harness Web GUI 的 /rollback 可视化插件 —— 实验存档。
状态:已放弃(2026-08-14)。数据层写对了,渲染层方向错了,详见下方吐槽。 保留此仓库只为:(1) 数据层代码可复用;(2) 提醒后人别走 DOM 注入这条路。
这是什么
把 rollback/checkpoint 锚点变成轨迹视图 turn 块尾部的 ⚓「回退点」徽标:点击 → 确认弹窗 → fork 子会话 → 自动切换过去。依赖后端三件套(timeline-rollback / rollback-basic / command-rollback,见 feat/timeline-rollback 分支)。
为什么放弃(吐槽区)
渲染层选错了路。做之前查了内置轨迹的源码,得出一个"封闭联合、插件注入不了节点"的结论,然后就绕去用 MutationObserver 监视 section[data-turn]、把徽标像钉子一样钉进 React 管的 DOM 里。
结果:
- React 一重渲染,钉的徽标就掉,只能靠 MutationObserver 再钉回去——钉了掉、掉了钉,永动机式内耗;
- 点击事件绑在随时可能被移除重建的 DOM 节点上,时灵时不灵(用户实测:点小点点没反应);
- CSS 类名和
data-turn属性全是官方私有实现,官方 UI 改一版就碎一地; - 结论:跟 React 抢 DOM 控制权,纯属自找苦吃。承认错误,此路不通。
做对的一半:数据层(src/client/anchors.ts)用 conversationEvents.register + conversationViews.register 把 checkpoint / 交易事件折成锚点快照——这是官方扩展点,用法规范,这部分可以直接复用。
大饼(未来某天如果有人想捡回来)
- 饼 1:原生节点。正确路线:改 trajectory 源码,在渲染器的 kind 分发链里加
rollback-anchor/rollback-bracket两个分支,锚点成为轨迹的一等公民(跟布局、折叠、tooltip 走),数据层照抄本仓库anchors.ts。 - 饼 2:已派生标记。被 fork 过的锚点显示「已派生」徽标(
rollback/start的boundarySeq就是证据,白给)。 - 饼 3:谱系面包屑。子会话顶部「← 从源会话 turn N 派生」(
sessionQuery.traceSession现成,fork 时parentSession已记录)。 - 饼 4:谱系树 + 双侧对比。多代派生可视化,源会话与子会话并排看。
- 。等官方 seam——在此之前只能弹窗里写大字"文件不会回退"。