@openclaw/whatsapp 2026.5.10-beta.3 → 2026.5.10-beta.5

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.
package/dist/api.js CHANGED
@@ -5,12 +5,12 @@ import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BK
5
5
  import "./reaction-level-2m9sWGCw.js";
6
6
  import { c as assertWebChannel, d as markdownToWhatsApp, f as resolveJidToE164, l as isSelfChatMode, m as toWhatsappJidWithLid, n as normalizeE164, p as toWhatsappJid, r as resolveUserPath, u as jidToE164 } from "./text-runtime-CMxQczvs.js";
7
7
  import "./send-DBfXQDd4.js";
8
- import { t as whatsappPlugin } from "./channel-yfTKmDAy.js";
8
+ import { t as whatsappPlugin } from "./channel-D8JseTzy.js";
9
9
  import { n as WHATSAPP_LEGACY_OUTBOUND_SEND_DEP_KEYS } from "./outbound-base-BgtywpNm.js";
10
10
  import { t as whatsappCommandPolicy } from "./command-policy-O8sRnqUV.js";
11
- import { a as resolveWhatsAppGroupToolPolicy, i as resolveWhatsAppGroupRequireMention, o as resolveWhatsAppGroupIntroHint } from "./shared-CcuxfjaQ.js";
11
+ import { a as resolveWhatsAppGroupToolPolicy, i as resolveWhatsAppGroupRequireMention, o as resolveWhatsAppGroupIntroHint } from "./shared-Ihk-Sj__.js";
12
12
  import "./config-schema-Dmo66Ubb.js";
13
- import { t as whatsappSetupPlugin } from "./channel.setup-k1Ro0czO.js";
13
+ import { t as whatsappSetupPlugin } from "./channel.setup-BuK8IaLl.js";
14
14
  import { t as DEFAULT_WEB_MEDIA_BYTES } from "./constants-DLGCIbfl.js";
15
15
  import { n as listWhatsAppDirectoryGroupsFromConfig, r as listWhatsAppDirectoryPeersFromConfig } from "./directory-config-CE74HYlw.js";
16
16
  import { t as __testing } from "./access-control-BEpPB-Jx.js";
@@ -10,7 +10,7 @@ import { t as createWhatsAppLoginTool } from "./agent-tools-login-DpRxLNRB.js";
10
10
  import { t as createWhatsAppOutboundBase } from "./outbound-base-BgtywpNm.js";
11
11
  import { t as getWhatsAppRuntime } from "./runtime-6fZ67abR.js";
12
12
  import { t as whatsappCommandPolicy } from "./command-policy-O8sRnqUV.js";
13
- import { a as resolveWhatsAppGroupToolPolicy, c as formatWhatsAppConfigAllowFromEntries, i as resolveWhatsAppGroupRequireMention, n as loadWhatsAppChannelRuntime, o as resolveWhatsAppGroupIntroHint, r as whatsappSetupWizardProxy, s as resolveWhatsAppMentionStripRegexes, t as createWhatsAppPluginBase } from "./shared-CcuxfjaQ.js";
13
+ import { a as resolveWhatsAppGroupToolPolicy, c as formatWhatsAppConfigAllowFromEntries, i as resolveWhatsAppGroupRequireMention, n as loadWhatsAppChannelRuntime, o as resolveWhatsAppGroupIntroHint, r as whatsappSetupWizardProxy, s as resolveWhatsAppMentionStripRegexes, t as createWhatsAppPluginBase } from "./shared-Ihk-Sj__.js";
14
14
  import { d as readWebAuthExistsForDecision, n as WHATSAPP_AUTH_UNSTABLE_CODE } from "./auth-store-_ScMvp7r.js";
15
15
  import { t as whatsappSetupAdapter } from "./setup-core-DZKvpzbH.js";
16
16
  import { t as detectWhatsAppLegacyStateMigrations } from "./state-migrations-Bm0S67yH.js";
@@ -1,2 +1,2 @@
1
- import { t as whatsappPlugin } from "./channel-yfTKmDAy.js";
1
+ import { t as whatsappPlugin } from "./channel-D8JseTzy.js";
2
2
  export { whatsappPlugin };
@@ -1,7 +1,7 @@
1
1
  import { startWebLoginWithQr as startWebLoginWithQr$1, waitForWebLogin as waitForWebLogin$1 } from "./login-qr-runtime.js";
2
2
  import { a as getWebAuthAgeMs$1, b as webAuthExists$1, d as readWebAuthExistsForDecision$1, f as readWebAuthSnapshot$1, h as readWebSelfId$1, m as readWebAuthState$1, o as logWebSelfId$1, p as readWebAuthSnapshotBestEffort$1, s as logoutWeb$1, u as readWebAuthExistsBestEffort$1 } from "./auth-store-_ScMvp7r.js";
3
3
  import { t as getActiveWebListener$1 } from "./active-listener-DTbKS-j-.js";
4
- import { t as monitorWebChannel$1 } from "./monitor-DcfFBU0V.js";
4
+ import { t as monitorWebChannel$1 } from "./monitor-BUZiKfTw.js";
5
5
  import { t as loginWeb$1 } from "./login-eiyCwLI5.js";
6
6
  import { whatsappSetupWizard as whatsappSetupWizard$1 } from "./setup-surface-DJAu-uxi.js";
7
7
  //#region extensions/whatsapp/src/channel.runtime.ts
@@ -1,4 +1,4 @@
1
- import { a as resolveWhatsAppGroupToolPolicy, i as resolveWhatsAppGroupRequireMention, o as resolveWhatsAppGroupIntroHint, r as whatsappSetupWizardProxy, t as createWhatsAppPluginBase } from "./shared-CcuxfjaQ.js";
1
+ import { a as resolveWhatsAppGroupToolPolicy, i as resolveWhatsAppGroupRequireMention, o as resolveWhatsAppGroupIntroHint, r as whatsappSetupWizardProxy, t as createWhatsAppPluginBase } from "./shared-Ihk-Sj__.js";
2
2
  import { m as readWebAuthState } from "./auth-store-_ScMvp7r.js";
3
3
  import { t as whatsappSetupAdapter } from "./setup-core-DZKvpzbH.js";
4
4
  import { t as detectWhatsAppLegacyStateMigrations } from "./state-migrations-Bm0S67yH.js";
@@ -482,7 +482,7 @@ async function attachWebInboxToSocket(options) {
482
482
  }
483
483
  const messageTimestampMs = msg.messageTimestamp ? Number(msg.messageTimestamp) * 1e3 : void 0;
484
484
  const access = await checkInboundAccessControl({
485
- cfg: options.cfg,
485
+ cfg: options.loadConfig?.() ?? options.cfg,
486
486
  accountId: options.accountId,
487
487
  from,
488
488
  selfE164: self.e164 ?? null,
@@ -2261,9 +2261,9 @@ async function processMessage(params) {
2261
2261
  //#endregion
2262
2262
  //#region extensions/whatsapp/src/auto-reply/monitor/on-message.ts
2263
2263
  function createWebOnMessageHandler(params) {
2264
- const processForRoute = async (msg, route, groupHistoryKey, opts) => {
2264
+ const processForRoute = async (cfg, msg, route, groupHistoryKey, opts) => {
2265
2265
  const processParams = {
2266
- cfg: params.cfg,
2266
+ cfg,
2267
2267
  msg,
2268
2268
  route,
2269
2269
  groupHistoryKey,
@@ -2288,10 +2288,11 @@ function createWebOnMessageHandler(params) {
2288
2288
  return processMessage(processParams);
2289
2289
  };
2290
2290
  return async (msg) => {
2291
+ const cfg = params.loadConfig?.() ?? params.cfg;
2291
2292
  const conversationId = msg.conversationId ?? msg.from;
2292
2293
  const peerId = resolvePeerId(msg);
2293
2294
  const baseRoute = resolveAgentRoute({
2294
- cfg: getRuntimeConfig$1(),
2295
+ cfg,
2295
2296
  channel: "whatsapp",
2296
2297
  accountId: msg.accountId,
2297
2298
  peer: {
@@ -2306,6 +2307,11 @@ function createWebOnMessageHandler(params) {
2306
2307
  peerKind: "group",
2307
2308
  peerId
2308
2309
  }) : route.sessionKey;
2310
+ const account = resolveWhatsAppAccount({
2311
+ cfg,
2312
+ accountId: route.accountId ?? msg.accountId ?? params.account.accountId
2313
+ });
2314
+ const baseMentionConfig = buildMentionConfig(cfg);
2309
2315
  if (msg.from === msg.to) logVerbose(`📱 Same-phone mode detected (from === to: ${msg.from})`);
2310
2316
  if (params.echoTracker.has(msg.body)) {
2311
2317
  logVerbose("Skipping auto-reply: detected echo (message matches recently sent text)");
@@ -2320,7 +2326,7 @@ function createWebOnMessageHandler(params) {
2320
2326
  const runAudioPreflightOnce = async () => {
2321
2327
  if (preflightAudioTranscript !== void 0 || !canRunEarlyAudioPreflight || !hasAudioBody || !msg.mediaPath) return;
2322
2328
  ackReaction = await maybeSendAckReaction({
2323
- cfg: params.cfg,
2329
+ cfg,
2324
2330
  msg,
2325
2331
  agentId: route.agentId,
2326
2332
  sessionKey: route.sessionKey,
@@ -2345,7 +2351,7 @@ function createWebOnMessageHandler(params) {
2345
2351
  OriginatingTo: conversationId,
2346
2352
  AccountId: route.accountId
2347
2353
  },
2348
- cfg: params.cfg
2354
+ cfg
2349
2355
  }) ?? null;
2350
2356
  } catch {
2351
2357
  preflightAudioTranscript = null;
@@ -2370,7 +2376,7 @@ function createWebOnMessageHandler(params) {
2370
2376
  OriginatingTo: conversationId
2371
2377
  };
2372
2378
  updateLastRouteInBackground({
2373
- cfg: params.cfg,
2379
+ cfg,
2374
2380
  backgroundTasks: params.backgroundTasks,
2375
2381
  storeAgentId: route.agentId,
2376
2382
  sessionKey: route.sessionKey,
@@ -2381,16 +2387,16 @@ function createWebOnMessageHandler(params) {
2381
2387
  warn: params.replyLogger.warn.bind(params.replyLogger)
2382
2388
  });
2383
2389
  let gating = await applyGroupGating({
2384
- cfg: params.cfg,
2390
+ cfg,
2385
2391
  msg,
2386
2392
  deferMissingMention: hasAudioBody && Boolean(msg.mediaPath),
2387
2393
  conversationId,
2388
2394
  groupHistoryKey,
2389
2395
  agentId: route.agentId,
2390
2396
  sessionKey: route.sessionKey,
2391
- baseMentionConfig: params.baseMentionConfig,
2392
- authDir: params.account.authDir,
2393
- selfChatMode: params.account.selfChatMode,
2397
+ baseMentionConfig,
2398
+ authDir: account.authDir,
2399
+ selfChatMode: account.selfChatMode,
2394
2400
  groupHistories: params.groupHistories,
2395
2401
  groupHistoryLimit: params.groupHistoryLimit,
2396
2402
  groupMemberNames: params.groupMemberNames,
@@ -2400,16 +2406,16 @@ function createWebOnMessageHandler(params) {
2400
2406
  if (!gating.shouldProcess && "needsMentionText" in gating && gating.needsMentionText === true) {
2401
2407
  await runAudioPreflightOnce();
2402
2408
  gating = await applyGroupGating({
2403
- cfg: params.cfg,
2409
+ cfg,
2404
2410
  msg,
2405
2411
  ...typeof preflightAudioTranscript === "string" ? { mentionText: preflightAudioTranscript } : {},
2406
2412
  conversationId,
2407
2413
  groupHistoryKey,
2408
2414
  agentId: route.agentId,
2409
2415
  sessionKey: route.sessionKey,
2410
- baseMentionConfig: params.baseMentionConfig,
2411
- authDir: params.account.authDir,
2412
- selfChatMode: params.account.selfChatMode,
2416
+ baseMentionConfig,
2417
+ authDir: account.authDir,
2418
+ selfChatMode: account.selfChatMode,
2413
2419
  groupHistories: params.groupHistories,
2414
2420
  groupHistoryLimit: params.groupHistoryLimit,
2415
2421
  groupMemberNames: params.groupMemberNames,
@@ -2430,7 +2436,7 @@ function createWebOnMessageHandler(params) {
2430
2436
  }
2431
2437
  await runAudioPreflightOnce();
2432
2438
  if (await maybeBroadcastMessage({
2433
- cfg: params.cfg,
2439
+ cfg,
2434
2440
  msg,
2435
2441
  peerId,
2436
2442
  route,
@@ -2439,9 +2445,9 @@ function createWebOnMessageHandler(params) {
2439
2445
  ...preflightAudioTranscript !== void 0 ? { preflightAudioTranscript } : {},
2440
2446
  ...ackAlreadySent && msg.chatType !== "group" ? { ackAlreadySent: true } : {},
2441
2447
  ...ackReaction && msg.chatType !== "group" ? { ackReaction } : {},
2442
- processMessage: (m, r, k, opts) => processForRoute(m, r, k, opts)
2448
+ processMessage: (m, r, k, opts) => processForRoute(cfg, m, r, k, opts)
2443
2449
  })) return;
2444
- await processForRoute(msg, route, groupHistoryKey, {
2450
+ await processForRoute(cfg, msg, route, groupHistoryKey, {
2445
2451
  ...preflightAudioTranscript !== void 0 ? { preflightAudioTranscript } : {},
2446
2452
  ...ackAlreadySent ? { ackAlreadySent: true } : {},
2447
2453
  ...ackReaction ? { ackReaction } : {}
@@ -2458,6 +2464,34 @@ function loadReplyResolverRuntime() {
2458
2464
  replyResolverRuntimePromise ??= import("./reply-resolver.runtime-rIVWohXr.js");
2459
2465
  return replyResolverRuntimePromise;
2460
2466
  }
2467
+ function resolveWebMonitorConfigSnapshot(params) {
2468
+ const account = resolveWhatsAppAccount({
2469
+ cfg: params.cfg,
2470
+ accountId: params.accountId
2471
+ });
2472
+ return {
2473
+ cfg: {
2474
+ ...params.cfg,
2475
+ channels: {
2476
+ ...params.cfg.channels,
2477
+ whatsapp: {
2478
+ ...params.cfg.channels?.whatsapp,
2479
+ ackReaction: account.ackReaction,
2480
+ messagePrefix: account.messagePrefix,
2481
+ allowFrom: account.allowFrom,
2482
+ groupAllowFrom: account.groupAllowFrom,
2483
+ groupPolicy: account.groupPolicy,
2484
+ textChunkLimit: account.textChunkLimit,
2485
+ chunkMode: account.chunkMode,
2486
+ mediaMaxMb: account.mediaMaxMb,
2487
+ blockStreaming: account.blockStreaming,
2488
+ groups: account.groups
2489
+ }
2490
+ }
2491
+ },
2492
+ account
2493
+ };
2494
+ }
2461
2495
  function normalizeReconnectAccountId(accountId) {
2462
2496
  return (accountId ?? "").trim() || "default";
2463
2497
  }
@@ -2522,29 +2556,14 @@ async function monitorWebChannel(verbose, listenerFactory = attachWebInboxToSock
2522
2556
  statusController.emit();
2523
2557
  const baseCfg = getRuntimeConfig$1();
2524
2558
  const sourceCfg = getRuntimeConfigSourceSnapshot();
2525
- const account = resolveWhatsAppAccount({
2559
+ const { cfg, account } = resolveWebMonitorConfigSnapshot({
2526
2560
  cfg: baseCfg,
2527
2561
  accountId: tuning.accountId
2528
2562
  });
2529
- const cfg = {
2530
- ...baseCfg,
2531
- channels: {
2532
- ...baseCfg.channels,
2533
- whatsapp: {
2534
- ...baseCfg.channels?.whatsapp,
2535
- ackReaction: account.ackReaction,
2536
- messagePrefix: account.messagePrefix,
2537
- allowFrom: account.allowFrom,
2538
- groupAllowFrom: account.groupAllowFrom,
2539
- groupPolicy: account.groupPolicy,
2540
- textChunkLimit: account.textChunkLimit,
2541
- chunkMode: account.chunkMode,
2542
- mediaMaxMb: account.mediaMaxMb,
2543
- blockStreaming: account.blockStreaming,
2544
- groups: account.groups
2545
- }
2546
- }
2547
- };
2563
+ const loadCurrentMonitorConfig = () => resolveWebMonitorConfigSnapshot({
2564
+ cfg: getRuntimeConfig$1(),
2565
+ accountId: account.accountId
2566
+ }).cfg;
2548
2567
  const maxMediaBytes = resolveWhatsAppMediaMaxBytes(account);
2549
2568
  const heartbeatSeconds = resolveHeartbeatSeconds(cfg, tuning.heartbeatSeconds);
2550
2569
  const reconnectPolicy = resolveReconnectPolicy(cfg, tuning.reconnect);
@@ -2611,6 +2630,7 @@ async function monitorWebChannel(verbose, listenerFactory = attachWebInboxToSock
2611
2630
  createListener: async ({ sock, connection }) => {
2612
2631
  const onMessage = createWebOnMessageHandler({
2613
2632
  cfg,
2633
+ loadConfig: loadCurrentMonitorConfig,
2614
2634
  verbose,
2615
2635
  connectionId,
2616
2636
  maxMediaBytes,
@@ -2626,6 +2646,7 @@ async function monitorWebChannel(verbose, listenerFactory = attachWebInboxToSock
2626
2646
  });
2627
2647
  return await (listenerFactory ?? attachWebInboxToSocket)({
2628
2648
  cfg,
2649
+ loadConfig: loadCurrentMonitorConfig,
2629
2650
  verbose,
2630
2651
  accountId: account.accountId,
2631
2652
  authDir: account.authDir,
@@ -2686,6 +2707,40 @@ async function monitorWebChannel(verbose, listenerFactory = attachWebInboxToSock
2686
2707
  }
2687
2708
  });
2688
2709
  } catch (error) {
2710
+ if (getStatusCode(error) === 428) {
2711
+ const retryDecision = controller.consumeReconnectAttempt();
2712
+ statusController.noteReconnectAttempts(retryDecision.reconnectAttempts);
2713
+ statusController.noteClose({
2714
+ statusCode: 428,
2715
+ error: formatError(error),
2716
+ reconnectAttempts: retryDecision.reconnectAttempts,
2717
+ healthState: retryDecision.healthState
2718
+ });
2719
+ if (retryDecision.action === "stop") {
2720
+ reconnectLogger.warn({
2721
+ connectionId,
2722
+ status: 428,
2723
+ reconnectAttempts: retryDecision.reconnectAttempts,
2724
+ maxAttempts: reconnectPolicy.maxAttempts
2725
+ }, "web reconnect: 428 during opening; max attempts reached");
2726
+ runtime.error(`WhatsApp Web connection closed during setup (status 428) after ${retryDecision.reconnectAttempts}/${reconnectPolicy.maxAttempts} attempts. Relink with \`${formatCliCommand("openclaw channels login --channel whatsapp")}\` if the issue persists.`);
2727
+ await controller.shutdown();
2728
+ break;
2729
+ }
2730
+ reconnectLogger.info({
2731
+ connectionId,
2732
+ status: 428,
2733
+ reconnectAttempts: retryDecision.reconnectAttempts,
2734
+ delayMs: retryDecision.delayMs
2735
+ }, "web reconnect: 428 during opening; retrying");
2736
+ runtime.error(`WhatsApp Web connection closed during setup (status 428). Retry ${retryDecision.reconnectAttempts}/${reconnectPolicy.maxAttempts || "∞"} in ${formatDurationPrecise(retryDecision.delayMs ?? 0)}.`);
2737
+ try {
2738
+ await controller.waitBeforeRetry(retryDecision.delayMs ?? 0);
2739
+ } catch {
2740
+ break;
2741
+ }
2742
+ continue;
2743
+ }
2689
2744
  if (!isRetryableAuthUnstableError(error)) throw error;
2690
2745
  const retryDecision = controller.consumeReconnectAttempt();
2691
2746
  statusController.noteReconnectAttempts(retryDecision.reconnectAttempts);
@@ -10,7 +10,7 @@ import { t as DEFAULT_WEB_MEDIA_BYTES } from "./constants-DLGCIbfl.js";
10
10
  import { c as extractContactContext, d as extractMediaPlaceholder, p as extractText, u as extractLocationData } from "./send-api-DD93aPIQ.js";
11
11
  import { n as newConnectionId, r as waitForWaConnection, t as createWaSocket } from "./session-CVCKPoQN.js";
12
12
  import { n as resolveWebAccountId, t as getActiveWebListener } from "./active-listener-DTbKS-j-.js";
13
- import { a as loadWebMediaRaw, c as monitorWebInbox, i as loadWebMedia, l as resetWebInboundDedupe, n as LocalMediaAccessError, o as optimizeImageToJpeg, r as getDefaultLocalRoots, s as optimizeImageToPng, t as monitorWebChannel } from "./monitor-DcfFBU0V.js";
13
+ import { a as loadWebMediaRaw, c as monitorWebInbox, i as loadWebMedia, l as resetWebInboundDedupe, n as LocalMediaAccessError, o as optimizeImageToJpeg, r as getDefaultLocalRoots, s as optimizeImageToPng, t as monitorWebChannel } from "./monitor-BUZiKfTw.js";
14
14
  import { t as loginWeb } from "./login-eiyCwLI5.js";
15
15
  import { HEARTBEAT_PROMPT, HEARTBEAT_TOKEN, SILENT_REPLY_TOKEN, stripHeartbeatToken } from "openclaw/plugin-sdk/reply-runtime";
16
16
  export { DEFAULT_WEB_MEDIA_BYTES, HEARTBEAT_PROMPT, HEARTBEAT_TOKEN, LocalMediaAccessError, SILENT_REPLY_TOKEN, WA_WEB_AUTH_DIR, WHATSAPP_AUTH_UNSTABLE_CODE, WhatsAppAuthUnstableError, createWaSocket, createWhatsAppLoginTool, extractContactContext, extractLocationData, extractMediaPlaceholder, extractText, formatError, formatWhatsAppWebAuthStatusState, getActiveWebListener, getDefaultLocalRoots, getStatusCode, getWebAuthAgeMs, handleWhatsAppAction, hasWebCredsSync, loadWebMedia, loadWebMediaRaw, logWebSelfId, loginWeb, logoutWeb, monitorWebChannel, monitorWebInbox, newConnectionId, optimizeImageToJpeg, optimizeImageToPng, pickWebChannel, readCredsJsonRaw, readWebAuthExistsBestEffort, readWebAuthExistsForDecision, readWebAuthSnapshot, readWebAuthSnapshotBestEffort, readWebAuthState, readWebSelfId, readWebSelfIdentity, readWebSelfIdentityForDecision, resetWebInboundDedupe, resolveDefaultWebAuthDir, resolveWebAccountId, resolveWebCredsBackupPath, resolveWebCredsPath, restoreCredsFromBackupIfNeeded, sendMessageWhatsApp, sendPollWhatsApp, sendReactionWhatsApp, sendTypingWhatsApp, setWhatsAppRuntime, startWebLoginWithQr, stripHeartbeatToken, waitForCredsSaveQueue, waitForCredsSaveQueueWithTimeout, waitForWaConnection, waitForWebLogin, webAuthExists, whatsAppActionRuntime, writeCredsJsonAtomically };
@@ -1,2 +1,2 @@
1
- import { t as whatsappSetupPlugin } from "./channel.setup-k1Ro0czO.js";
1
+ import { t as whatsappSetupPlugin } from "./channel.setup-BuK8IaLl.js";
2
2
  export { whatsappSetupPlugin };
@@ -124,7 +124,7 @@ function resolveWhatsAppConfigPath(params) {
124
124
  return `${resolveWhatsAppGroupScopeBasePath(params)}.${params.field}`;
125
125
  }
126
126
  async function loadWhatsAppChannelRuntime() {
127
- return await import("./channel.runtime-U2LumvwN.js");
127
+ return await import("./channel.runtime-BHVFPFlu.js");
128
128
  }
129
129
  async function loadWhatsAppSetupSurface() {
130
130
  return await import("./setup-surface-DJAu-uxi.js");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/whatsapp",
3
- "version": "2026.5.10-beta.3",
3
+ "version": "2026.5.10-beta.5",
4
4
  "description": "OpenClaw WhatsApp channel plugin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,7 +19,7 @@
19
19
  "openclaw": "workspace:*"
20
20
  },
21
21
  "peerDependencies": {
22
- "openclaw": ">=2026.5.10-beta.3"
22
+ "openclaw": ">=2026.5.10-beta.5"
23
23
  },
24
24
  "peerDependenciesMeta": {
25
25
  "openclaw": {
@@ -61,10 +61,10 @@
61
61
  "minHostVersion": ">=2026.4.25"
62
62
  },
63
63
  "compat": {
64
- "pluginApi": ">=2026.5.10-beta.3"
64
+ "pluginApi": ">=2026.5.10-beta.5"
65
65
  },
66
66
  "build": {
67
- "openclawVersion": "2026.5.10-beta.3"
67
+ "openclawVersion": "2026.5.10-beta.5"
68
68
  },
69
69
  "release": {
70
70
  "publishToClawHub": true,