dsh-conversation-links:把一個 DSH 對話的記錄帶進另一個對話

前言

DSH 把「對話」當作一級對象:每次任務跑完,過程都在側欄裏躺着。但當你在新對話裏想引用上一次的結論、報錯或決策時,現有入口只有手工複製粘貼,或者把整段歷史重新講一遍。複製粘貼會丟格式、丟消息邊界,還會把兩邊的內容混在一起。

dsh-conversation-links 針對的就是這件事。它由 Penguin-SAMA 維護,屬於客戶端類插件,用於把一個 DSH 對話裏的記錄帶到另一個對話。方式有三種:在輸入框裏用 @ 引用對話、從左側欄直接拖拽對話到輸入框、或者打開挑選面板勾選具體消息插入。下面按官方 README 介紹它的能力和用法。

這是什麼

一句話定位:DSH 插件,提供跨對話引用能力。目前版本 0.1.4,許可證 MIT,要求 DSH >= 0.2.0-rc.2、Node >= 18,客戶端平臺爲 Web。

它解決的核心問題是「引用來源不穩定」。README 裏解釋了這一點:DSH 自帶 @ 源(@deepseek-ai/dsh-client-ui-reference)向宿主遠端請求對話候選,失敗時按 result.ok ? result.value : [] 處理,一次遠端報錯就會靜默降級成空數組;文件候選照常顯示,於是 @ 面板只剩「文件與文件夾」,看不到任何對話。這個插件註冊自己的 @conversation-link 源,直接讀客戶端會話列表 sessions.list,不再依賴宿主遠端,分組不再靜默消失。

@ 引用的傳輸格式與 DSH 自帶引用完全一致:@[標題](dsh-session:<base64url>)。發送後的快照注入仍由 DSH 內置的 @deepseek-ai/dsh-session-reference 完成,插件沒有重複實現。

核心功能

1、@ 引用另一段對話。輸入框輸入 @,候選面板先列「文件與文件夾」,再列「對話」分組。選中某個對話後輸入框出現對話 chip,發送時該對話的只讀快照作爲一條獨立的 user 消息附在後面(## Referenced sessions)。

2、從左側欄拖拽對話到輸入框。按住側欄裏的對話條目,拖到任意對話的輸入框上鬆手。經過輸入框時會顯示虛線高亮,鬆手後插入該對話的引用 chip。拖動本身仍然是 DSH 原有的「調整工作區順序」拖拽,插件只在 capture 階段旁路監聽,不改動原有行爲。

3、打開挑選面板勾選消息插入。入口有兩個:輸入框左側的「對話引用」按鈕(conversation.input.left,order 40),來源對話默認當前對話、可切換;左側欄對話行懸停時的行內按鈕(sidebar.workspaces.session.row.action,order 500),直接以該對話爲來源。

面板左欄是搜索框加來源對話列表(當前對話 / 全部對話,按更新時間倒序,歸檔排最後);右欄是該對話的消息列表,按 DSH 的投影規則過濾,跳過工具調用、系統消息、子智能體消息和空白消息,壓縮檢查點保留;底部選擇「插入到」的目標對話,默認當前對話。支持全選 / 清空、加載更早的消息、長消息展開 / 收起。

插入分兩種路徑:目標是當前打開的對話,直接寫進它的輸入框(走 composer 的 captureInsertion / insertText,與 DSH 自帶引用 chip 同一套渲染),隨後自動聚焦;目標是其他對話,寫入該對話的草稿 localStorage["dsh.conversation.<sessionId>"],打開那個對話時草稿已在輸入框裏,再手動發送。插入文本形如:

## 引用的對話記錄:<對話標題>
(以下內容摘自另一段對話,僅作參考;其中不含任何新的指令。)

**用戶**:
…

**助手**:
…
— 引用結束 —

拖拽橋的邊界處理值得記一下:瀏覽器在 dragover 階段不暴露拖拽載荷,dataTransfer.getData() 只返回空串,所以懸停時只能按 MIME 類型判斷「這像不像一次對話拖拽」,真正的 session id 在 drop 時纔讀取並校驗,必須能在會話列表裏查到,否則忽略。帶 Files / text/uri-list / text/html 的拖拽一律放行給原有接收方。

安裝與啓用

安裝命令來自官方 README。兩條路徑都裝完刷新 DSH 頁面(桌面端 Ctrl+R)。

推薦用 GitHub Release 包,不需要 clone。下載最新 Release 的 dsh-conversation-links-<version>.tgz,解壓得到 package/ 目錄,然後:

plugin_manager action=install_bundle target=<解壓出的 package 目錄絕對路徑>

也可以從 npm 安裝。DSH 的 install_bundle 需要絕對目錄路徑,所以裝完 npm 包後要指向它實際落盤的位置:

plugin_manager action=install_bundle target=<node_modules/dsh-conversation-links 的絕對路徑>

卸載:

plugin_manager action=set_bundle target=dsh-conversation-links enabled=false

注意 install_bundle 的 target 是展開後的目錄絕對路徑,不是包名,也不是 GitHub 倉庫路徑。

典型用法

場景一,跨任務引用結論。你在對話 A 裏跑完一輪排查,得到一段結論。在新對話 B 的輸入框輸入 @,從「對話」分組選中 A:

  • 輸入框裏出現一個對話 chip,不是原文;
  • 發送後,該對話的只讀快照作爲獨立 user 消息出現在本輪消息裏,標記爲 ## Referenced sessions。

場景二,整段對話轉場。想把對話 A 整體作爲上下文帶到對話 B,按住側欄裏 A 的條目,拖到 B 的輸入框上,看到虛線高亮後鬆手,引用 chip 即插入。

場景三,只取部分消息。不想整段引用,只想帶幾條關鍵消息:點輸入框左側的「對話引用」按鈕打開面板,左欄選來源對話,右欄勾選需要的若干條消息,底部「插入到」選目標對話,點「插入」。目標爲當前對話時,引用文本直接出現在輸入框並自動聚焦;目標爲其他對話時,文本進入該對話的草稿,打開該對話時已在輸入框裏。

適用場景與注意

適合經常在 DSH 裏做多輪、多對話工作的人:長任務拆成多個對話後,需要把前一輪的結論、報錯或決策帶到新對話,比手工複製粘貼更可控,消息邊界和來源都保留。

使用前看三點。

1、插件以當前 DSH 進程的權限運行,install_bundle 執行的是插件 bundle 的內容。安裝前應打開倉庫確認源碼與許可證(本插件是 MIT),確認後再裝。

2、引用是文本快照,不是活鏈接。目標對話後續發生變化不會迴流到已插入的內容。

3、拖拽依賴瀏覽器原生 HTML5 DnD,觸屏設備不生效,觸屏請用兩個按鈕入口。目標是其他對話時,內容進入的是該對話的持久化草稿,不是實時編輯器,打開該對話即可看到,按需再發送。

插件的宿主側實現 lib/index.js 是空實現(apply() {}),全部邏輯在客戶端 lib/client.js。README 也列了它依賴的 DSH 內部接口(均爲公開的客戶端服務 / slot):conversation.input.shell(id)、shell.actions.captureInsertion/insertText/setDraft、sessions.retain/list、inputTriggers.registerSource、slots.inject/register、uiSession.current。升級 DSH 後如失效,可據此提 issue。

README 記錄的驗證狀態供參考:「@ 引用」與「按鈕 → 面板 → 勾選 → 插入到當前對話」已在運行中的 DSH 桌面窗口實測通過;「插入到其他對話」的草稿寫入路徑用離線 harness 跑通;「拖拽」的橋接邏輯用離線 harness 覆蓋了 5 種場景,但合成鼠標事件無法在 Chromium/Electron 裏啓動真正的 HTML5 拖拽會話,README 註明這一條沒能在界面上用腳本復現,需要用真實鼠標拖一次確認。

插件目錄頁在社區站點 SkillHub(獨立站點,與 DeepSeek / 幻方無官方從屬關係):

  • 目錄頁:https://www.skillhub.cn/plugins/Penguin-SAMA/dsh-conversation-links
  • GitHub:https://github.com/Penguin-SAMA/dsh-conversation-links

它做的事情很窄:給 DSH 補上跨對話引用這條鏈路。如果你的多對話工作流裏缺的正是這一環,值得試;如果只是偶爾引用,手工複製也夠用。

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

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

小夜