@@ -17,8 +17,9 @@ use crate::widgets::{HintContext, KeyHints, StatusIndicator};
1717
1818use super :: layout:: LayoutManager ;
1919use super :: rendering:: {
20- _render_motd, generate_message_lines, generate_welcome_lines, render_message,
21- render_scroll_to_bottom_hint, render_scrollbar, render_subagent, render_tool_call,
20+ _render_motd, generate_message_lines, generate_welcome_lines, render_main_agent_todos,
21+ render_message, render_scroll_to_bottom_hint, render_scrollbar, render_subagent,
22+ render_tool_call,
2223} ;
2324
2425// Re-export for convenience
@@ -572,6 +573,14 @@ impl<'a> Widget for MinimalSessionView<'a> {
572573 let input_height: u16 = 3 ;
573574 let hints_height: u16 = 1 ;
574575
576+ // Calculate main agent todos height (header + items + spacing)
577+ let main_todos_height: u16 = if self . app_state . has_main_todos ( ) {
578+ // 1 for header + number of todos + 1 for spacing
579+ ( self . app_state . main_agent_todos . len ( ) as u16 ) + 2
580+ } else {
581+ 0
582+ } ;
583+
575584 // Calculate welcome card heights from render_motd constants
576585 let welcome_card_height = 11_u16 ;
577586 let info_cards_height = 4_u16 ;
@@ -584,7 +593,12 @@ impl<'a> Widget for MinimalSessionView<'a> {
584593 layout. gap ( 1 ) ;
585594
586595 // Calculate available height for scrollable content (before input/hints)
587- let bottom_reserved = status_height + input_height + autocomplete_height + hints_height + 2 ; // +2 for gaps
596+ let bottom_reserved = main_todos_height
597+ + status_height
598+ + input_height
599+ + autocomplete_height
600+ + hints_height
601+ + 2 ; // +2 for gaps
588602 let available_height = area. height . saturating_sub ( 1 + bottom_reserved) ; // 1 for top margin
589603
590604 // Render scrollable content area (welcome cards + messages together)
@@ -596,7 +610,17 @@ impl<'a> Widget for MinimalSessionView<'a> {
596610 let content_end_y = content_area. y + actual_content_height;
597611 let mut next_y = content_end_y + 1 ; // +1 gap after content
598612
599- // 5. Status indicator (if task running) - follows content
613+ // 4.5. Main agent todos (if any) - above status indicator
614+ if self . app_state . has_main_todos ( ) {
615+ let todo_lines =
616+ render_main_agent_todos ( & self . app_state . main_agent_todos , area. width , & self . colors ) ;
617+ let todo_area = Rect :: new ( area. x , next_y, area. width , main_todos_height) ;
618+ let paragraph = Paragraph :: new ( todo_lines) ;
619+ paragraph. render ( todo_area, buf) ;
620+ next_y += main_todos_height;
621+ }
622+
623+ // 5. Status indicator (if task running) - follows todos (or content if no todos)
600624 if is_task_running {
601625 let status_area = Rect :: new ( area. x , next_y, area. width , status_height) ;
602626 let header = self . status_header ( ) ;
@@ -608,7 +632,7 @@ impl<'a> Widget for MinimalSessionView<'a> {
608632 next_y += status_height;
609633 }
610634
611- // 6. Input area - follows status (or content if no status)
635+ // 6. Input area - follows status (or todos/ content if no status)
612636 let input_y = next_y;
613637 let input_area = Rect :: new ( area. x , input_y, area. width , input_height) ;
614638
0 commit comments