# DSH-DELETE [English](README.md) | **中文** 面向 DeepSeek Harness 的**可恢复对话删除**插件:在会话行 `…` 菜单中添加「删除对话」,并注册人工命令 `/delete-conversation`。用户确认后,目标 Session 进入删除队列,立即通过 Workspace 的持久归档投影从列表中隐藏;DSH 下次启动时,插件会在 Web Workspace 建立会话索引之前校验该 Session 的完整生命周期,并把其日志目录原子移动到可恢复垃圾箱。 > 代码源自 [omdsh-dev/dsh-essential](https://github.com/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 安装 ```sh 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 ```yaml - 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 CONFIRM`(按 Session id 删除其他对话)。 确认成功后重启 DSH,日志被移至 `/trash//`。目录中的 `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`,不 `unlink` Session 日志;移动后崩溃也可恢复。 - 验证或移动失败时保留 pending 请求并记录错误,原日志不动。 - **仅支持逐 Session JSONL backend**:SQLite 没有独立 artifact location,插件会明确拒绝。 - **不永久擦除**:日志进的是可恢复垃圾箱,保留期与最终清理属于部署管理员策略。 ## 开发构建 要求 Node `^22.19.0 || >=24.0.0`(tsdown 依赖 `Promise.withResolvers`)。Windows 上确保构建用的 Node 22+ 在 PATH 首位: ```sh 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](https://github.com/omdsh-dev/dsh-essential)(Copyright (c) 2026 ExDragine),详见 [LICENSE](LICENSE)。