前言¶
在 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 了事,而是一次真实迁移,步骤概括为:
- 校验源/目标目录;已有目标 artifact 不会被覆盖。
- 解码完整多帧日志,重写 header 的
cwd,格式代次(v3/v4)与文件名保持一致。 - 原子发布 artifact(先隐藏旧文件;失败则恢复)。
- 正在运行的会话不会被拆掉:内存中的 header 与 writer 原地 retarget,后续事件写入新文件。
- 交换工作区记账(从旧 workspace detach、挂到目标);任一步失败整次移动回滚。
- 清理旧目录并重折 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 许可证。
典型用法¶
- 安装并激活插件后,打开侧边栏任意会话行,点「…」。
- 在菜单底部新分组中:
- 选 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 }。 - 删除当前正在查看的会话时,行会消失,但界面可能仍停在空对话页,需手动刷新(README 已知限制)。
不支持批量操作;大量会话整理需另选 session-manager 类插件。
适用场景与注意¶
适合谁
- 需要合规、可审计地「删干净」某次会话(含 DSH 未提供清理接口的 projection cache)的开发者。
- 要把会话连同
cwd语义一起迁到另一个 workspace,且希望打开中的会话不中断的用户。
限制与注意
- Host 若在运行时重写聚合
session_projcache.json,已 prune 的行可能再次出现;按会话的 cache 文件不受影响;DSH 停止后再清理最稳妥。 - 需要
sessionPersistencebackend 提供locate();否则插件报错退出,不会盲删。 - 无批量删除/移动。
DSH 生态强调「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-session-cleaner 在会话「…」菜单里补两个缺口:带确认与结果反馈的彻底删除(含投影缓存),以及可回滚、对 live session 友好的跨工作区移动。若你主要在 Web 侧使用 DSH,可按上文 npm 或 GitHub 命令安装 @beiwen/dsh-session-cleaner。