dsh-selection-followup:把對話選區掛成引用卡片再追問

前言

在 DeepSeek Harness 裏讀長回答時,經常要對其中一段繼續問。常見做法是複製、貼進輸入框,再手工加 > 做成 Markdown 引用。引文和問題擠在同一輸入區,草稿一亂就不容易分清自己要發什麼。DSH 生態裏也有把選區引回對話的插件,路線各不相同:有的在輸入框裏嵌引用節點,有的依賴宿主尚未普遍提供的 draftContexts 服務。dsh-selection-followup(維護者 wanruxi,客戶端類插件)走另一條路——引用顯示在輸入框上方的獨立卡片,輸入框裏只留你的問題;發送時再按引用塊拼到消息末尾。下面介紹它做什麼、怎麼裝、怎麼用,以及和宿主耦合時要注意什麼。

這是什麼

插件全稱 dsh-selection-followup,英文名對應 README 裏的「選中追問」。在 Harness 對話頁面選中一段文字後,旁邊會浮出「追問」按鈕;點一下,選中文本變成輸入框上方的一張引用卡片,你在輸入框裏只寫後續問題即可。發送時卡片內容會以 Markdown > 引用塊追加在問題之後,模型收到的是完整原文,不是被截斷的預覽。

當前版本在 package.json 中爲 0.4.2,許可證 MIT。GitHub 星標爲 0(以目錄信息爲準)。僅支持 dsh.client.platform 爲 web 的瀏覽器半邊;宿主引擎聲明下限爲 >=0.2.0-rc.2 || >=0.2.1-rc.2。

它解決什麼問題

長回答裏「只追問某一段」時,複製—粘貼—排版引用會打斷閱讀節奏,且輸入框容易被引文佔滿。本插件把引用挪到輸入框外面:選好、點一下,卡片貼在輸入框上方,你只管寫問題。和「chip 引用卡片」相比,後者引文仍混在輸入框裏;和依賴 draftContexts 的「輸入框外註釋」相比,實測宿主版本里往往沒有該服務。本插件通過修補會話輸入殼的發送鏈路,換取輸入框乾淨、引用照樣送達,代價是對宿主內部函數名的依賴(見後文「發送與兼容性」)。

核心功能與行爲

選區與按鈕

  1. 只在非空選區出現;輸入框內部、以及按鈕自身選區會跳過,在輸入框裏打字不會誤觸發。
  2. 鼠標鬆開處右下方彈出按鈕;鍵盤選區(如 Shift+方向鍵)則落在選區上方。靠近窗口邊緣會翻到另一側,中英文「追問 / Ask」寬度不同也不會被裁切。
  3. 選區滾出可視範圍後按鈕不再出現,避免引用已經看不見的文字。
  4. Ctrl+Shift+Q 可無鼠標引用當前選區(各平臺均用 Ctrl;macOS 上 Cmd+Shift+Q 是系統註銷,插件不採用)。
  5. Esc 收起按鈕。點擊按鈕前會 preventDefault 住 mousedown,避免焦點跑掉導致選區提前消失。

引用卡片

  1. 點按鈕後選區變成卡片,貼在輸入框上方;卡片有 × 可刪,可掛多條,按添加順序排列。
  2. 卡片左右邊緣與下方輸入框卡片對齊,使用宿主 CSS 變量 --dsh-composer-side-clearance 與 --dsh-composer-card-max-width,分欄、側欄、窄面板下仍對齊。
  3. 預覽只顯示第一行前 80 個字符,懸停可見全文;發給模型的是完整引用。超過 8000 字符會截斷並加省略號,懸停會說明。
  4. 引用前會規整選區:統一換行、去行尾空格、合併多餘空行。
  5. 引用成功後按鈕處短暫顯示「已引用」約 0.9 秒,且不擋下一次點擊。
  6. 卡片按會話分開存,別的側邊會話選中的文字不會進當前會話;數據在 sessionStorage,刷新頁面不丟。

發送與恢復

  1. 發送時,各條引用按添加順序以 > … 塊追加在問題之後,塊之間空一行。輸入框必須有問題才能發送;空草稿的 Enter 會被宿主忽略,卡片保留。
  2. 發送失敗(網絡、被拒)時卡片退回,不會憑空消失。
  3. 宿主若無「輸入框外額外上下文」的公開通道,插件在發送前修補 SessionInputShell 的三個銜接點:sinkSerialized(提交開始取走卡片)、deps.defaultSink(序列化後把引用拼到消息末尾)、settleDetachedFailure(失敗時放回卡片)。三者須一併補丁,否則可能重複發送或失敗後丟引用;組件卸載時可逆還原。

安裝與啓用

在要啓用它的 Harness profile 裏執行(命令來自倉庫 README):

dsh plugin --profile <profile> add dsh-selection-followup

也可將倉庫目錄作爲 bundle 裝進插件管理器。瀏覽器半邊安裝後立即生效,刷新頁面即可,無需重啓 DSH 進程。

安裝前應自行查看 GitHub 倉庫 源碼與 MIT 許可證。插件在瀏覽器中與當前 Harness 會話同權限運行,與安裝任何 DSH 插件一樣,需確認來源可信。

典型用法

  1. 在 Web 版 Harness 打開一段對話,用鼠標或鍵盤選中要追問的段落。
  2. 在選區旁點「追問」,或按 Ctrl+Shift+Q。
  3. 在輸入框上方確認引用卡片(可掛多條、可點 × 刪除)。
  4. 在輸入框只輸入你的問題,發送。模型收到的消息末尾會帶上對應引用塊。

不需在輸入框裏手工寫 >;也不需在卡片預覽裏看到全文才能發送——懸停可看全文,發出的是完整內容。

適用場景與注意

適合誰: 經常在長回答裏「指着某一段繼續問」的 DSH / 智能體開發者與普通用戶;希望輸入框裏只有問題、引用視覺上獨立的場景。

平臺: 僅 Web 客戶端;依賴 conversation.input.overlay、conversation.input.dock 槽位及 conversation 服務的輸入殼。conversation 通過 ctx.get('conversation') 獲取,未寫入 inject,以免在缺該服務的宿主上整插件加載失敗。

兼容性風險: 若宿主改名 sinkSerialized / deps.defaultSink 等,卡片仍可添加刪除,但不會自動追加到消息;控制台會出現 [selection-followup] could not hook this compose box 警告。這是有意「保持沉默」而非破壞發送鏈路。

與相近插件: README 用表格對比了本插件、chip 引用卡片、輸入框外註釋三條路線(放置位置、輸入框內容、發出方式、宿主依賴)。選型時若更看重官方 inputTriggers 且接受引文在輸入框內,可看 chip 路線;若要堅持輸入框僅問題且當前宿主無 draftContexts,本插件是實測可選方案之一。

生態說明: DeepSeek Harness 的理念是「一切皆插件」;SkillHub 目錄頁 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。

開發者本地可跑離線測試(不必開瀏覽器):

npm test      # node --test test/helpers.test.mjs
npm run check # 語法檢查 lib/client.js 與 lib/index.js

界面效果仍需人工在瀏覽器裏看一眼。

結尾

dsh-selection-followup 把「選中—引用—追問」收成:選區旁一鍵,引用卡片在輸入框上,問題在框內,發送時引用進消息。安裝用 profile 下的 dsh plugin add dsh-selection-followup,留意宿主版本與發送鉤子的兼容性即可。

  • 目錄頁:https://www.skillhub.cn/plugins/wanruxi/dsh-selection-followup
  • GitHub:https://github.com/wanruxi/dsh-selection-followup
羽毛球分组比赛记分
小程序二维码

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

小夜