feat: 路径配置化 + 裸二进制启动 + pluginmgr 内置插件

- types.go: 新增 PluginDirConfig 结构体嵌入 Config
- config/registry.go: 新增7个路径配置项 (core.plugin.dir 等) + ConfigDef 元数据
- cmd/homed/main.go: -data 默认自动检测二进制同级目录,使用 cfg.Plugin.Dir
- internal/plugins/pluginmgr/: 内置插件实现 (4工具 + HTTP API + 包校验)
- all.go: 注册 pluginmgr
- manifest.go: 扩展 PluginManifest 字段
- sdk/settings.go: RegisterDef / Defs 接口
- webui: 设置页自动发现 ConfigDef 元数据
- config/config.go, config/config.yaml: 清理 YAML 死代码
- sdk/plugin.go: IO 通道泛型化支持非文本类型
- waiter: CLI 支持 socket 发现和交互模式
This commit is contained in:
JianFeeeee
2026-07-04 16:56:32 +08:00
parent a7b2bd98a6
commit b35cf53fb2
15 changed files with 1029 additions and 277 deletions

View File

@ -7,6 +7,7 @@ import (
"io"
"log"
"os"
"os/exec"
"os/signal"
"path/filepath"
"syscall"
@ -29,6 +30,7 @@ import (
cli "gitcode.com/JianFeeeee/HomeAgent/internal/plugins/cli"
healthcheck "gitcode.com/JianFeeeee/HomeAgent/internal/plugins/healthcheck"
openclaw "gitcode.com/JianFeeeee/HomeAgent/internal/plugins/openclaw"
pluginmgr "gitcode.com/JianFeeeee/HomeAgent/internal/plugins/pluginmgr"
webui "gitcode.com/JianFeeeee/HomeAgent/internal/plugins/webui"
sdk "gitcode.com/JianFeeeee/HomeAgent/internal/sdk"
"gitcode.com/JianFeeeee/HomeAgent/internal/skill"
@ -38,11 +40,24 @@ import (
)
func main() {
dataDir := flag.String("data", "/var/lib/homeagent", "data directory")
dataDir := flag.String("data", "", "data directory (default: auto-detect next to binary)")
httpAddr := flag.String("webui", ":8080", "webui listen address")
cliSocket := flag.String("socket", "", "cli unix socket path (default: <data>/cli.sock)")
flag.Parse()
if *dataDir == "" {
exe, err := os.Executable()
if err == nil {
*dataDir = filepath.Join(filepath.Dir(exe), "data")
} else {
if exe, err := exec.LookPath(os.Args[0]); err == nil {
*dataDir = filepath.Join(filepath.Dir(exe), "data")
} else {
*dataDir = "./data"
}
}
}
if *cliSocket == "" {
*cliSocket = filepath.Join(*dataDir, "cli.sock")
}
@ -304,7 +319,7 @@ func main() {
pluginReg.SetKnowledge(ks)
pluginReg.SetProviderManager(providerMgr)
pluginReg.SetConfigRegistry(cfgReg)
pluginReg.SetPluginDir(filepath.Join(cfg.Daemon.DataDir, "plugins"))
pluginReg.SetPluginDir(cfg.Plugin.Dir)
// Wire registration callbacks: plugins' RegisterTool/RegisterStage → StageHost
pluginReg.SetToolRegistrar(func(name string, def sdk.ToolDef, handler sdk.ToolHandler) error {
@ -360,7 +375,7 @@ func main() {
TextMemory: textMem,
Personality: personality,
PluginReg: pluginReg,
PluginDir: filepath.Join(cfg.Daemon.DataDir, "plugins"),
PluginDir: cfg.Plugin.Dir,
ContextSavePath: filepath.Join(cfg.Daemon.DataDir, "memory", "context.json"),
StageHost: stageHost,
EventBus: evBus,
@ -376,12 +391,15 @@ func main() {
)
healthcheck.Configure(stageHost, iom, pluginReg, memDB, ks, docStore, providerMgr, agent)
// Wire pluginmgr dependencies
pluginmgr.PluginDir = cfg.Plugin.Dir
pluginmgr.Reg = pluginReg
// Auto-create plugins directory (without hardcoding plugin names)
plgDir := filepath.Join(cfg.Daemon.DataDir, "plugins")
os.MkdirAll(plgDir, 0755)
os.MkdirAll(cfg.Plugin.Dir, 0755)
// Load all plugins — each scans its own dir and is loaded via factory or .so
if err := pluginReg.Load(plgDir); err != nil {
if err := pluginReg.Load(cfg.Plugin.Dir); err != nil {
log.Printf("[homed] warning: load plugins: %v", err)
}
log.Printf("[homed] stage host ready with %d registered tools", stageHost.ToolCount())