UNPKG

@gguf/claw

Version:

Multi-channel AI gateway with extensible messaging integrations

253 lines (251 loc) 9.2 kB
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js"; import { a as buildAgentPeerSessionKey, i as buildAgentMainSessionKey, l as normalizeAgentId, n as DEFAULT_AGENT_ID, p as sanitizeAgentId, r as DEFAULT_MAIN_KEY, t as DEFAULT_ACCOUNT_ID } from "./session-key-CgcjHuX_.js"; import { Z as shouldLogVerbose } from "./registry-BmY4gNy6.js"; import { c as resolveDefaultAgentId } from "./agent-scope-BLYwrEEA.js"; import { y as logDebug } from "./workspace-D9IzNnST.js"; import { t as normalizeChatType } from "./chat-type-C_KiWNAH.js"; import { t as listBindings } from "./bindings-DWtXcdc8.js"; //#region src/routing/resolve-route.ts var resolve_route_exports = /* @__PURE__ */ __exportAll({ DEFAULT_ACCOUNT_ID: () => DEFAULT_ACCOUNT_ID, DEFAULT_AGENT_ID: () => DEFAULT_AGENT_ID, buildAgentSessionKey: () => buildAgentSessionKey, resolveAgentRoute: () => resolveAgentRoute }); function normalizeToken(value) { return (value ?? "").trim().toLowerCase(); } function normalizeId(value) { if (typeof value === "string") return value.trim(); if (typeof value === "number" || typeof value === "bigint") return String(value).trim(); return ""; } function normalizeAccountId(value) { const trimmed = (value ?? "").trim(); return trimmed ? trimmed : DEFAULT_ACCOUNT_ID; } function matchesAccountId(match, actual) { const trimmed = (match ?? "").trim(); if (!trimmed) return actual === DEFAULT_ACCOUNT_ID; if (trimmed === "*") return true; return trimmed === actual; } function buildAgentSessionKey(params) { const channel = normalizeToken(params.channel) || "unknown"; const peer = params.peer; return buildAgentPeerSessionKey({ agentId: params.agentId, mainKey: DEFAULT_MAIN_KEY, channel, accountId: params.accountId, peerKind: peer?.kind ?? "direct", peerId: peer ? normalizeId(peer.id) || "unknown" : null, dmScope: params.dmScope, identityLinks: params.identityLinks }); } function listAgents(cfg) { const agents = cfg.agents?.list; return Array.isArray(agents) ? agents : []; } function pickFirstExistingAgentId(cfg, agentId) { const trimmed = (agentId ?? "").trim(); if (!trimmed) return sanitizeAgentId(resolveDefaultAgentId(cfg)); const normalized = normalizeAgentId(trimmed); const agents = listAgents(cfg); if (agents.length === 0) return sanitizeAgentId(trimmed); const match = agents.find((agent) => normalizeAgentId(agent.id) === normalized); if (match?.id?.trim()) return sanitizeAgentId(match.id.trim()); return sanitizeAgentId(resolveDefaultAgentId(cfg)); } function matchesChannel(match, channel) { const key = normalizeToken(match?.channel); if (!key) return false; return key === channel; } const evaluatedBindingsCacheByCfg = /* @__PURE__ */ new WeakMap(); const MAX_EVALUATED_BINDINGS_CACHE_KEYS = 2e3; function getEvaluatedBindingsForChannelAccount(cfg, channel, accountId) { const bindingsRef = cfg.bindings; const existing = evaluatedBindingsCacheByCfg.get(cfg); const cache = existing && existing.bindingsRef === bindingsRef ? existing : { bindingsRef, byChannelAccount: /* @__PURE__ */ new Map() }; if (cache !== existing) evaluatedBindingsCacheByCfg.set(cfg, cache); const cacheKey = `${channel}\t${accountId}`; const hit = cache.byChannelAccount.get(cacheKey); if (hit) return hit; const evaluated = listBindings(cfg).flatMap((binding) => { if (!binding || typeof binding !== "object") return []; if (!matchesChannel(binding.match, channel)) return []; if (!matchesAccountId(binding.match?.accountId, accountId)) return []; return [{ binding, match: normalizeBindingMatch(binding.match) }]; }); cache.byChannelAccount.set(cacheKey, evaluated); if (cache.byChannelAccount.size > MAX_EVALUATED_BINDINGS_CACHE_KEYS) { cache.byChannelAccount.clear(); cache.byChannelAccount.set(cacheKey, evaluated); } return evaluated; } function normalizePeerConstraint(peer) { if (!peer) return { state: "none" }; const kind = normalizeChatType(peer.kind); const id = normalizeId(peer.id); if (!kind || !id) return { state: "invalid" }; return { state: "valid", kind, id }; } function normalizeBindingMatch(match) { const rawRoles = match?.roles; return { accountPattern: (match?.accountId ?? "").trim(), peer: normalizePeerConstraint(match?.peer), guildId: normalizeId(match?.guildId) || null, teamId: normalizeId(match?.teamId) || null, roles: Array.isArray(rawRoles) && rawRoles.length > 0 ? rawRoles : null }; } function hasGuildConstraint(match) { return Boolean(match.guildId); } function hasTeamConstraint(match) { return Boolean(match.teamId); } function hasRolesConstraint(match) { return Boolean(match.roles); } function matchesBindingScope(match, scope) { if (match.peer.state === "invalid") return false; if (match.peer.state === "valid") { if (!scope.peer || scope.peer.kind !== match.peer.kind || scope.peer.id !== match.peer.id) return false; } if (match.guildId && match.guildId !== scope.guildId) return false; if (match.teamId && match.teamId !== scope.teamId) return false; if (match.roles) { for (const role of match.roles) if (scope.memberRoleIds.has(role)) return true; return false; } return true; } function resolveAgentRoute(input) { const channel = normalizeToken(input.channel); const accountId = normalizeAccountId(input.accountId); const peer = input.peer ? { kind: input.peer.kind, id: normalizeId(input.peer.id) } : null; const guildId = normalizeId(input.guildId); const teamId = normalizeId(input.teamId); const memberRoleIds = input.memberRoleIds ?? []; const memberRoleIdSet = new Set(memberRoleIds); const bindings = getEvaluatedBindingsForChannelAccount(input.cfg, channel, accountId); const dmScope = input.cfg.session?.dmScope ?? "main"; const identityLinks = input.cfg.session?.identityLinks; const choose = (agentId, matchedBy) => { const resolvedAgentId = pickFirstExistingAgentId(input.cfg, agentId); return { agentId: resolvedAgentId, channel, accountId, sessionKey: buildAgentSessionKey({ agentId: resolvedAgentId, channel, accountId, peer, dmScope, identityLinks }).toLowerCase(), mainSessionKey: buildAgentMainSessionKey({ agentId: resolvedAgentId, mainKey: DEFAULT_MAIN_KEY }).toLowerCase(), matchedBy }; }; const shouldLogDebug = shouldLogVerbose(); const formatPeer = (value) => value?.kind && value?.id ? `${value.kind}:${value.id}` : "none"; const formatNormalizedPeer = (value) => { if (value.state === "none") return "none"; if (value.state === "invalid") return "invalid"; return `${value.kind}:${value.id}`; }; if (shouldLogDebug) { logDebug(`[routing] resolveAgentRoute: channel=${channel} accountId=${accountId} peer=${formatPeer(peer)} guildId=${guildId || "none"} teamId=${teamId || "none"} bindings=${bindings.length}`); for (const entry of bindings) logDebug(`[routing] binding: agentId=${entry.binding.agentId} accountPattern=${entry.match.accountPattern || "default"} peer=${formatNormalizedPeer(entry.match.peer)} guildId=${entry.match.guildId ?? "none"} teamId=${entry.match.teamId ?? "none"} roles=${entry.match.roles?.length ?? 0}`); } const parentPeer = input.parentPeer ? { kind: input.parentPeer.kind, id: normalizeId(input.parentPeer.id) } : null; const baseScope = { guildId, teamId, memberRoleIds: memberRoleIdSet }; const tiers = [ { matchedBy: "binding.peer", enabled: Boolean(peer), scopePeer: peer, predicate: (candidate) => candidate.match.peer.state === "valid" }, { matchedBy: "binding.peer.parent", enabled: Boolean(parentPeer && parentPeer.id), scopePeer: parentPeer && parentPeer.id ? parentPeer : null, predicate: (candidate) => candidate.match.peer.state === "valid" }, { matchedBy: "binding.guild+roles", enabled: Boolean(guildId && memberRoleIds.length > 0), scopePeer: peer, predicate: (candidate) => hasGuildConstraint(candidate.match) && hasRolesConstraint(candidate.match) }, { matchedBy: "binding.guild", enabled: Boolean(guildId), scopePeer: peer, predicate: (candidate) => hasGuildConstraint(candidate.match) && !hasRolesConstraint(candidate.match) }, { matchedBy: "binding.team", enabled: Boolean(teamId), scopePeer: peer, predicate: (candidate) => hasTeamConstraint(candidate.match) }, { matchedBy: "binding.account", enabled: true, scopePeer: peer, predicate: (candidate) => candidate.match.accountPattern !== "*" }, { matchedBy: "binding.channel", enabled: true, scopePeer: peer, predicate: (candidate) => candidate.match.accountPattern === "*" } ]; for (const tier of tiers) { if (!tier.enabled) continue; const matched = bindings.find((candidate) => tier.predicate(candidate) && matchesBindingScope(candidate.match, { ...baseScope, peer: tier.scopePeer })); if (matched) { if (shouldLogDebug) logDebug(`[routing] match: matchedBy=${tier.matchedBy} agentId=${matched.binding.agentId}`); return choose(matched.binding.agentId, tier.matchedBy); } } return choose(resolveDefaultAgentId(input.cfg), "default"); } //#endregion export { resolveAgentRoute as n, resolve_route_exports as r, buildAgentSessionKey as t };