X-Git-Url: http://git.giacomolli.uk/onechat/blobdiff_plain/e1e48ba388c28105fff3b70c8ca02304f5d57f53..eeb821ff17ad79c87ca9b64cd9be26f8612f4a03:/subagent_run_test.go?ds=inline diff --git a/subagent_run_test.go b/subagent_run_test.go index fc13f60..5caf0d8 100644 --- a/subagent_run_test.go +++ b/subagent_run_test.go @@ -57,6 +57,13 @@ func TestSpawnRunsASubagentInTheBackground(t *testing.T) { "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() { @@ -131,7 +138,7 @@ func TestReportJoinsTheNextRequestOfARunningTurn(t *testing.T) { <-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) @@ -146,7 +153,7 @@ func TestReportOfAStoppedSubagentStartsNoTurn(t *testing.T) { 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) @@ -178,6 +185,7 @@ func TestFullContextGivesAFailedReport(t *testing.T) { "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) { @@ -330,6 +338,51 @@ func TestTellToAFinishedSubagentGoesOnFromItsLog(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{})