前言¶
在 DeepSeek Harness(DSH)裏做長對話時,頁面會不斷把已渲染的歷史行留在 DOM 裏:實時追加和多次「加載更早」會讓節點數、堆內存和主線程長任務一起漲。滾動和繪製未必是瓶頸,但打開會話和拉取更早頁時的渲染成本會明顯上升。下面介紹社區插件 dsh-longsession(維護者 asots,分類爲客戶端),它通過可逆的「Collapse history」機制,在不動聊天記錄與模型上下文的前提下,收縮頁面已加載的歷史窗口。
這是什麼¶
dsh-longsession 是面向 DeepSeek Harness Desktop / Web 的瀏覽器側插件:宿主側僅註冊一條惰性 Loader 行,行爲集中在 lib/client.js。當前發佈版本爲 0.0.1(首個版本),倉庫爲 github.com/asots/dsh-longsession,許可證 MIT。插件在會話標題欄註冊切換按鈕,並可選擇對歷史請求做上限裁剪;它不移動、刪除或重建 transcript 節點,標題欄切換是唯一新增的 DOM。
社區目錄頁:skillhub.cn/plugins/asots/dsh-longsession。目錄站點與 DeepSeek / 幻方無官方從屬關係,DSH 生態奉行「一切皆插件」,安裝前宜自行查看源碼與許可證——插件隨當前 DSH 進程/瀏覽器上下文運行。
實測背景(README 中的測量)¶
作者在乾淨測試主機上對約 4.4 MB、11 輪會話做過測量,用以說明問題形態(非用戶案例):
- 打開會話:約 892 ms 就緒,單次批量渲染,最長任務約 808 ms;DOM 節點約 1,240 → 9,218,堆約 36.6 → 57.6 MB。
- 每次「load earlier」:主線程任務約 300–630 ms;行數與 DOM、堆繼續增長。
- 在約 775 行穩定滾動時可達 60 fps、無長任務——瓶頸更偏向累積渲染而非滾動繪製。
核心功能¶
Collapse history(收起歷史)¶
通過 sessions 客戶端服務調用應用自帶的 SessionFace.resync(),卸載頁面已渲染的歷史行,回到普通打開頁(最近兩輪)。不刪除聊天記錄、模型上下文與磁盤日誌。
- 未收起時按鈕文案爲「Collapse history」;收起後爲「History collapsed」,再次點擊可恢復收起前加載的窗口。
- 恢復會通過
loadOlder()向控制器請求缺失頁,期間按鈕顯示「Restoring…」。窗口(輪次數量與滾動偏移)按會話存在sessionStorage。 - 顯式恢復後,該會話的自動收起會關閉,避免立刻再次壓扁剛恢復的內容。
會話標題欄切換¶
註冊在 conversation.session.header.actions 行(與 agent team / mode 相鄰),非浮層 overlay。
- 已加載行數達到
trimMinRows後出現;剛打開只有兩輪時保持禁用,需先「load earlier」加載更早歷史纔有意義。 - 狀態點:琥珀色表示已加載更早歷史可收起;綠色表示已收起;灰色表示不可操作(無更早歷史、輪次運行中或恢復中)。
設置頁¶
Settings → Long session 展示當前頁面負載(行數、近似輪次、是否已收起),並可編輯按鈕閾值、自動收起閾值、請求上限以及是否顯示標題欄切換。
自動收起¶
當閱讀位置在實時尾部、無輪次運行、已加載更早歷史且窗口超過 autoTrimRows 行時,觸發一次收起(15 秒冷卻),並標記頁面已收起,仍可手動恢復。
可選請求上限¶
在 WebSocket session/follow 打開幀與一元 /api 分頁 RPC 發出前,可降低 maxMessages / turnWindow.minTurns。默認僅將 maxMessages 封頂爲 200;minTurns 需單獨開啓。
安裝與啓用¶
先確認主機實際使用的 profile(例如 web,或桌面構建所用 profile)。安裝後需重新加載頁面(客戶端 bundle 按頁加載)。
dsh plugin --profile <profile> add github:asots/dsh-longsession
手動接入 profile 時,README 要求:以 profile 依賴形式安裝(例如 link:/absolute/path/to/dsh-longsession 或寫入 profile 的 package.json 後在該目錄 pnpm install);將包內 cordis.patch.yml 的 Loader 行合併進 profile 的 cordis.patch.yml;再 reload(若 profile 不熱更新 patch 則需重啓宿主)。僅複製到 node_modules/ 不夠,桌面插件管理器會在下次 install 時隔離未聲明的依賴。
package.json 聲明 DSH 引擎 >=0.2.0,Node >=20。
配置¶
本構建中 Loader 行配置不會傳到瀏覽器端,需通過以下方式覆蓋:
localStorage["dsh-longsession.config"](JSON)window.__DSH_LONGSESSION__.setConfig({...})- 或 Settings → Long session
| key | 默認值 | 含義 |
|---|---|---|
enabled |
true |
總開關(關閉後停止自動收起與線路上限) |
trimMinRows |
120 |
標題欄切換出現的行數閾值 |
autoTrimRows |
600 |
自動收起閾值(0 關閉) |
historyMaxMessages |
200 |
歷史 maxMessages 上限(0 關閉) |
historyMinTurns |
0 |
turnWindow.minTurns 上限(0 關閉;1 會使打開頁減半) |
historyCapsAllSessions |
false |
是否對子 agent / 其他會話也套用請求上限 |
showDock |
true |
是否顯示標題欄切換 |
典型用法¶
- 安裝插件並對正在使用的 profile reload 頁面。
- 打開一個較長會話,使用「load earlier」加載更早歷史;當行數超過
trimMinRows且狀態點爲琥珀色時,點擊 Collapse history 釋放已渲染 DOM。 - 若需回到收起前的閱讀窗口,點擊 History collapsed 進入恢復流程,等待 Restoring… 完成。
- 在 Settings → Long session 調整
autoTrimRows與historyMaxMessages等,平衡自動行爲與首屏加載量。
本地自測(來自 README):
node test/serve.mjs 17772
瀏覽器打開 http://127.0.0.1:17772/harness.html,共 43 項斷言,通過時輸出 ALL PASS;window.__TEST_RESULTS__ 爲機器可讀結果。
適用場景與注意¶
適合:經常在單會話裏反覆「加載更早」、頁面變卡但又要保留完整聊天與上下文的 DSH 用戶;需要在瀏覽器側主動收斂渲染窗口、並可選壓低歷史請求體積的場景。
侷限與行爲(摘自 Known limits):
- 收起後打開頁等價於最近兩輪;若你正停在很深的歷史位置,收起會丟失當前滾動位置;輪次運行中按鈕禁用。
- 「History collapsed」後的恢復不是瞬時的,需經
loadOlder()逐頁拉取;滾動像素僅盡力恢復。 - 新開會話已在最近兩輪,切換默認禁用,需先 load earlier。
- 自動收起僅在實時尾部觸發;顯式恢復會關閉該會話的自動收起。
- 收起按會話生效;無
sessions服務時標題欄切換無效且無自動收起;無slots服務時不渲染切換(請求上限仍可用)。
結尾¶
dsh-longsession 把長會話的性能問題收斂到「頁面已加載的歷史窗口」:可逆收起、按會話存儲的恢復、可選線路上限與設置頁,在不刪記錄的前提下減輕 DOM 與主線程壓力。進一步瞭解與安裝可見社區目錄 skillhub.cn/plugins/asots/dsh-longsession 與 GitHub github.com/asots/dsh-longsession。