mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-30 02:22:25 +00:00
* refactor: move Telegram channel implementation to extensions/telegram/src/ Move all Telegram channel code (123 files + 10 bot/ files + 8 channel plugin files) from src/telegram/ and src/channels/plugins/*/telegram.ts to extensions/telegram/src/. Leave thin re-export shims at original locations so cross-cutting src/ imports continue to resolve. - Fix all relative import paths in moved files (../X/ -> ../../../src/X/) - Fix vi.mock paths in 60 test files - Fix inline typeof import() expressions - Update tsconfig.plugin-sdk.dts.json rootDir to "." for cross-directory DTS - Update write-plugin-sdk-entry-dts.ts for new rootDir structure - Move channel plugin files with correct path remapping * fix: support keyed telegram send deps * fix: sync telegram extension copies with latest main * fix: correct import paths and remove misplaced files in telegram extension * fix: sync outbound-adapter with main (add sendTelegramPayloadMessages) and fix delivery.test import path
144 lines
4.7 KiB
TypeScript
144 lines
4.7 KiB
TypeScript
import { resolveConfiguredAcpRoute } from "../../../src/acp/persistent-bindings.route.js";
|
|
import type { OpenClawConfig } from "../../../src/config/config.js";
|
|
import { logVerbose } from "../../../src/globals.js";
|
|
import { getSessionBindingService } from "../../../src/infra/outbound/session-binding-service.js";
|
|
import {
|
|
buildAgentSessionKey,
|
|
deriveLastRoutePolicy,
|
|
pickFirstExistingAgentId,
|
|
resolveAgentRoute,
|
|
} from "../../../src/routing/resolve-route.js";
|
|
import {
|
|
buildAgentMainSessionKey,
|
|
resolveAgentIdFromSessionKey,
|
|
} from "../../../src/routing/session-key.js";
|
|
import {
|
|
buildTelegramGroupPeerId,
|
|
buildTelegramParentPeer,
|
|
resolveTelegramDirectPeerId,
|
|
} from "./bot/helpers.js";
|
|
|
|
export function resolveTelegramConversationRoute(params: {
|
|
cfg: OpenClawConfig;
|
|
accountId: string;
|
|
chatId: number | string;
|
|
isGroup: boolean;
|
|
resolvedThreadId?: number;
|
|
replyThreadId?: number;
|
|
senderId?: string | number | null;
|
|
topicAgentId?: string | null;
|
|
}): {
|
|
route: ReturnType<typeof resolveAgentRoute>;
|
|
configuredBinding: ReturnType<typeof resolveConfiguredAcpRoute>["configuredBinding"];
|
|
configuredBindingSessionKey: string;
|
|
} {
|
|
const peerId = params.isGroup
|
|
? buildTelegramGroupPeerId(params.chatId, params.resolvedThreadId)
|
|
: resolveTelegramDirectPeerId({
|
|
chatId: params.chatId,
|
|
senderId: params.senderId,
|
|
});
|
|
const parentPeer = buildTelegramParentPeer({
|
|
isGroup: params.isGroup,
|
|
resolvedThreadId: params.resolvedThreadId,
|
|
chatId: params.chatId,
|
|
});
|
|
let route = resolveAgentRoute({
|
|
cfg: params.cfg,
|
|
channel: "telegram",
|
|
accountId: params.accountId,
|
|
peer: {
|
|
kind: params.isGroup ? "group" : "direct",
|
|
id: peerId,
|
|
},
|
|
parentPeer,
|
|
});
|
|
|
|
const rawTopicAgentId = params.topicAgentId?.trim();
|
|
if (rawTopicAgentId) {
|
|
const topicAgentId = pickFirstExistingAgentId(params.cfg, rawTopicAgentId);
|
|
route = {
|
|
...route,
|
|
agentId: topicAgentId,
|
|
sessionKey: buildAgentSessionKey({
|
|
agentId: topicAgentId,
|
|
channel: "telegram",
|
|
accountId: params.accountId,
|
|
peer: { kind: params.isGroup ? "group" : "direct", id: peerId },
|
|
dmScope: params.cfg.session?.dmScope,
|
|
identityLinks: params.cfg.session?.identityLinks,
|
|
}).toLowerCase(),
|
|
mainSessionKey: buildAgentMainSessionKey({
|
|
agentId: topicAgentId,
|
|
}).toLowerCase(),
|
|
lastRoutePolicy: deriveLastRoutePolicy({
|
|
sessionKey: buildAgentSessionKey({
|
|
agentId: topicAgentId,
|
|
channel: "telegram",
|
|
accountId: params.accountId,
|
|
peer: { kind: params.isGroup ? "group" : "direct", id: peerId },
|
|
dmScope: params.cfg.session?.dmScope,
|
|
identityLinks: params.cfg.session?.identityLinks,
|
|
}).toLowerCase(),
|
|
mainSessionKey: buildAgentMainSessionKey({
|
|
agentId: topicAgentId,
|
|
}).toLowerCase(),
|
|
}),
|
|
};
|
|
logVerbose(
|
|
`telegram: topic route override: topic=${params.resolvedThreadId ?? params.replyThreadId} agent=${topicAgentId} sessionKey=${route.sessionKey}`,
|
|
);
|
|
}
|
|
|
|
const configuredRoute = resolveConfiguredAcpRoute({
|
|
cfg: params.cfg,
|
|
route,
|
|
channel: "telegram",
|
|
accountId: params.accountId,
|
|
conversationId: peerId,
|
|
parentConversationId: params.isGroup ? String(params.chatId) : undefined,
|
|
});
|
|
let configuredBinding = configuredRoute.configuredBinding;
|
|
let configuredBindingSessionKey = configuredRoute.boundSessionKey ?? "";
|
|
route = configuredRoute.route;
|
|
|
|
const threadBindingConversationId =
|
|
params.replyThreadId != null
|
|
? `${params.chatId}:topic:${params.replyThreadId}`
|
|
: !params.isGroup
|
|
? String(params.chatId)
|
|
: undefined;
|
|
if (threadBindingConversationId) {
|
|
const threadBinding = getSessionBindingService().resolveByConversation({
|
|
channel: "telegram",
|
|
accountId: params.accountId,
|
|
conversationId: threadBindingConversationId,
|
|
});
|
|
const boundSessionKey = threadBinding?.targetSessionKey?.trim();
|
|
if (threadBinding && boundSessionKey) {
|
|
route = {
|
|
...route,
|
|
sessionKey: boundSessionKey,
|
|
agentId: resolveAgentIdFromSessionKey(boundSessionKey),
|
|
lastRoutePolicy: deriveLastRoutePolicy({
|
|
sessionKey: boundSessionKey,
|
|
mainSessionKey: route.mainSessionKey,
|
|
}),
|
|
matchedBy: "binding.channel",
|
|
};
|
|
configuredBinding = null;
|
|
configuredBindingSessionKey = "";
|
|
getSessionBindingService().touch(threadBinding.bindingId);
|
|
logVerbose(
|
|
`telegram: routed via bound conversation ${threadBindingConversationId} -> ${boundSessionKey}`,
|
|
);
|
|
}
|
|
}
|
|
|
|
return {
|
|
route,
|
|
configuredBinding,
|
|
configuredBindingSessionKey,
|
|
};
|
|
}
|