mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-15 03:52:25 +00:00
test(seq): 端到端接线判据,抓出「传参方式完全不可用」的真 bug
P1–P4 的判据都在**包内**(假 runner / 直接调函数),覆盖的是**语义**;
本轮补的是**接线**层——参数名对不对、返回值模型读不读得懂、跨层调用断不断。
接线层的 bug 语义判据抓不到:例如工具注册了但参数名拼错,单元判据全绿
而模型永远传不进来。
★ 抓到一个真 bug:**seq_create 走 groups 传参时完全不可用**。
根因:marshalGroups 只把 groups 包进 JSON 文档、不带 name,而 Parse 要求
name 非空 ⇒ 报「序列缺少 name」。而 seqCreate 里那句
`if seq.Name == "" { seq.Name = name }` 回落分支是**死代码**(Parse 早就失败了)。
后果:**只有 file 方式能用,传参方式一律失败**。
已修(name 一并包装)。包内判据抓不到这个——它们直接构造 *Sequence,
不经过这条路径;只有真正 dispatch 一遍才暴露。
判据(e2e_test.go,7 条):真实 dispatch 串通
seq_create → seq_list(须展示签名,模型据此按名调用)→ seq_run
(执行序按 tools 声明序、槽回填、结果里**不得**出现 Go 的 `map[` 语法)
· seq_call 按名调用 group 并返回其出参
· seq_when_call 条件为假 ⇒ 跳过且**零工具被执行**
· seq_when_call 条件畸形 ⇒ **报错**且零执行(不得静默跳过)
· seq_create 走**文件**(长序列的主力用法)
· groups 与 file 同时传 ⇒ 报错「二选一」
· seq_delete 不存在 ⇒ 报错(模型会以为删掉了)
过程中又一次臆造 helper(`writeFile`),改用 os.WriteFile;
并把三处 `_, _ = p.dispatch(...)` 补上 err 检查(正是
go-ignored-call-result 报的那类)。
回归:seq -race 全绿;go build ./... 通过;go test ./internal/... 全绿。
This commit is contained in:
@ -43,7 +43,7 @@ func (p *Plugin) seqCreate(args map[string]interface{}) (interface{}, error) {
|
||||
text = b
|
||||
from = "文件 " + file
|
||||
} else {
|
||||
b, err := marshalGroups(groupsRaw)
|
||||
b, err := marshalGroups(name, groupsRaw)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -124,12 +124,19 @@ func absPath(p string) (string, error) {
|
||||
func filepathToSlash(p string) string { return strings.ReplaceAll(p, `\`, "/") }
|
||||
|
||||
// marshalGroups 把 groups 参数([]interface{})序列化为 JSON 文本。
|
||||
func marshalGroups(raw interface{}) ([]byte, error) {
|
||||
// marshalGroups 把 groups 参数([]interface{})序列化为 JSON 文本。
|
||||
//
|
||||
// ⚠️ name **必须**一起放进文档:Parse 要求 name 非空,而调用方传的 name
|
||||
// 在参数顶层。此前这里只包 groups,于是**传参方式完全不可用**
|
||||
// ("序列缺少 name")—— 而下面的 `if seq.Name == ""` 回落分支是死代码。
|
||||
// 这是端到端判据(TestE2E_CreateListRun)抓出来的,包内判据抓不到:
|
||||
// 它们直接构造 *Sequence,不经过这条路径。
|
||||
func marshalGroups(name string, raw interface{}) ([]byte, error) {
|
||||
arr, ok := raw.([]interface{})
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("groups 必须是数组,实际是 %T", raw)
|
||||
}
|
||||
doc := map[string]interface{}{"groups": arr}
|
||||
doc := map[string]interface{}{"name": name, "groups": arr}
|
||||
b, err := json.MarshalIndent(doc, "", " ")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("groups 序列化失败(每个 group 应为对象): %w", err)
|
||||
|
||||
Reference in New Issue
Block a user