fix(telegram): make /activation command work by checking session state
The /activation command now properly controls group activation mode: - Loads session state before filtering messages - Checks groupActivation field (from /activation command) - Falls back to config telegram.groups requireMention setting Previously, the bot only checked config and ignored session state, making the /activation command appear to work but have no effect. Changes: - Add resolveGroupActivation() to check session before config - Import loadSessionStore to read session state early - Pass messageThreadId to support forum topics correctly
This commit is contained in:
committed by
Peter Steinberger
parent
1601be5480
commit
45dc4ef3cf
@@ -30,7 +30,11 @@ import {
|
|||||||
resolveProviderGroupPolicy,
|
resolveProviderGroupPolicy,
|
||||||
resolveProviderGroupRequireMention,
|
resolveProviderGroupRequireMention,
|
||||||
} from "../config/group-policy.js";
|
} from "../config/group-policy.js";
|
||||||
import { resolveStorePath, updateLastRoute } from "../config/sessions.js";
|
import {
|
||||||
|
loadSessionStore,
|
||||||
|
resolveStorePath,
|
||||||
|
updateLastRoute,
|
||||||
|
} from "../config/sessions.js";
|
||||||
import { danger, logVerbose, shouldLogVerbose } from "../globals.js";
|
import { danger, logVerbose, shouldLogVerbose } from "../globals.js";
|
||||||
import { formatErrorMessage } from "../infra/errors.js";
|
import { formatErrorMessage } from "../infra/errors.js";
|
||||||
import { getChildLogger } from "../logging.js";
|
import { getChildLogger } from "../logging.js";
|
||||||
@@ -208,6 +212,29 @@ export function createTelegramBot(opts: TelegramBotOptions) {
|
|||||||
provider: "telegram",
|
provider: "telegram",
|
||||||
groupId: String(chatId),
|
groupId: String(chatId),
|
||||||
});
|
});
|
||||||
|
const resolveGroupActivation = (params: {
|
||||||
|
chatId: string | number;
|
||||||
|
agentId?: string;
|
||||||
|
messageThreadId?: number;
|
||||||
|
sessionKey?: string;
|
||||||
|
}) => {
|
||||||
|
const agentId = params.agentId ?? cfg.agent?.id ?? "main";
|
||||||
|
const sessionKey =
|
||||||
|
params.sessionKey ??
|
||||||
|
`agent:${agentId}:telegram:group:${buildTelegramGroupPeerId(params.chatId, params.messageThreadId)}`;
|
||||||
|
const storePath = resolveStorePath(cfg.session?.store, { agentId });
|
||||||
|
try {
|
||||||
|
const store = loadSessionStore(storePath);
|
||||||
|
const entry = store[sessionKey];
|
||||||
|
if (entry?.groupActivation === "always") return false;
|
||||||
|
if (entry?.groupActivation === "mention") return true;
|
||||||
|
} catch (err) {
|
||||||
|
logVerbose(
|
||||||
|
`Failed to load session for activation check: ${String(err)}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
const resolveGroupRequireMention = (chatId: string | number) =>
|
const resolveGroupRequireMention = (chatId: string | number) =>
|
||||||
resolveProviderGroupRequireMention({
|
resolveProviderGroupRequireMention({
|
||||||
cfg,
|
cfg,
|
||||||
@@ -246,6 +273,17 @@ export function createTelegramBot(opts: TelegramBotOptions) {
|
|||||||
chatId,
|
chatId,
|
||||||
messageThreadId,
|
messageThreadId,
|
||||||
);
|
);
|
||||||
|
const peerId = isGroup
|
||||||
|
? buildTelegramGroupPeerId(chatId, messageThreadId)
|
||||||
|
: String(chatId);
|
||||||
|
const route = resolveAgentRoute({
|
||||||
|
cfg,
|
||||||
|
provider: "telegram",
|
||||||
|
peer: {
|
||||||
|
kind: isGroup ? "group" : "dm",
|
||||||
|
id: peerId,
|
||||||
|
},
|
||||||
|
});
|
||||||
const effectiveDmAllow = normalizeAllowFrom([
|
const effectiveDmAllow = normalizeAllowFrom([
|
||||||
...(allowFrom ?? []),
|
...(allowFrom ?? []),
|
||||||
...storeAllowFrom,
|
...storeAllowFrom,
|
||||||
@@ -380,8 +418,15 @@ export function createTelegramBot(opts: TelegramBotOptions) {
|
|||||||
const hasAnyMention = (msg.entities ?? msg.caption_entities ?? []).some(
|
const hasAnyMention = (msg.entities ?? msg.caption_entities ?? []).some(
|
||||||
(ent) => ent.type === "mention",
|
(ent) => ent.type === "mention",
|
||||||
);
|
);
|
||||||
|
const activationOverride = resolveGroupActivation({
|
||||||
|
chatId,
|
||||||
|
messageThreadId,
|
||||||
|
sessionKey: route.sessionKey,
|
||||||
|
agentId: route.agentId,
|
||||||
|
});
|
||||||
const baseRequireMention = resolveGroupRequireMention(chatId);
|
const baseRequireMention = resolveGroupRequireMention(chatId);
|
||||||
const requireMention = firstDefined(
|
const requireMention = firstDefined(
|
||||||
|
activationOverride,
|
||||||
topicConfig?.requireMention,
|
topicConfig?.requireMention,
|
||||||
groupConfig?.requireMention,
|
groupConfig?.requireMention,
|
||||||
baseRequireMention,
|
baseRequireMention,
|
||||||
@@ -471,16 +516,6 @@ export function createTelegramBot(opts: TelegramBotOptions) {
|
|||||||
body: `${bodyText}${replySuffix}`,
|
body: `${bodyText}${replySuffix}`,
|
||||||
});
|
});
|
||||||
|
|
||||||
const route = resolveAgentRoute({
|
|
||||||
cfg,
|
|
||||||
provider: "telegram",
|
|
||||||
peer: {
|
|
||||||
kind: isGroup ? "group" : "dm",
|
|
||||||
id: isGroup
|
|
||||||
? buildTelegramGroupPeerId(chatId, messageThreadId)
|
|
||||||
: buildTelegramDmPeerId(chatId, messageThreadId),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const skillFilter = firstDefined(topicConfig?.skills, groupConfig?.skills);
|
const skillFilter = firstDefined(topicConfig?.skills, groupConfig?.skills);
|
||||||
const systemPromptParts = [
|
const systemPromptParts = [
|
||||||
groupConfig?.systemPrompt?.trim() || null,
|
groupConfig?.systemPrompt?.trim() || null,
|
||||||
|
|||||||
Reference in New Issue
Block a user