@elizaos/plugin-whatsapp 2.0.0-alpha.8 → 2.0.0-beta.1

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.
Files changed (54) hide show
  1. package/README.md +283 -0
  2. package/auto-enable.ts +21 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/accounts.d.ts +205 -0
  5. package/dist/accounts.d.ts.map +1 -0
  6. package/dist/actions/index.d.ts +1 -0
  7. package/dist/actions/index.d.ts.map +1 -0
  8. package/dist/api/whatsapp-routes.d.ts +53 -0
  9. package/dist/api/whatsapp-routes.d.ts.map +1 -0
  10. package/dist/baileys/auth.d.ts +10 -0
  11. package/dist/baileys/auth.d.ts.map +1 -0
  12. package/dist/baileys/connection.d.ts +19 -0
  13. package/dist/baileys/connection.d.ts.map +1 -0
  14. package/dist/baileys/message-adapter.d.ts +14 -0
  15. package/dist/baileys/message-adapter.d.ts.map +1 -0
  16. package/dist/baileys/qr-code.d.ts +6 -0
  17. package/dist/baileys/qr-code.d.ts.map +1 -0
  18. package/dist/client.d.ts +99 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/clients/baileys-client.d.ts +18 -0
  21. package/dist/clients/baileys-client.d.ts.map +1 -0
  22. package/dist/clients/factory.d.ts +6 -0
  23. package/dist/clients/factory.d.ts.map +1 -0
  24. package/dist/clients/interface.d.ts +10 -0
  25. package/dist/clients/interface.d.ts.map +1 -0
  26. package/dist/config.d.ts +135 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/connector-account-provider.d.ts +19 -0
  29. package/dist/connector-account-provider.d.ts.map +1 -0
  30. package/dist/index.d.ts +14 -2
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +2353 -823
  33. package/dist/index.js.map +20 -18
  34. package/dist/normalize.d.ts +69 -0
  35. package/dist/normalize.d.ts.map +1 -0
  36. package/dist/pairing-service.d.ts +41 -0
  37. package/dist/pairing-service.d.ts.map +1 -0
  38. package/dist/runtime-service.d.ts +116 -0
  39. package/dist/runtime-service.d.ts.map +1 -0
  40. package/dist/services/whatsapp-pairing.d.ts +41 -0
  41. package/dist/services/whatsapp-pairing.d.ts.map +1 -0
  42. package/dist/setup-routes.d.ts +26 -0
  43. package/dist/setup-routes.d.ts.map +1 -0
  44. package/dist/types.d.ts +370 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/utils/config-detector.d.ts +3 -0
  47. package/dist/utils/config-detector.d.ts.map +1 -0
  48. package/dist/utils/index.d.ts +3 -0
  49. package/dist/utils/index.d.ts.map +1 -0
  50. package/dist/utils/validators.d.ts +10 -0
  51. package/dist/utils/validators.d.ts.map +1 -0
  52. package/dist/workflow-credential-provider.d.ts +21 -0
  53. package/dist/workflow-credential-provider.d.ts.map +1 -0
  54. package/package.json +24 -16
package/dist/index.js.map CHANGED
@@ -1,25 +1,27 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/actions/sendMessage.ts", "../src/actions/sendReaction.ts", "../src/client.ts", "../src/utils/config-detector.ts", "../src/clients/baileys-client.ts", "../src/baileys/auth.ts", "../src/baileys/connection.ts", "../src/baileys/message-adapter.ts", "../src/baileys/qr-code.ts", "../src/clients/factory.ts", "../src/handlers/message.handler.ts", "../src/handlers/webhook.handler.ts", "../src/accounts.ts", "../src/normalize.ts", "../src/types.ts"],
3
+ "sources": ["../src/index.ts", "../src/accounts.ts", "../src/connector-account-provider.ts", "../src/runtime-service.ts", "../src/client.ts", "../src/clients/baileys-client.ts", "../src/baileys/auth.ts", "../src/baileys/connection.ts", "../src/baileys/message-adapter.ts", "../src/baileys/qr-code.ts", "../src/normalize.ts", "../src/setup-routes.ts", "../src/pairing-service.ts", "../src/workflow-credential-provider.ts", "../src/api/whatsapp-routes.ts", "../src/utils/config-detector.ts", "../src/clients/factory.ts", "../src/types.ts"],
4
4
  "sourcesContent": [
5
- "import { EventEmitter } from \"node:events\";\nimport type { Plugin } from \"@elizaos/core\";\nimport { sendMessageAction, sendReactionAction } from \"./actions\";\nimport { ClientFactory } from \"./clients/factory\";\nimport type { IWhatsAppClient } from \"./clients/interface\";\nimport { MessageHandler, WebhookHandler } from \"./handlers\";\nimport type {\n ConnectionStatus,\n WhatsAppConfig,\n WhatsAppMessage,\n WhatsAppMessageResponse,\n WhatsAppWebhookEvent,\n} from \"./types\";\n\nexport class WhatsAppPlugin extends EventEmitter implements Plugin {\n private readonly client: IWhatsAppClient;\n private readonly messageHandler: MessageHandler;\n private readonly webhookHandler: WebhookHandler;\n\n name: string;\n description: string;\n actions = [sendMessageAction, sendReactionAction];\n\n constructor(config: WhatsAppConfig) {\n super();\n this.name = \"WhatsApp Plugin\";\n this.description = \"WhatsApp integration supporting Cloud API and Baileys (QR auth)\";\n this.client = ClientFactory.create(config);\n this.messageHandler = new MessageHandler(this.client);\n this.webhookHandler = new WebhookHandler();\n this.setupEventForwarding();\n }\n\n private setupEventForwarding(): void {\n this.client.on(\"message\", (payload) => this.emit(\"message\", payload));\n this.client.on(\"qr\", (payload) => this.emit(\"qr\", payload));\n this.client.on(\"ready\", () => this.emit(\"ready\"));\n this.client.on(\"connection\", (status) => this.emit(\"connection\", status));\n this.client.on(\"error\", (error) => this.emit(\"error\", error));\n }\n\n async start(): Promise<void> {\n await this.client.start();\n }\n\n async stop(): Promise<void> {\n await this.client.stop();\n }\n\n getConnectionStatus(): ConnectionStatus {\n return this.client.getConnectionStatus();\n }\n\n async sendMessage(message: WhatsAppMessage): Promise<WhatsAppMessageResponse> {\n return this.messageHandler.send(message);\n }\n\n async handleWebhook(event: WhatsAppWebhookEvent): Promise<void> {\n return this.webhookHandler.handle(event);\n }\n\n async verifyWebhook(token: string): Promise<boolean> {\n if (!this.client.verifyWebhook) {\n throw new Error(\"verifyWebhook is only supported by Cloud API authentication\");\n }\n return this.client.verifyWebhook(token);\n }\n}\n\nconst whatsappPlugin: Plugin = {\n name: \"whatsapp\",\n description: \"WhatsApp integration for ElizaOS (Cloud API + Baileys)\",\n actions: [sendMessageAction, sendReactionAction],\n};\n\nexport default whatsappPlugin;\n\n// Account management exports\nexport {\n checkWhatsAppUserAccess,\n DEFAULT_ACCOUNT_ID,\n isMultiAccountEnabled,\n isWhatsAppMentionRequired,\n isWhatsAppUserAllowed,\n listEnabledWhatsAppAccounts,\n listWhatsAppAccountIds,\n normalizeAccountId,\n type ResolvedWhatsAppAccount,\n resolveDefaultWhatsAppAccountId,\n resolveWhatsAppAccount,\n resolveWhatsAppGroupConfig,\n resolveWhatsAppToken,\n type WhatsAppAccessCheckResult,\n type WhatsAppAccountRuntimeConfig,\n type WhatsAppGroupRuntimeConfig,\n type WhatsAppMultiAccountConfig,\n type WhatsAppTokenResolution,\n type WhatsAppTokenSource,\n} from \"./accounts\";\n\n// Channel configuration types\nexport type {\n WhatsAppAccountConfig,\n WhatsAppAckReactionConfig,\n WhatsAppActionConfig,\n WhatsAppChannelConfig,\n WhatsAppGroupConfig,\n} from \"./config\";\n\n// Normalization and utility exports\nexport {\n buildWhatsAppUserJid,\n type ChunkWhatsAppTextOpts,\n chunkWhatsAppText,\n formatWhatsAppId,\n formatWhatsAppPhoneNumber,\n getWhatsAppChatType,\n isValidWhatsAppNumber,\n isWhatsAppGroup,\n isWhatsAppGroupJid,\n isWhatsAppUserTarget,\n normalizeE164,\n normalizeWhatsAppTarget,\n resolveWhatsAppSystemLocation,\n truncateText,\n WHATSAPP_TEXT_CHUNK_LIMIT,\n} from \"./normalize\";\n\nexport { ClientFactory } from \"./clients/factory\";\nexport * from \"./types\";\n",
6
- "import type {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { composePromptFromState, ModelType, parseJSONObjectFromText } from \"@elizaos/core\";\n\nexport const WHATSAPP_SEND_MESSAGE_ACTION = \"WHATSAPP_SEND_MESSAGE\";\n\nconst SEND_MESSAGE_TEMPLATE = `\nYou are extracting WhatsApp message parameters from a conversation.\n\nThe user wants to send a WhatsApp message. Extract the following:\n1. to: The phone number to send to (E.164 format, e.g., +14155552671)\n2. text: The message text to send\n\n{{recentMessages}}\n\nBased on the conversation, extract the message parameters.\n\nRespond with a JSON object:\n{\n \"to\": \"+14155552671\",\n \"text\": \"Hello from WhatsApp!\"\n}\n`;\n\ninterface SendMessageParams {\n to: string;\n text: string;\n}\n\nexport const sendMessageAction: Action = {\n name: WHATSAPP_SEND_MESSAGE_ACTION,\n similes: [\"SEND_WHATSAPP\", \"WHATSAPP_MESSAGE\", \"TEXT_WHATSAPP\", \"SEND_WHATSAPP_MESSAGE\"],\n description: \"Send a text message via WhatsApp\",\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['whatsapp', 'send', 'message'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:whatsapp|send|message)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = 'whatsapp';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (_runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const source = message.content?.source;\n return source === \"whatsapp\";\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n // Get WhatsApp settings\n const accessToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string;\n const phoneNumberId = runtime.getSetting(\"WHATSAPP_PHONE_NUMBER_ID\") as string;\n const apiVersion = (runtime.getSetting(\"WHATSAPP_API_VERSION\") as string) || \"v24.0\";\n\n if (!accessToken || !phoneNumberId) {\n if (callback) {\n await callback({\n text: \"WhatsApp is not configured. Missing access token or phone number ID.\",\n });\n }\n return { success: false, error: \"WhatsApp not configured\" };\n }\n\n const currentState = state ?? (await runtime.composeState(message));\n\n // Extract message parameters using LLM\n const prompt = composePromptFromState({\n state: currentState,\n template: SEND_MESSAGE_TEMPLATE,\n });\n\n let params: SendMessageParams;\n try {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(response) as unknown as SendMessageParams | null;\n if (!parsed || !parsed.to || !parsed.text) {\n // Try to use context from message\n const to = message.content?.from as string;\n const text = currentState.values?.response?.toString() || \"\";\n\n if (!to) {\n if (callback) {\n await callback({\n text: \"Could not determine who to send the message to\",\n });\n }\n return { success: false, error: \"Missing recipient\" };\n }\n\n // Validate text is not empty\n if (!text || text.trim() === \"\") {\n if (callback) {\n await callback({\n text: \"Cannot send an empty message. Please provide message content.\",\n });\n }\n return { success: false, error: \"Empty message text\" };\n }\n\n params = { to, text };\n } else {\n // Also validate that parsed text is not empty\n if (!parsed.text.trim()) {\n if (callback) {\n await callback({\n text: \"Cannot send an empty message. Please provide message content.\",\n });\n }\n return { success: false, error: \"Empty message text\" };\n }\n params = parsed;\n }\n } catch {\n if (callback) {\n await callback({\n text: \"Failed to parse message parameters\",\n });\n }\n return { success: false, error: \"Failed to parse message parameters\" };\n }\n\n // Send the message via WhatsApp Cloud API\n try {\n const url = `https://graph.facebook.com/${apiVersion}/${phoneNumberId}/messages`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to: params.to,\n type: \"text\",\n text: {\n preview_url: false,\n body: params.text,\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error?.message || `HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { messages: Array<{ id: string }> };\n const messageId = data.messages?.[0]?.id;\n\n if (callback) {\n await callback({\n text: `Message sent to ${params.to}`,\n action: WHATSAPP_SEND_MESSAGE_ACTION,\n });\n }\n\n return {\n success: true,\n data: {\n action: WHATSAPP_SEND_MESSAGE_ACTION,\n to: params.to,\n messageId,\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to send WhatsApp message: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Send a WhatsApp message to +14155552671 saying hello\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll send that WhatsApp message now.\",\n actions: [WHATSAPP_SEND_MESSAGE_ACTION],\n },\n },\n ],\n ] as ActionExample[][],\n};\n",
7
- "import type {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { composePromptFromState, ModelType, parseJSONObjectFromText } from \"@elizaos/core\";\n\nexport const WHATSAPP_SEND_REACTION_ACTION = \"WHATSAPP_SEND_REACTION\";\n\nconst REACTION_TEMPLATE = `\nYou are extracting WhatsApp reaction parameters from a conversation.\n\nThe user wants to react to a WhatsApp message. Extract the following:\n1. messageId: The ID of the message to react to\n2. emoji: The emoji to use as a reaction\n\n{{recentMessages}}\n\nBased on the conversation, extract the reaction parameters.\n\nRespond with a JSON object:\n{\n \"messageId\": \"wamid.xxx\",\n \"emoji\": \"👍\"\n}\n`;\n\ninterface ReactionParams {\n messageId: string;\n emoji: string;\n}\n\nexport const sendReactionAction: Action = {\n name: WHATSAPP_SEND_REACTION_ACTION,\n similes: [\"WHATSAPP_REACT\", \"REACT_WHATSAPP\", \"WHATSAPP_EMOJI\"],\n description: \"Send a reaction emoji to a WhatsApp message\",\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['whatsapp', 'send', 'reaction'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:whatsapp|send|reaction)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = 'whatsapp';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (_runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const source = message.content?.source;\n return source === \"whatsapp\";\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n // Get WhatsApp settings\n const accessToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string;\n const phoneNumberId = runtime.getSetting(\"WHATSAPP_PHONE_NUMBER_ID\") as string;\n const apiVersion = (runtime.getSetting(\"WHATSAPP_API_VERSION\") as string) || \"v24.0\";\n\n if (!accessToken || !phoneNumberId) {\n if (callback) {\n await callback({\n text: \"WhatsApp is not configured. Missing access token or phone number ID.\",\n });\n }\n return { success: false, error: \"WhatsApp not configured\" };\n }\n\n const currentState = state ?? (await runtime.composeState(message));\n\n // Extract reaction parameters using LLM\n const prompt = composePromptFromState({\n state: currentState,\n template: REACTION_TEMPLATE,\n });\n\n let params: ReactionParams;\n try {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(response) as unknown as ReactionParams | null;\n if (!parsed || !parsed.messageId || !parsed.emoji) {\n // Try to use context from message\n const messageId = message.content?.messageId as string;\n if (!messageId) {\n if (callback) {\n await callback({\n text: \"Could not determine which message to react to\",\n });\n }\n return { success: false, error: \"Missing message ID\" };\n }\n params = { messageId, emoji: \"👍\" }; // Default to thumbs up\n } else {\n params = parsed;\n }\n } catch {\n if (callback) {\n await callback({\n text: \"Failed to parse reaction parameters\",\n });\n }\n return { success: false, error: \"Failed to parse reaction parameters\" };\n }\n\n // Get the recipient (sender of the original message)\n const to = message.content?.from as string;\n if (!to) {\n if (callback) {\n await callback({\n text: \"Could not determine the recipient for the reaction\",\n });\n }\n return { success: false, error: \"Missing recipient\" };\n }\n\n // Send the reaction via WhatsApp Cloud API\n try {\n const url = `https://graph.facebook.com/${apiVersion}/${phoneNumberId}/messages`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to,\n type: \"reaction\",\n reaction: {\n message_id: params.messageId,\n emoji: params.emoji,\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error?.message || `HTTP ${response.status}`);\n }\n\n if (callback) {\n await callback({\n text: `Reacted with ${params.emoji}`,\n action: WHATSAPP_SEND_REACTION_ACTION,\n });\n }\n\n return {\n success: true,\n data: {\n action: WHATSAPP_SEND_REACTION_ACTION,\n messageId: params.messageId,\n emoji: params.emoji,\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to send reaction: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"React with a thumbs up\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll add that reaction.\",\n actions: [WHATSAPP_SEND_REACTION_ACTION],\n },\n },\n ],\n ] as ActionExample[][],\n};\n",
8
- "import axios, { type AxiosInstance, type AxiosResponse } from \"axios\";\nimport { EventEmitter } from \"node:events\";\nimport type { IWhatsAppClient } from \"./clients/interface\";\nimport type {\n CloudAPIConfig,\n ConnectionStatus,\n SendReactionParams,\n SendReactionResult,\n WhatsAppInteractiveMessage,\n WhatsAppLocationMessage,\n WhatsAppMediaMessage,\n WhatsAppMessage,\n WhatsAppMessageResponse,\n WhatsAppReactionMessage,\n} from \"./types\";\n\nconst DEFAULT_API_VERSION = \"v24.0\";\n\nexport class WhatsAppClient extends EventEmitter implements IWhatsAppClient {\n private client: AxiosInstance;\n private config: CloudAPIConfig;\n private connectionStatus: ConnectionStatus = \"close\";\n\n constructor(config: CloudAPIConfig) {\n super();\n this.config = config;\n const apiVersion = config.apiVersion || DEFAULT_API_VERSION;\n\n this.client = axios.create({\n baseURL: `https://graph.facebook.com/${apiVersion}`,\n headers: {\n Authorization: `Bearer ${config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n async start(): Promise<void> {\n this.connectionStatus = \"open\";\n this.emit(\"connection\", \"open\");\n this.emit(\"ready\");\n }\n\n async stop(): Promise<void> {\n this.connectionStatus = \"close\";\n this.emit(\"connection\", \"close\");\n }\n\n getConnectionStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n /**\n * Get the configured phone number ID.\n */\n getPhoneNumberId(): string {\n return this.config.phoneNumberId;\n }\n\n /**\n * Send a message of any supported type.\n */\n async sendMessage(message: WhatsAppMessage): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n const endpoint = `/${this.config.phoneNumberId}/messages`;\n const payload = this.buildMessagePayload(message);\n return this.client.post(endpoint, payload);\n }\n\n /**\n * Send a text message.\n */\n async sendTextMessage(\n to: string,\n text: string,\n _previewUrl = false\n ): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"text\",\n to,\n content: text,\n });\n }\n\n /**\n * Send a reaction to a message.\n */\n async sendReaction(params: SendReactionParams): Promise<SendReactionResult> {\n const endpoint = `/${this.config.phoneNumberId}/messages`;\n\n const payload = {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to: params.to,\n type: \"reaction\",\n reaction: {\n message_id: params.messageId,\n emoji: params.emoji,\n },\n };\n\n try {\n const response = await this.client.post<WhatsAppMessageResponse>(endpoint, payload);\n return {\n success: true,\n messageId: response.data.messages?.[0]?.id,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Remove a reaction from a message (send empty emoji).\n */\n async removeReaction(to: string, messageId: string): Promise<SendReactionResult> {\n return this.sendReaction({\n to,\n messageId,\n emoji: \"\",\n });\n }\n\n /**\n * Send an image message.\n */\n async sendImage(\n to: string,\n imageUrl: string,\n caption?: string\n ): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"image\",\n to,\n content: {\n link: imageUrl,\n caption,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send a video message.\n */\n async sendVideo(\n to: string,\n videoUrl: string,\n caption?: string\n ): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"video\",\n to,\n content: {\n link: videoUrl,\n caption,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send an audio message.\n */\n async sendAudio(to: string, audioUrl: string): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"audio\",\n to,\n content: {\n link: audioUrl,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send a document message.\n */\n async sendDocument(\n to: string,\n documentUrl: string,\n filename?: string,\n caption?: string\n ): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"document\",\n to,\n content: {\n link: documentUrl,\n filename,\n caption,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send a location message.\n */\n async sendLocation(\n to: string,\n latitude: number,\n longitude: number,\n name?: string,\n address?: string\n ): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"location\",\n to,\n content: {\n latitude,\n longitude,\n name,\n address,\n } as WhatsAppLocationMessage,\n });\n }\n\n /**\n * Send an interactive button message.\n */\n async sendButtonMessage(\n to: string,\n bodyText: string,\n buttons: Array<{ id: string; title: string }>,\n headerText?: string,\n footerText?: string\n ): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n const interactive: WhatsAppInteractiveMessage = {\n type: \"button\",\n body: { text: bodyText },\n action: {\n buttons: buttons.map((btn) => ({\n type: \"reply\" as const,\n reply: { id: btn.id, title: btn.title },\n })),\n },\n };\n\n if (headerText) {\n interactive.header = { type: \"text\", text: headerText };\n }\n if (footerText) {\n interactive.footer = { text: footerText };\n }\n\n return this.sendMessage({\n type: \"interactive\",\n to,\n content: interactive,\n });\n }\n\n /**\n * Send an interactive list message.\n */\n async sendListMessage(\n to: string,\n bodyText: string,\n buttonText: string,\n sections: Array<{\n title?: string;\n rows: Array<{ id: string; title: string; description?: string }>;\n }>,\n headerText?: string,\n footerText?: string\n ): Promise<AxiosResponse<WhatsAppMessageResponse>> {\n const interactive: WhatsAppInteractiveMessage = {\n type: \"list\",\n body: { text: bodyText },\n action: {\n button: buttonText,\n sections,\n },\n };\n\n if (headerText) {\n interactive.header = { type: \"text\", text: headerText };\n }\n if (footerText) {\n interactive.footer = { text: footerText };\n }\n\n return this.sendMessage({\n type: \"interactive\",\n to,\n content: interactive,\n });\n }\n\n /**\n * Mark a message as read.\n */\n async markMessageAsRead(messageId: string): Promise<boolean> {\n const endpoint = `/${this.config.phoneNumberId}/messages`;\n\n const payload = {\n messaging_product: \"whatsapp\",\n status: \"read\",\n message_id: messageId,\n };\n\n try {\n await this.client.post(endpoint, payload);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Download media by ID.\n */\n async getMediaUrl(mediaId: string): Promise<string | null> {\n try {\n const response = await this.client.get(`/${mediaId}`);\n return response.data.url || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Verify webhook token.\n */\n async verifyWebhook(token: string): Promise<boolean> {\n return token === this.config.webhookVerifyToken;\n }\n\n /**\n * Build the message payload based on message type.\n */\n private buildMessagePayload(message: WhatsAppMessage): Record<string, unknown> {\n const basePayload = {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to: message.to,\n type: message.type,\n };\n\n // Add context for replies\n const contextPayload = message.replyToMessageId\n ? { context: { message_id: message.replyToMessageId } }\n : {};\n\n switch (message.type) {\n case \"text\":\n return {\n ...basePayload,\n ...contextPayload,\n text: {\n body: message.content as string,\n },\n };\n\n case \"template\":\n return {\n ...basePayload,\n ...contextPayload,\n template: message.content,\n };\n\n case \"image\": {\n const imageContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n image: {\n link: imageContent.link,\n caption: imageContent.caption,\n },\n };\n }\n\n case \"video\": {\n const videoContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n video: {\n link: videoContent.link,\n caption: videoContent.caption,\n },\n };\n }\n\n case \"audio\": {\n const audioContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n audio: {\n link: audioContent.link,\n },\n };\n }\n\n case \"document\": {\n const docContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n document: {\n link: docContent.link,\n filename: docContent.filename,\n caption: docContent.caption,\n },\n };\n }\n\n case \"location\": {\n const locContent = message.content as WhatsAppLocationMessage;\n return {\n ...basePayload,\n ...contextPayload,\n location: {\n latitude: locContent.latitude,\n longitude: locContent.longitude,\n name: locContent.name,\n address: locContent.address,\n },\n };\n }\n\n case \"reaction\": {\n const reactionContent = message.content as WhatsAppReactionMessage;\n return {\n ...basePayload,\n reaction: {\n message_id: reactionContent.messageId,\n emoji: reactionContent.emoji,\n },\n };\n }\n\n case \"interactive\": {\n const interactiveContent = message.content as WhatsAppInteractiveMessage;\n return {\n ...basePayload,\n ...contextPayload,\n interactive: interactiveContent,\n };\n }\n\n default:\n return basePayload;\n }\n }\n}\n",
9
- "import type { WhatsAppConfig } from \"../types\";\n\nexport function detectAuthMethod(config: WhatsAppConfig | Record<string, unknown>): \"baileys\" | \"cloudapi\" {\n const explicitMethod = (config as { authMethod?: unknown }).authMethod;\n if (explicitMethod !== undefined) {\n if (explicitMethod === \"baileys\" || explicitMethod === \"cloudapi\") {\n return explicitMethod;\n }\n throw new Error(\n `Invalid authMethod: \"${String(explicitMethod)}\". Must be either \"baileys\" or \"cloudapi\".`\n );\n }\n\n if (\"authDir\" in config && config.authDir) {\n return \"baileys\";\n }\n\n if (\"accessToken\" in config && \"phoneNumberId\" in config) {\n return \"cloudapi\";\n }\n\n throw new Error(\n \"Cannot detect auth method. Provide either authDir (Baileys) or accessToken + phoneNumberId (Cloud API).\"\n );\n}\n",
10
- "import { EventEmitter } from \"node:events\";\nimport { BaileysAuthManager } from \"../baileys/auth\";\nimport { BaileysConnection } from \"../baileys/connection\";\nimport { MessageAdapter } from \"../baileys/message-adapter\";\nimport { QRCodeGenerator } from \"../baileys/qr-code\";\nimport type { IWhatsAppClient } from \"./interface\";\nimport type { BaileysConfig, ConnectionStatus, WhatsAppMessage, WhatsAppMessageResponse } from \"../types\";\n\nexport class BaileysClient extends EventEmitter implements IWhatsAppClient {\n private readonly config: BaileysConfig;\n private readonly authManager: BaileysAuthManager;\n private readonly connection: BaileysConnection;\n private readonly qrGenerator: QRCodeGenerator;\n private readonly adapter: MessageAdapter;\n\n constructor(config: BaileysConfig) {\n super();\n this.config = config;\n this.authManager = new BaileysAuthManager(config.authDir);\n this.connection = new BaileysConnection(this.authManager);\n this.qrGenerator = new QRCodeGenerator();\n this.adapter = new MessageAdapter();\n this.setupEventForwarding();\n }\n\n private setupEventForwarding(): void {\n this.connection.on(\"qr\", async (qr: string) => {\n try {\n const qrData = await this.qrGenerator.generate(qr);\n if (this.config.printQRInTerminal !== false) {\n console.log(\"\\n=== Scan QR Code ===\\n\");\n console.log(qrData.terminal);\n }\n this.emit(\"qr\", qrData);\n } catch (error) {\n this.emit(\"error\", error);\n }\n });\n\n this.connection.on(\"connection\", (status: ConnectionStatus) => {\n this.emit(\"connection\", status);\n if (status === \"open\") {\n this.emit(\"ready\");\n }\n });\n\n this.connection.on(\"messages\", (messages: unknown[]) => {\n for (const message of messages) {\n const maybe = message as { key?: { fromMe?: boolean }; message?: unknown };\n if (!maybe.key?.fromMe && maybe.message) {\n this.emit(\"message\", this.adapter.toUnified(message as any));\n }\n }\n });\n\n this.connection.on(\"error\", (error: unknown) => {\n this.emit(\"error\", error);\n });\n }\n\n async start(): Promise<void> {\n await this.connection.connect();\n }\n\n async stop(): Promise<void> {\n await this.connection.disconnect();\n }\n\n async sendMessage(message: WhatsAppMessage): Promise<WhatsAppMessageResponse> {\n const socket = this.connection.getSocket();\n if (!socket) {\n throw new Error(\"Not connected to WhatsApp via Baileys\");\n }\n\n const payload = this.adapter.toBaileys(message);\n const result = await socket.sendMessage(message.to, payload as any);\n const id = result?.key?.id ?? \"\";\n\n return {\n messaging_product: \"whatsapp\",\n contacts: [{ input: message.to, wa_id: message.to }],\n messages: [{ id }],\n };\n }\n\n getConnectionStatus(): ConnectionStatus {\n return this.connection.getStatus();\n }\n}\n",
11
- "import { useMultiFileAuthState } from \"@whiskeysockets/baileys\";\nimport type { AuthenticationState } from \"@whiskeysockets/baileys\";\n\nexport class BaileysAuthManager {\n private readonly authDir: string;\n private state?: AuthenticationState;\n private saveCreds?: () => Promise<void>;\n\n constructor(authDir: string) {\n this.authDir = authDir;\n }\n\n async initialize(): Promise<AuthenticationState> {\n const result = await useMultiFileAuthState(this.authDir);\n this.state = result.state;\n this.saveCreds = result.saveCreds;\n return this.state;\n }\n\n async save(): Promise<void> {\n if (this.saveCreds) {\n await this.saveCreds();\n }\n }\n}\n",
12
- "import makeWASocket, { DisconnectReason, type WASocket } from \"@whiskeysockets/baileys\";\nimport { Boom } from \"@hapi/boom\";\nimport { EventEmitter } from \"node:events\";\nimport pino from \"pino\";\nimport type { BaileysAuthManager } from \"./auth\";\nimport type { ConnectionStatus } from \"../types\";\n\nexport class BaileysConnection extends EventEmitter {\n private socket?: WASocket;\n private readonly authManager: BaileysAuthManager;\n private connectionStatus: ConnectionStatus = \"close\";\n private reconnecting = false;\n private reconnectAttempts = 0;\n private readonly maxReconnectAttempts = 10;\n\n constructor(authManager: BaileysAuthManager) {\n super();\n this.authManager = authManager;\n }\n\n async connect(): Promise<WASocket> {\n this.connectionStatus = \"connecting\";\n this.emit(\"connection\", \"connecting\");\n\n const state = await this.authManager.initialize();\n this.socket = makeWASocket({\n auth: state,\n printQRInTerminal: false,\n logger: pino({ level: \"silent\" }),\n browser: [\"Chrome (Linux)\", \"\", \"\"],\n });\n\n this.setupEventHandlers();\n return this.socket;\n }\n\n private setupEventHandlers(): void {\n if (!this.socket) {\n return;\n }\n\n this.socket.ev.on(\"connection.update\", async (update) => {\n const { connection, qr, lastDisconnect } = update;\n\n if (qr) {\n this.emit(\"qr\", qr);\n }\n\n if (connection) {\n this.connectionStatus = connection;\n this.emit(\"connection\", connection);\n }\n\n if (connection === \"open\") {\n this.reconnectAttempts = 0;\n return;\n }\n\n if (connection !== \"close\") {\n return;\n }\n\n const statusCode = (lastDisconnect?.error as Boom | undefined)?.output?.statusCode;\n const isQRTimeout = statusCode === 515;\n const shouldReconnect = statusCode !== DisconnectReason.loggedOut && statusCode !== 405;\n\n if (lastDisconnect?.error && !isQRTimeout) {\n this.emit(\"error\", lastDisconnect.error);\n }\n\n if (!shouldReconnect) {\n return;\n }\n\n if (this.reconnecting) {\n return;\n }\n\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n this.emit(\"error\", new Error(\"Max reconnection attempts reached\"));\n return;\n }\n\n this.reconnecting = true;\n try {\n this.reconnectAttempts += 1;\n const baseDelayMs = isQRTimeout ? 1000 : 3000;\n const backoffMs = Math.min(\n baseDelayMs * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n await this.connect();\n } catch (error) {\n this.emit(\"error\", error);\n } finally {\n this.reconnecting = false;\n }\n });\n\n this.socket.ev.on(\"creds.update\", async () => {\n await this.authManager.save();\n });\n\n this.socket.ev.on(\"messages.upsert\", ({ messages }) => {\n this.emit(\"messages\", messages);\n });\n }\n\n getSocket(): WASocket | undefined {\n return this.socket;\n }\n\n getStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n (\n this.socket.ev as unknown as {\n removeAllListeners: (...args: unknown[]) => void;\n }\n ).removeAllListeners();\n (this.socket as unknown as { ws?: { close?: () => void } }).ws?.close?.();\n this.socket = undefined;\n this.connectionStatus = \"close\";\n this.emit(\"connection\", \"close\");\n }\n}\n",
13
- "import type { proto } from \"@whiskeysockets/baileys\";\nimport type {\n UnifiedMessage,\n WhatsAppMediaMessage,\n WhatsAppMessage,\n WhatsAppTemplate,\n} from \"../types\";\n\nexport class MessageAdapter {\n toUnified(msg: proto.IWebMessageInfo): UnifiedMessage {\n return {\n id: msg.key?.id ?? \"\",\n from: msg.key?.remoteJid ?? \"\",\n timestamp: Number(msg.messageTimestamp ?? 0),\n type: this.detectType(msg),\n content: this.extractContent(msg),\n };\n }\n\n toBaileys(msg: WhatsAppMessage): Record<string, unknown> {\n switch (msg.type) {\n case \"text\":\n return { text: msg.content as string };\n case \"image\":\n return this.mediaWithCaption(\"image\", msg.content as WhatsAppMediaMessage);\n case \"video\":\n return this.mediaWithCaption(\"video\", msg.content as WhatsAppMediaMessage);\n case \"audio\":\n return this.mediaNoCaption(\"audio\", msg.content as WhatsAppMediaMessage);\n case \"document\":\n return this.mediaWithFilename(msg.content as WhatsAppMediaMessage);\n case \"template\":\n return { text: this.renderTemplate(msg.content as WhatsAppTemplate) };\n default:\n throw new Error(`Message type ${msg.type} is not yet supported for Baileys`);\n }\n }\n\n private mediaWithCaption(\n key: \"image\" | \"video\",\n media: WhatsAppMediaMessage\n ): Record<string, unknown> {\n if (!media?.link) {\n throw new Error(`${key} message requires a media link`);\n }\n return {\n [key]: { url: media.link },\n ...(media.caption ? { caption: media.caption } : {}),\n };\n }\n\n private mediaNoCaption(\n key: \"audio\",\n media: WhatsAppMediaMessage\n ): Record<string, unknown> {\n if (!media?.link) {\n throw new Error(`${key} message requires a media link`);\n }\n return { [key]: { url: media.link } };\n }\n\n private mediaWithFilename(media: WhatsAppMediaMessage): Record<string, unknown> {\n if (!media?.link) {\n throw new Error(\"document message requires a media link\");\n }\n return {\n document: { url: media.link },\n ...(media.filename ? { fileName: media.filename } : {}),\n ...(media.caption ? { caption: media.caption } : {}),\n };\n }\n\n private detectType(\n msg: proto.IWebMessageInfo\n ): \"text\" | \"image\" | \"audio\" | \"video\" | \"document\" {\n if (msg.message?.conversation || msg.message?.extendedTextMessage) {\n return \"text\";\n }\n if (msg.message?.imageMessage) {\n return \"image\";\n }\n if (msg.message?.audioMessage) {\n return \"audio\";\n }\n if (msg.message?.videoMessage) {\n return \"video\";\n }\n if (msg.message?.documentMessage) {\n return \"document\";\n }\n return \"text\";\n }\n\n private extractContent(msg: proto.IWebMessageInfo): string {\n return msg.message?.conversation ?? msg.message?.extendedTextMessage?.text ?? \"\";\n }\n\n private renderTemplate(template: WhatsAppTemplate): string {\n const params = template.components?.flatMap((component) =>\n component.parameters.map((parameter) => parameter.text).filter(Boolean)\n );\n return params && params.length > 0\n ? `${template.name}: ${params.join(\", \")}`\n : template.name;\n }\n}\n",
14
- "import QRCode from \"qrcode\";\nimport QRCodeTerminal from \"qrcode-terminal\";\nimport type { QRCodeData } from \"../types\";\n\nexport class QRCodeGenerator {\n async generate(qrString: string): Promise<QRCodeData> {\n return {\n terminal: await this.generateTerminal(qrString),\n dataURL: await QRCode.toDataURL(qrString),\n raw: qrString,\n };\n }\n\n private async generateTerminal(qr: string): Promise<string> {\n return new Promise((resolve) => {\n QRCodeTerminal.generate(qr, { small: true }, (output: string) => {\n resolve(output);\n });\n });\n }\n}\n",
15
- "import { WhatsAppClient } from \"../client\";\nimport type { BaileysConfig, CloudAPIConfig, WhatsAppConfig } from \"../types\";\nimport { detectAuthMethod } from \"../utils/config-detector\";\nimport { BaileysClient } from \"./baileys-client\";\nimport type { IWhatsAppClient } from \"./interface\";\n\nexport class ClientFactory {\n static create(config: WhatsAppConfig): IWhatsAppClient {\n const authMethod = detectAuthMethod(config);\n if (authMethod === \"baileys\") {\n return new BaileysClient(config as BaileysConfig);\n }\n return new WhatsAppClient(config as CloudAPIConfig);\n }\n}\n",
16
- "import type { IWhatsAppClient } from \"../clients/interface\";\nimport type { WhatsAppMessage, WhatsAppMessageResponse } from \"../types\";\n\nexport class MessageHandler {\n constructor(private client: IWhatsAppClient) {}\n\n async send(message: WhatsAppMessage): Promise<WhatsAppMessageResponse> {\n try {\n const response = await this.client.sendMessage(message);\n if (response && typeof response === \"object\" && \"data\" in response) {\n return (response as { data: WhatsAppMessageResponse }).data;\n }\n return response as WhatsAppMessageResponse;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to send WhatsApp message: ${error.message}`);\n }\n throw new Error(\"Failed to send WhatsApp message\");\n }\n }\n}\n",
17
- "import type { WhatsAppIncomingMessage, WhatsAppStatusUpdate, WhatsAppWebhookEvent } from \"../types\";\n\nexport class WebhookHandler {\n async handle(event: WhatsAppWebhookEvent): Promise<void> {\n try {\n // Process messages\n if (event.entry?.[0]?.changes?.[0]?.value?.messages) {\n const messages = event.entry[0].changes[0].value.messages;\n for (const message of messages) {\n await this.handleMessage(message);\n }\n }\n\n // Process status updates\n if (event.entry?.[0]?.changes?.[0]?.value?.statuses) {\n const statuses = event.entry[0].changes[0].value.statuses;\n for (const status of statuses) {\n await this.handleStatus(status);\n }\n }\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to send WhatsApp message: ${error.message}`);\n }\n throw new Error(\"Failed to send WhatsApp message\");\n }\n }\n\n private async handleMessage(message: WhatsAppIncomingMessage): Promise<void> {\n // Implement message handling logic\n // This could emit events or trigger callbacks based on your framework's needs\n console.log(\"Received message:\", message);\n }\n\n private async handleStatus(status: WhatsAppStatusUpdate): Promise<void> {\n // Implement status update handling logic\n // This could emit events or trigger callbacks based on your framework's needs\n console.log(\"Received status update:\", status);\n }\n}\n",
18
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { checkPairingAllowed, isInAllowlist, type PairingCheckResult } from \"@elizaos/core\";\n\n/**\n * Default account identifier used when no specific account is configured\n */\nexport const DEFAULT_ACCOUNT_ID = \"default\";\n\n/**\n * Token source indicator\n */\nexport type WhatsAppTokenSource = \"config\" | \"env\" | \"character\" | \"none\";\n\n/**\n * Group-specific runtime configuration (for account resolution)\n */\nexport interface WhatsAppGroupRuntimeConfig {\n /** If false, ignore messages from this group */\n enabled?: boolean;\n /** Allowlist for users in this group */\n allowFrom?: Array<string | number>;\n /** Require bot mention to respond */\n requireMention?: boolean;\n /** Custom system prompt for this group */\n systemPrompt?: string;\n /** Skills enabled for this group */\n skills?: string[];\n}\n\n/**\n * Configuration for a single WhatsApp account (runtime resolution)\n */\nexport interface WhatsAppAccountRuntimeConfig {\n /** Optional display name for this account */\n name?: string;\n /** If false, do not start this WhatsApp account */\n enabled?: boolean;\n /** WhatsApp Cloud API access token */\n accessToken?: string;\n /** Phone number ID from WhatsApp Business */\n phoneNumberId?: string;\n /** Business account ID */\n businessAccountId?: string;\n /** Webhook verification token */\n webhookVerifyToken?: string;\n /** API version to use */\n apiVersion?: string;\n /** Allowlist for DM senders */\n allowFrom?: Array<string | number>;\n /** Allowlist for groups */\n groupAllowFrom?: Array<string | number>;\n /** DM access policy */\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n /** Group message access policy */\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n /** Max media size in MB */\n mediaMaxMb?: number;\n /** Text chunk limit for messages */\n textChunkLimit?: number;\n /** Group-specific configurations */\n groups?: Record<string, WhatsAppGroupRuntimeConfig>;\n}\n\n/**\n * Multi-account WhatsApp configuration structure\n */\nexport interface WhatsAppMultiAccountConfig {\n /** Default/base configuration applied to all accounts */\n enabled?: boolean;\n accessToken?: string;\n phoneNumberId?: string;\n businessAccountId?: string;\n webhookVerifyToken?: string;\n apiVersion?: string;\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n mediaMaxMb?: number;\n textChunkLimit?: number;\n /** Per-account configuration overrides */\n accounts?: Record<string, WhatsAppAccountRuntimeConfig>;\n /** Group configurations at base level */\n groups?: Record<string, WhatsAppGroupRuntimeConfig>;\n}\n\n/**\n * Token resolution result\n */\nexport interface WhatsAppTokenResolution {\n token: string;\n source: WhatsAppTokenSource;\n}\n\n/**\n * Resolved WhatsApp account with all configuration merged\n */\nexport interface ResolvedWhatsAppAccount {\n accountId: string;\n enabled: boolean;\n name?: string;\n accessToken: string;\n phoneNumberId: string;\n businessAccountId?: string;\n tokenSource: WhatsAppTokenSource;\n configured: boolean;\n config: WhatsAppAccountRuntimeConfig;\n}\n\n/**\n * Normalizes an account ID, returning the default if not provided\n */\nexport function normalizeAccountId(accountId?: string | null): string {\n if (!accountId || typeof accountId !== \"string\") {\n return DEFAULT_ACCOUNT_ID;\n }\n const trimmed = accountId.trim().toLowerCase();\n if (!trimmed || trimmed === \"default\") {\n return DEFAULT_ACCOUNT_ID;\n }\n return trimmed;\n}\n\n/**\n * Gets the multi-account configuration from runtime settings\n */\nexport function getMultiAccountConfig(runtime: IAgentRuntime): WhatsAppMultiAccountConfig {\n const characterWhatsApp = runtime.character?.settings?.whatsapp as\n | WhatsAppMultiAccountConfig\n | undefined;\n\n return {\n enabled: characterWhatsApp?.enabled,\n accessToken: characterWhatsApp?.accessToken,\n phoneNumberId: characterWhatsApp?.phoneNumberId,\n businessAccountId: characterWhatsApp?.businessAccountId,\n webhookVerifyToken: characterWhatsApp?.webhookVerifyToken,\n apiVersion: characterWhatsApp?.apiVersion,\n dmPolicy: characterWhatsApp?.dmPolicy,\n groupPolicy: characterWhatsApp?.groupPolicy,\n mediaMaxMb: characterWhatsApp?.mediaMaxMb,\n textChunkLimit: characterWhatsApp?.textChunkLimit,\n accounts: characterWhatsApp?.accounts,\n groups: characterWhatsApp?.groups,\n };\n}\n\n/**\n * Lists all configured account IDs\n */\nexport function listWhatsAppAccountIds(runtime: IAgentRuntime): string[] {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n const ids = new Set<string>();\n\n // Check if default account is configured\n const envToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string | undefined;\n const envPhoneId = runtime.getSetting(\"WHATSAPP_PHONE_NUMBER_ID\") as string | undefined;\n\n const baseConfigured = Boolean(config.accessToken?.trim() && config.phoneNumberId?.trim());\n const envConfigured = Boolean(envToken?.trim() && envPhoneId?.trim());\n\n if (baseConfigured || envConfigured) {\n ids.add(DEFAULT_ACCOUNT_ID);\n }\n\n // Add named accounts\n if (accounts && typeof accounts === \"object\") {\n for (const id of Object.keys(accounts)) {\n if (id) {\n ids.add(normalizeAccountId(id));\n }\n }\n }\n\n const result = Array.from(ids);\n if (result.length === 0) {\n return [DEFAULT_ACCOUNT_ID];\n }\n\n return result.slice().sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Resolves the default account ID to use\n */\nexport function resolveDefaultWhatsAppAccountId(runtime: IAgentRuntime): string {\n const ids = listWhatsAppAccountIds(runtime);\n if (ids.includes(DEFAULT_ACCOUNT_ID)) {\n return DEFAULT_ACCOUNT_ID;\n }\n return ids[0] ?? DEFAULT_ACCOUNT_ID;\n}\n\n/**\n * Gets the account-specific configuration\n */\nfunction getAccountConfig(\n runtime: IAgentRuntime,\n accountId: string\n): WhatsAppAccountRuntimeConfig | undefined {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n\n if (!accounts || typeof accounts !== \"object\") {\n return undefined;\n }\n\n // Try direct match first\n const direct = accounts[accountId];\n if (direct) {\n return direct;\n }\n\n // Try normalized match\n const normalized = normalizeAccountId(accountId);\n const matchKey = Object.keys(accounts).find((key) => normalizeAccountId(key) === normalized);\n return matchKey ? accounts[matchKey] : undefined;\n}\n\n/**\n * Resolves the access token for a WhatsApp account\n */\nexport function resolveWhatsAppToken(\n runtime: IAgentRuntime,\n accountId: string\n): WhatsAppTokenResolution {\n const multiConfig = getMultiAccountConfig(runtime);\n const accountConfig = getAccountConfig(runtime, accountId);\n\n // Check account-level config first\n if (accountConfig?.accessToken?.trim()) {\n return { token: accountConfig.accessToken.trim(), source: \"config\" };\n }\n\n // For default account, check base config\n if (accountId === DEFAULT_ACCOUNT_ID) {\n if (multiConfig.accessToken?.trim()) {\n return { token: multiConfig.accessToken.trim(), source: \"config\" };\n }\n\n // Check environment/runtime settings\n const envToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string | undefined;\n if (envToken?.trim()) {\n return { token: envToken.trim(), source: \"env\" };\n }\n }\n\n return { token: \"\", source: \"none\" };\n}\n\n/**\n * Merges base configuration with account-specific overrides\n */\n/**\n * Removes undefined values from an object to prevent them from overwriting during spread\n */\nfunction filterDefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\nfunction mergeWhatsAppAccountConfig(\n runtime: IAgentRuntime,\n accountId: string\n): WhatsAppAccountRuntimeConfig {\n const multiConfig = getMultiAccountConfig(runtime);\n const { accounts: _ignored, ...baseConfig } = multiConfig;\n const accountConfig = getAccountConfig(runtime, accountId) ?? {};\n\n // Get environment/runtime settings for the base config\n const envToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string | undefined;\n const envPhoneId = runtime.getSetting(\"WHATSAPP_PHONE_NUMBER_ID\") as string | undefined;\n const envBusinessId = runtime.getSetting(\"WHATSAPP_BUSINESS_ACCOUNT_ID\") as string | undefined;\n const envWebhookToken = runtime.getSetting(\"WHATSAPP_WEBHOOK_VERIFY_TOKEN\") as string | undefined;\n const envDmPolicy = runtime.getSetting(\"WHATSAPP_DM_POLICY\") as string | undefined;\n const envGroupPolicy = runtime.getSetting(\"WHATSAPP_GROUP_POLICY\") as string | undefined;\n\n const envConfig: WhatsAppAccountRuntimeConfig = {\n accessToken: envToken || undefined,\n phoneNumberId: envPhoneId || undefined,\n businessAccountId: envBusinessId || undefined,\n webhookVerifyToken: envWebhookToken || undefined,\n dmPolicy: envDmPolicy as WhatsAppAccountRuntimeConfig[\"dmPolicy\"] | undefined,\n groupPolicy: envGroupPolicy as WhatsAppAccountRuntimeConfig[\"groupPolicy\"] | undefined,\n };\n\n // Merge order: env defaults < base config < account config\n // Filter undefined values to prevent them from overwriting defined values\n return {\n ...filterDefined(envConfig),\n ...filterDefined(baseConfig),\n ...filterDefined(accountConfig),\n };\n}\n\n/**\n * Resolves a complete WhatsApp account configuration\n */\nexport function resolveWhatsAppAccount(\n runtime: IAgentRuntime,\n accountId?: string | null\n): ResolvedWhatsAppAccount {\n const normalizedAccountId = normalizeAccountId(accountId);\n const multiConfig = getMultiAccountConfig(runtime);\n\n const baseEnabled = multiConfig.enabled !== false;\n const merged = mergeWhatsAppAccountConfig(runtime, normalizedAccountId);\n const accountEnabled = merged.enabled !== false;\n const enabled = baseEnabled && accountEnabled;\n\n const { token, source: tokenSource } = resolveWhatsAppToken(runtime, normalizedAccountId);\n const phoneNumberId = merged.phoneNumberId?.trim() || \"\";\n\n // Determine if this account is actually configured\n const configured = Boolean(token && phoneNumberId);\n\n return {\n accountId: normalizedAccountId,\n enabled,\n name: merged.name?.trim() || undefined,\n accessToken: token,\n phoneNumberId,\n businessAccountId: merged.businessAccountId?.trim() || undefined,\n tokenSource,\n configured,\n config: merged,\n };\n}\n\n/**\n * Lists all enabled WhatsApp accounts\n */\nexport function listEnabledWhatsAppAccounts(runtime: IAgentRuntime): ResolvedWhatsAppAccount[] {\n return listWhatsAppAccountIds(runtime)\n .map((accountId) => resolveWhatsAppAccount(runtime, accountId))\n .filter((account) => account.enabled && account.configured);\n}\n\n/**\n * Checks if multi-account mode is enabled\n */\nexport function isMultiAccountEnabled(runtime: IAgentRuntime): boolean {\n const accounts = listEnabledWhatsAppAccounts(runtime);\n return accounts.length > 1;\n}\n\n/**\n * Resolves group configuration for a specific group\n */\nexport function resolveWhatsAppGroupConfig(\n runtime: IAgentRuntime,\n accountId: string,\n groupId: string\n): WhatsAppGroupRuntimeConfig | undefined {\n const multiConfig = getMultiAccountConfig(runtime);\n const accountConfig = getAccountConfig(runtime, accountId);\n\n // Check account-level groups first\n const accountGroup = accountConfig?.groups?.[groupId];\n if (accountGroup) {\n return accountGroup;\n }\n\n // Fall back to base-level groups\n return multiConfig.groups?.[groupId];\n}\n\n/**\n * Checks if a user is allowed based on policy and allowlist\n */\nexport function isWhatsAppUserAllowed(params: {\n identifier: string;\n accountConfig: WhatsAppAccountRuntimeConfig;\n isGroup: boolean;\n groupId?: string;\n groupConfig?: WhatsAppGroupRuntimeConfig;\n}): boolean {\n const { identifier, accountConfig, isGroup, groupConfig } = params;\n\n if (isGroup) {\n const policy = accountConfig.groupPolicy ?? \"allowlist\";\n if (policy === \"disabled\") {\n return false;\n }\n\n if (policy === \"open\") {\n return true;\n }\n\n // Check group-specific allowlist first\n if (groupConfig?.allowFrom?.length) {\n return groupConfig.allowFrom.some((allowed) => String(allowed) === identifier);\n }\n\n // Check account-level group allowlist\n if (accountConfig.groupAllowFrom?.length) {\n return accountConfig.groupAllowFrom.some((allowed) => String(allowed) === identifier);\n }\n\n return policy !== \"allowlist\";\n }\n\n // DM handling\n const policy = accountConfig.dmPolicy ?? \"pairing\";\n if (policy === \"disabled\") {\n return false;\n }\n\n if (policy === \"open\") {\n return true;\n }\n\n if (policy === \"pairing\") {\n return true;\n }\n\n // Allowlist policy\n if (accountConfig.allowFrom?.length) {\n return accountConfig.allowFrom.some((allowed) => String(allowed) === identifier);\n }\n\n return false;\n}\n\n/**\n * Checks if mention is required in a group\n */\nexport function isWhatsAppMentionRequired(params: {\n accountConfig: WhatsAppAccountRuntimeConfig;\n groupConfig?: WhatsAppGroupRuntimeConfig;\n}): boolean {\n const { groupConfig } = params;\n return groupConfig?.requireMention ?? false;\n}\n\n/**\n * Result of an async WhatsApp access check\n */\nexport interface WhatsAppAccessCheckResult {\n /** Whether the sender is allowed to proceed */\n allowed: boolean;\n /** If not allowed (pairing policy), the pairing code */\n pairingCode?: string;\n /** Whether a new pairing request was created */\n newPairingRequest?: boolean;\n /** Human-readable message to send to the user when blocked */\n replyMessage?: string;\n}\n\n/**\n * Checks if a user is allowed based on policy and allowlist, with async pairing support.\n *\n * For non-pairing policies, this behaves identically to `isWhatsAppUserAllowed`.\n * For the \"pairing\" policy, this actually checks the PairingService allowlist\n * and creates pairing requests when needed.\n *\n * @example\n * ```typescript\n * const result = await checkWhatsAppUserAccess({\n * runtime,\n * identifier: message.from,\n * accountConfig,\n * isGroup: false,\n * metadata: { name: contact.name },\n * });\n *\n * if (!result.allowed) {\n * if (result.replyMessage) {\n * await sendMessage(result.replyMessage);\n * }\n * return; // Block message processing\n * }\n * ```\n */\nexport async function checkWhatsAppUserAccess(params: {\n runtime: IAgentRuntime;\n identifier: string;\n accountConfig: WhatsAppAccountRuntimeConfig;\n isGroup: boolean;\n groupId?: string;\n groupConfig?: WhatsAppGroupRuntimeConfig;\n metadata?: Record<string, string>;\n}): Promise<WhatsAppAccessCheckResult> {\n const { runtime, identifier, accountConfig, isGroup, groupConfig, metadata } = params;\n\n if (isGroup) {\n // Group access - same logic as synchronous version\n const policy = accountConfig.groupPolicy ?? \"allowlist\";\n if (policy === \"disabled\") {\n return { allowed: false };\n }\n\n if (policy === \"open\") {\n return { allowed: true };\n }\n\n // Check group-specific allowlist first\n if (groupConfig?.allowFrom?.length) {\n const allowed = groupConfig.allowFrom.some((a) => String(a) === identifier);\n return { allowed };\n }\n\n // Check account-level group allowlist\n if (accountConfig.groupAllowFrom?.length) {\n const allowed = accountConfig.groupAllowFrom.some((a) => String(a) === identifier);\n return { allowed };\n }\n\n return { allowed: policy !== \"allowlist\" };\n }\n\n // DM handling\n const policy = accountConfig.dmPolicy ?? \"pairing\";\n if (policy === \"disabled\") {\n return { allowed: false };\n }\n\n if (policy === \"open\") {\n return { allowed: true };\n }\n\n if (policy === \"pairing\") {\n // Use the PairingService for actual pairing workflow\n const result: PairingCheckResult = await checkPairingAllowed(runtime, {\n channel: \"whatsapp\",\n senderId: identifier,\n metadata,\n });\n\n return {\n allowed: result.allowed,\n pairingCode: result.pairingCode,\n newPairingRequest: result.newRequest,\n replyMessage: result.replyMessage,\n };\n }\n\n // Allowlist policy - check static allowlist first\n if (accountConfig.allowFrom?.length) {\n const allowed = accountConfig.allowFrom.some((a) => String(a) === identifier);\n if (allowed) {\n return { allowed: true };\n }\n }\n\n // Also check the dynamic pairing allowlist for the allowlist policy\n const inDynamicAllowlist = await isInAllowlist(runtime, \"whatsapp\", identifier);\n return { allowed: inDynamicAllowlist };\n}\n",
5
+ "import { getConnectorAccountManager, type IAgentRuntime, logger, type Plugin } from \"@elizaos/core\";\nimport { createWhatsAppConnectorAccountProvider } from \"./connector-account-provider\";\nimport { WhatsAppConnectorService } from \"./runtime-service\";\nimport { whatsappSetupRoutes } from \"./setup-routes\";\nimport { WhatsAppWorkflowCredentialProvider } from \"./workflow-credential-provider\";\n\nconst whatsappPlugin: Plugin = {\n name: \"whatsapp\",\n description: \"WhatsApp integration for ElizaOS (Cloud API + Baileys)\",\n actions: [],\n services: [WhatsAppConnectorService, WhatsAppWorkflowCredentialProvider],\n routes: whatsappSetupRoutes,\n // Self-declared auto-enable: activate when the \"whatsapp\" connector is\n // configured under config.connectors. The hardcoded CONNECTOR_PLUGINS map\n // in plugin-auto-enable-engine.ts still serves as a fallback.\n autoEnable: {\n connectorKeys: [\"whatsapp\"],\n },\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n // Register the WhatsApp provider with the ConnectorAccountManager so the\n // HTTP CRUD surface (packages/agent/src/api/connector-account-routes.ts)\n // can list, create, patch, and delete WhatsApp accounts.\n try {\n const manager = getConnectorAccountManager(runtime);\n manager.registerProvider(createWhatsAppConnectorAccountProvider(runtime));\n } catch (err) {\n logger.warn(\n {\n src: \"plugin:whatsapp\",\n err: err instanceof Error ? err.message : String(err),\n },\n \"Failed to register WhatsApp provider with ConnectorAccountManager\"\n );\n }\n },\n};\n\nexport default whatsappPlugin;\n\n// Account management exports\nexport {\n checkWhatsAppUserAccess,\n DEFAULT_ACCOUNT_ID,\n isMultiAccountEnabled,\n isWhatsAppMentionRequired,\n isWhatsAppUserAllowed,\n listEnabledWhatsAppAccounts,\n listWhatsAppAccountIds,\n normalizeAccountId,\n type ResolvedWhatsAppAccount,\n resolveDefaultWhatsAppAccountId,\n resolveWhatsAppAccount,\n resolveWhatsAppGroupConfig,\n resolveWhatsAppToken,\n type WhatsAppAccessCheckResult,\n type WhatsAppAccountRuntimeConfig,\n type WhatsAppGroupRuntimeConfig,\n type WhatsAppMultiAccountConfig,\n type WhatsAppTokenResolution,\n type WhatsAppTokenSource,\n} from \"./accounts\";\nexport {\n applyWhatsAppQrOverride,\n handleWhatsAppRoute,\n MAX_PAIRING_SESSIONS as WHATSAPP_MAX_PAIRING_SESSIONS,\n type WhatsAppPairingEventLike,\n type WhatsAppPairingSessionLike,\n type WhatsAppRouteDeps,\n type WhatsAppRouteState,\n} from \"./api/whatsapp-routes\";\nexport { ClientFactory } from \"./clients/factory\";\n// Channel configuration types\nexport type {\n WhatsAppAccountConfig,\n WhatsAppAckReactionConfig,\n WhatsAppActionConfig,\n WhatsAppChannelConfig,\n WhatsAppGroupConfig,\n} from \"./config\";\n// ConnectorAccountManager provider exports\nexport {\n createWhatsAppConnectorAccountProvider,\n WHATSAPP_PROVIDER_ID,\n} from \"./connector-account-provider\";\n// Normalization and utility exports\nexport {\n buildWhatsAppUserJid,\n type ChunkWhatsAppTextOpts,\n chunkWhatsAppText,\n formatWhatsAppId,\n formatWhatsAppPhoneNumber,\n getWhatsAppChatType,\n isValidWhatsAppNumber,\n isWhatsAppGroup,\n isWhatsAppGroupJid,\n isWhatsAppUserTarget,\n normalizeE164,\n normalizeWhatsAppTarget,\n resolveWhatsAppSystemLocation,\n truncateText,\n WHATSAPP_TEXT_CHUNK_LIMIT,\n} from \"./normalize\";\nexport {\n sanitizeAccountId as sanitizeWhatsAppAccountId,\n type WhatsAppPairingEvent,\n type WhatsAppPairingOptions,\n WhatsAppPairingSession,\n type WhatsAppPairingStatus,\n whatsappAuthExists,\n whatsappLogout,\n} from \"./pairing-service\";\nexport { WhatsAppConnectorService } from \"./runtime-service\";\nexport { stopAllPairingSessions, whatsappSetupRoutes } from \"./setup-routes\";\nexport * from \"./types\";\n\n// Bundle-safety: force binding identities into the module's init\n// function so Bun.build's tree-shake doesn't collapse this barrel\n// into an empty `init_X = () => {}`. Without this the on-device\n// mobile agent explodes with `ReferenceError: <name> is not defined`\n// when a consumer dereferences a re-exported binding at runtime.\nimport {\n checkWhatsAppUserAccess as _bs_1_checkWhatsAppUserAccess,\n DEFAULT_ACCOUNT_ID as _bs_2_DEFAULT_ACCOUNT_ID,\n isMultiAccountEnabled as _bs_3_isMultiAccountEnabled,\n isWhatsAppMentionRequired as _bs_4_isWhatsAppMentionRequired,\n isWhatsAppUserAllowed as _bs_5_isWhatsAppUserAllowed,\n listEnabledWhatsAppAccounts as _bs_6_listEnabledWhatsAppAccounts,\n listWhatsAppAccountIds as _bs_7_listWhatsAppAccountIds,\n normalizeAccountId as _bs_8_normalizeAccountId,\n resolveDefaultWhatsAppAccountId as _bs_9_resolveDefaultWhatsAppAccountId,\n resolveWhatsAppAccount as _bs_10_resolveWhatsAppAccount,\n resolveWhatsAppGroupConfig as _bs_11_resolveWhatsAppGroupConfig,\n resolveWhatsAppToken as _bs_12_resolveWhatsAppToken,\n} from \"./accounts\";\nimport {\n applyWhatsAppQrOverride as _bs_13_applyWhatsAppQrOverride,\n handleWhatsAppRoute as _bs_14_handleWhatsAppRoute,\n MAX_PAIRING_SESSIONS as _bs_15_MAX_PAIRING_SESSIONS,\n} from \"./api/whatsapp-routes\";\nimport { ClientFactory as _bs_16_ClientFactory } from \"./clients/factory\";\nimport {\n createWhatsAppConnectorAccountProvider as _bs_17_createWhatsAppConnectorAccountProvider,\n WHATSAPP_PROVIDER_ID as _bs_18_WHATSAPP_PROVIDER_ID,\n} from \"./connector-account-provider\";\nimport {\n buildWhatsAppUserJid as _bs_19_buildWhatsAppUserJid,\n chunkWhatsAppText as _bs_20_chunkWhatsAppText,\n formatWhatsAppId as _bs_21_formatWhatsAppId,\n formatWhatsAppPhoneNumber as _bs_22_formatWhatsAppPhoneNumber,\n getWhatsAppChatType as _bs_23_getWhatsAppChatType,\n isValidWhatsAppNumber as _bs_24_isValidWhatsAppNumber,\n isWhatsAppGroup as _bs_25_isWhatsAppGroup,\n isWhatsAppGroupJid as _bs_26_isWhatsAppGroupJid,\n isWhatsAppUserTarget as _bs_27_isWhatsAppUserTarget,\n normalizeE164 as _bs_28_normalizeE164,\n normalizeWhatsAppTarget as _bs_29_normalizeWhatsAppTarget,\n resolveWhatsAppSystemLocation as _bs_30_resolveWhatsAppSystemLocation,\n truncateText as _bs_31_truncateText,\n WHATSAPP_TEXT_CHUNK_LIMIT as _bs_32_WHATSAPP_TEXT_CHUNK_LIMIT,\n} from \"./normalize\";\nimport {\n sanitizeAccountId as _bs_33_sanitizeAccountId,\n WhatsAppPairingSession as _bs_34_WhatsAppPairingSession,\n whatsappAuthExists as _bs_35_whatsappAuthExists,\n whatsappLogout as _bs_36_whatsappLogout,\n} from \"./pairing-service\";\nimport { WhatsAppConnectorService as _bs_37_WhatsAppConnectorService } from \"./runtime-service\";\nimport {\n stopAllPairingSessions as _bs_38_stopAllPairingSessions,\n whatsappSetupRoutes as _bs_39_whatsappSetupRoutes,\n} from \"./setup-routes\";\n// Path-derived symbol so parents that `export *` two of these don't\n// collide on a shared `__BUNDLE_SAFETY__` name.\n// biome-ignore lint/correctness/noUnusedVariables: bundle-safety sink.\nconst __bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__ = [\n _bs_1_checkWhatsAppUserAccess,\n _bs_2_DEFAULT_ACCOUNT_ID,\n _bs_3_isMultiAccountEnabled,\n _bs_4_isWhatsAppMentionRequired,\n _bs_5_isWhatsAppUserAllowed,\n _bs_6_listEnabledWhatsAppAccounts,\n _bs_7_listWhatsAppAccountIds,\n _bs_8_normalizeAccountId,\n _bs_9_resolveDefaultWhatsAppAccountId,\n _bs_10_resolveWhatsAppAccount,\n _bs_11_resolveWhatsAppGroupConfig,\n _bs_12_resolveWhatsAppToken,\n _bs_13_applyWhatsAppQrOverride,\n _bs_14_handleWhatsAppRoute,\n _bs_15_MAX_PAIRING_SESSIONS,\n _bs_16_ClientFactory,\n _bs_17_createWhatsAppConnectorAccountProvider,\n _bs_18_WHATSAPP_PROVIDER_ID,\n _bs_19_buildWhatsAppUserJid,\n _bs_20_chunkWhatsAppText,\n _bs_21_formatWhatsAppId,\n _bs_22_formatWhatsAppPhoneNumber,\n _bs_23_getWhatsAppChatType,\n _bs_24_isValidWhatsAppNumber,\n _bs_25_isWhatsAppGroup,\n _bs_26_isWhatsAppGroupJid,\n _bs_27_isWhatsAppUserTarget,\n _bs_28_normalizeE164,\n _bs_29_normalizeWhatsAppTarget,\n _bs_30_resolveWhatsAppSystemLocation,\n _bs_31_truncateText,\n _bs_32_WHATSAPP_TEXT_CHUNK_LIMIT,\n _bs_33_sanitizeAccountId,\n _bs_34_WhatsAppPairingSession,\n _bs_35_whatsappAuthExists,\n _bs_36_whatsappLogout,\n _bs_37_WhatsAppConnectorService,\n _bs_38_stopAllPairingSessions,\n _bs_39_whatsappSetupRoutes,\n];\n// biome-ignore lint/suspicious/noExplicitAny: bundle-safety sink.\n(globalThis as any).__bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__ =\n __bundle_safety_PLUGINS_PLUGIN_WHATSAPP_SRC_INDEX__;\n",
6
+ "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { checkPairingAllowed, isInAllowlist, type PairingCheckResult } from \"@elizaos/core\";\n\n/**\n * Default account identifier used when no specific account is configured\n */\nexport const DEFAULT_ACCOUNT_ID = \"default\";\n\n/**\n * Token source indicator\n */\nexport type WhatsAppTokenSource = \"config\" | \"env\" | \"character\" | \"none\";\n\n/**\n * Group-specific runtime configuration (for account resolution)\n */\nexport interface WhatsAppGroupRuntimeConfig {\n /** If false, ignore messages from this group */\n enabled?: boolean;\n /** Allowlist for users in this group */\n allowFrom?: Array<string | number>;\n /** Require bot mention to respond */\n requireMention?: boolean;\n /** Custom system prompt for this group */\n systemPrompt?: string;\n /** Skills enabled for this group */\n skills?: string[];\n}\n\n/**\n * Configuration for a single WhatsApp account (runtime resolution)\n */\nexport interface WhatsAppAccountRuntimeConfig {\n /** Optional display name for this account */\n name?: string;\n /** If false, do not start this WhatsApp account */\n enabled?: boolean;\n /** Transport implementation for this account */\n transport?: \"cloudapi\" | \"baileys\";\n /** Baileys auth/session directory */\n authDir?: string;\n /** WhatsApp Cloud API access token */\n accessToken?: string;\n /** Phone number ID from WhatsApp Business */\n phoneNumberId?: string;\n /** Business account ID */\n businessAccountId?: string;\n /** Webhook verification token */\n webhookVerifyToken?: string;\n /** API version to use */\n apiVersion?: string;\n /** Allowlist for DM senders */\n allowFrom?: Array<string | number>;\n /** Allowlist for groups */\n groupAllowFrom?: Array<string | number>;\n /** DM access policy */\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n /** Group message access policy */\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n /** Max media size in MB */\n mediaMaxMb?: number;\n /** Text chunk limit for messages */\n textChunkLimit?: number;\n /** Group-specific configurations */\n groups?: Record<string, WhatsAppGroupRuntimeConfig>;\n}\n\n/**\n * Multi-account WhatsApp configuration structure\n */\nexport interface WhatsAppMultiAccountConfig {\n /** Default/base configuration applied to all accounts */\n enabled?: boolean;\n transport?: \"cloudapi\" | \"baileys\";\n authDir?: string;\n accessToken?: string;\n phoneNumberId?: string;\n businessAccountId?: string;\n webhookVerifyToken?: string;\n apiVersion?: string;\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n mediaMaxMb?: number;\n textChunkLimit?: number;\n /** Per-account configuration overrides */\n accounts?: Record<string, WhatsAppAccountRuntimeConfig>;\n /** Group configurations at base level */\n groups?: Record<string, WhatsAppGroupRuntimeConfig>;\n}\n\n/**\n * Token resolution result\n */\nexport interface WhatsAppTokenResolution {\n token: string;\n source: WhatsAppTokenSource;\n}\n\n/**\n * Resolved WhatsApp account with all configuration merged\n */\nexport interface ResolvedWhatsAppAccount {\n accountId: string;\n enabled: boolean;\n name?: string;\n accessToken: string;\n phoneNumberId: string;\n businessAccountId?: string;\n tokenSource: WhatsAppTokenSource;\n configured: boolean;\n config: WhatsAppAccountRuntimeConfig;\n}\n\n/**\n * Normalizes an account ID, returning the default if not provided\n */\nexport function normalizeAccountId(accountId?: string | null): string {\n if (!accountId || typeof accountId !== \"string\") {\n return DEFAULT_ACCOUNT_ID;\n }\n const trimmed = accountId.trim().toLowerCase();\n if (!trimmed || trimmed === \"default\") {\n return DEFAULT_ACCOUNT_ID;\n }\n return trimmed;\n}\n\n/**\n * Gets the multi-account configuration from runtime settings\n */\nexport function getMultiAccountConfig(runtime: IAgentRuntime): WhatsAppMultiAccountConfig {\n const characterWhatsApp = runtime.character?.settings?.whatsapp as\n | WhatsAppMultiAccountConfig\n | undefined;\n\n return {\n enabled: characterWhatsApp?.enabled,\n transport: characterWhatsApp?.transport,\n authDir: characterWhatsApp?.authDir,\n accessToken: characterWhatsApp?.accessToken,\n phoneNumberId: characterWhatsApp?.phoneNumberId,\n businessAccountId: characterWhatsApp?.businessAccountId,\n webhookVerifyToken: characterWhatsApp?.webhookVerifyToken,\n apiVersion: characterWhatsApp?.apiVersion,\n dmPolicy: characterWhatsApp?.dmPolicy,\n groupPolicy: characterWhatsApp?.groupPolicy,\n mediaMaxMb: characterWhatsApp?.mediaMaxMb,\n textChunkLimit: characterWhatsApp?.textChunkLimit,\n accounts: characterWhatsApp?.accounts,\n groups: characterWhatsApp?.groups,\n };\n}\n\n/**\n * Lists all configured account IDs\n */\nexport function listWhatsAppAccountIds(runtime: IAgentRuntime): string[] {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n const ids = new Set<string>();\n\n // Check if default account is configured\n const envToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string | undefined;\n const envPhoneId = runtime.getSetting(\"WHATSAPP_PHONE_NUMBER_ID\") as string | undefined;\n const envAuthDir =\n (runtime.getSetting(\"WHATSAPP_AUTH_DIR\") as string | undefined) ??\n (runtime.getSetting(\"WHATSAPP_SESSION_PATH\") as string | undefined);\n\n const baseConfigured = Boolean(config.accessToken?.trim() && config.phoneNumberId?.trim());\n const envConfigured = Boolean(envToken?.trim() && envPhoneId?.trim());\n const baileysConfigured = Boolean(config.authDir?.trim() || envAuthDir?.trim());\n\n if (baseConfigured || envConfigured || baileysConfigured) {\n ids.add(DEFAULT_ACCOUNT_ID);\n }\n\n // Add named accounts\n if (accounts && typeof accounts === \"object\") {\n for (const id of Object.keys(accounts)) {\n if (id) {\n ids.add(normalizeAccountId(id));\n }\n }\n }\n\n const result = Array.from(ids);\n if (result.length === 0) {\n return [DEFAULT_ACCOUNT_ID];\n }\n\n return result.slice().sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Resolves the default account ID to use\n */\nexport function resolveDefaultWhatsAppAccountId(runtime: IAgentRuntime): string {\n const ids = listWhatsAppAccountIds(runtime);\n if (ids.includes(DEFAULT_ACCOUNT_ID)) {\n return DEFAULT_ACCOUNT_ID;\n }\n return ids[0] ?? DEFAULT_ACCOUNT_ID;\n}\n\n/**\n * Gets the account-specific configuration\n */\nfunction getAccountConfig(\n runtime: IAgentRuntime,\n accountId: string\n): WhatsAppAccountRuntimeConfig | undefined {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n\n if (!accounts || typeof accounts !== \"object\") {\n return undefined;\n }\n\n // Try direct match first\n const direct = accounts[accountId];\n if (direct) {\n return direct;\n }\n\n // Try normalized match\n const normalized = normalizeAccountId(accountId);\n const matchKey = Object.keys(accounts).find((key) => normalizeAccountId(key) === normalized);\n return matchKey ? accounts[matchKey] : undefined;\n}\n\n/**\n * Resolves the access token for a WhatsApp account\n */\nexport function resolveWhatsAppToken(\n runtime: IAgentRuntime,\n accountId: string\n): WhatsAppTokenResolution {\n const multiConfig = getMultiAccountConfig(runtime);\n const accountConfig = getAccountConfig(runtime, accountId);\n\n // Check account-level config first\n if (accountConfig?.accessToken?.trim()) {\n return { token: accountConfig.accessToken.trim(), source: \"config\" };\n }\n\n // For default account, check base config\n if (accountId === DEFAULT_ACCOUNT_ID) {\n if (multiConfig.accessToken?.trim()) {\n return { token: multiConfig.accessToken.trim(), source: \"config\" };\n }\n\n // Check environment/runtime settings\n const envToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string | undefined;\n if (envToken?.trim()) {\n return { token: envToken.trim(), source: \"env\" };\n }\n }\n\n return { token: \"\", source: \"none\" };\n}\n\n/**\n * Merges base configuration with account-specific overrides\n */\n/**\n * Removes undefined values from an object to prevent them from overwriting during spread\n */\nfunction filterDefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\nfunction mergeWhatsAppAccountConfig(\n runtime: IAgentRuntime,\n accountId: string\n): WhatsAppAccountRuntimeConfig {\n const multiConfig = getMultiAccountConfig(runtime);\n const { accounts: _ignored, ...baseConfig } = multiConfig;\n const accountConfig = getAccountConfig(runtime, accountId) ?? {};\n\n // Get environment/runtime settings for the base config\n const envToken = runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string | undefined;\n const envPhoneId = runtime.getSetting(\"WHATSAPP_PHONE_NUMBER_ID\") as string | undefined;\n const envBusinessId = runtime.getSetting(\"WHATSAPP_BUSINESS_ACCOUNT_ID\") as string | undefined;\n const envWebhookToken = runtime.getSetting(\"WHATSAPP_WEBHOOK_VERIFY_TOKEN\") as string | undefined;\n const envDmPolicy = runtime.getSetting(\"WHATSAPP_DM_POLICY\") as string | undefined;\n const envGroupPolicy = runtime.getSetting(\"WHATSAPP_GROUP_POLICY\") as string | undefined;\n const envAuthDir =\n (runtime.getSetting(\"WHATSAPP_AUTH_DIR\") as string | undefined) ??\n (runtime.getSetting(\"WHATSAPP_SESSION_PATH\") as string | undefined);\n const envTransport = runtime.getSetting(\"WHATSAPP_AUTH_METHOD\") as string | undefined;\n\n const envConfig: WhatsAppAccountRuntimeConfig = {\n transport: envTransport as WhatsAppAccountRuntimeConfig[\"transport\"] | undefined,\n authDir: envAuthDir || undefined,\n accessToken: envToken || undefined,\n phoneNumberId: envPhoneId || undefined,\n businessAccountId: envBusinessId || undefined,\n webhookVerifyToken: envWebhookToken || undefined,\n dmPolicy: envDmPolicy as WhatsAppAccountRuntimeConfig[\"dmPolicy\"] | undefined,\n groupPolicy: envGroupPolicy as WhatsAppAccountRuntimeConfig[\"groupPolicy\"] | undefined,\n };\n\n // Merge order: env defaults < base config < account config\n // Filter undefined values to prevent them from overwriting defined values\n return {\n ...filterDefined(envConfig),\n ...filterDefined(baseConfig),\n ...filterDefined(accountConfig),\n };\n}\n\n/**\n * Resolves a complete WhatsApp account configuration\n */\nexport function resolveWhatsAppAccount(\n runtime: IAgentRuntime,\n accountId?: string | null\n): ResolvedWhatsAppAccount {\n const normalizedAccountId = normalizeAccountId(accountId);\n const multiConfig = getMultiAccountConfig(runtime);\n\n const baseEnabled = multiConfig.enabled !== false;\n const merged = mergeWhatsAppAccountConfig(runtime, normalizedAccountId);\n const accountEnabled = merged.enabled !== false;\n const enabled = baseEnabled && accountEnabled;\n\n const { token, source: tokenSource } = resolveWhatsAppToken(runtime, normalizedAccountId);\n const phoneNumberId = merged.phoneNumberId?.trim() || \"\";\n\n // Determine if this account is actually configured\n const configured = Boolean(token && phoneNumberId);\n\n return {\n accountId: normalizedAccountId,\n enabled,\n name: merged.name?.trim() || undefined,\n accessToken: token,\n phoneNumberId,\n businessAccountId: merged.businessAccountId?.trim() || undefined,\n tokenSource,\n configured,\n config: merged,\n };\n}\n\n/**\n * Lists all enabled WhatsApp accounts\n */\nexport function listEnabledWhatsAppAccounts(runtime: IAgentRuntime): ResolvedWhatsAppAccount[] {\n return listWhatsAppAccountIds(runtime)\n .map((accountId) => resolveWhatsAppAccount(runtime, accountId))\n .filter((account) => account.enabled && account.configured);\n}\n\n/**\n * Checks if multi-account mode is enabled\n */\nexport function isMultiAccountEnabled(runtime: IAgentRuntime): boolean {\n const accounts = listEnabledWhatsAppAccounts(runtime);\n return accounts.length > 1;\n}\n\n/**\n * Resolves group configuration for a specific group\n */\nexport function resolveWhatsAppGroupConfig(\n runtime: IAgentRuntime,\n accountId: string,\n groupId: string\n): WhatsAppGroupRuntimeConfig | undefined {\n const multiConfig = getMultiAccountConfig(runtime);\n const accountConfig = getAccountConfig(runtime, accountId);\n\n // Check account-level groups first\n const accountGroup = accountConfig?.groups?.[groupId];\n if (accountGroup) {\n return accountGroup;\n }\n\n // Fall back to base-level groups\n return multiConfig.groups?.[groupId];\n}\n\n/**\n * Checks if a user is allowed based on policy and allowlist\n */\nexport function isWhatsAppUserAllowed(params: {\n identifier: string;\n accountConfig: WhatsAppAccountRuntimeConfig;\n isGroup: boolean;\n groupId?: string;\n groupConfig?: WhatsAppGroupRuntimeConfig;\n}): boolean {\n const { identifier, accountConfig, isGroup, groupConfig } = params;\n\n if (isGroup) {\n const policy = accountConfig.groupPolicy ?? \"allowlist\";\n if (policy === \"disabled\") {\n return false;\n }\n\n if (policy === \"open\") {\n return true;\n }\n\n // Check group-specific allowlist first\n if (groupConfig?.allowFrom?.length) {\n return groupConfig.allowFrom.some((allowed) => String(allowed) === identifier);\n }\n\n // Check account-level group allowlist\n if (accountConfig.groupAllowFrom?.length) {\n return accountConfig.groupAllowFrom.some((allowed) => String(allowed) === identifier);\n }\n\n return policy !== \"allowlist\";\n }\n\n // DM handling\n const policy = accountConfig.dmPolicy ?? \"pairing\";\n if (policy === \"disabled\") {\n return false;\n }\n\n if (policy === \"open\") {\n return true;\n }\n\n if (policy === \"pairing\") {\n return true;\n }\n\n // Allowlist policy\n if (accountConfig.allowFrom?.length) {\n return accountConfig.allowFrom.some((allowed) => String(allowed) === identifier);\n }\n\n return false;\n}\n\n/**\n * Checks if mention is required in a group\n */\nexport function isWhatsAppMentionRequired(params: {\n accountConfig: WhatsAppAccountRuntimeConfig;\n groupConfig?: WhatsAppGroupRuntimeConfig;\n}): boolean {\n const { groupConfig } = params;\n return groupConfig?.requireMention ?? false;\n}\n\n/**\n * Result of an async WhatsApp access check\n */\nexport interface WhatsAppAccessCheckResult {\n /** Whether the sender is allowed to proceed */\n allowed: boolean;\n /** If not allowed (pairing policy), the pairing code */\n pairingCode?: string;\n /** Whether a new pairing request was created */\n newPairingRequest?: boolean;\n /** Human-readable message to send to the user when blocked */\n replyMessage?: string;\n}\n\n/**\n * Checks if a user is allowed based on policy and allowlist, with async pairing support.\n *\n * For non-pairing policies, this behaves identically to `isWhatsAppUserAllowed`.\n * For the \"pairing\" policy, this actually checks the PairingService allowlist\n * and creates pairing requests when needed.\n *\n * @example\n * ```typescript\n * const result = await checkWhatsAppUserAccess({\n * runtime,\n * identifier: message.from,\n * accountConfig,\n * isGroup: false,\n * metadata: { name: contact.name },\n * });\n *\n * if (!result.allowed) {\n * if (result.replyMessage) {\n * await sendMessage(result.replyMessage);\n * }\n * return; // Block message processing\n * }\n * ```\n */\nexport async function checkWhatsAppUserAccess(params: {\n runtime: IAgentRuntime;\n identifier: string;\n accountConfig: WhatsAppAccountRuntimeConfig;\n isGroup: boolean;\n groupId?: string;\n groupConfig?: WhatsAppGroupRuntimeConfig;\n metadata?: Record<string, string>;\n}): Promise<WhatsAppAccessCheckResult> {\n const { runtime, identifier, accountConfig, isGroup, groupConfig, metadata } = params;\n\n if (isGroup) {\n // Group access - same logic as synchronous version\n const policy = accountConfig.groupPolicy ?? \"allowlist\";\n if (policy === \"disabled\") {\n return { allowed: false };\n }\n\n if (policy === \"open\") {\n return { allowed: true };\n }\n\n // Check group-specific allowlist first\n if (groupConfig?.allowFrom?.length) {\n const allowed = groupConfig.allowFrom.some((a) => String(a) === identifier);\n return { allowed };\n }\n\n // Check account-level group allowlist\n if (accountConfig.groupAllowFrom?.length) {\n const allowed = accountConfig.groupAllowFrom.some((a) => String(a) === identifier);\n return { allowed };\n }\n\n return { allowed: policy !== \"allowlist\" };\n }\n\n // DM handling\n const policy = accountConfig.dmPolicy ?? \"pairing\";\n if (policy === \"disabled\") {\n return { allowed: false };\n }\n\n if (policy === \"open\") {\n return { allowed: true };\n }\n\n if (policy === \"pairing\") {\n // Use the PairingService for actual pairing workflow\n const result: PairingCheckResult = await checkPairingAllowed(runtime, {\n channel: \"whatsapp\",\n senderId: identifier,\n metadata,\n });\n\n return {\n allowed: result.allowed,\n pairingCode: result.pairingCode,\n newPairingRequest: result.newRequest,\n replyMessage: result.replyMessage,\n };\n }\n\n // Allowlist policy - check static allowlist first\n if (accountConfig.allowFrom?.length) {\n const allowed = accountConfig.allowFrom.some((a) => String(a) === identifier);\n if (allowed) {\n return { allowed: true };\n }\n }\n\n // Also check the dynamic pairing allowlist for the allowlist policy\n const inDynamicAllowlist = await isInAllowlist(runtime, \"whatsapp\", identifier);\n return { allowed: inDynamicAllowlist };\n}\n",
7
+ "/**\n * WhatsApp ConnectorAccountManager provider.\n *\n * Adapts the existing multi-account scaffolding in `accounts.ts` to the\n * `ConnectorAccountProvider` contract from\n * `@elizaos/core/connectors/account-manager`.\n *\n * Source of truth for accounts is character settings (`character.settings.whatsapp`)\n * plus env-var fallbacks (WHATSAPP_ACCESS_TOKEN, WHATSAPP_PHONE_NUMBER_ID, ...).\n * Single-account env-only deployments still surface as a `default` account.\n *\n * WhatsApp Business Cloud API uses long-lived access tokens, not OAuth from\n * the bot's perspective. Pairing happens out of band when the user provisions\n * a phone_number_id in Meta Business Manager.\n */\n\nimport type {\n ConnectorAccount,\n ConnectorAccountManager,\n ConnectorAccountPatch,\n ConnectorAccountProvider,\n IAgentRuntime,\n} from \"@elizaos/core\";\nimport {\n DEFAULT_ACCOUNT_ID,\n listEnabledWhatsAppAccounts,\n normalizeAccountId,\n type ResolvedWhatsAppAccount,\n resolveWhatsAppAccount,\n} from \"./accounts\";\n\nexport const WHATSAPP_PROVIDER_ID = \"whatsapp\";\n\nfunction purposeForAccount(_account: ResolvedWhatsAppAccount): string[] {\n return [\"messaging\"];\n}\n\nfunction accessGateForAccount(account: ResolvedWhatsAppAccount): string {\n const dmPolicy = account.config?.dmPolicy;\n if (dmPolicy === \"disabled\") return \"disabled\";\n if (dmPolicy === \"pairing\") return \"pairing\";\n return \"open\";\n}\n\nfunction roleForAccount(_account: ResolvedWhatsAppAccount): \"OWNER\" | \"AGENT\" {\n // WhatsApp Business API tokens act as the agent's own identity (the bot).\n return \"AGENT\";\n}\n\nfunction toConnectorAccount(account: ResolvedWhatsAppAccount): ConnectorAccount {\n const now = Date.now();\n return {\n id: normalizeAccountId(account.accountId),\n provider: WHATSAPP_PROVIDER_ID,\n label: account.name ?? account.accountId,\n role: roleForAccount(account),\n purpose: purposeForAccount(account),\n accessGate: accessGateForAccount(account),\n status: account.enabled && account.configured ? \"connected\" : \"disabled\",\n externalId: account.phoneNumberId || undefined,\n displayHandle: account.phoneNumberId || undefined,\n createdAt: now,\n updatedAt: now,\n metadata: {\n tokenSource: account.tokenSource,\n phoneNumberId: account.phoneNumberId,\n businessAccountId: account.businessAccountId ?? null,\n dmPolicy: account.config?.dmPolicy ?? \"pairing\",\n groupPolicy: account.config?.groupPolicy ?? \"allowlist\",\n },\n };\n}\n\nexport function createWhatsAppConnectorAccountProvider(\n runtime: IAgentRuntime\n): ConnectorAccountProvider {\n return {\n provider: WHATSAPP_PROVIDER_ID,\n label: \"WhatsApp\",\n listAccounts: async (_manager: ConnectorAccountManager): Promise<ConnectorAccount[]> => {\n const enabled = listEnabledWhatsAppAccounts(runtime);\n if (enabled.length > 0) {\n return enabled.map(toConnectorAccount);\n }\n const fallback = resolveWhatsAppAccount(runtime, DEFAULT_ACCOUNT_ID);\n return [toConnectorAccount(fallback)];\n },\n createAccount: async (input: ConnectorAccountPatch, _manager: ConnectorAccountManager) => {\n return {\n ...input,\n provider: WHATSAPP_PROVIDER_ID,\n role: input.role ?? \"AGENT\",\n purpose: input.purpose ?? [\"messaging\"],\n accessGate: input.accessGate ?? \"open\",\n status: input.status ?? \"pending\",\n };\n },\n patchAccount: async (\n _accountId: string,\n patch: ConnectorAccountPatch,\n _manager: ConnectorAccountManager\n ) => {\n return { ...patch, provider: WHATSAPP_PROVIDER_ID };\n },\n deleteAccount: async (_accountId: string, _manager: ConnectorAccountManager) => {\n // Persistent credentials live in character settings / env; deletion at\n // the manager layer is a no-op marker.\n },\n // WhatsApp Cloud API: provisioning is via Meta Business Manager. Baileys\n // uses QR pairing handled separately in `pairing-service.ts`. No OAuth.\n };\n}\n",
8
+ "import {\n ChannelType,\n type Content,\n createUniqueUuid,\n type IAgentRuntime,\n lifeOpsPassiveConnectorsEnabled,\n type Memory,\n type Room,\n Service,\n type UUID,\n} from \"@elizaos/core\";\nimport {\n checkWhatsAppUserAccess,\n DEFAULT_ACCOUNT_ID,\n getMultiAccountConfig,\n listWhatsAppAccountIds,\n normalizeAccountId as normalizeWhatsAppAccountId,\n resolveDefaultWhatsAppAccountId,\n resolveWhatsAppAccount,\n type WhatsAppAccountRuntimeConfig,\n} from \"./accounts\";\nimport { WhatsAppClient } from \"./client\";\nimport { BaileysClient } from \"./clients/baileys-client\";\nimport {\n buildWhatsAppUserJid,\n chunkWhatsAppText,\n isWhatsAppGroupJid,\n isWhatsAppUserTarget,\n normalizeWhatsAppTarget,\n resolveWhatsAppSystemLocation,\n} from \"./normalize\";\nimport type {\n BaileysConfig,\n CloudAPIConfig,\n ConnectionStatus,\n NormalizedMessage,\n WhatsAppIncomingMessage,\n WhatsAppMessageResponse,\n WhatsAppWebhookEvent,\n} from \"./types\";\n\ntype RuntimeServiceConfig =\n | {\n accountId: string;\n name?: string;\n transport: \"baileys\";\n authDir: string;\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n allowFrom?: string[];\n groupAllowFrom?: string[];\n }\n | {\n accountId: string;\n name?: string;\n transport: \"cloudapi\";\n accessToken: string;\n phoneNumberId: string;\n businessAccountId?: string;\n webhookVerifyToken?: string;\n apiVersion?: string;\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n allowFrom?: string[];\n groupAllowFrom?: string[];\n };\n\nfunction readStringSetting(runtime: IAgentRuntime, key: string): string | undefined {\n const value = runtime.getSetting(key);\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n\n const envValue = process.env[key];\n if (typeof envValue === \"string\" && envValue.trim().length > 0) {\n return envValue.trim();\n }\n\n return undefined;\n}\n\nfunction readCsvSetting(runtime: IAgentRuntime, key: string): string[] {\n const value = readStringSetting(runtime, key);\n if (!value) {\n return [];\n }\n\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n}\n\nfunction resolveRuntimeConfig(runtime: IAgentRuntime): RuntimeServiceConfig | null {\n const dmPolicy = readStringSetting(runtime, \"WHATSAPP_DM_POLICY\") as\n | \"open\"\n | \"allowlist\"\n | \"pairing\"\n | \"disabled\"\n | undefined;\n const groupPolicy = readStringSetting(runtime, \"WHATSAPP_GROUP_POLICY\") as\n | \"open\"\n | \"allowlist\"\n | \"disabled\"\n | undefined;\n const allowFrom = readCsvSetting(runtime, \"WHATSAPP_ALLOW_FROM\");\n const groupAllowFrom = readCsvSetting(runtime, \"WHATSAPP_GROUP_ALLOW_FROM\");\n\n const authDir =\n readStringSetting(runtime, \"WHATSAPP_AUTH_DIR\") ??\n readStringSetting(runtime, \"WHATSAPP_SESSION_PATH\");\n if (authDir) {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n transport: \"baileys\",\n authDir,\n dmPolicy,\n groupPolicy,\n allowFrom,\n groupAllowFrom,\n };\n }\n\n const accessToken = readStringSetting(runtime, \"WHATSAPP_ACCESS_TOKEN\");\n const phoneNumberId = readStringSetting(runtime, \"WHATSAPP_PHONE_NUMBER_ID\");\n if (accessToken && phoneNumberId) {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n transport: \"cloudapi\",\n accessToken,\n phoneNumberId,\n webhookVerifyToken: readStringSetting(runtime, \"WHATSAPP_WEBHOOK_VERIFY_TOKEN\"),\n apiVersion: readStringSetting(runtime, \"WHATSAPP_API_VERSION\"),\n dmPolicy,\n groupPolicy,\n allowFrom,\n groupAllowFrom,\n };\n }\n\n return null;\n}\n\nfunction configuredAccountForId(\n config: ReturnType<typeof getMultiAccountConfig>,\n accountId: string\n): WhatsAppAccountRuntimeConfig {\n const normalized = normalizeWhatsAppAccountId(accountId);\n const accountConfig =\n config.accounts?.[accountId] ??\n Object.entries(config.accounts ?? {}).find(\n ([key]) => normalizeWhatsAppAccountId(key) === normalized\n )?.[1] ??\n {};\n return {\n ...config,\n accounts: undefined,\n groups: undefined,\n ...accountConfig,\n } as WhatsAppAccountRuntimeConfig;\n}\n\nfunction resolveRuntimeConfigs(runtime: IAgentRuntime): RuntimeServiceConfig[] {\n const multiConfig = getMultiAccountConfig(runtime);\n const accountIds = listWhatsAppAccountIds(runtime);\n const configs: RuntimeServiceConfig[] = [];\n\n for (const accountId of accountIds) {\n const normalizedAccountId = normalizeWhatsAppAccountId(accountId);\n const accountConfig = configuredAccountForId(multiConfig, normalizedAccountId);\n const authDir = accountConfig.authDir?.trim();\n const transport = accountConfig.transport ?? (authDir ? \"baileys\" : \"cloudapi\");\n\n if (transport === \"baileys\" && authDir) {\n configs.push({\n accountId: normalizedAccountId,\n name: accountConfig.name?.trim() || undefined,\n transport: \"baileys\",\n authDir,\n dmPolicy: accountConfig.dmPolicy,\n groupPolicy: accountConfig.groupPolicy,\n allowFrom: accountConfig.allowFrom?.map(String),\n groupAllowFrom: accountConfig.groupAllowFrom?.map(String),\n });\n continue;\n }\n\n const cloud = resolveWhatsAppAccount(runtime, normalizedAccountId);\n if (cloud.enabled && cloud.configured) {\n configs.push({\n accountId: normalizedAccountId,\n name: cloud.name,\n transport: \"cloudapi\",\n accessToken: cloud.accessToken,\n phoneNumberId: cloud.phoneNumberId,\n businessAccountId: cloud.businessAccountId,\n webhookVerifyToken: cloud.config.webhookVerifyToken,\n apiVersion: cloud.config.apiVersion,\n dmPolicy: cloud.config.dmPolicy,\n groupPolicy: cloud.config.groupPolicy,\n allowFrom: cloud.config.allowFrom?.map(String),\n groupAllowFrom: cloud.config.groupAllowFrom?.map(String),\n });\n }\n }\n\n if (configs.length > 0) {\n return configs;\n }\n\n const legacy = resolveRuntimeConfig(runtime);\n return legacy ? [legacy] : [];\n}\n\nfunction toTimestampMs(value: number | string | undefined): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return Date.now();\n }\n\n return parsed >= 1_000_000_000_000 ? parsed : parsed * 1000;\n}\n\nfunction toMemoryId(runtime: IAgentRuntime, chatId: string, messageId: string): UUID {\n return createUniqueUuid(runtime, `whatsapp:${chatId}:${messageId}`) as UUID;\n}\n\ntype RuntimeWithOptionalConnectorRegistry = IAgentRuntime & {\n registerMessageConnector?: (registration: MessageConnectorRegistration) => void;\n};\ntype RuntimeSendHandler = Parameters<IAgentRuntime[\"registerSendHandler\"]>[1];\ntype ConnectorTargetInfo = Parameters<RuntimeSendHandler>[1];\ntype ConnectorContent = Parameters<RuntimeSendHandler>[2];\ntype MessageConnectorRegistration = Parameters<IAgentRuntime[\"registerMessageConnector\"]>[0];\ntype MessageConnectorTarget = Awaited<\n ReturnType<NonNullable<MessageConnectorRegistration[\"resolveTargets\"]>>\n>[number];\ntype MessageConnectorQueryContext = Parameters<\n NonNullable<MessageConnectorRegistration[\"resolveTargets\"]>\n>[1];\ntype MessageConnectorChatContext = NonNullable<\n Awaited<ReturnType<NonNullable<MessageConnectorRegistration[\"getChatContext\"]>>>\n>;\ntype MessageConnectorUserContext = NonNullable<\n Awaited<ReturnType<NonNullable<MessageConnectorRegistration[\"getUserContext\"]>>>\n>;\ntype AccountTargetInfo = ConnectorTargetInfo & { accountId?: string };\ntype AccountQueryContext = MessageConnectorQueryContext & { accountId?: string };\n\nfunction readTargetAccountId(target?: ConnectorTargetInfo | null): string | undefined {\n return (target as AccountTargetInfo | undefined)?.accountId;\n}\n\nfunction readContextAccountId(context?: MessageConnectorQueryContext | null): string | undefined {\n return (context as AccountQueryContext | undefined)?.accountId;\n}\n\nfunction targetWithAccount(\n target: Partial<ConnectorTargetInfo>,\n accountId: string\n): ConnectorTargetInfo {\n return { ...target, accountId } as ConnectorTargetInfo;\n}\n\ntype ConnectorFetchMessagesParams = {\n target?: ConnectorTargetInfo;\n limit?: number;\n before?: string;\n after?: string;\n channelId?: string;\n roomId?: UUID;\n};\n\ntype ConnectorSearchMessagesParams = ConnectorFetchMessagesParams & {\n query?: string;\n};\n\ntype ConnectorReactionParams = {\n target?: ConnectorTargetInfo;\n channelId?: string;\n roomId?: UUID;\n messageId?: string;\n emoji?: string;\n remove?: boolean;\n};\n\ntype ConnectorUserLookupParams = {\n userId?: string;\n username?: string;\n handle?: string;\n query?: string;\n};\n\ntype ExtendedMessageConnectorRegistration = MessageConnectorRegistration & {\n fetchMessages?: (\n context: MessageConnectorQueryContext,\n params: ConnectorFetchMessagesParams\n ) => Promise<Memory[]>;\n searchMessages?: (\n context: MessageConnectorQueryContext,\n params: ConnectorSearchMessagesParams\n ) => Promise<Memory[]>;\n reactHandler?: (runtime: IAgentRuntime, params: ConnectorReactionParams) => Promise<void>;\n getUser?: (runtime: IAgentRuntime, params: ConnectorUserLookupParams) => Promise<unknown>;\n};\n\ntype KnownWhatsAppTarget = {\n accountId: string;\n chatId: string;\n senderId: string;\n label: string;\n isGroup: boolean;\n lastMessageAt: number;\n roomId?: UUID;\n};\n\nfunction registerMessageConnectorIfAvailable(\n runtime: IAgentRuntime,\n registration: ExtendedMessageConnectorRegistration\n): void {\n const withRegistry = runtime as RuntimeWithOptionalConnectorRegistry;\n if (typeof withRegistry.registerMessageConnector === \"function\") {\n withRegistry.registerMessageConnector(registration);\n return;\n }\n if (registration.sendHandler) {\n runtime.registerSendHandler(registration.source, registration.sendHandler);\n }\n}\n\nfunction normalizeBaileysSendTarget(target: string): string {\n if (isWhatsAppGroupJid(target) || isWhatsAppUserTarget(target)) {\n return target;\n }\n const normalized = normalizeWhatsAppTarget(target);\n return normalized ? buildWhatsAppUserJid(normalized) : target;\n}\n\nfunction normalizeWhatsAppConnectorTarget(value: string): string {\n const trimmed = value\n .trim()\n .replace(/^whatsapp:/i, \"\")\n .trim();\n if (!trimmed) return \"\";\n if (isWhatsAppGroupJid(trimmed) || isWhatsAppUserTarget(trimmed)) {\n return trimmed;\n }\n return normalizeWhatsAppTarget(trimmed) ?? trimmed;\n}\n\nfunction isWhatsAppAddress(value: string): boolean {\n return (\n isWhatsAppGroupJid(value) ||\n isWhatsAppUserTarget(value) ||\n normalizeWhatsAppTarget(value) !== null\n );\n}\n\nfunction normalizedSearchText(value: string | undefined): string {\n return (value ?? \"\")\n .toLowerCase()\n .replace(/[^a-z0-9@+._-]+/g, \" \")\n .trim();\n}\n\nfunction matchesQuery(query: string, ...values: Array<string | undefined>): boolean {\n const normalizedQuery = normalizedSearchText(query);\n if (!normalizedQuery) return true;\n const normalizedTargetQuery = normalizedSearchText(normalizeWhatsAppConnectorTarget(query));\n return values.some((value) => {\n const normalizedValue = normalizedSearchText(value);\n return (\n normalizedValue.includes(normalizedQuery) ||\n (normalizedTargetQuery.length > 0 && normalizedValue.includes(normalizedTargetQuery))\n );\n });\n}\n\nfunction whatsappTargetKind(value: string): \"phone\" | \"group\" | \"contact\" {\n if (isWhatsAppGroupJid(value)) return \"group\";\n if (/^\\+?\\d{7,}$/.test(value) || isWhatsAppUserTarget(value)) return \"phone\";\n return \"contact\";\n}\n\nfunction knownWhatsAppTargetToConnectorTarget(\n known: KnownWhatsAppTarget,\n score = 0.72\n): MessageConnectorTarget {\n const accountId = known.accountId ?? DEFAULT_ACCOUNT_ID;\n return {\n target: targetWithAccount(\n {\n source: \"whatsapp\",\n channelId: known.chatId,\n entityId: known.senderId,\n roomId: known.roomId,\n },\n accountId\n ),\n label: known.label,\n kind: known.isGroup ? \"group\" : whatsappTargetKind(known.senderId),\n description: known.isGroup ? \"WhatsApp group chat\" : \"WhatsApp contact\",\n score,\n metadata: {\n accountId,\n chatId: known.chatId,\n senderId: known.senderId,\n lastMessageAt: known.lastMessageAt,\n },\n };\n}\n\nfunction directWhatsAppTarget(\n value: string,\n accountId = DEFAULT_ACCOUNT_ID,\n score = 0.68\n): MessageConnectorTarget | null {\n const normalized = normalizeWhatsAppConnectorTarget(value);\n if (!normalized || !isWhatsAppAddress(normalized)) return null;\n return {\n target: targetWithAccount(\n {\n source: \"whatsapp\",\n channelId: normalized,\n entityId: normalized,\n },\n accountId\n ),\n label: normalized,\n kind: whatsappTargetKind(normalized),\n score,\n metadata: {\n accountId,\n normalizedTarget: normalized,\n },\n };\n}\n\ntype ResolvedWhatsAppSendTarget = {\n accountId: string;\n chatId: string;\n};\n\nasync function resolveWhatsAppSendTarget(\n runtime: IAgentRuntime,\n service: WhatsAppConnectorService,\n target: ConnectorTargetInfo,\n fallbackAccountId?: string\n): Promise<ResolvedWhatsAppSendTarget | null> {\n const targetAccountId =\n typeof service.resolveAccountId === \"function\"\n ? service.resolveAccountId(readTargetAccountId(target) ?? fallbackAccountId)\n : normalizeWhatsAppAccountId(readTargetAccountId(target) ?? fallbackAccountId);\n if (target.channelId?.trim()) {\n const normalized = normalizeWhatsAppConnectorTarget(target.channelId);\n const known =\n service.getKnownTarget(normalized, targetAccountId) ??\n service.findKnownChatByParticipant(normalized, targetAccountId);\n if (known) {\n return { accountId: known.accountId ?? targetAccountId, chatId: known.chatId };\n }\n return isWhatsAppAddress(normalized)\n ? { accountId: targetAccountId, chatId: normalized }\n : null;\n }\n if (target.entityId?.trim()) {\n const normalized = normalizeWhatsAppConnectorTarget(target.entityId);\n const known = service.findKnownChatByParticipant(normalized, targetAccountId);\n if (known) {\n return { accountId: known.accountId ?? targetAccountId, chatId: known.chatId };\n }\n return isWhatsAppAddress(normalized)\n ? { accountId: targetAccountId, chatId: normalized }\n : null;\n }\n if (target.roomId) {\n const room = await runtime.getRoom(target.roomId);\n if (room?.channelId) {\n const normalized = normalizeWhatsAppConnectorTarget(room.channelId);\n const known =\n service.getKnownTarget(normalized, targetAccountId) ??\n service.findKnownChatByParticipant(normalized, targetAccountId);\n if (known) {\n return { accountId: known.accountId ?? targetAccountId, chatId: known.chatId };\n }\n return isWhatsAppAddress(normalized)\n ? { accountId: targetAccountId, chatId: normalized }\n : null;\n }\n }\n return null;\n}\n\nfunction extractWebhookText(message: WhatsAppIncomingMessage): string {\n if (typeof message.text?.body === \"string\" && message.text.body.trim()) {\n return message.text.body.trim();\n }\n\n if (\n typeof message.interactive?.button_reply?.title === \"string\" &&\n message.interactive.button_reply.title.trim()\n ) {\n return message.interactive.button_reply.title.trim();\n }\n\n if (\n typeof message.interactive?.list_reply?.title === \"string\" &&\n message.interactive.list_reply.title.trim()\n ) {\n return message.interactive.list_reply.title.trim();\n }\n\n if (\n typeof message.interactive?.nfm_reply?.body === \"string\" &&\n message.interactive.nfm_reply.body.trim()\n ) {\n return message.interactive.nfm_reply.body.trim();\n }\n\n if (typeof message.image?.caption === \"string\" && message.image.caption.trim()) {\n return message.image.caption.trim();\n }\n\n if (typeof message.video?.caption === \"string\" && message.video.caption.trim()) {\n return message.video.caption.trim();\n }\n\n if (typeof message.document?.caption === \"string\" && message.document.caption.trim()) {\n return message.document.caption.trim();\n }\n\n if (message.reaction?.emoji) {\n return `Reaction: ${message.reaction.emoji}`;\n }\n\n if (message.location) {\n const { latitude, longitude } = message.location;\n return `Location: ${latitude}, ${longitude}`;\n }\n\n return \"\";\n}\n\nexport class WhatsAppConnectorService extends Service {\n static serviceType = \"whatsapp\";\n protected declare runtime: IAgentRuntime;\n\n capabilityDescription = \"The agent is able to send and receive messages on whatsapp\";\n\n public connected = false;\n public phoneNumber: string | null = null;\n\n private defaultAccountId = DEFAULT_ACCOUNT_ID;\n private clients: Map<string, BaileysClient | WhatsAppClient> = new Map();\n private configs: Map<string, RuntimeServiceConfig> = new Map();\n private phoneNumbers: Map<string, string> = new Map();\n private client: BaileysClient | WhatsAppClient | null = null;\n config: RuntimeServiceConfig | undefined = undefined;\n private knownTargets: Map<string, KnownWhatsAppTarget> = new Map();\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n if (runtime) {\n this.runtime = runtime;\n }\n }\n\n resolveAccountId(accountId?: string | null): string {\n return normalizeWhatsAppAccountId(accountId ?? this.defaultAccountId);\n }\n\n private getClientForAccount(accountId?: string | null): BaileysClient | WhatsAppClient | null {\n const normalizedAccountId = this.resolveAccountId(accountId);\n return (\n this.clients.get(normalizedAccountId) ??\n (normalizedAccountId === this.defaultAccountId ? this.client : null)\n );\n }\n\n private getConfigForAccount(accountId?: string | null): RuntimeServiceConfig | null {\n const normalizedAccountId = this.resolveAccountId(accountId);\n return (\n this.configs.get(normalizedAccountId) ??\n (normalizedAccountId === this.defaultAccountId ? (this.config ?? null) : null)\n );\n }\n\n private getConnectorAccountIds(): string[] {\n const ids = Array.from(this.configs.keys());\n return ids.length > 0 ? ids : [this.defaultAccountId];\n }\n\n private targetKey(chatId: string, accountId?: string | null): string {\n return `${this.resolveAccountId(accountId)}:${normalizeWhatsAppConnectorTarget(chatId)}`;\n }\n\n private roomIdFor(chatId: string, accountId?: string | null): UUID {\n const normalizedAccountId = this.resolveAccountId(accountId);\n return createUniqueUuid(\n this.runtime,\n normalizedAccountId === DEFAULT_ACCOUNT_ID\n ? `whatsapp-room:${chatId}`\n : `whatsapp-room:${normalizedAccountId}:${chatId}`\n ) as UUID;\n }\n\n private entityIdFor(senderId: string, accountId?: string | null): UUID {\n const normalizedAccountId = this.resolveAccountId(accountId);\n return createUniqueUuid(\n this.runtime,\n normalizedAccountId === DEFAULT_ACCOUNT_ID\n ? `whatsapp-entity:${senderId}`\n : `whatsapp-entity:${normalizedAccountId}:${senderId}`\n ) as UUID;\n }\n\n private worldIdFor(chatId: string, accountId?: string | null): UUID {\n const normalizedAccountId = this.resolveAccountId(accountId);\n return createUniqueUuid(\n this.runtime,\n normalizedAccountId === DEFAULT_ACCOUNT_ID\n ? `whatsapp-world:${chatId}`\n : `whatsapp-world:${normalizedAccountId}:${chatId}`\n ) as UUID;\n }\n\n private metadataMatchesAccount(memory: Memory, accountId: string): boolean {\n const metadata = memory.metadata as Record<string, unknown> | undefined;\n const memoryAccountId =\n typeof metadata?.accountId === \"string\" && metadata.accountId.trim()\n ? this.resolveAccountId(metadata.accountId)\n : undefined;\n return memoryAccountId ? memoryAccountId === accountId : accountId === DEFAULT_ACCOUNT_ID;\n }\n\n static async start(runtime: IAgentRuntime): Promise<WhatsAppConnectorService> {\n const service = new WhatsAppConnectorService(runtime);\n await service.initialize();\n return service;\n }\n\n static registerSendHandlers(runtime: IAgentRuntime, service: WhatsAppConnectorService): void {\n const resolveServiceAccountId = (accountId?: string | null): string =>\n typeof service.resolveAccountId === \"function\"\n ? service.resolveAccountId(accountId)\n : normalizeWhatsAppAccountId(accountId);\n const getServiceConfigForAccount = (accountId?: string | null): RuntimeServiceConfig | null =>\n typeof service.getConfigForAccount === \"function\"\n ? service.getConfigForAccount(accountId)\n : (service.config ?? null);\n const accountIds =\n typeof service.getConnectorAccountIds === \"function\"\n ? service.getConnectorAccountIds()\n : [DEFAULT_ACCOUNT_ID];\n const registrationAccountIds =\n accountIds.length > 1 ? accountIds : [undefined as string | undefined];\n\n for (const registrationAccountId of registrationAccountIds) {\n const connectorAccountId = resolveServiceAccountId(registrationAccountId);\n const config = getServiceConfigForAccount(connectorAccountId);\n registerMessageConnectorIfAvailable(runtime, {\n source: \"whatsapp\",\n ...(registrationAccountId ? { accountId: connectorAccountId } : {}),\n label:\n registrationAccountId && connectorAccountId !== DEFAULT_ACCOUNT_ID\n ? `WhatsApp (${connectorAccountId})`\n : \"WhatsApp\",\n capabilities: [\n \"send_message\",\n \"read_messages\",\n \"search_messages\",\n \"send_reaction\",\n \"contact_resolution\",\n \"chat_context\",\n \"get_user\",\n ],\n supportedTargetKinds: [\"phone\", \"contact\", \"user\", \"group\", \"room\"],\n contexts: [\"phone\", \"social\", \"connectors\"],\n description:\n \"Send, read, search, and react in WhatsApp conversations through Cloud API or Baileys using phone numbers, JIDs, known contacts, or group ids.\",\n metadata: {\n aliases: [\"whatsapp\", \"wa\"],\n accountId: connectorAccountId,\n transport: config?.transport ?? service.config?.transport ?? \"unconfigured\",\n connected: service.connected,\n },\n sendHandler: async (\n _runtime: IAgentRuntime,\n target: ConnectorTargetInfo,\n content: ConnectorContent\n ) => {\n const text = typeof content.text === \"string\" ? content.text.trim() : \"\";\n if (!text) {\n return;\n }\n\n const resolved = await resolveWhatsAppSendTarget(\n runtime,\n service,\n target,\n connectorAccountId\n );\n if (!resolved) {\n throw new Error(\"WhatsApp target is missing a phone number, JID, or chat id\");\n }\n\n let replyToMessageId: string | undefined;\n if (typeof content.inReplyTo === \"string\" && content.inReplyTo.trim()) {\n const repliedToMemory = await runtime.getMemoryById(content.inReplyTo as UUID);\n const metadata = repliedToMemory?.metadata as Record<string, unknown> | undefined;\n const externalMessageId =\n metadata?.messageIdFull ?? metadata?.externalMessageId ?? metadata?.whatsappMessageId;\n if (typeof externalMessageId === \"string\" && externalMessageId.trim()) {\n replyToMessageId = externalMessageId.trim();\n }\n }\n\n for (const chunk of chunkWhatsAppText(text)) {\n await service.sendMessage({\n accountId: resolved.accountId,\n type: \"text\",\n to: resolved.chatId,\n content: chunk,\n replyToMessageId,\n });\n }\n },\n resolveTargets: async (query: string) => {\n const candidates: MessageConnectorTarget[] = [];\n for (const known of service.listKnownTargets(connectorAccountId)) {\n if (matchesQuery(query, known.label, known.chatId, known.senderId)) {\n candidates.push(knownWhatsAppTargetToConnectorTarget(known, 0.82));\n }\n }\n const direct = directWhatsAppTarget(query, connectorAccountId, 0.74);\n if (direct) candidates.push(direct);\n return candidates;\n },\n listRecentTargets: () =>\n service\n .listKnownTargets(connectorAccountId)\n .map((known) => knownWhatsAppTargetToConnectorTarget(known, 0.66)),\n listRooms: () =>\n service\n .listKnownTargets(connectorAccountId)\n .filter((known) => known.isGroup)\n .map((known) => knownWhatsAppTargetToConnectorTarget(known, 0.7)),\n fetchMessages: service.fetchConnectorMessages.bind(service),\n searchMessages: service.searchConnectorMessages.bind(service),\n reactHandler: service.reactConnectorMessage.bind(service),\n getUser: service.getConnectorUser.bind(service),\n getChatContext: async (\n target: ConnectorTargetInfo,\n context: MessageConnectorQueryContext\n ): Promise<MessageConnectorChatContext | null> => {\n const resolved = await resolveWhatsAppSendTarget(\n context.runtime,\n service,\n target,\n readContextAccountId(context) ?? connectorAccountId\n );\n if (!resolved) return null;\n const known =\n service.getKnownTarget(resolved.chatId, resolved.accountId) ??\n service.findKnownChatByParticipant(resolved.chatId, resolved.accountId);\n const resolvedConfig = getServiceConfigForAccount(resolved.accountId);\n return {\n target: targetWithAccount(\n { ...target, channelId: resolved.chatId },\n resolved.accountId\n ),\n label: known?.label ?? resolved.chatId,\n summary: known?.isGroup ? \"WhatsApp group chat.\" : \"WhatsApp direct chat.\",\n metadata: {\n accountId: resolved.accountId,\n chatId: resolved.chatId,\n senderId: known?.senderId,\n lastMessageAt: known?.lastMessageAt,\n connected: service.connected,\n transport: resolvedConfig?.transport,\n },\n };\n },\n getUserContext: async (\n entityId: string | UUID\n ): Promise<MessageConnectorUserContext | null> => {\n const handle = normalizeWhatsAppConnectorTarget(String(entityId));\n if (!handle) return null;\n const known = service.findKnownChatByParticipant(handle, connectorAccountId);\n return {\n entityId,\n label: known?.label ?? handle,\n aliases: known ? [known.label, known.senderId, known.chatId] : [handle],\n handles: {\n whatsapp: known?.chatId ?? handle,\n phone: normalizeWhatsAppTarget(handle) ?? handle,\n },\n metadata: {\n accountId: known?.accountId ?? connectorAccountId,\n normalizedHandle: handle,\n chatId: known?.chatId,\n },\n };\n },\n });\n }\n }\n\n async initialize(): Promise<void> {\n this.defaultAccountId = resolveDefaultWhatsAppAccountId(this.runtime);\n const configs = resolveRuntimeConfigs(this.runtime);\n if (configs.length === 0) {\n this.runtime.logger.warn(\n { src: \"plugin:whatsapp\", agentId: this.runtime.agentId },\n \"WhatsApp connector is not configured\"\n );\n return;\n }\n\n for (const config of configs) {\n const client =\n config.transport === \"baileys\"\n ? new BaileysClient({\n authMethod: \"baileys\",\n authDir: config.authDir,\n printQRInTerminal: false,\n } satisfies BaileysConfig)\n : new WhatsAppClient({\n accessToken: config.accessToken,\n phoneNumberId: config.phoneNumberId,\n webhookVerifyToken: config.webhookVerifyToken,\n apiVersion: config.apiVersion,\n } satisfies CloudAPIConfig);\n\n this.configs.set(config.accountId, config);\n this.clients.set(config.accountId, client);\n if (config.accountId === this.defaultAccountId || !this.client) {\n this.config = config;\n this.client = client;\n }\n\n this.bindClientEvents(client, config.accountId);\n await client.start();\n\n if (config.transport === \"cloudapi\") {\n this.connected = true;\n }\n }\n }\n\n async stop(): Promise<void> {\n for (const client of this.clients.values()) {\n await client.stop();\n }\n this.clients.clear();\n this.configs.clear();\n this.phoneNumbers.clear();\n this.client = null;\n this.config = undefined;\n this.connected = false;\n this.phoneNumber = null;\n }\n\n async handleWebhook(event: WhatsAppWebhookEvent): Promise<void> {\n for (const entry of event.entry ?? []) {\n for (const change of entry.changes ?? []) {\n const value = change.value;\n const accountId = this.resolveWebhookAccountId(value?.metadata?.phone_number_id);\n if (typeof value?.metadata?.display_phone_number === \"string\") {\n this.phoneNumbers.set(accountId, value.metadata.display_phone_number);\n if (accountId === this.defaultAccountId) {\n this.phoneNumber = value.metadata.display_phone_number;\n }\n }\n\n for (const message of value?.messages ?? []) {\n await this.handleIncomingWebhookMessage(message, accountId);\n }\n }\n }\n }\n\n verifyWebhook(mode: string, token: string, challenge: string, accountId?: string): string | null {\n const configs = accountId\n ? [this.getConfigForAccount(accountId)].filter((config): config is RuntimeServiceConfig =>\n Boolean(config)\n )\n : Array.from(this.configs.values());\n const expectedTokens =\n configs.length > 0\n ? configs\n .filter((config) => config.transport === \"cloudapi\")\n .map((config) => config.webhookVerifyToken)\n : [\n this.config?.transport === \"cloudapi\"\n ? this.config.webhookVerifyToken\n : readStringSetting(this.runtime, \"WHATSAPP_WEBHOOK_VERIFY_TOKEN\"),\n ];\n\n if (\n mode === \"subscribe\" &&\n challenge &&\n expectedTokens.some((expectedToken) => expectedToken && token === expectedToken)\n ) {\n return challenge;\n }\n\n return null;\n }\n\n private resolveWebhookAccountId(phoneNumberId?: string | null): string {\n const normalizedPhoneNumberId =\n typeof phoneNumberId === \"string\" && phoneNumberId.trim() ? phoneNumberId.trim() : undefined;\n if (normalizedPhoneNumberId) {\n for (const [accountId, config] of this.configs) {\n if (config.transport === \"cloudapi\" && config.phoneNumberId === normalizedPhoneNumberId) {\n return accountId;\n }\n }\n }\n return this.defaultAccountId;\n }\n\n private bindClientEvents(client: BaileysClient | WhatsAppClient, accountId: string): void {\n client.on(\"connection\", (status: ConnectionStatus) => {\n if (status === \"open\") {\n this.connected = true;\n }\n if (status === \"open\" && client instanceof BaileysClient) {\n const nextPhone = client.getPhoneNumber();\n const normalizedPhone = (nextPhone && normalizeWhatsAppTarget(nextPhone)) ?? nextPhone;\n if (normalizedPhone) {\n this.phoneNumbers.set(accountId, normalizedPhone);\n }\n if (accountId === this.defaultAccountId) {\n this.phoneNumber = normalizedPhone;\n }\n }\n if (status === \"close\") {\n this.phoneNumbers.delete(accountId);\n this.connected =\n this.phoneNumbers.size > 0 ||\n Array.from(this.configs.values()).some((config) => config.transport === \"cloudapi\");\n if (accountId === this.defaultAccountId) {\n this.phoneNumber = null;\n }\n }\n });\n\n client.on(\"ready\", () => {\n this.connected = true;\n if (client instanceof BaileysClient) {\n const nextPhone = client.getPhoneNumber();\n const normalizedPhone = (nextPhone && normalizeWhatsAppTarget(nextPhone)) ?? nextPhone;\n if (normalizedPhone) {\n this.phoneNumbers.set(accountId, normalizedPhone);\n }\n if (accountId === this.defaultAccountId) {\n this.phoneNumber = normalizedPhone;\n }\n }\n });\n\n client.on(\"message\", (message: NormalizedMessage) => {\n void this.handleNormalizedMessage(message, accountId).catch((error: unknown) => {\n this.runtime.logger.error(\n {\n src: \"plugin:whatsapp\",\n agentId: this.runtime.agentId,\n accountId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to process inbound WhatsApp message\"\n );\n });\n });\n\n client.on(\"error\", (error: unknown) => {\n this.runtime.logger.error(\n {\n src: \"plugin:whatsapp\",\n agentId: this.runtime.agentId,\n accountId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"WhatsApp client error\"\n );\n });\n }\n\n private async handleNormalizedMessage(\n message: NormalizedMessage,\n accountId = this.defaultAccountId\n ): Promise<void> {\n const chatId = message.chatId ?? message.from;\n const senderId = message.senderId ?? message.from;\n const text = typeof message.content === \"string\" ? message.content.trim() : \"\";\n\n if (!chatId || !senderId || !text) {\n return;\n }\n\n await this.processIncomingMessage({\n chatId,\n senderId,\n text,\n externalMessageId: message.id,\n replyToExternalMessageId: message.replyToId,\n createdAt: toTimestampMs(message.timestamp),\n accountId,\n });\n }\n\n private async handleIncomingWebhookMessage(\n message: WhatsAppIncomingMessage,\n accountId = this.defaultAccountId\n ): Promise<void> {\n const text = extractWebhookText(message);\n if (!text) {\n return;\n }\n\n const normalizedSender = normalizeWhatsAppTarget(message.from) ?? message.from;\n\n await this.processIncomingMessage({\n chatId: normalizedSender,\n senderId: normalizedSender,\n text,\n externalMessageId: message.id,\n replyToExternalMessageId: message.context?.id,\n createdAt: toTimestampMs(message.timestamp),\n accountId,\n });\n }\n\n private async processIncomingMessage(params: {\n accountId: string;\n chatId: string;\n senderId: string;\n text: string;\n externalMessageId: string;\n replyToExternalMessageId?: string;\n createdAt: number;\n }): Promise<void> {\n if (!this.runtime.messageService) {\n throw new Error(\"WhatsApp connector requires runtime.messageService\");\n }\n\n const accountId = this.resolveAccountId(params.accountId);\n const config = this.getConfigForAccount(accountId);\n const isGroup = isWhatsAppGroupJid(params.chatId);\n const normalizedSender = normalizeWhatsAppTarget(params.senderId) ?? params.senderId;\n\n const accountConfig = {\n dmPolicy: config?.dmPolicy,\n groupPolicy: config?.groupPolicy,\n allowFrom: config?.allowFrom,\n groupAllowFrom: config?.groupAllowFrom,\n };\n\n const access = await checkWhatsAppUserAccess({\n runtime: this.runtime,\n identifier: normalizedSender,\n accountConfig,\n isGroup,\n ...(isGroup ? { groupId: params.chatId } : {}),\n metadata: { accountId, senderId: normalizedSender },\n });\n\n if (!access.allowed) {\n if (access.replyMessage) {\n await this.sendTextMessage(params.chatId, access.replyMessage, undefined, accountId);\n }\n return;\n }\n\n const channelType = isGroup ? ChannelType.GROUP : ChannelType.DM;\n const roomId = this.roomIdFor(params.chatId, accountId);\n const worldId = this.worldIdFor(params.chatId, accountId);\n const entityId = this.entityIdFor(normalizedSender, accountId);\n const inboundMemoryId = toMemoryId(\n this.runtime,\n accountId === DEFAULT_ACCOUNT_ID ? params.chatId : `${accountId}:${params.chatId}`,\n params.externalMessageId\n );\n\n await this.runtime.ensureConnection({\n entityId,\n roomId,\n userId: normalizedSender,\n userName: normalizedSender,\n name: normalizedSender,\n source: \"whatsapp\",\n channelId: params.chatId,\n type: channelType,\n worldId,\n worldName: resolveWhatsAppSystemLocation({\n chatType: isGroup ? \"group\" : \"user\",\n chatId: params.chatId,\n }),\n metadata: {\n accountId,\n chatId: params.chatId,\n isGroup,\n },\n });\n if (typeof this.runtime.ensureRoomExists === \"function\") {\n await this.runtime.ensureRoomExists({\n id: roomId,\n name: resolveWhatsAppSystemLocation({\n chatType: isGroup ? \"group\" : \"user\",\n chatId: params.chatId,\n }),\n agentId: this.runtime.agentId,\n source: \"whatsapp\",\n type: channelType,\n channelId: params.chatId,\n worldId,\n metadata: {\n accountId,\n chatId: params.chatId,\n isGroup,\n },\n } as Room);\n }\n\n this.rememberTarget({\n accountId,\n chatId: params.chatId,\n senderId: normalizedSender,\n label: resolveWhatsAppSystemLocation({\n chatType: isGroup ? \"group\" : \"user\",\n chatId: params.chatId,\n }),\n isGroup,\n lastMessageAt: params.createdAt,\n roomId,\n });\n\n const inboundMemory: Memory = {\n id: inboundMemoryId,\n entityId,\n agentId: this.runtime.agentId,\n roomId,\n content: {\n text: params.text,\n source: \"whatsapp\",\n channelType,\n from: normalizedSender,\n messageId: params.externalMessageId,\n ...(params.replyToExternalMessageId\n ? {\n inReplyTo: toMemoryId(\n this.runtime,\n accountId === DEFAULT_ACCOUNT_ID ? params.chatId : `${accountId}:${params.chatId}`,\n params.replyToExternalMessageId\n ),\n }\n : {}),\n },\n metadata: {\n type: \"message\",\n source: \"whatsapp\",\n provider: \"whatsapp\",\n accountId,\n timestamp: params.createdAt,\n entityName: normalizedSender,\n entityUserName: normalizedSender,\n fromBot: false,\n fromId: normalizedSender,\n sourceId: entityId,\n chatType: channelType,\n messageIdFull: params.externalMessageId,\n sender: {\n id: normalizedSender,\n name: normalizedSender,\n username: normalizedSender,\n },\n whatsapp: {\n contactId: normalizedSender,\n messageId: params.externalMessageId,\n },\n rawChatId: params.chatId,\n rawSenderId: params.senderId,\n } satisfies Memory[\"metadata\"],\n createdAt: params.createdAt,\n };\n\n const callback = async (content: Content): Promise<Memory[]> => {\n const text = typeof content.text === \"string\" ? content.text.trim() : \"\";\n if (!text) {\n return [];\n }\n\n const chunks = chunkWhatsAppText(text);\n const responseMemories: Memory[] = [];\n\n for (const [index, chunk] of chunks.entries()) {\n const response = await this.sendTextMessage(\n params.chatId,\n chunk,\n params.externalMessageId,\n accountId\n );\n const externalResponseId =\n response.messages?.[0]?.id ??\n `${params.externalMessageId}:response:${index}:${Date.now()}`;\n\n responseMemories.push({\n id: toMemoryId(\n this.runtime,\n accountId === DEFAULT_ACCOUNT_ID ? params.chatId : `${accountId}:${params.chatId}`,\n externalResponseId\n ),\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId,\n content: {\n ...content,\n text: chunk,\n source: \"whatsapp\",\n channelType,\n inReplyTo: inboundMemoryId,\n },\n metadata: {\n type: \"message\",\n source: \"whatsapp\",\n provider: \"whatsapp\",\n accountId,\n timestamp: Date.now(),\n fromBot: true,\n fromId: this.runtime.agentId,\n sourceId: this.runtime.agentId,\n chatType: channelType,\n messageIdFull: externalResponseId,\n whatsapp: {\n contactId: params.chatId,\n messageId: externalResponseId,\n },\n rawChatId: params.chatId,\n externalMessageId: externalResponseId,\n } satisfies Memory[\"metadata\"],\n createdAt: Date.now(),\n });\n }\n\n return responseMemories;\n };\n\n // Inbound messages are always ingested into memory. The agent only\n // auto-generates a reply when WHATSAPP_AUTO_REPLY is explicitly enabled —\n // default-off prevents the runtime from speaking on the user's behalf to\n // real WhatsApp contacts.\n const autoReplyRaw = this.runtime.getSetting(\"WHATSAPP_AUTO_REPLY\");\n const autoReply =\n !lifeOpsPassiveConnectorsEnabled(this.runtime) &&\n (autoReplyRaw === true || autoReplyRaw === \"true\");\n\n if (!autoReply) {\n await this.runtime.createMemory(inboundMemory, \"messages\");\n return;\n }\n\n await this.runtime.messageService.handleMessage(this.runtime, inboundMemory, callback);\n }\n\n private async sendTextMessage(\n chatId: string,\n text: string,\n replyToMessageId?: string,\n accountId?: string\n ): Promise<WhatsAppMessageResponse> {\n const normalizedAccountId = this.resolveAccountId(accountId);\n const client = this.getClientForAccount(normalizedAccountId);\n const config = this.getConfigForAccount(normalizedAccountId);\n if (!client || !config) {\n throw new Error(\"WhatsApp client is not initialized\");\n }\n\n const response = await client.sendMessage({\n type: \"text\",\n to:\n config.transport === \"baileys\"\n ? normalizeBaileysSendTarget(chatId)\n : (normalizeWhatsAppTarget(chatId) ?? chatId),\n content: text,\n replyToMessageId,\n });\n\n return \"data\" in response\n ? (response.data as WhatsAppMessageResponse)\n : (response as WhatsAppMessageResponse);\n }\n\n async sendMessage(message: {\n accountId?: string;\n type: \"text\";\n to: string;\n content: string;\n replyToMessageId?: string;\n }): Promise<WhatsAppMessageResponse> {\n return this.sendTextMessage(\n message.to,\n message.content,\n message.replyToMessageId,\n message.accountId\n );\n }\n\n async fetchConnectorMessages(\n context: MessageConnectorQueryContext,\n params: ConnectorFetchMessagesParams\n ): Promise<Memory[]> {\n if (typeof this.runtime.getMemoriesByRoomIds !== \"function\") {\n return [];\n }\n\n const target = params.target ?? (context.target as ConnectorTargetInfo | undefined);\n let accountId = this.resolveAccountId(\n readTargetAccountId(target) ?? readContextAccountId(context)\n );\n let chatId = params.channelId;\n if (!chatId && target) {\n const resolved = await resolveWhatsAppSendTarget(context.runtime, this, target, accountId);\n if (resolved) {\n accountId = resolved.accountId;\n chatId = resolved.chatId;\n }\n }\n if (!chatId && params.roomId) {\n const room = await context.runtime.getRoom(params.roomId);\n chatId = room?.channelId;\n const metadata = room?.metadata as Record<string, unknown> | undefined;\n if (typeof metadata?.accountId === \"string\") {\n accountId = this.resolveAccountId(metadata.accountId);\n }\n }\n\n const knownTargets = chatId\n ? [\n this.getKnownTarget(chatId, accountId) ??\n this.findKnownChatByParticipant(chatId, accountId) ?? {\n accountId,\n chatId,\n senderId: chatId,\n label: chatId,\n isGroup: isWhatsAppGroupJid(chatId),\n lastMessageAt: 0,\n roomId: this.roomIdFor(chatId, accountId),\n },\n ]\n : this.listKnownTargets(accountId);\n\n const roomIds = knownTargets\n .map((known) => known.roomId ?? this.roomIdFor(known.chatId, known.accountId))\n .filter((roomId): roomId is UUID => Boolean(roomId));\n if (roomIds.length === 0) {\n return [];\n }\n\n const limit = Number.isFinite(params.limit)\n ? Math.max(1, Math.min(Number(params.limit), 100))\n : 25;\n const memories = await this.runtime.getMemoriesByRoomIds({\n tableName: \"messages\",\n roomIds,\n limit: limit * Math.max(roomIds.length, 1),\n });\n const chatIds = new Set(\n knownTargets.map((known) => normalizeWhatsAppConnectorTarget(known.chatId))\n );\n const before = params.before ? Number(params.before) : undefined;\n const after = params.after ? Number(params.after) : undefined;\n\n return memories\n .filter((memory) => memory.content?.source === \"whatsapp\")\n .filter((memory) => this.metadataMatchesAccount(memory, accountId))\n .filter((memory) => {\n const metadata = memory.metadata as Record<string, unknown> | undefined;\n const rawChatId =\n typeof metadata?.rawChatId === \"string\"\n ? normalizeWhatsAppConnectorTarget(metadata.rawChatId)\n : undefined;\n if (chatId && rawChatId && !chatIds.has(rawChatId)) {\n return false;\n }\n const createdAt = Number(memory.createdAt ?? 0);\n if (before !== undefined && Number.isFinite(before) && createdAt >= before) {\n return false;\n }\n if (after !== undefined && Number.isFinite(after) && createdAt <= after) {\n return false;\n }\n return true;\n })\n .sort((left, right) => Number(right.createdAt ?? 0) - Number(left.createdAt ?? 0))\n .slice(0, limit);\n }\n\n async searchConnectorMessages(\n context: MessageConnectorQueryContext,\n params: ConnectorSearchMessagesParams\n ): Promise<Memory[]> {\n const query = params.query?.trim().toLowerCase();\n if (!query) {\n return [];\n }\n const memories = await this.fetchConnectorMessages(context, {\n ...params,\n limit: Math.max(params.limit ?? 100, 100),\n });\n return memories\n .filter((memory) => {\n const text = String(memory.content?.text ?? \"\").toLowerCase();\n const from = String(memory.content?.from ?? \"\").toLowerCase();\n return text.includes(query) || from.includes(query);\n })\n .slice(0, params.limit ?? 25);\n }\n\n async reactConnectorMessage(\n runtime: IAgentRuntime,\n params: ConnectorReactionParams\n ): Promise<void> {\n const target = params.target;\n const resolved = target\n ? await resolveWhatsAppSendTarget(runtime, this, target)\n : params.channelId\n ? { accountId: this.defaultAccountId, chatId: params.channelId }\n : null;\n const accountId = this.resolveAccountId(resolved?.accountId ?? readTargetAccountId(target));\n const client = this.getClientForAccount(accountId);\n const config = this.getConfigForAccount(accountId);\n if (!client || !config) {\n throw new Error(\"WhatsApp client is not initialized\");\n }\n const chatId =\n params.channelId ??\n resolved?.chatId ??\n (params.roomId ? (await runtime.getRoom(params.roomId))?.channelId : undefined);\n if (!chatId) {\n throw new Error(\"WhatsApp reaction requires a target chat.\");\n }\n if (!params.messageId) {\n throw new Error(\"WhatsApp reaction requires messageId.\");\n }\n\n await client.sendMessage({\n type: \"reaction\",\n to:\n config.transport === \"baileys\"\n ? normalizeBaileysSendTarget(chatId)\n : (normalizeWhatsAppTarget(chatId) ?? chatId),\n content: {\n messageId: params.messageId,\n emoji: params.remove ? \"\" : params.emoji || \"👍\",\n },\n });\n }\n\n async getConnectorUser(\n _runtime: IAgentRuntime,\n params: ConnectorUserLookupParams\n ): Promise<unknown> {\n const lookup = params.userId ?? params.handle ?? params.username ?? params.query;\n if (!lookup) {\n return null;\n }\n const normalized = normalizeWhatsAppConnectorTarget(lookup);\n const known = this.findKnownChatByParticipant(normalized) ?? this.getKnownTarget(normalized);\n if (!known) {\n return null;\n }\n return {\n id: this.entityIdFor(known.senderId, known.accountId),\n agentId: this.runtime.agentId,\n names: [known.label, known.senderId, known.chatId].filter(\n (value): value is string => typeof value === \"string\" && value.length > 0\n ),\n metadata: {\n accountId: known.accountId,\n source: \"whatsapp\",\n whatsapp: {\n accountId: known.accountId,\n chatId: known.chatId,\n senderId: known.senderId,\n isGroup: known.isGroup,\n },\n },\n };\n }\n\n listKnownTargets(accountId?: string | null): KnownWhatsAppTarget[] {\n const normalizedAccountId = accountId ? this.resolveAccountId(accountId) : null;\n return Array.from(this.knownTargets.values())\n .filter((target) => !normalizedAccountId || target.accountId === normalizedAccountId)\n .sort((left, right) => right.lastMessageAt - left.lastMessageAt);\n }\n\n getKnownTarget(chatId: string, accountId?: string | null): KnownWhatsAppTarget | null {\n const normalized = normalizeWhatsAppConnectorTarget(chatId);\n if (accountId) {\n return this.knownTargets.get(this.targetKey(normalized, accountId)) ?? null;\n }\n return (\n this.knownTargets.get(this.targetKey(normalized, this.defaultAccountId)) ??\n Array.from(this.knownTargets.values()).find(\n (target) => normalizeWhatsAppConnectorTarget(target.chatId) === normalized\n ) ??\n null\n );\n }\n\n findKnownChatByParticipant(\n participant: string,\n accountId?: string | null\n ): KnownWhatsAppTarget | null {\n const normalized = normalizeWhatsAppConnectorTarget(participant);\n const normalizedAccountId = accountId ? this.resolveAccountId(accountId) : null;\n for (const target of this.knownTargets.values()) {\n if (normalizedAccountId && target.accountId !== normalizedAccountId) {\n continue;\n }\n if (\n normalizeWhatsAppConnectorTarget(target.senderId) === normalized ||\n normalizeWhatsAppConnectorTarget(target.chatId) === normalized\n ) {\n return target;\n }\n }\n return null;\n }\n\n private rememberTarget(target: KnownWhatsAppTarget): void {\n this.knownTargets.set(this.targetKey(target.chatId, target.accountId), {\n ...target,\n accountId: this.resolveAccountId(target.accountId),\n });\n }\n}\n",
9
+ "import { EventEmitter } from \"node:events\";\nimport type { IWhatsAppClient } from \"./clients/interface\";\nimport type {\n CloudAPIConfig,\n ConnectionStatus,\n SendReactionParams,\n SendReactionResult,\n WhatsAppInteractiveMessage,\n WhatsAppLocationMessage,\n WhatsAppMediaMessage,\n WhatsAppMessage,\n WhatsAppMessageResponse,\n WhatsAppReactionMessage,\n} from \"./types\";\n\nconst DEFAULT_API_VERSION = \"v24.0\";\n\ninterface WhatsAppApiResponse<T> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n}\n\nexport class WhatsAppClient extends EventEmitter implements IWhatsAppClient {\n private baseUrl: string;\n private headers: HeadersInit;\n private config: CloudAPIConfig;\n private connectionStatus: ConnectionStatus = \"close\";\n\n constructor(config: CloudAPIConfig) {\n super();\n this.config = config;\n const apiVersion = config.apiVersion || DEFAULT_API_VERSION;\n this.baseUrl = `https://graph.facebook.com/${apiVersion}`;\n this.headers = {\n Authorization: `Bearer ${config.accessToken}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async start(): Promise<void> {\n this.connectionStatus = \"open\";\n this.emit(\"connection\", \"open\");\n this.emit(\"ready\");\n }\n\n async stop(): Promise<void> {\n this.connectionStatus = \"close\";\n this.emit(\"connection\", \"close\");\n }\n\n getConnectionStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n /**\n * Get the configured phone number ID.\n */\n getPhoneNumberId(): string {\n return this.config.phoneNumberId;\n }\n\n /**\n * Send a message of any supported type.\n */\n async sendMessage(\n message: WhatsAppMessage\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n const endpoint = `/${this.config.phoneNumberId}/messages`;\n const payload = this.buildMessagePayload(message);\n return this.post<WhatsAppMessageResponse>(endpoint, payload);\n }\n\n /**\n * Send a text message.\n */\n async sendTextMessage(\n to: string,\n text: string,\n _previewUrl = false\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"text\",\n to,\n content: text,\n });\n }\n\n /**\n * Send a reaction to a message.\n */\n async sendReaction(params: SendReactionParams): Promise<SendReactionResult> {\n const endpoint = `/${this.config.phoneNumberId}/messages`;\n\n const payload = {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to: params.to,\n type: \"reaction\",\n reaction: {\n message_id: params.messageId,\n emoji: params.emoji,\n },\n };\n\n try {\n const response = await this.post<WhatsAppMessageResponse>(endpoint, payload);\n return {\n success: true,\n messageId: response.data.messages?.[0]?.id,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Remove a reaction from a message (send empty emoji).\n */\n async removeReaction(to: string, messageId: string): Promise<SendReactionResult> {\n return this.sendReaction({\n to,\n messageId,\n emoji: \"\",\n });\n }\n\n /**\n * Send an image message.\n */\n async sendImage(\n to: string,\n imageUrl: string,\n caption?: string\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"image\",\n to,\n content: {\n link: imageUrl,\n caption,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send a video message.\n */\n async sendVideo(\n to: string,\n videoUrl: string,\n caption?: string\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"video\",\n to,\n content: {\n link: videoUrl,\n caption,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send an audio message.\n */\n async sendAudio(\n to: string,\n audioUrl: string\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"audio\",\n to,\n content: {\n link: audioUrl,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send a document message.\n */\n async sendDocument(\n to: string,\n documentUrl: string,\n filename?: string,\n caption?: string\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"document\",\n to,\n content: {\n link: documentUrl,\n filename,\n caption,\n } as WhatsAppMediaMessage,\n });\n }\n\n /**\n * Send a location message.\n */\n async sendLocation(\n to: string,\n latitude: number,\n longitude: number,\n name?: string,\n address?: string\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n return this.sendMessage({\n type: \"location\",\n to,\n content: {\n latitude,\n longitude,\n name,\n address,\n } as WhatsAppLocationMessage,\n });\n }\n\n /**\n * Send an interactive button message.\n */\n async sendButtonMessage(\n to: string,\n bodyText: string,\n buttons: Array<{ id: string; title: string }>,\n headerText?: string,\n footerText?: string\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n const interactive: WhatsAppInteractiveMessage = {\n type: \"button\",\n body: { text: bodyText },\n action: {\n buttons: buttons.map((btn) => ({\n type: \"reply\" as const,\n reply: { id: btn.id, title: btn.title },\n })),\n },\n };\n\n if (headerText) {\n interactive.header = { type: \"text\", text: headerText };\n }\n if (footerText) {\n interactive.footer = { text: footerText };\n }\n\n return this.sendMessage({\n type: \"interactive\",\n to,\n content: interactive,\n });\n }\n\n /**\n * Send an interactive list message.\n */\n async sendListMessage(\n to: string,\n bodyText: string,\n buttonText: string,\n sections: Array<{\n title?: string;\n rows: Array<{ id: string; title: string; description?: string }>;\n }>,\n headerText?: string,\n footerText?: string\n ): Promise<WhatsAppApiResponse<WhatsAppMessageResponse>> {\n const interactive: WhatsAppInteractiveMessage = {\n type: \"list\",\n body: { text: bodyText },\n action: {\n button: buttonText,\n sections,\n },\n };\n\n if (headerText) {\n interactive.header = { type: \"text\", text: headerText };\n }\n if (footerText) {\n interactive.footer = { text: footerText };\n }\n\n return this.sendMessage({\n type: \"interactive\",\n to,\n content: interactive,\n });\n }\n\n /**\n * Mark a message as read.\n */\n async markMessageAsRead(messageId: string): Promise<boolean> {\n const endpoint = `/${this.config.phoneNumberId}/messages`;\n\n const payload = {\n messaging_product: \"whatsapp\",\n status: \"read\",\n message_id: messageId,\n };\n\n try {\n await this.post<WhatsAppMessageResponse>(endpoint, payload);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Download media by ID.\n */\n async getMediaUrl(mediaId: string): Promise<string | null> {\n try {\n const response = await this.get<{ url?: string }>(`/${mediaId}`);\n return response.data.url || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Verify webhook token.\n */\n async verifyWebhook(token: string): Promise<boolean> {\n return token === this.config.webhookVerifyToken;\n }\n\n private get<T>(endpoint: string): Promise<WhatsAppApiResponse<T>> {\n return this.request<T>(endpoint, { method: \"GET\" });\n }\n\n private post<T>(endpoint: string, payload: unknown): Promise<WhatsAppApiResponse<T>> {\n return this.request<T>(endpoint, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n }\n\n private async request<T>(endpoint: string, init: RequestInit): Promise<WhatsAppApiResponse<T>> {\n const normalizedEndpoint = endpoint.startsWith(\"/\") ? endpoint.slice(1) : endpoint;\n const response = await fetch(`${this.baseUrl}/${normalizedEndpoint}`, {\n ...init,\n headers: {\n ...this.headers,\n ...init.headers,\n },\n });\n\n const text = await response.text();\n const data = text ? this.parseResponseBody(text) : undefined;\n\n if (!response.ok) {\n const detail =\n typeof data === \"string\" ? data : data ? JSON.stringify(data) : response.statusText;\n throw new Error(\n `WhatsApp Cloud API request failed (${response.status} ${response.statusText}): ${detail}`\n );\n }\n\n return {\n data: data as T,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n private parseResponseBody(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n /**\n * Build the message payload based on message type.\n */\n private buildMessagePayload(message: WhatsAppMessage): Record<string, unknown> {\n const basePayload = {\n messaging_product: \"whatsapp\",\n recipient_type: \"individual\",\n to: message.to,\n type: message.type,\n };\n\n // Add context for replies\n const contextPayload = message.replyToMessageId\n ? { context: { message_id: message.replyToMessageId } }\n : {};\n\n switch (message.type) {\n case \"text\":\n return {\n ...basePayload,\n ...contextPayload,\n text: {\n body: message.content as string,\n },\n };\n\n case \"template\":\n return {\n ...basePayload,\n ...contextPayload,\n template: message.content,\n };\n\n case \"image\": {\n const imageContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n image: {\n link: imageContent.link,\n caption: imageContent.caption,\n },\n };\n }\n\n case \"video\": {\n const videoContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n video: {\n link: videoContent.link,\n caption: videoContent.caption,\n },\n };\n }\n\n case \"audio\": {\n const audioContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n audio: {\n link: audioContent.link,\n },\n };\n }\n\n case \"document\": {\n const docContent = message.content as WhatsAppMediaMessage;\n return {\n ...basePayload,\n ...contextPayload,\n document: {\n link: docContent.link,\n filename: docContent.filename,\n caption: docContent.caption,\n },\n };\n }\n\n case \"location\": {\n const locContent = message.content as WhatsAppLocationMessage;\n return {\n ...basePayload,\n ...contextPayload,\n location: {\n latitude: locContent.latitude,\n longitude: locContent.longitude,\n name: locContent.name,\n address: locContent.address,\n },\n };\n }\n\n case \"reaction\": {\n const reactionContent = message.content as WhatsAppReactionMessage;\n return {\n ...basePayload,\n reaction: {\n message_id: reactionContent.messageId,\n emoji: reactionContent.emoji,\n },\n };\n }\n\n case \"interactive\": {\n const interactiveContent = message.content as WhatsAppInteractiveMessage;\n return {\n ...basePayload,\n ...contextPayload,\n interactive: interactiveContent,\n };\n }\n\n default:\n return basePayload;\n }\n }\n}\n",
10
+ "import { EventEmitter } from \"node:events\";\nimport { BaileysAuthManager } from \"../baileys/auth\";\nimport { BaileysConnection } from \"../baileys/connection\";\nimport { MessageAdapter } from \"../baileys/message-adapter\";\nimport { QRCodeGenerator } from \"../baileys/qr-code\";\nimport type {\n BaileysConfig,\n ConnectionStatus,\n WhatsAppMessage,\n WhatsAppMessageResponse,\n} from \"../types\";\nimport type { IWhatsAppClient } from \"./interface\";\n\nexport class BaileysClient extends EventEmitter implements IWhatsAppClient {\n private readonly config: BaileysConfig;\n private readonly authManager: BaileysAuthManager;\n private readonly connection: BaileysConnection;\n private readonly qrGenerator: QRCodeGenerator;\n private readonly adapter: MessageAdapter;\n\n constructor(config: BaileysConfig) {\n super();\n this.config = config;\n this.authManager = new BaileysAuthManager(config.authDir);\n this.connection = new BaileysConnection(this.authManager);\n this.qrGenerator = new QRCodeGenerator();\n this.adapter = new MessageAdapter();\n this.setupEventForwarding();\n }\n\n private setupEventForwarding(): void {\n this.connection.on(\"qr\", async (qr: string) => {\n try {\n const qrData = await this.qrGenerator.generate(qr);\n if (this.config.printQRInTerminal !== false) {\n console.log(\"\\n=== Scan QR Code ===\\n\");\n console.log(qrData.terminal);\n }\n this.emit(\"qr\", qrData);\n } catch (error) {\n this.emit(\"error\", error);\n }\n });\n\n this.connection.on(\"connection\", (status: ConnectionStatus) => {\n this.emit(\"connection\", status);\n if (status === \"open\") {\n this.emit(\"ready\");\n }\n });\n\n this.connection.on(\"messages\", (messages: unknown[]) => {\n for (const message of messages) {\n const maybe = message as {\n key?: { fromMe?: boolean };\n message?: unknown;\n };\n if (!maybe.key?.fromMe && maybe.message) {\n this.emit(\n \"message\",\n this.adapter.toNormalized(message as Parameters<MessageAdapter[\"toNormalized\"]>[0])\n );\n }\n }\n });\n\n this.connection.on(\"error\", (error: unknown) => {\n this.emit(\"error\", error);\n });\n }\n\n async start(): Promise<void> {\n await this.connection.connect();\n }\n\n async stop(): Promise<void> {\n await this.connection.disconnect();\n }\n\n async sendMessage(message: WhatsAppMessage): Promise<WhatsAppMessageResponse> {\n const socket = this.connection.getSocket();\n if (!socket) {\n throw new Error(\"Not connected to WhatsApp via Baileys\");\n }\n\n const payload = this.adapter.toBaileys(message);\n const result = await socket.sendMessage(\n message.to,\n payload as Parameters<typeof socket.sendMessage>[1]\n );\n const id = result?.key?.id ?? \"\";\n\n return {\n messaging_product: \"whatsapp\",\n contacts: [{ input: message.to, wa_id: message.to }],\n messages: [{ id }],\n };\n }\n\n getConnectionStatus(): ConnectionStatus {\n return this.connection.getStatus();\n }\n\n getPhoneNumber(): string | null {\n return this.connection.getSocket()?.user?.id?.split(\":\")[0] ?? null;\n }\n}\n",
11
+ "import type { AuthenticationState } from \"@whiskeysockets/baileys\";\nimport { useMultiFileAuthState } from \"@whiskeysockets/baileys\";\n\nexport class BaileysAuthManager {\n private readonly authDir: string;\n private state?: AuthenticationState;\n private saveCreds?: () => Promise<void>;\n\n constructor(authDir: string) {\n this.authDir = authDir;\n }\n\n async initialize(): Promise<AuthenticationState> {\n const result = await useMultiFileAuthState(this.authDir);\n this.state = result.state;\n this.saveCreds = result.saveCreds;\n return this.state;\n }\n\n async save(): Promise<void> {\n if (this.saveCreds) {\n await this.saveCreds();\n }\n }\n}\n",
12
+ "import { EventEmitter } from \"node:events\";\nimport type { Boom } from \"@hapi/boom\";\nimport makeWASocket, { DisconnectReason, type WASocket } from \"@whiskeysockets/baileys\";\nimport pino from \"pino\";\nimport type { ConnectionStatus } from \"../types\";\nimport type { BaileysAuthManager } from \"./auth\";\n\nexport class BaileysConnection extends EventEmitter {\n private socket?: WASocket;\n private readonly authManager: BaileysAuthManager;\n private connectionStatus: ConnectionStatus = \"close\";\n private reconnecting = false;\n private reconnectAttempts = 0;\n private readonly maxReconnectAttempts = 10;\n\n constructor(authManager: BaileysAuthManager) {\n super();\n this.authManager = authManager;\n }\n\n async connect(): Promise<WASocket> {\n this.connectionStatus = \"connecting\";\n this.emit(\"connection\", \"connecting\");\n\n const state = await this.authManager.initialize();\n this.socket = makeWASocket({\n auth: state,\n printQRInTerminal: false,\n logger: pino({ level: \"silent\" }),\n browser: [\"Chrome (Linux)\", \"\", \"\"],\n });\n\n this.setupEventHandlers();\n return this.socket;\n }\n\n private setupEventHandlers(): void {\n if (!this.socket) {\n return;\n }\n\n this.socket.ev.on(\"connection.update\", async (update) => {\n const { connection, qr, lastDisconnect } = update;\n\n if (qr) {\n this.emit(\"qr\", qr);\n }\n\n if (connection) {\n this.connectionStatus = connection;\n this.emit(\"connection\", connection);\n }\n\n if (connection === \"open\") {\n this.reconnectAttempts = 0;\n return;\n }\n\n if (connection !== \"close\") {\n return;\n }\n\n const statusCode = (lastDisconnect?.error as Boom | undefined)?.output?.statusCode;\n const isQRTimeout = statusCode === 515;\n const shouldReconnect = statusCode !== DisconnectReason.loggedOut && statusCode !== 405;\n\n if (lastDisconnect?.error && !isQRTimeout) {\n this.emit(\"error\", lastDisconnect.error);\n }\n\n if (!shouldReconnect) {\n return;\n }\n\n if (this.reconnecting) {\n return;\n }\n\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n this.emit(\"error\", new Error(\"Max reconnection attempts reached\"));\n return;\n }\n\n this.reconnecting = true;\n try {\n this.reconnectAttempts += 1;\n const baseDelayMs = isQRTimeout ? 1000 : 3000;\n const backoffMs = Math.min(baseDelayMs * 2 ** (this.reconnectAttempts - 1), 30000);\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n await this.connect();\n } catch (error) {\n this.emit(\"error\", error);\n } finally {\n this.reconnecting = false;\n }\n });\n\n this.socket.ev.on(\"creds.update\", async () => {\n await this.authManager.save();\n });\n\n this.socket.ev.on(\"messages.upsert\", ({ messages }) => {\n this.emit(\"messages\", messages);\n });\n }\n\n getSocket(): WASocket | undefined {\n return this.socket;\n }\n\n getStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n const socket = this.socket as typeof this.socket & {\n ev: { removeAllListeners: (...args: unknown[]) => void };\n ws?: { close?: () => void };\n };\n socket.ev.removeAllListeners();\n socket.ws?.close?.();\n this.socket = undefined;\n this.connectionStatus = \"close\";\n this.emit(\"connection\", \"close\");\n }\n}\n",
13
+ "import type { proto } from \"@whiskeysockets/baileys\";\nimport type {\n NormalizedMessage,\n WhatsAppMediaMessage,\n WhatsAppMessage,\n WhatsAppTemplate,\n} from \"../types\";\n\nexport class MessageAdapter {\n toNormalized(msg: proto.IWebMessageInfo): NormalizedMessage {\n const chatId = msg.key?.remoteJid ?? \"\";\n const senderId = msg.key?.participant ?? chatId;\n\n return {\n id: msg.key?.id ?? \"\",\n from: chatId,\n timestamp: Number(msg.messageTimestamp ?? 0),\n type: this.detectType(msg),\n content: this.extractContent(msg),\n chatId,\n senderId,\n replyToId: this.extractReplyToId(msg),\n };\n }\n\n toBaileys(msg: WhatsAppMessage): Record<string, unknown> {\n switch (msg.type) {\n case \"text\":\n return { text: msg.content as string };\n case \"image\":\n return this.mediaWithCaption(\"image\", msg.content as WhatsAppMediaMessage);\n case \"video\":\n return this.mediaWithCaption(\"video\", msg.content as WhatsAppMediaMessage);\n case \"audio\":\n return this.mediaNoCaption(\"audio\", msg.content as WhatsAppMediaMessage);\n case \"document\":\n return this.mediaWithFilename(msg.content as WhatsAppMediaMessage);\n case \"template\":\n return { text: this.renderTemplate(msg.content as WhatsAppTemplate) };\n default:\n throw new Error(`Message type ${msg.type} is not yet supported for Baileys`);\n }\n }\n\n private mediaWithCaption(\n key: \"image\" | \"video\",\n media: WhatsAppMediaMessage\n ): Record<string, unknown> {\n if (!media?.link) {\n throw new Error(`${key} message requires a media link`);\n }\n return {\n [key]: { url: media.link },\n ...(media.caption ? { caption: media.caption } : {}),\n };\n }\n\n private mediaNoCaption(key: \"audio\", media: WhatsAppMediaMessage): Record<string, unknown> {\n if (!media?.link) {\n throw new Error(`${key} message requires a media link`);\n }\n return { [key]: { url: media.link } };\n }\n\n private mediaWithFilename(media: WhatsAppMediaMessage): Record<string, unknown> {\n if (!media?.link) {\n throw new Error(\"document message requires a media link\");\n }\n return {\n document: { url: media.link },\n ...(media.filename ? { fileName: media.filename } : {}),\n ...(media.caption ? { caption: media.caption } : {}),\n };\n }\n\n private detectType(\n msg: proto.IWebMessageInfo\n ): \"text\" | \"image\" | \"audio\" | \"video\" | \"document\" {\n if (msg.message?.conversation || msg.message?.extendedTextMessage) {\n return \"text\";\n }\n if (msg.message?.imageMessage) {\n return \"image\";\n }\n if (msg.message?.audioMessage) {\n return \"audio\";\n }\n if (msg.message?.videoMessage) {\n return \"video\";\n }\n if (msg.message?.documentMessage) {\n return \"document\";\n }\n return \"text\";\n }\n\n private extractContent(msg: proto.IWebMessageInfo): string {\n return (\n msg.message?.conversation ??\n msg.message?.extendedTextMessage?.text ??\n msg.message?.imageMessage?.caption ??\n msg.message?.videoMessage?.caption ??\n msg.message?.documentMessage?.caption ??\n \"\"\n );\n }\n\n private extractReplyToId(msg: proto.IWebMessageInfo): string | undefined {\n const contextInfo =\n msg.message?.extendedTextMessage?.contextInfo ??\n msg.message?.imageMessage?.contextInfo ??\n msg.message?.videoMessage?.contextInfo ??\n msg.message?.documentMessage?.contextInfo;\n\n return typeof contextInfo?.stanzaId === \"string\" ? contextInfo.stanzaId : undefined;\n }\n\n private renderTemplate(template: WhatsAppTemplate): string {\n const params = template.components?.flatMap((component) =>\n component.parameters.map((parameter) => parameter.text).filter(Boolean)\n );\n return params && params.length > 0 ? `${template.name}: ${params.join(\", \")}` : template.name;\n }\n}\n",
14
+ "/// <reference path=\"../types/qrcode-terminal.d.ts\" />\nimport QRCode from \"qrcode\";\nimport * as QRCodeTerminal from \"qrcode-terminal\";\nimport type { QRCodeData } from \"../types\";\n\nexport class QRCodeGenerator {\n async generate(qrString: string): Promise<QRCodeData> {\n return {\n terminal: await this.generateTerminal(qrString),\n dataURL: await QRCode.toDataURL(qrString),\n raw: qrString,\n };\n }\n\n private async generateTerminal(qr: string): Promise<string> {\n return new Promise((resolve) => {\n QRCodeTerminal.generate(qr, { small: true }, (output: string) => {\n resolve(output);\n });\n });\n }\n}\n",
19
15
  "/**\n * WhatsApp text chunk limit\n */\nexport const WHATSAPP_TEXT_CHUNK_LIMIT = 4096;\n\n/**\n * Regex for WhatsApp user JID (e.g., \"41796666864:0@s.whatsapp.net\")\n */\nconst WHATSAPP_USER_JID_RE = /^(\\d+)(?::\\d+)?@s\\.whatsapp\\.net$/i;\n\n/**\n * Regex for WhatsApp LID (e.g., \"123@lid\")\n */\nconst WHATSAPP_LID_RE = /^(\\d+)@lid$/i;\n\n/**\n * Strips WhatsApp target prefixes from a value\n */\nfunction stripWhatsAppTargetPrefixes(value: string): string {\n let candidate = value.trim();\n for (;;) {\n const before = candidate;\n candidate = candidate.replace(/^whatsapp:/i, \"\").trim();\n if (candidate === before) {\n return candidate;\n }\n }\n}\n\n/**\n * Normalizes a phone number to E.164 format\n */\nexport function normalizeE164(input: string): string {\n const stripped = input.replace(/[\\s\\-().]+/g, \"\");\n const digitsOnly = stripped.replace(/[^\\d+]/g, \"\");\n\n if (!digitsOnly) {\n return \"\";\n }\n\n // If it starts with +, keep as-is (already E.164)\n if (digitsOnly.startsWith(\"+\")) {\n return digitsOnly;\n }\n\n // If it starts with 00, replace with +\n if (digitsOnly.startsWith(\"00\")) {\n return `+${digitsOnly.slice(2)}`;\n }\n\n // Assume it's a full number without the +\n if (digitsOnly.length >= 10) {\n return `+${digitsOnly}`;\n }\n\n // Return as-is if too short\n return digitsOnly;\n}\n\n/**\n * Checks if a value is a WhatsApp group JID (e.g., \"123456789-987654321@g.us\")\n */\nexport function isWhatsAppGroupJid(value: string): boolean {\n const candidate = stripWhatsAppTargetPrefixes(value);\n const lower = candidate.toLowerCase();\n if (!lower.endsWith(\"@g.us\")) {\n return false;\n }\n const localPart = candidate.slice(0, candidate.length - \"@g.us\".length);\n if (!localPart || localPart.includes(\"@\")) {\n return false;\n }\n return /^[0-9]+(-[0-9]+)*$/.test(localPart);\n}\n\n/**\n * Checks if a value looks like a WhatsApp user target\n * (e.g., \"41796666864:0@s.whatsapp.net\" or \"123@lid\")\n */\nexport function isWhatsAppUserTarget(value: string): boolean {\n const candidate = stripWhatsAppTargetPrefixes(value);\n return WHATSAPP_USER_JID_RE.test(candidate) || WHATSAPP_LID_RE.test(candidate);\n}\n\n/**\n * Extracts the phone number from a WhatsApp user JID\n * \"41796666864:0@s.whatsapp.net\" -> \"41796666864\"\n * \"123456@lid\" -> \"123456\"\n */\nfunction extractUserJidPhone(jid: string): string | null {\n const userMatch = jid.match(WHATSAPP_USER_JID_RE);\n if (userMatch) {\n return userMatch[1];\n }\n const lidMatch = jid.match(WHATSAPP_LID_RE);\n if (lidMatch) {\n return lidMatch[1];\n }\n return null;\n}\n\n/**\n * Normalizes a WhatsApp target (phone number, user JID, or group JID)\n * Returns null if the target is invalid\n */\nexport function normalizeWhatsAppTarget(value: string): string | null {\n const candidate = stripWhatsAppTargetPrefixes(value);\n if (!candidate) {\n return null;\n }\n\n // Handle group JIDs\n if (isWhatsAppGroupJid(candidate)) {\n const localPart = candidate.slice(0, candidate.length - \"@g.us\".length);\n return `${localPart}@g.us`;\n }\n\n // Handle user JIDs (e.g., \"41796666864:0@s.whatsapp.net\")\n if (isWhatsAppUserTarget(candidate)) {\n const phone = extractUserJidPhone(candidate);\n if (!phone) {\n return null;\n }\n const normalized = normalizeE164(phone);\n return normalized.length > 1 ? normalized : null;\n }\n\n // If the caller passed a JID-ish string that we don't understand, fail fast.\n // Otherwise normalizeE164 would happily treat \"group:120@g.us\" as a phone number.\n if (candidate.includes(\"@\")) {\n return null;\n }\n\n // Treat as a phone number\n const normalized = normalizeE164(candidate);\n return normalized.length > 1 ? normalized : null;\n}\n\n/**\n * Formats a WhatsApp ID for display\n */\nexport function formatWhatsAppId(id: string): string {\n if (isWhatsAppGroupJid(id)) {\n return `group:${id}`;\n }\n const normalized = normalizeWhatsAppTarget(id);\n return normalized || id;\n}\n\n/**\n * Checks if a WhatsApp ID is a group\n */\nexport function isWhatsAppGroup(id: string): boolean {\n return isWhatsAppGroupJid(id);\n}\n\n/**\n * Gets the chat type from a WhatsApp ID\n */\nexport function getWhatsAppChatType(id: string): \"group\" | \"user\" {\n return isWhatsAppGroupJid(id) ? \"group\" : \"user\";\n}\n\n/**\n * Builds a WhatsApp JID from a phone number\n */\nexport function buildWhatsAppUserJid(phoneNumber: string): string {\n const normalized = normalizeE164(phoneNumber);\n const digits = normalized.replace(/^\\+/, \"\");\n return `${digits}@s.whatsapp.net`;\n}\n\n/**\n * Options for text chunking\n */\nexport interface ChunkWhatsAppTextOpts {\n limit?: number;\n}\n\n/**\n * Splits text at the last safe break point within the limit\n */\nfunction splitAtBreakPoint(text: string, limit: number): { chunk: string; remainder: string } {\n if (text.length <= limit) {\n return { chunk: text, remainder: \"\" };\n }\n\n const searchArea = text.slice(0, limit);\n\n // Prefer double newlines (paragraph breaks)\n const doubleNewline = searchArea.lastIndexOf(\"\\n\\n\");\n if (doubleNewline > limit * 0.5) {\n return {\n chunk: text.slice(0, doubleNewline).trimEnd(),\n remainder: text.slice(doubleNewline + 2).trimStart(),\n };\n }\n\n // Try single newlines\n const singleNewline = searchArea.lastIndexOf(\"\\n\");\n if (singleNewline > limit * 0.5) {\n return {\n chunk: text.slice(0, singleNewline).trimEnd(),\n remainder: text.slice(singleNewline + 1).trimStart(),\n };\n }\n\n // Try sentence boundaries\n const sentenceEnd = Math.max(\n searchArea.lastIndexOf(\". \"),\n searchArea.lastIndexOf(\"! \"),\n searchArea.lastIndexOf(\"? \")\n );\n if (sentenceEnd > limit * 0.5) {\n return {\n chunk: text.slice(0, sentenceEnd + 1).trimEnd(),\n remainder: text.slice(sentenceEnd + 2).trimStart(),\n };\n }\n\n // Try word boundaries\n const space = searchArea.lastIndexOf(\" \");\n if (space > limit * 0.5) {\n return {\n chunk: text.slice(0, space).trimEnd(),\n remainder: text.slice(space + 1).trimStart(),\n };\n }\n\n // Hard break at limit\n return {\n chunk: text.slice(0, limit),\n remainder: text.slice(limit),\n };\n}\n\n/**\n * Chunks text for WhatsApp messages\n */\nexport function chunkWhatsAppText(text: string, opts: ChunkWhatsAppTextOpts = {}): string[] {\n const limit = opts.limit ?? WHATSAPP_TEXT_CHUNK_LIMIT;\n\n if (!text?.trim()) {\n return [];\n }\n\n const normalizedText = text.trim();\n if (normalizedText.length <= limit) {\n return [normalizedText];\n }\n\n const chunks: string[] = [];\n let remaining = normalizedText;\n\n while (remaining.length > 0) {\n const { chunk, remainder } = splitAtBreakPoint(remaining, limit);\n if (chunk) {\n chunks.push(chunk);\n }\n remaining = remainder;\n }\n\n return chunks.filter((c) => c.length > 0);\n}\n\n/**\n * Truncates text to a maximum length with ellipsis\n */\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) {\n return text;\n }\n if (maxLength <= 3) {\n return \"...\".slice(0, maxLength);\n }\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\n/**\n * Resolves the system location string for logging\n */\nexport function resolveWhatsAppSystemLocation(params: {\n chatType: \"group\" | \"user\";\n chatId: string;\n chatName?: string;\n}): string {\n const { chatType, chatId, chatName } = params;\n const name = chatName || chatId.slice(0, 8);\n return `WhatsApp ${chatType}:${name}`;\n}\n\n/**\n * Validates a WhatsApp phone number\n */\nexport function isValidWhatsAppNumber(value: string): boolean {\n const normalized = normalizeWhatsAppTarget(value);\n if (!normalized) {\n return false;\n }\n // Must be E.164 format with at least 10 digits\n if (!normalized.startsWith(\"+\")) {\n return false;\n }\n const digits = normalized.replace(/^\\+/, \"\");\n return /^\\d{10,15}$/.test(digits);\n}\n\n/**\n * Formats a phone number for WhatsApp display\n */\nexport function formatWhatsAppPhoneNumber(phoneNumber: string): string {\n const normalized = normalizeE164(phoneNumber);\n if (!normalized) {\n return phoneNumber;\n }\n // Format as +XX XXX XXX XXXX for display\n const digits = normalized.replace(/^\\+/, \"\");\n if (digits.length <= 10) {\n return normalized;\n }\n // Simple formatting: country code + rest\n const countryCode = digits.slice(0, digits.length - 10);\n const rest = digits.slice(-10);\n return `+${countryCode} ${rest.slice(0, 3)} ${rest.slice(3, 6)} ${rest.slice(6)}`;\n}\n",
20
- "export type WhatsAppConfig = CloudAPIConfig | BaileysConfig;\n\nexport interface CloudAPIConfig {\n authMethod?: \"cloudapi\";\n accessToken: string;\n phoneNumberId: string;\n webhookVerifyToken?: string;\n businessAccountId?: string;\n apiVersion?: string;\n}\n\nexport interface BaileysConfig {\n authMethod?: \"baileys\";\n authDir: string;\n printQRInTerminal?: boolean;\n sessionPath?: string;\n}\n\n/**\n * Message types supported by WhatsApp Cloud API.\n */\nexport type WhatsAppMessageType =\n | \"text\"\n | \"template\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"document\"\n | \"sticker\"\n | \"location\"\n | \"contacts\"\n | \"interactive\"\n | \"reaction\";\n\nexport interface WhatsAppMessage {\n type: WhatsAppMessageType;\n to: string;\n content:\n | string\n | WhatsAppTemplate\n | WhatsAppMediaMessage\n | WhatsAppInteractiveMessage\n | WhatsAppReactionMessage\n | WhatsAppLocationMessage;\n replyToMessageId?: string;\n}\n\nexport interface WhatsAppTemplate {\n name: string;\n language: {\n code: string;\n };\n components?: Array<{\n type: string;\n parameters: Array<{\n type: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename?: string };\n video?: { link: string };\n }>;\n }>;\n}\n\n/**\n * Media message content.\n */\nexport interface WhatsAppMediaMessage {\n link?: string;\n id?: string;\n caption?: string;\n filename?: string;\n mimeType?: string;\n}\n\n/**\n * Reaction message content.\n */\nexport interface WhatsAppReactionMessage {\n messageId: string;\n emoji: string;\n}\n\n/**\n * Location message content.\n */\nexport interface WhatsAppLocationMessage {\n latitude: number;\n longitude: number;\n name?: string;\n address?: string;\n}\n\n/**\n * Interactive message types.\n */\nexport type InteractiveMessageType = \"button\" | \"list\" | \"product\" | \"product_list\" | \"flow\";\n\n/**\n * Interactive message content.\n */\nexport interface WhatsAppInteractiveMessage {\n type: InteractiveMessageType;\n header?: {\n type: \"text\" | \"image\" | \"video\" | \"document\";\n text?: string;\n image?: { link: string };\n video?: { link: string };\n document?: { link: string; filename?: string };\n };\n body: {\n text: string;\n };\n footer?: {\n text: string;\n };\n action: WhatsAppInteractiveAction;\n}\n\n/**\n * Interactive action based on message type.\n */\nexport type WhatsAppInteractiveAction =\n | WhatsAppButtonAction\n | WhatsAppListAction\n | WhatsAppFlowAction;\n\n/**\n * Button action for interactive messages.\n */\nexport interface WhatsAppButtonAction {\n buttons: Array<{\n type: \"reply\";\n reply: {\n id: string;\n title: string;\n };\n }>;\n}\n\n/**\n * List action for interactive messages.\n */\nexport interface WhatsAppListAction {\n button: string;\n sections: Array<{\n title?: string;\n rows: Array<{\n id: string;\n title: string;\n description?: string;\n }>;\n }>;\n}\n\n/**\n * Flow action for interactive messages.\n */\nexport interface WhatsAppFlowAction {\n name: \"flow\";\n parameters: {\n flow_message_version: string;\n flow_token: string;\n flow_id: string;\n flow_cta: string;\n flow_action: \"navigate\" | \"data_exchange\";\n flow_action_payload?: {\n screen: string;\n data?: Record<string, unknown>;\n };\n };\n}\n\nexport interface WhatsAppIncomingMessage {\n from: string;\n id: string;\n timestamp: string;\n text?: {\n body: string;\n };\n image?: {\n caption?: string;\n mime_type: string;\n sha256: string;\n id: string;\n };\n video?: {\n caption?: string;\n mime_type: string;\n sha256: string;\n id: string;\n };\n audio?: {\n mime_type: string;\n sha256: string;\n id: string;\n voice?: boolean;\n };\n document?: {\n caption?: string;\n filename: string;\n mime_type: string;\n sha256: string;\n id: string;\n };\n sticker?: {\n mime_type: string;\n sha256: string;\n id: string;\n animated?: boolean;\n };\n location?: {\n latitude: number;\n longitude: number;\n name?: string;\n address?: string;\n };\n contacts?: Array<{\n name: {\n formatted_name: string;\n first_name?: string;\n last_name?: string;\n };\n phones?: Array<{\n phone: string;\n type: string;\n }>;\n }>;\n interactive?: {\n type: \"button_reply\" | \"list_reply\" | \"nfm_reply\";\n button_reply?: {\n id: string;\n title: string;\n };\n list_reply?: {\n id: string;\n title: string;\n description?: string;\n };\n nfm_reply?: {\n response_json: string;\n body: string;\n name: string;\n };\n };\n reaction?: {\n message_id: string;\n emoji: string;\n };\n context?: {\n from: string;\n id: string;\n referred_product?: {\n catalog_id: string;\n product_retailer_id: string;\n };\n };\n type: string;\n}\n\nexport interface WhatsAppStatusUpdate {\n id: string;\n status: \"sent\" | \"delivered\" | \"read\" | \"failed\";\n timestamp: string;\n recipient_id: string;\n conversation?: {\n id: string;\n origin?: {\n type: string;\n };\n expiration_timestamp?: string;\n };\n pricing?: {\n billable: boolean;\n pricing_model: string;\n category: string;\n };\n errors?: Array<{\n code: number;\n title: string;\n message?: string;\n error_data?: {\n details: string;\n };\n }>;\n}\n\nexport interface WhatsAppWebhookEvent {\n object: string;\n entry: Array<{\n id: string;\n changes: Array<{\n value: {\n messaging_product: string;\n metadata: {\n display_phone_number: string;\n phone_number_id: string;\n };\n statuses?: WhatsAppStatusUpdate[];\n messages?: WhatsAppIncomingMessage[];\n contacts?: Array<{\n profile: {\n name: string;\n };\n wa_id: string;\n }>;\n errors?: Array<{\n code: number;\n title: string;\n message?: string;\n error_data?: {\n details: string;\n };\n }>;\n };\n field: string;\n }>;\n }>;\n}\n\nexport interface WhatsAppMessageResponse {\n messaging_product: string;\n contacts: Array<{\n input: string;\n wa_id: string;\n }>;\n messages: Array<{\n id: string;\n message_status?: string;\n }>;\n}\n\nexport interface QRCodeData {\n terminal: string;\n dataURL: string;\n raw: string;\n}\n\nexport type ConnectionStatus = \"connecting\" | \"open\" | \"close\";\n\nexport interface UnifiedMessage {\n id: string;\n from: string;\n timestamp: number;\n type: \"text\" | \"image\" | \"audio\" | \"video\" | \"document\";\n content: string;\n}\n\n/**\n * Send reaction parameters.\n */\nexport interface SendReactionParams {\n to: string;\n messageId: string;\n emoji: string;\n}\n\n/**\n * Send reaction result.\n */\nexport interface SendReactionResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n\n/**\n * WhatsApp event types.\n */\nexport enum WhatsAppEventType {\n MESSAGE_RECEIVED = \"WHATSAPP_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"WHATSAPP_MESSAGE_SENT\",\n MESSAGE_DELIVERED = \"WHATSAPP_MESSAGE_DELIVERED\",\n MESSAGE_READ = \"WHATSAPP_MESSAGE_READ\",\n MESSAGE_FAILED = \"WHATSAPP_MESSAGE_FAILED\",\n REACTION_RECEIVED = \"WHATSAPP_REACTION_RECEIVED\",\n REACTION_SENT = \"WHATSAPP_REACTION_SENT\",\n INTERACTIVE_REPLY = \"WHATSAPP_INTERACTIVE_REPLY\",\n WEBHOOK_VERIFIED = \"WHATSAPP_WEBHOOK_VERIFIED\",\n}\n\n/**\n * Common WhatsApp reaction emojis.\n */\nexport const WHATSAPP_REACTIONS = {\n THUMBS_UP: \"👍\",\n THUMBS_DOWN: \"👎\",\n HEART: \"❤️\",\n LAUGHING: \"😂\",\n SURPRISED: \"😮\",\n SAD: \"😢\",\n PRAYING: \"🙏\",\n CLAPPING: \"👏\",\n FIRE: \"🔥\",\n CELEBRATION: \"🎉\",\n} as const;\n\nexport type WhatsAppReactionEmoji = (typeof WHATSAPP_REACTIONS)[keyof typeof WHATSAPP_REACTIONS];\n"
16
+ "/**\n * WhatsApp setup HTTP routes.\n *\n * Provides QR-code pairing, status, disconnect, and webhook endpoints:\n *\n * GET /api/whatsapp/webhook Meta webhook verification\n * POST /api/whatsapp/webhook Meta webhook event delivery\n * POST /api/whatsapp/pair Start QR pairing session\n * GET /api/whatsapp/status Check connection / pairing status\n * POST /api/whatsapp/pair/stop Stop active pairing session\n * POST /api/whatsapp/disconnect Logout + remove auth state\n *\n * These routes are registered with `rawPath: true` so they mount at their\n * legacy paths without the plugin-name prefix.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { IAgentRuntime, Route, RouteRequest, RouteResponse } from \"@elizaos/core\";\nimport type { WhatsAppPairingEvent } from \"./pairing-service.js\";\nimport {\n sanitizeAccountId,\n WhatsAppPairingSession,\n whatsappAuthExists,\n whatsappLogout,\n} from \"./pairing-service.js\";\n\n// ── Module-level state ─────────────────────────────────────────────────\n// Replaces WhatsAppRouteState.whatsappPairingSessions — shared across\n// all route handler invocations within this plugin.\n\ninterface PairingSessionLike {\n start(): Promise<void>;\n stop(): void;\n getStatus(): string;\n}\n\nconst whatsappPairingSessions: Map<string, PairingSessionLike> = new Map();\n\nconst MAX_PAIRING_SESSIONS = 10;\n\nfunction routeHost(req: RouteRequest): string {\n const host = req.headers?.host;\n return (Array.isArray(host) ? host[0] : host) ?? \"localhost\";\n}\n\n/**\n * Minimal interface for the connector-setup service exposed by the agent.\n * Plugins access it via `runtime.getService(\"connector-setup\")`.\n */\ninterface ConnectorSetupService {\n getConfig(): Record<string, unknown>;\n persistConfig(config: Record<string, unknown>): void;\n updateConfig(updater: (config: Record<string, unknown>) => void): void;\n registerEscalationChannel(channelName: string): boolean;\n setOwnerContact(update: {\n source: string;\n channelId?: string;\n entityId?: string;\n roomId?: string;\n }): boolean;\n getWorkspaceDir(): string;\n broadcastWs(data: object): void;\n}\n\nfunction isConnectorSetupService(service: unknown): service is ConnectorSetupService {\n return (\n typeof service === \"object\" &&\n service !== null &&\n typeof (service as ConnectorSetupService).getConfig === \"function\" &&\n typeof (service as ConnectorSetupService).persistConfig === \"function\" &&\n typeof (service as ConnectorSetupService).updateConfig === \"function\" &&\n typeof (service as ConnectorSetupService).registerEscalationChannel === \"function\" &&\n typeof (service as ConnectorSetupService).setOwnerContact === \"function\" &&\n typeof (service as ConnectorSetupService).getWorkspaceDir === \"function\" &&\n typeof (service as ConnectorSetupService).broadcastWs === \"function\"\n );\n}\n\nfunction getSetupService(runtime: IAgentRuntime): ConnectorSetupService | null {\n const service = runtime.getService(\"connector-setup\");\n return isConnectorSetupService(service) ? service : null;\n}\n\n/** Clean up disconnected / timed-out / errored sessions. */\nfunction cleanupStaleSessions(): void {\n for (const [id, session] of whatsappPairingSessions) {\n const status = session.getStatus();\n if (status === \"disconnected\" || status === \"timeout\" || status === \"error\") {\n session.stop();\n whatsappPairingSessions.delete(id);\n }\n }\n}\n\n// ── GET /api/whatsapp/webhook ──────────────────────────────────────────\nasync function handleWebhookVerify(\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime\n): Promise<void> {\n const url = new URL(req.url ?? \"/\", `http://${routeHost(req)}`);\n const mode = url.searchParams.get(\"hub.mode\") ?? \"\";\n const token = url.searchParams.get(\"hub.verify_token\") ?? \"\";\n const challenge = url.searchParams.get(\"hub.challenge\") ?? \"\";\n const accountId = url.searchParams.get(\"accountId\") ?? undefined;\n\n const service = runtime.getService(\"whatsapp\") as\n | {\n verifyWebhook?: (\n mode: string,\n token: string,\n challenge: string,\n accountId?: string\n ) => string | null;\n }\n | null\n | undefined;\n\n if (!service || typeof service.verifyWebhook !== \"function\") {\n res.status(503).json({ error: \"WhatsApp service unavailable\" });\n return;\n }\n\n const verifiedChallenge = service.verifyWebhook(mode, token, challenge, accountId);\n if (!verifiedChallenge) {\n res.status(403).json({ error: \"Webhook verification failed\" });\n return;\n }\n\n // Webhook verification must return the challenge as plain text\n res.status(200).json(verifiedChallenge);\n}\n\n// ── POST /api/whatsapp/webhook ─────────────────────────────────────────\nasync function handleWebhookEvent(\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime\n): Promise<void> {\n const service = runtime.getService(\"whatsapp\") as\n | {\n handleWebhook?: (event: Record<string, unknown>) => Promise<void>;\n }\n | null\n | undefined;\n\n if (!service || typeof service.handleWebhook !== \"function\") {\n res.status(503).json({ error: \"WhatsApp service unavailable\" });\n return;\n }\n\n const body = req.body as Record<string, unknown> | null;\n if (!body) {\n res.status(400).json({ error: \"Missing request body\" });\n return;\n }\n\n await service.handleWebhook(body);\n\n // Meta expects a 200 with \"EVENT_RECEIVED\" text\n res.status(200).json(\"EVENT_RECEIVED\");\n}\n\n// ── POST /api/whatsapp/pair ────────────────────────────────────────────\nasync function handlePair(\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime\n): Promise<void> {\n cleanupStaleSessions();\n\n const setupService = getSetupService(runtime);\n const body = req.body as { accountId?: string } | null;\n\n let accountId: string;\n try {\n accountId = sanitizeAccountId(\n body && typeof body.accountId === \"string\" && body.accountId.trim()\n ? body.accountId.trim()\n : \"default\"\n );\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n return;\n }\n\n const isReplacing = whatsappPairingSessions.has(accountId);\n if (!isReplacing && whatsappPairingSessions.size >= MAX_PAIRING_SESSIONS) {\n res.status(429).json({\n error: `Too many concurrent pairing sessions (max ${MAX_PAIRING_SESSIONS})`,\n });\n return;\n }\n\n const workspaceDir = setupService?.getWorkspaceDir() ?? \".\";\n const authDir = path.join(workspaceDir, \"whatsapp-auth\", accountId);\n whatsappPairingSessions.get(accountId)?.stop();\n\n const session = new WhatsAppPairingSession({\n authDir,\n accountId,\n onEvent: (event: WhatsAppPairingEvent) => {\n setupService?.broadcastWs(event);\n\n if (event.status === \"connected\") {\n if (setupService) {\n setupService.updateConfig((config) => {\n if (!config.connectors) config.connectors = {};\n const connectors = config.connectors as Record<string, Record<string, unknown>>;\n const previousConfig = connectors.whatsapp ?? {};\n if (accountId === \"default\") {\n connectors.whatsapp = {\n ...previousConfig,\n authDir,\n transport: \"baileys\",\n enabled: true,\n };\n return;\n }\n const accounts =\n typeof previousConfig.accounts === \"object\" && previousConfig.accounts !== null\n ? { ...(previousConfig.accounts as Record<string, Record<string, unknown>>) }\n : {};\n accounts[accountId] = {\n ...(accounts[accountId] ?? {}),\n authDir,\n transport: \"baileys\",\n enabled: true,\n };\n connectors.whatsapp = {\n ...previousConfig,\n accounts,\n enabled: true,\n };\n });\n\n // Auto-populate owner contact so LifeOps can deliver reminders\n const phoneNumber = event.phoneNumber;\n setupService.setOwnerContact({\n source: \"whatsapp\",\n channelId: phoneNumber ?? undefined,\n });\n }\n }\n },\n });\n\n whatsappPairingSessions.set(accountId, session);\n\n try {\n await session.start();\n res.status(200).json({ ok: true, accountId, status: session.getStatus() });\n } catch (err) {\n res.status(500).json({ ok: false, error: String(err) });\n }\n}\n\n// ── GET /api/whatsapp/status ───────────────────────────────────────────\nasync function handleStatus(\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime\n): Promise<void> {\n cleanupStaleSessions();\n\n const setupService = getSetupService(runtime);\n const url = new URL(req.url ?? \"/\", `http://${routeHost(req)}`);\n\n let accountId: string;\n try {\n accountId = sanitizeAccountId(url.searchParams.get(\"accountId\") || \"default\");\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n return;\n }\n\n const session = whatsappPairingSessions.get(accountId);\n const workspaceDir = setupService?.getWorkspaceDir() ?? \".\";\n\n let serviceConnected = false;\n let servicePhone: string | null = null;\n try {\n const waService = runtime.getService(\"whatsapp\");\n if (waService && typeof waService === \"object\") {\n const waState = waService as { connected?: unknown; phoneNumber?: unknown };\n serviceConnected = Boolean(waState.connected);\n servicePhone = typeof waState.phoneNumber === \"string\" ? waState.phoneNumber : null;\n }\n } catch {\n /* service not yet registered */\n }\n\n res.status(200).json({\n accountId,\n status: session?.getStatus() ?? \"idle\",\n authExists: whatsappAuthExists(workspaceDir, accountId),\n serviceConnected,\n servicePhone,\n });\n}\n\n// ── POST /api/whatsapp/pair/stop ───────────────────────────────────────\nasync function handlePairStop(\n req: RouteRequest,\n res: RouteResponse,\n _runtime: IAgentRuntime\n): Promise<void> {\n const body = req.body as { accountId?: string } | null;\n\n let accountId: string;\n try {\n accountId = sanitizeAccountId(\n body && typeof body.accountId === \"string\" && body.accountId.trim()\n ? body.accountId.trim()\n : \"default\"\n );\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n return;\n }\n\n const session = whatsappPairingSessions.get(accountId);\n if (session) {\n session.stop();\n whatsappPairingSessions.delete(accountId);\n }\n\n res.status(200).json({ ok: true, accountId, status: \"idle\" });\n}\n\n// ── POST /api/whatsapp/disconnect ──────────────────────────────────────\nasync function handleDisconnect(\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime\n): Promise<void> {\n const setupService = getSetupService(runtime);\n const body = req.body as { accountId?: string } | null;\n\n let accountId: string;\n try {\n accountId = sanitizeAccountId(\n body && typeof body.accountId === \"string\" && body.accountId.trim()\n ? body.accountId.trim()\n : \"default\"\n );\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n return;\n }\n\n const session = whatsappPairingSessions.get(accountId);\n if (session) {\n session.stop();\n whatsappPairingSessions.delete(accountId);\n }\n\n const workspaceDir = setupService?.getWorkspaceDir() ?? \".\";\n\n try {\n await whatsappLogout(workspaceDir, accountId);\n } catch (logoutErr) {\n console.warn(\n `[whatsapp] Logout failed for ${accountId}, deleting auth files directly:`,\n String(logoutErr)\n );\n const authDir = path.join(workspaceDir, \"whatsapp-auth\", accountId);\n try {\n fs.rmSync(authDir, { recursive: true, force: true });\n } catch {\n /* may not exist */\n }\n }\n\n if (setupService) {\n setupService.updateConfig((config) => {\n const connectors = config.connectors as Record<string, unknown> | undefined;\n if (connectors) {\n if (accountId === \"default\") {\n delete connectors.whatsapp;\n return;\n }\n const whatsappConfig = connectors.whatsapp as Record<string, unknown> | undefined;\n const accounts = whatsappConfig?.accounts as Record<string, unknown> | undefined;\n if (accounts) {\n delete accounts[accountId];\n }\n connectors.whatsapp = {\n ...(whatsappConfig ?? {}),\n ...(accounts ? { accounts } : {}),\n };\n }\n });\n }\n\n res.status(200).json({ ok: true, accountId });\n}\n\n/**\n * Plugin routes for WhatsApp setup and webhooks.\n * Registered with `rawPath: true` to preserve legacy `/api/whatsapp/*` paths.\n */\nexport const whatsappSetupRoutes: Route[] = [\n {\n name: \"whatsapp-webhook-verify\",\n type: \"GET\",\n path: \"/api/whatsapp/webhook\",\n handler: handleWebhookVerify,\n rawPath: true,\n public: true, // Meta webhook verification must bypass auth\n },\n {\n name: \"whatsapp-webhook-event\",\n type: \"POST\",\n path: \"/api/whatsapp/webhook\",\n handler: handleWebhookEvent,\n rawPath: true,\n public: true, // Meta webhook delivery must bypass auth\n },\n {\n type: \"POST\",\n path: \"/api/whatsapp/pair\",\n handler: handlePair,\n rawPath: true,\n },\n {\n type: \"GET\",\n path: \"/api/whatsapp/status\",\n handler: handleStatus,\n rawPath: true,\n },\n {\n type: \"POST\",\n path: \"/api/whatsapp/pair/stop\",\n handler: handlePairStop,\n rawPath: true,\n },\n {\n type: \"POST\",\n path: \"/api/whatsapp/disconnect\",\n handler: handleDisconnect,\n rawPath: true,\n },\n];\n\n/**\n * Stop all active pairing sessions. Called during shutdown cleanup.\n */\nexport function stopAllPairingSessions(): void {\n for (const session of whatsappPairingSessions.values()) {\n try {\n session.stop();\n } catch {\n /* non-fatal */\n }\n }\n whatsappPairingSessions.clear();\n}\n",
17
+ "/**\n * WhatsApp pairing service — manages Baileys sessions for QR code authentication.\n *\n * This service is separate from the main WhatsApp plugin because the plugin\n * initializes during runtime startup (too late for interactive QR flow).\n * Once pairing succeeds, the auth state is persisted to disk so the plugin\n * can reconnect automatically on subsequent startups.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst LOG_PREFIX = \"[whatsapp-pairing]\";\n\n/** Validate accountId to prevent path traversal. Only allows alphanumeric, dash, underscore. */\nexport function sanitizeAccountId(raw: string): string {\n const cleaned = raw.replace(/[^a-zA-Z0-9_-]/g, \"\");\n if (!cleaned || cleaned !== raw) {\n throw new Error(\n `Invalid accountId: must only contain alphanumeric characters, dashes, and underscores`\n );\n }\n return cleaned;\n}\n\nexport type WhatsAppPairingStatus =\n | \"idle\"\n | \"initializing\"\n | \"waiting_for_qr\"\n | \"connected\"\n | \"disconnected\"\n | \"timeout\"\n | \"error\";\n\nexport interface WhatsAppPairingEvent {\n type: \"whatsapp-qr\" | \"whatsapp-status\";\n accountId: string;\n qrDataUrl?: string;\n expiresInMs?: number;\n status?: WhatsAppPairingStatus;\n phoneNumber?: string;\n error?: string;\n}\n\nexport interface WhatsAppPairingOptions {\n authDir: string;\n accountId: string;\n onEvent: (event: WhatsAppPairingEvent) => void;\n}\n\nexport class WhatsAppPairingSession {\n private socket: ReturnType<typeof import(\"@whiskeysockets/baileys\").default> | null = null;\n private status: WhatsAppPairingStatus = \"idle\";\n private options: WhatsAppPairingOptions;\n private qrAttempts = 0;\n private readonly MAX_QR_ATTEMPTS = 5;\n private restartTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: WhatsAppPairingOptions) {\n this.options = options;\n }\n\n async start(): Promise<void> {\n this.setStatus(\"initializing\");\n\n const baileys = await import(\"@whiskeysockets/baileys\");\n const makeWASocket = baileys.default;\n const { useMultiFileAuthState, fetchLatestBaileysVersion, DisconnectReason } = baileys;\n const QRCode = (await import(\"qrcode\")).default;\n const { Boom } = await import(\"@hapi/boom\");\n\n fs.mkdirSync(this.options.authDir, { recursive: true });\n\n const { state, saveCreds } = await useMultiFileAuthState(this.options.authDir);\n const { version } = await fetchLatestBaileysVersion();\n\n const pino = (await import(\"pino\")).default;\n const baileysLogger = pino({ level: \"silent\" });\n\n this.socket = makeWASocket({\n version,\n auth: state,\n logger: baileysLogger,\n printQRInTerminal: false,\n browser: [\"Eliza AI\", \"Desktop\", \"1.0.0\"],\n });\n\n this.socket.ev.on(\"creds.update\", saveCreds);\n\n this.socket.ev.on(\"connection.update\", async (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n this.qrAttempts++;\n console.info(\n `${LOG_PREFIX} QR code received (attempt ${this.qrAttempts}/${this.MAX_QR_ATTEMPTS})`\n );\n if (this.qrAttempts > this.MAX_QR_ATTEMPTS) {\n this.setStatus(\"timeout\");\n this.stop();\n return;\n }\n\n try {\n const qrDataUrl = await QRCode.toDataURL(qr, {\n width: 256,\n margin: 2,\n color: { dark: \"#000000\", light: \"#ffffff\" },\n });\n\n this.setStatus(\"waiting_for_qr\");\n this.options.onEvent({\n type: \"whatsapp-qr\",\n accountId: this.options.accountId,\n qrDataUrl,\n expiresInMs: 20_000,\n });\n } catch {\n // QR generation failure — non-fatal, next QR attempt will retry.\n }\n }\n\n if (connection === \"close\") {\n const statusCode = (lastDisconnect?.error as InstanceType<typeof Boom>)?.output?.statusCode;\n console.info(\n `${LOG_PREFIX} Connection closed, statusCode=${statusCode}, status=${this.status}`\n );\n if (statusCode === DisconnectReason.loggedOut) {\n this.setStatus(\"disconnected\");\n } else if (\n statusCode === DisconnectReason.restartRequired ||\n statusCode === DisconnectReason.timedOut ||\n statusCode === DisconnectReason.connectionClosed ||\n statusCode === DisconnectReason.connectionReplaced\n ) {\n console.info(`${LOG_PREFIX} Restarting pairing after transient close...`);\n this.socket = null;\n this.qrAttempts = 0;\n this.restartTimer = setTimeout(() => {\n this.restartTimer = null;\n this.start().catch((err) => {\n console.error(`${LOG_PREFIX} Restart failed:`, err);\n this.setStatus(\"error\");\n this.options.onEvent({\n type: \"whatsapp-status\",\n accountId: this.options.accountId,\n status: \"error\",\n error: String(err),\n });\n });\n }, 3000);\n }\n } else if (connection === \"open\") {\n const phoneNumber = this.socket?.user?.id?.split(\":\")[0] ?? \"\";\n this.setStatus(\"connected\");\n this.options.onEvent({\n type: \"whatsapp-status\",\n accountId: this.options.accountId,\n status: \"connected\",\n phoneNumber,\n });\n }\n });\n }\n\n stop(): void {\n if (this.restartTimer) {\n clearTimeout(this.restartTimer);\n this.restartTimer = null;\n }\n try {\n this.socket?.end(undefined);\n } catch {\n // Ignore cleanup errors.\n }\n this.socket = null;\n }\n\n getStatus(): WhatsAppPairingStatus {\n return this.status;\n }\n\n private setStatus(status: WhatsAppPairingStatus): void {\n this.status = status;\n this.options.onEvent({\n type: \"whatsapp-status\",\n accountId: this.options.accountId,\n status,\n });\n }\n}\n\nexport function whatsappAuthExists(workspaceDir: string, accountId = \"default\"): boolean {\n const credsPath = path.join(workspaceDir, \"whatsapp-auth\", accountId, \"creds.json\");\n return fs.existsSync(credsPath);\n}\n\nexport async function whatsappLogout(workspaceDir: string, accountId = \"default\"): Promise<void> {\n const authDir = path.join(workspaceDir, \"whatsapp-auth\", accountId);\n const credsPath = path.join(authDir, \"creds.json\");\n\n if (fs.existsSync(credsPath)) {\n try {\n const baileys = await import(\"@whiskeysockets/baileys\");\n const makeWASocket = baileys.default;\n const { useMultiFileAuthState, fetchLatestBaileysVersion } = baileys;\n const pino = (await import(\"pino\")).default;\n const logger = pino({ level: \"silent\" });\n\n const { state } = await useMultiFileAuthState(authDir);\n const { version } = await fetchLatestBaileysVersion();\n\n const sock = makeWASocket({\n version,\n auth: state,\n logger,\n printQRInTerminal: false,\n });\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n try {\n sock.ev.removeAllListeners(\"connection.update\");\n } catch {\n /* */\n }\n try {\n sock.end(undefined);\n } catch {\n /* */\n }\n resolve();\n };\n\n const timeout = setTimeout(finish, 10_000);\n\n sock.ev.on(\"connection.update\", async (update) => {\n if (update.connection === \"open\") {\n try {\n await sock.logout();\n } catch {\n // May fail if already logged out remotely.\n }\n finish();\n } else if (update.connection === \"close\") {\n finish();\n }\n });\n });\n } catch {\n // If Baileys can't connect, just delete files anyway.\n }\n }\n\n fs.rmSync(authDir, { recursive: true, force: true });\n}\n",
18
+ "import { type IAgentRuntime, Service } from \"@elizaos/core\";\n\nconst WORKFLOW_CREDENTIAL_PROVIDER_TYPE = \"workflow_credential_provider\";\ntype CredentialProviderResult =\n | { status: \"credential_data\"; data: Record<string, unknown> }\n | { status: \"needs_auth\"; authUrl: string }\n | null;\n\nconst SUPPORTED = [\"whatsAppApi\"];\n\nexport class WhatsAppWorkflowCredentialProvider extends Service {\n static override readonly serviceType = WORKFLOW_CREDENTIAL_PROVIDER_TYPE;\n override capabilityDescription = \"Supplies WhatsApp credentials to the workflow plugin.\";\n\n static async start(runtime: IAgentRuntime): Promise<WhatsAppWorkflowCredentialProvider> {\n return new WhatsAppWorkflowCredentialProvider(runtime);\n }\n\n async stop(): Promise<void> {}\n\n async resolve(_userId: string, credType: string): Promise<CredentialProviderResult> {\n if (credType !== \"whatsAppApi\") return null;\n const accessToken = this.runtime.getSetting(\"WHATSAPP_ACCESS_TOKEN\") as string | undefined;\n const phoneNumberId = this.runtime.getSetting(\"WHATSAPP_PHONE_NUMBER_ID\") as string | undefined;\n if (!accessToken?.trim() || !phoneNumberId?.trim()) return null;\n return {\n status: \"credential_data\",\n data: { accessToken: accessToken.trim(), phoneNumberId: phoneNumberId.trim() },\n };\n }\n\n checkCredentialTypes(credTypes: string[]): { supported: string[]; unsupported: string[] } {\n return {\n supported: credTypes.filter((t) => SUPPORTED.includes(t)),\n unsupported: credTypes.filter((t) => !SUPPORTED.includes(t)),\n };\n }\n}\n",
19
+ "import fs from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport path from \"node:path\";\nimport { logger } from \"@elizaos/core\";\nimport type { WhatsAppPairingEvent } from \"../services/whatsapp-pairing.js\";\n\nexport type WhatsAppPairingEventLike = WhatsAppPairingEvent;\n\nexport interface WhatsAppPairingSessionLike {\n start(): Promise<void>;\n stop(): void;\n getStatus(): string;\n}\n\nexport interface WhatsAppRouteState {\n whatsappPairingSessions: Map<string, WhatsAppPairingSessionLike>;\n broadcastWs?: (data: object) => void;\n config: WhatsAppPluginConfig;\n runtime?: {\n getService(type: string): unknown | null;\n };\n saveConfig: () => void;\n workspaceDir: string;\n}\n\ntype OwnerContactEntry = {\n entityId?: string;\n channelId?: string;\n roomId?: string;\n};\n\ntype WhatsAppPluginConfig = Record<string, unknown> & {\n connectors?: Record<string, unknown>;\n agents?: {\n defaults?: {\n ownerContacts?: Record<string, OwnerContactEntry>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n};\n\nexport interface WhatsAppRouteDeps {\n sanitizeAccountId: (accountId: string) => string;\n whatsappAuthExists: (workspaceDir: string, accountId: string) => boolean;\n whatsappLogout: (workspaceDir: string, accountId: string) => Promise<void>;\n createWhatsAppPairingSession: (options: {\n authDir: string;\n accountId: string;\n onEvent: (event: WhatsAppPairingEventLike) => void;\n }) => WhatsAppPairingSessionLike;\n}\n\ninterface WhatsAppAccountBody {\n accountId?: string;\n configurePlugin?: boolean;\n authScope?: WhatsAppAuthScope;\n}\n\ntype WhatsAppAuthScope = \"platform\" | \"lifeops\";\n\nconst MAX_BODY_BYTES = 1_048_576;\nexport const MAX_PAIRING_SESSIONS = 10;\n\nasync function readJsonBody<T = Record<string, unknown>>(\n req: IncomingMessage,\n res: ServerResponse\n): Promise<T | null> {\n let bytes = 0;\n let body = \"\";\n\n try {\n for await (const chunk of req) {\n const text = typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(\"utf8\");\n bytes += Buffer.byteLength(text);\n if (bytes > MAX_BODY_BYTES) {\n json(res, { error: \"Request body too large\" }, 413);\n return null;\n }\n body += text;\n }\n } catch (err) {\n logger.warn({ err }, \"Failed to read WhatsApp request body\");\n json(res, { error: \"Failed to read request body\" }, 400);\n return null;\n }\n\n if (!body.trim()) {\n return {} as T;\n }\n\n try {\n return JSON.parse(body) as T;\n } catch {\n json(res, { error: \"Invalid JSON body\" }, 400);\n return null;\n }\n}\n\nfunction json(res: ServerResponse, data: unknown, status = 200): void {\n if (!res.headersSent) {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json\");\n }\n res.end(JSON.stringify(data));\n}\n\nfunction setOwnerContact(\n config: WhatsAppPluginConfig,\n update: { source: string; channelId?: string; entityId?: string; roomId?: string }\n): boolean {\n if (!update.source) return false;\n\n if (!config.agents) config.agents = {};\n if (!config.agents.defaults) config.agents.defaults = {};\n if (!config.agents.defaults.ownerContacts) config.agents.defaults.ownerContacts = {};\n\n const existing = config.agents.defaults.ownerContacts[update.source];\n const entry: OwnerContactEntry = {};\n if (update.channelId) entry.channelId = update.channelId;\n if (update.entityId) entry.entityId = update.entityId;\n if (update.roomId) entry.roomId = update.roomId;\n\n if (Object.keys(entry).length === 0) return false;\n if (\n existing &&\n existing.channelId === entry.channelId &&\n existing.entityId === entry.entityId &&\n existing.roomId === entry.roomId\n ) {\n return false;\n }\n\n config.agents.defaults.ownerContacts[update.source] = entry;\n return true;\n}\n\nfunction shouldConfigurePlugin(body: WhatsAppAccountBody | null): boolean {\n return body?.configurePlugin !== false;\n}\n\nfunction resolveAuthScope(value: unknown): WhatsAppAuthScope {\n return value === \"lifeops\" ? \"lifeops\" : \"platform\";\n}\n\nfunction resolveSessionKey(authScope: WhatsAppAuthScope, accountId: string): string {\n return `${authScope}:${accountId}`;\n}\n\nfunction resolveAuthDir(\n workspaceDir: string,\n accountId: string,\n authScope: WhatsAppAuthScope\n): string {\n return path.join(\n workspaceDir,\n authScope === \"lifeops\" ? \"lifeops-whatsapp-auth\" : \"whatsapp-auth\",\n accountId\n );\n}\n\nfunction authExistsForScope(\n state: WhatsAppRouteState,\n deps: WhatsAppRouteDeps,\n accountId: string,\n authScope: WhatsAppAuthScope\n): boolean {\n if (authScope === \"platform\") {\n return deps.whatsappAuthExists(state.workspaceDir, accountId);\n }\n return fs.existsSync(\n path.join(resolveAuthDir(state.workspaceDir, accountId, authScope), \"creds.json\")\n );\n}\n\nexport async function handleWhatsAppRoute(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n method: string,\n state: WhatsAppRouteState,\n deps: WhatsAppRouteDeps\n): Promise<boolean> {\n if (!pathname.startsWith(\"/api/whatsapp\")) return false;\n\n if (pathname === \"/api/whatsapp/webhook\" && method === \"GET\") {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n const mode = url.searchParams.get(\"hub.mode\") ?? \"\";\n const token = url.searchParams.get(\"hub.verify_token\") ?? \"\";\n const challenge = url.searchParams.get(\"hub.challenge\") ?? \"\";\n\n const service = state.runtime?.getService(\"whatsapp\") as\n | {\n verifyWebhook?: (mode: string, token: string, challenge: string) => string | null;\n }\n | null\n | undefined;\n\n if (!service || typeof service.verifyWebhook !== \"function\") {\n json(res, { error: \"WhatsApp service unavailable\" }, 503);\n return true;\n }\n\n const verifiedChallenge = service.verifyWebhook(mode, token, challenge);\n if (!verifiedChallenge) {\n json(res, { error: \"Webhook verification failed\" }, 403);\n return true;\n }\n\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"text/plain\");\n res.end(verifiedChallenge);\n return true;\n }\n\n if (pathname === \"/api/whatsapp/webhook\" && method === \"POST\") {\n const service = state.runtime?.getService(\"whatsapp\") as\n | {\n handleWebhook?: (event: Record<string, unknown>) => Promise<void>;\n }\n | null\n | undefined;\n\n if (!service || typeof service.handleWebhook !== \"function\") {\n json(res, { error: \"WhatsApp service unavailable\" }, 503);\n return true;\n }\n\n const body = await readJsonBody<Record<string, unknown>>(req, res);\n if (!body) {\n return true;\n }\n\n await service.handleWebhook(body);\n\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"text/plain\");\n res.end(\"EVENT_RECEIVED\");\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/whatsapp/pair\") {\n const body = await readJsonBody<WhatsAppAccountBody>(req, res);\n const authScope = resolveAuthScope(body?.authScope);\n const configurePlugin = authScope === \"platform\" && shouldConfigurePlugin(body);\n let accountId: string;\n try {\n accountId = deps.sanitizeAccountId(\n body && typeof body.accountId === \"string\" && body.accountId.trim()\n ? body.accountId.trim()\n : \"default\"\n );\n } catch (err) {\n json(res, { error: (err as Error).message }, 400);\n return true;\n }\n const sessionKey = resolveSessionKey(authScope, accountId);\n\n const isReplacing = state.whatsappPairingSessions.has(sessionKey);\n if (!isReplacing && state.whatsappPairingSessions.size >= MAX_PAIRING_SESSIONS) {\n json(\n res,\n {\n error: `Too many concurrent pairing sessions (max ${MAX_PAIRING_SESSIONS})`,\n },\n 429\n );\n return true;\n }\n\n const authDir = resolveAuthDir(state.workspaceDir, accountId, authScope);\n state.whatsappPairingSessions.get(sessionKey)?.stop();\n\n const session = deps.createWhatsAppPairingSession({\n authDir,\n accountId,\n onEvent: (event) => {\n state.broadcastWs?.({ ...event, authScope });\n\n if (event.status === \"connected\") {\n let configChanged = false;\n if (configurePlugin) {\n if (!state.config.connectors) state.config.connectors = {};\n state.config.connectors.whatsapp = {\n ...((state.config.connectors.whatsapp as Record<string, unknown> | undefined) ?? {}),\n authDir,\n enabled: true,\n };\n configChanged = true;\n }\n\n const phoneNumber = event.phoneNumber;\n configChanged =\n setOwnerContact(state.config as Parameters<typeof setOwnerContact>[0], {\n source: \"whatsapp\",\n channelId: phoneNumber ?? undefined,\n }) || configChanged;\n\n if (!configChanged) {\n return;\n }\n\n try {\n state.saveConfig();\n } catch {\n /* test envs */\n }\n }\n },\n });\n\n state.whatsappPairingSessions.set(sessionKey, session);\n\n try {\n await session.start();\n json(res, {\n ok: true,\n accountId,\n authScope,\n status: session.getStatus(),\n });\n } catch (err) {\n json(res, { ok: false, error: String(err) }, 500);\n }\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/whatsapp/status\") {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n let accountId: string;\n try {\n accountId = deps.sanitizeAccountId(url.searchParams.get(\"accountId\") || \"default\");\n } catch (err) {\n json(res, { error: (err as Error).message }, 400);\n return true;\n }\n const authScope = resolveAuthScope(url.searchParams.get(\"authScope\"));\n const sessionKey = resolveSessionKey(authScope, accountId);\n\n const session = state.whatsappPairingSessions.get(sessionKey);\n\n let serviceConnected = false;\n let servicePhone: string | null = null;\n if (state.runtime) {\n try {\n const waService = state.runtime.getService(\"whatsapp\") as Record<string, unknown> | null;\n if (waService) {\n serviceConnected = Boolean(waService.connected);\n servicePhone = (waService.phoneNumber as string) ?? null;\n }\n } catch {\n /* service not yet registered */\n }\n }\n\n json(res, {\n accountId,\n authScope,\n status: session?.getStatus() ?? \"idle\",\n authExists: authExistsForScope(state, deps, accountId, authScope),\n serviceConnected,\n servicePhone,\n });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/whatsapp/pair/stop\") {\n const body = await readJsonBody<WhatsAppAccountBody>(req, res);\n const authScope = resolveAuthScope(body?.authScope);\n let accountId: string;\n try {\n accountId = deps.sanitizeAccountId(\n body && typeof body.accountId === \"string\" && body.accountId.trim()\n ? body.accountId.trim()\n : \"default\"\n );\n } catch (err) {\n json(res, { error: (err as Error).message }, 400);\n return true;\n }\n const sessionKey = resolveSessionKey(authScope, accountId);\n\n const session = state.whatsappPairingSessions.get(sessionKey);\n if (session) {\n session.stop();\n state.whatsappPairingSessions.delete(sessionKey);\n }\n\n json(res, { ok: true, accountId, authScope, status: \"idle\" });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/whatsapp/disconnect\") {\n const body = await readJsonBody<WhatsAppAccountBody>(req, res);\n const authScope = resolveAuthScope(body?.authScope);\n const configurePlugin = authScope === \"platform\" && shouldConfigurePlugin(body);\n let accountId: string;\n try {\n accountId = deps.sanitizeAccountId(\n body && typeof body.accountId === \"string\" && body.accountId.trim()\n ? body.accountId.trim()\n : \"default\"\n );\n } catch (err) {\n json(res, { error: (err as Error).message }, 400);\n return true;\n }\n const sessionKey = resolveSessionKey(authScope, accountId);\n\n const session = state.whatsappPairingSessions.get(sessionKey);\n if (session) {\n session.stop();\n state.whatsappPairingSessions.delete(sessionKey);\n }\n\n const authDir = resolveAuthDir(state.workspaceDir, accountId, authScope);\n try {\n if (authScope === \"platform\") {\n await deps.whatsappLogout(state.workspaceDir, accountId);\n } else {\n fs.rmSync(authDir, { recursive: true, force: true });\n }\n } catch (logoutErr) {\n logger.warn(\n {\n accountId,\n error: logoutErr instanceof Error ? logoutErr.message : String(logoutErr),\n },\n \"[whatsapp] Logout failed, deleting auth files directly\"\n );\n try {\n fs.rmSync(authDir, { recursive: true, force: true });\n } catch {\n /* may not exist */\n }\n }\n\n if (configurePlugin && state.config.connectors) {\n delete state.config.connectors.whatsapp;\n try {\n state.saveConfig();\n } catch {\n /* test envs */\n }\n }\n\n json(res, { ok: true, accountId, authScope });\n return true;\n }\n\n return false;\n}\n\nexport function applyWhatsAppQrOverride(\n plugins: {\n id: string;\n validationErrors: unknown[];\n configured: boolean;\n qrConnected?: boolean;\n }[],\n workspaceDir: string\n): void {\n try {\n const waCredsPath = path.join(workspaceDir, \"whatsapp-auth\", \"default\", \"creds.json\");\n if (fs.existsSync(waCredsPath)) {\n const waPlugin = plugins.find((plugin) => plugin.id === \"whatsapp\");\n if (waPlugin) {\n waPlugin.validationErrors = [];\n waPlugin.configured = true;\n waPlugin.qrConnected = true;\n }\n }\n } catch {\n /* workspace dir may not exist */\n }\n}\n",
20
+ "import type { WhatsAppConfig } from \"../types\";\n\nexport function detectAuthMethod(\n config: WhatsAppConfig | Record<string, unknown>\n): \"baileys\" | \"cloudapi\" {\n const explicitMethod = (config as { authMethod?: unknown }).authMethod;\n if (explicitMethod !== undefined) {\n if (explicitMethod === \"baileys\" || explicitMethod === \"cloudapi\") {\n return explicitMethod;\n }\n throw new Error(\n `Invalid authMethod: \"${String(explicitMethod)}\". Must be either \"baileys\" or \"cloudapi\".`\n );\n }\n\n if (\"authDir\" in config && config.authDir) {\n return \"baileys\";\n }\n\n if (\"accessToken\" in config && \"phoneNumberId\" in config) {\n return \"cloudapi\";\n }\n\n throw new Error(\n \"Cannot detect auth method. Provide either authDir (Baileys) or accessToken + phoneNumberId (Cloud API).\"\n );\n}\n",
21
+ "import { WhatsAppClient } from \"../client\";\nimport type { BaileysConfig, CloudAPIConfig, WhatsAppConfig } from \"../types\";\nimport { detectAuthMethod } from \"../utils/config-detector\";\nimport { BaileysClient } from \"./baileys-client\";\nimport type { IWhatsAppClient } from \"./interface\";\n\nexport const ClientFactory = {\n create(config: WhatsAppConfig): IWhatsAppClient {\n const authMethod = detectAuthMethod(config);\n if (authMethod === \"baileys\") {\n return new BaileysClient(config as BaileysConfig);\n }\n return new WhatsAppClient(config as CloudAPIConfig);\n },\n};\n",
22
+ "export type WhatsAppConfig = CloudAPIConfig | BaileysConfig;\n\nexport interface CloudAPIConfig {\n authMethod?: \"cloudapi\";\n accessToken: string;\n phoneNumberId: string;\n webhookVerifyToken?: string;\n businessAccountId?: string;\n apiVersion?: string;\n}\n\nexport interface BaileysConfig {\n authMethod?: \"baileys\";\n authDir: string;\n printQRInTerminal?: boolean;\n sessionPath?: string;\n}\n\n/**\n * Message types supported by WhatsApp Cloud API.\n */\nexport type WhatsAppMessageType =\n | \"text\"\n | \"template\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"document\"\n | \"sticker\"\n | \"location\"\n | \"contacts\"\n | \"interactive\"\n | \"reaction\";\n\nexport interface WhatsAppMessage {\n type: WhatsAppMessageType;\n to: string;\n content:\n | string\n | WhatsAppTemplate\n | WhatsAppMediaMessage\n | WhatsAppInteractiveMessage\n | WhatsAppReactionMessage\n | WhatsAppLocationMessage;\n replyToMessageId?: string;\n}\n\nexport interface WhatsAppTemplate {\n name: string;\n language: {\n code: string;\n };\n components?: Array<{\n type: string;\n parameters: Array<{\n type: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename?: string };\n video?: { link: string };\n }>;\n }>;\n}\n\n/**\n * Media message content.\n */\nexport interface WhatsAppMediaMessage {\n link?: string;\n id?: string;\n caption?: string;\n filename?: string;\n mimeType?: string;\n}\n\n/**\n * Reaction message content.\n */\nexport interface WhatsAppReactionMessage {\n messageId: string;\n emoji: string;\n}\n\n/**\n * Location message content.\n */\nexport interface WhatsAppLocationMessage {\n latitude: number;\n longitude: number;\n name?: string;\n address?: string;\n}\n\n/**\n * Interactive message types.\n */\nexport type InteractiveMessageType = \"button\" | \"list\" | \"product\" | \"product_list\" | \"flow\";\n\n/**\n * Interactive message content.\n */\nexport interface WhatsAppInteractiveMessage {\n type: InteractiveMessageType;\n header?: {\n type: \"text\" | \"image\" | \"video\" | \"document\";\n text?: string;\n image?: { link: string };\n video?: { link: string };\n document?: { link: string; filename?: string };\n };\n body: {\n text: string;\n };\n footer?: {\n text: string;\n };\n action: WhatsAppInteractiveAction;\n}\n\n/**\n * Interactive action based on message type.\n */\nexport type WhatsAppInteractiveAction =\n | WhatsAppButtonAction\n | WhatsAppListAction\n | WhatsAppFlowAction;\n\n/**\n * Button action for interactive messages.\n */\nexport interface WhatsAppButtonAction {\n buttons: Array<{\n type: \"reply\";\n reply: {\n id: string;\n title: string;\n };\n }>;\n}\n\n/**\n * List action for interactive messages.\n */\nexport interface WhatsAppListAction {\n button: string;\n sections: Array<{\n title?: string;\n rows: Array<{\n id: string;\n title: string;\n description?: string;\n }>;\n }>;\n}\n\n/**\n * Flow action for interactive messages.\n */\nexport interface WhatsAppFlowAction {\n name: \"flow\";\n parameters: {\n flow_message_version: string;\n flow_token: string;\n flow_id: string;\n flow_cta: string;\n flow_action: \"navigate\" | \"data_exchange\";\n flow_action_payload?: {\n screen: string;\n data?: Record<string, unknown>;\n };\n };\n}\n\nexport interface WhatsAppIncomingMessage {\n from: string;\n id: string;\n timestamp: string;\n text?: {\n body: string;\n };\n image?: {\n caption?: string;\n mime_type: string;\n sha256: string;\n id: string;\n };\n video?: {\n caption?: string;\n mime_type: string;\n sha256: string;\n id: string;\n };\n audio?: {\n mime_type: string;\n sha256: string;\n id: string;\n voice?: boolean;\n };\n document?: {\n caption?: string;\n filename: string;\n mime_type: string;\n sha256: string;\n id: string;\n };\n sticker?: {\n mime_type: string;\n sha256: string;\n id: string;\n animated?: boolean;\n };\n location?: {\n latitude: number;\n longitude: number;\n name?: string;\n address?: string;\n };\n contacts?: Array<{\n name: {\n formatted_name: string;\n first_name?: string;\n last_name?: string;\n };\n phones?: Array<{\n phone: string;\n type: string;\n }>;\n }>;\n interactive?: {\n type: \"button_reply\" | \"list_reply\" | \"nfm_reply\";\n button_reply?: {\n id: string;\n title: string;\n };\n list_reply?: {\n id: string;\n title: string;\n description?: string;\n };\n nfm_reply?: {\n response_json: string;\n body: string;\n name: string;\n };\n };\n reaction?: {\n message_id: string;\n emoji: string;\n };\n context?: {\n from: string;\n id: string;\n referred_product?: {\n catalog_id: string;\n product_retailer_id: string;\n };\n };\n type: string;\n}\n\nexport interface WhatsAppStatusUpdate {\n id: string;\n status: \"sent\" | \"delivered\" | \"read\" | \"failed\";\n timestamp: string;\n recipient_id: string;\n conversation?: {\n id: string;\n origin?: {\n type: string;\n };\n expiration_timestamp?: string;\n };\n pricing?: {\n billable: boolean;\n pricing_model: string;\n category: string;\n };\n errors?: Array<{\n code: number;\n title: string;\n message?: string;\n error_data?: {\n details: string;\n };\n }>;\n}\n\nexport interface WhatsAppWebhookEvent {\n object: string;\n entry: Array<{\n id: string;\n changes: Array<{\n value: {\n messaging_product: string;\n metadata: {\n display_phone_number: string;\n phone_number_id: string;\n };\n statuses?: WhatsAppStatusUpdate[];\n messages?: WhatsAppIncomingMessage[];\n contacts?: Array<{\n profile: {\n name: string;\n };\n wa_id: string;\n }>;\n errors?: Array<{\n code: number;\n title: string;\n message?: string;\n error_data?: {\n details: string;\n };\n }>;\n };\n field: string;\n }>;\n }>;\n}\n\nexport interface WhatsAppMessageResponse {\n messaging_product: string;\n contacts: Array<{\n input: string;\n wa_id: string;\n }>;\n messages: Array<{\n id: string;\n message_status?: string;\n }>;\n}\n\nexport interface QRCodeData {\n terminal: string;\n dataURL: string;\n raw: string;\n}\n\nexport type ConnectionStatus = \"connecting\" | \"open\" | \"close\";\n\nexport interface NormalizedMessage {\n id: string;\n from: string;\n timestamp: number;\n type: \"text\" | \"image\" | \"audio\" | \"video\" | \"document\";\n content: string;\n chatId?: string;\n senderId?: string;\n replyToId?: string;\n}\n\n/**\n * Send reaction parameters.\n */\nexport interface SendReactionParams {\n to: string;\n messageId: string;\n emoji: string;\n}\n\n/**\n * Send reaction result.\n */\nexport interface SendReactionResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n\n/**\n * WhatsApp event types.\n */\nexport enum WhatsAppEventType {\n MESSAGE_RECEIVED = \"WHATSAPP_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"WHATSAPP_MESSAGE_SENT\",\n MESSAGE_DELIVERED = \"WHATSAPP_MESSAGE_DELIVERED\",\n MESSAGE_READ = \"WHATSAPP_MESSAGE_READ\",\n MESSAGE_FAILED = \"WHATSAPP_MESSAGE_FAILED\",\n REACTION_RECEIVED = \"WHATSAPP_REACTION_RECEIVED\",\n REACTION_SENT = \"WHATSAPP_REACTION_SENT\",\n INTERACTIVE_REPLY = \"WHATSAPP_INTERACTIVE_REPLY\",\n WEBHOOK_VERIFIED = \"WHATSAPP_WEBHOOK_VERIFIED\",\n}\n\n/**\n * Common WhatsApp reaction emojis.\n */\nexport const WHATSAPP_REACTIONS = {\n THUMBS_UP: \"👍\",\n THUMBS_DOWN: \"👎\",\n HEART: \"❤️\",\n LAUGHING: \"😂\",\n SURPRISED: \"😮\",\n SAD: \"😢\",\n PRAYING: \"🙏\",\n CLAPPING: \"👏\",\n FIRE: \"🔥\",\n CELEBRATION: \"🎉\",\n} as const;\n\nexport type WhatsAppReactionEmoji = (typeof WHATSAPP_REACTIONS)[keyof typeof WHATSAPP_REACTIONS];\n"
21
23
  ],
22
- "mappings": "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",
23
- "debugId": "3ABF74EE0B1ACBEC64756E2164756E21",
24
+ "mappings": "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",
25
+ "debugId": "ACCEAA76DD452ADF64756E2164756E21",
24
26
  "names": []
25
27
  }