前言¶
長會話在 DSH Web UI 裏有一個具體的不便:會話視圖按需加載,早期消息默認不在內存裏,想回到前面某次提問,只能反覆點「加載更早」,或者一路滾動找位置。會話越長,這個動作越低效。
DeepSeek 官網網頁版右側有目錄索引,點一下就能跳到對應內容。dsh-session-toc 做的事情,就是把這套體驗帶進 DeepSeek Harness 的 Web UI。下面介紹這個插件的功能、安裝方式和使用細節。
這是什麼¶
dsh-session-toc(倉庫 notload/dsh-session-toc)由 notload 維護,當前版本 0.2.0,MIT 許可證。它爲 DSH Web UI 的每個會話頁添加一個右側中間常駐、可摺疊的目錄欄:會話裏的每個用戶提問是一條目錄項,點擊滾動定位到對應消息,並高亮當前條目。
兩個設計先說清楚:
1、目錄條目來自完整會話日誌。host 端通過 sessionQuery.readSession 讀取整個會話日誌再提取提問,不依賴瀏覽器已加載進內存的節點,早期未加載的消息同樣會出現在目錄裏。
2、零侵入。插件不改動任何 @deepseek-ai/* 內置包,僅以 bundle 插件方式掛載,走的是 DSH「一切皆插件」的正常路子。
核心功能¶
目錄欄本體¶
- 掛在
shell.overlay浮動層,垂直居中靠右,默認 click-through,條目本身可交互。 - 可收起成右側一個窄條按鈕,再點展開。
- 當前會話用戶提問不足閾值時自動隱藏,短會話不出現噪音。
條目來源與過濾¶
- 排除
session-reference、workspace等注入式上下文,只保留真實的用戶提問。 - 用戶消息帶文字說明時,目錄文案直接用文字;純圖片/文件、無任何文字時,用文件名兜底。
- 目錄始終由 host 讀取磁盤上的完整會話日誌生成,DSH 的上下文壓縮只改變主會話的「記憶」,不動日誌,目錄條目完整無損。
點擊定位¶
DSH 會話視圖的每個 chat 節點在 DOM 上有穩定屬性 data-chat-anchor-key。點擊目錄項時,插件用它精確定位並滾動,圖片消息同樣有該屬性,不依賴文本或圖片匹配。
目標消息未加載進 DOM 時,插件自動逐頁 loadOlder 補加載後再定位;節點始終找不到、定位不可靠時,降級爲僅高亮當前條目。
性能¶
- host 側做「進程內 LRU 緩存 + 落盤索引」雙層降頻,切換會話不再反覆觸發全量
readSession;落盤索引位於$DSH_HOME/storages/session-toc/,跨進程/重啓保留,重啓後切換會話也能秒開。 - 目錄超過 200 條時啓用固定行高虛擬列表,只渲染可見窗口 ± 緩衝;條目數據全量保留,點擊定位不受影響。
- 監聽會話快照,新提問約 1.2s 內自動進入目錄,不必切換會話或手動重載。
外觀¶
- 明/暗皮膚三檔:
auto/light/dark,可切換。 - 背景不透明度可調,隻影響背景,文字始終不透明。
- 選擇持久化到
localStorage(dsh-session-toc.theme/dsh-session-toc.bgAlpha),刷新、跨會話保留。
讀取失敗降級¶
host 讀取失敗(例如報 SessionFormatUnsupportedError)時,前端不再靜默清空:降級爲「瀏覽器已加載節點」的目錄(部分可用),並顯示「目錄加載失敗(已顯示部分已加載內容)+ 重試」提示條。
安裝與啓用¶
前提:本機已安裝 pnpm,且 DSH 的 web profile 存在(如 ~/.dsh/profiles/web)。
方式一,從 GitHub 克隆後以 link 方式安裝(推薦):
git clone https://github.com/notload/dsh-session-toc.git
cd dsh-session-toc
dsh plugin --profile web add link:$(pwd)
如果 $(pwd) 在你的 shell 裏不生效,直接寫完整絕對路徑,例如 Windows:
dsh plugin --profile web add link:C:\Users\<你的用戶名>\dsh-session-toc
方式二,若已發佈到 npm,直接裝發佈版:
dsh plugin --profile web add dsh-session-toc
確認插件進入層棧:
dsh plugin --profile web list
經過上面的步驟,重啓 dsh web,瀏覽器訪問同一 URL,會話頁右側就能看到目錄欄。
配置¶
目錄參數通過 cordis.patch.yml 傳給 host 半側(apply 的 config)。注意:DSH 客戶端配置管線當前尚未打通,瀏覽器半側收到的 config 是空對象,以下參數目前以代碼默認值爲準、不可被用戶覆蓋(對照 lib/client.js):
| key | 默認值 | 說明 |
|---|---|---|
minEntries |
1 |
當前會話用戶提問少於該值時隱藏目錄欄 |
maxChars |
48 |
單條目錄文案的最大字符數(超出加省略號) |
collapsed |
false |
初始是否摺疊 |
一處需要留意的出入:README 特性一節把自動隱藏閾值寫成「默認 3 條」,而配置表(對照 lib/client.js)寫 minEntries 默認 1,兩處不一致,實際以代碼爲準。
行爲與安全細節¶
host 側爲目錄數據路由做了幾層防護:
- 路由不攜帶 CORS 頭,由瀏覽器同源策略攔截跨源讀取。
- 校驗請求攜帶瀏覽器來源信號(
sec-fetch-site或同源Origin),curl、腳本、局域網主機等裸請求一律 403。 sessionId需屬於當前 host 可見會話,否則拒絕。- 錯誤響應不回顯內部錯誤詳情。
開發與測試:倉庫內 npm test 等價於 node --test --test-isolation=none --expose-gc。
適用場景與注意¶
適合的人:
- 經常在 DSH Web UI 裏跑長會話,需要回看、定位早期提問的開發者。
- 消息裏圖片/文件較多的用戶:定位靠節點穩定 key 而非文本匹配,圖片消息也能準確落到位置。
安裝前注意:
1、插件以當前 dsh 進程的權限運行,安裝前建議檢查源碼確認行爲,許可證爲 MIT。
2、當前客戶端配置不可被用戶覆蓋,可調的只有目錄欄內的主題、背景不透明度等界面項,其餘參數以代碼默認值生效。
3、需要本機有 pnpm,且 web profile 存在。
小結¶
dsh-session-toc 解決的是 DSH Web UI 長會話裏「找不到早先那個問題」的具體麻煩:目錄常駐右側、覆蓋整段會話日誌、點擊精確定位,讀取失敗有降級路徑,且對內置包零侵入。如果你日常重度使用 DSH Web UI,可以裝上試一試。
- 插件目錄頁:https://www.skillhub.cn/plugins/notload/dsh-session-toc
- GitHub 倉庫:https://github.com/notload/dsh-session-toc
(社區插件目錄爲獨立站點,與 DeepSeek、幻方無官方從屬關係。)