dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
给 DeepSeek Harness 的每一次 Agent 改动装一根倒车杆。
DSH 已经能告诉你「这一轮改了哪些文件」。时光机补上后半句:把文件退回去。
它用一套私有影子 Git 仓库,在每个改变文件的轮次自动留下还原点;可以预览恢复影响、选择覆盖或精确恢复;恢复前自动再存一个安全点,恢复失败自动回滚;连回滚失败也留下可恢复的日志。
对话不倒退,文件可以。
/rewind 命令time_machine 工具Agent 能连续执行几十次工具调用、改几十个文件。真正让人不敢放开手的不是「改错」,而是改错之后只能手动收拾:
reset,但 Agent 的改动横跨文件、混合了用户自己的编辑,还经常发生在你离开键盘的时候;时光机的立场很直接:Agent 的每一次改动都应该是可逆的。不是靠模型自觉,而是靠宿主侧一套独立、持久、可验证的快照与恢复机制。
它把协作契约从「信任 Agent,事后检查」变成「让 Agent 放手做,随时可退」。
$DSH_HOME/.dsh-time-machine,重启 DSH 后仍然可选。dsh-time-machine recover 再回滚。/rewind 命令、time_machine 工具、CLI、同源 HTTP API。.gitignore 规则,但不触碰子目录外的文件。cd path/to/dsh-time-machine
# 预览要改什么,不写盘
node scripts/install.mjs
# 确认后执行
node scripts/install.mjs --apply脚本会:
/node_modules/dsh-time-machine;package.json 的 dependencies 写入 file:;dsh-time-machine 追加到 dsh.profile.bundles;$DSH_HOME/dsh-time-machine-backup-/,并生成 restore.ps1。完全退出并重启 DSH 后宿主侧生效。客户端产物改完后可以只同步浏览器半边:
node scripts/install.mjs --sync-client --apply已安装副本是快照;改源码后需要重新安装(或只同步客户端)。scripts/install.mjs --status 会显示本地/已装版本与清单状态。>= 0.2.0-rc.2;PATH 上有可用的 git(git --version 能运行);没有 git 时插件仍会加载并给出明确错误,不会拖垮宿主。
在任意顶层会话的标题栏右侧会出现「时光机」按钮:
预览会展示写入/删除数量、行数、示例文件与警告;确认后执行。
面板会显示最近 50 个还原点;更多可用 CLI 查看。
/rewind 命令命令直接作用于当前会话,不产生模型消息:
/rewind 列出最近 10 个还原点
/rewind snapshot [备注] 立即创建还原点
/rewind restore <id> 覆盖恢复(不删除新增文件)
/rewind restore <id> --exact 精确恢复(同时删除新增文件)
/rewind recover [planId] 查看/执行未完成恢复的回滚恢复在会话空闲时执行;恢复前的安全点、恢复后的快照 id 会显示在结果里。命令输出只给用户看,不会自动注入模型上下文;继续工作前请让 Agent 重新读取已回滚的文件。
time_machine 工具模型可调用:
{"action": "list"}
{"action": "snapshot", "label": "before refactor"}
{"action": "restore", "checkpointId": "20261025-142105-c3d4"}restore,不得自行决定;CLI 与 DSH 使用同一个数据目录:
node lib/bin.js status
node lib/bin.js list --workspace D:/Projects/some-project
node lib/bin.js snapshot --workspace D:/Projects/some-project --label "before refactor"
node lib/bin.js restore --workspace D:/Projects/some-project --checkpoint 20261025-142105-c3d4 --mode overwrite
node lib/bin.js restore --workspace D:/Projects/some-project --checkpoint 20261025-142105-c3d4 --mode exact --yes
node lib/bin.js recover
node lib/bin.js gc --workspace D:/Projects/some-project
node lib/bin.js doctorrestore 默认只打印计划;加 --yes 才执行。recover 无参数时列出未完成恢复日志;--workspace --plan --yes 执行回滚。doctor 检查工作区记录、缺失快照对象、恢复日志、对象体积与陈旧临时索引。DSH_TIME_MACHINE_DATA_DIR;关闭自动记录:DSH_TIME_MACHINE_DISABLE=1。面板使用的同源接口(只接受回环请求;写操作带进程内控制密钥):
方法 · 路径 · 作用 GET · /plugins/dsh-time-machine/status?sessionId= · 工作区、还原点、忙碌状态、配置、控制密钥 POST · /plugins/dsh-time-machine/checkpoint · 手动还原点 POST · /plugins/dsh-time-machine/plan · 计算恢复影响,返回短期计划 id POST · /plugins/dsh-time-machine/restore · 执行计划(需要确认短语 RESTORE) POST · /plugins/dsh-time-machine/config · 修改全局配置
session/turn/start ──► 影子仓库快照(轮前)
│
├── tools/pre-execute 等快照完成,防止“快照追着工具跑”
│
session/agent/turn-stopping ──► 影子仓库快照(轮后)
│
└── 只在内容变化时落一条 checkpoint(Git tree + 独立 commit + ref)
恢复请求 ──► 快照当前状态 ──► 与目标 tree 比较 ──► 预览
└── 确认 ──► 安全点 ──► 写文件/删文件 ──► 复核 ──► 恢复后快照
└── 失败 ──► 按安全点回滚 ──► 再复核
└── 回滚也失败 ──► 保留 journal每个会话工作目录对应 $DSH_HOME/.dsh-time-machine/repos//repo:
GIT_DIR 指向影子仓库、GIT_WORK_TREE 指向快照根目录;refs/time-machine/*;info/attributes 关闭所有文本/clean filter 转换,blob 保留原始字节(CRLF 不会被改写);info/exclude 始终排除 .git/、.dsh-time-machine/,外加用户配置的规则;工作区自己的 .gitignore 仍然生效;git gc 真正回收;展示用的前后关系在元数据里;快照范围:会话工作目录。若它位于 Git 仓库内,快照根取仓库根、pathspec 限定为工作目录子树,从而继承仓库根的 .gitignore,但不会纳入工作目录外的文件。
turn/start → 轮前快照;agent/turn-stopping → 轮后快照;turn/end → 兜底(被中止/失败的轮次也能留下状态);tools/pre-execute 会等待轮前快照完成,防止工具写入早于基线;恢复开始前会写 journals/.json,记录安全点、目标、模式与所有涉及路径。
node lib/bin.js recover
# 列出日志后
node lib/bin.js recover --workspace <dir> --plan <planId> --yes
# 或
/rewind recover <planId>recover 会把日志涉及的路径恢复到安全点并重新校验;幂等,可重复执行。
配置保存在 $DSH_HOME/.dsh-time-machine/settings.json(或 DSH_TIME_MACHINE_DATA_DIR 下的同名文件),面板设置页可改:
字段 · 默认 · 说明 auto · true · 总开关;关闭后不自动记录,手动/恢复仍可用 beforeTurn · true · 轮前快照 afterTurn · true · 轮后快照 maxCheckpoints · 120 · 每个工作区保留数量(最少 10,最多 1000) maxAgeDays · 14 · 超过天数的旧还原点进入清理 timeoutMs · 30000 · 单条快照 Git 命令超时 restoreTimeoutMs · 120000 · 恢复/回滚命令超时 maxRestoreFileBytes · 67108864 · 单文件恢复上限;超过则拒绝该次计划 autoGc · true · 清理旧引用后偶尔运行 git gc 回收对象 excludes · .git/, node_modules/, .dsh-time-machine/ · 额外 gitignore 规则
环境变量:
DSH_TIME_MACHINE_DATA_DIR:覆盖数据目录(CLI 与宿主都读);DSH_TIME_MACHINE_DISABLE:非空时关闭自动记录(手动/恢复仍可用)。时光机的目标是可逆,不是「零风险」。请阅读:
.gitignore 与 excludes 命中的文件永远不会被记录或恢复;它们的当前内容不会被修改。.git/ 与插件数据目录始终排在用户规则之后,! 否定规则也无法把它们重新纳入;DSH_TIME_MACHINE_DATA_DIR 指到工作区内时,该目录会按真实相对路径自动排除,避免影子仓库快照自己。autoGc 会回收对象。正在使用的计划/日志受到保护。doctor 会提示缺失)。git init、移动或改变仓库层级,快照范围随之变化;工作区 key 包含快照范围,因此会开启新时间线,旧数据保留但不复用。$DSH_HOME/.dsh-time-machine/
├── settings.json # 全局配置
├── workspaces/<key>.json # 每个工作区的还原点元数据
├── repos/<key>/
│ ├── repo/ # 影子 Git 仓库
│ ├── binding.json # 工作区位置
│ ├── empty.gitconfig # 禁用全局配置的锚点
│ ├── journals/ # 未完成恢复日志
│ └── tmp/ # 临时 index$DSH_HOME/.dsh-time-machine;node scripts/install.mjs --uninstall # 预览
node scripts/install.mjs --uninstall --apply # 执行或运行安装时生成的 restore.ps1 回到安装前状态。完全退出并重启 DSH 后生效。数据目录保留。
设计取舍见 docs/DESIGN.md;0.2.0 的审计与回归记录见 docs/AUDIT-0.2.0.md,0.1.0 的真实宿主端到端验证见 docs/VERIFICATION.md。
node scripts/build.mjs # 构建 client/client.js
node --test tests/*.test.mjs # 引擎 + Host + 客户端测试
node lib/bin.js doctor
node verify/preview.mjs # 生成离线视觉验收 HTML(verify/shots)
node verify/capture.mjs # 生成文档截图(docs/images)测试覆盖: