From 41fc2872a176a0d072877dc11d5f88b61ab9097b Mon Sep 17 00:00:00 2001 From: kakahu Date: Mon, 27 Apr 2026 08:08:51 +0800 Subject: [PATCH] Fix Matrix approval metadata delivery fallback --- .../matrix/src/approval-handler.runtime.ts | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/extensions/matrix/src/approval-handler.runtime.ts b/extensions/matrix/src/approval-handler.runtime.ts index ee743c92d5e..f9e2173a730 100644 --- a/extensions/matrix/src/approval-handler.runtime.ts +++ b/extensions/matrix/src/approval-handler.runtime.ts @@ -71,6 +71,7 @@ type MatrixPrepareTargetParams = { export type MatrixApprovalHandlerDeps = { nowMs?: () => number; sendMessage?: typeof sendMessageMatrix; + sendSingleTextMessage?: typeof sendSingleTextMessageMatrix; reactMessage?: typeof reactMatrixMessage; editMessage?: typeof editMatrixMessage; deleteMessage?: typeof deleteMatrixMessage; @@ -112,6 +113,10 @@ function normalizeThreadId(value?: string | number | null): string | undefined { return trimmed || undefined; } +function isSingleMatrixMessageLimitError(error: unknown): boolean { + return error instanceof Error && error.message.includes("Matrix single-message text exceeds limit"); +} + async function prepareTarget( params: MatrixPrepareTargetParams, ): Promise { @@ -355,22 +360,30 @@ export const matrixApprovalNativeRuntime = createChannelApprovalNativeRuntimeAda if (!resolved) { return null; } - const sendMessage = resolved.context.deps?.sendMessage; + const sendSingleTextMessage = + resolved.context.deps?.sendSingleTextMessage ?? sendSingleTextMessageMatrix; const reactMessage = resolved.context.deps?.reactMessage ?? reactMatrixMessage; - const result = sendMessage - ? await sendMessage(preparedTarget.to, pendingPayload.text, { - cfg: cfg as CoreConfig, - accountId: resolved.accountId, - client: resolved.context.client, - threadId: preparedTarget.threadId, - }) - : await sendSingleTextMessageMatrix(preparedTarget.to, pendingPayload.text, { - cfg: cfg as CoreConfig, - accountId: resolved.accountId, - client: resolved.context.client, - threadId: preparedTarget.threadId, - extraContent: pendingPayload.extraContent, - }); + let result; + try { + result = await sendSingleTextMessage(preparedTarget.to, pendingPayload.text, { + cfg: cfg as CoreConfig, + accountId: resolved.accountId, + client: resolved.context.client, + threadId: preparedTarget.threadId, + extraContent: pendingPayload.extraContent, + }); + } catch (error) { + if (!isSingleMatrixMessageLimitError(error)) { + throw error; + } + const sendMessage = resolved.context.deps?.sendMessage ?? sendMessageMatrix; + result = await sendMessage(preparedTarget.to, pendingPayload.text, { + cfg: cfg as CoreConfig, + accountId: resolved.accountId, + client: resolved.context.client, + threadId: preparedTarget.threadId, + }); + } const messageIds = Array.from( new Set( (result.messageIds ?? [result.messageId])