bingbing
DSH 宿主侧插件:三段提示词投递 + 策略上下文过滤 + 运行时开关台。MIT 许可,自用为主,也欢迎拿去改。
- 只写
$DSH_HOME与自身状态目录,不写宿主文件、不解app.asar、不装环境变量。 - L0 优先:
systemPrompt.section()注册三段;system-prompt/assemblewaterfall 只做过滤,不新增/不替换。 - 运行时可在
v1 / v1+shell / v2 / 全关之间切换,不用重启;切换证据按"期望段 vs 快照实际段"逐项比对。
仓库结构
| 路径 | 是什么 |
|---|---|
| 仓库根 | 当前实现(0.9.x):三段投递 + 策略改写 + 运行时开关台 + 客户端插件 |
docs/PROVENANCE.md |
来源审计:与上游的逐字重合度、方法与发布闸 |
旧越狱 dsh-purge-ultra(代号 X)已于 2026-10-24 移出本仓库,现存于本地私有归档,不进任何分发包。
移出原因见 NOTICE:它沿用了上游 dsh-purge 的技术路线(锚点 patch + 运行时预载),
而对方 README 明确要求"借鉴思路也要署名"。
旧越狱当年实测的结论保留为历史:它靠 systemPrompt.section() 注入单段正文 + 锚点 patch 宿主代码;
在 asar-only 桌面版上只有 L0 注入真正生效,代码面 patch 有效卡数为 0。bingbing 取代它之后,
把它那份尾段保留成可切换的变体(prompts/shell/post.legacy.md,376 B)—— 面板点「旧越狱」即可复现旧行为。
两代的能力边界与对照表见 REPORT.md §1。
精简包不含 tests/ tools/ probes/ installer/ 和设计文档,所以里面的 doctor 会显示:
– 机制自测 SKIP (精简包未附带 tests/selftest.mjs)
– 客户端插件契约 SKIP
– 全量验收 SKIP
✓ 运行时状态 PASS (4 段,4 段待下次组装)
这是预期行为——精简包只保证"能装、能跑",不保证"能自检"。要完整自检就用完整包。
自己打这两个包:
node tools\build-dist.mjs # → dist/bingbing-<ver>-dist.zip
node tools\build-dist.mjs --full # → dist/bingbing-<ver>-portable.zip
装(两步)
node bin\bingbing.js install
然后托盘退出宿主再打开一次 —— 输入框右边出现「越狱」按钮就装好了。
就这两步,验证只需一条命令:
node bin\bingbing.js doctor # 机制自测 + 客户端契约 + 全量验收,一次跑完给结论
| 命令 | 作用 |
|---|---|
node bin\bingbing.js install |
挂到当前 profile(幂等,自动备份,--dry-run 可预演) |
node bin\bingbing.js uninstall |
摘干净(保留切换记录),之后重启生效 |
node bin\bingbing.js which |
现在是哪套越狱 + 证据是否对得上 |
bingbing.cmd install |
同上,双击也能跑(不用记 node 路径) |
install.cmd |
双击即装:先 cd /d "%~dp0" 切到脚本目录,当前目录在哪都无所谓;失败会停住留错。文件名故意用 ASCII——中文名在 zip 里被解压器搞坏后会丢 .cmd 后缀,双击就弹"打开方式" |
不需要 PowerShell 脚本、不需要 pnpm、不需要打包:
install直接建 junction 并写 profile 清单, 改源码即时生效。installer\*.ps1是离线/分发用的旧路径,日常不用碰
使用
装好后不用记命令:对话框右边的「越狱」按钮打开面板,四个预设一键切:
| 预设 | 内容 |
|---|---|
| 旧越狱 | 正文 + 376 B 旧尾段 |
| 当前越狱 | 正文 + 1757 B 机制尾段 |
| 机制内核 | v2 内核 + 机制尾段 |
| 关闭 | 三段清空,且不再过滤官方政策句 |
切换只写 $DSH_HOME\state\bingbing\override.json,下一轮组装生效。面板右侧是证据表:
左列"当前配置应产生的段",右列"装配快照里实际的段",比 bytes + sha256 逐项打勾。
备选:独立网页版
node bin\bingbing-ui.mjs --open # http://127.0.0.1:7311
和客户端插件共用 lib/l0/panel.js,逻辑只有一份。
配
配置在 profile 的 cordis.patch.yml(- id: bingbing 那一段),改完重启:
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关 |
promptSet |
v1+shell |
v1 纯正文 / v1+shell 正文 + pre/post / v2 机制内核 |
promptOrder |
5100 |
核心段在 system prompt 里的位置 |
filterPolicyContexts |
true |
处置审批/沙箱政策句(contexts) |
policyMode |
rewrite |
政策段怎么处置:rewrite = 保留段名与位置、只换文本(结构对等);drop = 整段删除(旧行为) |
filterIdentitySections |
true |
过滤 harness:identity 身份段(sections) |
toolContract |
true |
把运行契约寄生进 bingbing_status 的工具描述(工具表每轮重建,不受压缩影响) |
promptFile |
"" |
显式指定正文;留空走 $DSH_HOME/prompt-inject.md |
trace |
true |
落盘 last-assembly.json / filtered.jsonl |
状态与证据都在 $DSH_HOME/state/bingbing(默认 ~/.dsh/state/bingbing),不写进包目录。
正文来源优先级:promptFile > $DSH_HOME/prompt-inject.md > 随包 prompts/v1/prompt-inject.md(v0.3.0 起随包提供,tgz 自包含)。
三处都没有时 status.reason = prompt-missing、degraded = core-missing,静态探针 S4 直接红——不会假装成功。
注:三段正文都是 thunk,每次组装现读磁盘。改 post.md / pre.md / prompt-inject.md 下一轮就生效,不用重启、不用重装。只有改 lib/ 代码或配置才需要重载。
卸载
.\installer\uninstall.ps1 # 卸包并恢复 profile 备份
.\installer\uninstall.ps1 -KeepState # 保留 ~/.dsh/state/bingbing
.\installer\verify.ps1 # 装完自检(只读)
三层回退:promptSet: v1(只换正文)→ enabled: false(不注册任何段)→ uninstall.ps1。
结构
lib/index.js 插件入口:注册三段 + 挂 waterfall + bingbing_status 工具
lib/l0/prompt.js promptSet 解析、正文来源、包装段读取
lib/l0/sections.js 三段注册,order 由 getSectionOrder() 语义推导
lib/l0/assemble.js waterfall:只过滤 contexts,落 last-assembly.json
lib/core/canary.js 静态探针 S1–S5
lib/core/state.js 状态目录、原子写、sha256
bin/bingbing.js status / check / paths
prompts/shell/ pre.md, post.md(包装段;post 含 DELIVERED/NOT DELIVERED 机制内核)
prompts/v1/ prompt-inject.md(随包正文兜底,$DSH_HOME 无正文时使用)
prompts/v2/core.md 机制内核(promptSet=v2 时启用)
probes/behavior.mjs 行为探针 B1–B7(手动跑)
installer/ build / install / uninstall / verify
探针
| # | 断言 |
|---|---|
| S1 | 政策类 context 已被过滤,且无残留 |
| S2 | 无 *identity* 段 |
| S3 | bingbing:post 在数组末尾(用下标判断,不是 order——宿主 AssembledSection 没有 order 字段) |
| S4 | 正文 sha256 与本次组装一致且非空 |
| S5 | 无重复段(防双注册) |
B1–B7 见 probes/behavior.mjs:A/B 时对 v1+shell 与 v2 各跑一遍,v2 通过数不低于基线才切默认。
验证
node tests\selftest.mjs # 29 条机制断言(不需要宿主)
node tools\check-client.mjs # 11 条客户端插件契约(沙箱里跑 factory)
node tools\acceptance.mjs # 13 项总验收(含 tgz 解包、空 DSH_HOME 回落)
node tools\context-usage.mjs # 上下文占用体检(系统/工具/消息 各占多少)
当前基线:selftest 29/29、client 11/11、acceptance 13/13 PASS。
兼容性
- DSH
0.2.1-rc.2(asar-only 桌面封装),Windows。 - 客户端插件依赖宿主的
dsh.client契约与conversation.input.activity插槽;宿主大版本变化时先跑tools\check-client.mjs。 - Linux/macOS 未验证:沙箱执行器与安装脚本都是 Windows 路径。
来源与署名
- 当前实现独立编写,全树逐字重合度最高 0.63%(通用报错字符串),正文 0.00% —— 方法与数字见 docs/PROVENANCE.md。
- 方向上受 YuJunZhiXue/dsh-purge(作者 小杨,MIT)公开实现启发,署名与范围见 NOTICE。
- 旧越狱归档已移出仓库,不进任何分发包。
发布前闸门:
node tools\provenance-audit.mjs --all --gate 1 # 退出码 0 才发
License
MIT © 2026 lochimary1
No comments yet. Be the first to write one.