fix(config): 插件 def 查询不再越界 —— ListDefs 作用域 + 新增 ListCoreDefs

两个方向相反的越界,合起来把 WebUI 设置接口的 meta 撑成 5208 条(96% 重复):

1) PluginSettings.ListDefs(prefix) 把 prefix 直接透传给全局 ListDefs,
   等于「返回全仓所有 def」——调用方以为在问某个插件,实际拿到全部。
   修复:限定到 plugin.<name>. 命名空间,并把 Key 剥回插件内局部键
   (调用方看到的键必须与 Set/Get/ListPlugin 的局部键一致)。

2) DefsCore(prefix) → reg.ListDefs(prefix) 会连插件 def 一起返回,
   于是 meta 里出现 plugin.<name>.<key> 的「核心侧副本」。
   修复:新增 ConfigRegistry.ListCoreDefs,显式排除 plugin.* 命名空间。

生产实例实测(旧代码):GET /api/v1/settings 的 meta = 5208 条,
其中 core.agent.* 等每个 def 都被复制 28 份(每个插件命名空间一份),
并派生出 plugin.<a>.plugin.<b>.<key> 这类幻影键。

⚠️ 幻影键不只是脏数据:设置接口的 PUT 走 SplitN(key, ".", 3),
对 plugin.<a>.plugin.<b>.<key> 会解出 (a, "plugin.<b>.<key>"),
即按 UI 上的幻影条目保存会**写进错误插件的配置表**。

新增 TestPluginDefsAreNamespaced 钉住两条作用域。
This commit is contained in:
HomeAgent Agent
2026-09-14 06:53:58 +08:00
parent 3edab0fe68
commit 9e6627f0c3
3 changed files with 108 additions and 2 deletions

View File

@ -152,7 +152,8 @@ func (s *settingsImpl) DefsCore(prefix string) []*ConfigDef {
if s.reg == nil {
return nil
}
return mapDefs(s.reg.ListDefs(prefix))
// 只取核心命名空间:插件 def 已限定在 "plugin.<name>.",不能当核心 def 返回。
return mapDefs(s.reg.ListCoreDefs(prefix))
}
func (s *settingsImpl) DefsPlugin(plugin, prefix string) []*ConfigDef {
if s.reg == nil {