mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-22 01:48:11 +00:00
feat(pluginmgr): 插件更新接口(upgrade/downgrade 保留配置)+ skill_install overwrite
内核 Registry 拆出 StopAndUnload: - 停止并从注册表移除插件但保留 config_<name> 表 - 不触发 onRemove 回调(那是删除专用语义) - RemovePlugin 改为追加清理配置表示清除,更新场景调 StopAndUnload pluginmgr: - installFromData/installFromURL/installFromPath 加 overwrite 参数 - 已存在+overwrite=true:StopAndUnload→备份旧目录→解压新包→失败回滚→ 返回 action=upgraded/downgraded/reinstalled+previous_version+config_kept - 已存在+overwrite=false:返回 error+hint(指向 overwrite 用法) - cmpVersion 点分版本号数字比较(非字典序) - 测试覆盖:首次安装→重装拒绝→升级保留配置→降级→失败回滚 skill_install 加 overwrite 参数: - 同名技能存在时先卸载旧实例+删除目录再安装新包 SDK PluginMgr 接口同步加 StopAndUnload(name string) error 工具链 plugindev 已重建到 /usr/local/bin(7/29→8/25 版本) QQ 插件诊断日志版(webhook recv 到达+isAtBot 失败日志)已打包并 通过 upgrade 接口热更新部署,配置保留验证通过。
This commit is contained in:
@ -724,9 +724,41 @@ func (r *Registry) DisablePlugin(name, by string) error {
|
||||
|
||||
func (r *Registry) EnablePlugin(name string) error { return r.Enable(name) }
|
||||
|
||||
// StopAndUnload 停止并从注册表移除插件,但保留其配置表(config_<name>)。
|
||||
// 供插件更新/升级流程使用:换 so/文件不动配置,重装后配置原样生效。
|
||||
// 不执行 onRemove 回调(那是删除专用语义)。目录由调用方管理。
|
||||
func (r *Registry) StopAndUnload(name string) error {
|
||||
r.mu.Lock()
|
||||
var unloaded sdk.Plugin
|
||||
p, ok := r.plugins[name]
|
||||
if ok {
|
||||
r.runStopHandlers(name)
|
||||
if err := p.Stop(); err != nil {
|
||||
log.Printf("[plugin] stop %s for unload: %v", name, err)
|
||||
}
|
||||
delete(r.plugins, name)
|
||||
delete(r.sdkRefs, name)
|
||||
for i, inst := range r.instances {
|
||||
if inst.Name() == name {
|
||||
r.instances = append(r.instances[:i], r.instances[i+1:]...)
|
||||
break
|
||||
}
|
||||
}
|
||||
unloaded = p
|
||||
}
|
||||
r.mu.Unlock()
|
||||
|
||||
if r.toolCleaner != nil {
|
||||
r.toolCleaner.UnregisterPluginTools(name)
|
||||
}
|
||||
r.closeDynamic(unloaded)
|
||||
log.Printf("[plugin] unloaded (config kept): %s", name)
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemovePlugin 卸载插件:先停止(stop handlers + Stop),再执行插件注册的 onRemove
|
||||
// 回调(删除专用,重载不触发),最后从注册表移除并清理禁用/工具注册/配置。
|
||||
// 插件目录的物理删除由调用方(pluginmgr)负责。
|
||||
// 插件目录的物理删除由调用方(pluginmgr)负责。更新场景请用 StopAndUnload。
|
||||
func (r *Registry) RemovePlugin(name string) error {
|
||||
r.mu.Lock()
|
||||
var removed sdk.Plugin
|
||||
|
||||
Reference in New Issue
Block a user