@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.
Files changed (133) hide show
  1. package/README.md +142 -40
  2. package/dist/assistant-config.d.ts +1 -0
  3. package/dist/assistant-config.d.ts.map +1 -1
  4. package/dist/assistant-config.js +1 -0
  5. package/dist/assistant-config.js.map +1 -1
  6. package/dist/channels/discord.d.ts +4 -0
  7. package/dist/channels/discord.d.ts.map +1 -1
  8. package/dist/channels/discord.js +123 -59
  9. package/dist/channels/discord.js.map +1 -1
  10. package/dist/channels/slack.d.ts +9 -0
  11. package/dist/channels/slack.d.ts.map +1 -1
  12. package/dist/channels/slack.js +153 -34
  13. package/dist/channels/slack.js.map +1 -1
  14. package/dist/channels/telegram.d.ts +13 -0
  15. package/dist/channels/telegram.d.ts.map +1 -1
  16. package/dist/channels/telegram.js +206 -111
  17. package/dist/channels/telegram.js.map +1 -1
  18. package/dist/channels/terminal.d.ts +10 -0
  19. package/dist/channels/terminal.d.ts.map +1 -1
  20. package/dist/channels/terminal.js +46 -10
  21. package/dist/channels/terminal.js.map +1 -1
  22. package/dist/channels/webchat.d.ts +7 -2
  23. package/dist/channels/webchat.d.ts.map +1 -1
  24. package/dist/channels/webchat.js +112 -50
  25. package/dist/channels/webchat.js.map +1 -1
  26. package/dist/channels/whatsapp.d.ts +19 -3
  27. package/dist/channels/whatsapp.d.ts.map +1 -1
  28. package/dist/channels/whatsapp.js +204 -66
  29. package/dist/channels/whatsapp.js.map +1 -1
  30. package/dist/cron.d.ts +2 -0
  31. package/dist/cron.d.ts.map +1 -0
  32. package/dist/cron.js +9 -0
  33. package/dist/cron.js.map +1 -0
  34. package/dist/envelope.d.ts.map +1 -1
  35. package/dist/envelope.js +7 -6
  36. package/dist/envelope.js.map +1 -1
  37. package/dist/formatters/code-protect.d.ts +2 -0
  38. package/dist/formatters/code-protect.d.ts.map +1 -0
  39. package/dist/formatters/code-protect.js +12 -0
  40. package/dist/formatters/code-protect.js.map +1 -0
  41. package/dist/formatters/markdown.d.ts +1 -1
  42. package/dist/formatters/markdown.d.ts.map +1 -1
  43. package/dist/formatters/markdown.js +79 -21
  44. package/dist/formatters/markdown.js.map +1 -1
  45. package/dist/formatters/whatsapp-markdown.d.ts.map +1 -1
  46. package/dist/formatters/whatsapp-markdown.js +7 -21
  47. package/dist/formatters/whatsapp-markdown.js.map +1 -1
  48. package/dist/gateway.d.ts +32 -3
  49. package/dist/gateway.d.ts.map +1 -1
  50. package/dist/gateway.js +275 -174
  51. package/dist/gateway.js.map +1 -1
  52. package/dist/heartbeat.d.ts +9 -2
  53. package/dist/heartbeat.d.ts.map +1 -1
  54. package/dist/heartbeat.js +121 -84
  55. package/dist/heartbeat.js.map +1 -1
  56. package/dist/inbound-debounce.js +2 -2
  57. package/dist/inbound-debounce.js.map +1 -1
  58. package/dist/index.d.ts +6 -3
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +2 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/media/audio-format.d.ts +3 -0
  63. package/dist/media/audio-format.d.ts.map +1 -0
  64. package/dist/media/audio-format.js +20 -0
  65. package/dist/media/audio-format.js.map +1 -0
  66. package/dist/media/deepgram-stt.d.ts +1 -1
  67. package/dist/media/deepgram-stt.d.ts.map +1 -1
  68. package/dist/media/deepgram-stt.js +4 -3
  69. package/dist/media/deepgram-stt.js.map +1 -1
  70. package/dist/media/media-processor.d.ts +12 -1
  71. package/dist/media/media-processor.d.ts.map +1 -1
  72. package/dist/media/media-processor.js +75 -18
  73. package/dist/media/media-processor.js.map +1 -1
  74. package/dist/media/whisper-api.d.ts.map +1 -1
  75. package/dist/media/whisper-api.js +21 -33
  76. package/dist/media/whisper-api.js.map +1 -1
  77. package/dist/media/whisper-local.d.ts +1 -0
  78. package/dist/media/whisper-local.d.ts.map +1 -1
  79. package/dist/media/whisper-local.js +106 -50
  80. package/dist/media/whisper-local.js.map +1 -1
  81. package/dist/message-queue.d.ts +1 -0
  82. package/dist/message-queue.d.ts.map +1 -1
  83. package/dist/message-queue.js +17 -10
  84. package/dist/message-queue.js.map +1 -1
  85. package/dist/middleware/auto-extract.d.ts +2 -0
  86. package/dist/middleware/auto-extract.d.ts.map +1 -1
  87. package/dist/middleware/auto-extract.js +94 -30
  88. package/dist/middleware/auto-extract.js.map +1 -1
  89. package/dist/middleware/dm-policy.d.ts +2 -1
  90. package/dist/middleware/dm-policy.d.ts.map +1 -1
  91. package/dist/middleware/dm-policy.js +26 -27
  92. package/dist/middleware/dm-policy.js.map +1 -1
  93. package/dist/middleware/owner-commands.d.ts +1 -1
  94. package/dist/middleware/owner-commands.d.ts.map +1 -1
  95. package/dist/middleware/owner-commands.js +8 -7
  96. package/dist/middleware/owner-commands.js.map +1 -1
  97. package/dist/middleware/pairing-codes.d.ts +12 -0
  98. package/dist/middleware/pairing-codes.d.ts.map +1 -0
  99. package/dist/middleware/pairing-codes.js +26 -0
  100. package/dist/middleware/pairing-codes.js.map +1 -0
  101. package/dist/middleware/pairing.d.ts +3 -3
  102. package/dist/middleware/pairing.d.ts.map +1 -1
  103. package/dist/middleware/pairing.js +18 -25
  104. package/dist/middleware/pairing.js.map +1 -1
  105. package/dist/middleware/rate-limit.d.ts +3 -1
  106. package/dist/middleware/rate-limit.d.ts.map +1 -1
  107. package/dist/middleware/rate-limit.js +21 -6
  108. package/dist/middleware/rate-limit.js.map +1 -1
  109. package/dist/runtime-builder.d.ts +11 -0
  110. package/dist/runtime-builder.d.ts.map +1 -1
  111. package/dist/runtime-builder.js +212 -62
  112. package/dist/runtime-builder.js.map +1 -1
  113. package/dist/simple-timer-store.d.ts +6 -0
  114. package/dist/simple-timer-store.d.ts.map +1 -1
  115. package/dist/simple-timer-store.js +8 -1
  116. package/dist/simple-timer-store.js.map +1 -1
  117. package/dist/stream-buffer.d.ts +14 -7
  118. package/dist/stream-buffer.d.ts.map +1 -1
  119. package/dist/stream-buffer.js +129 -84
  120. package/dist/stream-buffer.js.map +1 -1
  121. package/dist/tools/path-guard.d.ts +4 -0
  122. package/dist/tools/path-guard.d.ts.map +1 -0
  123. package/dist/tools/path-guard.js +53 -0
  124. package/dist/tools/path-guard.js.map +1 -0
  125. package/dist/tools/self-config.d.ts +12 -2
  126. package/dist/tools/self-config.d.ts.map +1 -1
  127. package/dist/tools/self-config.js +53 -16
  128. package/dist/tools/self-config.js.map +1 -1
  129. package/package.json +27 -21
  130. package/dist/media/index.d.ts +0 -7
  131. package/dist/media/index.d.ts.map +0 -1
  132. package/dist/media/index.js +0 -5
  133. package/dist/media/index.js.map +0 -1
@@ -1,10 +1,21 @@
1
1
  import { chunkDiscordText } from '../formatters/discord-chunker.js';
2
+ const MAX_TRACKED_MESSAGES = 500;
3
+ function attachmentType(contentType) {
4
+ if (contentType.startsWith('image/'))
5
+ return 'image';
6
+ if (contentType.startsWith('audio/'))
7
+ return 'audio';
8
+ if (contentType.startsWith('video/'))
9
+ return 'video';
10
+ return 'file';
11
+ }
2
12
  export class DiscordChannel {
3
13
  config;
4
14
  type = 'discord';
5
15
  handler = null;
6
16
  client = null;
7
17
  botUserId = null;
18
+ continuations = new Map();
8
19
  constructor(config) {
9
20
  this.config = config;
10
21
  }
@@ -12,6 +23,8 @@ export class DiscordChannel {
12
23
  this.handler = handler;
13
24
  }
14
25
  async start() {
26
+ if (this.client)
27
+ return;
15
28
  let discord;
16
29
  try {
17
30
  discord = (await import('discord.js'));
@@ -25,17 +38,31 @@ export class DiscordChannel {
25
38
  discord.GatewayIntentBits.DirectMessages,
26
39
  discord.GatewayIntentBits.MessageContent,
27
40
  ];
28
- const client = new discord.Client({ intents });
41
+ const partials = discord.Partials?.Channel !== undefined ? [discord.Partials.Channel] : [];
42
+ const client = new discord.Client({ intents, partials });
29
43
  this.client = client;
30
- client.on('ready', () => {
31
- if (client.user) {
32
- this.botUserId = client.user.id;
33
- }
44
+ const readyEvent = discord.Events?.ClientReady ?? 'ready';
45
+ const ready = new Promise((resolve) => {
46
+ client.once(readyEvent, () => resolve());
34
47
  });
35
48
  client.on('messageCreate', (raw) => {
36
- void this.handleDiscordMessage(raw);
49
+ void this.handleDiscordMessage(raw).catch((err) => {
50
+ console.error('[discord] Message handler error:', err);
51
+ });
37
52
  });
38
- await client.login(this.config.token);
53
+ try {
54
+ await client.login(this.config.token);
55
+ await ready;
56
+ }
57
+ catch (err) {
58
+ this.client = null;
59
+ await client.destroy().catch(() => { });
60
+ throw err;
61
+ }
62
+ this.botUserId = client.user?.id ?? null;
63
+ }
64
+ mentionPattern() {
65
+ return this.botUserId ? new RegExp(`<@!?${this.botUserId}>`, 'g') : null;
39
66
  }
40
67
  async handleDiscordMessage(discordMsg) {
41
68
  if (!this.handler)
@@ -43,15 +70,28 @@ export class DiscordChannel {
43
70
  if (discordMsg.author.bot)
44
71
  return;
45
72
  const isDM = !discordMsg.guild;
73
+ const mention = this.mentionPattern();
46
74
  if (this.config.mentionOnly && !isDM) {
47
- if (!this.botUserId || !discordMsg.content.includes(`<@${this.botUserId}>`)) {
75
+ if (!mention?.test(discordMsg.content))
48
76
  return;
49
- }
77
+ mention.lastIndex = 0;
50
78
  }
51
- let text = discordMsg.content;
52
- if (this.botUserId) {
53
- text = text.replace(new RegExp(`<@!?${this.botUserId}>`, 'g'), '').trim();
79
+ const text = mention ? discordMsg.content.replace(mention, '').trim() : discordMsg.content;
80
+ const attachments = [];
81
+ if (discordMsg.attachments) {
82
+ for (const att of discordMsg.attachments.values()) {
83
+ const mimeType = att.contentType ?? 'application/octet-stream';
84
+ attachments.push({
85
+ type: attachmentType(mimeType),
86
+ url: att.url,
87
+ mimeType,
88
+ ...(att.name ? { filename: att.name } : {}),
89
+ });
90
+ }
54
91
  }
92
+ if (!text && attachments.length === 0)
93
+ return;
94
+ const replyTo = discordMsg.reference?.messageId;
55
95
  const msg = {
56
96
  id: discordMsg.id,
57
97
  channelType: 'discord',
@@ -61,90 +101,114 @@ export class DiscordChannel {
61
101
  groupId: discordMsg.guild?.id,
62
102
  text,
63
103
  raw: discordMsg,
104
+ ...(attachments.length > 0 ? { attachments } : {}),
105
+ ...(replyTo ? { replyTo } : {}),
64
106
  };
65
107
  await this.handler(msg);
66
108
  }
67
109
  async stop() {
68
110
  if (this.client) {
69
- await this.client.destroy();
111
+ const client = this.client;
70
112
  this.client = null;
113
+ this.botUserId = null;
114
+ this.continuations.clear();
115
+ await client.destroy();
71
116
  }
72
117
  }
73
- async sendText(channelId, text, options) {
118
+ async fetchTextChannel(channelId) {
74
119
  if (!this.client)
75
- return '';
120
+ throw new Error('Discord channel is not started');
76
121
  const channel = await this.client.channels.fetch(channelId);
77
- if (!channel?.isTextBased())
78
- return '';
122
+ if (!channel?.isTextBased()) {
123
+ throw new Error(`Discord channel ${channelId} is not a text channel`);
124
+ }
125
+ return channel;
126
+ }
127
+ rememberContinuations(primaryId, ids) {
128
+ if (ids.length === 0) {
129
+ this.continuations.delete(primaryId);
130
+ return;
131
+ }
132
+ this.continuations.set(primaryId, ids);
133
+ if (this.continuations.size > MAX_TRACKED_MESSAGES) {
134
+ const oldest = this.continuations.keys().next().value;
135
+ if (oldest !== undefined)
136
+ this.continuations.delete(oldest);
137
+ }
138
+ }
139
+ async sendText(channelId, text, options) {
140
+ const channel = await this.fetchTextChannel(channelId);
79
141
  const chunks = chunkDiscordText(text);
80
- let lastId = '';
142
+ if (chunks.length === 0)
143
+ return '';
144
+ const ids = [];
81
145
  for (let i = 0; i < chunks.length; i++) {
82
146
  const msgOptions = { content: chunks[i] };
83
147
  if (i === 0 && options?.replyTo) {
84
- msgOptions.reply = { messageReference: options.replyTo };
148
+ msgOptions.reply = { messageReference: options.replyTo, failIfNotExists: false };
85
149
  }
86
150
  const sent = await channel.send(msgOptions);
87
- lastId = sent.id;
151
+ ids.push(sent.id);
88
152
  }
89
- return lastId;
153
+ const [primaryId, ...rest] = ids;
154
+ this.rememberContinuations(primaryId, rest);
155
+ return primaryId;
90
156
  }
91
157
  async editText(channelId, messageId, text) {
92
- if (!this.client)
93
- return;
94
- const channel = await this.client.channels.fetch(channelId);
95
- if (!channel?.isTextBased())
96
- return;
158
+ const channel = await this.fetchTextChannel(channelId);
97
159
  const chunks = chunkDiscordText(text);
98
- try {
99
- const msg = await channel.messages.fetch(messageId);
100
- await msg.edit(chunks[0] ?? text.slice(0, 2000));
101
- }
102
- catch { }
160
+ if (chunks.length === 0)
161
+ return;
162
+ const primary = await channel.messages.fetch(messageId);
163
+ await primary.edit(chunks[0]);
164
+ const previous = this.continuations.get(messageId) ?? [];
165
+ const next = [];
103
166
  for (let i = 1; i < chunks.length; i++) {
104
- await channel.send({ content: chunks[i] });
167
+ const existingId = previous[i - 1];
168
+ if (existingId) {
169
+ const existing = await channel.messages.fetch(existingId);
170
+ await existing.edit(chunks[i]);
171
+ next.push(existingId);
172
+ }
173
+ else {
174
+ const sent = await channel.send({ content: chunks[i] });
175
+ next.push(sent.id);
176
+ }
105
177
  }
178
+ for (const staleId of previous.slice(chunks.length - 1)) {
179
+ const stale = await channel.messages.fetch(staleId);
180
+ await stale.delete();
181
+ }
182
+ this.rememberContinuations(messageId, next);
106
183
  }
107
184
  async sendFile(channelId, file) {
108
- if (!this.client)
109
- return;
110
- const channel = await this.client.channels.fetch(channelId);
111
- if (!channel?.isTextBased())
112
- return;
185
+ const source = file.buffer ? Buffer.from(file.buffer) : file.url;
186
+ if (!source)
187
+ throw new Error('Attachment must have either a buffer or a url');
188
+ const channel = await this.fetchTextChannel(channelId);
113
189
  await channel.send({
114
- files: [{ attachment: file.url ?? file.buffer, name: file.filename }],
190
+ files: [{ attachment: source, ...(file.filename ? { name: file.filename } : {}) }],
115
191
  });
116
192
  }
117
193
  async sendTyping(channelId) {
118
194
  if (!this.client)
119
195
  return;
120
- const channel = await this.client.channels.fetch(channelId);
121
- if (!channel?.isTextBased())
122
- return;
196
+ const channel = await this.fetchTextChannel(channelId);
123
197
  await channel.sendTyping();
124
198
  }
125
199
  async deleteMessage(channelId, messageId) {
126
- if (!this.client)
127
- return;
128
- const channel = await this.client.channels.fetch(channelId);
129
- if (!channel?.isTextBased())
130
- return;
131
- try {
132
- const msg = await channel.messages.fetch(messageId);
200
+ const channel = await this.fetchTextChannel(channelId);
201
+ const ids = [messageId, ...(this.continuations.get(messageId) ?? [])];
202
+ this.continuations.delete(messageId);
203
+ for (const id of ids) {
204
+ const msg = await channel.messages.fetch(id);
133
205
  await msg.delete();
134
206
  }
135
- catch { }
136
207
  }
137
208
  async setReaction(channelId, messageId, emoji) {
138
- if (!this.client)
139
- return;
140
- const channel = await this.client.channels.fetch(channelId);
141
- if (!channel?.isTextBased())
142
- return;
143
- try {
144
- const msg = await channel.messages.fetch(messageId);
145
- await msg.react(emoji);
146
- }
147
- catch { }
209
+ const channel = await this.fetchTextChannel(channelId);
210
+ const msg = await channel.messages.fetch(messageId);
211
+ await msg.react(emoji);
148
212
  }
149
213
  }
150
214
  export function discordChannel(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../src/channels/discord.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../src/channels/discord.ts"],"names":[],"mappings":"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"}
@@ -10,12 +10,21 @@ export declare class SlackChannel implements Channel {
10
10
  readonly type: ChannelType;
11
11
  private handler;
12
12
  private app;
13
+ private readonly threadRoots;
14
+ private readonly userNames;
13
15
  constructor(config: SlackConfig);
14
16
  onMessage(handler: (msg: ChannelMessage) => Promise<void>): void;
15
17
  start(): Promise<void>;
18
+ private remember;
19
+ private resolveUserName;
20
+ private handleSlackMessage;
21
+ private downloadPrivateFile;
16
22
  stop(): Promise<void>;
23
+ private requireApp;
17
24
  sendText(channelId: string, text: string, options?: SendOptions): Promise<string>;
18
25
  editText(channelId: string, messageId: string, text: string): Promise<void>;
26
+ deleteMessage(channelId: string, messageId: string): Promise<void>;
27
+ setReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
19
28
  sendFile(channelId: string, file: Attachment): Promise<void>;
20
29
  sendTyping(_channelId: string): Promise<void>;
21
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/channels/slack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA2BD,qBAAa,YAAa,YAAW,OAAO;IAK9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAW;IACrC,OAAO,CAAC,OAAO,CAAyD;IACxE,OAAO,CAAC,GAAG,CAAyB;gBAEP,MAAM,EAAE,WAAW;IAEhD,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAYjF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEzD"}
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/channels/slack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,UAAU,EAEV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAiED,qBAAa,YAAa,YAAW,OAAO;IAO9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAW;IACrC,OAAO,CAAC,OAAO,CAAyD;IACxE,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE1B,MAAM,EAAE,WAAW;IAEhD,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC5B,OAAO,CAAC,QAAQ;YAQF,eAAe;YAef,kBAAkB;YAgDlB,mBAAmB;IAM3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,OAAO,CAAC,UAAU;IAKZ,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBjF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3E,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5D,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEzD"}
@@ -1,8 +1,29 @@
1
+ const MAX_TRACKED = 1000;
2
+ const EMOJI_NAMES = {
3
+ '\u{1F440}': 'eyes',
4
+ '\u{1F914}': 'thinking_face',
5
+ '\u{1F525}': 'fire',
6
+ '\u{1F44D}': '+1',
7
+ '\u{1F631}': 'scream',
8
+ '\u{1F971}': 'yawning_face',
9
+ '\u{1F628}': 'fearful',
10
+ };
11
+ function attachmentType(mimeType) {
12
+ if (mimeType.startsWith('image/'))
13
+ return 'image';
14
+ if (mimeType.startsWith('audio/'))
15
+ return 'audio';
16
+ if (mimeType.startsWith('video/'))
17
+ return 'video';
18
+ return 'file';
19
+ }
1
20
  export class SlackChannel {
2
21
  config;
3
22
  type = 'slack';
4
23
  handler = null;
5
24
  app = null;
25
+ threadRoots = new Map();
26
+ userNames = new Map();
6
27
  constructor(config) {
7
28
  this.config = config;
8
29
  }
@@ -10,6 +31,8 @@ export class SlackChannel {
10
31
  this.handler = handler;
11
32
  }
12
33
  async start() {
34
+ if (this.app)
35
+ return;
13
36
  let bolt;
14
37
  try {
15
38
  bolt = (await import('@slack/bolt'));
@@ -26,59 +49,155 @@ export class SlackChannel {
26
49
  appConfig.appToken = this.config.appToken;
27
50
  }
28
51
  const app = new bolt.App(appConfig);
29
- this.app = app;
30
52
  app.message(async ({ message }) => {
31
- if (!this.handler)
32
- return;
33
- if (!message.text || message.subtype || !message.user)
34
- return;
35
- const channelMessage = {
36
- id: message.ts,
37
- channelType: 'slack',
38
- channelId: message.channel,
39
- userId: message.user,
40
- text: message.text,
41
- raw: message,
42
- };
43
- await this.handler(channelMessage);
53
+ await this.handleSlackMessage(message);
44
54
  });
45
55
  await app.start(this.config.port ?? 3000);
56
+ this.app = app;
57
+ }
58
+ remember(map, key, value) {
59
+ map.set(key, value);
60
+ if (map.size > MAX_TRACKED) {
61
+ const oldest = map.keys().next().value;
62
+ if (oldest !== undefined)
63
+ map.delete(oldest);
64
+ }
65
+ }
66
+ async resolveUserName(userId) {
67
+ const cached = this.userNames.get(userId);
68
+ if (cached)
69
+ return cached;
70
+ if (!this.app)
71
+ return undefined;
72
+ try {
73
+ const info = await this.app.client.users.info({ user: userId });
74
+ const user = info.user;
75
+ const name = user?.profile?.display_name || user?.real_name || user?.name;
76
+ if (name)
77
+ this.remember(this.userNames, userId, name);
78
+ return name;
79
+ }
80
+ catch {
81
+ return undefined;
82
+ }
83
+ }
84
+ async handleSlackMessage(message) {
85
+ if (!this.handler)
86
+ return;
87
+ if (message.bot_id || !message.user)
88
+ return;
89
+ if (message.subtype && message.subtype !== 'file_share')
90
+ return;
91
+ const attachments = [];
92
+ for (const file of message.files ?? []) {
93
+ if (!file.url_private)
94
+ continue;
95
+ const mimeType = file.mimetype ?? 'application/octet-stream';
96
+ try {
97
+ const buffer = await this.downloadPrivateFile(file.url_private);
98
+ attachments.push({
99
+ type: attachmentType(mimeType),
100
+ mimeType,
101
+ buffer,
102
+ ...(file.name ? { filename: file.name } : {}),
103
+ });
104
+ }
105
+ catch (err) {
106
+ console.error('[slack] Failed to download file:', err instanceof Error ? err.message : err);
107
+ }
108
+ }
109
+ const text = message.text ?? '';
110
+ if (!text && attachments.length === 0)
111
+ return;
112
+ this.remember(this.threadRoots, message.ts, message.thread_ts ?? message.ts);
113
+ const isDirect = message.channel_type === 'im';
114
+ const userName = await this.resolveUserName(message.user);
115
+ const channelMessage = {
116
+ id: message.ts,
117
+ channelType: 'slack',
118
+ channelId: message.channel,
119
+ userId: message.user,
120
+ text,
121
+ raw: message,
122
+ ...(userName ? { userName } : {}),
123
+ ...(isDirect ? {} : { groupId: message.channel }),
124
+ ...(attachments.length > 0 ? { attachments } : {}),
125
+ ...(message.thread_ts && message.thread_ts !== message.ts
126
+ ? { replyTo: message.thread_ts }
127
+ : {}),
128
+ };
129
+ await this.handler(channelMessage);
130
+ }
131
+ async downloadPrivateFile(url) {
132
+ const res = await fetch(url, { headers: { Authorization: `Bearer ${this.config.token}` } });
133
+ if (!res.ok)
134
+ throw new Error(`HTTP ${res.status}`);
135
+ return Buffer.from(await res.arrayBuffer());
46
136
  }
47
137
  async stop() {
48
138
  if (this.app) {
49
- await this.app.stop();
139
+ const app = this.app;
50
140
  this.app = null;
141
+ await app.stop();
51
142
  }
52
143
  }
53
- async sendText(channelId, text, options) {
144
+ requireApp() {
54
145
  if (!this.app)
55
- return '';
56
- const result = await this.app.client.chat.postMessage({
146
+ throw new Error('Slack channel is not started');
147
+ return this.app;
148
+ }
149
+ async sendText(channelId, text, options) {
150
+ const app = this.requireApp();
151
+ const threadTs = options?.replyTo
152
+ ? (this.threadRoots.get(options.replyTo) ?? options.replyTo)
153
+ : undefined;
154
+ const result = await app.client.chat.postMessage({
57
155
  channel: channelId,
58
156
  text,
59
- ...(options?.replyTo ? { thread_ts: options.replyTo } : {}),
157
+ ...(threadTs ? { thread_ts: threadTs } : {}),
60
158
  });
61
- return result.ts ?? '';
159
+ if (!result.ts)
160
+ throw new Error('Slack did not return a message timestamp');
161
+ if (threadTs)
162
+ this.remember(this.threadRoots, result.ts, threadTs);
163
+ return result.ts;
62
164
  }
63
165
  async editText(channelId, messageId, text) {
64
- if (!this.app)
65
- return;
66
- try {
67
- await this.app.client.chat.update({
68
- channel: channelId,
69
- ts: messageId,
70
- text,
71
- });
72
- }
73
- catch { }
166
+ const app = this.requireApp();
167
+ await app.client.chat.update({
168
+ channel: channelId,
169
+ ts: messageId,
170
+ text,
171
+ });
172
+ }
173
+ async deleteMessage(channelId, messageId) {
174
+ const app = this.requireApp();
175
+ await app.client.chat.delete({ channel: channelId, ts: messageId });
176
+ }
177
+ async setReaction(channelId, messageId, emoji) {
178
+ const app = this.requireApp();
179
+ const name = EMOJI_NAMES[emoji] ?? emoji.replace(/^:|:$/g, '');
180
+ await app.client.reactions.add({ channel: channelId, timestamp: messageId, name });
74
181
  }
75
182
  async sendFile(channelId, file) {
76
- if (!this.app)
77
- return;
78
- await this.app.client.files.uploadV2({
183
+ const app = this.requireApp();
184
+ let content;
185
+ if (file.buffer) {
186
+ content = Buffer.from(file.buffer);
187
+ }
188
+ else if (file.url) {
189
+ const res = await fetch(file.url);
190
+ if (!res.ok)
191
+ throw new Error(`Failed to download ${file.url}: HTTP ${res.status}`);
192
+ content = Buffer.from(await res.arrayBuffer());
193
+ }
194
+ else {
195
+ throw new Error('Attachment must have either a buffer or a url');
196
+ }
197
+ await app.client.files.uploadV2({
79
198
  channel_id: channelId,
80
199
  filename: file.filename ?? 'file',
81
- file: file.buffer ?? file.url,
200
+ file: content,
82
201
  });
83
202
  }
84
203
  async sendTyping(_channelId) { }
@@ -1 +1 @@
1
- {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/channels/slack.ts"],"names":[],"mappings":"AAwCA,MAAM,OAAO,YAAY;IAKM;IAJpB,IAAI,GAAgB,OAAO,CAAC;IAC7B,OAAO,GAAoD,IAAI,CAAC;IAChE,GAAG,GAAoB,IAAI,CAAC;IAEpC,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,SAAS,CAAC,OAA+C;QACvD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAA+D,CAAC;QACpE,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAgB,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAA4B;YACzC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;SACzC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;YAC5B,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC5C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAa,CAAC;QAChD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,EAAqB,EAAE,EAAE;YACnD,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI;gBAAE,OAAO;YAE9D,MAAM,cAAc,GAAmB;gBACrC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,WAAW,EAAE,OAAO;gBACpB,SAAS,EAAE,OAAO,CAAC,OAAO;gBAC1B,MAAM,EAAE,OAAO,CAAC,IAAI;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,EAAE,OAAO;aACb,CAAC;YAEF,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAqB;QACnE,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YACpD,OAAO,EAAE,SAAS;YAClB,IAAI;YACJ,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,SAAiB,EAAE,IAAY;QAC/D,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAChC,OAAO,EAAE,SAAS;gBAClB,EAAE,EAAE,SAAS;gBACb,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,IAAgB;QAChD,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEtB,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;YACnC,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM;YACjC,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB,IAAkB,CAAC;CACvD;AAED,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/channels/slack.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,16 @@ import type { Channel, ChannelMessage, ChannelType, Attachment, SendOptions } fr
2
2
  export interface TelegramConfig {
3
3
  token: string;
4
4
  allowedUpdates?: string[];
5
+ /**
6
+ * Receive updates through a webhook instead of long polling.
7
+ * A local HTTP server listens on `port` (and optional `path`, default: pathname of `url`)
8
+ * and `url` is registered with Telegram.
9
+ */
5
10
  webhook?: {
6
11
  url: string;
7
12
  port: number;
13
+ path?: string;
14
+ secretToken?: string;
8
15
  };
9
16
  }
10
17
  export declare class TelegramChannel implements Channel {
@@ -12,11 +19,17 @@ export declare class TelegramChannel implements Channel {
12
19
  readonly type: ChannelType;
13
20
  private handler;
14
21
  private bot;
22
+ private grammy;
23
+ private server;
15
24
  constructor(config: TelegramConfig);
16
25
  onMessage(handler: (msg: ChannelMessage) => Promise<void>): void;
26
+ private requireBot;
17
27
  private downloadFile;
18
28
  private buildBaseMessage;
29
+ private emitWithFile;
19
30
  start(): Promise<void>;
31
+ private startWebhook;
32
+ private closeServer;
20
33
  stop(): Promise<void>;
21
34
  sendText(channelId: string, text: string, options?: SendOptions): Promise<string>;
22
35
  editText(channelId: string, messageId: string, text: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAyFD,qBAAa,eAAgB,YAAW,OAAO;IAKjC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAc;IACxC,OAAO,CAAC,OAAO,CAAyD;IACxE,OAAO,CAAC,GAAG,CAA4B;gBAEV,MAAM,EAAE,cAAc;IAEnD,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;YAIlD,YAAY;IAU1B,OAAO,CAAC,gBAAgB;IAalB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoGtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BjF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC;IASV,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMtF;AAQD,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAE/D"}
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9E;AA0HD,qBAAa,eAAgB,YAAW,OAAO;IAOjC,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAc;IACxC,OAAO,CAAC,OAAO,CAAyD;IACxE,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAAuB;gBAER,MAAM,EAAE,cAAc;IAEnD,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIhE,OAAO,CAAC,UAAU;YAKJ,YAAY;IAU1B,OAAO,CAAC,gBAAgB;YAeV,YAAY;IAmBpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAoGd,YAAY;YA0CZ,WAAW;IAOnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCjF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B5D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC;IAQV,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMtF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAE/D"}