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

前言

DeepSeek Harness(DSH)内置了 archiveSession,可以把会话归档,但界面上仍可能长期留着「删不掉」的会话记录。常见有两种情况:只删除工作区时,确认文案会说明文件夹和会话日志会保留,会话会落到 Ungrouped;持久化层文档也写明,没有删除会话文件的 API,日志会在 root 下累积,只能外部清理。若你希望从侧栏和磁盘上真正去掉某次对话,需要额外能力。下面介绍社区插件 dsh-session-delete(维护者 spidu-lee),它在会话「⋯」菜单里增加「永久删除会话」,并在确认后清理磁盘目录、投影缓存与各工作区关联。

这是什么

dsh-session-delete 是一个面向 DSH Web 配置的 bundle 插件(platform: web),当前版本 0.1.0,许可证 MIT。它在侧栏每个会话的 「⋯」菜单 中插入一条危险操作项,用与官方归档类似的 Modal 做确认(非原生 window.confirm),确认后由宿主侧路由完成删除,并通过 api-session/removed 通知各客户端立刻从列表移除该行。

与只做 UI 操作的会话菜单类插件不同,该插件会删除 磁盘上的会话记录(日志目录等),并清理指向该会话的关联;这是 README 中强调的与 DSH 自带能力的主要差异。

核心功能

侧栏菜单与确认对话框

项 说明
插槽 sidebar.workspaces.session.menu.item
行 id dsh-session-delete.session.delete
顺序 500(位于内置 pin 100 / rename 200 / fork 300 / archive 400 之后)
样式 ui-primitives MenuItemButton,danger + separatorBefore,图标 IconTrashOutlineRegular

确认层挂在 shell.overlay,入口 id 为 dsh-session-delete.session-delete-confirm。行与对话框通过模块级 pending 请求存储解耦,避免进行中的状态泄漏。对话框会通过 ctx.get("sessions").retainInfo(id) 说明当前窗口是否仍打开或持有该会话。

若你正在 Main 视图里查看的就是待删会话,插件会先导航到其他会话(或在工作区无其他行时 startSession()),等待 mainView 引用计数下降并让宿主释放,再执行删除;若 5 秒内未完成释放,会取消删除并提示 dialog.stillOpen,避免删后又被写回。

宿主侧删除流程(概要)

README 用表格列出了 12 步逻辑,核心包括:

  1. 校验 sessionId(单路径段,禁止 ..)。
  2. 在 <sessionsRoot>/<projectKey>/<sessionId> 下定位目录(projectKey 为 cwd 的有损编码,通过扫描而非反解)。
  3. 无目标时返回 404。
  4. 通过 workspace/session-activity 瀑布查询是否仍有活动(与 archive 相同);若有则派发 workspace/session-stop 并轮询直至稳定。
  5. 若活动拒绝结束则 409,并在消息中说明仍在运行什么。
  6. 对仅 loaded 在内存中的会话也派发 workspace/session-stop,防止删除后 header 再写回磁盘。
  7. 使用 fs.rm(dir, { recursive: true, force: true }) 删除目录。
  8. 删除后最多 4 轮、间隔 350 ms 再次检查目录;若被写回则返回 delete-resurrected 而非成功。
  9. 文件删除成功后,经 registry entity API 从各工作区 detach 并 unpin。
  10. 尽力删除 storages/session_projcache/sessions/<id>.json(失败以 warning 报告)。
  11. 检查宿主 store 或持久化层是否仍列出该会话,并以 warning 说明,而非声称完全干净(插件无法调用 sessions 的 removal API)。
  12. 发出 api-session/removed,各打开窗口立即去掉侧栏行。

README 还说明:活跃性判断使用 workspace/session-activity 而非简单查 Agent 注册表,因为 DSH 会为任意在窗口中打开的会话保留 Agent, idle 会话也会被误判为「仍在运行」。

安装与启用

从市场安装(README 注明「一旦上架」可用):

dsh plugin --profile web add github:spidu-lee/dsh-session-delete

也可在 profile patch 中手工插入:

# cordis.patch.yml
- insert:
    - id: session-delete
      name: 'dsh-session-delete'

包同时声明 dsh.bundle.patch 与 dsh.client(platform: web),按普通 bundle 安装。安装后需重启 DSH:宿主侧在启动时挂载路由族。

README 说明:package.json 中 "private": true 是有意为之,npm 上已有无关包占用 dsh-session-delete 名称,因此该插件仅从 GitHub 分发。

典型用法

  1. 按上文命令为 web profile 安装插件并重启 DSH。
  2. 在侧栏目标会话上打开 「⋯」菜单,选择永久删除相关菜单项(文案以插件 locale 为准)。
  3. 在 Modal 中阅读关于本窗口是否仍打开/持有该会话的说明,确认后执行删除。
  4. 若删除的是当前 Main 视图中的会话,等待插件自动切换会话并完成释放后再删;失败时对话框保持打开并显示宿主返回的错误(例如活动无法结束、日志被写回等)。

无需额外配置文件;行为由插件 bundle 与宿主 API 完成。

适用场景与注意

适合谁: 需要清理 $DSH_HOME/sessions 下累积日志、并从所有工作区侧栏去掉某会话的 DSH 用户;与仅归档或仅删工作区文件夹的场景互补。

权限与安全: 插件以当前 DSH 进程权限运行,会直接递归删除会话目录。安装前请阅读 GitHub 仓库 源码与 MIT 许可证,确认可接受其停止活动、删盘、detach 工作区等行为。

能力边界: 删除文件后,宿主内存 store 或持久化层中的 pending 条目可能仍短暂存在;README 明确插件无法清空这些内部结构,会在结果中以 warning 说明。永久删除不可恢复,操作前请确认会话 ID 与内容。

生态说明: DSH 社区插件目录(如 SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系;本文安装命令以仓库 README 为准。

结尾

dsh-session-delete 补上了 DSH 原生 archiveSession 未覆盖的缺口:在侧栏提供可确认的永久删除,并同步清理磁盘日志、投影缓存与工作区关联。更多信息见目录页 skillhub.cn/plugins/spidu-lee/dsh-session-delete 与源码 github.com/spidu-lee/dsh-session-delete。

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

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

小夜