From 7ec8583e06ac47daa8214c812c8a3e79af9a9687 Mon Sep 17 00:00:00 2001 From: Ollie Agent Date: Tue, 18 Aug 2026 06:59:35 +0200 Subject: [PATCH] Honor cancellation during compaction streams --- cmd/olliesrv/internal/agent/history.go | 48 ++++++++++++++++++-------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/cmd/olliesrv/internal/agent/history.go b/cmd/olliesrv/internal/agent/history.go index bf38213..e655a57 100644 --- a/cmd/olliesrv/internal/agent/history.go +++ b/cmd/olliesrv/internal/agent/history.go @@ -270,15 +270,25 @@ func (s *History) compact(ctx context.Context, b backend.Backend) (int, string, } var summary strings.Builder - for ev := range ch { - if ev.Content != "" { - summary.WriteString(ev.Content) - } - if ev.Done { - break + for { + select { + case <-ctx.Done(): + return 0, "", ctx.Err() + case ev, ok := <-ch: + if !ok { + return 0, "", fmt.Errorf("compact: stream closed before completion") + } + if ev.Content != "" { + summary.WriteString(ev.Content) + } + if ev.Done { + goto summaryDone + } } } +summaryDone: + summaryText := strings.TrimSpace(summary.String()) if summaryText == "" { return 0, "", fmt.Errorf("compact: empty summary") @@ -571,16 +581,26 @@ func (s *History) stripCold(ctx context.Context, b backend.Backend) (backend.Usa var resp strings.Builder var usage backend.Usage var reported bool - for ev := range ch { - if ev.Content != "" { - resp.WriteString(ev.Content) - } - if ev.Done { - usage = ev.Usage - reported = true - break + for { + select { + case <-ctx.Done(): + return usage, true + case ev, ok := <-ch: + if !ok { + return usage, true + } + if ev.Content != "" { + resp.WriteString(ev.Content) + } + if ev.Done { + usage = ev.Usage + reported = true + goto responseDone + } } } + +responseDone: if !reported { usage.InputTokens = len(sb.String()) / 4 usage.OutputTokens = resp.Len() / 4