前言¶
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 / 幻方无官方从属关系。
核心功能¶
- 菜单入口:插槽
sidebar.workspaces.session.menu.item,order440,排在 archive(400) 之后;shell.overlay弹出确认框。 - 删除范围:
<DSH_HOME>/sessions/<workspaceKey>/<id>/与会话投影缓存storages/session_projcache/sessions/<id>.json;目录名支持裸 UUID 与session-<uuid>两种形态。 - 列表即时更新:删除流程末尾
ctx.emit('api-session/removed', id);不修改workspace.json,由客户端推导列表。 - 纯本地:宿主半只监听回环地址,不联网、不调外部接口;同源与 trustedHosts 校验,外部 Origin 返回 403。
- 配置方式:通过插件自带
cordis.patch.yml的 bundle patch 加载,不需要改 profile 的cordis.patch.yml。
官方自带能力只有归档;本插件补的是「可确认的永久删除」。README 明确:删了就没了,无回收站、无恢复入口。
安装与启用¶
路径不要含空格(Windows 上 link: + pnpm install 会做 junction,空格或特殊字符易失败)。
- 克隆仓库到本地:
git clone https://github.com/Dcmwfg/dsh-session-menu-delete.git
- 编辑所用 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"
]
}
}
- 在 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/healthPOST /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 内包,路径规则为自带实现。
卸载¶
- 从 profile 的
dsh.profile.bundles删除"dsh-session-menu-delete"; - 从
dependencies删除同名条目; - 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