UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

179 lines (178 loc) 9.41 kB
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { O as parseAgentSessionKey } from "./session-key-BnWWjqNc.js"; import { r as normalizeOptionalAccountId } from "./account-id-CETVCrTz.js"; import { o as resolveSessionStorePathCore } from "./paths-CXdaYWF_.js"; import { n as normalizeMessageChannel } from "./message-channel-core-AaEWic-A.js"; import "./message-channel-BQrhwUEA.js"; import { f as sessionDeliveryOrigin, n as deliveryContextFromSession } from "./delivery-context.shared-CXmRgetN.js"; import "./session-accessor-YsytfDtG.js"; import { u as loadSessionEntryReadOnly } from "./session-accessor.sqlite-entry-CWk3jL7s.js"; import { t as matchesApprovalRequestFilters } from "./approval-request-filters-lAF2sz9A.js"; //#region src/infra/approval-types.ts function deriveApprovalRequestKind(request) { const isSystemAgent = "proposalHash" in request.request && "sessionId" in request.request; if (isSystemAgent) return "system-agent"; const isExec = "command" in request.request; if ([ isSystemAgent, isExec, "title" in request.request && "description" in request.request ].filter(Boolean).length !== 1) throw new Error("approval request payload does not identify exactly one owner"); return isExec ? "exec" : "plugin"; } function isExecApprovalRequest(request) { return deriveApprovalRequestKind(request) === "exec"; } function isPluginApprovalRequest(request) { return deriveApprovalRequestKind(request) === "plugin"; } function isSystemAgentApprovalRequest(request) { return deriveApprovalRequestKind(request) === "system-agent"; } function hasExecApprovalKind(request) { return request.approvalKind === "exec"; } function hasPluginApprovalKind(request) { return request.approvalKind === "plugin"; } function normalizeApprovalRequest(request) { if (isExecApprovalRequest(request)) { if (hasExecApprovalKind(request)) return request; return { ...request, approvalKind: "exec" }; } if (isPluginApprovalRequest(request)) return hasPluginApprovalKind(request) ? request : { ...request, approvalKind: "plugin" }; if (isSystemAgentApprovalRequest(request)) return { ...request, approvalKind: "system-agent" }; throw new Error("approval request payload does not identify exactly one owner"); } /** Resolve approval ownership from the typed request payload, never from id spelling. */ function resolveApprovalRequestKind(request) { return deriveApprovalRequestKind(request); } //#endregion //#region src/infra/approval-request-account-binding.ts function resolveApprovalForwardAccountIds(params) { const forwarding = resolveApprovalRequestKind(params.request) === "exec" ? params.cfg.approvals?.exec : params.cfg.approvals?.plugin; const channel = normalizeOptionalChannel(params.channel); if (!forwarding?.enabled || forwarding.mode !== "targets" && forwarding.mode !== "both") return []; if (!matchesApprovalRequestFilters({ request: params.request.request, agentFilter: forwarding.agentFilter, sessionFilter: forwarding.sessionFilter })) return []; return (forwarding.targets ?? []).flatMap((target) => { if (normalizeOptionalChannel(target.channel) !== channel) return []; const accountId = normalizeOptionalAccountId(target.accountId ?? params.defaultAccountId); return accountId ? [accountId] : []; }); } function hasApprovalForwardTarget(params) { const forwarding = resolveApprovalRequestKind(params.request) === "exec" ? params.cfg.approvals?.exec : params.cfg.approvals?.plugin; if (!forwarding?.enabled || forwarding.mode !== "targets" && forwarding.mode !== "both" || !matchesApprovalRequestFilters({ request: params.request.request, agentFilter: forwarding.agentFilter, sessionFilter: forwarding.sessionFilter })) return false; const channel = normalizeOptionalChannel(params.channel); return (forwarding.targets ?? []).some((target) => normalizeOptionalChannel(target.channel) === channel); } /** Classifies whether native delivery has named channel-account owners. */ function classifyApprovalRequestChannelRoute(params) { if (!normalizeOptionalChannel(params.channel)) return "unbound"; if (resolveApprovalRequestChannelAccountId(params)) return "bound-or-explicit"; if (hasApprovalForwardTarget(params)) return "bound-or-explicit"; return "unbound"; } function normalizeOptionalChannel(value) { return normalizeMessageChannel(value); } /** Loads the persisted session entry referenced by an approval request, if still present. */ function resolvePersistedApprovalRequestSessionEntry(params) { const sessionKey = normalizeOptionalString(params.request.request.sessionKey); if (!sessionKey) return null; const agentId = parseAgentSessionKey(sessionKey)?.agentId ?? params.request.request.agentId ?? "main"; const storePath = resolveSessionStorePathCore(params.cfg.session?.store, { agentId }); const entry = loadSessionEntryReadOnly({ storePath, sessionKey, clone: false }); if (!entry) return null; return { sessionKey, entry }; } function resolvePersistedApprovalRequestSessionBinding(params) { const persisted = resolvePersistedApprovalRequestSessionEntry(params); if (!persisted) return null; const { entry } = persisted; const origin = sessionDeliveryOrigin(entry); const context = deliveryContextFromSession(entry); const channel = normalizeOptionalChannel(context?.channel ?? origin?.provider); const accountId = normalizeOptionalAccountId(context?.accountId ?? origin?.accountId); return channel || accountId ? { channel, accountId } : null; } /** Resolves the account id an approval request belongs to for an optional channel filter. */ function resolveApprovalRequestAccountId(params) { const expectedChannel = normalizeOptionalChannel(params.channel); const turnSourceChannel = normalizeOptionalChannel(params.request.request.turnSourceChannel); if (expectedChannel && turnSourceChannel && turnSourceChannel !== expectedChannel) return null; const turnSourceAccountId = normalizeOptionalAccountId(params.request.request.turnSourceAccountId); if (turnSourceAccountId) return turnSourceAccountId; const sessionBinding = resolvePersistedApprovalRequestSessionBinding(params); const sessionChannel = sessionBinding?.channel; if (expectedChannel && sessionChannel && sessionChannel !== expectedChannel) return null; return sessionBinding?.accountId ?? null; } /** Resolves an approval request account only when the request can be routed to a channel. */ function resolveApprovalRequestChannelAccountId(params) { const expectedChannel = normalizeOptionalChannel(params.channel); if (!expectedChannel) return null; const turnSourceChannel = normalizeOptionalChannel(params.request.request.turnSourceChannel); if (!turnSourceChannel || turnSourceChannel === expectedChannel) return resolveApprovalRequestAccountId(params); const sessionBinding = resolvePersistedApprovalRequestSessionBinding(params); return sessionBinding?.channel === expectedChannel ? sessionBinding.accountId ?? null : null; } /** Checks whether a channel/account pair is eligible to handle an approval request. */ function doesApprovalRequestMatchChannelAccount(params) { const expectedChannel = normalizeOptionalChannel(params.channel); if (!expectedChannel) return false; const turnSourceChannel = normalizeOptionalChannel(params.request.request.turnSourceChannel); if (turnSourceChannel && turnSourceChannel !== expectedChannel) return false; const turnSourceAccountId = normalizeOptionalAccountId(params.request.request.turnSourceAccountId); const expectedAccountId = normalizeOptionalAccountId(params.accountId); if (turnSourceAccountId) return !expectedAccountId || expectedAccountId === turnSourceAccountId; const sessionBinding = resolvePersistedApprovalRequestSessionBinding(params); const sessionChannel = sessionBinding?.channel; if (sessionChannel && sessionChannel !== expectedChannel) return false; const boundAccountId = sessionBinding?.accountId; return !expectedAccountId || !boundAccountId || expectedAccountId === boundAccountId; } /** Selects the one channel account that owns a native approval request. */ function doesApprovalRequestSelectChannelAccount(params) { const accountId = normalizeOptionalAccountId(params.accountId) ?? normalizeOptionalAccountId(params.defaultAccountId); if (!accountId) return false; const boundAccountId = resolveApprovalRequestChannelAccountId(params); if (accountId === normalizeOptionalAccountId(boundAccountId)) return true; const forwardAccountIds = resolveApprovalForwardAccountIds(params); if (forwardAccountIds.includes(accountId)) return true; if (boundAccountId || forwardAccountIds.length > 0) return false; const turnSourceChannel = normalizeOptionalChannel(params.request.request.turnSourceChannel); if (turnSourceChannel && turnSourceChannel !== normalizeOptionalChannel(params.channel)) return false; const eligibleAccountIds = params.eligibleAccountIds.map(normalizeOptionalAccountId).filter((candidate) => Boolean(candidate)); return eligibleAccountIds.length === 1 && eligibleAccountIds[0] === accountId; } //#endregion export { resolveApprovalRequestChannelAccountId as a, resolveApprovalRequestKind as c, resolveApprovalRequestAccountId as i, doesApprovalRequestMatchChannelAccount as n, resolvePersistedApprovalRequestSessionEntry as o, doesApprovalRequestSelectChannelAccount as r, normalizeApprovalRequest as s, classifyApprovalRequestChannelRoute as t };