DSH-DELETE
English | 中文
面向 DeepSeek Harness 的可恢复对话删除插件:在会话行 … 菜单中添加「删除对话」,并注册人工命令 /delete-conversation。用户确认后,目标 Session 进入删除队列,立即通过 Workspace 的持久归档投影从列表中隐藏;DSH 下次启动时,插件会在 Web Workspace 建立会话索引之前校验该 Session 的完整生命周期,并把其日志目录原子移动到可恢复垃圾箱。
> 代码源自 omdsh-dev/dsh-essential(MIT,Copyright (c) 2026 ExDragine)。本仓库将包名/Remote ID/UI 类名统一重命名为 dsh-delete,并为 stateDir 增加了默认值(~/.dsh/conversation-trash),使插件市场一键安装无需手写配置。
为什么删除是两阶段的
当前 DSH 的 Session 持久化约定是只追加的,公开服务没有删除方法;活动 Agent 的销毁句柄只属于创建者。插件不能安全地从活动写入者脚下移走日志。因此删除分两阶段:当前进程只写入一条持久请求并立即隐藏会话行,下一次启动在任何会话恢复之前完成日志移动。这个边界避免日志重建、部分写入和生命周期竞争。
安装
方式一:DSH 插件市场(推荐)
本仓库自带构建产物(lib/),市场可一键安装,无需构建、无需填写配置:
1. 打开 DSH Web GUI → 设置 → DSH插件市场 2. 搜索 DSH-DELETE,点「安装」 3. 重启 DSH
方式二:官方 bundle 安装
node /path/to/DSH/apps/cli/lib/bin.js plugin --profile web add /path/to/DSH-DELETE安装后重启 DSH。Bundle 会挂载 dsh-delete,并让 Web Workspace 等待 conversationDeletion 服务完成启动恢复后再建立 Session 索引。
方式三:直接写 cordis.patch.yml
- insert:
- id: dsh-delete
name: dsh-delete
config:
stateDir: /absolute/path/to/conversation-trash
- id: workspace
inject: [conversationDeletion]stateDir 必须是绝对路径且位于 Session 工件目录之外;缺省时使用 ~/.dsh/conversation-trash。
使用
- 在会话列表中打开目标会话右侧的
…菜单,选择「删除对话」。确认卡片为站内 UI(标题「确认删除该对话吗?」,操作「取消 / 删除对话」),不用浏览器原生弹窗。 - 删除请求成功后立即归档该 Session,使其从所有会话分组中隐藏(完全成功时行消失即为反馈)。
- 若删除请求已写入但归档接口失败,卡片会提示「已加入队列但暂时无法隐藏」,不会误报为删除失败。
- 人工命令:
/delete-conversation CONFIRM(删除当前对话);/delete-conversation <session-id> CONFIRM(按 Session id 删除其他对话)。
确认成功后重启 DSH,日志被移至 <stateDir>/trash/<session-lifecycle-key>/。目录中的 deletion.json 记录原目录。
恢复
先停止 DSH,删除恢复目录中的 deletion.json,再把该目录移回 originalDirectory。不要在 DSH 运行时恢复。
配置
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
stateDir | string | ~/.dsh/conversation-trash | pending 请求与恢复垃圾箱所在目录;必须为绝对路径且位于 Session 工件目录之外 |
commandName | string | delete-conversation | 人工命令别名(不带 /);菜单始终使用稳定的 /delete-conversation |
安全与恢复语义
- 命令要求字面量
CONFIRM,缺少确认不会写入请求。 - 请求绑定
sessionId、createdAt与cwd;id 被复用时不会删除新的 Session 生命周期。 - 移动前再次比较持久化列表、backend location 与完整 inspect 结果。
- 产品删除使用同一文件系统内的目录
rename,不unlinkSession 日志;移动后崩溃也可恢复。 - 验证或移动失败时保留 pending 请求并记录错误,原日志不动。
- 仅支持逐 Session JSONL backend:SQLite 没有独立 artifact location,插件会明确拒绝。
- 不永久擦除:日志进的是可恢复垃圾箱,保留期与最终清理属于部署管理员策略。
开发构建
要求 Node ^22.19.0 || >=24.0.0(tsdown 依赖 Promise.withResolvers)。Windows 上确保构建用的 Node 22+ 在 PATH 首位:
pnpm install
pnpm add -D -w unrun # tsdown 的可选 peer,pnpm 的 autoInstallPeers=false 下必须显式安装
pnpm run build
pnpm run verify:self-contained
pnpm run typecheck
pnpm test许可
MIT。原始版权归属 dsh-essential(Copyright (c) 2026 ExDragine),详见 [LICENSE](LICENSE)。