@openclaw/feishu 2026.5.10-beta.1 → 2026.5.10-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-DUslC3ob.js";
2
- import { isRecord, normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/text-runtime";
2
+ import { isRecord, normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { DEFAULT_ACCOUNT_ID, createAccountListHelpers, normalizeAccountId, normalizeOptionalAccountId, resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-resolution";
4
4
  import { coerceSecretRef } from "openclaw/plugin-sdk/provider-auth";
5
5
  //#region extensions/feishu/src/comment-target.ts
package/dist/api.js CHANGED
@@ -1,11 +1,11 @@
1
- import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DWS3Ep2A.js";
2
- import { n as createFeishuThreadBindingManager, r as getFeishuThreadBindingManager, t as __testing } from "./thread-bindings-BmS6TLes.js";
3
- import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-C3UhPVLV.js";
4
- import { r as listEnabledFeishuAccounts } from "./accounts-Ba3-WP1z.js";
5
- import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-DCSECj4a.js";
1
+ import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-Byq1c20x.js";
2
+ import { n as createFeishuThreadBindingManager, r as getFeishuThreadBindingManager, t as __testing } from "./thread-bindings-D5kDxq_j.js";
3
+ import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-BUPKo9Al.js";
4
+ import { r as listEnabledFeishuAccounts } from "./accounts-CP4tDW-z.js";
5
+ import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-B8MvcN0A.js";
6
6
  import { t as getFeishuRuntime } from "./runtime-CG0DuRCy.js";
7
- import { a as jsonToolResult, d as registerFeishuChatTools, f as createFeishuToolClient, m as resolveFeishuToolAccount, n as registerFeishuDriveTools, o as toolExecutionErrorResult, p as resolveAnyEnabledFeishuToolsConfig, s as unknownToolActionResult } from "./drive-C5eJLJr7.js";
8
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/text-runtime";
7
+ import { a as jsonToolResult, d as registerFeishuChatTools, f as createFeishuToolClient, m as resolveFeishuToolAccount, n as registerFeishuDriveTools, o as toolExecutionErrorResult, p as resolveAnyEnabledFeishuToolsConfig, s as unknownToolActionResult } from "./drive-BocW3yO6.js";
8
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { existsSync } from "node:fs";
10
10
  import { homedir } from "node:os";
11
11
  import { basename, isAbsolute, resolve } from "node:path";
@@ -628,6 +628,7 @@ function cleanBlocksForInsert(blocks) {
628
628
  skipped
629
629
  };
630
630
  }
631
+ /** Max blocks per documentBlockChildren.create request */
631
632
  const MAX_CONVERT_RETRY_DEPTH = 8;
632
633
  async function convertMarkdown(client, markdown) {
633
634
  const res = await client.docx.document.convert({ data: {
@@ -1,14 +1,14 @@
1
- import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DWS3Ep2A.js";
2
- import { n as looksLikeFeishuId, r as normalizeFeishuTarget } from "./targets-JMFJRKSe.js";
3
- import { a as resolveDefaultFeishuAccountId, f as isRecord$1, i as listFeishuAccountIds, n as inspectFeishuCredentials, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-Ba3-WP1z.js";
4
- import { n as createFeishuSendReceipt } from "./send-result-BVFTskB_.js";
5
- import { n as listFeishuDirectoryPeers, t as listFeishuDirectoryGroups } from "./directory.static-f3EeoRJd.js";
1
+ import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-Byq1c20x.js";
2
+ import { n as looksLikeFeishuId, r as normalizeFeishuTarget } from "./targets-Bb05cFr4.js";
3
+ import { a as resolveDefaultFeishuAccountId, f as isRecord$1, i as listFeishuAccountIds, n as inspectFeishuCredentials, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-CP4tDW-z.js";
4
+ import { n as createFeishuSendReceipt } from "./send-result-zZZOR3qT.js";
5
+ import { n as listFeishuDirectoryPeers, t as listFeishuDirectoryGroups } from "./directory.static-DqfUoZrD.js";
6
6
  import { t as messageActionTargetAliases } from "./security-audit-DqJdocrN.js";
7
- import { o as resolveFeishuGroupToolPolicy } from "./policy-DrLgxWF_.js";
7
+ import { o as resolveFeishuGroupToolPolicy } from "./policy-iDTxfTYv.js";
8
8
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-Dm4Z_zQN.js";
9
9
  import { t as collectFeishuSecurityAuditFindings } from "./security-audit-shared-ByuMx9cJ.js";
10
- import { t as resolveFeishuSessionConversation } from "./session-conversation-B4nrW-vo.js";
11
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime";
10
+ import { t as resolveFeishuSessionConversation } from "./session-conversation-BulT2OKc.js";
11
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
12
12
  import { getSessionBindingService } from "openclaw/plugin-sdk/conversation-runtime";
13
13
  import { describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
14
14
  import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from";
@@ -29,7 +29,7 @@ import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-pri
29
29
  import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
30
30
  import { chunkTextForOutbound } from "openclaw/plugin-sdk/text-chunking";
31
31
  import { normalizeAccountId as normalizeAccountId$1 } from "openclaw/plugin-sdk/account-id";
32
- import { z } from "openclaw/plugin-sdk/zod";
32
+ import { z } from "zod";
33
33
  import { buildSecretInputSchema, hasConfiguredSecretInput as hasConfiguredSecretInput$2 } from "openclaw/plugin-sdk/secret-input";
34
34
  import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, formatDocsLink, hasConfiguredSecretInput as hasConfiguredSecretInput$1, mergeAllowFromEntries, patchTopLevelChannelConfigSection, promptSingleChannelSecretInput, splitSetupEntries } from "openclaw/plugin-sdk/setup";
35
35
  //#region extensions/feishu/src/approval-auth.ts
@@ -811,7 +811,7 @@ const meta = {
811
811
  aliases: ["lark"],
812
812
  order: 70
813
813
  };
814
- const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-BlDkd6xR.js"), "feishuChannelRuntime");
814
+ const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-Bt1Lk06Y.js"), "feishuChannelRuntime");
815
815
  function toFeishuMessageSendResult(result, kind) {
816
816
  const receipt = result.receipt ?? createFeishuSendReceipt({
817
817
  messageId: result.messageId,
@@ -1654,7 +1654,7 @@ const feishuPlugin = createChatChannelPlugin({
1654
1654
  })
1655
1655
  }),
1656
1656
  gateway: { startAccount: async (ctx) => {
1657
- const { monitorFeishuProvider } = await import("./monitor-BnbCJWIU.js");
1657
+ const { monitorFeishuProvider } = await import("./monitor-CRLokwPT.js");
1658
1658
  const account = resolveFeishuRuntimeAccount({
1659
1659
  cfg: ctx.cfg,
1660
1660
  accountId: ctx.accountId
@@ -1,2 +1,2 @@
1
- import { t as feishuPlugin } from "./channel-DCSECj4a.js";
1
+ import { t as feishuPlugin } from "./channel-B8MvcN0A.js";
2
2
  export { feishuPlugin };
@@ -1,12 +1,12 @@
1
- import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount, y as parseFeishuCommentTarget } from "./accounts-Ba3-WP1z.js";
2
- import { s as createFeishuCardInteractionEnvelope } from "./send-result-BVFTskB_.js";
3
- import { n as listFeishuDirectoryPeers, t as listFeishuDirectoryGroups } from "./directory.static-f3EeoRJd.js";
1
+ import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount, y as parseFeishuCommentTarget } from "./accounts-CP4tDW-z.js";
2
+ import { s as createFeishuCardInteractionEnvelope } from "./send-result-zZZOR3qT.js";
3
+ import { n as listFeishuDirectoryPeers, t as listFeishuDirectoryGroups } from "./directory.static-DqfUoZrD.js";
4
4
  import { r as createFeishuClient } from "./client-DBVoQL5w.js";
5
- import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-C5eJLJr7.js";
5
+ import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-BocW3yO6.js";
6
6
  import { chunkTextForOutbound } from "./runtime-api.js";
7
- import { a as sendCardFeishu, c as sendStructuredCardFeishu, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, n as getMessageFeishu, o as sendMarkdownCardFeishu, s as sendMessageFeishu, t as editMessageFeishu } from "./send-DKHEQrzH.js";
7
+ import { a as sendCardFeishu, c as sendStructuredCardFeishu, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, n as getMessageFeishu, o as sendMarkdownCardFeishu, s as sendMessageFeishu, t as editMessageFeishu } from "./send-DiFpqzBJ.js";
8
8
  import { t as probeFeishu } from "./probe-BNzzU_uR.js";
9
- import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime";
9
+ import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
10
10
  import { interactiveReplyToPresentation, normalizeInteractiveReply, normalizeMessagePresentation, renderMessagePresentationFallbackText, resolveInteractiveTextFallback } from "openclaw/plugin-sdk/interactive-runtime";
11
11
  import path from "node:path";
12
12
  import { attachChannelToResult, createAttachedChannelResultAdapter } from "openclaw/plugin-sdk/channel-send-result";
@@ -1,5 +1,5 @@
1
- import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DWS3Ep2A.js";
2
- import { n as createFeishuThreadBindingManager, t as __testing } from "./thread-bindings-BmS6TLes.js";
1
+ import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-Byq1c20x.js";
2
+ import { n as createFeishuThreadBindingManager, t as __testing } from "./thread-bindings-D5kDxq_j.js";
3
3
  import { t as messageActionTargetAliases } from "./security-audit-DqJdocrN.js";
4
4
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-Dm4Z_zQN.js";
5
5
  import { t as collectFeishuSecurityAuditFindings } from "./security-audit-shared-ByuMx9cJ.js";
@@ -1,4 +1,4 @@
1
- import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime";
1
+ import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
2
2
  //#region extensions/feishu/src/conversation-id.ts
3
3
  function normalizeText(value) {
4
4
  if (typeof value !== "string") return;
@@ -1,5 +1,5 @@
1
- import { r as normalizeFeishuTarget } from "./targets-JMFJRKSe.js";
2
- import { o as resolveFeishuAccount } from "./accounts-Ba3-WP1z.js";
1
+ import { r as normalizeFeishuTarget } from "./targets-Bb05cFr4.js";
2
+ import { o as resolveFeishuAccount } from "./accounts-CP4tDW-z.js";
3
3
  import { listDirectoryGroupEntriesFromMapKeysAndAllowFrom, listDirectoryUserEntriesFromAllowFromAndMapKeys } from "openclaw/plugin-sdk/directory-runtime";
4
4
  //#region extensions/feishu/src/directory.static.ts
5
5
  function toFeishuDirectoryPeers(ids) {
@@ -1,6 +1,6 @@
1
- import { d as formatFeishuApiError, f as isRecord$1, h as readString, i as listFeishuAccountIds, l as encodeQuery, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount, u as extractReplyText, y as parseFeishuCommentTarget } from "./accounts-Ba3-WP1z.js";
1
+ import { d as formatFeishuApiError, f as isRecord$1, h as readString, i as listFeishuAccountIds, l as encodeQuery, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount, u as extractReplyText, y as parseFeishuCommentTarget } from "./accounts-CP4tDW-z.js";
2
2
  import { r as createFeishuClient } from "./client-DBVoQL5w.js";
3
- import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
3
+ import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
5
5
  import { Type } from "typebox";
6
6
  //#region extensions/feishu/src/tools-config.ts
@@ -1,9 +1,9 @@
1
- import { r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-Ba3-WP1z.js";
2
- import { l as fetchBotIdentityForMonitor } from "./monitor.state-DYM02ipp.js";
1
+ import { r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-CP4tDW-z.js";
2
+ import { l as fetchBotIdentityForMonitor } from "./monitor.state-D1WkvOGG.js";
3
3
  //#region extensions/feishu/src/monitor.ts
4
4
  let monitorAccountRuntimePromise;
5
5
  async function loadMonitorAccountRuntime() {
6
- monitorAccountRuntimePromise ??= import("./monitor.account-88yMtLAU.js");
6
+ monitorAccountRuntimePromise ??= import("./monitor.account-DfYwuKno.js");
7
7
  return await monitorAccountRuntimePromise;
8
8
  }
9
9
  async function monitorFeishuProvider(opts = {}) {
@@ -1,21 +1,22 @@
1
- import { t as buildFeishuConversationId } from "./conversation-id-DWS3Ep2A.js";
2
- import { i as resolveReceiveIdType } from "./targets-JMFJRKSe.js";
3
- import { n as createFeishuThreadBindingManager } from "./thread-bindings-BmS6TLes.js";
4
- import { _ as buildFeishuCommentTarget, f as isRecord$3, h as readString$2, l as encodeQuery, m as parseCommentContentElements, p as normalizeString, s as resolveFeishuRuntimeAccount, u as extractReplyText, v as normalizeCommentFileType } from "./accounts-Ba3-WP1z.js";
5
- import { c as decodeFeishuCardAction, o as buildFeishuCardActionTextFallback, s as createFeishuCardInteractionEnvelope } from "./send-result-BVFTskB_.js";
6
- import { a as resolveFeishuGroupSenderActivationIngressAccess, i as resolveFeishuGroupConversationIngressAccess, n as resolveFeishuDmIngressAccess, r as resolveFeishuGroupConfig, s as resolveFeishuReplyPolicy, t as hasExplicitFeishuGroupConfig } from "./policy-DrLgxWF_.js";
1
+ import { t as buildFeishuConversationId } from "./conversation-id-Byq1c20x.js";
2
+ import { i as resolveReceiveIdType } from "./targets-Bb05cFr4.js";
3
+ import { n as createFeishuThreadBindingManager } from "./thread-bindings-D5kDxq_j.js";
4
+ import { _ as buildFeishuCommentTarget, f as isRecord$3, h as readString$2, l as encodeQuery, m as parseCommentContentElements, p as normalizeString, s as resolveFeishuRuntimeAccount, u as extractReplyText, v as normalizeCommentFileType } from "./accounts-CP4tDW-z.js";
5
+ import { c as decodeFeishuCardAction, o as buildFeishuCardActionTextFallback, s as createFeishuCardInteractionEnvelope } from "./send-result-zZZOR3qT.js";
6
+ import { a as resolveFeishuGroupSenderActivationIngressAccess, i as resolveFeishuGroupConversationIngressAccess, n as resolveFeishuDmIngressAccess, r as resolveFeishuGroupConfig, s as resolveFeishuReplyPolicy, t as hasExplicitFeishuGroupConfig } from "./policy-iDTxfTYv.js";
7
7
  import { t as getFeishuRuntime } from "./runtime-CG0DuRCy.js";
8
8
  import { a as getFeishuUserAgent, i as createFeishuWSClient, n as createEventDispatcher, r as createFeishuClient } from "./client-DBVoQL5w.js";
9
- import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-C5eJLJr7.js";
9
+ import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-BocW3yO6.js";
10
10
  import { buildAgentMediaPayload, createReplyPrefixContext, evaluateSupplementalContextVisibility, loadSessionStore, normalizeAgentId as normalizeAgentId$1, resolveChannelContextVisibilityMode, resolveSessionStoreEntry } from "./runtime-api.js";
11
- import { _ as normalizeFeishuExternalKey, a as sendCardFeishu, c as sendStructuredCardFeishu, d as isFeishuBroadcastMention, f as isMentionForwardRequest, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, l as parsePostContent, m as downloadMessageResourceFeishu, n as getMessageFeishu, p as isFeishuGroupChatType, r as listFeishuThreadMessages, s as sendMessageFeishu, u as extractMentionTargets } from "./send-DKHEQrzH.js";
11
+ import { _ as normalizeFeishuExternalKey, a as sendCardFeishu, c as sendStructuredCardFeishu, d as isFeishuBroadcastMention, f as isMentionForwardRequest, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, l as parsePostContent, m as downloadMessageResourceFeishu, n as getMessageFeishu, p as isFeishuGroupChatType, r as listFeishuThreadMessages, s as sendMessageFeishu, u as extractMentionTargets } from "./send-DiFpqzBJ.js";
12
12
  import { i as waitForAbortableDelay, r as raceWithTimeoutAndAbort } from "./probe-BNzzU_uR.js";
13
- import { a as feishuWebhookRateLimiter, c as wsClients, i as botOpenIds, l as fetchBotIdentityForMonitor, n as FEISHU_WEBHOOK_MAX_BODY_BYTES, o as httpServers, r as botNames, s as recordWebhookStatus, t as FEISHU_WEBHOOK_BODY_TIMEOUT_MS } from "./monitor.state-DYM02ipp.js";
14
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, stripReasoningTagsFromText } from "openclaw/plugin-sdk/text-runtime";
13
+ import { a as feishuWebhookRateLimiter, c as wsClients, i as botOpenIds, l as fetchBotIdentityForMonitor, n as FEISHU_WEBHOOK_MAX_BODY_BYTES, o as httpServers, r as botNames, s as recordWebhookStatus, t as FEISHU_WEBHOOK_BODY_TIMEOUT_MS } from "./monitor.state-D1WkvOGG.js";
14
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
15
15
  import { ensureConfiguredBindingRouteReady, resolveConfiguredBindingRoute, resolveRuntimeConversationBindingRoute } from "openclaw/plugin-sdk/conversation-runtime";
16
16
  import { createChannelMessageReplyPipeline } from "openclaw/plugin-sdk/channel-message";
17
17
  import { createChannelPairingController, createChannelPairingController as createChannelPairingController$1 } from "openclaw/plugin-sdk/channel-pairing";
18
18
  import { resolveAgentOutboundIdentity } from "openclaw/plugin-sdk/outbound-runtime";
19
+ import { stripReasoningTagsFromText } from "openclaw/plugin-sdk/text-chunking";
19
20
  import fs from "node:fs";
20
21
  import os from "node:os";
21
22
  import path from "node:path";
@@ -1203,7 +1204,9 @@ function createFeishuReplyDispatcher(params) {
1203
1204
  const core = getFeishuRuntime();
1204
1205
  const { cfg, agentId, chatId, replyToMessageId, skipReplyToInMessages, replyInThread, threadReply, rootId, accountId, identity } = params;
1205
1206
  const sendReplyToMessageId = skipReplyToInMessages ? void 0 : replyToMessageId;
1206
- const effectiveReplyInThread = threadReply === true ? true : replyInThread;
1207
+ const threadReplyMode = threadReply === true;
1208
+ const effectiveReplyInThread = threadReplyMode ? true : replyInThread;
1209
+ const allowTopLevelReplyFallback = effectiveReplyInThread === true && threadReplyMode && rootId !== void 0 && sendReplyToMessageId !== void 0 && sendReplyToMessageId !== rootId;
1207
1210
  const account = resolveFeishuRuntimeAccount({
1208
1211
  cfg,
1209
1212
  accountId
@@ -1414,6 +1417,7 @@ function createFeishuReplyDispatcher(params) {
1414
1417
  text: chunk,
1415
1418
  replyToMessageId: sendReplyToMessageId,
1416
1419
  replyInThread: effectiveReplyInThread,
1420
+ allowTopLevelReplyFallback,
1417
1421
  accountId
1418
1422
  });
1419
1423
  }
@@ -1434,6 +1438,7 @@ function createFeishuReplyDispatcher(params) {
1434
1438
  text: chunk,
1435
1439
  replyToMessageId: sendReplyToMessageId,
1436
1440
  replyInThread: effectiveReplyInThread,
1441
+ allowTopLevelReplyFallback,
1437
1442
  accountId
1438
1443
  });
1439
1444
  }
@@ -1508,6 +1513,7 @@ function createFeishuReplyDispatcher(params) {
1508
1513
  text: chunk,
1509
1514
  replyToMessageId: sendReplyToMessageId,
1510
1515
  replyInThread: effectiveReplyInThread,
1516
+ allowTopLevelReplyFallback,
1511
1517
  accountId,
1512
1518
  header: cardHeader,
1513
1519
  note: cardNote
@@ -1525,6 +1531,7 @@ function createFeishuReplyDispatcher(params) {
1525
1531
  text: chunk,
1526
1532
  replyToMessageId: sendReplyToMessageId,
1527
1533
  replyInThread: effectiveReplyInThread,
1534
+ allowTopLevelReplyFallback,
1528
1535
  accountId
1529
1536
  });
1530
1537
  }
@@ -3830,7 +3837,7 @@ async function resolveDriveCommentEventCore(params) {
3830
3837
  return null;
3831
3838
  }
3832
3839
  const context = await fetchDriveCommentContext({
3833
- client: createClient ? createClient(account ?? { accountId }) : createFeishuClient((await import("./accounts-Ba3-WP1z.js").then((n) => n.t)).resolveFeishuAccount({
3840
+ client: createClient ? createClient(account ?? { accountId }) : createFeishuClient((await import("./accounts-CP4tDW-z.js").then((n) => n.t)).resolveFeishuAccount({
3834
3841
  cfg,
3835
3842
  accountId
3836
3843
  })),
@@ -4772,7 +4779,7 @@ async function resolveReactionSyntheticEvent(params) {
4772
4779
  const senderId = event.user_id?.open_id;
4773
4780
  const senderUserId = event.user_id?.user_id;
4774
4781
  if (!emoji || !messageId || !senderId) return null;
4775
- const { resolveFeishuAccount } = await import("./accounts-Ba3-WP1z.js").then((n) => n.t);
4782
+ const { resolveFeishuAccount } = await import("./accounts-CP4tDW-z.js").then((n) => n.t);
4776
4783
  const reactionNotifications = resolveFeishuAccount({
4777
4784
  cfg,
4778
4785
  accountId
@@ -1,5 +1,5 @@
1
1
  import { t as probeFeishu } from "./probe-BNzzU_uR.js";
2
- import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime";
2
+ import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { WEBHOOK_ANOMALY_COUNTER_DEFAULTS, WEBHOOK_RATE_LIMIT_DEFAULTS, createFixedWindowRateLimiter, createWebhookAnomalyTracker } from "openclaw/plugin-sdk/webhook-ingress";
4
4
  //#region extensions/feishu/src/monitor.startup.ts
5
5
  const FEISHU_STARTUP_BOT_INFO_TIMEOUT_DEFAULT_MS = 3e4;
@@ -1,5 +1,5 @@
1
- import { t as detectIdType } from "./targets-JMFJRKSe.js";
2
- import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime";
1
+ import { t as detectIdType } from "./targets-Bb05cFr4.js";
2
+ import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { normalizeAccountId, resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-resolution";
4
4
  import { createChannelIngressResolver, defineStableChannelIngressIdentity } from "openclaw/plugin-sdk/channel-ingress-runtime";
5
5
  //#region extensions/feishu/src/policy.ts
@@ -1,9 +1,10 @@
1
- import { i as resolveReceiveIdType, r as normalizeFeishuTarget } from "./targets-JMFJRKSe.js";
2
- import { c as createFeishuApiError, f as isRecord$2, g as requestFeishuApi, s as resolveFeishuRuntimeAccount } from "./accounts-Ba3-WP1z.js";
3
- import { i as toFeishuSendResult, r as resolveFeishuReceiptKind, t as assertFeishuMessageApiSuccess } from "./send-result-BVFTskB_.js";
1
+ import { i as resolveReceiveIdType, r as normalizeFeishuTarget } from "./targets-Bb05cFr4.js";
2
+ import { c as createFeishuApiError, f as isRecord$2, g as requestFeishuApi, s as resolveFeishuRuntimeAccount } from "./accounts-CP4tDW-z.js";
3
+ import { i as toFeishuSendResult, r as resolveFeishuReceiptKind, t as assertFeishuMessageApiSuccess } from "./send-result-zZZOR3qT.js";
4
4
  import { t as getFeishuRuntime } from "./runtime-CG0DuRCy.js";
5
5
  import { r as createFeishuClient } from "./client-DBVoQL5w.js";
6
- import { convertMarkdownTables, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime";
6
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
+ import { convertMarkdownTables } from "openclaw/plugin-sdk/text-chunking";
7
8
  import fs from "node:fs";
8
9
  import path from "node:path";
9
10
  import { mediaKindFromMime } from "openclaw/plugin-sdk/media-mime";
@@ -836,7 +837,7 @@ async function sendFallbackDirect(client, params, errorPrefix) {
836
837
  }
837
838
  async function sendReplyOrFallbackDirect(client, params) {
838
839
  if (!params.replyToMessageId) return sendFallbackDirect(client, params.directParams, params.directErrorPrefix);
839
- const threadReplyFallbackError = params.replyInThread ? /* @__PURE__ */ new Error("Feishu thread reply failed: reply target is unavailable and cannot safely fall back to a top-level send.") : null;
840
+ const replyTargetFallbackError = params.replyInThread && params.allowTopLevelReplyFallback !== true ? /* @__PURE__ */ new Error("Feishu thread reply failed: reply target is unavailable and cannot safely fall back to a top-level send.") : null;
840
841
  let response;
841
842
  try {
842
843
  response = await client.im.message.reply({
@@ -849,11 +850,11 @@ async function sendReplyOrFallbackDirect(client, params) {
849
850
  });
850
851
  } catch (err) {
851
852
  if (!isWithdrawnReplyError(err)) throw createFeishuApiError(err, params.replyErrorPrefix, { includeNestedErrorLogId: true });
852
- if (threadReplyFallbackError) throw threadReplyFallbackError;
853
+ if (replyTargetFallbackError) throw replyTargetFallbackError;
853
854
  return sendFallbackDirect(client, params.directParams, params.directErrorPrefix);
854
855
  }
855
856
  if (shouldFallbackFromReplyTarget(response)) {
856
- if (threadReplyFallbackError) throw threadReplyFallbackError;
857
+ if (replyTargetFallbackError) throw replyTargetFallbackError;
857
858
  return sendFallbackDirect(client, params.directParams, params.directErrorPrefix);
858
859
  }
859
860
  assertFeishuMessageApiSuccess(response, params.replyErrorPrefix);
@@ -1029,7 +1030,7 @@ function buildFeishuPostMessagePayload(params) {
1029
1030
  };
1030
1031
  }
1031
1032
  async function sendMessageFeishu(params) {
1032
- const { cfg, to, text, replyToMessageId, replyInThread, mentions, accountId } = params;
1033
+ const { cfg, to, text, replyToMessageId, replyInThread, allowTopLevelReplyFallback, mentions, accountId } = params;
1033
1034
  const { client, receiveId, receiveIdType } = resolveFeishuSendTarget({
1034
1035
  cfg,
1035
1036
  to,
@@ -1045,6 +1046,7 @@ async function sendMessageFeishu(params) {
1045
1046
  return sendReplyOrFallbackDirect(client, {
1046
1047
  replyToMessageId,
1047
1048
  replyInThread,
1049
+ allowTopLevelReplyFallback,
1048
1050
  content,
1049
1051
  msgType,
1050
1052
  directParams: {
@@ -1058,7 +1060,7 @@ async function sendMessageFeishu(params) {
1058
1060
  });
1059
1061
  }
1060
1062
  async function sendCardFeishu(params) {
1061
- const { cfg, to, card, replyToMessageId, replyInThread, accountId } = params;
1063
+ const { cfg, to, card, replyToMessageId, replyInThread, allowTopLevelReplyFallback, accountId } = params;
1062
1064
  const { client, receiveId, receiveIdType } = resolveFeishuSendTarget({
1063
1065
  cfg,
1064
1066
  to,
@@ -1068,6 +1070,7 @@ async function sendCardFeishu(params) {
1068
1070
  return sendReplyOrFallbackDirect(client, {
1069
1071
  replyToMessageId,
1070
1072
  replyInThread,
1073
+ allowTopLevelReplyFallback,
1071
1074
  content,
1072
1075
  msgType: "interactive",
1073
1076
  directParams: {
@@ -1169,7 +1172,7 @@ function buildStructuredCard(text, options) {
1169
1172
  * Send a message as a structured card with optional header and note.
1170
1173
  */
1171
1174
  async function sendStructuredCardFeishu(params) {
1172
- const { cfg, to, text, replyToMessageId, replyInThread, mentions, accountId, header, note } = params;
1175
+ const { cfg, to, text, replyToMessageId, replyInThread, allowTopLevelReplyFallback, mentions, accountId, header, note } = params;
1173
1176
  let cardText = text;
1174
1177
  if (mentions && mentions.length > 0) cardText = buildMentionedCardContent(mentions, text);
1175
1178
  return sendCardFeishu({
@@ -1181,6 +1184,7 @@ async function sendStructuredCardFeishu(params) {
1181
1184
  }),
1182
1185
  replyToMessageId,
1183
1186
  replyInThread,
1187
+ allowTopLevelReplyFallback,
1184
1188
  accountId
1185
1189
  });
1186
1190
  }
@@ -1189,7 +1193,7 @@ async function sendStructuredCardFeishu(params) {
1189
1193
  * This renders markdown properly in Feishu (code blocks, tables, bold/italic, etc.)
1190
1194
  */
1191
1195
  async function sendMarkdownCardFeishu(params) {
1192
- const { cfg, to, text, replyToMessageId, replyInThread, mentions, accountId } = params;
1196
+ const { cfg, to, text, replyToMessageId, replyInThread, allowTopLevelReplyFallback, mentions, accountId } = params;
1193
1197
  let cardText = text;
1194
1198
  if (mentions && mentions.length > 0) cardText = buildMentionedCardContent(mentions, text);
1195
1199
  return sendCardFeishu({
@@ -1198,6 +1202,7 @@ async function sendMarkdownCardFeishu(params) {
1198
1202
  card: buildMarkdownCard(cardText),
1199
1203
  replyToMessageId,
1200
1204
  replyInThread,
1205
+ allowTopLevelReplyFallback,
1201
1206
  accountId
1202
1207
  });
1203
1208
  }
@@ -1,4 +1,4 @@
1
- import { f as isRecord } from "./accounts-Ba3-WP1z.js";
1
+ import { f as isRecord } from "./accounts-CP4tDW-z.js";
2
2
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-message";
3
3
  //#region extensions/feishu/src/card-interaction.ts
4
4
  const FEISHU_CARD_INTERACTION_VERSION = "ocf1";
@@ -1,4 +1,4 @@
1
- import { r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DWS3Ep2A.js";
1
+ import { r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-Byq1c20x.js";
2
2
  //#region extensions/feishu/src/session-conversation.ts
3
3
  function resolveFeishuParentConversationCandidates(rawId) {
4
4
  const parsed = parseFeishuConversationId({ conversationId: rawId });
@@ -1,2 +1,2 @@
1
- import { t as resolveFeishuSessionConversation } from "./session-conversation-B4nrW-vo.js";
1
+ import { t as resolveFeishuSessionConversation } from "./session-conversation-BulT2OKc.js";
2
2
  export { resolveFeishuSessionConversation as resolveSessionConversation };
package/dist/setup-api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-DCSECj4a.js";
1
+ import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-B8MvcN0A.js";
2
2
  export { feishuPlugin, feishuSetupAdapter, feishuSetupWizard };
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-DUslC3ob.js";
2
- import { r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DWS3Ep2A.js";
3
- import { r as normalizeFeishuTarget } from "./targets-JMFJRKSe.js";
4
- import { r as getFeishuThreadBindingManager } from "./thread-bindings-BmS6TLes.js";
5
- import { normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
2
+ import { r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-Byq1c20x.js";
3
+ import { r as normalizeFeishuTarget } from "./targets-Bb05cFr4.js";
4
+ import { r as getFeishuThreadBindingManager } from "./thread-bindings-D5kDxq_j.js";
5
+ import { normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  //#region extensions/feishu/src/subagent-hooks.ts
7
7
  var subagent_hooks_exports = /* @__PURE__ */ __exportAll({
8
8
  handleFeishuSubagentDeliveryTarget: () => handleFeishuSubagentDeliveryTarget,
@@ -1,8 +1,8 @@
1
- import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-C3UhPVLV.js";
1
+ import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-BUPKo9Al.js";
2
2
  //#region extensions/feishu/subagent-hooks-api.ts
3
3
  let feishuSubagentHooksPromise = null;
4
4
  function loadFeishuSubagentHooksModule() {
5
- feishuSubagentHooksPromise ??= import("./subagent-hooks-C3UhPVLV.js").then((n) => n.i);
5
+ feishuSubagentHooksPromise ??= import("./subagent-hooks-BUPKo9Al.js").then((n) => n.i);
6
6
  return feishuSubagentHooksPromise;
7
7
  }
8
8
  function registerFeishuSubagentHooks(api) {
@@ -1,4 +1,4 @@
1
- import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime";
1
+ import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
2
2
  //#region extensions/feishu/src/targets.ts
3
3
  const CHAT_ID_PREFIX = "oc_";
4
4
  const OPEN_ID_PREFIX = "ou_";
@@ -1,4 +1,4 @@
1
- import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
1
+ import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
2
2
  import { registerSessionBindingAdapter, resolveThreadBindingConversationIdFromBindingId, resolveThreadBindingIdleTimeoutMsForChannel, resolveThreadBindingMaxAgeMsForChannel, unregisterSessionBindingAdapter } from "openclaw/plugin-sdk/conversation-runtime";
3
3
  import { normalizeAccountId, resolveAgentIdFromSessionKey } from "openclaw/plugin-sdk/routing";
4
4
  //#region extensions/feishu/src/thread-bindings.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/feishu",
3
- "version": "2026.5.10-beta.1",
3
+ "version": "2026.5.10-beta.3",
4
4
  "description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,14 +9,15 @@
9
9
  "type": "module",
10
10
  "dependencies": {
11
11
  "@larksuiteoapi/node-sdk": "^1.63.1",
12
- "typebox": "1.1.38"
12
+ "typebox": "1.1.38",
13
+ "zod": "^4.4.3"
13
14
  },
14
15
  "devDependencies": {
15
16
  "@openclaw/plugin-sdk": "workspace:*",
16
17
  "openclaw": "workspace:*"
17
18
  },
18
19
  "peerDependencies": {
19
- "openclaw": ">=2026.5.10-beta.1"
20
+ "openclaw": ">=2026.5.10-beta.3"
20
21
  },
21
22
  "peerDependenciesMeta": {
22
23
  "openclaw": {
@@ -47,10 +48,10 @@
47
48
  "minHostVersion": ">=2026.4.25"
48
49
  },
49
50
  "compat": {
50
- "pluginApi": ">=2026.5.10-beta.1"
51
+ "pluginApi": ">=2026.5.10-beta.3"
51
52
  },
52
53
  "build": {
53
- "openclawVersion": "2026.5.10-beta.1"
54
+ "openclawVersion": "2026.5.10-beta.3"
54
55
  },
55
56
  "release": {
56
57
  "publishToClawHub": true,