dsh-conversation-trash
可撤销的对话删除 — DeepSeek Harness 只提供归档,不提供删除。这个插件把会话日志、列表投影缓存与工作区归属移入一个 30 天回收站:删错了可以撤销,彻底不要了再永久清除。
Reversible conversation deletion for DeepSeek Harness. DSH archives, but never deletes. This plugin moves a Session's log, list-projection cache and workspace membership into a 30-day trash, with one-click undo, restore and permanent purge.
- 中文界面 / English UI(跟随 DSH 语言)
- 官方 Slot 集成:会话行悬停按钮 + 「…」菜单项,不注入 DOM、不改原生菜单
- 删除立即从列表消失,Toast 里可 撤销
- Plugins → 对话回收站 页面:查看标题 / 删除时间 / 占用空间,恢复、彻底删除、清空
- 30 天自动清扫;删掉的日志不再参与列表与搜索
安装
在 DSH 里打开 Plugins → Add plugin,填 dsh-conversation-trash;或使用 CLI:
dsh plugin --profile web add dsh-conversation-trash
安装后重启 DSH(宿主半在启动时加载)。桌面端请用应用内的 Plugins 页面安装;profile 名按你的实际配置替换。
要求:DSH >= 0.2.2-rc.1 < 0.3.0,Node >= 22.15.0。
使用
- 会话行悬停出现垃圾桶按钮,或打开行尾「…」菜单 → 删除对话。
- 确认后日志移入回收站,列表行消失;Toast 上的 撤销 可以立即恢复。
- 回收站页面在 Plugins → 对话回收站:可 恢复、彻底删除、清空回收站(后两者都是两段式确认)。
会移动什么
| 对象 | 处理 |
|---|---|
<DSH_HOME>/sessions/<项目目录>/<session-id>/ |
移入回收站;失败时原样不动 |
<DSH_HOME>/storages/session_projcache/sessions/<session-id>.json |
尽力移入;移不动就留在原处,不影响删除 |
workspace.json 的成员 / 置顶 / 归档记录 |
通过 Workspace registry 解除 |
<DSH_HOME>/attachments/** |
不动(内容寻址、跨会话共享) |
| 子代理会话 | 不动(独立的 session 目录) |
| 搜索索引 | 不动;派生索引按源日志自动对账 |
回收站位置:<DSH_HOME>/plugin-data/session-delete/trash/<时间戳>--<session-id>--<随机后缀>/,内含 manifest.json、log/、projection.json。
安全模型
- 没有 shell、没有网络、没有 eval。 插件只做文件移动与目录删除,不执行系统命令、不上传任何内容、不加载远程代码。
- 路径受限。 所有路径都经过
resolve+ 根目录包含检查(assertInside);sessionId先校验格式再触碰文件系统;回收站条目名只允许[0-9A-Za-z_.-]。 - API 仅 owner。 路由通过
ctx.connection.fetch.register注册;DSH 的 exact fetch route 对非 owner Peer 返回 403,Web 载体的 Host/Origin 校验在 handler 之前完成。请求体另有 64 KiB 上限。 - 活会话拒绝删除。 DSH 对仍在内存里的会话读取时不查磁盘;移走文件只会留下“列表里没了、内容却还能打开”的幽灵。插件返回
live,提示重启 DSH 后再删。 - 失败不吞日志。 日志先单独移动;缓存移动失败只记录
projection: "left",绝不因为缓存失败去清空回收站。 - 并发安全。 回收站目录带随机后缀并用非递归
mkdir占位;同一会话的并发删除,后到请求返回duplicate。 - 可恢复。 恢复优先用相对
DSH_HOME的路径;原位置已有同名目录时返回conflict,不覆盖。
兼容性
| DeepSeek Harness | 状态 |
|---|---|
0.2.2-rc.1 |
本机 Desktop / Web GUI 实测通过 |
其它 0.2.x |
未逐版本验证;engines.dsh 已限定 < 0.3.0 |
插件依赖 DSH 的磁盘布局(sessions/<project>/<id>、session_projcache)与 workspace/session-activity、workspace/session-stop 两个事件。DSH 大版本升级后若布局变化,删除会返回诊断而不是静默破坏;升级前请先在测试 profile 验证。
HTTP API
单一路由 POST /api/session-delete,body 带 action:
| action | 参数 | 作用 |
|---|---|---|
delete |
sessionId / title? / stopActivity? |
移入回收站 |
restore |
trashId |
放回原位并尝试重新挂回工作区 |
list-trash |
— | 列出回收站 |
purge |
trashId |
彻底删除一条 |
purge-all |
— | 清空回收站 |
delete 失败码:live(需重启)、duplicate(正在删除)、busy(仍在工作)、gone(已不存在)、file-busy(被占用)。restore 可能返回 conflict / outside-home;成功时 reattached: false 表示没能挂回原工作区。
已知限制
- 打开过的会话需要重启 DSH 才能删。 这是为了不制造“内存里还能读到”的假删除;重启后所有会话变冷,即可正常删除。
- 空会话(没有日志也没有缓存)如果仍在内存里,同样按
live拒绝;冷启动后它不在列表里,也不需要删。 - 缓存是派生数据:移不动时留在原处,不阻塞删除;恢复时优先保留运行中的新缓存。
- 子代理会话、附件不会随父会话删除。
- 回收站保留 30 天,期间内容仍在磁盘上;需要立刻清除请用「彻底删除」。
- 多进程:
workspace.json没有跨进程写锁,删除期间不要在另一个 DSH 进程里操作同一工作区。
开发
node test/host.test.mjs # 假 home + 假 ctx:移动、拒绝 live、并发、恢复、冲突、缓存失败
node test/client.test.mjs # 槽位注册、对话框、RPC 载荷、撤销
无构建步骤:index.js 是宿主 ESM,client.js 是 Module Loader 客户端包。
English
Reversible conversation deletion for DeepSeek Harness. Adds a delete entry to the session row (hover button + “…” menu), moves the log and projection cache into a 30-day trash, and exposes a trash page under Plugins → Conversation Trash with restore and permanent purge.
dsh plugin --profile web add dsh-conversation-trash
Safety: no shell, no network, no eval; every path is root-checked; the HTTP route is owner-only through DSH’s exact fetch routes; live Sessions are refused (restart DSH, then delete); the log moves first and a cache failure never clears the trash; concurrent deletes are serialized per Session.
Requires DSH >= 0.2.2-rc.1 < 0.3.0 and Node >= 22.15.0. Attachments and subagent sessions are not deleted. MIT licensed.
No comments yet. Be the first to write one.