Files
HomeAgent/plan.md
root 1f1233b823 refactor: P0-P3 fixes, C1 cleanup, architecture diagrams, go.work upgrade
- P0-1: ProviderError type + ReportStatus for precise 401/403 detection
- P0-2: Remove -config flag from deploy/homeagent.service
- P2-1: 5s debounce on context.go Save()
- P2-2→C1: Delete output_set_channel entirely
- P2-3: Extract mediaDataURL/mediaChat helpers
- P2-4: Dedup defaultSources var
- P3: Delete dead packages (embed/tokenizer/container/snapshot)
- P3: Delete dead functions (messagesToMap, RunStageAll)
- CL: Update .gitignore, docs, Makefile, gojieba removal
- Config: Delete config/config.yaml, update docs
- Arch: Remove EmitOutputTo from emitResponse
- CL-1: go.work 1.19→1.21
- Docs: Add Mermaid architecture diagrams to README
- Docs: Add kernel-rebuild requires plugin-rebuild note to PLUGIN_DEV.md
2026-07-12 11:42:56 +08:00

4.6 KiB
Raw Blame History

HomeAgent 修复计划

基于 修复计划.md,按优先级逐项推进。


P0 — 功能正确性(必须修)

P0-1 HTTP 401/403 检测靠字符串搜索

  • 文件: internal/agent/core/agent.go:708-711
  • 问题: strings.Contains(errStr, "401") 不可靠Lua Adapter 返回格式不固定
  • 修复: ProviderManager 增加 ReportStatus(name, statusCode),在 LuaAdaptedProvider.Chat() 中根据 resp.StatusCode 精确判断

P0-2 deploy/homeagent.service 传递 -config 参数使 homed 启动崩溃

  • 文件: deploy/homeagent.service:9
  • 问题: ExecStart-config,但 cmd/homed/main.go 未定义此 flag
  • 修复: 删除 -config 参数

P2 — 中风险

P2-1 context.go 每次 Append/Prune 全量写盘

  • 文件: internal/agent/core/context.go:88-101
  • 问题: 30 条事件 JSON 全量写入文件每次操作,高频 I/O 瓶颈
  • 修复: 增加 debounce 定时写入(每 5s flush

P2-2 output_set_channel 枚举硬编码

  • 文件: internal/agent/core/agent.go:1927-1928
  • 问题: channel enum 硬编码为 {"voice", "email", "screen", "http"},与 Device 动态注册脱节
  • 修复: 从 a.io.ListChannels() 动态生成 enum

P2-3 describe_image/transcribe_audio/ocr_image 三重复代码

  • 文件: internal/agent/core/agent.go:2682-2828
  • 问题: 三个函数共享相同的 base64/data URL 处理、timeout、消息构造逻辑
  • 修复: 抽取 mediaRequest(mediaType, prompt, args) → string 公共方法

P2-4 两处 sources map 硬编码重复

  • 文件: internal/config/registry.go:233-244 + :302-313
  • 问题: seedDBValuesseedCoreDefs 各写了一遍完全相同的 sources map
  • 修复: 抽取公共 var defaultSources

P3 — 低风险(死代码删除/清理)

P3-1 删除 messagesToMap 死函数

  • 文件: internal/agent/api/provider.go:731-740

P3-2 删除 RunStageAll 死函数

  • 文件: internal/agent/core/stages.go:106-108

P3-3 删除 internal/embed/ 整包死代码

  • 文件: internal/embed/embedder.go162 行,无任何 import

P3-4 删除 internal/tokenizer/jieba.go 死代码

  • 文件: internal/tokenizer/jieba.go81 行Global() 从未被调用)

P3-5 删除 internal/container/ 整包死代码

  • 文件: internal/container/manager.go209 行NewManager 从未被调用)

P3-6 删除 internal/snapshot/ 整包死代码

  • 文件: internal/snapshot/manager.go196 行import container 但自身也死)

仓库清理

CL-1 go.work 版本不一致

  • 文件: go.work:1
  • 问题: 声明 go 1.19 但 SDK 模块要求 go 1.21
  • 修复: 升级到 go 1.21

CL-2 .gitignore 补充

  • 文件: .gitignore
  • 修复: 添加 data/*.db

CL-3 文档路径修正

  • 文件: docs/ARCHITECTURE.md
  • 问题: L283 sdk/ 条目应指向 internal/sdk/


C1 — 架构清理:删除 output_set_channel

背景: 架构原则要求 LLM 主动调用输出工具进行输出。output_set_channel 作为一个全局隐式状态, 与 output_send 的精确指定模式重叠,且 LLM 可能忘记自己设过该状态导致回复走错通道。

C1-1 删除 output_set_channel 工具定义

  • 文件: internal/agent/core/agent.gobuildToolDefs() 中删除 output_set_channel 的 tool definition block
  • 影响: output_sendoutput_list_channels 保留,它们的 chanDesc 动态生成逻辑不动

C1-2 删除 executeOutputChannelTool 方法

  • 文件: internal/agent/core/agent.go — 删除 executeOutputChannelTool() 函数体

C1-3 删除 output_set_channel 路由分支

  • 文件: internal/agent/core/agent.goexecuteToolCall() 中删除 case tc.Name == "output_set_channel"

C1-4 更新子 Agent 输出工具黑名单

  • 文件: internal/agent/core/agent.go
    • outputTools map 中移除 "output_set_channel"
    • 子工具检查中移除 ct.Name == "output_set_channel"

C1-5 更新注释

  • 文件: internal/agent/core/agent.go:555 — 移除"可能已被 AI 通过 output_set_channel 切换"的注释

C1-6 清理测试文件

  • 文件: internal/agent/core/agent_tools_test.go
    • 删除 TestExecuteOutputChannelToolTestExecuteOutputChannelToolEmpty
    • TestBuildToolDefsOutputToolsAlwaysPresent 中移除 output_set_channel 检查
    • TestGetAllToolsEmpty 最小工具数从 3 改为 2

C1-7 验证编译与测试通过


执行顺序

P0-1 → P0-2 → P2-1 → P2-2 → P2-3 → P2-4 → P3-1~6 → CL-1~3 → C1-1~7