@diegoaltoworks/chatter 0.58.0 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channels/index.js +81 -0
- package/dist/channels/index.mjs +81 -0
- package/dist/channels/pipeline.d.ts +8 -0
- package/dist/channels/pipeline.d.ts.map +1 -1
- package/dist/channels/telegram/api.d.ts +17 -0
- package/dist/channels/telegram/api.d.ts.map +1 -1
- package/dist/channels/telegram/channel.d.ts +11 -1
- package/dist/channels/telegram/channel.d.ts.map +1 -1
- package/dist/channels/telegram/handler.d.ts +31 -0
- package/dist/channels/telegram/handler.d.ts.map +1 -0
- package/dist/channels/telegram/index.d.ts +7 -0
- package/dist/channels/telegram/index.d.ts.map +1 -1
- package/dist/channels/telegram/index.js +382 -79
- package/dist/channels/telegram/index.mjs +379 -79
- package/dist/channels/telegram/webhook.d.ts +102 -0
- package/dist/channels/telegram/webhook.d.ts.map +1 -0
- package/dist/channels/whatsapp/inbound.d.ts +7 -0
- package/dist/channels/whatsapp/inbound.d.ts.map +1 -1
- package/dist/channels/whatsapp/index.js +81 -0
- package/dist/channels/whatsapp/index.mjs +81 -0
- package/dist/history/compaction.d.ts +61 -0
- package/dist/history/compaction.d.ts.map +1 -0
- package/dist/history/index.d.ts +7 -0
- package/dist/history/index.d.ts.map +1 -1
- package/dist/history/index.js +143 -0
- package/dist/history/index.mjs +141 -0
- package/package.json +1 -1
package/dist/channels/index.js
CHANGED
|
@@ -262,6 +262,75 @@ ${ctx.join("\n\n")}`
|
|
|
262
262
|
return { system, messages, context: ctx };
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
// src/history/compaction.ts
|
|
266
|
+
var DEFAULT_TIMEOUT_MS = 8e3;
|
|
267
|
+
var LOAD_ALL = Number.MAX_SAFE_INTEGER;
|
|
268
|
+
var SUMMARY_PREFIX = "Summary of earlier conversation: ";
|
|
269
|
+
function defaultSummarize(client, model) {
|
|
270
|
+
return async ({ turns }) => {
|
|
271
|
+
const transcript = turns.map((turn) => `${turn.role}: ${turn.content}`).join("\n");
|
|
272
|
+
const { content } = await answerOnce({
|
|
273
|
+
client,
|
|
274
|
+
system: "Summarize the conversation turns below into a short paragraph a reader would need to continue the conversation. Preserve names, facts, and decisions; drop pleasantries. Reply with the summary only, no preamble.",
|
|
275
|
+
messages: [{ role: "user", content: transcript }],
|
|
276
|
+
// No `answerFn`: compaction is an internal chatter operation, not a
|
|
277
|
+
// chat surface, so it must not conscript a caller's brain hook, which
|
|
278
|
+
// is shaped to answer the user, not to summarize on the engine's behalf.
|
|
279
|
+
mode: "public",
|
|
280
|
+
model
|
|
281
|
+
});
|
|
282
|
+
return content;
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
function createHistoryCompactor(deps, options) {
|
|
286
|
+
const { threshold, keep, logger } = options;
|
|
287
|
+
if (!Number.isInteger(threshold) || threshold < 1) {
|
|
288
|
+
throw new Error(`Invalid history compaction threshold: ${threshold}`);
|
|
289
|
+
}
|
|
290
|
+
if (!Number.isInteger(keep) || keep < 0 || keep >= threshold) {
|
|
291
|
+
throw new Error(`Invalid history compaction keep: ${keep}`);
|
|
292
|
+
}
|
|
293
|
+
const summarize = options.summarize ?? defaultSummarize(deps.client, options.model);
|
|
294
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
295
|
+
return {
|
|
296
|
+
async maybeCompact(store, conversationId) {
|
|
297
|
+
const turns = await store.load(conversationId, LOAD_ALL);
|
|
298
|
+
if (turns.length < threshold) return;
|
|
299
|
+
const older = turns.slice(0, turns.length - keep);
|
|
300
|
+
let summary;
|
|
301
|
+
let timer;
|
|
302
|
+
try {
|
|
303
|
+
summary = await Promise.race([
|
|
304
|
+
summarize({ conversationId, turns: older }),
|
|
305
|
+
new Promise((_, reject) => {
|
|
306
|
+
timer = setTimeout(() => reject(new Error("history compaction timed out")), timeoutMs);
|
|
307
|
+
})
|
|
308
|
+
]);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
logger?.error(
|
|
311
|
+
`history compaction summarize failed for "${conversationId}"; history left untouched`,
|
|
312
|
+
error
|
|
313
|
+
);
|
|
314
|
+
return;
|
|
315
|
+
} finally {
|
|
316
|
+
clearTimeout(timer);
|
|
317
|
+
}
|
|
318
|
+
const trimmed = summary.trim();
|
|
319
|
+
if (!trimmed) return;
|
|
320
|
+
const fresh = await store.load(conversationId, LOAD_ALL);
|
|
321
|
+
const recent = fresh.slice(older.length);
|
|
322
|
+
await store.clear(conversationId);
|
|
323
|
+
await store.append(conversationId, {
|
|
324
|
+
role: "assistant",
|
|
325
|
+
content: `${SUMMARY_PREFIX}${trimmed}`
|
|
326
|
+
});
|
|
327
|
+
for (const turn of recent) {
|
|
328
|
+
await store.append(conversationId, turn);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
265
334
|
// src/channels/pipeline.ts
|
|
266
335
|
var DEFAULT_HISTORY_LIMIT = 20;
|
|
267
336
|
var DEFAULT_GROUP_RATE_LIMIT = { max: 30, windowMs: 60 * 60 * 1e3 };
|
|
@@ -292,6 +361,10 @@ function createInboundPipeline(deps, config) {
|
|
|
292
361
|
const underGroupRateLimit = createSlidingWindowRateLimiter(group.max, group.windowMs, now);
|
|
293
362
|
const underDmRateLimit = createSlidingWindowRateLimiter(dm.max, dm.windowMs, now);
|
|
294
363
|
const mode = "public";
|
|
364
|
+
const compactor = config.history?.compaction ? createHistoryCompactor(
|
|
365
|
+
{ client: deps.client },
|
|
366
|
+
{ model: config.model, ...config.history.compaction }
|
|
367
|
+
) : void 0;
|
|
295
368
|
return async function handleInboundMessage(msg, turn) {
|
|
296
369
|
const allowedChats = config.allowedChats ?? [];
|
|
297
370
|
const action = decideChannelAction(msg, {
|
|
@@ -367,6 +440,14 @@ function createInboundPipeline(deps, config) {
|
|
|
367
440
|
await config.history?.store.append(conversationId, { role: "assistant", content });
|
|
368
441
|
}
|
|
369
442
|
await turn.reply.sendAnswer(msg.chatId, content);
|
|
443
|
+
const history = config.history;
|
|
444
|
+
if (compactor && historyEnabled && history) {
|
|
445
|
+
try {
|
|
446
|
+
await compactor.maybeCompact(history.store, conversationId);
|
|
447
|
+
} catch (error) {
|
|
448
|
+
config.logger?.error(`history compaction failed for "${conversationId}"`, error);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
370
451
|
return { action: "reply", content };
|
|
371
452
|
};
|
|
372
453
|
}
|
package/dist/channels/index.mjs
CHANGED
|
@@ -229,6 +229,75 @@ ${ctx.join("\n\n")}`
|
|
|
229
229
|
return { system, messages, context: ctx };
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
+
// src/history/compaction.ts
|
|
233
|
+
var DEFAULT_TIMEOUT_MS = 8e3;
|
|
234
|
+
var LOAD_ALL = Number.MAX_SAFE_INTEGER;
|
|
235
|
+
var SUMMARY_PREFIX = "Summary of earlier conversation: ";
|
|
236
|
+
function defaultSummarize(client, model) {
|
|
237
|
+
return async ({ turns }) => {
|
|
238
|
+
const transcript = turns.map((turn) => `${turn.role}: ${turn.content}`).join("\n");
|
|
239
|
+
const { content } = await answerOnce({
|
|
240
|
+
client,
|
|
241
|
+
system: "Summarize the conversation turns below into a short paragraph a reader would need to continue the conversation. Preserve names, facts, and decisions; drop pleasantries. Reply with the summary only, no preamble.",
|
|
242
|
+
messages: [{ role: "user", content: transcript }],
|
|
243
|
+
// No `answerFn`: compaction is an internal chatter operation, not a
|
|
244
|
+
// chat surface, so it must not conscript a caller's brain hook, which
|
|
245
|
+
// is shaped to answer the user, not to summarize on the engine's behalf.
|
|
246
|
+
mode: "public",
|
|
247
|
+
model
|
|
248
|
+
});
|
|
249
|
+
return content;
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function createHistoryCompactor(deps, options) {
|
|
253
|
+
const { threshold, keep, logger } = options;
|
|
254
|
+
if (!Number.isInteger(threshold) || threshold < 1) {
|
|
255
|
+
throw new Error(`Invalid history compaction threshold: ${threshold}`);
|
|
256
|
+
}
|
|
257
|
+
if (!Number.isInteger(keep) || keep < 0 || keep >= threshold) {
|
|
258
|
+
throw new Error(`Invalid history compaction keep: ${keep}`);
|
|
259
|
+
}
|
|
260
|
+
const summarize = options.summarize ?? defaultSummarize(deps.client, options.model);
|
|
261
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
262
|
+
return {
|
|
263
|
+
async maybeCompact(store, conversationId) {
|
|
264
|
+
const turns = await store.load(conversationId, LOAD_ALL);
|
|
265
|
+
if (turns.length < threshold) return;
|
|
266
|
+
const older = turns.slice(0, turns.length - keep);
|
|
267
|
+
let summary;
|
|
268
|
+
let timer;
|
|
269
|
+
try {
|
|
270
|
+
summary = await Promise.race([
|
|
271
|
+
summarize({ conversationId, turns: older }),
|
|
272
|
+
new Promise((_, reject) => {
|
|
273
|
+
timer = setTimeout(() => reject(new Error("history compaction timed out")), timeoutMs);
|
|
274
|
+
})
|
|
275
|
+
]);
|
|
276
|
+
} catch (error) {
|
|
277
|
+
logger?.error(
|
|
278
|
+
`history compaction summarize failed for "${conversationId}"; history left untouched`,
|
|
279
|
+
error
|
|
280
|
+
);
|
|
281
|
+
return;
|
|
282
|
+
} finally {
|
|
283
|
+
clearTimeout(timer);
|
|
284
|
+
}
|
|
285
|
+
const trimmed = summary.trim();
|
|
286
|
+
if (!trimmed) return;
|
|
287
|
+
const fresh = await store.load(conversationId, LOAD_ALL);
|
|
288
|
+
const recent = fresh.slice(older.length);
|
|
289
|
+
await store.clear(conversationId);
|
|
290
|
+
await store.append(conversationId, {
|
|
291
|
+
role: "assistant",
|
|
292
|
+
content: `${SUMMARY_PREFIX}${trimmed}`
|
|
293
|
+
});
|
|
294
|
+
for (const turn of recent) {
|
|
295
|
+
await store.append(conversationId, turn);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
|
|
232
301
|
// src/channels/pipeline.ts
|
|
233
302
|
var DEFAULT_HISTORY_LIMIT = 20;
|
|
234
303
|
var DEFAULT_GROUP_RATE_LIMIT = { max: 30, windowMs: 60 * 60 * 1e3 };
|
|
@@ -259,6 +328,10 @@ function createInboundPipeline(deps, config) {
|
|
|
259
328
|
const underGroupRateLimit = createSlidingWindowRateLimiter(group.max, group.windowMs, now);
|
|
260
329
|
const underDmRateLimit = createSlidingWindowRateLimiter(dm.max, dm.windowMs, now);
|
|
261
330
|
const mode = "public";
|
|
331
|
+
const compactor = config.history?.compaction ? createHistoryCompactor(
|
|
332
|
+
{ client: deps.client },
|
|
333
|
+
{ model: config.model, ...config.history.compaction }
|
|
334
|
+
) : void 0;
|
|
262
335
|
return async function handleInboundMessage(msg, turn) {
|
|
263
336
|
const allowedChats = config.allowedChats ?? [];
|
|
264
337
|
const action = decideChannelAction(msg, {
|
|
@@ -334,6 +407,14 @@ function createInboundPipeline(deps, config) {
|
|
|
334
407
|
await config.history?.store.append(conversationId, { role: "assistant", content });
|
|
335
408
|
}
|
|
336
409
|
await turn.reply.sendAnswer(msg.chatId, content);
|
|
410
|
+
const history = config.history;
|
|
411
|
+
if (compactor && historyEnabled && history) {
|
|
412
|
+
try {
|
|
413
|
+
await compactor.maybeCompact(history.store, conversationId);
|
|
414
|
+
} catch (error) {
|
|
415
|
+
config.logger?.error(`history compaction failed for "${conversationId}"`, error);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
337
418
|
return { action: "reply", content };
|
|
338
419
|
};
|
|
339
420
|
}
|
|
@@ -20,6 +20,7 @@ import type { Logger } from "../core/logger";
|
|
|
20
20
|
import { type RerankContext, type RewriteQuery } from "../core/pipeline";
|
|
21
21
|
import type { PromptLoader } from "../core/prompts";
|
|
22
22
|
import type { VectorStore } from "../core/retrieval";
|
|
23
|
+
import type { HistoryCompactionOptions } from "../history/compaction";
|
|
23
24
|
import type { HistoryStore } from "../history/types";
|
|
24
25
|
import { type ChannelMessage } from "./gates";
|
|
25
26
|
/** Where a pipeline turn's output goes. Distinct from `ChannelSender` (`./senders`) — a transport implementing this may thread/quote the chat answer without doing the same for a plain gate acknowledgement. */
|
|
@@ -69,6 +70,13 @@ export interface InboundPipelineConfig {
|
|
|
69
70
|
* opted out. @default every sender is enabled
|
|
70
71
|
*/
|
|
71
72
|
historyEnabledFor?: (sender: string) => boolean | Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Summarize-then-truncate compaction, checked right after each reply is
|
|
75
|
+
* appended. Off by default — a conversation's window grows unbounded
|
|
76
|
+
* (aside from the store's own `maxPerConversation`) until this is set.
|
|
77
|
+
* See `../history/compaction`.
|
|
78
|
+
*/
|
|
79
|
+
compaction?: HistoryCompactionOptions;
|
|
72
80
|
};
|
|
73
81
|
/** Group chats eligible for a reply. Empty (default) = every group. Has no effect on DMs, which always reply. */
|
|
74
82
|
allowedChats?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/channels/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,SAAS,CAAC;AAEjB,iNAAiN;AACjN,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,kFAAkF;IAClF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,0GAA0G;IAC1G,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iHAAiH;IACjH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kGAAkG;IAClG,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oGAAoG;IACpG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sGAAsG;IACtG,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvD,gFAAgF;IAChF,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,YAAY,CAAC;QACpB,uDAAuD;QACvD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf;;;;;;WAMG;QACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/channels/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,6 +117,23 @@ export interface TelegramApi {
|
|
|
117
117
|
}): Promise<void>;
|
|
118
118
|
sendMedia(chatId: string, payload: unknown): Promise<void>;
|
|
119
119
|
setMessageReaction(chatId: string, messageId: number, emoji: string): Promise<void>;
|
|
120
|
+
/**
|
|
121
|
+
* Registers `url` as this bot's webhook, switching Telegram from queuing
|
|
122
|
+
* updates for `getUpdates` to POSTing them there instead. `secretToken`,
|
|
123
|
+
* when given, is echoed back on every webhook POST as
|
|
124
|
+
* `X-Telegram-Bot-Api-Secret-Token` — see `./webhook`'s fail-closed check.
|
|
125
|
+
*/
|
|
126
|
+
setWebhook(url: string, options?: {
|
|
127
|
+
secretToken?: string;
|
|
128
|
+
}): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Clears the registered webhook so `getUpdates` starts working again: a
|
|
131
|
+
* registered webhook suppresses long-polling entirely, so switching a bot
|
|
132
|
+
* from webhook mode back to `createTelegramChannel` needs this called
|
|
133
|
+
* first — the channel itself never calls it, since it has no way to know
|
|
134
|
+
* a webhook was ever registered.
|
|
135
|
+
*/
|
|
136
|
+
deleteWebhook(): Promise<void>;
|
|
120
137
|
}
|
|
121
138
|
export declare function createTelegramApi(config: TelegramApiConfig): TelegramApi;
|
|
122
139
|
//# sourceMappingURL=api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAE5D,uGAAuG;AACvG,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;CACtD;AAED,yIAAyI;AACzI,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC3C,gBAAgB,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAUD,wJAAwJ;AACxJ,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,EAKnF;CACF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAA4B,GAAG,MAAM,EAAE,CAqB7F;AAED,2GAA2G;AAC3G,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IAChD,2GAA2G;IAC3G,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAwBnD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,yHAAyH;IACzH,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1F,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,UAAU,CAAC,OAAO,EAAE;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9B,mGAAmG;IACnG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E;;;;;;OAMG;IACH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CA4GxE"}
|
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
* per bot token. It is deliberately self-contained — `start(deps)` has
|
|
11
11
|
* everything it needs, so there is no `customRoutes` wiring step (contrast
|
|
12
12
|
* `./channels/whatsapp/inbound.ts`, whose transport and interpretation are
|
|
13
|
-
* separate modules).
|
|
13
|
+
* separate modules). `./webhook` is the alternative transport for hosts that
|
|
14
|
+
* would rather receive updates over HTTPS than long-poll; the two share
|
|
15
|
+
* their update-handling logic via `./handler` so gate behaviour never
|
|
16
|
+
* diverges between them — see docs/telegram.md on choosing a mode.
|
|
14
17
|
*
|
|
15
18
|
* One caveat worth knowing before choosing this over a user-mode client: a bot
|
|
16
19
|
* cannot start a conversation (the user must message it first), and in groups
|
|
@@ -21,6 +24,7 @@ import type { AnswerFn, TransformReply } from "../../core/answer";
|
|
|
21
24
|
import type { BucketsFor } from "../../core/buckets";
|
|
22
25
|
import { type Logger } from "../../core/logger";
|
|
23
26
|
import type { RerankContext, RewriteQuery } from "../../core/pipeline";
|
|
27
|
+
import type { HistoryCompactionOptions } from "../../history/compaction";
|
|
24
28
|
import type { HistoryStore } from "../../history/types";
|
|
25
29
|
import type { Channel } from "../index";
|
|
26
30
|
import { type TelegramApi } from "./api";
|
|
@@ -58,6 +62,12 @@ export interface TelegramChannelConfig {
|
|
|
58
62
|
* @default every sender is enabled
|
|
59
63
|
*/
|
|
60
64
|
historyEnabledFor?: (sender: string) => boolean | Promise<boolean>;
|
|
65
|
+
/**
|
|
66
|
+
* Summarize-then-truncate compaction — see
|
|
67
|
+
* `InboundPipelineConfig.history.compaction` in `./channels`.
|
|
68
|
+
* @default off
|
|
69
|
+
*/
|
|
70
|
+
compaction?: HistoryCompactionOptions;
|
|
61
71
|
};
|
|
62
72
|
muteRegex?: RegExp;
|
|
63
73
|
unmuteRegex?: RegExp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/channel.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The per-update handling logic shared by both Telegram transports: the
|
|
3
|
+
* long-poll loop (`./channel`, via `./poll`) and the webhook route
|
|
4
|
+
* (`./webhook`). Kept in one place so addressing, allowlist logging and
|
|
5
|
+
* pipeline dispatch are defined exactly once — a second copy would drift the
|
|
6
|
+
* moment one transport's gate behaviour changed and the other didn't.
|
|
7
|
+
*/
|
|
8
|
+
import type { Logger } from "../../core/logger";
|
|
9
|
+
import type { InboundPipeline } from "../pipeline";
|
|
10
|
+
import type { ChannelSender } from "../senders";
|
|
11
|
+
import type { TelegramApi, TelegramUpdate } from "./api";
|
|
12
|
+
import { type TelegramBotIdentity } from "./updates";
|
|
13
|
+
export interface TelegramUpdateHandlerDeps {
|
|
14
|
+
api: TelegramApi;
|
|
15
|
+
me: TelegramBotIdentity;
|
|
16
|
+
pipeline: InboundPipeline;
|
|
17
|
+
/** Group chats eligible for a reply. Empty = every group. */
|
|
18
|
+
allowedChats: string[];
|
|
19
|
+
logger: Logger;
|
|
20
|
+
/** Log-line prefix, e.g. `Telegram[mybot]`. */
|
|
21
|
+
label: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* One update -> one pipeline turn. Builds its own allowlist-log dedup set, so
|
|
25
|
+
* each transport instance gets its own "skipped chat" throttling rather than
|
|
26
|
+
* sharing (or fighting over) state with another.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createTelegramUpdateHandler(deps: TelegramUpdateHandlerDeps): (update: TelegramUpdate) => Promise<void>;
|
|
29
|
+
/** The `ChannelSender` every Telegram transport registers — text, media and reactions over the same `TelegramApi`, regardless of how updates arrive. */
|
|
30
|
+
export declare function createTelegramSender(api: TelegramApi): ChannelSender;
|
|
31
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,KAAK,mBAAmB,EAAuC,MAAM,WAAW,CAAC;AAE1F,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,WAAW,CAAC;IACjB,EAAE,EAAE,mBAAmB,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,6DAA6D;IAC7D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,yBAAyB,GAC9B,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CA8B3C;AAED,wJAAwJ;AACxJ,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,aAAa,CAOpE"}
|
|
@@ -17,10 +17,17 @@
|
|
|
17
17
|
* docs/telegram.md for configuration and docs/build-a-channel.md for the SPI
|
|
18
18
|
* this implements.
|
|
19
19
|
*
|
|
20
|
+
* `createTelegramWebhookRoute` is the alternative to `createTelegramChannel`:
|
|
21
|
+
* updates over an HTTPS webhook instead of long-polling, mounted via
|
|
22
|
+
* `ChatterConfig.customRoutes` — see docs/telegram.md for choosing between
|
|
23
|
+
* the two.
|
|
24
|
+
*
|
|
20
25
|
* @packageDocumentation
|
|
21
26
|
*/
|
|
22
27
|
export { createTelegramApi, redactToken, splitTelegramText, TELEGRAM_API_BASE, TELEGRAM_TEXT_LIMIT, type TelegramApi, type TelegramApiConfig, TelegramApiError, type TelegramChat, type TelegramMediaPayload, type TelegramMessage, type TelegramMessageEntity, type TelegramUpdate, type TelegramUser, toTelegramMediaRequest, } from "./api";
|
|
23
28
|
export { createTelegramChannel, type TelegramChannelConfig } from "./channel";
|
|
29
|
+
export { createTelegramSender, createTelegramUpdateHandler, type TelegramUpdateHandlerDeps, } from "./handler";
|
|
24
30
|
export { type LongPollDeps, pollBackoffMs, retryDelayMs, runLongPoll } from "./poll";
|
|
25
31
|
export { mentionsBot, messageEntities, messageText, nextOffset, type TelegramBotIdentity, telegramSenderKey, toChannelMessage, } from "./updates";
|
|
32
|
+
export { createTelegramWebhookRoute, type TelegramWebhookConfig } from "./webhook";
|
|
26
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,sBAAsB,GACvB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,KAAK,yBAAyB,GAC/B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrF,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,EACX,UAAU,EACV,KAAK,mBAAmB,EACxB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,0BAA0B,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC"}
|