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: 控制输入框下方按钮的显示与隐藏。
触发压缩的方式有两种:
- 通过侧边栏底部的完整面板点击按钮。
- 通过输入框下方的常驻按钮(调用减半面板)。
手动压缩必须走框架命令: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服务是隔离的(压缩 groupisolate),profile 插件无法直接调用,只能通过命令触发。 - 依赖声明:
package.json的exports必须声明./engine,否则加载会报错。 - 异步加载陷阱:异步加载的值不要直接喂给开关,否则每次打开面板都会触发重播动画。建议初值取模块级 config store 中已加载好的值。
- Store 字段差异:
sessionsstore 没有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等处自行获取。