dsh-session-delete:从侧边栏永久删除 DSH 会话

前言

在 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 一致)。

会拒绝删除的情况

  1. 会话正在跑一轮对话(agent.status === 'running'):写作句柄仍往日志追加,需等轮次结束再删。
  2. 会话 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。

典型用法

  1. 在 DSH 桌面壳侧边栏找到要清除的会话(含归档后仍占存储的会话,或落在「未分组」下的会话)。
  2. 右键该行 → 删除会话 → 确认框点 永久删除。
  3. 若会话正在对话中,先停止或等待当前轮结束,再重复上述步骤。
  4. 删除成功后,客户端会先 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 目录页。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye