@openclaw/feishu 2026.5.10-beta.2 → 2026.5.10-beta.4

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-BfpzGx67.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
@@ -402,6 +402,7 @@ const feishuSetupAdapter = {
402
402
  //#endregion
403
403
  //#region extensions/feishu/src/setup-surface.ts
404
404
  const channel = "feishu";
405
+ const SCAN_TO_CREATE_TP = "ob_cli_app";
405
406
  function normalizeString(value) {
406
407
  if (typeof value !== "string") return;
407
408
  return value.trim() || void 0;
@@ -535,24 +536,50 @@ function applyNewAppSecurityPolicy(cfg, accountId, openId, groupPolicy) {
535
536
  next = patchFeishuConfig(next, accountId, groupPatch);
536
537
  return next;
537
538
  }
538
- async function runScanToCreate(prompter) {
539
+ async function promptFeishuDomain(params) {
540
+ return await params.prompter.select({
541
+ message: "Which Feishu domain?",
542
+ options: [{
543
+ value: "feishu",
544
+ label: "Feishu (feishu.cn) - China"
545
+ }, {
546
+ value: "lark",
547
+ label: "Lark (larksuite.com) - International"
548
+ }],
549
+ initialValue: params.initialValue ?? "feishu"
550
+ });
551
+ }
552
+ async function promptFeishuSetupMethod(prompter) {
553
+ return await prompter.select({
554
+ message: "How do you want to connect Feishu?",
555
+ options: [{
556
+ value: "manual",
557
+ label: "Enter App ID and App Secret manually"
558
+ }, {
559
+ value: "scan",
560
+ label: "Scan a QR code to create a bot automatically"
561
+ }],
562
+ initialValue: "manual"
563
+ });
564
+ }
565
+ async function runScanToCreate(prompter, domain) {
539
566
  const { beginAppRegistration, initAppRegistration, pollAppRegistration, printQrCode } = await import("./app-registration-B8qc1MCM.js");
540
567
  try {
541
- await initAppRegistration("feishu");
568
+ await initAppRegistration(domain);
542
569
  } catch {
543
570
  await prompter.note("Scan-to-create is not available in this environment. Falling back to manual input.", "Feishu setup");
544
571
  return null;
545
572
  }
546
- const begin = await beginAppRegistration("feishu");
547
- await prompter.note("Scan the QR with Lark/Feishu on your phone.", "Feishu scan-to-create");
573
+ const begin = await beginAppRegistration(domain);
574
+ await prompter.note("Scan the QR with Lark/Feishu on your phone. If the mobile app does not react, rerun setup and choose manual input.", "Feishu scan-to-create");
548
575
  await printQrCode(begin.qrUrl);
549
576
  const progress = prompter.progress("Fetching configuration results...");
550
577
  const outcome = await pollAppRegistration({
551
578
  deviceCode: begin.deviceCode,
552
579
  interval: begin.interval,
553
580
  expireIn: begin.expireIn,
554
- initialDomain: "feishu",
555
- tp: "ob_app"
581
+ initialDomain: domain,
582
+ tp: SCAN_TO_CREATE_TP
556
583
  });
557
584
  switch (outcome.status) {
558
585
  case "success":
@@ -582,7 +609,14 @@ async function runNewAppFlow(params) {
582
609
  let appSecretProbeValue = null;
583
610
  let scanDomain;
584
611
  let scanOpenId;
585
- const scanResult = await runScanToCreate(prompter);
612
+ const currentDomain = (next.channels?.feishu)?.domain ?? "feishu";
613
+ const setupMethod = await promptFeishuSetupMethod(prompter);
614
+ const selectedDomain = await promptFeishuDomain({
615
+ prompter,
616
+ initialValue: currentDomain
617
+ });
618
+ scanDomain = selectedDomain;
619
+ const scanResult = setupMethod === "scan" ? await runScanToCreate(prompter, selectedDomain) : null;
586
620
  if (scanResult) {
587
621
  appId = scanResult.appId;
588
622
  appSecret = scanResult.appSecret;
@@ -590,20 +624,7 @@ async function runNewAppFlow(params) {
590
624
  scanDomain = scanResult.domain;
591
625
  scanOpenId = scanResult.openId;
592
626
  } else {
593
- const feishuCfg = next.channels?.feishu;
594
627
  await noteFeishuCredentialHelp(prompter);
595
- const currentDomain = feishuCfg?.domain ?? "feishu";
596
- scanDomain = await prompter.select({
597
- message: "Which Feishu domain?",
598
- options: [{
599
- value: "feishu",
600
- label: "Feishu (feishu.cn) - China"
601
- }, {
602
- value: "lark",
603
- label: "Lark (larksuite.com) - International"
604
- }],
605
- initialValue: currentDomain
606
- });
607
628
  appId = await promptFeishuAppId({
608
629
  prompter,
609
630
  initialValue: normalizeString(process.env.FEISHU_APP_ID)
@@ -631,7 +652,7 @@ async function runNewAppFlow(params) {
631
652
  scanOpenId = await getAppOwnerOpenId({
632
653
  appId,
633
654
  appSecret: appSecretProbeValue,
634
- domain: scanDomain
655
+ domain: selectedDomain
635
656
  });
636
657
  }
637
658
  }
@@ -811,7 +832,7 @@ const meta = {
811
832
  aliases: ["lark"],
812
833
  order: 70
813
834
  };
814
- const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-BlDkd6xR.js"), "feishuChannelRuntime");
835
+ const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-Bt1Lk06Y.js"), "feishuChannelRuntime");
815
836
  function toFeishuMessageSendResult(result, kind) {
816
837
  const receipt = result.receipt ?? createFeishuSendReceipt({
817
838
  messageId: result.messageId,
@@ -1654,7 +1675,7 @@ const feishuPlugin = createChatChannelPlugin({
1654
1675
  })
1655
1676
  }),
1656
1677
  gateway: { startAccount: async (ctx) => {
1657
- const { monitorFeishuProvider } = await import("./monitor-BnbCJWIU.js");
1678
+ const { monitorFeishuProvider } = await import("./monitor-BZgAq8ET.js");
1658
1679
  const account = resolveFeishuRuntimeAccount({
1659
1680
  cfg: ctx.cfg,
1660
1681
  accountId: ctx.accountId
@@ -1,2 +1,2 @@
1
- import { t as feishuPlugin } from "./channel-DCSECj4a.js";
1
+ import { t as feishuPlugin } from "./channel-BfpzGx67.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-CI4_rDnC.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
@@ -4837,16 +4844,21 @@ function firstString(...values) {
4837
4844
  if (trimmed) return trimmed;
4838
4845
  }
4839
4846
  }
4847
+ function readFeishuIdentityField(value, field) {
4848
+ if (!isRecord$3(value)) return;
4849
+ return firstString(value[field]);
4850
+ }
4840
4851
  function parseFeishuCardActionEventPayload(value) {
4841
4852
  if (!isRecord$3(value)) return null;
4842
4853
  const operator = isRecord$3(value.operator) ? value.operator : {};
4843
4854
  const action = value.action;
4844
4855
  const context = isRecord$3(value.context) ? value.context : {};
4845
4856
  if (!isRecord$3(action)) return null;
4857
+ const operatorUserId = operator.user_id;
4846
4858
  const token = readString$2(value.token);
4847
- const openId = firstString(operator.open_id, value.open_id, context.open_id);
4848
- const userId = firstString(operator.user_id, value.user_id, context.user_id);
4849
- const unionId = firstString(operator.union_id);
4859
+ const openId = firstString(operator.open_id, readFeishuIdentityField(operatorUserId, "open_id"), value.open_id, context.open_id);
4860
+ const userId = firstString(operator.user_id, readFeishuIdentityField(operatorUserId, "user_id"), value.user_id, context.user_id);
4861
+ const unionId = firstString(operator.union_id, readFeishuIdentityField(operatorUserId, "union_id"));
4850
4862
  const tag = readString$2(action.tag);
4851
4863
  const actionValue = action.value;
4852
4864
  const openMessageId = firstString(value.open_message_id, context.open_message_id);
@@ -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-BfpzGx67.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.2",
3
+ "version": "2026.5.10-beta.4",
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.2"
20
+ "openclaw": ">=2026.5.10-beta.4"
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.2"
51
+ "pluginApi": ">=2026.5.10-beta.4"
51
52
  },
52
53
  "build": {
53
- "openclawVersion": "2026.5.10-beta.2"
54
+ "openclawVersion": "2026.5.10-beta.4"
54
55
  },
55
56
  "release": {
56
57
  "publishToClawHub": true,