@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.
- package/LICENSE +21 -0
- package/README.md +104 -211
- package/auto-enable.ts +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/accounts.d.ts +2 -2
- package/dist/baileys/message-adapter.d.ts.map +1 -1
- package/dist/baileys/qr-code.d.ts.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/connector-account-provider.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +209 -49
- package/dist/index.js.map +16 -14
- package/dist/media.d.ts +2 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/qrcode-terminal-types.d.ts +6 -0
- package/dist/qrcode-terminal-types.d.ts.map +1 -0
- package/dist/runtime-service.d.ts +10 -1
- package/dist/runtime-service.d.ts.map +1 -1
- package/dist/setup-routes.d.ts.map +1 -1
- package/dist/webhook-auth.d.ts +11 -0
- package/dist/webhook-auth.d.ts.map +1 -0
- package/package.json +30 -5
- package/registry-entry.json +128 -0
- package/dist/actions/index.d.ts +0 -1
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/validators.d.ts +0 -10
- package/dist/utils/validators.d.ts.map +0 -1
package/dist/accounts.d.ts
CHANGED
|
@@ -107,7 +107,7 @@ export interface ResolvedWhatsAppAccount {
|
|
|
107
107
|
*/
|
|
108
108
|
export declare function normalizeAccountId(accountId?: string | null): string;
|
|
109
109
|
/**
|
|
110
|
-
* Gets the
|
|
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
|
|
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;
|
|
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":"
|
|
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"}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
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
|
|
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[];
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,4BAA4B,EAC5B,gCAAgC,EAChC,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,6BAA6B,EAC7B,qBAAqB,EACrB,cAAc,EACf,MAAM,eAAe,CAAC;AAMvB,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAMF,MAAM,MAAM,yBAAyB,GAAG;IACtC,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;CACzC,CAAC;AAMF,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,aAAa,CAAC,EAAE,6BAA6B,CAAC;CAC/C,CAAC;AAMF,MAAM,MAAM,qBAAqB,GAAG;IAClC,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mDAAmD;IACnD,sBAAsB,CAAC,EAAE,4BAA4B,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,qEAAqE;IACrE,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,wGAAwG;IACxG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,gCAAgC,CAAC;CAC9C,CAAC;AAMF,MAAM,MAAM,qBAAqB,GAAG;IAClC,
|
|
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
|
|
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
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
|
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
|
|
294
|
-
groupPolicy: account.config
|
|
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
|
|
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
|
|
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
|
|
861
|
+
throw new Error(`Message type ${msg.type} is outside the Baileys adapter contract`);
|
|
839
862
|
}
|
|
840
863
|
}
|
|
841
864
|
mediaWithCaption(key, media) {
|
|
842
|
-
|
|
843
|
-
throw new Error(`${key} message requires a media link`);
|
|
844
|
-
}
|
|
865
|
+
const link = assertValidWhatsAppMediaLink(media.link, key);
|
|
845
866
|
return {
|
|
846
|
-
[key]: { url:
|
|
867
|
+
[key]: { url: link },
|
|
847
868
|
...media.caption ? { caption: media.caption } : {}
|
|
848
869
|
};
|
|
849
870
|
}
|
|
850
871
|
mediaNoCaption(key, media) {
|
|
851
|
-
|
|
852
|
-
|
|
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
|
-
|
|
858
|
-
throw new Error("document message requires a media link");
|
|
859
|
-
}
|
|
876
|
+
const link = assertValidWhatsAppMediaLink(media.link, "document");
|
|
860
877
|
return {
|
|
861
|
-
document: { url:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
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
|
|
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
|
|
1700
|
-
|
|
1701
|
-
|
|
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 =
|
|
1752
|
+
this.phoneNumber = metadata.display_phone_number;
|
|
1704
1753
|
}
|
|
1705
1754
|
}
|
|
1706
|
-
for (const message of value
|
|
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
|
|
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
|
|
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
|
|
2091
|
-
const from = String(memory.content
|
|
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
|
-
|
|
2408
|
-
|
|
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
|
-
|
|
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=
|
|
3284
|
+
//# debugId=8DCA091A96E61C8E64756E2164756E21
|
|
3125
3285
|
//# sourceMappingURL=index.js.map
|