@@ -275,10 +275,11 @@ def _print_history_message(msg):
275275
276276
277277class _StreamPrinter :
278- """Handles streaming text_part events inline; delegates everything else ."""
278+ """Handles streaming text_part events inline; deduplicates work-log steps ."""
279279
280280 def __init__ (self ):
281281 self ._in_text = False
282+ self ._seen_steps : set [tuple [str , str ]] = set ()
282283
283284 def feed (self , event ):
284285 if event .type == S2CEvent .SESSION_TEXT_PART :
@@ -290,10 +291,35 @@ def feed(self, event):
290291 self ._in_text = True
291292 console .file .write (content )
292293 console .file .flush ()
294+ elif event .type in (S2CEvent .SESSION_WORK_LOG , S2CEvent .SESSION_WORK_LOG_PART ):
295+ self .flush ()
296+ self ._print_work_steps (event )
293297 else :
294298 self .flush ()
295299 _print_event (event )
296300
301+ def _print_work_steps (self , event ):
302+ data = event .data if isinstance (event .data , dict ) else {}
303+ if event .type == S2CEvent .SESSION_WORK_LOG :
304+ steps = data .get ("steps" , [])
305+ else :
306+ t = data .get ("step_title" , "" )
307+ steps = [{"step_title" : t , "status" : data .get ("status" , "" )}] if t else []
308+
309+ for step in steps :
310+ title = step .get ("step_title" , "" ).strip ()
311+ status = step .get ("status" , "" ).strip ()
312+ if not title :
313+ continue
314+ key = (title , status )
315+ if key in self ._seen_steps :
316+ continue
317+ self ._seen_steps .add (key )
318+ if status :
319+ console .print (f"[dim] ● { title } \\ [{ status } ][/dim]" )
320+ else :
321+ console .print (f"[dim] ● { title } [/dim]" )
322+
297323 def flush (self ):
298324 if self ._in_text :
299325 console .file .write ("\n " )
@@ -320,16 +346,3 @@ def _print_event(event):
320346 console .print (f"[dim] ● state → { state } [/dim]" )
321347 elif event .type == S2CEvent .SESSION_THINKING :
322348 console .print ("[dim] ● thinking…[/dim]" )
323- elif event .type == S2CEvent .SESSION_WORK_LOG :
324- data = event .data if isinstance (event .data , dict ) else {}
325- steps = data .get ("steps" , [])
326- for step in steps :
327- title = step .get ("step_title" , "" )
328- status = step .get ("status" , "" )
329- console .print (f"[dim] ● { title } \\ [{ status } ][/dim]" if status else f"[dim] ● { title } [/dim]" )
330- elif event .type == S2CEvent .SESSION_WORK_LOG_PART :
331- data = event .data if isinstance (event .data , dict ) else {}
332- title = data .get ("step_title" , "" )
333- status = data .get ("status" , "" )
334- if title or status :
335- console .print (f"[dim] ● { title } \\ [{ status } ][/dim]" if status else f"[dim] ● { title } [/dim]" )
0 commit comments