beecork 0.3.2 → 1.0.0

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 (204) hide show
  1. package/dist/channels/discord.d.ts +23 -0
  2. package/dist/channels/discord.d.ts.map +1 -0
  3. package/dist/channels/discord.js +240 -0
  4. package/dist/channels/discord.js.map +1 -0
  5. package/dist/channels/index.d.ts +8 -0
  6. package/dist/channels/index.d.ts.map +1 -0
  7. package/dist/channels/index.js +7 -0
  8. package/dist/channels/index.js.map +1 -0
  9. package/dist/channels/loader.d.ts +8 -0
  10. package/dist/channels/loader.d.ts.map +1 -0
  11. package/dist/channels/loader.js +72 -0
  12. package/dist/channels/loader.js.map +1 -0
  13. package/dist/channels/registry.d.ts +24 -0
  14. package/dist/channels/registry.d.ts.map +1 -0
  15. package/dist/channels/registry.js +65 -0
  16. package/dist/channels/registry.js.map +1 -0
  17. package/dist/channels/telegram.d.ts +41 -0
  18. package/dist/channels/telegram.d.ts.map +1 -0
  19. package/dist/channels/telegram.js +606 -0
  20. package/dist/channels/telegram.js.map +1 -0
  21. package/dist/channels/types.d.ts +67 -0
  22. package/dist/channels/types.d.ts.map +1 -0
  23. package/dist/channels/types.js +2 -0
  24. package/dist/channels/types.js.map +1 -0
  25. package/dist/channels/webhook.d.ts +28 -0
  26. package/dist/channels/webhook.d.ts.map +1 -0
  27. package/dist/channels/webhook.js +164 -0
  28. package/dist/channels/webhook.js.map +1 -0
  29. package/dist/channels/whatsapp.d.ts +27 -0
  30. package/dist/channels/whatsapp.d.ts.map +1 -0
  31. package/dist/channels/whatsapp.js +260 -0
  32. package/dist/channels/whatsapp.js.map +1 -0
  33. package/dist/cli/channel.d.ts +4 -0
  34. package/dist/cli/channel.d.ts.map +1 -0
  35. package/dist/cli/channel.js +194 -0
  36. package/dist/cli/channel.js.map +1 -0
  37. package/dist/cli/doctor.d.ts +2 -0
  38. package/dist/cli/doctor.d.ts.map +1 -0
  39. package/dist/cli/doctor.js +150 -0
  40. package/dist/cli/doctor.js.map +1 -0
  41. package/dist/cli/handoff.d.ts +16 -0
  42. package/dist/cli/handoff.d.ts.map +1 -0
  43. package/dist/cli/handoff.js +69 -0
  44. package/dist/cli/handoff.js.map +1 -0
  45. package/dist/cli/mcp.d.ts +4 -0
  46. package/dist/cli/mcp.d.ts.map +1 -0
  47. package/dist/cli/mcp.js +48 -0
  48. package/dist/cli/mcp.js.map +1 -0
  49. package/dist/cli/setup.d.ts.map +1 -1
  50. package/dist/cli/setup.js +47 -10
  51. package/dist/cli/setup.js.map +1 -1
  52. package/dist/config.d.ts.map +1 -1
  53. package/dist/config.js +10 -1
  54. package/dist/config.js.map +1 -1
  55. package/dist/cron/scheduler.d.ts +2 -0
  56. package/dist/cron/scheduler.d.ts.map +1 -1
  57. package/dist/cron/scheduler.js +32 -10
  58. package/dist/cron/scheduler.js.map +1 -1
  59. package/dist/daemon.js +66 -25
  60. package/dist/daemon.js.map +1 -1
  61. package/dist/dashboard/html.d.ts +1 -1
  62. package/dist/dashboard/html.d.ts.map +1 -1
  63. package/dist/dashboard/html.js +396 -111
  64. package/dist/dashboard/html.js.map +1 -1
  65. package/dist/dashboard/server.d.ts.map +1 -1
  66. package/dist/dashboard/server.js +152 -16
  67. package/dist/dashboard/server.js.map +1 -1
  68. package/dist/db/index.d.ts.map +1 -1
  69. package/dist/db/index.js +15 -0
  70. package/dist/db/index.js.map +1 -1
  71. package/dist/db/migrations.d.ts.map +1 -1
  72. package/dist/db/migrations.js +64 -0
  73. package/dist/db/migrations.js.map +1 -1
  74. package/dist/delegation/manager.d.ts +21 -0
  75. package/dist/delegation/manager.d.ts.map +1 -0
  76. package/dist/delegation/manager.js +88 -0
  77. package/dist/delegation/manager.js.map +1 -0
  78. package/dist/index.js +162 -0
  79. package/dist/index.js.map +1 -1
  80. package/dist/machines/forwarder.d.ts +7 -0
  81. package/dist/machines/forwarder.d.ts.map +1 -0
  82. package/dist/machines/forwarder.js +25 -0
  83. package/dist/machines/forwarder.js.map +1 -0
  84. package/dist/machines/index.d.ts +3 -0
  85. package/dist/machines/index.d.ts.map +1 -0
  86. package/dist/machines/index.js +3 -0
  87. package/dist/machines/index.js.map +1 -0
  88. package/dist/machines/registry.d.ts +22 -0
  89. package/dist/machines/registry.d.ts.map +1 -0
  90. package/dist/machines/registry.js +71 -0
  91. package/dist/machines/registry.js.map +1 -0
  92. package/dist/mcp/server.js +265 -32
  93. package/dist/mcp/server.js.map +1 -1
  94. package/dist/media/store.d.ts +11 -0
  95. package/dist/media/store.d.ts.map +1 -0
  96. package/dist/media/store.js +53 -0
  97. package/dist/media/store.js.map +1 -0
  98. package/dist/memory/extractor.js +1 -1
  99. package/dist/memory/extractor.js.map +1 -1
  100. package/dist/notifications/index.d.ts +7 -0
  101. package/dist/notifications/index.d.ts.map +1 -0
  102. package/dist/notifications/index.js +35 -0
  103. package/dist/notifications/index.js.map +1 -0
  104. package/dist/notifications/ntfy.d.ts +10 -0
  105. package/dist/notifications/ntfy.d.ts.map +1 -0
  106. package/dist/notifications/ntfy.js +26 -0
  107. package/dist/notifications/ntfy.js.map +1 -0
  108. package/dist/notifications/pushover.d.ts +10 -0
  109. package/dist/notifications/pushover.d.ts.map +1 -0
  110. package/dist/notifications/pushover.js +27 -0
  111. package/dist/notifications/pushover.js.map +1 -0
  112. package/dist/notifications/types.d.ts +6 -0
  113. package/dist/notifications/types.d.ts.map +1 -0
  114. package/dist/notifications/types.js +2 -0
  115. package/dist/notifications/types.js.map +1 -0
  116. package/dist/notifications/webhook-provider.d.ts +10 -0
  117. package/dist/notifications/webhook-provider.d.ts.map +1 -0
  118. package/dist/notifications/webhook-provider.js +25 -0
  119. package/dist/notifications/webhook-provider.js.map +1 -0
  120. package/dist/observability/analytics.d.ts +26 -0
  121. package/dist/observability/analytics.d.ts.map +1 -0
  122. package/dist/observability/analytics.js +94 -0
  123. package/dist/observability/analytics.js.map +1 -0
  124. package/dist/pipe/memory-store.d.ts +1 -6
  125. package/dist/pipe/memory-store.d.ts.map +1 -1
  126. package/dist/pipe/memory-store.js +0 -24
  127. package/dist/pipe/memory-store.js.map +1 -1
  128. package/dist/pipe/types.d.ts +0 -9
  129. package/dist/pipe/types.d.ts.map +1 -1
  130. package/dist/service/install.d.ts.map +1 -1
  131. package/dist/service/install.js +26 -7
  132. package/dist/service/install.js.map +1 -1
  133. package/dist/service/windows.d.ts +11 -0
  134. package/dist/service/windows.d.ts.map +1 -0
  135. package/dist/service/windows.js +70 -0
  136. package/dist/service/windows.js.map +1 -0
  137. package/dist/session/manager.d.ts.map +1 -1
  138. package/dist/session/manager.js +41 -5
  139. package/dist/session/manager.js.map +1 -1
  140. package/dist/session/subprocess.d.ts +2 -1
  141. package/dist/session/subprocess.d.ts.map +1 -1
  142. package/dist/session/subprocess.js +8 -2
  143. package/dist/session/subprocess.js.map +1 -1
  144. package/dist/types.d.ts +47 -2
  145. package/dist/types.d.ts.map +1 -1
  146. package/dist/types.js +1 -3
  147. package/dist/types.js.map +1 -1
  148. package/dist/users/index.d.ts +3 -0
  149. package/dist/users/index.d.ts.map +1 -0
  150. package/dist/users/index.js +2 -0
  151. package/dist/users/index.js.map +1 -0
  152. package/dist/users/service.d.ts +25 -0
  153. package/dist/users/service.d.ts.map +1 -0
  154. package/dist/users/service.js +65 -0
  155. package/dist/users/service.js.map +1 -0
  156. package/dist/util/logger.d.ts +2 -0
  157. package/dist/util/logger.d.ts.map +1 -1
  158. package/dist/util/logger.js +24 -0
  159. package/dist/util/logger.js.map +1 -1
  160. package/dist/util/platform.d.ts +1 -1
  161. package/dist/util/platform.d.ts.map +1 -1
  162. package/dist/util/platform.js +3 -1
  163. package/dist/util/platform.js.map +1 -1
  164. package/dist/util/rate-limiter.d.ts +15 -0
  165. package/dist/util/rate-limiter.d.ts.map +1 -0
  166. package/dist/util/rate-limiter.js +43 -0
  167. package/dist/util/rate-limiter.js.map +1 -0
  168. package/dist/util/text.d.ts +3 -0
  169. package/dist/util/text.d.ts.map +1 -1
  170. package/dist/util/text.js +19 -0
  171. package/dist/util/text.js.map +1 -1
  172. package/dist/voice/index.d.ts +10 -0
  173. package/dist/voice/index.d.ts.map +1 -0
  174. package/dist/voice/index.js +16 -0
  175. package/dist/voice/index.js.map +1 -0
  176. package/dist/voice/stt.d.ts +15 -0
  177. package/dist/voice/stt.d.ts.map +1 -0
  178. package/dist/voice/stt.js +40 -0
  179. package/dist/voice/stt.js.map +1 -0
  180. package/dist/voice/tts.d.ts +24 -0
  181. package/dist/voice/tts.d.ts.map +1 -0
  182. package/dist/voice/tts.js +85 -0
  183. package/dist/voice/tts.js.map +1 -0
  184. package/package.json +2 -1
  185. package/dist/session/approval.d.ts +0 -20
  186. package/dist/session/approval.d.ts.map +0 -1
  187. package/dist/session/approval.js +0 -59
  188. package/dist/session/approval.js.map +0 -1
  189. package/dist/telegram/bot.d.ts +0 -25
  190. package/dist/telegram/bot.d.ts.map +0 -1
  191. package/dist/telegram/bot.js +0 -307
  192. package/dist/telegram/bot.js.map +0 -1
  193. package/dist/telegram/formatter.d.ts +0 -9
  194. package/dist/telegram/formatter.d.ts.map +0 -1
  195. package/dist/telegram/formatter.js +0 -13
  196. package/dist/telegram/formatter.js.map +0 -1
  197. package/dist/whatsapp/client.d.ts +0 -26
  198. package/dist/whatsapp/client.d.ts.map +0 -1
  199. package/dist/whatsapp/client.js +0 -145
  200. package/dist/whatsapp/client.js.map +0 -1
  201. package/dist/whatsapp/formatter.d.ts +0 -3
  202. package/dist/whatsapp/formatter.d.ts.map +0 -1
  203. package/dist/whatsapp/formatter.js +0 -7
  204. package/dist/whatsapp/formatter.js.map +0 -1
@@ -0,0 +1,67 @@
1
+ import type { TabManager } from '../session/manager.js';
2
+ import type { PipeBrain } from '../pipe/brain.js';
3
+ import type { BeecorkConfig } from '../types.js';
4
+ /** A media file attached to a message */
5
+ export interface MediaAttachment {
6
+ type: 'image' | 'audio' | 'video' | 'document' | 'voice';
7
+ mimeType: string;
8
+ filePath: string;
9
+ fileName?: string;
10
+ duration?: number;
11
+ caption?: string;
12
+ }
13
+ /** An inbound message from any channel */
14
+ export interface InboundMessage {
15
+ channelId: string;
16
+ peerId: string;
17
+ text?: string;
18
+ media?: MediaAttachment[];
19
+ replyTo?: string;
20
+ isGroup: boolean;
21
+ groupId?: string;
22
+ isMentioned?: boolean;
23
+ isReply?: boolean;
24
+ messageId: string;
25
+ raw: unknown;
26
+ }
27
+ /** Options for sending a message */
28
+ export interface SendOptions {
29
+ parseMode?: 'markdown' | 'plain';
30
+ replyToMessageId?: string;
31
+ }
32
+ /** Handler for inbound messages */
33
+ export type InboundMessageHandler = (message: InboundMessage) => Promise<void>;
34
+ /** The Channel interface — all channels must implement this */
35
+ export interface Channel {
36
+ /** Unique channel identifier (e.g., 'telegram', 'whatsapp', 'discord') */
37
+ readonly id: string;
38
+ /** Human-readable name */
39
+ readonly name: string;
40
+ /** Maximum message length in characters */
41
+ readonly maxMessageLength: number;
42
+ /** Whether this channel supports live streaming of responses */
43
+ readonly supportsStreaming: boolean;
44
+ /** Whether this channel supports media attachments */
45
+ readonly supportsMedia: boolean;
46
+ /** Start the channel (connect, start polling, etc.) */
47
+ start(): Promise<void>;
48
+ /** Stop the channel gracefully */
49
+ stop(): void;
50
+ /** Send a text message to a specific peer */
51
+ sendMessage(peerId: string, text: string, options?: SendOptions): Promise<void>;
52
+ /** Send a media attachment to a peer (optional — check supportsMedia) */
53
+ sendMedia?(peerId: string, media: MediaAttachment): Promise<void>;
54
+ /** Send a notification to all configured recipients */
55
+ sendNotification(message: string, urgent?: boolean): Promise<void>;
56
+ /** Set typing indicator for a peer */
57
+ setTyping(peerId: string, active: boolean): Promise<void>;
58
+ /** Register the inbound message handler — called by the registry */
59
+ onMessage(handler: InboundMessageHandler): void;
60
+ }
61
+ /** Context passed to channels during construction */
62
+ export interface ChannelContext {
63
+ config: BeecorkConfig;
64
+ tabManager: TabManager;
65
+ pipeBrain: PipeBrain | null;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,mCAAmC;AACnC,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/E,+DAA+D;AAC/D,MAAM,WAAW,OAAO;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,gEAAgE;IAChE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAEhC,uDAAuD;IACvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,kCAAkC;IAClC,IAAI,IAAI,IAAI,CAAC;IACb,6CAA6C;IAC7C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,yEAAyE;IACzE,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,uDAAuD;IACvD,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,sCAAsC;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,oEAAoE;IACpE,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACjD;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { Channel, ChannelContext, InboundMessageHandler, SendOptions } from './types.js';
2
+ export interface WebhookConfig {
3
+ enabled: boolean;
4
+ port: number;
5
+ authToken?: string;
6
+ hmacSecret?: string;
7
+ }
8
+ export declare class WebhookChannel implements Channel {
9
+ readonly id = "webhook";
10
+ readonly name = "Webhook";
11
+ readonly maxMessageLength = 100000;
12
+ readonly supportsStreaming = false;
13
+ readonly supportsMedia = false;
14
+ private server;
15
+ private ctx;
16
+ private handler;
17
+ private pendingResponses;
18
+ constructor(ctx: ChannelContext);
19
+ start(): Promise<void>;
20
+ stop(): void;
21
+ onMessage(handler: InboundMessageHandler): void;
22
+ sendMessage(peerId: string, text: string, options?: SendOptions): Promise<void>;
23
+ sendNotification(message: string, urgent?: boolean): Promise<void>;
24
+ setTyping(peerId: string, active: boolean): Promise<void>;
25
+ private authenticate;
26
+ private getConfig;
27
+ }
28
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/channels/webhook.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/G,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAe,YAAW,OAAO;IAC5C,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,gBAAgB,UAAU;IACnC,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,aAAa,SAAS;IAE/B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,gBAAgB,CAAiF;gBAE7F,GAAG,EAAE,cAAc;IAIzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqG5B,IAAI,IAAI,IAAI;IAaZ,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAIzC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/E,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,164 @@
1
+ import http from 'node:http';
2
+ import { logger } from '../util/logger.js';
3
+ export class WebhookChannel {
4
+ id = 'webhook';
5
+ name = 'Webhook';
6
+ maxMessageLength = 100000; // Webhooks can handle large payloads
7
+ supportsStreaming = false;
8
+ supportsMedia = false;
9
+ server = null;
10
+ ctx;
11
+ handler = null;
12
+ pendingResponses = new Map();
13
+ constructor(ctx) {
14
+ this.ctx = ctx;
15
+ }
16
+ async start() {
17
+ const config = this.getConfig();
18
+ if (!config?.enabled)
19
+ return;
20
+ const port = config.port || 8374;
21
+ this.server = http.createServer(async (req, res) => {
22
+ // CORS headers for API clients
23
+ res.setHeader('Content-Type', 'application/json');
24
+ if (req.method === 'OPTIONS') {
25
+ res.writeHead(204);
26
+ res.end();
27
+ return;
28
+ }
29
+ if (req.method !== 'POST') {
30
+ res.writeHead(405);
31
+ res.end(JSON.stringify({ error: 'Method not allowed' }));
32
+ return;
33
+ }
34
+ // Parse URL
35
+ const url = new URL(req.url || '/', `http://localhost:${port}`);
36
+ const match = url.pathname.match(/^\/webhook\/(.+)$/);
37
+ if (!match) {
38
+ res.writeHead(404);
39
+ res.end(JSON.stringify({ error: 'Use POST /webhook/:tabName' }));
40
+ return;
41
+ }
42
+ const tabName = decodeURIComponent(match[1]);
43
+ // Auth check
44
+ if (!this.authenticate(req, config)) {
45
+ res.writeHead(401);
46
+ res.end(JSON.stringify({ error: 'Unauthorized' }));
47
+ return;
48
+ }
49
+ // Read body
50
+ let body = '';
51
+ for await (const chunk of req) {
52
+ body += chunk;
53
+ if (body.length > 1024 * 1024) { // 1MB limit
54
+ res.writeHead(413);
55
+ res.end(JSON.stringify({ error: 'Payload too large' }));
56
+ return;
57
+ }
58
+ }
59
+ let payload;
60
+ try {
61
+ payload = JSON.parse(body);
62
+ }
63
+ catch {
64
+ res.writeHead(400);
65
+ res.end(JSON.stringify({ error: 'Invalid JSON' }));
66
+ return;
67
+ }
68
+ const prompt = payload.prompt || payload.message || '';
69
+ if (!prompt) {
70
+ res.writeHead(400);
71
+ res.end(JSON.stringify({ error: 'Missing "prompt" or "message" field' }));
72
+ return;
73
+ }
74
+ const isSync = payload.sync ?? false;
75
+ try {
76
+ if (isSync) {
77
+ // Sync mode: wait for Claude response
78
+ const result = await this.ctx.tabManager.sendMessage(tabName, prompt);
79
+ res.writeHead(result.error ? 500 : 200);
80
+ res.end(JSON.stringify({
81
+ text: result.text,
82
+ tab: tabName,
83
+ costUsd: result.costUsd,
84
+ durationMs: result.durationMs,
85
+ error: result.error,
86
+ }));
87
+ }
88
+ else {
89
+ // Async mode: accept and process in background
90
+ this.ctx.tabManager.sendMessage(tabName, prompt).catch(err => {
91
+ logger.error(`Webhook async processing failed for tab ${tabName}:`, err);
92
+ });
93
+ res.writeHead(202);
94
+ res.end(JSON.stringify({ accepted: true, tab: tabName }));
95
+ }
96
+ }
97
+ catch (err) {
98
+ logger.error('Webhook handler error:', err);
99
+ res.writeHead(500);
100
+ res.end(JSON.stringify({ error: 'Internal error' }));
101
+ }
102
+ });
103
+ this.server.listen(port, '127.0.0.1', () => {
104
+ logger.info(`Webhook channel listening on http://127.0.0.1:${port}/webhook/:tabName`);
105
+ });
106
+ }
107
+ stop() {
108
+ if (this.server) {
109
+ this.server.close();
110
+ this.server = null;
111
+ }
112
+ // Clean up pending responses
113
+ for (const [, pending] of this.pendingResponses) {
114
+ clearTimeout(pending.timer);
115
+ }
116
+ this.pendingResponses.clear();
117
+ logger.info('Webhook channel stopped');
118
+ }
119
+ onMessage(handler) {
120
+ this.handler = handler;
121
+ }
122
+ async sendMessage(peerId, text, options) {
123
+ // Webhooks are request-response — responses are sent in the HTTP handler
124
+ // This is used for sync mode responses
125
+ const pending = this.pendingResponses.get(peerId);
126
+ if (pending) {
127
+ clearTimeout(pending.timer);
128
+ pending.resolve(text);
129
+ this.pendingResponses.delete(peerId);
130
+ }
131
+ }
132
+ async sendNotification(message, urgent) {
133
+ // Webhook channel doesn't have persistent connections to send notifications to
134
+ // Notifications go through other channels
135
+ }
136
+ async setTyping(peerId, active) {
137
+ // No typing indicators for webhooks
138
+ }
139
+ authenticate(req, config) {
140
+ // No auth configured = allow all (localhost only)
141
+ if (!config.authToken && !config.hmacSecret)
142
+ return true;
143
+ // Bearer token auth
144
+ if (config.authToken) {
145
+ const authHeader = req.headers.authorization;
146
+ if (authHeader === `Bearer ${config.authToken}`)
147
+ return true;
148
+ }
149
+ // HMAC signature auth (for GitHub-style webhooks)
150
+ if (config.hmacSecret) {
151
+ const signature = req.headers['x-hub-signature-256'];
152
+ if (signature) {
153
+ // Body needs to be read first for HMAC — simplified here
154
+ // Full HMAC validation would require buffering the body first
155
+ return true; // TODO: implement full HMAC verification
156
+ }
157
+ }
158
+ return false;
159
+ }
160
+ getConfig() {
161
+ return this.ctx.config.webhook;
162
+ }
163
+ }
164
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/channels/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Channel, ChannelContext, InboundMessageHandler, SendOptions } from './types.js';
2
+ export declare class WhatsAppChannel implements Channel {
3
+ readonly id = "whatsapp";
4
+ readonly name = "WhatsApp";
5
+ readonly maxMessageLength = 8192;
6
+ readonly supportsStreaming = false;
7
+ readonly supportsMedia = true;
8
+ private sock;
9
+ private ctx;
10
+ private allowedNumbers;
11
+ private reconnectAttempts;
12
+ private readonly maxReconnectAttempts;
13
+ private readonly backoffDelays;
14
+ private messageHandler;
15
+ private sttProvider;
16
+ private ttsProvider;
17
+ constructor(ctx: ChannelContext);
18
+ start(): Promise<void>;
19
+ stop(): void;
20
+ sendMessage(peerId: string, text: string, _options?: SendOptions): Promise<void>;
21
+ sendNotification(message: string, _urgent?: boolean): Promise<void>;
22
+ setTyping(peerId: string, active: boolean): Promise<void>;
23
+ onMessage(handler: InboundMessageHandler): void;
24
+ private sendResponse;
25
+ private isAllowed;
26
+ }
27
+ //# sourceMappingURL=whatsapp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../src/channels/whatsapp.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAC;AAO/G,qBAAa,eAAgB,YAAW,OAAO;IAC7C,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,gBAAgB,QAAuB;IAChD,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,aAAa,QAAQ;IAE9B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAM;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqC;IACnE,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAA4B;gBAEnC,GAAG,EAAE,cAAc;IAKzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6L5B,IAAI,IAAI,IAAI;IASN,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAahF,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;YAMjC,YAAY;IAiB1B,OAAO,CAAC,SAAS;CAKlB"}
@@ -0,0 +1,260 @@
1
+ import fs from 'node:fs';
2
+ import { logger } from '../util/logger.js';
3
+ import { saveMedia, isOversized } from '../media/store.js';
4
+ import { retryWithBackoff } from '../util/retry.js';
5
+ import { chunkText, parseTabMessage, buildMediaPrompt } from '../util/text.js';
6
+ import { inboundLimiter } from '../util/rate-limiter.js';
7
+ import { initVoiceProviders } from '../voice/index.js';
8
+ const WHATSAPP_MAX_LENGTH = 8192;
9
+ export class WhatsAppChannel {
10
+ id = 'whatsapp';
11
+ name = 'WhatsApp';
12
+ maxMessageLength = WHATSAPP_MAX_LENGTH;
13
+ supportsStreaming = false;
14
+ supportsMedia = true;
15
+ sock = null;
16
+ ctx;
17
+ allowedNumbers;
18
+ reconnectAttempts = 0;
19
+ maxReconnectAttempts = 10;
20
+ backoffDelays = [1000, 5000, 15000, 30000, 60000];
21
+ messageHandler = null;
22
+ sttProvider = null;
23
+ ttsProvider = null;
24
+ constructor(ctx) {
25
+ this.ctx = ctx;
26
+ this.allowedNumbers = new Set(ctx.config.whatsapp?.allowedNumbers ?? []);
27
+ }
28
+ async start() {
29
+ // Initialize voice providers
30
+ const { stt, tts } = initVoiceProviders(this.ctx.config.voice);
31
+ this.sttProvider = stt;
32
+ this.ttsProvider = tts;
33
+ try {
34
+ const { default: makeWASocket, useMultiFileAuthState, DisconnectReason, downloadMediaMessage } = await import('@whiskeysockets/baileys');
35
+ const sessionPath = this.ctx.config.whatsapp?.sessionPath ?? `${process.env.HOME}/.beecork/whatsapp-session`;
36
+ fs.mkdirSync(sessionPath, { recursive: true, mode: 0o700 });
37
+ const { state, saveCreds } = await useMultiFileAuthState(sessionPath);
38
+ this.sock = makeWASocket({
39
+ auth: state,
40
+ printQRInTerminal: true,
41
+ });
42
+ const sock = this.sock;
43
+ sock.ev.on('creds.update', saveCreds);
44
+ sock.ev.on('connection.update', (update) => {
45
+ const { connection, lastDisconnect } = update;
46
+ if (connection === 'close') {
47
+ const reason = lastDisconnect?.error?.output?.statusCode;
48
+ if (reason !== DisconnectReason.loggedOut) {
49
+ this.reconnectAttempts++;
50
+ if (this.reconnectAttempts > this.maxReconnectAttempts) {
51
+ logger.error(`WhatsApp reconnect failed after ${this.maxReconnectAttempts} attempts, giving up`);
52
+ return;
53
+ }
54
+ const delayIdx = Math.min(this.reconnectAttempts - 1, this.backoffDelays.length - 1);
55
+ const delay = this.backoffDelays[delayIdx];
56
+ logger.warn(`WhatsApp connection closed, reconnecting in ${delay / 1000}s (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})...`);
57
+ setTimeout(() => {
58
+ this.start().catch(err => {
59
+ logger.error('WhatsApp reconnect failed:', err);
60
+ });
61
+ }, delay);
62
+ }
63
+ else {
64
+ logger.error('WhatsApp logged out. Please re-scan QR code.');
65
+ }
66
+ }
67
+ else if (connection === 'open') {
68
+ this.reconnectAttempts = 0;
69
+ logger.info('WhatsApp connected');
70
+ }
71
+ });
72
+ sock.ev.on('messages.upsert', async (m) => {
73
+ const msg = m.messages[0];
74
+ if (!msg?.message || msg.key.fromMe)
75
+ return;
76
+ const sender = msg.key.remoteJid;
77
+ if (!sender || !this.isAllowed(sender))
78
+ return;
79
+ // Rate limit check
80
+ if (!inboundLimiter.check(this.id)) {
81
+ await sock.sendMessage(sender, { text: "I'm receiving too many messages right now. Please wait a moment." }).catch(() => { });
82
+ return;
83
+ }
84
+ const text = msg.message.conversation ||
85
+ msg.message.extendedTextMessage?.text ||
86
+ msg.message.imageMessage?.caption ||
87
+ msg.message.videoMessage?.caption || '';
88
+ // Download media (in parallel)
89
+ const waDownloadTasks = [];
90
+ if (msg.message.imageMessage) {
91
+ waDownloadTasks.push(downloadMediaMessage(msg, 'buffer', {})
92
+ .then((buffer) => {
93
+ if (buffer && !isOversized(buffer.length)) {
94
+ const filePath = saveMedia(buffer, 'jpg');
95
+ return { type: 'image', mimeType: msg.message.imageMessage.mimetype || 'image/jpeg', filePath };
96
+ }
97
+ return null;
98
+ })
99
+ .catch(() => null));
100
+ }
101
+ if (msg.message.audioMessage) {
102
+ waDownloadTasks.push(downloadMediaMessage(msg, 'buffer', {})
103
+ .then((buffer) => {
104
+ if (buffer && !isOversized(buffer.length)) {
105
+ const ext = msg.message.audioMessage.ptt ? 'ogg' : 'mp3';
106
+ const filePath = saveMedia(buffer, ext);
107
+ return {
108
+ type: (msg.message.audioMessage.ptt ? 'voice' : 'audio'),
109
+ mimeType: msg.message.audioMessage.mimetype || 'audio/ogg',
110
+ filePath,
111
+ duration: msg.message.audioMessage.seconds ?? undefined,
112
+ };
113
+ }
114
+ return null;
115
+ })
116
+ .catch(() => null));
117
+ }
118
+ if (msg.message.documentMessage) {
119
+ waDownloadTasks.push(downloadMediaMessage(msg, 'buffer', {})
120
+ .then((buffer) => {
121
+ if (buffer && !isOversized(buffer.length)) {
122
+ const ext = msg.message.documentMessage.fileName?.split('.').pop() || 'bin';
123
+ const filePath = saveMedia(buffer, ext, msg.message.documentMessage.fileName ?? undefined);
124
+ return { type: 'document', mimeType: msg.message.documentMessage.mimetype || 'application/octet-stream', filePath, fileName: msg.message.documentMessage.fileName ?? undefined };
125
+ }
126
+ return null;
127
+ })
128
+ .catch(() => null));
129
+ }
130
+ if (msg.message.videoMessage) {
131
+ waDownloadTasks.push(downloadMediaMessage(msg, 'buffer', {})
132
+ .then((buffer) => {
133
+ if (buffer && !isOversized(buffer.length)) {
134
+ const filePath = saveMedia(buffer, 'mp4');
135
+ return { type: 'video', mimeType: msg.message.videoMessage.mimetype || 'video/mp4', filePath, duration: msg.message.videoMessage.seconds ?? undefined };
136
+ }
137
+ return null;
138
+ })
139
+ .catch(() => null));
140
+ }
141
+ const waResults = await Promise.allSettled(waDownloadTasks);
142
+ const media = waResults
143
+ .filter((r) => r.status === 'fulfilled' && r.value !== null)
144
+ .map(r => r.value);
145
+ // Transcribe voice messages if STT is configured
146
+ if (this.sttProvider) {
147
+ for (const att of media) {
148
+ if (att.type === 'voice' && att.filePath) {
149
+ try {
150
+ const transcription = await this.sttProvider.transcribe(att.filePath);
151
+ att.caption = `[Transcribed from voice message]: ${transcription}`;
152
+ }
153
+ catch (err) {
154
+ logger.warn('Voice transcription failed, passing file path instead:', err);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ if (!text && media.length === 0)
160
+ return;
161
+ try {
162
+ const { tabName, prompt: rawPrompt } = parseTabMessage(text);
163
+ if (!rawPrompt && media.length === 0)
164
+ return;
165
+ // Build prompt with media references
166
+ const prompt = buildMediaPrompt(media, rawPrompt);
167
+ await sock.sendPresenceUpdate('composing', sender).catch(() => { });
168
+ const result = await this.ctx.tabManager.sendMessage(tabName, prompt);
169
+ const responseText = result.error
170
+ ? `Error: ${result.text}`
171
+ : result.text || '(empty response)';
172
+ await sock.sendPresenceUpdate('paused', sender).catch(() => { });
173
+ // TTS: send voice reply if configured
174
+ const voiceReplyMode = this.ctx.config.voice?.replyMode;
175
+ if (this.ttsProvider && (voiceReplyMode === 'voice' || voiceReplyMode === 'both')) {
176
+ try {
177
+ const audioPath = await this.ttsProvider.synthesize(responseText);
178
+ await sock.sendMessage(sender, { audio: { url: audioPath }, mimetype: 'audio/ogg; codecs=opus', ptt: true });
179
+ if (voiceReplyMode === 'voice')
180
+ return; // Don't send text
181
+ }
182
+ catch (err) {
183
+ logger.warn('TTS failed, sending text reply:', err);
184
+ }
185
+ }
186
+ await this.sendResponse(sender, responseText, tabName);
187
+ }
188
+ catch (err) {
189
+ logger.error('WhatsApp message handler error:', err);
190
+ await sock.sendMessage(sender, { text: 'Something went wrong processing your message. Check daemon logs for details.' }).catch(() => { });
191
+ }
192
+ });
193
+ }
194
+ catch (err) {
195
+ logger.error('Failed to start WhatsApp client:', err);
196
+ throw err;
197
+ }
198
+ }
199
+ stop() {
200
+ const sock = this.sock;
201
+ if (sock) {
202
+ sock.end(undefined);
203
+ this.sock = null;
204
+ }
205
+ logger.info('WhatsApp client stopped');
206
+ }
207
+ async sendMessage(peerId, text, _options) {
208
+ const sock = this.sock;
209
+ if (!sock)
210
+ return;
211
+ const chunks = chunkText(text, WHATSAPP_MAX_LENGTH);
212
+ for (const chunk of chunks) {
213
+ await retryWithBackoff(() => sock.sendMessage(peerId, { text: chunk }), [1000, 5000, 15000], 'whatsapp-send');
214
+ }
215
+ }
216
+ async sendNotification(message, _urgent) {
217
+ const sock = this.sock;
218
+ if (!sock)
219
+ return;
220
+ for (const number of this.allowedNumbers) {
221
+ try {
222
+ await sock.sendMessage(`${number}@s.whatsapp.net`, { text: message });
223
+ }
224
+ catch (err) {
225
+ logger.error(`Failed to send WhatsApp notification to ${number}:`, err);
226
+ }
227
+ }
228
+ }
229
+ async setTyping(peerId, active) {
230
+ const sock = this.sock;
231
+ if (!sock)
232
+ return;
233
+ const status = active ? 'composing' : 'paused';
234
+ await sock.sendPresenceUpdate(status, peerId).catch(() => { });
235
+ }
236
+ onMessage(handler) {
237
+ this.messageHandler = handler;
238
+ }
239
+ // ─── Private ───
240
+ async sendResponse(jid, text, tabName) {
241
+ const prefix = tabName && tabName !== 'default' ? `[${tabName}] ` : '';
242
+ const chunks = chunkText(prefix + text, WHATSAPP_MAX_LENGTH);
243
+ const sock = this.sock;
244
+ for (const chunk of chunks) {
245
+ try {
246
+ await retryWithBackoff(() => sock.sendMessage(jid, { text: chunk }), [1000, 5000, 15000], 'whatsapp-send');
247
+ }
248
+ catch (err) {
249
+ logger.error(`WhatsApp delivery failed for ${jid}:`, err);
250
+ }
251
+ }
252
+ }
253
+ isAllowed(jid) {
254
+ if (this.allowedNumbers.size === 0)
255
+ return false;
256
+ const number = jid.replace('@s.whatsapp.net', '');
257
+ return this.allowedNumbers.has(number);
258
+ }
259
+ }
260
+ //# sourceMappingURL=whatsapp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../src/channels/whatsapp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function channelInstall(packageName: string): void;
2
+ export declare function channelCreate(name: string): void;
3
+ export declare function channelList(): void;
4
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/cli/channel.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAaxD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkKhD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAiBlC"}