@elizaos/plugin-whatsapp 2.0.0-beta.1 → 2.0.3-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.
@@ -107,7 +107,7 @@ export interface ResolvedWhatsAppAccount {
107
107
  */
108
108
  export declare function normalizeAccountId(accountId?: string | null): string;
109
109
  /**
110
- * Gets the multi-account configuration from runtime settings
110
+ * Gets the account configuration records from runtime settings
111
111
  */
112
112
  export declare function getMultiAccountConfig(runtime: IAgentRuntime): WhatsAppMultiAccountConfig;
113
113
  /**
@@ -131,7 +131,7 @@ export declare function resolveWhatsAppAccount(runtime: IAgentRuntime, accountId
131
131
  */
132
132
  export declare function listEnabledWhatsAppAccounts(runtime: IAgentRuntime): ResolvedWhatsAppAccount[];
133
133
  /**
134
- * Checks if multi-account mode is enabled
134
+ * Checks whether more than one enabled account is configured
135
135
  */
136
136
  export declare function isMultiAccountEnabled(runtime: IAgentRuntime): boolean;
137
137
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"message-adapter.d.ts","sourceRoot":"","sources":["../../src/baileys/message-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,UAAU,CAAC;AAElB,qBAAa,cAAc;IACzB,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,GAAG,iBAAiB;IAgB3D,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAmBxD,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,cAAc;CAMvB"}
1
+ {"version":3,"file":"message-adapter.d.ts","sourceRoot":"","sources":["../../src/baileys/message-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,UAAU,CAAC;AAElB,qBAAa,cAAc;IACzB,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,GAAG,iBAAiB;IAgB3D,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAmBxD,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,cAAc;CAMvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"qr-code.d.ts","sourceRoot":"","sources":["../../src/baileys/qr-code.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,qBAAa,eAAe;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAQvC,gBAAgB;CAO/B"}
1
+ {"version":3,"file":"qr-code.d.ts","sourceRoot":"","sources":["../../src/baileys/qr-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,qBAAa,eAAe;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAQvC,gBAAgB;CAO/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -75,7 +75,7 @@ export type WhatsAppAccountConfig = {
75
75
  heartbeat?: ChannelHeartbeatVisibilityConfig;
76
76
  };
77
77
  export type WhatsAppChannelConfig = {
78
- /** Optional per-account WhatsApp configuration (multi-account). */
78
+ /** Optional named WhatsApp account configuration records. */
79
79
  accounts?: Record<string, WhatsAppAccountConfig>;
80
80
  /** Optional provider capability tags used for agent/runtime guidance. */
81
81
  capabilities?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WhatsApp ConnectorAccountManager provider.
3
3
  *
4
- * Adapts the existing multi-account scaffolding in `accounts.ts` to the
4
+ * Adapts the existing multi-account resolution in `accounts.ts` to the
5
5
  * `ConnectorAccountProvider` contract from
6
6
  * `@elizaos/core/connectors/account-manager`.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAMpG,QAAA,MAAM,cAAc,EAAE,MA6BrB,CAAC;AAEF,eAAe,cAAc,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,+BAA+B,EAC/B,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,IAAI,6BAA6B,EACrD,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,sCAAsC,EACtC,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,EACZ,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,IAAI,yBAAyB,EAC9C,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAMpG,QAAA,MAAM,cAAc,EAAE,MAiCrB,CAAC;AAEF,eAAe,cAAc,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,+BAA+B,EAC/B,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,IAAI,6BAA6B,EACrD,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,sCAAsC,EACtC,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,EACZ,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,IAAI,yBAAyB,EAC9C,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ function normalizeAccountId(accountId) {
18
18
  return trimmed;
19
19
  }
20
20
  function getMultiAccountConfig(runtime) {
21
- const characterWhatsApp = runtime.character?.settings?.whatsapp;
21
+ const characterWhatsApp = runtime.character.settings?.whatsapp;
22
22
  return {
23
23
  enabled: characterWhatsApp?.enabled,
24
24
  transport: characterWhatsApp?.transport,
@@ -262,7 +262,7 @@ function purposeForAccount(_account) {
262
262
  return ["messaging"];
263
263
  }
264
264
  function accessGateForAccount(account) {
265
- const dmPolicy = account.config?.dmPolicy;
265
+ const dmPolicy = account.config.dmPolicy;
266
266
  if (dmPolicy === "disabled")
267
267
  return "disabled";
268
268
  if (dmPolicy === "pairing")
@@ -290,8 +290,8 @@ function toConnectorAccount(account) {
290
290
  tokenSource: account.tokenSource,
291
291
  phoneNumberId: account.phoneNumberId,
292
292
  businessAccountId: account.businessAccountId ?? null,
293
- dmPolicy: account.config?.dmPolicy ?? "pairing",
294
- groupPolicy: account.config?.groupPolicy ?? "allowlist"
293
+ dmPolicy: account.config.dmPolicy ?? "pairing",
294
+ groupPolicy: account.config.groupPolicy ?? "allowlist"
295
295
  }
296
296
  };
297
297
  }
@@ -334,6 +334,29 @@ import {
334
334
 
335
335
  // src/client.ts
336
336
  import { EventEmitter } from "node:events";
337
+
338
+ // src/media.ts
339
+ var ALLOWED_MEDIA_PROTOCOLS = new Set(["http:", "https:"]);
340
+ function mediaLinkError(kind) {
341
+ return new Error(`${kind} message requires a valid http(s) media link`);
342
+ }
343
+ function assertValidWhatsAppMediaLink(link, kind) {
344
+ if (typeof link !== "string" || !link.trim()) {
345
+ throw mediaLinkError(kind);
346
+ }
347
+ let url;
348
+ try {
349
+ url = new URL(link.trim());
350
+ } catch {
351
+ throw mediaLinkError(kind);
352
+ }
353
+ if (!ALLOWED_MEDIA_PROTOCOLS.has(url.protocol) || url.username || url.password || !url.hostname) {
354
+ throw mediaLinkError(kind);
355
+ }
356
+ return url.toString();
357
+ }
358
+
359
+ // src/client.ts
337
360
  var DEFAULT_API_VERSION = "v24.0";
338
361
 
339
362
  class WhatsAppClient extends EventEmitter {
@@ -394,7 +417,7 @@ class WhatsAppClient extends EventEmitter {
394
417
  const response = await this.post(endpoint, payload);
395
418
  return {
396
419
  success: true,
397
- messageId: response.data.messages?.[0]?.id
420
+ messageId: response.data.messages[0]?.id
398
421
  };
399
422
  } catch (error) {
400
423
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -599,7 +622,7 @@ class WhatsAppClient extends EventEmitter {
599
622
  ...basePayload,
600
623
  ...contextPayload,
601
624
  image: {
602
- link: imageContent.link,
625
+ link: assertValidWhatsAppMediaLink(imageContent.link, "image"),
603
626
  caption: imageContent.caption
604
627
  }
605
628
  };
@@ -610,7 +633,7 @@ class WhatsAppClient extends EventEmitter {
610
633
  ...basePayload,
611
634
  ...contextPayload,
612
635
  video: {
613
- link: videoContent.link,
636
+ link: assertValidWhatsAppMediaLink(videoContent.link, "video"),
614
637
  caption: videoContent.caption
615
638
  }
616
639
  };
@@ -621,7 +644,7 @@ class WhatsAppClient extends EventEmitter {
621
644
  ...basePayload,
622
645
  ...contextPayload,
623
646
  audio: {
624
- link: audioContent.link
647
+ link: assertValidWhatsAppMediaLink(audioContent.link, "audio")
625
648
  }
626
649
  };
627
650
  }
@@ -631,7 +654,7 @@ class WhatsAppClient extends EventEmitter {
631
654
  ...basePayload,
632
655
  ...contextPayload,
633
656
  document: {
634
- link: docContent.link,
657
+ link: assertValidWhatsAppMediaLink(docContent.link, "document"),
635
658
  filename: docContent.filename,
636
659
  caption: docContent.caption
637
660
  }
@@ -797,7 +820,7 @@ class BaileysConnection extends EventEmitter2 {
797
820
  }
798
821
  const socket = this.socket;
799
822
  socket.ev.removeAllListeners();
800
- socket.ws?.close?.();
823
+ socket.ws.close();
801
824
  this.socket = undefined;
802
825
  this.connectionStatus = "close";
803
826
  this.emit("connection", "close");
@@ -835,30 +858,24 @@ class MessageAdapter {
835
858
  case "template":
836
859
  return { text: this.renderTemplate(msg.content) };
837
860
  default:
838
- throw new Error(`Message type ${msg.type} is not yet supported for Baileys`);
861
+ throw new Error(`Message type ${msg.type} is outside the Baileys adapter contract`);
839
862
  }
840
863
  }
841
864
  mediaWithCaption(key, media) {
842
- if (!media?.link) {
843
- throw new Error(`${key} message requires a media link`);
844
- }
865
+ const link = assertValidWhatsAppMediaLink(media.link, key);
845
866
  return {
846
- [key]: { url: media.link },
867
+ [key]: { url: link },
847
868
  ...media.caption ? { caption: media.caption } : {}
848
869
  };
849
870
  }
850
871
  mediaNoCaption(key, media) {
851
- if (!media?.link) {
852
- throw new Error(`${key} message requires a media link`);
853
- }
854
- return { [key]: { url: media.link } };
872
+ const link = assertValidWhatsAppMediaLink(media.link, key);
873
+ return { [key]: { url: link } };
855
874
  }
856
875
  mediaWithFilename(media) {
857
- if (!media?.link) {
858
- throw new Error("document message requires a media link");
859
- }
876
+ const link = assertValidWhatsAppMediaLink(media.link, "document");
860
877
  return {
861
- document: { url: media.link },
878
+ document: { url: link },
862
879
  ...media.filename ? { fileName: media.filename } : {},
863
880
  ...media.caption ? { caption: media.caption } : {}
864
881
  };
@@ -1134,7 +1151,7 @@ function splitAtBreakPoint(text, limit) {
1134
1151
  }
1135
1152
  function chunkWhatsAppText(text, opts = {}) {
1136
1153
  const limit = opts.limit ?? WHATSAPP_TEXT_CHUNK_LIMIT;
1137
- if (!text?.trim()) {
1154
+ if (!text.trim()) {
1138
1155
  return [];
1139
1156
  }
1140
1157
  const normalizedText = text.trim();
@@ -1471,6 +1488,18 @@ function extractWebhookText(message) {
1471
1488
  }
1472
1489
  return "";
1473
1490
  }
1491
+ function isRecord(value) {
1492
+ return typeof value === "object" && value !== null;
1493
+ }
1494
+ function asRecordArray(value) {
1495
+ return Array.isArray(value) ? value.filter(isRecord) : [];
1496
+ }
1497
+ function isWebhookMessage(value) {
1498
+ if (!isRecord(value)) {
1499
+ return false;
1500
+ }
1501
+ return Boolean(typeof value.from === "string" && value.from.trim() && typeof value.id === "string");
1502
+ }
1474
1503
 
1475
1504
  class WhatsAppConnectorService extends Service {
1476
1505
  static serviceType = "whatsapp";
@@ -1562,7 +1591,8 @@ class WhatsAppConnectorService extends Service {
1562
1591
  },
1563
1592
  sendHandler: async (_runtime, target, content) => {
1564
1593
  const text = typeof content.text === "string" ? content.text.trim() : "";
1565
- if (!text) {
1594
+ const attachments = Array.isArray(content.attachments) ? content.attachments.filter((media) => typeof media?.url === "string" && media.url.trim().length > 0) : [];
1595
+ if (!text && attachments.length === 0) {
1566
1596
  return;
1567
1597
  }
1568
1598
  const resolved = await resolveWhatsAppSendTarget(runtime, service, target, connectorAccountId);
@@ -1578,14 +1608,28 @@ class WhatsAppConnectorService extends Service {
1578
1608
  replyToMessageId = externalMessageId.trim();
1579
1609
  }
1580
1610
  }
1581
- for (const chunk of chunkWhatsAppText(text)) {
1582
- await service.sendMessage({
1583
- accountId: resolved.accountId,
1584
- type: "text",
1585
- to: resolved.chatId,
1586
- content: chunk,
1587
- replyToMessageId
1588
- });
1611
+ if (text) {
1612
+ for (const chunk of chunkWhatsAppText(text)) {
1613
+ await service.sendMessage({
1614
+ accountId: resolved.accountId,
1615
+ type: "text",
1616
+ to: resolved.chatId,
1617
+ content: chunk,
1618
+ replyToMessageId
1619
+ });
1620
+ }
1621
+ }
1622
+ for (const media of attachments) {
1623
+ try {
1624
+ await service.sendMediaMessage(resolved.accountId, resolved.chatId, media);
1625
+ } catch (error) {
1626
+ runtime.logger.warn({
1627
+ src: "plugin:whatsapp",
1628
+ agentId: runtime.agentId,
1629
+ url: media.url,
1630
+ error: error instanceof Error ? error.message : String(error)
1631
+ }, "Failed to send WhatsApp outbound attachment; skipping");
1632
+ }
1589
1633
  }
1590
1634
  },
1591
1635
  resolveTargets: async (query) => {
@@ -1693,17 +1737,25 @@ class WhatsAppConnectorService extends Service {
1693
1737
  this.phoneNumber = null;
1694
1738
  }
1695
1739
  async handleWebhook(event) {
1696
- for (const entry of event.entry ?? []) {
1697
- for (const change of entry.changes ?? []) {
1740
+ for (const entry of asRecordArray(event?.entry)) {
1741
+ for (const change of asRecordArray(entry.changes)) {
1742
+ if (!isRecord(change.value)) {
1743
+ continue;
1744
+ }
1698
1745
  const value = change.value;
1699
- const accountId = this.resolveWebhookAccountId(value?.metadata?.phone_number_id);
1700
- if (typeof value?.metadata?.display_phone_number === "string") {
1701
- this.phoneNumbers.set(accountId, value.metadata.display_phone_number);
1746
+ const metadata = isRecord(value.metadata) ? value.metadata : {};
1747
+ const phoneNumberId = typeof metadata.phone_number_id === "string" ? metadata.phone_number_id : undefined;
1748
+ const accountId = this.resolveWebhookAccountId(phoneNumberId);
1749
+ if (typeof metadata.display_phone_number === "string") {
1750
+ this.phoneNumbers.set(accountId, metadata.display_phone_number);
1702
1751
  if (accountId === this.defaultAccountId) {
1703
- this.phoneNumber = value.metadata.display_phone_number;
1752
+ this.phoneNumber = metadata.display_phone_number;
1704
1753
  }
1705
1754
  }
1706
- for (const message of value?.messages ?? []) {
1755
+ for (const message of asRecordArray(value.messages)) {
1756
+ if (!isWebhookMessage(message)) {
1757
+ continue;
1758
+ }
1707
1759
  await this.handleIncomingWebhookMessage(message, accountId);
1708
1760
  }
1709
1761
  }
@@ -1953,7 +2005,7 @@ class WhatsAppConnectorService extends Service {
1953
2005
  const responseMemories = [];
1954
2006
  for (const [index, chunk] of chunks.entries()) {
1955
2007
  const response = await this.sendTextMessage(params.chatId, chunk, params.externalMessageId, accountId);
1956
- const externalResponseId = response.messages?.[0]?.id ?? `${params.externalMessageId}:response:${index}:${Date.now()}`;
2008
+ const externalResponseId = response.messages[0]?.id ?? `${params.externalMessageId}:response:${index}:${Date.now()}`;
1957
2009
  responseMemories.push({
1958
2010
  id: toMemoryId(this.runtime, accountId === DEFAULT_ACCOUNT_ID ? params.chatId : `${accountId}:${params.chatId}`, externalResponseId),
1959
2011
  entityId: this.runtime.agentId,
@@ -2015,6 +2067,33 @@ class WhatsAppConnectorService extends Service {
2015
2067
  async sendMessage(message) {
2016
2068
  return this.sendTextMessage(message.to, message.content, message.replyToMessageId, message.accountId);
2017
2069
  }
2070
+ whatsappMediaType(media) {
2071
+ const ct = (media.contentType ?? "").toLowerCase();
2072
+ const mime = (media.mimeType ?? "").toLowerCase();
2073
+ if (ct === "image" || mime.startsWith("image/"))
2074
+ return "image";
2075
+ if (ct === "video" || mime.startsWith("video/"))
2076
+ return "video";
2077
+ if (ct === "audio" || mime.startsWith("audio/"))
2078
+ return "audio";
2079
+ return "document";
2080
+ }
2081
+ async sendMediaMessage(accountId, to, media) {
2082
+ if (!media.url)
2083
+ return;
2084
+ const client = this.getClientForAccount(accountId);
2085
+ if (!client) {
2086
+ throw new Error("WhatsApp client not initialized");
2087
+ }
2088
+ const type = this.whatsappMediaType(media);
2089
+ const filename = media.filename ?? media.title ?? undefined;
2090
+ const mediaContent = {
2091
+ link: media.url,
2092
+ ...media.description ? { caption: media.description } : {},
2093
+ ...type === "document" && filename ? { filename } : {}
2094
+ };
2095
+ await client.sendMessage({ type, to, content: mediaContent });
2096
+ }
2018
2097
  async fetchConnectorMessages(context, params) {
2019
2098
  if (typeof this.runtime.getMemoriesByRoomIds !== "function") {
2020
2099
  return [];
@@ -2061,7 +2140,7 @@ class WhatsAppConnectorService extends Service {
2061
2140
  const chatIds = new Set(knownTargets.map((known) => normalizeWhatsAppConnectorTarget(known.chatId)));
2062
2141
  const before = params.before ? Number(params.before) : undefined;
2063
2142
  const after = params.after ? Number(params.after) : undefined;
2064
- return memories.filter((memory) => memory.content?.source === "whatsapp").filter((memory) => this.metadataMatchesAccount(memory, accountId)).filter((memory) => {
2143
+ return memories.filter((memory) => memory.content.source === "whatsapp").filter((memory) => this.metadataMatchesAccount(memory, accountId)).filter((memory) => {
2065
2144
  const metadata = memory.metadata;
2066
2145
  const rawChatId = typeof metadata?.rawChatId === "string" ? normalizeWhatsAppConnectorTarget(metadata.rawChatId) : undefined;
2067
2146
  if (chatId && rawChatId && !chatIds.has(rawChatId)) {
@@ -2087,8 +2166,8 @@ class WhatsAppConnectorService extends Service {
2087
2166
  limit: Math.max(params.limit ?? 100, 100)
2088
2167
  });
2089
2168
  return memories.filter((memory) => {
2090
- const text = String(memory.content?.text ?? "").toLowerCase();
2091
- const from = String(memory.content?.from ?? "").toLowerCase();
2169
+ const text = String(memory.content.text ?? "").toLowerCase();
2170
+ const from = String(memory.content.from ?? "").toLowerCase();
2092
2171
  return text.includes(query) || from.includes(query);
2093
2172
  }).slice(0, params.limit ?? 25);
2094
2173
  }
@@ -2357,6 +2436,66 @@ async function whatsappLogout(workspaceDir, accountId = "default") {
2357
2436
  fs.rmSync(authDir, { recursive: true, force: true });
2358
2437
  }
2359
2438
 
2439
+ // src/webhook-auth.ts
2440
+ import crypto from "node:crypto";
2441
+ var SIGNATURE_HEADER = "x-hub-signature-256";
2442
+ function resolveWhatsAppAppSecret(runtime) {
2443
+ const fromSetting = runtime.getSetting("WHATSAPP_APP_SECRET");
2444
+ if (typeof fromSetting === "string" && fromSetting.trim()) {
2445
+ return fromSetting.trim();
2446
+ }
2447
+ const fromEnv = process.env.WHATSAPP_APP_SECRET;
2448
+ if (typeof fromEnv === "string" && fromEnv.trim()) {
2449
+ return fromEnv.trim();
2450
+ }
2451
+ return null;
2452
+ }
2453
+ function verifyWhatsAppWebhookSignature(appSecret, signatureHeader, rawBody) {
2454
+ if (!signatureHeader || !appSecret || !signatureHeader.startsWith("sha256=")) {
2455
+ return false;
2456
+ }
2457
+ try {
2458
+ const expectedSignature = signatureHeader.slice("sha256=".length);
2459
+ const computedSignature = crypto.createHmac("sha256", appSecret).update(rawBody).digest("hex");
2460
+ const expectedBuffer = Buffer.from(expectedSignature, "hex");
2461
+ const computedBuffer = Buffer.from(computedSignature, "hex");
2462
+ if (expectedBuffer.length !== computedBuffer.length) {
2463
+ return false;
2464
+ }
2465
+ return crypto.timingSafeEqual(expectedBuffer, computedBuffer);
2466
+ } catch {
2467
+ return false;
2468
+ }
2469
+ }
2470
+ function readRouteHeader(req, name) {
2471
+ const headers = req.headers;
2472
+ if (!headers)
2473
+ return;
2474
+ const key = name.toLowerCase();
2475
+ const value = headers[key] ?? headers[name] ?? headers[name.toUpperCase()];
2476
+ if (Array.isArray(value)) {
2477
+ return value[0];
2478
+ }
2479
+ return typeof value === "string" ? value : undefined;
2480
+ }
2481
+ function readWebhookRawBody(req) {
2482
+ if (typeof req.rawBody === "string" && req.rawBody.length > 0) {
2483
+ return req.rawBody;
2484
+ }
2485
+ return null;
2486
+ }
2487
+ function isWhatsAppWebhookAuthorized(runtime, req) {
2488
+ const rawBody = readWebhookRawBody(req);
2489
+ if (rawBody === null) {
2490
+ return false;
2491
+ }
2492
+ const appSecret = resolveWhatsAppAppSecret(runtime);
2493
+ if (!appSecret) {
2494
+ return false;
2495
+ }
2496
+ return verifyWhatsAppWebhookSignature(appSecret, readRouteHeader(req, SIGNATURE_HEADER), rawBody);
2497
+ }
2498
+
2360
2499
  // src/setup-routes.ts
2361
2500
  var whatsappPairingSessions = new Map;
2362
2501
  var MAX_PAIRING_SESSIONS = 10;
@@ -2404,11 +2543,27 @@ async function handleWebhookEvent(req, res, runtime) {
2404
2543
  res.status(503).json({ error: "WhatsApp service unavailable" });
2405
2544
  return;
2406
2545
  }
2407
- const body = req.body;
2408
- if (!body) {
2546
+ if (!isWhatsAppWebhookAuthorized(runtime, req)) {
2547
+ res.status(401).json({ error: "Unauthorized" });
2548
+ return;
2549
+ }
2550
+ const rawBody = readWebhookRawBody(req);
2551
+ if (!rawBody) {
2409
2552
  res.status(400).json({ error: "Missing request body" });
2410
2553
  return;
2411
2554
  }
2555
+ let body;
2556
+ try {
2557
+ const parsed = JSON.parse(rawBody);
2558
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
2559
+ res.status(400).json({ error: "Invalid request body" });
2560
+ return;
2561
+ }
2562
+ body = parsed;
2563
+ } catch {
2564
+ res.status(400).json({ error: "Invalid request body" });
2565
+ return;
2566
+ }
2412
2567
  await service.handleWebhook(body);
2413
2568
  res.status(200).json("EVENT_RECEIVED");
2414
2569
  }
@@ -2444,7 +2599,7 @@ async function handlePair(req, res, runtime) {
2444
2599
  if (!config.connectors)
2445
2600
  config.connectors = {};
2446
2601
  const connectors = config.connectors;
2447
- const previousConfig = connectors.whatsapp ?? {};
2602
+ const previousConfig = connectors.whatsapp;
2448
2603
  if (accountId === "default") {
2449
2604
  connectors.whatsapp = {
2450
2605
  ...previousConfig,
@@ -3031,6 +3186,10 @@ var whatsappPlugin = {
3031
3186
  err: err instanceof Error ? err.message : String(err)
3032
3187
  }, "Failed to register WhatsApp provider with ConnectorAccountManager");
3033
3188
  }
3189
+ },
3190
+ async dispose(runtime) {
3191
+ const svc = runtime.getService(WhatsAppConnectorService.serviceType);
3192
+ await svc?.stop();
3034
3193
  }
3035
3194
  };
3036
3195
  var src_default = whatsappPlugin;
@@ -3075,7 +3234,8 @@ var __bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__ = [
3075
3234
  stopAllPairingSessions,
3076
3235
  whatsappSetupRoutes
3077
3236
  ];
3078
- globalThis.__bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__ = __bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__;
3237
+ var bundleSafetyGlobal = globalThis;
3238
+ bundleSafetyGlobal.__bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__ = __bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__;
3079
3239
  export {
3080
3240
  whatsappSetupRoutes,
3081
3241
  whatsappLogout,
@@ -3121,5 +3281,5 @@ export {
3121
3281
  ClientFactory
3122
3282
  };
3123
3283
 
3124
- //# debugId=ACCEAA76DD452ADF64756E2164756E21
3284
+ //# debugId=8DCA091A96E61C8E64756E2164756E21
3125
3285
  //# sourceMappingURL=index.js.map