前言¶
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。
- 仓库:liufeicc/dsh-session-delete
- 目录页:SkillHub 插件页
- 包名:
@local/dsh-session-delete(package.json版本 1.0.0) - 许可证:MIT
核心功能¶
侧边栏与确认流程¶
插件注册 sidebar.workspaces.session.menu.item(id: session-delete,order: 500,紧跟内置的 archive 行)。点击后弹出 shell.overlay 确认框,展示 Session 名称;该操作不可撤销。
Host 删除与状态清理¶
用户确认后,Host 会:
- 从磁盘删除 Session 的 durable log 目录:
$DSH_HOME/sessions/<project>/<session-id>/ - 清理仍会把它列出来的派生状态:
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 从磁盘提供,改完后 浏览器刷新 即可。
典型用法¶
侧边栏永久删除¶
- 在 workspace 侧边栏打开目标 Session 的「…」菜单
- 选择 Delete session(紧挨归档项)
- 在确认框中核对 Session 名称后确认
- 若 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: 方式接入。