@@ -76,12 +76,12 @@ describe("agentLoop EventStream failures", () => {
7676} ) ;
7777
7878describe ( "agentLoop streaming updates" , ( ) => {
79- it ( "reuses the current assistant message for text deltas without partial snapshots" , async ( ) => {
79+ it ( "rebuilds assistant message snapshots for text deltas without partial snapshots" , async ( ) => {
8080 const streamFn : StreamFn = async ( ) => {
8181 const stream = createAssistantMessageEventStream ( ) ;
82- const message : AssistantMessage = {
82+ const startMessage : AssistantMessage = {
8383 role : "assistant" ,
84- content : [ { type : "text" , text : "" } ] ,
84+ content : [ ] ,
8585 api : model . api ,
8686 provider : model . provider ,
8787 model : model . id ,
@@ -96,17 +96,24 @@ describe("agentLoop streaming updates", () => {
9696 stopReason : "stop" ,
9797 timestamp : 1 ,
9898 } ;
99+ const textStartMessage : AssistantMessage = { ...startMessage , content : [ ] } ;
100+ const finalMessage : AssistantMessage = {
101+ ...startMessage ,
102+ content : [ { type : "text" , text : "Hello world" } ] ,
103+ } ;
99104
100105 queueMicrotask ( ( ) => {
101- stream . push ( { type : "start" , partial : message } ) ;
102- stream . push ( { type : "text_start" , contentIndex : 0 , partial : message } ) ;
103- const textBlock = message . content [ 0 ] ;
104- if ( textBlock ?. type === "text" ) {
105- textBlock . text = "Hello" ;
106- }
106+ stream . push ( { type : "start" , partial : startMessage } ) ;
107+ stream . push ( { type : "text_start" , contentIndex : 0 , partial : textStartMessage } ) ;
107108 stream . push ( { type : "text_delta" , contentIndex : 0 , delta : "Hello" } ) ;
108- stream . push ( { type : "text_end" , contentIndex : 0 , content : "Hello" , partial : message } ) ;
109- stream . push ( { type : "done" , reason : "stop" , message } ) ;
109+ stream . push ( { type : "text_delta" , contentIndex : 0 , delta : " world" } ) ;
110+ stream . push ( {
111+ type : "text_end" ,
112+ contentIndex : 0 ,
113+ content : "Hello world" ,
114+ partial : finalMessage ,
115+ } ) ;
116+ stream . push ( { type : "done" , reason : "stop" , message : finalMessage } ) ;
110117 } ) ;
111118
112119 return stream ;
@@ -121,15 +128,17 @@ describe("agentLoop streaming updates", () => {
121128 ) ;
122129 const events = await collectEvents ( stream ) ;
123130
124- const deltaUpdate = events . find (
131+ const deltaUpdates = events . filter (
125132 ( event ) : event is Extract < AgentEvent , { type : "message_update" } > =>
126133 event . type === "message_update" && event . assistantMessageEvent . type === "text_delta" ,
127134 ) ;
128- expect ( deltaUpdate ) . toMatchObject ( {
129- type : "message_update" ,
130- message : { role : "assistant" , content : [ { type : "text" , text : "Hello" } ] } ,
131- assistantMessageEvent : { type : "text_delta" , delta : "Hello" } ,
132- } ) ;
133- expect ( deltaUpdate ?. assistantMessageEvent ) . not . toHaveProperty ( "partial" ) ;
135+ expect ( deltaUpdates ) . toHaveLength ( 2 ) ;
136+ expect ( deltaUpdates . map ( ( event ) => event . message ) ) . toMatchObject ( [
137+ { role : "assistant" , content : [ { type : "text" , text : "Hello" } ] } ,
138+ { role : "assistant" , content : [ { type : "text" , text : "Hello world" } ] } ,
139+ ] ) ;
140+ for ( const update of deltaUpdates ) {
141+ expect ( update . assistantMessageEvent ) . not . toHaveProperty ( "partial" ) ;
142+ }
134143 } ) ;
135144} ) ;
0 commit comments