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 消息的刪除形成互補。若你常在長任務中插話又需要反悔,靜態安裝後啓用即可,無需額外配置。

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

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

小夜