前言¶
在 DeepSeek Harness(DSH)里长期跑智能体会积累大量会话。侧栏里点「彻底删除」时,日志目录会从磁盘上摘掉,工作区成员关系也会一并清掉;若事先没有导出或复制,对话记录就回不来了。手工备份又容易漏、批量删更难保证「每一个都先留副本」。
dsh-session-backup 是社区维护者 overspread 发布的用户插件,挂在你的 profile 里,不改动已安装的 harness 本体。它在确认彻底删除之前静默写入备份,为会话列表增加多选与批量备份/删除,并提供备份管理与一键恢复。从 0.2.0 起,彻底删除的菜单、确认框与级联删除也由插件自身实现,升级上游 harness 后仍保留同一套删除与备份行为。
这是什么¶
一句话:dsh-session-backup 在 Web GUI 中于删除会话前自动备份,支持批量选择与恢复,并以插件形式接管「彻底删除」链路。
- 维护者:overspread
- 分类(目录):记忆
- 许可证:MIT
- 当前包版本(npm):0.3.0
- 代码与说明:GitHub - overspread/dsh-session-backup
- 社区目录页:skillhub.cn/plugins/overspread/dsh-session-backup
这是个人社区插件,不由 DeepSeek 开发、背书或支持,也不是 DSH 发行版的一部分;读写范围限于你自己的 $DSH_HOME。
核心功能¶
下面按「在哪里看到」和「背后做什么」分开说明。
删除时自动备份¶
确认 彻底删除… 时,插件会先静默创建一份备份,界面上没有单独提示步骤。单个删除与批量删除共用同一套逻辑:一批会话里不会出现「没备份就被删掉」的情况。若备份路由返回真实错误(例如磁盘满),删除会被拒绝并弹出错误;只有「会话已无目录可供备份」或「profile 没挂 Host 面」等情形才会在无副本可复制时仍允许删除。
多选与批量备份/删除¶
- 侧边栏底部:多选
- 每一行:复选框
- 每个会话「…」菜单:选择 / 加入选择
空白占位行(临时「新建会话」行)和已归档行没有复选框,无法被选中。
备份管理与一键恢复¶
侧边栏底部点 备份 打开备份管理器,可一键恢复。恢复成功后该备份会被删除(恢复即取回);若原工作区已不存在,会话会出现在侧栏「未分组」下。若同 id 会话已再次存在,恢复返回 409,备份原样保留。
彻底删除(0.2.0 起由插件提供)¶
删除不再依赖内核的 deleteSession 包装;菜单行、确认对话框、活动闸门(409 升级)、停止 agent/jobs、清 schedule、删日志目录与缓存、发出 api-session/removed 等步骤均在插件内完成。附件为内容寻址 blob,删除会话时不删附件(符合 spec A5)。
备份存放位置¶
备份写在 profile 对应的 $DSH_HOME 下:
$DSH_HOME/backups/sessions/<sessionId>/<timestamp>-<title>/
├── session.v4.jsonl.zstd # 会话目录原样复制
├── …
└── backup.json # 清单:sessionId、title、createdAt、sourcePath、size
目录名为本地时间戳加当前标题(经文件系统净化,最长 48 字符;无标题则为 untitled)。session.lock 与 .DS_Store 不会进入备份;恢复时也不会把 backup.json 复制回会话目录。
HTTP API(Host /api)¶
浏览器通过相对路径访问,共五条 JSON 路由:
| 方法 | 路径 | 作用 |
|---|---|---|
GET |
/api/session.backup.list |
列出备份,最新在前 |
POST |
/api/session.backup.create |
为指定 sessionId 创建备份 |
POST |
/api/session.backup.delete |
带备份先行的彻底删除 |
POST |
/api/session.backup.restore |
按 path 恢复;成功通常消费备份 |
POST |
/api/session.backup.remove |
删除备份条目 |
路径校验保证请求无法逃出备份根目录。复制运行中的会话前,host 会先落盘日志(与 dsh-session-log-export 同类屏障),并在清单中标记无法稳定复制的副本(consistent: false)。
安装与启用¶
安装命令以 README 原文为准。任选一种来源:
从 npm:
dsh plugin --profile <你的 profile> add dsh-session-backup
从 GitHub(可用 tag 或 commit 固定版本):
dsh plugin --profile <你的 profile> add github:overspread/dsh-session-backup
从本地路径:
dsh plugin --profile <你的 profile> add /path/to/session-backup
dsh --profile <你的 profile> --dump-config # 应能看到 "# == dsh-session-backup" 这一层
然后重启 dsh web。host 会缓存插件解析出的客户端包路径,新增、移除或改指向 exports["./client"] 只有在全新启动后才会生效。
卸载:
dsh plugin --profile <name> remove dsh-session-backup
插件位于 ~/.dsh/profiles/<name>,升级 dsh 不会自动卸掉它。
典型用法¶
- 按上一节安装并重启 Web 服务。
- 日常删除:在会话行菜单选彻底删除,确认后自动备份再删;无需额外点击「备份」。
- 批量处理:侧栏点 多选,勾选多个会话,执行批量备份或批量删除(删除前仍会逐个备份)。
- 找回记录:侧栏 备份 → 选择条目 → 一键恢复;若原 workspace 的
cwd仍匹配,会话会重新挂回该工作区,否则进「未分组」。
适用场景与注意¶
适合经常在 DSH Web 里清理会话、又希望删除前默认留一份本地副本的开发者。也适合需要批量整理侧栏、偶尔从备份拉回某次对话的场景。
使用前请注意:
- 插件以当前
dsh进程权限读写磁盘;安装前请审阅源码与 MIT 许可证。 - 备份占用的空间与会话日志体积相关,需自行关注
$DSH_HOME/backups。 - peer 依赖
@deepseek-ai/cordis(package.json 中为~4.0.5-alpha.2),需与所用 harness 版本相容。 - 社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,DSH 生态强调「一切皆插件」,本包是其中一例。
结尾¶
dsh-session-backup 把「删前先备份、批量可选、一键恢复」和插件内实现的彻底删除绑在一起,降低误删会话日志的风险。进一步了解可看社区目录 overspread/dsh-session-backup 与仓库 GitHub。