dsh-session-clean
Verifieddsh-session-clean · v1.1.2 · MIT · Web UI
为 DeepSeek Harness 侧栏会话补上官方缺失的「删除会话」:运行中置灰、二次确认、真正删除(列表、登记与磁盘数据一并清除,做不到时如实告知)。Adds the missing per-session Delete action to the DeepSeek Harness sidebar.
Install
dsh plugin add dsh-session-clean Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
DeepSeekHarness Session Delete(删除会话)
DSH 有归档、重命名、分叉,却没有删除会话。这个插件在侧栏每个会话的 ⋯ 菜单里补上一项红色「删除会话」,点之前先弹确认框。删就是真删:不会给你留个"看起来删了、过两天又冒出来"的尾巴。

安装
前提:已安装 DeepSeek Harness 桌面版。
# 从 npm 安装(推荐)
dsh plugin --profile desktop add dsh-session-clean
# 从 GitHub 安装
dsh plugin --profile desktop add github:Ansellwan/DeepSeekHarness-Session-Delete
安装后重启 DSH(软件形态没有热刷新)。
升级(add 不会自动升版,须显式版本号):
dsh plugin --profile desktop add dsh-session-clean@<新版本号>
卸载:
dsh plugin --profile desktop remove dsh-session-clean
它能做什么
- 每个会话的
⋯菜单里多一项红色「删除会话」(排在置顶 / 重命名 / 分叉 / 归档之后) - 会话正在干活时(回复中,或等你审批 / 回答)自动变灰,点不动
- 已归档的会话一样能删——清库存最好用
- 删除前弹一次确认框,确认后才动手
删除到底做了什么
- 数据真的没了,删了找不回来(和「归档」不一样:归档只是收起来)
- 正开着的会话也能删:删完侧栏里立刻就没有它了,不用重启,刷新页面也不会回来
- 万一这次删不彻底,插件只会先把它藏起来,并且直接告诉你——不会假装已经删干净
会删掉什么,不会删什么
| ✅ 会删 | 这段对话本身,它的标题 / 大纲 / token 统计等缓存,工具输出过长时落盘的溢出文件,以及它在侧栏里的各种登记(分组、置顶、归档) |
| ❌ 不动 | ~/.dsh/attachments/ 里的附件原件——它们按内容存一份,多个会话可能共用同一份,按会话删会连累别的对话 |
| ❌ 不动 | 本插件自己的日志(~/.dsh/logs/session-delete.log,记录删过谁、删了哪些文件) |
| ❌ 不动 | 其他插件自己抄到各自数据库里的副本 |
另外,DSH 进程退出前,内存里还会留一个空的会话对象(官方没提供清理它的接口)。它不会再出现在任何列表里,重启后彻底消失。
常见问题
- 删了还能恢复吗? 不能。没有回收站,也没有撤销。
- 正在回复的会话能删吗? 不能,会被拦下并提示原因;等它停下来再删。
- 提示"先藏起来"是什么意思? 说明当前 DSH 版本不支持彻底移除,插件只能先把它隐藏,并如实告诉你;这一行会在重启 DSH 后彻底消失。插件宁可说清楚,也不会假装删成功。
- 删的时候正在看这个会话怎么办? 能删,但删完窗口会空着,点开别的会话即可。
- 会误删别的会话吗? 不会。只动这一个会话自己的文件。
- 删完要不要重启才生效? 不用。
- 会联网吗? 不会,没有任何网络请求、没有遥测。
权限与隐私
- 只在你自己的 DSH 进程里开一个仅本机可用的接口,并走 DSH 官方同一道连接信任检查,外部连不进来
- 只删这一个会话自己的文件:
~/.dsh/sessions/…、~/.dsh/storages/session_projcache/…,以及临时目录里属于它的溢出文件目录 - 无网络请求、无遥测、无外部服务
兼容性
| DeepSeek Harness | 桌面版 0.2.0-rc.2 实测 |
| Profile | desktop(其他单一 profile 理论通用) |
| Node | ≥ 18(DSH 运行时自带) |
| 能力分类 | 界面与体验 |
技术说明(普通用户可跳过)
- 客户端半
client.js:向官方 slot 列表sidebar.workspaces.session.menu.item注册order: 500的菜单行(与内置 pin=100 / rename=200 / fork=300 / archive=400 同一列表,官方支持的扩展点);忙碌状态来自宿主注入的useSessionStatus快照;确认弹窗挂在框架级shell.overlay槽位,菜单关闭不会连带销毁。 - 宿主半
index.js:注册私有路由/_dsh-session-clean,先重探会话活动,再按固定顺序删除——① 把仍驻留内存的会话从宿主活动存储中卸载 → ② 从工作区注册表移除(全局归档 / 置顶集 + 各工作区会话列表)→ ③ 清理落盘数据(会话目录、session_projcache投影缓存记录、spill 溢出目录)。注册表写入走它自己已打开的同一个存储域句柄,写即持久化并发变更事件,侧栏据此刷新。 - 卸载活会话用的是框架自己的拆除原语
SessionStore.liveEntryFor(session).detach()(即属主卸载时执行的同一段store.delete+session/disposed)。该事件被会话控制器转成api-session/removed,客户端据此真的把那一行删掉,同时关闭该会话的日志写入器,因此对话记录不会被重新落盘。liveEntryFor/detachEntered属于内部成员(不在生成的 API catalog 里),所以每一步都先做能力探测,失败就退化为「如实汇报的隐藏」,不做无声的假删除。 - 投影缓存为什么必须单独处理:它是「写回型自愈缓存」,且该域真正的表名是
sessions、键是完整会话 id。必须通过活动域删键(而不是只删文件),否则域内存里的那行还在,下一次检查点就会把文件重新写出来。 - 不修改
app.asar,不 patch 任何官方装载行,升级 DSH 不受影响。
许可证
MIT