dsh-session-delete: Permanently Delete Sessions in Web GUI

前言

DeepSeek Harness(DSH)的 Web 侧栏里,会话行菜单默认只有 pin、rename、fork、archive 四项。归档会把会话从列表里藏起来并阻止再唤醒,但磁盘上的 session.v4.jsonl.zstd 以及整个会话目录通常仍在。若你本地试过很多会话、或需要按合规要求清掉某次对话的落盘数据,仅靠归档不够。社区插件 dsh-session-delete(维护者 bie-666)在菜单里增加红色的「删除会话」,经确认后走 host 路由 POST /api/session-delete,先做归档闸门再删目录,客户端实现按 dsh 0.2.1-rc.5 的 Web 客户端插件规范编写。

这是什么

dsh-session-delete 是 DSH 的客户端类插件(同时包含 host 侧 API 与 Web 前端 bundle)。一句话:给 DSH Web GUI 会话行补上永久删除能力,核心是「先归档、再卸会话、再从磁盘 rm -rf 会话目录」。插件版本 0.1.0,许可证 MIT,源码与说明见 GitHub 仓库,目录页:skillhub.cn/plugins/bie-666/dsh-session-delete。DSH 生态强调「一切皆插件」;社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

界面与请求路径

用户在侧栏某会话行点击「⋯」→ 选择 删除会话 → 弹窗确认 → 浏览器发起 POST /api/session-delete。

Host 侧删除流程

实现位于 lib/index.js,顺序大致如下:

  1. 若 agent.status === 'running'(会话正在跑回合)→ 返回 409,不做任何改动;
  2. 调用 workspaceRegistry.archiveSession(id, { stopActivity: true }),写入归档集合,作为 agent/pre-step 闸门,避免残留客户端或子智能体再唤醒;
  3. 对 live 会话:sessions.detachEntered(entry) → 触发 session/disposed、api-session/removed,侧栏行立即消失;
  4. 用持久化后端的 locate(header) 反算会话目录(不自行重写 project-key 编码),校验路径必须是 <sessionsRoot>/<projectDir>/<sessionDir> 两层、lstat 为普通目录、realpath 仍在 root 内,符号链接直接拒绝;
  5. 对该目录执行 rm -rf;cold 会话(仅磁盘存在)无 detach 时,手动 ctx.emit('api-session/removed', id);
  6. 若删的是当前打开的会话,客户端会 uiWorkspace.startSession() 离开该会话。

成功时响应示例(字段以实际为准):

{"ok":true,"sessionId":"session-…","archived":true,"wasLive":false,
 "detached":false,"removedFromDisk":true,"directory":"/…/.dsh/sessions/--…--/session-…"}

常见错误码包括:request/invalid-json、session/invalid-id、session/not-found、session/running、session/path-unsafe、session/remove-failed、session/list-failed、request/method-not-allowed。

GET /api/session-delete 返回 {"ok":true,"version":"0.1.0","route":"…"},用于判断插件是否已加载。注意:/api 前缀对未认证请求一律 401,用 curl 探测时需理解「401 表示路由已注册、404 表示插件未加载」。

与核心版 archive 的对比

能力 核心 archive 本插件
侧栏隐藏 / 阻止唤醒 是 是(先归档)
删除磁盘会话目录 否 是

安装与启用

官方 README 给出的步骤如下(不要用名称臆造 dsh plugin add github:…):

git clone https://github.com/bie-666/dsh-session-delete.git ~/.dsh/plugins/dsh-session-delete
dsh plugin --profile web add link:$HOME/.dsh/plugins/dsh-session-delete

dsh plugin add link: 会把插件挂进 web profile 的 package.json;插件自带的 cordis.patch.yml 会向组合树插入 - id: session-delete。新的 loader 行只在 dsh web 启动时读取,装完后必须重启 DSH:

pkill -f "dsh web"; dsh web

重启后刷新页面,dsh-client-modules 才会把 lib/client.js 纳入 boot roster(菜单与弹窗在该 bundle 内)。验证:

curl -s http://127.0.0.1:3080/api/session-delete
# 401 = 路由已注册但请求没带浏览器 cookie(正常);404 = 插件没加载

若不用 dsh plugin add,可手动 symlink 并在 ~/.dsh/profiles/web/cordis.patch.yml 末尾追加 insert 块(详见仓库 README)。

卸载:删除 node_modules 里的链接并去掉 cordis.patch.yml 中 id: session-delete 段,重启 DSH 即可;插件不修改核心文件。

典型用法

  1. 安装并重启 dsh web,刷新 Web GUI。
  2. 在侧栏目标会话行打开「⋯」,点 删除会话,在弹窗中确认。
  3. 确认会话不在列表中,且对应 .dsh/sessions/… 下目录已不存在(可通过 API 响应里的 directory 字段对照)。

不依赖 DSH 宿主时,可在本地跑离线自检:

node ~/.dsh/plugins/dsh-session-delete/test/offline-checks.mjs

覆盖路由注册、live/cold 删除分支、各类 HTTP 守卫、路径安全与客户端 slot/菜单渲染等。

适用场景与注意

适合:需要在 Web 界面一次性清掉会话及其落盘目录的 DSH 用户;开发与插件作者可参考其 archive + detach + sessionPersistence.locate() 的路径安全删除写法,以及 rc.5 客户端 bundle 的插槽与模块表约束(仓库 README 与 docs/troubleshooting-rc5.md 有整页 boot 失败排查记录)。

务必注意:

  • 删除不可恢复,确认弹窗后再操作。
  • 插件以当前 dsh 进程的用户与权限运行,rm -rf 作用于校验通过的会话目录;安装前应阅读源码与 MIT 许可证,自行评估是否满足你的环境策略。
  • 客户端插件在 rc.5 上若插槽名写错或 require 未放行的宿主包,会导致整页 Failed to load plugins;改 bundle 后需重启 dsh web(仅刷新页面不够)。

结尾

dsh-session-delete 把「归档」从隐藏会话扩展为可审计的磁盘清理:host 侧 409/路径守卫 + 归档闸门,Web 侧一条菜单即可完成操作。进一步了解请访问 目录页 与 GitHub:bie-666/dsh-session-delete。

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

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

Xiaoye