dsh-longsession:長會話下的頁面歷史收斂與性能

前言

在 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 是否顯示標題欄切換

典型用法

  1. 安裝插件並對正在使用的 profile reload 頁面。
  2. 打開一個較長會話,使用「load earlier」加載更早歷史;當行數超過 trimMinRows 且狀態點爲琥珀色時,點擊 Collapse history 釋放已渲染 DOM。
  3. 若需回到收起前的閱讀窗口,點擊 History collapsed 進入恢復流程,等待 Restoring… 完成。
  4. 在 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。

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

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

小夜