Files
HomeAgent/internal/meta/meta.go
JianFeeeee 37924b295b feat(webui): 总览底部源码区改为独立的「开源许可」框(协议 + 全文 + 源码)
此前总览底部只在 KPI 卡里挂了一行小链接(.ov-foot),既看不出受什么许可
约束,也看不出 AGPL 网络服务场景下的义务。现在单独成一张卡:

  开销许可
    许可协议     AGPL-3.0-only   → GNU 官方全文
    源码仓库     <source_url>    → 仓库
    网络服务条款(§13):把修改后的版本作为网络服务对外提供时,
                        必须向使用者提供取得对应源码的途径。

内核侧(License 是新事实,不能只靠前端写死):
- internal/meta:新增 License(SPDX 标识)与 LicenseURL,都可 -ldflags 覆盖。
  LicenseURL 默认指向 GNU 官方 AGPL-3.0 全文页 —— 与仓库托管方、分支名、
  文件路径都无关,换仓库/换分支不会失效。
- internal/sdk/status.go 的 BuildStatus:新增 License / LicenseURL 两个
  json 字段(additive,旧消费方忽略未知字段即可)。
  注意 internal/sdk 不受公开接口冻结约束(docs/git-branching.md §六),
  本次未触碰 third_party/homeagent-sdk/sdk/。
- internal/agent/core/status.go:从 meta 填充。

前端:
- 骨架里 .ov-foot 换成独立的 <div class="card" id="ov-legal">(放在 KPI 卡之后)。
- 网络条款那一段按许可标识是否含 AGPL 决定是否渲染,不硬写协议名。
- 内容对一次构建是常量,沿用 __html 比对,填一次后不再重建(不引入闪烁)。

验证(现网 1400x920,CDP 实测):
- /api/v1/kernel 的 build 现在带 license="AGPL-3.0-only"、
  license_url="https://www.gnu.org/licenses/agpl-3.0.html"
- 卡片为真框:class=card、border 1px、radius 14px;总览结构 = rt-panel | card | ov-legal
- 两个链接均为真 <a>,target=_blank + rel=noopener noreferrer
- updateOverview() 再跑一次,卡片子节点身份不变(不重建、不闪)
- 回归:KPI 版本副行、阶段管道 5 节点/5 列/6 SVG、队列 5 行×5 格 均正常
- 无横向溢出;总览/侧栏/顶栏渲染文本无 emoji
- go vet 干净;agent/core、plugins/webui、plugins 全量测试通过
2026-09-14 17:48:54 +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 gitcode.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 SPIpkg/embedding——内核不再适配任何
// 具体模型Qwen 实现移到 providers/qwen3vl插件运行协议升到 2
// 统一共享内存区fd3 布局改变,不支持滚动升级);并实现 SDK 1.2.0
// 新增的注入行为标志位InjectOptionsno_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.1v1.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 §13Remote Network Interaction要求当你把修改过的版本
// 作为网络服务提供出去时,必须给使用者提供取得 Corresponding Source 的机会。
// WebUI 的状态页会把这个值渲染成可见链接,所以:
//
// ❗**修改后对外部署的分支必须把它改指向自己的源码仓库**,否则链接指向的
// 不是你实际运行的那份代码§13 的提供义务并未履行。
//
// 构建时可用 -ldflags 覆盖,无需改源码:
// -X gitcode.com/JianFeeeee/HomeAgent/internal/meta.SourceURL=<你的仓库>
SourceURL = "https://gitcode.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 gitcode.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 字段
//
// 保留那些常量只会让人以为它们还在生效。