mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-22 09:58:06 +00:00
- build.sh supports linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64, and 'all' for matrix build - Components: homed (CGO, Linux/macOS-only), waiter (all platforms), gui - Platform matrix documented in script header - waiter: extract setRawMode into rawmode_linux.go + rawmode_other.go for cross-platform support - Add cmd/gui/node_modules/ and dist/ to .gitignore - Fix .gitignore waiter pattern to not ignore cmd/waiter/ directory
6.7 KiB
6.7 KiB
HomeAgent 代码审查报告(第三轮逐行全面复审)
审查日期: 2026-07-18
审查范围
cmd/homed/main.go(453 行)internal/agent/core/agent.go(3156 行),stages.go(155 行),context.go(252 行),plugin_health.go(128 行)internal/agent/core/stages_test.go(199 行)internal/agent/api/provider.go(783 行)internal/agent/io/channel.go(636 行)internal/sdk/全部 9 个文件 (510 行)internal/plugin/registry.go (426 行), plugin.go (295 行), dynamic.go (142 行)internal/plugin/cabi/loader.go(651 行)internal/lua/vm.go(403 行)internal/events/bus.go(83 行)internal/config/registry.go(700 行)internal/memory/graph.go(766 行), indexer.go (312 行), static_embedder.go (369 行), clean_text.go (57 行)internal/memory/document/document.go(471 行)- SDK 仓库
sdk/全部 6 个 API 文件 +plugin_test.go(~700 行) - SDK 仓库
tools/plugindev/templates.go - 架构文档 4 份 (
docs/zh/)
Bug 级别
A-1 processTextInput 缺失 runStage(StageOnInput) 调用
- 位置:
internal/agent/core/agent.go:494-562 - 严重程度: 高
- 描述:
processTextInput创建了stageCtx(行515) 但从未调用a.runStage(sdk.StageOnInput, stageCtx)。注册了on_input阶段的插件对文本输入完全不可见。 - 对照:
processMediaInput(行410) 正确调用了runStage(StageOnInput)。 - 影响: 所有文本输入的
on_input阶段钩子静默失效。黑名单、限流、短路回复等功能对文本输入无效。 - 文档对照: ARCHITECTURE.md 完整链路图中
processTextInput()下方第一支路即为on_input stage。
A-2 processTextInput 缺失 publishEvent(EventRawInput)
- 位置:
internal/agent/core/agent.go:494-562 - 严重程度: 中
- 描述:
processTextInput没有发布EventRawInput事件。 - 对照:
processMediaInput(行405) 正确调用了a.publishEvent(events.EventRawInput, ...)。 - 影响: 订阅
raw_input事件的插件/WebUI 收不到文本输入的原始事件。
A-4 processMediaInput 缺失 emitMemoryCandidate 调用
- 位置:
internal/agent/core/agent.go:371-436 - 严重程度: 中
- 描述: 媒体输入处理完成后,没有调用
emitMemoryCandidate(文本处理在行560对应调用)。图片/音频对话不会被捕获到文本记忆层。 - 影响:
text memory中缺失多模态交互记录。
A-5 StageOnInput 在 context.Append 之后执行
- 位置:
internal/agent/core/agent.go:389-410 - 严重程度: 低
- 描述:
processMediaInput中行389a.context.Append()先执行,行410runStage(StageOnInput)后执行。插件在on_input阶段无法阻止上下文被追加。 - 文档对照: ARCHITECTURE.md 描述
on_input为"消息到 Agent,零处理",应在任何处理之前执行。
A-6 lua/vm.go 中 http_get/http_post 返回 mock 数据
- 位置:
internal/lua/vm.go:69-80 - 严重程度: 高
- 描述:
http_get返回{"url":...,"body":"mock","status":200},http_post返回{"url":...,"body":...,"status":200}。没有实际 HTTP 网络调用。 - 文档对照: ADAPTER.md 第93-95行明确说明
http_get(url)和http_post(url, body)应发起真实 HTTP 请求。 - 影响: Lua 适配器脚本中尝试使用
http_get/http_post获取外部数据的功能均静默失败。
功能限制
A-7 C ABI 注册阶段时未传递 StageScope
- 位置:
internal/plugin/cabi/loader.go:285-304 - 描述: C ABI 的
CORE_REGISTER_STAGE(methodID=2) 调用s.RegisterStage(sdk.Stage(st), handler),没有 scope 参数,总是使用StageScopeGlobal。外部.so插件无法使用StageScopeOwnTools。 - 对照: 公共 SDK
sdk/plugin.go:237的RegisterStage支持...scope变参。
顺序/次要问题
A-8 processConsolidation 未注入 source context
- 位置:
internal/agent/core/agent.go:2567 - 描述:
processConsolidation直接传&sdk.StageContext{RawMessage: input},没有调用injectSourceContext。整理任务在process()内部的阶段钩子中无法获取来源/通道信息。
已确认无问题的功能
-
SDK 接口映射:
internal/sdk/的 5 组 type alias (MemoryAPI,KnowledgeAPI,SettingsAPI,LLMAPI,DocMemoryAPI) 全部正确对齐pubsdk,impl 包装器逐一桥接。 -
C ABI 45 个 dispatch 方法: 全部覆盖 SDK API,JSON 序列化/反序列化正确,无遗漏。方法列表:
- 1: CORE_REGISTER_TOOL
- 2: CORE_REGISTER_STAGE
- 3: CORE_REGISTER_OUTPUT_CH
- 4: CORE_REGISTER_PLUGIN_API
- 5-7: CORE_INJECT_TEXT / INJECT_INTERRUPT_TEXT / INJECT_TEXT_NO_MEMORY
- 8: CORE_SET_AUTO_RESTART
- 9-13: CORE_MEMORY_RECALL / COMMIT / INTROSPECT / MERGE / PURGE
- 14: CORE_DOC_QUERY
- 15: CORE_KNOWLEDGE_SEARCH
- 16-18: CORE_SETTINGS_GET / SET / REGISTER_DEF
- 19-20: CORE_LLM_LIST_SOURCES / SET_SOURCE
- 21-22: CORE_SOCIAL_GET_PERSON / GET_NETWORK
- 23-24: CORE_SUBSCRIBE / UNSUBSCRIBE
- 25: CORE_FREE_STRING
- 26-31: CORE_SETTINGS_GET_CORE / SET_CORE / LIST_CORE / GET_PLUGIN / SET_PLUGIN / LIST_PLUGIN
- 32-34: CORE_DOC_INSERT / REMOVE / STATS
- 35-36: CORE_KNOWLEDGE_ADD / LIST
- 37: CORE_LLM_CURRENT_SOURCE
- 38-40: CORE_SOCIAL_GET_TRAIT / GET_RELATIONS / LIST_PERSONS
- 41: CORE_TEXT_MEMORY_APPEND
- 42-45: CORE_SETTINGS_LIST / DEFS / DUMP / PLUGINS
-
pipeline.go非死代码:internal/memory/pipeline/pipeline.go在cmd/homed/main.go:122-130中被引用和启动。 -
emitMemoryCandidate被消费:cmd/homed/main.go:213-247的 goroutine 消费iom.OutputChan()中的memory_candidate事件,写入textMem和distiller。 -
向量表示跨会话兼容:
StaticEmbedder/TFIDFVectorizer的Vectorize()是纯函数(基于词袋权重),不依赖会话状态。 -
processConsolidation不发射记忆候选: 行2579注释说明这是有意为之,防止任务文本被蒸馏进图库造成污染。
汇总
| 编号 | 级别 | 文件 | 行 | 描述 |
|---|---|---|---|---|
| A-1 | Bug | agent.go |
494-562 | processTextInput 未调用 StageOnInput |
| A-2 | Bug | agent.go |
494-562 | processTextInput 未发布 EventRawInput |
| A-4 | Bug | agent.go |
371-436 | processMediaInput 未调用 emitMemoryCandidate |
| A-5 | Bug | agent.go |
389-410 | StageOnInput 在 context.Append 之后执行 |
| A-6 | Bug | lua/vm.go |
69-80 | http_get/http_post 返回 mock |
| A-7 | 限制 | cabi/loader.go |
285-304 | C ABI 缺 StageScopeOwnTools 支持 |
| A-8 | 顺序 | agent.go |
2567 | processConsolidation 未注入 source context |