






















@@ -14,6 +14,7 @@ import {
1414} from "openclaw/plugin-sdk/channel-inbound-debounce";
1515import { resolveStoredModelOverride } from "openclaw/plugin-sdk/command-auth-native";
1616import { hasControlCommand } from "openclaw/plugin-sdk/command-detection";
17+import { isAbortRequestText } from "openclaw/plugin-sdk/command-primitives-runtime";
1718import { buildCommandsMessagePaginated } from "openclaw/plugin-sdk/command-status";
1819import type { DmPolicy, OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
1920import type {
@@ -1506,6 +1507,7 @@ export const registerTelegramHandlers = ({
15061507isForum: boolean;
15071508resolvedThreadId?: number;
15081509dmThreadId?: number;
1510+dmPolicy: DmPolicy;
15091511storeAllowFrom: string[];
15101512senderId: string;
15111513effectiveGroupAllow: NormalizedAllowFrom;
@@ -1524,6 +1526,7 @@ export const registerTelegramHandlers = ({
15241526 isForum,
15251527 resolvedThreadId,
15261528 dmThreadId,
1529+ dmPolicy,
15271530 storeAllowFrom,
15281531 senderId,
15291532 effectiveGroupAllow,
@@ -1535,11 +1538,39 @@ export const registerTelegramHandlers = ({
15351538 promptContextMinTimestampMs,
15361539} = params;
153715401541+const messageText = getTelegramTextParts(msg).text;
1542+const botUsername = ctx.me?.username;
1543+const isAbortControlMessage = isAbortRequestText(messageText, { botUsername });
1544+let abortControlAuthorized: Promise<boolean> | undefined;
1545+const isAuthorizedAbortControlMessage = () => {
1546+if (!isAbortControlMessage || !senderId) {
1547+return Promise.resolve(false);
1548+}
1549+abortControlAuthorized ??= resolveTelegramCommandIngressAuthorization({
1550+ accountId,
1551+ cfg,
1552+ dmPolicy,
1553+ isGroup,
1554+ chatId,
1555+ resolvedThreadId,
1556+ senderId,
1557+ effectiveDmAllow,
1558+ effectiveGroupAllow,
1559+ownerAccess: { ownerList: [], senderIsOwner: false },
1560+eventKind: "message",
1561+allowTextCommands: true,
1562+hasControlCommand: true,
1563+modeWhenAccessGroupsOff: "allow",
1564+includeDmAllowForGroupCommands: false,
1565+}).then((gate) => gate.authorized);
1566+return abortControlAuthorized;
1567+};
1568+15381569// Text fragment handling - Telegram splits long pastes into multiple inbound messages (~4096 chars).
15391570// We buffer “near-limit” messages and append immediately-following parts.
15401571const text = typeof msg.text === "string" ? msg.text : undefined;
15411572const isCommandLike = (text ?? "").trim().startsWith("/");
1542-if (text && !isCommandLike) {
1573+if (text && !isCommandLike && !isAbortControlMessage) {
15431574const nowMs = Date.now();
15441575const senderId = msg.from?.id != null ? String(msg.from.id) : "unknown";
15451576// Use resolvedThreadId for forum groups, dmThreadId for DM topics
@@ -1602,6 +1633,15 @@ export const registerTelegramHandlers = ({
16021633scheduleTextFragmentFlush(entry);
16031634return;
16041635}
1636+} else if (text && isAbortControlMessage && (await isAuthorizedAbortControlMessage())) {
1637+const senderId = msg.from?.id != null ? String(msg.from.id) : "unknown";
1638+const threadId = resolvedThreadId ?? dmThreadId;
1639+const key = `text:${chatId}:${threadId ?? "main"}:${senderId}`;
1640+const existing = textFragmentBuffer.get(key);
1641+if (existing) {
1642+clearTimeout(existing.timer);
1643+textFragmentBuffer.delete(key);
1644+}
16051645}
1606164616071647// Media group handling - buffer multi-image messages
@@ -1743,15 +1783,27 @@ export const registerTelegramHandlers = ({
17431783 debounceLane,
17441784})
17451785 : null;
1786+if (senderId && (await isAuthorizedAbortControlMessage())) {
1787+for (const lane of ["default", "forward"] as const) {
1788+inboundDebouncer.cancelKey(
1789+buildTelegramInboundDebounceKey({
1790+ accountId,
1791+ conversationKey,
1792+ senderId,
1793+debounceLane: lane,
1794+}),
1795+);
1796+}
1797+}
17461798await inboundDebouncer.enqueue({
17471799 ctx,
17481800 msg,
17491801 allMedia,
17501802 storeAllowFrom,
17511803receivedAtMs: Date.now(),
1752- debounceKey,
1804+debounceKey: isAbortControlMessage ? null : debounceKey,
17531805 debounceLane,
1754-botUsername: ctx.me?.username,
1806+ botUsername,
17551807 ...promptContextBoundaryOptions(promptContextMinTimestampMs),
17561808});
17571809};
@@ -2656,6 +2708,7 @@ export const registerTelegramHandlers = ({
26562708isForum: event.isForum,
26572709 resolvedThreadId,
26582710 dmThreadId,
2711+ dmPolicy,
26592712 storeAllowFrom,
26602713senderId: event.senderId,
26612714 effectiveGroupAllow,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。