package core import ( "context" "testing" "github.com/bnema/zut/packages/provider" ) type compactLifecycleClient struct { hadLifecycle bool } func (c *compactLifecycleClient) Name() string { return "compact-lifecycle" } func (c *compactLifecycleClient) Stream(_ context.Context, req provider.Request) (<-chan provider.Event, error) { c.hadLifecycle = req.Lifecycle != nil if req.Lifecycle != nil { req.Lifecycle.RequestAttempt(1, 1) } out := make(chan provider.Event, 2) out <- provider.EventTextDelta{Delta: "summary"} out <- provider.EventDone{Stop: provider.StopEnd, Message: provider.Message{ Role: provider.RoleAssistant, Content: []provider.Content{provider.TextBlock{Text: "summary"}}, }} close(out) return out, nil } func TestCompactWithEventsEmitsRequestLifecycle(t *testing.T) { client := &compactLifecycleClient{} agent := NewAgent(client, "compact-model", "system", Registry{}) agent.SetMessages([]provider.Message{{ Role: provider.RoleUser, Content: []provider.Content{provider.TextBlock{Text: "source"}}, }}) var events []AgentEvent summary, err := agent.CompactWithEvents(context.Background(), 0, func(event AgentEvent) { events = append(events, event) }) if err != nil { t.Fatalf("CompactWithEvents: %v", err) } if summary != "summary" { t.Fatalf("summary = %q, want summary", summary) } if !client.hadLifecycle { t.Fatal("compaction request did not receive a lifecycle observer") } if len(events) != 4 { t.Fatalf("events = %#v, want agent request, provider request, assistant start, text delta", events) } agentRequest, ok := events[0].(EvRequestStarted) if !ok || agentRequest.Scope != RetryScopeAgent || agentRequest.Attempt != 1 || agentRequest.MaxAttempts != 1 { t.Fatalf("first event = %#v, want initial agent request", events[0]) } providerRequest, ok := events[1].(EvRequestStarted) if !ok || providerRequest.Scope != RetryScopeProvider || providerRequest.Attempt != 1 || providerRequest.MaxAttempts != 1 { t.Fatalf("second event = %#v, want initial provider request", events[1]) } if _, ok := events[2].(EvAssistantStart); !ok { t.Fatalf("third event = %#v, want assistant start", events[2]) } if delta, ok := events[3].(EvTextDelta); !ok || delta.Delta != "summary" { t.Fatalf("fourth event = %#v, want summary text delta", events[3]) } }