Skip to content

DSHEssentialTools v2.12.0 — self-healing ADU

Choose a tag to compare

@LLYlab LLYlab released this 25 Oct 13:14
· 3 commits to main since this release

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.mjs 130 → 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