X-Git-Url: http://git.giacomolli.uk/onechat/blobdiff_plain/e1e48ba388c28105fff3b70c8ca02304f5d57f53..47f69638bc96100f2e446f63c7c3689023156e64:/subagent_run_test.go?ds=inline diff --git a/subagent_run_test.go b/subagent_run_test.go index fc13f60..1fd6a4a 100644 --- a/subagent_run_test.go +++ b/subagent_run_test.go @@ -330,6 +330,50 @@ 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)) + + 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{})