@@ -18,6 +18,11 @@ export type CronPayloadOutcome = {
1818 deliveryPayloads : DeliveryPayload [ ] ;
1919 deliveryPayloadHasStructuredContent : boolean ;
2020 hasFatalErrorPayload : boolean ;
21+ errorPayloadRecovery : {
22+ hadErrorPayload : boolean ;
23+ recovered : boolean ;
24+ recoveredBy ?: "laterPayload" | "terminalAssistantText" | "presentationWarning" ;
25+ } ;
2126 embeddedRunError ?: string ;
2227 pendingPresentationWarningError ?: string ;
2328} ;
@@ -274,29 +279,61 @@ export function resolveCronPayloadOutcome(params: {
274279 const normalizedFinalAssistantVisibleText = normalizeOptionalString (
275280 params . finalAssistantVisibleText ,
276281 ) ;
282+ const failureSignal = normalizeCronFailureSignal ( params . failureSignal ) ;
283+ const runLevelError = formatCronRunLevelError ( params . runLevelError ) ;
284+ const hasStructuredDeliveryPayloads = selectedDeliveryPayloads . some ( ( payload ) =>
285+ payloadHasStructuredDeliveryContent ( payload ) ,
286+ ) ;
277287 const hasSuccessfulPayloadAfterLastError =
278- ! params . runLevelError &&
288+ ! runLevelError &&
279289 lastErrorPayloadIndex >= 0 &&
280290 params . payloads
281291 . slice ( lastErrorPayloadIndex + 1 )
282292 . some ( ( payload ) => payload ?. isError !== true && Boolean ( payload ?. text ?. trim ( ) ) ) ;
283293 const hasSuccessfulPayloadBeforeLastError =
284- ! params . runLevelError &&
294+ ! runLevelError &&
285295 lastErrorPayloadIndex > 0 &&
286296 params . payloads
287297 . slice ( 0 , lastErrorPayloadIndex )
288298 . some ( ( payload ) => payload ?. isError !== true && Boolean ( payload ?. text ?. trim ( ) ) ) ;
289299 const hasPendingPresentationWarning =
290- ! params . runLevelError &&
291- params . failureSignal ?. fatalForCron !== true &&
300+ ! runLevelError &&
301+ failureSignal === undefined &&
292302 lastErrorPayloadIndex >= 0 &&
293303 isCronMessagePresentationWarning ( lastErrorPayloadText ) &&
294304 ( normalizedFinalAssistantVisibleText !== undefined || hasSuccessfulPayloadBeforeLastError ) ;
305+ const hasTerminalAssistantRecovery =
306+ ! runLevelError &&
307+ failureSignal === undefined &&
308+ params . preferFinalAssistantVisibleText === true &&
309+ normalizedFinalAssistantVisibleText !== undefined &&
310+ detectCronDenialToken ( normalizedFinalAssistantVisibleText ) === undefined &&
311+ ! hasStructuredDeliveryPayloads &&
312+ lastErrorPayloadIndex >= 0 &&
313+ ! hasSuccessfulPayloadAfterLastError &&
314+ ( ! hasSuccessfulPayloadBeforeLastError ||
315+ normalizedFinalAssistantVisibleText !== fallbackOutputText ) ;
295316 const hasFatalStructuredErrorPayload =
296- hasErrorPayload && ! hasSuccessfulPayloadAfterLastError && ! hasPendingPresentationWarning ;
297- const hasStructuredDeliveryPayloads = selectedDeliveryPayloads . some ( ( payload ) =>
298- payloadHasStructuredDeliveryContent ( payload ) ,
299- ) ;
317+ hasErrorPayload &&
318+ ! hasSuccessfulPayloadAfterLastError &&
319+ ! hasPendingPresentationWarning &&
320+ ! hasTerminalAssistantRecovery ;
321+ const errorPayloadRecoveredBy = hasSuccessfulPayloadAfterLastError
322+ ? ( "laterPayload" as const )
323+ : hasPendingPresentationWarning
324+ ? ( "presentationWarning" as const )
325+ : hasTerminalAssistantRecovery
326+ ? ( "terminalAssistantText" as const )
327+ : undefined ;
328+ const errorPayloadRecovery = {
329+ hadErrorPayload : hasErrorPayload ,
330+ recovered :
331+ hasErrorPayload &&
332+ ( hasSuccessfulPayloadAfterLastError ||
333+ hasPendingPresentationWarning ||
334+ hasTerminalAssistantRecovery ) ,
335+ ...( errorPayloadRecoveredBy ? { recoveredBy : errorPayloadRecoveredBy } : { } ) ,
336+ } ;
300337 // Keep structured/media announce payloads intact. Only collapse purely textual
301338 // cron announce output to the final assistant-visible answer.
302339 const shouldUseFinalAssistantVisibleText =
@@ -329,8 +366,6 @@ export function resolveCronPayloadOutcome(params: {
329366 text : payload ?. text ,
330367 } ) ) ,
331368 ] ) ;
332- const failureSignal = normalizeCronFailureSignal ( params . failureSignal ) ;
333- const runLevelError = formatCronRunLevelError ( params . runLevelError ) ;
334369 const hasFatalErrorPayload =
335370 hasFatalStructuredErrorPayload ||
336371 failureSignal !== undefined ||
@@ -361,6 +396,7 @@ export function resolveCronPayloadOutcome(params: {
361396 ? false
362397 : deliveryPayloadHasStructuredContent ,
363398 hasFatalErrorPayload,
399+ errorPayloadRecovery,
364400 embeddedRunError : structuredErrorText
365401 ? structuredErrorText
366402 : failureSignal
0 commit comments