mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-09-21 01:18:02 +00:00
## 1. 注入标志位(公开 API 纯追加,无签名变更)
给注入行为补上工具早已有的两类声明位,并让通道定义也带上:
- `InjectOptions{NoMemory, ContextPolicy, CleanerName}`
- `IOInjector` 新增六个 `*Opts` 变体(排队/中断/同步 × 纯文本/带媒体)
- `ChannelDef.ContextPolicy`,并**补上 JSON tag**(Cleaner 标 `json:"-"`)
零值 InjectOptions 与旧的三参数方法完全等价(记入记忆 + 不裁剪),
存量插件不需要改一行、也不需要重编;旧方法保留为转发到零值 opts 的语法糖。
三条设计要点:
- **默认不裁剪**:裁剪会归档丢弃低相关事件,必须显式声明(ContextPolicy=prune)。
- **中断也允许声明 prune**(已确认):中断同样携带内容进上下文。
- `CleanerName`:注入的 source 未必是注册过的输入通道名,而注入内容常带
ANSI/JSON 包装;允许显式指定用哪个已注册 cleaner 清洗。
顺带修掉一个易静默丢字段的坑:`ChannelDef` 原来没有 JSON tag,只能手写字段
白名单跨进程传(`{"NoMemory": ...}`),新增字段会被丢掉。现在模板整体传 `def`。
## 2. 示例调用点统一写明意图
rss/memo/calendar/qq 的中断注入显式 `NoMemory: true`(行为等价,写清语义)。
## 3. plugindev 出错却 exit 0(真缺陷)
`buildBundle`/`buildTarget` 遇错只 Printf 后 return,`cmdBuild` 返回 void,
于是**构建失败也退 0**。实测中一个示例的 windows 目标编译失败,批量脚本却报
「17/17 全绿」,并因此少产出 16 个 .hmap。现在累计 `buildFailed` 并以非零退出。
## 4. 平台策略:插件目标去掉 windows
homed 已放弃 Windows 原生(见核心仓 cmd/homed/platform_windows.go:插件体系依赖
fd 继承 + 统一共享内存区的段内偏移解引用,Windows 句柄模型无法表达),
插件只运行在 homed 能跑的平台上,故 `allBundleTargets` 去掉 windows,
并对 windows 目标给出**可执行的报错**(指引 WSL2),而不是让它死在一句
`undefined: attachUnifiedShm` 上。
## 5. 发版附带各示例插件的 .hmap
新增 `package/build-examples.sh` 并接入 `package/build.sh`(组件 all|plugindev|examples):
- 用**刚构建出来的**那把工具链构建示例,保证与本次发版同源
- 逐平台 `--no-bundle --target <os/arch>`(bundle 会连 windows 一起编)
- 判成功同时看**退出码 + 产物存在**
- 全部产物齐了才 `sha256sum`(边打边算会漏掉后生成的包)
- 有任一失败即整体失败,不生成 SHA256SUMS
## 6. 版本
SDK 仍为 1.2.0(main 是下一个未发布中版本);1.2.0 条目补记本次新增接口,
并注明新标志位需核心 1.2.0+(旧核心会忽略这些字段,不报错但不生效)。
87 lines
2.8 KiB
Bash
Executable File
87 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||
BUILD_DIR="${PROJECT_ROOT}/build"
|
||
VERSION="${VERSION:-$(git -C "$PROJECT_ROOT" describe --tags --dirty 2>/dev/null || echo "0.7.1")}"
|
||
GO="${GO:-$(command -v go 2>/dev/null || echo "/home/jianf/go1.26.5/go/bin/go")}"
|
||
GOCACHE="${GOCACHE:-}"
|
||
GOPATH="${GOPATH:-}"
|
||
|
||
TARGET="${1:-native}"
|
||
COMPONENT="${2:-all}"
|
||
|
||
case "$TARGET" in
|
||
native) GOOS="" GOARCH="" ;;
|
||
linux/amd64) GOOS=linux GOARCH=amd64 ;;
|
||
linux/arm64) GOOS=linux GOARCH=arm64 ;;
|
||
darwin/amd64) GOOS=darwin GOARCH=amd64 ;;
|
||
darwin/arm64) GOOS=darwin GOARCH=arm64 ;;
|
||
windows/amd64) GOOS=windows GOARCH=amd64 ;;
|
||
all)
|
||
"$0" linux/amd64 "$COMPONENT"
|
||
"$0" linux/arm64 "$COMPONENT"
|
||
"$0" darwin/amd64 "$COMPONENT"
|
||
"$0" darwin/arm64 "$COMPONENT"
|
||
"$0" windows/amd64 "$COMPONENT"
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo "Unknown target: $TARGET"
|
||
echo "Usage: $0 [native|linux/amd64|linux/arm64|darwin/amd64|darwin/arm64|windows/amd64|all] [all|plugindev|examples]"
|
||
exit 1
|
||
esac
|
||
|
||
if [ -n "${GOOS:-}" ]; then
|
||
SUFFIX="${GOOS}_${GOARCH}"
|
||
export GOOS GOARCH
|
||
fi
|
||
export CGO_ENABLED=0
|
||
[ -n "$GOCACHE" ] && export GOCACHE
|
||
[ -n "$GOPATH" ] && export GOPATH
|
||
|
||
mkdir -p "$BUILD_DIR"
|
||
|
||
build_plugindev() {
|
||
local src="tools/plugindev"
|
||
local out="$BUILD_DIR/plugindev${SUFFIX:+_$SUFFIX}"
|
||
if [ "$GOOS" = "windows" ]; then out="${out}.exe"; fi
|
||
|
||
echo "[BUILD] plugindev ${GOOS:-linux}/${GOARCH:-amd64} → $out"
|
||
cd "$PROJECT_ROOT/$src"
|
||
"$GO" build -trimpath -ldflags "-X gitcode.com/JianFeeeee/homeagent-sdk/meta.Version=${VERSION}" \
|
||
-o "$out" .
|
||
echo " OK ($(du -h "$out" | cut -f1))"
|
||
cd "$PROJECT_ROOT"
|
||
}
|
||
|
||
# 示例插件产物随 SDK 一起发。
|
||
#
|
||
# 为什么必须发:插件二进制与内核是**协议绑定**的(ProtocolVersion + 统一共享
|
||
# 内存区魔数)。SDK 升版常伴随协议变化,只发工具链不发示例产物,使用者很可能
|
||
# 拿旧产物去装,表现是握手失败(魔数不匹配)——看起来像「插件坏了」而不是
|
||
# 「版本不配套」。
|
||
#
|
||
# 用刚构建出来的那把工具链(而非 PATH 里的),保证产物与本次发版同源。
|
||
build_examples() {
|
||
local dev="$BUILD_DIR/plugindev${SUFFIX:+_$SUFFIX}"
|
||
[ "$GOOS" = "windows" ] && dev="${dev}.exe"
|
||
echo "[BUILD] example plugins ${GOOS:-linux}/${GOARCH:-amd64} → $BUILD_DIR/examples"
|
||
PLUGINDEV="$dev" VERSION="$VERSION" bash "$PROJECT_ROOT/package/build-examples.sh" "$TARGET" "$BUILD_DIR/examples"
|
||
echo " OK"
|
||
}
|
||
|
||
case "$COMPONENT" in
|
||
all)
|
||
# 工具链必须先建完:示例用它来构建(同源保证协议一致)。
|
||
build_plugindev
|
||
build_examples
|
||
;;
|
||
plugindev) build_plugindev ;;
|
||
examples) build_examples ;;
|
||
*)
|
||
echo "Unknown component: $COMPONENT"
|
||
exit 1
|
||
;;
|
||
esac
|