@phuetz/code-buddy 0.1.12 → 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 (321) 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 +62 -1
  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/turn-diff-tracker.js +3 -0
  23. package/dist/agent/turn-diff-tracker.js.map +1 -1
  24. package/dist/agent/types.d.ts +7 -2
  25. package/dist/analytics/budget-alerts.d.ts +81 -0
  26. package/dist/analytics/budget-alerts.js +126 -0
  27. package/dist/analytics/budget-alerts.js.map +1 -0
  28. package/dist/analytics/cost-predictor.d.ts +79 -0
  29. package/dist/analytics/cost-predictor.js +150 -0
  30. package/dist/analytics/cost-predictor.js.map +1 -0
  31. package/dist/analytics/index.d.ts +2 -0
  32. package/dist/analytics/index.js +2 -0
  33. package/dist/analytics/index.js.map +1 -1
  34. package/dist/auth/profile-manager.d.ts +205 -0
  35. package/dist/auth/profile-manager.js +484 -0
  36. package/dist/auth/profile-manager.js.map +1 -0
  37. package/dist/browser-automation/browser-manager.d.ts +79 -1
  38. package/dist/browser-automation/browser-manager.js +265 -2
  39. package/dist/browser-automation/browser-manager.js.map +1 -1
  40. package/dist/browser-automation/profile-manager.d.ts +32 -0
  41. package/dist/browser-automation/profile-manager.js +83 -0
  42. package/dist/browser-automation/profile-manager.js.map +1 -0
  43. package/dist/browser-automation/route-interceptor.d.ts +29 -0
  44. package/dist/browser-automation/route-interceptor.js +103 -0
  45. package/dist/browser-automation/route-interceptor.js.map +1 -0
  46. package/dist/browser-automation/screenshot-annotator.d.ts +23 -0
  47. package/dist/browser-automation/screenshot-annotator.js +86 -0
  48. package/dist/browser-automation/screenshot-annotator.js.map +1 -0
  49. package/dist/browser-automation/types.d.ts +47 -0
  50. package/dist/cache/llm-response-cache.js +3 -0
  51. package/dist/cache/llm-response-cache.js.map +1 -1
  52. package/dist/canvas/canvas-server.js +4 -3
  53. package/dist/canvas/canvas-server.js.map +1 -1
  54. package/dist/channels/discord/client.d.ts +2 -1
  55. package/dist/channels/discord/client.js +28 -16
  56. package/dist/channels/discord/client.js.map +1 -1
  57. package/dist/channels/dm-pairing.js +6 -3
  58. package/dist/channels/dm-pairing.js.map +1 -1
  59. package/dist/channels/google-chat/index.d.ts +210 -0
  60. package/dist/channels/google-chat/index.js +505 -0
  61. package/dist/channels/google-chat/index.js.map +1 -0
  62. package/dist/channels/group-security.d.ts +182 -0
  63. package/dist/channels/group-security.js +407 -0
  64. package/dist/channels/group-security.js.map +1 -0
  65. package/dist/channels/index.d.ts +17 -1
  66. package/dist/channels/index.js +16 -0
  67. package/dist/channels/index.js.map +1 -1
  68. package/dist/channels/matrix/index.d.ts +181 -0
  69. package/dist/channels/matrix/index.js +643 -0
  70. package/dist/channels/matrix/index.js.map +1 -0
  71. package/dist/channels/offline-queue.d.ts +92 -0
  72. package/dist/channels/offline-queue.js +112 -0
  73. package/dist/channels/offline-queue.js.map +1 -0
  74. package/dist/channels/reconnection-manager.d.ts +117 -0
  75. package/dist/channels/reconnection-manager.js +171 -0
  76. package/dist/channels/reconnection-manager.js.map +1 -0
  77. package/dist/channels/signal/index.d.ts +184 -0
  78. package/dist/channels/signal/index.js +488 -0
  79. package/dist/channels/signal/index.js.map +1 -0
  80. package/dist/channels/slack/client.d.ts +2 -1
  81. package/dist/channels/slack/client.js +30 -15
  82. package/dist/channels/slack/client.js.map +1 -1
  83. package/dist/channels/teams/index.d.ts +196 -0
  84. package/dist/channels/teams/index.js +477 -0
  85. package/dist/channels/teams/index.js.map +1 -0
  86. package/dist/channels/telegram/client.d.ts +3 -1
  87. package/dist/channels/telegram/client.js +29 -2
  88. package/dist/channels/telegram/client.js.map +1 -1
  89. package/dist/channels/webchat/index.d.ts +103 -0
  90. package/dist/channels/webchat/index.js +697 -0
  91. package/dist/channels/webchat/index.js.map +1 -0
  92. package/dist/channels/whatsapp/index.d.ts +105 -0
  93. package/dist/channels/whatsapp/index.js +533 -0
  94. package/dist/channels/whatsapp/index.js.map +1 -0
  95. package/dist/codebuddy/client.js +11 -5
  96. package/dist/codebuddy/client.js.map +1 -1
  97. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  98. package/dist/codebuddy/tool-definitions/advanced-tools.js +103 -3
  99. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  100. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  101. package/dist/codebuddy/tool-definitions/index.js +1 -1
  102. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  103. package/dist/codebuddy/tools.js +3 -1
  104. package/dist/codebuddy/tools.js.map +1 -1
  105. package/dist/commands/cli/config-command.d.ts +8 -0
  106. package/dist/commands/cli/config-command.js +90 -0
  107. package/dist/commands/cli/config-command.js.map +1 -0
  108. package/dist/commands/cli/openclaw-commands.d.ts +12 -0
  109. package/dist/commands/cli/openclaw-commands.js +446 -0
  110. package/dist/commands/cli/openclaw-commands.js.map +1 -0
  111. package/dist/commands/cli/utility-commands.js +30 -0
  112. package/dist/commands/cli/utility-commands.js.map +1 -1
  113. package/dist/commands/client-dispatcher.js +22 -2
  114. package/dist/commands/client-dispatcher.js.map +1 -1
  115. package/dist/commands/enhanced-command-handler.js +21 -2
  116. package/dist/commands/enhanced-command-handler.js.map +1 -1
  117. package/dist/commands/handlers/extra-handlers.d.ts +30 -0
  118. package/dist/commands/handlers/extra-handlers.js +547 -0
  119. package/dist/commands/handlers/extra-handlers.js.map +1 -0
  120. package/dist/commands/handlers/index.d.ts +1 -0
  121. package/dist/commands/handlers/index.js +2 -0
  122. package/dist/commands/handlers/index.js.map +1 -1
  123. package/dist/commands/slash/builtin-commands.js +41 -34
  124. package/dist/commands/slash/builtin-commands.js.map +1 -1
  125. package/dist/config/env-schema.d.ts +58 -0
  126. package/dist/config/env-schema.js +789 -0
  127. package/dist/config/env-schema.js.map +1 -0
  128. package/dist/config/feature-flags.js +2 -1
  129. package/dist/config/feature-flags.js.map +1 -1
  130. package/dist/context/bootstrap-loader.d.ts +48 -0
  131. package/dist/context/bootstrap-loader.js +123 -0
  132. package/dist/context/bootstrap-loader.js.map +1 -0
  133. package/dist/context/codebase-rag/chunker.js +2 -2
  134. package/dist/context/codebase-rag/chunker.js.map +1 -1
  135. package/dist/copilot/copilot-proxy.d.ts +15 -1
  136. package/dist/copilot/copilot-proxy.js +92 -23
  137. package/dist/copilot/copilot-proxy.js.map +1 -1
  138. package/dist/daemon/health-monitor.js +11 -7
  139. package/dist/daemon/health-monitor.js.map +1 -1
  140. package/dist/daemon/heartbeat.d.ts +112 -0
  141. package/dist/daemon/heartbeat.js +339 -0
  142. package/dist/daemon/heartbeat.js.map +1 -0
  143. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  144. package/dist/desktop-automation/smart-snapshot.js +38 -0
  145. package/dist/desktop-automation/smart-snapshot.js.map +1 -1
  146. package/dist/extensions/extension-loader.js +4 -0
  147. package/dist/extensions/extension-loader.js.map +1 -1
  148. package/dist/identity/identity-manager.d.ts +95 -0
  149. package/dist/identity/identity-manager.js +242 -0
  150. package/dist/identity/identity-manager.js.map +1 -0
  151. package/dist/index.js +147 -17
  152. package/dist/index.js.map +1 -1
  153. package/dist/input/text-to-speech.js +4 -2
  154. package/dist/input/text-to-speech.js.map +1 -1
  155. package/dist/input/voice-control.js +5 -3
  156. package/dist/input/voice-control.js.map +1 -1
  157. package/dist/integrations/github-integration.js +1 -1
  158. package/dist/integrations/github-integration.js.map +1 -1
  159. package/dist/orchestration/orchestrator.js +3 -0
  160. package/dist/orchestration/orchestrator.js.map +1 -1
  161. package/dist/persistence/conversation-branches.js +2 -1
  162. package/dist/persistence/conversation-branches.js.map +1 -1
  163. package/dist/persistence/session-store.d.ts +1 -1
  164. package/dist/persistence/session-store.js +1 -1
  165. package/dist/persistence/session-store.js.map +1 -1
  166. package/dist/plugins/plugin-system.js +5 -2
  167. package/dist/plugins/plugin-system.js.map +1 -1
  168. package/dist/providers/gemini-provider.js +6 -4
  169. package/dist/providers/gemini-provider.js.map +1 -1
  170. package/dist/providers/local-llm-provider.js +8 -0
  171. package/dist/providers/local-llm-provider.js.map +1 -1
  172. package/dist/sandbox/auto-sandbox.d.ts +59 -0
  173. package/dist/sandbox/auto-sandbox.js +145 -0
  174. package/dist/sandbox/auto-sandbox.js.map +1 -0
  175. package/dist/scheduler/cron-scheduler.js +2 -0
  176. package/dist/scheduler/cron-scheduler.js.map +1 -1
  177. package/dist/scheduler/scheduler.js +11 -2
  178. package/dist/scheduler/scheduler.js.map +1 -1
  179. package/dist/security/audit-logger.d.ts +127 -0
  180. package/dist/security/audit-logger.js +194 -0
  181. package/dist/security/audit-logger.js.map +1 -0
  182. package/dist/security/bash-allowlist/allowlist-store.js +3 -2
  183. package/dist/security/bash-allowlist/allowlist-store.js.map +1 -1
  184. package/dist/security/bash-parser.js +0 -2
  185. package/dist/security/bash-parser.js.map +1 -1
  186. package/dist/security/code-validator.d.ts +51 -0
  187. package/dist/security/code-validator.js +185 -0
  188. package/dist/security/code-validator.js.map +1 -0
  189. package/dist/security/dangerous-patterns.d.ts +68 -0
  190. package/dist/security/dangerous-patterns.js +218 -0
  191. package/dist/security/dangerous-patterns.js.map +1 -0
  192. package/dist/security/remote-approval.d.ts +65 -0
  193. package/dist/security/remote-approval.js +138 -0
  194. package/dist/security/remote-approval.js.map +1 -0
  195. package/dist/security/security-audit.d.ts +7 -0
  196. package/dist/security/security-audit.js +23 -0
  197. package/dist/security/security-audit.js.map +1 -1
  198. package/dist/security/syntax-validator.d.ts +17 -0
  199. package/dist/security/syntax-validator.js +292 -0
  200. package/dist/security/syntax-validator.js.map +1 -0
  201. package/dist/server/index.js +277 -2
  202. package/dist/server/index.js.map +1 -1
  203. package/dist/server/middleware/logging.js +9 -1
  204. package/dist/server/middleware/logging.js.map +1 -1
  205. package/dist/server/routes/memory.js +4 -1
  206. package/dist/server/routes/memory.js.map +1 -1
  207. package/dist/server/routes/metrics.js +1 -1
  208. package/dist/server/routes/metrics.js.map +1 -1
  209. package/dist/server/routes/sessions.js +5 -4
  210. package/dist/server/routes/sessions.js.map +1 -1
  211. package/dist/server/websocket/handler.js +8 -2
  212. package/dist/server/websocket/handler.js.map +1 -1
  213. package/dist/services/prompt-builder.js +16 -0
  214. package/dist/services/prompt-builder.js.map +1 -1
  215. package/dist/skills/hub.d.ts +231 -0
  216. package/dist/skills/hub.js +694 -0
  217. package/dist/skills/hub.js.map +1 -0
  218. package/dist/skills/skill-loader.js +1 -1
  219. package/dist/skills/skill-loader.js.map +1 -1
  220. package/dist/skills/skill-manager.js +2 -1
  221. package/dist/skills/skill-manager.js.map +1 -1
  222. package/dist/skills/skill-registry.js +4 -0
  223. package/dist/skills/skill-registry.js.map +1 -1
  224. package/dist/talk-mode/providers/audioreader-tts.js +1 -0
  225. package/dist/talk-mode/providers/audioreader-tts.js.map +1 -1
  226. package/dist/tools/apply-patch.d.ts +1 -0
  227. package/dist/tools/apply-patch.js +66 -12
  228. package/dist/tools/apply-patch.js.map +1 -1
  229. package/dist/tools/bash/bash-tool.d.ts +123 -0
  230. package/dist/tools/bash/bash-tool.js +549 -0
  231. package/dist/tools/bash/bash-tool.js.map +1 -0
  232. package/dist/tools/bash/command-validator.d.ts +49 -0
  233. package/dist/tools/bash/command-validator.js +223 -0
  234. package/dist/tools/bash/command-validator.js.map +1 -0
  235. package/dist/tools/bash/index.d.ts +7 -0
  236. package/dist/tools/bash/index.js +8 -0
  237. package/dist/tools/bash/index.js.map +1 -0
  238. package/dist/tools/bash/security-patterns.d.ts +44 -0
  239. package/dist/tools/bash/security-patterns.js +234 -0
  240. package/dist/tools/bash/security-patterns.js.map +1 -0
  241. package/dist/tools/bash/streaming-executor.d.ts +23 -0
  242. package/dist/tools/bash/streaming-executor.js +134 -0
  243. package/dist/tools/bash/streaming-executor.js.map +1 -0
  244. package/dist/tools/bash.js +5 -3
  245. package/dist/tools/bash.js.map +1 -1
  246. package/dist/tools/code-formatter.js +41 -27
  247. package/dist/tools/code-formatter.js.map +1 -1
  248. package/dist/tools/code-review.js +1 -1
  249. package/dist/tools/code-review.js.map +1 -1
  250. package/dist/tools/computer-control-tool.js +21 -0
  251. package/dist/tools/computer-control-tool.js.map +1 -1
  252. package/dist/tools/document-tool.js +3 -2
  253. package/dist/tools/document-tool.js.map +1 -1
  254. package/dist/tools/git-tool.d.ts +45 -0
  255. package/dist/tools/git-tool.js +224 -2
  256. package/dist/tools/git-tool.js.map +1 -1
  257. package/dist/tools/index.d.ts +1 -1
  258. package/dist/tools/index.js +1 -1
  259. package/dist/tools/index.js.map +1 -1
  260. package/dist/tools/morph-editor.js +1 -0
  261. package/dist/tools/morph-editor.js.map +1 -1
  262. package/dist/tools/multi-edit.js +31 -3
  263. package/dist/tools/multi-edit.js.map +1 -1
  264. package/dist/tools/notebook-tool.js +8 -2
  265. package/dist/tools/notebook-tool.js.map +1 -1
  266. package/dist/tools/process-tool.d.ts +69 -0
  267. package/dist/tools/process-tool.js +222 -0
  268. package/dist/tools/process-tool.js.map +1 -0
  269. package/dist/tools/registry/git-tools.d.ts +32 -0
  270. package/dist/tools/registry/git-tools.js +211 -0
  271. package/dist/tools/registry/git-tools.js.map +1 -0
  272. package/dist/tools/registry/index.d.ts +2 -0
  273. package/dist/tools/registry/index.js +8 -0
  274. package/dist/tools/registry/index.js.map +1 -1
  275. package/dist/tools/registry/misc-tools.d.ts +32 -4
  276. package/dist/tools/registry/misc-tools.js +230 -90
  277. package/dist/tools/registry/misc-tools.js.map +1 -1
  278. package/dist/tools/registry/process-tools.d.ts +20 -0
  279. package/dist/tools/registry/process-tools.js +141 -0
  280. package/dist/tools/registry/process-tools.js.map +1 -0
  281. package/dist/tools/registry/types.d.ts +2 -0
  282. package/dist/tools/search.js +4 -2
  283. package/dist/tools/search.js.map +1 -1
  284. package/dist/tools/video-tool.js +30 -14
  285. package/dist/tools/video-tool.js.map +1 -1
  286. package/dist/tools/web-search.js +4 -1
  287. package/dist/tools/web-search.js.map +1 -1
  288. package/dist/ui/components/ChatInterface.js +9 -0
  289. package/dist/ui/components/ChatInterface.js.map +1 -1
  290. package/dist/utils/autonomy-manager.js +3 -2
  291. package/dist/utils/autonomy-manager.js.map +1 -1
  292. package/dist/utils/config-validation/schema.d.ts +15 -15
  293. package/dist/utils/confirmation-service.d.ts +16 -0
  294. package/dist/utils/confirmation-service.js +37 -3
  295. package/dist/utils/confirmation-service.js.map +1 -1
  296. package/dist/utils/custom-instructions.js +2 -1
  297. package/dist/utils/custom-instructions.js.map +1 -1
  298. package/dist/utils/diff-generator.js +3 -1
  299. package/dist/utils/diff-generator.js.map +1 -1
  300. package/dist/utils/graceful-shutdown.js +9 -9
  301. package/dist/utils/graceful-shutdown.js.map +1 -1
  302. package/dist/utils/head-tail-truncation.d.ts +18 -0
  303. package/dist/utils/head-tail-truncation.js +127 -0
  304. package/dist/utils/head-tail-truncation.js.map +1 -1
  305. package/dist/utils/history-manager.js +3 -2
  306. package/dist/utils/history-manager.js.map +1 -1
  307. package/dist/utils/logger.d.ts +2 -0
  308. package/dist/utils/logger.js +18 -3
  309. package/dist/utils/logger.js.map +1 -1
  310. package/dist/utils/performance.js +16 -15
  311. package/dist/utils/performance.js.map +1 -1
  312. package/dist/utils/stream-helpers.js +4 -2
  313. package/dist/utils/stream-helpers.js.map +1 -1
  314. package/dist/utils/update-notifier.js +2 -1
  315. package/dist/utils/update-notifier.js.map +1 -1
  316. package/dist/workflows/pipeline.d.ts +54 -1
  317. package/dist/workflows/pipeline.js +128 -7
  318. package/dist/workflows/pipeline.js.map +1 -1
  319. package/dist/workflows/step-manager.js +2 -1
  320. package/dist/workflows/step-manager.js.map +1 -1
  321. 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