在使用 DeepSeek Harness (DSH) web 版進行長對話開發時,快速定位特定提問位置、回溯對話上下文是一個常見痛點。官方 deepseek.com 網頁版通過右側的「問題條」解決了這個問題。
下面介紹的 dsh-question-rail 插件復刻了這一體驗。它會在對話界面的右側邊緣生成一條豎向的問題欄,常態下收起爲窄列小橫線,鼠標靠近時向右展開,列出當前會話每一輪的用戶提問,點擊後平滑滾動定位到對話對應位置。
插件簡介¶
dsh-question-rail 是一個 DSH web 插件,由開發者 LeonSone 維護,開源協議爲 MIT。
該插件主要解決以下問題:
* 快速定位:無需手動滾動長對話即可跳轉到任意提問輪次。
* 上下文概覽:在對話欄收起或展開狀態下,都能快速識別當前會話的提問列表。
* 視覺一致性:模仿官方界面風格,提供透明的主題適配。
核心功能¶
插件具備以下技術特性:
-
單次渲染,兩種狀態
展開與收起狀態使用同一組 DOM 元素(.qrl_item)。收起時僅顯示右側的豎線標記;鼠標懸停時通過 CSS 展開面板,顯示完整問題文本。兩者共享相同的樣式和間距。 -
跳轉到任意輪次
點擊問題條中的任意一條,對話會平滑滾動到對應的提問位置。該位置由data-chat-anchor-key錨點標識,並伴隨高亮環閃爍。 -
僅對話視圖
插件通過讀取當前會話的view狀態進行渲染門控。它只在與view === "chat"匹配時顯示,在「軌跡」、「上下文」、「Design」、「PPT」或空主頁視圖時自動隱藏。 -
完整歷史加載
DSH 的會話歷史是分頁窗口化的(hasMore)。該插件會自動循環調用session.loadOlder(),直到hasMore === false,從而列出所有輪次的提問,而非僅當前窗口內的內容。 -
性能優化
- 僅訂閱當前會話(
useSessions選擇current)。 - 使用渲染簽名(question set + active view)而非整個
ConversationSnapshot,避免在流式輸出或工具調用時觸發不必要的重渲染。 - 實現了跳過打字和穩定的處理程序。
- 僅訂閱當前會話(
-
主題與可訪問性
- 主題感知:面板文本及懸停詳情框跟隨
body[data-ds-dark-theme]變化。暗色模式下文字爲白色,亮色模式下文字爲黑色。面板本身透明,無卡片或邊框。 - 鍵盤支持:每個問題項均爲
role="button",支持tabIndex=0,可通過 Enter 或 Space 鍵觸發。
- 主題感知:面板文本及懸停詳情框跟隨
安裝與啓用¶
插件通過 DSH 的包管理機制安裝。
dsh plugin --profile web add github:LeonSone/dsh-question-rail
安裝後,該包會被添加到 dsh.profile.bundles。由於插件聲明瞭 dsh.bundle,它會被自動包含在構建中。
注意:新安裝的客戶端包需要重啓
dsh web或無頭運行器。重啓後,請刷新瀏覽器(Cmd/Ctrl+Shift+R)以加載新包。
使用方法¶
啓用後,在聊天界面中操作:
- 展開/收起:將鼠標移動到對話區域的右側邊緣,問題條會從豎線展開爲列表。
- 查看文本:鼠標懸停在列表中的某一項上,左側會浮現一個詳情框,顯示完整的問題文本(最大高度 50vh)。
- 跳轉定位:點擊列表中的問題,對話流會自動平滑滾動至該提問處,並高亮顯示。
- 視圖適配:切換到非對話視圖(如軌跡、PPT 等)時,右側邊緣的問題條會自動消失。
技術實現要點¶
- 節點半部分:
lib/index.js爲空,僅包含一個空的apply()函數。這是爲了滿足 Cordis 加載器的發現機制,確保dsh-client-modules能發佈客戶端資源。 - 瀏覽器半部分:
lib/client.js通過window.__ModuleLoader__.load註冊,並在apply(ctx)中注入到shell.overlay插槽。 - 數據源:直接讀取
ConversationSnapshot.nodes,提取user或steering類型的輪次,並映射到聊天錨點key。
生態鏈接¶
- GitHub 倉庫:https://github.com/LeonSone/dsh-question-rail
- 技能目錄:https://www.skillhub.cn/plugins/LeonSone/dsh-question-rail
該插件屬於 DSH 插件生態,與 DeepSeek 或幻方公司無官方從屬關係。