前言¶
在 DeepSeek Harness(DSH)里,侧边栏的会话列表会随使用变长。原厂对会话的处理是「可以归档,但不提供删除」——归档只是把行藏起来,<DSH home>/sessions/ 下的日志目录、投影缓存、各工作区 workspace.json 里的 sessionIds 以及全局归档/置顶列表都还在。对需要彻底清掉试验性会话、错开项目或隐私敏感记录的智能体开发者来说,只归档无法达到「磁盘上也不留痕」的目的。dsh-session-delete 在会话行的右键菜单里补上 删除会话,经确认后做永久性清理,并同步摘掉运行时内存里的会话条目,避免只剩列表里的「幽灵会话」。
这是什么¶
dsh-session-delete 是社区维护的 DSH 客户端插件(维护者:MrKillerBad,仓库 MrKillerBad/dsh-session-delete)。一句话定位:在侧边栏会话的上下文菜单中增加「永久删除」动作。当前 package 版本为 1.1.0,许可证 MIT。插件通过 Cordis patch 同时加载 Host 半(index.js)与浏览半(client.js),依赖原厂会话控制器、工作区与上下文菜单等模块注入。
核心功能¶
菜单与交互¶
在侧边栏任意会话行上右键,选择 删除会话;在确认框中点 永久删除。菜单项排在「归档会话」之后,带分隔线,并使用危险色提示。删除工作区本身仍使用原厂「删除工作区」(右键工作区行),不在本插件范围内。
一次删除会清理的内容¶
| 目标 | 位置 |
|---|---|
| 会话日志目录 | <DSH home>/sessions/<project key>/<session id>/ |
| 投影缓存缩略图 | <DSH home>/storages/session_projcache/sessions/<session id>.json |
| 工作区记录里的 id | 各 workspace.json 的 sessionIds |
| 归档 / 置顶列表 | global.archivedSessionIds、global.pinnedSessionIds |
| 运行时寄存 | Host 的 sessions store 与 agents store |
工作区目录及其中的文件不会被删除。「未分组」是 UI 渲染时的伪分组,没有单独可删对象;要清空它,需在「未分组」下逐个删除会话,本插件对这些会话同样有效。
为何必须动运行时 store¶
会话一旦被侧边栏打开过,dsh-api-session-controller 会 resume 进内存,sessionQuery.listSessions() 会把 ctx.sessions.list() 里的活会话无条件并进列表。若只删磁盘文件,会出现「磁盘上没有、侧边栏还在」的幽灵会话,再删会报「找不到该会话的存储记录」。因此删除前须先调用 detachEntered,从两个 store 摘掉条目,顺序为先 Agent 后 Session(与 dsh-agent-loop 的 teardown 一致)。
会拒绝删除的情况¶
- 会话正在跑一轮对话(
agent.status === 'running'):写作句柄仍往日志追加,需等轮次结束再删。 - 会话 id 对应目录名不符合
session-<uuid>/<uuid>形状:直接中止,不做路径猜测。
「仅被侧边栏打开过一次、轮次之间写作句柄已关闭」不算运行中,可以正常删除。
安装与启用¶
README 给出的安装示例是在当前 profile(desktop)中以本地目录软链方式安装 bundle(路径需换成你本机上的插件目录):
plugin_manager install_bundle target = D:\B\DeepSeekWork\deepseek-all\dsh-session-delete
修改 Host 半 index.js 后须重启 Host:通过 plugin_manager set_plugin,target 使用 loader entryId include:session-delete,先设 enabled:false 再 enabled:true。仅改 client.js 时刷新页面即可。
社区目录页:skillhub.cn/plugins/MrKillerBad/dsh-session-delete。DSH 生态主张「一切皆插件」;该目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系。安装前请自行查看仓库源码与 MIT 许可证;插件以当前 DSH 进程权限读写本机路径与调用 Host API。
典型用法¶
- 在 DSH 桌面壳侧边栏找到要清除的会话(含归档后仍占存储的会话,或落在「未分组」下的会话)。
- 右键该行 → 删除会话 → 确认框点 永久删除。
- 若会话正在对话中,先停止或等待当前轮结束,再重复上述步骤。
- 删除成功后,客户端会先
handleSessionRemoved摘掉该行,再refresh()与服务端对账。
实现要点(供排查问题)¶
- Host 半经
webServer前缀路由/session-delete/api暴露删除;会话目录路径来自sessionPersistence.stat()的location.path上溯两级,而非按cwd猜测。 - 浏览半通过
contextMenus贡献target: "session"、order: 700的菜单项,确认框挂在shell.overlay。 - 因原厂
connection.requestRejection()对dsh-app://app/界面不放行同源 POST,本插件用请求头x-dsh-session-delete: 1作围栏;该路由不返回 CORS 授权,跨站 preflight 会被拒绝。
结尾¶
dsh-session-delete 补齐的是 DSH 会话生命周期里缺失的「真删除」:菜单操作与原厂归档并列,背后同步清理磁盘、工作区索引与内存 store。适合需要主动管理本地会话残留的智能体开发者。详情与 issue 见 GitHub 仓库,分类与介绍见 SkillHub 目录页。