fix(cron): suppress fallback summary after attempted announce delivery

This commit is contained in:
Peter Steinberger
2026-02-26 03:07:27 +00:00
parent e16e8f5af2
commit b37dc42240
7 changed files with 108 additions and 11 deletions

View File

@@ -117,6 +117,7 @@ type DispatchCronDeliveryParams = {
export type DispatchCronDeliveryState = {
result?: RunCronAgentTurnResult;
delivered: boolean;
deliveryAttempted: boolean;
summary?: string;
outputText?: string;
synthesizedText?: string;
@@ -134,6 +135,7 @@ export async function dispatchCronDelivery(
// `true` means we confirmed at least one outbound send reached the target.
// Keep this strict so timer fallback can safely decide whether to wake main.
let delivered = params.skipMessagingToolDelivery;
let deliveryAttempted = params.skipMessagingToolDelivery;
const failDeliveryTarget = (error: string) =>
params.withRunSession({
status: "error",
@@ -141,6 +143,7 @@ export async function dispatchCronDelivery(
errorKind: "delivery-target",
summary,
outputText,
deliveryAttempted,
...params.telemetry,
});
@@ -162,9 +165,11 @@ export async function dispatchCronDelivery(
return params.withRunSession({
status: "error",
error: params.abortReason(),
deliveryAttempted,
...params.telemetry,
});
}
deliveryAttempted = true;
const deliveryResults = await deliverOutboundPayloads({
cfg: params.cfgWithAgentDefaults,
channel: delivery.channel,
@@ -187,6 +192,7 @@ export async function dispatchCronDelivery(
summary,
outputText,
error: String(err),
deliveryAttempted,
...params.telemetry,
});
}
@@ -277,9 +283,11 @@ export async function dispatchCronDelivery(
return params.withRunSession({
status: "error",
error: params.abortReason(),
deliveryAttempted,
...params.telemetry,
});
}
deliveryAttempted = true;
const didAnnounce = await runSubagentAnnounceFlow({
childSessionKey: params.agentSessionKey,
childRunId: `${params.job.id}:${params.runSessionId}:${params.runStartedAt}`,
@@ -315,6 +323,7 @@ export async function dispatchCronDelivery(
summary,
outputText,
error: message,
deliveryAttempted,
...params.telemetry,
});
}
@@ -327,6 +336,7 @@ export async function dispatchCronDelivery(
summary,
outputText,
error: String(err),
deliveryAttempted,
...params.telemetry,
});
}
@@ -345,6 +355,7 @@ export async function dispatchCronDelivery(
return {
result: failDeliveryTarget(params.resolvedDelivery.error.message),
delivered,
deliveryAttempted,
summary,
outputText,
synthesizedText,
@@ -357,9 +368,11 @@ export async function dispatchCronDelivery(
status: "ok",
summary,
outputText,
deliveryAttempted,
...params.telemetry,
}),
delivered,
deliveryAttempted,
summary,
outputText,
synthesizedText,
@@ -383,6 +396,7 @@ export async function dispatchCronDelivery(
return {
result: directResult,
delivered,
deliveryAttempted,
summary,
outputText,
synthesizedText,
@@ -395,6 +409,7 @@ export async function dispatchCronDelivery(
return {
result: announceResult,
delivered,
deliveryAttempted,
summary,
outputText,
synthesizedText,
@@ -406,6 +421,7 @@ export async function dispatchCronDelivery(
return {
delivered,
deliveryAttempted,
summary,
outputText,
synthesizedText,

View File

@@ -77,6 +77,12 @@ export type RunCronAgentTurnResult = {
* messages. See: https://github.com/openclaw/openclaw/issues/15692
*/
delivered?: boolean;
/**
* `true` when cron attempted announce/direct delivery for this run.
* This is tracked separately from `delivered` because some announce paths
* cannot guarantee a final delivery ack synchronously.
*/
deliveryAttempted?: boolean;
} & CronRunOutcome &
CronRunTelemetry;
@@ -565,7 +571,7 @@ export async function runCronIsolatedAgentTurn(params: {
const embeddedRunError = hasErrorPayload
? (lastErrorPayloadText ?? "cron isolated run returned an error payload")
: undefined;
const resolveRunOutcome = (params?: { delivered?: boolean }) =>
const resolveRunOutcome = (params?: { delivered?: boolean; deliveryAttempted?: boolean }) =>
withRunSession({
status: hasErrorPayload ? "error" : "ok",
...(hasErrorPayload
@@ -574,6 +580,7 @@ export async function runCronIsolatedAgentTurn(params: {
summary,
outputText,
delivered: params?.delivered,
deliveryAttempted: params?.deliveryAttempted,
...telemetry,
});
@@ -619,14 +626,23 @@ export async function runCronIsolatedAgentTurn(params: {
withRunSession,
});
if (deliveryResult.result) {
const resultWithDeliveryMeta: RunCronAgentTurnResult = {
...deliveryResult.result,
deliveryAttempted:
deliveryResult.result.deliveryAttempted ?? deliveryResult.deliveryAttempted,
};
if (!hasErrorPayload || deliveryResult.result.status !== "ok") {
return deliveryResult.result;
return resultWithDeliveryMeta;
}
return resolveRunOutcome({ delivered: deliveryResult.result.delivered });
return resolveRunOutcome({
delivered: deliveryResult.result.delivered,
deliveryAttempted: resultWithDeliveryMeta.deliveryAttempted,
});
}
const delivered = deliveryResult.delivered;
const deliveryAttempted = deliveryResult.deliveryAttempted;
summary = deliveryResult.summary;
outputText = deliveryResult.outputText;
return resolveRunOutcome({ delivered });
return resolveRunOutcome({ delivered, deliveryAttempted });
}