From 4aa91b0b97569806439fade624d047d586a6c99d Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 5 May 2026 23:34:08 +0100 Subject: [PATCH] fix: backport media completion fallback --- src/agents/subagent-announce-delivery.test.ts | 4 ++-- src/agents/subagent-announce-delivery.ts | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/agents/subagent-announce-delivery.test.ts b/src/agents/subagent-announce-delivery.test.ts index 83ffc32e83c..97d41ec3687 100644 --- a/src/agents/subagent-announce-delivery.test.ts +++ b/src/agents/subagent-announce-delivery.test.ts @@ -1241,8 +1241,8 @@ describe("deliverSubagentAnnouncement completion delivery", () => { expect(result).toEqual( expect.objectContaining({ - delivered: false, - path: "direct", + delivered: true, + path: "direct-fallback", }), ); expect(callGateway).toHaveBeenCalledWith( diff --git a/src/agents/subagent-announce-delivery.ts b/src/agents/subagent-announce-delivery.ts index da1ff9ec6ee..f44fe6b5668 100644 --- a/src/agents/subagent-announce-delivery.ts +++ b/src/agents/subagent-announce-delivery.ts @@ -893,7 +893,9 @@ async function sendSubagentAnnounceDirectly(params: { }); const shouldDeliverAgentFinal = deliveryTarget.deliver && !requiresMessageToolDelivery; const completionFallbackText = - params.expectsCompletionMessage && shouldDeliverAgentFinal && !agentMediatedCompletion + params.expectsCompletionMessage && + deliveryTarget.deliver && + (!agentMediatedCompletion || requiresMessageToolDelivery) ? extractThreadCompletionFallbackText(params.internalEvents) : ""; const requesterActivity = resolveRequesterSessionActivity(canonicalRequesterSessionKey); @@ -1089,6 +1091,24 @@ async function sendSubagentAnnounceDirectly(params: { requiresMessageToolDelivery && !hasGatewayAgentMessagingToolDelivery(directAnnounceResponse) ) { + const didFallback = await sendCompletionFallback({ + cfg, + channel: deliveryTarget.channel, + to: deliveryTarget.to, + accountId: deliveryTarget.accountId, + threadId: deliveryTarget.threadId, + content: completionFallbackText, + requesterSessionKey: canonicalRequesterSessionKey, + bestEffortDeliver: params.bestEffortDeliver, + idempotencyKey: params.directIdempotencyKey, + signal: params.signal, + }); + if (didFallback) { + return { + delivered: true, + path: resolveCompletionFallbackPath(deliveryTarget.threadId), + }; + } return { delivered: false, path: "direct",