mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-05 16:57:32 +00:00
feat(security): 插件按工具声明内容策略 + 目录名统一
## 一、插件声明层(用户裁定)
> 「敏感词策略也应该是插件声明啊,每个插件声明自己轮次以及自己工具的
> 敏感词策略」
SecurityProfile 新增两个字段:
ToolSensitiveWords map[string][]string // key=工具名模式(尾 *),value=词表
DetectInjection bool // 开启内核内置注入迹象识别
语义是**追加不覆盖**:整轮 SensitiveWords 仍然生效。
取宽不取窄的理由:当前处置是 B 档(标记+警示,不阻断),
多标一条只是多一句警示,漏标则是安全缺口。
## 二、修掉我自己造的「莲藕式分层」
前一版把 *security.Round 从 runInputTask 一路搬到工具链
(prepareInputTask(evt, round) → TaskFrame.SecRound →
executeToolCallOutcomeWithRound),并在 rtchild 里另补一条。
那是把**分层策略实现成跨层传参**:每多一条工具执行路径就要求调用方
多传一次句柄。profileActivator 的设计注释早就写明了正路:
> 工具调用发生在 LLM 决定之后,此时插件已不在调用栈上。
> 唯一可靠的传递方式是**内核在输入进来时记住**,在该轮的工具判定里使用。
改为 security 自取:
Runtime.ScanContentForAgent(agentID, isChild, ins, text)
→ ForAgent(agentID, isChild) // per-agent 视图,天然不串档
→ EffectiveProfile() // session > longtime
→ 合并 全局词表 + 档位词表 + 工具词表 + DetectInjection
core 只递交**事实**(我是谁 / 哪个工具 / 什么文本),不认识 Round。
与 CheckToolForAgent 同一套身份推断,不引入第二个入口语义。
TaskFrame.SecRound / executeToolCallOutcomeWithRound 全部撤除。
## 三、目录名统一
third_party/homeagent-sdk → third_party/hologramagentsdk
module 与远端仓早已是 hologramagentsdk,只剩物理目录是遗留名。
同步改了 go.mod replace、构建/打包/部署脚本、5 处测试里的分段路径。
注意:这里改的是**主仓 vendored 的 SDK 源码路径**,example/ 由 SDK
独立仓自己跟踪,主仓不涉及。
## 判据
TestToolSensitiveWordsAppendOnlyForThatTool 词表只对目标工具生效 + 追加语义
TestToolSensitiveWordsUseAgentScope security 按 agent scope 自取生效
(变异验证:删掉 ForAgent 查询 → 红)
## 验证
go build ./... → 0
go vet ./... → 0
go test ./... -count=1 -race → 62 ok / 0 FAIL / 0 DATA RACE
gofmt -l internal/ → 干净
This commit is contained in:
28
.gitignore
vendored
28
.gitignore
vendored
@ -25,30 +25,30 @@ cmd/gui/dist/
|
||||
# SDK 工具链 — 核心仓不追踪
|
||||
#
|
||||
# 外部插件与工具链维护在独立 SDK 仓(决策 sdk_repo_only),
|
||||
# 本仓经 go.mod 的 replace => ./third_party/homeagent-sdk 引用。
|
||||
# 本仓经 go.mod 的 replace => ./third_party/hologramagentsdk 引用。
|
||||
# example/ 下已跟踪的 21 个文件(10 个示例的 plg.json + plugin.go,
|
||||
# 加 qq/plugin_test.go)早于本规则,
|
||||
# 靠「已跟踪文件不受 .gitignore 影响」保留——这是有意的,不要「修」。
|
||||
third_party/homeagent-sdk/bin/
|
||||
third_party/homeagent-sdk/tools/
|
||||
third_party/homeagent-sdk/package/
|
||||
third_party/homeagent-sdk/scripts/
|
||||
third_party/hologramagentsdk/bin/
|
||||
third_party/hologramagentsdk/tools/
|
||||
third_party/hologramagentsdk/package/
|
||||
third_party/hologramagentsdk/scripts/
|
||||
# skills/ 是 SDK 仓的 skill 源(hmapdev skill install 的来源),
|
||||
# 与 tools/、docs/ 同理属 SDK 仓自治范围,不进本仓。
|
||||
third_party/homeagent-sdk/skills/
|
||||
third_party/hologramagentsdk/skills/
|
||||
# .github/ 同理:SDK 仓的 workflow 由 SDK 仓自己管(它在那边被跟踪),
|
||||
# 本仓不参与构建,不需要在这边重复一份。
|
||||
third_party/homeagent-sdk/.github/
|
||||
third_party/homeagent-sdk/.gitignore
|
||||
third_party/homeagent-sdk/README*
|
||||
third_party/homeagent-sdk/example/
|
||||
third_party/hologramagentsdk/.github/
|
||||
third_party/hologramagentsdk/.gitignore
|
||||
third_party/hologramagentsdk/README*
|
||||
third_party/hologramagentsdk/example/
|
||||
# 文档站(mkdocs.yml + docs/ + 生成器)属于 SDK 仓,与 README* / tools/ 同理。
|
||||
# 注意 docs/ 带前导路径限定,够精确:本仓自己的 docs/ 不受影响。
|
||||
third_party/homeagent-sdk/docs/
|
||||
third_party/homeagent-sdk/mkdocs.yml
|
||||
third_party/homeagent-sdk/site_build/
|
||||
third_party/hologramagentsdk/docs/
|
||||
third_party/hologramagentsdk/mkdocs.yml
|
||||
third_party/hologramagentsdk/site_build/
|
||||
# 主题覆盖目录(只覆盖 footer.html,补备案号)——同属文档站。
|
||||
third_party/homeagent-sdk/overrides/
|
||||
third_party/hologramagentsdk/overrides/
|
||||
.codegraph/
|
||||
|
||||
# codegraph 本地索引配置(含嵌套 SDK 仓放行,仅本地生效)
|
||||
|
||||
@ -494,7 +494,7 @@ Lua 脚本插件加载:`internal/plugin/` → gopher-lua 解释器执行 `main
|
||||
|
||||
**只有必须使用内部 SDK 能力(公开 SDK 没有的接口面)的插件,才留在编译期内置清单。**
|
||||
|
||||
内部 SDK(`internal/sdk`)比公开 SDK(third_party/homeagent-sdk)多出一批
|
||||
内部 SDK(`internal/sdk`)比公开 SDK(third_party/hologramagentsdk)多出一批
|
||||
**不对外授予**的能力面:`TrackerAPI` / `StatusAPI` /
|
||||
`SupervisorAPI` / `AdapterAPI` / `SelftestAPI` / `ToolAPI`,以及 **`Publish`
|
||||
(事件发布)**。外部插件走 proc 桥的收窄能力集,这些接口在类型层就不存在
|
||||
|
||||
@ -553,7 +553,7 @@ hmapdev sdk list # 本机已装的所有 SDK 版本
|
||||
```
|
||||
|
||||
- 核心仓 `/home/program/TrueAgent`(Go module `github.com/JianFeeeee/HologramAgent`)
|
||||
- **SDK 仓** `third_party/homeagent-sdk`(独立 git 仓、独立版本号)
|
||||
- **SDK 仓** `third_party/hologramagentsdk`(独立 git 仓、独立版本号)
|
||||
|
||||
### 33. 开工流程
|
||||
|
||||
@ -846,10 +846,10 @@ pi 进程、sidecar、ssh 会话、workdir(含凭据残留检查)一个不
|
||||
|
||||
| 内容 | 路径 |
|
||||
|---|---|
|
||||
| SDK 源码 | `third_party/homeagent-sdk/sdk/` |
|
||||
| **可运行的示例插件** | `third_party/homeagent-sdk/example/`(a2a / acp / qq / plugindev…) |
|
||||
| 能力边界 | `third_party/homeagent-sdk/docs/guide/capability-boundary.md` |
|
||||
| 并发声明 | `third_party/homeagent-sdk/docs/guide/parallel-tool-declaration.md` |
|
||||
| SDK 源码 | `third_party/hologramagentsdk/sdk/` |
|
||||
| **可运行的示例插件** | `third_party/hologramagentsdk/example/`(a2a / acp / qq / plugindev…) |
|
||||
| 能力边界 | `third_party/hologramagentsdk/docs/guide/capability-boundary.md` |
|
||||
| 并发声明 | `third_party/hologramagentsdk/docs/guide/parallel-tool-declaration.md` |
|
||||
| 部署手册 | `docs/zh/deploy-runbook.md` |
|
||||
| sidecar 参考实现 | `internal/plugins/clawhubadapter/sidecar.go` |
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
*
|
||||
* ============================ 接口冻结声明 ============================
|
||||
* 本头文件是对外契约。函数签名、语义、返回值一经发布即为冻结接口,
|
||||
* 修改必须走大版本流程(与 third_party/homeagent-sdk 同一冻结标准)。
|
||||
* 修改必须走大版本流程(与 third_party/hologramagentsdk 同一冻结标准)。
|
||||
*
|
||||
* 设计约束(见 docs/zh/c-core/llm-orchestration-c.md §四):
|
||||
* 1. 只吃 const char* + **显式长度**,出数值/字节偏移 —— 不回调 Go、
|
||||
|
||||
@ -93,11 +93,11 @@ echo "Arch: $ARCH"
|
||||
echo ""
|
||||
|
||||
# ---- prepare go.mod for Linux build: point SDK replace at the in-repo SDK ----
|
||||
# SDK 仓库(含工具链/示例)以嵌套 git 仓库形式维护在 third_party/homeagent-sdk,
|
||||
# SDK 仓库(含工具链/示例)以嵌套 git 仓库形式维护在 third_party/hologramagentsdk,
|
||||
# 打包直接用该目录,不再 clone 到 /tmp。
|
||||
prepare_gomod() {
|
||||
local gomod="$PROJECT_ROOT/go.mod"
|
||||
local sdk_local="$PROJECT_ROOT/third_party/homeagent-sdk"
|
||||
local sdk_local="$PROJECT_ROOT/third_party/hologramagentsdk"
|
||||
local sdk_clone="/tmp/homeagent-sdk"
|
||||
local patched=0
|
||||
|
||||
@ -442,7 +442,7 @@ stage_variant() {
|
||||
if [ -z "$hv" ]; then
|
||||
# 退而求其次:从 SDK 源码现编一个(CGO 无关,快)
|
||||
echo " [hmapdev] build/ 下没有 hmapdev,尝试现编..."
|
||||
( cd "$PROJECT_ROOT/third_party/homeagent-sdk/tools/hmapdev" && \
|
||||
( cd "$PROJECT_ROOT/third_party/hologramagentsdk/tools/hmapdev" && \
|
||||
CGO_ENABLED=0 go build -trimpath -o "$BUILD_DIR/hmapdev" . ) || {
|
||||
echo "ERROR: 无法获得 hmapdev(插件工具链),拒绝打包。" >&2
|
||||
return 1; }
|
||||
@ -459,7 +459,7 @@ stage_variant() {
|
||||
# 「装完即可离线构建插件」,且版本与内核严格同源(防版本漂移)。
|
||||
stage_sdk() {
|
||||
local staging="$1"
|
||||
local sdk_src="$PROJECT_ROOT/third_party/homeagent-sdk"
|
||||
local sdk_src="$PROJECT_ROOT/third_party/hologramagentsdk"
|
||||
local sdk_dst="$staging/usr/lib/hologram/sdk"
|
||||
[ -d "$sdk_src" ] || { echo "ERROR: 找不到 SDK 源码 $sdk_src" >&2; return 1; }
|
||||
mkdir -p "$sdk_dst"
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SDK_DIR=${REPO}/third_party/homeagent-sdk
|
||||
SDK_DIR=${REPO}/third_party/hologramagentsdk
|
||||
BUILD_DIR="$SDK_DIR/site_build"
|
||||
HOST=192.168.2.106
|
||||
SSH="ssh -n -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=no admin@$HOST"
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
|
||||
|
||||
> 生效:2026-08-31,2026-09-04 修订(三级发布通道 + 单条发布分支),2026-09-06 修订(SDK 仓版本语义与发版联动,见 §七),2026-09-13 修订(发布线路牌随 patch 推进 + 版本号不得固化落库)。
|
||||
> 适用:**本仓(HologramAgent)与 third_party/homeagent-sdk(SDK 仓)**——两仓协作时分支策略必须一致,本规范两仓同用。
|
||||
> 适用:**本仓(HologramAgent)与 third_party/hologramagentsdk(SDK 仓)**——两仓协作时分支策略必须一致,本规范两仓同用。
|
||||
> 核心原则一句话:**main 唯一长命、永远可部署;一切新工作在特性分支;一个中版本一条发布分支,alpha/beta/正式由 tag 区分;hotfix 只进发布分支并 cherry-pick 回 main。**
|
||||
|
||||
---
|
||||
@ -50,7 +50,7 @@ main ──────────────── E ────────
|
||||
- **main 的 `internal/meta.Version` 始终是下一个未发布版本**,不随 patch 发布变动。
|
||||
- 合入门禁(**单人直推也遵守**,不强制 PR 但强制验证):
|
||||
- `make test` 全绿
|
||||
- 涉及插件/工具链时:接口冻结检查 `git diff third_party/homeagent-sdk/sdk/` 为空
|
||||
- 涉及插件/工具链时:接口冻结检查 `git diff third_party/hologramagentsdk/sdk/` 为空
|
||||
- `go vet ./...` 无新增告警
|
||||
|
||||
### 2. `feature/xxx`(新特性/修复)
|
||||
@ -265,7 +265,7 @@ git switch main && git cherry-pick <sha> # 遵守 §三:只 pick,不 merge
|
||||
6. 健康检查:版本号、插件清单无缺失、`/api/v1/status`、一次真实对话、`fatal error` 计数为 0
|
||||
- **改造期间现网不得部署 main 或 feature 的中间态**——只有发版才用发布分支的 tag。
|
||||
- alpha/beta tag 的产物**不上现网**(现网是 24/7 服务,预发布通道的存在就是为了不拿它冒险)。
|
||||
- 涉及 SDK 仓时:主仓 `go.mod` 的 `replace => ./third_party/homeagent-sdk` 指向本地 vendored 副本,
|
||||
- 涉及 SDK 仓时:主仓 `go.mod` 的 `replace => ./third_party/hologramagentsdk` 指向本地 vendored 副本,
|
||||
发版前确认 vendored SDK 与 SDK 仓 release tag 一致(**两仓中版本对齐是第一优先级**,见 §七)。
|
||||
- **客户端版本必须与内核同步**(GUI / 鸿蒙 / waiter 同一个号,当前皆为 `internal/meta.Version`):
|
||||
内核版本是唯一事实源,客户端不得各写一个。拉齐用 `make sync-client-versions`,
|
||||
@ -308,14 +308,14 @@ git checkout feature/xxx && git cherry-pick <main 上那个 pick 的 sha>
|
||||
|
||||
# 公开 SDK 接口改动(feature,不是 hotfix):先进 main,再 pick 到发布分支
|
||||
git checkout -b feature/sdk-xxx main
|
||||
# ... 改 third_party/homeagent-sdk/sdk/ 与内核桥接层 ...
|
||||
# ... 改 third_party/hologramagentsdk/sdk/ 与内核桥接层 ...
|
||||
git checkout main && git merge --no-ff feature/sdk-xxx
|
||||
git checkout release/v1.1.x
|
||||
git cherry-pick <feature 的各 sha> # 只挑改动,不挑 main 的版本号
|
||||
git commit -am "chore(release): bump v1.1.1" # 发布分支自己的版本号
|
||||
git tag -a v1.1.1 -m "..."
|
||||
# SDK 仓同步(仅在核心打正式 tag 时,见 §七.2/§七.3)
|
||||
cd third_party/homeagent-sdk
|
||||
cd third_party/hologramagentsdk
|
||||
git checkout -b release/v1.1.x main
|
||||
git commit -am "chore(release): SDK 1.1.0(1.1.x 线全程共用)"
|
||||
git tag -a v1.1.0 -m "..."
|
||||
@ -329,14 +329,14 @@ git branch -d release/v1.0.x # tag 已保存历史,
|
||||
## 六、本规范与「接口冻结」约束的关系
|
||||
|
||||
> **接口冻结已到期(v1.1.x 起)**。冻结是**迁移期**的约束——它要保的是
|
||||
> 「换运行模型不动业务代码」,靠 `git diff third_party/homeagent-sdk/sdk/` 为空来守。
|
||||
> 「换运行模型不动业务代码」,靠 `git diff third_party/hologramagentsdk/sdk/` 为空来守。
|
||||
> 迁移完成(v1.0.0 上生产)后该约束按时失效,取而代之的是 §八的三条演进规则。
|
||||
> 本节保留历史条款,但**不再作为合回门禁**。
|
||||
|
||||
- ~~feature 分支合回 main 的门禁(`git diff third_party/homeagent-sdk/sdk/` 为空)~~
|
||||
- ~~feature 分支合回 main 的门禁(`git diff third_party/hologramagentsdk/sdk/` 为空)~~
|
||||
—— **已失效**。现改为:公开接口的改动必须满足 §八(只增不减、签名不改、模板接线)。
|
||||
- `internal/sdk` **不受冻结约束**,可自由扩展(此条仍成立);
|
||||
公开 SDK 接口指 `third_party/homeagent-sdk/sdk/`。
|
||||
公开 SDK 接口指 `third_party/hologramagentsdk/sdk/`。
|
||||
- **公开接口的改动本身是 feature,不是发布准备**:它必须走 `feature/xxx` → 合回 main 的路径,
|
||||
再 cherry-pick 到发布分支。不允许把接口新增当成"发布分支上的 bug 修复"直接提交进 release
|
||||
——发布分支冻结功能(§2.3),接口是最典型的功能面。
|
||||
@ -367,7 +367,7 @@ git branch -d release/v1.0.x # tag 已保存历史,
|
||||
插件开发者会照着一个还会变的接口写代码——**那是无效开发**。接口没定就没有可依赖的契约,
|
||||
发出去的版本号是一个假承诺。
|
||||
- 这条约束的对象是 **SDK 仓的发版动作**,不是核心二进制里有没有 SDK 代码。
|
||||
主仓 `go.mod` 用 `replace => ./third_party/homeagent-sdk`,任何核心构建都必然含 vendored
|
||||
主仓 `go.mod` 用 `replace => ./third_party/hologramagentsdk`,任何核心构建都必然含 vendored
|
||||
SDK 源码,这是构建机制决定的,不在本条约束范围内。
|
||||
|
||||
### 3. 正式发布时 SDK 随核心一起发
|
||||
@ -474,7 +474,7 @@ GITCODE_REPO=JianFeeeee/hologramagentsdk ASSET_DIR=<sdk>/dist/release \
|
||||
|
||||
> 本节原在《外部插件接口不变矩阵》(迁移期临时文档,已随迁移完成删除)§九。
|
||||
> 那份文档记的是**迁移期**的约束("换运行模型不动业务代码",靠
|
||||
> `git diff third_party/homeagent-sdk/sdk/` 为空来守)。迁移完成后该约束**到期**——
|
||||
> `git diff third_party/hologramagentsdk/sdk/` 为空来守)。迁移完成后该约束**到期**——
|
||||
> 继续冻结等于让 SDK 永远停在迁移那天的能力面,多模态这类功能永远到不了插件手上。
|
||||
> 取代它的是下面三条更弱、但仍然硬的规则。
|
||||
|
||||
|
||||
@ -38,7 +38,7 @@ go env: CC=gcc CGO_ENABLED=1 GOOS=linux GOARCH=amd64
|
||||
|
||||
### 2.2 已有纯 C 先例,可直接复用
|
||||
|
||||
`third_party/homeagent-sdk/remotedevice/` 是一个**零外部依赖**的纯 C 库
|
||||
`third_party/hologramagentsdk/remotedevice/` 是一个**零外部依赖**的纯 C 库
|
||||
(1320 行),已含可复用组件:
|
||||
|
||||
| 文件 | 行数 | 能力 |
|
||||
@ -270,7 +270,7 @@ C 化的正确性**不能靠「跑起来没崩」**,必须有可复现的对
|
||||
| 打包脚本 | ✅ 不再需带 `.a`(编源码,无外部产物依赖)| 扩张到多文件 C 实现时重评 |
|
||||
|
||||
**仍未决(需 jianf 拍板)**:
|
||||
1. C 实现放**主仓 `csrc/`** 还是 **SDK `third_party/homeagent-sdk/`**?
|
||||
1. C 实现放**主仓 `csrc/`** 还是 **SDK `third_party/hologramagentsdk/`**?
|
||||
- 当前已在主仓 `csrc/`;若 SDK 侧也要复用,需定同步机制
|
||||
- 放 SDK:天然跨端复用,但要走 SDK 冻结与大版本流程
|
||||
2. `ha_json.c` 是**复用**(从 remotedevice 复制/提为公共)还是**新写**?
|
||||
|
||||
@ -251,7 +251,7 @@ ASSET_DIR=<产物目录> GITCODE_REPO=JianFeeeee/HologramAgent \
|
||||
# release 条目必须先存在(脚本向 releases/<tag>/upload_url 取 OBS 签名 URL)
|
||||
```
|
||||
|
||||
## 4. SDK 仓(third_party/homeagent-sdk)
|
||||
## 4. SDK 仓(third_party/hologramagentsdk)
|
||||
|
||||
与主仓同构,差异:
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
> - **[风险]** = 已知会让整套机制失效的点
|
||||
>
|
||||
> 撰写时间:2026-10-13。事实基线:TrueAgent `/home/program/TrueAgent`,
|
||||
> 生产实例 `/home/newqqagent`,SDK 仓 `third_party/homeagent-sdk`。
|
||||
> 生产实例 `/home/newqqagent`,SDK 仓 `third_party/hologramagentsdk`。
|
||||
|
||||
---
|
||||
|
||||
@ -873,7 +873,7 @@ pi -p --session-dir /tmp/sd-store --session-id sd-01 "…"
|
||||
ls /root/.pi/agent/sessions/ | grep -i sd-test # 期望无结果
|
||||
|
||||
# §1.3 可接入面
|
||||
grep -n "func (s \*PluginSDK) RegisterInputChannel" third_party/homeagent-sdk/sdk/plugin.go
|
||||
grep -n "func (s \*PluginSDK) RegisterInputChannel" third_party/hologramagentsdk/sdk/plugin.go
|
||||
grep -rn "resident_agents" internal/plugin/proc/ # 期望无结果 ⇒ 插件调不到
|
||||
|
||||
# §2.4 L4 归属
|
||||
|
||||
@ -124,7 +124,7 @@
|
||||
|
||||
| 事实 | 证据/位置 |
|
||||
|---|---|
|
||||
| 已有 `plugindev` 示例插件,含 `plugindev_status/init/build/sdk/projects` | `third_party/homeagent-sdk/example/plugindev/` |
|
||||
| 已有 `plugindev` 示例插件,含 `plugindev_status/init/build/sdk/projects` | `third_party/hologramagentsdk/example/plugindev/` |
|
||||
| 插件数据目录 API | `sdk.Settings().DataDir()`(`internal/sdk/settings_impl.go:24`) |
|
||||
| `hmapdev` 工具链已装 | `/usr/local/bin/hmapdev` |
|
||||
| SDK 无 HTTP/exec 能力面,但插件是编译型 Go,可自行 `os/exec` | `internal/sdk/plugin.go` 方法清单 |
|
||||
@ -895,7 +895,7 @@ cd /tmp/probe-a && pi -p --provider <可用provider> --model <可用model> \
|
||||
|
||||
# §3.4 a2a/acp 无 cwd
|
||||
grep -n "agent_url\|query\|session_id" \
|
||||
/home/program/TrueAgent/third_party/homeagent-sdk/example/a2a/plugin.go
|
||||
/home/program/TrueAgent/third_party/hologramagentsdk/example/a2a/plugin.go
|
||||
grep -n "cwd" /root/.pi/agent/extensions/pi-acp/index.ts # 期望无结果
|
||||
|
||||
# §3.5 端口归属
|
||||
@ -1039,7 +1039,7 @@ grep -n "phase,omitempty" cmd/waiter/state.go # 判据匹配的是
|
||||
复现命令:
|
||||
|
||||
```bash
|
||||
cd third_party/homeagent-sdk/example/commondev
|
||||
cd third_party/hologramagentsdk/example/commondev
|
||||
K=$(sqlite3 /home/newqqagent/config.db "select value from config where key='core.llm.api_key';")
|
||||
HA_E2E_LLM=1 HA_E2E_API_KEY="$K" HA_E2E_REAL_DB=/home/newqqagent/config.db \
|
||||
go test -count=1 ./...
|
||||
|
||||
@ -404,7 +404,7 @@ stage handler 入口自动加锁 + 锁不可重入所致,**插件侧问题**
|
||||
|
||||
| 站 | 本地源 | 线上位置 | 构建 |
|
||||
| --- | --- | --- | --- |
|
||||
| SDK 文档站 | `third_party/homeagent-sdk/site_build/` | `/vol1/docker/navi-data/sites/sdk` | 需 `tools/apidoc/build.sh`(§5.3 坑①) |
|
||||
| SDK 文档站 | `third_party/hologramagentsdk/site_build/` | `/vol1/docker/navi-data/sites/sdk` | 需 `tools/apidoc/build.sh`(§5.3 坑①) |
|
||||
| introduce | `site/`(排除 `README.md`) | `/vol1/docker/navi-data/sites/introduce` | 零构建,源即产物 |
|
||||
|
||||
两站部署在**同一台** 106 的同一 `sites/` 目录下。
|
||||
@ -465,7 +465,7 @@ find grep sed sort tr wc head tail stat file
|
||||
改完 SDK 文档的完整流程:
|
||||
|
||||
```bash
|
||||
cd third_party/homeagent-sdk
|
||||
cd third_party/hologramagentsdk
|
||||
# 1) 在 docs/guide/ 写文档
|
||||
# 2) 在 mkdocs.yml 的 nav 里登记 ← 漏了这步站点里找不到
|
||||
# 3) 重新生成(含 docs/api/* 与 llms.txt 同步)
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
> 分支:`feature/input-semantics`
|
||||
> 状态:**设计稿 v1**(待确认项见 §12,未确认处按 §12 的「默认取值」推进)
|
||||
> 影响面:`internal/agent/core`、`internal/agent/io`、`internal/sdk`(**仅内部**)
|
||||
> 公开 SDK:**v1 不改**(`third_party/homeagent-sdk/sdk/` diff 必须保持为 0,理由见 §13)
|
||||
> 公开 SDK:**v1 不改**(`third_party/hologramagentsdk/sdk/` diff 必须保持为 0,理由见 §13)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -661,7 +661,7 @@ loadOne(name):
|
||||
#### 2.6.7.5 SDK 兼容性:一个必须记住的**例外**
|
||||
|
||||
本轮给公开 SDK 的 `PluginMgrAPI` 新增 3 个方法。按 SDK 的版本纪律
|
||||
(`third_party/homeagent-sdk/docs/versions.md`),"插件调用、内核实现"的
|
||||
(`third_party/hologramagentsdk/docs/versions.md`),"插件调用、内核实现"的
|
||||
新增属**纯追加** ⇒ 存量插件不需要改、也不需要重编。
|
||||
|
||||
**但这次有一个例外,必须记住**:
|
||||
|
||||
@ -142,7 +142,7 @@ PluginContext(独立身份,共享管道)。
|
||||
|
||||
**证据**:
|
||||
- `internal/plugin/proc/plugin.go:134`(`Spawn`,逐插件起进程)
|
||||
- manifest 无 `worker_group` 键(`third_party/homeagent-sdk/example/a2a/plugin.json`
|
||||
- manifest 无 `worker_group` 键(`third_party/hologramagentsdk/example/a2a/plugin.json`
|
||||
的键集合为 `author/description/entry/name/name_en/name_zh/platforms/tags/version`)
|
||||
|
||||
**子任务**:
|
||||
@ -196,7 +196,7 @@ PluginContext(独立身份,共享管道)。
|
||||
**证据**:
|
||||
- `internal/plugin/proc/capability.go:149-150`(subscribe/unsubscribe 已授权)
|
||||
- `internal/plugin/proc/corehandler.go:46-58`(`EvtRingSubscriber` 接口)
|
||||
- `third_party/homeagent-sdk/example/` 下 21 个 example 中无事件订阅样例
|
||||
- `third_party/hologramagentsdk/example/` 下 21 个 example 中无事件订阅样例
|
||||
|
||||
**子任务**:
|
||||
1. 写一个订阅 `stage` / `tool_call` 事件的 example 插件,跑真实负载
|
||||
@ -503,7 +503,7 @@ SDK 的 `remotedevice/src/ha_json.c`(368 行)经实测有**三个对协议
|
||||
1. **C 实现放哪里 → 留在主仓 `csrc/`。** 用户澄清:C 实现本来就是**替换**内核的
|
||||
Go 实现(`csrc/` 是唯一权威源,Go 侧符号链接 + cgo 绑定,`codec_pure.go`
|
||||
已降级为黄金对照的规格基准)。SDK 从头到尾**未被触碰**
|
||||
(`git diff main -- third_party/homeagent-sdk/sdk/` = 0 行)。
|
||||
(`git diff main -- third_party/hologramagentsdk/sdk/` = 0 行)。
|
||||
所谓「进 SDK」只对**跨端复用**(鸿蒙/嵌入式/C SDK 也想调同一份实现)才有意义,
|
||||
而它们并不调用内核编解码层 ⇒ 该问题**关闭**,不作为待办。
|
||||
2. **`ha_json.c` 复用还是新写 → 新写。** 见上(三个致命缺陷 + 架构正交)。
|
||||
@ -515,7 +515,7 @@ SDK 的 `remotedevice/src/ha_json.c`(368 行)经实测有**三个对协议
|
||||
`docs/zh/c-core/llm-orchestration-c.md`)。基础设施门禁已建成(见上)。
|
||||
下阶段扩大前,**三处需 jianf 拍板**(建议已附,见上):
|
||||
|
||||
1. **C 实现放主仓 `csrc/` 还是 SDK `third_party/homeagent-sdk/`?**
|
||||
1. **C 实现放主仓 `csrc/` 还是 SDK `third_party/hologramagentsdk/`?**
|
||||
- 当前已在主仓 `csrc/`(`ha_codec.{c,h}` 是权威源,Go 侧符号链接过去)
|
||||
- 若 SDK / 鸿蒙 / C SDK 侧也要复用,需定同步机制;搬进 SDK 则要走 SDK 冻结流程
|
||||
2. **`ha_json.c` 复用还是新写?**(复用会动 SDK 目录结构)
|
||||
|
||||
@ -772,7 +772,7 @@ if ret, err := parent.ExecuteTool(name, args); err == nil {
|
||||
且注释明写"main 上此值始终是**下一个未发布中版本**";
|
||||
- 仓内**无 `release/v1.4.x` 分支**,最新 tag 是 `v1.3.12`
|
||||
⇒ 1.4.0 这一中版本**尚未发布**,正是承接本次改动的那个版本;
|
||||
- SDK `meta.Version` 同为 `1.4.0`(`third_party/homeagent-sdk/meta/meta.go`),
|
||||
- SDK `meta.Version` 同为 `1.4.0`(`third_party/hologramagentsdk/meta/meta.go`),
|
||||
两仓中版本已对齐 ⇒ **本次无需再次对齐动作**。
|
||||
|
||||
⇒ 动作只是把 `SDKCompatibleVersion`(`internal/meta/meta.go:54`)从 `1.3.0`
|
||||
|
||||
2
go.mod
2
go.mod
@ -51,4 +51,4 @@ require (
|
||||
// (报 `used for two different module paths`)。所以主仓**所有** import 都已
|
||||
// 统一改为新名,旧的 homeagentsdk 路径不再保留。
|
||||
|
||||
replace github.com/JianFeeeee/hologramagentsdk => ./third_party/homeagent-sdk
|
||||
replace github.com/JianFeeeee/hologramagentsdk => ./third_party/hologramagentsdk
|
||||
|
||||
@ -1 +0,0 @@
|
||||
../../../csrc/include/ha_codec.h
|
||||
97
internal/agent/api/ha_codec.h
Normal file
97
internal/agent/api/ha_codec.h
Normal file
@ -0,0 +1,97 @@
|
||||
#ifndef HA_CODEC_H
|
||||
#define HA_CODEC_H
|
||||
|
||||
/*
|
||||
* ha_codec — HomeAgent 内核编解码层(C 实现)
|
||||
*
|
||||
* ============================ 接口冻结声明 ============================
|
||||
* 本头文件是对外契约。函数签名、语义、返回值一经发布即为冻结接口,
|
||||
* 修改必须走大版本流程(与 third_party/hologramagentsdk 同一冻结标准)。
|
||||
*
|
||||
* 设计约束(见 docs/zh/c-core/llm-orchestration-c.md §四):
|
||||
* 1. 只吃 const char* + **显式长度**,出数值/字节偏移 —— 不回调 Go、
|
||||
* 不传 Go 指针、不要求 NUL 结尾
|
||||
* 2. **不 malloc**:不需要出参缓冲区,需要「结果」时返回字节偏移/长度,
|
||||
* 由调用方在自己的缓冲上切片(零拷贝)
|
||||
* 3. 无状态、纯函数、线程安全(不写全局可变状态)
|
||||
*
|
||||
* 当前覆盖:L1 协议编解码层中的纯计算部分(第一个最小切片)。
|
||||
*
|
||||
* ============================ 为什么签名带长度 ============================
|
||||
* 初版签名用 `const char*` 隐含「NUL 结尾」,于是每次调用都要:
|
||||
* Go `C.CString` 分配+拷贝一遍 → C `strlen` 再扫一遍。
|
||||
* 实测这部分开销占单次调用的 80% 以上(cgo 边界本身仅 ~30ns,
|
||||
* 而初版 ModelContextWindow 实测 175ns)。
|
||||
* 改为「指针 + 长度」后,Go 侧用 unsafe.StringData 直接传底层数组,
|
||||
* 零分配零拷贝。这是设计约束第 1 条的字面要求。
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "ha_abi.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ==================== ABI 自述(供 Go 侧与日志核对) ==================== */
|
||||
|
||||
/* 返回 HA_CODEC_ABI_VERSION(major*1000 + minor)。
|
||||
*
|
||||
* 存在的意义:Go 侧不该靠 `#include` 宏做版本断言(cgo 头文件里的宏在
|
||||
* 预处理后不可见),而要**运行期/测试期**能问 C 侧「你自称什么版本」。
|
||||
* 由 codec_cgo.go 绑定、codec_abiversion_test.go 与 C 侧宏三方比对。 */
|
||||
int ha_codec_abi_version(void);
|
||||
|
||||
/* ==================== 模型上下文窗口推断 ==================== */
|
||||
|
||||
/* 无法从模型名推断时的哨兵值(与 Go 侧一致)。
|
||||
*
|
||||
* 为什么返回哨兵而不是直接给兜底值:调用方需要区分「真推断出了」与
|
||||
* 「推断不出、只能兜底」——后者要打一行日志(窗口被低估必须可见),
|
||||
* 并提示部署方用 per-source context_window 显式声明。
|
||||
* 若 C 侧直接返回兜底值,调用方就永远分不清这两种情况。 */
|
||||
#define HA_CODEC_CONTEXT_WINDOW_UNKNOWN (-1)
|
||||
|
||||
/* 由模型名推断最大上下文窗口(token 数);推断不出返回
|
||||
* HA_CODEC_CONTEXT_WINDOW_UNKNOWN。
|
||||
*
|
||||
* model 为 UTF-8 字节序列,**不需要 NUL 结尾**;model_len 是字节数。
|
||||
* model 为 NULL 或 model_len 为 0 时返回 UNKNOWN。
|
||||
*
|
||||
* 匹配大小写不敏感(仅对 ASCII 字母做折叠;非 ASCII 字节按原样比较,
|
||||
* 与 Go 侧对模型名的实际输入一致)。
|
||||
*
|
||||
* 语义必须与 Go 侧 modelContextWindowPure 逐值一致(黄金对照测试钉死)。 */
|
||||
int ha_codec_model_context_window(const char *model, size_t model_len);
|
||||
|
||||
/* ==================== token 估算与截断 ==================== */
|
||||
|
||||
/* 粗略估算 token 数。
|
||||
*
|
||||
* 规则(与 Go 侧 EstimateTokens 一致):保守取 max(1, runeCount * 2)。
|
||||
* 按 UTF-8 **字符数**(rune)计,不是字节数。
|
||||
* text 为 NULL 或 text_len 为 0 返回 0。
|
||||
*
|
||||
* 非法 UTF-8 序列按 Go 的 utf8 解码语义处理(每字节一个 rune),
|
||||
* 保证与 Go 侧逐值一致。 */
|
||||
int ha_codec_estimate_tokens(const char *text, size_t text_len);
|
||||
|
||||
/* 按 token 预算计算「应保留的字节数」。
|
||||
*
|
||||
* ★ 返回的是**字节数**而非字符串:截断结果必然是输入的前缀,
|
||||
* 调用方直接在自己的缓冲上切片即可(零拷贝、无出参缓冲区、无 malloc)。
|
||||
*
|
||||
* 语义与 Go 侧 TruncateByTokens 一致:从开头保留 maxTokens/2 个 rune;
|
||||
* 未超预算时返回 text_len(即整串)。
|
||||
* max_tokens <= 0 或 text 为 NULL/text_len 为 0 时返回 0。
|
||||
*
|
||||
* 返回值保证 <= text_len。 */
|
||||
size_t ha_codec_truncate_by_tokens(const char *text, size_t text_len,
|
||||
int max_tokens);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* HA_CODEC_H */
|
||||
@ -7,7 +7,7 @@ package all
|
||||
// 设施名同时存在于**两处**,且必须逐字一致:
|
||||
//
|
||||
// 内核:internal/kernelmod/facilities.go (模块 Provides 用)
|
||||
// SDK:third_party/homeagent-sdk/sdk/facilities.go (插件声明用)
|
||||
// SDK:third_party/hologramagentsdk/sdk/facilities.go (插件声明用)
|
||||
//
|
||||
// 它们**不能合并**:SDK 是独立发布的模块(外部插件依赖它),
|
||||
// 而内核的 internal 规则又禁止内部包被外部 import。
|
||||
@ -67,7 +67,7 @@ func extractFacilities(t *testing.T, path string) map[string]string {
|
||||
func TestFacilityNamesMatchPublicSDK(t *testing.T) {
|
||||
kernel := extractFacilities(t, filepath.Join("..", "facilities.go"))
|
||||
sdk := extractFacilities(t, filepath.Join("..", "..", "..",
|
||||
"third_party", "homeagent-sdk", "sdk", "facilities.go"))
|
||||
"third_party", "hologramagentsdk", "sdk", "facilities.go"))
|
||||
|
||||
kernelVals := map[string]string{} // 值 → 内核常量名
|
||||
for name, v := range kernel {
|
||||
|
||||
@ -23,7 +23,7 @@ import (
|
||||
// 工作树里可能因为 vendoring 或本地试验而临时存在,那不算回归。
|
||||
|
||||
// vendoredSDKRoot 是 vendored SDK 在主仓里的位置。
|
||||
const vendoredSDKRoot = "third_party/homeagent-sdk"
|
||||
const vendoredSDKRoot = "third_party/hologramagentsdk"
|
||||
|
||||
// repoRoot 返回主仓根目录(本测试包在 internal/meta/,往上是两层)。
|
||||
func repoRoot(t *testing.T) string {
|
||||
@ -85,7 +85,7 @@ func TestVendoredSDKKeepsRequiredPackages(t *testing.T) {
|
||||
"meta", // 版本号:主仓与 SDK 版本一致性检查
|
||||
"meta/meta.go",
|
||||
// ★ 不列 tools/hmapdev/yaegi:.gitignore 第 33 行忽略了
|
||||
// third_party/homeagent-sdk/tools/,它从来没被跟踪过。
|
||||
// third_party/hologramagentsdk/tools/,它从来没被跟踪过。
|
||||
// 而 grep 到的 yaegi 引用是 **SDK 仓自己的文件**在互相 import
|
||||
// (tools/hmapdev/yaegi/interp.go → .../mocksdk),不是主仓依赖。
|
||||
// 我第一版把它当主仓依赖写进来,判据直接假红。
|
||||
|
||||
@ -23,7 +23,7 @@ package plugin
|
||||
// ## 来源
|
||||
//
|
||||
// 源码树里约定 `<插件源码目录>/skill/<skillName>/SKILL.md`(与 SDK 示例
|
||||
// third_party/homeagent-sdk/example/editdoc/skill/office-tools 一致)。
|
||||
// third_party/hologramagentsdk/example/editdoc/skill/office-tools 一致)。
|
||||
// 但内置插件是**编译期内置**,运行时没有源码树,所以 SKILL 正文必须
|
||||
// 编进二进制(见各插件包里的 embed),由插件通过 SkillProvider 暴露。
|
||||
//
|
||||
|
||||
@ -17,15 +17,15 @@ import (
|
||||
// 三份 sdk.lua(内核内嵌 / 工具链模板 / 项目副本)历史上各自漂移过,
|
||||
// 表现为「mock 里有的 API,内核运行时是 nil」这类静默失配。
|
||||
// 事实源是 SDK 仓的 sdk/lua/sdk.lua,内核副本由
|
||||
// third_party/homeagent-sdk/scripts/sync-lua-sdk.sh 同步。
|
||||
// third_party/hologramagentsdk/scripts/sync-lua-sdk.sh 同步。
|
||||
func TestLuaSDKMockSingleSource(t *testing.T) {
|
||||
canonical, err := os.ReadFile(filepath.Join("..", "..", "third_party", "homeagent-sdk", "sdk", "lua", "sdk.lua"))
|
||||
canonical, err := os.ReadFile(filepath.Join("..", "..", "third_party", "hologramagentsdk", "sdk", "lua", "sdk.lua"))
|
||||
if err != nil {
|
||||
t.Skipf("SDK repo canonical sdk.lua not available: %v", err)
|
||||
}
|
||||
if string(canonical) != luaSDK.SDKSource {
|
||||
t.Fatal("内核内嵌 sdk.lua 与 SDK 仓 sdk/lua/sdk.lua 不一致;" +
|
||||
"请跑 third_party/homeagent-sdk/scripts/sync-lua-sdk.sh")
|
||||
"请跑 third_party/hologramagentsdk/scripts/sync-lua-sdk.sh")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -62,7 +62,7 @@ func publishedPluginMgrMethods(t *testing.T, sdkPath string) []string {
|
||||
// 这挡住了"SDK 加了方法但忘记登记能力" ⇒ 那种方法会被按 CapCore 放行,
|
||||
// 或者直接"未知 method"。
|
||||
func TestBridgeCoversEveryPublishedPluginMgrMethod(t *testing.T) {
|
||||
sdkPath := filepath.Join("..", "..", "..", "third_party", "homeagent-sdk", "sdk", "plugin.go")
|
||||
sdkPath := filepath.Join("..", "..", "..", "third_party", "hologramagentsdk", "sdk", "plugin.go")
|
||||
methods := publishedPluginMgrMethods(t, sdkPath)
|
||||
|
||||
// SDK 方法名 → proc method 值(命名约定:StopPlugin → plugin.mgrStop)
|
||||
@ -160,16 +160,16 @@ func TestBridgeDispatchesEveryPluginMethod(t *testing.T) {
|
||||
// 漏 ⇒ 新生成的 plugin.bin **编译不过**(procPluginMgr 不满足接口)。
|
||||
// 这是最晚才发现的一环(编译期才报,且只在用户执行 hmapdev build 时暴露)。
|
||||
func TestHmapdevTemplateImplementsAllPluginMgrMethods(t *testing.T) {
|
||||
sdkPath := filepath.Join("..", "..", "..", "third_party", "homeagent-sdk", "sdk", "plugin.go")
|
||||
sdkPath := filepath.Join("..", "..", "..", "third_party", "hologramagentsdk", "sdk", "plugin.go")
|
||||
methods := publishedPluginMgrMethods(t, sdkPath)
|
||||
|
||||
tmplPath := filepath.Join("..", "..", "..", "third_party", "homeagent-sdk",
|
||||
tmplPath := filepath.Join("..", "..", "..", "third_party", "hologramagentsdk",
|
||||
"tools", "hmapdev", "templates", "proc_main.go.tmpl")
|
||||
src, err := os.ReadFile(tmplPath)
|
||||
if err != nil {
|
||||
// ★ 文件缺失必须 **skip 而不是 fail**(2026-10-17 CI 实测):
|
||||
//
|
||||
// `third_party/homeagent-sdk/tools/` 在 .gitignore 里(SDK 仓自治,
|
||||
// `third_party/hologramagentsdk/tools/` 在 .gitignore 里(SDK 仓自治,
|
||||
// 本仓不跟踪)。所以:
|
||||
// · 本机(完整 SDK 检出)有该文件 ⇒ 判据能跑
|
||||
// · CI(只 checkout 本仓)没有该文件 ⇒ 原本 Fatalf ⇒ **CI 必红**
|
||||
@ -178,7 +178,7 @@ func TestHmapdevTemplateImplementsAllPluginMgrMethods(t *testing.T) {
|
||||
// "Go build / vet / test" 和 "Build linux/amd64" 双红,把 PR 卡住。
|
||||
//
|
||||
// skip 不是放弃检查:跨仓一致性由 **SDK 仓自己的判据**守着
|
||||
// (third_party/homeagent-sdk/tools/hmapdev/scaffold_stdout_test.go
|
||||
// (third_party/hologramagentsdk/tools/hmapdev/scaffold_stdout_test.go
|
||||
// 等),那边是模板的真实归属地。本判据在本机开发时仍然生效。
|
||||
t.Skipf("跳过:SDK 仓的 tools/ 不在本仓跟踪范围(.gitignore),"+
|
||||
"跨仓一致性由 SDK 仓判据守护。缺文件: %v", err)
|
||||
|
||||
@ -125,10 +125,10 @@ func buildPluginWithRealTemplate(t *testing.T, businessCode string) string {
|
||||
// 工具链在 SDK 1.2.0 起改名 hmapdev(原 plugindev)。两个目录都接受:
|
||||
// 旧检出(软链或旧版 SDK 仓)仍能跑本测试,新检出走新路径。
|
||||
tmplDir := filepath.Join("..", "..", "..",
|
||||
"third_party", "homeagent-sdk", "tools", "hmapdev", "templates")
|
||||
"third_party", "hologramagentsdk", "tools", "hmapdev", "templates")
|
||||
if _, err := os.Stat(tmplDir); err != nil {
|
||||
tmplDir = filepath.Join("..", "..", "..",
|
||||
"third_party", "homeagent-sdk", "tools", "plugindev", "templates")
|
||||
"third_party", "hologramagentsdk", "tools", "plugindev", "templates")
|
||||
}
|
||||
|
||||
dir := t.TempDir()
|
||||
@ -142,7 +142,7 @@ func buildPluginWithRealTemplate(t *testing.T, businessCode string) string {
|
||||
mustWriteFile(t, filepath.Join(dir, rt.out), string(data))
|
||||
}
|
||||
|
||||
sdkPath, err := filepath.Abs(filepath.Join("..", "..", "..", "third_party", "homeagent-sdk"))
|
||||
sdkPath, err := filepath.Abs(filepath.Join("..", "..", "..", "third_party", "hologramagentsdk"))
|
||||
if err != nil {
|
||||
t.Fatalf("解析 SDK 路径: %v", err)
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ package plugins
|
||||
//
|
||||
// ## 判定标准:只有「必须用内部 SDK 能力」的才留在本清单(2026-10-19)
|
||||
//
|
||||
// 内部 SDK(internal/sdk)比公开 SDK(third_party/homeagent-sdk/sdk)
|
||||
// 内部 SDK(internal/sdk)比公开 SDK(third_party/hologramagentsdk/sdk)
|
||||
// 多出一批**不对外授予**的能力面。外部插件用的是 proc 桥的收窄能力集,
|
||||
// 这些接口在类型层就不存在(见 internal/plugin/proc/capability.go 的
|
||||
// withheldCapabilities)。所以:
|
||||
|
||||
@ -71,7 +71,7 @@ func hostExecutableKind(path string) (string, bool) {
|
||||
// realPluginDir 返回某个 example 插件的 linux 产物路径。
|
||||
func realPluginBinary(t *testing.T, name string) string {
|
||||
t.Helper()
|
||||
root, err := filepath.Abs(filepath.Join("..", "..", "third_party", "homeagent-sdk", "example", name))
|
||||
root, err := filepath.Abs(filepath.Join("..", "..", "third_party", "hologramagentsdk", "example", name))
|
||||
if err != nil {
|
||||
t.Fatalf("解析插件目录: %v", err)
|
||||
}
|
||||
|
||||
@ -8,8 +8,8 @@ import (
|
||||
// KnowledgeAPI 是内置插件使用的全量知识库接口。
|
||||
//
|
||||
// 为什么不把多模态加进 pubsdk.KnowledgeAPI:那会改动
|
||||
// third_party/homeagent-sdk/sdk/ 的公开契约,而发布纪律要求
|
||||
// `git diff main -- third_party/homeagent-sdk/sdk/` 恒为 0
|
||||
// third_party/hologramagentsdk/sdk/ 的公开契约,而发布纪律要求
|
||||
// `git diff main -- third_party/hologramagentsdk/sdk/` 恒为 0
|
||||
// (改动它等于一次 major bump + 完整的外部发版流程)。
|
||||
// internal/sdk 明确不受此约束("内部实现自由"),且这里本来就是
|
||||
// "内核侧接口 = 公共接口 + 内置插件额外能力" 的既有范式
|
||||
|
||||
@ -88,6 +88,7 @@ func (s *securityImpl) DeclareProfile(p pubsdk.SecurityProfile) error {
|
||||
},
|
||||
SensitiveWords: p.SensitiveWords,
|
||||
ToolSensitiveWords: p.ToolSensitiveWords,
|
||||
DetectInjection: p.DetectInjection,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("security: declare profile %q: %w", name, err)
|
||||
}
|
||||
|
||||
@ -52,6 +52,16 @@ type Profile struct {
|
||||
// key 是工具名模式(支持尾部 `*`),value 是该工具额外追加的词。
|
||||
// 语义**追加不覆盖** —— 见 SDK 侧同名字段的说明。
|
||||
ToolSensitiveWords map[string][]string
|
||||
// DetectInjection 让这一档开启内置的**提示词注入迹象**识别。
|
||||
//
|
||||
// 与 SensitiveWords 的分工:敏感词是插件给的**数据**(它知道自己的
|
||||
// 哪些词敏感),注入迹象是内核内置的**形态**规则(ignore previous /
|
||||
// 角色劫持 / 索要系统提示 / 伪造更高优先级)。
|
||||
//
|
||||
// ★ 默认 false:失败即静默。注入识别会命中"扮演""你现在是"这类
|
||||
// 正常对话词,对所有插件默认开启会让常识对话充满误报;
|
||||
// 由插件按自己的内容形态显式声明。
|
||||
DetectInjection bool
|
||||
// DisableNetwork 在这一档内禁止网络意图。
|
||||
DisableNetwork bool
|
||||
// Sandbox 覆盖沙箱约束(零值 = 沿用全局)。
|
||||
|
||||
@ -407,6 +407,10 @@ func (r *Runtime) effectiveContentForTool(profileName, toolName string) ContentP
|
||||
if ok && len(prof.SensitiveWords) > 0 {
|
||||
p.SensitiveWords = append(append([]string{}, p.SensitiveWords...), prof.SensitiveWords...)
|
||||
}
|
||||
// 注入迹象:档位可为本轮显式开启(默认 false,理由见 Profile.DetectInjection)。
|
||||
if ok && prof.DetectInjection {
|
||||
p.DetectInjection = true
|
||||
}
|
||||
// 工具级追加(在整轮词表之上)。toolName 为空或档位没声明该工具 ⇒ 零影响。
|
||||
if ok && toolName != "" && len(prof.ToolSensitiveWords) > 0 {
|
||||
for pattern, words := range prof.ToolSensitiveWords {
|
||||
|
||||
@ -29,7 +29,7 @@ make build-cli >/dev/null
|
||||
CGO_ENABLED=0 go build -o "$ROOT/build/homed-upgrade" ./cmd/homed-upgrade/
|
||||
# hmapdev 来自 SDK 仓
|
||||
if [ ! -x "$ROOT/build/hmapdev" ]; then
|
||||
(cd third_party/homeagent-sdk/tools/hmapdev && go build -o "$ROOT/build/hmapdev" .)
|
||||
(cd third_party/hologramagentsdk/tools/hmapdev && go build -o "$ROOT/build/hmapdev" .)
|
||||
fi
|
||||
|
||||
echo "== 组装 $NAME =="
|
||||
@ -41,7 +41,7 @@ install -m 0755 "$ROOT/build/waiter" "$OUT/bin/waiter"
|
||||
install -m 0755 "$ROOT/build/hmapdev" "$OUT/bin/hmapdev"
|
||||
install -m 0755 "$ROOT/build/homed-upgrade" "$OUT/bin/homed-upgrade"
|
||||
# 只带 SDK 源码,排除构建产物。
|
||||
SDK_SRC=third_party/homeagent-sdk
|
||||
SDK_SRC=third_party/hologramagentsdk
|
||||
mkdir -p "$OUT/sdk"
|
||||
(cd "$SDK_SRC" && tar -cf - \
|
||||
--exclude='./example/*/rawfile' \
|
||||
|
||||
@ -42,7 +42,7 @@ for arg in "$@"; do
|
||||
done
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
EXAMPLES="$ROOT/third_party/homeagent-sdk/example"
|
||||
EXAMPLES="$ROOT/third_party/hologramagentsdk/example"
|
||||
GH_ORG="${GH_ORG:-HologramAgent}"
|
||||
TOKEN="${GH_ORG_TOKEN:-}"
|
||||
|
||||
|
||||
@ -114,4 +114,16 @@ type SecurityProfile struct {
|
||||
// "qq_get_*": {"客户名单"},
|
||||
// }
|
||||
ToolSensitiveWords map[string][]string
|
||||
|
||||
// DetectInjection 开启内核内置的**提示词注入迹象**识别。
|
||||
//
|
||||
// 与 ToolSensitiveWords 的分工:词表是插件给的**数据**(它知道自己的
|
||||
// 哪些词敏感),注入迹象是内核内置的**形态**规则(ignore previous /
|
||||
// 角色劫持 / 索要系统提示 / 伪造更高优先级)。
|
||||
//
|
||||
// ★ 默认 false:注入识别会命中"扮演""你现在是"这类正常对话词,
|
||||
// 默认开启会让常识对话充满误报 —— 由插件按自己的内容形态显式声明。
|
||||
//
|
||||
// ★ 当前处置是 B 档:命中只**标记并警示**,不阻断。
|
||||
DetectInjection bool
|
||||
}
|
||||
Reference in New Issue
Block a user