diff --git a/src/gui_2.py b/src/gui_2.py index a0cecbc7..61c423d8 100644 --- a/src/gui_2.py +++ b/src/gui_2.py @@ -5890,6 +5890,12 @@ def render_heavy_text(app: App, label: str, content: str, id_suffix: str = "") - def render_mma_dashboard(app: App) -> None: """ Main MMA dashboard interface. + + State Mutations: + None directly. + + SSDL Shape: + `[I:focus_selector] -> [I:track_summary] -> [B:epic_planner] -> [I:track_browser] -> [B:global_controls] -> [I:usage_analytics] -> [I:ticket_queue] -> [I:task_dag] => [I:agent_streams]` """ if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_mma_dashboard") render_mma_focus_selector(app) @@ -6024,6 +6030,15 @@ def render_mma_track_summary(app: App) -> None: imgui.text_colored(C_LBL(), "ETA:"); imgui.same_line(); imgui.text_colored(C_VAL(), f"~{int(eta_mins)}m ({remaining} tickets remaining)") def render_mma_epic_planner(app: App) -> None: + """ + Renders the Epic Planning panel for Tier 1 strategy input and planning button. + + State Mutations: + app.ui_epic_input (text input) + + SSDL Shape: + `[I:input_textbox] => [B:plan_button]` + """ imgui.text_colored(C_LBL(), 'Epic Planning (Tier 1)') _, app.ui_epic_input = imgui.input_text_multiline('##epic_input', app.ui_epic_input, imgui.ImVec2(-1, 80)) if imgui.button('Plan Epic (Tier 1)', imgui.ImVec2(-1, 0)): app._cb_plan_epic() @@ -6130,6 +6145,17 @@ def render_mma_usage_section(app: App) -> None: imgui.pop_item_width() def render_mma_ticket_editor(app: App) -> None: + """ + Renders the ticket detail editor panel, letting the user modify priority, target, + and persona override, mark a ticket complete, or delete it. + + State Mutations: + app.active_tickets (modifies status/priority/override fields via app._push_mma_state_update) + app.ui_selected_ticket_id + + SSDL Shape: + `[I:ticket_details] -> [B:combo_selectors] => [B:action_buttons]` + """ imgui.separator(); imgui.text_colored(C_VAL(), f"Editing: {app.ui_selected_ticket_id}") ticket = next((t for t in app.active_tickets if str(t.get('id', '')) == app.ui_selected_ticket_id), None) if ticket: @@ -6150,6 +6176,15 @@ def render_mma_ticket_editor(app: App) -> None: if imgui.button(f"Delete##{app.ui_selected_ticket_id}"): app.active_tickets = [t for t in app.active_tickets if str(t.get('id', '')) != app.ui_selected_ticket_id]; app.ui_selected_ticket_id = None; app._push_mma_state_update() def render_mma_agent_streams(app: App) -> None: + """ + Renders the agent execution stream panels in a tabbed view for Tier 1, 2, 3, and 4. + + State Mutations: + app.show_windows (toggles pop-out sub-windows) + + SSDL Shape: + `[I] -> [B:tab_bar] => [I:stream_panels]` + """ imgui.text("Agent Streams") if imgui.begin_tab_bar("mma_streams_tabs"): for tier, label, sep_flag_attr in [("Tier 1", "Tier 1", "ui_separate_tier1"), ("Tier 2", "Tier 2 (Tech Lead)", "ui_separate_tier2"), ("Tier 3", None, "ui_separate_tier3"), ("Tier 4", "Tier 4 (QA)", "ui_separate_tier4")]: @@ -6371,6 +6406,17 @@ def render_ticket_queue(app: App) -> None: imgui.end_table() def render_task_dag_panel(app: App) -> None: # 4. Task DAG Visualizer + """ + Renders the interactive node editor DAG visualizer, mapping ticket relationships + and allowing creation or deletion of links. + + State Mutations: + app.ui_selected_ticket_id (node selection) + app.active_tickets (updates dependency lists on link creation or deletion) + + SSDL Shape: + `[I:task_nodes] -> [B:node_editor_canvas] => [I:link_connections]` + """ imgui.text("Task DAG") if (app.active_track or app.active_tickets) and app.node_editor_ctx: ed.set_current_editor(app.node_editor_ctx)