前言¶
在 DSH 里做智能体开发时,常见的问题是:一条指令已经触发多轮修改,工作区代码和会话上下文一起往前走。如果某一步结果不符合预期,手动整理 git 历史、再单独处理会话分支,比较麻烦。
dsh-rollback-withdraw 针对这个点提供一条路径:在已完成回合边界上记录撤回点,点击消息旁的 undo 图标后,同时恢复工作区代码并把会话 fork 到该边界前。
下面介绍它的定位、能力、安装和需要注意的边界。
这是什么¶
dsh-rollback-withdraw 是 dyhyfjn 维护的 DSH web-profile 插件,许可证为 MIT。它提供 Trae-style withdraw 体验:在用户气泡下以及每个已完成回合的最后一条助手消息下提供撤回按钮,用于恢复工作区代码,并把会话回退到最后完成回合。
它适合已经在使用 DSH web profile、希望把“代码回滚 + 会话分叉”做成单步操作的使用者。运行环境要求 Node >= 20;当前 Windows 优先,使用 robocopy 和 PowerShell 5.1+,其他平台计划中。
核心功能¶
每条消息都有撤回入口¶
- 用户气泡下提供撤回按钮。
- 每个已完成回合的最后一条助手消息下也提供撤回按钮。
两种恢复后端自动选择¶
插件会在可用后端中选择:
- Git 模式:工作区为 git 仓库时,每回合结束提交为
rollback checkpoint <seq>;撤回使用git reset --hard和git clean,并保留忽略目录。 - 文件快照模式:每回合结束创建 hard-link 快照;未变化文件在快照间共享单份副本。
Git 模式相关命令含义如下:
git reset --hard
git clean
工作区级 Git 自动提交开关¶
默认配置项为:
{
"gitAutoCommit": true
}
当工作区为 git 仓库时,插件使用 git 提交作为撤回点。开关选择持久化在:
.dsh-rollback/config.json
自动加载与两步确认¶
- 插件作为 web-profile bundle 自动加载,客户端启动时生效,重启后无需重新激活。
- 撤回采用两步确认:第一次点击进入 arm 状态,第二次点击执行撤回。
安装与启用¶
安装命令:
dsh plugin --profile web add dsh-rollback-withdraw
该命令把插件添加到 DSH 的 web profile。插件集合或插件设置变化后,需要重启 web app,使插件设置生效;由于它作为 web-profile bundle 加载,客户端启动后会自动生效。
这里需要:
Node >= 20
当前插件以 Windows 为优先平台,依赖:
robocopy
PowerShell 5.1+
典型用法¶
- 正常与 agent 会话。每个已完成回合后,插件自动记录一个撤回点。
- 悬停消息并点击 undo 图标。第一次点击进入 confirm/arm,第二次点击执行。
- 工作区恢复后,UI 切换到 forked 且已回滚的会话,可以从该会话继续。
- 如果要切换 Git 自动提交开关,修改工作区级设置后重启 web app,使设置生效。
适用场景与注意¶
适用场景¶
- 在 Windows 上使用 DSH web profile。
- 工作区可以是 git 仓库,也可以是非 git 目录。
- 需要在本地、单人使用时快速回退代码和会话。
回滚边界¶
- fork 只能在回合边界切断;撤回助手回答也会回退其前面的用户问题。
- 会话第一条消息不能撤回。
- 插件安装前的消息没有快照。
- 源会话会保留在侧栏作为分支,没有自动归档。
文件删除与忽略路径¶
Git 模式会执行整个仓库的:
git reset --hard
git clean
忽略目录保留;未跟踪且非忽略文件会在回滚时删除。
以下路径不会被快照、提交或删除:
node_modules
.git
dist
build
安全边界¶
插件的客户端与宿主通过如下路由通信:
/rollback/rpc
该路由是 localhost 同源、未认证路由,假设个人本地使用。不要把 DSH harness 端口暴露到不可信网络。
插件会执行仓库级 git 命令并读写工作区文件,因此它会以当前 dsh 进程权限运行。安装前建议检查源码、许可证与实际工作区内容。
链接¶
- 社区目录页:
https://www.skillhub.cn/plugins/dyhyfjn/dsh-rollback-withdraw - GitHub:
https://github.com/dyhyfjn/dsh-rollback-withdraw