前言¶
DeepSeek Harness(DSH)对会话默认只提供归档与取消归档。会话日志是只追加的,持久化层没有对外暴露删除接口,工作区登记里也只是去掉注册项,磁盘上的会话目录和投影缓存往往还在。想从「已经处理完的会话堆」里真正清掉一条记录,单靠内置能力不够。
社区里另有同名 npm 包 dsh-session-purge,其 README 说明已归档会话在侧栏不可见,菜单够不着,需要先取消归档再删。本插件由 wwwyxsuper 维护(GitHub:wwwyxsuper/dsh-session-purge,分类 admin-security),思路相反:只在侧栏「已归档」会话的 ⋯ 菜单里提供「彻底删除」,对应你真正想清理的那一类列表。
这是什么¶
一句话:DSH 插件,在侧栏已归档会话的 ⋯ 菜单里永久删除会话(日志目录、投影缓存、工作区登记;二次确认;五道安全闸门)。
当前 package 版本为 0.2.0,MIT 许可证;与 DSH 0.2.0-rc.2 标注为 compatible,支持 web / desktop profile。
核心功能¶
宿主侧两个 Agent 工具¶
| 工具 | 作用 |
|---|---|
session_purge_list |
只读列出磁盘上所有会话:标题、大小、最后修改时间,以及 archived / live-agent / current-session 标记,便于删除前确认目标 |
session_purge_delete |
删除指定会话;必须 confirm: true,可选 allow_unarchived、allow_live、prune_registry |
客户端 UI(自 v0.2.0)¶
在侧栏会话行的 ⋯ 菜单中增加一行 彻底删除 / Delete permanently(纯增量挂载,replaceRisk: none),位于「取消归档」下方并带分隔线。仅对已归档(ARCHIVED)会话显示;是否归档由宿主通过 GET /api/dsh-session-purge/state 判定,客户端不猜测快照结构。
早期版本曾在行尾用 hover 按钮(sidebar.workspaces.session.row.action),因显得臃肿已移除,菜单项为唯一入口。
删除不可恢复,UI 采用两次点击:第一次将文案变为「确认删除?」,第二次才执行;不使用 window.confirm(Electron 渲染进程可能禁用)。
一次删除会清理哪些地方¶
同一流程内处理三处:
<DSH_HOME>/sessions/<workspace>/<session id>/— 会话日志目录<DSH_HOME>/storages/session_projcache/sessions/<session id>.json— 投影缓存(标题等)<DSH_HOME>/storages/workspace.json— 工作区登记中的 id(先备份为.bak-<stamp>,再原子替换)
并在 <DSH_HOME>/session-purge.log 写入审计行。
附件目录 $DSH_HOME/attachments/v1 为内容寻址且可能跨会话共享,故意不删除。
五道安全闸门¶
| # | 闸门 |
|---|---|
| 1 | UI 仅对已归档会话出现;工具侧未设 allow_unarchived: true 则拒绝删未归档会话 |
| 2 | 拒绝删除当前正在对话的会话(自毁) |
| 3 | 拒绝删除仍有 live agent 的会话(否则会被写回磁盘) |
| 4 | 删除后复查文件是否「复活」(resurrected),并明确提示 |
| 5 | UI 二次确认;HTTP 删除路由要求页面注入的 per-boot token |
仅供本插件客户端使用的 HTTP 路由¶
| 方法 | 路径 | 含义 |
|---|---|---|
GET |
/api/dsh-session-purge/state |
返回 { ok, archived: [sessionId…] } |
POST |
/api/dsh-session-purge/delete |
body { sessionId, confirm: true } |
均需请求头 x-dsh-session-purge(静态标记 ui 亦可)。自定义头会触发 CORS 预检,路由不批准预检,跨源页面无法调用;路由挂在 DSH 本机 loopback Web 服务上,不额外开端口。
安装与启用¶
插件以 file: 依赖 安装到 profile(复制而非符号链接)。改源码后必须重新复制并重启 DSH;客户端半部分不支持热重载。
资料中的安装/更新示例(Windows PowerShell):
$src = '<this repo>'
$dst = "$env:USERPROFILE\.dsh\profiles\<profile>\node_modules\dsh-session-purge"
robocopy $src $dst /MIR /XD node_modules
# then restart DSH
将 <this repo> 换成本地克隆或解压后的插件目录,<profile> 换成你的 profile 名;完成后重启 DSH。
卸载:从 profile 的 package.json dependencies 和 dsh.profile.bundles 中移除 dsh-session-purge,删除 node_modules\dsh-session-purge,重启 DSH;菜单项消失,其余不变。
典型用法¶
侧栏(已归档会话)
- 在侧栏打开已归档会话列表,对目标会话点 ⋯。
- 选「彻底删除」,再点一次「确认删除?」完成删除。
Agent 工具
- 调用
session_purge_list核对 session id、归档与 live 状态。 - 对确认目标调用
session_purge_delete,传入confirm: true;仅在明确需要时加上allow_unarchived、allow_live或prune_registry。
适用场景与注意¶
- 适合:需要在「已归档」列表里直接做不可逆清理、同时希望 Agent 也能按 id 删除的 DSH 用户。
- 权限:插件以当前 DSH 进程权限读写
$DSH_HOME;安装前请自行审阅 GitHub 源码 与 MIT 许可证。 - 不可恢复:被删会话无法从插件侧恢复;登记文件有
.bak-<stamp>备份,但会话目录与投影缓存删除后仍需谨慎操作。 - 生态:DSH 社区插件目录在 SkillHub 等独立站点展示,与 DeepSeek / 幻方无官方从属关系;安装方式以 README 为准,勿与 npm 上他人维护的同名包混用预期(侧栏可见性策略不同)。
结尾¶
dsh-session-purge 补上了 DSH 归档之外「从已归档侧栏就地彻底删会话」这一缺口,并在工具与 UI 两侧都加了确认与多重闸门。目录页:https://www.skillhub.cn/plugins/wwwyxsuper/dsh-session-purge;源码与说明:https://github.com/wwwyxsuper/dsh-session-purge。