dsh-session-cleaner:会话菜单里的彻底删除与跨工作区移动

前言

在 DeepSeek Harness(DSH)里,侧边栏会话行的「…」菜单默认提供重命名、归档等操作,但当你要永久清掉某次会话、连同 DSH 在磁盘上留下的衍生数据一起处理,或把会话从当前工作区迁到另一个工作区时,内置能力往往不够细。只改注册表里的工作区归属也不可靠:DSH 会根据会话头里不可变的 cwd 做 reconciliation,下次同步可能把改动打回去。

下面介绍社区插件 dsh-session-cleaner(维护者 yuanxinbin520)。它在会话「…」菜单底部单独成组,只增加两个动作:跨工作区移动、彻底删除会话。插件体量刻意做小,无 npm 依赖、无构建步骤,面向 Web 侧 UI(dshhub 分类含「会话管理」「Web UI」;SkillHub 目录页归类为工作流)。

这是什么

dsh-session-cleaner 是一个 DSH 插件:在 Session 的 … 菜单里,排在内置 Rename / Archive 等行(pin 100、rename 200、fork 300、archive 400)之后,以 order 500、600 注册两行,且第一行带 separatorBefore,视觉上单独成组:

菜单项 Order 作用
Move to another workspace… 500 真实跨工作区迁移:重写 cwd、搬运 artifact、交换工作区记账
Thoroughly delete session… 600 经确认对话框后永久删除会话及全部衍生数据

Host 半部在 ctx.webServer 上注册前缀路由;客户端通过同源 fetch 调用,变更按 session id 串行化,无需额外 auth header。

彻底删除会清掉什么

确认框会先说明范围,结果视图会报告实际移除项。资料中的处理范围如下:

数据 处理方式
会话日志目录($DSH_HOME/sessions/<project>/session-<id>/) 整目录删除,含各代格式(v4/v3/v2/v1)及 temp/backup
live session / agent cancel + dispose,从 agent 注册表移除,广播 session/disposed 以便客户端立刻去掉行
工作区成员关系 从各 workspace 的 sessionIds 移除
归档 / 置顶标记 从 archivedSessionIds、pinnedSessionIds 移除
投影缓存(按会话) 删除 $DSH_HOME/storages/session_projcache/sessions/<id>.json(及 .lock/.tmp)
投影缓存(旧聚合文件) 从 storages/session_projcache.json 的 tables.sessions 删行,并写 .bak

attachments/、cache/ 为内容寻址且多会话共享,不属于单会话独占,插件不会动这些树。

安全边界(摘自 README):

  • 仅当 artifact 的首行 header 能证明 session id 时才删目录;否则报告 existed: false 且不动目录。
  • 路径必须是 <sessions>/<project>/<session>,且两级子目录不能是 symlink/junction(删除前再次检查)。
  • Session id 做路径穿越校验(如 ../evil 返回 HTTP 400)。
  • 删除只读 header frame,截断日志仍可删;移动路径会解码完整日志,截断日志拒绝重写。

跨工作区移动的语义

移动不是改 registry 了事,而是一次真实迁移,步骤概括为:

  1. 校验源/目标目录;已有目标 artifact 不会被覆盖。
  2. 解码完整多帧日志,重写 header 的 cwd,格式代次(v3/v4)与文件名保持一致。
  3. 原子发布 artifact(先隐藏旧文件;失败则恢复)。
  4. 正在运行的会话不会被拆掉:内存中的 header 与 writer 原地 retarget,后续事件写入新文件。
  5. 交换工作区记账(从旧 workspace detach、挂到目标);任一步失败整次移动回滚。
  6. 清理旧目录并重折 projection cache。

打开中的会话移动后不需要刷新页面。

安装与启用

环境要求:DSH >= 0.2.0-rc.1(README 注明在 0.2.0-rc.2 上测过);Node >= 22.15(使用内置 node:zlib 的 Zstandard API)。

Web profile 下任选一种安装方式(命令来自官方 README):

# 从 npm 安装(推荐,无需访问 GitHub)
dsh plugin --profile web add @beiwen/dsh-session-cleaner

# 从 GitHub 安装,固定到 release tag
dsh plugin --profile web add github:yuanxinbin520/dsh-session-cleaner#v0.1.2

# HTTPS(网络封 SSH 22 端口时)
dsh plugin --profile web add https://github.com/yuanxinbin520/dsh-session-cleaner.git

npm 包名为 @beiwen/dsh-session-cleaner。未带 scope 的 dsh-session-cleaner 在 npm 上属于无关包,勿用裸名安装。

若 github: 安装报 ssh: connect to host github.com port 22: Connection refused,可改用 HTTPS 形式,或在 ~/.ssh/config 中为 GitHub 走 443。Windows 在 TLS Inspect 代理后若 git 报证书问题,可按 README 将 GitHub 的 sslBackend 设为 schannel,或直接用 npm 规格跳过 git。

Desktop profile 不能通过 dsh plugin --profile desktop 安装(命令会拒绝)。应在 Settings → Plugins 粘贴 @beiwen/dsh-session-cleaner(GitHub 不可达时可配 npm 镜像),或由插件管理器执行 install_bundle @beiwen/dsh-session-cleaner。安装后需重启 profile(Web 客户端可刷新页面)才会生效。

插件以当前 DSH 进程权限读写 $DSH_HOME 下会话与投影缓存路径;安装前建议浏览 GitHub 仓库 源码与 MIT 许可证。

典型用法

  1. 安装并激活插件后,打开侧边栏任意会话行,点「…」。
  2. 在菜单底部新分组中:
    - 选 Move to another workspace…:Host 通过 GET /session-cleaner/api/workspaces?sessionId=… 列出工作区及当前归属,选定后 POST /session-cleaner/api/move 提交 { sessionId, targetWorkspaceId }。
    - 选 Thoroughly delete session…:在确认对话框中核对范围后,POST /session-cleaner/api/delete 提交 { sessionId }。
  3. 删除当前正在查看的会话时,行会消失,但界面可能仍停在空对话页,需手动刷新(README 已知限制)。

不支持批量操作;大量会话整理需另选 session-manager 类插件。

适用场景与注意

适合谁

  • 需要合规、可审计地「删干净」某次会话(含 DSH 未提供清理接口的 projection cache)的开发者。
  • 要把会话连同 cwd 语义一起迁到另一个 workspace,且希望打开中的会话不中断的用户。

限制与注意

  • Host 若在运行时重写聚合 session_projcache.json,已 prune 的行可能再次出现;按会话的 cache 文件不受影响;DSH 停止后再清理最稳妥。
  • 需要 sessionPersistence backend 提供 locate();否则插件报错退出,不会盲删。
  • 无批量删除/移动。

DSH 生态强调「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-session-cleaner 在会话「…」菜单里补两个缺口:带确认与结果反馈的彻底删除(含投影缓存),以及可回滚、对 live session 友好的跨工作区移动。若你主要在 Web 侧使用 DSH,可按上文 npm 或 GitHub 命令安装 @beiwen/dsh-session-cleaner。

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

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

Xiaoye