dsh-plugin-annotation:在 DSH 對話裏給選中段落加批註,隨下一條消息一起發出

前言

用 DSH 做智能體調試時,模型輸出的往往是一大段文本。你想對其中某一句點點問題,回頭寫 prompt 時卻只能整段複製,或者用截圖、另開窗口的方式記位置。結果批註和對話被拆成兩個通道,最後發出去的反饋要麼丟了上下文,要麼把無關內容一起粘進去。

下面介紹的插件解決的是這件事:在對話窗口裏選中任意一段文本,就能附上一條批註,批註暫存在 composer 上方的一個棧裏,最後和你的正常輸入一起發出去。插件來自社區開發者 samuelraj-game,倉庫是 samuelraj-game/dsh-plugin-annotation,目錄頁在 skillhub.cn。注意它是社區插件,與 DeepSeek / 幻方無官方從屬關係。

這插件是什麼

一句話定位:給 DSH 會話加一個「選區批註 + 隨消息發送」的 UI 能力。它只負責把選中的段落和你的批註打包進下一條消息,不改變模型、不讀寫文件、不做網絡請求。

維護者:samuelraj-game。GitHub 星標 0(2026-11-07 抓取目錄頁時沒有顯示星標數據,以倉庫實際爲準)。許可證:MIT。

核心功能

README 裏列的能力如下,全部來自插件自身 README。

  1. 在對話中選中任意文本,選中文字旁會浮出 Comment 按鈕。
  2. 點開後可以寫一條可選批註,Enter 把它放進暫存棧,Ctrl/Cmd+Enter 則立即只發送這一條。
  3. 暫存的批註不住在 composer 草稿裏,而是彙總到 composer 上方的一個計數膠囊,形如 [ 💬 2 annotations (×) ]。
  4. 懸停膠囊打開棧面板,面板列出每條批註的原文引用、你的批註,以及編輯 / 刪除操作。
  5. 每條批註在其來源段落上帶一個編號 pin;懸停面板裏的某行或 pin 時,對應段落高亮加深。
  6. 面板可縱向調整大小,寬度與 composer 對齊;膠囊懸停時出現 × 按鈕,點擊清空整個棧。
  7. 批註可以沒有文字,只留選中段落,充當接下來 prompt 的上下文或認同。
  8. 發送時,整條消息把批註和 composer 文本合併成一個消息:
Annotation 1:
> remove

are you sure?

Annotation 2:
> the official 0.4.10 installer

please also check the checksum
  1. composer 裏普通 Enter 或發送按鈕會把暫存棧連同草稿一起發出去,批註不會在輸入過程中寫進文本框。

鍵盤操作對應關係,按表格原樣整理:

位置 按鍵 效果
Comment 卡 Enter 加入暫存棧
Comment 卡 Ctrl/Cmd+Enter 現在就只發送這一條批註
Comment 卡 Shift+Enter 換行
Comment 卡 Esc 取消
計數膠囊 懸停 打開棧面板
計數膠囊 懸停時點 × 清空棧
棧面板 Send all 棧 + 草稿一起發送

安裝與啓用

插件聲明的安裝方式有三種,都是資料原文,不要憑名稱自行拼接安裝命令。

第一種,從插件市場安裝。在 Plugins → Discover → Add index source 里加入這個索引源:

https://samuelraj-game.github.io/dsh-plugin-annotation/index.json

需要注意:Discover 需要先在 Plugins → More 裏打開實驗性的 Custom plugin markets 開關。

第二種,從 npm 安裝:

dsh plugin install dsh-plugin-annotation

或者在應用內走 Plugins → Installed → Add bundle,然後選擇 dsh-plugin-annotation。

第三種,作爲 profile bundle。這個包既是 bundle 也是 plugin,bundle 自帶的 patch(cordis.patch.yml)會插入自己的一行:

- insert:
    - id: ui-annotation
      name: dsh-plugin-annotation

把 dsh-plugin-annotation 加到 profile 的 dsh.profile.bundles 並安裝該包即可,不需要手工改 cordis.patch.yml。

兼容與權限

README 給出的兼容範圍如下,原樣列在這裏,安裝前最好對照自己環境核一遍。

項 要求
DSH >= 0.2.1-rc.5,聲明在 engines.dsh 中
Profile 基於 base 的 web 或 Desktop profile,且掛載了 @deepseek-ai/dsh-client-ui-conversation;本包向其 conversation.input.overlay 插槽貢獻入口
Node.js 除 DSH 自身所需外無額外要求,包沒有 host 側行爲
OS DSH 客戶端能跑的任何平臺(Windows、macOS、Linux)

plugin 聲明不使用 DSH 任何權限類別:不訪問文件系統、不髮網絡請求、不執行命令、不碰憑據、不用 MCP 或 host API。它的讀操作是瀏覽器選區與 UI 插件已經拿到的 composer 草稿狀態;寫操作是通過公開的 inputActions 面寫 composer 草稿、插入一個 <style>、以及它自己的固定定位 overlay 元素。依賴爲零:沒有 dependencies、沒有運行時 devDependencies、沒有 preinstall / install / postinstall / prepare 腳本、沒有原生二進制、沒有動態代碼加載。

實現上,瀏覽器側只向 conversation.input.overlay 插槽註冊一個入口,shell 每個 Session 掛載一次,所以每個會話裏都可用。選區通過 mouseup / keyup / selectionchange 跟蹤,可編輯區域(composer、輸入框)裏的選區會被忽略。標註區間用 CSS Custom Highlight API(::highlight(dsh-annotation))繪製,編號 pin 會在滾動、resize 和輕量定時檢查中重新測量。樣式使用 shell 的 design token(--dsw-alias-*),淺色與深色主題都跟隨原生風格。node 側是一個空的 apply(),沒有 host 行爲。

典型用法

按下面步驟走一遍,即可復現 README 描述的完整流程。

1、把文本發給 DSH,等到回覆渲染完成。

2、用鼠標或鍵盤選中回覆裏的一句,例如 remove,點選區旁浮出的 Comment 按鈕。

3、在 Comment 卡里寫批註,Enter 暫存,或 Ctrl/Cmd+Enter 立即發送這條。

4、重複第 2、3 步收集多條批註,此時 composer 上方會出現 [ 💬 N annotations ] 膠囊,composer 文本框裏沒有任何變化。

5、如果要發送全部,點開膠囊,在棧面板裏點 Send all;只想發其中一條,就在它的 Comment 卡里用 Ctrl/Cmd+Enter。

6、發送後收到一條合併消息,裏面每條批註按 Annotation N: 編號,引用原文,下面跟批註內容。

已知限制與注意事項

README 自己列出的風險要放在前面說。

  • 棧非空時,發送會在提交前把拼好的批註文本立刻寫進 composer 草稿,萬一發送失敗,這段文字會留在草稿裏。
  • 批註只存在客戶端狀態,刷新頁面就丟失;草稿不受影響。
  • 插件在全文檔範圍觀察選區,可編輯區域和它自己的 UI 裏的選區會被忽略。
  • pin 跟隨的是實時 DOM range。如果 transcript 重新渲染並卸載了對應節點(例如正在流式輸出的消息替換了自己的節點),pin 會消失,但批註仍在棧裏。
  • 棧非空且草稿帶文件附件時,走的是 composer submit 路徑,批註文本同樣會在發送前短暫寫進草稿。

另外,這個插件以當前 DSH 進程的權限運行。雖然 README 聲明沒有使用任何 DSH 權限類別,裝之前仍應打開源碼看一眼,確認與自己環境裏的策略一致;MIT 許可證已在倉庫裏。

適用場景:需要對模型輸出做逐句回顧、把特定段落連同自己的判斷一起回傳給模型的調試與評審流程。不適合:需要批註跨會話持久化、或需要在批註裏附帶代碼塊 / 附件的場景。

結尾

這個插件的價值在於把「哪句話、批註什麼、下一條消息一起發」收成一個操作,省掉複製粘貼和跨窗口對照。倉庫入口:github.com/samuelraj-game/dsh-plugin-annotation,目錄頁:skillhub.cn/plugins/samuelraj-game/dsh-plugin-annotation。倉庫裏的 package.json 顯示當前版本 0.3.1,engines.dsh 要求 >=0.2.1-rc.5。

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

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

小夜