From: Anderson A. Giacomolli Date: Mon, 9 Nov 2026 13:35:37 +0000 (-0300) Subject: Log failed summary builds X-Git-Url: http://git.giacomolli.uk/onechat/commitdiff_plain/2daf91497c2cc70d7156f7c0d99b1451933a818a?ds=inline Log failed summary builds A build of a summary node that fails logs one line with the node and the cause, and tells that the build is tried again at the next message. A build that a stop of the daemon ends logs nothing. The error of the compactor holds no node, because the line names it once. The tests give each memory a logger, and a shared helper gives the ones that the tests do not read. Issue: e4acfcb --- diff --git a/chain_test.go b/chain_test.go index 070a5f2..5517620 100644 --- a/chain_test.go +++ b/chain_test.go @@ -26,7 +26,7 @@ func TestChainReturnsTheRepliesOfTheFinalAnswer(t *testing.T) { }, 120, 100, 5)) } - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) t.Cleanup(func() { diff --git a/compactor.go b/compactor.go index e7a6866..efb183f 100644 --- a/compactor.go +++ b/compactor.go @@ -65,7 +65,7 @@ func (c *Compactor) Summarize(ctx context.Context, task Task) (string, error) { instructions, err := c.instructions() if err != nil { - return "", fmt.Errorf("compact node (%d, %d): %w", task.Level, task.Index, err) + return "", err } var first []any @@ -109,7 +109,7 @@ func (c *Compactor) Summarize(ctx context.Context, task Task) (string, error) { } if len(lines) == 0 { - return "", fmt.Errorf("compact node (%d, %d): %w", task.Level, task.Index, err) + return "", err } return compactorShortest(lines), nil diff --git a/compactor_test.go b/compactor_test.go index 0d591ee..0cab0d0 100644 --- a/compactor_test.go +++ b/compactor_test.go @@ -255,7 +255,7 @@ func TestCompactorBuildsNodesInTheCore(t *testing.T) { modelWriteEvents(w, modelCompletedEvent([]any{modelMessageItem("summary of the long output")}, 100, 0, 5)) } - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newTestCompactor(t, server)) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newTestCompactor(t, server), discardLog()) require.NoError(t, err) defer func() { diff --git a/daemon.go b/daemon.go index fb7f5c4..c2cf33b 100644 --- a/daemon.go +++ b/daemon.go @@ -86,7 +86,7 @@ func daemon(ctx context.Context, out io.Writer) (err error) { } client := newModelClient(address, auth, agent.CacheKey(), filepath.Join(agent.dir, "usage.jsonl")) - memory, err := openMemory(ctx, agent.dir, time.Now, newCompactor(client, agent.Prompt, config.Compactor)) + memory, err := openMemory(ctx, agent.dir, time.Now, newCompactor(client, agent.Prompt, config.Compactor), logger) if err != nil { return err } diff --git a/daemon_start_helper_test.go b/daemon_start_helper_test.go index 0c25acc..8ed36e9 100644 --- a/daemon_start_helper_test.go +++ b/daemon_start_helper_test.go @@ -2,8 +2,6 @@ package main import ( "context" - "io" - "log" "path/filepath" "testing" "time" @@ -42,7 +40,7 @@ func daemonStartTestWithSchedules(t *testing.T, server *ModelFake, bot *Telegram require.NoError(t, err) agent.config.Workdir = t.TempDir() - memory, err := openMemory(t.Context(), agent.dir, clock, newFakeSummarizer()) + memory, err := openMemory(t.Context(), agent.dir, clock, newFakeSummarizer(), discardLog()) require.NoError(t, err) socket := filepath.Join(dir, socketFileName) @@ -54,7 +52,7 @@ func daemonStartTestWithSchedules(t *testing.T, server *ModelFake, bot *Telegram done := make(chan error) go func() { done <- daemonServe(ctx, listener, bot, whatsapp, schedules, func(notify func(Event)) (*TurnLoop, error) { - return newTurnLoop(agent, memory, newTestSubagents(t), whatsapp, schedules, client, clock, log.New(io.Discard, "", 0), notify) + return newTurnLoop(agent, memory, newTestSubagents(t), whatsapp, schedules, client, clock, discardLog(), notify) }) }() diff --git a/discard_log_helper_test.go b/discard_log_helper_test.go new file mode 100644 index 0000000..9c24880 --- /dev/null +++ b/discard_log_helper_test.go @@ -0,0 +1,11 @@ +package main + +import ( + "io" + "log" +) + +// discardLog returns a logger whose lines a test does not read. +func discardLog() *log.Logger { + return log.New(io.Discard, "", 0) +} diff --git a/memory.go b/memory.go index 0fd7d83..751a5dc 100644 --- a/memory.go +++ b/memory.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "log" "os" "path/filepath" "strings" @@ -22,9 +23,9 @@ var ( ) // openMemory opens the chat in root and starts the builds that are ready. The -// clock gives the dates of new messages and the days of new nodes. The builds -// stop when ctx ends or at Close. -func openMemory(ctx context.Context, root string, clock func() time.Time, summarizer Summarizer) (*Memory, error) { +// clock gives the dates of new messages and the days of new nodes. logger gets +// one line for each failed build. The builds stop when ctx ends or at Close. +func openMemory(ctx context.Context, root string, clock func() time.Time, summarizer Summarizer, logger *log.Logger) (*Memory, error) { log, err := openLog(ctx, root, clock) if err != nil { return nil, err @@ -35,6 +36,7 @@ func openMemory(ctx context.Context, root string, clock func() time.Time, summar log: log, queue: newBuildQueue(), summarizer: summarizer, + logger: logger, changed: make(chan struct{}), } @@ -106,6 +108,7 @@ type Memory struct { cview *View queue *BuildQueue summarizer Summarizer + logger *log.Logger ctx context.Context cancel context.CancelFunc workers sync.WaitGroup @@ -394,7 +397,9 @@ func (m *Memory) dispatch() { task, err := m.task(key) if err != nil { + m.failed(key, fmt.Errorf("read its input: %w", err)) m.queue.Fail(key) + continue } @@ -561,6 +566,10 @@ func (m *Memory) run(key NodeKey, task Task) { m.syncer.Written() } + if err != nil && m.ctx.Err() == nil { + m.failed(key, err) + } + if err != nil { m.queue.Fail(key) } else { @@ -572,6 +581,11 @@ func (m *Memory) run(key NodeKey, task Task) { m.dispatch() } +// failed logs the failed build of the node key with its cause err. +func (m *Memory) failed(key NodeKey, err error) { + m.logger.Printf("a summary of the chat failed, and it is tried again at the next message: node (%d, %d): %v", key.level, key.index, err) +} + // ready tells if both children of the node key are built and the node is not. func (m *Memory) ready(key NodeKey) (bool, error) { for _, index := range []int{2 * key.index, 2*key.index + 1} { diff --git a/memory_test.go b/memory_test.go index 4dee8b2..ee932d1 100644 --- a/memory_test.go +++ b/memory_test.go @@ -3,6 +3,7 @@ package main import ( "context" "fmt" + "log" "maps" "os" "path/filepath" @@ -17,7 +18,7 @@ import ( func TestMemoryRestartLoadsTheSameView(t *testing.T) { root := t.TempDir() clock := newTestClock() - memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) memory.chat.high = 200 @@ -36,7 +37,7 @@ func TestMemoryRestartLoadsTheSameView(t *testing.T) { require.Less(t, len(memory.chat.lines), 100) require.NoError(t, memory.Close()) - memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) defer func() { @@ -54,7 +55,7 @@ func TestMemoryRestartLoadsTheSameView(t *testing.T) { func TestMemoryOpensAfterACrashBeforeTheViewSave(t *testing.T) { root := t.TempDir() clock := newTestClock() - memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) _, err = memory.Append("user", "first") @@ -72,14 +73,14 @@ func TestMemoryOpensAfterACrashBeforeTheViewSave(t *testing.T) { // The log and the tree hold message 1, but the view does not. require.NoError(t, os.WriteFile(filepath.Join(root, "view.json"), saved, 0o600)) - memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) require.Equal(t, view, memory.View()) require.NoError(t, memory.Close()) } func TestMemoryKeepsTheCompactionViewCoarser(t *testing.T) { - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) defer func() { @@ -110,7 +111,7 @@ func TestMemoryKeepsTheCompactionViewCoarser(t *testing.T) { func TestMemoryRunsAtMostEightBuilds(t *testing.T) { summarizer := newFakeSummarizer() summarizer.gate = make(chan struct{}) - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog()) require.NoError(t, err) defer func() { @@ -148,7 +149,7 @@ func TestMemoryRunsAtMostEightBuilds(t *testing.T) { func TestMemorySettleWaitsForThePendingLines(t *testing.T) { summarizer := newFakeSummarizer() summarizer.gate = make(chan struct{}) - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog()) require.NoError(t, err) defer func() { @@ -178,7 +179,8 @@ func TestMemorySettleWaitsForThePendingLines(t *testing.T) { func TestMemorySettleFailsWhileABuildFailed(t *testing.T) { summarizer := newFakeSummarizer() summarizer.SetFailing(true) - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer) + logs := &SyncBuffer{} + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, log.New(logs, "", 0)) require.NoError(t, err) defer func() { @@ -188,6 +190,7 @@ func TestMemorySettleFailsWhileABuildFailed(t *testing.T) { _, err = memory.Append("echo", memoryLongText(0)) require.NoError(t, err) require.ErrorIs(t, memory.Settle(t.Context()), errMemoryUnsettled) + require.Equal(t, "a summary of the chat failed, and it is tried again at the next message: node (0, 0): fake failure\n", logs.String()) summarizer.SetFailing(false) _, err = memory.Append("user", "retry") @@ -198,7 +201,7 @@ func TestMemorySettleFailsWhileABuildFailed(t *testing.T) { func TestMemorySettleEndsWithItsContext(t *testing.T) { summarizer := newFakeSummarizer() summarizer.gate = make(chan struct{}) - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog()) require.NoError(t, err) defer func() { @@ -217,7 +220,7 @@ func TestMemorySettleEndsWithItsContext(t *testing.T) { func TestMemoryStartsALeafAfterFewerThanEightUnbuilt(t *testing.T) { summarizer := newFakeSummarizer() summarizer.SetFailing(true) - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog()) require.NoError(t, err) defer func() { @@ -246,7 +249,7 @@ func TestMemoryStartsALeafAfterFewerThanEightUnbuilt(t *testing.T) { func TestMemoryMergesAfterBothHalves(t *testing.T) { summarizer := newFakeSummarizer() - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog()) require.NoError(t, err) defer func() { @@ -275,7 +278,7 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) { clock := newTestClock() summarizer := newFakeSummarizer() summarizer.SetFailing(true) - memory, err := openMemory(t.Context(), root, clock.Now, summarizer) + memory, err := openMemory(t.Context(), root, clock.Now, summarizer, discardLog()) require.NoError(t, err) for n := range 4 { @@ -286,7 +289,7 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) { require.NoError(t, memory.Wait(t.Context())) require.NoError(t, memory.Close()) - memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) defer func() { @@ -298,7 +301,7 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) { } func TestMemoryBuildsFreeParents(t *testing.T) { - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) defer func() { @@ -317,7 +320,7 @@ func TestMemoryBuildsFreeParents(t *testing.T) { func TestMemoryKeepsALongMessageOutOfTheView(t *testing.T) { summarizer := newFakeSummarizer() summarizer.SetFailing(true) - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog()) require.NoError(t, err) defer func() { @@ -343,7 +346,7 @@ func TestMemoryKeepsALongMessageOutOfTheView(t *testing.T) { func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) { root := t.TempDir() clock := newTestClock() - memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) _, err = memory.Append("user", "a") @@ -353,7 +356,7 @@ func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) { require.NoError(t, err) require.NoError(t, memory.Close()) - memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) defer func() { @@ -366,7 +369,7 @@ func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) { func TestMemoryRefusesToRebuildAMissingView(t *testing.T) { root := t.TempDir() clock := newTestClock() - memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) _, err = memory.Append("user", "a") @@ -374,7 +377,7 @@ func TestMemoryRefusesToRebuildAMissingView(t *testing.T) { require.NoError(t, memory.Close()) require.NoError(t, os.Remove(filepath.Join(root, "view.json"))) - _, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + _, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.ErrorIs(t, err, errMemoryNoView) } diff --git a/probe.go b/probe.go index ba656ff..5b233ed 100644 --- a/probe.go +++ b/probe.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "io" + "log" "maps" "os" "path/filepath" @@ -105,7 +106,9 @@ func probe(ctx context.Context, args []string, out io.Writer) (err error) { slots: make(chan struct{}, builds), } - memory, err := openMemory(ctx, root, time.Now, summarizer) + // The report of the probe counts the failed calls, so the lines of the + // failed builds are not needed. + memory, err := openMemory(ctx, root, time.Now, summarizer, log.New(io.Discard, "", 0)) if err != nil { return err } diff --git a/probe_test.go b/probe_test.go index bd881a0..1e07fd5 100644 --- a/probe_test.go +++ b/probe_test.go @@ -419,7 +419,7 @@ func newTestProbeRun(t *testing.T, server *ModelFake) *ProbeRun { root := t.TempDir() usagePath := filepath.Join(root, "usage.jsonl") client := newModelClient(server.URL, ModelAPIKey(modelTestKey), "onechat-"+probeName, usagePath) - memory, err := openMemory(t.Context(), root, newTestClock().Now, newCompactor(client, probePrompt, defaultConfig().Compactor)) + memory, err := openMemory(t.Context(), root, newTestClock().Now, newCompactor(client, probePrompt, defaultConfig().Compactor), discardLog()) require.NoError(t, err) return &ProbeRun{ diff --git a/replay_test.go b/replay_test.go index dfbe615..96091c2 100644 --- a/replay_test.go +++ b/replay_test.go @@ -38,7 +38,7 @@ func TestReplaySyntheticLog(t *testing.T) { root := t.TempDir() clock := newTestClock() random := rand.New(rand.NewPCG(1, 2)) - memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) defer func() { @@ -98,7 +98,7 @@ func replayRequireRestart(t *testing.T, memory *Memory, root string, clock *Test require.NoError(t, err) require.NoError(t, memory.Close()) - memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer()) + memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) require.NoError(t, memory.Wait(t.Context())) require.Equal(t, view, memory.View()) diff --git a/schedule_helper_test.go b/schedule_helper_test.go index ea02ed6..814056c 100644 --- a/schedule_helper_test.go +++ b/schedule_helper_test.go @@ -1,8 +1,6 @@ package main import ( - "io" - "log" "path/filepath" "testing" "time" @@ -14,7 +12,7 @@ import ( func newTestSchedules(t *testing.T, clock func() time.Time) *Schedules { t.Helper() - schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), clock, log.New(io.Discard, "", 0)) + schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), clock, discardLog()) require.NoError(t, err) return schedules diff --git a/schedule_test.go b/schedule_test.go index 85e11d0..96063aa 100644 --- a/schedule_test.go +++ b/schedule_test.go @@ -2,7 +2,6 @@ package main import ( "context" - "io" "log" "os" "path/filepath" @@ -130,7 +129,7 @@ func TestSchedulesSurviveARestart(t *testing.T) { require.NoError(t, err) require.Equal(t, os.FileMode(0o600), info.Mode().Perm()) - reopened, err := openSchedules(path, schedules.clock, log.New(io.Discard, "", 0)) + reopened, err := openSchedules(path, schedules.clock, discardLog()) require.NoError(t, err) require.Equal(t, "2 | Monday 2026-11-09 08:00 -03:00 | 0 8 * * 1-5 | Tell the user the news.", reopened.List()) @@ -232,7 +231,7 @@ func TestOpenSchedulesRefusesABadCron(t *testing.T) { path := filepath.Join(t.TempDir(), scheduleFileName) require.NoError(t, os.WriteFile(path, []byte(`{"next":1,"schedules":[{"id":1,"text":"x","cron":"* * * * *","due":"2026-11-09T09:00:00-03:00"}]}`), 0o600)) - _, err := openSchedules(path, time.Now, log.New(io.Discard, "", 0)) + _, err := openSchedules(path, time.Now, discardLog()) require.ErrorContains(t, err, "schedule 1: the runs of") } @@ -293,7 +292,7 @@ func TestDaemonRunsADueSchedule(t *testing.T) { now: time.Date(2026, time.November, 8, 20, 0, 0, 0, time.FixedZone("", -3*60*60)), } - schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), clock.Now, log.New(io.Discard, "", 0)) + schedules, err := openSchedules(filepath.Join(t.TempDir(), scheduleFileName), clock.Now, discardLog()) require.NoError(t, err) schedules.check = time.Millisecond @@ -360,7 +359,7 @@ func scheduleTestOpen(t *testing.T) (*Schedules, string) { now: time.Date(2026, time.November, 8, 20, 0, 0, 0, time.FixedZone("", -3*60*60)), } - schedules, err := openSchedules(path, clock.Now, log.New(io.Discard, "", 0)) + schedules, err := openSchedules(path, clock.Now, discardLog()) require.NoError(t, err) return schedules, path diff --git a/subagent_run_test.go b/subagent_run_test.go index a59b499..d784b89 100644 --- a/subagent_run_test.go +++ b/subagent_run_test.go @@ -3,7 +3,6 @@ package main import ( "context" "io" - "log" "net/http" "os" "path/filepath" @@ -515,13 +514,13 @@ func subagentTestStart(t *testing.T, agent *Agent, server *ModelFake, events *Tu agent.config.Workdir = t.TempDir() clock := newTestClock() - memory, err := openMemory(t.Context(), agent.dir, clock.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), agent.dir, clock.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) 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, log.New(io.Discard, "", 0), events.Add) + loop, err := newTurnLoop(agent, memory, subagents, whatsapp, newTestSchedules(t, clock.Now), client, clock.Now, discardLog(), events.Add) require.NoError(t, err) ctx, cancel := context.WithCancel(t.Context()) diff --git a/syncer_test.go b/syncer_test.go index 09b2bb4..efa174a 100644 --- a/syncer_test.go +++ b/syncer_test.go @@ -86,7 +86,7 @@ func TestAFailedSyncFailsEachLaterFlush(t *testing.T) { } func TestMemoryFlushSyncsTheChat(t *testing.T) { - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) _, err = memory.Append("tool", "shell: ls") @@ -100,7 +100,7 @@ func TestKilledWriterLosesNoLoggedMessage(t *testing.T) { for round := range 3 { acknowledged := syncerRunKilledWriter(t, root, 200+100*round) - memory, err := openMemory(t.Context(), root, time.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), root, time.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) require.GreaterOrEqual(t, memory.log.Len(), acknowledged) for id := range memory.log.Len() { @@ -124,7 +124,7 @@ func TestWriterChild(t *testing.T) { t.Skip("runs only as a child process") } - memory, err := openMemory(t.Context(), root, time.Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), root, time.Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) for id := memory.log.Len(); ; id++ { diff --git a/tools_test.go b/tools_test.go index dc08fdc..3ab7845 100644 --- a/tools_test.go +++ b/tools_test.go @@ -113,7 +113,7 @@ func TestFileTools(t *testing.T) { } func TestZoomAndDateReadTheChat(t *testing.T) { - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) defer func() { @@ -258,7 +258,7 @@ func (r *ToolRecordingLog) Events() []string { func newTestToolbox(t *testing.T, log ToolLog, dir string) *Toolbox { t.Helper() - memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer()) + memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog()) require.NoError(t, err) t.Cleanup(func() { diff --git a/turn_test.go b/turn_test.go index 3cb15b2..4f29cd4 100644 --- a/turn_test.go +++ b/turn_test.go @@ -387,7 +387,7 @@ func newTestTurnLoopWith(t *testing.T, server *ModelFake, summarizer Summarizer) agent.config.Workdir = t.TempDir() clock := newTestClock() - memory, err := openMemory(t.Context(), t.TempDir(), clock.Now, summarizer) + memory, err := openMemory(t.Context(), t.TempDir(), clock.Now, summarizer, discardLog()) require.NoError(t, err) test := &TurnTestLoop{