@phuetz/code-buddy 0.1.13 → 0.1.14

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 (258) hide show
  1. package/README.md +228 -13
  2. package/dist/agent/architect-mode.d.ts +11 -0
  3. package/dist/agent/architect-mode.js +133 -25
  4. package/dist/agent/architect-mode.js.map +1 -1
  5. package/dist/agent/codebuddy-agent.d.ts +24 -0
  6. package/dist/agent/codebuddy-agent.js +118 -16
  7. package/dist/agent/codebuddy-agent.js.map +1 -1
  8. package/dist/agent/execution/agent-executor.d.ts +9 -0
  9. package/dist/agent/execution/agent-executor.js +61 -0
  10. package/dist/agent/execution/agent-executor.js.map +1 -1
  11. package/dist/agent/message-queue.d.ts +77 -0
  12. package/dist/agent/message-queue.js +116 -0
  13. package/dist/agent/message-queue.js.map +1 -0
  14. package/dist/agent/middleware/auto-observation.d.ts +37 -0
  15. package/dist/agent/middleware/auto-observation.js +231 -0
  16. package/dist/agent/middleware/auto-observation.js.map +1 -0
  17. package/dist/agent/middleware/index.d.ts +2 -0
  18. package/dist/agent/middleware/index.js +1 -0
  19. package/dist/agent/middleware/index.js.map +1 -1
  20. package/dist/agent/tool-handler.js +3 -2
  21. package/dist/agent/tool-handler.js.map +1 -1
  22. package/dist/agent/types.d.ts +7 -2
  23. package/dist/analytics/budget-alerts.d.ts +81 -0
  24. package/dist/analytics/budget-alerts.js +126 -0
  25. package/dist/analytics/budget-alerts.js.map +1 -0
  26. package/dist/analytics/cost-predictor.d.ts +79 -0
  27. package/dist/analytics/cost-predictor.js +150 -0
  28. package/dist/analytics/cost-predictor.js.map +1 -0
  29. package/dist/analytics/index.d.ts +2 -0
  30. package/dist/analytics/index.js +2 -0
  31. package/dist/analytics/index.js.map +1 -1
  32. package/dist/auth/profile-manager.d.ts +205 -0
  33. package/dist/auth/profile-manager.js +484 -0
  34. package/dist/auth/profile-manager.js.map +1 -0
  35. package/dist/browser-automation/browser-manager.d.ts +79 -1
  36. package/dist/browser-automation/browser-manager.js +265 -2
  37. package/dist/browser-automation/browser-manager.js.map +1 -1
  38. package/dist/browser-automation/profile-manager.d.ts +32 -0
  39. package/dist/browser-automation/profile-manager.js +83 -0
  40. package/dist/browser-automation/profile-manager.js.map +1 -0
  41. package/dist/browser-automation/route-interceptor.d.ts +29 -0
  42. package/dist/browser-automation/route-interceptor.js +103 -0
  43. package/dist/browser-automation/route-interceptor.js.map +1 -0
  44. package/dist/browser-automation/screenshot-annotator.d.ts +23 -0
  45. package/dist/browser-automation/screenshot-annotator.js +86 -0
  46. package/dist/browser-automation/screenshot-annotator.js.map +1 -0
  47. package/dist/browser-automation/types.d.ts +47 -0
  48. package/dist/channels/discord/client.d.ts +2 -1
  49. package/dist/channels/discord/client.js +28 -16
  50. package/dist/channels/discord/client.js.map +1 -1
  51. package/dist/channels/google-chat/index.d.ts +210 -0
  52. package/dist/channels/google-chat/index.js +505 -0
  53. package/dist/channels/google-chat/index.js.map +1 -0
  54. package/dist/channels/group-security.d.ts +182 -0
  55. package/dist/channels/group-security.js +407 -0
  56. package/dist/channels/group-security.js.map +1 -0
  57. package/dist/channels/index.d.ts +17 -1
  58. package/dist/channels/index.js +16 -0
  59. package/dist/channels/index.js.map +1 -1
  60. package/dist/channels/matrix/index.d.ts +181 -0
  61. package/dist/channels/matrix/index.js +643 -0
  62. package/dist/channels/matrix/index.js.map +1 -0
  63. package/dist/channels/offline-queue.d.ts +92 -0
  64. package/dist/channels/offline-queue.js +112 -0
  65. package/dist/channels/offline-queue.js.map +1 -0
  66. package/dist/channels/reconnection-manager.d.ts +117 -0
  67. package/dist/channels/reconnection-manager.js +171 -0
  68. package/dist/channels/reconnection-manager.js.map +1 -0
  69. package/dist/channels/signal/index.d.ts +184 -0
  70. package/dist/channels/signal/index.js +488 -0
  71. package/dist/channels/signal/index.js.map +1 -0
  72. package/dist/channels/slack/client.d.ts +2 -1
  73. package/dist/channels/slack/client.js +30 -20
  74. package/dist/channels/slack/client.js.map +1 -1
  75. package/dist/channels/teams/index.d.ts +196 -0
  76. package/dist/channels/teams/index.js +477 -0
  77. package/dist/channels/teams/index.js.map +1 -0
  78. package/dist/channels/telegram/client.d.ts +3 -1
  79. package/dist/channels/telegram/client.js +29 -2
  80. package/dist/channels/telegram/client.js.map +1 -1
  81. package/dist/channels/webchat/index.d.ts +103 -0
  82. package/dist/channels/webchat/index.js +697 -0
  83. package/dist/channels/webchat/index.js.map +1 -0
  84. package/dist/channels/whatsapp/index.d.ts +105 -0
  85. package/dist/channels/whatsapp/index.js +533 -0
  86. package/dist/channels/whatsapp/index.js.map +1 -0
  87. package/dist/codebuddy/client.js +6 -3
  88. package/dist/codebuddy/client.js.map +1 -1
  89. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  90. package/dist/codebuddy/tool-definitions/advanced-tools.js +103 -3
  91. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  92. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  93. package/dist/codebuddy/tool-definitions/index.js +1 -1
  94. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  95. package/dist/codebuddy/tools.js +3 -1
  96. package/dist/codebuddy/tools.js.map +1 -1
  97. package/dist/commands/cli/config-command.d.ts +8 -0
  98. package/dist/commands/cli/config-command.js +90 -0
  99. package/dist/commands/cli/config-command.js.map +1 -0
  100. package/dist/commands/cli/openclaw-commands.d.ts +12 -0
  101. package/dist/commands/cli/openclaw-commands.js +446 -0
  102. package/dist/commands/cli/openclaw-commands.js.map +1 -0
  103. package/dist/commands/cli/utility-commands.js +30 -0
  104. package/dist/commands/cli/utility-commands.js.map +1 -1
  105. package/dist/commands/client-dispatcher.js +22 -2
  106. package/dist/commands/client-dispatcher.js.map +1 -1
  107. package/dist/commands/enhanced-command-handler.js +21 -2
  108. package/dist/commands/enhanced-command-handler.js.map +1 -1
  109. package/dist/commands/handlers/extra-handlers.d.ts +30 -0
  110. package/dist/commands/handlers/extra-handlers.js +547 -0
  111. package/dist/commands/handlers/extra-handlers.js.map +1 -0
  112. package/dist/commands/handlers/index.d.ts +1 -0
  113. package/dist/commands/handlers/index.js +2 -0
  114. package/dist/commands/handlers/index.js.map +1 -1
  115. package/dist/commands/slash/builtin-commands.js +41 -34
  116. package/dist/commands/slash/builtin-commands.js.map +1 -1
  117. package/dist/config/env-schema.d.ts +58 -0
  118. package/dist/config/env-schema.js +789 -0
  119. package/dist/config/env-schema.js.map +1 -0
  120. package/dist/config/feature-flags.js +2 -1
  121. package/dist/config/feature-flags.js.map +1 -1
  122. package/dist/context/bootstrap-loader.d.ts +48 -0
  123. package/dist/context/bootstrap-loader.js +123 -0
  124. package/dist/context/bootstrap-loader.js.map +1 -0
  125. package/dist/copilot/copilot-proxy.d.ts +15 -1
  126. package/dist/copilot/copilot-proxy.js +81 -22
  127. package/dist/copilot/copilot-proxy.js.map +1 -1
  128. package/dist/daemon/heartbeat.d.ts +112 -0
  129. package/dist/daemon/heartbeat.js +339 -0
  130. package/dist/daemon/heartbeat.js.map +1 -0
  131. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  132. package/dist/desktop-automation/smart-snapshot.js +28 -0
  133. package/dist/desktop-automation/smart-snapshot.js.map +1 -1
  134. package/dist/identity/identity-manager.d.ts +95 -0
  135. package/dist/identity/identity-manager.js +242 -0
  136. package/dist/identity/identity-manager.js.map +1 -0
  137. package/dist/index.js +147 -17
  138. package/dist/index.js.map +1 -1
  139. package/dist/integrations/github-integration.js +1 -1
  140. package/dist/integrations/github-integration.js.map +1 -1
  141. package/dist/persistence/conversation-branches.js +2 -1
  142. package/dist/persistence/conversation-branches.js.map +1 -1
  143. package/dist/persistence/session-store.d.ts +1 -1
  144. package/dist/persistence/session-store.js +1 -1
  145. package/dist/persistence/session-store.js.map +1 -1
  146. package/dist/sandbox/auto-sandbox.d.ts +59 -0
  147. package/dist/sandbox/auto-sandbox.js +145 -0
  148. package/dist/sandbox/auto-sandbox.js.map +1 -0
  149. package/dist/security/audit-logger.d.ts +127 -0
  150. package/dist/security/audit-logger.js +194 -0
  151. package/dist/security/audit-logger.js.map +1 -0
  152. package/dist/security/bash-allowlist/allowlist-store.js +3 -2
  153. package/dist/security/bash-allowlist/allowlist-store.js.map +1 -1
  154. package/dist/security/bash-parser.js +0 -2
  155. package/dist/security/bash-parser.js.map +1 -1
  156. package/dist/security/code-validator.d.ts +51 -0
  157. package/dist/security/code-validator.js +185 -0
  158. package/dist/security/code-validator.js.map +1 -0
  159. package/dist/security/dangerous-patterns.d.ts +68 -0
  160. package/dist/security/dangerous-patterns.js +218 -0
  161. package/dist/security/dangerous-patterns.js.map +1 -0
  162. package/dist/security/remote-approval.d.ts +65 -0
  163. package/dist/security/remote-approval.js +138 -0
  164. package/dist/security/remote-approval.js.map +1 -0
  165. package/dist/security/security-audit.d.ts +7 -0
  166. package/dist/security/security-audit.js +23 -0
  167. package/dist/security/security-audit.js.map +1 -1
  168. package/dist/security/syntax-validator.d.ts +17 -0
  169. package/dist/security/syntax-validator.js +292 -0
  170. package/dist/security/syntax-validator.js.map +1 -0
  171. package/dist/server/index.js +277 -2
  172. package/dist/server/index.js.map +1 -1
  173. package/dist/services/prompt-builder.js +16 -0
  174. package/dist/services/prompt-builder.js.map +1 -1
  175. package/dist/skills/hub.d.ts +231 -0
  176. package/dist/skills/hub.js +694 -0
  177. package/dist/skills/hub.js.map +1 -0
  178. package/dist/skills/skill-loader.js +1 -1
  179. package/dist/skills/skill-loader.js.map +1 -1
  180. package/dist/skills/skill-manager.js +2 -1
  181. package/dist/skills/skill-manager.js.map +1 -1
  182. package/dist/tools/apply-patch.d.ts +1 -0
  183. package/dist/tools/apply-patch.js +57 -10
  184. package/dist/tools/apply-patch.js.map +1 -1
  185. package/dist/tools/bash/bash-tool.d.ts +123 -0
  186. package/dist/tools/bash/bash-tool.js +549 -0
  187. package/dist/tools/bash/bash-tool.js.map +1 -0
  188. package/dist/tools/bash/command-validator.d.ts +49 -0
  189. package/dist/tools/bash/command-validator.js +223 -0
  190. package/dist/tools/bash/command-validator.js.map +1 -0
  191. package/dist/tools/bash/index.d.ts +7 -0
  192. package/dist/tools/bash/index.js +8 -0
  193. package/dist/tools/bash/index.js.map +1 -0
  194. package/dist/tools/bash/security-patterns.d.ts +44 -0
  195. package/dist/tools/bash/security-patterns.js +234 -0
  196. package/dist/tools/bash/security-patterns.js.map +1 -0
  197. package/dist/tools/bash/streaming-executor.d.ts +23 -0
  198. package/dist/tools/bash/streaming-executor.js +134 -0
  199. package/dist/tools/bash/streaming-executor.js.map +1 -0
  200. package/dist/tools/code-formatter.js +41 -27
  201. package/dist/tools/code-formatter.js.map +1 -1
  202. package/dist/tools/code-review.js +1 -1
  203. package/dist/tools/code-review.js.map +1 -1
  204. package/dist/tools/computer-control-tool.js +21 -0
  205. package/dist/tools/computer-control-tool.js.map +1 -1
  206. package/dist/tools/document-tool.js +3 -2
  207. package/dist/tools/document-tool.js.map +1 -1
  208. package/dist/tools/git-tool.d.ts +45 -0
  209. package/dist/tools/git-tool.js +222 -0
  210. package/dist/tools/git-tool.js.map +1 -1
  211. package/dist/tools/index.d.ts +1 -1
  212. package/dist/tools/index.js +1 -1
  213. package/dist/tools/index.js.map +1 -1
  214. package/dist/tools/multi-edit.js +31 -3
  215. package/dist/tools/multi-edit.js.map +1 -1
  216. package/dist/tools/process-tool.d.ts +69 -0
  217. package/dist/tools/process-tool.js +222 -0
  218. package/dist/tools/process-tool.js.map +1 -0
  219. package/dist/tools/registry/git-tools.d.ts +32 -0
  220. package/dist/tools/registry/git-tools.js +211 -0
  221. package/dist/tools/registry/git-tools.js.map +1 -0
  222. package/dist/tools/registry/index.d.ts +2 -0
  223. package/dist/tools/registry/index.js +8 -0
  224. package/dist/tools/registry/index.js.map +1 -1
  225. package/dist/tools/registry/misc-tools.d.ts +32 -4
  226. package/dist/tools/registry/misc-tools.js +230 -90
  227. package/dist/tools/registry/misc-tools.js.map +1 -1
  228. package/dist/tools/registry/process-tools.d.ts +20 -0
  229. package/dist/tools/registry/process-tools.js +141 -0
  230. package/dist/tools/registry/process-tools.js.map +1 -0
  231. package/dist/tools/registry/types.d.ts +2 -0
  232. package/dist/ui/components/ChatInterface.js +9 -0
  233. package/dist/ui/components/ChatInterface.js.map +1 -1
  234. package/dist/utils/autonomy-manager.js +3 -2
  235. package/dist/utils/autonomy-manager.js.map +1 -1
  236. package/dist/utils/config-validation/schema.d.ts +15 -15
  237. package/dist/utils/confirmation-service.d.ts +16 -0
  238. package/dist/utils/confirmation-service.js +37 -3
  239. package/dist/utils/confirmation-service.js.map +1 -1
  240. package/dist/utils/custom-instructions.js +2 -1
  241. package/dist/utils/custom-instructions.js.map +1 -1
  242. package/dist/utils/graceful-shutdown.js +9 -9
  243. package/dist/utils/graceful-shutdown.js.map +1 -1
  244. package/dist/utils/head-tail-truncation.d.ts +18 -0
  245. package/dist/utils/head-tail-truncation.js +127 -0
  246. package/dist/utils/head-tail-truncation.js.map +1 -1
  247. package/dist/utils/history-manager.js +3 -2
  248. package/dist/utils/history-manager.js.map +1 -1
  249. package/dist/utils/performance.js +16 -15
  250. package/dist/utils/performance.js.map +1 -1
  251. package/dist/utils/update-notifier.js +2 -1
  252. package/dist/utils/update-notifier.js.map +1 -1
  253. package/dist/workflows/pipeline.d.ts +54 -1
  254. package/dist/workflows/pipeline.js +128 -7
  255. package/dist/workflows/pipeline.js.map +1 -1
  256. package/dist/workflows/step-manager.js +2 -1
  257. package/dist/workflows/step-manager.js.map +1 -1
  258. package/package.json +6 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/webchat/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * WhatsApp Channel Adapter
3
+ *
4
+ * WhatsApp integration via Baileys (@whiskeysockets/baileys).
5
+ * Supports QR code pairing, text/media messaging, and group chats.
6
+ * Baileys is an optional dependency loaded dynamically at runtime.
7
+ */
8
+ import type { ChannelConfig, OutboundMessage, DeliveryResult } from '../index.js';
9
+ import { BaseChannel } from '../index.js';
10
+ /**
11
+ * WhatsApp-specific configuration
12
+ */
13
+ export interface WhatsAppConfig extends ChannelConfig {
14
+ type: 'whatsapp';
15
+ /** Phone number to register (with country code, e.g. +1234567890) */
16
+ phoneNumber?: string;
17
+ /** Directory to store session data (auth keys, etc.) */
18
+ sessionDataPath?: string;
19
+ /** Timeout for QR code pairing in ms (default: 60000) */
20
+ qrTimeout?: number;
21
+ /** Print QR code to terminal (default: true) */
22
+ printQrInTerminal?: boolean;
23
+ /** Browser name shown in WhatsApp linked devices */
24
+ browserName?: string;
25
+ /** Whether to mark messages as read automatically */
26
+ markOnlineOnConnect?: boolean;
27
+ }
28
+ /**
29
+ * WhatsApp contact info
30
+ */
31
+ export interface WhatsAppContact {
32
+ id: string;
33
+ name?: string;
34
+ notify?: string;
35
+ imgUrl?: string;
36
+ }
37
+ /**
38
+ * WhatsApp channel using Baileys (WhatsApp Web multi-device)
39
+ */
40
+ export declare class WhatsAppChannel extends BaseChannel {
41
+ private socket;
42
+ private authState;
43
+ private qrTimeout;
44
+ private reconnecting;
45
+ private reconnectionManager;
46
+ constructor(config: WhatsAppConfig);
47
+ private get waConfig();
48
+ /**
49
+ * Connect to WhatsApp via Baileys
50
+ */
51
+ connect(): Promise<void>;
52
+ /**
53
+ * Disconnect from WhatsApp
54
+ */
55
+ disconnect(): Promise<void>;
56
+ /**
57
+ * Send a WhatsApp message
58
+ */
59
+ send(message: OutboundMessage): Promise<DeliveryResult>;
60
+ /**
61
+ * Send a typing indicator
62
+ */
63
+ sendPresenceUpdate(jid: string, type?: 'composing' | 'paused'): Promise<void>;
64
+ /**
65
+ * Load existing auth state from disk
66
+ */
67
+ private loadAuthState;
68
+ /**
69
+ * Initialize fresh auth state
70
+ */
71
+ private initFreshAuthState;
72
+ /**
73
+ * Handle Baileys connection update
74
+ */
75
+ private handleConnectionUpdate;
76
+ /**
77
+ * Handle incoming messages
78
+ */
79
+ private handleMessagesUpsert;
80
+ /**
81
+ * Process a single incoming WhatsApp message
82
+ */
83
+ private processIncomingMessage;
84
+ /**
85
+ * Convert Baileys message to InboundMessage
86
+ */
87
+ private convertMessage;
88
+ /**
89
+ * Extract attachments from a Baileys message object
90
+ */
91
+ private extractAttachments;
92
+ /**
93
+ * Determine content type from message body
94
+ */
95
+ private determineContentType;
96
+ /**
97
+ * Build media content for sending
98
+ */
99
+ private buildMediaContent;
100
+ /**
101
+ * Normalize a phone number or chat ID to a WhatsApp JID
102
+ */
103
+ private normalizeJid;
104
+ }
105
+ export default WhatsAppChannel;
@@ -0,0 +1,533 @@
1
+ /**
2
+ * WhatsApp Channel Adapter
3
+ *
4
+ * WhatsApp integration via Baileys (@whiskeysockets/baileys).
5
+ * Supports QR code pairing, text/media messaging, and group chats.
6
+ * Baileys is an optional dependency loaded dynamically at runtime.
7
+ */
8
+ import { BaseChannel, getSessionKey, checkDMPairing } from '../index.js';
9
+ import { ReconnectionManager } from '../reconnection-manager.js';
10
+ import { logger } from '../../utils/logger.js';
11
+ import { mkdirSync, existsSync } from 'fs';
12
+ import path from 'path';
13
+ // ============================================================================
14
+ // Channel Implementation
15
+ // ============================================================================
16
+ /**
17
+ * WhatsApp channel using Baileys (WhatsApp Web multi-device)
18
+ */
19
+ export class WhatsAppChannel extends BaseChannel {
20
+ socket = null;
21
+ authState = null;
22
+ qrTimeout = null;
23
+ reconnecting = false;
24
+ reconnectionManager;
25
+ constructor(config) {
26
+ super('whatsapp', config);
27
+ // Apply defaults
28
+ if (!config.sessionDataPath) {
29
+ this.config.sessionDataPath = path.join(process.cwd(), '.codebuddy', 'whatsapp-session');
30
+ }
31
+ if (config.qrTimeout === undefined) {
32
+ this.config.qrTimeout = 60000;
33
+ }
34
+ if (config.printQrInTerminal === undefined) {
35
+ this.config.printQrInTerminal = true;
36
+ }
37
+ if (!config.browserName) {
38
+ this.config.browserName = 'Code Buddy';
39
+ }
40
+ this.reconnectionManager = new ReconnectionManager('whatsapp', {
41
+ maxRetries: 10,
42
+ initialDelayMs: 2000,
43
+ maxDelayMs: 60000,
44
+ });
45
+ }
46
+ get waConfig() {
47
+ return this.config;
48
+ }
49
+ /**
50
+ * Connect to WhatsApp via Baileys
51
+ */
52
+ async connect() {
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ let baileys;
55
+ try {
56
+ // @ts-expect-error -- optional dependency, loaded dynamically
57
+ baileys = await import('@whiskeysockets/baileys');
58
+ }
59
+ catch {
60
+ throw new Error('WhatsApp channel requires @whiskeysockets/baileys. Install it with: npm install @whiskeysockets/baileys');
61
+ }
62
+ const sessionPath = this.waConfig.sessionDataPath;
63
+ if (!existsSync(sessionPath)) {
64
+ mkdirSync(sessionPath, { recursive: true });
65
+ }
66
+ // Load or initialize auth state
67
+ try {
68
+ const { state, saveCreds } = await this.loadAuthState(baileys, sessionPath);
69
+ this.authState = { state, saveCreds };
70
+ }
71
+ catch (err) {
72
+ logger.debug('WhatsApp: failed to load auth state, starting fresh', {
73
+ error: err instanceof Error ? err.message : String(err),
74
+ });
75
+ const { state, saveCreds } = await this.initFreshAuthState(baileys, sessionPath);
76
+ this.authState = { state, saveCreds };
77
+ }
78
+ const { state, saveCreds } = this.authState;
79
+ // Create the Baileys socket
80
+ const makeWASocket = baileys.default ?? baileys.makeWASocket;
81
+ const sock = makeWASocket({
82
+ auth: state,
83
+ printQRInTerminal: this.waConfig.printQrInTerminal,
84
+ browser: [this.waConfig.browserName ?? 'Code Buddy', 'Chrome', '120.0'],
85
+ markOnlineOnConnect: this.waConfig.markOnlineOnConnect ?? true,
86
+ });
87
+ this.socket = sock;
88
+ // Register event handlers
89
+ sock.ev.on('creds.update', saveCreds);
90
+ sock.ev.on('connection.update', (update) => {
91
+ this.handleConnectionUpdate(update);
92
+ });
93
+ sock.ev.on('messages.upsert', (upsert) => {
94
+ this.handleMessagesUpsert(upsert);
95
+ });
96
+ // Wait for connection or QR timeout
97
+ return new Promise((resolve, reject) => {
98
+ const onConnected = () => {
99
+ cleanup();
100
+ resolve();
101
+ };
102
+ const onError = (err) => {
103
+ cleanup();
104
+ reject(err);
105
+ };
106
+ const cleanup = () => {
107
+ this.removeListener('connected', onConnected);
108
+ this.removeListener('error', onError);
109
+ if (this.qrTimeout) {
110
+ clearTimeout(this.qrTimeout);
111
+ this.qrTimeout = null;
112
+ }
113
+ };
114
+ this.once('connected', onConnected);
115
+ this.once('error', onError);
116
+ // QR timeout fallback
117
+ this.qrTimeout = setTimeout(() => {
118
+ if (!this.status.connected) {
119
+ cleanup();
120
+ reject(new Error(`WhatsApp QR pairing timed out after ${this.waConfig.qrTimeout}ms`));
121
+ }
122
+ }, this.waConfig.qrTimeout ?? 60000);
123
+ });
124
+ }
125
+ /**
126
+ * Disconnect from WhatsApp
127
+ */
128
+ async disconnect() {
129
+ this.reconnectionManager.cancel();
130
+ if (this.qrTimeout) {
131
+ clearTimeout(this.qrTimeout);
132
+ this.qrTimeout = null;
133
+ }
134
+ if (this.socket) {
135
+ try {
136
+ const sock = this.socket;
137
+ sock.end(undefined);
138
+ }
139
+ catch (err) {
140
+ logger.debug('WhatsApp disconnect error (ignored)', {
141
+ error: err instanceof Error ? err.message : String(err),
142
+ });
143
+ }
144
+ this.socket = null;
145
+ }
146
+ this.status.connected = false;
147
+ this.status.authenticated = false;
148
+ this.emit('disconnected', 'whatsapp');
149
+ }
150
+ /**
151
+ * Send a WhatsApp message
152
+ */
153
+ async send(message) {
154
+ if (!this.socket || !this.status.connected) {
155
+ return {
156
+ success: false,
157
+ error: 'WhatsApp not connected',
158
+ timestamp: new Date(),
159
+ };
160
+ }
161
+ const sock = this.socket;
162
+ try {
163
+ const jid = this.normalizeJid(message.channelId);
164
+ let content;
165
+ // Handle attachments
166
+ if (message.attachments && message.attachments.length > 0) {
167
+ content = this.buildMediaContent(message.attachments[0], message.content);
168
+ }
169
+ else {
170
+ content = { text: message.content };
171
+ }
172
+ const options = {};
173
+ if (message.replyTo) {
174
+ options.quoted = { key: { id: message.replyTo } };
175
+ }
176
+ const result = await sock.sendMessage(jid, content, options);
177
+ return {
178
+ success: true,
179
+ messageId: result.key.id ?? undefined,
180
+ timestamp: new Date(),
181
+ };
182
+ }
183
+ catch (error) {
184
+ logger.debug('WhatsApp send error', {
185
+ error: error instanceof Error ? error.message : String(error),
186
+ });
187
+ return {
188
+ success: false,
189
+ error: error instanceof Error ? error.message : String(error),
190
+ timestamp: new Date(),
191
+ };
192
+ }
193
+ }
194
+ /**
195
+ * Send a typing indicator
196
+ */
197
+ async sendPresenceUpdate(jid, type = 'composing') {
198
+ if (!this.socket)
199
+ return;
200
+ const sock = this.socket;
201
+ try {
202
+ await sock.sendPresenceUpdate(type, this.normalizeJid(jid));
203
+ }
204
+ catch {
205
+ // Ignore presence update errors
206
+ }
207
+ }
208
+ // ==========================================================================
209
+ // Private Methods
210
+ // ==========================================================================
211
+ /**
212
+ * Load existing auth state from disk
213
+ */
214
+ async loadAuthState(baileys, sessionPath) {
215
+ const useMultiFileAuthState = baileys.useMultiFileAuthState;
216
+ return useMultiFileAuthState(sessionPath);
217
+ }
218
+ /**
219
+ * Initialize fresh auth state
220
+ */
221
+ async initFreshAuthState(baileys, sessionPath) {
222
+ const useMultiFileAuthState = baileys.useMultiFileAuthState;
223
+ return useMultiFileAuthState(sessionPath);
224
+ }
225
+ /**
226
+ * Handle Baileys connection update
227
+ */
228
+ handleConnectionUpdate(update) {
229
+ const { connection, lastDisconnect, qr } = update;
230
+ if (qr) {
231
+ logger.debug('WhatsApp: QR code received, scan with your phone');
232
+ this.emit('qr', qr);
233
+ }
234
+ if (connection === 'close') {
235
+ const statusCode = lastDisconnect?.error?.output?.statusCode;
236
+ const shouldReconnect = statusCode !== 401; // 401 = logged out
237
+ logger.debug('WhatsApp connection closed', { statusCode, shouldReconnect });
238
+ this.status.connected = false;
239
+ this.status.authenticated = false;
240
+ if (shouldReconnect && !this.reconnecting) {
241
+ this.reconnectionManager.scheduleReconnect(async () => {
242
+ this.reconnecting = true;
243
+ try {
244
+ await this.connect();
245
+ this.reconnectionManager.onConnected();
246
+ }
247
+ catch (err) {
248
+ this.emit('error', 'whatsapp', err instanceof Error ? err : new Error(String(err)));
249
+ }
250
+ finally {
251
+ this.reconnecting = false;
252
+ }
253
+ });
254
+ }
255
+ else if (!shouldReconnect) {
256
+ this.emit('disconnected', 'whatsapp', new Error(`Logged out (status ${statusCode})`));
257
+ }
258
+ }
259
+ else if (connection === 'open') {
260
+ this.status.connected = true;
261
+ this.status.authenticated = true;
262
+ this.status.lastActivity = new Date();
263
+ this.reconnectionManager.onConnected();
264
+ const sock = this.socket;
265
+ this.status.info = {
266
+ phoneNumber: this.waConfig.phoneNumber,
267
+ jid: sock?.user?.id,
268
+ name: sock?.user?.name,
269
+ };
270
+ logger.debug('WhatsApp connected successfully');
271
+ this.emit('connected', 'whatsapp');
272
+ }
273
+ }
274
+ /**
275
+ * Handle incoming messages
276
+ */
277
+ async handleMessagesUpsert(upsert) {
278
+ if (upsert.type !== 'notify')
279
+ return;
280
+ for (const msg of upsert.messages) {
281
+ try {
282
+ await this.processIncomingMessage(msg);
283
+ }
284
+ catch (err) {
285
+ logger.debug('WhatsApp: error processing message', {
286
+ error: err instanceof Error ? err.message : String(err),
287
+ });
288
+ }
289
+ }
290
+ }
291
+ /**
292
+ * Process a single incoming WhatsApp message
293
+ */
294
+ async processIncomingMessage(msg) {
295
+ // Ignore messages from self
296
+ if (msg.key.fromMe)
297
+ return;
298
+ // Ignore status broadcasts
299
+ const remoteJid = msg.key.remoteJid;
300
+ if (!remoteJid || remoteJid === 'status@broadcast')
301
+ return;
302
+ // Check user allowlist
303
+ const senderId = msg.key.participant ?? remoteJid;
304
+ const normalizedSender = senderId.replace(/@.*$/, '');
305
+ if (!this.isUserAllowed(normalizedSender))
306
+ return;
307
+ // Check channel allowlist
308
+ const channelId = remoteJid.replace(/@.*$/, '');
309
+ if (!this.isChannelAllowed(channelId))
310
+ return;
311
+ const inbound = this.convertMessage(msg);
312
+ const parsed = this.parseCommand(inbound);
313
+ parsed.sessionKey = getSessionKey(parsed);
314
+ // DM pairing check
315
+ const pairingStatus = await checkDMPairing(parsed);
316
+ if (!pairingStatus.approved) {
317
+ const { getDMPairing } = await import('../dm-pairing.js');
318
+ const pairingMessage = getDMPairing().getPairingMessage(pairingStatus);
319
+ if (pairingMessage) {
320
+ await this.send({ channelId: remoteJid, content: pairingMessage });
321
+ }
322
+ return;
323
+ }
324
+ this.status.lastActivity = new Date();
325
+ this.emit('message', parsed);
326
+ if (parsed.isCommand) {
327
+ this.emit('command', parsed);
328
+ }
329
+ }
330
+ /**
331
+ * Convert Baileys message to InboundMessage
332
+ */
333
+ convertMessage(msg) {
334
+ const remoteJid = msg.key.remoteJid ?? '';
335
+ const isGroup = remoteJid.endsWith('@g.us');
336
+ const senderId = msg.key.participant ?? remoteJid;
337
+ // Extract text content
338
+ const messageBody = msg.message ?? {};
339
+ const text = messageBody.conversation ??
340
+ messageBody.extendedTextMessage?.text ??
341
+ messageBody.imageMessage?.caption ??
342
+ messageBody.videoMessage?.caption ??
343
+ messageBody.documentMessage?.caption ??
344
+ '';
345
+ // Extract attachments
346
+ const attachments = this.extractAttachments(messageBody);
347
+ // Determine timestamp
348
+ let timestamp;
349
+ if (msg.messageTimestamp) {
350
+ const ts = typeof msg.messageTimestamp === 'number'
351
+ ? msg.messageTimestamp
352
+ : msg.messageTimestamp.toNumber();
353
+ timestamp = new Date(ts * 1000);
354
+ }
355
+ else {
356
+ timestamp = new Date();
357
+ }
358
+ return {
359
+ id: msg.key.id ?? `wa-${Date.now()}`,
360
+ channel: {
361
+ id: remoteJid,
362
+ type: 'whatsapp',
363
+ name: msg.pushName ?? remoteJid.replace(/@.*$/, ''),
364
+ isDM: !isGroup,
365
+ isGroup,
366
+ },
367
+ sender: {
368
+ id: senderId.replace(/@.*$/, ''),
369
+ username: senderId.replace(/@.*$/, ''),
370
+ displayName: msg.pushName ?? senderId.replace(/@.*$/, ''),
371
+ },
372
+ content: text,
373
+ contentType: this.determineContentType(messageBody),
374
+ attachments: attachments.length > 0 ? attachments : undefined,
375
+ timestamp,
376
+ raw: msg,
377
+ };
378
+ }
379
+ /**
380
+ * Extract attachments from a Baileys message object
381
+ */
382
+ extractAttachments(messageBody) {
383
+ const attachments = [];
384
+ if (messageBody.imageMessage) {
385
+ const img = messageBody.imageMessage;
386
+ attachments.push({
387
+ type: 'image',
388
+ mimeType: img.mimetype,
389
+ size: img.fileLength,
390
+ width: img.width,
391
+ height: img.height,
392
+ caption: img.caption,
393
+ url: img.url,
394
+ });
395
+ }
396
+ if (messageBody.audioMessage) {
397
+ const audio = messageBody.audioMessage;
398
+ attachments.push({
399
+ type: audio.ptt ? 'voice' : 'audio',
400
+ mimeType: audio.mimetype,
401
+ size: audio.fileLength,
402
+ duration: audio.seconds,
403
+ url: audio.url,
404
+ });
405
+ }
406
+ if (messageBody.videoMessage) {
407
+ const video = messageBody.videoMessage;
408
+ attachments.push({
409
+ type: 'video',
410
+ mimeType: video.mimetype,
411
+ size: video.fileLength,
412
+ duration: video.seconds,
413
+ width: video.width,
414
+ height: video.height,
415
+ caption: video.caption,
416
+ url: video.url,
417
+ });
418
+ }
419
+ if (messageBody.documentMessage) {
420
+ const doc = messageBody.documentMessage;
421
+ attachments.push({
422
+ type: 'file',
423
+ mimeType: doc.mimetype,
424
+ size: doc.fileLength,
425
+ fileName: doc.fileName,
426
+ url: doc.url,
427
+ });
428
+ }
429
+ if (messageBody.stickerMessage) {
430
+ const sticker = messageBody.stickerMessage;
431
+ attachments.push({
432
+ type: 'sticker',
433
+ mimeType: sticker.mimetype,
434
+ width: sticker.width,
435
+ height: sticker.height,
436
+ url: sticker.url,
437
+ });
438
+ }
439
+ if (messageBody.locationMessage) {
440
+ const loc = messageBody.locationMessage;
441
+ attachments.push({
442
+ type: 'location',
443
+ data: JSON.stringify({
444
+ latitude: loc.degreesLatitude,
445
+ longitude: loc.degreesLongitude,
446
+ name: loc.name,
447
+ }),
448
+ });
449
+ }
450
+ if (messageBody.contactMessage || messageBody.contactsArrayMessage) {
451
+ attachments.push({
452
+ type: 'contact',
453
+ data: JSON.stringify(messageBody.contactMessage ?? messageBody.contactsArrayMessage),
454
+ });
455
+ }
456
+ return attachments;
457
+ }
458
+ /**
459
+ * Determine content type from message body
460
+ */
461
+ determineContentType(messageBody) {
462
+ if (messageBody.imageMessage)
463
+ return 'image';
464
+ if (messageBody.audioMessage) {
465
+ const audio = messageBody.audioMessage;
466
+ return audio.ptt ? 'voice' : 'audio';
467
+ }
468
+ if (messageBody.videoMessage)
469
+ return 'video';
470
+ if (messageBody.documentMessage)
471
+ return 'file';
472
+ if (messageBody.stickerMessage)
473
+ return 'sticker';
474
+ if (messageBody.locationMessage)
475
+ return 'location';
476
+ if (messageBody.contactMessage || messageBody.contactsArrayMessage)
477
+ return 'contact';
478
+ const text = messageBody.conversation ??
479
+ messageBody.extendedTextMessage?.text ?? '';
480
+ if (text.startsWith('/'))
481
+ return 'command';
482
+ return 'text';
483
+ }
484
+ /**
485
+ * Build media content for sending
486
+ */
487
+ buildMediaContent(attachment, caption) {
488
+ const source = attachment.url
489
+ ? { url: attachment.url }
490
+ : attachment.data
491
+ ? { data: Buffer.from(attachment.data, 'base64') }
492
+ : attachment.filePath
493
+ ? { url: attachment.filePath }
494
+ : {};
495
+ switch (attachment.type) {
496
+ case 'image':
497
+ return { image: source, caption, mimetype: attachment.mimeType };
498
+ case 'audio':
499
+ case 'voice':
500
+ return {
501
+ audio: source,
502
+ mimetype: attachment.mimeType ?? 'audio/ogg; codecs=opus',
503
+ ptt: attachment.type === 'voice',
504
+ };
505
+ case 'video':
506
+ return { video: source, caption, mimetype: attachment.mimeType };
507
+ case 'sticker':
508
+ return { sticker: source, mimetype: attachment.mimeType ?? 'image/webp' };
509
+ case 'file':
510
+ default:
511
+ return {
512
+ document: source,
513
+ caption,
514
+ mimetype: attachment.mimeType ?? 'application/octet-stream',
515
+ fileName: attachment.fileName,
516
+ };
517
+ }
518
+ }
519
+ /**
520
+ * Normalize a phone number or chat ID to a WhatsApp JID
521
+ */
522
+ normalizeJid(id) {
523
+ // Already a JID
524
+ if (id.includes('@'))
525
+ return id;
526
+ // Strip non-numeric for phone numbers
527
+ const cleaned = id.replace(/[^0-9]/g, '');
528
+ // Default to individual chat
529
+ return `${cleaned}@s.whatsapp.net`;
530
+ }
531
+ }
532
+ export default WhatsAppChannel;
533
+ //# sourceMappingURL=index.js.map