Files
HomeAgent/.gitignore
JianFeeeee ba281a855a feat(update): 差分 OTA + 安装形态分派 + 事件总线统一受安全监控
三条主线,由 e2e 实测驱动。

## 一、差分 OTA(internal/update/delta.go)

实测:改一行逻辑,88MB 的二进制逐字节只差 80 字节,而 OTA 一直下整包。

用 rsync 族的滚动哈希块匹配(4KB 粒度),不是 bsdiff —— 后者需 17×N
峰值内存(88MB → 1.5GB),而升级恰可能发生在内存紧张时。

真实二进制实测:88,036,728 字节 → 补丁 77,316 字节(0.088%)。

三道闸:应用前验旧文件 sha256(错基线会静默产出垃圾)、应用后验结果
sha256、COPY/LITERAL 越界防护。任何失败**退回整包**,不向上抛 ——
差分是优化,不是可用性前提。

接入:Source.Resolve 优先试 delta;CheckRelease 按 -from-<commit8>.delta
匹配(不猜基线);CLI 新增 -make-delta;打包脚本 build_delta(需
PREVIOUS_HOMED),delta 进 SHA256SUMS。

## 二、安装形态分派(internal/update/install.go + channel.go)

内核对「能不能自己升级」此前只有一个答案:直接替换二进制。而 deb/rpm
形态下那样做会让 dpkg/rpm 数据库与实际内容不一致(下次 apt upgrade
覆盖回旧版,或 dpkg 拒绝后续升级)。

新增探测:deb/rpm/tar/container/source 五类形态 + 变体(full/server/
client/toolchain)+ 目录写权限。判据全部来自可观测系统事实(dpkg 的
info 目录、容器标记文件),不做路径推断。

三端统一走 PlanUpgrade 分派;形态闸门放在**下载 880MB 之前**。

## 三、事件总线统一受安全监控(internal/events + security)

用户指正:「eventbus 上所有事件都要接受安全模块的监控」。

此前 EventPolicy 只被 internal/sdk/events.go 调用,而那是四条路径中的
一条。s.Publish / s.Subscribe / s.EventBus() 拿的是裸 *events.Bus,
任何插件都能绕过策略发任意事件(含伪造内核事件)。

现在闸门在 Bus.Publish/Subscribe 本体上(Guard 接口注入,避免 events
↔ security 成环),四条路径全部覆盖。sdk.EventBus() 改返回带身份的
BusHandle。内核身份免授权,但载荷照样过凭据闸门。

白名单按主体收窄:agent_output/stage/terminal_output 只允许承载者
(webui/cli/agentcli)发布 —— 它们是内核向外的输出面,谁都能发就等于
能伪造 agent 说的话。

## e2e 暴露并修掉的三个真实回归

	[bus] subscribe denied: pluginmgr type=update_request
	[bus] subscribe denied: skillmgr type=skill_detected

前两个让升级请求静默丢失、职责链交接断掉。内部协作事件必须可订阅
(安全边界在发布侧,订阅只是「听得到」)。

## 顺带的止血修复

- 回滚判据从 `--version` 改为 digest:旧内核(1.3.x 及以前)没有该
  flag,而它恰是最常见的回滚目标 —— 原逻辑让「从旧版升级失败」永久
  无法回滚。
- CopyFile 补 fsync(替换 homed 本体时掉电会留半截文件)。
- restore 完整还原才清 marker(原先先清再还原,还原失败就失去第二次
  自愈机会)。
- 回滚时移除升级中新增的 depgraph(否则「旧 homed + 新 depgraph」
  会因 digest 不匹配崩溃循环)。
- homed-upgrade 不再硬编码 systemctl restart(丢 guard 状态、unit 名
  漂移);改用内核已有的 restartCh → exit 42 语义。
- homed-upgrade 不再用 CGO_ENABLED=0 编却依赖 go-sqlite3(stub 下
  静默失效,该路径从未工作过);改用 internal/config。
- 服务单元补 User=hologramagent + 三条安装路径补建用户(此前发行物里
  完全没有落实降权)。
- rpm 的 fpm 调用补 --after-install(此前 rpm 装完根本不建用户)。

## 判据

新增 30 条:差分 8(往返/压缩比/错基线/截断/篡改/边界)、通道 8、
执行器 6、事件闸门 8、按主体授权 8。全仓 go test ./... 0 失败。
2026-10-29 09:54:55 +08:00

137 lines
4.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/homed
/waiter
*.exe
*.log
*.test
build/
*.so
*.db
data/
.tmp-plugins/
.go/
.local/
*.hmap
dev/
login.json
# GUI
cmd/gui/node_modules/
cmd/gui/dist/
.gopath/
# SDK 工具链 — 核心仓不追踪
#
# 外部插件与工具链维护在独立 SDK 仓(决策 sdk_repo_only),
# 本仓经 go.mod 的 replace => ./third_party/homeagent-sdk 引用。
# example/ 下已跟踪的 21 个文件(10 个示例的 plg.json + plugin.go,
# 加 qq/plugin_test.go)早于本规则,
# 靠「已跟踪文件不受 .gitignore 影响」保留——这是有意的,不要「修」。
third_party/homeagent-sdk/bin/
third_party/homeagent-sdk/tools/
third_party/homeagent-sdk/package/
third_party/homeagent-sdk/scripts/
# skills/ 是 SDK 仓的 skill 源(hmapdev skill install 的来源),
# 与 tools/、docs/ 同理属 SDK 仓自治范围,不进本仓。
third_party/homeagent-sdk/skills/
# .github/ 同理:SDK 仓的 workflow 由 SDK 仓自己管(它在那边被跟踪),
# 本仓不参与构建,不需要在这边重复一份。
third_party/homeagent-sdk/.github/
third_party/homeagent-sdk/.gitignore
third_party/homeagent-sdk/README*
third_party/homeagent-sdk/example/
# 文档站(mkdocs.yml + docs/ + 生成器)属于 SDK 仓,与 README* / tools/ 同理。
# 注意 docs/ 带前导路径限定,够精确:本仓自己的 docs/ 不受影响。
third_party/homeagent-sdk/docs/
third_party/homeagent-sdk/mkdocs.yml
third_party/homeagent-sdk/site_build/
# 主题覆盖目录(只覆盖 footer.html,补备案号)——同属文档站。
third_party/homeagent-sdk/overrides/
.codegraph/
# codegraph 本地索引配置(含嵌套 SDK 仓放行,仅本地生效)
codegraph.json
# 运行时产物(不提交)
#
# ⚠️ 这些必须带前导斜杠。不带斜杠的模式(如 `memory/`)会匹配**任意层级**的
# 同名目录,把 internal/memory/、internal/knowledge/、deploy/scripts/ 一起吞掉
# ——24 + 3 + 1 个已跟踪源码文件曾因此落在 ignore 规则下,只靠「已跟踪
# 文件不受 .gitignore 影响」这条 git 规则兜着,新增文件会默默不入库。
/adapters/
/knowledge/
/memory/
# 注:/scripts/ **不**忽略。它是作者维护的工具目录(模型导出、侧车、部署校验),
# 不是运行期产物:deploy/systemd/embed-sidecar.service 直接引用
# scripts/embed_sidecar.py,忽略它会让那份 unit 在别人的机器上指向不存在的文件。
# 只忽略其中的缓存。
/scripts/__pycache__/
__pycache__/
terminal_locked_log.txt
dist/
.pi-glla/
.omo/
.pi/
# HarmonyOS 构建工具链缓存(HVIGOR_USER_HOME / ohpm 生成,非源码)
.hvigor-home/
.npm-cache/
.ohpm/
# 漂移巡检的运行时状态(含时间戳与指纹,每次跑都变)
.drift-watch/
# ——— 本地运维脚本 / 一次性工具(不入库,克隆后需另行获取)———
# deploy-*.sh 是生产部署入口,含环境相关的 IP/路径约定;
# 文档见 docs/zh/deploy-runbook.md。换机器部署前先确认脚本来源。
/deploy-plan.sh
/deploy-waiter.sh
/deploy-sdk-site.sh
# 一次性跑分/设计提取脚本,用完即弃
/tmp_jinabench.py
/napcat-design-dna.json
# 已删除的动态工作文档(2e30e06)。曾被本机某进程恢复过一次 ——
# 它的 mtime 还是删除前的 Sep 26,说明是外部写回而不是 git 操作。
# 不加这行的话,恢复一次就重新入库一次。
/plan.md
# 临时探针目录(scripts/ 之外的临时 main.go 探针)
/tools/zz_*/
# 编译产物(迁移工具)
/homed-graph-migrate
# 构建产物落在仓库根(go build ./cmd/xxx 时最易发生)
/homed
/homed-graph-migrate
/homed-graph-distill
/homed-centroid
# ── 本机运维脚本(含 /home/newqqagent 等本机路径与凭据搬运逻辑,不进仓库)──
/deploy/scripts/deploy.sh
/scripts/verify_deploy.sh
/scripts/kernel-stress/
/scripts/gui-package-smoke.sh
# ── 本地 AI 工具的仓库级配置(每人偏好不同,不进仓库)──
.pi-lens.json
# agent 会话附件(本地产物,不进版本库)
.pi-web/
# ── 内置 pi 的会话日志(agent 工作产物,不进仓库)──
/.pi-sessions/
# ── 本地 NLP 模型权重(48MB ONNX,本机推理用,不进仓库)──
# 有意不提交:二进制大文件会永久留在 git 历史里,且需与本机 nlp 加载路径配套。
# 需要时由部署脚本/人工放置到该目录。
/nlp/
# 内核升级 CLI 的本地构建产物(与 /homed 同理,不入库)
/homed-upgrade