mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-09-21 01:18:02 +00:00
feat(lua): Lua SDK 全量对齐 1.3.0 + hmapdev 单一 mock 源/版本标记/语法预检
内核侧 Lua 桥此前停在 v0.8.0 时代能力面,而 1.1/1.2/1.3 新增的 媒体、注入标志位、中断优先级、事件订阅、动态通道注销只在 Go 侧存在, 文档却宣称『能力完全对齐』——属于静默漂移。 本仓(事实源): - 新增 sdk/lua/sdk.lua:Lua mock 的单一事实源,补齐全部新 API (*_opts / inject_input_sync / inject_*_media / set_tool_blocks / unregister_output_channel / events / plugin_mgr / insert_with_media / sentence_text+media_digests / attachments / context_policy)。 - scripts/sync-lua-sdk.sh:把事实源同步到 hmapdev assets、luademo、 以及被 vendored 时的内核副本;三份 sdk.lua 不再各自漂移。 - hmapdev init --lua:优先从激活 SDK 拷权威 mock,内嵌模板降级为 assets/sdk.lua 回退,不再内联手写副本。 - hmapdev build(Lua):plugin.json 写入 SDK 版本(能力可追溯), 打包前用 luac -p / lua loadfile 做语法预检,失败以非零码退出。 - hmapdev debug --lua:优先用激活 SDK 的权威 mock(HMAPDEV_SDK_LUA)。 - luademo 升级为全能力示例(新增 luademo_probe_v2)。
This commit is contained in:
@ -164,7 +164,13 @@ func cmdInit(args []string) {
|
||||
// Detect SDK info for Go plugin go.mod.
|
||||
// 生成的 go.mod 除 require 外还写一条指向本机 SDK 的 replace:
|
||||
// 否则 scaffold 出来的项目第一次 build 必定失败(详见 SDKLocalPath 注释)。
|
||||
if !isLua {
|
||||
if isLua {
|
||||
// Lua 插件也要记录它按哪版 SDK 语义编写:Lua `sdk.*` 是公开契约,
|
||||
// 与内核能力版本挂钩;不写版本就只能靠“调用时才发现是 nil”。
|
||||
if root := tryActiveSDKRoot(); root != "" {
|
||||
data.Plg.SDK = normalizeSDKVersion(readMetaVersion(root))
|
||||
}
|
||||
} else {
|
||||
sdkMod, goVer, sdkRoot, sdkVer := detectSDKInfo()
|
||||
data.ModulePath = name
|
||||
data.GoVersion = goVer
|
||||
@ -187,7 +193,14 @@ func cmdInit(args []string) {
|
||||
// Lua plugins get main.lua + sdk.lua; Go plugins get plugin.go only
|
||||
if isLua {
|
||||
writeTemplate(filepath.Join(dir, "main.lua"), tmplMainLua, data)
|
||||
writeTemplate(filepath.Join(dir, "sdk.lua"), tmplSDKLua, data)
|
||||
// sdk.lua 是给 `lua main.lua` 离线测试用的 mock,单一事实源在 SDK 仓的
|
||||
// sdk/lua/sdk.lua;优先从当前激活的 SDK 拷,拷不到才回退内嵌模板。
|
||||
if !copyCanonicalLuaSDK(dir) {
|
||||
if err := os.WriteFile(filepath.Join(dir, "sdk.lua"), []byte(fallbackLuaSDK), 0644); err != nil {
|
||||
fmt.Printf("error: write sdk.lua: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
writeTemplate(filepath.Join(dir, "plugin.go"), tmplPluginGo, data)
|
||||
}
|
||||
@ -210,6 +223,43 @@ func cmdInit(args []string) {
|
||||
fmt.Printf(" cd %s && hmapdev build\n", dir)
|
||||
}
|
||||
|
||||
// activeSDKRoot 返回当前激活 SDK 的根目录,未安装/未激活则报错退出。
|
||||
//
|
||||
// 与 activeSDKRoot(fatal 版)区别:这里只探测,不退出。
|
||||
// Lua 插件的 mock 是“锦上添花”,没装 SDK 不应该阻断 init。
|
||||
func tryActiveSDKRoot() string {
|
||||
store := sdkStore()
|
||||
current := resolveCurrentVersion(store)
|
||||
if current == "" {
|
||||
return ""
|
||||
}
|
||||
root := sdkVersionDir(current)
|
||||
if _, err := os.Stat(root); err != nil {
|
||||
return ""
|
||||
}
|
||||
return root
|
||||
}
|
||||
|
||||
// copyCanonicalLuaSDK 把激活 SDK 的 sdk/lua/sdk.lua 拷进新项目。
|
||||
// 三份 sdk.lua(内核内嵌 / 工具链模板 / 项目副本)各自漂移是本工具链的历史债,
|
||||
// 单一事实源在 SDK 仓,工具链只负责搬运。返回是否成功。
|
||||
func copyCanonicalLuaSDK(dir string) bool {
|
||||
root := tryActiveSDKRoot()
|
||||
if root == "" {
|
||||
return false
|
||||
}
|
||||
src := filepath.Join(root, "sdk", "lua", "sdk.lua")
|
||||
data, err := os.ReadFile(src)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(dir, "sdk.lua"), data, 0644); err != nil {
|
||||
return false
|
||||
}
|
||||
fmt.Printf(" sdk.lua <- %s\n", src)
|
||||
return true
|
||||
}
|
||||
|
||||
// detectSDKInfo reads the HomeAgent SDK's go.mod and meta to get module path, go version, and SDK version.
|
||||
func detectSDKInfo() (modulePath, goVersion, sdkPath, sdkVersion string) {
|
||||
root := activeSDKRoot()
|
||||
|
||||
Reference in New Issue
Block a user