UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

178 lines (177 loc) 6.84 kB
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { i as resolveOutboundDurableFinalDeliverySupport } from "./deliver-prepare-6uVAVf8W.js"; import { t as buildOutboundSessionContext } from "./session-context-CpdGMrv6.js"; import { t as deriveDurableFinalDeliveryRequirements } from "./capabilities-B0Za3iuj.js"; import { t as normalizeDeliverableOutboundChannel } from "./channel-resolution-DfSowVxJ.js"; import "./deliver-BngawiqN.js"; import { n as sendDurableMessageBatchCore, t as durableMessageBatchMayHaveReachedRecipient } from "./send-Dk4bo3m5.js"; import { n as createChannelPartialDeliveryError, t as createChannelDeliveryResultFromReceipt } from "./delivery-result-jWGDGh5u.js"; //#region src/channels/turn/durable-delivery.ts function resolveDeliveryTarget(params) { return normalizeOptionalString(params.to) ?? normalizeOptionalString(params.ctxPayload.OriginatingTo) ?? normalizeOptionalString(params.ctxPayload.To); } function resolveDurableInboundReplyToId(params) { if (params.replyToId === null || params.payload.replyToId === null) return null; return normalizeOptionalString(params.replyToId) ?? normalizeOptionalString(params.payload.replyToId) ?? normalizeOptionalString(params.ctxPayload.ReplyToIdFull) ?? normalizeOptionalString(params.ctxPayload.ReplyToId); } function resolveDurableInboundReplyThreadId(params) { if ("threadId" in params) return params.threadId; return params.ctxPayload.MessageThreadId; } function stringifyThreadId(value) { return value == null ? void 0 : String(value); } function toDeliveryIntent(intent) { return { id: intent.id, kind: "outbound_queue", queuePolicy: intent.queuePolicy }; } function resolveDurableSuppression(send) { const hookEffect = send.payloadOutcomes?.find((outcome) => outcome.status === "suppressed")?.hookEffect; return { reason: send.reason, ...hookEffect?.cancelReason ? { cancelReason: hookEffect.cancelReason } : {}, ...hookEffect?.metadata ? { metadata: hookEffect.metadata } : {} }; } /** Narrows durable delivery results that handled the payload without caller fallback. */ function isDurableInboundReplyDeliveryHandled(result) { return result.status === "handled_visible" || result.status === "handled_no_send"; } /** Throws failed durable delivery results, preserving visible-send metadata when applicable. */ function throwIfDurableInboundReplyDeliveryFailed(result) { if (result.status === "failed") throw result.error; } function resolveAcceptedVisibleContent(results) { return results.map((result) => result.meta?.visibleText).filter((value) => typeof value === "string").join("") || void 0; } /** Delivers final inbound replies through the durable message-send context when supported. */ async function deliverInboundReplyWithMessageSendContextCore(params) { if (params.info.kind !== "final") return { status: "not_applicable", reason: "non_final" }; const channel = normalizeDeliverableOutboundChannel(params.channel); const to = resolveDeliveryTarget(params); if (!channel) return { status: "unsupported", reason: "missing_channel" }; if (!to) return { status: "unsupported", reason: "missing_target" }; const replyToId = resolveDurableInboundReplyToId(params); const threadId = resolveDurableInboundReplyThreadId(params); const requiredCapabilities = params.requiredCapabilities ?? deriveDurableFinalDeliveryRequirements({ payload: params.payload, replyToId, threadId, silent: params.silent }); const durability = requiredCapabilities.reconcileUnknownSend === true ? "required" : "best_effort"; let support; try { support = await resolveOutboundDurableFinalDeliverySupport({ cfg: params.cfg, agentId: params.agentId, channel, requirements: requiredCapabilities }); } catch (err) { return { status: "failed", error: err }; } if (!support.ok) return { status: "unsupported", reason: support.reason, ...support.capability ? { capability: support.capability } : {} }; const session = buildOutboundSessionContext({ cfg: params.cfg, sessionKey: params.ctxPayload.SessionKey, policySessionKey: params.ctxPayload.RuntimePolicySessionKey, conversationType: params.ctxPayload.ChatType, agentId: params.agentId, requesterAccountId: params.accountId ?? params.ctxPayload.AccountId, requesterSenderId: params.ctxPayload.SenderId ?? params.ctxPayload.From, requesterSenderName: params.ctxPayload.SenderName, requesterSenderUsername: params.ctxPayload.SenderUsername, requesterSenderE164: params.ctxPayload.SenderE164 }); const send = await sendDurableMessageBatchCore({ cfg: params.cfg, channel, to, accountId: params.accountId, payloads: [params.payload], ...params.executionIdentityToken ? { runId: params.executionIdentityToken.runId, executionIdentityToken: params.executionIdentityToken } : {}, threadId, replyToId, replyToMode: params.replyToMode, formatting: params.formatting, identity: params.identity, deps: params.deps, mediaAccess: params.mediaAccess, silent: params.silent, durability, ...requiredCapabilities.reconcileUnknownSend === true ? { requireUnknownSendReconciliation: true } : {}, session, gatewayClientScopes: params.ctxPayload.GatewayClientScopes ?? [] }); if (send.status === "failed") return { status: "failed", error: send.error }; if (send.status === "partial_failed") { const content = resolveAcceptedVisibleContent(send.results); const delivery = createChannelDeliveryResultFromReceipt({ receipt: send.receipt, threadId: stringifyThreadId(threadId), ...replyToId ? { replyToId } : {}, visibleReplySent: true, ...content ? { content } : {}, ...send.deliveryIntent ? { deliveryIntent: toDeliveryIntent(send.deliveryIntent) } : {} }); return { status: "failed", error: createChannelPartialDeliveryError(send.error, { ...delivery, visibleReplySent: true }), sentBeforeError: true }; } const receiptDelivery = createChannelDeliveryResultFromReceipt({ receipt: send.receipt, threadId: stringifyThreadId(threadId), ...replyToId ? { replyToId } : {}, visibleReplySent: durableMessageBatchMayHaveReachedRecipient(send), ...send.deliveryIntent ? { deliveryIntent: toDeliveryIntent(send.deliveryIntent) } : {} }); const delivery = send.status === "suppressed" ? { ...receiptDelivery, suppression: resolveDurableSuppression(send) } : receiptDelivery; if (send.status === "suppressed") return delivery.visibleReplySent === true ? { status: "handled_visible", delivery } : { status: "handled_no_send", reason: "no_visible_result", delivery }; return { status: "handled_visible", delivery }; } //#endregion export { isDurableInboundReplyDeliveryHandled as n, throwIfDurableInboundReplyDeliveryFailed as r, deliverInboundReplyWithMessageSendContextCore as t };