mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-22 18:08:04 +00:00
main() 原本是一整条 696 行的启动脚本:日志、目录、记忆、配置、Lua、守护、
追踪、内核 API、文本记忆、LLM 源、文档/知识、人格、插件、Agent、ONNX、
IPC、心跳、关停全挤在一个函数里,变量跨 500 行互相引用。
现在 main() 只剩「顺序编排 + 就地交接」(**149 行**,低于 funlen 阈值 150):
opt := parseFlags()
logDir := setupLogging(opt.dataDir)
agentWorkDir := ensureDataDirs(opt.dataDir)
mem, closeMem := initMemoryStack(opt.dataDir)
...
共 25 个阶段调用,实现体在同包 bootstrap.go(一一对应)。
零漂移保证:
* 阶段体逐字取自原 main,只做机械替换(`*dataDir`→参数、`memIdx`→`mem.indexer`);
* 原 main 的每个 defer 都换成一个在**同一位置**注册的 cleanup,
LIFO 释放顺序不变;多资源阶段内部再按原注册顺序取反;
* 语句级比对:原 main 的 525 条可执行语句全部有对应,无遗漏。
仅 3 处为**有意**的结构改写(其余为同义替换):
1. initLuaVM / initTextMemory:「启动成功才 defer Stop」改为
「失败返回 no-op cleanup,成功返回 Stop」——调用点语义不变;
2. startIPCServer:同上(用 started 标志保证失败时不 Stop);
3. resolveBaseAPIKey:把三级兜底 API key 解析提成一个纯函数。
* defaultPrompt 提为包级 const defaultSystemPrompt(不含版本号字面量)。
验证(A/B 实测,不是只跑编译):
* go build ./... / go vet ./cmd/homed/ / go test ./cmd/... ./internal/agent/... ./internal/plugin/... 全绿
* 重构前后二进制各起一次(-data 临时目录,SIGTERM 收尾),日志集合**完全一致**:
63 个注册工具、同名插件全部 loaded、kernel ready、插件逆序关停、'stopped'
—— 差异仅为并发加载插件的打印顺序。
全仓非测试 Go 函数现状:≥300 行 **0 个**,≥200 行 9 个,≥150 行 16 个。