modelWriteEvents(w, modelCompletedEvent(items, 100, 0, 5))
}
+
whatsapp, _, _ := whatsappStartTest(t, dir, newTestClock())
listener, err := daemonListenSocket(filepath.Join(dir, socketFileName))
require.NoError(t, err)
}, 5*time.Second, time.Millisecond)
}
+func TestRuntimeChildAcceptsNotificationsByItsPermanentID(t *testing.T) {
+ test := newDaemonChildrenTest(t)
+ test.server.reply = func(w http.ResponseWriter, _ ModelFakeCall) {
+ modelWriteEvents(w, modelCompletedEvent([]any{modelMessageItem("")}, 100, 0, 5))
+ }
+
+ _, err := test.runtime.Create("Garden", "Keep garden plans.")
+ require.NoError(t, err)
+
+ child := test.runtime.messages.Child(test.root.agent.config.Name, "Garden")
+ require.NotNil(t, child)
+
+ receipt, err := test.runtime.messages.Notify(&NotifyInput{
+ AgentID: child.agent.config.ID,
+ Source: "check",
+ ID: "runtime-child",
+ Text: "A new result.",
+ })
+ require.NoError(t, err)
+ require.Equal(t, "accepted", receipt.Status)
+ require.Eventually(t, func() bool {
+ return child.memory.Len() == 1
+ }, 10*time.Second, time.Millisecond)
+ require.Zero(t, test.root.memory.Len())
+
+ logged, err := child.memory.Message(0)
+ require.NoError(t, err)
+ require.Equal(t, "work", logged.Kind)
+ require.Contains(t, logged.Text, "Untrusted external data")
+}
+
func TestChildCreationRefusesUsedNames(t *testing.T) {
test := newDaemonChildrenTest(t)
box := test.root.tools
test.root.runs.subagents.draw = func() string {
return "BlueFox"
}
+
subagent, err := test.root.runs.subagents.Create(t.Context())
require.NoError(t, err)
require.Equal(t, "BlueFox", subagent.name)
child string
}{
{
- name: "house area",
+ name: "accepts house area",
child: "House",
},
{
- name: "calendar area",
+ name: "accepts calendar area",
child: "Calendar",
},
{
- name: "two letters",
+ name: "accepts two letters",
child: "Ab",
},
{
- name: "capital letters after the first",
+ name: "accepts capital letters after the first",
child: "ABcD",
},
{
- name: "thirty-two letters",
+ name: "accepts thirty-two letters",
child: "A" + strings.Repeat("b", 31),
},
}
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
test := newDaemonChildrenTest(t)
child string
}{
{
- name: "empty name",
+ name: "refuses empty name",
child: "",
},
{
- name: "one letter",
+ name: "refuses one letter",
child: "H",
},
{
- name: "thirty-three letters",
+ name: "refuses thirty-three letters",
child: "A" + strings.Repeat("b", 32),
},
{
- name: "lowercase initial",
+ name: "refuses lowercase initial",
child: "house",
},
{
- name: "two words",
+ name: "refuses two words",
child: "My House",
},
{
- name: "digit",
+ name: "refuses digit",
child: "House2",
},
{
- name: "path",
+ name: "refuses path",
child: "../House",
},
{
- name: "punctuation",
+ name: "refuses punctuation",
child: "House-",
},
{
- name: "non-ASCII initial",
+ name: "refuses non-ASCII initial",
child: "\u00c1rea",
},
{
- name: "non-ASCII remainder",
+ name: "refuses non-ASCII remainder",
child: "Hous\u00e9",
},
}
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
test := newDaemonChildrenTest(t)
return name
}
+
subagent, err := test.root.runs.subagents.Create(t.Context())
require.NoError(t, err)
require.Equal(t, "BlueFox", subagent.name)
test.root.runs.subagents.draw = func() string {
return "BlueFox"
}
+
subagent, err := test.root.runs.subagents.Create(t.Context())
require.NoError(t, err)
test := &DaemonChildrenTest{
server: newModelFake(t),
}
+
agents, err := openDaemonAgents(t.Context(), t.TempDir(), test.server.URL, ModelAPIKey(modelTestKey), defaultConfig().Compactor, time.Now, discardLog())
require.NoError(t, err)
root: test.root,
messages: messages,
}
+
test.root.tools.children = test.runtime
t.Cleanup(func() {
cancel()