* cron: split webhook delivery from announce mode * cron: validate webhook delivery target * cron: remove legacy webhook fallback config * fix: finalize cron webhook delivery prep (#17901) (thanks @advaitpaliwal) --------- Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
80 lines
2.4 KiB
TypeScript
80 lines
2.4 KiB
TypeScript
import type { CronDeliveryMode, CronJob, CronMessageChannel } from "./types.js";
|
|
|
|
export type CronDeliveryPlan = {
|
|
mode: CronDeliveryMode;
|
|
channel?: CronMessageChannel;
|
|
to?: string;
|
|
source: "delivery" | "payload";
|
|
requested: boolean;
|
|
};
|
|
|
|
function normalizeChannel(value: unknown): CronMessageChannel | undefined {
|
|
if (typeof value !== "string") {
|
|
return undefined;
|
|
}
|
|
const trimmed = value.trim().toLowerCase();
|
|
if (!trimmed) {
|
|
return undefined;
|
|
}
|
|
return trimmed as CronMessageChannel;
|
|
}
|
|
|
|
function normalizeTo(value: unknown): string | undefined {
|
|
if (typeof value !== "string") {
|
|
return undefined;
|
|
}
|
|
const trimmed = value.trim();
|
|
return trimmed ? trimmed : undefined;
|
|
}
|
|
|
|
export function resolveCronDeliveryPlan(job: CronJob): CronDeliveryPlan {
|
|
const payload = job.payload.kind === "agentTurn" ? job.payload : null;
|
|
const delivery = job.delivery;
|
|
const hasDelivery = delivery && typeof delivery === "object";
|
|
const rawMode = hasDelivery ? (delivery as { mode?: unknown }).mode : undefined;
|
|
const normalizedMode = typeof rawMode === "string" ? rawMode.trim().toLowerCase() : rawMode;
|
|
const mode =
|
|
normalizedMode === "announce"
|
|
? "announce"
|
|
: normalizedMode === "webhook"
|
|
? "webhook"
|
|
: normalizedMode === "none"
|
|
? "none"
|
|
: normalizedMode === "deliver"
|
|
? "announce"
|
|
: undefined;
|
|
|
|
const payloadChannel = normalizeChannel(payload?.channel);
|
|
const payloadTo = normalizeTo(payload?.to);
|
|
const deliveryChannel = normalizeChannel(
|
|
(delivery as { channel?: unknown } | undefined)?.channel,
|
|
);
|
|
const deliveryTo = normalizeTo((delivery as { to?: unknown } | undefined)?.to);
|
|
|
|
const channel = deliveryChannel ?? payloadChannel ?? "last";
|
|
const to = deliveryTo ?? payloadTo;
|
|
if (hasDelivery) {
|
|
const resolvedMode = mode ?? "announce";
|
|
return {
|
|
mode: resolvedMode,
|
|
channel: resolvedMode === "announce" ? channel : undefined,
|
|
to,
|
|
source: "delivery",
|
|
requested: resolvedMode === "announce",
|
|
};
|
|
}
|
|
|
|
const legacyMode =
|
|
payload?.deliver === true ? "explicit" : payload?.deliver === false ? "off" : "auto";
|
|
const hasExplicitTarget = Boolean(to);
|
|
const requested = legacyMode === "explicit" || (legacyMode === "auto" && hasExplicitTarget);
|
|
|
|
return {
|
|
mode: requested ? "announce" : "none",
|
|
channel,
|
|
to,
|
|
source: "payload",
|
|
requested,
|
|
};
|
|
}
|