


























@@ -1,5 +1,6 @@
11import { hasOutboundReplyContent } from "openclaw/plugin-sdk/reply-payload";
22import { DEFAULT_HEARTBEAT_ACK_MAX_CHARS } from "../../auto-reply/heartbeat.js";
3+import { getReplyPayloadMetadata } from "../../auto-reply/reply-payload.js";
34import type { ReplyPayload } from "../../auto-reply/reply-payload.js";
45import { normalizeOptionalString } from "../../shared/string-coerce.js";
56import { truncateUtf16Safe } from "../../utils.js";
@@ -97,6 +98,9 @@ export function pickSummaryFromPayloads(
9798}
9899}
99100for (let i = payloads.length - 1; i >= 0; i--) {
101+if (isNonTerminalToolErrorWarning(payloads[i])) {
102+continue;
103+}
100104const summary = pickSummaryFromOutput(payloads[i]?.text);
101105if (summary) {
102106return summary;
@@ -118,6 +122,9 @@ export function pickLastNonEmptyTextFromPayloads(
118122}
119123}
120124for (let i = payloads.length - 1; i >= 0; i--) {
125+if (isNonTerminalToolErrorWarning(payloads[i])) {
126+continue;
127+}
121128const clean = (payloads[i]?.text ?? "").trim();
122129if (clean) {
123130return clean;
@@ -195,14 +202,26 @@ function isCronMessagePresentationWarning(text: string | undefined): boolean {
195202);
196203}
197204205+function isNonTerminalToolErrorWarning(payload: object | undefined): boolean {
206+return Boolean(payload && getReplyPayloadMetadata(payload)?.nonTerminalToolErrorWarning);
207+}
208+209+function isSuccessfulCronPayload(payload: DeliveryPayload | undefined): boolean {
210+return (
211+payload?.isError !== true &&
212+(isDeliverablePayload(payload) || payloadHasStructuredDeliveryContent(payload))
213+);
214+}
215+198216export function resolveCronPayloadOutcome(params: {
199217payloads: DeliveryPayload[];
200218runLevelError?: unknown;
201219failureSignal?: CronFailureSignal | undefined;
202220finalAssistantVisibleText?: string | undefined;
203221preferFinalAssistantVisibleText?: boolean;
204222}): CronPayloadOutcome {
205-const firstText = params.payloads[0]?.text ?? "";
223+const firstText =
224+params.payloads.find((payload) => !isNonTerminalToolErrorWarning(payload))?.text ?? "";
206225const fallbackSummary =
207226pickSummaryFromPayloads(params.payloads) ?? pickSummaryFromOutput(firstText);
208227const fallbackOutputText = pickLastNonEmptyTextFromPayloads(params.payloads);
@@ -223,23 +242,33 @@ export function resolveCronPayloadOutcome(params: {
223242const hasSuccessfulPayloadAfterLastError =
224243!params.runLevelError &&
225244lastErrorPayloadIndex >= 0 &&
226-params.payloads
227-.slice(lastErrorPayloadIndex + 1)
228-.some((payload) => payload?.isError !== true && Boolean(payload?.text?.trim()));
245+params.payloads.slice(lastErrorPayloadIndex + 1).some(isSuccessfulCronPayload);
229246const hasSuccessfulPayloadBeforeLastError =
230247!params.runLevelError &&
231248lastErrorPayloadIndex > 0 &&
232-params.payloads
233-.slice(0, lastErrorPayloadIndex)
234-.some((payload) => payload?.isError !== true && Boolean(payload?.text?.trim()));
249+params.payloads.slice(0, lastErrorPayloadIndex).some(isSuccessfulCronPayload);
250+const lastErrorPayload =
251+lastErrorPayloadIndex >= 0 ? params.payloads[lastErrorPayloadIndex] : undefined;
252+const hasRecoveringTerminalOutput =
253+normalizedFinalAssistantVisibleText !== undefined ||
254+hasSuccessfulPayloadAfterLastError ||
255+hasSuccessfulPayloadBeforeLastError;
256+const hasNonTerminalToolErrorWarning =
257+!params.runLevelError &&
258+params.failureSignal?.fatalForCron !== true &&
259+hasRecoveringTerminalOutput &&
260+isNonTerminalToolErrorWarning(lastErrorPayload);
235261const hasPendingPresentationWarning =
236262!params.runLevelError &&
237263params.failureSignal?.fatalForCron !== true &&
238264lastErrorPayloadIndex >= 0 &&
239265isCronMessagePresentationWarning(lastErrorPayloadText) &&
240266(normalizedFinalAssistantVisibleText !== undefined || hasSuccessfulPayloadBeforeLastError);
241267const hasFatalStructuredErrorPayload =
242-hasErrorPayload && !hasSuccessfulPayloadAfterLastError && !hasPendingPresentationWarning;
268+hasErrorPayload &&
269+!hasSuccessfulPayloadAfterLastError &&
270+!hasPendingPresentationWarning &&
271+!hasNonTerminalToolErrorWarning;
243272const hasStructuredDeliveryPayloads = selectedDeliveryPayloads.some((payload) =>
244273payloadHasStructuredDeliveryContent(payload),
245274);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。