@cogitator-ai/channels 0.2.5 → 0.4.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/README.md +142 -40
- package/dist/assistant-config.d.ts +1 -0
- package/dist/assistant-config.d.ts.map +1 -1
- package/dist/assistant-config.js +1 -0
- package/dist/assistant-config.js.map +1 -1
- package/dist/channels/discord.d.ts +4 -0
- package/dist/channels/discord.d.ts.map +1 -1
- package/dist/channels/discord.js +123 -59
- package/dist/channels/discord.js.map +1 -1
- package/dist/channels/slack.d.ts +9 -0
- package/dist/channels/slack.d.ts.map +1 -1
- package/dist/channels/slack.js +153 -34
- package/dist/channels/slack.js.map +1 -1
- package/dist/channels/telegram.d.ts +13 -0
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +206 -111
- package/dist/channels/telegram.js.map +1 -1
- package/dist/channels/terminal.d.ts +10 -0
- package/dist/channels/terminal.d.ts.map +1 -1
- package/dist/channels/terminal.js +46 -10
- package/dist/channels/terminal.js.map +1 -1
- package/dist/channels/webchat.d.ts +7 -2
- package/dist/channels/webchat.d.ts.map +1 -1
- package/dist/channels/webchat.js +112 -50
- package/dist/channels/webchat.js.map +1 -1
- package/dist/channels/whatsapp.d.ts +19 -3
- package/dist/channels/whatsapp.d.ts.map +1 -1
- package/dist/channels/whatsapp.js +204 -66
- package/dist/channels/whatsapp.js.map +1 -1
- package/dist/cron.d.ts +2 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +9 -0
- package/dist/cron.js.map +1 -0
- package/dist/envelope.d.ts.map +1 -1
- package/dist/envelope.js +7 -6
- package/dist/envelope.js.map +1 -1
- package/dist/formatters/code-protect.d.ts +2 -0
- package/dist/formatters/code-protect.d.ts.map +1 -0
- package/dist/formatters/code-protect.js +12 -0
- package/dist/formatters/code-protect.js.map +1 -0
- package/dist/formatters/markdown.d.ts +1 -1
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js +79 -21
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/formatters/whatsapp-markdown.d.ts.map +1 -1
- package/dist/formatters/whatsapp-markdown.js +7 -21
- package/dist/formatters/whatsapp-markdown.js.map +1 -1
- package/dist/gateway.d.ts +32 -3
- package/dist/gateway.d.ts.map +1 -1
- package/dist/gateway.js +275 -174
- package/dist/gateway.js.map +1 -1
- package/dist/heartbeat.d.ts +9 -2
- package/dist/heartbeat.d.ts.map +1 -1
- package/dist/heartbeat.js +121 -84
- package/dist/heartbeat.js.map +1 -1
- package/dist/inbound-debounce.js +2 -2
- package/dist/inbound-debounce.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/media/audio-format.d.ts +3 -0
- package/dist/media/audio-format.d.ts.map +1 -0
- package/dist/media/audio-format.js +20 -0
- package/dist/media/audio-format.js.map +1 -0
- package/dist/media/deepgram-stt.d.ts +1 -1
- package/dist/media/deepgram-stt.d.ts.map +1 -1
- package/dist/media/deepgram-stt.js +4 -3
- package/dist/media/deepgram-stt.js.map +1 -1
- package/dist/media/media-processor.d.ts +12 -1
- package/dist/media/media-processor.d.ts.map +1 -1
- package/dist/media/media-processor.js +75 -18
- package/dist/media/media-processor.js.map +1 -1
- package/dist/media/whisper-api.d.ts.map +1 -1
- package/dist/media/whisper-api.js +21 -33
- package/dist/media/whisper-api.js.map +1 -1
- package/dist/media/whisper-local.d.ts +1 -0
- package/dist/media/whisper-local.d.ts.map +1 -1
- package/dist/media/whisper-local.js +106 -50
- package/dist/media/whisper-local.js.map +1 -1
- package/dist/message-queue.d.ts +1 -0
- package/dist/message-queue.d.ts.map +1 -1
- package/dist/message-queue.js +17 -10
- package/dist/message-queue.js.map +1 -1
- package/dist/middleware/auto-extract.d.ts +2 -0
- package/dist/middleware/auto-extract.d.ts.map +1 -1
- package/dist/middleware/auto-extract.js +94 -30
- package/dist/middleware/auto-extract.js.map +1 -1
- package/dist/middleware/dm-policy.d.ts +2 -1
- package/dist/middleware/dm-policy.d.ts.map +1 -1
- package/dist/middleware/dm-policy.js +26 -27
- package/dist/middleware/dm-policy.js.map +1 -1
- package/dist/middleware/owner-commands.d.ts +1 -1
- package/dist/middleware/owner-commands.d.ts.map +1 -1
- package/dist/middleware/owner-commands.js +8 -7
- package/dist/middleware/owner-commands.js.map +1 -1
- package/dist/middleware/pairing-codes.d.ts +12 -0
- package/dist/middleware/pairing-codes.d.ts.map +1 -0
- package/dist/middleware/pairing-codes.js +26 -0
- package/dist/middleware/pairing-codes.js.map +1 -0
- package/dist/middleware/pairing.d.ts +3 -3
- package/dist/middleware/pairing.d.ts.map +1 -1
- package/dist/middleware/pairing.js +18 -25
- package/dist/middleware/pairing.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts +3 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +21 -6
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/runtime-builder.d.ts +11 -0
- package/dist/runtime-builder.d.ts.map +1 -1
- package/dist/runtime-builder.js +212 -62
- package/dist/runtime-builder.js.map +1 -1
- package/dist/simple-timer-store.d.ts +6 -0
- package/dist/simple-timer-store.d.ts.map +1 -1
- package/dist/simple-timer-store.js +8 -1
- package/dist/simple-timer-store.js.map +1 -1
- package/dist/stream-buffer.d.ts +14 -7
- package/dist/stream-buffer.d.ts.map +1 -1
- package/dist/stream-buffer.js +129 -84
- package/dist/stream-buffer.js.map +1 -1
- package/dist/tools/path-guard.d.ts +4 -0
- package/dist/tools/path-guard.d.ts.map +1 -0
- package/dist/tools/path-guard.js +53 -0
- package/dist/tools/path-guard.js.map +1 -0
- package/dist/tools/self-config.d.ts +12 -2
- package/dist/tools/self-config.d.ts.map +1 -1
- package/dist/tools/self-config.js +53 -16
- package/dist/tools/self-config.js.map +1 -1
- package/package.json +27 -21
- package/dist/media/index.d.ts +0 -7
- package/dist/media/index.d.ts.map +0 -1
- package/dist/media/index.js +0 -5
- package/dist/media/index.js.map +0 -1
|
@@ -1,16 +1,35 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
const NOT_MODIFIED = 'message is not modified';
|
|
3
|
+
function errorMessage(err) {
|
|
4
|
+
return err instanceof Error ? err.message : String(err);
|
|
5
|
+
}
|
|
6
|
+
function isEntityParseError(err) {
|
|
7
|
+
const msg = errorMessage(err);
|
|
8
|
+
return msg.includes("can't parse entities") || msg.includes("Bad Request: can't parse");
|
|
9
|
+
}
|
|
10
|
+
function isNotModifiedError(err) {
|
|
11
|
+
return errorMessage(err).includes(NOT_MODIFIED);
|
|
12
|
+
}
|
|
1
13
|
export class TelegramChannel {
|
|
2
14
|
config;
|
|
3
15
|
type = 'telegram';
|
|
4
16
|
handler = null;
|
|
5
17
|
bot = null;
|
|
18
|
+
grammy = null;
|
|
19
|
+
server = null;
|
|
6
20
|
constructor(config) {
|
|
7
21
|
this.config = config;
|
|
8
22
|
}
|
|
9
23
|
onMessage(handler) {
|
|
10
24
|
this.handler = handler;
|
|
11
25
|
}
|
|
26
|
+
requireBot() {
|
|
27
|
+
if (!this.bot)
|
|
28
|
+
throw new Error('Telegram channel is not started');
|
|
29
|
+
return this.bot;
|
|
30
|
+
}
|
|
12
31
|
async downloadFile(fileId) {
|
|
13
|
-
const bot = this.
|
|
32
|
+
const bot = this.requireBot();
|
|
14
33
|
const file = await bot.api.getFile(fileId);
|
|
15
34
|
if (!file.file_path)
|
|
16
35
|
throw new Error('Telegram returned no file_path');
|
|
@@ -21,6 +40,7 @@ export class TelegramChannel {
|
|
|
21
40
|
return Buffer.from(await resp.arrayBuffer());
|
|
22
41
|
}
|
|
23
42
|
buildBaseMessage(ctx) {
|
|
43
|
+
const replyTo = ctx.message.reply_to_message?.message_id;
|
|
24
44
|
return {
|
|
25
45
|
id: String(ctx.message.message_id),
|
|
26
46
|
channelType: 'telegram',
|
|
@@ -28,9 +48,28 @@ export class TelegramChannel {
|
|
|
28
48
|
userId: String(ctx.from.id),
|
|
29
49
|
userName: ctx.from.first_name + (ctx.from.last_name ? ` ${ctx.from.last_name}` : ''),
|
|
30
50
|
groupId: ctx.chat.type !== 'private' ? String(ctx.chat.id) : undefined,
|
|
51
|
+
...(replyTo !== undefined ? { replyTo: String(replyTo) } : {}),
|
|
31
52
|
};
|
|
32
53
|
}
|
|
54
|
+
async emitWithFile(ctx, file, attachment) {
|
|
55
|
+
if (!this.handler)
|
|
56
|
+
return;
|
|
57
|
+
try {
|
|
58
|
+
const buffer = await this.downloadFile(file.file_id);
|
|
59
|
+
await this.handler({
|
|
60
|
+
...this.buildBaseMessage(ctx),
|
|
61
|
+
text: ctx.message.caption ?? '',
|
|
62
|
+
attachments: [{ ...attachment, buffer }],
|
|
63
|
+
raw: ctx,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error(`[telegram] Failed to process ${attachment.type}:`, errorMessage(err));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
33
70
|
async start() {
|
|
71
|
+
if (this.bot)
|
|
72
|
+
return;
|
|
34
73
|
let grammy;
|
|
35
74
|
try {
|
|
36
75
|
grammy = (await import('grammy'));
|
|
@@ -38,6 +77,7 @@ export class TelegramChannel {
|
|
|
38
77
|
catch {
|
|
39
78
|
throw new Error('grammy is required for Telegram support. Install it: pnpm add grammy');
|
|
40
79
|
}
|
|
80
|
+
this.grammy = grammy;
|
|
41
81
|
const bot = new grammy.Bot(this.config.token);
|
|
42
82
|
this.bot = bot;
|
|
43
83
|
bot.catch((err) => {
|
|
@@ -53,145 +93,212 @@ export class TelegramChannel {
|
|
|
53
93
|
});
|
|
54
94
|
});
|
|
55
95
|
bot.on('message:photo', async (ctx) => {
|
|
56
|
-
|
|
96
|
+
const photos = ctx.message.photo;
|
|
97
|
+
if (!photos?.length)
|
|
57
98
|
return;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
...this.buildBaseMessage(ctx),
|
|
63
|
-
text: ctx.message.caption ?? '',
|
|
64
|
-
attachments: [{ type: 'image', mimeType: 'image/jpeg', buffer }],
|
|
65
|
-
raw: ctx,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
console.error('[telegram] Failed to download photo:', err.message);
|
|
70
|
-
}
|
|
99
|
+
await this.emitWithFile(ctx, photos[photos.length - 1], {
|
|
100
|
+
type: 'image',
|
|
101
|
+
mimeType: 'image/jpeg',
|
|
102
|
+
});
|
|
71
103
|
});
|
|
72
104
|
bot.on('message:voice', async (ctx) => {
|
|
73
|
-
|
|
105
|
+
const voice = ctx.message.voice;
|
|
106
|
+
if (!voice)
|
|
74
107
|
return;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
attachments: [
|
|
81
|
-
{
|
|
82
|
-
type: 'audio',
|
|
83
|
-
mimeType: ctx.message.voice.mime_type ?? 'audio/ogg',
|
|
84
|
-
buffer,
|
|
85
|
-
filename: 'voice.ogg',
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
raw: ctx,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
catch (err) {
|
|
92
|
-
console.error('[telegram] Failed to download voice:', err.message);
|
|
93
|
-
}
|
|
108
|
+
await this.emitWithFile(ctx, voice, {
|
|
109
|
+
type: 'audio',
|
|
110
|
+
mimeType: voice.mime_type ?? 'audio/ogg',
|
|
111
|
+
filename: 'voice.ogg',
|
|
112
|
+
});
|
|
94
113
|
});
|
|
95
|
-
bot.on('message:
|
|
96
|
-
|
|
114
|
+
bot.on('message:audio', async (ctx) => {
|
|
115
|
+
const audio = ctx.message.audio;
|
|
116
|
+
if (!audio)
|
|
97
117
|
return;
|
|
118
|
+
await this.emitWithFile(ctx, audio, {
|
|
119
|
+
type: 'audio',
|
|
120
|
+
mimeType: audio.mime_type ?? 'audio/mpeg',
|
|
121
|
+
filename: audio.file_name,
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
bot.on('message:video', async (ctx) => {
|
|
125
|
+
const video = ctx.message.video;
|
|
126
|
+
if (!video)
|
|
127
|
+
return;
|
|
128
|
+
await this.emitWithFile(ctx, video, {
|
|
129
|
+
type: 'video',
|
|
130
|
+
mimeType: video.mime_type ?? 'video/mp4',
|
|
131
|
+
filename: video.file_name,
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
bot.on('message:document', async (ctx) => {
|
|
98
135
|
const doc = ctx.message.document;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
136
|
+
if (!doc)
|
|
137
|
+
return;
|
|
138
|
+
const isImage = doc.mime_type?.startsWith('image/') ?? false;
|
|
139
|
+
await this.emitWithFile(ctx, doc, {
|
|
140
|
+
type: isImage ? 'image' : 'file',
|
|
141
|
+
mimeType: doc.mime_type ?? 'application/octet-stream',
|
|
142
|
+
filename: doc.file_name,
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
try {
|
|
146
|
+
if (this.config.webhook) {
|
|
147
|
+
await this.startWebhook(bot, grammy, this.config.webhook);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
await new Promise((resolve, reject) => {
|
|
151
|
+
bot
|
|
152
|
+
.start({
|
|
153
|
+
drop_pending_updates: true,
|
|
154
|
+
...(this.config.allowedUpdates
|
|
155
|
+
? { allowed_updates: this.config.allowedUpdates }
|
|
156
|
+
: {}),
|
|
157
|
+
onStart: () => resolve(),
|
|
158
|
+
})
|
|
159
|
+
.catch(reject);
|
|
114
160
|
});
|
|
115
161
|
}
|
|
116
|
-
|
|
117
|
-
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
this.bot = null;
|
|
165
|
+
await this.closeServer();
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async startWebhook(bot, grammy, webhook) {
|
|
170
|
+
await bot.init();
|
|
171
|
+
const handle = grammy.webhookCallback(bot, 'http', {
|
|
172
|
+
...(webhook.secretToken ? { secretToken: webhook.secretToken } : {}),
|
|
173
|
+
});
|
|
174
|
+
const path = webhook.path ?? (new URL(webhook.url).pathname || '/');
|
|
175
|
+
const server = createServer((req, res) => {
|
|
176
|
+
const reqPath = new URL(req.url ?? '/', 'http://localhost').pathname;
|
|
177
|
+
if (req.method !== 'POST' || reqPath !== path) {
|
|
178
|
+
res.statusCode = 404;
|
|
179
|
+
res.end();
|
|
180
|
+
return;
|
|
118
181
|
}
|
|
182
|
+
handle(req, res).catch((err) => {
|
|
183
|
+
console.error('[telegram] Webhook handler error:', errorMessage(err));
|
|
184
|
+
if (!res.headersSent)
|
|
185
|
+
res.statusCode = 500;
|
|
186
|
+
res.end();
|
|
187
|
+
});
|
|
119
188
|
});
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
bot
|
|
126
|
-
.start({
|
|
127
|
-
drop_pending_updates: true,
|
|
128
|
-
onStart: () => resolve(),
|
|
129
|
-
})
|
|
130
|
-
.catch(reject);
|
|
189
|
+
await new Promise((resolve, reject) => {
|
|
190
|
+
server.once('error', reject);
|
|
191
|
+
server.listen(webhook.port, () => {
|
|
192
|
+
server.off('error', reject);
|
|
193
|
+
resolve();
|
|
131
194
|
});
|
|
132
|
-
}
|
|
195
|
+
});
|
|
196
|
+
this.server = server;
|
|
197
|
+
await bot.api.setWebhook(webhook.url, {
|
|
198
|
+
drop_pending_updates: true,
|
|
199
|
+
...(this.config.allowedUpdates ? { allowed_updates: this.config.allowedUpdates } : {}),
|
|
200
|
+
...(webhook.secretToken ? { secret_token: webhook.secretToken } : {}),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
async closeServer() {
|
|
204
|
+
const server = this.server;
|
|
205
|
+
if (!server)
|
|
206
|
+
return;
|
|
207
|
+
this.server = null;
|
|
208
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
133
209
|
}
|
|
134
210
|
async stop() {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
211
|
+
const bot = this.bot;
|
|
212
|
+
if (!bot)
|
|
213
|
+
return;
|
|
214
|
+
this.bot = null;
|
|
215
|
+
if (this.config.webhook) {
|
|
216
|
+
await this.closeServer();
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
await bot.stop();
|
|
138
220
|
}
|
|
139
221
|
}
|
|
140
222
|
async sendText(channelId, text, options) {
|
|
141
|
-
|
|
142
|
-
return '';
|
|
223
|
+
const bot = this.requireBot();
|
|
143
224
|
const chatId = Number(channelId);
|
|
144
225
|
const useMarkdown = options?.format === 'markdown';
|
|
145
226
|
const baseOpts = {
|
|
146
|
-
...(options?.replyTo
|
|
227
|
+
...(options?.replyTo
|
|
228
|
+
? {
|
|
229
|
+
reply_parameters: {
|
|
230
|
+
message_id: Number(options.replyTo),
|
|
231
|
+
allow_sending_without_reply: true,
|
|
232
|
+
},
|
|
233
|
+
}
|
|
234
|
+
: {}),
|
|
147
235
|
...(options?.silent ? { disable_notification: true } : {}),
|
|
148
236
|
};
|
|
149
237
|
if (useMarkdown) {
|
|
150
238
|
try {
|
|
151
|
-
const sent = await
|
|
239
|
+
const sent = await bot.api.sendMessage(chatId, text, {
|
|
152
240
|
...baseOpts,
|
|
153
241
|
parse_mode: 'Markdown',
|
|
154
242
|
});
|
|
155
243
|
return String(sent.message_id);
|
|
156
244
|
}
|
|
157
245
|
catch (err) {
|
|
158
|
-
if (isEntityParseError(err))
|
|
159
|
-
|
|
160
|
-
return String(sent.message_id);
|
|
161
|
-
}
|
|
162
|
-
throw err;
|
|
246
|
+
if (!isEntityParseError(err))
|
|
247
|
+
throw err;
|
|
163
248
|
}
|
|
164
249
|
}
|
|
165
|
-
const sent = await
|
|
250
|
+
const sent = await bot.api.sendMessage(chatId, text, baseOpts);
|
|
166
251
|
return String(sent.message_id);
|
|
167
252
|
}
|
|
168
253
|
async editText(channelId, messageId, text) {
|
|
169
|
-
|
|
170
|
-
|
|
254
|
+
const bot = this.requireBot();
|
|
255
|
+
const chatId = Number(channelId);
|
|
256
|
+
const msgId = Number(messageId);
|
|
171
257
|
try {
|
|
172
|
-
await
|
|
173
|
-
|
|
174
|
-
});
|
|
258
|
+
await bot.api.editMessageText(chatId, msgId, text, { parse_mode: 'Markdown' });
|
|
259
|
+
return;
|
|
175
260
|
}
|
|
176
261
|
catch (err) {
|
|
177
|
-
if (
|
|
178
|
-
try {
|
|
179
|
-
await this.bot.api.editMessageText(Number(channelId), Number(messageId), text);
|
|
180
|
-
}
|
|
181
|
-
catch { }
|
|
262
|
+
if (isNotModifiedError(err))
|
|
182
263
|
return;
|
|
183
|
-
|
|
264
|
+
if (!isEntityParseError(err))
|
|
265
|
+
throw err;
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
await bot.api.editMessageText(chatId, msgId, text);
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
if (!isNotModifiedError(err))
|
|
272
|
+
throw err;
|
|
184
273
|
}
|
|
185
274
|
}
|
|
186
275
|
async sendFile(channelId, file) {
|
|
187
|
-
|
|
188
|
-
return;
|
|
276
|
+
const bot = this.requireBot();
|
|
189
277
|
const chatId = Number(channelId);
|
|
190
|
-
|
|
191
|
-
|
|
278
|
+
let source;
|
|
279
|
+
if (file.buffer) {
|
|
280
|
+
if (!this.grammy)
|
|
281
|
+
throw new Error('Telegram channel is not started');
|
|
282
|
+
source = new this.grammy.InputFile(file.buffer, file.filename);
|
|
192
283
|
}
|
|
193
284
|
else if (file.url) {
|
|
194
|
-
|
|
285
|
+
source = file.url;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
throw new Error('Attachment must have either a buffer or a url');
|
|
289
|
+
}
|
|
290
|
+
switch (file.type) {
|
|
291
|
+
case 'image':
|
|
292
|
+
await bot.api.sendPhoto(chatId, source);
|
|
293
|
+
return;
|
|
294
|
+
case 'audio':
|
|
295
|
+
await bot.api.sendAudio(chatId, source);
|
|
296
|
+
return;
|
|
297
|
+
case 'video':
|
|
298
|
+
await bot.api.sendVideo(chatId, source);
|
|
299
|
+
return;
|
|
300
|
+
default:
|
|
301
|
+
await bot.api.sendDocument(chatId, source);
|
|
195
302
|
}
|
|
196
303
|
}
|
|
197
304
|
async sendTyping(channelId) {
|
|
@@ -200,21 +307,15 @@ export class TelegramChannel {
|
|
|
200
307
|
await this.bot.api.sendChatAction(Number(channelId), 'typing');
|
|
201
308
|
}
|
|
202
309
|
async sendDraft(channelId, draftId, text, options) {
|
|
203
|
-
|
|
204
|
-
return;
|
|
205
|
-
const chatId = Number(channelId);
|
|
310
|
+
const bot = this.requireBot();
|
|
206
311
|
const useMarkdown = options?.format === 'markdown';
|
|
207
|
-
await
|
|
312
|
+
await bot.api.sendMessageDraft(Number(channelId), draftId, text, {
|
|
208
313
|
...(useMarkdown ? { parse_mode: 'Markdown' } : {}),
|
|
209
314
|
});
|
|
210
315
|
}
|
|
211
316
|
async deleteMessage(channelId, messageId) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
try {
|
|
215
|
-
await this.bot.api.deleteMessage(Number(channelId), Number(messageId));
|
|
216
|
-
}
|
|
217
|
-
catch { }
|
|
317
|
+
const bot = this.requireBot();
|
|
318
|
+
await bot.api.deleteMessage(Number(channelId), Number(messageId));
|
|
218
319
|
}
|
|
219
320
|
async setReaction(channelId, messageId, emoji) {
|
|
220
321
|
if (!this.bot)
|
|
@@ -224,12 +325,6 @@ export class TelegramChannel {
|
|
|
224
325
|
]);
|
|
225
326
|
}
|
|
226
327
|
}
|
|
227
|
-
function isEntityParseError(err) {
|
|
228
|
-
if (!(err instanceof Error))
|
|
229
|
-
return false;
|
|
230
|
-
const msg = err.message;
|
|
231
|
-
return msg.includes("can't parse entities") || msg.includes("Bad Request: can't parse");
|
|
232
|
-
}
|
|
233
328
|
export function telegramChannel(config) {
|
|
234
329
|
return new TelegramChannel(config);
|
|
235
330
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,11 @@ export interface TerminalConfig {
|
|
|
3
3
|
userName?: string;
|
|
4
4
|
userId?: string;
|
|
5
5
|
prompt?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Called when the user asks to leave (Ctrl+C, Ctrl+D, `/quit`).
|
|
8
|
+
* Defaults to raising SIGINT so the host application can shut down gracefully.
|
|
9
|
+
*/
|
|
10
|
+
onExit?: () => void;
|
|
6
11
|
}
|
|
7
12
|
export declare class TerminalChannel implements Channel {
|
|
8
13
|
readonly type: ChannelType;
|
|
@@ -11,9 +16,12 @@ export declare class TerminalChannel implements Channel {
|
|
|
11
16
|
private msgCounter;
|
|
12
17
|
private lastLineCount;
|
|
13
18
|
private responding;
|
|
19
|
+
private questionPending;
|
|
20
|
+
private closing;
|
|
14
21
|
private readonly userName;
|
|
15
22
|
private readonly userId;
|
|
16
23
|
private readonly promptStr;
|
|
24
|
+
private readonly onExit?;
|
|
17
25
|
constructor(config?: TerminalConfig);
|
|
18
26
|
onMessage(handler: (msg: ChannelMessage) => Promise<void>): void;
|
|
19
27
|
start(): Promise<void>;
|
|
@@ -22,6 +30,8 @@ export declare class TerminalChannel implements Channel {
|
|
|
22
30
|
editText(_channelId: string, _messageId: string, text: string): Promise<void>;
|
|
23
31
|
sendFile(_channelId: string, file: Attachment): Promise<void>;
|
|
24
32
|
sendTyping(): Promise<void>;
|
|
33
|
+
private requestExit;
|
|
34
|
+
private countRenderedLines;
|
|
25
35
|
private writeOutput;
|
|
26
36
|
private showPrompt;
|
|
27
37
|
private handleInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/channels/terminal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/channels/terminal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,qBAAa,eAAgB,YAAW,OAAO;IAC7C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAc;IACxC,OAAO,CAAC,OAAO,CAAyD;IACxE,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAa;gBAEzB,MAAM,GAAE,cAAmB;IAOvC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IASnF,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7E,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEjC,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;YASJ,WAAW;CAwC1B;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAEhE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline';
|
|
2
2
|
import { userInfo } from 'node:os';
|
|
3
|
+
const EXIT_COMMANDS = new Set(['/quit', '/exit', 'exit']);
|
|
3
4
|
export class TerminalChannel {
|
|
4
5
|
type = 'terminal';
|
|
5
6
|
handler = null;
|
|
@@ -7,41 +8,59 @@ export class TerminalChannel {
|
|
|
7
8
|
msgCounter = 0;
|
|
8
9
|
lastLineCount = 0;
|
|
9
10
|
responding = false;
|
|
11
|
+
questionPending = false;
|
|
12
|
+
closing = false;
|
|
10
13
|
userName;
|
|
11
14
|
userId;
|
|
12
15
|
promptStr;
|
|
16
|
+
onExit;
|
|
13
17
|
constructor(config = {}) {
|
|
14
18
|
this.userName = config.userName || userInfo().username;
|
|
15
19
|
this.userId = config.userId || 'owner';
|
|
16
20
|
this.promptStr = config.prompt || '> ';
|
|
21
|
+
this.onExit = config.onExit;
|
|
17
22
|
}
|
|
18
23
|
onMessage(handler) {
|
|
19
24
|
this.handler = handler;
|
|
20
25
|
}
|
|
21
26
|
async start() {
|
|
27
|
+
if (this.rl)
|
|
28
|
+
return;
|
|
22
29
|
if (!process.stdin.isTTY && !process.env.COGITATOR_FORCE_TERMINAL)
|
|
23
30
|
return;
|
|
24
|
-
this.
|
|
31
|
+
this.closing = false;
|
|
32
|
+
const rl = createInterface({
|
|
25
33
|
input: process.stdin,
|
|
26
34
|
output: process.stdout,
|
|
27
35
|
terminal: true,
|
|
28
36
|
});
|
|
29
|
-
this.rl
|
|
30
|
-
|
|
37
|
+
this.rl = rl;
|
|
38
|
+
rl.on('SIGINT', () => this.requestExit());
|
|
39
|
+
rl.on('close', () => {
|
|
40
|
+
this.rl = null;
|
|
41
|
+
this.questionPending = false;
|
|
42
|
+
if (!this.closing)
|
|
43
|
+
this.requestExit();
|
|
31
44
|
});
|
|
32
45
|
this.showPrompt();
|
|
33
46
|
}
|
|
34
47
|
async stop() {
|
|
35
48
|
if (this.rl) {
|
|
36
|
-
this.
|
|
49
|
+
this.closing = true;
|
|
50
|
+
const rl = this.rl;
|
|
37
51
|
this.rl = null;
|
|
52
|
+
this.questionPending = false;
|
|
53
|
+
rl.close();
|
|
38
54
|
}
|
|
39
55
|
}
|
|
40
56
|
async sendText(_channelId, text, _options) {
|
|
41
57
|
const id = `term_${++this.msgCounter}`;
|
|
58
|
+
const unsolicited = !this.responding && this.questionPending;
|
|
59
|
+
if (unsolicited)
|
|
60
|
+
process.stdout.write('\r\x1b[K');
|
|
42
61
|
this.writeOutput(text);
|
|
43
|
-
|
|
44
|
-
|
|
62
|
+
if (unsolicited)
|
|
63
|
+
this.rl?.prompt(true);
|
|
45
64
|
return id;
|
|
46
65
|
}
|
|
47
66
|
async editText(_channelId, _messageId, text) {
|
|
@@ -56,15 +75,30 @@ export class TerminalChannel {
|
|
|
56
75
|
process.stdout.write(` [${label}]${url}\n`);
|
|
57
76
|
}
|
|
58
77
|
async sendTyping() { }
|
|
78
|
+
requestExit() {
|
|
79
|
+
if (this.onExit) {
|
|
80
|
+
this.onExit();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
process.kill(process.pid, 'SIGINT');
|
|
84
|
+
}
|
|
85
|
+
countRenderedLines(lines) {
|
|
86
|
+
const columns = process.stdout.columns;
|
|
87
|
+
if (!columns || columns <= 0)
|
|
88
|
+
return lines.length;
|
|
89
|
+
return lines.reduce((sum, line) => sum + Math.max(1, Math.ceil(line.length / columns)), 0);
|
|
90
|
+
}
|
|
59
91
|
writeOutput(text) {
|
|
60
92
|
const lines = text.split('\n');
|
|
61
|
-
this.lastLineCount = lines
|
|
93
|
+
this.lastLineCount = this.countRenderedLines(lines);
|
|
62
94
|
process.stdout.write(lines.join('\n') + '\n');
|
|
63
95
|
}
|
|
64
96
|
showPrompt() {
|
|
65
|
-
if (!this.rl || this.responding)
|
|
97
|
+
if (!this.rl || this.responding || this.questionPending)
|
|
66
98
|
return;
|
|
99
|
+
this.questionPending = true;
|
|
67
100
|
this.rl.question(this.promptStr, (input) => {
|
|
101
|
+
this.questionPending = false;
|
|
68
102
|
void this.handleInput(input);
|
|
69
103
|
});
|
|
70
104
|
}
|
|
@@ -74,8 +108,8 @@ export class TerminalChannel {
|
|
|
74
108
|
this.showPrompt();
|
|
75
109
|
return;
|
|
76
110
|
}
|
|
77
|
-
if (text
|
|
78
|
-
|
|
111
|
+
if (EXIT_COMMANDS.has(text)) {
|
|
112
|
+
this.requestExit();
|
|
79
113
|
return;
|
|
80
114
|
}
|
|
81
115
|
if (!this.handler) {
|
|
@@ -99,6 +133,8 @@ export class TerminalChannel {
|
|
|
99
133
|
catch (err) {
|
|
100
134
|
const errMsg = err instanceof Error ? err.message : String(err);
|
|
101
135
|
process.stdout.write(`Error: ${errMsg}\n`);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
102
138
|
this.responding = false;
|
|
103
139
|
this.showPrompt();
|
|
104
140
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/channels/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/channels/terminal.ts"],"names":[],"mappings":"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"}
|