@link-os/whatsapp 0.1.0 → 0.1.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/dist/client.d.ts +24 -0
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +261 -64
  4. package/dist/client.js.map +1 -1
  5. package/dist/normalize.d.ts +17 -0
  6. package/dist/normalize.d.ts.map +1 -0
  7. package/dist/normalize.js +61 -0
  8. package/dist/normalize.js.map +1 -0
  9. package/package.json +2 -2
  10. package/src/client.ts +291 -67
  11. package/src/normalize.ts +70 -0
  12. package/tsconfig.tsbuildinfo +1 -1
  13. package/auth_info_baileys/app-state-sync-key-AAAAANpA.json +0 -1
  14. package/auth_info_baileys/app-state-sync-key-AAAAANpB.json +0 -1
  15. package/auth_info_baileys/app-state-sync-key-AAAAANpC.json +0 -1
  16. package/auth_info_baileys/app-state-sync-key-AAAAANpD.json +0 -1
  17. package/auth_info_baileys/app-state-sync-key-AAAAANpE.json +0 -1
  18. package/auth_info_baileys/app-state-sync-key-AAAAANpF.json +0 -1
  19. package/auth_info_baileys/app-state-sync-key-AAAAANpG.json +0 -1
  20. package/auth_info_baileys/app-state-sync-key-AAAAANpI.json +0 -1
  21. package/auth_info_baileys/app-state-sync-key-AAAAANpJ.json +0 -1
  22. package/auth_info_baileys/app-state-sync-key-ADMAANpI.json +0 -1
  23. package/auth_info_baileys/app-state-sync-version-regular_low.json +0 -1
  24. package/auth_info_baileys/creds.json +0 -1
  25. package/auth_info_baileys/pre-key-1.json +0 -1
  26. package/auth_info_baileys/pre-key-10.json +0 -1
  27. package/auth_info_baileys/pre-key-11.json +0 -1
  28. package/auth_info_baileys/pre-key-12.json +0 -1
  29. package/auth_info_baileys/pre-key-13.json +0 -1
  30. package/auth_info_baileys/pre-key-14.json +0 -1
  31. package/auth_info_baileys/pre-key-15.json +0 -1
  32. package/auth_info_baileys/pre-key-16.json +0 -1
  33. package/auth_info_baileys/pre-key-17.json +0 -1
  34. package/auth_info_baileys/pre-key-18.json +0 -1
  35. package/auth_info_baileys/pre-key-19.json +0 -1
  36. package/auth_info_baileys/pre-key-2.json +0 -1
  37. package/auth_info_baileys/pre-key-20.json +0 -1
  38. package/auth_info_baileys/pre-key-22.json +0 -1
  39. package/auth_info_baileys/pre-key-23.json +0 -1
  40. package/auth_info_baileys/pre-key-24.json +0 -1
  41. package/auth_info_baileys/pre-key-25.json +0 -1
  42. package/auth_info_baileys/pre-key-26.json +0 -1
  43. package/auth_info_baileys/pre-key-27.json +0 -1
  44. package/auth_info_baileys/pre-key-28.json +0 -1
  45. package/auth_info_baileys/pre-key-29.json +0 -1
  46. package/auth_info_baileys/pre-key-3.json +0 -1
  47. package/auth_info_baileys/pre-key-30.json +0 -1
  48. package/auth_info_baileys/pre-key-4.json +0 -1
  49. package/auth_info_baileys/pre-key-5.json +0 -1
  50. package/auth_info_baileys/pre-key-6.json +0 -1
  51. package/auth_info_baileys/pre-key-7.json +0 -1
  52. package/auth_info_baileys/pre-key-8.json +0 -1
  53. package/auth_info_baileys/pre-key-9.json +0 -1
  54. package/auth_info_baileys/session-918477881793.0.json +0 -1
package/dist/client.d.ts CHANGED
@@ -1,7 +1,14 @@
1
1
  import type { PlatformClient } from '@link-os/types';
2
+ export interface AllowedContext {
3
+ allowedJid: string;
4
+ name: string;
5
+ type: string;
6
+ image?: string;
7
+ }
2
8
  export interface WhatsAppClientOptions {
3
9
  sessionId: string;
4
10
  authDir?: string;
11
+ allowedContexts?: AllowedContext[];
5
12
  }
6
13
  export declare class WhatsAppClient implements PlatformClient {
7
14
  readonly platform: "whatsapp";
@@ -12,11 +19,28 @@ export declare class WhatsAppClient implements PlatformClient {
12
19
  private messageHandler?;
13
20
  private statusHandler?;
14
21
  private stopped;
22
+ private isStarting;
23
+ private reconnectAttempts;
24
+ private maxReconnectAttempts;
25
+ private resetTimeout;
26
+ private allowedJids;
15
27
  constructor(options: WhatsAppClientOptions);
16
28
  on(event: 'message' | 'status', handler: any): void;
17
29
  start(): Promise<void>;
18
30
  private extractMessageContent;
19
31
  sendMessage(to: string, text: string): Promise<void>;
32
+ startTyping(jid: string): Promise<void>;
33
+ stopTyping(jid: string): Promise<void>;
34
+ reactToMessage(jid: string, key: any, emoji: string): Promise<void>;
35
+ markRead(jid: string, key: any): Promise<void>;
36
+ updateConfiguration(config: Partial<WhatsAppClientOptions>): Promise<void>;
20
37
  stop(): Promise<void>;
38
+ deleteSession(): Promise<void>;
39
+ getAvailableContexts(): Promise<{
40
+ id: string;
41
+ name: string;
42
+ type: 'group' | 'user';
43
+ image?: string;
44
+ }[]>;
21
45
  }
22
46
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAA4B,MAAM,gBAAgB,CAAC;AAI/E,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAe,YAAW,cAAc;IACjD,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IACxC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAA2G;IACzH,OAAO,CAAC,cAAc,CAAC,CAA6C;IACpE,OAAO,CAAC,aAAa,CAAC,CAAiD;IACvE,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,qBAAqB;IAO1C,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;IAQ7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4G5B,OAAO,CAAC,qBAAqB;IAcvB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAO9B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAA4B,MAAM,gBAAgB,CAAC;AAK/E,MAAM,WAAW,cAAc;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACtC;AAED,qBAAa,cAAe,YAAW,cAAc;IACjD,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IACxC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAA2G;IACzH,OAAO,CAAC,cAAc,CAAC,CAA6C;IACpE,OAAO,CAAC,aAAa,CAAC,CAAiD;IACvE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,WAAW,CAAgB;gBAIvB,OAAO,EAAE,qBAAqB;IAgB1C,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;IAQ7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6N5B,OAAO,CAAC,qBAAqB;IAcvB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAa9B,oBAAoB,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAgChH"}
package/dist/client.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import makeWASocket, { DisconnectReason, useMultiFileAuthState, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, } from '@whiskeysockets/baileys';
3
3
  import qrcode from 'qrcode-terminal';
4
4
  import pino from 'pino';
5
+ import { normalizeWhatsAppTarget } from './normalize.js';
5
6
  const VERSION = '0.1.0';
6
7
  export class WhatsAppClient {
7
8
  platform = 'whatsapp';
@@ -12,11 +13,27 @@ export class WhatsAppClient {
12
13
  messageHandler;
13
14
  statusHandler;
14
15
  stopped = false;
16
+ isStarting = false;
17
+ reconnectAttempts = 0;
18
+ maxReconnectAttempts = 3;
19
+ resetTimeout = null;
20
+ allowedJids = [];
21
+ // TODO: Implement persistent storage to save contacts across restarts.
22
+ // Currently, contacts are only in-memory and lost on restart.
15
23
  constructor(options) {
16
24
  this.options = {
17
25
  authDir: options.authDir || `.auth/whatsapp/${options.sessionId}`,
18
26
  ...options
19
27
  };
28
+ // Initialize allowedJids from allowedContexts
29
+ if (options.allowedContexts && options.allowedContexts.length > 0) {
30
+ this.allowedJids = options.allowedContexts
31
+ .map(ctx => normalizeWhatsAppTarget(ctx.allowedJid))
32
+ .filter((jid) => !!jid);
33
+ }
34
+ else {
35
+ this.allowedJids = [];
36
+ }
20
37
  }
21
38
  on(event, handler) {
22
39
  if (event === 'message') {
@@ -27,70 +44,120 @@ export class WhatsAppClient {
27
44
  }
28
45
  }
29
46
  async start() {
47
+ if (this.isStarting) {
48
+ return;
49
+ }
50
+ this.isStarting = true;
30
51
  this.stopped = false;
31
- const { state, saveCreds } = await useMultiFileAuthState(this.options.authDir);
32
- const { version } = await fetchLatestBaileysVersion();
33
- console.log(`Using Baileys version: ${version.join('.')}`);
34
- this.sock = makeWASocket.default ? makeWASocket.default({
35
- auth: {
36
- creds: state.creds,
37
- keys: makeCacheableSignalKeyStore(state.keys, this.logger),
38
- },
39
- version,
40
- logger: this.logger,
41
- printQRInTerminal: false,
42
- browser: ['linkos', 'cli', VERSION],
43
- syncFullHistory: false,
44
- markOnlineOnConnect: false,
45
- shouldIgnoreJid: (jid) => jid.includes('@broadcast') || jid.includes('@newsletter')
46
- }) : makeWASocket({
47
- auth: {
48
- creds: state.creds,
49
- keys: makeCacheableSignalKeyStore(state.keys, this.logger),
50
- },
51
- version,
52
- logger: this.logger,
53
- printQRInTerminal: false,
54
- browser: ['linkos', 'cli', VERSION],
55
- syncFullHistory: false,
56
- markOnlineOnConnect: false,
57
- shouldIgnoreJid: (jid) => jid.includes('@broadcast') || jid.includes('@newsletter')
58
- });
59
- if (this.sock.ws && typeof this.sock.ws.on === 'function') {
60
- this.sock.ws.on('error', (err) => {
61
- console.error('WebSocket error:', err.message);
62
- });
52
+ // Clear any pending reset
53
+ if (this.resetTimeout) {
54
+ clearTimeout(this.resetTimeout);
55
+ this.resetTimeout = null;
63
56
  }
64
- this.sock.ev.on('connection.update', async (update) => {
65
- const { connection, lastDisconnect, qr } = update;
66
- if (qr) {
67
- console.log('\n📱 Scan this QR code with WhatsApp (Linked Devices):\n');
68
- qrcode.generate(qr, { small: true });
69
- if (this.statusHandler) {
70
- this.statusHandler({ type: 'qr', data: qr });
71
- }
57
+ try {
58
+ console.log(`[WhatsAppClient] Initializing auth state for ${this.options.sessionId}...`);
59
+ const { state, saveCreds } = await useMultiFileAuthState(this.options.authDir);
60
+ console.log(`[WhatsAppClient] Fetching latest Baileys version...`);
61
+ const { version } = await fetchLatestBaileysVersion();
62
+ console.log(`Using Baileys version: ${version.join('.')}`);
63
+ // ... (rest of start)
64
+ if (this.allowedJids.length > 0) {
65
+ console.log(`🔒 Allowlist enabled: ${this.allowedJids.length} IDs allowed.`);
72
66
  }
73
- if (connection === 'close') {
74
- const statusCode = lastDisconnect?.error?.output?.statusCode;
75
- const shouldReconnect = statusCode !== DisconnectReason.loggedOut;
76
- console.log(`Connection closed. Status: ${statusCode}, Will reconnect: ${shouldReconnect}`);
77
- if (shouldReconnect && !this.reconnecting && !this.stopped) {
78
- this.reconnecting = true;
79
- console.log('Reconnecting in 5 seconds...');
80
- setTimeout(() => {
81
- this.reconnecting = false;
82
- this.start();
83
- }, 5000);
84
- }
67
+ this.sock = makeWASocket.default ? makeWASocket.default({
68
+ auth: {
69
+ creds: state.creds,
70
+ keys: makeCacheableSignalKeyStore(state.keys, this.logger),
71
+ },
72
+ version,
73
+ logger: this.logger,
74
+ printQRInTerminal: false,
75
+ browser: ['Ubuntu', 'Chrome', '20.0.04'],
76
+ syncFullHistory: true, // Recommended for better desktop state emulation
77
+ markOnlineOnConnect: false,
78
+ }) : makeWASocket({
79
+ auth: {
80
+ creds: state.creds,
81
+ keys: makeCacheableSignalKeyStore(state.keys, this.logger),
82
+ },
83
+ version,
84
+ logger: this.logger,
85
+ printQRInTerminal: false,
86
+ browser: ['Ubuntu', 'Chrome', '20.0.04'],
87
+ syncFullHistory: true,
88
+ markOnlineOnConnect: false,
89
+ });
90
+ if (this.sock.ws && typeof this.sock.ws.on === 'function') {
91
+ this.sock.ws.on('error', (err) => {
92
+ console.error('WebSocket error:', err.message);
93
+ });
85
94
  }
86
- else if (connection === 'open') {
87
- console.log('✅ Connected to WhatsApp');
88
- if (this.statusHandler) {
89
- this.statusHandler({ type: 'connected' });
95
+ this.sock.ev.on('connection.update', async (update) => {
96
+ const { connection, lastDisconnect, qr } = update;
97
+ if (qr) {
98
+ console.log('\n📱 Scan this QR code with WhatsApp (Linked Devices):\n');
99
+ qrcode.generate(qr, { small: true });
100
+ if (this.statusHandler) {
101
+ this.statusHandler({ type: 'qr', data: qr });
102
+ }
103
+ }
104
+ if (connection === 'close') {
105
+ const statusCode = lastDisconnect?.error?.output?.statusCode;
106
+ const shouldReconnect = statusCode !== DisconnectReason.loggedOut;
107
+ console.log(`Connection closed. Status: ${statusCode}, Will reconnect: ${shouldReconnect}`);
108
+ if (this.resetTimeout) {
109
+ clearTimeout(this.resetTimeout);
110
+ this.resetTimeout = null;
111
+ }
112
+ if (shouldReconnect && !this.reconnecting && !this.stopped) {
113
+ if (this.reconnectAttempts < this.maxReconnectAttempts) {
114
+ this.reconnectAttempts++;
115
+ this.reconnecting = true;
116
+ if (this.statusHandler) {
117
+ this.statusHandler({ type: 'reconnecting', data: { attempt: this.reconnectAttempts, max: this.maxReconnectAttempts } });
118
+ }
119
+ console.log(`Reconnecting (Attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}) in 5 seconds...`);
120
+ setTimeout(() => {
121
+ this.reconnecting = false;
122
+ this.start();
123
+ }, 5000);
124
+ }
125
+ else {
126
+ console.error(`[WhatsApp] Max reconnection attempts (${this.maxReconnectAttempts}) reached. Stopping.`);
127
+ if (this.statusHandler) {
128
+ this.statusHandler({ type: 'disconnected', data: { reason: 'max_retries' } });
129
+ }
130
+ this.stop();
131
+ }
132
+ }
133
+ else if (this.statusHandler && !shouldReconnect) {
134
+ this.statusHandler({ type: 'disconnected' });
135
+ }
136
+ }
137
+ else if (connection === 'open') {
138
+ console.log('✅ Connected to WhatsApp');
139
+ this.isStarting = false;
140
+ // Only reset attempts after 10 seconds of stable connection
141
+ if (this.resetTimeout)
142
+ clearTimeout(this.resetTimeout);
143
+ this.resetTimeout = setTimeout(() => {
144
+ this.reconnectAttempts = 0;
145
+ this.resetTimeout = null;
146
+ }, 10000);
147
+ if (this.statusHandler) {
148
+ this.statusHandler({ type: 'connected' });
149
+ }
90
150
  }
151
+ });
152
+ this.sock.ev.on('creds.update', saveCreds);
153
+ }
154
+ catch (error) {
155
+ this.isStarting = false;
156
+ console.error('[WhatsApp] Failed to start:', error);
157
+ if (this.statusHandler) {
158
+ this.statusHandler({ type: 'error', data: error });
91
159
  }
92
- });
93
- this.sock.ev.on('creds.update', saveCreds);
160
+ }
94
161
  this.sock.ev.on('messages.upsert', async ({ messages, type }) => {
95
162
  if (type !== 'notify')
96
163
  return;
@@ -99,26 +166,75 @@ export class WhatsAppClient {
99
166
  continue;
100
167
  if (msg.key.remoteJid === 'status@broadcast')
101
168
  continue;
169
+ const remoteJid = msg.key.remoteJid;
170
+ const participant = msg.key.participant || remoteJid;
171
+ const isGroup = remoteJid?.endsWith('@g.us') || false;
172
+ // Allowlist Check
173
+ if (this.allowedJids.length > 0) {
174
+ const isAllowed = this.allowedJids.some(allowed => remoteJid?.includes(allowed) || participant?.includes(allowed));
175
+ if (!isAllowed) {
176
+ // console.log(`🚫 Ignoring message from unauthorized source: ${remoteJid}`);
177
+ continue;
178
+ }
179
+ }
180
+ // Group Mention Policy: Only respond if tagged
181
+ if (isGroup && this.sock?.user?.id) {
182
+ const botJid = normalizeWhatsAppTarget(this.sock.user.id);
183
+ const botLid = this.sock.user.lid ? normalizeWhatsAppTarget(this.sock.user.lid) : null;
184
+ const message = msg.message;
185
+ const contextInfo = message?.extendedTextMessage?.contextInfo ||
186
+ message?.imageMessage?.contextInfo ||
187
+ message?.videoMessage?.contextInfo ||
188
+ message?.documentMessage?.contextInfo ||
189
+ message?.audioMessage?.contextInfo ||
190
+ message?.contextInfo;
191
+ const mentions = contextInfo?.mentionedJid || [];
192
+ // Normalize all mentions and the bot ID for comparison
193
+ const isMentioned = mentions.some((m) => {
194
+ const normM = normalizeWhatsAppTarget(m);
195
+ const match = (botJid && normM === botJid) ||
196
+ (botLid && normM === botLid) ||
197
+ m === this.sock.user.id ||
198
+ (this.sock.user.lid && m === this.sock.user.lid);
199
+ return match;
200
+ });
201
+ // Check if it's a reply to the bot
202
+ const quotedParticipant = contextInfo?.participant;
203
+ const isReplyToBot = quotedParticipant && (normalizeWhatsAppTarget(quotedParticipant) === botJid ||
204
+ normalizeWhatsAppTarget(quotedParticipant) === botLid ||
205
+ quotedParticipant === this.sock.user.id ||
206
+ (this.sock.user.lid && quotedParticipant === this.sock.user.lid));
207
+ if (!isMentioned && !isReplyToBot) {
208
+ continue;
209
+ }
210
+ }
102
211
  const content = this.extractMessageContent(msg);
103
212
  if (!content)
104
213
  continue;
105
214
  if (!this.messageHandler)
106
215
  continue;
107
- const isGroup = msg.key.remoteJid?.endsWith('@g.us') || false;
108
216
  const unifiedMessage = {
109
217
  id: msg.key.id || `wa_${Date.now()}`,
110
218
  platform: 'whatsapp',
111
- userId: msg.key.remoteJid?.replace('@s.whatsapp.net', '') || '',
219
+ userId: remoteJid || '',
112
220
  sessionId: this.options.sessionId,
113
221
  content,
114
222
  messageType: 'text',
115
223
  timestamp: new Date(msg.messageTimestamp * 1000),
116
224
  metadata: {
117
- pushName: msg.pushName,
118
- jid: msg.key.remoteJid,
119
- isGroup
225
+ pushName: msg.pushName || 'Unknown User',
226
+ isGroup,
227
+ participant: isGroup ? participant : undefined,
228
+ jid: remoteJid
120
229
  }
121
230
  };
231
+ // Typing indicator (optional, but keep for UX if stable)
232
+ try {
233
+ // Only start typing if jid is valid
234
+ if (remoteJid)
235
+ await this.startTyping(remoteJid);
236
+ }
237
+ catch (e) { /* ignore */ }
122
238
  await this.messageHandler(unifiedMessage);
123
239
  }
124
240
  });
@@ -144,15 +260,96 @@ export class WhatsAppClient {
144
260
  async sendMessage(to, text) {
145
261
  if (!this.sock)
146
262
  throw new Error('Not connected');
147
- const jid = to.includes('@') ? to : `${to}@s.whatsapp.net`;
263
+ const jid = normalizeWhatsAppTarget(to);
264
+ if (!jid) {
265
+ console.error(`[WhatsApp] Invalid message target: ${to}`);
266
+ return;
267
+ }
148
268
  await this.sock.sendMessage(jid, { text });
149
269
  }
270
+ async startTyping(jid) {
271
+ if (!this.sock)
272
+ return;
273
+ await this.sock.sendPresenceUpdate('composing', jid);
274
+ }
275
+ async stopTyping(jid) {
276
+ if (!this.sock)
277
+ return;
278
+ await this.sock.sendPresenceUpdate('paused', jid);
279
+ }
280
+ async reactToMessage(jid, key, emoji) {
281
+ if (!this.sock)
282
+ return;
283
+ await this.sock.sendMessage(jid, { react: { text: emoji, key } });
284
+ }
285
+ async markRead(jid, key) {
286
+ if (!this.sock)
287
+ return;
288
+ await this.sock.readMessages([key]);
289
+ }
290
+ async updateConfiguration(config) {
291
+ if (config.allowedContexts) {
292
+ this.allowedJids = config.allowedContexts
293
+ .map(ctx => normalizeWhatsAppTarget(ctx.allowedJid))
294
+ .filter((jid) => !!jid);
295
+ console.log(`🔄 Configuration updated: Allowlist now has ${this.allowedJids.length} normalized IDs.`);
296
+ }
297
+ }
150
298
  async stop() {
151
299
  this.stopped = true;
300
+ this.isStarting = false;
301
+ if (this.resetTimeout) {
302
+ clearTimeout(this.resetTimeout);
303
+ this.resetTimeout = null;
304
+ }
152
305
  if (this.sock) {
153
306
  this.sock.end(undefined);
154
307
  this.sock = null;
155
308
  }
156
309
  }
310
+ async deleteSession() {
311
+ await this.stop();
312
+ if (this.options.authDir) {
313
+ const fs = await import('fs/promises');
314
+ try {
315
+ await fs.rm(this.options.authDir, { recursive: true, force: true });
316
+ console.log(`Deleted session directory: ${this.options.authDir}`);
317
+ }
318
+ catch (error) {
319
+ console.error(`Failed to delete session directory: ${error.message}`);
320
+ }
321
+ }
322
+ }
323
+ async getAvailableContexts() {
324
+ if (!this.sock)
325
+ return [];
326
+ const contexts = [];
327
+ try {
328
+ // 1. Groups from direct fetch (most reliable for groups)
329
+ const groups = await this.sock.groupFetchAllParticipating();
330
+ for (const [id, metadata] of Object.entries(groups)) {
331
+ contexts.push({
332
+ id,
333
+ name: metadata.subject || 'Unknown Group',
334
+ type: 'group'
335
+ });
336
+ }
337
+ }
338
+ catch (error) {
339
+ console.error('Failed to fetch contexts:', error);
340
+ }
341
+ // Fetch Profile Pictures (best effort, parallel)
342
+ await Promise.all(contexts.map(async (ctx) => {
343
+ try {
344
+ // Only fetch if we don't have one or to refresh
345
+ ctx.image = await this.sock.profilePictureUrl(ctx.id, 'preview');
346
+ }
347
+ catch (e) {
348
+ // Ignore error (no profile pic or privacy restricted)
349
+ ctx.image = undefined;
350
+ }
351
+ }));
352
+ return contexts;
353
+ }
157
354
  }
158
355
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * WhatsApp JID Normalization following OpenClaw/Baileys patterns.
3
+ */
4
+ /**
5
+ * Clean phone numbers to digits only.
6
+ */
7
+ export declare function normalizeE164(value: string): string;
8
+ /**
9
+ * Check if the JID belongs to a group.
10
+ */
11
+ export declare function isWhatsAppGroupJid(value: string): boolean;
12
+ /**
13
+ * Normalize input string into a valid Baileys JID.
14
+ * Handles phone numbers, group IDs, and existing JIDs with device suffixes.
15
+ */
16
+ export declare function normalizeWhatsAppTarget(value: string): string | null;
17
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAaD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BpE"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * WhatsApp JID Normalization following OpenClaw/Baileys patterns.
3
+ */
4
+ const WHATSAPP_USER_JID_RE = /^(\d+)(?::\d+)?@s\.whatsapp\.net$/i;
5
+ const WHATSAPP_LID_RE = /^(\d+)(?::\d+)?@lid$/i;
6
+ /**
7
+ * Clean phone numbers to digits only.
8
+ */
9
+ export function normalizeE164(value) {
10
+ return value.replace(/\D/g, "");
11
+ }
12
+ function stripWhatsAppTargetPrefixes(value) {
13
+ let candidate = value.trim();
14
+ for (;;) {
15
+ const before = candidate;
16
+ candidate = candidate.replace(/^whatsapp:/i, "").trim();
17
+ if (candidate === before) {
18
+ return candidate;
19
+ }
20
+ }
21
+ }
22
+ /**
23
+ * Check if the JID belongs to a group.
24
+ */
25
+ export function isWhatsAppGroupJid(value) {
26
+ const candidate = stripWhatsAppTargetPrefixes(value);
27
+ const lower = candidate.toLowerCase();
28
+ return lower.endsWith("@g.us");
29
+ }
30
+ /**
31
+ * Normalize input string into a valid Baileys JID.
32
+ * Handles phone numbers, group IDs, and existing JIDs with device suffixes.
33
+ */
34
+ export function normalizeWhatsAppTarget(value) {
35
+ const candidate = stripWhatsAppTargetPrefixes(value);
36
+ if (!candidate)
37
+ return null;
38
+ // Handle Groups
39
+ if (isWhatsAppGroupJid(candidate)) {
40
+ const localPart = candidate.slice(0, candidate.length - "@g.us".length);
41
+ return `${localPart}@g.us`;
42
+ }
43
+ // Handle standard user JIDs (strip device suffixes like :5)
44
+ if (WHATSAPP_USER_JID_RE.test(candidate)) {
45
+ const match = candidate.match(WHATSAPP_USER_JID_RE);
46
+ return `${match[1]}@s.whatsapp.net`;
47
+ }
48
+ // Handle LIDs
49
+ if (WHATSAPP_LID_RE.test(candidate)) {
50
+ const match = candidate.match(WHATSAPP_LID_RE);
51
+ return `${match[1]}@lid`;
52
+ }
53
+ // Handle raw phone numbers or strings without @
54
+ if (!candidate.includes("@")) {
55
+ const normalized = normalizeE164(candidate);
56
+ // Only accept if it has at least 5 digits (sanity check for phone numbers)
57
+ return normalized.length >= 5 ? `${normalized}@s.whatsapp.net` : null;
58
+ }
59
+ return null;
60
+ }
61
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,MAAM,oBAAoB,GAAG,oCAAoC,CAAC;AAClE,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IAC9C,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,SAAU,CAAC;QACP,MAAM,MAAM,GAAG,SAAS,CAAC;QACzB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC5C,MAAM,SAAS,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACjD,MAAM,SAAS,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,gBAAgB;IAChB,IAAI,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACxE,OAAO,GAAG,SAAS,OAAO,CAAC;IAC/B,CAAC;IAED,4DAA4D;IAC5D,IAAI,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpD,OAAO,GAAG,KAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACzC,CAAC;IAED,cAAc;IACd,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,GAAG,KAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAC5C,2EAA2E;QAC3E,OAAO,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@link-os/whatsapp",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -11,7 +11,7 @@
11
11
  }
12
12
  },
13
13
  "dependencies": {
14
- "@whiskeysockets/baileys": "^6.6.0",
14
+ "@whiskeysockets/baileys": "^7.0.0-rc.9",
15
15
  "@hapi/boom": "^10.0.1",
16
16
  "ws": "^8.16.0",
17
17
  "qrcode-terminal": "^0.12.0",