dsh-session-purge:在侧栏已归档会话中彻底删除会话

前言

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 渲染进程可能禁用)。

一次删除会清理哪些地方

同一流程内处理三处:

  1. <DSH_HOME>/sessions/<workspace>/<session id>/ — 会话日志目录
  2. <DSH_HOME>/storages/session_projcache/sessions/<session id>.json — 投影缓存(标题等)
  3. <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;菜单项消失,其余不变。

典型用法

侧栏(已归档会话)

  1. 在侧栏打开已归档会话列表,对目标会话点 ⋯。
  2. 选「彻底删除」,再点一次「确认删除?」完成删除。

Agent 工具

  1. 调用 session_purge_list 核对 session id、归档与 live 状态。
  2. 对确认目标调用 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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye