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 等处自行获取。
羽毛球分组比赛记分
小程序二维码

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

小夜