|
|
4e70b8d5d8
|
refactor(module): 核心仓 Go module 路径改为 github.com/JianFeeeee/HologramAgent
批 1,不含 SDK 仓与目录改名。
- go.mod 第 1 行 module 路径
- 366 个 .go 文件的完整前缀 github.com/JianFeeeee/HomeAgent 机械替换
(857 处,仅完整前缀;展示名/注释里的 HomeAgent 字样留给批 5)
- 未改:third_party 目录名、SDK 自身 go.mod module、go.mod replace 目标、
homed/waiter 可执行名、.hmap 后缀
|
2026-10-21 12:17:19 +08:00 |
|
|
|
6d38a164eb
|
chore(module): Go module 路径随托管地迁移 gitcode → github
## 背景
仓库早已迁移到 GitHub(`github.com/JianFeeeee/HomeAgent`,CI/CD 都在那边跑),
gitcode 保留为**国内只读镜像**(`ci.yml` 的 sync-gitcode-main 快进推送)。
但 go.mod 的 module 路径一直是 `gitcode.com/JianFeeeee/...` —— 既与权威源
不符,`meta.SourceURL`(AGPL §13 的源码提供入口)也指向镜像而非实际运行的代码。
## 关键区分(这是本次改动安全的前提)
两个 module 是**不同**的,影响面差一个数量级:
| module | 谁依赖 | 改它的后果 |
|---|---|---|
| `.../HomeAgent`(主仓) | **只有主仓自己** | 内部重构,零外部影响 |
| `.../homeagent-sdk`(SDK 仓) | 主仓 49 文件 + 所有外部插件 | 需重编插件 |
★ 实测确认:**插件不 import 主仓 module**(`strings qq/plugin.bin | grep HomeAgent` = 0),
只依赖 SDK 仓。而插件与内核的边界是 **RPC 方法名字符串**
(`plugin.init` / `tool.invoke`…,见 proc/protocol.go),**与 Go module 名无关**。
⇒ module 改名**不改变任何 wire 协议**,现网已装的插件照常运行。
SDK 的 GitHub 仓名是 `homeagentsdk`(无连字符),module 路径必须与之精确匹配,
否则 `go get` 会因路径不符失败,故取 `github.com/JianFeeeee/homeagentsdk`。
## 改动
- `go.mod` / `go.sum`:两个 module 路径 + require/replace
- 277 个 Go 文件 + Makefile + 打包脚本的 import 与 ldflags 路径
- SDK 仓 `meta.CoreModule`、`tools/hmapdev` 的 module 声明与工程模板
- 对外文档/链接的仓库地址(README、PLUGIN_DEV、OVERVIEW 等)
## 明确**保留** gitcode 的地方(镜像机制,不能动)
- `GITCODE_TOKEN`、`GC_URL="…@gitcode.com"`(CI 同步 job)
- `gitcode.com/api/v5/...`(release 附件上传)
- git remote `gitcode`(镜像拉取/推送)
- `docs/zh/ci-cd-runbook.md`(整篇讲镜像运维)
## 验证
- `go build ./...` / `go vet ./...` 绿
- `go test ./... -count=1` → 48 包 ok / 0 FAIL
- hmapdev 工具链编译通过(`third_party/homeagent-sdk/tools/hmapdev`)
- 全仓残留检查:module 形态的 `gitcode.com/JianFeeeee` = 0
- 镜像机制抽验:GC_URL / @gitcode / api/v5 / remote 均完好
## 顺带修正
`hmapdev/templates.go` 的注释此前写「gitcode 的模块不在 proxy.golang.org 上」——
module 已迁 GitHub,该论断不再成立。改为如实说明**为何仍默认 replace 到本机 SDK**:
离线可构建、避免版本漂移、内网可用。理由与托管地无关,故 replace 保留。
|
2026-10-08 10:40:17 +08:00 |
|
|
|
208b41a52a
|
fix(plugin): StopAll 并行停插件 —— 修关停必然超时被 SIGKILL
## 现象
systemd 每次都报 `State 'stop-sigterm' timed out. Killing.`
进程组里 23 个子进程插件**全退完了**,最后那条 `[homed] stopped`
仍打不出来,然后被 SIGKILL。
## 根因(算出来的,不是猜的)
单个插件的 Stop 最坏预算:
5s(CallContext plugin.stop)+ 5s(等 exited)+ 2s(Kill 后收割)= 12s
串行停 23 个 ⇒ 23 × 12s = 276s,而 systemd 只给 90s。
⇒ 关停必然超时。线上每一条 stop 记录都是 timed out,无一例外。
## 改法
StopAll 改为并行:取插件快照 + 各自的 SDK 句柄后**立即释放 registry 锁**,
每个插件一个 goroutine,等全部完成再释放共享段。
三处必须小心的点(都是并行化引入的新风险):
1. **先释放 registry 锁再并行停**。p.Stop() 会触发
markExited → onExit → ReclaimOwner,那条链要读共享内存段。
持着锁并行跑,若某插件的 onExit 需要拿 registry 锁(摘通道等)
就是自死锁。
2. **stop handler 的快照要在清空 sdkRefs 之前取**。handler 挂在
PluginSDK 上(r.sdkRefs),先清空就再也拿不到了。
3. **单个插件 panic 不带崩关停**(那会让剩下的插件全停不掉),
也不静默吞(留日志)。
## 判据:5 条 + 3 组变异 + race
- TestStopAllStopsInParallel:8 个插件各 120ms,串行 960ms / 并行 120ms。
判据直接量耗时,串行实现必然变红(实测串行时 962ms)。
- TestStopAllSurvivesPanickingPlugin:panic 不外冒、其它插件照停、不死锁
(带 10s 超时,死锁会超时而不是挂住测试)
- TestStopAllFreezesAutoRestart / StopsEachPluginExactlyOnce:
冻结自动重启、每个插件恰好 Stop 一次(重复会二次释放共享段)
- TestStopAllRunsStopHandlerBeforeStop:handler 必须先于 Stop,
走真实的 PluginSDK.RegisterStopHandler 路径
变异:退回串行 → 判红并打出实测耗时;去掉 handler 调用 → 顺序判红;
假装并行只清空 → 4 条判红。
`-race` 通过(并行化必须验锁,这是本次改动的头号风险)。
全量 41 包绿。
|
2026-09-26 16:23:56 +08:00 |
|