





















@@ -241,6 +241,16 @@ export function resolveHeartbeatAckMaxChars(agentCfg?: { heartbeat?: { ackMaxCha
241241return Math.max(0, raw);
242242}
243243244+function isNonFatalCronPresentationWarning(text: string | undefined): boolean {
245+const normalized = normalizeOptionalString(text)?.toLowerCase();
246+return (
247+normalized === "⚠️ ✉️ message failed" ||
248+normalized?.startsWith("⚠️ ✉️ message failed:") === true ||
249+normalized === "⚠️ 🖼️ canvas failed" ||
250+normalized?.startsWith("⚠️ 🖼️ canvas failed:") === true
251+);
252+}
253+244254export function resolveCronPayloadOutcome(params: {
245255payloads: DeliveryPayload[];
246256runLevelError?: unknown;
@@ -259,16 +269,33 @@ export function resolveCronPayloadOutcome(params: {
259269const lastErrorPayloadIndex = params.payloads.findLastIndex(
260270(payload) => payload?.isError === true,
261271);
272+const lastErrorPayloadText = [...params.payloads]
273+.toReversed()
274+.find((payload) => payload?.isError === true && Boolean(payload?.text?.trim()))
275+?.text?.trim();
276+const normalizedFinalAssistantVisibleText = normalizeOptionalString(
277+params.finalAssistantVisibleText,
278+);
262279const hasSuccessfulPayloadAfterLastError =
263280!params.runLevelError &&
264281lastErrorPayloadIndex >= 0 &&
265282params.payloads
266283.slice(lastErrorPayloadIndex + 1)
267284.some((payload) => payload?.isError !== true && Boolean(payload?.text?.trim()));
268-const hasFatalStructuredErrorPayload = hasErrorPayload && !hasSuccessfulPayloadAfterLastError;
269-const normalizedFinalAssistantVisibleText = normalizeOptionalString(
270-params.finalAssistantVisibleText,
271-);
285+const hasSuccessfulPayloadBeforeLastError =
286+!params.runLevelError &&
287+lastErrorPayloadIndex > 0 &&
288+params.payloads
289+.slice(0, lastErrorPayloadIndex)
290+.some((payload) => payload?.isError !== true && Boolean(payload?.text?.trim()));
291+const hasNonFatalTrailingPresentationWarning =
292+lastErrorPayloadIndex >= 0 &&
293+isNonFatalCronPresentationWarning(lastErrorPayloadText) &&
294+(normalizedFinalAssistantVisibleText !== undefined || hasSuccessfulPayloadBeforeLastError);
295+const hasFatalStructuredErrorPayload =
296+hasErrorPayload &&
297+!hasSuccessfulPayloadAfterLastError &&
298+!hasNonFatalTrailingPresentationWarning;
272299const hasStructuredDeliveryPayloads = selectedDeliveryPayloads.some((payload) =>
273300payloadHasStructuredDeliveryContent(payload),
274301);
@@ -293,10 +320,6 @@ export function resolveCronPayloadOutcome(params: {
293320 : synthesizedText
294321 ? [{ text: synthesizedText }]
295322 : [];
296-const lastErrorPayloadText = [...params.payloads]
297-.toReversed()
298-.find((payload) => payload?.isError === true && Boolean(payload?.text?.trim()))
299-?.text?.trim();
300323const denialSignal = resolveCronDenialSignal([
301324{ field: "summary", text: summary },
302325{ field: "outputText", text: outputText },
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。