前言¶
DeepSeek Harness(DSH)Web 客户端的会话行菜单里,内置动作通常是重命名、分叉会话、归档会话。归档只会把会话从列表里藏起来,日志和投影缓存仍留在磁盘上;若你确实想从 Harness 里移除某条会话、又希望数据还能从系统废纸篓取回,就需要额外的客户端能力。下面介绍社区插件 dsh-session-delete(npm 包名 @jerrrrrywang/dsh-session-delete),维护者为 jerrywang21-debug,分类为客户端插件。
这是什么¶
该插件在 DSH Web 界面的会话列表上注册独立的删除入口:会话行 ⋯ 菜单中增加「删除会话」,行尾悬停区增加垃圾桶按钮。确认后,会话从 Harness 列表消失,会话日志与投影缓存被移动到系统废纸篓(macOS 默认为 ~/.Trash),而不是在磁盘上做不可逆抹除。DSH 生态强调「一切皆插件」;插件目录页托管于 SkillHub 社区站点,与 DeepSeek / 幻方无官方从属关系。
界面与交互¶
- 菜单项:「删除会话」位于「归档会话」下方(
order: 500),红色高亮。 - 悬停按钮:垃圾桶图标(
order: 300,在归档、钉住之后),带 tooltip。 - 二次确认:危险操作确认框,须勾选确认项后才能点「永久删除」;框内展示该会话在磁盘上的占用大小。
- 删除成功:说明框给出废纸篓中的路径,便于手动取回。
- 拒绝删除:说明框展示宿主返回的原因(例如会话正在运行一个回合)。
- 若删除的是当前打开的会话,主区域会先释放选择,避免继续展示已不存在的会话。
删除时实际改动的数据¶
插件按 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 |
空 | 追加受信主机名(逗号分隔),用于非回环部署 |
典型用法¶
- 安装并重启 DSH 后,在侧边栏找到目标会话。
- 点击行尾
⋯选择「删除会话」,或悬停后点垃圾桶图标。 - 在确认框中勾选确认项,查看展示的磁盘占用,再点「永久删除」。
- 根据完成提示中的废纸篓路径,需要时用系统文件管理器从废纸篓恢复(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。