dsh-plugin-session-delete:为 DSH 侧栏补上「删除会话」

前言

DeepSeek Harness(DSH)的 Web UI 侧栏里,会话右键菜单长期只有置顶、重命名、分叉、归档等项。在 DSH 0.1.7-rc.2 及相近版本上,既没有「删除会话」入口,主机端会话控制器也没有 delete RPC;dsh-session-persistence-jsonl 的文档写明:不删除会话文件,日志在 root 下累积,直到外部移除,seam 无删除接口。

若你本地试过很多会话、派生缓存和子智能体分支,侧栏会越来越长,磁盘上的 sessions/ 与 storages/ 也会一直留着。社区插件 dsh-plugin-session-delete(维护者 PanChengN,分类:客户端)用官方 Slot 机制在菜单里加一行「删除会话」,并把「从磁盘真正删掉」做成主机 HTTP 端点。本文介绍其定位、删除范围、安装方式与使用注意;插件为非官方社区作品,与 DeepSeek 官方无关。

这是什么

dsh-plugin-session-delete 是一个 DSH bundle:客户端半向 sidebar.workspaces.session.menu.item 注册菜单行(order 500);主机半注册 POST /api/dsh-session-delete,按会话 id 清理 $DSH_HOME(默认 ~/.dsh)下的会话目录、派生缓存、工作区引用,并在条件允许时连带删除子智能体会话。

仓库根目录即插件目录(package.json 在根上),无需单独构建。当前资料中的版本为 1.0.2,许可 MIT © 2026 NIUpc。

核心功能

侧栏菜单

安装并重启 DSH 后,在工作区侧栏对某条会话右键,菜单中会多出一行 「删除会话」。确认后调用主机 API,删除成功则侧栏该行会更新消失(见下文「界面更新」)。

删除范围(一次操作清四处)

全部路径基于 $DSH_HOME:

  1. sessions/<工作区>/<session-id>/ — 会话正文与写锁
  2. storages/session_projcache/sessions/<id>.json — 派生缓存(标题等)
  3. storages/workspace.json — global.archivedSessionIds 与各工作区的 sessionIds 引用
  4. 子智能体会话 — 当运行环境提供 zlib.zstdDecompressSync 时,会删除 header.parentSession 指向被删会话的会话;不可用时跳过,响应里带 zstd: false

会话 id 的两种落盘形式(session-<uuid> 与裸 <uuid>)都会识别。

主机 API

删除由主机半处理,请求格式如下:

POST /api/dsh-session-delete
content-type: application/json

{ "sessionId": "session-xxxxxxxx-...." }

成功时响应示例(字段含义以仓库 README 为准):

{
  "ok": true,
  "sessionId": "session-....",
  "removedSessions": 1,
  "removedChildren": 0,
  "removedCaches": 1,
  "workspace": { "archived": 0, "groups": 1 },
  "emitted": 2,
  "zstd": true
}

常见失败:400 missing-session-id、400 invalid-json、405 method-not-allowed、500 <message>。

删除后界面如何更新

删除成功后,主机向客户端发 api-session/removed 事件;客户端 ClientSessions.handleSessionRemoved 从列表快照移除该 id,侧栏拼行时对无 summary 的 id 直接跳过,该行会立刻消失。若约 400ms 后 id 仍在快照里,客户端会退一步调用一次 sessions.refresh(),不会整页 location.reload()。

插件组成(便于核对源码)

文件 作用
package.json bundle 清单:dsh.bundle.patch + dsh.client
cordis.patch.yml 插入主机行 session-delete
index.js 主机半:注册 POST /api/dsh-session-delete
client.js 客户端半:注册侧栏菜单行
locale/{zh,en}.json 插件卡片标题与描述
icon.svg 插件卡片图标

包名 @local/dsh-bundle-session-delete,cordis 行 id 为 session-delete,HTTP 路由为 /api/dsh-session-delete。同一 profile 内不要装两份(会 ambiguous-install 或重复注册路由)。

安装与启用

安装有两种方式,差别在于 profile 是否绑定本地目录。

方式 A:Git 地址(推荐)

侧栏 Plugins → Add plugin,填写:

github:PanChengN/dsh-plugin-session-delete

也可填 https://github.com/PanChengN/dsh-plugin-session-delete。锁版本可加 #<tag>,例如:

github:PanChengN/dsh-plugin-session-delete#v1.0.1

点 Enable now,再重启 DeepSeek Harness(新 bundle 的浏览器模块需一次进程重启才会进入模块表)。装完后依赖记录在 profile 里,与任何本地 clone 目录无关,可随时删掉本地目录。

方式 B:本地路径(改插件源码时用)

在 Add plugin 里粘贴 clone 目录的绝对路径。CLI 对 desktop profile 会拒绝:

$ dsh plugin --profile desktop add <...>
error: profile "desktop" is managed exclusively by the Electron application

此种安装会在 profile 写成 link:<目录>,删目录会导致悬空引用;日常用请选方式 A。从 B 迁到 A:先在 Plugins Remove 路径安装的那份,再按方式 A 添加并重启。

典型用法

  1. 按方式 A 安装并重启 DSH。
  2. 在侧栏找到要清理的会话,右键 → 删除会话,在浏览器原生确认框中确认。
  3. 侧栏对应行应消失;若需排查,可看主机日志或对照 API 响应里的 removedSessions、removedCaches 等字段。

菜单确认框目前为浏览器原生 confirm(),不是 DSH 自带 overlay 风格;README 标明未硬性阻止删除「当前正在进行的对话」,仅确认文案提示。

卸载与误删目录

  • Git 地址安装:Plugins 页面 Remove 即可。
  • 本地路径安装:须先在 GUI Disable / Remove,再删 clone 目录;勿直接 rm -rf 已启用插件的目录。

若目录已被删而 profile 仍引用,启动可能异常,日志可能出现无法解析 @local/dsh-bundle-session-delete 的提示。仓库提供救援脚本(默认 dry-run,加 --apply 写入,改动前会备份):

python3 dsh-plugin-session-delete/scripts/fix-stale-install.py
python3 dsh-plugin-session-delete/scripts/fix-stale-install.py --apply

$DSH_HOME 不是 ~/.dsh 时用 --dsh-home /path。也可按 README「手工救援」编辑 package.json、cordis.yml 并删除悬空符号链接。

适用场景与注意

适合谁:长期在 DSH 里开大量会话、需要把磁盘与会话列表一起收干净,且接受非官方插件维护节奏的用户。

运行权限:插件与当前 DSH 进程同权,可读写 $DSH_HOME 下会话与存储;安装前请自行阅读仓库源码与 MIT 许可证,确认删除行为符合预期。

已知限制(来自 README):主机内存中的工作区成员关系要等重启才彻底清掉(侧栏表现通常已正常);无 zstd 时不会删子智能体会话链。

DSH 生态强调「一切皆插件」;插件目录页托管于 SkillHub 等社区站点,与 DeepSeek / 幻方无官方从属关系。

链接

  • 目录页:https://www.skillhub.cn/plugins/PanChengN/dsh-plugin-session-delete
  • 源码与完整说明:https://github.com/PanChengN/dsh-plugin-session-delete
羽毛球分组比赛记分
小程序二维码

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

小夜