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

前言

DeepSeek Harness(DSH)里,Session 的持久化能力主要负责创建、打开、统计和列出日志;归档只是把 Session 从列表里藏起来,并不会删掉磁盘上的日志目录。试验性会话、误建的 Session、或需要彻底清掉本地痕迹时,只靠归档往往不够。

社区插件 dsh-session-delete(维护者 liufeicc,分类 admin-security)在侧边栏 Session 的「…」菜单里增加一行 Delete session,经确认对话框后,由 Host 侧操作删除该 Session 的 durable log,并同步清理派生状态。下面介绍它的能力边界、行为细节和接入方式。

这是什么

dsh-session-delete 是一个本地 DSH bundle:在每条 Session 的侧边栏菜单中增加永久删除入口,配套确认对话框,以及通过 Typert Gateway 暴露给浏览器的 Host 操作 sessionDelete/delete。

核心功能

侧边栏与确认流程

插件注册 sidebar.workspaces.session.menu.item(id: session-delete,order: 500,紧跟内置的 archive 行)。点击后弹出 shell.overlay 确认框,展示 Session 名称;该操作不可撤销。

Host 删除与状态清理

用户确认后,Host 会:

  1. 从磁盘删除 Session 的 durable log 目录:$DSH_HOME/sessions/<project>/<session-id>/
  2. 清理仍会把它列出来的派生状态:session_projcache、pin 成员关系、以及所属 workspace 的 sessionIds 记账

侧边栏行会尽快消失:workspace 记账变更经现有 Workspace 流到达,Client Session 列表会收到移除通知(handleSessionRemoved 并做一次 baseline refresh)。

Client 服务 sessionDeleteUi

除菜单行外,插件通过 ctx.provide 提供 Client 服务 sessionDeleteUi,供其他 Client 插件复用同一套确认与删除流程,而不必各自实现对话框。当前 README 记载的首个调用方是 dsh-split-workspaces(分屏工作区里每条 Session 行上的删除按钮)。

对外方法为:

request({ sessionId, displayTitle, onDeleted })
  • 没有可用 sessionId 时返回 false
  • 删除成功(或 Session 已不存在)后调用 onDeleted(sessionId);分屏场景下用于释放曾 pin 到该 Session 的面板

与「Live」Agent 相关的拒绝与归档

Harness 没有内置的 Session 删除原语;本插件自行删除产物,唯一不安全的场景是 正在产出工作的 Session。

行为要点(与 README 一致):

  • 仅 真正 running 的 Session 会被拒绝;对话框可提供 Stop and delete:按用户停止的方式取消工作,待 Agent 静默后再删除,避免进行中的 drain 把刚删的文件又写回来
  • 曾有 live Agent、但当前并非 running 的 Session:删除前会先 durable 归档(文档中的 wake block;agent/pre-step 门会读 durable archive 集合),避免排队 wake、goal 轮次或 schedule tick 往已移除的 log 里追加并「复活」Session;该归档 id 有意保留为 tombstone。无 live Agent 的 Session 则改为 unarchive 后删除
  • 已不存在的 Session 视为 missing;对话框按已完成处理并清理陈旧行
  • 经 sessionDeleteUi 进来的调用方,在 Client Session 列表已被告知移除 之后 才收到回调;若 onDeleted 抛错只记日志,不报告删除失败(此时 log 已不存在)

Host 结果中的 guarded: true 表示该 Session 曾有 live Agent,删除过程受归档保护;missing 表示未找到 log。

其他限制与生态交互

  • 删除你正在查看的 Session 时,对话视图仍可能指向已不存在的 log;归档门会阻止仍驻留的 Agent 继续工作,刷新后行会消失。若仍要保留当前视图,建议先切走
  • Session 引用的附件是内容寻址、多 Session 共享的,删除 Session 不会动附件
  • 搜索索引插件 dsh-session-query-sqlite 会在自己的 reconciliation 中丢掉已消失的 log
  • 手写 bundle 不能直接 import @deepseek-ai/*;Host 侧手写 Typert marker 与 typertRemote 绑定,Client 侧手写与 ctx.remote.$mount 匹配的 InvocationDescriptor(Gateway 要求输入 codec 为 strict,且 Client Typert 注册表要求 strict codec 带 create() schema factory)

安装与启用

资料中的 Development 说明:在 profile 的 package.json 里用 link: 指向本插件目录,由 profile 链接该 bundle。README 未给出 SkillHub 或 dsh plugin add 形式的固定安装命令;从 GitHub 仓库 获取源码后,按你现有 profile 的本地插件链接方式启用即可。

package.json 中 dsh.bundle.patch 指向 cordis.patch.yml,用于向 Host 注入单行;Client 配置为 platform: web、immediately: true,并注入 sidebar、workspace、session-controller 等客户端模块。

启用后可在 Plugin Manager 中查看插件展示信息(locale/en.json、locale/zh.json 与 icon.svg)。

Host 侧 index.js 由 Loader 只导入一次,且 hmr.config.root 为空时 修改 Host 代码需重启 Harness 进程 才生效;Client 侧 client.js 从磁盘提供,改完后 浏览器刷新 即可。

典型用法

侧边栏永久删除

  1. 在 workspace 侧边栏打开目标 Session 的「…」菜单
  2. 选择 Delete session(紧挨归档项)
  3. 在确认框中核对 Session 名称后确认
  4. 若 Session 正在运行,按提示选择停止并删除,或先自行停止再删

其他插件调用 sessionDeleteUi

在已依赖本插件的 Client 插件中,通过 ctx.get 取得 sessionDeleteUi,调用 request 并传入 sessionId、displayTitle 与成功后的 onDeleted。空 sessionId 会被拒绝(返回 false)。

适用场景与注意

适合谁: 需要在本地 DSH 环境做 Session 生命周期治理的开发者或管理员——清理试验 Session、去掉误建记录、在分屏或多入口 UI 里统一删除体验(配合 dsh-split-workspaces 等)。

安全与权限: 删除操作以当前 dsh Host 进程的身份与文件系统权限 执行,会直接移除 $DSH_HOME/sessions/... 下目录。安装或 link 前请阅读 源码 与 MIT 许可证,确认符合你的合规要求。

生态说明: DSH 倡导「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系,本文不构成官方产品说明。

结尾

dsh-session-delete 补上了 DSH 默认能力里缺少的一步:在确认之后永久移除 Session log,并处理 live Agent、归档 tombstone 与 workspace 记账等边界。需要菜单删除、可复用对话框或 Host 端 sessionDelete/delete 时,可从目录页或 GitHub 获取 bundle,按 profile link: 方式接入。

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

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

Xiaoye