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,23 @@
1
+ import type { Channel, ChannelContext, InboundMessageHandler, SendOptions } from './types.js';
2
+ export declare class DiscordChannel implements Channel {
3
+ readonly id = "discord";
4
+ readonly name = "Discord";
5
+ readonly maxMessageLength = 2000;
6
+ readonly supportsStreaming = false;
7
+ readonly supportsMedia = true;
8
+ private client;
9
+ private ctx;
10
+ private handler;
11
+ private allowedUserIds;
12
+ private sttProvider;
13
+ private ttsProvider;
14
+ constructor(ctx: ChannelContext);
15
+ start(): Promise<void>;
16
+ stop(): void;
17
+ onMessage(handler: InboundMessageHandler): void;
18
+ sendMessage(peerId: string, text: string, options?: SendOptions): Promise<void>;
19
+ sendNotification(message: string, urgent?: boolean): Promise<void>;
20
+ setTyping(peerId: string, active: boolean): Promise<void>;
21
+ private sendResponse;
22
+ }
23
+ //# sourceMappingURL=discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../src/channels/discord.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/G,qBAAa,cAAe,YAAW,OAAO;IAC5C,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,gBAAgB,QAAQ;IACjC,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,aAAa,QAAQ;IAE9B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAA4B;gBAEnC,GAAG,EAAE,cAAc;IAOzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiK5B,IAAI,IAAI,IAAI;IAQZ,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;IAmB/E,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAUjD,YAAY;CAqB3B"}
@@ -0,0 +1,240 @@
1
+ import { logger } from '../util/logger.js';
2
+ import { chunkText, parseTabMessage, buildMediaPrompt } from '../util/text.js';
3
+ import { retryWithBackoff } from '../util/retry.js';
4
+ import { inboundLimiter } from '../util/rate-limiter.js';
5
+ import { saveMedia, isOversized } from '../media/store.js';
6
+ import { initVoiceProviders } from '../voice/index.js';
7
+ export class DiscordChannel {
8
+ id = 'discord';
9
+ name = 'Discord';
10
+ maxMessageLength = 2000;
11
+ supportsStreaming = false; // Discord message editing is rate-limited
12
+ supportsMedia = true;
13
+ client = null; // Discord.js Client
14
+ ctx;
15
+ handler = null;
16
+ allowedUserIds;
17
+ sttProvider = null;
18
+ ttsProvider = null;
19
+ constructor(ctx) {
20
+ this.ctx = ctx;
21
+ this.allowedUserIds = new Set((ctx.config.discord?.allowedUserIds ?? []).map(String));
22
+ }
23
+ async start() {
24
+ const discordConfig = this.ctx.config.discord;
25
+ if (!discordConfig?.token) {
26
+ logger.warn('No Discord token configured');
27
+ return;
28
+ }
29
+ // Dynamic import since discord.js might not be installed
30
+ const { Client, GatewayIntentBits, Events } = await import('discord.js');
31
+ this.client = new Client({
32
+ intents: [
33
+ GatewayIntentBits.Guilds,
34
+ GatewayIntentBits.GuildMessages,
35
+ GatewayIntentBits.DirectMessages,
36
+ GatewayIntentBits.MessageContent,
37
+ ],
38
+ });
39
+ // Voice providers
40
+ const { stt, tts } = initVoiceProviders(this.ctx.config.voice);
41
+ this.sttProvider = stt;
42
+ this.ttsProvider = tts;
43
+ this.client.on(Events.MessageCreate, async (message) => {
44
+ // Ignore bot messages
45
+ if (message.author.bot)
46
+ return;
47
+ const isDM = !message.guild;
48
+ const isMentioned = message.mentions.has(this.client.user);
49
+ // In DMs: allow if user is in allowlist (or allowlist is empty = allow all)
50
+ // In servers: only respond if @mentioned
51
+ if (isDM) {
52
+ if (this.allowedUserIds.size > 0 && !this.allowedUserIds.has(message.author.id))
53
+ return;
54
+ }
55
+ else {
56
+ if (!isMentioned)
57
+ return;
58
+ }
59
+ // Rate limit
60
+ if (!inboundLimiter.check(this.id)) {
61
+ await message.reply("I'm receiving too many messages right now. Please wait a moment.").catch(() => { });
62
+ return;
63
+ }
64
+ const text = message.content
65
+ .replace(/<@!?\d+>/g, '') // Remove mentions
66
+ .trim();
67
+ // Download attachments
68
+ const media = [];
69
+ for (const attachment of message.attachments.values()) {
70
+ try {
71
+ if (isOversized(attachment.size)) {
72
+ logger.warn(`Skipping oversized Discord attachment: ${attachment.size} bytes`);
73
+ continue;
74
+ }
75
+ const response = await fetch(attachment.url, { signal: AbortSignal.timeout(30000) });
76
+ if (!response.ok)
77
+ continue;
78
+ const buffer = Buffer.from(await response.arrayBuffer());
79
+ const ext = attachment.name?.split('.').pop() || 'bin';
80
+ const filePath = saveMedia(buffer, ext, attachment.name);
81
+ let type = 'document';
82
+ if (attachment.contentType?.startsWith('image/'))
83
+ type = 'image';
84
+ else if (attachment.contentType?.startsWith('video/'))
85
+ type = 'video';
86
+ else if (attachment.contentType?.startsWith('audio/'))
87
+ type = 'audio';
88
+ media.push({
89
+ type,
90
+ mimeType: attachment.contentType || 'application/octet-stream',
91
+ filePath,
92
+ fileName: attachment.name,
93
+ });
94
+ }
95
+ catch (err) {
96
+ logger.warn('Failed to download Discord attachment:', err);
97
+ }
98
+ }
99
+ if (!text && media.length === 0)
100
+ return;
101
+ try {
102
+ // Show typing
103
+ await message.channel.sendTyping().catch(() => { });
104
+ // Parse tab name
105
+ const { tabName, prompt } = parseTabMessage(text || '');
106
+ if (!prompt && media.length === 0)
107
+ return;
108
+ // Handle commands
109
+ if (text.startsWith('/tabs')) {
110
+ const tabs = this.ctx.tabManager.listTabs();
111
+ if (tabs.length === 0) {
112
+ await message.reply('No tabs.');
113
+ }
114
+ else {
115
+ const list = tabs.map(t => `• **${t.name}** [${t.status}]`).join('\n');
116
+ await message.reply(list);
117
+ }
118
+ return;
119
+ }
120
+ if (text.startsWith('/stop ')) {
121
+ const name = text.slice(6).trim();
122
+ this.ctx.tabManager.stopTab(name);
123
+ await message.reply(`Stopped tab: ${name}`);
124
+ return;
125
+ }
126
+ // Build prompt with media
127
+ const fullPrompt = buildMediaPrompt(media, prompt || '');
128
+ // Typing indicator refresh
129
+ const typingInterval = setInterval(() => {
130
+ message.channel.sendTyping().catch(() => { });
131
+ }, 8000); // Discord typing lasts 10s
132
+ try {
133
+ // Use thread name as tab if in a thread
134
+ let effectiveTab = tabName;
135
+ if (message.channel.isThread?.()) {
136
+ effectiveTab = message.channel.name || tabName;
137
+ }
138
+ const result = await this.ctx.tabManager.sendMessage(effectiveTab, fullPrompt);
139
+ clearInterval(typingInterval);
140
+ const responseText = result.error
141
+ ? `Error: ${result.text}`
142
+ : result.text || '(empty response)';
143
+ // Voice reply if configured
144
+ const voiceMode = this.ctx.config.voice?.replyMode;
145
+ if (this.ttsProvider && (voiceMode === 'voice' || voiceMode === 'both')) {
146
+ try {
147
+ const audioPath = await this.ttsProvider.synthesize(responseText);
148
+ await message.reply({ files: [audioPath] });
149
+ if (voiceMode === 'voice')
150
+ return;
151
+ }
152
+ catch (err) {
153
+ logger.warn('Discord TTS failed:', err);
154
+ }
155
+ }
156
+ // Send text response
157
+ await this.sendResponse(message, responseText, effectiveTab);
158
+ }
159
+ catch (err) {
160
+ clearInterval(typingInterval);
161
+ throw err;
162
+ }
163
+ }
164
+ catch (err) {
165
+ logger.error('Discord message handler error:', err);
166
+ await message.reply('Something went wrong processing your message.').catch(() => { });
167
+ }
168
+ });
169
+ this.client.on(Events.ClientReady, () => {
170
+ logger.info(`Discord bot ready as ${this.client.user?.tag}`);
171
+ });
172
+ await this.client.login(discordConfig.token);
173
+ }
174
+ stop() {
175
+ if (this.client) {
176
+ this.client.destroy();
177
+ this.client = null;
178
+ }
179
+ logger.info('Discord bot stopped');
180
+ }
181
+ onMessage(handler) {
182
+ this.handler = handler;
183
+ }
184
+ async sendMessage(peerId, text, options) {
185
+ if (!this.client)
186
+ return;
187
+ try {
188
+ const channel = await this.client.channels.fetch(peerId);
189
+ if (!channel?.isTextBased())
190
+ return;
191
+ const chunks = chunkText(text, this.maxMessageLength);
192
+ for (const chunk of chunks) {
193
+ await retryWithBackoff(() => channel.send(chunk), [1000, 5000, 15000], 'discord-send');
194
+ }
195
+ }
196
+ catch (err) {
197
+ logger.error(`Discord send failed for ${peerId}:`, err);
198
+ }
199
+ }
200
+ async sendNotification(message, urgent) {
201
+ if (!this.client)
202
+ return;
203
+ // Send to all allowed users via DM
204
+ for (const userId of this.allowedUserIds) {
205
+ try {
206
+ const user = await this.client.users.fetch(userId);
207
+ if (user) {
208
+ await user.send(message);
209
+ }
210
+ }
211
+ catch (err) {
212
+ logger.error(`Discord notification failed for ${userId}:`, err);
213
+ }
214
+ }
215
+ }
216
+ async setTyping(peerId, active) {
217
+ if (!this.client || !active)
218
+ return;
219
+ try {
220
+ const channel = await this.client.channels.fetch(peerId);
221
+ if (channel?.isTextBased()) {
222
+ await channel.sendTyping();
223
+ }
224
+ }
225
+ catch { }
226
+ }
227
+ async sendResponse(message, text, tabName) {
228
+ const prefix = tabName && tabName !== 'default' ? `[${tabName}] ` : '';
229
+ const fullText = prefix + text;
230
+ const chunks = chunkText(fullText, this.maxMessageLength);
231
+ // First chunk as reply, rest as follow-ups
232
+ if (chunks.length > 0) {
233
+ await retryWithBackoff(() => message.reply(chunks[0]), [1000, 5000], 'discord-reply');
234
+ }
235
+ for (let i = 1; i < chunks.length; i++) {
236
+ await retryWithBackoff(() => message.channel.send(chunks[i]), [1000, 5000], 'discord-send');
237
+ }
238
+ }
239
+ }
240
+ //# sourceMappingURL=discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../src/channels/discord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { ChannelRegistry } from './registry.js';
2
+ export { TelegramChannel } from './telegram.js';
3
+ export { WhatsAppChannel } from './whatsapp.js';
4
+ export { WebhookChannel } from './webhook.js';
5
+ export { DiscordChannel } from './discord.js';
6
+ export { loadCommunityChannels } from './loader.js';
7
+ export type { Channel, ChannelContext, InboundMessage, InboundMessageHandler, MediaAttachment, SendOptions } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { ChannelRegistry } from './registry.js';
2
+ export { TelegramChannel } from './telegram.js';
3
+ export { WhatsAppChannel } from './whatsapp.js';
4
+ export { WebhookChannel } from './webhook.js';
5
+ export { DiscordChannel } from './discord.js';
6
+ export { loadCommunityChannels } from './loader.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Channel, ChannelContext } from './types.js';
2
+ /**
3
+ * Discover and load community channel packages from node_modules.
4
+ * Convention: packages named `beecork-channel-<name>` must export a default
5
+ * class implementing the Channel interface.
6
+ */
7
+ export declare function loadCommunityChannels(ctx: ChannelContext): Promise<Channel[]>;
8
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/channels/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI1D;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAqEnF"}
@@ -0,0 +1,72 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { logger } from '../util/logger.js';
4
+ const CHANNEL_PREFIX = 'beecork-channel-';
5
+ /**
6
+ * Discover and load community channel packages from node_modules.
7
+ * Convention: packages named `beecork-channel-<name>` must export a default
8
+ * class implementing the Channel interface.
9
+ */
10
+ export async function loadCommunityChannels(ctx) {
11
+ const channels = [];
12
+ // Look in global and local node_modules
13
+ const searchPaths = [
14
+ path.join(process.cwd(), 'node_modules'),
15
+ // Global npm modules path varies by OS — try common locations
16
+ ];
17
+ // Also check if beecork is installed globally
18
+ try {
19
+ const globalPath = path.dirname(require.resolve('beecork/package.json'));
20
+ const globalNodeModules = path.join(globalPath, '..');
21
+ if (fs.existsSync(globalNodeModules)) {
22
+ searchPaths.push(globalNodeModules);
23
+ }
24
+ }
25
+ catch { }
26
+ for (const searchPath of searchPaths) {
27
+ if (!fs.existsSync(searchPath))
28
+ continue;
29
+ try {
30
+ const dirs = fs.readdirSync(searchPath);
31
+ for (const dir of dirs) {
32
+ if (!dir.startsWith(CHANNEL_PREFIX))
33
+ continue;
34
+ const channelName = dir.slice(CHANNEL_PREFIX.length);
35
+ const pkgPath = path.join(searchPath, dir);
36
+ try {
37
+ // Read package.json to find the main entry
38
+ const pkgJson = JSON.parse(fs.readFileSync(path.join(pkgPath, 'package.json'), 'utf-8'));
39
+ const main = pkgJson.main || 'index.js';
40
+ const entryPath = path.join(pkgPath, main);
41
+ if (!fs.existsSync(entryPath)) {
42
+ logger.warn(`Community channel ${dir}: entry point not found at ${entryPath}`);
43
+ continue;
44
+ }
45
+ // Dynamic import
46
+ const module = await import(entryPath);
47
+ const ChannelClass = module.default || module[Object.keys(module)[0]];
48
+ if (!ChannelClass || typeof ChannelClass !== 'function') {
49
+ logger.warn(`Community channel ${dir}: no default export found`);
50
+ continue;
51
+ }
52
+ const instance = new ChannelClass(ctx);
53
+ // Validate it implements Channel interface (duck typing)
54
+ if (!instance.id || !instance.name || typeof instance.start !== 'function' || typeof instance.stop !== 'function') {
55
+ logger.warn(`Community channel ${dir}: does not implement Channel interface`);
56
+ continue;
57
+ }
58
+ channels.push(instance);
59
+ logger.info(`Community channel loaded: ${instance.name} (${instance.id}) from ${dir}`);
60
+ }
61
+ catch (err) {
62
+ logger.warn(`Failed to load community channel ${dir}:`, err);
63
+ }
64
+ }
65
+ }
66
+ catch (err) {
67
+ logger.warn(`Failed to scan ${searchPath}:`, err);
68
+ }
69
+ }
70
+ return channels;
71
+ }
72
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/channels/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Channel, InboundMessageHandler } from './types.js';
2
+ /**
3
+ * ChannelRegistry manages the lifecycle of all channels.
4
+ * Channels register themselves, and the registry handles start/stop/broadcast.
5
+ */
6
+ export declare class ChannelRegistry {
7
+ private channels;
8
+ private messageHandler;
9
+ /** Register a channel */
10
+ register(channel: Channel): void;
11
+ /** Set the handler that processes all inbound messages from all channels */
12
+ setMessageHandler(handler: InboundMessageHandler): void;
13
+ /** Start all registered channels */
14
+ start(): Promise<void>;
15
+ /** Stop all channels */
16
+ stop(): void;
17
+ /** Get a channel by ID */
18
+ get(id: string): Channel | undefined;
19
+ /** Get all registered channels */
20
+ getAll(): Channel[];
21
+ /** Broadcast a notification to all channels */
22
+ broadcastNotify(text: string, urgent?: boolean): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEjE;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,cAAc,CAAsC;IAE5D,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAYhC,4EAA4E;IAC5E,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAQvD,oCAAoC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,wBAAwB;IACxB,IAAI,IAAI,IAAI;IAUZ,0BAA0B;IAC1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpC,kCAAkC;IAClC,MAAM,IAAI,OAAO,EAAE;IAInB,+CAA+C;IACzC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CASrE"}
@@ -0,0 +1,65 @@
1
+ import { logger } from '../util/logger.js';
2
+ /**
3
+ * ChannelRegistry manages the lifecycle of all channels.
4
+ * Channels register themselves, and the registry handles start/stop/broadcast.
5
+ */
6
+ export class ChannelRegistry {
7
+ channels = new Map();
8
+ messageHandler = null;
9
+ /** Register a channel */
10
+ register(channel) {
11
+ if (this.channels.has(channel.id)) {
12
+ throw new Error(`Channel "${channel.id}" is already registered`);
13
+ }
14
+ this.channels.set(channel.id, channel);
15
+ // Wire up the message handler if one is already set
16
+ if (this.messageHandler) {
17
+ channel.onMessage(this.messageHandler);
18
+ }
19
+ logger.info(`Channel registered: ${channel.name} (${channel.id})`);
20
+ }
21
+ /** Set the handler that processes all inbound messages from all channels */
22
+ setMessageHandler(handler) {
23
+ this.messageHandler = handler;
24
+ // Wire to all already-registered channels
25
+ for (const channel of this.channels.values()) {
26
+ channel.onMessage(handler);
27
+ }
28
+ }
29
+ /** Start all registered channels */
30
+ async start() {
31
+ for (const [id, channel] of this.channels) {
32
+ try {
33
+ await channel.start();
34
+ logger.info(`Channel started: ${channel.name}`);
35
+ }
36
+ catch (err) {
37
+ logger.error(`Failed to start channel ${id}:`, err);
38
+ }
39
+ }
40
+ }
41
+ /** Stop all channels */
42
+ stop() {
43
+ for (const [id, channel] of this.channels) {
44
+ try {
45
+ channel.stop();
46
+ }
47
+ catch (err) {
48
+ logger.error(`Failed to stop channel ${id}:`, err);
49
+ }
50
+ }
51
+ }
52
+ /** Get a channel by ID */
53
+ get(id) {
54
+ return this.channels.get(id);
55
+ }
56
+ /** Get all registered channels */
57
+ getAll() {
58
+ return Array.from(this.channels.values());
59
+ }
60
+ /** Broadcast a notification to all channels */
61
+ async broadcastNotify(text, urgent) {
62
+ await Promise.all(Array.from(this.channels.values()).map(channel => channel.sendNotification(text, urgent).catch(err => logger.warn(`${channel.name} notify failed:`, err))));
63
+ }
64
+ }
65
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IACtC,cAAc,GAAiC,IAAI,CAAC;IAE5D,yBAAyB;IACzB,QAAQ,CAAC,OAAgB;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,oDAAoD;QACpD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,4EAA4E;IAC5E,iBAAiB,CAAC,OAA8B;QAC9C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,0CAA0C;QAC1C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI;QACF,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,kCAAkC;IAClC,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,MAAgB;QAClD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAC/C,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CACjD,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,iBAAiB,EAAE,GAAG,CAAC,CACnD,CACF,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ import type { Channel, ChannelContext, InboundMessageHandler, SendOptions } from './types.js';
2
+ /** Format tab status for Telegram display */
3
+ export declare function formatTabStatus(tabs: Array<{
4
+ name: string;
5
+ status: string;
6
+ lastActivityAt: string;
7
+ }>): string;
8
+ export declare class TelegramChannel implements Channel {
9
+ readonly id = "telegram";
10
+ readonly name = "Telegram";
11
+ readonly maxMessageLength = 4096;
12
+ readonly supportsStreaming = true;
13
+ readonly supportsMedia = true;
14
+ private bot;
15
+ private ctx;
16
+ private activeChatIds;
17
+ private messageHandler;
18
+ private sttProvider;
19
+ private ttsProvider;
20
+ private botUserId;
21
+ private botUsername;
22
+ private mutedGroups;
23
+ private welcomeSent;
24
+ constructor(ctx: ChannelContext);
25
+ start(): Promise<void>;
26
+ stop(): void;
27
+ sendMessage(peerId: string, text: string, options?: SendOptions): Promise<void>;
28
+ sendNotification(message: string, _urgent?: boolean): Promise<void>;
29
+ setTyping(peerId: string, active: boolean): Promise<void>;
30
+ onMessage(handler: InboundMessageHandler): void;
31
+ private setupHandlers;
32
+ private handleCommand;
33
+ private handleMessage;
34
+ private sendResponse;
35
+ private sendWithRetry;
36
+ private downloadTelegramFile;
37
+ private isAllowed;
38
+ private isAdmin;
39
+ private setReaction;
40
+ }
41
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ/G,6CAA6C;AAC7C,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;AAED,qBAAa,eAAgB,YAAW,OAAO;IAC7C,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,gBAAgB,QAAQ;IACjC,QAAQ,CAAC,iBAAiB,QAAQ;IAClC,QAAQ,CAAC,aAAa,QAAQ;IAE9B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAAqB;gBAE5B,GAAG,EAAE,cAAc;IAczB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B,IAAI,IAAI,IAAI;IAKN,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/E,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBnE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAM/C,OAAO,CAAC,aAAa;YAkKP,aAAa;YA8Jb,aAAa;YA4Hb,YAAY;YAqBZ,aAAa;YAqBb,oBAAoB;IAkBlC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,OAAO;YAKD,WAAW;CAiB1B"}