diff --git a/internal/meta/meta.go b/internal/meta/meta.go index 4ed993a..73ed48d 100644 --- a/internal/meta/meta.go +++ b/internal/meta/meta.go @@ -101,4 +101,7 @@ const ( CoreSettingsPlugins = 45 CoreRegisterInputCh = 46 CoreInjectInputSync = 47 + CorePluginReloadOne = 48 + CorePluginListLoaded = 49 + CorePluginIsDisabled = 50 ) diff --git a/internal/plugin/cabi/loader.go b/internal/plugin/cabi/loader.go index 3703465..f42b16a 100644 --- a/internal/plugin/cabi/loader.go +++ b/internal/plugin/cabi/loader.go @@ -887,6 +887,40 @@ func go_core_dispatch(methodID C.int, ctx unsafe.Pointer, s1, s2, s3 *C.char, i1 } s.RegisterInputChannel(a1, chDef) return 0 + + case 48: // CORE_PLUGIN_RELOAD_ONE + if s.PluginMgr() == nil { + setErr(errorOut, fmt.Errorf("plugin manager not available")) + return 1 + } + if err := s.PluginMgr().ReloadOne(a1); err != nil { + setErr(errorOut, err) + return 1 + } + setResult(result, "reloaded: "+a1) + return 0 + + case 49: // CORE_PLUGIN_LIST_LOADED + if s.PluginMgr() == nil { + setErr(errorOut, fmt.Errorf("plugin manager not available")) + return 1 + } + if b, err := json.Marshal(s.PluginMgr().ListLoadedPlugins()); err == nil { + setResult(result, string(b)) + } + return 0 + + case 50: // CORE_PLUGIN_IS_DISABLED + if s.PluginMgr() == nil { + setErr(errorOut, fmt.Errorf("plugin manager not available")) + return 1 + } + if s.PluginMgr().IsPluginDisabled(a1) { + setResult(result, "1") + } else { + setResult(result, "0") + } + return 0 } return 0 } diff --git a/internal/sdk/plugin.go b/internal/sdk/plugin.go index 899b313..2a2e7d8 100644 --- a/internal/sdk/plugin.go +++ b/internal/sdk/plugin.go @@ -74,6 +74,8 @@ type PluginManager interface { // onRemove 回调(RegisterOnRemoveHandler),最后从注册表移除。目录删除由调用方负责。 RemovePlugin(name string) error ReloadPlugins() (string, error) + // ReloadOne 重载单个插件(停止后重新加载,处理 dlclose/dynamic 句柄)。 + ReloadOne(name string) error PluginMetas() map[string]PluginMeta PluginDir() string }