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.
- package/dist/channels/discord.d.ts +23 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +240 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/index.d.ts +8 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +7 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/loader.d.ts +8 -0
- package/dist/channels/loader.d.ts.map +1 -0
- package/dist/channels/loader.js +72 -0
- package/dist/channels/loader.js.map +1 -0
- package/dist/channels/registry.d.ts +24 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +65 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/telegram.d.ts +41 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +606 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.d.ts +67 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/webhook.d.ts +28 -0
- package/dist/channels/webhook.d.ts.map +1 -0
- package/dist/channels/webhook.js +164 -0
- package/dist/channels/webhook.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +27 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +260 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/cli/channel.d.ts +4 -0
- package/dist/cli/channel.d.ts.map +1 -0
- package/dist/cli/channel.js +194 -0
- package/dist/cli/channel.js.map +1 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +150 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/handoff.d.ts +16 -0
- package/dist/cli/handoff.d.ts.map +1 -0
- package/dist/cli/handoff.js +69 -0
- package/dist/cli/handoff.js.map +1 -0
- package/dist/cli/mcp.d.ts +4 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +48 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +47 -10
- package/dist/cli/setup.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/cron/scheduler.d.ts +2 -0
- package/dist/cron/scheduler.d.ts.map +1 -1
- package/dist/cron/scheduler.js +32 -10
- package/dist/cron/scheduler.js.map +1 -1
- package/dist/daemon.js +66 -25
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/html.d.ts +1 -1
- package/dist/dashboard/html.d.ts.map +1 -1
- package/dist/dashboard/html.js +396 -111
- package/dist/dashboard/html.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +152 -16
- package/dist/dashboard/server.js.map +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +15 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +64 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/delegation/manager.d.ts +21 -0
- package/dist/delegation/manager.d.ts.map +1 -0
- package/dist/delegation/manager.js +88 -0
- package/dist/delegation/manager.js.map +1 -0
- package/dist/index.js +162 -0
- package/dist/index.js.map +1 -1
- package/dist/machines/forwarder.d.ts +7 -0
- package/dist/machines/forwarder.d.ts.map +1 -0
- package/dist/machines/forwarder.js +25 -0
- package/dist/machines/forwarder.js.map +1 -0
- package/dist/machines/index.d.ts +3 -0
- package/dist/machines/index.d.ts.map +1 -0
- package/dist/machines/index.js +3 -0
- package/dist/machines/index.js.map +1 -0
- package/dist/machines/registry.d.ts +22 -0
- package/dist/machines/registry.d.ts.map +1 -0
- package/dist/machines/registry.js +71 -0
- package/dist/machines/registry.js.map +1 -0
- package/dist/mcp/server.js +265 -32
- package/dist/mcp/server.js.map +1 -1
- package/dist/media/store.d.ts +11 -0
- package/dist/media/store.d.ts.map +1 -0
- package/dist/media/store.js +53 -0
- package/dist/media/store.js.map +1 -0
- package/dist/memory/extractor.js +1 -1
- package/dist/memory/extractor.js.map +1 -1
- package/dist/notifications/index.d.ts +7 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +35 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/ntfy.d.ts +10 -0
- package/dist/notifications/ntfy.d.ts.map +1 -0
- package/dist/notifications/ntfy.js +26 -0
- package/dist/notifications/ntfy.js.map +1 -0
- package/dist/notifications/pushover.d.ts +10 -0
- package/dist/notifications/pushover.d.ts.map +1 -0
- package/dist/notifications/pushover.js +27 -0
- package/dist/notifications/pushover.js.map +1 -0
- package/dist/notifications/types.d.ts +6 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +2 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/webhook-provider.d.ts +10 -0
- package/dist/notifications/webhook-provider.d.ts.map +1 -0
- package/dist/notifications/webhook-provider.js +25 -0
- package/dist/notifications/webhook-provider.js.map +1 -0
- package/dist/observability/analytics.d.ts +26 -0
- package/dist/observability/analytics.d.ts.map +1 -0
- package/dist/observability/analytics.js +94 -0
- package/dist/observability/analytics.js.map +1 -0
- package/dist/pipe/memory-store.d.ts +1 -6
- package/dist/pipe/memory-store.d.ts.map +1 -1
- package/dist/pipe/memory-store.js +0 -24
- package/dist/pipe/memory-store.js.map +1 -1
- package/dist/pipe/types.d.ts +0 -9
- package/dist/pipe/types.d.ts.map +1 -1
- package/dist/service/install.d.ts.map +1 -1
- package/dist/service/install.js +26 -7
- package/dist/service/install.js.map +1 -1
- package/dist/service/windows.d.ts +11 -0
- package/dist/service/windows.d.ts.map +1 -0
- package/dist/service/windows.js +70 -0
- package/dist/service/windows.js.map +1 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +41 -5
- package/dist/session/manager.js.map +1 -1
- package/dist/session/subprocess.d.ts +2 -1
- package/dist/session/subprocess.d.ts.map +1 -1
- package/dist/session/subprocess.js +8 -2
- package/dist/session/subprocess.js.map +1 -1
- package/dist/types.d.ts +47 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/users/index.d.ts +3 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +2 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/service.d.ts +25 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +65 -0
- package/dist/users/service.js.map +1 -0
- package/dist/util/logger.d.ts +2 -0
- package/dist/util/logger.d.ts.map +1 -1
- package/dist/util/logger.js +24 -0
- package/dist/util/logger.js.map +1 -1
- package/dist/util/platform.d.ts +1 -1
- package/dist/util/platform.d.ts.map +1 -1
- package/dist/util/platform.js +3 -1
- package/dist/util/platform.js.map +1 -1
- package/dist/util/rate-limiter.d.ts +15 -0
- package/dist/util/rate-limiter.d.ts.map +1 -0
- package/dist/util/rate-limiter.js +43 -0
- package/dist/util/rate-limiter.js.map +1 -0
- package/dist/util/text.d.ts +3 -0
- package/dist/util/text.d.ts.map +1 -1
- package/dist/util/text.js +19 -0
- package/dist/util/text.js.map +1 -1
- package/dist/voice/index.d.ts +10 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +16 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/stt.d.ts +15 -0
- package/dist/voice/stt.d.ts.map +1 -0
- package/dist/voice/stt.js +40 -0
- package/dist/voice/stt.js.map +1 -0
- package/dist/voice/tts.d.ts +24 -0
- package/dist/voice/tts.d.ts.map +1 -0
- package/dist/voice/tts.js +85 -0
- package/dist/voice/tts.js.map +1 -0
- package/package.json +2 -1
- package/dist/session/approval.d.ts +0 -20
- package/dist/session/approval.d.ts.map +0 -1
- package/dist/session/approval.js +0 -59
- package/dist/session/approval.js.map +0 -1
- package/dist/telegram/bot.d.ts +0 -25
- package/dist/telegram/bot.d.ts.map +0 -1
- package/dist/telegram/bot.js +0 -307
- package/dist/telegram/bot.js.map +0 -1
- package/dist/telegram/formatter.d.ts +0 -9
- package/dist/telegram/formatter.d.ts.map +0 -1
- package/dist/telegram/formatter.js +0 -13
- package/dist/telegram/formatter.js.map +0 -1
- package/dist/whatsapp/client.d.ts +0 -26
- package/dist/whatsapp/client.d.ts.map +0 -1
- package/dist/whatsapp/client.js +0 -145
- package/dist/whatsapp/client.js.map +0 -1
- package/dist/whatsapp/formatter.d.ts +0 -3
- package/dist/whatsapp/formatter.d.ts.map +0 -1
- package/dist/whatsapp/formatter.js +0 -7
- 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"}
|