manualcompact-billion
让 dsh 的原生手动压缩 /compact 回来,同时不动 billion-context 的自动压缩。
它解决什么
装了 billion-context 之后,dsh 里的 /compact 会消失。原因不是 bug:billion 带了一个 bili-compaction-gate 插件,它在配置解析阶段把两个包改成 disabled: true:
@deepseek-ai/dsh-compaction-basic(压缩后端)@deepseek-ai/dsh-command-compact(/compact命令)
于是 dsh 既没有自动压缩,也没有手动压缩——而 billion 自己的压缩方案在部分场景(非标准线路、拦截没生效)下并不工作,你就落到「两边都没有」的境地。
这个插件把这两条重新打开,并且把后端钉成 auto: false:只手动,不自动。billion 继续管它的自动压缩,两边互不抢。
原理
dsh 的配置解析是一条 waterfall(洋葱模型):每个监听者调用 next() 拿到下游结果,还能再改。billion 的 gate 挂在链上做禁用。
本插件用 { global: true, prepend: true } 注册在最外层:
我们的钩子(最外层)
└─ billion 的 gate(禁用两个包)
└─ 基础配置(两个包原本是启用的)
← gate 返回「已禁用」
← 我们收到「已禁用」,改回「启用 + auto:false」
因为最外层的返回值才是最终结果,所以我们的修改生效,而 gate 自己完全不知道。
它只改三种值:两个 disabled: true → false,一个 config.auto = false。不碰 billion 的包、代理、gate,也不注册任何服务。
一个刻意的限制:只在被禁用时才动手
如果配置里没有任何被 gate 禁用的行(比如你哪天卸了 billion),插件直接原样返回,连 auto 都不碰。这样它不会在你卸掉 billion 之后,悄悄把你的自动压缩关掉。
安装
方式一:从 GitHub 一键安装(推荐)
dsh plugin --profile web add github:k-ying/manualcompact-billion
web 是 dsh 的默认 profile,绝大多数人用的就是它。dsh 会把 github:owner/repo 转成真实 Git 地址拉取安装,cordis.patch.yml 随包自动挂载,不用手改配置。
先确认你该装到哪个 profile
dsh 的插件按 profile 隔离,装错 profile 等于没装。三个办法确认:
# 1) 看这台机器上有哪些 profile
ls ~/.dsh/profiles
# 2) 看某个 profile 里已经装了什么
dsh plugin --profile web list
# 3) 看这个 profile 的插件配置文件在哪(装完就写在这里)
ls ~/.dsh/profiles/web/cordis.patch.yml
对照着选:
| 你的情况 | profile 名 | 配置文件 |
|---|---|---|
命令行 dsh,或浏览器打开的 Web UI |
web(默认) |
~/.dsh/profiles/web/cordis.patch.yml |
| 桌面版应用(Tauri 打包的那个) | 一般是 tauri |
~/.dsh/profiles/tauri/cordis.patch.yml |
| 自己建过别的 | 你起的名字 | ~/.dsh/profiles/<名字>/cordis.patch.yml |
不确定的话先跑 ls ~/.dsh/profiles:里面没有 tauri 目录,就说明你用的是 web。桌面版对应:
dsh plugin --profile tauri add github:k-ying/manualcompact-billion
想锁定版本可以带 tag:
dsh plugin --profile web add github:k-ying/manualcompact-billion#v0.1.0
方式二:本地目录安装
dsh plugin --profile web add ~/Documents/AI/manualcompact-billion
(把 web 换成你自己的 profile 名即可。)
方式三:手写 patch 条目
不想走插件管理器,也可以在 profile 的 cordis.patch.yml 里手写一条:
- id: manualcompact-billion
name: 'file:///path/to/manualcompact-billion/index.js'
装完都要做的一步
完全退出 dsh 再打开(不是关窗口)。配置是启动时算出来的,热改不会重新走一遍 waterfall。
验证
重启后,随便开一个会话:
- 敲
/compact,应该能压(或回「没有可压缩的历史」——那也说明命令活着)。 - 失败的样子:命令面板里没有
/compact,或报「没有压缩后端」。
日志里搜 manualcompact-billion: 会看到一行自检:
manualcompact-billion: native compaction restored (command×1, basic×1, groups×2, auto=off)
没这行,说明插件没加载,或者配置里根本没有被禁用的行。
开关
| 环境变量 | 作用 |
|---|---|
MANUALCOMPACT_OFF=1 |
插件完全让位,什么都不改 |
MANUALCOMPACT_ALLOW_AUTO=1 |
不钉 auto: false,保留你原来的自动压缩设置(会和 billion 抢历史,不建议) |
卸载
dsh plugin --profile tauri remove manualcompact-billion
重启即可。没有任何持久副作用:配置是每次启动时算出来的,插件不在就恢复原样。
风险与限制
- 它逆着上游的假设走。 billion 的设计是「我接管了就不许宿主压」,没有「接管失败时放行」这一档。本插件补的正是这个缺口,但上游不保证兼容。
- billion 真有压缩动作时,你手动
/compact会让会话历史变化,billion 下一次请求发现增量对不上,会触发一次全量 resync:多一个冷请求、缓存命中掉一格。是费用和速度的损失,不是数据损坏。 - 它不解决「billion 能不能压某个供应商」的问题。Command Code 那类非标准线路该不压还是不压。
- 上游改包名或事件名时插件会静默失效(
/compact又消失),但不会弄坏 dsh。失效时把BASIC_PACKAGE/COMMAND_PACKAGE改一下即可。
开发
npm test
14 条用例,覆盖:配置转换、嵌套 group、幂等、不改原对象、以及用假 ctx 模拟 waterfall 验证「prepend 确实压在 gate 外层」。
No comments yet. Be the first to write one.