aaronoho/dsh-plugin-selection-comments:給模型輸出加劃詞評論與獨立會話窗口

前言

用 DeepSeek Harness Web GUI 跑對話時,遇到一段想追問的模型輸出,常規做法是複製那段文字、新開一個會話粘貼再繼續問。上下文長的時候,複製會丟位置信息,新開的會話也不帶原會話的上下文。dsh-plugin-selection-comments 解決這個問題:在 Web GUI 裏直接選中模型輸出的文字,浮出評論框寫下批註,或用「更多詳情」打開一個脫離主會話的獨立懸浮窗口接着聊。

下面介紹這個插件。它是 AaronOhO 維護的標準 DSH bundle,託管在社區目錄上,分類爲客戶端插件,當前星標爲 0,版本 0.1.0,許可證 MIT。

定位:兩個表面

插件做兩件事,都發生在瀏覽器側:

  1. 選中 assistant 輸出的文字,浮出快捷操作欄,可以把這段文字連同你的評論「添加到對話」,或點「更多詳情」打開獨立會話窗口。
  2. 獨立會話窗口是當前會話最近一個已完成輪次的 fork,上下文完整,但不改動主會話,也不出現在側邊欄。

插件不注入 iframe、不替換應用根節點,所有 UI 通過 Harness 的 Slot(shell.overlay、conversation.input.dock)註冊,由 React 渲染。它不需要 Host 端配置,也不改動模型或 API 設置。

核心功能

1. 劃詞評論(Selection comments)

選中模型輸出裏的任意文字,會上浮一個快捷操作欄,提供「添加到對話」和「更多詳情」兩個動作。

點「添加到對話」會在選區旁浮出評論框,引用所選文字,評論內容可寫可不寫,Cmd/Ctrl + Enter 或發送按鈕確認。確認後:

  • 所選文字被持久高亮爲藍色,範圍末尾出現帶編號的橙色標記;
  • 輸入框上方出現 N 條註釋 膠囊按鈕;
  • 點膠囊打開可滾動的懸浮註釋列表,每條顯示編號、所選文本、用戶評論,支持編輯和刪除;
  • 膠囊上的 × 一次刪除本會話全部註釋。

註釋保存在瀏覽器 localStorage(dsh-selection-comments:v1:*),按會話隔離,刷新頁面後高亮、編號、膠囊都會恢復。

2. 註釋隨消息發送

發送用戶下一條消息時,插件會把「所選文本 + 用戶評論」作爲引用塊放進該條消息,會話裏可見。發送成功後註釋自動清空,高亮、編號、膠囊一起消失,文字已經進入對話歷史,屬於持久的對話內容。

如果輸入框爲空但有註釋,右側的發送箭頭會恢復爲正常的藍色可點擊樣式(宿主原本會把它禁用成半透明)。此時點箭頭、點「發送註釋」、或直接按 Enter,都能把註釋作爲單獨一條消息發出。

發送失敗時註釋保持 pending,下一次嘗試會再次帶上它們。

3. 獨立會話窗口(更多詳情)

選中文字後點「更多詳情」,打開一個懸浮窗口,標題就叫「更多詳情」。

窗口裏的會話是當前會話在最近一個已完成輪次上的 fork:上下文完整,但和主會話完全獨立,主會話不會被改動。窗口有自己的輸入框與發送/停止按鈕,支持拖動標題欄移動、拖動右下角縮放、收起/展開、關閉。

這個獨立會話不會出現在側邊欄——插件按會話 id 隱藏其側邊欄行([data-row-key="session:<id>"]),並記住隱藏列表。用同一段選中的文字再次點「更多詳情」會複用同一個獨立會話,不會重複 fork。

窗口幾何只記在當前頁面,不跨刷新保留。

4. 實現方式

插件分成 Host 半邊和 Client 半邊:

部分 文件 作用
Host half index.js Inert loader row,所有行爲都在瀏覽器側
Bundle patch cordis.patch.yml 插入 selection-comments row
Client module client.js 構建出的瀏覽器 bundle,由 window.__ModuleLoader__.load 加載
源碼模塊 src/*.js Store、持久化、錨點、CSS 高亮、評論表面、側聊窗口、Slot 註冊
共享契約 docs/CONTRACT.md 狀態結構、data/action API、接入點、驗證清單

高亮用的是 CSS Custom Highlight API(::highlight(...)),React 重渲染不會抹掉它。選區通過精確引用文字、行錨點 key(data-chat-anchor-key)、文本偏移和上下文捕獲,流式輸出穩定或歷史重載後,範圍會按引用文字和上下文重新定位。只有 assistant 輸出行可以被選中。

獨立窗口通過共享的 conversation.content Factory 和 SessionProvider 掛一個真實的 Conversation 實例,直接複用宿主的聊天和輸入框。

5. 已知限制

  • 註釋標記在發送前是瀏覽器本地的,不跨設備或 Harness 實例同步;清除站點數據會刪掉它們。發送之後,那段文字就像普通的用戶消息一樣留在會話裏。
  • 側聊會話是本地會話 store 裏的真實 fork 會話,插件只是隱藏了它們的側邊欄行。清除瀏覽器數據後,之前創建的側聊會話會重新出現在側邊欄裏,它們本來就是普通會話。
  • 同一時間只支持一個側聊窗口。
  • 窗口收起時會摺疊會話正文,因此收起前未發送的側聊輸入框草稿不保留。

安裝與啓用

插件是標準 DSH bundle(dsh.bundle.patch + dsh.client),engines.dsh 要求 ^0.2.1-alpha.2。三種安裝方式:

# 從工作區 checkout 安裝
dsh plugin --profile desktop add link:/absolute/path/to/dsh-plugin-selection-comments
# 或按包名安裝
dsh plugin --profile desktop add dsh-plugin-selection-comments

直接從 GitHub 安裝:

dsh plugin --profile desktop add AaronOhO/dsh-plugin-selection-comments

也可以在 Harness 插件管理器裏,從「設置 → 插件 → 添加插件」選擇本目錄安裝 bundle。啓用「劃詞評論與獨立會話」這一行,然後刷新一次頁面,讓 Client bundle 加載進來。

裝進 Desktop 應用的 desktop profile(對應插件管理器的本地目錄安裝):

node scripts/install-desktop.mjs            # 默認 ~/.dsh/profiles/desktop
# 然後重啓 DeepSeek Harness,讓 profile bundle layers 重新組合

這個腳本會在自身旁邊備份 package.json,只追加鏈接的依賴和 bundle 選擇。刪除其中一項,或重啓後在插件管理器裏關掉 bundle,就能卸載插件。

卸載後兩個浮層和側邊欄隱藏規則都會消失;註釋本身留在瀏覽器存儲裏,除非手動清除。

典型用法:驗證

插件自帶一套獨立的端到端驗證報告(43/43 項檢查,覆蓋淺色、深色、刷新後持久化),見 docs/verification/REPORT.md 和機器可讀的 docs/verification/report.json。

自動化驗證用打包的隔離 Harness 運行時加 Playwright:

node build.mjs
node scripts/e2e.mjs http://127.0.0.1:12447 "<token>" .devhome-verifier/shots

scripts/e2e.mjs 對着任意正在運行的 DSH 實例跑(傳入 base URL 和 ?token=)。本地需要能解析到 playwright,或者用 DSH_PLAYWRIGHT=/path/to/playwright 指定。測試覆蓋 CONTRACT.md 裏的清單:工具欄位置、註釋的創建/編輯/刪除/全部刪除、高亮和標記、列表浮層、獨立窗口與輸入框、拖動/縮放/最小化、側邊欄隱藏、刷新持久化、淺色深色主題、控制台乾淨度。

適用場景與注意

適合經常在 Web GUI 裏審閱長回答、需要對特定段落反覆追問的人。劃詞評論解決了複製粘貼丟上下文的問題,獨立窗口則在不污染主對話的情況下做分支追問。

兩條使用注意:

  1. 插件以當前 DSH 進程的權限運行,安裝前應先檢查源碼和許可證(MIT)。
  2. 未發送的註釋只存在瀏覽器本地。要跨機器繼續用同一批註,需先把註釋隨消息發出,讓它進入對話歷史。

結尾

這個插件的價值在於把 ChatGPT 桌面端的劃詞標註習慣帶進 DSH Web GUI:選區即錨點,註釋可回溯,追問有獨立空間,而且不需要動 Host 配置。目錄頁:https://www.skillhub.cn/plugins/AaronOhO/dsh-plugin-selection-comments,源碼:https://github.com/AaronOhO/dsh-plugin-selection-comments。

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

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

小夜