前言¶
DeepSeek Harness(DSH)侧栏里,原生对会话主要是「归档」:日志仍落在 ~/.dsh/sessions/,没有真正意义上的删除入口。长时间开发或试验后,侧栏和磁盘上的会话会越堆越多,想清掉某条又不敢硬删日志时比较别扭。
dsh-session-delete 是社区维护的客户端 bundle,在 Web GUI 上补「删除会话」能力,并把删除做成先移入回收站、默认保留 3 天、可恢复或立即清除的流程。下面介绍它做什么、怎么装、怎么用,以及和原生归档的差别。
这是什么¶
- 插件名称:
dsh-session-delete(GitHub:Zyl20030506/dsh-session-delete) - 维护者:Zyl20030506(package 作者字段为 zyl54)
- 分类:客户端(
dsh.client,platform: web) - 许可证:MIT
- 版本(package.json):1.0.0
一句话:给 DSH 加一个会话回收站——红色菜单项把会话移入回收站,侧栏底部可打开回收站恢复或清空;到期由清扫任务永久删除。
核心功能¶
界面行为(README 中的对照表)如下。
| 位置 | 行为 |
|---|---|
| 会话「…」菜单 → 删除会话 | 确认后移入回收站;日志移出持久化根,侧栏立即不再显示 |
| 侧栏底部 → 回收站 | 列出待处理会话:标题、删除时间、剩余天数 |
| 回收站 → 恢复 | 日志搬回原路径并取消归档,回到原工作区原位置(原置顶会恢复置顶) |
| 回收站 → 立即清除 | 二次确认后永久删除该条 |
| 回收站 → 清空回收站 | 二次确认后清空全部 |
| 到期清扫 | 插件启动时、每 30 分钟、每次打开回收站前各扫一次 |
要点:
- 删除 ≠ 硬删:先进入
<DSH_HOME>/session-trash/v1/<sessionId>/,不在sessions/持久化根下,因此会从会话列表、侧栏、搜索索引里消失,而不是仅靠标记隐藏。 - 隐藏手段:删除流程里会调用 DSH 的归档机制隐藏行;恢复时用回收站的「恢复」,不要用原生「取消归档」(那只把行放回来,日志仍在回收站里)。
- 文案:界面支持中文 / English / 日本語,跟随 DSH 语言设置。
与原生「归档会话」对比:
| 操作 | 归档标记 | 日志位置 | 到期自动删 |
|---|---|---|---|
| 原生「归档会话」 | 设置 | 原地不动 | 不会 |
| 本插件「删除会话」 | 设置(作为隐藏手段) | 移入回收站 | 会(默认可配置) |
安装与启用¶
插件是普通 DSH bundle(package.json 声明 dsh.bundle.patch 与 dsh.client)。从 GitHub 安装 Web profile:
dsh plugin --profile web add github:Zyl20030506/dsh-session-delete
装完后重启 DSH(客户端插件代码会缓存在页面里)。卸载:
dsh plugin --profile web remove dsh-session-delete
本地改代码时,可用安装器从目录 link(README 示例为 plugin_manager 的 install_bundle,target 为本目录绝对路径);改完刷新页面即生效。包名 dsh-session-delete 若改名,须同步 package.json 的 name、client.js 里 _ModuleLoader__.load({ id }) 的 id,以及 cordis.patch.yml 里的 name。
安全说明:插件以后端路由和文件操作方式在 DSH 进程权限下运行。安装前建议查看 GitHub 仓库 源码与 MIT 许可证,确认符合你的环境策略。
配置¶
保留期与清扫间隔可在 profile 的 bundle 配置里调整:
- id: session-delete
name: 'dsh-session-delete'
config:
retentionDays: 7 # 默认 3
sweepMinutes: 60 # 默认 30
若不想自动过期删除,可把 retentionDays 调大(例如 3650),仅用手动「立即清除」。
典型用法¶
- 在侧栏打开某会话的「…」菜单,点底部红色「删除会话」,确认后该会话从侧栏消失。
- 点侧栏底部(设置按钮旁)的回收站入口,查看角标上的待清理数量。
- 在回收站里对单条会话选择「恢复」,或「立即清除」;也可「清空回收站」一次处理全部。
- 不操作则默认保留 3 天(或你配置的
retentionDays),由清扫任务到期删除。
Host 侧对外两条路由(受 DSH 浏览器鉴权保护):
POST /api/plugin.session-delete { sessionId, title } → 移入回收站
POST /api/plugin.session-trash { action, sessionId?, payload? } → list | restore | purge | empty
回收站目录结构(概念上):
<DSH_HOME>/session-trash/v1/<sessionId>/
meta.json # 标题、删除时间、到期时间、原始路径、工作区与位置信息、是否置顶等
data/session.v4.jsonl.zstd # 从 sessions 目录整体搬来的日志
工作原理与安全边界(简叙)¶
删除前会查询 workspace/session-activity:有正在运行的回合、子任务、后台任务或定时提醒时会拒绝,并告知类型。还会拒绝删除当前主视图正在显示的会话(避免视图继续往已移走的日志里写)。文件 rename 若遇占用(EPERM/EBUSY/EACCES)会提示并回滚。步骤失败时尽量搬回文件、取消归档,保持原状态。
不会删除:用户附件(~/.dsh/attachments)、临时 spill(%TEMP%\dsh-spill-*)、会话在工作区产出的文件等。
已知 UI 现象:「显示已归档」筛选里有时仍能看到已进回收站的会话(Agent 仍驻留时会被列出);点开会提示无法打开,彻底清除或 Agent 释放后消失。
DSH 升级可能导致部分内部 API 漂移;插件在能力缺失时会拒绝删除并提示 incompatible,回收站弹窗顶部也会列出缺少的能力。排查可在 DevTools 控制台搜 session-delete。
适用场景¶
- 日常用 DSH Web GUI,需要清理试验会话或错误创建的会话,又希望有几天的反悔期。
- 希望和「只归档、日志不动」区分开:要明确把日志移出
sessions/并支持定时清扫。 - 在 Windows 上 README 称已完整验证;POSIX 依赖回收站与
sessions/同在DSH_HOME下的同卷rename。
不适合指望它清理附件、工作区产出或 spill 临时文件的场景;那些需用 DSH 或其它工具单独处理。
开发与测试¶
Host 逻辑测试无额外依赖,需 Node ≥ 22:
npm test # 等价于 node test/trash.test.mjs
README 说明测试用临时目录与伪造 Cordis 服务,覆盖入站、列表、恢复、清除、清扫、活动会话拒绝等 18 个用例。
结尾¶
dsh-session-delete 用回收站把「删会话」做成可逆操作:菜单删除、侧栏回收站、可配置保留期,并在有活动任务或文件占用时保守拒绝。社区目录与 DeepSeek / 幻方无官方从属关系,安装方式以仓库 README 为准。