diff --git a/third_party/homeagent-sdk/go.mod b/third_party/homeagent-sdk/go.mod index 9db0ff78..128b4cf7 100644 --- a/third_party/homeagent-sdk/go.mod +++ b/third_party/homeagent-sdk/go.mod @@ -1,3 +1,3 @@ -module github.com/JianFeeeee/homeagentsdk +module github.com/JianFeeeee/hologramagentsdk go 1.21.0 diff --git a/third_party/homeagent-sdk/sdk/lua/sdk.lua b/third_party/homeagent-sdk/sdk/lua/sdk.lua index 6167dc61..8042f463 100644 --- a/third_party/homeagent-sdk/sdk/lua/sdk.lua +++ b/third_party/homeagent-sdk/sdk/lua/sdk.lua @@ -1,5 +1,5 @@ --- HomeAgent Lua Plugin SDK --- Interface contract between Lua plugins and HomeAgent kernel. +-- HologramAgent Lua Plugin SDK +-- Interface contract between Lua plugins and HologramAgent kernel. -- !impl functions are replaced by Go implementations at runtime. -- Standalone/debug: pure Lua mock implementations are used. -- Usage: local sdk = require("sdk") diff --git a/third_party/homeagent-sdk/sdk/plugin.go b/third_party/homeagent-sdk/sdk/plugin.go index 00856178..e2919ef1 100644 --- a/third_party/homeagent-sdk/sdk/plugin.go +++ b/third_party/homeagent-sdk/sdk/plugin.go @@ -3,7 +3,7 @@ package sdk import ( "sync" - "github.com/JianFeeeee/homeagentsdk/meta" + "github.com/JianFeeeee/hologramagentsdk/meta" ) // SDKVersion 是对外暴露的 SDK 版本号。 diff --git a/third_party/homeagent-sdk/sdk/proxy.go b/third_party/homeagent-sdk/sdk/proxy.go index 9372c970..2eb467b9 100644 --- a/third_party/homeagent-sdk/sdk/proxy.go +++ b/third_party/homeagent-sdk/sdk/proxy.go @@ -6,20 +6,20 @@ import ( "strings" ) -// 反向代理声明:插件告诉 HomeAgent「我起了个 HTTP 服务,请把它反代出去」。 +// 反向代理声明:插件告诉 HologramAgent「我起了个 HTTP 服务,请把它反代出去」。 // // 为什么需要:插件自带 Web UI / HTTP API 时,监听地址在插件自己的配置里 // (如 127.0.0.1:12100),外部无从得知;而 webui 的对外端口通常只有一个 // (默认 :8080,且常经 frp 单端口隧道穿透)。没有声明机制时,用户只能 // 「知道端口 + 自己配转发」,插件换端口就失效。 // -// 设计取舍——**声明式而非注册式**:声明写在 plugin.json 里,由 HomeAgent +// 设计取舍——**声明式而非注册式**:声明写在 plugin.json 里,由 HologramAgent // 在加载插件时读取聚合,而不是让插件在运行期调 API 注册。理由: // 1. 静态可发现:未启动/已崩溃的插件,其服务声明依然可见(可给出准确报错 // 「插件 X 声明了 ui 但目标 127.0.0.1:12100 不可达」,而不是静默 404); // 2. 可版本化:声明随插件包一起分发、可 diff、可审计; -// 3. 旧内核无害:manifest 解析忽略未知字段,未支持该能力的 HomeAgent 读旧 -// 插件、或旧 HomeAgent 读新插件都不会报错。 +// 3. 旧内核无害:manifest 解析忽略未知字段,未支持该能力的 HologramAgent 读旧 +// 插件、或旧 HologramAgent 读新插件都不会报错。 // // 与 ToolDef / ChannelDef / ConfigDef 同族:SDK 定义声明契约,内核实现行为。 // 声明方式与其它能力一致 —— 在 Start() 里调 RegisterProxy(name, def), @@ -64,7 +64,7 @@ import ( type ProxyDef struct { // Name 是同一插件内多条声明的唯一标识(如 "ui"、"api")。 // 运行期由 RegisterProxy 的第一个参数填入;声明式由 plugin.json 的 - // name 键填入。省略时由 HomeAgent 兜底为 "service"。 + // name 键填入。省略时由 HologramAgent 兜底为 "service"。 Name string `json:"name,omitempty"` // Host 是**子域名标签**(不含基域名),如 "huawei" 对应 huawei.<基域名>。 // @@ -72,12 +72,12 @@ type ProxyDef struct { // (DNS label 规则)。省略时默认取插件名(下划线转连字符,因为下划线 // 不是合法 DNS label 字符)。 // - // 冲突处理:两个插件声明同一 Host 时,HomeAgent 不做「后者覆盖前者」—— + // 冲突处理:两个插件声明同一 Host 时,HologramAgent 不做「后者覆盖前者」—— // 那样会让先声明者静默消失。冲突条目被拒绝并在反代表里记录原因。 Host string `json:"host,omitempty"` // Target 是上游地址,形如 "127.0.0.1:12100" 或 "http://127.0.0.1:12100"。 - // 可带路径前缀(如 "127.0.0.1:3000/base"),HomeAgent 转发时保留该前缀。 + // 可带路径前缀(如 "127.0.0.1:3000/base"),HologramAgent 转发时保留该前缀。 // // 端口由插件自己填它**实际监听**的地址,避免「声明与实际漂移」。 Target string `json:"target"` @@ -135,7 +135,7 @@ type ProxyDef struct { // // 为什么做成可声明项:设备网关(remotedevice)这类服务的调用方是**设备**, // 它们不可能持有浏览器会话 cookie,而服务自身已有接入令牌(如 ws_token)。 - // 强制走 HomeAgent 门户鉴权会把这类链路挡死;反过来,插件自带的 UI 若 + // 强制走 HologramAgent 门户鉴权会把这类链路挡死;反过来,插件自带的 UI 若 // 声明 none,就等于把管理界面裸露给任何能访问该端口的人。 // 因此必须由插件**逐条**声明,而不是全局一刀切。 Auth string `json:"auth,omitempty"` @@ -198,7 +198,7 @@ func EffectiveProxyAuth(auth string) string { // ValidProxyHostLabel 校验子域名标签是否合法(DNS label 规则)。 // -// 独立成导出函数:插件作者在写声明时、HomeAgent 在加载时、工具链在打包时 +// 独立成导出函数:插件作者在写声明时、HologramAgent 在加载时、工具链在打包时 // 都要用同一套规则判定,避免三处各写一份而互相不一致。 func ValidProxyHostLabel(label string) bool { if label == "" || len(label) > 63 { @@ -246,7 +246,7 @@ func NormalizeProxyHost(pluginName string) string { // ValidateProxyDef 校验一条反代声明,返回人类可读的错误说明(合法时为空)。 // -// 为什么要在 SDK 里做校验:HomeAgent 加载插件时必须能明确拒绝坏声明并说明 +// 为什么要在 SDK 里做校验:HologramAgent 加载插件时必须能明确拒绝坏声明并说明 // 原因(而不是静默忽略导致用户以为配好了);插件作者也需要在本地就能查出 // 拼错的 Target/Host。同一套规则两端共用。 func ValidateProxyDef(d ProxyDef) string { @@ -338,7 +338,7 @@ func (s *PluginSDK) SetProxyRegistrar(r ProxyRegistrar) { s.apiMu.Unlock() } -// RegisterProxy 声明一个需要 HomeAgent 反代出去的服务。 +// RegisterProxy 声明一个需要 HologramAgent 反代出去的服务。 // // 与 RegisterTool / RegisterInputChannel / RegisterOutputChannel 同一风格: // 显式给名字 + 声明体。名字用于展示、日志与冲突提示(不参与路由 —— 路由键是 diff --git a/third_party/homeagent-sdk/sdk/proxy_test.go b/third_party/homeagent-sdk/sdk/proxy_test.go index f86bfe59..db978f60 100644 --- a/third_party/homeagent-sdk/sdk/proxy_test.go +++ b/third_party/homeagent-sdk/sdk/proxy_test.go @@ -6,25 +6,8 @@ import ( "testing" ) -// 存量 plugin.json 里写的是旧值 "homeagent"(本机实测 huawei_smarthome)。 -// 改名后必须**继续接受并归一化**它 —— 否则那些插件在加载时被判为非法声明, -// 反代直接不生效,症状是"插件好好的但页面打不开",且没有任何报错指向改名。 -func TestProxyAuthLegacyValueStillAccepted(t *testing.T) { - if !ValidProxyAuth(ProxyAuthAgentLegacy) { - t.Fatalf("旧值 %q 必须仍被接受", ProxyAuthAgentLegacy) - } - if ProxyAuthAgentLegacy == ProxyAuthAgent { - t.Fatal("旧值应与新值不同,否则本判据测不到东西") - } - // ★ 归一化是最关键的一步:下游一律只可能拿到新值, - // 否则每个判断点都要写两遍比较,漏一处就是鉴权绕过。 - if got := EffectiveProxyAuth(ProxyAuthAgentLegacy); got != ProxyAuthAgent { - t.Fatalf("旧值应归一化为 %q,实际 %q", ProxyAuthAgent, got) - } -} - -func TestProxyAuthDefaultsToHomeAgent(t *testing.T) { - // 空串必须归一化为「HomeAgent 统一保护」——这是安全默认。 +func TestProxyAuthDefaultsToHologramAgent(t *testing.T) { + // 空串必须归一化为「HologramAgent 统一保护」——这是安全默认。 // 若哪天有人把默认改成 none,这条会立刻红。 if got := EffectiveProxyAuth(""); got != ProxyAuthAgent { t.Fatalf("空 auth 应归一化为 %q,实际 %q", ProxyAuthAgent, got) @@ -44,6 +27,27 @@ func TestProxyAuthDefaultsToHomeAgent(t *testing.T) { } } +// 存量 plugin.json 里写的是旧值 "homeagent"(本机实测 huawei_smarthome)。 +// 改名后必须**继续接受并归一化**它 —— 否则那些插件在加载时被判为非法声明, +// 反代直接不生效,症状是"插件好好的但页面打不开",且没有任何报错指向改名。 +func TestProxyAuthLegacyValueStillAccepted(t *testing.T) { + if !ValidProxyAuth(ProxyAuthAgentLegacy) { + t.Fatalf("旧值 %q 必须仍被接受", ProxyAuthAgentLegacy) + } + if ProxyAuthAgentLegacy == ProxyAuthAgent { + t.Fatal("旧值应与新值不同,否则本判据测不到东西") + } + // ★ 归一化是最关键的一步:下游一律只可能拿到新值, + // 否则每个判断点都要写两遍比较,漏一处就是鉴权绕过。 + if got := EffectiveProxyAuth(ProxyAuthAgentLegacy); got != ProxyAuthAgent { + t.Fatalf("旧值应归一化为 %q,实际 %q", ProxyAuthAgent, got) + } + // 存量 plugin.json 的字面量必须能过校验(这是真实数据,不是假设)。 + if !ValidProxyAuth("homeagent") { + t.Fatal(`存量 plugin.json 里的 "auth": "homeagent" 必须仍被接受`) + } +} + func TestValidProxyHostLabel(t *testing.T) { legit := []string{"huawei", "a", "a-b", "abc123", "0", "x" + string(make([]byte, 0)) + "yz"} for _, s := range legit {