dsh-session-menu-delete:在侧边栏永久删除会话

前言

DeepSeek Harness(DSH)桌面/Web 形态里,侧边栏会话行的三点菜单自带「归档会话」等操作。归档只是把会话从列表里收起来,日志仍写在磁盘上并持续累积,官方没有提供从界面删除会话、清掉磁盘记录的入口。若你本地试过很多会话、或需要按合规清理历史,只能手动找 DSH_HOME 下的目录,既容易漏投影缓存,也容易和正在运行的会话冲突。

dsh-session-menu-delete 是社区维护者 Dcmwfg 发布的客户端类 DSH 插件:在会话三点菜单里增加「删除会话」,确认后永久删除该会话的磁盘记录与投影缓存,并立刻从左侧列表移除。下面介绍它的能力边界、安装方式与实现要点;安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。插件以当前 DSH 进程权限读写本机文件,删除不可恢复。

这是什么

一句话:在 DSH Web GUI 侧边栏会话行三点菜单中,于「归档会话」下方增加「删除会话」;确认后走本地回环 API,按固定顺序摘内存、删目录与投影缓存,并通知客户端更新列表。

维护者:Dcmwfg。分类:客户端。当前仓库版本(package.json):0.1.1。社区目录页:skillhub.cn/plugins/Dcmwfg/dsh-session-menu-delete。DSH 生态强调「一切皆插件」;SkillHub 等目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

  1. 菜单入口:插槽 sidebar.workspaces.session.menu.item,order 440,排在 archive(400) 之后;shell.overlay 弹出确认框。
  2. 删除范围:<DSH_HOME>/sessions/<workspaceKey>/<id>/ 与会话投影缓存 storages/session_projcache/sessions/<id>.json;目录名支持裸 UUID 与 session-<uuid> 两种形态。
  3. 列表即时更新:删除流程末尾 ctx.emit('api-session/removed', id);不修改 workspace.json,由客户端推导列表。
  4. 纯本地:宿主半只监听回环地址,不联网、不调外部接口;同源与 trustedHosts 校验,外部 Origin 返回 403。
  5. 配置方式:通过插件自带 cordis.patch.yml 的 bundle patch 加载,不需要改 profile 的 cordis.patch.yml。

官方自带能力只有归档;本插件补的是「可确认的永久删除」。README 明确:删了就没了,无回收站、无恢复入口。

安装与启用

路径不要含空格(Windows 上 link: + pnpm install 会做 junction,空格或特殊字符易失败)。

  1. 克隆仓库到本地:
git clone https://github.com/Dcmwfg/dsh-session-menu-delete.git
  1. 编辑所用 profile 的 package.json(desktop 示例路径:Windows %USERPROFILE%\.dsh\profiles\desktop,macOS / Linux ~/.dsh/profiles/desktop):
// ~/.dsh/profiles/desktop/package.json
"dependencies": {
  // 指向上一步克隆目录(Windows 用正斜杠)
  "dsh-session-menu-delete": "link:/path/to/dsh-session-menu-delete"
},
"dsh": {
  "profile": {
    "bundles": [
      // …原有的…
      "dsh-session-menu-delete"
    ]
  }
}
  1. 在 profile 目录执行 pnpm install,重启 DSH。重启后侧边栏会话行三点菜单应出现「删除会话」。

若已安装 dsh-plugin-guard,重启前可检查:

node <path-to>/dsh-plugin-guard/guard.mjs check --profile desktop

只想试逻辑、不写入 profile:在克隆目录运行 node scripts/selftest.mjs(使用临时目录与真实 .dsh 下的哑会话,README 说明 real-home-test 会自造自删)。

环境要求(package.json):Node >=22;平台 Windows / macOS / Linux。宿主需带 Web 服务端(desktop / dsh web);纯 CLI 形态下 inject = ['webServer'] 不满足,插件不启动、不会删任何数据。

典型用法

侧边栏 → 会话行右侧「…」→ 删除会话 → 在确认对话框中确认 → 永久删除。

宿主 API(仅本机回环):

  • GET /api/dsh-session-menu-delete/health
  • POST /api/dsh-session-menu-delete/delete,body:{ "sessionId": "<uuid>" }

删除流程与边界(适用场景)

适合:需要清理磁盘上的冷会话或能安全从内存摘除的 live 会话;希望菜单里一次操作完成目录 + 投影缓存 + 列表移除。

不适合:需要可恢复删除或回收站场景——请勿使用本插件。

行为边界(来自 README):

情况 结果
live 会话无法安全摘除 HTTP 409,说明原因,不动磁盘
目录与缓存都未找到 不伪装成功
只找到投影缓存、未找到会话目录 HTTP 500 partial,避免刷新后列表行复现
卸载插件 菜单项消失;已删会话不会回来

删除顺序在实现中固定:先 sessions.liveEntryFor() + detachEntered() 与 agent 摘除 → 等待 800ms → 删目录与缓存文件 → 再等待 400ms 补删投影并 table.delete(id) → 发出 removed 事件。会话日志文件名不写死,按目录内版本号最大的 session*.jsonl(含 .zstd)规则与宿主一致。

兼容性说明:依赖侧边栏插槽与会话目录布局等相对稳定契约,以及 sessions.liveEntryFor() 等内部 API。宿主若改内部方法名,最坏情况是「磁盘已删、左侧列表仍在」,刷新页面后正常;不会波及其他会话数据。插件 deliberately 不 import 宿主 asar 内包,路径规则为自带实现。

卸载

  1. 从 profile 的 dsh.profile.bundles 删除 "dsh-session-menu-delete";
  2. 从 dependencies 删除同名条目;
  3. profile 目录 pnpm install,重启 DSH。

结尾

DSH 默认只归档、不删盘;dsh-session-menu-delete 在三点菜单里补上「删除会话」,本地回环完成摘会话、删目录与投影缓存并更新侧边栏。使用前请理解不可恢复性与 409 / partial 等护栏含义,并核对源码与许可证。

  • 目录页:https://www.skillhub.cn/plugins/Dcmwfg/dsh-session-menu-delete
  • GitHub:https://github.com/Dcmwfg/dsh-session-menu-delete
羽毛球分组比赛记分
小程序二维码

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

小夜