Files
HomeAgent/internal/meta/meta.go
JianFeeeee 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

103 lines
5.7 KiB
Go
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.

// Package meta 收集 HomeAgent 内核的全部元数据。
// 版本号通过 `go build -ldflags` 注入,默认值为 dev 版本。
// SDK 仓的 meta/meta.go 应与此保持同步。
package meta
var (
// Version 是 HomeAgent 内核版本号。
// 通过 `-ldflags="-X github.com/JianFeeeee/HomeAgent/internal/meta.Version=vX.Y.Z"` 注入。
//
// 1.0.0:外部插件从 C ABI 动态库迁到子进程 + 共享内存。
// 这是首个不再加载 `.so`/`.dll` 的版本,与 0.9.x 不兼容(存量插件必须
// 用新版 hmapdev 重编),故跃到主版本号。
// 1.1.0:记忆系统支持二进制多媒体节点——CAS 媒体存储 + L0/L2/L3 贯通。
// 1.1.1:多模态贯通**插件边界**。内核实现公开 SDK 1.1.0 新增的媒体接口
// (doc.insertWithMedia、io.injectMedia / injectMediaSync /
// injectInterruptMedia),并把 text/image/audio 三条输入路径归一成
// 一条 processInput 主干。
// 1.2.0:模型中立的多模态 provider SPI(pkg/embedding)——内核不再适配任何
// 具体模型,Qwen 实现移到 providers/qwen3vl;插件运行协议升到 2
// (统一共享内存区,fd3 布局改变,不支持滚动升级);并实现 SDK 1.2.0
// 新增的注入行为标志位(InjectOptions:no_memory / context_policy)
// 与 ChannelDef.ContextPolicy,使输入/排队注入/中断注入/同步注入都能
// 声明「是否记入记忆」与「是否据此裁剪上下文」(默认都是否)。
// 1.3.0:注入优先级贯通(SDK 1.3.0 的 InjectOptions.Priority 与
// PriorityL1-L4)——插件可声明自己中断的级别,内核按四级中断阶梯调度;
// 并实现 UnregisterOutputChannel,使动态通道(远程设备 device/<id>)
// 能随资源生灭,而不是留下死通道骗模型。
//
// ❗main 上此值始终是**下一个未发布中版本**,不随 patch 发布变动
//(见 docs/git-branching.md §2.1);已发布的版本号看对应的 release/vX.Y.x 与 tag。
// ❗1.3.0 已随 release/v1.3.x 发布(承载 v1.3.1–v1.3.6),此号归发布线所有,
// main 立即推进到下一个未发布中版本(docs/git-branching.md §2.1/§七.4)。
Version = "1.4.0"
// Commit 是构建时的 Git commit hash。
Commit = "unknown"
// BuildTime 是构建时间。
BuildTime = "unknown"
// KernelName 是内核名称。
KernelName = "HomeAgent"
// SDKCompatibleVersion 是此内核可兼容的最高 SDK 版本(semver)。
//
// 1.1.0:本内核实现了 SDK 1.1.0 的全部新增方法。
// 1.2.0:本内核实现了 SDK 1.2.0 的全部新增方法(IOInjector 的六个 *Opts
// 注入变体、InjectOptions、ChannelDef.ContextPolicy),因此声明为
// 1.2.0。用 SDK 1.0.0/1.1.0 编的存量插件照旧可用——新增方法由
// **插件调用、内核实现**,不调就不受影响,无需重编。
// 1.3.0:内核实现了 SDK 1.3.0 的全部新增面 —— InjectOptions.Priority 的
// 分级中断调度、PriorityL1-L4 常量的语义,以及 UnregisterOutputChannel
// 在通道登记表 + io 设备表上的注销。同样:不调新面就不受影响。
SDKCompatibleVersion = "1.3.0"
// SourceURL 是本内核构建所对应的源码地址。
//
// AGPL-3.0 §13(Remote Network Interaction)要求:当你把修改过的版本
// 作为网络服务提供出去时,必须给使用者提供取得 Corresponding Source 的机会。
// WebUI 的状态页会把这个值渲染成可见链接,所以:
//
// ❗**修改后对外部署的分支必须把它改指向自己的源码仓库**,否则链接指向的
// 不是你实际运行的那份代码,§13 的提供义务并未履行。
//
// 构建时可用 -ldflags 覆盖,无需改源码:
// -X github.com/JianFeeeee/HomeAgent/internal/meta.SourceURL=<你的仓库>
SourceURL = "https://github.com/JianFeeeee/HomeAgent"
// License 是本项目的开源许可标识(SPDX 表达式)。
//
// AGPL-3.0-only 带**网络条款**:把修改过的版本作为网络服务对外提供时,
// 必须给使用者提供取得 Corresponding Source 的机会(§13)。所以 WebUI
// 总览底部把「许可标识 + 许可全文 + 源码仓库」三者一起渲染成可见的许可卡——
// 只给一个源码链接、不标明协议名,使用者在界面上根本看不出这是什么许可。
License = "AGPL-3.0-only"
// LicenseURL 是上述许可的全文地址。
//
// 默认指向 GNU 官方的 AGPL-3.0 全文页:与仓库托管方、分支名、文件路径都
// 无关,换仓库/换分支都不会失效。若你的发行版把 LICENSE 放在别处,
// 用 -ldflags 覆盖即可:
// -X github.com/JianFeeeee/HomeAgent/internal/meta.LicenseURL=<你的链接>
LicenseURL = "https://www.gnu.org/licenses/agpl-3.0.html"
)
// FullVersion 返回完整的版本字符串。
func FullVersion() string {
return KernelName + " v" + Version + " (" + Commit + ")"
}
// ---- 协议版本 ----
//
// 子进程 RPC 的协议版本是一个独立的小整数,与内核语义版本解耦:
// 语义版本变动频繁(修 bug、加字段),而 wire 协议只在**帧格式或握手语义**
// 变化时才升。当前值见 internal/plugin/proc/protocol.go 的 ProtocolVersion。
//
// C ABI 时代的 ABIVersion / CABINum / 51 个 Core<Method> 整数 ID 已随
// Part 6.2 删除 internal/plugin/cabi/ 一并退场:
// - 整数 method id 平移为 method 名字符串(proc/protocol.go 的 Method* 常量)
// - 版本协商改为握手帧里的 protocol 字段
//
// 保留那些常量只会让人以为它们还在生效。