@agenticmail/enterprise 0.5.312 → 0.5.313

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 (208) hide show
  1. package/README.md +682 -544
  2. package/dist/agent-autonomy-PSXQ4MNP.js +766 -0
  3. package/dist/agent-heartbeat-6H3YAQ32.js +510 -0
  4. package/dist/agent-heartbeat-7WS3XILF.js +510 -0
  5. package/dist/agent-heartbeat-BFGKYUUK.js +510 -0
  6. package/dist/agent-heartbeat-SSV65YTX.js +510 -0
  7. package/dist/agent-heartbeat-T5IIHVF4.js +510 -0
  8. package/dist/agent-heartbeat-X3C6FIU2.js +510 -0
  9. package/dist/agent-tools-BW6CLQQ7.js +13897 -0
  10. package/dist/agent-tools-KEA7QEWF.js +13897 -0
  11. package/dist/agent-tools-NU7V3S5N.js +13899 -0
  12. package/dist/agent-tools-WINDYRQ2.js +13897 -0
  13. package/dist/chunk-3ELH5CU6.js +4910 -0
  14. package/dist/chunk-4QYRS3MS.js +1519 -0
  15. package/dist/chunk-52REEVDW.js +1519 -0
  16. package/dist/chunk-5RZJ76YI.js +4977 -0
  17. package/dist/chunk-6L7FQI5Q.js +4909 -0
  18. package/dist/chunk-763OMGFI.js +1519 -0
  19. package/dist/chunk-7ILSXGY6.js +1519 -0
  20. package/dist/chunk-7UCKD25B.js +551 -0
  21. package/dist/chunk-A6MSR7DL.js +4977 -0
  22. package/dist/chunk-ASD2YB6O.js +1519 -0
  23. package/dist/chunk-AZOIHLLX.js +4977 -0
  24. package/dist/chunk-BDCFOP7O.js +537 -0
  25. package/dist/chunk-BSVWPG6I.js +106 -0
  26. package/dist/chunk-C46DNDZB.js +1519 -0
  27. package/dist/chunk-CFVTK4FQ.js +4977 -0
  28. package/dist/chunk-CHJAOKCJ.js +4921 -0
  29. package/dist/chunk-CYEWTXYH.js +4977 -0
  30. package/dist/chunk-D3KFSWLK.js +48 -0
  31. package/dist/chunk-DUVGNAIY.js +4977 -0
  32. package/dist/chunk-DX4XEFVE.js +25229 -0
  33. package/dist/chunk-EX6FQSEV.js +167 -0
  34. package/dist/chunk-F5VZ5EUH.js +1519 -0
  35. package/dist/chunk-FVUDSPOD.js +4977 -0
  36. package/dist/chunk-G6FTZKJX.js +4977 -0
  37. package/dist/chunk-GFEAZN6Y.js +1519 -0
  38. package/dist/chunk-HKV4FQFW.js +1519 -0
  39. package/dist/chunk-ICCPULDT.js +25217 -0
  40. package/dist/chunk-IYEM627Q.js +25216 -0
  41. package/dist/chunk-JHRJ4QJ6.js +1519 -0
  42. package/dist/chunk-K2DAUYHV.js +4977 -0
  43. package/dist/chunk-KDQDSZZQ.js +4973 -0
  44. package/dist/chunk-LDUD6AZY.js +1519 -0
  45. package/dist/chunk-LES5TJ5L.js +4909 -0
  46. package/dist/chunk-MJGGW6MC.js +106 -0
  47. package/dist/chunk-MQKIWAHQ.js +106 -0
  48. package/dist/chunk-NGA7BBPF.js +48 -0
  49. package/dist/chunk-OE3TI4IQ.js +1519 -0
  50. package/dist/chunk-OHSBIYDR.js +4977 -0
  51. package/dist/chunk-OZEYDEPB.js +1519 -0
  52. package/dist/chunk-P4PODSQH.js +1519 -0
  53. package/dist/chunk-P7UOSFIE.js +636 -0
  54. package/dist/chunk-PFN6DODU.js +4921 -0
  55. package/dist/chunk-PKDVM4IY.js +4917 -0
  56. package/dist/chunk-Q5KG3G7U.js +25115 -0
  57. package/dist/chunk-QMVNW4FJ.js +25229 -0
  58. package/dist/chunk-QZ5UPRBE.js +4977 -0
  59. package/dist/chunk-SPP23N42.js +4977 -0
  60. package/dist/chunk-SRGHNFOY.js +4921 -0
  61. package/dist/chunk-TPLVQFXM.js +2594 -0
  62. package/dist/chunk-U3XYF4QP.js +4977 -0
  63. package/dist/chunk-VRRJH2DY.js +4921 -0
  64. package/dist/chunk-WY42BS3F.js +1519 -0
  65. package/dist/chunk-XAA4VHHZ.js +1519 -0
  66. package/dist/chunk-Z5Y5KTPC.js +4977 -0
  67. package/dist/chunk-ZA4QRACH.js +4977 -0
  68. package/dist/chunk-ZHLGSTXF.js +4909 -0
  69. package/dist/cli-agent-26BUULHZ.js +2169 -0
  70. package/dist/cli-agent-2FLJWXOC.js +2169 -0
  71. package/dist/cli-agent-4NNQFLO6.js +2255 -0
  72. package/dist/cli-agent-5WV3EEPW.js +2252 -0
  73. package/dist/cli-agent-65JUT6DU.js +2193 -0
  74. package/dist/cli-agent-6HLL7A5K.js +2255 -0
  75. package/dist/cli-agent-CZ26QWUZ.js +2210 -0
  76. package/dist/cli-agent-HPVSWDNQ.js +2255 -0
  77. package/dist/cli-agent-K4SBVG5X.js +2210 -0
  78. package/dist/cli-agent-K5D424X2.js +2252 -0
  79. package/dist/cli-agent-U4OL5FGK.js +2210 -0
  80. package/dist/cli-agent-WUMPOIKQ.js +2169 -0
  81. package/dist/cli-agent-WWRGGJ2F.js +2255 -0
  82. package/dist/cli-agent-ZDBBTVGU.js +2193 -0
  83. package/dist/cli-agent-ZIZ5JP4O.js +2252 -0
  84. package/dist/cli-recover-I4KNR2OI.js +487 -0
  85. package/dist/cli-recover-IQTUKWR2.js +487 -0
  86. package/dist/cli-recover-OYJHELOR.js +487 -0
  87. package/dist/cli-recover-PVQC7UXB.js +487 -0
  88. package/dist/cli-recover-T32NABFA.js +487 -0
  89. package/dist/cli-serve-FTQJ3RUK.js +143 -0
  90. package/dist/cli-serve-G4PUCASH.js +143 -0
  91. package/dist/cli-serve-HBZYUUQ3.js +143 -0
  92. package/dist/cli-serve-L3NUROMO.js +143 -0
  93. package/dist/cli-serve-LAA5WIZK.js +143 -0
  94. package/dist/cli-serve-LV4TUSJD.js +143 -0
  95. package/dist/cli-serve-MFCTVA2L.js +140 -0
  96. package/dist/cli-serve-QCRUFI5B.js +143 -0
  97. package/dist/cli-serve-S7OGQN4P.js +143 -0
  98. package/dist/cli-serve-SI4BQRXT.js +140 -0
  99. package/dist/cli-serve-UNB7EHN4.js +143 -0
  100. package/dist/cli-serve-UV3GVDRD.js +143 -0
  101. package/dist/cli-serve-V5QICXR5.js +143 -0
  102. package/dist/cli-serve-VG6Z6GIB.js +143 -0
  103. package/dist/cli-serve-XSYHPGZI.js +143 -0
  104. package/dist/cli-serve-Y534FCRV.js +140 -0
  105. package/dist/cli-verify-CZIITRED.js +149 -0
  106. package/dist/cli-verify-N73GOKEF.js +149 -0
  107. package/dist/cli-verify-QEEBZOUZ.js +149 -0
  108. package/dist/cli-verify-RC5HI6DU.js +149 -0
  109. package/dist/cli-verify-VKBNIEAX.js +149 -0
  110. package/dist/cli.js +5 -5
  111. package/dist/dashboard/app.js +8 -2
  112. package/dist/dashboard/components/org-switcher.js +5 -1
  113. package/dist/dashboard/org-switcher.js +156 -0
  114. package/dist/dashboard/pages/login.js +160 -4
  115. package/dist/dashboard/pages/task-pipeline.js +1 -1
  116. package/dist/factory-3IWXVE37.js +9 -0
  117. package/dist/factory-5M6PTMLC.js +11 -0
  118. package/dist/factory-CSSHN7GE.js +11 -0
  119. package/dist/factory-JFWXTAWK.js +11 -0
  120. package/dist/factory-TBGUYM5X.js +9 -0
  121. package/dist/google-W5AYGNUJ.js +33 -0
  122. package/dist/index.js +6 -6
  123. package/dist/meetings-FJ453ENF.js +12 -0
  124. package/dist/postgres-BCHZWRU3.js +832 -0
  125. package/dist/postgres-BI4QVRM6.js +825 -0
  126. package/dist/postgres-BOTHOPDW.js +875 -0
  127. package/dist/postgres-JBUKR3TA.js +873 -0
  128. package/dist/postgres-Z7QYSU6K.js +861 -0
  129. package/dist/routes-7QYAQTWA.js +90 -0
  130. package/dist/routes-JCBVZU54.js +90 -0
  131. package/dist/routes-KEDEJFRE.js +90 -0
  132. package/dist/routes-WI64ADVH.js +90 -0
  133. package/dist/routes-X36OSCID.js +90 -0
  134. package/dist/runtime-75XR6KEW.js +45 -0
  135. package/dist/runtime-BNM7ZNNL.js +45 -0
  136. package/dist/runtime-ES6WCJ7D.js +45 -0
  137. package/dist/runtime-KYJTML2B.js +45 -0
  138. package/dist/runtime-LO67ZHQA.js +45 -0
  139. package/dist/runtime-VIXKKVSZ.js +45 -0
  140. package/dist/runtime-WHWJPCGK.js +45 -0
  141. package/dist/runtime-Z2Q6GUHH.js +45 -0
  142. package/dist/runtime-ZZ6CALSB.js +45 -0
  143. package/dist/server-27A4WEJC.js +28 -0
  144. package/dist/server-2CBXP4WS.js +28 -0
  145. package/dist/server-4JQAB5R4.js +28 -0
  146. package/dist/server-6BOM5U64.js +28 -0
  147. package/dist/server-FLJKNPRD.js +28 -0
  148. package/dist/server-HMIHIQ2N.js +28 -0
  149. package/dist/server-KIXXLR2D.js +28 -0
  150. package/dist/server-KSEIZTXF.js +28 -0
  151. package/dist/server-MPVW7DKZ.js +28 -0
  152. package/dist/server-PRTVRQ2D.js +28 -0
  153. package/dist/server-SYIG6HAX.js +28 -0
  154. package/dist/server-U32KDIXC.js +28 -0
  155. package/dist/server-WFN6CA4T.js +28 -0
  156. package/dist/server-XQUE3FGT.js +28 -0
  157. package/dist/server-XWT2UORK.js +28 -0
  158. package/dist/server-Y3BGNN5Q.js +28 -0
  159. package/dist/setup-352L2TPS.js +20 -0
  160. package/dist/setup-4MM645XK.js +20 -0
  161. package/dist/setup-5JPWW6IP.js +20 -0
  162. package/dist/setup-CUN6LVUV.js +20 -0
  163. package/dist/setup-D3YHPWPY.js +20 -0
  164. package/dist/setup-D4A5I6UM.js +20 -0
  165. package/dist/setup-DOPLXTB3.js +20 -0
  166. package/dist/setup-E3NSIM6B.js +20 -0
  167. package/dist/setup-E3V2D7NL.js +20 -0
  168. package/dist/setup-FSYPGI2C.js +20 -0
  169. package/dist/setup-G3RPKRG3.js +20 -0
  170. package/dist/setup-KJ77HNWK.js +20 -0
  171. package/dist/setup-LPSOY5V5.js +20 -0
  172. package/dist/setup-N3ODDSQE.js +20 -0
  173. package/dist/setup-NLDM3M2P.js +20 -0
  174. package/dist/setup-SWJMNDWF.js +20 -0
  175. package/dist/system-prompts-6OUTAMH6.js +41 -0
  176. package/dist/task-queue-YP2I54IA.js +9 -0
  177. package/dist/telegram-QRNGRT5M.js +17 -0
  178. package/dist/whatsapp-VYVINCGV.js +31 -0
  179. package/god_is_great.html +35 -0
  180. package/package.json +1 -1
  181. package/src/agent-tools/index.ts +4 -1
  182. package/src/agent-tools/tool-resolver.ts +15 -4
  183. package/src/agent-tools/tools/browser.ts +2 -2
  184. package/src/agent-tools/tools/local/dependency-manager.ts +286 -0
  185. package/src/agent-tools/tools/local/index.ts +3 -0
  186. package/src/agent-tools/tools/messaging/telegram.ts +29 -0
  187. package/src/agent-tools/tools/messaging/whatsapp.ts +59 -4
  188. package/src/auth/routes.ts +1 -1
  189. package/src/cli-agent.ts +47 -6
  190. package/src/cli-serve.ts +2 -5
  191. package/src/dashboard/app.js +8 -2
  192. package/src/dashboard/components/org-switcher.js +5 -1
  193. package/src/dashboard/pages/login.js +160 -4
  194. package/src/dashboard/pages/task-pipeline.js +1 -1
  195. package/src/db/adapter.ts +2 -0
  196. package/src/db/factory.ts +78 -0
  197. package/src/db/postgres.ts +57 -12
  198. package/src/engine/agent-autonomy.ts +1 -1
  199. package/src/engine/agent-heartbeat.ts +1 -1
  200. package/src/engine/messaging-poller.ts +146 -11
  201. package/src/engine/oauth-connect-routes.ts +23 -3
  202. package/src/engine/routes.ts +1 -1
  203. package/src/engine/task-poller.ts +54 -3
  204. package/src/engine/task-queue.ts +30 -0
  205. package/src/runtime/index.ts +2 -1
  206. package/src/runtime/types.ts +2 -0
  207. package/src/server.ts +13 -1
  208. package/src/system-prompts/triage.ts +1 -1
@@ -0,0 +1,636 @@
1
+ import {
2
+ __esm
3
+ } from "./chunk-KFQGP6VL.js";
4
+
5
+ // src/agent-tools/tools/messaging/whatsapp.ts
6
+ import { join } from "path";
7
+ import { mkdir, readFile, stat } from "fs/promises";
8
+ import { EventEmitter } from "events";
9
+ async function hasAuthState(config) {
10
+ try {
11
+ var authDir = join(config.dataDir, "auth");
12
+ await stat(join(authDir, "creds.json"));
13
+ return true;
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
18
+ async function getOrCreateConnection(config) {
19
+ var existing = connections.get(config.agentId);
20
+ if (existing?.connected) return existing;
21
+ if (existing?.reconnecting) return existing;
22
+ var baileys = await import("@whiskeysockets/baileys");
23
+ var makeWASocket = baileys.default;
24
+ var { useMultiFileAuthState, DisconnectReason, fetchLatestBaileysVersion } = baileys;
25
+ var authDir = join(config.dataDir, "auth");
26
+ await mkdir(authDir, { recursive: true });
27
+ var { version } = await fetchLatestBaileysVersion();
28
+ var conn = {
29
+ sock: null,
30
+ qr: null,
31
+ connected: false,
32
+ saveCreds: async () => {
33
+ },
34
+ events: new EventEmitter(),
35
+ reconnecting: false,
36
+ reconnectAttempts: 0,
37
+ lastConnectedAt: null,
38
+ lastMessageAt: null
39
+ };
40
+ var createSocket = async () => {
41
+ conn.reconnecting = true;
42
+ try {
43
+ var authState = await useMultiFileAuthState(authDir);
44
+ var { makeCacheableSignalKeyStore } = baileys;
45
+ var silentLogger = { level: "silent", trace: () => {
46
+ }, debug: () => {
47
+ }, info: () => {
48
+ }, warn: () => {
49
+ }, error: () => {
50
+ }, fatal: () => {
51
+ }, child: () => silentLogger };
52
+ var sock = makeWASocket({
53
+ version,
54
+ auth: {
55
+ creds: authState.state.creds,
56
+ keys: makeCacheableSignalKeyStore(authState.state.keys, silentLogger)
57
+ },
58
+ logger: silentLogger,
59
+ printQRInTerminal: false,
60
+ browser: ["AgenticMail", "Desktop", "1.0"],
61
+ syncFullHistory: false,
62
+ markOnlineOnConnect: false,
63
+ generateHighQualityLinkPreview: false
64
+ });
65
+ sock.ev.on("creds.update", authState.saveCreds);
66
+ conn.saveCreds = authState.saveCreds;
67
+ sock.ev.on("connection.update", (update) => {
68
+ if (update.qr) {
69
+ conn.qr = update.qr;
70
+ conn.connected = false;
71
+ }
72
+ if (update.connection === "open") {
73
+ conn.connected = true;
74
+ conn.qr = null;
75
+ conn.reconnecting = false;
76
+ conn.reconnectAttempts = 0;
77
+ conn.lastConnectedAt = Date.now();
78
+ var rawId = sock.user?.id || "";
79
+ conn.user = { id: rawId.split(":")[0] || "", name: sock.user?.name || "" };
80
+ conn.selfE164 = conn.user.id;
81
+ conn.selfLid = sock.user?.lid?.split(":")[0] || "";
82
+ console.log(`[wa:${config.agentId.slice(0, 8)}] Connected as ${conn.user.id}`);
83
+ }
84
+ if (update.connection === "close") {
85
+ conn.connected = false;
86
+ conn.reconnecting = false;
87
+ var code = update.lastDisconnect?.error?.output?.statusCode;
88
+ if (code === DisconnectReason.loggedOut) {
89
+ console.log(`[wa:${config.agentId.slice(0, 8)}] Logged out \u2014 clearing auth & need re-link`);
90
+ connections.delete(config.agentId);
91
+ import("fs/promises").then((fs) => fs.rm(authDir, { recursive: true, force: true })).catch(() => {
92
+ });
93
+ } else {
94
+ conn.reconnectAttempts++;
95
+ var delay2 = Math.min(3e3 * Math.pow(1.5, conn.reconnectAttempts - 1), 6e4);
96
+ console.log(`[wa:${config.agentId.slice(0, 8)}] Disconnected (code=${code}), reconnect #${conn.reconnectAttempts} in ${Math.round(delay2 / 1e3)}s`);
97
+ setTimeout(() => createSocket(), delay2);
98
+ }
99
+ }
100
+ });
101
+ sock.ev.on("messages.upsert", async (m) => {
102
+ console.log(`[wa:${config.agentId.slice(0, 8)}] messages.upsert type=${m.type} count=${m.messages?.length} listeners=${conn.events.listenerCount("message")}`);
103
+ if (m.type !== "notify" && m.type !== "append") return;
104
+ for (var msg of m.messages) {
105
+ var remoteJid = msg.key?.remoteJid;
106
+ var fromMe = msg.key?.fromMe;
107
+ var text = msg.message?.conversation || msg.message?.extendedTextMessage?.text || "";
108
+ if (!remoteJid) continue;
109
+ if (remoteJid === "status@broadcast" || remoteJid.endsWith("@broadcast")) continue;
110
+ var isGroup = remoteJid.endsWith("@g.us");
111
+ var isSelfChat = !isGroup && (conn.selfE164 && remoteJid.includes(conn.selfE164) || conn.selfLid && remoteJid.includes(conn.selfLid) || remoteJid.endsWith("@lid"));
112
+ if (fromMe) {
113
+ if (isGroup) continue;
114
+ if (!isSelfChat) continue;
115
+ }
116
+ var mediaMessage = msg.message?.imageMessage || msg.message?.videoMessage || msg.message?.documentMessage || msg.message?.audioMessage || msg.message?.stickerMessage || null;
117
+ var hasMedia = !!mediaMessage;
118
+ if (!text && mediaMessage) {
119
+ text = mediaMessage.caption || "";
120
+ }
121
+ if (!text && !hasMedia) continue;
122
+ var senderJid = isGroup ? msg.key.participant : remoteJid;
123
+ console.log(`[wa:${config.agentId.slice(0, 8)}] Incoming from=${senderJid} group=${isGroup} selfChat=${!!isSelfChat} hasMedia=${hasMedia} text="${(text || "").slice(0, 50)}"`);
124
+ try {
125
+ await sock.sendPresenceUpdate("composing", remoteJid);
126
+ } catch {
127
+ }
128
+ var mediaPath;
129
+ var mediaType;
130
+ if (hasMedia && mediaMessage) {
131
+ try {
132
+ var { downloadMediaMessage } = await import("@whiskeysockets/baileys");
133
+ var buffer = await downloadMediaMessage(msg, "buffer", {});
134
+ if (buffer && buffer.length > 0) {
135
+ var { join: join2 } = await import("path");
136
+ var { mkdirSync, writeFileSync } = await import("fs");
137
+ var mediaDir = join2(config.dataDir || `/tmp/agents/${config.agentId}`, "media");
138
+ try {
139
+ mkdirSync(mediaDir, { recursive: true });
140
+ } catch {
141
+ }
142
+ mediaType = msg.message?.imageMessage ? "photo" : msg.message?.videoMessage ? "video" : msg.message?.audioMessage ? "audio" : msg.message?.documentMessage ? "document" : msg.message?.stickerMessage ? "sticker" : "file";
143
+ var ext = mediaType === "photo" ? "jpg" : mediaType === "video" ? "mp4" : mediaType === "audio" ? "ogg" : mediaType === "sticker" ? "webp" : mediaMessage.fileName?.split(".").pop() || "bin";
144
+ var localName = mediaMessage.fileName || `${mediaType}-${Date.now()}.${ext}`;
145
+ mediaPath = join2(mediaDir, localName);
146
+ writeFileSync(mediaPath, buffer);
147
+ console.log(`[wa:${config.agentId.slice(0, 8)}] Media downloaded: ${mediaPath} (${buffer.length} bytes)`);
148
+ }
149
+ } catch (dlErr) {
150
+ console.error(`[wa:${config.agentId.slice(0, 8)}] Media download failed: ${dlErr.message}`);
151
+ }
152
+ }
153
+ var finalText = text || "";
154
+ if (mediaPath) {
155
+ var desc = `[${mediaType}${mediaMessage?.fileName ? ": " + mediaMessage.fileName : ""}] saved to: ${mediaPath}`;
156
+ finalText = text ? `${text}
157
+
158
+ ${desc}` : desc;
159
+ } else if (hasMedia && !text) {
160
+ finalText = `[${mediaType || "media"} received but download failed]`;
161
+ }
162
+ conn.lastMessageAt = Date.now();
163
+ conn.events.emit("message", {
164
+ from: remoteJid,
165
+ senderJid,
166
+ pushName: msg.pushName,
167
+ text: finalText,
168
+ timestamp: msg.messageTimestamp,
169
+ hasMedia,
170
+ mediaPath,
171
+ mediaType,
172
+ messageId: msg.key.id,
173
+ isGroup,
174
+ isSelfChat: !!isSelfChat
175
+ });
176
+ }
177
+ });
178
+ conn.sock = sock;
179
+ } catch (err) {
180
+ conn.reconnecting = false;
181
+ console.error(`[wa:${config.agentId.slice(0, 8)}] Socket creation failed: ${err.message}`);
182
+ conn.reconnectAttempts++;
183
+ var delay = Math.min(5e3 * Math.pow(1.5, conn.reconnectAttempts - 1), 6e4);
184
+ setTimeout(() => createSocket(), delay);
185
+ }
186
+ };
187
+ connections.set(config.agentId, conn);
188
+ var handlers = pendingHandlers.get(config.agentId);
189
+ if (handlers && handlers.size > 0) {
190
+ console.log(`[wa:${config.agentId.slice(0, 8)}] Binding ${handlers.size} pending handler(s)`);
191
+ for (var h of handlers) conn.events.on("message", h);
192
+ }
193
+ await createSocket();
194
+ return conn;
195
+ }
196
+ async function autoStartConnections(agents) {
197
+ for (var agent of agents) {
198
+ try {
199
+ var config = { agentId: agent.id, dataDir: agent.dataDir };
200
+ if (await hasAuthState(config)) {
201
+ console.log(`[wa:${agent.id.slice(0, 8)}] Auth state found \u2014 auto-connecting`);
202
+ await getOrCreateConnection(config);
203
+ }
204
+ } catch (err) {
205
+ console.error(`[wa:${agent.id.slice(0, 8)}] Auto-start failed: ${err.message}`);
206
+ }
207
+ }
208
+ }
209
+ async function proxySend(agentId, body) {
210
+ var port = process.env.ENTERPRISE_PORT || "3100";
211
+ var payload = JSON.stringify(body);
212
+ try {
213
+ var resp = await fetch(`http://localhost:${port}/api/engine/bridge/agents/${agentId}/whatsapp/proxy-send`, {
214
+ method: "POST",
215
+ headers: { "Content-Type": "application/json" },
216
+ body: payload,
217
+ signal: AbortSignal.timeout(15e3)
218
+ });
219
+ var result = await resp.json();
220
+ return result;
221
+ } catch (err) {
222
+ return { error: `Proxy send failed: ${err.message}` };
223
+ }
224
+ }
225
+ function toJid(to) {
226
+ return to.includes("@") ? to : to.replace(/[^0-9]/g, "") + "@s.whatsapp.net";
227
+ }
228
+ function createWhatsAppTools(config) {
229
+ return [
230
+ {
231
+ name: "whatsapp_connect",
232
+ description: "Start WhatsApp connection. Returns QR code to scan.",
233
+ input_schema: { type: "object", properties: {}, required: [] },
234
+ execute: async (_id) => {
235
+ var conn = await getOrCreateConnection(config);
236
+ if (conn.connected) return { status: "connected", phone: conn.user?.id, name: conn.user?.name };
237
+ if (conn.qr) return { status: "awaiting_scan", qr: conn.qr };
238
+ for (var _i = 0; _i < 20; _i++) {
239
+ await new Promise((r) => setTimeout(r, 500));
240
+ if (conn.connected) return { status: "connected", phone: conn.user?.id, name: conn.user?.name };
241
+ if (conn.qr) return { status: "awaiting_scan", qr: conn.qr };
242
+ }
243
+ return { status: "connecting", message: "Connection started but QR not yet available. Poll /whatsapp/status." };
244
+ }
245
+ },
246
+ {
247
+ name: "whatsapp_status",
248
+ description: "Check connection status.",
249
+ input_schema: { type: "object", properties: {}, required: [] },
250
+ execute: async (_id) => {
251
+ var conn = connections.get(config.agentId);
252
+ if (!conn) return { connected: false };
253
+ return {
254
+ connected: conn.connected,
255
+ phone: conn.user?.id,
256
+ name: conn.user?.name,
257
+ hasQr: !!conn.qr,
258
+ reconnecting: conn.reconnecting,
259
+ reconnectAttempts: conn.reconnectAttempts,
260
+ lastConnectedAt: conn.lastConnectedAt,
261
+ lastMessageAt: conn.lastMessageAt
262
+ };
263
+ }
264
+ },
265
+ {
266
+ name: "whatsapp_send",
267
+ description: "Send a text message.",
268
+ input_schema: {
269
+ type: "object",
270
+ properties: { to: { type: "string" }, text: { type: "string" } },
271
+ required: ["to", "text"]
272
+ },
273
+ execute: async (_id, input) => {
274
+ var conn = connections.get(config.agentId);
275
+ if (conn?.connected) {
276
+ var jid = toJid(input.to);
277
+ try {
278
+ await conn?.sock?.sendPresenceUpdate("composing", jid);
279
+ } catch {
280
+ }
281
+ var r = await conn.sock.sendMessage(jid, { text: input.text });
282
+ try {
283
+ await conn?.sock?.sendPresenceUpdate("paused", jid);
284
+ } catch {
285
+ }
286
+ if (config.onOutbound) try {
287
+ config.onOutbound(input.to, input.text);
288
+ } catch {
289
+ }
290
+ return { ok: true, id: r?.key?.id };
291
+ }
292
+ return proxySend(config.agentId, { to: input.to, text: input.text });
293
+ }
294
+ },
295
+ {
296
+ name: "whatsapp_send_media",
297
+ description: "Send image, video, or document from a local file path.",
298
+ input_schema: {
299
+ type: "object",
300
+ properties: {
301
+ to: { type: "string" },
302
+ filePath: { type: "string" },
303
+ caption: { type: "string" },
304
+ type: { type: "string", description: "image|video|document (auto-detected from extension if omitted)" }
305
+ },
306
+ required: ["to", "filePath"]
307
+ },
308
+ execute: async (_id, input) => {
309
+ var conn = connections.get(config.agentId);
310
+ if (!conn?.connected) return { error: "Not connected." };
311
+ var buf = await readFile(input.filePath);
312
+ var ext = input.filePath.split(".").pop()?.toLowerCase() || "";
313
+ var type = input.type || (["mp4", "mov", "avi", "mkv", "webm"].includes(ext) ? "video" : ["pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "zip", "txt", "csv"].includes(ext) ? "document" : "image");
314
+ var msg = { caption: input.caption };
315
+ if (type === "video") {
316
+ msg.video = buf;
317
+ msg.mimetype = "video/mp4";
318
+ } else if (type === "document") {
319
+ msg.document = buf;
320
+ msg.fileName = input.filePath.split("/").pop();
321
+ } else {
322
+ msg.image = buf;
323
+ }
324
+ var r = await conn.sock.sendMessage(toJid(input.to), msg);
325
+ return { ok: true, type, id: r?.key?.id };
326
+ }
327
+ },
328
+ {
329
+ name: "whatsapp_get_groups",
330
+ description: "List WhatsApp groups.",
331
+ input_schema: { type: "object", properties: {}, required: [] },
332
+ execute: async (_id) => {
333
+ var conn = connections.get(config.agentId);
334
+ if (!conn?.connected) return { error: "Not connected." };
335
+ var groups = await conn.sock.groupFetchAllParticipating();
336
+ return { groups: Object.values(groups).slice(0, 50).map((g) => ({ id: g.id, name: g.subject, size: g.participants?.length })) };
337
+ }
338
+ },
339
+ {
340
+ name: "whatsapp_send_voice",
341
+ description: "Send a voice note from an audio file.",
342
+ input_schema: {
343
+ type: "object",
344
+ properties: { to: { type: "string" }, filePath: { type: "string" } },
345
+ required: ["to", "filePath"]
346
+ },
347
+ execute: async (_id, input) => {
348
+ var conn = connections.get(config.agentId);
349
+ if (!conn?.connected) return { error: "Not connected." };
350
+ var buf = await readFile(input.filePath);
351
+ var r = await conn.sock.sendMessage(toJid(input.to), { audio: buf, mimetype: "audio/ogg; codecs=opus", ptt: true });
352
+ return { ok: true, id: r?.key?.id };
353
+ }
354
+ },
355
+ {
356
+ name: "whatsapp_send_location",
357
+ description: "Send a GPS location.",
358
+ input_schema: {
359
+ type: "object",
360
+ properties: { to: { type: "string" }, lat: { type: "number" }, lng: { type: "number" }, name: { type: "string" }, address: { type: "string" } },
361
+ required: ["to", "lat", "lng"]
362
+ },
363
+ execute: async (_id, input) => {
364
+ var conn = connections.get(config.agentId);
365
+ if (!conn?.connected) return { error: "Not connected." };
366
+ var r = await conn.sock.sendMessage(toJid(input.to), { location: { degreesLatitude: input.lat, degreesLongitude: input.lng, name: input.name, address: input.address } });
367
+ return { ok: true, id: r?.key?.id };
368
+ }
369
+ },
370
+ {
371
+ name: "whatsapp_send_contact",
372
+ description: "Send a contact card.",
373
+ input_schema: {
374
+ type: "object",
375
+ properties: { to: { type: "string" }, name: { type: "string" }, phone: { type: "string" } },
376
+ required: ["to", "name", "phone"]
377
+ },
378
+ execute: async (_id, input) => {
379
+ var conn = connections.get(config.agentId);
380
+ if (!conn?.connected) return { error: "Not connected." };
381
+ var vcard = `BEGIN:VCARD
382
+ VERSION:3.0
383
+ FN:${input.name}
384
+ TEL;type=CELL:${input.phone}
385
+ END:VCARD`;
386
+ var r = await conn.sock.sendMessage(toJid(input.to), { contacts: { displayName: input.name, contacts: [{ vcard }] } });
387
+ return { ok: true, id: r?.key?.id };
388
+ }
389
+ },
390
+ {
391
+ name: "whatsapp_react",
392
+ description: "React to a message with an emoji.",
393
+ input_schema: {
394
+ type: "object",
395
+ properties: { chatId: { type: "string" }, messageId: { type: "string" }, emoji: { type: "string" } },
396
+ required: ["chatId", "messageId", "emoji"]
397
+ },
398
+ execute: async (_id, input) => {
399
+ var conn = connections.get(config.agentId);
400
+ if (!conn?.connected) return { error: "Not connected." };
401
+ await conn.sock.sendMessage(toJid(input.chatId), { react: { text: input.emoji, key: { remoteJid: toJid(input.chatId), id: input.messageId } } });
402
+ return { ok: true };
403
+ }
404
+ },
405
+ {
406
+ name: "whatsapp_typing",
407
+ description: "Show typing indicator in a chat.",
408
+ input_schema: {
409
+ type: "object",
410
+ properties: { chatId: { type: "string" }, duration: { type: "number", description: "Seconds (default 3)" } },
411
+ required: ["chatId"]
412
+ },
413
+ execute: async (_id, input) => {
414
+ var conn = connections.get(config.agentId);
415
+ if (!conn?.connected) return { error: "Not connected." };
416
+ await conn?.sock?.sendPresenceUpdate("composing", toJid(input.chatId));
417
+ setTimeout(async () => {
418
+ try {
419
+ await conn?.sock?.sendPresenceUpdate("paused", toJid(input.chatId));
420
+ } catch {
421
+ }
422
+ }, (input.duration || 3) * 1e3);
423
+ return { ok: true };
424
+ }
425
+ },
426
+ {
427
+ name: "whatsapp_read_receipts",
428
+ description: "Mark messages as read in a chat.",
429
+ input_schema: {
430
+ type: "object",
431
+ properties: { chatId: { type: "string" }, messageIds: { type: "array", items: { type: "string" } } },
432
+ required: ["chatId"]
433
+ },
434
+ execute: async (_id, input) => {
435
+ var conn = connections.get(config.agentId);
436
+ if (!conn?.connected) return { error: "Not connected." };
437
+ var jid = toJid(input.chatId);
438
+ if (input.messageIds?.length) {
439
+ await conn.sock.readMessages(input.messageIds.map((id) => ({ remoteJid: jid, id })));
440
+ }
441
+ return { ok: true };
442
+ }
443
+ },
444
+ {
445
+ name: "whatsapp_profile",
446
+ description: "Get or set profile info (name, status, picture).",
447
+ input_schema: {
448
+ type: "object",
449
+ properties: {
450
+ action: { type: "string", description: "get|set_name|set_status|set_picture" },
451
+ value: { type: "string" },
452
+ of: { type: "string" }
453
+ },
454
+ required: ["action"]
455
+ },
456
+ execute: async (_id, input) => {
457
+ var conn = connections.get(config.agentId);
458
+ if (!conn?.connected) return { error: "Not connected." };
459
+ if (input.action === "get") {
460
+ var jid = input.of ? toJid(input.of) : conn.sock.user?.id;
461
+ var status = await conn.sock.fetchStatus(jid).catch(() => null);
462
+ var pic = await conn.sock.profilePictureUrl(jid, "image").catch(() => null);
463
+ return { status: status?.status, setAt: status?.setAt, pictureUrl: pic };
464
+ }
465
+ if (input.action === "set_name") {
466
+ await conn.sock.updateProfileName(input.value);
467
+ return { ok: true };
468
+ }
469
+ if (input.action === "set_status") {
470
+ await conn.sock.updateProfileStatus(input.value);
471
+ return { ok: true };
472
+ }
473
+ if (input.action === "set_picture") {
474
+ var buf = await readFile(input.value);
475
+ await conn.sock.updateProfilePicture(conn.sock.user?.id, buf);
476
+ return { ok: true };
477
+ }
478
+ return { error: "Unknown action" };
479
+ }
480
+ },
481
+ {
482
+ name: "whatsapp_group_manage",
483
+ description: "Manage WhatsApp groups.",
484
+ input_schema: {
485
+ type: "object",
486
+ properties: {
487
+ action: { type: "string", description: "create|add|remove|info|set_name|set_description|leave" },
488
+ groupId: { type: "string" },
489
+ name: { type: "string" },
490
+ description: { type: "string" },
491
+ members: { type: "array", items: { type: "string" } }
492
+ },
493
+ required: ["action"]
494
+ },
495
+ execute: async (_id, input) => {
496
+ var conn = connections.get(config.agentId);
497
+ if (!conn?.connected) return { error: "Not connected." };
498
+ if (input.action === "create") {
499
+ var r = await conn.sock.groupCreate(input.name || "New Group", (input.members || []).map(toJid));
500
+ return { ok: true, groupId: r.id, name: r.subject };
501
+ }
502
+ if (input.action === "info") {
503
+ var meta = await conn.sock.groupMetadata(input.groupId);
504
+ return { id: meta.id, name: meta.subject, description: meta.desc, size: meta.participants?.length, participants: meta.participants?.slice(0, 50).map((p) => ({ id: p.id, admin: p.admin })) };
505
+ }
506
+ if (input.action === "add") {
507
+ await conn.sock.groupParticipantsUpdate(input.groupId, (input.members || []).map(toJid), "add");
508
+ return { ok: true };
509
+ }
510
+ if (input.action === "remove") {
511
+ await conn.sock.groupParticipantsUpdate(input.groupId, (input.members || []).map(toJid), "remove");
512
+ return { ok: true };
513
+ }
514
+ if (input.action === "set_name") {
515
+ await conn.sock.groupUpdateSubject(input.groupId, input.name);
516
+ return { ok: true };
517
+ }
518
+ if (input.action === "set_description") {
519
+ await conn.sock.groupUpdateDescription(input.groupId, input.description);
520
+ return { ok: true };
521
+ }
522
+ if (input.action === "leave") {
523
+ await conn.sock.groupLeave(input.groupId);
524
+ return { ok: true };
525
+ }
526
+ return { error: "Unknown action" };
527
+ }
528
+ },
529
+ {
530
+ name: "whatsapp_delete_message",
531
+ description: "Delete a sent message.",
532
+ input_schema: {
533
+ type: "object",
534
+ properties: { chatId: { type: "string" }, messageId: { type: "string" } },
535
+ required: ["chatId", "messageId"]
536
+ },
537
+ execute: async (_id, input) => {
538
+ var conn = connections.get(config.agentId);
539
+ if (!conn?.connected) return { error: "Not connected." };
540
+ await conn.sock.sendMessage(toJid(input.chatId), { delete: { remoteJid: toJid(input.chatId), id: input.messageId, fromMe: true } });
541
+ return { ok: true };
542
+ }
543
+ },
544
+ {
545
+ name: "whatsapp_disconnect",
546
+ description: "Disconnect. Set logout=true to unlink device.",
547
+ input_schema: {
548
+ type: "object",
549
+ properties: { logout: { type: "boolean" } },
550
+ required: []
551
+ },
552
+ execute: async (_id, input) => {
553
+ var conn = connections.get(config.agentId);
554
+ if (!conn?.sock) return { ok: true };
555
+ if (input?.logout) await conn.sock.logout();
556
+ else conn.sock.end(void 0);
557
+ connections.delete(config.agentId);
558
+ return { ok: true, loggedOut: !!input?.logout };
559
+ }
560
+ }
561
+ ];
562
+ }
563
+ function getConnection(agentId, mode) {
564
+ var key = mode === "business" ? "biz-" + agentId : agentId;
565
+ return connections.get(key);
566
+ }
567
+ function getWhatsAppQR(agentId) {
568
+ return connections.get(agentId)?.qr || null;
569
+ }
570
+ function isWhatsAppConnected(agentId) {
571
+ return connections.get(agentId)?.connected || false;
572
+ }
573
+ function onWhatsAppMessage(agentId, handler) {
574
+ var conn = connections.get(agentId);
575
+ if (conn) {
576
+ conn.events.on("message", handler);
577
+ }
578
+ if (!pendingHandlers.has(agentId)) pendingHandlers.set(agentId, /* @__PURE__ */ new Set());
579
+ pendingHandlers.get(agentId).add(handler);
580
+ return () => {
581
+ var c = connections.get(agentId);
582
+ if (c) c.events.off("message", handler);
583
+ pendingHandlers.get(agentId)?.delete(handler);
584
+ };
585
+ }
586
+ async function sendTestMessage(agentId, to) {
587
+ var conn = connections.get(agentId);
588
+ if (!conn?.connected) return { ok: false, error: "Not connected" };
589
+ try {
590
+ await conn.sock.sendMessage(toJid(to), { text: "\u2705 Test message from AgenticMail \u2014 WhatsApp connection is working!" });
591
+ return { ok: true };
592
+ } catch (err) {
593
+ return { ok: false, error: err.message };
594
+ }
595
+ }
596
+ function getActiveWhatsAppAgents() {
597
+ return Array.from(connections.entries()).filter(([_, c]) => c.connected).map(([id]) => id);
598
+ }
599
+ function getConnectionStatus(agentId) {
600
+ var conn = connections.get(agentId);
601
+ if (!conn) return { connected: false, hasAuth: false };
602
+ return {
603
+ connected: conn.connected,
604
+ phone: conn.user?.id,
605
+ name: conn.user?.name,
606
+ hasQr: !!conn.qr,
607
+ qr: conn.qr,
608
+ reconnecting: conn.reconnecting,
609
+ reconnectAttempts: conn.reconnectAttempts,
610
+ lastConnectedAt: conn.lastConnectedAt,
611
+ lastMessageAt: conn.lastMessageAt
612
+ };
613
+ }
614
+ var connections, pendingHandlers;
615
+ var init_whatsapp = __esm({
616
+ "src/agent-tools/tools/messaging/whatsapp.ts"() {
617
+ connections = /* @__PURE__ */ new Map();
618
+ pendingHandlers = /* @__PURE__ */ new Map();
619
+ }
620
+ });
621
+
622
+ export {
623
+ hasAuthState,
624
+ getOrCreateConnection,
625
+ autoStartConnections,
626
+ toJid,
627
+ createWhatsAppTools,
628
+ getConnection,
629
+ getWhatsAppQR,
630
+ isWhatsAppConnected,
631
+ onWhatsAppMessage,
632
+ sendTestMessage,
633
+ getActiveWhatsAppAgents,
634
+ getConnectionStatus,
635
+ init_whatsapp
636
+ };