DeepSeek Harness 會話壓縮插件 (dsh-oha-whale-compress)

DeepSeek Harness (DSH) 的默認自動壓縮基於窗口比例判定,難以滿足對絕對 Token 數量(如 400k)的精確控制需求。dsh-oha-whale-compress 是一款解決這一痛點的插件,它接管壓縮閾值判斷,支持絕對值設定,並提供了側邊欄與輸入框下方的快捷操作入口。

核心功能

該插件主要提供以下能力:

  • 側邊欄入口:在側邊欄底部提供完整配置面板,可查看會話大小(節點數/Token數)及壓縮狀態。
  • 輸入框常駐按鈕:在輸入框下方提供常駐“壓縮”按鈕,點擊可喚起簡化版(減半)面板。
  • 自動壓縮控制:支持開啓/關閉自動壓縮,並自定義觸發閾值(默認 409600 token)。
  • 手動壓縮:通過側邊欄或輸入框按鈕一鍵觸發壓縮。

安裝

通過官方 CLI 安裝:

dsh plugin --profile web add dsh-oha-whale-compress

配置與使用

配置文件位於用戶根目錄:

~/.dsh/storages/dsh-oha-whale-compress/config.

在此文件中設置以下字段:

  • autoCompress: 控制自動壓縮總開關。
  • autoThresholdTokens: 觸發壓縮的絕對 Token 閾值(默認 409600)。
  • dockButton: 控制輸入框下方按鈕的顯示與隱藏。

觸發壓縮的方式有兩種:

  1. 通過側邊欄底部的完整面板點擊按鈕。
  2. 通過輸入框下方的常駐按鈕(調用減半面板)。

手動壓縮必須走框架命令:ctx.get('commands').execute(agent, '/compact', [], signal)。

引擎注入與生效

要讓自動壓縮按本插件的絕對閾值工作,需要將注入的 preset 引擎名替換爲 dsh-oha-whale-compress/engine。

官方說明運行時的權威源是 profile 的 cordis.patch.yml,而非 ~/.dsh/.agent-presets/<id>/agent.cordis.yml。若需批量替換,可使用提供的注入腳本:

cd /root/dsha-oha-whale-compress && node --input-type=module -e "
const { injectPreset } = await import('file:///root/dsha-oha-whale-compress/src/injector.js')
const r = await injectPreset({
  presetPath: '/root/.dsh/profiles/web/cordis.patch.yml',
  userRoot: '/root/.dsh/profiles',
  mode: 'inject',
  expectedCount: 4
})
console.log(r)"

修改生效條件:
* 修改 src/*(host 半):需重啓 dsh。
* 修改 client/client.js:刷新頁面。
* 修改 preset 引擎行:需重啓 dsh(loader 不監聽 preset 文件)。

技術細節與注意事項

  • 懶加載設計:插件只硬注入 webServer,其餘服務一律通過 ctx.get() 運行時懶取,取不到時優雅返回 503,絕不阻塞插件激活。
  • 服務隔離:compaction 服務是隔離的(壓縮 group isolate),profile 插件無法直接調用,只能通過命令觸發。
  • 依賴聲明:package.json 的 exports 必須聲明 ./engine,否則加載會報錯。
  • 異步加載陷阱:異步加載的值不要直接餵給開關,否則每次打開面板都會觸發重播動畫。建議初值取模塊級 config store 中已加載好的值。
  • Store 字段差異:sessions store 沒有 current 字段,只有 byId 和 list。面板需通過 uiSession.current 獲取當前會話,或從 byId 中查找 retainedBy.mainView > 0 的會話。
  • UI 渲染坑點:反轉布爾判斷會導致 UI 靜默不渲染。例如 if (full) 判斷寫反,會導致完整面板內的開關、閾值等字段全部不顯示。改完判斷後需逐個字段驗證。
  • Slot Props:宿主渲染 shell.overlay 和 conversation.composer.dock 時傳入的是空對象,相關 props(如 useSessions)均爲 undefined,需從 ctx.get('uiSession').current 等處自行獲取。
羽毛球分组比赛记分
小程序二维码

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

小夜