From 03b04fa2b17b8b9fc508add4d1013e83a4975cfe Mon Sep 17 00:00:00 2001 From: svetanis Date: Thu, 23 Jul 2026 23:12:23 -0700 Subject: [PATCH] fix(events): accumulate endOfAgent in EventActions.merge to preserve parallel stop requests --- .../java/com/google/adk/events/EventActions.java | 2 +- .../com/google/adk/events/EventActionsTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/google/adk/events/EventActions.java b/core/src/main/java/com/google/adk/events/EventActions.java index c3c921be5..cde23c10e 100644 --- a/core/src/main/java/com/google/adk/events/EventActions.java +++ b/core/src/main/java/com/google/adk/events/EventActions.java @@ -393,7 +393,7 @@ public Builder merge(EventActions other) { other.escalate().ifPresent(this::escalate); this.requestedAuthConfigs.putAll(other.requestedAuthConfigs()); this.requestedToolConfirmations.putAll(other.requestedToolConfirmations()); - this.endOfAgent = other.endOfAgent(); + this.endOfAgent = this.endOfAgent || other.endOfAgent(); other.compaction().ifPresent(this::compaction); return this; } diff --git a/core/src/test/java/com/google/adk/events/EventActionsTest.java b/core/src/test/java/com/google/adk/events/EventActionsTest.java index 4b542c0e9..c5949caf7 100644 --- a/core/src/test/java/com/google/adk/events/EventActionsTest.java +++ b/core/src/test/java/com/google/adk/events/EventActionsTest.java @@ -111,6 +111,20 @@ public void merge_mergesAllFields() { assertThat(merged.compaction()).hasValue(COMPACTION); } + @Test + public void merge_endOfAgentIsOrderIndependent() { + // A tool that ends the invocation, and one that leaves the flag at its default false. Folding + // parallel tool responses must keep endOfAgent set whichever order they are merged in. + EventActions requestsStop = EventActions.builder().endOfAgent(true).build(); + EventActions leavesUnset = EventActions.builder().build(); + + EventActions stopFirst = EventActions.builder().merge(requestsStop).merge(leavesUnset).build(); + EventActions stopLast = EventActions.builder().merge(leavesUnset).merge(requestsStop).build(); + + assertThat(stopFirst.endOfAgent()).isTrue(); + assertThat(stopLast.endOfAgent()).isTrue(); + } + @Test public void setArtifactDelta_copiesRegularMap() { EventActions eventActions = new EventActions();