@clowder-ai/connector-telegram 0.0.0-stage → 0.1.0-alpha.5

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 (70) hide show
  1. package/README.en.md +48 -0
  2. package/README.md +24 -2
  3. package/assets/icon.svg +4 -0
  4. package/dist/TelegramAdapter.d.ts +229 -0
  5. package/dist/TelegramAdapter.d.ts.map +1 -0
  6. package/dist/TelegramAdapter.js +923 -0
  7. package/dist/TelegramAdapter.js.map +1 -0
  8. package/dist/command-ingress.d.ts +10 -0
  9. package/dist/command-ingress.d.ts.map +1 -0
  10. package/dist/command-ingress.js +13 -0
  11. package/dist/command-ingress.js.map +1 -0
  12. package/dist/execution-status.d.ts +27 -0
  13. package/dist/execution-status.d.ts.map +1 -0
  14. package/dist/execution-status.js +48 -0
  15. package/dist/execution-status.js.map +1 -0
  16. package/dist/inbound-download.d.ts +13 -0
  17. package/dist/inbound-download.d.ts.map +1 -0
  18. package/dist/inbound-download.js +70 -0
  19. package/dist/inbound-download.js.map +1 -0
  20. package/dist/inbound-media-source.d.ts +25 -0
  21. package/dist/inbound-media-source.d.ts.map +1 -0
  22. package/dist/inbound-media-source.js +111 -0
  23. package/dist/inbound-media-source.js.map +1 -0
  24. package/dist/index.d.ts +8 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +5 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/lifecycle-action.d.ts +30 -0
  29. package/dist/lifecycle-action.d.ts.map +1 -0
  30. package/dist/lifecycle-action.js +457 -0
  31. package/dist/lifecycle-action.js.map +1 -0
  32. package/dist/materialize-media.d.ts +7 -0
  33. package/dist/materialize-media.d.ts.map +1 -0
  34. package/dist/materialize-media.js +35 -0
  35. package/dist/materialize-media.js.map +1 -0
  36. package/dist/media-notice.d.ts +6 -0
  37. package/dist/media-notice.d.ts.map +1 -0
  38. package/dist/media-notice.js +50 -0
  39. package/dist/media-notice.js.map +1 -0
  40. package/dist/plugin-entrypoint.d.ts +7 -0
  41. package/dist/plugin-entrypoint.d.ts.map +1 -0
  42. package/dist/plugin-entrypoint.js +445 -0
  43. package/dist/plugin-entrypoint.js.map +1 -0
  44. package/dist/reply-sender-map.d.ts +10 -0
  45. package/dist/reply-sender-map.d.ts.map +1 -0
  46. package/dist/reply-sender-map.js +123 -0
  47. package/dist/reply-sender-map.js.map +1 -0
  48. package/dist/runtime.d.ts +61 -0
  49. package/dist/runtime.d.ts.map +1 -0
  50. package/dist/runtime.js +82 -0
  51. package/dist/runtime.js.map +1 -0
  52. package/dist/telegram-html-formatter.d.ts +3 -0
  53. package/dist/telegram-html-formatter.d.ts.map +1 -0
  54. package/dist/telegram-html-formatter.js +42 -0
  55. package/dist/telegram-html-formatter.js.map +1 -0
  56. package/dist/thread-mappings.d.ts +46 -0
  57. package/dist/thread-mappings.d.ts.map +1 -0
  58. package/dist/thread-mappings.js +62 -0
  59. package/dist/thread-mappings.js.map +1 -0
  60. package/dist/token.d.ts +2 -0
  61. package/dist/token.d.ts.map +1 -0
  62. package/dist/token.js +8 -0
  63. package/dist/token.js.map +1 -0
  64. package/dist/types.d.ts +58 -0
  65. package/dist/types.d.ts.map +1 -0
  66. package/dist/types.js +2 -0
  67. package/dist/types.js.map +1 -0
  68. package/npm-shrinkwrap.json +229 -0
  69. package/package.json +55 -4
  70. package/plugin.yaml +59 -0
@@ -0,0 +1,445 @@
1
+ import { isPluginDeliveryInput } from '@clowder-ai/plugin-contract';
2
+ import { definePluginModule } from '@clowder-ai/plugin-sdk';
3
+ import { threadMappings } from './thread-mappings.js';
4
+ import { createConnectorCommandBridge } from '@clowder-ai/plugin-sdk';
5
+ import { definePlugin, defineDeliveryAction, requireConnectorOutboundDelivery, } from '@clowder-ai/plugin-sdk';
6
+ import { createTelegramConnectorRuntime, } from './runtime.js';
7
+ import { renderTypedMediaNotice } from './media-notice.js';
8
+ import { createInboundMediaSource, releaseInboundMedia, retainInboundMedia } from './inbound-media-source.js';
9
+ import { createConnectorLifecycleAction } from './lifecycle-action.js';
10
+ import { createReplySenderMap } from './reply-sender-map.js';
11
+ import { connectorCommandFacts } from './command-ingress.js';
12
+ const CONNECTOR_ID = 'telegram';
13
+ const IDENTITY_ID = 'telegram-bot';
14
+ // (executionId, chatId)-keyed: one thread can back several Telegram bindings,
15
+ // and executionId alone is ambiguous across them.
16
+ const INLINE_FINAL_PREFIX = 'tg-inline-final:';
17
+ // Consumed markers survive restarts so a catching_up redelivery in the
18
+ // delivered-but-not-yet-settled window cannot rewrite the delivered body.
19
+ const INLINE_FINAL_CONSUMED_PREFIX = 'tg-inline-final-consumed:';
20
+ // A pending inline-final that outlives a day was almost certainly orphaned by
21
+ // a crash or skipped delivery; the sweeping settle path already deleted the
22
+ // Telegram card, so hydrating it would only resurrect a stale correlation.
23
+ // Consumed markers share the 24h TTL convention: storage has no native TTL,
24
+ // so hydration sweeps by timestamp, exactly like the pending entries. 24h also
25
+ // matches the in-memory CONSUMED_INLINE_FINAL_TTL_MS in the adapter.
26
+ const INLINE_FINAL_TTL_MS = 24 * 60 * 60 * 1000;
27
+ function object(value) {
28
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
29
+ }
30
+ function requireDelivery(candidate) {
31
+ if (!isPluginDeliveryInput(candidate) || candidate.kind !== 'message')
32
+ throw new TypeError('telegram requires a message delivery');
33
+ return structuredClone(candidate);
34
+ }
35
+ function threadTitle(externalConversationId) {
36
+ const value = `Telegram ${externalConversationId}`;
37
+ return value.length <= 200 ? value : value.slice(0, 200);
38
+ }
39
+ async function draft(context, message) {
40
+ const retained = await retainInboundMedia(context, CONNECTOR_ID, 'telegram-media', message.providerMessageId, (message.attachments ?? []).map(attachment => ({
41
+ type: attachment.type, platformKey: attachment.platformKey,
42
+ ...(attachment.fileName === undefined ? {} : { fileName: attachment.fileName }),
43
+ ...(attachment.duration === undefined ? {} : { duration: attachment.duration }),
44
+ })));
45
+ const messageDraft = {
46
+ idempotencyKey: message.providerMessageId,
47
+ sourceEventId: message.providerMessageId,
48
+ identity: IDENTITY_ID,
49
+ sender: { id: message.externalSenderId },
50
+ payload: {
51
+ provenance: {
52
+ origin: {
53
+ kind: 'external',
54
+ connectorId: CONNECTOR_ID,
55
+ sourceAddress: {
56
+ connectorId: CONNECTOR_ID,
57
+ chatId: message.externalConversationId,
58
+ messageId: message.providerMessageId,
59
+ },
60
+ },
61
+ epistemicStatus: 'observation',
62
+ },
63
+ elements: [
64
+ { elementId: 'text-1', kind: 'text', payload: { text: message.text } },
65
+ ...retained.elements,
66
+ ],
67
+ },
68
+ };
69
+ return { messageDraft, ownership: retained.ownership };
70
+ }
71
+ function parseStoredInlineFinal(value) {
72
+ if (!object(value)
73
+ || value.version !== 1
74
+ || typeof value.executionId !== 'string'
75
+ || typeof value.externalChatId !== 'string'
76
+ || typeof value.platformMessageId !== 'string'
77
+ || typeof value.registeredAt !== 'number') {
78
+ return undefined;
79
+ }
80
+ return value;
81
+ }
82
+ function parseStoredInlineFinalConsumed(value) {
83
+ if (!object(value)
84
+ || value.version !== 1
85
+ || typeof value.executionId !== 'string'
86
+ || typeof value.externalChatId !== 'string'
87
+ || typeof value.consumedAt !== 'number') {
88
+ return undefined;
89
+ }
90
+ return value;
91
+ }
92
+ /** Durable backing for the (executionId, chatId)-keyed inline-final map and consumed markers, so a plugin restart cannot lose final↔placeholder correlation. */
93
+ function createInlineFinalPersistence(context) {
94
+ return {
95
+ async save(entry) {
96
+ await context.storage.set(`${INLINE_FINAL_PREFIX}${entry.executionId}:${entry.externalChatId}`, { version: 1, ...entry });
97
+ },
98
+ async remove(executionId, externalChatId) {
99
+ await context.storage.delete(`${INLINE_FINAL_PREFIX}${executionId}:${externalChatId}`).catch(() => undefined);
100
+ // Best-effort: also clear a pre-multi-binding record keyed by executionId
101
+ // alone so an upgrade mid-flight cannot leave a stale pending entry behind.
102
+ await context.storage.delete(`${INLINE_FINAL_PREFIX}${executionId}`).catch(() => undefined);
103
+ },
104
+ async saveConsumed(entry) {
105
+ await context.storage.set(`${INLINE_FINAL_CONSUMED_PREFIX}${entry.executionId}:${entry.externalChatId}`, { version: 1, ...entry });
106
+ },
107
+ async removeConsumed(executionId, externalChatId) {
108
+ await context.storage.delete(`${INLINE_FINAL_CONSUMED_PREFIX}${executionId}:${externalChatId}`).catch(() => undefined);
109
+ },
110
+ };
111
+ }
112
+ async function hydrateInlineFinals(context, outbound) {
113
+ let listed;
114
+ try {
115
+ listed = await context.storage.list();
116
+ }
117
+ catch (error) {
118
+ context.log('warn', 'Telegram inline-final hydration failed', {
119
+ errorName: error instanceof Error ? error.name : 'unknown',
120
+ });
121
+ return;
122
+ }
123
+ const now = Date.now();
124
+ for (const [key, item] of Object.entries(listed)) {
125
+ if (key.startsWith(INLINE_FINAL_CONSUMED_PREFIX)) {
126
+ const consumed = parseStoredInlineFinalConsumed(item?.value);
127
+ // TTL sweep: storage has no native TTL, so expired markers are deleted
128
+ // here, mirroring the pending-entry sweep below.
129
+ if (consumed === undefined || consumed.consumedAt + INLINE_FINAL_TTL_MS < now) {
130
+ await context.storage.delete(key).catch(() => undefined);
131
+ continue;
132
+ }
133
+ outbound.restoreInlineFinalConsumed?.(consumed.executionId, consumed.externalChatId, consumed.consumedAt);
134
+ continue;
135
+ }
136
+ if (!key.startsWith(INLINE_FINAL_PREFIX))
137
+ continue;
138
+ const entry = parseStoredInlineFinal(item?.value);
139
+ if (entry === undefined || entry.registeredAt + INLINE_FINAL_TTL_MS < now) {
140
+ await context.storage.delete(key).catch(() => undefined);
141
+ continue;
142
+ }
143
+ // Pre-multi-binding records were keyed by executionId alone; their value
144
+ // still carries externalChatId, so they hydrate onto the composite key.
145
+ outbound.restoreInlinePlaceholder?.(entry.executionId, entry.externalChatId, entry.platformMessageId, entry.registeredAt);
146
+ }
147
+ }
148
+ async function createMessageBridge(context, reply) {
149
+ const replySenders = createReplySenderMap(context);
150
+ const subscriptions = new Map();
151
+ const subscribe = (threadId) => {
152
+ const current = subscriptions.get(threadId);
153
+ if (current !== undefined)
154
+ return current;
155
+ let pending;
156
+ pending = context.messaging.subscribe(threadId, { contributionId: CONNECTOR_ID })
157
+ .catch((error) => {
158
+ if (subscriptions.get(threadId) === pending)
159
+ subscriptions.delete(threadId);
160
+ throw error;
161
+ });
162
+ subscriptions.set(threadId, pending);
163
+ return pending;
164
+ };
165
+ for (const binding of await threadMappings(context).listBindings())
166
+ await subscribe(binding.threadId);
167
+ const routeCommand = createConnectorCommandBridge(context, {
168
+ connectorId: CONNECTOR_ID, identityId: IDENTITY_ID, reply,
169
+ settle: async () => { },
170
+ async bindingChanged(change) {
171
+ if (change.threadId !== undefined)
172
+ await subscribe(change.threadId);
173
+ if (change.previousThreadId !== undefined && change.previousThreadId !== change.threadId &&
174
+ !(await threadMappings(context).listBindings()).some(binding => binding.threadId === change.previousThreadId)) {
175
+ await context.messaging.unsubscribe(change.previousThreadId);
176
+ subscriptions.delete(change.previousThreadId);
177
+ }
178
+ },
179
+ });
180
+ return {
181
+ async deliver(message) {
182
+ await routeCommand(connectorCommandFacts(message), async () => {
183
+ const thread = await threadMappings(context).ensureByKey(message.externalConversationId, {
184
+ title: threadTitle(message.externalConversationId),
185
+ });
186
+ await subscribe(thread.id);
187
+ const prepared = await draft(context, message);
188
+ try {
189
+ const sent = await context.messaging.send(thread.id, prepared.messageDraft);
190
+ if (prepared.messageDraft.sender !== undefined) {
191
+ try {
192
+ await replySenders.record(sent.messageId, prepared.messageDraft.sender);
193
+ }
194
+ catch (error) {
195
+ context.log('warn', 'Telegram reply-sender mapping record failed', {
196
+ errorName: error instanceof Error ? error.name : 'unknown',
197
+ });
198
+ }
199
+ }
200
+ }
201
+ catch (error) {
202
+ await releaseInboundMedia(context, prepared.ownership, error);
203
+ throw error;
204
+ }
205
+ });
206
+ },
207
+ async outbound(candidate) {
208
+ const input = requireDelivery(candidate);
209
+ const bindings = (await threadMappings(context).listBindings()).filter(item => item.threadId === input.threadId);
210
+ if (bindings.length === 0)
211
+ throw new TypeError(`telegram thread ${input.threadId} has no provider binding`);
212
+ const text = input.envelope.payload.elements.flatMap((element) => {
213
+ if (element.kind === 'text')
214
+ return [element.payload.text];
215
+ const notice = renderTypedMediaNotice(element, {
216
+ elements: input.envelope.payload.elements,
217
+ warnInvalid: elementId => context.log('warn', 'Invalid typed media notice ignored', { elementId }),
218
+ });
219
+ return notice === undefined ? [] : [notice];
220
+ }).join('\n\n');
221
+ const richBlocks = input.envelope.payload.elements
222
+ .filter(element => element.kind === 'rich_block')
223
+ .map(element => element.payload);
224
+ const media = input.envelope.payload.elements.flatMap((element) => {
225
+ if (element.kind !== 'media_ref' || !object(element.payload))
226
+ return [];
227
+ const type = element.payload.type;
228
+ const reference = element.payload.reference;
229
+ if (!['image', 'file', 'audio', 'video'].includes(String(type)) || typeof reference !== 'string')
230
+ return [];
231
+ return [{ type, reference, ...(typeof element.payload.fileName === 'string' ? { fileName: element.payload.fileName } : {}) }];
232
+ });
233
+ const displayName = input.presentation?.actor.displayName || input.envelope.actor.id;
234
+ const replyPrefix = input.envelope.actor.kind === 'cat' ? `【${displayName}🐱】\n` : '';
235
+ const replyToSender = await replySenders.resolve(input.envelope.replyTo);
236
+ // One thread can carry several provider bindings (the Host allows
237
+ // rebinding different external chats onto the same thread), so the
238
+ // same Host delivery fans out to every binding.
239
+ const inputs = bindings.map(binding => {
240
+ const delivery = requireConnectorOutboundDelivery({
241
+ deliveryId: input.deliveryId,
242
+ externalConversationId: binding.key,
243
+ presentation: {
244
+ header: displayName,
245
+ body: text,
246
+ origin: input.envelope.actor.kind === 'cat' ? 'agent' : input.envelope.actor.kind === 'system' ? 'system' : 'direct',
247
+ },
248
+ ...(replyToSender === undefined ? {} : { metadata: { replyToSender } }),
249
+ ...(richBlocks.length === 0 ? {} : { richBlocks }),
250
+ ...(media.length === 0 ? {} : { media }),
251
+ });
252
+ return {
253
+ ...delivery,
254
+ ...(input.executionId === undefined ? {} : { executionId: input.executionId }),
255
+ };
256
+ });
257
+ return { replyPrefix, inputs };
258
+ },
259
+ };
260
+ }
261
+ async function deliver(adapter, input, context, replyPrefix) {
262
+ const blocks = [...(input.richBlocks ?? [])];
263
+ if (blocks.length > 0) {
264
+ const richBlocks = blocks;
265
+ if (input.executionId === undefined) {
266
+ await adapter.sendRichMessage(input.externalConversationId, input.presentation.body, richBlocks, input.presentation.header);
267
+ }
268
+ else {
269
+ await adapter.sendRichMessage(input.externalConversationId, input.presentation.body, richBlocks, input.presentation.header, input.executionId);
270
+ }
271
+ }
272
+ else {
273
+ const text = replyPrefix + [input.presentation.subtitle, input.presentation.body, input.presentation.footer]
274
+ .filter((value) => value !== undefined && value.length > 0)
275
+ .join('\n\n');
276
+ // A non-cat media-only delivery assembles to empty text; Telegram rejects
277
+ // empty sendMessage calls, so only send when there is something to say.
278
+ if (text.length > 0) {
279
+ if (input.executionId === undefined) {
280
+ await adapter.sendReply(input.externalConversationId, text);
281
+ }
282
+ else {
283
+ await adapter.sendReply(input.externalConversationId, text, undefined, input.executionId);
284
+ }
285
+ }
286
+ }
287
+ for (const media of input.media ?? []) {
288
+ if (media.type === 'video') {
289
+ await adapter.sendReply(input.externalConversationId, `${replyPrefix}⚠️ 视频附件暂不支持发送`, input.metadata);
290
+ continue;
291
+ }
292
+ if (!media.reference.startsWith('hmr_')) {
293
+ await adapter.sendReply(input.externalConversationId, `${replyPrefix}⚠️ 媒体不可用(旧引用无法读取)`, input.metadata);
294
+ continue;
295
+ }
296
+ try {
297
+ await adapter.sendMedia(input.externalConversationId, {
298
+ type: media.type,
299
+ content: context.streams.read(media.reference),
300
+ ...(media.fileName === undefined ? {} : { fileName: media.fileName }),
301
+ });
302
+ }
303
+ catch (error) {
304
+ context.log('warn', 'Telegram outbound media delivery failed', {
305
+ mediaType: media.type,
306
+ errorName: error instanceof Error ? error.name : 'unknown',
307
+ });
308
+ await adapter.sendReply(input.externalConversationId, `${replyPrefix}${error instanceof RangeError ? '⚠️ 媒体过大,超过 Telegram 发送上限' : '⚠️ 媒体不可用(读取或上传失败)'}`, input.metadata);
309
+ }
310
+ }
311
+ }
312
+ export function createTelegramPluginModule(createRuntime = createTelegramConnectorRuntime) {
313
+ return definePluginModule((manifest) => definePlugin({
314
+ manifest,
315
+ activate: {
316
+ 'telegram-messaging': async (context) => {
317
+ let runtime;
318
+ const bridge = await createMessageBridge(context, async (input, result) => {
319
+ if (runtime === undefined)
320
+ throw new Error('Telegram Bot Token 未配置');
321
+ await runtime.outbound.sendReply(input.chatId, result.response);
322
+ });
323
+ const configure = async () => {
324
+ await runtime?.stop();
325
+ const botToken = await context.secrets.get('botToken');
326
+ // The feature stays activatable without a token so telegram.test can
327
+ // report the not-configured state; polling starts once a token exists.
328
+ runtime = typeof botToken === 'string' && botToken.trim().length > 0
329
+ ? createRuntime({
330
+ config: { botToken },
331
+ host: { deliver: bridge.deliver },
332
+ logger: { info: (...args) => context.log('info', String(args[0]), { args }), warn: (...args) => context.log('warn', String(args[0]), { args }), error: (...args) => context.log('error', String(args[0]), { args }) },
333
+ inlineFinalPersistence: createInlineFinalPersistence(context),
334
+ })
335
+ : undefined;
336
+ if (runtime !== undefined)
337
+ await hydrateInlineFinals(context, runtime.outbound);
338
+ await runtime?.start();
339
+ };
340
+ await configure();
341
+ const mediaSource = createInboundMediaSource(context, async (locator) => {
342
+ if (runtime === undefined)
343
+ throw new Error('Telegram Bot Token 未配置');
344
+ return runtime.outbound.downloadInboundMedia(locator);
345
+ });
346
+ const lifecycle = createConnectorLifecycleAction(context, {
347
+ sendPlaceholder: async (externalConversationId, text) => {
348
+ if (runtime === undefined)
349
+ throw new Error('Telegram Bot Token 未配置');
350
+ return runtime.outbound.sendPlaceholder(externalConversationId, text);
351
+ },
352
+ editPlaceholder: async (externalConversationId, platformMessageId, text, phase, executionId) => {
353
+ if (runtime === undefined)
354
+ throw new Error('Telegram Bot Token 未配置');
355
+ // A consumed inline final already shows the delivered body in this
356
+ // message; editing it again would overwrite the final content.
357
+ // Returning false keeps the lifecycle action on its existing
358
+ // fallbacks (e.g. blocked recovery send).
359
+ if (runtime.outbound.isInlineFinalConsumed?.(executionId, externalConversationId))
360
+ return false;
361
+ const edited = await runtime.outbound.editMessage(externalConversationId, platformMessageId, text);
362
+ if (edited && phase === 'blocked') {
363
+ runtime.outbound.preserveInlinePlaceholder(externalConversationId, platformMessageId, executionId);
364
+ }
365
+ return edited;
366
+ },
367
+ sendRecovery: async (externalConversationId, text) => {
368
+ if (runtime === undefined)
369
+ throw new Error('Telegram Bot Token 未配置');
370
+ await runtime.outbound.sendReply(externalConversationId, text);
371
+ },
372
+ onPlaceholder: (externalConversationId, platformMessageId, executionId) => {
373
+ if (runtime === undefined)
374
+ throw new Error('Telegram Bot Token 未配置');
375
+ runtime.outbound.registerInlinePlaceholder(externalConversationId, platformMessageId, executionId);
376
+ },
377
+ settle: async ({ externalConversationId, platformMessageId, recoveryText, event }) => {
378
+ if (runtime !== undefined) {
379
+ // The lifecycle is over; the consumed marker only protected the
380
+ // delivered-but-not-yet-settled window. The SDK allows one
381
+ // started per lifecycle, so without this the marker would wait
382
+ // for the 24h TTL sweep.
383
+ runtime.outbound.clearInlineFinalConsumed(event.executionId, externalConversationId);
384
+ if (platformMessageId !== undefined) {
385
+ if (recoveryText !== undefined)
386
+ return;
387
+ await runtime.outbound.clearInlinePlaceholder(externalConversationId, platformMessageId, event.executionId);
388
+ }
389
+ }
390
+ },
391
+ });
392
+ return {
393
+ configRefresh: configure,
394
+ streams: mediaSource,
395
+ actions: {
396
+ 'telegram.test': async () => {
397
+ if (runtime === undefined)
398
+ return { ok: false, message: 'Telegram Bot Token 未配置' };
399
+ const ok = runtime.isPolling();
400
+ return { ok, ...(ok ? {} : { message: 'Telegram 未在轮询(Token 已配置)' }) };
401
+ },
402
+ 'telegram.outbound': defineDeliveryAction(async (input) => {
403
+ if (input.kind === 'execution_status') {
404
+ return lifecycle(input);
405
+ }
406
+ if (runtime === undefined)
407
+ throw new Error('Telegram Bot Token 未配置');
408
+ const { inputs, replyPrefix } = await bridge.outbound(input);
409
+ // Per-binding isolation: one thread can fan out to several
410
+ // provider bindings, and a failure on one chat must not block
411
+ // or fail the others. A single binding keeps the old fail-fast
412
+ // behavior so the Host redelivers; with several bindings the
413
+ // action only rejects when every binding failed.
414
+ let firstFailure;
415
+ let delivered = 0;
416
+ for (const delivery of inputs) {
417
+ try {
418
+ await deliver(runtime.outbound, delivery, context, replyPrefix);
419
+ delivered += 1;
420
+ }
421
+ catch (error) {
422
+ if (firstFailure === undefined)
423
+ firstFailure = error;
424
+ context.log('warn', 'Telegram outbound delivery to one binding failed', {
425
+ externalConversationId: delivery.externalConversationId,
426
+ errorName: error instanceof Error ? error.name : 'unknown',
427
+ });
428
+ }
429
+ }
430
+ if (delivered === 0) {
431
+ if (firstFailure !== undefined)
432
+ throw firstFailure;
433
+ throw new Error('Telegram outbound delivery failed for all bindings (provider did not report an error)');
434
+ }
435
+ return { deliveryId: input.deliveryId };
436
+ }),
437
+ },
438
+ dispose: () => runtime?.stop() ?? Promise.resolve(),
439
+ };
440
+ },
441
+ },
442
+ }));
443
+ }
444
+ export default createTelegramPluginModule();
445
+ //# sourceMappingURL=plugin-entrypoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-entrypoint.js","sourceRoot":"","sources":["../src/plugin-entrypoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { FeatureContext } from '@clowder-ai/plugin-sdk';
2
+ export interface ReplySender {
3
+ readonly id: string;
4
+ readonly name?: string;
5
+ }
6
+ export declare function createReplySenderMap(context: FeatureContext): {
7
+ record(hostMessageId: string, replySender: ReplySender): Promise<void>;
8
+ resolve(hostMessageId: string | undefined): Promise<ReplySender | undefined>;
9
+ };
10
+ //# sourceMappingURL=reply-sender-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-sender-map.d.ts","sourceRoot":"","sources":["../src/reply-sender-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AA0CD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc;0BAkD5B,MAAM,eAAe,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;2BAgB/C,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;EAmBrF"}
@@ -0,0 +1,123 @@
1
+ const KEY_PREFIX = 'reply-sender:';
2
+ const ENTRY_TTL_MS = 24 * 60 * 60 * 1000;
3
+ const SWEEP_EVERY_RECORDS = 50;
4
+ const ENTRY_CAP = 2000;
5
+ function object(value) {
6
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
7
+ }
8
+ function errorName(error) {
9
+ return error instanceof Error ? error.name : 'unknown';
10
+ }
11
+ function parseEntry(value) {
12
+ if (typeof value !== 'string')
13
+ return undefined;
14
+ let parsed;
15
+ try {
16
+ parsed = JSON.parse(value);
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ if (!object(parsed) || parsed.version !== 1 || typeof parsed.storedAt !== 'number')
22
+ return undefined;
23
+ const candidate = parsed.sender;
24
+ if (!object(candidate) || typeof candidate.id !== 'string' || candidate.id.length === 0)
25
+ return undefined;
26
+ return {
27
+ version: 1,
28
+ storedAt: parsed.storedAt,
29
+ sender: {
30
+ id: candidate.id,
31
+ ...(typeof candidate.name === 'string' ? { name: candidate.name } : {}),
32
+ },
33
+ };
34
+ }
35
+ export function createReplySenderMap(context) {
36
+ let recordedSinceSweep = 0;
37
+ let sweepInFlight = false;
38
+ const sweep = async () => {
39
+ let listed;
40
+ try {
41
+ listed = await context.storage.list();
42
+ }
43
+ catch (error) {
44
+ context.log('warn', 'Connector reply-sender mapping sweep failed', { errorName: errorName(error) });
45
+ return;
46
+ }
47
+ const now = Date.now();
48
+ const live = [];
49
+ for (const [key, item] of Object.entries(listed)) {
50
+ if (!key.startsWith(KEY_PREFIX))
51
+ continue;
52
+ const entry = parseEntry(item?.value);
53
+ if (entry === undefined || entry.storedAt + ENTRY_TTL_MS < now) {
54
+ await context.storage.delete(key).catch(() => undefined);
55
+ continue;
56
+ }
57
+ live.push({ key, storedAt: entry.storedAt });
58
+ }
59
+ live.sort((a, b) => a.storedAt - b.storedAt);
60
+ let overflow = live.length - (ENTRY_CAP - 1);
61
+ for (let index = 0; overflow > 0 && index < live.length; index += 1, overflow -= 1) {
62
+ await context.storage.delete(live[index].key).catch(() => undefined);
63
+ }
64
+ };
65
+ // Sweep single-flight in the background: recording stays on the inbound
66
+ // hot path and overlapping bursts never stack sweeps. sweep() already
67
+ // swallows and logs its own storage failures. context.log is intentionally
68
+ // NOT used here: log() runs assertActive() and throws
69
+ // FeatureContextRevokedError after stop/revoke, so a sweep racing feature
70
+ // shutdown would turn into an unhandled rejection; console.warn is the
71
+ // reviewer-sanctioned exception that stays callable past revocation.
72
+ const sweepInBackground = () => {
73
+ if (sweepInFlight)
74
+ return;
75
+ sweepInFlight = true;
76
+ void sweep()
77
+ .catch((error) => {
78
+ console.warn('Connector reply-sender mapping sweep failed', { errorName: errorName(error) });
79
+ })
80
+ .finally(() => {
81
+ sweepInFlight = false;
82
+ });
83
+ };
84
+ return {
85
+ async record(hostMessageId, replySender) {
86
+ const now = Date.now();
87
+ try {
88
+ await context.storage.set(`${KEY_PREFIX}${hostMessageId}`, JSON.stringify({ version: 1, sender: replySender, storedAt: now }));
89
+ }
90
+ catch (error) {
91
+ context.log('warn', 'Connector reply-sender mapping record failed', { errorName: errorName(error) });
92
+ return;
93
+ }
94
+ recordedSinceSweep += 1;
95
+ if (recordedSinceSweep < SWEEP_EVERY_RECORDS)
96
+ return;
97
+ recordedSinceSweep = 0;
98
+ sweepInBackground();
99
+ },
100
+ async resolve(hostMessageId) {
101
+ if (hostMessageId === undefined)
102
+ return undefined;
103
+ const key = `${KEY_PREFIX}${hostMessageId}`;
104
+ let stored;
105
+ try {
106
+ stored = await context.storage.get(key);
107
+ }
108
+ catch (error) {
109
+ context.log('warn', 'Connector reply-sender mapping lookup failed', { errorName: errorName(error) });
110
+ return undefined;
111
+ }
112
+ const entry = parseEntry(stored?.value);
113
+ if (entry === undefined)
114
+ return undefined;
115
+ if (entry.storedAt + ENTRY_TTL_MS < Date.now()) {
116
+ await context.storage.delete(key).catch(() => undefined);
117
+ return undefined;
118
+ }
119
+ return entry.sender;
120
+ },
121
+ };
122
+ }
123
+ //# sourceMappingURL=reply-sender-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-sender-map.js","sourceRoot":"","sources":["../src/reply-sender-map.ts"],"names":[],"mappings":"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"}