Skip to content

dsh-safe-shutdown

Verified

dsh-safe-shutdown · v0.5.2 · MIT · Web UI

Safe shutdown for DeepSeek Harness: preflight audit, rollback-area snapshots, crash recovery, and a settings page section.

Install

dsh plugin add dsh-safe-shutdown

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Creators

Readme

dsh-safe-shutdown

DeepSeek Harness 的安全关闭插件:点关闭前先做一次只读预检,有问题能自动修的当场修, 修不了的直接交给你正在对话的 AI;退出前把关键状态快照到回滚区,被强杀/崩溃后下次启动能自动还原。

入口

  • 标题栏按钮(原生窗口按钮左侧):长按可拖动,位置会被记住,双击复位
  • 设置 → 安全关闭:检测强度、快照保留、异常文件体检

关闭流程

  1. 预检(POST /check):只读检查 + 一次写入探针,不杀进程、不发模型请求
  2. 快照(POST /close):关键状态原子写入回滚区 ~/.dsh/dsh-safe-rollback/backups/
  3. 刷盘等待(quiesce,可配置)
  4. 状态校验:解析不了就中止关闭并列出问题文件,绝不扩大损坏
  5. 优雅退出:electron.app.quit() → taskkill(不带 /F)→ 超时才强杀 强杀前先把宿主状态落盘并记 exit=graceful,避免下次误报"上次没干净退出"

出问题怎么办

点「解决 N 个问题」:

  1. 自动修复:半写临时文件、残留锁、备份明文密钥、日志补行/脱敏、坏快照、崩溃计数、上次强杀确认
  2. 交给你正在对话的 AI:剩下的项连同完整报告发到当前会话(POST /ask-ai)
  3. 兜底:投递失败就自动复制到剪贴板

只有"有对话正在运行"这一项时,直接显示「结束对话并关闭」,不会当成文件问题。

崩溃后能回来

  • 启动时发现状态文件不可解析、且存在校验通过的快照 → 自动还原,坏文件另存 .broken-<时间>
  • 坏快照(空文件/半截 JSON)绝不使用
  • 手动还原:POST /rollback
  • 崩溃循环熔断:连续 3 次没干净退出 → 进入安全模式,暂停自动恢复

预检项(25 项)

基础:运行中的会话/后台任务、Key 配置与选择、代理端口、目录可写、Profile、临时文件、近期崩溃日志、 JSON 结构、.credentials.yaml 结构。

安全补充:上次退出是否干净、日志完整性、日志是否泄漏密钥、快照可回滚性、快照暴露面、 历史备份是否残留明文密钥、残留锁文件、磁盘空间、孤儿进程、系统崩溃转储、链接重定向、崩溃循环。

异常文件体检

GET /anomalies 只读扫描并返回「哪个文件 + 什么问题」:

  • keyring.json / keyring-state.json:解析失败、0 字节、带 BOM
  • .credentials.yaml:缺少 version/records/refs、存在未知顶层键
  • 半写残留 *.tmp-<pid>、残留锁文件
  • 最近 5 个快照中不可用的
  • 历史备份仍含明文 sk- 密钥
  • 日志末尾不完整

启动 4 秒后静默扫描一次,有 FAIL 就弹窗;设置页也可手动扫描。

设置

项 默认 说明
safetyLevel strict strict / relaxed / verify-only
quiesceMs 1500 关闭前等待刷盘毫秒数
maxSnapshots 10 快照保留份数
daysToKeepSnapshots 7 快照保留天数(启动时自动清理更早的)
cleanupOldSnapshots true 启动时自动清理
autoRollbackOnCrash true 崩溃后自动从快照恢复
forceCloseOnCorruptState false 状态已坏时是否仍强行关闭
logMaskSecrets true 日志中 sk- 密钥脱敏
sessionEndBudgetMs 1500 注销/关机时允许的最长处理时间

配置保存在 ~/.dsh/dsh-safe-shutdown/config.json,非法值自动钳制。

接口

方法 路径 用途
POST /check 预检
POST /close 快照 + 刷盘 + 校验 + 关闭
POST /session-end 注销/关机快速路径
POST /fix 按检查项 id 执行修复
POST /ask-ai 把问题发给你当前的 AI
POST /rollback 从快照还原
GET /anomalies 异常文件体检
GET/POST /config 读/写设置
GET /snapshots 快照列表与可恢复标记
POST /snapshots/prune 立即清理旧快照
GET /health 自检(路由表、目录、配置)
POST /diag 客户端自检上报
GET /last 上次预检报告

测试

node tests/test-feature-matrix.mjs   # 全功能 × 崩溃事件(35 项)
node tests/test-sim-safety.mjs       # 安全检测项(32 项)
node tests/test-safe-close.mjs       # 关闭流程回归(包含 UI 接线)
node tests/test-sim-sandbox.mjs      # 沙箱校验
node tests/test-support-dup-path.mjs # 路由注册严格模式回归
node tools/sim-check.mjs             # 对真实 DSH 目录跑一次只读预检