1package agent
2
3import (
4 "strings"
5 "testing"
6
7 "github.com/bnema/zut/packages/agent/subagents"
8 "github.com/bnema/zut/packages/core"
9)
10
11func TestResidentChildRegistryUsesExactToolListAndForbidsDelegation(t *testing.T) {
12 catalogue := core.Registry{
13 "read": nil,
14 "bash": nil,
15 "subagent_spawn": nil,
16 "update_goal": nil,
17 }
18 registry, err := residentChildRegistry(catalogue, []string{"read"})
19 if err != nil {
20 t.Fatal(err)
21 }
22 if len(registry) != 1 {
23 t.Fatalf("registry = %#v", registry)
24 }
25 for _, name := range []string{"subagent_spawn", "update_goal", "missing"} {
26 _, err := residentChildRegistry(catalogue, []string{name})
27 if err == nil || !strings.Contains(err.Error(), name) {
28 t.Fatalf("residentChildRegistry(%q) error = %v", name, err)
29 }
30 }
31}
32
33func TestResidentChildArgsPreserveDurableProfileInheritance(t *testing.T) {
34 no := false
35 next := residentChildArgs(Args{NoSkill: false, NoContextFiles: false, BaseURL: "https://stale.example/v1", InsecureTLS: false}, "openai", subagents.ResidentChildSpec{
36 Provider: "openai", BaseURL: "https://current.example/v1", InsecureTLS: true, Model: "gpt-5", Workspace: "/repo/child",
37 InheritSkills: &no, InheritProjectContext: &no,
38 })
39 if next.Provider != "openai" || next.BaseURL != "https://current.example/v1" || !next.InsecureTLS || next.Model != "gpt-5" || next.CWD != "/repo/child" || !next.NoSkill || !next.NoContextFiles {
40 t.Fatalf("resident child args = %#v", next)
41 }
42}
43
44func TestResidentChildArgsDoNotForwardCLIKeyAcrossProviders(t *testing.T) {
45 parent := Args{Provider: "openai", APIKey: "parent-key"}
46 child := subagents.ResidentChildSpec{Provider: "anthropic", Model: "claude"}
47 if next := residentChildArgs(parent, "openai", child); next.APIKey != "" {
48 t.Fatalf("cross-provider child inherited API key %q", next.APIKey)
49 }
50 child.Provider = "openai"
51 if next := residentChildArgs(parent, "openai", child); next.APIKey != "parent-key" {
52 t.Fatalf("same-provider child API key = %q, want parent key", next.APIKey)
53 }
54}