前言¶
DeepSeek Harness(DSH)内置了 archiveSession,可以把会话归档,但界面上仍可能长期留着「删不掉」的会话记录。常见有两种情况:只删除工作区时,确认文案会说明文件夹和会话日志会保留,会话会落到 Ungrouped;持久化层文档也写明,没有删除会话文件的 API,日志会在 root 下累积,只能外部清理。若你希望从侧栏和磁盘上真正去掉某次对话,需要额外能力。下面介绍社区插件 dsh-session-delete(维护者 spidu-lee),它在会话「⋯」菜单里增加「永久删除会话」,并在确认后清理磁盘目录、投影缓存与各工作区关联。
这是什么¶
dsh-session-delete 是一个面向 DSH Web 配置的 bundle 插件(platform: web),当前版本 0.1.0,许可证 MIT。它在侧栏每个会话的 「⋯」菜单 中插入一条危险操作项,用与官方归档类似的 Modal 做确认(非原生 window.confirm),确认后由宿主侧路由完成删除,并通过 api-session/removed 通知各客户端立刻从列表移除该行。
与只做 UI 操作的会话菜单类插件不同,该插件会删除 磁盘上的会话记录(日志目录等),并清理指向该会话的关联;这是 README 中强调的与 DSH 自带能力的主要差异。
核心功能¶
侧栏菜单与确认对话框¶
| 项 | 说明 |
|---|---|
| 插槽 | sidebar.workspaces.session.menu.item |
| 行 id | dsh-session-delete.session.delete |
| 顺序 | 500(位于内置 pin 100 / rename 200 / fork 300 / archive 400 之后) |
| 样式 | ui-primitives MenuItemButton,danger + separatorBefore,图标 IconTrashOutlineRegular |
确认层挂在 shell.overlay,入口 id 为 dsh-session-delete.session-delete-confirm。行与对话框通过模块级 pending 请求存储解耦,避免进行中的状态泄漏。对话框会通过 ctx.get("sessions").retainInfo(id) 说明当前窗口是否仍打开或持有该会话。
若你正在 Main 视图里查看的就是待删会话,插件会先导航到其他会话(或在工作区无其他行时 startSession()),等待 mainView 引用计数下降并让宿主释放,再执行删除;若 5 秒内未完成释放,会取消删除并提示 dialog.stillOpen,避免删后又被写回。
宿主侧删除流程(概要)¶
README 用表格列出了 12 步逻辑,核心包括:
- 校验
sessionId(单路径段,禁止..)。 - 在
<sessionsRoot>/<projectKey>/<sessionId>下定位目录(projectKey 为 cwd 的有损编码,通过扫描而非反解)。 - 无目标时返回
404。 - 通过
workspace/session-activity瀑布查询是否仍有活动(与archive相同);若有则派发workspace/session-stop并轮询直至稳定。 - 若活动拒绝结束则
409,并在消息中说明仍在运行什么。 - 对仅 loaded 在内存中的会话也派发
workspace/session-stop,防止删除后 header 再写回磁盘。 - 使用
fs.rm(dir, { recursive: true, force: true })删除目录。 - 删除后最多 4 轮、间隔 350 ms 再次检查目录;若被写回则返回
delete-resurrected而非成功。 - 文件删除成功后,经 registry entity API 从各工作区 detach 并 unpin。
- 尽力删除
storages/session_projcache/sessions/<id>.json(失败以 warning 报告)。 - 检查宿主 store 或持久化层是否仍列出该会话,并以 warning 说明,而非声称完全干净(插件无法调用 sessions 的 removal API)。
- 发出
api-session/removed,各打开窗口立即去掉侧栏行。
README 还说明:活跃性判断使用 workspace/session-activity 而非简单查 Agent 注册表,因为 DSH 会为任意在窗口中打开的会话保留 Agent, idle 会话也会被误判为「仍在运行」。
安装与启用¶
从市场安装(README 注明「一旦上架」可用):
dsh plugin --profile web add github:spidu-lee/dsh-session-delete
也可在 profile patch 中手工插入:
# cordis.patch.yml
- insert:
- id: session-delete
name: 'dsh-session-delete'
包同时声明 dsh.bundle.patch 与 dsh.client(platform: web),按普通 bundle 安装。安装后需重启 DSH:宿主侧在启动时挂载路由族。
README 说明:package.json 中 "private": true 是有意为之,npm 上已有无关包占用 dsh-session-delete 名称,因此该插件仅从 GitHub 分发。
典型用法¶
- 按上文命令为 web profile 安装插件并重启 DSH。
- 在侧栏目标会话上打开 「⋯」菜单,选择永久删除相关菜单项(文案以插件 locale 为准)。
- 在 Modal 中阅读关于本窗口是否仍打开/持有该会话的说明,确认后执行删除。
- 若删除的是当前 Main 视图中的会话,等待插件自动切换会话并完成释放后再删;失败时对话框保持打开并显示宿主返回的错误(例如活动无法结束、日志被写回等)。
无需额外配置文件;行为由插件 bundle 与宿主 API 完成。
适用场景与注意¶
适合谁: 需要清理 $DSH_HOME/sessions 下累积日志、并从所有工作区侧栏去掉某会话的 DSH 用户;与仅归档或仅删工作区文件夹的场景互补。
权限与安全: 插件以当前 DSH 进程权限运行,会直接递归删除会话目录。安装前请阅读 GitHub 仓库 源码与 MIT 许可证,确认可接受其停止活动、删盘、detach 工作区等行为。
能力边界: 删除文件后,宿主内存 store 或持久化层中的 pending 条目可能仍短暂存在;README 明确插件无法清空这些内部结构,会在结果中以 warning 说明。永久删除不可恢复,操作前请确认会话 ID 与内容。
生态说明: DSH 社区插件目录(如 SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系;本文安装命令以仓库 README 为准。
结尾¶
dsh-session-delete 补上了 DSH 原生 archiveSession 未覆盖的缺口:在侧栏提供可确认的永久删除,并同步清理磁盘日志、投影缓存与工作区关联。更多信息见目录页 skillhub.cn/plugins/spidu-lee/dsh-session-delete 与源码 github.com/spidu-lee/dsh-session-delete。