@@ -82,3 +82,63 @@ describe("runtimeEventToActivities task progress", () => {
8282 expect ( usagePayload ) . not . toHaveProperty ( "status" ) ;
8383 } ) ;
8484} ) ;
85+ describe ( "runtimeEventToActivities tool streaming persistence" , ( ) => {
86+ const accumulatedStdout = [
87+ "first line of output" ,
88+ ...Array . from ( { length : 500 } , ( _ , index ) => `Capturing frame ${ index } /9028` ) ,
89+ ] . join ( "\n" ) ;
90+ const streamingData = {
91+ toolCallId : "tool-call-1" ,
92+ kind : "execute" ,
93+ command : "blender --render" ,
94+ rawOutput : { stdout : accumulatedStdout } ,
95+ content : [ { type : "content" , content : { type : "text" , text : accumulatedStdout } } ] ,
96+ } ;
97+
98+ it ( "persists tool.updated with the wire projection of data, not the accumulated stream" , ( ) => {
99+ const event = {
100+ ...base ,
101+ type : "item.updated" ,
102+ eventId : EventId . make ( "evt-tool-streaming-updated" ) ,
103+ payload : {
104+ itemType : "command_execution" ,
105+ status : "inProgress" ,
106+ title : "Render" ,
107+ detail : accumulatedStdout ,
108+ data : streamingData ,
109+ } ,
110+ } satisfies ProviderRuntimeEvent ;
111+
112+ const activities = runtimeEventToActivities ( event ) ;
113+
114+ expect ( activities ) . toHaveLength ( 1 ) ;
115+ const payload = activities [ 0 ] ?. payload as Record < string , unknown > ;
116+ const data = payload . data as Record < string , unknown > ;
117+ expect ( payload . status ) . toBe ( "inProgress" ) ;
118+ expect ( data . toolCallId ) . toBe ( "tool-call-1" ) ;
119+ expect ( data . command ) . toBe ( "blender --render" ) ;
120+ expect ( data . rawOutput ) . toEqual ( { content : "first line of output" } ) ;
121+ expect ( data . content ) . toBeUndefined ( ) ;
122+ expect ( JSON . stringify ( data ) . length ) . toBeLessThan ( 1_000 ) ;
123+ } ) ;
124+
125+ it ( "persists the full terminal payload on tool.completed" , ( ) => {
126+ const event = {
127+ ...base ,
128+ type : "item.completed" ,
129+ eventId : EventId . make ( "evt-tool-streaming-completed" ) ,
130+ payload : {
131+ itemType : "command_execution" ,
132+ status : "completed" ,
133+ title : "Render" ,
134+ data : streamingData ,
135+ } ,
136+ } satisfies ProviderRuntimeEvent ;
137+
138+ const activities = runtimeEventToActivities ( event ) ;
139+
140+ expect ( activities ) . toHaveLength ( 1 ) ;
141+ const payload = activities [ 0 ] ?. payload as Record < string , unknown > ;
142+ expect ( payload . data ) . toEqual ( streamingData ) ;
143+ } ) ;
144+ } ) ;
0 commit comments