@openclaw/whatsapp 2026.9.3 → 2026.9.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.
package/dist/api.js CHANGED
@@ -4,10 +4,10 @@ import { a as normalizeWhatsAppAllowFromEntries, c as normalizeWhatsAppTarget, i
4
4
  import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-1GqbT1uX.js";
5
5
  import { c as toWhatsappJid, i as markdownToWhatsApp, l as toWhatsappJidWithLid, n as isSelfChatMode, r as jidToE164, s as resolveJidToE164, t as assertWebChannel } from "./targets-runtime-RBjx3pg_.js";
6
6
  import { n as resolveUserPath, t as normalizeE164 } from "./text-runtime-DyfmcATV.js";
7
- import { n as WHATSAPP_LEGACY_OUTBOUND_SEND_DEP_KEYS, t as whatsappPlugin } from "./channel-BeBrHPVa.js";
8
- import { a as resolveWhatsAppGroupRequireMention, o as resolveWhatsAppGroupToolPolicy } from "./shared-D6cUWXiq.js";
7
+ import { n as WHATSAPP_LEGACY_OUTBOUND_SEND_DEP_KEYS, t as whatsappPlugin } from "./channel-CzEIEZqG.js";
8
+ import { a as resolveWhatsAppGroupRequireMention, o as resolveWhatsAppGroupToolPolicy } from "./shared-CLKLJLgY.js";
9
9
  import { t as whatsappCommandPolicy } from "./command-policy-BIOSHySD.js";
10
- import { t as whatsappSetupPlugin } from "./channel.setup-DhuZ51Kg.js";
10
+ import { t as whatsappSetupPlugin } from "./channel.setup-gIWoRLzt.js";
11
11
  import { t as DEFAULT_WEB_MEDIA_BYTES } from "./constants-C7m81BNe.js";
12
12
  import { a as waitForWaConnection, o as DEFAULT_WHATSAPP_SOCKET_TIMING, r as createWaSocket, s as createWhatsAppSocketOperationTimeoutAdapter } from "./socket-close-B3X9uerq.js";
13
13
  import { n as getStatusCode, t as formatError } from "./session-errors-JuazczrA.js";
@@ -8,7 +8,7 @@ import "./normalize-C7Hkc_vE.js";
8
8
  import { c as toWhatsappJid } from "./targets-runtime-RBjx3pg_.js";
9
9
  import "./text-runtime-DyfmcATV.js";
10
10
  import { c as getWhatsAppApprovalApprovers, l as whatsappApprovalAuth, s as lookupInboundMessageMetaForTarget, t as resolveWhatsAppGroupSessionKey } from "./group-session-key-BmVDSPr1.js";
11
- import { a as resolveWhatsAppGroupRequireMention, c as loadWhatsAppChannelRuntime, i as whatsappSetupContract, l as readWhatsAppAccountLinkState, n as whatsappSetupWizardProxy, o as resolveWhatsAppGroupToolPolicy, s as formatWhatsAppConfigAllowFromEntries, t as createWhatsAppPluginBase } from "./shared-D6cUWXiq.js";
11
+ import { a as resolveWhatsAppGroupRequireMention, c as loadWhatsAppChannelRuntime, i as whatsappSetupContract, l as readWhatsAppAccountLinkState, n as whatsappSetupWizardProxy, o as resolveWhatsAppGroupToolPolicy, s as formatWhatsAppConfigAllowFromEntries, t as createWhatsAppPluginBase } from "./shared-CLKLJLgY.js";
12
12
  import { t as whatsappCommandPolicy } from "./command-policy-BIOSHySD.js";
13
13
  import { f as readWebAuthExistsForDecision, n as WHATSAPP_AUTH_UNSTABLE_CODE } from "./auth-store-ZWaclAbd.js";
14
14
  import { createActionGate as createActionGate$1 } from "openclaw/plugin-sdk/channel-actions";
@@ -66,6 +66,7 @@ const whatsappApproval = createApproverRestrictedNativeApprovalCapabilityFromFor
66
66
  }, "plugin") }
67
67
  },
68
68
  createNativeRuntime: (routing) => createLazyChannelApprovalNativeRuntimeAdapter({
69
+ capabilityBoundary: true,
69
70
  eventKinds: [
70
71
  "exec",
71
72
  "plugin",
@@ -1,2 +1,2 @@
1
- import { t as whatsappPlugin } from "./channel-BeBrHPVa.js";
1
+ import { t as whatsappPlugin } from "./channel-CzEIEZqG.js";
2
2
  export { whatsappPlugin };
@@ -1,9 +1,9 @@
1
1
  import { startWebLoginWithQr as startWebLoginWithQr$1, waitForWebLogin as waitForWebLogin$1 } from "./login-qr-runtime.js";
2
2
  import { c as logoutWeb$1, d as readWebAuthExistsBestEffort$1, f as readWebAuthExistsForDecision$1, g as readWebSelfId$1, h as readWebAuthState$1, m as readWebAuthSnapshotBestEffort$1, o as getWebAuthAgeMs$1, p as readWebAuthSnapshot$1, s as logWebSelfId$1, x as webAuthExists$1 } from "./auth-store-ZWaclAbd.js";
3
3
  import { t as getActiveWebListener$1 } from "./active-listener-BEjWsCNM.js";
4
- import { t as monitorWebChannel$1 } from "./monitor-DNGfO3k0.js";
4
+ import { t as monitorWebChannel$1 } from "./monitor-DaIAK4fT.js";
5
5
  import { t as loginWeb$1 } from "./login-6j2iP9nR.js";
6
- import { whatsappSetupWizard as whatsappSetupWizard$1 } from "./setup-surface-B5UnuLT_.js";
6
+ import { whatsappSetupWizard as whatsappSetupWizard$1 } from "./setup-surface-CnK_PPiA.js";
7
7
  //#region extensions/whatsapp/src/channel.runtime.ts
8
8
  function getActiveWebListener(...args) {
9
9
  return getActiveWebListener$1(...args);
@@ -1,4 +1,4 @@
1
- import { a as resolveWhatsAppGroupRequireMention, i as whatsappSetupContract, l as readWhatsAppAccountLinkState, n as whatsappSetupWizardProxy, o as resolveWhatsAppGroupToolPolicy, t as createWhatsAppPluginBase } from "./shared-D6cUWXiq.js";
1
+ import { a as resolveWhatsAppGroupRequireMention, i as whatsappSetupContract, l as readWhatsAppAccountLinkState, n as whatsappSetupWizardProxy, o as resolveWhatsAppGroupToolPolicy, t as createWhatsAppPluginBase } from "./shared-CLKLJLgY.js";
2
2
  //#region extensions/whatsapp/src/channel.setup.ts
3
3
  const whatsappSetupPlugin = { ...createWhatsAppPluginBase({
4
4
  groups: {
@@ -54,7 +54,7 @@ import { resolveChannelContextVisibilityMode } from "openclaw/plugin-sdk/context
54
54
  import { buildMentionRegexes, implicitMentionKindWhen, normalizeMentionText, resolveInboundMentionDecision } from "openclaw/plugin-sdk/channel-mention-gating";
55
55
  import { channelReadyPatch, channelStoppedPatch, createTransportActivityStatusPatch } from "openclaw/plugin-sdk/gateway-runtime";
56
56
  import { ensureConfiguredBindingRouteReady, resolveConfiguredBindingRoute } from "openclaw/plugin-sdk/conversation-binding-runtime";
57
- import { resolveAgentIdentity, resolveIdentityNamePrefix as resolveIdentityNamePrefix$1 } from "openclaw/plugin-sdk/agent-runtime";
57
+ import { resolveAgentIdentity, resolveIdentityNamePrefix } from "openclaw/plugin-sdk/agent-runtime";
58
58
  import { normalizeGroupActivation, parseActivationCommand } from "openclaw/plugin-sdk/group-activation";
59
59
  import { formatAudioTranscriptForAgent } from "openclaw/plugin-sdk/media-understanding-runtime";
60
60
  import { hasControlCommand, isControlCommandMessage, shouldComputeCommandAuthorized } from "openclaw/plugin-sdk/command-detection";
@@ -63,7 +63,6 @@ import { getGlobalHookRunner } from "openclaw/plugin-sdk/plugin-runtime";
63
63
  import { resolveBatchedReplyThreadingPolicy } from "openclaw/plugin-sdk/reply-reference";
64
64
  import { LocalMediaAccessError, getDefaultLocalRoots, loadWebMedia, loadWebMediaRaw, optimizeImageToJpeg, optimizeImageToPng } from "openclaw/plugin-sdk/web-media";
65
65
  import { createChannelApiRetryRunner } from "openclaw/plugin-sdk/retry-runtime";
66
- import { resolveAgentConfig } from "openclaw/plugin-sdk/agent-scope-runtime";
67
66
  //#region extensions/whatsapp/src/inbound/group-conversation.ts
68
67
  function resolveWhatsAppGroupConversationId(conversationId) {
69
68
  return resolveGroupSessionKey({
@@ -3195,7 +3194,7 @@ function logWhatsAppMediaOnlyFlushResult(result) {
3195
3194
  }
3196
3195
  function resolveWhatsAppResponsePrefix(params) {
3197
3196
  const configuredResponsePrefix = params.cfg.messages?.responsePrefix;
3198
- return params.pipelineResponsePrefix ?? (configuredResponsePrefix === "auto" ? resolveIdentityNamePrefix$1(params.cfg, params.agentId) : configuredResponsePrefix) ?? (params.isSelfChat ? resolveIdentityNamePrefix$1(params.cfg, params.agentId) : void 0);
3197
+ return params.pipelineResponsePrefix ?? (configuredResponsePrefix === "auto" ? resolveIdentityNamePrefix(params.cfg, params.agentId) : configuredResponsePrefix) ?? (params.isSelfChat ? resolveIdentityNamePrefix(params.cfg, params.agentId) : void 0);
3199
3198
  }
3200
3199
  function buildWhatsAppInboundTransportContext(msg) {
3201
3200
  return {
@@ -3562,18 +3561,6 @@ async function finalizeWhatsAppStatusReaction(params) {
3562
3561
  await params.controller.restoreInitial();
3563
3562
  }
3564
3563
  //#endregion
3565
- //#region extensions/whatsapp/src/auto-reply/monitor/message-line.runtime.ts
3566
- function resolveIdentityNamePrefix(cfg, agentId) {
3567
- const identityName = resolveAgentConfig(cfg, agentId)?.identity?.name?.trim();
3568
- return identityName ? `[${identityName}]` : void 0;
3569
- }
3570
- function resolveMessagePrefix(cfg, agentId, opts) {
3571
- const configured = opts?.configured;
3572
- if (configured !== void 0) return configured;
3573
- if (opts?.hasAllowFrom === true) return "";
3574
- return resolveIdentityNamePrefix(cfg, agentId) ?? opts?.fallback ?? "[openclaw]";
3575
- }
3576
- //#endregion
3577
3564
  //#region extensions/whatsapp/src/auto-reply/monitor/message-line.ts
3578
3565
  function formatReplyTarget(replyTo) {
3579
3566
  if (!replyTo?.body) return null;
@@ -3583,17 +3570,12 @@ function formatReplyContext(msg) {
3583
3570
  return formatReplyTarget(getReplyContext(msg));
3584
3571
  }
3585
3572
  function buildInboundLine(params) {
3586
- const { cfg, msg, agentId, previousTimestamp, envelope } = params;
3587
- const messagePrefix = resolveMessagePrefix(cfg, agentId, {
3588
- configured: cfg.channels?.whatsapp?.responsePrefix,
3589
- hasAllowFrom: (cfg.channels?.whatsapp?.allowFrom?.length ?? 0) > 0
3590
- });
3573
+ const { msg, previousTimestamp, envelope } = params;
3591
3574
  const admission = requireWhatsAppInboundAdmission(msg);
3592
3575
  const conversationId = admission.conversation.id;
3593
3576
  const conversationKind = admission.conversation.kind;
3594
- const prefixStr = messagePrefix ? `${messagePrefix} ` : "";
3595
3577
  const replyContext = params.visibleReplyTo === void 0 ? formatReplyContext(msg) : formatReplyTarget(params.visibleReplyTo);
3596
- const baseLine = `${prefixStr}${msg.payload.body}${replyContext ? `\n\n${replyContext}` : ""}`;
3578
+ const baseLine = `${msg.payload.body}${replyContext ? `\n\n${replyContext}` : ""}`;
3597
3579
  const sender = getSenderIdentity(msg);
3598
3580
  return formatInboundEnvelope({
3599
3581
  channel: "WhatsApp",
@@ -3743,9 +3725,7 @@ async function processMessage(params) {
3743
3725
  groupAllowFrom: inboundPolicy.groupAllowFrom
3744
3726
  });
3745
3727
  let combinedBody = buildInboundLine({
3746
- cfg: params.cfg,
3747
3728
  msg: msgForAgent,
3748
- agentId: params.route.agentId,
3749
3729
  previousTimestamp,
3750
3730
  envelope: envelopeOptions,
3751
3731
  visibleReplyTo
@@ -10,7 +10,7 @@ import { n as resolveWebAccountId, t as getActiveWebListener } from "./active-li
10
10
  import { a as waitForWaConnection, i as newConnectionId, r as createWaSocket } from "./socket-close-B3X9uerq.js";
11
11
  import { n as getStatusCode, t as formatError } from "./session-errors-JuazczrA.js";
12
12
  import { p as extractText, s as extractContactContext, u as extractLocationData } from "./send-api-C_Zn4Ij-.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-DNGfO3k0.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-DaIAK4fT.js";
14
14
  import { t as loginWeb } from "./login-6j2iP9nR.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, 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 };
@@ -2,7 +2,7 @@ import { a as resolveWhatsAppAccount, o as resolveWhatsAppAuthDir } from "./acco
2
2
  import { r as resolveDefaultWhatsAppAccountId } from "./account-ids-CB5SOWjc.js";
3
3
  import { r as hasWebCredsSync } from "./creds-files-Drg3usj1.js";
4
4
  import { a as normalizeWhatsAppAllowFromEntries, o as normalizeWhatsAppAllowFromEntry } from "./normalize-target-CugRyONv.js";
5
- import { r as whatsappSetupAdapter } from "./shared-D6cUWXiq.js";
5
+ import { r as whatsappSetupAdapter } from "./shared-CLKLJLgY.js";
6
6
  import { formatCliCommand, formatDocsLink } from "openclaw/plugin-sdk/setup-tools";
7
7
  import { DEFAULT_ACCOUNT_ID, createSetupTranslator, splitSetupEntries } from "openclaw/plugin-sdk/setup";
8
8
  //#region extensions/whatsapp/src/setup-finalize.ts
@@ -1,2 +1,2 @@
1
- import { t as whatsappSetupPlugin } from "./channel.setup-DhuZ51Kg.js";
1
+ import { t as whatsappSetupPlugin } from "./channel.setup-gIWoRLzt.js";
2
2
  export { whatsappSetupPlugin };
@@ -36,7 +36,7 @@ const whatsappSetupWizard = {
36
36
  },
37
37
  resolveShouldPromptAccountIds: ({ shouldPromptAccountIds }) => shouldPromptAccountIds,
38
38
  credentials: [],
39
- finalize: async (params) => await (await import("./setup-finalize-Bp-4QnVw.js")).finalizeWhatsAppSetup(params),
39
+ finalize: async (params) => await (await import("./setup-finalize-CZ6fHFFU.js")).finalizeWhatsAppSetup(params),
40
40
  disable: (cfg) => setSetupChannelEnabled(cfg, channel, false),
41
41
  onAccountRecorded: (accountId, options) => {
42
42
  options?.onAccountId?.(channel, accountId);
@@ -17,7 +17,7 @@ import { defineChannelSetupContract } from "openclaw/plugin-sdk/channel-setup";
17
17
  import { createPatchedAccountSetupAdapter } from "openclaw/plugin-sdk/setup";
18
18
  import { describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
19
19
  import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter, createScopedDmSecurityResolver } from "openclaw/plugin-sdk/channel-config-helpers";
20
- import { createDelegatedSetupWizardProxy } from "openclaw/plugin-sdk/setup-runtime";
20
+ import { createDelegatedSetupWizardProxy, setSetupChannelEnabled as setSetupChannelEnabled$1 } from "openclaw/plugin-sdk/setup-runtime";
21
21
  import { readChannelAllowFromStore } from "openclaw/plugin-sdk/channel-pairing";
22
22
  //#region extensions/whatsapp/src/channel-runtime-loader.ts
23
23
  const loadWhatsAppAuthStore = createLazyRuntimeModule(() => import("./auth-store-ZWaclAbd.js").then((n) => n.i));
@@ -27,7 +27,7 @@ async function readWhatsAppAccountLinkState(authDir) {
27
27
  }
28
28
  const loadWhatsAppChannelRuntime = createLazyRuntimeModule(async () => {
29
29
  await loadWhatsAppAuthStore();
30
- return await import("./channel.runtime-qi6Zbi9p.js");
30
+ return await import("./channel.runtime-BFiZ9WhU.js");
31
31
  });
32
32
  //#endregion
33
33
  //#region extensions/whatsapp/src/config-accessors.ts
@@ -79,7 +79,7 @@ function applyGroupAllowFromFromStore(params) {
79
79
  if (!section || typeof section !== "object" || params.storeAllowFrom.length === 0) return params.cfg;
80
80
  let changed = false;
81
81
  const maybeApply = (prefix, holder) => {
82
- if (holder.groupPolicy !== "allowlist") return;
82
+ if (holder.groupPolicy !== "open") return;
83
83
  const allowFrom = Array.isArray(holder.allowFrom) ? holder.allowFrom : [];
84
84
  const groupAllowFrom = Array.isArray(holder.groupAllowFrom) ? holder.groupAllowFrom : [];
85
85
  if (allowFrom.length > 0 || groupAllowFrom.length > 0) return;
@@ -116,7 +116,7 @@ async function applyWhatsAppSecurityConfigFixes(params) {
116
116
  //#region extensions/whatsapp/src/shared.ts
117
117
  const WHATSAPP_CHANNEL = "whatsapp";
118
118
  async function loadWhatsAppSetupSurface() {
119
- return await import("./setup-surface-B5UnuLT_.js");
119
+ return await import("./setup-surface-CnK_PPiA.js");
120
120
  }
121
121
  const whatsappSetupWizardProxy = createWhatsAppSetupWizardProxy(async () => (await loadWhatsAppSetupSurface()).whatsappSetupWizard);
122
122
  const whatsappConfigAdapter = createScopedChannelConfigAdapter({
@@ -153,16 +153,7 @@ function createWhatsAppSetupWizardProxy(loadWizard) {
153
153
  resolveShouldPromptAccountIds: (params) => params.shouldPromptAccountIds,
154
154
  credentials: [],
155
155
  delegateFinalize: true,
156
- disable: (cfg) => ({
157
- ...cfg,
158
- channels: {
159
- ...cfg.channels,
160
- whatsapp: {
161
- ...cfg.channels?.whatsapp,
162
- enabled: false
163
- }
164
- }
165
- }),
156
+ disable: (cfg) => setSetupChannelEnabled$1(cfg, WHATSAPP_CHANNEL, false),
166
157
  onAccountRecorded: (accountId, options) => {
167
158
  options?.onAccountId?.(WHATSAPP_CHANNEL, accountId);
168
159
  }
@@ -1,5 +1,9 @@
1
1
  {
2
2
  "id": "whatsapp",
3
+ "categories": [
4
+ "channels",
5
+ "tools"
6
+ ],
3
7
  "doctorContract": {
4
8
  "configRepair": true,
5
9
  "stateMigrations": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/whatsapp",
3
- "version": "2026.9.3",
3
+ "version": "2026.9.4",
4
4
  "description": "OpenClaw WhatsApp channel plugin for WhatsApp Web chats.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -13,7 +13,7 @@
13
13
  "typebox": "1.3.18"
14
14
  },
15
15
  "peerDependencies": {
16
- "openclaw": ">=2026.9.3"
16
+ "openclaw": ">=2026.9.4"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
19
  "openclaw": {
@@ -65,11 +65,11 @@
65
65
  "minHostVersion": ">=2026.4.25"
66
66
  },
67
67
  "compat": {
68
- "pluginApi": ">=2026.9.3"
68
+ "pluginApi": ">=2026.9.4"
69
69
  },
70
70
  "build": {
71
71
  "bundledDist": false,
72
- "openclawVersion": "2026.9.3"
72
+ "openclawVersion": "2026.9.4"
73
73
  },
74
74
  "release": {
75
75
  "publishToClawHub": true,