mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-15 12:15:16 +00:00
## 背景 仓库早已迁移到 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 保留。
112 lines
3.8 KiB
Go
112 lines
3.8 KiB
Go
// Package sdk —— 反代声明的内核侧登记表。
|
||
//
|
||
// 契约定义在公开 SDK(pubsdk.ProxyDef)。本文件只做两件事:
|
||
//
|
||
// 1. 把公开类型重新导出,让内核侧调用方只需 import 本包。
|
||
// 2. 维护**内置插件**的声明表(它们没有 plugin.json,扫目录发现不了)。
|
||
//
|
||
// 外部插件的声明由反代层直接读 plugin.json 得到,不经过这里 —— 那份声明
|
||
// 是静态的、插件没启动也可见,而内置插件的声明只能运行期拿到。两种来源在
|
||
// 反代层合并(见 webui.buildProxyTable)。
|
||
package sdk
|
||
|
||
import (
|
||
"strings"
|
||
"sync"
|
||
|
||
pubsdk "github.com/JianFeeeee/homeagentsdk/sdk"
|
||
)
|
||
|
||
// ProxyDef 是一条反代声明(见 pubsdk.ProxyDef 的完整文档,含「单一入口原则」)。
|
||
// 与 ConfigDef / ChannelDef / ToolDef 同族:SDK 定契约,内核实现行为。
|
||
type ProxyDef = pubsdk.ProxyDef
|
||
|
||
// 鉴权与 Host 规范化的常量/函数转发(调用方不必两处 import)。
|
||
const (
|
||
ProxyAuthHomeAgent = pubsdk.ProxyAuthHomeAgent
|
||
ProxyAuthNone = pubsdk.ProxyAuthNone
|
||
)
|
||
|
||
// ValidateProxyDef 校验一条声明,返回人类可读的错误(合法时为空)。
|
||
func ValidateProxyDef(d ProxyDef) string { return pubsdk.ValidateProxyDef(d) }
|
||
|
||
// EffectiveProxyAuth 返回生效的鉴权模式(空串按默认 homeagent 处理)。
|
||
func EffectiveProxyAuth(auth string) string { return pubsdk.EffectiveProxyAuth(auth) }
|
||
|
||
// ValidProxyAuth 判断鉴权取值是否合法。
|
||
func ValidProxyAuth(auth string) bool { return pubsdk.ValidProxyAuth(auth) }
|
||
|
||
// NormalizeProxyHost 由插件名推导默认的 Host 标签。
|
||
func NormalizeProxyHost(plugin string) string { return pubsdk.NormalizeProxyHost(plugin) }
|
||
|
||
// ValidProxyHostLabel 校验子域名标签是否合法(DNS label 规则)。
|
||
func ValidProxyHostLabel(label string) bool { return pubsdk.ValidProxyHostLabel(label) }
|
||
|
||
// 内置插件(编译进内核、无 plugin.json)的反代声明表。
|
||
//
|
||
// 版本号 builtinProxyVer 每次变更自增。反代层据此判断缓存的路由表是否过期 ——
|
||
// 比每次请求都重新聚合一遍便宜得多。
|
||
var (
|
||
builtinProxyMu sync.RWMutex
|
||
builtinProxyVer int64
|
||
builtinProxyDefs = map[string][]ProxyDef{}
|
||
)
|
||
|
||
// RegisterBuiltinProxy 登记一个内置插件的服务声明(由 RegisterProxy 转发)。
|
||
//
|
||
// ProxyDef.Name 由调用方保证非空(RegisterProxy 会在缺失时兜底为 "service")。
|
||
func RegisterBuiltinProxy(plugin, name string, d ProxyDef) {
|
||
if plugin == "" || strings.TrimSpace(d.Target) == "" {
|
||
return
|
||
}
|
||
if d.Name == "" {
|
||
d.Name = name
|
||
}
|
||
if d.Name == "" {
|
||
d.Name = "service"
|
||
}
|
||
builtinProxyMu.Lock()
|
||
defer builtinProxyMu.Unlock()
|
||
// 同名重复登记(如自动重启后再次 Start)视为刷新,不重复累积。
|
||
list := builtinProxyDefs[plugin]
|
||
for i := range list {
|
||
if list[i].Name == d.Name {
|
||
list[i] = d
|
||
builtinProxyVer++
|
||
return
|
||
}
|
||
}
|
||
builtinProxyDefs[plugin] = append(list, d)
|
||
builtinProxyVer++
|
||
}
|
||
|
||
// ClearBuiltinProxyDefs 清除某插件的声明(插件停止/卸载时调用)。
|
||
func ClearBuiltinProxyDefs(plugin string) {
|
||
builtinProxyMu.Lock()
|
||
defer builtinProxyMu.Unlock()
|
||
if _, ok := builtinProxyDefs[plugin]; ok {
|
||
delete(builtinProxyDefs, plugin)
|
||
builtinProxyVer++
|
||
}
|
||
}
|
||
|
||
// BuiltinProxyDefs 返回内置声明的快照(plugin → defs)。
|
||
func BuiltinProxyDefs() map[string][]ProxyDef {
|
||
builtinProxyMu.RLock()
|
||
defer builtinProxyMu.RUnlock()
|
||
out := make(map[string][]ProxyDef, len(builtinProxyDefs))
|
||
for k, v := range builtinProxyDefs {
|
||
cp := make([]ProxyDef, len(v))
|
||
copy(cp, v)
|
||
out[k] = cp
|
||
}
|
||
return out
|
||
}
|
||
|
||
// BuiltinProxyVersion 是声明表的版本号,供反代层判断缓存是否过期。
|
||
func BuiltinProxyVersion() int64 {
|
||
builtinProxyMu.RLock()
|
||
defer builtinProxyMu.RUnlock()
|
||
return builtinProxyVer
|
||
}
|