openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
123 lines (122 loc) • 5.62 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString, s as normalizeOptionalLowercaseString, u as normalizeOptionalThreadValue } from "./string-coerce-mnp54Vah.js";
import { t as resolveTargetPrefixedChannel } from "./channel-target-prefix-l64LTfQ6.js";
//#region src/cron/delivery-plan.ts
/** Resolves cron delivery and failure-notification routing from job config. */
/** Returns whether a delivery plan names a concrete channel, recipient, thread, or account. */
function hasExplicitCronDeliveryTarget(plan) {
return Boolean(plan.channel && plan.channel !== "last" || plan.to || plan.threadId != null || plan.accountId);
}
function normalizeChannel(value) {
const trimmed = normalizeOptionalLowercaseString(value);
if (!trimmed) return;
return trimmed;
}
function resolveAnnounceChannel(params) {
if (params.channel && params.channel !== "last") return params.channel;
return resolveTargetPrefixedChannel(params.to) ?? params.channel ?? "last";
}
/** Resolves primary delivery config into the runtime mode/channel/target plan. */
function resolveCronDeliveryPlan(job) {
const delivery = job.delivery;
const hasDelivery = delivery && typeof delivery === "object";
const rawMode = hasDelivery ? delivery.mode : void 0;
const normalizedMode = typeof rawMode === "string" ? normalizeLowercaseStringOrEmpty(rawMode) : rawMode;
const mode = normalizedMode === "announce" ? "announce" : normalizedMode === "webhook" ? "webhook" : normalizedMode === "none" ? "none" : normalizedMode === "deliver" ? "announce" : void 0;
const deliveryChannel = normalizeChannel(delivery?.channel);
const deliveryTo = normalizeOptionalString(delivery?.to);
const deliveryThreadId = normalizeOptionalThreadValue(delivery?.threadId);
const to = deliveryTo;
const deliveryAccountId = normalizeOptionalString(delivery?.accountId);
if (hasDelivery) {
const resolvedMode = mode ?? "announce";
const channel = resolvedMode === "announce" ? resolveAnnounceChannel({
channel: deliveryChannel,
to
}) : deliveryChannel;
return {
mode: resolvedMode,
channel: resolvedMode === "webhook" ? void 0 : channel,
to,
threadId: resolvedMode === "webhook" ? void 0 : deliveryThreadId,
accountId: deliveryAccountId,
source: "delivery",
requested: resolvedMode === "announce"
};
}
const resolvedMode = (job.payload.kind === "agentTurn" || job.payload.kind === "command") && typeof job.sessionTarget === "string" && (job.sessionTarget === "isolated" || job.sessionTarget === "current" || job.sessionTarget.startsWith("session:")) ? "announce" : "none";
return {
mode: resolvedMode,
channel: resolvedMode === "announce" ? "last" : void 0,
to: void 0,
threadId: void 0,
source: "delivery",
requested: resolvedMode === "announce"
};
}
function normalizeFailureMode(value) {
const trimmed = normalizeOptionalLowercaseString(value);
if (trimmed === "announce" || trimmed === "webhook") return trimmed;
}
/** Resolves job-level failure notification routing layered over global defaults. */
function resolveFailureDestination(job, globalConfig) {
const delivery = job.delivery;
const jobFailureDest = delivery?.failureDestination;
const hasJobFailureDest = jobFailureDest && typeof jobFailureDest === "object";
let channel;
let to;
let accountId;
let mode;
if (globalConfig) {
channel = normalizeChannel(globalConfig.channel);
to = normalizeOptionalString(globalConfig.to);
accountId = normalizeOptionalString(globalConfig.accountId);
mode = normalizeFailureMode(globalConfig.mode);
}
if (hasJobFailureDest) {
const jobChannel = normalizeChannel(jobFailureDest.channel);
const jobTo = normalizeOptionalString(jobFailureDest.to);
const jobAccountId = normalizeOptionalString(jobFailureDest.accountId);
const jobMode = normalizeFailureMode(jobFailureDest.mode);
const hasJobChannelField = "channel" in jobFailureDest;
const hasJobToField = "to" in jobFailureDest;
const hasJobAccountIdField = "accountId" in jobFailureDest;
const hasJobModeField = "mode" in jobFailureDest;
const jobToExplicitValue = hasJobToField && jobTo !== void 0;
if (hasJobChannelField) channel = jobChannel;
if (hasJobToField) to = jobTo;
if (hasJobAccountIdField) accountId = jobAccountId;
if (hasJobModeField) {
const globalMode = globalConfig?.mode ?? "announce";
if (!jobToExplicitValue && globalMode !== (jobMode ?? "announce")) to = void 0;
mode = jobMode;
}
}
if (!channel && !to && !accountId && !mode) return null;
const resolvedMode = mode ?? "announce";
if (resolvedMode === "webhook" && !to) return null;
const result = {
mode: resolvedMode,
channel: resolvedMode === "announce" ? resolveAnnounceChannel({
channel,
to
}) : void 0,
to,
accountId
};
if (delivery && isSameDeliveryTarget(delivery, result)) return null;
return result;
}
function isSameDeliveryTarget(delivery, failurePlan) {
const primaryMode = delivery.mode ?? "announce";
if (primaryMode === "none") return false;
const primaryTo = normalizeOptionalString(delivery.to);
const primaryAccountId = normalizeOptionalString(delivery.accountId);
if (failurePlan.mode === "webhook") return primaryMode === "webhook" && primaryTo === failurePlan.to;
const primaryChannelNormalized = resolveAnnounceChannel({
channel: normalizeChannel(delivery.channel),
to: primaryTo
});
return (failurePlan.channel ?? "last") === primaryChannelNormalized && failurePlan.to === primaryTo && failurePlan.accountId === primaryAccountId;
}
//#endregion
export { resolveCronDeliveryPlan as n, resolveFailureDestination as r, hasExplicitCronDeliveryTarget as t };