dsh-session-delete:为 DSH 会话侧栏补上真正的删除

前言

DeepSeek Harness(DSH)里,会话可以归档,但产品层面不提供「删除会话」。dsh-client-ui-workspace 写明「没有 Session 删除」——会话只能归档、不能删除;dsh-session-persistence-jsonl 在存储层同样说明「不删除会话文件」,日志在 root 下累积,直到外部移除,且 seam 没有删除 API。归档只是在 $DSH_HOME/storages/workspace.json 的 archivedSessionIds 里记录 id,磁盘上的会话日志、投影缓存和附件都还在。

若你本地试会话、分叉或子智能体跑多了,$DSH_HOME/sessions 会持续变大,仅靠归档无法清掉数据。社区插件 dsh-session-delete(维护者 LilJoeIJOYU,分类:客户端)把文档里说的「唯一可行的外部移除」做成 Session 侧栏「…」菜单里的一行操作,经确认后删除存储日志、投影缓存,并默认级联子 agent 会话相关文件。

这是什么

dsh-session-delete 是 DSH 的 bundle 插件:Host 侧提供 sessionJanitor/deleteSession 远程调用,集中实现删除规则;Client 侧在会话行菜单增加 destructive 风格的「删除会话」项,并在 shell.overlay 里弹出确认框。删除成功后从归档、置顶集合里去掉 id,并发出 api-session/removed,已连接的 Client 会立刻去掉侧栏行。

仓库:https://github.com/LilJoeIJOYU/dsh-session-delete
目录页:https://www.skillhub.cn/plugins/LilJoeIJOYU/dsh-session-delete

核心功能

侧栏与交互

  • 在 Session「…」菜单增加一行(扩展点 sidebar.workspaces.session.menu.item,order: 500,排在内置的重命名 / 分叉 / 置顶 / 归档等项之后,上方有分组细线,使用 host 的危险行配色)。
  • 点击后走确认对话框;菜单收起后仍由 overlay 承载确认逻辑。
  • 菜单只负责调用 Host Remote,不重复实现删除策略。

删除会移除什么

对目标 Session,以及默认其下所有 subagent Session,插件会尝试删除:

路径 含义
$DSH_HOME/sessions/<project-key>/<session-id>/ 存储日志(如 session.v4.jsonl.zstd)
$DSH_HOME/sessions/<project-key>/<session-id>.jsonl[.zstd] 旧版扁平布局 sibling
$DSH_HOME/sessions/<session-id>.jsonl[.zstd] 旧版扁平 root 布局
$DSH_HOME/storages/session_projcache/sessions/<session-id>.json 投影 checkpoint

随后从 archive、pin 集合中移除该 id,并广播 removed 事件。

刻意不删的内容:

  • $DSH_HOME/attachments 与 $DSH_HOME/cache/attachments 下按内容寻址的附件(多 Session 共享 hash,删一个可能伤及其他会话)。
  • Session 搜索索引(每次读会与 sessionPersistence.list() 对齐,日志没了会自动掉出索引)。
  • workspaces[].sessionIds 注册表项(无 removal API;侧栏由 Session 摘要驱动,无效 id 不会显示行)。

失败与拒绝(reason)

deleteSession 返回结果对象,不抛异常;常见 reason:

reason 含义
invalid-id 不是合法 Session id
active 当前 Harness 进程里仍有 Agent 占用该会话日志(见下文)
unknown 磁盘上找不到该 id 的存储
partial 部分路径删除失败(锁或权限);failed 列出残留路径

partial 时侧栏仍会退役该行,对话框会展示未删干净的路径。

为何「已打开过的会话」删不掉

只要本进程里 Agent 仍绑定该 Session(例如打开或查看历史时 controller 会 resume Agent),日志 writer 仍活跃,删文件会被后续 append 写回或导致 flush 报错。因此拒绝条件看 Agent 是否 live,不是看是否归档或是否当前选中。实践上:本次运行从未打开过的 Session 可立即删;打开过的需 重启 Harness 后、再次打开该 Session 之前 执行删除。归档不会卸载 Agent,切换到别的 Session 也不会。

安装与启用

在当前 profile 以 bundle 安装;不要手改 profile 的 package.json,也不要在 profile 目录里自行跑 pnpm。可让 Agent 调用 plugin_manager,或自行执行:

plugin_manager action=install_bundle target=https://github.com/LilJoeIJOYU/dsh-session-delete

若使用本地 checkout,把 target 换成该目录的绝对路径:

plugin_manager action=install_bundle target=<absolute path to this checkout>

Host 侧模块(index.js、purge.js、remote.js、typert.host.js 等)在进程内已 import 后无法热替换;改 Host 代码需 下次启动 Harness 才生效。Client 半在安装 bundle 后可无需重启加载。

插件以当前 DSH 进程权限操作 $DSH_HOME 下的文件;安装前建议阅读仓库源码与 MIT 许可证(package 版本 0.1.0,Node >=22)。

典型用法

  1. 安装 bundle 并启动(或重启)Harness,确保 Host 插件已加载。
  2. 在侧栏找到要清理的 Session;若本会话中曾打开过它,先完全退出 Harness 再启动,且 不要 先点开该 Session。
  3. 点击该行「…」→ 删除会话 → 在 overlay 确认。
  4. 若返回 partial,按对话框提示检查 failed 路径(权限、文件锁等)。

仓库内自测(使用临时 Harness home,不碰真实数据):

node --test "test/*.test.mjs"

适用场景与注意

适合: 需要真正释放磁盘、而不只是归档 id 的开发者;清理试跑会话、大量分叉或 subagent 树;与 DSH「日志只增、seam 无删 API」模型对齐的本地维护。

注意:

  • 删除不可通过 DSH 内置能力恢复;确认框是最后一道闸。
  • 当前 Client 仍「开着」的 Session 无法删除;Harness 没有单独 dispose 一个 Session Agent 的 API。
  • 级联 subagent 依赖父日志里的 ctx.subagents.listDescendants;父日志损坏时可能留下孤儿 Session 目录。
  • SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店;插件来源与行为以 GitHub README 与源码为准。

结尾

dsh-session-delete 补的是 DSH 刻意留空的能力:在侧栏用一次确认,把会话日志、投影缓存和(默认)子 agent 日志从磁盘清掉,并让 UI 同步退役。归档仍适合「藏起来」;要「删掉」,用这个客户端 bundle 即可。

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

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

Xiaoye