前言¶
在 DeepSeek Harness(DSH)里长期做智能体或项目开发时,侧边栏工作区会积累大量会话。官方提供「归档」可以把会话从列表里藏起来,但没有「删干净」或「误删可恢复」的完整流程;想腾地方又怕以后还要翻日志,往往只能留着或自己动 DSH_HOME 下的文件。
dsh-recycle-bin 是社区维护的 DSH 插件,把工作区会话移入回收站,默认保留 14 天后自动永久删除,期间可随时恢复或立即删除。下面介绍它做什么、怎么装、怎么用,以及删除机制与已知限制。
这是什么¶
- 名称:
dsh-recycle-bin(回收站) - 维护者:EnhydraLutristus
- 分类:记忆(社区目录归类)
- 仓库:github.com/EnhydraLutristus/dsh-recycle-bin
- 目录页:skillhub.cn 插件条目
插件在 Host 侧挂 webServer 路由,在客户端注册 sidebar.panellist、main、sidebar.session.row.hover、shell.overlay 等槽位,在侧边栏底部(Settings 之上)增加回收站入口,用拖拽、悬停按钮或面板内投放把会话移入回收站;底层调用官方的 workspaceRegistry.archiveSession,会话先从工作区列表消失,再进入回收站状态。
环境要求¶
需要 DeepSeek Harness 0.2.x。作者在 0.2.1-rc.2 上开发和验证;更老的 Harness 可能没有本插件依赖的槽位与路由能力。
核心功能¶
移入回收站¶
支持四种方式(README 中「三种」含子类,此处按实际操作拆开说明):
- 拖到侧边栏回收站图标:工作区会话行拖到侧边栏底部的回收站图标;整条侧边栏条目(图标 + 文字)均为投放目标。
- 底部中央投放区:拖动会话时,屏幕底部中央出现 236×52 的「松手移入回收站」浮层(
shell.overlay),松手即移入;松手后浮层消失。位置选在底部中央是为避免挡住侧边栏末尾几行,减少误投。 - 拖进回收站面板:打开回收站面板后,将会话拖到面板空白处。
- 悬停按钮:鼠标悬停会话行,在浮层中点「移入回收站」。
运行中的会话不能移入,会提示「该会话正在运行,请先停止它再移入回收站」,不会打断当前回合。已打开但未在跑回合的会话会先释放界面占用再归档。
失败时底部投放块会显示原因约 6 秒,并写入 <DSH_HOME>/recycle-bin/host.log;跨站校验失败记为 guard-reject 并带完整请求头。
回收站内操作¶
- 恢复:取消归档,会话回到原工作区。
- 立即删除:需二次确认(第二次为「确认永久删除」,5 秒内有效)。
- 清空回收站:同样需要二次确认。
- 自动清理:每小时扫描一次;超过 14 天 的条目永久删除。应用启动约 5 秒后也会扫一次,补上关机期间到期的条目。
永久删除实际做了什么¶
DSH 目前没有官方「删除会话」的 Host API(sessionPersistence 仅有 create/open/flush/stat/list;sessionController 与 workspaceRegistry 均无删除会话方法),因此「永久删除」是文件级操作:
- 若会话仍在跑回合,拒绝并提示先停止。
- 尝试
sessionPersistence.open(id, 'write')抢占写句柄(重试 3 次、间隔 200ms);抢不到则降级直接删文件,并在recycle-bin/host.log记force-delete。 - 删除
<DSH_HOME>/sessions/<工作区桶>/<sessionId>/(含session.v4.jsonl.zstd等),并确认目录消失。 - 删除
<DSH_HOME>/storages/session_projcache/sessions/<sessionId>.json(预览缓存)。 - 从各工作区
sessionIds中 detach;抢占成功时从归档集合移除,抢占失败时保留归档标记,避免重启前以「未分组」空壳再现。 - 发出
api-session/removed,界面立即移除对应行。
状态记录在 <DSH_HOME>/recycle-bin/state.json(id、标题、工作区、移入时间)。删掉该文件等于清空回收站记录,不会恢复已物理删除的会话。
安装与启用¶
DSH 生态里插件通常通过 Harness 的 plugin_manager 安装为 profile bundle,而非本文臆造的 CLI 命令。安装 target 须使用资料原文给出的规格。
方式一:按 GitHub 地址安装(Harness 支持 pnpm 的 github: 规格)
在 Harness 里调用 plugin_manager 的 install_bundle,target 填:
github:EnhydraLutristus/dsh-recycle-bin
安装完成后 Loader 条目为 include:dsh-recycle-bin,侧边栏底部应出现回收站图标。若没有,按 Ctrl+R 刷新;仍没有则在插件管理器中禁用再启用一次。
方式二:从本地目录安装(改代码或锁定版本)
克隆仓库后,install_bundle 的 target 填克隆目录的绝对路径(本地安装为 link:,改代码后禁用/启用一次生效)。资料中的克隆地址为:
git clone https://github.com/EnhydraLutristus/dsh-recycle-bin.git
更新:本地安装时 git pull;或重新执行 install_bundle(GitHub 规格)。更新后建议在插件管理器里禁用再启用。
重新启用条目:plugin_manager 的 set_plugin,target 为 include:dsh-recycle-bin。
典型用法¶
- 安装并确认侧边栏出现回收站图标,点击后主区切换到回收站面板。
- 对不再需要的会话:拖到回收站图标、拖入底部「松手移入回收站」区域、拖入面板空白处,或使用悬停「移入回收站」。
- 误删或仍需查看:在回收站面板点恢复。
- 确定不要了:在回收站里二次确认「立即删除」,或等待 14 天自动清理。
线上自检(GUI 端口以运行时为准):
GET http://127.0.0.1:<当前 GUI 端口>/dsh-recycle-bin/list
请求头需带 x-dsh-recycle-bin: 1,应返回形如 {"ok":true,"retentionDays":14,"items":[...]};不带该头返回 403(用于挡跨站伪造请求)。
适用场景与注意¶
适合谁:工作区会话多、需要「先归档、可恢复、定期自动清」的 DSH 用户;与官方归档衔接,但补上回收站 UI、保留期与文件级清理。
运行与信任:插件以当前 DSH 进程权限读写 DSH_HOME 下的会话目录与状态文件。安装前请查看 源码 与许可证(package.json 标明 MIT)。社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。
已知限制(摘自 README):
- 删除绕过官方 API,未来 Host 存储或加锁变化时可能需要改
lib/index.js的purgeFiles。 session-query-sqlite搜索索引不在删除范围内,历史搜索可能仍指向已删会话。- 永久删除不可撤销。
- 回收站内的会话在工作区侧仍保持归档(有意设计,恢复时自动取消归档)。
- 拖拽识别依赖会话行写入
dataTransfer的负载;识别不到时不会误删,可改用悬停按钮。 - 底部投放块仅在拖动会话时出现,拖动纯文本或系统文件不会弹出。
冷启动后图标消失:若出现「热装能用、重启没入口」,可查 package.json 的 exports 是否包含 "./package.json": "./package.json",以及是否误用 dsh.client.immediately 导致后装插件挤不进首屏批次;README 对这两点有专门说明。
结尾¶
dsh-recycle-bin 把「移出列表、暂存、恢复、到期或手动清掉」串成一条可操作流程,并写明在无官方删除 API 下的文件级实现与边界。需要安装或 issue 时,见 GitHub 仓库 与 SkillHub 目录页。