dsh-conversation-recycle-bin:为 DSH Web 提供可恢复的对话删除

前言

DeepSeek Harness(DSH)的会话数据落在本机 DSH_HOME 目录里,侧栏列表来自目录扫描与工作区账本,而不是独立的「删除会话」产品能力。日常开发里,测试会话、过期对话和误建的工作区条目会越积越多;若只能手工挪目录或改 workspace.json,既容易误伤日志,也很难说清楚「删了什么、能不能撤回」。社区插件 dsh-conversation-recycle-bin(维护者 HERO476)在 Host + Web Client 两侧接入官方槽位与 HTTP 扩展,把删除做成默认软删除、回收站可恢复,并可选级联处理灵枢记忆,同时写审计留痕。下文按「是什么 → 能做什么 → 怎么装 → 怎么用 → 注意点」说明,事实以 GitHub 仓库 与 SkillHub 目录页 为准;当前包版本为 0.3.5,分类为 admin-security。

这是什么

dsh-conversation-recycle-bin 是给 DSH Web 界面增加的「删除对话」能力:在会话列表「…」菜单与会话详情页头部提供删除入口,确认后默认移入插件回收站而非立刻抹掉磁盘日志;每次操作写入审计;单会话删除在 Host 侧以事务执行,任一步失败会按逆序回滚。npm 包名 dsh-conversation-recycle-bin(Cordis 行 id 为 conversation-recycle-bin);早期曾用 dsh-delete-conversation,因 npm 被占用在 0.2.0 改名。实现为 plain JS ESM,零构建,只依赖宿主已发布的公开扩展点;不注册任何 Agent 工具,模型无法代为发起或授权删除。

核心功能

删除入口与确认流程

入口 槽位 行为
会话列表「…」 sidebar.workspaces.session.menu.item(order 500) 「删除对话…」,关闭菜单后打开全局确认框
会话详情页头部 conversation.session.header.actions(order 100) 删除图标按钮,打开同一确认框
设置页 settings.section(order 1300) 「回收站 / 批量删除 / 审计留痕」三个标签页

确认框挂在 shell.overlay,避免随下拉菜单卸载。默认删除方式为「移入回收站」;可改为「彻底删除」。复选框「同时删除该对话的关联记忆」默认不勾选,勾选后会重新向 Host 拉取计划,界面实时显示关联记忆条数(不可用时会写明原因,不会显示为 0)。批量软删除需输入数量二次确认;彻底删除在确认框内一键执行(Host 仍校验单次 preview token)。回收站内「永久清除」需输入 DELETE。

删除或恢复成功后,Client 优先调用 sessions.refresh() 更新列表,不整页刷新;若删掉的是当前打开的会话,会关闭当前视图回到空白页。

数据级联与回收站

会话、消息、工作区与灵枢记忆的关系在 README 中有完整数据模型说明。删除事务顺序为:memory → messages → session/catalog。

  • 软删除:不移动会话日志目录,通过宿主 workspaceRegistry.archiveSession 从侧栏隐藏;磁盘内容保持完整,直到在回收站执行彻底删除。
  • 硬删除:将会话日志目录移入回收站 bundle;若会话仍被活跃 Agent 持有,会先停止当前轮次并在 liveDrainMs(默认 2000ms)内等待;若在 foreignWriterGraceMs(默认 1500ms)窗口内检测到另一 Host 仍在写同一日志,会中止并报 E_POLICY_FOREIGN_WRITER。
  • 记忆:默认适配灵枢存储(<DSH_HOME>/.dsh-memory/data/mdcg/_index.json,schema 2)。仅移动 nodes[*].session 与目标会话 id 精确匹配的节点;跨会话引用在回收站 bundle 中记录,恢复时可补回。未登记工作区的会话默认拒绝删除(E_POLICY_ORPHAN),可在配置中显式放开。

插件数据目录为 <DSH_HOME>/delete-conversation/(目录名沿用旧插件名,改名不会迁移已有回收站与审计数据)。HTTP API 前缀为 /conversation-recycle-bin/api/*,包含 preview、delete、trash、audit 等路由。

安全与限流

传输层叠加同源校验(完整 authority)、默认仅 loopback、私有请求头 x-conversation-recycle-bin: 1、DSH connection.requestRejection 与 connection/request 瀑布流。批量删除受 maxBatchSessions 与本分钟剩余额度收紧,默认限流 20 次/分钟(滑动窗口)。跨进程(桌面端与 dsh web 共享同一 DSH_HOME)通过 mutation.lock 串行化 mutation,并发删除可能得到 E_LOCK_BUSY 而非写坏 manifest。

安装与启用

插件不需要 pnpm install 或本地构建;需 Node >= 20。在拿到本机插件包目录后,于 当前 GUI 实际使用的 profile 对应 DSH 会话中执行(需要 danger-full-access 或批准)。INSTALL.md 中的示例如下,请将 target 换成你机器上的包路径:

plugin_manager action=install_bundle target="D:\\Users\\34332\\AI\\dsh-conversation-recycle-bin"

install_bundle 会登记 dsh.profile.bundles、解析本地包、插入 Host 行并由 dsh.client 提供 Web 半;不要手写 profile 的 package.json 或 cordis.patch.yml 代替。返回 applied 表示通常经 HMR 生效,restart-required 则需重启 DSH。

安装后可用 Host 配置查询确认行是否存在:

cordis_inspect_query platform=host provider=Config method=listConfigs name=dsh-conversation-recycle-bin

应能看到 conversation-recycle-bin 行;该行 status 为 absent 属预期(配置在 apply() 内由 normalizeConfig 校验,无 Cordis Config schema 导出)。

同源访问状态接口(端口以 GUI 地址栏为准):

GET http://127.0.0.1:<Web 端口>/conversation-recycle-bin/api/state

预期 {"ok":true,"state":{...}}。

移除插件:

plugin_manager action=remove_bundle target=dsh-conversation-recycle-bin

移除后 <DSH_HOME>/delete-conversation/ 仍保留,确认不再需要回收站后可手工删除该目录。

典型用法

  1. 在侧栏对单个会话打开「…」→「删除对话…」,或进入会话详情点击头部删除按钮。
  2. 在确认框选择「移入回收站」或「彻底删除」;若需一并清理灵枢关联记忆,勾选「同时删除该对话的关联记忆」,核对条数文案后再确认。
  3. 打开 设置 → 回收站 / 批量删除 / 审计留痕:在回收站恢复或永久清除(输入 DELETE);批量勾选多个会话时,软删除需输入数量,注意界面提示的批量上限与限流。
  4. 若出现「未完成条目」且仍持有会话日志,设置页提供「恢复」按钮,可直接拉回会话列表;仅当确实无日志与记忆时才用「清理」(输入 DELETE)。

回滚与故障排查见仓库 INSTALL.md 第 3、5 节(如 E_POLICY_ORPHAN、E_LOCK_BUSY、E_TRANSACTION_FAILED 等)。

适用场景与注意

适合需要在 DSH 桌面或 Web GUI 里可控地删掉测试会话、整理侧栏,又希望保留回收站与审计的本机用户。批量整理、合规留痕(审计不含对话正文,但回收站含被移走的日志与记忆正文)也在设计范围内。

使用前请注意:

  • 插件以当前 DSH 进程权限读写 DSH_HOME;安装前建议阅读源码与 MIT 许可证。
  • 同一 DSH_HOME 下不宜让桌面端与 dsh web 同时对删除事务并发写入;遇 E_POLICY_FOREIGN_WRITER 应先关闭另一端的活跃会话。
  • 反向代理或远程访问需在配置中谨慎使用 allowNonLoopback / allowedHosts,避免放宽 loopback 约束。
  • SkillHub 上的 HERO476/dsh-conversation-recycle-bin 为社区目录条目,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,安装来源以你信任的包路径与仓库为准。

结尾

dsh-conversation-recycle-bin 把 DSH 里缺失的「删除对话」补成产品化流程:默认软删除与回收站、可选预览后的记忆级联、审计与事务回滚,并明确不向 Agent 暴露删除工具。需要细节、配置字段与验收清单时,直接查阅 GitHub README 与 INSTALL.md。

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

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

小夜