mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-25 03:18:08 +00:00
feat: ConfigRegistry + SettingsAPI for plugin config access
Core exposes a unified settings interface through Plugin SDK: - internal/config/registry.go: thread-safe namespaced KV store - Register/Get/Set/List/Delete with JSON persistence - Flush() for explicit save to disk - SettingsAPI in SDK: plugins call plugin.Settings().Get/Set/List - Full access: read/write any key (core.*, plugin.<name>.*) - plugin.Registry.SetConfigRegistry() wires it into SDK plugins - main.go registers core.* keys at startup, flushes on shutdown - 7 tests for ConfigRegistry
This commit is contained in:
@ -12,6 +12,7 @@ import (
|
||||
"time"
|
||||
|
||||
agentIO "gitcode.com/JianFeeeee/HomeAgent/internal/agent/io"
|
||||
internalConfig "gitcode.com/JianFeeeee/HomeAgent/internal/config"
|
||||
sdk "gitcode.com/JianFeeeee/HomeAgent/internal/plugin/sdk"
|
||||
)
|
||||
|
||||
@ -149,6 +150,14 @@ type Registry struct {
|
||||
ioMgr *agentIO.IOManager
|
||||
factories map[string]NativeFactory // 名称匹配的插件使用原生实现
|
||||
sdkAPIs map[string]*sdkAPI // SDK 插件 API 实例
|
||||
cfgReg *internalConfig.ConfigRegistry
|
||||
}
|
||||
|
||||
// SetConfigRegistry 注入全局配置注册表,使 SDK 插件可访问配置
|
||||
func (r *Registry) SetConfigRegistry(cr *internalConfig.ConfigRegistry) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
r.cfgReg = cr
|
||||
}
|
||||
|
||||
type sdkAPI struct {
|
||||
@ -172,6 +181,15 @@ func (r *Registry) RegisterPluginAPI(api *sdk.PluginAPI) error {
|
||||
if _, ok := r.sdkAPIs[api.Name]; ok {
|
||||
return fmt.Errorf("sdk api %s already registered", api.Name)
|
||||
}
|
||||
|
||||
// 注入 SettingsAPI(读取/修改核心与其他插件配置)
|
||||
if r.cfgReg != nil {
|
||||
api.SetSettings(&pluginSettings{
|
||||
reg: r.cfgReg,
|
||||
name: api.Name,
|
||||
})
|
||||
}
|
||||
|
||||
r.sdkAPIs[api.Name] = &sdkAPI{
|
||||
api: api,
|
||||
tools: api.Tools(),
|
||||
@ -187,6 +205,24 @@ func (r *Registry) RegisterPluginAPI(api *sdk.PluginAPI) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// pluginSettings 实现 SettingsAPI,以插件名为命名空间
|
||||
type pluginSettings struct {
|
||||
reg *internalConfig.ConfigRegistry
|
||||
name string
|
||||
}
|
||||
|
||||
func (s *pluginSettings) Get(key string) (interface{}, error) {
|
||||
return s.reg.Get(key)
|
||||
}
|
||||
|
||||
func (s *pluginSettings) Set(key string, value interface{}) error {
|
||||
return s.reg.Set(key, value)
|
||||
}
|
||||
|
||||
func (s *pluginSettings) List(prefix string) ([]string, error) {
|
||||
return s.reg.List(prefix), nil
|
||||
}
|
||||
|
||||
// GetAllSDKToolDefs 收集所有 SDK 插件的工具定义
|
||||
func (r *Registry) GetAllSDKToolDefs() []sdk.ToolDef {
|
||||
r.mu.RLock()
|
||||
|
||||
@ -72,6 +72,12 @@ type ToolDef struct {
|
||||
Parameters map[string]interface{} `json:"parameters"`
|
||||
}
|
||||
|
||||
type SettingsAPI interface {
|
||||
Get(key string) (interface{}, error)
|
||||
Set(key string, value interface{}) error
|
||||
List(prefix string) ([]string, error)
|
||||
}
|
||||
|
||||
type MemoryAPI interface {
|
||||
Recall(query string, topK int) ([]MemItem, error)
|
||||
Commit(triples []map[string]string) error
|
||||
@ -98,6 +104,7 @@ type PluginAPI struct {
|
||||
eventBus EventBus
|
||||
memAPI MemoryAPI
|
||||
knowAPI KnowledgeAPI
|
||||
settAPI SettingsAPI
|
||||
}
|
||||
|
||||
func NewPluginAPI(name, version string, bus EventBus, mem MemoryAPI, know KnowledgeAPI) *PluginAPI {
|
||||
@ -153,8 +160,10 @@ func (p *PluginAPI) StageHandlers(stage Stage) []StageHandler {
|
||||
return p.stages[stage]
|
||||
}
|
||||
|
||||
func (p *PluginAPI) Memory() MemoryAPI { return p.memAPI }
|
||||
func (p *PluginAPI) Memory() MemoryAPI { return p.memAPI }
|
||||
func (p *PluginAPI) Knowledge() KnowledgeAPI { return p.knowAPI }
|
||||
func (p *PluginAPI) Settings() SettingsAPI { return p.settAPI }
|
||||
func (p *PluginAPI) SetSettings(s SettingsAPI) { p.settAPI = s }
|
||||
|
||||
func AllStages() map[Stage]bool {
|
||||
return map[Stage]bool{
|
||||
|
||||
Reference in New Issue
Block a user