前言¶
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:
sessions/<工作区>/<session-id>/— 会话正文与写锁storages/session_projcache/sessions/<id>.json— 派生缓存(标题等)storages/workspace.json—global.archivedSessionIds与各工作区的sessionIds引用- 子智能体会话 — 当运行环境提供
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 添加并重启。
典型用法¶
- 按方式 A 安装并重启 DSH。
- 在侧栏找到要清理的会话,右键 → 删除会话,在浏览器原生确认框中确认。
- 侧栏对应行应消失;若需排查,可看主机日志或对照 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