@mcf171/dsh-session-delete:为 DSH Web GUI 补上永久删除会话

前言

在 DeepSeek Harness(dsh)里用 Web GUI 管会话时,官方 0.2.x 侧边栏会话行的 ⋯ 菜单通常只有 rename、fork、pin、archive,没有「删掉这条会话并清掉日志」的入口。归档只能把会话从主列表藏起来,磁盘上的 <DSH_HOME>/sessions/... 日志目录仍在;试验性会话、误建分支或需要腾空间时,缺少一步到位的删除动作。

下面介绍社区插件 @mcf171/dsh-session-delete(维护者 mcf171,MIT 许可证,当前 package 版本 0.1.0)。它在不劫持侧边栏 DOM 的前提下,用官方扩展点增加菜单项「删除会话」和快捷键 Delete,经确认后按固定顺序归档、删除日志目录并广播 UI 移除事件,让该行立刻从侧边栏消失。

这是什么

@mcf171/dsh-session-delete 是给 DSH Web GUI 补永久删除会话动作的 bundle-patch 型插件:host 端注册同源路由,client 端注册会话行菜单与快捷键。代码在 lib/ 下为手写 JavaScript,改完重启 DSH 即生效,无需单独编译步骤。

  • 目录页:https://www.skillhub.cn/plugins/mcf171/dsh-session-delete
  • 源码与说明:https://github.com/mcf171/dsh-session-delete

SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系;安装前请自行查看仓库源码与许可证。插件在当前 dsh 进程权限下执行文件删除,仅删该会话的日志目录,不可撤销,依赖确认框把关。

核心功能

删除流程(顺序固定)

一次删除按下面顺序做三件事,顺序不能调换:

  1. 先归档:调用 workspaceRegistry.archiveSession(id)。这是官方持久化隐藏机制,主列表不再显示该会话,后续列表刷新也不会把它带回来。若会话正在跑回合,归档会拒绝并提示「该会话正在运行,请先停止后再删除」(与官方活动检查一致)。
  2. 再删日志目录:删除 <DSH_HOME>/sessions/<projectKey(cwd)>/<sessionId>/。目录已不存在时跳过,重复删除幂等、不报错。
  3. 广播 api-session/removed:复用官方 session/disposed → api-session/removed 中继,client 收到后立刻从 UI 移除该行。

必须先归档再删日志:日志删掉之后再归档会抛 WorkspaceUnknownSessionError。

界面与快捷键

  • 会话行 ⋯ 菜单增加「删除会话」,左侧为与官方一致的垃圾桶图标,右侧提示快捷键 Delete,危险色标注。
  • 快捷键 Delete 作用于当前选中的会话,流程与点击菜单相同(运行中拒绝 → 确认框 → 删除)。以下情况不触发:焦点在输入框或可编辑区域、带 Ctrl/Shift/Alt/Cmd 的 Delete、当前无选中会话。

设计边界(README 中明确说明)

  • UI 注册在官方插槽 sidebar.workspaces.session.menu.item,不监听、不改写侧边栏 DOM。
  • 「运行中」判断与官方列表一致:agents.get(id).status === 'running',只拦正在跑回合的会话。
  • 删除走 node:fs,目标路径按 @deepseek-ai/dsh-session-persistence-jsonl 的 projectKey / encodeSegment 规则定位,遵循 DSH_HOME。
  • 不要在删除后调用 sessions.refresh():列表 = 持久化扫描 + 内存中的活会话,立刻刷新可能把刚移除的行加回来。清理靠归档与广播。
  • SessionStore 无移除 API,打开过的会话对象可能常驻内存直到进程重启;不影响使用,行已从 UI 消失且不会再写已删日志。

安装与启用

资料中未提供 dsh plugin add github:... 一类命令;需把包挂到某个 profile(以下以 profile web、路径 <DSH_HOME>\profiles\web 为例)。

1、放入 profile 的 node_modules

scoped 包位于 @mcf171\ 子目录。复制示例(PowerShell):

$dest = '<DSH_HOME>\profiles\web\node_modules\@mcf171\dsh-session-delete'
New-Item -ItemType Directory -Path (Split-Path $dest) -Force | Out-Null
Copy-Item '<本目录>' $dest -Recurse -Force
Remove-Item "$dest\.git" -Recurse -Force -ErrorAction SilentlyContinue

也可用目录链接便于改源码即时生效;部分 Windows 环境在该位置创建链接会 Access denied,遇阻则改回复制,改代码后需重新复制再重启。

2、登记 dependencies 与 bundle

编辑 <DSH_HOME>\profiles\web\package.json:

{
  "dependencies": {
    "@mcf171/dsh-session-delete": "link:<本目录的绝对路径>"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "@mcf171/dsh-session-delete"
      ]
    }
  }
}

bundle-patch 型插件只登记 bundles;不要在 profile 的 cordis.patch.yml 里再写同名 insert 行,否则可能重复注册导致插件树加载失败。

3、重启 DSH

host 插件仅在启动时加载,改完须重启。

运行环境:package.json 要求 Node ^22.19.0 || >=24.0.0,peer 依赖 @deepseek-ai/cordis ^4.0.1。

典型用法

  1. 重启 DSH 后打开 Web GUI(根路径无 token 会 401,启动日志中有 ?token=…,验证时需带 token)。
  2. 在侧边栏选中要清理的会话;若该会话正在跑回合,先停止再删。
  3. 打开该行 ⋯ 菜单点「删除会话」,或焦点不在输入框时按 Delete。
  4. 在确认框中确认;成功后该行从侧边栏消失,对应日志目录被删除。

卸载:从 dsh.profile.bundles 移除 @mcf171/dsh-session-delete,并删除 node_modules\@mcf171\dsh-session-delete。

适用场景与注意

适合:需要在 Web GUI 里彻底去掉试验会话、误建 fork、或释放 <DSH_HOME>/sessions 磁盘占用的 DSH 用户;希望与官方 archive / 持久化规则一致、且 UI 随官方插槽演进而非 DOM 注入。

注意:

  • pnpm install 或插件市场重装可能清掉 profile 内手动拷贝的包(不在 lockfile 解析结果里);升级 DSH 后也应确认菜单里仍有「删除会话」,没有则重做安装第 1、2 步。
  • 插件只删日志目录;workspace 归属里可能留下已删会话 id,README 说明为无害残留。
  • 怀疑 DSH 升级后路径规则变化时,可在插件目录运行自测:
node test/format-check.mjs
node test/client-check.mjs

结尾

@mcf171/dsh-session-delete 用官方归档 + 删日志 + api-session/removed 三步,补上 0.2.x Web GUI 缺失的永久删除入口,并约束运行中会话与误触场景。需要细节时查 SkillHub 目录页与 GitHub README。

  • https://www.skillhub.cn/plugins/mcf171/dsh-session-delete
  • https://github.com/mcf171/dsh-session-delete
羽毛球分组比赛记分
小程序二维码

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

Xiaoye