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
@@ -1,307 +0,0 @@
1
- import TelegramBot from 'node-telegram-bot-api';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import { chunkText, formatTabStatus } from './formatter.js';
5
- import { parseTabMessage } from '../util/text.js';
6
- import { logger } from '../util/logger.js';
7
- import { retryWithBackoff } from '../util/retry.js';
8
- import { getAdminUserId, validateTabName } from '../config.js';
9
- import { getLogsDir } from '../util/paths.js';
10
- export class BeecorkTelegramBot {
11
- bot;
12
- tabManager;
13
- pipeBrain;
14
- config;
15
- activeChatIds = new Set();
16
- constructor(config, tabManager, pipeBrain = null) {
17
- this.config = config;
18
- this.tabManager = tabManager;
19
- this.pipeBrain = pipeBrain;
20
- // Clear any stale polling from previous instances before starting
21
- this.bot = new TelegramBot(config.telegram.token, {
22
- polling: {
23
- params: {
24
- timeout: 30,
25
- allowed_updates: ['message', 'callback_query'],
26
- },
27
- autoStart: false,
28
- },
29
- });
30
- // Drop pending updates from old sessions, then start polling
31
- this.bot.sendMessage = this.bot.sendMessage.bind(this.bot);
32
- fetch(`https://api.telegram.org/bot${config.telegram.token}/deleteWebhook?drop_pending_updates=true`)
33
- .then(() => {
34
- this.bot.startPolling();
35
- this.setupHandlers();
36
- logger.info('Telegram bot started (polling mode, cleared pending updates)');
37
- })
38
- .catch((err) => {
39
- logger.error('Failed to clear pending updates, starting anyway:', err);
40
- this.bot.startPolling();
41
- this.setupHandlers();
42
- });
43
- }
44
- setupHandlers() {
45
- this.bot.on('message', async (msg) => {
46
- if (!this.isAllowed(msg.from?.id))
47
- return;
48
- const chatId = msg.chat.id;
49
- if (msg.chat.type === 'private') {
50
- this.activeChatIds.add(chatId);
51
- }
52
- const text = msg.text?.trim();
53
- if (!text)
54
- return;
55
- try {
56
- // Commands bypass debouncing
57
- if (text.startsWith('/')) {
58
- await this.handleCommand(chatId, text, msg.from?.id, msg.message_id);
59
- return;
60
- }
61
- // Send typing indicator immediately so user knows bot received it
62
- this.bot.sendChatAction(chatId, 'typing').catch((err) => {
63
- logger.error(`Typing indicator failed for chat ${chatId}:`, err);
64
- });
65
- logger.info(`[telegram] Message received from ${msg.from?.id}, sending typing`);
66
- // Skip debounce — send immediately for responsiveness
67
- // (debounce adds latency and complexity; queue handles rapid messages)
68
- await this.handleMessage(chatId, text, msg.message_id);
69
- }
70
- catch (err) {
71
- logger.error('Telegram: error handling message:', err);
72
- await this.bot.sendMessage(chatId, 'Something went wrong processing your message. Check daemon logs for details.');
73
- }
74
- });
75
- }
76
- async handleCommand(chatId, text, userId, messageId) {
77
- if (text === '/tabs' || text.startsWith('/tabs@')) {
78
- const tabs = this.tabManager.listTabs();
79
- const formatted = formatTabStatus(tabs);
80
- await this.bot.sendMessage(chatId, formatted);
81
- return;
82
- }
83
- if (text.startsWith('/stop ')) {
84
- if (!this.isAdmin(userId)) {
85
- await this.bot.sendMessage(chatId, 'Only admin can stop tabs.');
86
- return;
87
- }
88
- const tabName = text.slice(6).trim();
89
- this.tabManager.stopTab(tabName);
90
- await this.bot.sendMessage(chatId, `Stopped tab: ${tabName}`);
91
- return;
92
- }
93
- if (text.startsWith('/tab ')) {
94
- // Validate tab name
95
- const rest = text.slice(5);
96
- const spaceIdx = rest.indexOf(' ');
97
- if (spaceIdx === -1) {
98
- await this.bot.sendMessage(chatId, `Usage: /tab <name> <message>`);
99
- return;
100
- }
101
- const tabName = rest.slice(0, spaceIdx);
102
- const validationError = validateTabName(tabName);
103
- if (validationError) {
104
- await this.bot.sendMessage(chatId, `Invalid tab name: ${validationError}`);
105
- return;
106
- }
107
- // Fall through to handleMessage
108
- await this.handleMessage(chatId, text, messageId);
109
- return;
110
- }
111
- // Unknown command — treat as regular message
112
- await this.handleMessage(chatId, text, messageId);
113
- }
114
- async handleMessage(chatId, text, messageId) {
115
- const { tabName, prompt } = this.parseMessage(text);
116
- if (!prompt)
117
- return;
118
- logger.info(`[telegram] Handling message for tab "${tabName}" (chat: ${chatId}, msg: ${messageId})`);
119
- // React with ⏳
120
- await this.setReaction(chatId, messageId, '⏳');
121
- // Typing indicator — keep refreshing every 4s (Telegram expires it after 5s)
122
- const sendTyping = () => this.bot.sendChatAction(chatId, 'typing').catch((err) => {
123
- logger.error(`Typing indicator failed:`, err);
124
- });
125
- await sendTyping();
126
- const typingInterval = setInterval(sendTyping, 4000);
127
- // "Still working" timeout
128
- const stillWorkingTimeout = setTimeout(() => {
129
- this.bot.sendMessage(chatId, `Still working on your request in tab "${tabName}"...`).catch(() => { });
130
- }, 120000); // 2 minutes
131
- try {
132
- let responseText;
133
- let responseError;
134
- let responseTab = tabName;
135
- if (this.pipeBrain) {
136
- // Intelligent routing + goal tracking via PipeBrain
137
- const pipeResult = await this.pipeBrain.process(text, { chatId, userId: 0, messageId });
138
- responseText = pipeResult.response.text || '(empty response)';
139
- responseError = pipeResult.response.error;
140
- responseTab = pipeResult.tabName;
141
- // Send transparency decisions
142
- if (pipeResult.decisions.length > 0) {
143
- const decisionText = pipeResult.decisions.join('\n');
144
- await this.bot.sendMessage(chatId, decisionText);
145
- }
146
- }
147
- else {
148
- // Dumb pipe — direct routing with streaming
149
- let streamMsgId = null;
150
- let streamBuffer = '';
151
- let lastEditTime = 0;
152
- const onTextChunk = async (chunk) => {
153
- streamBuffer += chunk;
154
- const now = Date.now();
155
- if (streamBuffer.length < 100 || now - lastEditTime < 1000)
156
- return;
157
- lastEditTime = now;
158
- try {
159
- const prefix = tabName !== 'default' ? `[${tabName}] ` : '';
160
- const preview = prefix + streamBuffer.slice(0, 4000) + (streamBuffer.length > 4000 ? '...' : '');
161
- if (!streamMsgId) {
162
- const sent = await this.bot.sendMessage(chatId, preview);
163
- streamMsgId = sent.message_id;
164
- }
165
- else {
166
- await this.bot.editMessageText(preview, { chat_id: chatId, message_id: streamMsgId });
167
- }
168
- }
169
- catch { /* edit failures are non-critical */ }
170
- };
171
- const result = await this.tabManager.sendMessage(tabName, prompt, { onTextChunk });
172
- responseText = result.text || '(empty response)';
173
- responseError = result.error;
174
- // If we streamed, do a final edit instead of sending a new message
175
- if (streamMsgId && !responseError) {
176
- clearInterval(typingInterval);
177
- clearTimeout(stillWorkingTimeout);
178
- await this.setReaction(chatId, messageId, '✅');
179
- try {
180
- const prefix = tabName !== 'default' ? `[${tabName}] ` : '';
181
- const finalText = prefix + responseText;
182
- if (finalText.length <= 4096) {
183
- await this.bot.editMessageText(finalText, { chat_id: chatId, message_id: streamMsgId });
184
- }
185
- else {
186
- await this.sendResponse(chatId, responseText, tabName);
187
- }
188
- }
189
- catch {
190
- await this.sendResponse(chatId, responseText, tabName);
191
- }
192
- return; // DONE — don't fall through to sendResponse below
193
- }
194
- }
195
- clearInterval(typingInterval);
196
- clearTimeout(stillWorkingTimeout);
197
- if (responseError) {
198
- await this.setReaction(chatId, messageId, '❌');
199
- await this.sendResponse(chatId, `Error: ${responseText}`, responseTab);
200
- return;
201
- }
202
- await this.setReaction(chatId, messageId, '✅');
203
- await this.sendResponse(chatId, responseText, responseTab);
204
- }
205
- catch (err) {
206
- clearInterval(typingInterval);
207
- clearTimeout(stillWorkingTimeout);
208
- await this.setReaction(chatId, messageId, '❌');
209
- throw err;
210
- }
211
- }
212
- parseMessage(text) {
213
- return parseTabMessage(text);
214
- }
215
- async sendResponse(chatId, text, tabName) {
216
- const prefix = tabName && tabName !== 'default' ? `[${tabName}] ` : '';
217
- const fullText = prefix + text;
218
- const chunks = chunkText(fullText);
219
- // For very long outputs: send first 3 chunks + file
220
- if (chunks.length > 10) {
221
- for (let i = 0; i < 3; i++) {
222
- await this.sendWithRetry(chatId, chunks[i]);
223
- }
224
- // Send rest as file
225
- const tmpPath = path.join(getLogsDir(), `response-${Date.now()}.txt`);
226
- fs.writeFileSync(tmpPath, fullText);
227
- await this.bot.sendDocument(chatId, tmpPath, { caption: `Full response (${chunks.length} chunks)` });
228
- fs.unlinkSync(tmpPath);
229
- return;
230
- }
231
- for (const chunk of chunks) {
232
- await this.sendWithRetry(chatId, chunk);
233
- }
234
- }
235
- async sendWithRetry(chatId, text) {
236
- try {
237
- await retryWithBackoff(async () => {
238
- try {
239
- await this.bot.sendMessage(chatId, text, { parse_mode: 'Markdown' });
240
- }
241
- catch {
242
- await this.bot.sendMessage(chatId, text); // Fallback to plain text
243
- }
244
- }, [1000, 5000, 15000], 'telegram-send');
245
- }
246
- catch (err) {
247
- // Log to delivery failures
248
- const failLog = path.join(getLogsDir(), 'delivery-failures.log');
249
- const entry = `[${new Date().toISOString()}] chatId=${chatId} error=${err instanceof Error ? err.message : err} text=${text.slice(0, 200)}\n`;
250
- fs.appendFileSync(failLog, entry);
251
- logger.error(`Delivery failed after retries for chat ${chatId}`);
252
- }
253
- }
254
- /** Send a notification to all allowed users */
255
- async sendNotification(text) {
256
- for (const chatId of this.activeChatIds) {
257
- try {
258
- await this.bot.sendMessage(chatId, text);
259
- }
260
- catch (err) {
261
- logger.error(`Failed to send notification to chat ${chatId}:`, err);
262
- }
263
- }
264
- for (const userId of this.config.telegram.allowedUserIds) {
265
- if (this.activeChatIds.has(userId))
266
- continue;
267
- try {
268
- await this.bot.sendMessage(userId, text);
269
- this.activeChatIds.add(userId);
270
- }
271
- catch { /* User hasn't started conversation yet */ }
272
- }
273
- }
274
- stop() {
275
- this.bot.stopPolling();
276
- logger.info('Telegram bot stopped');
277
- }
278
- isAllowed(userId) {
279
- if (!userId)
280
- return false;
281
- return this.config.telegram.allowedUserIds.includes(userId);
282
- }
283
- isAdmin(userId) {
284
- if (!userId)
285
- return false;
286
- return userId === getAdminUserId();
287
- }
288
- /** Set emoji reaction on a message via raw Telegram API */
289
- async setReaction(chatId, messageId, emoji) {
290
- try {
291
- const url = `https://api.telegram.org/bot${this.config.telegram.token}/setMessageReaction`;
292
- await fetch(url, {
293
- method: 'POST',
294
- headers: { 'Content-Type': 'application/json' },
295
- body: JSON.stringify({
296
- chat_id: chatId,
297
- message_id: messageId,
298
- reaction: [{ type: 'emoji', emoji }],
299
- }),
300
- });
301
- }
302
- catch {
303
- // Reactions not supported or failed — non-critical
304
- }
305
- }
306
- }
307
- //# sourceMappingURL=bot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/telegram/bot.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { chunkText } from '../util/text.js';
2
- export { chunkText };
3
- /** Format a tab status message */
4
- export declare function formatTabStatus(tabs: Array<{
5
- name: string;
6
- status: string;
7
- lastActivityAt: string;
8
- }>): string;
9
- //# sourceMappingURL=formatter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/telegram/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAW,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAM7G"}
@@ -1,13 +0,0 @@
1
- import { chunkText, timeAgo } from '../util/text.js';
2
- // Re-export for existing imports
3
- export { chunkText };
4
- /** Format a tab status message */
5
- export function formatTabStatus(tabs) {
6
- if (tabs.length === 0)
7
- return 'No tabs.';
8
- return tabs.map(t => {
9
- const ago = timeAgo(t.lastActivityAt);
10
- return `• ${t.name} [${t.status}] — ${ago}`;
11
- }).join('\n');
12
- }
13
- //# sourceMappingURL=formatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/telegram/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAErD,iCAAiC;AACjC,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,kCAAkC;AAClC,MAAM,UAAU,eAAe,CAAC,IAAqE;IACnG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAClB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,OAAO,GAAG,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -1,26 +0,0 @@
1
- import type { TabManager } from '../session/manager.js';
2
- import type { BeecorkConfig } from '../types.js';
3
- /**
4
- * WhatsApp client via Baileys.
5
- * Uses @whiskeysockets/baileys for reverse-engineered WhatsApp Web connection.
6
- * Session is persisted in ~/.beecork/whatsapp-session/
7
- *
8
- * NOTE: This violates WhatsApp ToS. For personal use only.
9
- */
10
- export declare class BeecorkWhatsAppClient {
11
- private sock;
12
- private tabManager;
13
- private config;
14
- private allowedNumbers;
15
- private reconnectAttempts;
16
- private readonly maxReconnectAttempts;
17
- private readonly backoffDelays;
18
- constructor(config: BeecorkConfig, tabManager: TabManager);
19
- start(): Promise<void>;
20
- private parseMessage;
21
- sendResponse(jid: string, text: string, tabName?: string): Promise<void>;
22
- sendNotification(text: string): Promise<void>;
23
- stop(): void;
24
- private isAllowed;
25
- }
26
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/whatsapp/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAM;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqC;gBAEvD,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU;IAMnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiF5B,OAAO,CAAC,YAAY;IAId,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxE,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnD,IAAI,IAAI,IAAI;IASZ,OAAO,CAAC,SAAS;CAKlB"}
@@ -1,145 +0,0 @@
1
- import { logger } from '../util/logger.js';
2
- import { retryWithBackoff } from '../util/retry.js';
3
- import { chunkTextWA } from './formatter.js';
4
- import { parseTabMessage } from '../util/text.js';
5
- /**
6
- * WhatsApp client via Baileys.
7
- * Uses @whiskeysockets/baileys for reverse-engineered WhatsApp Web connection.
8
- * Session is persisted in ~/.beecork/whatsapp-session/
9
- *
10
- * NOTE: This violates WhatsApp ToS. For personal use only.
11
- */
12
- export class BeecorkWhatsAppClient {
13
- sock = null;
14
- tabManager;
15
- config;
16
- allowedNumbers;
17
- reconnectAttempts = 0;
18
- maxReconnectAttempts = 10;
19
- backoffDelays = [1000, 5000, 15000, 30000, 60000]; // ms
20
- constructor(config, tabManager) {
21
- this.config = config;
22
- this.tabManager = tabManager;
23
- this.allowedNumbers = new Set(config.whatsapp?.allowedNumbers ?? []);
24
- }
25
- async start() {
26
- try {
27
- // Dynamic import since baileys might not be installed
28
- const { default: makeWASocket, useMultiFileAuthState, DisconnectReason } = await import('@whiskeysockets/baileys');
29
- const sessionPath = this.config.whatsapp?.sessionPath ?? `${process.env.HOME}/.beecork/whatsapp-session`;
30
- const { state, saveCreds } = await useMultiFileAuthState(sessionPath);
31
- this.sock = makeWASocket({
32
- auth: state,
33
- printQRInTerminal: true,
34
- });
35
- const sock = this.sock;
36
- sock.ev.on('creds.update', saveCreds);
37
- sock.ev.on('connection.update', (update) => {
38
- const { connection, lastDisconnect } = update;
39
- if (connection === 'close') {
40
- const reason = lastDisconnect?.error?.output?.statusCode;
41
- if (reason !== DisconnectReason.loggedOut) {
42
- this.reconnectAttempts++;
43
- if (this.reconnectAttempts > this.maxReconnectAttempts) {
44
- logger.error(`WhatsApp reconnect failed after ${this.maxReconnectAttempts} attempts, giving up`);
45
- return;
46
- }
47
- const delayIdx = Math.min(this.reconnectAttempts - 1, this.backoffDelays.length - 1);
48
- const delay = this.backoffDelays[delayIdx];
49
- logger.warn(`WhatsApp connection closed, reconnecting in ${delay / 1000}s (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})...`);
50
- setTimeout(() => {
51
- this.start().catch(err => {
52
- logger.error('WhatsApp reconnect failed:', err);
53
- });
54
- }, delay);
55
- }
56
- else {
57
- logger.error('WhatsApp logged out. Please re-scan QR code.');
58
- }
59
- }
60
- else if (connection === 'open') {
61
- this.reconnectAttempts = 0; // Reset on successful connection
62
- logger.info('WhatsApp connected');
63
- }
64
- });
65
- sock.ev.on('messages.upsert', async (m) => {
66
- const msg = m.messages[0];
67
- if (!msg?.message || msg.key.fromMe)
68
- return;
69
- const sender = msg.key.remoteJid;
70
- if (!sender || !this.isAllowed(sender))
71
- return;
72
- const text = msg.message.conversation ||
73
- msg.message.extendedTextMessage?.text || '';
74
- if (!text)
75
- return;
76
- try {
77
- const { tabName, prompt } = this.parseMessage(text);
78
- if (!prompt)
79
- return;
80
- // Show typing indicator while processing
81
- await sock.sendPresenceUpdate('composing', sender).catch(() => { });
82
- const result = await this.tabManager.sendMessage(tabName, prompt);
83
- const responseText = result.error
84
- ? `Error: ${result.text}`
85
- : result.text || '(empty response)';
86
- await sock.sendPresenceUpdate('paused', sender).catch(() => { });
87
- await this.sendResponse(sender, responseText, tabName);
88
- }
89
- catch (err) {
90
- logger.error('WhatsApp message handler error:', err);
91
- // Send error feedback to user (unlike silent failure before)
92
- await sock.sendMessage(sender, { text: 'Something went wrong processing your message. Check daemon logs for details.' }).catch(() => { });
93
- }
94
- });
95
- }
96
- catch (err) {
97
- logger.error('Failed to start WhatsApp client:', err);
98
- throw err;
99
- }
100
- }
101
- parseMessage(text) {
102
- return parseTabMessage(text);
103
- }
104
- async sendResponse(jid, text, tabName) {
105
- const prefix = tabName && tabName !== 'default' ? `[${tabName}] ` : '';
106
- const chunks = chunkTextWA(prefix + text);
107
- const sock = this.sock;
108
- for (const chunk of chunks) {
109
- try {
110
- await retryWithBackoff(() => sock.sendMessage(jid, { text: chunk }), [1000, 5000, 15000], 'whatsapp-send');
111
- }
112
- catch (err) {
113
- logger.error(`WhatsApp delivery failed for ${jid}:`, err);
114
- }
115
- }
116
- }
117
- async sendNotification(text) {
118
- const sock = this.sock;
119
- if (!sock)
120
- return;
121
- for (const number of this.allowedNumbers) {
122
- try {
123
- await sock.sendMessage(`${number}@s.whatsapp.net`, { text });
124
- }
125
- catch (err) {
126
- logger.error(`Failed to send WhatsApp notification to ${number}:`, err);
127
- }
128
- }
129
- }
130
- stop() {
131
- const sock = this.sock;
132
- if (sock) {
133
- sock.end(undefined);
134
- this.sock = null;
135
- }
136
- logger.info('WhatsApp client stopped');
137
- }
138
- isAllowed(jid) {
139
- if (this.allowedNumbers.size === 0)
140
- return false; // Deny by default — require explicit allowlist
141
- const number = jid.replace('@s.whatsapp.net', '');
142
- return this.allowedNumbers.has(number);
143
- }
144
- }
145
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/whatsapp/client.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- /** Chunk text for WhatsApp's larger message limit */
2
- export declare function chunkTextWA(text: string): string[];
3
- //# sourceMappingURL=formatter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/whatsapp/formatter.ts"],"names":[],"mappings":"AAIA,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAElD"}
@@ -1,7 +0,0 @@
1
- import { chunkText } from '../util/text.js';
2
- const WHATSAPP_MAX_LENGTH = 8192;
3
- /** Chunk text for WhatsApp's larger message limit */
4
- export function chunkTextWA(text) {
5
- return chunkText(text, WHATSAPP_MAX_LENGTH);
6
- }
7
- //# sourceMappingURL=formatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/whatsapp/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,qDAAqD;AACrD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;AAC9C,CAAC"}