88import { makeAttemptResult } from "./run.overflow-compaction.fixture.js" ;
99import {
1010 loadRunOverflowCompactionHarness ,
11+ mockedBuildEmbeddedRunPayloads ,
1112 mockedClassifyFailoverReason ,
1213 mockedGlobalHookRunner ,
1314 mockedIsFailoverAssistantError ,
@@ -554,17 +555,19 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
554555 mockedClassifyFailoverReason . mockReturnValue ( null ) ;
555556 const finalText =
556557 "1. Verdict: the answer completed cleanly. 2. Evidence: the runner captured final text." ;
558+ const finalAssistant = {
559+ role : "assistant" ,
560+ stopReason : "stop" ,
561+ provider : "openai" ,
562+ model : "gpt-5.5" ,
563+ content : [ { type : "text" , text : finalText } ] ,
564+ } as unknown as NonNullable < EmbeddedRunAttemptResult [ "currentAttemptAssistant" ] > ;
557565 mockedRunEmbeddedAttempt . mockResolvedValueOnce (
558566 makeAttemptResult ( {
559567 assistantTexts : [ ] ,
560568 timedOut : true ,
561- lastAssistant : {
562- role : "assistant" ,
563- stopReason : "stop" ,
564- provider : "openai" ,
565- model : "gpt-5.5" ,
566- content : [ { type : "text" , text : finalText } ] ,
567- } as unknown as EmbeddedRunAttemptResult [ "lastAssistant" ] ,
569+ lastAssistant : finalAssistant ,
570+ currentAttemptAssistant : finalAssistant ,
568571 } ) ,
569572 ) ;
570573
@@ -617,16 +620,18 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
617620 currentAttemptAssistant : rateLimitAssistant ,
618621 } ) ,
619622 ) ;
623+ const recoveredAssistant = {
624+ role : "assistant" ,
625+ stopReason : "stop" ,
626+ provider : "openai" ,
627+ model : "gpt-5.5" ,
628+ content : [ { type : "text" , text : "Recovered after a short rate-limit wait." } ] ,
629+ } as unknown as NonNullable < EmbeddedRunAttemptResult [ "currentAttemptAssistant" ] > ;
620630 mockedRunEmbeddedAttempt . mockResolvedValueOnce (
621631 makeAttemptResult ( {
622632 assistantTexts : [ "Recovered after a short rate-limit wait." ] ,
623- lastAssistant : {
624- role : "assistant" ,
625- stopReason : "stop" ,
626- provider : "openai" ,
627- model : "gpt-5.5" ,
628- content : [ { type : "text" , text : "Recovered after a short rate-limit wait." } ] ,
629- } as unknown as EmbeddedRunAttemptResult [ "lastAssistant" ] ,
633+ lastAssistant : recoveredAssistant ,
634+ currentAttemptAssistant : recoveredAssistant ,
630635 } ) ,
631636 ) ;
632637
@@ -969,16 +974,18 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
969974 currentAttemptAssistant : undefined ,
970975 } ) ,
971976 ) ;
977+ const recoveredAssistant = {
978+ role : "assistant" ,
979+ stopReason : "end_turn" ,
980+ provider : "openai" ,
981+ model : "gpt-5.5" ,
982+ content : [ { type : "text" , text : "Recovered answer." } ] ,
983+ } as unknown as NonNullable < EmbeddedRunAttemptResult [ "currentAttemptAssistant" ] > ;
972984 mockedRunEmbeddedAttempt . mockResolvedValueOnce (
973985 makeAttemptResult ( {
974986 assistantTexts : [ "Recovered answer." ] ,
975- lastAssistant : {
976- role : "assistant" ,
977- stopReason : "end_turn" ,
978- provider : "openai" ,
979- model : "gpt-5.5" ,
980- content : [ { type : "text" , text : "Recovered answer." } ] ,
981- } as unknown as EmbeddedRunAttemptResult [ "lastAssistant" ] ,
987+ lastAssistant : recoveredAssistant ,
988+ currentAttemptAssistant : recoveredAssistant ,
982989 } ) ,
983990 ) ;
984991
@@ -1734,6 +1741,7 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
17341741 it ( "delivers the current final answer when the session assistant is stale (#80918)" , async ( ) => {
17351742 mockedClassifyFailoverReason . mockReturnValue ( null ) ;
17361743 const finalText = "The requested update is complete." ;
1744+ mockedBuildEmbeddedRunPayloads . mockReturnValueOnce ( [ { text : finalText } ] ) ;
17371745 mockedRunEmbeddedAttempt . mockResolvedValueOnce (
17381746 makeAttemptResult ( {
17391747 assistantTexts : [ finalText ] ,
@@ -1744,13 +1752,15 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
17441752 provider : "openai" ,
17451753 model : "gpt-5.5" ,
17461754 content : [ { type : "tool_use" , id : "tool_1" , name : "update_plan" , input : { } } ] ,
1755+ usage : { input : 100 , output : 5 , total : 105 } ,
17471756 } as unknown as EmbeddedRunAttemptResult [ "lastAssistant" ] ,
17481757 currentAttemptAssistant : {
17491758 role : "assistant" ,
17501759 stopReason : "stop" ,
17511760 provider : "openai" ,
17521761 model : "gpt-5.5" ,
17531762 content : [ { type : "text" , text : finalText } ] ,
1763+ usage : { input : 200 , output : 20 , total : 220 } ,
17541764 } as unknown as EmbeddedRunAttemptResult [ "currentAttemptAssistant" ] ,
17551765 } ) ,
17561766 ) ;
@@ -1763,8 +1773,22 @@ describe("runEmbeddedAgent incomplete-turn safety", () => {
17631773 } ) ;
17641774
17651775 expect ( result . payloads ) . toEqual ( [ { text : finalText } ] ) ;
1776+ expect ( mockedBuildEmbeddedRunPayloads ) . toHaveBeenCalledWith (
1777+ expect . objectContaining ( {
1778+ currentAssistant : expect . objectContaining ( {
1779+ stopReason : "stop" ,
1780+ content : [ { type : "text" , text : finalText } ] ,
1781+ } ) ,
1782+ lastAssistant : expect . objectContaining ( { stopReason : "toolUse" } ) ,
1783+ } ) ,
1784+ ) ;
17661785 expect ( result . meta . finalAssistantVisibleText ) . toBe ( finalText ) ;
17671786 expect ( result . meta . stopReason ) . toBe ( "stop" ) ;
1787+ expect ( result . meta . agentMeta ?. lastCallUsage ) . toMatchObject ( {
1788+ input : 200 ,
1789+ output : 20 ,
1790+ total : 220 ,
1791+ } ) ;
17681792 expectNoWarnMessageWith ( "incomplete turn detected" ) ;
17691793 } ) ;
17701794
0 commit comments