X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/522d7fd117285e4e4ce3ea5ec9b5a1722521b681..c781f79f3c8cb9a7577ee1574d196988da2719b3:/subagent_run_test.go?ds=inline diff --git a/subagent_run_test.go b/subagent_run_test.go index f637dcf..efd387c 100644 --- a/subagent_run_test.go +++ b/subagent_run_test.go @@ -3,6 +3,7 @@ package main import ( "context" "io" + "log/slog" "net/http" "os" "path/filepath" @@ -28,7 +29,8 @@ func TestSpawnRunsASubagentInTheBackground(t *testing.T) { last := subagentTestLastItem(call) switch { case subagentTestCall(call) && last["type"] == "function_call_output": - // The report comes after the reply of the turn of the spawn. + // The report comes after the reply of the turn of the + // spawn. test.events.WaitFor(t, "reply", 1) modelWriteEvents(w, modelCompletedEvent([]any{modelMessageItem("There are 3 files.")}, 100, 0, 5)) case subagentTestCall(call): @@ -62,6 +64,7 @@ func TestSpawnRunsASubagentInTheBackground(t *testing.T) { "work: " + report, "reply: Noted.", }, test.Log(t)) + require.Equal(t, Event{ Kind: "work", ID: 4, @@ -69,7 +72,8 @@ func TestSpawnRunsASubagentInTheBackground(t *testing.T) { Source: name, Status: subagentFinished, }, test.events.LastEvent("work")) - require.Equal(t, "subagent "+name+" started\nsubagent "+name+" done after 0s\n", test.logs.String()) + + require.Equal(t, "<6>subagent started name="+name+"\n<6>subagent done name="+name+" after=0s\n", test.logs.String()) var first, second *ModelFakeCall @@ -196,8 +200,9 @@ func TestFullContextGivesAFailedReport(t *testing.T) { "work: [" + name + "]\nfailed: create model response: 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) - require.Equal(t, "subagent "+name+" started\nsubagent "+name+" failed after 0s: create model response: model call: HTTP 400: "+subagentTestFullContext+"\n", test.logs.String()) + require.Equal(t, "<6>subagent started name="+name+"\n<3>subagent failed name="+name+" after=0s: create model response: model call: HTTP 400: "+subagentTestFullContext+"\n", test.logs.String()) } func TestSubagentHasItsOwnEffortAndNoSpawn(t *testing.T) { @@ -383,8 +388,9 @@ func TestStopEndsASubagentAndItsCommand(t *testing.T) { "note: Stopped by the user: " + name + ".", "work: " + subagentReport(name, []string{"stopped"}), }, test.Log(t)) + require.Equal(t, subagentStopped, test.events.LastEvent("work").Status) - require.Equal(t, "subagent "+name+" started\nsubagent "+name+" stopped after 0s\n", test.logs.String()) + require.Equal(t, "<6>subagent started name="+name+"\n<6>subagent stopped name="+name+" after=0s\n", test.logs.String()) log, err := subagent.Show() require.NoError(t, err) @@ -456,7 +462,7 @@ func TestRestartResumesTheCutSubagents(t *testing.T) { require.NoError(t, err) first := &TurnEventRecorder{} - loop, _, stop := subagentTestStart(t, agent, server, first) + loop, _, stop := subagentTestStart(t, agent, server, first, discardLog()) _, err = loop.runs.Spawn(t.Context(), []string{"Build the project."}, nil) require.NoError(t, err) @@ -474,7 +480,7 @@ func TestRestartResumesTheCutSubagents(t *testing.T) { restarted.Store(true) second := &TurnEventRecorder{} - loop, memory, stop := subagentTestStart(t, agent, server, second) + loop, memory, stop := subagentTestStart(t, agent, server, second, discardLog()) defer stop() second.WaitFor(t, "idle", 1) @@ -506,7 +512,8 @@ func TestRestartReportsASubagentThatCannotGoOn(t *testing.T) { require.NoError(t, os.WriteFile(filepath.Join(agent.dir, subagentWorkFileName), []byte(`{"running": ["BlueFox"]}`), 0o600)) events := &TurnEventRecorder{} - _, memory, stop := subagentTestStart(t, agent, server, events) + logs := &SyncBuffer{} + _, memory, stop := subagentTestStart(t, agent, server, events, daemonTestLogger(logs)) defer stop() events.WaitFor(t, "idle", 1) @@ -515,7 +522,9 @@ func TestRestartReportsASubagentThatCannotGoOn(t *testing.T) { "work: " + subagentReport("BlueFox", []string{"failed: no agent BlueFox"}), "reply: a line", }, subagentTestChat(t, memory)) + require.Equal(t, subagentFailed, events.LastEvent("work").Status) + require.Equal(t, "<3>subagent lost at restart name=BlueFox: no agent BlueFox\n", logs.String()) data, err := os.ReadFile(filepath.Join(agent.dir, subagentWorkFileName)) require.NoError(t, err) @@ -525,7 +534,7 @@ func TestRestartReportsASubagentThatCannotGoOn(t *testing.T) { // subagentTestStart runs a loop of agent with its memory and subagents in the // agent directory, as the daemon does. The returned function stops the loop // and closes the files. -func subagentTestStart(t *testing.T, agent *Agent, server *ModelFake, events *TurnEventRecorder) (*TurnLoop, *Memory, func()) { +func subagentTestStart(t *testing.T, agent *Agent, server *ModelFake, events *TurnEventRecorder, logger *slog.Logger) (*TurnLoop, *Memory, func()) { t.Helper() agent.config.Workdir = t.TempDir() @@ -536,7 +545,7 @@ func subagentTestStart(t *testing.T, agent *Agent, server *ModelFake, events *Tu subagents := newSubagents(filepath.Join(agent.dir, subagentDirName), clock.Now, subagentNameRandom) client := newModelClient(server.URL, ModelAPIKey(modelTestKey), agent.CacheKey(), filepath.Join(agent.dir, "usage.jsonl")) whatsapp, _, _ := whatsappStartTest(t, t.TempDir(), clock) - loop, err := newTurnLoop(agent, memory, subagents, whatsapp, newTestSchedules(t, clock.Now), client, clock.Now, discardLog(), events.Add) + loop, err := newTurnLoop(agent, memory, subagents, whatsapp, newTestSchedules(t, clock.Now), client, clock.Now, logger, events.Add) require.NoError(t, err) ctx, cancel := context.WithCancel(t.Context())