diff --git a/extensions/whatsapp/src/auto-reply/deliver-reply.ts b/extensions/whatsapp/src/auto-reply/deliver-reply.ts index f1fe0705e39..2a88096e96b 100644 --- a/extensions/whatsapp/src/auto-reply/deliver-reply.ts +++ b/extensions/whatsapp/src/auto-reply/deliver-reply.ts @@ -8,6 +8,7 @@ import { import { logVerbose, shouldLogVerbose } from "openclaw/plugin-sdk/runtime-env"; import { loadWebMedia } from "../media.js"; import { + type DeliverableWhatsAppOutboundPayload, normalizeWhatsAppOutboundPayload, normalizeWhatsAppPayloadTextPreservingIndentation, prepareWhatsAppOutboundMedia, @@ -24,7 +25,7 @@ import { elide } from "./util.js"; export async function deliverWebReply(params: { replyResult: ReplyPayload; - normalizedReplyResult?: ReturnType>; + normalizedReplyResult?: DeliverableWhatsAppOutboundPayload; msg: WebInboundMsg; mediaLocalRoots?: readonly string[]; maxMediaBytes: number; @@ -51,7 +52,9 @@ export async function deliverWebReply(params: { normalizeWhatsAppOutboundPayload(replyResult, { normalizeText: normalizeWhatsAppPayloadTextPreservingIndentation, }); - const convertedText = markdownToWhatsApp(convertMarkdownTables(normalizedReply.text, tableMode)); + const convertedText = markdownToWhatsApp( + convertMarkdownTables(normalizedReply.text ?? "", tableMode), + ); const textChunks = chunkMarkdownTextWithMode(convertedText, textLimit, chunkMode); const mediaList = normalizedReply.mediaUrls ?? []; diff --git a/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts b/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts index 2d8e210ff92..794b8244f52 100644 --- a/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts +++ b/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts @@ -1,5 +1,6 @@ import { resolveMergedWhatsAppAccountConfig } from "../../account-config.js"; import { + type DeliverableWhatsAppOutboundPayload, normalizeWhatsAppOutboundPayload, normalizeWhatsAppPayloadTextPreservingIndentation, } from "../../outbound-media-contract.js"; @@ -250,6 +251,7 @@ export async function dispatchWhatsAppBufferedReply(params: { conversationId: string; deliverReply: (params: { replyResult: ReplyPayload; + normalizedReplyResult?: DeliverableWhatsAppOutboundPayload; msg: WebInboundMsg; mediaLocalRoots: readonly string[]; maxMediaBytes: number; diff --git a/extensions/whatsapp/src/outbound-media-contract.ts b/extensions/whatsapp/src/outbound-media-contract.ts index e01b2eb2d44..8f7cb9de064 100644 --- a/extensions/whatsapp/src/outbound-media-contract.ts +++ b/extensions/whatsapp/src/outbound-media-contract.ts @@ -24,6 +24,22 @@ type WhatsAppLoadedMediaLike = { fileName?: string; }; +export type NormalizedWhatsAppOutboundPayload = Omit< + T, + "text" | "mediaUrl" | "mediaUrls" +> & { + text: string; + mediaUrl?: string; + mediaUrls?: string[]; +}; + +export type DeliverableWhatsAppOutboundPayload = Omit< + NormalizedWhatsAppOutboundPayload, + "text" +> & { + text?: string; +}; + export type CanonicalWhatsAppLoadedMedia = { buffer: Buffer; kind: "image" | "audio" | "video" | "document"; @@ -82,11 +98,7 @@ export function normalizeWhatsAppOutboundPayload string; }, -): Omit & { - text: string; - mediaUrl?: string; - mediaUrls?: string[]; -} { +): NormalizedWhatsAppOutboundPayload { const mediaUrls = resolveWhatsAppOutboundMediaUrls(payload); const normalizeText = options?.normalizeText ?? normalizeWhatsAppPayloadText; return {