dsh-workspace-cleaner:DSH 工作区与会话清理

前言

DeepSeek Harness(DSH)的会话持久化后端在文档里写得很清楚:没有任何机制会删除会话文件——日志在 root 下一直累积,框架侧也没有删除 API。侧边栏会话菜单里因此只有 Archive,会话堆到几百条后,列表难用,磁盘占用也会一直涨。

社区插件 dsh-workspace-cleaner(维护者 1052088090,分类:客户端)补了两块能力:设置页里汇总每个工作区及其会话数,并支持批量归档、注销工作区注册;侧边栏会话菜单里增加 Delete session,把会话日志挪到可恢复的回收站,而不是只做界面上的归档。

这是什么

dsh-workspace-cleaner 是面向 DSH 的客户端插件(当前 package 版本 0.1.0,MIT 许可证)。它不改变 DSH 核心,而是在 Host 侧通过 HTTP 路由操作 workspaceRegistry、会话持久化与文件系统,在 Client 侧注册「Workspace Cleanup」设置页和侧边栏「Delete session」菜单项。第一次删除采用 重命名 进回收站,不是直接 unlink,便于误删后恢复。

目录页:https://www.skillhub.cn/plugins/1052088090/dsh-workspace-cleaner
源码:https://github.com/1052088090/dsh-workspace-cleaner

核心功能

设置 → Workspace Cleanup

一张表列出每个已注册工作区:路径、会话数量、目录是否仍存在。可对单个或批量工作区执行:

操作 效果
Archive sessions 调用 workspaceRegistry.archiveSession,会话从分组列表消失,仍可从归档列表恢复
Delete workspace 调用 workspaceRegistry.delete,仅去掉注册;会话日志与项目目录保留
Trash → Restore 日志移回,取消归档并重新挂到原工作区
Trash → Delete permanently 永久删除回收站目录并报告释放的字节数

侧边栏 → Delete session

打开某会话的「…」菜单 → Delete session → 确认。

  • 正在写入的 live 会话拒绝删除:当前 Agent 仍持有日志,需先切到其他会话。
  • 行会立刻从侧边栏消失:插件先归档(与侧边栏过滤一致),再移动日志,避免内存中的会话索引在重启前仍列出该文件。
  • 日志目录被重命名为 <dsh-home>/session-trash/<timestamp>--<session-id>/,并附带 meta.json 记录标题、项目目录、cwd 与删除时间。

安装与启用

在包含该插件包的目录的上一级,或已 checkout 的绝对路径处执行(命令来自 README,勿用未在文档出现的 github:owner/repo 形式):

# from the directory that contains this package
dsh plugin add /absolute/path/to/dsh-workspace-cleaner

也可在 DSH 会话里让 Agent 从本地目录安装 bundle;plugin_manager install_bundle 会把 checkout 链到 profile 的 node_modules/dsh-workspace-cleaner,之后改文件只需重启。

安装后 重启 DSH(Host 半部要注册 HTTP 路由),再 刷新 Web GUI。运行环境要求 Node.js >= 20。

可选配置(写入 profile 的插件 config):

- id: workspace-cleaner
  name: dsh-workspace-cleaner
  config:
    sessionRoot: 'D:\somewhere\session-logs'   # optional override
字段 默认 含义
sessionRoot 自动探测 JSONL 会话日志根的绝对路径

探测顺序为:config.sessionRoot → $DSH_PROFILE_DIR/../../sessions → $DSH_PROFILE_DIR/sessions → $DSH_HOME/sessions → ~/.dsh/sessions(取第一个存在且含项目子目录的候选)。

典型用法

  1. 日常删单个会话:侧边栏该会话「…」→ Delete session → 确认;若要恢复,打开 Settings → Workspace Cleanup,在 Trash 里 Restore。
  2. 清理某个工作区下大量历史会话:设置页对该工作区 Archive sessions,或需要时 Delete workspace(仅删注册,磁盘日志需另管)。
  3. 确认不再需要回收站条目:设置页 Trash → Delete permanently。

架构与安全(简要)

client.js  ──POST /workspace-cleaner/api/{list,apply,trash,deleteSession,restore,purge}──►  index.js
   (settings.section + sidebar session menu)                                              (Host)

Host 是唯一碰文件系统的部分,路由与内置 browser 路由一样受 ctx.connection.requestRejection 约束。Client 从 Host 拉数据,而不是只用 ctx.workspaces(该 face 无法枚举全部工作区供插件页使用)。

安全行为包括:live Agent 返回 409 session/live;日志缺失时清理账务并返回 unmaterialized / alreadyDeleted 而非硬失败;重命名失败会回滚归档;回收站 id 校验禁止 .. 与路径分隔符。

适用场景与注意

适合长期用 DSH、会话与工作区注册不断增多、需要真实删日志或集中管理工作区的开发者。SkillHub 等社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系;插件以 当前 dsh 进程权限 读写会话目录与回收站,安装前应自行审阅源码与 MIT 许可证。

已知限制(README):GUI 缓存导致已删会话在归档列表里可能需刷新或重启才消失;SQLite 搜索索引可能在下次 DSH 启动前保留 stale 命中;会话 id 若与后端转义规则不一致可能报「磁盘上无日志」;回收站位于日志根旁 <dsh-home>/session-trash,后端不会扫描该目录。

结尾

DSH 设计上会话删除留空,由插件填补。dsh-workspace-cleaner 用设置页 + 侧边栏删除,把「归档」与「日志进回收站」分开,并保留恢复与永久清除路径。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。

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

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

小夜