@@ -383,9 +383,11 @@ describe("agent event handler", () => {
383383 expect ( chatCalls ) . toHaveLength ( 1 ) ;
384384 const payload = chatCalls [ 0 ] ?. [ 1 ] as {
385385 state ?: string ;
386+ deltaText ?: string ;
386387 message ?: { content ?: Array < { text ?: string } > } ;
387388 } ;
388389 expect ( payload . state ) . toBe ( "delta" ) ;
390+ expect ( payload . deltaText ) . toBe ( "Hello world" ) ;
389391 expect ( payload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Hello world" ) ;
390392 expect ( sessionChatCalls ( nodeSendToSession ) ) . toHaveLength ( 1 ) ;
391393 nowSpy ?. mockRestore ( ) ;
@@ -619,14 +621,17 @@ describe("agent event handler", () => {
619621
620622 const chatCalls = chatBroadcastCalls ( broadcast ) ;
621623 expect ( chatCalls ) . toHaveLength ( 3 ) ;
622- const firstPayload = chatCalls [ 0 ] ?. [ 1 ] as { state ?: string } ;
624+ const firstPayload = chatCalls [ 0 ] ?. [ 1 ] as { state ?: string ; deltaText ?: string } ;
623625 const secondPayload = chatCalls [ 1 ] ?. [ 1 ] as {
624626 state ?: string ;
627+ deltaText ?: string ;
625628 message ?: { content ?: Array < { text ?: string } > } ;
626629 } ;
627630 const thirdPayload = chatCalls [ 2 ] ?. [ 1 ] as { state ?: string } ;
628631 expect ( firstPayload . state ) . toBe ( "delta" ) ;
632+ expect ( firstPayload . deltaText ) . toBe ( "Hello" ) ;
629633 expect ( secondPayload . state ) . toBe ( "delta" ) ;
634+ expect ( secondPayload . deltaText ) . toBe ( " world" ) ;
630635 expect ( secondPayload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Hello world" ) ;
631636 expect ( thirdPayload . state ) . toBe ( "final" ) ;
632637 expect ( sessionChatCalls ( nodeSendToSession ) ) . toHaveLength ( 3 ) ;
@@ -665,13 +670,15 @@ describe("agent event handler", () => {
665670 expect ( chatCalls ) . toHaveLength ( 3 ) ;
666671 const secondPayload = chatCalls [ 1 ] ?. [ 1 ] as {
667672 state ?: string ;
673+ deltaText ?: string ;
668674 message ?: { content ?: Array < { text ?: string } > } ;
669675 } ;
670676 const finalPayload = chatCalls [ 2 ] ?. [ 1 ] as {
671677 state ?: string ;
672678 message ?: { content ?: Array < { text ?: string } > } ;
673679 } ;
674680 expect ( secondPayload . state ) . toBe ( "delta" ) ;
681+ expect ( secondPayload . deltaText ) . toBe ( "\nAfter tool call" ) ;
675682 expect ( secondPayload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Before tool call\nAfter tool call" ) ;
676683 expect ( finalPayload . state ) . toBe ( "final" ) ;
677684 expect ( finalPayload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Before tool call\nAfter tool call" ) ;
@@ -711,13 +718,15 @@ describe("agent event handler", () => {
711718 expect ( chatCalls ) . toHaveLength ( 3 ) ;
712719 const flushPayload = chatCalls [ 1 ] ?. [ 1 ] as {
713720 state ?: string ;
721+ deltaText ?: string ;
714722 message ?: { content ?: Array < { text ?: string } > } ;
715723 } ;
716724 const finalPayload = chatCalls [ 2 ] ?. [ 1 ] as {
717725 state ?: string ;
718726 message ?: { content ?: Array < { text ?: string } > } ;
719727 } ;
720728 expect ( flushPayload . state ) . toBe ( "delta" ) ;
729+ expect ( flushPayload . deltaText ) . toBe ( "\nAfter tool call" ) ;
721730 expect ( flushPayload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Before tool call\nAfter tool call" ) ;
722731 expect ( finalPayload . state ) . toBe ( "final" ) ;
723732 expect ( finalPayload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Before tool call\nAfter tool call" ) ;
@@ -764,6 +773,46 @@ describe("agent event handler", () => {
764773 nowSpy . mockRestore ( ) ;
765774 } ) ;
766775
776+ it ( "omits deltaText when a non-prefix replacement is broadcast" , ( ) => {
777+ let now = 11_300 ;
778+ const nowSpy = vi . spyOn ( Date , "now" ) . mockImplementation ( ( ) => now ) ;
779+ const { broadcast, nodeSendToSession, chatRunState, handler } = createHarness ( ) ;
780+ chatRunState . registry . add ( "run-replacement" , {
781+ sessionKey : "session-replacement" ,
782+ clientRunId : "client-replacement" ,
783+ } ) ;
784+
785+ handler ( {
786+ runId : "run-replacement" ,
787+ seq : 1 ,
788+ stream : "assistant" ,
789+ ts : Date . now ( ) ,
790+ data : { text : "Hello world" } ,
791+ } ) ;
792+
793+ now = 11_500 ;
794+ handler ( {
795+ runId : "run-replacement" ,
796+ seq : 2 ,
797+ stream : "assistant" ,
798+ ts : Date . now ( ) ,
799+ data : { text : "Goodbye world" } ,
800+ } ) ;
801+
802+ const chatCalls = chatBroadcastCalls ( broadcast ) ;
803+ expect ( chatCalls ) . toHaveLength ( 2 ) ;
804+ const firstPayload = chatCalls [ 0 ] ?. [ 1 ] as { deltaText ?: string } ;
805+ const replacementPayload = chatCalls [ 1 ] ?. [ 1 ] as {
806+ deltaText ?: string ;
807+ message ?: { content ?: Array < { text ?: string } > } ;
808+ } ;
809+ expect ( firstPayload . deltaText ) . toBe ( "Hello world" ) ;
810+ expect ( replacementPayload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Goodbye world" ) ;
811+ expect ( replacementPayload . deltaText ) . toBeUndefined ( ) ;
812+ expect ( sessionChatCalls ( nodeSendToSession ) ) . toHaveLength ( 2 ) ;
813+ nowSpy . mockRestore ( ) ;
814+ } ) ;
815+
767816 it ( "cleans up agent run sequence tracking when lifecycle completes" , ( ) => {
768817 const { agentRunSeq, chatRunState, handler, nowSpy } = createHarness ( { now : 2_500 } ) ;
769818 chatRunState . registry . add ( "run-cleanup" , {
@@ -887,9 +936,11 @@ describe("agent event handler", () => {
887936 expect ( chatCalls ) . toHaveLength ( 2 ) ;
888937 const flushedPayload = chatCalls [ 1 ] ?. [ 1 ] as {
889938 state ?: string ;
939+ deltaText ?: string ;
890940 message ?: { content ?: Array < { text ?: string } > } ;
891941 } ;
892942 expect ( flushedPayload . state ) . toBe ( "delta" ) ;
943+ expect ( flushedPayload . deltaText ) . toBe ( " expanded" ) ;
893944 expect ( flushedPayload . message ?. content ?. [ 0 ] ?. text ) . toBe ( "Before tool expanded" ) ;
894945 expect ( sessionChatCalls ( nodeSendToSession ) ) . toHaveLength ( 2 ) ;
895946
0 commit comments