diff --git a/changelog/fragments/pr-feishu-reply-mechanism.md b/changelog/fragments/pr-feishu-reply-mechanism.md index 9d1d1334dd9..f19716c4c7d 100644 --- a/changelog/fragments/pr-feishu-reply-mechanism.md +++ b/changelog/fragments/pr-feishu-reply-mechanism.md @@ -1 +1 @@ -- Feishu/reply mechanism: forward `replyToId` through outbound adapter `sendText`/`sendMedia` to enable reply-to-message via the `message` tool; fix group reply targeting to use the triggering message in normal groups while preserving topic-root replies for topic-mode groups (#32980, #32958). Thanks @guoqunabc. +- Feishu reply routing now uses one canonical reply-target path across inbound and outbound flows: normal groups reply to the triggering message while topic-mode groups stay on topic roots, outbound sends preserve `replyToId`/`threadId`, withdrawn reply targets fall back to direct sends, and cron duplicate suppression normalizes Feishu/Lark target IDs consistently (#32980, #32958, #33572, #33526; #33789, #33575, #33515, #33161). Thanks @guoqunabc, @bmendonca3, @MunemHashmi, and @Jimmy-xuzimo. diff --git a/extensions/feishu/src/send.ts b/extensions/feishu/src/send.ts index 74358eb4049..9a72f780652 100644 --- a/extensions/feishu/src/send.ts +++ b/extensions/feishu/src/send.ts @@ -44,7 +44,7 @@ type FeishuCreateMessageClient = { im: { message: { create: (opts: { - params: { receive_id_type: string }; + params: { receive_id_type: "chat_id" | "email" | "open_id" | "union_id" | "user_id" }; data: { receive_id: string; content: string; msg_type: string }; }) => Promise<{ code?: number; msg?: string; data?: { message_id?: string } }>; }; @@ -54,7 +54,12 @@ type FeishuCreateMessageClient = { /** Send a direct message as a fallback when a reply target is unavailable. */ async function sendFallbackDirect( client: FeishuCreateMessageClient, - params: { receiveId: string; receiveIdType: string; content: string; msgType: string }, + params: { + receiveId: string; + receiveIdType: "chat_id" | "email" | "open_id" | "union_id" | "user_id"; + content: string; + msgType: string; + }, errorPrefix: string, ): Promise { const response = await client.im.message.create({