























@@ -179,6 +179,7 @@ export const registerTelegramHandlers = ({
179179key: string;
180180threadId?: number;
181181messages: Array<{ msg: Message; ctx: TelegramContext; receivedAtMs: number }>;
182+promptContextMinTimestampMs?: number;
182183timer: ReturnType<typeof setTimeout>;
183184};
184185const textFragmentBuffer = new Map<string, TextFragmentEntry>();
@@ -197,6 +198,22 @@ export const registerTelegramHandlers = ({
197198debounceLane: TelegramDebounceLane;
198199botUsername?: string;
199200threadId?: number;
201+promptContextMinTimestampMs?: number;
202+};
203+const normalizePromptContextMinTimestampMs = (timestampMs?: number) =>
204+typeof timestampMs === "number" && Number.isFinite(timestampMs) ? timestampMs : undefined;
205+const latestPromptContextMinTimestampMs = (
206+ ...timestamps: Array<number | undefined>
207+): number | undefined => {
208+let latest: number | undefined;
209+for (const timestampMs of timestamps) {
210+const normalized = normalizePromptContextMinTimestampMs(timestampMs);
211+if (normalized === undefined) {
212+continue;
213+}
214+latest = latest === undefined ? normalized : Math.max(latest, normalized);
215+}
216+return latest;
200217};
201218const resolveTelegramDebounceLane = (msg: Message): TelegramDebounceLane => {
202219const forwardMeta = msg as {
@@ -394,9 +411,13 @@ export const registerTelegramHandlers = ({
394411return;
395412}
396413if (entries.length === 1) {
414+const promptContextMinTimestampMs = normalizePromptContextMinTimestampMs(
415+last.promptContextMinTimestampMs,
416+);
397417await processMessageWithReplyChain(last.ctx, last.msg, last.allMedia, last.storeAllowFrom, {
398418receivedAtMs: last.receivedAtMs,
399419ingressBuffer: "inbound-debounce",
420+ ...(promptContextMinTimestampMs !== undefined ? { promptContextMinTimestampMs } : {}),
400421});
401422return;
402423}
@@ -409,6 +430,9 @@ export const registerTelegramHandlers = ({
409430return;
410431}
411432const first = entries[0];
433+const promptContextMinTimestampMs = latestPromptContextMinTimestampMs(
434+ ...entries.map((entry) => entry.promptContextMinTimestampMs),
435+);
412436const baseCtx = first.ctx;
413437const syntheticMessage = buildSyntheticTextMessage({
414438base: first.msg,
@@ -426,6 +450,7 @@ export const registerTelegramHandlers = ({
426450 ...(messageIdOverride ? { messageIdOverride } : {}),
427451receivedAtMs: first.receivedAtMs,
428452ingressBuffer: "inbound-debounce",
453+ ...(promptContextMinTimestampMs !== undefined ? { promptContextMinTimestampMs } : {}),
429454},
430455);
431456},
@@ -454,13 +479,14 @@ export const registerTelegramHandlers = ({
454479messageThreadId?: number;
455480resolvedThreadId?: number;
456481senderId?: string | number;
482+runtimeCfg?: OpenClawConfig;
457483}): {
458484agentId: string;
459485sessionEntry: ReturnType<typeof resolveSessionStoreEntry>["existing"];
460486sessionKey: string;
461487model?: string;
462488} => {
463-const runtimeCfg = telegramDeps.getRuntimeConfig();
489+const runtimeCfg = params.runtimeCfg ?? telegramDeps.getRuntimeConfig();
464490const resolvedThreadId =
465491params.resolvedThreadId ??
466492resolveTelegramForumThreadId({
@@ -505,7 +531,7 @@ export const registerTelegramHandlers = ({
505531const storePath = telegramDeps.resolveStorePath(runtimeCfg.session?.store, {
506532agentId: route.agentId,
507533});
508-const store = loadSessionStore(storePath);
534+const store = (telegramDeps.loadSessionStore ?? loadSessionStore)(storePath);
509535const entry = resolveSessionStoreEntry({ store, sessionKey }).existing;
510536const storedOverride = resolveStoredModelOverride({
511537sessionEntry: entry,
@@ -585,6 +611,9 @@ export const registerTelegramHandlers = ({
585611primaryEntry.msg,
586612allMedia,
587613storeAllowFrom,
614+entry.promptContextMinTimestampMs !== undefined
615+ ? { promptContextMinTimestampMs: entry.promptContextMinTimestampMs }
616+ : undefined,
588617);
589618} catch (err) {
590619runtime.error?.(danger(`media group handler failed: ${String(err)}`));
@@ -620,6 +649,9 @@ export const registerTelegramHandlers = ({
620649messageIdOverride: String(last.msg.message_id),
621650receivedAtMs: first.receivedAtMs,
622651ingressBuffer: "text-fragment",
652+ ...(entry.promptContextMinTimestampMs !== undefined
653+ ? { promptContextMinTimestampMs: entry.promptContextMinTimestampMs }
654+ : {}),
623655});
624656} catch (err) {
625657runtime.error?.(danger(`text fragment handler failed: ${String(err)}`));
@@ -698,6 +730,7 @@ export const registerTelegramHandlers = ({
698730const buildPromptContextForMessage = (
699731msg: Message,
700732replyChainNodes: TelegramCachedMessageNode[],
733+options?: TelegramMessageContextOptions,
701734): TelegramPromptContextEntry[] => {
702735const messageId = typeof msg.message_id === "number" ? String(msg.message_id) : undefined;
703736const currentNode = messageCache.get({
@@ -715,6 +748,9 @@ export const registerTelegramHandlers = ({
715748 replyChainNodes,
716749recentLimit: 10,
717750replyTargetWindowSize: 2,
751+ ...(options?.promptContextMinTimestampMs !== undefined
752+ ? { minTimestampMs: options.promptContextMinTimestampMs }
753+ : {}),
718754});
719755return conversationContext.length > 0
720756 ? [
@@ -785,7 +821,7 @@ export const registerTelegramHandlers = ({
785821) => {
786822const replyChainNodes = buildReplyChainForMessage(msg);
787823const { replyMedia, replyChain } = await resolveReplyMediaForChain(ctx, replyChainNodes);
788-const promptContext = buildPromptContextForMessage(msg, replyChainNodes);
824+const promptContext = buildPromptContextForMessage(msg, replyChainNodes, options);
789825await processMessage(
790826ctx,
791827allMedia,
@@ -1267,6 +1303,7 @@ export const registerTelegramHandlers = ({
12671303storeAllowFrom: string[];
12681304sendOversizeWarning: boolean;
12691305oversizeLogMessage: string;
1306+promptContextMinTimestampMs?: number;
12701307}) => {
12711308const {
12721309 ctx,
@@ -1277,6 +1314,7 @@ export const registerTelegramHandlers = ({
12771314 storeAllowFrom,
12781315 sendOversizeWarning,
12791316 oversizeLogMessage,
1317+ promptContextMinTimestampMs,
12801318} = params;
1281131912821320// Text fragment handling - Telegram splits long pastes into multiple inbound messages (~4096 chars).
@@ -1314,6 +1352,10 @@ export const registerTelegramHandlers = ({
13141352nextTotalChars <= TELEGRAM_TEXT_FRAGMENT_MAX_TOTAL_CHARS
13151353) {
13161354existing.messages.push({ msg, ctx, receivedAtMs: nowMs });
1355+existing.promptContextMinTimestampMs = latestPromptContextMinTimestampMs(
1356+existing.promptContextMinTimestampMs,
1357+promptContextMinTimestampMs,
1358+);
13171359scheduleTextFragmentFlush(existing);
13181360return;
13191361}
@@ -1335,6 +1377,7 @@ export const registerTelegramHandlers = ({
13351377const entry: TextFragmentEntry = {
13361378 key,
13371379messages: [{ msg, ctx, receivedAtMs: nowMs }],
1380+ ...(promptContextMinTimestampMs !== undefined ? { promptContextMinTimestampMs } : {}),
13381381timer: setTimeout(() => {}, TELEGRAM_TEXT_FRAGMENT_MAX_GAP_MS),
13391382};
13401383textFragmentBuffer.set(key, entry);
@@ -1350,6 +1393,10 @@ export const registerTelegramHandlers = ({
13501393if (existing) {
13511394clearTimeout(existing.timer);
13521395existing.messages.push({ msg, ctx });
1396+existing.promptContextMinTimestampMs = latestPromptContextMinTimestampMs(
1397+existing.promptContextMinTimestampMs,
1398+promptContextMinTimestampMs,
1399+);
13531400existing.timer = setTimeout(async () => {
13541401mediaGroupBuffer.delete(mediaGroupId);
13551402mediaGroupProcessing = mediaGroupProcessing
@@ -1362,6 +1409,7 @@ export const registerTelegramHandlers = ({
13621409} else {
13631410const entry: MediaGroupEntry = {
13641411messages: [{ msg, ctx }],
1412+ ...(promptContextMinTimestampMs !== undefined ? { promptContextMinTimestampMs } : {}),
13651413timer: setTimeout(async () => {
13661414mediaGroupBuffer.delete(mediaGroupId);
13671415mediaGroupProcessing = mediaGroupProcessing
@@ -1458,6 +1506,7 @@ export const registerTelegramHandlers = ({
14581506 debounceKey,
14591507 debounceLane,
14601508botUsername: ctx.me?.username,
1509+ ...(promptContextMinTimestampMs !== undefined ? { promptContextMinTimestampMs } : {}),
14611510});
14621511};
14631512bot.on("callback_query", async (ctx) => {
@@ -2326,6 +2375,18 @@ export const registerTelegramHandlers = ({
23262375}
23272376}
232823772378+const promptContextMinTimestampMs = normalizePromptContextMinTimestampMs(
2379+resolveTelegramSessionState({
2380+chatId: event.chatId,
2381+isGroup: event.isGroup,
2382+isForum: event.isForum,
2383+messageThreadId: event.messageThreadId,
2384+ resolvedThreadId,
2385+senderId: event.senderId,
2386+runtimeCfg: cfg,
2387+}).sessionEntry?.sessionStartedAt,
2388+);
2389+23292390recordMessageForReplyChain(event.msg, resolvedThreadId ?? dmThreadId);
23302391await processInboundMessage({
23312392ctx: event.ctx,
@@ -2336,6 +2397,7 @@ export const registerTelegramHandlers = ({
23362397 storeAllowFrom,
23372398sendOversizeWarning: event.sendOversizeWarning,
23382399oversizeLogMessage: event.oversizeLogMessage,
2400+ ...(promptContextMinTimestampMs !== undefined ? { promptContextMinTimestampMs } : {}),
23392401});
23402402} catch (err) {
23412403runtime.error?.(danger(`${event.errorMessage}: ${String(err)}`));
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。