Files
session-delete/README.md
T
pyh b9445cbf4d docs: install from the git address or a tarball, and say why the npm source cannot work
Gitea's npm registry returns a fixed field set, so the dsh field never reaches the installer's registry preflight and the install is refused with 'declares no dsh.bundle'. The tarball and the git address carry the real package.json, so they are the routes that work.
2026-09-30 12:03:03 +08:00

5.1 KiB
Raw Blame History

会话彻底删除

DeepSeek Harness(DSH)插件:给会话加上真正不可逆的删除,并清理已删除会话遗留的临时文件。

DSH 原本只能归档会话——归档只是把会话从列表里移开,日志仍然留在磁盘上。这个插件提供两处删除入口,以及设置页里的一次性孤儿文件清理。

功能

1. 删除会话

两个入口,行为一致,都会先弹出确认弹窗(复刻系统 Modal 的样式与键盘行为:Esc 关闭、Tab 焦点圈定、打开时焦点进入、关闭后焦点归位):

  • 会话行右侧 ⋯ 菜单 → 删除会话
  • 会话行悬停时的 🗑 快捷按钮(占用原「归档会话」的位置,归档改从菜单进入)

确认后一次性处理:

对象 处理方式
会话日志目录 整个删除,仅保留 session.lock
子智能体会话 按 parentSession 递归收集,连同日志与溢出文件一并删除
工具输出溢出文件(spill) 删除该会话(含子会话)对应的 spill 目录
工作区登记项 解除绑定、取消置顶、取消归档
客户端列表 广播 api-session/removed,列表行立即消失

有意不处理:

  • 附件对象($DSH_HOME/attachments/v1/objects):按内容 sha256 寻址,同一份内容可能被多个会话共享,而 DSH 没有引用计数,跟着一个会话删除会破坏别的会话;
  • 投影缓存($DSH_HOME/storages/session_projcache):由日志派生的缓存,读取时带生命周期身份校验,永远不会串到别的会话。

2. 清理临时文件

设置 → 通用设置 → 清理临时文件,清理 spill 后端留下的孤儿目录。判定偏保守:

  1. 目录名必须精确等于 session-<sha256(会话 id) 前 12 位>——这是 spill 后端唯一会生成的形状;
  2. 该名字不属于任何已知会话(存量会话与内存中正在运行的会话都算);
  3. 只在 spill 的 root 内操作(后端当前 root + 系统临时目录下的 dsh-spill*);
  4. 符号链接一律跳过、不跟随;单项失败只记警告。

结果直接显示在该行(清理了几个目录、几个文件、释放多少空间),可反复点击。

行为与边界

  • 仍在运行的会话无法被插件从内存里移除:它会先被归档并停止,日志与溢出文件在下次启动 DSH 时删除(界面会明确提示);在此之前取消归档就会取消这次删除。
  • 删除不可恢复,但不是安全擦除:按普通文件删除处理,底层介质上可能有残留。
  • 工作区里的代码文件不受影响。
  • 溢出文件被删除后,fork 出来的会话日志里若仍保留指向它的路径文本,那些路径会失效。

安装

在 DSH 的 插件 → 添加插件 里填下面任意一种。

1. Git 仓库地址(推荐)

https://gitea.iwake.top/dsh-plugin/session-delete.git#v1.0.1

# 后面可以跟标签或提交,用来锁定版本;不写则取默认分支。仓库是公开的,不需要凭据。

2. 本地 tgz

把 session-delete-1.0.1.tgz 下载到运行 DSH 的机器上,在安装界面里填它的绝对路径。

关于「npm 源」这种方式

本插件也发布在自建 Gitea 的 npm 仓库里(https://gitea.iwake.top/api/packages/dsh-plugin/npm/,包名 @dsh-plugin/session-delete),但目前不能用它安装:Gitea 返回包清单时只保留 name、version、description、author、homepage、license、repository、readme、dist、maintainers 这些字段,插件需要的 dsh(即 dsh.bundle.patch)会被丢掉;而 DSH 的安装预检要求清单里声明 dsh.bundle,于是会报:

这个包没有声明组合包,无法作为插件安装:@dsh-plugin/session-delete declares no dsh.bundle

git 地址与 tgz 这两条路没有这个问题——它们是先把包取到本地、再读它自己的 package.json,字段完整。如果将来把它发到保留自定义字段的注册表(npmjs 等),npm 源那条路才走得通。

安装或升级后:宿主半变更需要重启 DSH(完全退出再打开,仅关闭窗口不一定退出进程);只改浏览器半时刷新页面即可。

兼容性

基于 DeepSeek Harness 0.2.0-rc.2 编写。DSH 仍在演进,其它版本与平台组合未逐一验证。

  • 浏览器半不 import 任何 Harness 客户端包(上游规范如此要求:这些包随时可能变化,渲染抛错会让整个插槽条目变空白),而是复刻 dsh-client-ui-primitives 的 markup、CSS 声明、图标 path 数据与键盘行为,只保留 --dsw-* 主题 token 引用。上游若改动这些内部结构,界面细节可能失配(例如悬停气泡不再出现),但不会导致插件加载失败。
  • 宿主半只依赖稳定的服务契约:sessionPersistence、sessionQuery、workspaceRegistry、sessions、agents、connection.fetch,以及 spill 后端的目录规则。

License

MIT