dsh-session-delete:在 DSH 侧栏永久删除 Session

前言

DeepSeek Harness(DSH)侧栏里会积累大量 Session:调试过的对话、 fork 出来的分支、已不再使用的 workspace 绑定。重命名、归档可以整理列表,但官方暴露的 Session 相关接口里并没有「删除」这一条:sessionController、sessionPersistence、客户端 sessions 模块各自负责创建、查询、持久化与投影刷新,都不提供从磁盘和 UI 上彻底移除 Session 的能力。workspaceRegistry.delete 也只删 Workspace 注册, deliberately 保留目录与全部 Session 日志。

若你希望在侧栏里像删除普通列表项一样清掉某个 Session,并同时删掉其 append-only 日志与 projection 缓存,就需要在官方 seam 上按正确顺序拼装操作。社区插件 dsh-session-delete(维护者 Smile-Wood,分类:客户端)只做这一件事:在侧栏每个 Session 的 ... 菜单里增加 Delete Session,执行后无需整页刷新即可去掉该行,并删除 $DSH_HOME 下对应的持久化文件。

这是什么

dsh-session-delete 是一个 DSH profile bundle 插件。Host 侧注册 loopback 路由 POST /plugins/session-delete/delete;浏览器侧在每个 Session 菜单里增加删除动作并调用该路由。选择删除后,会永久移除该 Session 的 stored log、projection cache,并从侧栏去掉对应行。

插件当前版本为 1.0.0(见仓库 package.json),许可证 MIT,要求 Node >= 22。README 明确说明:本项目由 AI 编写,发布前已在真实 DSH 安装上 review 与测试,但仍应视为 AI 生成软件——运行前阅读源码,并预期未覆盖路径可能存在粗糙之处。

为何需要单独插件

README 对照当时所基于的 DSH 版本,归纳了「候选 API 实际能做什么」:

候选 实际能力
sessionController(Host ctx.remote.session) resolveAgent / inspect / list / search / create / selectModel / rename / fork / prompt / cancel / page / projections — 无 delete
sessionPersistence create / open / flush / stat / list — 仅追加日志,无 delete
workspaceRegistry.delete(id) 删除 Workspace 注册,但保留目录与 全部 Session 日志
sessions(客户端) retain / using / refreshProjections / search / fork / scope / binding — 无 delete

因此侧栏「删除 Session」只能通过组合官方接口顺序实现;本插件不扩展其它功能。

删除时做了什么

删除流程在 Host 上分为五步:

  1. 停止 Session — workspaceRegistry.archiveSession(id, { stopActivity: true }),走官方停止活动路径,并 fan-out workspace/session-stop(dsh-agent、dsh-jobs、dsh-schedule、dsh-subagent 等会监听)。
  2. Detach 活跃 Session — ctx.sessions.store.get(id).detach(),通过 entry 的 detach 触发 session/disposed。
  3. 移除侧栏行 — session/disposed → api-session/removed(dsh-api-session-controller)→ 客户端 ctx.remote.$on("api-session/removed", …)。冷启动、仅从磁盘恢复且本进程从未打开的 Session 没有 store entry,无法靠 detach 触发;插件会直接 emit 同名 api-session/removed(Host 侧无监听,无副作用)。
  4. 清理成员关系 — 对每个 Workspace 执行 detachSession,并 unarchiveSession、unpinSession,避免归档或 pin 的幽灵项残留。
  5. 删除磁盘数据 — 移除 $DSH_HOME/sessions/<encoded-cwd>/<id>/ 下的 artifact,以及 $DSH_HOME/storages/session_projcache/sessions/<id>.json。

SQLite session index 由持久化状态派生,下次 reconcile 时会自行收敛;插件不直接改 index。

涉及的磁盘路径

默认 $DSH_HOME 为 ~/.dsh:

$DSH_HOME/
  sessions/<encoded-cwd>/<session-id>/session.v4.jsonl[.zstd]   <- 删除
  storages/session_projcache/sessions/<session-id>.json         <- 删除
  storages/workspace.json                                       <- 就地更新 membership

安装与启用

插件以 profile bundle 安装,使用 DSH 自带的 dsh plugin 命令(底层在 $DSH_HOME/profiles/<profile>/ 内转发给 pnpm)。dsh 是打包 CLI 的 shim,DSH Desktop 至少启动过一次后才会出现在 PATH 上。请使用你实际启动 DSH 时对应的 profile(Desktop 默认 web;省略 --profile 时也假定 web)。

从 GitHub 公开仓库安装:

dsh plugin --profile web add github:Smile-Wood/dsh-session-delete

本地目录安装(示例为 Windows 路径,按你的 checkout 位置替换):

dsh plugin --profile web add C:\path\to\dsh-session-delete

私有仓库或非 github: shorthand 时,README 建议显式 HTTPS 并由 git credential helper 认证:

dsh plugin --profile web add git+https://github.com/Smile-Wood/dsh-session-delete.git

安装完成后在浏览器中 重新加载 DSH 页面 以加载 browser bundle;无需重启 DSH 进程。打开侧栏某个 Session 的 ... 菜单,应能看到删除相关动作。

更新:对同一仓库再次执行 add 即为更新路径(pnpm 重新 resolve ref,变更文件进入新的 content-addressed store,Host 会加载新 module URL):

dsh plugin --profile web add github:Smile-Wood/dsh-session-delete

卸载:

dsh plugin --profile web remove dsh-session-delete

会 prune 依赖、从 dsh.profile.bundles 移除名称并卸载 Host 与 client 两半。本地 link: 安装时,remove 后 $DSH_HOME/profiles/<profile>/node_modules/dsh-session-delete 的 symlink 可能残留(无功能影响,需要时可手动删除)。

依赖需在 package.json 中声明 dsh.bundle.patch 才会进入 profile 层;cordis.patch.yml 会 insert id 为 session-delete、name 为 dsh-session-delete 的条目。client.js 注册名必须与 package.json 的 name 完全一致,否则菜单行可能静默不出现。

典型用法

  1. 按上一节命令将插件加入 web profile(或你使用的 profile)。
  2. 浏览器刷新 DSH 页面。
  3. 在侧栏选中要清理的 Session,打开该行的 ... 菜单,选择 Delete Session。
  4. 确认后:侧栏行消失(无需整页 reload),对应 session 目录与 projection 缓存从 $DSH_HOME 删除。

没有额外配置文件或环境变量;行为完全由菜单动作与 Host 路由驱动。

适用场景与注意

适合谁: 长期在 DSH 里开很多 Session、需要真正释放磁盘空间并去掉侧栏噪音的开发者;分类上属于 客户端 插件,与 Web/Desktop 侧栏 UI 集成。

权限与信任: 插件在 当前 DSH Host 进程权限 下删除 $DSH_HOME 内文件。删除不可通过官方 API 撤销;执行前请确认 Session 不再需要。安装前阅读 GitHub 源码 与 MIT 许可证。

生态说明: DSH 采用「一切皆插件」的扩展方式;SkillHub 目录页 是社区收录站点,与 DeepSeek / 幻方无官方从属关系,本文安装命令与行为描述均以仓库 README 为准。

其它: 公开仓库才能直接用 github:Smile-Wood/dsh-session-delete;出站 SSH 22 被拦时,pnpm 回退 SSH 可能失败。本地 path 安装与 git 安装的 remove 行为略有差异(见安装一节)。

链接

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

若你的痛点是「DSH 没有 delete Session API,但侧栏和磁盘上 Session 越积越多」,本插件在官方 seam 上补齐删除动作与持久化清理;安装一条 dsh plugin --profile web add 命令,刷新页面即可在 ... 菜单中使用。

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

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

Xiaoye