fix(telegram): address PR review comments

- Export pickFirstExistingAgentId and use it to validate topic agentId
- Properly update mainSessionKey when overriding route agent
- Fix docs example showing incorrect session key for topic 3

Fixes issue where non-existent agentId would create orphaned sessions.
Fixes issue where DM topic replies would route to wrong agent.
This commit is contained in:
Evgeny Zislis
2026-03-04 02:21:37 +02:00
committed by Ayaan Zaidi
parent 58bc9a241b
commit 8eeb049683
3 changed files with 16 additions and 5 deletions

View File

@@ -466,7 +466,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Each topic then has its own session key: `agent:main:telegram:group:-1001234567890:topic:3`
Each topic then has its own session key: `agent:zu:telegram:group:-1001234567890:topic:3`
Template context includes:

View File

@@ -143,7 +143,7 @@ function resolveAgentLookupCache(cfg: OpenClawConfig): AgentLookupCache {
return next;
}
function pickFirstExistingAgentId(cfg: OpenClawConfig, agentId: string): string {
export function pickFirstExistingAgentId(cfg: OpenClawConfig, agentId: string): string {
const lookup = resolveAgentLookupCache(cfg);
const trimmed = (agentId ?? "").trim();
if (!trimmed) {

View File

@@ -40,10 +40,15 @@ import { logVerbose, shouldLogVerbose } from "../globals.js";
import { recordChannelActivity } from "../infra/channel-activity.js";
import {
buildAgentSessionKey,
pickFirstExistingAgentId,
resolveAgentRoute,
type ResolvedAgentRoute,
} from "../routing/resolve-route.js";
import { DEFAULT_ACCOUNT_ID, resolveThreadSessionKeys } from "../routing/session-key.js";
import {
DEFAULT_ACCOUNT_ID,
buildAgentMainSessionKey,
resolveThreadSessionKeys,
} from "../routing/session-key.js";
import { resolvePinnedMainDmOwnerFromAllowlist } from "../security/dm-policy-shared.js";
import { withTelegramApiErrorLogging } from "./api-logging.js";
import {
@@ -215,8 +220,10 @@ export const buildTelegramMessageContext = async ({
parentPeer,
});
// Per-topic agentId override: re-derive session key under the topic's agent.
const topicAgentId = topicConfig?.agentId?.trim();
if (topicAgentId) {
const rawTopicAgentId = topicConfig?.agentId?.trim();
if (rawTopicAgentId) {
// Validate agentId against configured agents; falls back to default if not found.
const topicAgentId = pickFirstExistingAgentId(freshCfg, rawTopicAgentId);
const overrideSessionKey = buildAgentSessionKey({
agentId: topicAgentId,
channel: "telegram",
@@ -225,10 +232,14 @@ export const buildTelegramMessageContext = async ({
dmScope: freshCfg.session?.dmScope,
identityLinks: freshCfg.session?.identityLinks,
}).toLowerCase();
const overrideMainSessionKey = buildAgentMainSessionKey({
agentId: topicAgentId,
}).toLowerCase();
route = {
...route,
agentId: topicAgentId,
sessionKey: overrideSessionKey,
mainSessionKey: overrideMainSessionKey,
};
logVerbose(
`telegram: per-topic agent override: topic=${resolvedThreadId ?? dmThreadId} agent=${topicAgentId} sessionKey=${overrideSessionKey}`,