dsh-session-admin:已归档会话的批量取消归档与安全删除

前言

DeepSeek Harness(DSH)对工作区会话提供归档与取消归档,但没有公开的「永久删除会话」接口。长期使用后,$DSH_HOME/sessions 下会积累大量已归档会话及其日志、投影缓存和附件对象;若只靠手动取消归档,仍无法从磁盘上彻底清理。社区插件 dsh-session-admin(维护者 z1lyA,分类 admin-security)在 Web 界面增加「已归档」管理页,列出全部已归档会话,支持批量取消归档(走官方 workspaces.unarchiveSession)和带边界规则的批量删除,并在可选步骤中扫描附件引用,只删除无剩余引用的内容寻址对象。

这是什么

dsh-session-admin 是 DSH 的 Host + Web Client 插件:Host 侧提供 HTTP 路由与启动时待删除队列清扫;Client 侧在左侧栏「全局面板」区(与 Plugins、Schedules 同一列,位于工作区列表上方)增加 已归档 入口,点击后在中央区打开管理页。插件补上 DSH 原生缺失的删除能力,并把「会话仍在 Host 内存里」等情况做成显式规则,避免在活 Agent 句柄下删日志导致无头日志或缓存回写。

入口未放在原生工作区标题栏或 sidebar.workspaces:前者是封闭 JSX、无插件扩展点,后者为已被占用的 single 槽。本插件使用受支持的 sidebar.panellist + main keyed 页面。

核心功能

管理页对已归档会话展示标题、工作区、最后活跃时间、磁盘占用,并支持全选、半选、单选。

批量取消归档 调用 DSH 官方 workspaces.unarchiveSession。若在待删除队列中的会话被取消归档(本页、原生侧栏或另一标签页),Host 监听 workspace 域变更后会清除对应队列条目;重新归档不会恢复之前的删除意图。

批量删除 采用混合策略:

  • 会话不在 Host 内存里:确认后立即执行完整删除流程。
  • 会话仍在 Host 内存里(归档后 Agent 句柄仍驻留,DSH 无公开「关闭会话」接口):确认后仅登记为 待删除,不立刻动文件;下次启动 DSH、Agent 存储为空时自动执行删除。行内显示「待删除」,可随时取消(工具栏批量或行内);队列保存在 $DSH_HOME/session-admin/pending-deletions.json(原子写、最多 500 条,单实例前提)。

实际删除时(含 origin: subagent 派生子会话)会校验会话仍属归档集合且当前无 live agent/子代理,然后依次:删除 $DSH_HOME/sessions/<cwd 编码>/<sessionId 编码>/ 整目录;删除投影缓存 $DSH_HOME/storages/session_projcache/sessions/<sessionId>.json;删除绑定定时任务;best-effort 从工作区 detach、取消置顶、移除归档墓碑。可选步骤(默认开启,可在配置与对话框中控制):扫描事件与 $DSH_HOME/llm-deepseek/files-v3.json 上传索引,仅删除无任何剩余引用的 attachments/v1 下对象;扫描不完整时 一个附件都不删 并在结果中报告原因。

安全规则(摘自 README):只接受 workspaceRegistry.archivedSessionIds 中的 id;session id 格式与路径包含性校验;每批最多 100 个 id、串行执行、同一时间只跑一个删除任务;HTTP 路由仅对本机回环 Host 开放,并叠加同源 / Sec-Fetch-Site 与 ctx.connection.requestRejection。

插件 不 注册 agent 工具:DSH 的 agent 工具按 preset 组合,web bundle 层注册的工具不会进入会话工具作用域;永久删除仅由用户在页面上操作。

安装与启用

从 GitHub 安装(资料注明需要 Full access):

dsh plugin --profile desktop add github:z1lyA/dsh-session-admin

本地目录安装(开发调试示例,路径按你的环境替换):

plugin_manager({ action: "install_bundle", target: "H:\\CodeProject\\dsh-session-admin" })

安装后刷新一次 Web 页面(Client 插件清单在启动时收集);Host 代码变更需重启 DSH。

卸载(不会恢复已删除的会话):

plugin_manager({ action: "remove_bundle", target: "dsh-session-admin" })

典型用法

  1. 安装并刷新 Web 页面(必要时重启 DSH)。
  2. 在左侧栏全局面板区点击 已归档,查看列表中的标题、工作区、最后活跃时间与磁盘占用。
  3. 勾选需要处理的会话:工具栏执行 取消归档,或 删除(确认对话框中可勾选是否同时清理未引用附件,默认与配置项 cleanupAttachmentsDefault 一致)。
  4. 若行显示 待删除,表示已排队至下次启动;可在启动前用工具栏或行内 取消待删除。
  5. 删除或取消归档成功后插件会调用 ctx.sessions.refresh();若侧栏仍残留已删会话行,刷新页面(Ctrl+R)或重启 DSH,勿对已不存在的 id 再次归档/删除。

可选配置在 cordis.patch.yml 的 session-admin 行:

键 默认 含义
cleanupAttachmentsDefault true 删除对话框里「同时清理未引用附件」默认勾选
dshHome $DSH_HOME 或 ~/.dsh DSH 主目录
sessionsRoot $DSH_HOME/sessions 会话日志根
storagesRoot $DSH_HOME/storages JSON 存储根
attachmentsRoot $DSH_HOME/attachments/v1 附件根

适用场景与注意

适合需要定期清理已归档会话、释放磁盘,且希望删除过程遵守「仅归档 id、live 会话排队、附件引用扫描」规则的用户。插件以当前 DSH 进程权限读写 $DSH_HOME;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,自行评估是否满足环境要求。

已知限制(摘要):多开 DSH 实例时 JSON 存储域可能「最后写入者获胜」,建议单实例操作删完重启核对;重启前禁用/卸载插件则待删除队列不会执行,重新启用后下一次启动继续处理;上传索引 TTL 未过期附件会被视为仍被引用;未发送草稿中的附件引用对 Host 不可见,存在极小概率误删共享内容哈希对应对象(内容寻址去重)。删除不可逆,卸载插件不会恢复已删会话。

DSH 生态强调「一切皆插件」;社区目录站点与 DeepSeek / 幻方无官方从属关系,本插件来自社区维护者 z1lyA。

结尾

dsh-session-admin 把「已归档会话清单 + 批量取消归档 + 安全永久删除(含待删除队列与可选附件清理)」收进一个 Web 管理页,并明确不写 agent 工具,删除意图留在用户侧。目录页:https://www.skillhub.cn/plugins/z1lyA/dsh-session-admin;源码与完整说明:https://github.com/z1lyA/dsh-session-admin。

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

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

小夜