3636 "tok" : "TOK/S" ,
3737 "in" : "IN" ,
3838 "out" : "OUT" ,
39+ "turn" : "TURN" ,
3940 "model" : "MODEL" ,
4041 "effort" : "EFF" ,
4142 "perm" : "PERM" ,
@@ -309,6 +310,24 @@ def _format_token_total(value):
309310 return str (value )
310311
311312
313+ def _format_duration (seconds ):
314+ if seconds is None :
315+ return "-"
316+ if seconds < 0 :
317+ return "-"
318+ total = int (seconds )
319+ days , rem = divmod (total , 86400 )
320+ hours , rem = divmod (rem , 3600 )
321+ minutes , secs = divmod (rem , 60 )
322+ if days :
323+ return f"{ days } d{ hours :02d} h"
324+ if hours :
325+ return f"{ hours } h{ minutes :02d} m"
326+ if minutes :
327+ return f"{ minutes } m{ secs :02d} s"
328+ return f"{ secs } s"
329+
330+
312331def _summarize_session (path , mtime ):
313332 prompt = None
314333 prompt_fallback = None
@@ -569,13 +588,15 @@ def _layout_columns(width, id_width, show):
569588 ("tok" , ">" ),
570589 ("in" , ">" ),
571590 ("out" , ">" ),
591+ ("turn" , ">" ),
572592 ]
573593 widths = {
574594 "id" : id_width ,
575595 "status" : 4 ,
576596 "tok" : 7 ,
577597 "in" : 7 ,
578598 "out" : 7 ,
599+ "turn" : 7 ,
579600 }
580601 mins = {}
581602
@@ -638,6 +659,16 @@ def _format_session(session, layout):
638659 status = "RUN" if session .get ("status" ) == "running" else "IDLE"
639660 tok_s = session ["tok_s" ]
640661 tok_s_str = "-" if tok_s is None else f"{ tok_s :5.1f} "
662+ last_user_ts = session .get ("last_user_ts" )
663+ last_agent_ts = session .get ("last_agent_ts" )
664+ if status == "RUN" :
665+ turn_seconds = (datetime .now () - last_user_ts ).total_seconds () if last_user_ts else None
666+ else :
667+ if last_user_ts and last_agent_ts :
668+ turn_seconds = (last_agent_ts - last_user_ts ).total_seconds ()
669+ else :
670+ turn_seconds = None
671+ turn_str = _format_duration (turn_seconds )
641672 meta = session .get ("meta" ) or {}
642673 model = meta .get ("model" ) or meta .get ("model_provider" ) or "-"
643674 effort = meta .get ("effort" ) or "-"
@@ -655,6 +686,7 @@ def _format_session(session, layout):
655686 "tok" : tok_s_str ,
656687 "in" : total_in ,
657688 "out" : total_out ,
689+ "turn" : turn_str ,
658690 "model" : _truncate_head (str (model ), widths .get ("model" , 0 )),
659691 "effort" : _truncate_head (str (effort ), widths .get ("effort" , 0 )),
660692 "perm" : _truncate_head (str (perm ), widths .get ("perm" , 0 )),
0 commit comments