dsh-recall-unread:撤回尚未被模型读取的插话消息

前言

在 DeepSeek Harness(DSH)里,模型长时间运行(深度思考、工具调用)时,用户常需要「插话发送」——把新指令塞进当前会话,等模型处理完手头任务后再读取。消息发出后会以「待处理」气泡挂在对话尾部;在模型认领(读取)之前,若发现措辞不当或想改主意,官方界面没有针对这类 steering 消息的撤回入口。

排队等待下一轮的消息(placement: queued)在官方队列坞里已有删除按钮;插话发送的消息(placement: steering)则一直缺这一环。dsh-recall-unread 由 hg1048596-pixel 维护,在输入框上方补一条「未读消息」条带,支持单条与全部撤回,且仅在消息仍处于 inbox、尚未被模型读取时生效。

这是什么

dsh-recall-unread 是 DSH 的客户端插件,分类为客户端。它在 conversation.input.dock 插槽列出所有已发送但模型尚未读取的 steering 插话消息,每条提供预览与「撤回」按钮;多条并存时可「全部撤回」。启用即生效,停用即整体不加载,不依赖启动器菜单。

撤回语义与官方队列坞的删除一致:消息一旦被模型认领,自动离开条带,此时不可撤回。插件以 MIT 许可证发布,当前版本 v1.1.0(2026-08),GitHub 仓库约 35 stars。

工作原理

DSH 中「已发送但未读取」的消息,对应仍停留在 Agent inbox 中的项,即 ConversationSnapshot.queue 快照里的 pending 项。steering 与 queued 两种 placement 含义不同:queued 由官方队列坞处理;本插件专门补上 steering 侧缺失的撤回能力。

静态版(推荐)在 Client 端直接调用官方会话 RPC:

session.updateQueue(itemId, { kind: 'remove' })

与官方队列坞「删除」同一实现。动态版则经 Host 私有 RPC recall,内部调用 agents.get(sessionId).inbox.remove(itemId),效果与上述 RPC 一致。

核心功能

  1. 未读消息条带:在输入框上方展示所有 steering 未读消息,带预览文本。
  2. 单条撤回:点击「撤回」后消息从对话移除,并提示「已撤回一条消息」。
  3. 全部撤回:存在多条未读时,一键清空。
  4. 只读语义:模型开始读取后消息自动离开条带,无法撤回。
  5. 优雅降级:撤回失败(例如消息已开始发送)时给出明确提示,不破坏会话。
  6. 零配置:开箱即用,无需额外设置项。

安装与启用

方式一:静态安装(推荐)

静态安装随 DSH 加载,重启后不丢失。

  1. 将仓库中 plugin/ 目录复制到 web profile 的 node_modules:
~/.dsh/profiles/web/node_modules/dsh-recall-unread/
  1. ~/.dsh/profiles/web/cordis.patch.yml 末尾追加:
- insert:
    - id: recall-unread
      name: dsh-recall-unread
  1. 重启 DSH。插件启用后「未读消息」条带即生效;可在插件市场(dsh-market)或插件管理页随时停用或启用。

静态版不依赖 Amadeus,撤回走客户端官方 RPC,与官方界面行为一致。

方式二:动态插件(临时体验)

适合先试用,DSH 重启后需重新定义。

  1. 在会话中进入 Cordis 插件开发流程(cordis_define)。
  2. 新建插件:idPrefixrecallcode.host 粘贴 src/host.jscode.client 粘贴 src/client.jsnameRecall Sent Unread Messages
  3. 用返回的 pluginId / packageId 调用 cordis_run 激活,并在界面批准运行。

长期使用请采用方式一。

典型用法

  1. 确保插件已启用(安装后默认启用;可在插件市场或管理页开关)。
  2. 模型正在运行时,用插话发送发出一条文字(运行中发送即进入 steering)。
  3. 消息出现在对话尾部(带「待处理」标记),同时输入框上方出现「未读消息」条带。
  4. 点击该消息右侧的「撤回」——气泡与条带消失,提示「已撤回一条消息」。
  5. 有多条未读时,可点「全部撤回」一次性清空。

如需微调条带位置或提示停留时长,可修改 src/client.js 中的 slots.register(…, order: 30)ctx.timeout(() => setStatus(null), 2500),动态版需重新定义;静态版修改后需重新部署到 node_modules 并重启。

适用场景与注意

适合谁:经常在模型长任务运行中插话、又需要在模型读取前改口或撤回的用户。

限制

  • 仅能撤回尚未被模型读取、仍在 inbox 的消息。
  • 排队消息(queued)由官方队列坞处理,本插件不重复覆盖。
  • 受官方未提供消息气泡级插槽限制,撤回入口在输入框上方条带,而非直接悬浮在气泡上。
  • 动态插件不持久化;静态安装后随 DSH 启动自动加载。

安全提示:插件以当前 DSH 进程权限运行。安装前建议阅读仓库源码与 MIT 许可证,确认行为符合预期。

若静态 bundle 导致 DSH 启动红屏(Failed to load plugins),可用仓库内 tools/recall-killswitch.ps1cordis.patch.ymlrecall-unread 条目上加 disabled: true 禁用插件后重启;恢复时用 -Action enable

链接

  • SkillHub 目录页:https://www.skillhub.cn/plugins/hg1048596-pixel/dsh-recall-unread
  • GitHub 仓库:https://github.com/hg1048596-pixel/dsh-recall-unread

dsh-recall-unread 补上了 steering 插话在「已发未读」阶段的撤回能力,与官方队列坞对 queued 消息的删除形成互补。若你常在长任务中插话又需要反悔,静态安装后启用即可,无需额外配置。

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

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

小夜