dsh-recycle-bin:工作区会话回收站与 14 天保留

前言

在 DeepSeek Harness(DSH)里长期做智能体或项目开发时,侧边栏工作区会积累大量会话。官方提供「归档」可以把会话从列表里藏起来,但没有「删干净」或「误删可恢复」的完整流程;想腾地方又怕以后还要翻日志,往往只能留着或自己动 DSH_HOME 下的文件。

dsh-recycle-bin 是社区维护的 DSH 插件,把工作区会话移入回收站,默认保留 14 天后自动永久删除,期间可随时恢复或立即删除。下面介绍它做什么、怎么装、怎么用,以及删除机制与已知限制。

这是什么

插件在 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 中「三种」含子类,此处按实际操作拆开说明):

  1. 拖到侧边栏回收站图标:工作区会话行拖到侧边栏底部的回收站图标;整条侧边栏条目(图标 + 文字)均为投放目标。
  2. 底部中央投放区:拖动会话时,屏幕底部中央出现 236×52 的「松手移入回收站」浮层(shell.overlay),松手即移入;松手后浮层消失。位置选在底部中央是为避免挡住侧边栏末尾几行,减少误投。
  3. 拖进回收站面板:打开回收站面板后,将会话拖到面板空白处。
  4. 悬停按钮:鼠标悬停会话行,在浮层中点「移入回收站」。

运行中的会话不能移入,会提示「该会话正在运行,请先停止它再移入回收站」,不会打断当前回合。已打开但未在跑回合的会话会先释放界面占用再归档。

失败时底部投放块会显示原因约 6 秒,并写入 <DSH_HOME>/recycle-bin/host.log;跨站校验失败记为 guard-reject 并带完整请求头。

回收站内操作

  • 恢复:取消归档,会话回到原工作区。
  • 立即删除:需二次确认(第二次为「确认永久删除」,5 秒内有效)。
  • 清空回收站:同样需要二次确认。
  • 自动清理:每小时扫描一次;超过 14 天 的条目永久删除。应用启动约 5 秒后也会扫一次,补上关机期间到期的条目。

永久删除实际做了什么

DSH 目前没有官方「删除会话」的 Host API(sessionPersistence 仅有 create/open/flush/stat/list;sessionController 与 workspaceRegistry 均无删除会话方法),因此「永久删除」是文件级操作:

  1. 若会话仍在跑回合,拒绝并提示先停止。
  2. 尝试 sessionPersistence.open(id, 'write') 抢占写句柄(重试 3 次、间隔 200ms);抢不到则降级直接删文件,并在 recycle-bin/host.log 记 force-delete。
  3. 删除 <DSH_HOME>/sessions/<工作区桶>/<sessionId>/(含 session.v4.jsonl.zstd 等),并确认目录消失。
  4. 删除 <DSH_HOME>/storages/session_projcache/sessions/<sessionId>.json(预览缓存)。
  5. 从各工作区 sessionIds 中 detach;抢占成功时从归档集合移除,抢占失败时保留归档标记,避免重启前以「未分组」空壳再现。
  6. 发出 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。

典型用法

  1. 安装并确认侧边栏出现回收站图标,点击后主区切换到回收站面板。
  2. 对不再需要的会话:拖到回收站图标、拖入底部「松手移入回收站」区域、拖入面板空白处,或使用悬停「移入回收站」。
  3. 误删或仍需查看:在回收站面板点恢复。
  4. 确定不要了:在回收站里二次确认「立即删除」,或等待 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 目录页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜