UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

196 lines (195 loc) • 8.3 kB
import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-6kR-86XC.mjs"; import { n as buildAgentMainSessionKey } from "./session-key-DDIJxXfQ.mjs"; import { f as resolveThreadSessionKeys, p as sanitizeAgentId } from "./session-key-BC4m_Ly5.mjs"; import { n as normalizeAccountId } from "./account-id-CW6dlabA.mjs"; import { r as logVerbose } from "./globals-D2Pr1KIl.mjs"; import "./string-coerce-runtime-B1b8UNzb.mjs"; import { n as deriveLastRoutePolicy, o as resolveAgentRoute, t as buildAgentSessionKey } from "./resolve-route-CjRxw_sT.mjs"; import { t as getSessionBindingService } from "./session-binding-service-BxjdmbUW.mjs"; import "./runtime-env-DMdB1vhM.mjs"; import "./routing-D93XBoA5.mjs"; import { a as resolveRuntimeConversationBindingRouteAsync, i as resolveRuntimeConversationBindingRoute, r as resolveConfiguredBindingRoute } from "./binding-routing-BfWromub.mjs"; import "./conversation-binding-runtime-CJgBlhaa.mjs"; import { i as resolveDefaultTelegramAccountId } from "./accounts-Djo8Ua3d.mjs"; import { t as buildTelegramConversationId } from "./topic-conversation-b8gpxp5f.mjs"; import { S as shouldUseTelegramDmThreadSession, o as buildTelegramParentPeer } from "./helpers-CDGCpau0.mjs"; //#region extensions/telegram/src/dm-session-key.ts function resolveTelegramDirectPeerId(params) { return (params.senderId == null ? "" : String(params.senderId).trim()) || String(params.chatId); } function resolveTelegramNamedAccountBaseSessionKey(defaultAccountId, params) { if (!(normalizeAccountId(params.route.accountId) !== normalizeAccountId(defaultAccountId) && params.route.matchedBy === "default") || params.isGroup) return params.route.sessionKey; return buildAgentSessionKey({ agentId: params.route.agentId, channel: "telegram", accountId: params.route.accountId, peer: { kind: "direct", id: resolveTelegramDirectPeerId({ chatId: params.chatId, senderId: params.senderId }) }, dmScope: "per-account-channel-peer", identityLinks: params.cfg.session?.identityLinks }); } function resolveTelegramSecurityDmRoute(defaultAccountId, params) { if (params.principalId !== void 0) return { sessionKey: resolveTelegramNamedAccountBaseSessionKey(defaultAccountId, { ...params, chatId: params.principalId, isGroup: false, senderId: params.principalId }) }; if (normalizeAccountId(params.accountId) !== normalizeAccountId(defaultAccountId) && params.route.matchedBy === "default" || params.route.dmScope === "per-account-channel-peer") return { kind: "isolated" }; return params.route.dmScope === "main" ? { sessionKey: params.route.sessionKey } : { kind: "core" }; } //#endregion //#region extensions/telegram/src/conversation-route.ts function prepareTelegramConversationRoute(params) { const resolvedThreadId = params.threadSpec.id; const conversationId = buildTelegramConversationId({ chatId: params.chatId, thread: params.threadSpec }); const peerId = params.isGroup ? conversationId : resolveTelegramDirectPeerId({ chatId: params.chatId, senderId: params.senderId }); const parentPeer = buildTelegramParentPeer({ isGroup: params.isGroup, 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 = sanitizeAgentId(rawTopicAgentId); const sessionKey = normalizeLowercaseStringOrEmpty(buildAgentSessionKey({ agentId: topicAgentId, mainKey: params.cfg.session?.mainKey, channel: "telegram", accountId: params.accountId, peer: { kind: params.isGroup ? "group" : "direct", id: peerId }, dmScope: route.dmScope, groupScope: route.groupScope, identityLinks: params.cfg.session?.identityLinks })); const mainSessionKey = normalizeLowercaseStringOrEmpty(buildAgentMainSessionKey({ agentId: topicAgentId, mainKey: params.cfg.session?.mainKey })); route = { ...route, agentId: topicAgentId, sessionKey, mainSessionKey, lastRoutePolicy: deriveLastRoutePolicy({ sessionKey, mainSessionKey }) }; logVerbose(`telegram: topic route override: topic=${resolvedThreadId} agent=${topicAgentId} sessionKey=${route.sessionKey}`); } const configuredRoute = resolveConfiguredBindingRoute({ cfg: params.cfg, route, conversation: { channel: "telegram", accountId: params.accountId, conversationId: params.isGroup ? conversationId : peerId, parentConversationId: conversationId !== String(params.chatId) || params.isGroup ? String(params.chatId) : void 0 } }); route = configuredRoute.route; const bindingMode = configuredRoute.bindingResolution ? { kind: "configured", binding: configuredRoute.bindingResolution, sessionKey: configuredRoute.boundSessionKey ?? route.sessionKey } : { kind: "none" }; return { route, bindingMode, conversation: { channel: "telegram", accountId: params.accountId, conversationId } }; } function applyTelegramRuntimeRoute(prepared, runtimeRoute) { const route = runtimeRoute.route; let bindingMode = prepared.bindingMode; const runtimeBindingConversationId = prepared.conversation.conversationId; if (runtimeRoute.bindingRecord) { bindingMode = runtimeRoute.boundSessionKey ? { kind: "runtime-bound", sessionKey: runtimeRoute.boundSessionKey } : { kind: "plugin-owned-runtime", pluginId: runtimeRoute.pluginId ?? "" }; logVerbose(runtimeRoute.boundSessionKey ? `telegram: routed via bound conversation ${runtimeBindingConversationId} -> ${runtimeRoute.boundSessionKey}` : `telegram: plugin-bound conversation ${runtimeBindingConversationId}`); } return { route, bindingMode, bindingOwnerAvailable: runtimeRoute.bindingOwnerAvailable ?? true, ...runtimeRoute.bindingRecord ? { runtimeBinding: { ...runtimeRoute.bindingRecord, conversation: { ...runtimeRoute.bindingRecord.conversation } } } : {} }; } async function resolveTelegramConversationRoute(params) { const prepared = prepareTelegramConversationRoute(params); return applyTelegramRuntimeRoute(prepared, await resolveRuntimeConversationBindingRouteAsync(prepared)); } /** Revalidates route ownership without extending runtime-binding liveness. */ function inspectTelegramConversationRoute(params) { const prepared = prepareTelegramConversationRoute(params); return applyTelegramRuntimeRoute(prepared, resolveRuntimeConversationBindingRoute({ ...prepared, touchBinding: false })); } /** Extend only the inspected binding after native command authorization. */ async function touchTelegramConversationRoute(inspected) { const captured = inspected.runtimeBinding; if (!captured) return; const bindings = getSessionBindingService(); const assertRouteCurrent = () => { const current = bindings.resolveByConversation(captured.conversation); if (!current || current.bindingId !== captured.bindingId || current.targetSessionKey !== captured.targetSessionKey || current.targetKind !== captured.targetKind || current.boundAt !== captured.boundAt || current.status !== captured.status) throw new Error("Telegram command route changed; send a new request."); }; assertRouteCurrent(); await bindings.touchAsync(captured.bindingId, void 0, captured.conversation); assertRouteCurrent(); } function resolveTelegramConversationBaseSessionKey(params) { return resolveTelegramNamedAccountBaseSessionKey(resolveDefaultTelegramAccountId(params.cfg), params); } function resolveTelegramTargetSession(params) { const baseSessionKey = resolveTelegramConversationBaseSessionKey(params); return (shouldUseTelegramDmThreadSession({ dmThreadId: params.dmThreadId, botHasTopicsEnabled: params.botHasTopicsEnabled }) && params.dmThreadId != null ? resolveThreadSessionKeys({ baseSessionKey, threadId: `${params.chatId}:${params.dmThreadId}` }) : null)?.sessionKey ?? baseSessionKey; } //#endregion export { touchTelegramConversationRoute as a, resolveTelegramTargetSession as i, resolveTelegramConversationBaseSessionKey as n, resolveTelegramDirectPeerId as o, resolveTelegramConversationRoute as r, resolveTelegramSecurityDmRoute as s, inspectTelegramConversationRoute as t };