From 5b76607293e4c00d14d0a3f7354a4cb815eb1a44 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sat, 16 May 2026 04:47:51 -0400 Subject: [PATCH] feat(hot-reload): Final style polish and gap fix --- scripts/fix_gaps.py | 22 +++++ src/gui_2.py | 204 -------------------------------------------- 2 files changed, 22 insertions(+), 204 deletions(-) create mode 100644 scripts/fix_gaps.py diff --git a/scripts/fix_gaps.py b/scripts/fix_gaps.py new file mode 100644 index 00000000..e90ce12b --- /dev/null +++ b/scripts/fix_gaps.py @@ -0,0 +1,22 @@ +import sys +import re + +def fix_gaps(): + file_path = "src/gui_2.py" + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + + # Replace 3+ newlines with 2 newlines (one empty line) + # Using \r\n for Windows support if needed, but \n is standard for Python reads + content = re.sub(r"\n\n\n+", "\n\n", content) + + # Specific fix for regions: ensure no extra space after region start or before region end + content = re.sub(r"(#region: .*)\n\n+", r"\1\n", content) + content = re.sub(r"\n\n+(#endregion: .*)", r"\n\1", content) + + with open(file_path, "w", encoding="utf-8") as f: + f.write(content) + print("Whitespace gaps fixed.") + +if __name__ == "__main__": + fix_gaps() diff --git a/src/gui_2.py b/src/gui_2.py index bd5e2403..f60974fd 100644 --- a/src/gui_2.py +++ b/src/gui_2.py @@ -630,12 +630,8 @@ class App: f.write(data) # ---------------------------------------------------------------- helpers - # ---------------------------------------------------------------- gui - - - def _gui_func(self) -> None: io = imgui.get_io() if io.key_ctrl and io.key_alt and io.keys_down[ord('R')]: @@ -673,7 +669,6 @@ class App: if self.perf_profiling_enabled: self.perf_monitor.end_component("_gui_func") return - def _render_window_if_open(self, name: str, render_func: Callable[[], None], flag_condition: bool = True) -> None: """Helper to render a window only if its toggle is active.""" if not flag_condition or not self.show_windows.get(name, False): return @@ -681,7 +676,6 @@ class App: self.show_windows[name] = bool(opened) if exp: render_func() - def _show_menus(self) -> None: """ [C: tests/test_gui_window_controls.py:test_gui_window_controls_minimize_maximize_close] @@ -785,7 +779,6 @@ class App: imgui.pop_style_color() imgui.pop_style_color() - def _handle_history_logic(self) -> None: """ @@ -846,20 +839,13 @@ class App: sys.stderr.flush() - #region: Diangostics & Analytics - - - - #endregion: Diangostics & Analytics #region: Logging - - def cb_load_prior_log(self, path: Optional[str] = None) -> None: if path is None: root = hide_tk_root() @@ -867,16 +853,9 @@ class App: root.destroy() if path: self.controller.cb_load_prior_log(path) - #endregion: Logging #region: Project Management - - - - - - def _set_external_editor_default(self, editor_name: str) -> None: from src import models if "tools" not in self.config: self.config["tools"] = {} @@ -911,34 +890,13 @@ class App: paths.reset_resolved() self.init_state() self.ai_status = 'paths applied and session reset' - #endregion: Project Management #region: AI Settings - - - - - - - - - - - #endregion: AI Settings #region: Context Management - - - - - - - - - def _populate_auto_slices(self, f_item: models.FileItem) -> None: """ [C: tests/test_auto_slices.py:test_populate_auto_slices_basic] @@ -973,10 +931,6 @@ class App: slice_data['comment'] = name f_item.custom_slices.append(slice_data) - - - - def _update_context_file_stats(self) -> tuple[int, int]: if not hasattr(self, '_file_stats_cache'): self._file_stats_cache = {} if not hasattr(self, '_file_stats_queue'): self._file_stats_queue = [] @@ -1006,41 +960,15 @@ class App: threading.Thread(target=_stats_worker, daemon=True).start() return total_lines, total_ast - #endregion: Context Management #region: Discussions - - - - - - - - - - - - - - - - - - #endregion: Discussions #region: Operations Monitor - - - - #endregion: Operations Monitor #region: Misc Tools - - - def _close_vscode_diff(self) -> None: if hasattr(self, '_vscode_diff_process') and self._vscode_diff_process: try: @@ -1049,7 +977,6 @@ class App: pass self._vscode_diff_process = None - def _apply_pending_patch(self) -> None: if not self._pending_patch_text: self._patch_error_message = "No patch to apply" @@ -1093,18 +1020,12 @@ class App: self._vscode_diff_process = result except Exception as e: self._patch_error_message = str(e) - - - #endregion: Misc Tools #region: Sanity Tests - - #endregion: Sanity Tests #region: MMA - def _reorder_ticket(self, src_idx: int, dst_idx: int) -> None: """ [C: tests/test_ticket_queue.py:TestReorder.test_reorder_ticket_invalid, tests/test_ticket_queue.py:TestReorder.test_reorder_ticket_valid] @@ -1127,22 +1048,6 @@ class App: self.active_tickets = new_tickets self._push_mma_state_update() - - - - - - - - - - - - - - - - def request_patch_from_tier4(self, error: str, file_context: str) -> None: try: from src import ai_client @@ -1230,7 +1135,6 @@ class App: t['status'] = 'todo' changed = True self._push_mma_state_update() - #endregion: MMA def main() -> None: @@ -1240,10 +1144,7 @@ def main() -> None: if __name__ == "__main__": main() - - #region: Diagnostics & Analytics - def render_usage_analytics_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_usage_analytics_panel") render_token_budget_panel(app) @@ -1269,7 +1170,6 @@ def render_usage_analytics_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_usage_analytics_panel") - def render_diagnostics_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_diagnostics_panel") with imscope.window("Diagnostics", app.show_windows.get("Diagnostics", False)) as (exp, opened): @@ -1374,12 +1274,9 @@ def render_diagnostics_panel(app: App) -> None: imgui.end_table() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_diagnostics_panel") - - #endregion: Diagnostics & Analytics #region: Logging - def render_log_management(app: App) -> None: """ [C: tests/test_log_management_ui.py:test_render_log_management_logic] @@ -1453,24 +1350,18 @@ def render_log_management(app: App) -> None: imgui.end_table() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_log_management") - - #endregion: Logging #region: Project Management - def render_project_settings_hub(app: App) -> None: with imscope.tab_bar('context_hub_tabs'): with imscope.tab_item('Projects') as (exp, _): if exp: render_projects_panel(app) with imscope.tab_item('Paths') as (exp, _): if exp: render_paths_panel(app) - - #endregion: Project Management #region: AI Settings - def render_ai_settings_hub(app: App) -> None: render_persona_selector_panel(app) if imgui.collapsing_header("Provider & Model"): render_provider_panel(app) @@ -1478,7 +1369,6 @@ def render_ai_settings_hub(app: App) -> None: if imgui.collapsing_header("RAG Settings"): render_rag_panel(app) render_agent_tools_panel(app) - def render_preset_manager_content(app: App, is_embedded: bool = False) -> None: avail = imgui.get_content_region_avail() if not hasattr(app, "_prompt_md_preview"): app._prompt_md_preview = False @@ -1568,7 +1458,6 @@ def render_preset_manager_content(app: App, is_embedded: bool = False) -> None: if imgui.button("Close##p", imgui.ImVec2(100, 0)): app.show_preset_manager_window = False imgui.end_table() - def render_preset_manager_window(app: App, is_embedded: bool = False) -> None: if not app.show_preset_manager_window and not is_embedded: return if not is_embedded: @@ -1579,7 +1468,6 @@ def render_preset_manager_window(app: App, is_embedded: bool = False) -> None: else: render_preset_manager_content(app, is_embedded=is_embedded) - def render_tool_preset_manager_content(app: App, is_embedded: bool = False) -> None: avail = imgui.get_content_region_avail() if not hasattr(app, "_tool_split_v"): app._tool_split_v = 0.4 @@ -1761,7 +1649,6 @@ def render_tool_preset_manager_content(app: App, is_embedded: bool = False) -> N if imgui.button("Close##tp", imgui.ImVec2(100, 0)): app.show_tool_preset_manager_window = False imgui.end_table() - def render_tool_preset_manager_window(app: App, is_embedded: bool = False) -> None: if not app.show_tool_preset_manager_window and not is_embedded: return if not is_embedded: @@ -1772,7 +1659,6 @@ def render_tool_preset_manager_window(app: App, is_embedded: bool = False) -> No else: render_preset_manager_content(app, is_embedded=is_embedded) - def render_persona_editor_window(app: App, is_embedded: bool = False) -> None: if not app.show_persona_editor_window and not is_embedded: return if not is_embedded: @@ -1944,12 +1830,9 @@ def render_persona_editor_window(app: App, is_embedded: bool = False) -> None: if not is_embedded: imgui.end() - - #endregion: AI Settings #region: Context Management - def render_files_and_media(app: App) -> None: """ [C: tests/test_gui_fast_render.py:test_render_files_and_media_fast] @@ -2059,7 +1942,6 @@ def render_files_and_media(app: App) -> None: if p not in app.screenshots: app.screenshots.append(p) return - def render_files_panel(app: App, height_override: float = 0) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_files_panel") imgui.text("Paths") @@ -2140,7 +2022,6 @@ def render_files_panel(app: App, height_override: float = 0) -> None: if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_files_panel") - def render_screenshots_panel(app: App, height_override: float = 0) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_screenshots_panel") imgui.text("Paths"); imgui.same_line(); imgui.text("| Base Dir:"); imgui.same_line(); @@ -2175,7 +2056,6 @@ def render_screenshots_panel(app: App, height_override: float = 0) -> None: if p not in app.screenshots: app.screenshots.append(p) if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_screenshots_panel") - def render_context_batch_actions(app: App, total_lines: int, total_ast: int) -> None: imgui.text("Batch:") for mode in ["full", "summary", "skeleton", "outline", "masked", "none"]: @@ -2212,7 +2092,6 @@ def render_context_batch_actions(app: App, total_lines: int, total_ast: int) -> imgui.same_line() imgui.text(f" | Total: {len(app.context_files)} files, {total_lines} lines, {total_ast} AST elements") - def render_add_context_files_modal(app: App) -> None: """ [C: tests/test_auto_slices.py:test_add_selected_triggers_auto_slices] @@ -2252,12 +2131,9 @@ def render_add_context_files_modal(app: App) -> None: app._ui_picker_selected.clear() imgui.close_current_popup() imgui.end_popup() - - #endregion: Context Management #region: Discussions - def render_discussion_hub(app: App) -> None: with imscope.tab_bar("discussion_hub_tabs"): with imscope.tab_item("Discussion") as (exp, opened): @@ -2270,7 +2146,6 @@ def render_discussion_hub(app: App) -> None: if exp: render_takes_panel(app) return - def render_discussion_entry(app: App, entry: dict, index: int) -> None: with imscope.id(f"disc_{index}"): collapsed, read_mode = entry.get("collapsed", False), entry.get("read_mode", False) @@ -2316,7 +2191,6 @@ def render_discussion_entry(app: App, entry: dict, index: int) -> None: if not (bool(thinking_segments) and not has_content): ch, entry["content"] = imgui.input_text_multiline("##content", entry["content"], imgui.ImVec2(-1, 150)) imgui.separator() - def render_discussion_entry_read_mode(app: App, entry: dict, index: int) -> None: content = entry["content"] if not content.strip(): return @@ -2362,12 +2236,9 @@ def render_discussion_entry_read_mode(app: App, entry: dict, index: int) -> None with theme.ai_text_style(): markdown_helper.render(after, context_id=f'disc_{index}_a') if app.ui_word_wrap: imgui.pop_text_wrap_pos() - - #endregion: Discussions #region: Operations Monitor - def render_operations_hub(app: App) -> None: imgui.push_style_var(imgui.StyleVar_.item_spacing, imgui.ImVec2(10, 4)) ch1, app.ui_separate_tool_calls_panel = imgui.checkbox("Pop Out Tool Calls", app.ui_separate_tool_calls_panel) @@ -2408,7 +2279,6 @@ def render_operations_hub(app: App) -> None: ch_combo, new_idx = imgui.combo(t, idx, profiles) if ch_combo: app.controller.ui_tier_layout_bindings[t] = profiles[new_idx] - def render_message_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_message_panel") # LIVE indicator @@ -2448,7 +2318,6 @@ def render_message_panel(app: App) -> None: if imgui.button("Reset"): app._handle_reset_session() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_message_panel") - def render_response_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_response_panel") if app._trigger_blink: @@ -2489,7 +2358,6 @@ def render_response_panel(app: App) -> None: app.disc_entries.append(entry) if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_response_panel") - def render_tool_calls_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_tool_calls_panel") imgui.text("Tool call history") @@ -2555,7 +2423,6 @@ def render_tool_calls_panel(app: App) -> None: app._scroll_tool_calls_to_bottom = False if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tool_calls_panel") - def render_external_tools_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_external_tools_panel") if imgui.button("Refresh External MCPs"): app.event_queue.put("refresh_external_mcps", None) @@ -2599,12 +2466,9 @@ def render_external_tools_panel(app: App) -> None: imgui.text(tinfo.get('description', '')) imgui.end_table() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_external_tools_panel") - - #endregion: Operations Monitor #region: Misc Tools - def render_text_viewer(app: App, label: str, content: str, text_type: str = 'text', force_open: bool = False) -> None: if imgui.button("[+]##" + str(id(content))) or force_open: app.text_viewer_type = text_type @@ -2612,7 +2476,6 @@ def render_text_viewer(app: App, label: str, content: str, text_type: str = 'tex app.text_viewer_title = label app.text_viewer_content = content - def render_heavy_text(app: App, label: str, content: str, id_suffix: str = "") -> None: imgui.text_colored(C_LBL, f"{label}:") imgui.same_line() @@ -2648,7 +2511,6 @@ def render_heavy_text(app: App, label: str, content: str, id_suffix: str = "") - else: imgui.text(content) - def render_thinking_trace(app: App, segments: list[dict], entry_index: int, is_standalone: bool = False) -> None: if not segments: return @@ -2678,7 +2540,6 @@ def render_thinking_trace(app: App, segments: list[dict], entry_index: int, is_s imgui.unindent() - def render_selectable_label(app: App, label: str, value: str, width: float = 0.0, multiline: bool = False, height: float = 0.0, color: Optional[imgui.ImVec4] = None) -> None: with imscope.id(label + str(hash(value))): with imscope.style_color(imgui.Col_.frame_bg, vec4(0, 0, 0, 0)), \ @@ -2700,12 +2561,9 @@ def render_selectable_label(app: App, label: str, value: str, width: float = 0.0 else: if width > 0: imgui.set_next_item_width(width) imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only) - - #endregion: Misc Tools #region: MMA - def render_mma_dashboard(app: App) -> None: """ Main MMA dashboard interface. @@ -2739,7 +2597,6 @@ def render_mma_dashboard(app: App) -> None: render_mma_agent_streams(app) if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_mma_dashboard") - def render_mma_modals(app: App) -> None: """Renders all MMA-specific approval and info modals.""" is_nerv = theme.is_nerv_active() @@ -2816,7 +2673,6 @@ def render_mma_modals(app: App) -> None: if imgui.button("OK"): imgui.close_current_popup() imgui.end_popup() - def render_mma_track_summary(app: App) -> None: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -2848,7 +2704,6 @@ def render_mma_track_summary(app: App) -> None: eta_mins = (app._avg_ticket_time * remaining) / 60.0 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: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -2857,7 +2712,6 @@ def render_mma_epic_planner(app: App) -> None: _, 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() - def render_mma_conductor_setup(app: App) -> None: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -2865,7 +2719,6 @@ def render_mma_conductor_setup(app: App) -> None: if imgui.button("Run Setup Scan"): app._cb_run_conductor_setup() if app.ui_conductor_setup_summary: imgui.input_text_multiline("##setup_summary", app.ui_conductor_setup_summary, imgui.ImVec2(-1, 120), imgui.InputTextFlags_.read_only) - def render_mma_track_browser(app: App) -> None: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -2895,7 +2748,6 @@ def render_mma_track_browser(app: App) -> None: app._cb_create_track(app.ui_new_track_name, app.ui_new_track_desc, app.ui_new_track_type) app.ui_new_track_name = ""; app.ui_new_track_desc = "" - def render_mma_global_controls(app: App) -> None: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -2927,7 +2779,6 @@ def render_mma_global_controls(app: App) -> None: imgui.text_colored(imgui.ImVec4(1, 0, 0, 1), f"Error: {app._hot_reload_error or 'Unknown'}") imgui.same_line(); imgui.text_disabled("(Ctrl+Alt+R)") - def render_mma_usage_section(app: App) -> None: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -2974,7 +2825,6 @@ def render_mma_usage_section(app: App) -> None: imgui.end_combo() imgui.pop_item_width() - def render_mma_ticket_editor(app: App) -> None: 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) @@ -2995,7 +2845,6 @@ def render_mma_ticket_editor(app: App) -> None: imgui.same_line() 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: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -3016,7 +2865,6 @@ def render_mma_agent_streams(app: App) -> None: if exp: render_beads_tab(app) imgui.end_tab_bar() - def render_tier_stream_panel(app: App, tier_key: str, stream_key: str | None) -> None: """ [C: tests/test_mma_dashboard_streams.py:TestMMADashboardStreams.test_tier1_renders_stream_content, tests/test_mma_dashboard_streams.py:TestMMADashboardStreams.test_tier3_renders_worker_subheaders] @@ -3067,7 +2915,6 @@ def render_tier_stream_panel(app: App, tier_key: str, stream_key: str | None) -> pass if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tier_stream_panel") - def render_track_proposal_modal(app: App) -> None: if app._show_track_proposal_modal: imgui.open_popup("Track Proposal") @@ -3112,8 +2959,6 @@ def render_track_proposal_modal(app: App) -> None: else: imgui.close_current_popup() imgui.end_popup() - - #endregion: MMA def render_save_preset_modal(app: App) -> None: @@ -3140,7 +2985,6 @@ def render_save_preset_modal(app: App) -> None: app._show_save_preset_modal = False imgui.close_current_popup() - def render_main_interface(app: App) -> None: render_error_tint(app) app.perf_monitor.start_frame() @@ -3232,13 +3076,11 @@ def render_main_interface(app: App) -> None: render_approve_script_modal(app) render_mma_modals(app) - def render_custom_title_bar(app: App) -> None: # Obsolete, removed since it renders behind the full screen dock space. # Controls are now embedded in _show_menus. pass - def render_history_window(app: App) -> None: if not app.show_windows.get('Undo/Redo History', False): return @@ -3263,7 +3105,6 @@ def render_history_window(app: App) -> None: if not history: imgui.text("No history available.") else: iterate_history() - def render_theme_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_theme_panel") exp, opened = imgui.begin("Theme", app.show_windows["Theme"]) @@ -3346,7 +3187,6 @@ def render_theme_panel(app: App) -> None: imgui.end() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_theme_panel") - def render_shader_live_editor(app: App) -> None: """ [C: tests/test_shader_live_editor.py:test_shader_live_editor_renders] @@ -3359,7 +3199,6 @@ def render_shader_live_editor(app: App) -> None: changed_scan, app.shader_uniforms['scanline'] = imgui.slider_float('Scanline Intensity', app.shader_uniforms['scanline'], 0.0, 1.0) changed_bloom, app.shader_uniforms['bloom'] = imgui.slider_float('Bloom Threshold', app.shader_uniforms['bloom'], 0.0, 1.0) - def render_cache_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_cache_panel") if app.current_provider != "gemini": @@ -3392,7 +3231,6 @@ def render_cache_panel(app: App) -> None: imgui.text_colored(imgui.ImVec4(0.2, 1.0, 0.2, 1.0), "Cache cleared - will rebuild on next request") if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_cache_panel") - def render_tool_analytics_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_tool_analytics_panel") imgui.text_colored(C_LBL, 'Tool Usage') @@ -3431,7 +3269,6 @@ def render_tool_analytics_panel(app: App) -> None: imgui.end_table() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tool_analytics_panel") - def render_token_budget_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_token_budget_panel") imgui.text_colored(C_LBL, 'Prompt Utilization') @@ -3528,7 +3365,6 @@ def render_token_budget_panel(app: App) -> None: imgui.text_disabled("Cache Usage: INACTIVE") if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_token_budget_panel") - def render_session_insights_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_session_insights_panel") imgui.text_colored(C_LBL, 'Session Insights') @@ -3544,7 +3380,6 @@ def render_session_insights_panel(app: App) -> None: imgui.text(f"Tokens/Ticket: {efficiency:.0f}" if efficiency > 0 else "Tokens/Ticket: N/A") if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_session_insights_panel") - def render_projects_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_projects_panel") proj_name = app.project.get("project", {}).get("name", Path(app.active_project_path).stem) @@ -3630,7 +3465,6 @@ def render_projects_panel(app: App) -> None: ch, app.ui_auto_scroll_tool_calls = imgui.checkbox("Auto-scroll Tool History", app.ui_auto_scroll_tool_calls) if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_projects_panel") - def render_paths_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_paths_panel") path_info = paths.get_full_path_info() @@ -3638,7 +3472,6 @@ def render_paths_panel(app: App) -> None: imgui.text_colored(C_IN, "System Path Configuration") imgui.separator() - def render_path_field(label: str, attr: str, key: str, tooltip: str): info = path_info.get(key, {'source': 'unknown'}) imgui.text(label) @@ -3657,7 +3490,6 @@ def render_path_field(label: str, attr: str, key: str, tooltip: str): r.destroy() if d: setattr(app, attr, d) - def render_rag_panel(app: App) -> None: conf = app.controller.rag_config if not conf: return @@ -3695,7 +3527,6 @@ def render_rag_panel(app: App) -> None: if imgui.button("Rebuild Index"): app.controller.event_queue.put('click', 'btn_rebuild_rag_index') - def render_system_prompts_panel(app: App) -> None: imgui.text("Global System Prompt (all projects)") preset_names = sorted(app.controller.presets.keys()) @@ -3748,7 +3579,6 @@ def render_system_prompts_panel(app: App) -> None: imgui.set_item_tooltip("Open preset management modal") ch, app.ui_project_system_prompt = imgui.input_text_multiline("##psp", app.ui_project_system_prompt, imgui.ImVec2(-1, 100)) - def render_agent_tools_panel(app: App) -> None: if imgui.collapsing_header("Active Tool Presets & Biases", imgui.TreeNodeFlags_.default_open): imgui.text("Tool Preset") @@ -3814,7 +3644,6 @@ def render_agent_tools_panel(app: App) -> None: if imgui.radio_button(f"Ask##{cat_name}_{tool.name}", mode == "ask"): tool.approval = "ask" imgui.tree_pop() - def render_provider_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_provider_panel") imgui.text("Provider") @@ -3881,7 +3710,6 @@ def render_provider_panel(app: App) -> None: ai_client._gemini_cli_adapter.binary_path = app.ui_gemini_cli_path if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_provider_panel") - def render_persona_selector_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_persona_selector_panel") imgui.text("Persona") @@ -3964,7 +3792,6 @@ def render_persona_selector_panel(app: App) -> None: imgui.separator() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_persona_selector_panel") - def render_context_composition_panel(app: App) -> None: """ [C: tests/test_auto_slices.py:test_add_all_triggers_auto_slices, tests/test_gui_fast_render.py:test_render_context_composition_panel_fast] @@ -3980,7 +3807,6 @@ def render_context_composition_panel(app: App) -> None: imgui.separator() render_context_presets(app) - def render_ast_inspector_modal(app: App) -> None: """ [C: tests/test_ast_inspector_extended.py:test_ast_inspector_line_range_parsing] @@ -3990,7 +3816,6 @@ def render_ast_inspector_modal(app: App) -> None: app._show_ast_inspector = False #region: AST Inspector - expanded, opened = imgui.begin_popup_modal('AST Inspector', True, imgui.WindowFlags_.always_auto_resize) if opened: if expanded: @@ -4120,7 +3945,6 @@ def render_ast_inspector_modal(app: App) -> None: if not opened: app.ui_inspecting_ast_file = None - def render_save_workspace_profile_modal(app: App) -> None: if app._show_save_workspace_profile_modal: imgui.open_popup("Save Workspace Profile") @@ -4148,7 +3972,6 @@ def render_save_workspace_profile_modal(app: App) -> None: imgui.end_popup() - def render_context_presets_panel(app: App) -> None: imgui.text_colored(C_IN, "Context Presets") imgui.separator() @@ -4171,11 +3994,9 @@ def render_context_presets_panel(app: App) -> None: imgui.same_line() if imgui.button(f"Delete##{name}"): app.delete_context_preset(name) - def render_context_screenshots(app: App) -> None: for i, s in enumerate(app.screenshots): imgui.text(s) - def render_context_files_table(app: App) -> None: imgui.dummy(imgui.ImVec2(0, 4)) grouped_files = aggregate.group_files_by_dir(app.context_files) @@ -4281,7 +4102,6 @@ def render_context_files_table(app: App) -> None: imgui.same_line() imgui.text_colored(imgui.ImVec4(1.0, 0.5, 0.0, 1.0), "[Slices Active]") - def render_context_presets(app: App) -> None: imgui.text("Presets") presets = app.controller.project.get('context_presets', {}) @@ -4310,7 +4130,6 @@ def render_context_presets(app: App) -> None: app.delete_context_preset(app.ui_active_context_preset) app.ui_active_context_preset = "" - def render_discussion_entries(app: App) -> None: with imscope.child("disc_scroll"): display_entries = app.disc_entries @@ -4325,7 +4144,6 @@ def render_discussion_entries(app: App) -> None: render_discussion_entry(app, display_entries[i], i) if app._scroll_disc_to_bottom: imgui.set_scroll_here_y(1.0); app._scroll_disc_to_bottom = False - def render_discussion_entry_controls(app: App) -> None: if imgui.button("+ Entry"): app.disc_entries.append({"role": app.disc_roles[0] if app.disc_roles else "User", "content": "", "collapsed": True, "ts": project_manager.now_ts()}) imgui.same_line() @@ -4347,7 +4165,6 @@ def render_discussion_entry_controls(app: App) -> None: with app._disc_entries_lock: app.disc_entries = truncate_entries(app.disc_entries, app.ui_disc_truncate_pairs) app.ai_status = f"history truncated to {app.ui_disc_truncate_pairs} pairs" - def render_discussion_metadata(app: App) -> None: disc_data = app.project.get("discussion", {}).get("discussions", {}).get(app.active_discussion, {}) git_commit, last_updated = disc_data.get("git_commit", ""), disc_data.get("last_updated", "") @@ -4370,7 +4187,6 @@ def render_discussion_metadata(app: App) -> None: imgui.same_line() if imgui.button("Delete"): app._delete_discussion(app.active_discussion) - def render_discussion_panel(app: App) -> None: """ [C: tests/test_discussion_takes_gui.py:test_render_discussion_tabs, tests/test_discussion_takes_gui.py:test_switching_discussion_via_tabs, tests/test_gui_discussion_tabs.py:test_discussion_tabs_rendered, tests/test_gui_fast_render.py:test_render_discussion_panel_fast, tests/test_gui_phase4.py:test_track_discussion_toggle, tests/test_gui_symbol_navigation.py:test_render_discussion_panel_symbol_lookup] @@ -4393,7 +4209,6 @@ def render_discussion_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_discussion_panel") return - def render_discussion_roles(app: App) -> None: if imgui.collapsing_header("Roles"): with imscope.child("roles_scroll", size_y=100, flags=True): @@ -4407,7 +4222,6 @@ def render_discussion_roles(app: App) -> None: if r and r not in app.disc_roles: app.disc_roles.append(r); app.ui_disc_new_role_input = "" return - def render_discussion_selector(app: App) -> None: if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return @@ -4453,7 +4267,6 @@ def render_discussion_selector(app: App) -> None: render_discussion_metadata(app) return - def render_discussion_tab(app: App) -> None: imgui.begin_child("HistoryChild", size=(0, -app.ui_discussion_split_h)) if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_discussion_panel") @@ -4489,7 +4302,6 @@ def render_discussion_tab(app: App) -> None: else: imgui.text_disabled("Message & Response panels are detached.") - def render_takes_panel(app: App) -> None: imgui.text("Takes & Synthesis") imgui.separator() @@ -4546,7 +4358,6 @@ def render_takes_panel(app: App) -> None: app.disc_entries.append({"role": "user", "content": prompt, "collapsed": False, "ts": project_manager.now_ts()}) app._handle_generate_send() - def render_prior_session_view(app: App) -> None: with imscope.style_color(imgui.Col_.child_bg, vec4(50, 40, 20)): if imgui.button("Exit Prior Session"): app.controller.cb_exit_prior_session(); app._comms_log_dirty = True @@ -4572,7 +4383,6 @@ def render_prior_session_view(app: App) -> None: markdown_helper.render(content, context_id=f'prior_disc_{idx}') imgui.separator() - def render_thinking_indicator(app: App) -> None: is_thinking = app.ai_status in ['sending...', 'streaming...', 'running powershell...'] if is_thinking: @@ -4581,7 +4391,6 @@ def render_thinking_indicator(app: App) -> None: c = vec4(255, 50, 50, alpha) if theme.is_nerv_active() else vec4(255, 100, 100, alpha) imgui.text_colored(c, "THINKING..."); imgui.same_line() - def render_synthesis_panel(app: App) -> None: """ @@ -4614,7 +4423,6 @@ def render_synthesis_panel(app: App) -> None: with app._disc_entries_lock: app.disc_entries.append({"role": "User", "content": prompt, "collapsed": False, "ts": project_manager.now_ts()}) app._handle_generate_send() - def render_snapshot_tab(app: App) -> None: if imgui.begin_tab_bar("snapshot_tabs"): if imgui.begin_tab_item("Aggregate MD")[0]: @@ -4651,7 +4459,6 @@ def render_snapshot_tab(app: App) -> None: imgui.end_tab_item() imgui.end_tab_bar() - def render_comms_history_panel(app: App) -> None: if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_comms_history_panel") st_col = vec4(200, 220, 160) @@ -4770,7 +4577,6 @@ def render_comms_history_panel(app: App) -> None: if app.is_viewing_prior_session: imgui.pop_style_color() if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_comms_history_panel") - def render_text_viewer_window(app: App) -> None: """Renders the standalone text/code/markdown viewer window.""" if not app.show_text_viewer: return @@ -4892,7 +4698,6 @@ def render_text_viewer_window(app: App) -> None: render_ast_inspector_modal(app) return - def render_base_prompt_diff_modal(app: App) -> None: if not getattr(app.controller, "_show_base_prompt_diff_modal", False): return @@ -4922,7 +4727,6 @@ def render_base_prompt_diff_modal(app: App) -> None: imgui.close_current_popup() imgui.end_popup() - def render_patch_modal(app: App) -> None: if not app._show_patch_modal: return @@ -4967,7 +4771,6 @@ def render_patch_modal(app: App) -> None: app._patch_error_message = None imgui.close_current_popup() - def render_external_editor_panel(app: App) -> None: from src.external_editor import get_default_launcher imgui.text("External Editor for Diff Viewing") @@ -5014,7 +4817,6 @@ def render_external_editor_panel(app: App) -> None: except Exception as e: imgui.text_colored(C_TC, f"Error: {str(e)}") - def render_approve_script_modal(app: App) -> None: """Renders the modal dialog for approving AI-generated PowerShell scripts.""" with app._pending_dialog_lock: @@ -5058,7 +4860,6 @@ def render_approve_script_modal(app: App) -> None: imgui.close_current_popup() imgui.end_popup() - def render_markdown_test(app: App) -> None: imgui.text("Markdown Test Panel") imgui.separator() @@ -5083,7 +4884,6 @@ def hello(): """ markdown_helper.render(md) - def render_ticket_queue(app: App) -> None: """ [C: tests/test_gui_kill_button.py:test_render_ticket_queue_table_columns] @@ -5199,7 +4999,6 @@ def render_ticket_queue(app: App) -> None: imgui.end_table() - def render_task_dag_panel(app: App) -> None: # 4. Task DAG Visualizer imgui.text("Task DAG") if (app.active_track or app.active_tickets) and app.node_editor_ctx: @@ -5343,7 +5142,6 @@ def render_task_dag_panel(app: App) -> None: # 4. Task DAG Visualizer else: imgui.text_disabled("No active MMA track or tickets.") - def render_beads_tab(app: App) -> None: imgui.text("Beads Graph (Dolt-backed)") if imgui.button("Refresh Beads"): @@ -5385,7 +5183,6 @@ def render_beads_tab(app: App) -> None: except Exception as e: imgui.text_colored(imgui.ImVec4(1, 0, 0, 1), f"Error loading beads: {e}") - def render_mma_focus_selector(app: App) -> None: """ [C: tests/test_gui_progress.py:test_render_mma_dashboard_progress] @@ -5400,7 +5197,6 @@ def render_mma_focus_selector(app: App) -> None: imgui.same_line() if app.ui_focus_agent and imgui.button("x##clear_focus"): app.ui_focus_agent = None - def render_error_tint(app: App) -> None: """Renders a red tint overlay if hot reload failed.""" if not HotReloader.is_error_state: return