@@ -98,28 +98,30 @@ export const createLLMEventPublisher = (events: EventV2.Interface, input: Input)
9898
9999 const fragments = (
100100 name : string ,
101- ended : ( id : string , value : string , state ?: Record < string , unknown > ) => Effect . Effect < void > ,
101+ ended : ( id : string , value : string , ordinal : number , state ?: Record < string , unknown > ) => Effect . Effect < void > ,
102102 single = false ,
103103 ) => {
104- const chunks = new Map < string , string [ ] > ( )
104+ const chunks = new Map < string , { readonly ordinal : number ; readonly values : string [ ] } > ( )
105+ let nextOrdinal = 0
105106 const start = ( id : string ) =>
106107 Effect . suspend ( ( ) => {
107108 if ( chunks . has ( id ) ) return Effect . die ( new Error ( `Duplicate ${ name } start: ${ id } ` ) )
108109 if ( single && chunks . size > 0 ) return Effect . die ( new Error ( `${ name } start before end: ${ id } ` ) )
109- chunks . set ( id , [ ] )
110- return Effect . void
110+ const ordinal = nextOrdinal ++
111+ chunks . set ( id , { ordinal, values : [ ] } )
112+ return Effect . succeed ( ordinal )
111113 } )
112114 const append = ( id : string , value : string ) =>
113115 Effect . suspend ( ( ) => {
114116 const current = chunks . get ( id )
115117 if ( ! current ) return Effect . die ( new Error ( `${ name } delta before start: ${ id } ` ) )
116- current . push ( value )
117- return Effect . void
118+ current . values . push ( value )
119+ return Effect . succeed ( current . ordinal )
118120 } )
119121 const end = Effect . fnUntraced ( function * ( id : string , state ?: Record < string , unknown > ) {
120122 const current = chunks . get ( id )
121123 if ( ! current ) return yield * Effect . die ( new Error ( `${ name } end before start: ${ id } ` ) )
122- yield * ended ( id , current . join ( "" ) , state )
124+ yield * ended ( id , current . values . join ( "" ) , current . ordinal , state )
123125 chunks . delete ( id )
124126 } )
125127 const flush = Effect . fnUntraced ( function * ( ) {
@@ -130,23 +132,25 @@ export const createLLMEventPublisher = (events: EventV2.Interface, input: Input)
130132
131133 const text = fragments (
132134 "text" ,
133- ( _textID , value ) =>
135+ ( _textID , value , ordinal ) =>
134136 Effect . gen ( function * ( ) {
135137 yield * events . publish ( SessionEvent . Text . Ended , {
136138 sessionID : input . sessionID ,
137139 assistantMessageID : yield * currentAssistantMessageID ( ) ,
140+ ordinal,
138141 text : value ,
139142 } )
140143 } ) ,
141144 true ,
142145 )
143146 const reasoning = fragments (
144147 "reasoning" ,
145- ( _reasoningID , value , state ) =>
148+ ( _reasoningID , value , ordinal , state ) =>
146149 Effect . gen ( function * ( ) {
147150 yield * events . publish ( SessionEvent . Reasoning . Ended , {
148151 sessionID : input . sessionID ,
149152 assistantMessageID : yield * currentAssistantMessageID ( ) ,
153+ ordinal,
150154 text : value ,
151155 state,
152156 } )
@@ -259,17 +263,19 @@ export const createLLMEventPublisher = (events: EventV2.Interface, input: Input)
259263 return
260264 case "text-start" :
261265 retryEvidence = true
262- yield * text . start ( event . id )
266+ const startedTextOrdinal = yield * text . start ( event . id )
263267 yield * events . publish ( SessionEvent . Text . Started , {
264268 sessionID : input . sessionID ,
265269 assistantMessageID : yield * startAssistant ( ) ,
270+ ordinal : startedTextOrdinal ,
266271 } )
267272 return
268273 case "text-delta" :
269- yield * text . append ( event . id , event . text )
274+ const deltaTextOrdinal = yield * text . append ( event . id , event . text )
270275 yield * events . publish ( SessionEvent . Text . Delta , {
271276 sessionID : input . sessionID ,
272277 assistantMessageID : yield * currentAssistantMessageID ( ) ,
278+ ordinal : deltaTextOrdinal ,
273279 delta : event . text ,
274280 } )
275281 return
@@ -278,18 +284,20 @@ export const createLLMEventPublisher = (events: EventV2.Interface, input: Input)
278284 return
279285 case "reasoning-start" :
280286 retryEvidence = true
281- yield * reasoning . start ( event . id )
287+ const startedReasoningOrdinal = yield * reasoning . start ( event . id )
282288 yield * events . publish ( SessionEvent . Reasoning . Started , {
283289 sessionID : input . sessionID ,
284290 assistantMessageID : yield * startAssistant ( ) ,
291+ ordinal : startedReasoningOrdinal ,
285292 state : providerState ( event . providerMetadata ) ,
286293 } )
287294 return
288295 case "reasoning-delta" :
289- yield * reasoning . append ( event . id , event . text )
296+ const deltaReasoningOrdinal = yield * reasoning . append ( event . id , event . text )
290297 yield * events . publish ( SessionEvent . Reasoning . Delta , {
291298 sessionID : input . sessionID ,
292299 assistantMessageID : yield * currentAssistantMessageID ( ) ,
300+ ordinal : deltaReasoningOrdinal ,
293301 delta : event . text ,
294302 } )
295303 return
0 commit comments