"work: " + report,
"reply: Noted.",
}, test.Log(t))
+ require.Equal(t, Event{
+ Kind: "work",
+ ID: 4,
+ Text: report,
+ Source: name,
+ Status: subagentFinished,
+ }, test.events.LastEvent("work"))
var first, second *ModelFakeCall
for n := range server.Calls() {
<-arrived
report := subagentReport("GreenOtter", []string{"It is done."})
- test.loop.Report(report, false)
+ test.loop.Report("GreenOtter", report, subagentFinished)
close(release)
test.events.WaitFor(t, "idle", 1)
server := newModelFake(t)
test := newTestTurnLoop(t, server)
report := subagentReport("GreenOtter", []string{"failed: context canceled"})
- test.loop.Report(report, true)
+ test.loop.Report("GreenOtter", report, subagentStopped)
test.events.WaitFor(t, "work", 1)
time.Sleep(50 * time.Millisecond)
"work: [" + name + "]\nfailed: model call: HTTP 400: " + subagentTestFullContext + "\n\nFull chat: zoom(\"" + name + "\")",
"reply: It failed.",
}, test.Log(t))
+ require.Equal(t, subagentFailed, test.events.LastEvent("work").Status)
}
func TestSubagentHasItsOwnEffortAndNoSpawn(t *testing.T) {
require.EqualError(t, err, "no agent BlueFox")
}
+func TestStopEndsASubagentAndItsCommand(t *testing.T) {
+ server := newModelFake(t)
+ server.reply = func(w http.ResponseWriter, call ModelFakeCall) {
+ modelWriteEvents(w, modelCompletedEvent([]any{modelFunctionCallItem("fc_1", "call_1", "shell", `{"command":"touch started && sleep 30"}`)}, 100, 0, 5))
+ }
+
+ test := newTestTurnLoop(t, server)
+ runs := test.loop.runs
+ _, err := runs.Spawn(t.Context(), []string{"Wait long."}, nil)
+ require.NoError(t, err)
+
+ name := test.events.Last("subagent")
+ subagent, err := runs.subagents.Get(t.Context(), name)
+ require.NoError(t, err)
+
+ require.Eventually(t, func() bool {
+ _, err := os.Stat(filepath.Join(subagent.WorkDir(), "started"))
+ return err == nil
+ }, 10*time.Second, time.Millisecond)
+
+ start := time.Now()
+ found, err := test.loop.StopSubagent(name)
+ require.NoError(t, err)
+ require.True(t, found)
+
+ test.events.WaitFor(t, "work", 1)
+ require.Less(t, time.Since(start), 10*time.Second)
+ require.Equal(t, []string{
+ "note: Stopped by the user: " + name + ".",
+ "work: " + subagentReport(name, []string{"stopped"}),
+ }, test.Log(t))
+ require.Equal(t, subagentStopped, test.events.LastEvent("work").Status)
+
+ log, err := subagent.Show()
+ require.NoError(t, err)
+ require.Contains(t, log, "echo: \n[interrupted]")
+
+ found, err = test.loop.StopSubagent(name)
+ require.NoError(t, err)
+ require.False(t, found)
+
+ time.Sleep(50 * time.Millisecond)
+ require.Zero(t, test.events.Count("busy"))
+}
+
func TestCloseEndsTheSubagentsWithNoReport(t *testing.T) {
server := newModelFake(t)
arrived := make(chan struct{})