Repository navigation
DSHEssentialTools v2.12.0 — self-healing ADU
v2.12.0 — 自愈式按需装载:工具不会再「自己没了」
用户反馈三条:「旧对话会自动卸载已经用过的工具」「有时 DSH 不会启用 ADU」「adu 下一轮才生效」。
根因(第一条是真 bug,不是错觉)
_syncDetRuntimeFeatures() 在按需模式下有一段隐式卸载:
if (lazy && !mounted("alv")) this.alv.dispose(); // ← 旧实现而这个函数会被每一次 feature 变更、master 同步、模块装载之后调用。叠加 v2.11.0 的
"恢复静默失效"(aduModule 忘了 import):重启后 _aduGroups 是空的 → 之后任何一次同步
都会把 dlt/alv 卸掉 → 用户看到的就是"我用过的工具自己没了"。
修法:把"装着"变成期望集合,并让它自愈
| 机制 | 做法 |
|---|---|
| 期望集合 | _aduWanted(内存)+ det.adu.mounted(落盘)。装载=加入、卸载=移除,两者始终一致 |
| 不再隐式卸载 | 按需模式下 _syncDetRuntimeFeatures 只自愈、不 dispose;装与卸只归 ADU 管 |
| 每步自愈 | 挂 agent/pre-step:每一步请求前比对 wanted 与已装,缺了就补。重启竞态、热重载、误卸都靠它兜回来 |
| 用过即钉住 | 挂 tools/pre-execute:某模块的工具被真正调用过一次 → 加入 wanted 并落盘。用过的工具从此参与自愈 |
| 面板自愈 | 打开 ADU 面板(aduStatus)也会顺手对齐一次,并回传 wanted / drift |
| 模式可查 | detFeatureGet 新增 aduMode(lazy / atLoad / boot / wanted / loaded),"有时不启用"不再靠猜 |
关于「下一轮才生效」
装配顺序是 systemPrompt.assemble()(先取工具快照)→ agent/pre-step → 建请求,
所以本步内挂载不可能改本步的工具表 —— 这是宿主结构,不是 DET 能绕的。但:
- 它不是"下一轮"而是"下一步":同一轮里如果还有后续步骤(工具调用循环),新工具就会出现;
adu_load的说明已改成准确表述;- 自愈保证"装过的东西"永远在下一次装配里,而不是等用户再问一遍。
测试
tests/alv-adu.test.mjs130 → 145:源码守卫(不得隐式 dispose、必须有 pre-step 自愈 /
pre-execute 钉住 / aduMode)+ 行为(wanted 记账、清空_aduGroups后自愈补装、
调用一次工具即钉住并落盘)。- 全量:128 + 60 + 23 + 47 + 17 + 37 + 22 + 40 + 71 + 10 + 145 = 600 断言全绿。
Install
powershell dsh plugin --profile web add github:LLYlab/DSHEssentialTools