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{})