前言¶
DeepSeek Harness 的会话数据默认持久化在本地(<DSH_HOME>/sessions,DSH_HOME 默认 ~/.dsh)。随着调试推进,同一个项目里往往会积攒几十个会话:有的是跑挂的半截任务,有的是不再需要的试错记录。内置的归档(Archive)只是把入口收起来,数据仍在磁盘上,侧边栏里也还能翻到。项目需要清理存储、或者某个会话涉及敏感内容需要彻底消失时,你得自己去 sessions/ 目录里定位、手工删目录,还要连带清理 projection-cache 记录——操作繁琐且容易漏掉派生数据。
下面介绍的 eyadagharire/dsh-plugin-delete-chat 就是针对这个痛点的插件:它给每个会话的「…」菜单加了一行 Delete chat,带确认对话框,确认后在该设备上永久删除这个会话及其存储数据。维护者是 EYADAGHARIRE,分类 admin-security,目录页与 GitHub 上目前星标为 0,属于较早但关注还不多的工具插件。
这是什么¶
一句话定位:给 DeepSeek Harness Web UI 的每个会话行菜单注入「Delete chat」动作的官方插件,删除动作只在 UI 里可用,agent 无法调用。
它解决两个具体问题:
- 删除是永久的,而不是归档式的隐藏;
- 删除一个会话前要先停掉里面还在跑的活,避免删完数据还在继续写入。
插件发布在 npm(dsh-plugin-delete-chat),源码在 GitHub,许可证 MIT,仓库里带中英双语 locale(locale/en.json、locale/zh.json),UI 文案跟随应用的语言设置。
核心功能¶
只描述 README 里写明的能力。
1、菜单位置与外观。在随应用自带的菜单项(Pin、Rename、Fork、Archive、Copy Session ID)之后插入一行 Delete chat,样式与自带的 Delete workspace 行完全一致:错误红的标签、同一个 IconTrashOutlineRegular 垃圾篓字形(路径相同、16×16 viewBox、1px 描边)、悬停时的危险色调填充。
2、确认对话框。使用宿主自己的 Modal 样式,明确提示「不可撤销」,提供 Cancel/Delete 两个按钮,支持 Escape 关闭和 focus trap。
3、先停活,再删数据。通过和自带归档流程相同的 activity seam 停掉会话内正在进行的工作:进行中的 turn、subagent、后台 job、定时提醒。
4、删除范围。删除后以下内容被永久移除:
<DSH_HOME>/sessions/--<project>--/<session-id>/下的会话日志目录;- 该会话对应的 projection-cache 派生记录。
5、侧边栏即时消失。删除完成后发布 api-session/removed 事件,行立即从侧边栏移除。
6、当前会话被删时自动切到新会话,不会留下指向已删会话的主视图。
7、权限边界。只有用户能从 UI 触发;agent 没有任何工具可以删会话;subagent 会话会被拒绝删除(它们随父会话一起被移除)。
8、workspace 文件不受影响。会话所在 workspace 里的工作区文件永远不会被碰。
安装与启用¶
安装前先看环境要求:DeepSeek Harness 0.2.1-rc.5 或更高版本(写在 engines.dsh 字段里)。
方式一:在 Harness UI 里安装(最直接)。
打开 Plugins → Add plugin,输入包名并确认:
dsh-plugin-delete-chat
宿主侧(Host)立即激活,连着的页面里就会出现 Delete chat 这一行。
方式二:从插件市场安装。
在 Plugins → Discover → Add index source 中添加下面这个索引源:
https://eyadagharire.github.io/dsh-plugin-delete-chat/index.json
然后安装 Delete chat 卡片。其他列出该包的插件市场索引源也可以用。
方式三:从源码安装。
把插件管理器指向包目录——插件管理器的 install_bundle 动作接受该目录的绝对路径。
典型用法¶
README 没有给出命令行示例,操作入口都在 UI 里:
1、在侧边栏点开某个会话的「…」菜单;
2、在随应用内置项之后找到红色的 Delete chat 行,点击;
3、在宿主风格的确认对话框里看清「不可撤销」提示;
4、点 Delete,或按 Escape / Cancel 放弃。
确认之后插件依次做三件事:停掉这个会话正在运行的工作(turn、subagent、后台 job、定时提醒),删除该会话的日志目录和 projection-cache 记录,然后通知 UI 移除侧边栏里这一行。如果删的是当前在主视图里打开的会话,界面会自动跳到一个新会话。
如果删的是 subagent 会话,操作会被拒绝——这类会话随父会话一起被移除,不需要单独删。
卸载方式:在 Settings → Plugins 里禁用或移除该 bundle。已删的会话保持删除状态,不会因为卸载插件而恢复。
适用场景与注意¶
适合这几类情况:
- 本地
sessions/目录被长期调试产生的大量会话占满,需要真正释放空间,而不是归档; - 某个会话承载了敏感内容,要求在本设备上不留残余;
- 开发自己的会话管理插件时,需要参考「先停活、再删数据、再通知 UI」这条完整链路。
注意事项:
1、删除不可撤销,这是设计目标而非缺陷。确认对话框里的提示就是这个含义,点 Delete 前请确认选的是要删的会话。
2、插件以当前 dsh 进程的权限运行。它直接读写 <DSH_HOME>/sessions,安装前建议先审阅源码和 MIT 许可证,确认来源可信再启用。
3、不要与「Delete workspace」混淆。两者的视觉样式刻意做了一致,但本插件只删会话存储,不会碰 workspace 里的文件;需要清工作区要选自带那个动作。
4、Host 侧依赖 connection、webServer、sessionPersistence 三个服务,Client 侧注册到 sidebar.workspaces.session.menu.item 和 shell.overlay 两个 slot。宿主版本低于 0.2.1-rc.5 时无法加载。
5、subagent 会话和 agent 工具调用都被排除在外。如果自动化脚本里想加删除逻辑,本插件不支持,行为上是明确的拒绝。
小结¶
这个插件的价值在于把一个原本要手工翻目录的运维动作,收进了会话菜单:删除范围明确(会话日志 + projection-cache,不碰 workspace 文件)、顺序明确(先停活再删)、权限明确(仅用户、仅 UI)。对 DSH「一切皆插件」的理念来说,它也示范了如何在不改动宿主的前提下,用标准的 slot 和 activity seam 扩展一次会话生命周期操作。社区目录页在 https://www.skillhub.cn/plugins/EYADAGHARIRE/dsh-plugin-delete-chat,源码与安装说明在 https://github.com/EYADAGHARIRE/dsh-plugin-delete-chat 。