From 4a3abb78ebd69611759cc9bbc8ab5d86903df4b7 Mon Sep 17 00:00:00 2001 From: kakahu Date: Sat, 9 May 2026 14:17:18 +0800 Subject: [PATCH] fix(matrix): consume implicit reply once in payload media fanout --- extensions/matrix/src/outbound.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/extensions/matrix/src/outbound.ts b/extensions/matrix/src/outbound.ts index ea07cbb159f..90558b7688b 100644 --- a/extensions/matrix/src/outbound.ts +++ b/extensions/matrix/src/outbound.ts @@ -2,6 +2,7 @@ import { renderMessagePresentationFallbackText, type MessagePresentation, } from "openclaw/plugin-sdk/interactive-runtime"; +import { createReplyToFanout } from "openclaw/plugin-sdk/outbound-runtime"; import { resolvePayloadMediaUrls } from "openclaw/plugin-sdk/reply-payload"; import type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime"; import { sendMessageMatrix, sendPollMatrix } from "./matrix/send.js"; @@ -90,6 +91,8 @@ export const matrixOutbound: ChannelOutboundAdapter = { mediaAccess, deps, replyToId, + replyToIdSource, + replyToMode, threadId, accountId, audioAsVoice, @@ -99,6 +102,11 @@ export const matrixOutbound: ChannelOutboundAdapter = { const resolvedThreadId = threadId !== undefined && threadId !== null ? String(threadId) : undefined; const resolvedReplyToId = replyToId ?? undefined; + const resolveReplyToId = createReplyToFanout({ + replyToId: resolvedReplyToId, + replyToIdSource, + replyToMode, + }); const urls = resolvePayloadMediaUrls(payload); if (urls.length > 0) { let lastResult: Awaited> | undefined; @@ -110,7 +118,7 @@ export const matrixOutbound: ChannelOutboundAdapter = { mediaAccess, mediaLocalRoots, mediaReadFile, - replyToId: resolvedReplyToId, + replyToId: resolveReplyToId(), threadId: resolvedThreadId, accountId: accountId ?? undefined, audioAsVoice: payload.audioAsVoice ?? audioAsVoice, @@ -129,7 +137,7 @@ export const matrixOutbound: ChannelOutboundAdapter = { mediaAccess, mediaLocalRoots, mediaReadFile, - replyToId: resolvedReplyToId, + replyToId: resolveReplyToId(), threadId: resolvedThreadId, accountId: accountId ?? undefined, audioAsVoice: payload.audioAsVoice ?? audioAsVoice,