dsh-session-delete:为 DSH Web 侧边栏补上「删除会话」

前言

DeepSeek Harness(DSH)Web 客户端的会话行菜单里,内置动作通常是重命名、分叉会话、归档会话。归档只会把会话从列表里藏起来,日志和投影缓存仍留在磁盘上;若你确实想从 Harness 里移除某条会话、又希望数据还能从系统废纸篓取回,就需要额外的客户端能力。下面介绍社区插件 dsh-session-delete(npm 包名 @jerrrrrywang/dsh-session-delete),维护者为 jerrywang21-debug,分类为客户端插件。

这是什么

该插件在 DSH Web 界面的会话列表上注册独立的删除入口:会话行 ⋯ 菜单中增加「删除会话」,行尾悬停区增加垃圾桶按钮。确认后,会话从 Harness 列表消失,会话日志与投影缓存被移动到系统废纸篓(macOS 默认为 ~/.Trash),而不是在磁盘上做不可逆抹除。DSH 生态强调「一切皆插件」;插件目录页托管于 SkillHub 社区站点,与 DeepSeek / 幻方无官方从属关系。

界面与交互

  1. 菜单项:「删除会话」位于「归档会话」下方(order: 500),红色高亮。
  2. 悬停按钮:垃圾桶图标(order: 300,在归档、钉住之后),带 tooltip。
  3. 二次确认:危险操作确认框,须勾选确认项后才能点「永久删除」;框内展示该会话在磁盘上的占用大小。
  4. 删除成功:说明框给出废纸篓中的路径,便于手动取回。
  5. 拒绝删除:说明框展示宿主返回的原因(例如会话正在运行一个回合)。
  6. 若删除的是当前打开的会话,主区域会先释放选择,避免继续展示已不存在的会话。

删除时实际改动的数据

插件按 DSH 存储布局逐会话处理:

目标 处理方式
<DSH_HOME>/sessions/<工程目录键>/<会话 ID>/ 下的 session.v<N>.jsonl.zstd 及同目录产物 移动到废纸篓
<DSH_HOME>/storages/session_projcache/sessions/<会话 ID>.json 移动到废纸篓
<DSH_HOME>/storages/workspace.json 中的 pinnedSessionIds[]、archivedSessionIds[]、各 workspaces[*].sessionIds[] 就地摘除(索引,非会话本体)
<DSH_HOME>/attachments/v1/objects/ 内容寻址附件 不删除(多会话可能共享)

工程目录键(projectKey)为有损编码,无法由会话 ID 反推;插件通过扫描 sessions/ 下各工程桶定位目录。同卷移动使用 rename;跨卷(EXDEV)时先复制、确认后再删原目录。废纸篓内文件名带 YYYYMMDD-HHMMSS 时间戳,避免重复删除互相覆盖。

与内置能力的关系

内置归档保留数据且仅隐藏列表项;本插件的「删除」是从 Harness 移除会话并将相关文件移入废纸篓。插件为独立包:仅通过官方槽位 sidebar.workspaces.session.menu.item、sidebar.workspaces.session.row.action、shell.overlay 用 ctx.slots.inject() 注册;HTTP 路由为 /api2/session-delete-trash/{inspect,delete};id 均带 session-delete-trash.* 前缀,不复用 pin / rename / fork / archive。宿主侧仅依赖 node: 内建模块,浏览器侧使用 Module Loader 提供的 react 与官方 primitives,无需额外构建步骤。

安全与运行中会话

自建 JSON 接口有三重限制:仅接受 POST;仅接受 Content-Type: application/json;仅接受回环 Host(可通过环境变量 DSH_SESSION_DELETE_TRUSTED_HOSTS 追加受信主机名,逗号分隔)。请求体上限 64 KiB;会话 ID 须匹配 ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$,并做路径转义与「结果仍在 sessions 根目录下」复核。当 agents.get(id).status === 'running' 时拒绝删除;已打开但未在运行的会话可以删除。

安装与启用

一键安装(推荐):在 DSH Web 插件市场搜索 dsh-session-delete,或在终端执行:

dsh plugin --profile <profile> add @jerrrrrywang/dsh-session-delete

本包为 DSH bundle(package.json 中 dsh.bundle.patch 指向包内 cordis.patch.yml)。bundle 与手写 cordis.patch.yml insert 二选一,勿同时使用,否则宿主侧可能因路由重复注册报错。

A. 作为 bundle 安装(推荐):在 profile 的 package.json 中加入依赖并在 dsh.profile.bundles 中列出包名,例如:

{
  "dependencies": {
    "@jerrrrrywang/dsh-session-delete": "link:/Users/jerry/Desktop/DeepSeek工作区/dsh-session-delete"
  },
  "dsh": {
    "profile": {
      "bundles": ["...", "@jerrrrrywang/dsh-session-delete"]
    }
  }
}

然后执行 pnpm install(或经插件市场安装/更新时会一并处理链接)。

B. 手写 insert:在 profile 的 cordis.patch.yml 增加:

- insert:
    - id: session-delete
      name: '@jerrrrrywang/dsh-session-delete'

dsh.client.platform 已声明为 web。两半在应用启动时装载;当前 DSH Desktop 构建无可用 HMR,安装后需重启 DSH,仅刷新页面不够。

版本与引擎(来自 package.json):包版本 0.1.0,Node >=22,DSH >=0.2.0-rc.2,许可证 MIT。

配置

环境变量 默认 作用
DSH_SESSION_DELETE_TRASH macOS ~/.Trash;其他平台 <DSH_HOME>/trash 自定义废纸篓目录
DSH_SESSION_DELETE_TRUSTED_HOSTS 空 追加受信主机名(逗号分隔),用于非回环部署

典型用法

  1. 安装并重启 DSH 后,在侧边栏找到目标会话。
  2. 点击行尾 ⋯ 选择「删除会话」,或悬停后点垃圾桶图标。
  3. 在确认框中勾选确认项,查看展示的磁盘占用,再点「永久删除」。
  4. 根据完成提示中的废纸篓路径,需要时用系统文件管理器从废纸篓恢复(macOS Finder 是否支持「放回原处」取决于 Finder 自身元数据,插件不写该元数据)。

适用场景与注意

适合需要在 Web 界面清理会话、又希望日志与投影缓存仍可从废纸篓找回的 DSH 用户。插件以当前 DSH 进程权限读写 <DSH_HOME> 与废纸篓路径,安装前应自行查看 GitHub 源码 与 MIT 许可证。

已知限制(README 原文):

  • 正在运行的会话不能删。
  • 已装载的空闲会话删除后,进程内可能仍保留对象副本;磁盘与列表已清理,重启 DSH 后彻底释放。
  • 工作区 registry 不可用时,对 workspace.json 的修改可能被回滚,残留为指向不存在会话的 ID,分组视图不会渲染它。
  • 仅对 Web 界面生效;无头 profile 下宿主半边为空操作。

上游测试命令为 node --test(零依赖 node:test,覆盖存储、宿主路由与客户端槽位流程)。

结尾

dsh-session-delete 用官方槽位与独立 API 为 DSH Web 补上「删除会话」,把会话日志与投影缓存移入可恢复的废纸篓,并避开共享附件与运行中会话。目录页:https://www.skillhub.cn/plugins/jerrywang21-debug/dsh-session-delete;源码与说明:https://github.com/jerrywang21-debug/dsh-session-delete。

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

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

Xiaoye