DSH 崩溃救援插件:撤销配置和插件代码改动,快照不碰密钥,一键进入安全模式,还带离线命令行和图形界面,DSH 起不来也能用。
62.6/100
综合分
193
GitHub 星标
2,315
npm 周下载
—/5
用户评分
数据截至 2026/11/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-undo-savepointnpm 源 · dsh-undo-savepoint 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-undo-savepoint @ 0.5.0
✓Node 引擎要求 >=20.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 15:37:33
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 19 处,展示前 17 条)
- 读取本地文件lib/index.js:1013
if (!existsSync(dir)) return; - 发起网络请求lib/client.js:295
return fetch(path, { - 执行外部命令来自配置/变量lib/core.mjs:308
execFile(windows ? (process.env.ComSpec ?? 'cmd.exe') : 'pnpm', windows ? ['/d', '/s', '/c', 'pnpm', ...args] : args, { - 执行外部命令来自配置/变量lib/core.mjs:1245
execFile(cmd, args, { timeout: PICK_TIMEOUT, windowsHide: true, encoding: 'utf8' }, (_err, stdout) => { - 执行外部命令固定命令lib/core.mjs:1271
execFile('powershell', ['-NoProfile', '-Command', script], { - 执行外部命令固定命令lib/core.mjs:1298
execFile('powershell', ['-NoProfile', '-Command', script], { - 执行外部命令固定命令lib/core.mjs:1570
execFile('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', `[Environment]::GetFolderPath('Desktop')`], { timeout: SHORTCUT_TOOL_TIMEOUT, - 执行外部命令固定命令lib/core.mjs:1602
execFile('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', cmd], { timeout: SHORTCUT_TOOL_TIMEOUT, windowsHide: true }, (err, stdout, st - 读取本地文件lib/i18n.mjs:9
readFileSync(fileURLToPath(new URL('./i18n/zh.json', import.meta.url)), 'utf8'), - 读取本地文件lib/i18n.mjs:12
readFileSync(fileURLToPath(new URL('./i18n/en.json', import.meta.url)), 'utf8'), - 读取本地文件lib/base.mjs:97
const j = JSON.parse(readFileSync(SPEC_PATH, 'utf8').replace(/^ FEFF/, '')); - 读取本地文件lib/base.mjs:366
const j = JSON.parse(readFileSync(SETTINGS_FILE, 'utf8').replace(/^ FEFF/, '')); - 读取本地文件lib/base.mjs:452
const has = (d) => existsSync(join(d, 'auto')) || existsSync(join(d, 'manual')); - 读取本地文件lib/health.mjs:279
try { return JSON.parse(readFileSync(join(dirname(target), '..', 'package.json'), 'utf8')).version; } catch { return undefined; } - 读取本地文件lib/health.mjs:284
const manifest = JSON.parse(readFileSync(join(TOOLS_DIR, 'dsh-patches.json'), 'utf8')); - 读取本地文件lib/health.mjs:287
const text = readFileSync(target, 'utf8'); - 执行外部命令来自配置/变量lib/health.mjs:351
execFile(cmd, args, { timeout: SHORTCUT_TOOL_TIMEOUT, windowsHide: true, encoding: 'utf8' }, (err, stdout) => {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
6 张 · 点击查看大图功能亮点
- 撤销配置改动
- 回退插件代码
- 一键安全模式
最近更新
在 GitHub 查看全部 →v0.5.1-canary.12026-10-30预发布
0.5.1 是社区问题修复与面板重做版,同时把「实例」从单一 home 扩成「端口 × profile」两维:局外先选端口再看该端口的 web 或 desktop 库,局内固定本端口、在 web 与 desktop 之间切。设置文件在局内面板、插件详细页与局外 WebUI 三处同源显示,桌面 profile 的安全模式改为二次确认后允许,诊断补上 profile 内混入宿主内部包这一面,两端界面按 DSH 原生视觉重做,DSH 0.2.1 线适配同版落地。同时修掉社区反馈的四组问题:宿主内部包检查的误报、窄窗口浮层被裁切、离线工具切 profile 后规格表指错根、对话头按钮在窄列溢出。
本版为 canary 预览版,只发 git tag 与 GitHub Release,不进 npm,不进 CHANGELOG。package.json 的 version 仍为 stable 值 0.5.0,本版靠 tag 区分。npm 上的 latest 不受影响。
· 亮点
· 端口 × profile 两维切库。实例配置变成 {name, port, home},profile 是独立第二维。局外先选端口再看该端口的 web 或 desktop 库,局内固定本端口、在 web 与 desktop 之间切;库根按 home × profile 解析,有分片读分片,只有历史平铺库就读平铺并标「共享库」。
· 两端界面同名同义重做。面板与局外 WebUI 都有「实例(端口) → Profile → 快照库」流程条,状态条以「·」分隔展示实例、profile、库、设置文件、敏感模式、快照数与安全模式;对比浮层统一成文件分组加红绿行加增删统计。
· 设置文件三处同源。局内面板、插件详细页与局外 WebUI 显示同一个 settingsFile;切库加载目标实例自己的设置,读取时热重读,保存后立刻重读,写回不丢 instances 与 current。
· 桌面安全模式可确认后使用。默认仍拒动;确认风险后允许写文件,动作前先落安全模式前置快照并备份 profile 包清单。
· 诊断能看见最隐蔽的那种启动失败,也不再误报正常装配。profile 里混进宿主内部包的副本时,此前所有检查都通过而 DSH 起不来;现在先按来源与版本判定:清单里声明的、链接指进宿主安装树的、与宿主同版本的都放行,只有版本不一致或版本读不到才报 error,并在详情里给出副本版本、宿主版本与版本来源。
· 新增
· 端口 × profile 实例模型。instances 每项可选 port,新增 currentProfile 记录上次选中的 profile;旧配置仍可读,缺 port 时只按 home 读库、不探测端口。
· 流程条与状态条。两端顶部三段式流程条加状态条,实例、端口、profile 与来源、库作用域、设置文件、敏感模式、快照数与占用、最近快照与安全模式一次看全。
· 共享库过滤与归属三态。每条快照按清单里的 profile 标归属,命中、非本 profile、归属未知三种状态分开处理;默认按所选 profile 过滤,另有「显示共享库全部」开关可看全部并逐条标注。
· 扫描本机实例。两端新增扫描接口,列出本机 DSH 端口、进程、可探测到的 profile 与快照数,只做建议、不自动写配置,超时或命令缺失返回空列表。
· 对比浮层重做。局内 diff 与局外同形:配置、插件、Profile 代码分组,左栏文件导航带增删行数,右栏逐行红绿,标题栏带快照 id,支持折叠、Esc 关闭与错误重试。
· 桌面 profile 安全模式二次确认。局内与局外走同一接口与同一确认语义,确认后允许写文件,未确认的请求仍在写盘前拒绝。
· 设置文件明示与热重读。三处界面显示同一 settingsFile,切库加载目标实例设置,读取与保存后都会重读。
· 诊断新增宿主内部包检查。profile 根的 node_modules/@deepseek-ai/ 下出现宿主内部包副本时按来源与版本分档:未声明且版本不一致(或版本读不到)才报 error,可修动作改名加 .dsh-undo-bak 后缀,不删除,同名隔离物已存在时加序号不覆盖;指向宿主安装树的链接与同版本副本一律不改名。
· 对话头按钮三档。新增 headerMode 设置,取值 auto、full、compact,默认 auto;auto 按会话头可用宽度自动切换,宽档显示文字、中档只留图标、窄档收成撤销加一个单入口菜单(撤销、重做、创建快照、对话撤回、快照管理)。
· 插件页显示自己的图标。包清单新增 icon 字段,DSH 0.2.1 起插件页与插件卡片显示与桌面快捷方式同款的插件图标。
· 桌面快捷方式有
v0.5.02026-10-20
0.5.0 是安全管家定位版。启动健康体检、崩溃自愈、DSH 启动守卫、升级护航、安全仪表盘与隐私报告同版落地,插件从等你调用变为主动监测、报告,必要时替你动手。DSH 起不来时,体检报告与守卫依然可达。
· 亮点
· 从撤销工具到安全管家。改设置自动存档仍是底座,上面多了主动体检、升级护航与崩溃救援。
· 启动 30 秒后自动体检。会话目录、快照覆盖、容错补丁与磁盘占用四项合成一份报告,有异常才告警。
· 崩两次就自愈。连续两次启动未完成时自动进入安全模式,动作前落存档、备份插件集,并给出退出路径。
· 升级前先买保险。检测到 DSH 版本变化自动打升级保险快照,升级后首次启动输出兼容体检与会话普查。
· 隐私与脱敏收口。配置、会话、补丁层与凭据层都有脱敏覆盖,隐私体检与快照审计只报计数和位置。
· 桌面端也能用。插件页原生配置入口、官方恢复弹窗的部分恢复搬回与 sanitize 痕迹识别同版落地;桌面 profile 上的安全模式改为拒动,避免改写宿主补丁。
· 新增
· 启动健康体检。启动 30 秒后自动检查会话目录、快照覆盖、容错补丁与磁盘占用,四项合成一份报告,正常时静默。
· 崩溃自愈。连续两次启动未完成时自动进入安全模式,阈值可调,设为 0 关闭;单次异常退出不触发。
· DSH 启动守卫。可选的守卫入口在 DSH 启动前做全量预检,启动输出滚动保留 10 份。
· DSH 升级护航。版本变化时先落升级保险快照,升级后首次启动出兼容体检与会话普查报告。
· WebUI 安全体检面板。四维数据一屏展示,异常逐条列出,并入快照治理建议与一键清理。
· 隐私体检与快照审计。doctor --privacy 与 audit-snapshots 只输出计数与位置,不携带内容。
· 局外体检入口。doctor --health 输出四维报告,undo_doctor 附带上次启动体检摘要。
· 桌面端恢复与配置入口。补丁条目可按最新备份搬回,官方 sanitize 痕迹可识别恢复,插件页可直接打开快照面板。
· 首次挂载声明与一键卸载。首次挂载询问一次并记录选择,新增 tools/uninstall.mjs 按 profile 清理残留。
· 安全管家设置项。启动体检、升级护航、崩溃自愈阈值与守卫入口都可独立配置。
· 修复
· 补丁条目去重不再吞配置列表(#47)。只有顶格条目与顶层 insert: 的直接子条目才算挂载条目,嵌套列表一律不登记。
· 挂载条目去重与摘除不再动用户配置。带非空 config 块的挂载位置整体豁免,摘除按条目为粒度,不再留下残缺结构。
· profile 探测补齐六层。显式配置、设置文件、命令行、宿主通道、环境变量、默认值依次解析,并写明来源。
· 桌面版官方 bundle 不再被误判。宿主托管的 bundle 改记健康档,同名包在非桌面 profile 上照旧硬失败。
· 桌面快捷方式解析不再挂起。PowerShell 调用加超时,超时回退到用户桌面目录。
· tools 解析在本地 link 安装下不再命中旧依赖。逐个锚点实际加载,失败就换下一个,避免旧 dsh-tools 缺 CallId 导出把插件整块拖垮。
· 升级注意
· PowerShell 局外工具进入弃用期。GUI 与 CLI 会显示弃用提示,0.6.0 移除;Node 局外 WebUI 是替代方案。
· DSH 版本下限为 0.2.0-rc.2。低于该版本的运行时会被拒绝加载,可用官方精确版本豁免,不改 package.json。
· 核心模块拆分零感知。core 保留门面与再导出,公开接口不变。
· 快照仓库、设置键、REST 路径与 15 个工具签名不变。可以直接覆盖安装。
· 桌面 profile 上 safe-mode on 会被拒绝。逃生路径是官方恢复弹窗的第三项,off 仍可执行。
· 升级前建议备份。桌面用户升级前先备份 profile 与补丁文件,出问题可用官方恢复弹窗或快照回退。
· 安装
方式 A,GitHub 钉 tag。
dsh plugin --profile web add github:lire1131/dsh-undo-savepoint#v0.5.0
桌面 profile 把 --profile 换成 desktop,tag 保持一致。
dsh plugin --profile desktop add github:lire1131/dsh-undo-savepoint#v0.5.0
方式 B,npm。
dsh plugin --profile web add dsh-undo-savepoint@0.5.0
方式 C,本地或离线安装。先把仓库切到 v0.5.
v0.5.0-canary.62026-10-19预发布
v0.5.0-canary.6 是 0.5.0 的第六个预览批次,收两件事。一是把快照面板挂进 DSH 0.2.1 的插件页,这个入口来自老吴(@Sheldon-Bacchus)的 PR #48。二是修掉补丁条目识别把配置内部列表当成挂载条目的缺陷(#47,复现与修法建议来自 @youran0faust),桌面端补丁里写着模型列表的用户,此前一次自动去重就可能丢掉整段配置。
本版为 canary 预览版。不进 npm,只发 Git tag 与 GitHub Release。npm 上的 latest 仍为 0.4.10,默认安装路径不受影响。package.json 的 version 仍为 0.4.9。
版本段已同步写入 CHANGELOG 与 CHANGELOG.en.md。
· 亮点
· 插件页也能打开快照面板。DSH 0.2.1 的插件页 bundle 配置区挂上同一套入口,设置页入口保留。
· 模型列表不会再被当成重复条目删掉。挂载条目判定收紧,配置内部的列表不再登记。
· 本地挂载与隔离实例能解析到工具包。tools 解析补上 DSH_HOME 两条锚点,不再直接抛错。
· 新增
· 插件页原生配置入口。plugins.bundle.config 按包名挂载本插件的面板,插件页与本插件设置页都能打开快照与恢复界面。0.2.0 及更早版本没有这个插槽,照旧只走设置页。dsh.client.inject 增 @deepseek-ai/dsh-client-ui-plugin-manager 一条,它只参与激活排序,不加载该包。
· 修复
· 补丁条目识别收紧(#47)。条目判定原先只看缩进与 - key: 的形状,provider 配置里的 models 列表被当成挂载条目登记,撞上同名条目就整段删除,有用户因此丢掉 175 行补丁内容和 84 条模型条目。现在只有顶格条目与顶层 insert: 之下的直接子条目才算挂载条目,嵌套列表一律不登记。
· 去重前按同一口径复核。undo_doctor 的 fix 只删除真条目,遇到嵌套列表跳过,并在报告里写明跳过了几条。
· 升级注意
· 本版不改变快照格式与清单结构,可直接覆盖安装。
· 已被误删的条目不会自动回来,需要时用修前快照或 cordis.patch.yml.dsh-undo-bak 找回。
· 插件页入口只在 DSH 0.2.1 及以后的插件页出现,0.2.0 及更早版本仍在设置页。
· 桌面端真机验收仍在进行中,本批尚未在桌面安装窗口实测,桌面用户建议继续由 0.4.10 承载日常使用。
· 本线尚未并入 2026-10-03 发布的稳定版 0.4.10,两条线在 0.5.0 定稿前并行。
· 安装
方式 A,GitHub 直装。
dsh plugin --profile web add github:lire1131/dsh-undo-savepoint#v0.5.0-canary.6
桌面 profile 把 --profile 换成 desktop,提交地址钉住同一个 tag。
dsh plugin --profile desktop add github:lire1131/dsh-undo-savepoint#v0.5.0-canary.6
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-undo-savepoint — DSH 安全管家(撤销 / 回退 / 崩溃自愈)
awesome · DSH plugin
为 DeepSeek Harness (DSH) 打造的安全管家:改设置自动存档,一键撤销 / 恢复 / 回退到任意版本;主动体检、升级护航、崩溃自愈;DSH 起不来时局外 WebUI / GUI / CLI 依然可用。
管家做事的方式是主动检查,有异常才说话,正常时安静。启动 30 秒后完成第一次体检;崩溃后给出可回退的最后正常快照;检测到 DSH 版本变化时先打升级保险快照再放行。
预览
| 会话头部:撤销 / 恢复 / 快照 / 对话撤回全部图标化 + 自动快照状态徽章(已存 24 份 · 3 小时前) |
| header |
| WebUI 快照面板:手动保存 / 撤销 / 恢复 / 清理 / 导出导入 / 安全模式,逐条「差异 / 回退到此版本 / 删除」 | DSH 设置「快照」独立栏目(自动保存 / 保留数量 / 敏感模式 / 插件白名单 / 定时快照) |
| panel | settings |
| 局外 WebUI:崩溃横幅 + 撤销 / 重做 / 安全模式 / 诊断 / 对话撤回 / 设置,不依赖 DSH 运行(快照对比与设置见局外工具一节) |
| gui |
安全管家
| 管家职责 | 对应能力 |
展开完整文档(README 剩余 1 节)
dsh-undo-savepoint — DSH 安全管家(撤销 / 回退 / 崩溃自愈)
awesome · DSH plugin
为 DeepSeek Harness (DSH) 打造的安全管家:改设置自动存档,一键撤销 / 恢复 / 回退到任意版本;主动体检、升级护航、崩溃自愈;DSH 起不来时局外 WebUI / GUI / CLI 依然可用。
管家做事的方式是主动检查,有异常才说话,正常时安静。启动 30 秒后完成第一次体检;崩溃后给出可回退的最后正常快照;检测到 DSH 版本变化时先打升级保险快照再放行。
预览
| 会话头部:撤销 / 恢复 / 快照 / 对话撤回全部图标化 + 自动快照状态徽章(已存 24 份 · 3 小时前) |
| header |
| WebUI 快照面板:手动保存 / 撤销 / 恢复 / 清理 / 导出导入 / 安全模式,逐条「差异 / 回退到此版本 / 删除」 | DSH 设置「快照」独立栏目(自动保存 / 保留数量 / 敏感模式 / 插件白名单 / 定时快照) |
| panel | settings |
| 局外 WebUI:崩溃横幅 + 撤销 / 重做 / 安全模式 / 诊断 / 对话撤回 / 设置,不依赖 DSH 运行(快照对比与设置见局外工具一节) |
| gui |
安全管家
| 管家职责 | 对应能力 |
| 启动健康体检 | 启动 30 秒后自动检查会话目录、容错补丁、快照覆盖与磁盘占用,有异常才告警 |
| 崩溃自愈 | DSH 完全起不来时一键安全模式,只保留本插件保证能启动;崩溃归因给出最后正常快照,一键回退 |
| 会话医生 | undo_scan 扫描会话文件,修复单帧布局违规与 seq 重叠两类损伤,修不了的隔离,绝不动原件 |
| 升级护航 | 检测到 DSH 版本变化自动打升级保险快照,升级后首次启动出兼容体检与会话普查报告 |
| 快照不泄密 | .env、凭据、home 级设置进快照自动脱敏,真实值只存本机 vault,导出包零泄露 |
| 容错补丁 | 对 DSH 历史版本的已知缺陷点做运行时兜底,官方修复后补丁自然失效,不影响功能 |
核心能力
| 能力 | 说明 |
| 配置 + 插件代码一键回滚 | 快照覆盖配置与用户插件代码树,改坏任何一处都能撤销(含 yield\* 类纯代码事故);支持 undo / redo / 回退任意版本,WebUI / 对话 / 离线 CLI 三入口 |
| 消息级撤销 | 按 AI 消息(或 60s 批次)记录工作区文件变更,一句话回滚「这条消息改了什么」(恢复原内容 / 删除新建文件);不依赖 git、不碰会话存储;「跟踪工作区目录」可在设置中配置(逗号 / 分号多选,非空时覆盖默认工作目录) |
| 局内对话撤回 | 对话头部「对话撤回」入口 + 消息级撤回面板,在 DSH 面板里即可撤回指定消息批次的文件改动 |
| 密钥脱敏 + 本机 vault | .env / 凭据进快照自动脱敏(结构保留),导出 ZIP 零泄露;真实值存本机 vault,本机回滚完整还原 |
| 一键安全模式 | DSH 完全起不来时,禁用除撤销系统外所有插件保证能启动;自动快照 + 备份配置(profile / home 双级 patch 一并备份恢复,并中和 dsh.profile.bundles 里会导致启动器硬校验失败的条目),一键退出;家目录被重建 / 换机时残留状态自动降级不激活 |
| 崩溃归因 | 上次异常退出时直接给出「最后正常快照」id + 一键回退按钮;按日志签名分类崩溃原因(session-corrupt / bundle-check / patch-tree),横幅给出对应处置建议 |
| 会话文件扫描修复 | undo_scan 扫描 <home>/sessions/**/session.jsonl.zstd:单帧布局违规(8/18 崩溃根因)与 synthetic-closer seq 重叠(撤销/快照还原后的中断恢复 seq 重叠)可一键修复(原件留 .bak + 隔离区副本);无法解码的只隔离不动;DSH 起不来时用 dsh-undo.ps1 scan [--fix] 离线处理(需 Node ≥22.15,Node 20 下降级为提示) |
| 快照时间线(Time Machine) | 快照按日期分组卡片化(备注 / 标签芯片,尊重 prefers-reduced-motion)+ 文件级 diff(新增 / 删除行高亮、目录树导航、逐文件浏览)+ 一键回滚 |
| 快照管理 | 备注 / 标签(undo_note,时间线可直接编辑)、定时快照(间隔制,自动建档 + 保留清理)、孤儿 blob GC(undo_compact,释放磁盘)、ZIP 导出 / 导入(可选 AES-256-GCM 加密,兼容 PowerShell 明文互操作) |
| 一键诊断与启动预检 undo_doctor | 存储侧:快照目录可写性、blob 完整性(缺失 / 孤儿)、设置文件健康、快照规模分布。启动侧预检那些会让 DSH 在挂载任何插件之前就崩掉的硬失败:profile 清单 BOM / JSON / 结构、dsh.profile.bundles 逐项可解析、patchReload 取值、link: junction 落点、patch 里重复的 loader id、上次启动未完成。输出 ok / warn / err 结构化报告,可修项标 [fixable],对话里 undo_doctor fix=true、离线 dsh-undo.ps1 doctor -Fix、局外 WebUI 诊断面板的「修复可修项」按钮都能一键修复(改前先落手动快照,修完自动复查) |
| 跨机迁移安全 | 恢复前自动预检缺失插件并明确提示;快照可一键导出 / 导入 ZIP 迁移(见 docs/migration.md) |
| 局外急救 | DSH 挂了也能用:WebUI + GUI 窗口 + CLI + 桌面快捷方式,时间线 / 回滚 / 对比 / 安全模式 / 诊断一应俱全 |
基础能力(键盘快捷键、对话指令、自动清理、双模式保存、可配置参数等)见下文与更新日志。
平台支持
v0.4.0 起核心抽取为纯 Node 零依赖模块(lib/core.mjs / lib/zip.mjs),外围按平台分发,Windows / macOS / Linux 三平台可用:
| 能力 | Windows | macOS | Linux |
| 配置 / 插件快照、撤销 / 重做 | ✅ | ✅ | ✅ |
| 局外 CLI / GUI | ✅(.bat / .ps1) | ✅(.command) | ✅(.sh) |
| 局外 WebUI(undo-server) | ✅ | ✅ | ✅ |
| 文件选择对话框 | PowerShell 原生 | osascript | zenity → kdialog(都没有则回退手输) |
| CI 回归 | windows-latest | macos-latest | ubuntu-latest |
CI 为三平台矩阵(windows/ubuntu/macos × node[20,22])。ZIP 导出 / 导入由纯 Node 零依赖 lib/zip.mjs 实现(deflate / 存储、CRC32、UTF-8),不引入运行时依赖,与 PowerShell 互操作已双向验证。
icon
Logo / 图标:生成提示词见 docs/logo-prompt.md;WebUI favicon 用内置 tools/webui/logo.svg。自定义图标:透明 PNG 存为 tools/webui/logo.png,运行 node tools/make-ico.mjs tools/webui/logo.png tools/webui/logo.ico 生成 .ico,下次创建快捷方式时自动启用(回退顺序 logo.ico → logo.png → 系统默认)。
崩溃急救速查(按场景选工具)
| 场景 | 操作 |
| 配置 / 插件被改坏 | 对话 / WebUI / CLI:undo 或 restore -Id <id> |
| 插件代码被改坏 | 同上(快照含插件代码树,一键还原) |
| 上次异常退出,不知回退到哪 | WebUI / GUI 横幅显示 last-good 快照,一键回退 |
| DSH 完全起不来 | 桌面「DSH撤销管理器」→ 安全模式按钮(或 CLI safe-mode -Label on)→ 重启 DSH 保证能启动 |
| 崩溃横幅提示会话损坏 | 对话 / CLI:undo_scan quarantine=true 修复(或离线 dsh-undo.ps1 scan --fix) |
| 恢复后可能缺插件(跨机) | 恢复报告预检提示;先装插件或进安全模式 |
| 配置「突然变了」 | CLI recent / 对话 undo_recent 查回滚日志 |
| 撤销涉及插件 / 挂载 | 报告提示「重启 DSH 后生效」 |
| 安全模式确认:一键禁用除本插件外的全部用户插件,保证 DSH 能启动,之后再逐个排查 |
| safemode |
安装
前置:已安装 DSH(@deepseek-ai/dsh)与 Node.js(≥20)。宿主模式运行于提供 tools / systemPrompt / webServer 服务的 profile(Web 型 profile 均满足); DSH 完全无法启动时改用局外 CLI / GUI,不依赖宿主。
方式 A:GitHub 直装(推荐)
安装 master 最新提交:
dsh plugin --profile web add github:lire1131/dsh-undo-savepoint#master
安装完成后重启 DSH 即生效(快照目录、参数等均可在设置中修改)。
方式 C:npm 源安装
dsh plugin --profile web add dsh-undo-savepoint
dsh plugin add 转发 pnpm 在 profile 目录完成安装,本包的 package.json 声明了 dsh.bundle.patch,安装后自动登记进 profile 的 bundle 清单,重启 DSH 即生效。
方式 B:本地源码 / 免发布
1. 把仓库放到本地插件目录(无中文路径更稳妥),例如 D:\dsh\plugins\dsh-undo-savepoint:
git clone https://github.com/lire1131/dsh-undo-savepoint.git D:\dsh\plugins\dsh-undo-savepoint
2. 建立 junction(Windows),让 DSH 的模块解析器通过包名 dsh-undo-savepoint 找到本地源码(host 插件与 WebUI client 插件都靠它):
mklink /J "<你的DSH安装>\node_modules\dsh-undo-savepoint" "D:\dsh\plugins\dsh-undo-savepoint"
DSH 从它自己的 node_modules 向上解析包名。默认安装位置是 C:\Users\<用户名>\node_modules(npm 安装在用户目录时);若用 npx 缓存运行,则对 npx 缓存目录下的 node_modules 建 junction。执行 npm root -g 或检查 DSH 启动报错路径即可确认。
3. 挂载到 profile 补丁层:编辑 <DSH_HOME>\profiles\web\cordis.patch.yml,追加:
- insert:
- id: dsh-undo-savepoint
name: dsh-undo-savepoint
4. 生效:保存即热加载(host 部分);刷新页面出现头部按钮与设置项;重启 DSH 后一切进入稳态(旧版扁平快照会自动迁移)。
依赖说明:host 插件通过 createRequire('<DSH安装根>/package.json') 加载 @deepseek-ai/dsh-tools。若 DSH 安装在其他位置,设置环境变量 DSH_ROOT=<DSH安装根> 即可,无需额外安装依赖。
支持范围(DSH 版本)
插件安装与 profile 启动时会按本包声明的 DSH 范围核对运行时(dsh --version 显示的那个)版本,不匹配即拒绝加载。package.json 的 engines.dsh 是一串并列范围,覆盖 0.1.x 与 0.2.x 的历次声明,末段为 >=0.2.1-0。
已验证:桌面版 DSH 0.2.0-rc.2(cordis 4.0.4 全 peer 树)与 0.2.1-rc.3(cordis 4.0.5 全 peer 树),两版都覆盖 web profile 与命令行、局外 WebUI、局外 CLI。工程内四道门禁零失败,覆盖 CLI 与 Web 端。
已验证:隔离 Electron 实例(desktop profile)的安装、GUI 工具回执、安全模式拒动与卸载。
若你的 DSH 版本不在声明范围内,启动会被判不兼容。此时不要改 package.json,改用官方的精确版本豁免,豁免写在 profile 自己的 compatibility.json 里,不动依赖清单与 patch 层:
dsh plugin --profile web version-exemptions
dsh plugin --profile web allow-version dsh-undo-savepoint@0.5.0 --dsh-version <运行时版本> --accept-risk
dsh plugin --profile web revoke-version dsh-undo-savepoint@0.5.0 --dsh-version <运行时版本>
第一条列出现有授权,第二条提交豁免,第三条撤销。豁免只授权加载,不授权依赖脚本;插件升级与 DSH 升级都不继承授权,每次都要重新确认。范围声明没有写死到最新版,是因为 DSH 各版仍可能有破坏性变动,新版本要实测过再扩范围。
桌面端
桌面版 DSH 从它自己的安装目录启动,走的是 desktop profile,命令把 web 换成 desktop 即可,add / remove / 版本豁免三命令用法一致。
dsh plugin --profile desktop add github:lire1131/dsh-undo-savepoint#master
前置:先启动一次桌面端完成初始化,再完全退出桌面客户端,然后敲上面的命令。桌面端在跑时 profile 目录被占用,写入会失败或半写。
官方恢复弹窗与插件。 0.2.0 桌面版遇到致命错误时会弹原生三按钮窗:退出、重启、禁用第三方插件并重启。第三个按钮会摘掉第三方插件在 bundles 挂载清单里的条目、把 profile patch 备份为 cordis.patch.yml.bak-<时间戳>,包本体保留。两点要记住:
1. 被该按钮禁用后不需要重装。包还在 profile 目录里,dependencies 也没动,把挂载声明恢复回去就复活。
2. profile patch 被挪走时,容错补丁(tolerate / isolate / selfheal)随之失效。 手动恢复 bundles 而漏掉 patch 的话,旧版会话可能踩已知坑。两条恢复路径任选:手动把 cordis.patch.yml.bak-<时间戳> 还原为 cordis.patch.yml 后重启,或重跑一次插件安装后处理,由它重建 bundles 与 patch。
safe-mode 限制。 桌面形态下 safe-mode 会被拒绝执行,逃生舱是官方恢复弹窗的第三个按钮。
卸载
标准卸载
两条命令,第二条负责清理残留:
dsh plugin remove dsh-undo-savepoint
node tools\uninstall.mjs
uninstall.mjs 默认温和清理:摘掉挂载声明、删掉 junction 与桌面快捷方式,保留快照库与设置(重装即可恢复历史快照)。确认不再需要历史快照时加 --purge:
node tools\uninstall.mjs --purge
常用参数:
| 参数 | 作用 |
| --purge | 连带删除 undo\(设置/状态)与 undo-snapshots\(快照库) |
| --yes | 跳过确认(非交互环境必须显式给出,防脚本误删) |
| --home <dir> | 覆盖 DSH 主目录 |
| --profile <n> | 只处理指定 profile(默认全部) |
| --json | 输出机器可读的清理计划 |
不带 --yes 时,命令先列出每一项将要删除的路径再询问;非交互环境(CI/管道)会拒绝执行,必须显式 --yes。
手动卸载对照表
确实要手动清理时,六处落盘位置与各自的正确删法:
| # | 落盘位置 | 正确删法 |
| 1 | <DSH安装根>\node_modules\dsh-undo-savepoint(或 profile 的 node_modules 下) | 删除链接本体,勿跟随。这是 junction,直接删除即可;在资源管理器里进入它再删内容,删的是你的插件源码 |
| 2 | <DSH_HOME>\profiles\<profile>\cordis.patch.yml 里的 id: dsh-undo-savepoint 条目 | 手工摘掉该 insert 条目(可整条删);文件变空可直接删文件 |
| 3 | <DSH_HOME>\profiles\<profile>\package.json 的 dsh.profile.bundles 数组 | 从数组里移除 dsh-undo-savepoint 一项 |
| 4 | <DSH_HOME>\undo\ | 设置与状态(含 settings.json)。确认要重置设置时才删 |
| 5 | <DSH_HOME>\undo-snapshots\ | 快照库。先确认不再需要回退再删 |
| 6 | 桌面 dsh-undo-savepoint.lnk(macOS .command / Linux .desktop) | 直接删除 |
Windows 长路径提示
Windows 用户目录较深或使用中文用户名时,快照文件的路径可能超出资源管理器(MAX_PATH 260)的删除上限,手删会报「文件名过长」或删到一半留下残骸。推荐用上面的 uninstall.mjs:它按固定路径逐项删除,不遍历快照内部结构,不受该限制。
使用(DSH 内)
- 撤销:头部「撤销」按钮 / Ctrl+Alt+Z / 对 AI 说「撤销上一步」。
- 恢复:「恢复」按钮 / Ctrl+Alt+Y(仅当撤销后没有新操作)。
- 手动保存:面板里「手动保存」/ 对 AI 说「保存快照」/ CLI snapshot。
- 回退到指定版本:面板里点快照行「回退到此版本」;或对 AI 说「回退到 \<id\>」;或 CLI restore -Id <id>。
- 删除快照:面板里点「删除」;或 CLI remove -Id <id>。
- 消息级撤销:对话头部「对话撤回」,选择消息批次撤回其文件改动。
- 自定义快捷键:设置 → 通用 → 撤销 / 恢复快捷键(点击输入框后按组合键,Backspace 清除)。
- 保存参数:设置 → 通用 → 快照设置(自动保存开关、防抖、保留数、两个目录、跟踪工作区目录,目录旁 📁 按钮可打开系统目录选择器)。其中「跟踪工作区目录」逗号 / 分号多选,非空时覆盖默认工作目录。
| 对话级撤回:按消息批次回滚该批改动(时间可回溯到任意一轮对话之后) |
| msgundo |
| 差异预览:文件级变更红删绿增,确认无误再回滚 | 编辑备注 / 标签:快照列表里直接改 |
| webdiff | note |
局外工具(DSH 挂了也能用)
局外 WebUI(推荐,全平台)
node tools/undo-server.mjs # 或双击 launch-undo.bat / .command / .sh / .desktop
拉起纯本地 127.0.0.1 服务器 + 内置网页:时间线 / 回滚 / 对比 / 安全模式 / 诊断,双击即用,不依赖 DSH。插件加载后还会自动在桌面创建「dsh-undo-savepoint」快捷方式,双击直接打开。诊断面板不只看得见问题,也能修:可修项会标「可修复」,点「修复可修项」即就地修好(修前自动落一个手动快照,修完立刻复查)。
| 桌面快捷方式:插件加载后自动创建,双击直接打开局外 WebUI |
| shortcut |
| 快照对比:文件列表 + 变更统计(+8 / -2)+ 行级差异高亮 | 局外设置:防抖 / 保留数量 / 脱敏模式 / 目录选择 / 桌面快捷方式 |
| guidiff | guisettings |
工具位置
局外工具(GUI 窗口 + 命令行)不装到桌面,而是随插件装在安装目录里:
| 安装方式 | 工具位置 |
| 方式 A:dsh plugin add | $DSH_HOME\profiles\web\node_modules\dsh-undo-savepoint\tools\(DSH_HOME 默认 %USERPROFILE%\.dsh) |
| 方式 B:clone + junction | 你 clone 的目录 ...\dsh-undo-savepoint\tools\ |
一键创建桌面快捷方式(点开查看 PowerShell 命令)
双击 tools\make-desktop-shortcut.bat(自动定位插件目录),桌面出现「DSH撤销管理器」图标;或把下面整段复制到 PowerShell 窗口回车:
$dshHome = if ($env:DSH_HOME) { $env:DSH_HOME } else { "$env:USERPROFILE\.dsh" }powershell
$d = @("$dshHome\profiles\web\node_modules\dsh-undo-savepoint", "$dshHome\profiles\node_modules\dsh-undo-savepoint", "$env:USERPROFILE\node_modules\dsh-undo-savepoint") | Where-Object { Test-Path (Join-Path $_ 'tools\dsh-undo-savepoint-gui.bat') } | Select-Object -First 1
if ($d) {
$w = New-Object -ComObject WScript.Shell
$s = $w.CreateShortcut((Join-Path ([Environment]::GetFolderPath('Desktop')) 'DSH撤销管理器.lnk'))
$s.TargetPath = Join-Path $d 'tools\dsh-undo-savepoint-gui.bat'
$s.WorkingDirectory = Join-Path $d 'tools'
$s.Save()
Write-Host "已创建桌面快捷方式:$($s.FullName)" } else { Write-Host '未找到插件目录,请先安装:dsh plugin --profile web add github:lire1131/dsh-undo-savepoint#master' }
只想打开工具目录看一眼: powershell $dshHome = if ($env:DSH_HOME) { $env:DSH_HOME } else { "$env:USERPROFILE\.dsh" } explorer "$dshHome\profiles\web\node_modules\dsh-undo-savepoint\tools"
命令行(Windows PowerShell)
进入仓库目录后: powershell
程序窗口(推荐):双击 tools\dsh-undo-savepoint-gui.bat,或:
powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo-savepoint-gui.ps1"
命令行
powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" list
powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" snapshot -Label "原因" powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" undo powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" undo -SyncDeps powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" redo powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" restore -Id <id> -Force powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" restore -Id <id> -Force -SyncDeps powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" remove -Id <id> powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" prune -KeepAuto 20
启动预检(DSH 起不来时也能用);-Fix 修复可修项
powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" doctor
powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-undo.ps1" doctor -Fix
安装插件(自动前后存档,失败自动回退)
powershell -NoProfile -ExecutionPolicy Bypass -File "tools\dsh-plugin.ps1" add <包名>
界面语言
DSH_UNDO_LANG=zh|en 强制指定;未设置时中文系统默认中文、否则英文。服务端输出、离线命令行 / GUI、WebUI 全部生效,词典源统一为 lib/i18n/{zh,en}.json。
常见事故:DSH 启动报 duplicate loader entry id 之类错误 → 打开「DSH撤销管理器」选中出问题前的快照 → 回退 → 重启 DSH。不用重装、不丢会话。
快照内容与存储
快照对象是 DSH 的启动关键配置:cordis.patch.yml、package.json、cordis.yml、pnpm-workspace.yaml、pnpm-lock.yaml(profile 下)+ cordis.patch.yml、settings.yaml、.env、.credentials.yaml($DSH_HOME 下,默认 ~/.dsh)。
恢复涉及 package.json / pnpm-lock.yaml 时,默认只报告 node_modules 可能不同步;需要真正重建依赖时加 -SyncDeps(离线命令行)、sync_deps: true(对话工具)或 syncDeps: true(REST),插件会执行 pnpm install --frozen-lockfile(无 lockfile 时普通 pnpm install)。安装失败不影响已经还原的配置文件。
| 库 | 默认路径(可在设置中修改) | 内容 |
| 手动库 | <快照根>\manual\ | 手动保存的快照(永不自动清理) |
| 自动库 | <快照根>\auto\ | 自动快照、启动基线、撤销后悔档(自动档保留最近 20 份) |
| 旧库(兼容) | <快照根>\ 根 | 旧版扁平布局,读取兼容,启动时自动迁移到新库 |
⚠️ 快照含 .env 等配置副本,可能含密钥——不要外传。
体积纪律:单个快照引用体积 ≤5MB(manifest 记录 totalBytes,undo_list 展示);插件代码树超限时只记清单 + 标记 [truncated] 告警,不丢任何数据,可手动快照 / 导出兜底。无外部插件时快照仅配置文件(KB 级);插件整体体积门禁 5MB(当前产物约 0.6MB)。
多 Profile 与自定义家目录
多 Profile(v0.3.3 起):插件从启动参数自动识别当前 profile(dsh --profile mine / --profile=mine;dsh web 回退为 web),并按当前 profile 工作:
- 配置目录:默认 $DSH_HOME/profiles/<当前 profile>(DSH_HOME 默认 ~/.dsh);
- 快照仓库:默认 <快照根>/<当前 profile>/{auto,manual}(按 profile 隔离);作用域目录不存在而旧版平铺目录存在时自动回退平铺,旧快照不会「隐身」;
- 归属标识:快照 manifest 记录 profile 字段,undo_list 显示当前 profile。
离线 CLI / GUI 看不到启动参数,通过环境变量 DSH_UNDO_PROFILE 或 settings 里的 profileName 指定(默认 web)。
自定义家目录(v0.3.5 起,issue #6):与官方启动器(@deepseek-ai/dsh-home-paths)解析完全一致——DSH_HOME 环境变量优先(空白视为未设置,支持 ~ / ~/ / ~\ 前缀),否则回退 <用户家目录>\.dsh。设置文件($DSH_HOME\undo\settings.json)、默认快照根($DSH_HOME\undo-snapshots)、profile 目录、home 根、插件发现路径全部基于它——第三方客户端不再出现「两套家分裂」,重启后自定义目录稳定保留。
显式覆盖始终优先:环境变量 DSH_UNDO_SETTINGS / DSH_UNDO_ROOT / DSH_UNDO_EXPORT,以及 config 里的 homeDir / profileDir / manualDir / autoDir / profileName。
REST API(WebUI 的后端)
| 端点 | 说明 |
| GET /api/undo/status | {canUndo, canRedo, total, bootAlert, safeModeActive, ...} |
| GET /api/undo/list | 快照列表(含 location: manual/auto/legacy) |
| GET /api/undo/diff | ?id=<id> 指定快照与当前的文件级结构化 diff |
| GET /api/undo/tree | 目录树 diff(按目录聚合,增 / 删 / 改着色) |
| GET /api/undo/doctor | 一键诊断(store 可写性 / blob 完整性 / settings / 规模)+ 启动预检(清单 BOM / bundles / junction / 重复 loader id / 上次启动未完成) |
| POST /api/undo/doctor/fix | 修复启动预检里的可修项(剥清单与 patch 的 BOM、按 id 去重 loader 条目、重建缺失或悬空的插件 junction),改前先落一个手动快照,返回修复清单 + 复查报告 |
| GET / POST /api/undo/settings | 读 / 写保存参数(自动保存、防抖、保留数、目录),POST 即时生效 |
| POST /api/undo/undo | 撤销上一步;可选 body {syncDeps: true} 按还原后的 lockfile 重建 node_modules |
| POST /api/undo/redo | 恢复;可选 body {syncDeps: true} |
| POST /api/undo/restore | body {id, syncDeps?} 回退到指定版本 |
| POST /api/undo/remove | body {id} 删除快照 |
| POST /api/undo/snapshot | body {reason} 手动保存 |
| POST /api/undo/note | 快照备注 / 标签 |
| POST /api/undo/messages / message | 消息级撤销:列出 / 撤回指定消息批次的文件改动 |
| POST /api/undo/prune | 立即执行过期快照清理 |
| POST /api/undo/export / import | 导出 / 导入全部快照 ZIP(纯 Node,兼容 PowerShell) |
| POST /api/undo/safe-mode | body {on} 进入 / 退出安全模式 |
| POST /api/undo/pick-dir / pick-file | 弹出系统目录 / 文件选择器(按平台分发),返回选中路径 |
| GET /api/undo/locale | 返回当前语言(DSH_UNDO_LANG 或 auto) |
设计要点
- 撤销语义:自动快照在变更之后生成,所以「恢复最新存档」是空操作;真实撤销 = 回退到与当前状态内容不同的最新快照;全部相同则明确提示「没有可撤销的变化」。
- 撤销不会撤销掉自己:恢复 cordis.patch.yml 后自动检查并重新写入 dsh-undo-savepoint 挂载条。
- 自动存档不误伤撤销:watcher 记录恢复操作写入的内容哈希,恢复动作自己的文件变化不会被自动存档(否则会挡住 redo);真实变更照常存档。
- 格式互通:Node 插件与 PowerShell 工具共用快照仓库与 manifest 格式;Windows PowerShell 5.1 与 PowerShell 7 均兼容。
开发与测试
- 依赖解析:host 插件通过 createRequire(<DSH安装根>/package.json) 加载 @deepseek-ai/dsh-tools(环境变量 DSH_ROOT 可覆盖),无需在仓库内安装依赖。
- 测试(不需要 DSH 运行,在仓库目录执行): bat
node tools\smoke-test.mjs :: 189 项逻辑测试(快照/撤销/重做/存储分流/无变化提示/消息级撤销/孤儿GC/zip互操)
node tools\e2e-watch.mjs :: 10 项真实时序回归(自动存档/撤销不误伤/重做)
node tools\check-size.mjs :: 体积门禁(<5MB)
node tools\check-version.mjs :: 版本号 semver 校验
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
lire1131/dsh-undo-savepoint
DSH 崩溃救援插件:撤销配置和插件代码改动,快照不碰密钥,一键进入安全模式,还带离线命令行和图形界面,DSH 起不来也能用。
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,173已汉化DeepSeek 客户端
74.4
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,197已汉化DSH
71.7
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,308已汉化DSH
71.3
智能体运行框架路由HarnessRouter/harnessrouter
智能体运行框架的统一接口。
★ 3,897已汉化DSH
71.2