making a dent (disasterous one)
This commit is contained in:
+192
-233
@@ -1,15 +1,23 @@
|
||||
# gui_2.py
|
||||
from __future__ import annotations
|
||||
import tomli_w
|
||||
import datetime
|
||||
import time
|
||||
import math
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
import shutil
|
||||
import copy
|
||||
import datetime
|
||||
import difflib
|
||||
import json
|
||||
import math
|
||||
import numpy as np
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
# from defer import defer
|
||||
import tomli_w
|
||||
# from contextlib import ExitStack
|
||||
import traceback
|
||||
import typing
|
||||
from pathlib import Path
|
||||
from tkinter import filedialog, Tk
|
||||
from typing import Optional, Any
|
||||
@@ -19,26 +27,20 @@ from src import session_logger
|
||||
from src import project_manager
|
||||
from src import paths
|
||||
from src import presets
|
||||
from src import theme_2 as theme
|
||||
from src import theme_nerv_fx as theme_fx
|
||||
from src import api_hooks
|
||||
import numpy as np
|
||||
from src import log_registry
|
||||
from src import log_pruner
|
||||
from src import models
|
||||
from src import app_controller
|
||||
from src import workspace_manager
|
||||
from src import history
|
||||
from src import mcp_client
|
||||
from src import aggregate
|
||||
from src import markdown_helper
|
||||
from src import bg_shader
|
||||
from src import thinking_parser
|
||||
from src import history
|
||||
import typing
|
||||
import re
|
||||
import difflib
|
||||
import subprocess
|
||||
import traceback
|
||||
from src import theme_2 as theme
|
||||
from src import theme_nerv_fx as theme_fx
|
||||
from src import workspace_manager
|
||||
if sys.platform == "win32":
|
||||
import win32gui
|
||||
import win32con
|
||||
@@ -614,18 +616,18 @@ class App:
|
||||
|
||||
if show_content:
|
||||
h = 150 if is_standalone else 100
|
||||
imscope.child(f"thinking_content_{entry_index}", imgui.ImVec2(0, h), True)
|
||||
for idx, seg in enumerate(segments):
|
||||
content = seg.get("content", "")
|
||||
marker = seg.get("marker", "thinking")
|
||||
imscope.id(f"think_{entry_index}_{idx}")
|
||||
imgui.text_colored(vec4(180, 150, 80), f"[{marker}]")
|
||||
if self.ui_word_wrap:
|
||||
imscope.text_wrap(imgui.get_content_region_avail().x)
|
||||
imgui.text_colored(vec4(200, 200, 150), content)
|
||||
else:
|
||||
imgui.text_colored(vec4(200, 200, 150), content)
|
||||
imgui.separator()
|
||||
with imscope.child(f"thinking_content_{entry_index}", imgui.ImVec2(0, h), True):
|
||||
for idx, seg in enumerate(segments):
|
||||
content = seg.get("content", "")
|
||||
marker = seg.get("marker", "thinking")
|
||||
with imscope.id(f"think_{entry_index}_{idx}"):
|
||||
imgui.text_colored(vec4(180, 150, 80), f"[{marker}]")
|
||||
if self.ui_word_wrap:
|
||||
imscope.text_wrap(imgui.get_content_region_avail().x)
|
||||
imgui.text_colored(vec4(200, 200, 150), content)
|
||||
else:
|
||||
imgui.text_colored(vec4(200, 200, 150), content)
|
||||
imgui.separator()
|
||||
|
||||
imgui.unindent()
|
||||
imgui.pop_style_color(2)
|
||||
@@ -811,6 +813,112 @@ class App:
|
||||
if not history: imgui.text("No history available.")
|
||||
else: iterate_history()
|
||||
|
||||
def _render_files_and_media(self) -> None:
|
||||
avail = imgui.get_content_region_avail().y
|
||||
if not hasattr(self, 'files_screenshots_split'): self.files_screenshots_split = 0.65
|
||||
split_y = int(avail * self.files_screenshots_split)
|
||||
if imgui.collapsing_header("Files", imgui.TreeNodeFlags_.default_open):
|
||||
with imscope.child("Files_child", imgui.ImVec2(-1, split_y), True):
|
||||
if not hasattr(self, 'files_last_selected'): self.files_last_selected = -1
|
||||
|
||||
with imscope.table("files_table", 5, imgui.TableFlags_.resizable | imgui.TableFlags_.borders):
|
||||
imgui.table_setup_column("", imgui.TableColumnFlags_.width_fixed, 20)
|
||||
imgui.table_setup_column("Path", imgui.TableColumnFlags_.width_stretch)
|
||||
imgui.table_setup_column("Agg", imgui.TableColumnFlags_.width_fixed, 0)
|
||||
imgui.table_setup_column("Full", imgui.TableColumnFlags_.width_fixed, 0)
|
||||
imgui.table_setup_column("Cache", imgui.TableColumnFlags_.width_fixed, 0)
|
||||
imgui.table_headers_row()
|
||||
|
||||
self.files.sort(key=lambda f: f.path.lower() if hasattr(f, 'path') else str(f).lower())
|
||||
for i, f_item in enumerate(self.files):
|
||||
imgui.table_next_row(); imgui.table_set_column_index(0)
|
||||
clicked, f_item.selected = imgui.checkbox(f"##{i}", f_item.selected)
|
||||
if clicked:
|
||||
if (imgui.is_key_down(imgui.Key.left_shift) or imgui.is_key_down(imgui.Key.right_shift)) and self.files_last_selected >= 0:
|
||||
start_i = min(self.files_last_selected, i)
|
||||
end_i = max(self.files_last_selected, i)
|
||||
for j in range(start_i, end_i + 1): self.files[j].selected = True
|
||||
self.files_last_selected = i
|
||||
imgui.table_set_column_index(1); imgui.text(f_item.path if hasattr(f_item, 'path') else str(f_item))
|
||||
imgui.table_set_column_index(2)
|
||||
if f_item.auto_aggregate: imgui.text_colored(imgui.ImVec4(0.3, 0.8, 1, 1), "A")
|
||||
else: imgui.text_disabled(" ")
|
||||
|
||||
imgui.same_line(spacing=1)
|
||||
if imgui.invisible_button(f"agg{i}", imgui.ImVec2(15, 15)):
|
||||
f_item.auto_aggregate = not f_item.auto_aggregate
|
||||
if f_item.auto_aggregate: f_item.force_full = False
|
||||
|
||||
imgui.table_set_column_index(3)
|
||||
if f_item.force_full: imgui.text_colored(imgui.ImVec4(1, 0.6, 0.3, 1), "F")
|
||||
else: imgui.text_disabled(" ")
|
||||
|
||||
imgui.same_line(spacing=1)
|
||||
if imgui.invisible_button(f"full{i}", imgui.ImVec2(15, 15)):
|
||||
f_item.force_full = not f_item.force_full
|
||||
if f_item.force_full: f_item.auto_aggregate = False
|
||||
|
||||
imgui.table_set_column_index(4)
|
||||
fpath = f_item.path if hasattr(f_item, 'path') else str(f_item)
|
||||
is_cached = any(fpath in c for c in getattr(self, '_cached_files', []))
|
||||
if is_cached: imgui.text_colored(imgui.ImVec4(0, 1, 0, 1), "Y")
|
||||
else: imgui.text_colored(imgui.ImVec4(0.5, 0.5, 0.5, 1), "-")
|
||||
|
||||
if imgui.button("Add Files##addf"):
|
||||
r = hide_tk_root(); paths = filedialog.askopenfilenames(); r.destroy()
|
||||
for p in paths:
|
||||
if p not in [f.path if hasattr(f, 'path') else f for f in self.files]: self.files.append(models.FileItem(path=p))
|
||||
|
||||
imgui.same_line()
|
||||
if imgui.button("Sel All##selall"):
|
||||
for f in self.files:
|
||||
f.selected = True
|
||||
|
||||
imgui.same_line()
|
||||
if imgui.button("Unsel##unselall"):
|
||||
for f in self.files:
|
||||
f.selected = False
|
||||
|
||||
imgui.same_line()
|
||||
if imgui.button("None##nonesel"):
|
||||
for f in self.files:
|
||||
if f.selected:
|
||||
f.auto_aggregate = False
|
||||
f.force_full = False
|
||||
|
||||
imgui.same_line()
|
||||
if imgui.button("Agg##aggsel"):
|
||||
for f in self.files:
|
||||
if f.selected:
|
||||
f.auto_aggregate = True
|
||||
f.force_full = False
|
||||
|
||||
imgui.same_line()
|
||||
if imgui.button("Full##fullsel"):
|
||||
for f in self.files:
|
||||
if f.selected:
|
||||
f.force_full = True
|
||||
f.auto_aggregate = False
|
||||
|
||||
imgui.same_line()
|
||||
if imgui.button("Del##dels"):
|
||||
self.files = [f for f in self.files if not f.selected]
|
||||
|
||||
imgui.separator()
|
||||
|
||||
if imgui.collapsing_header("Screenshots", imgui.TreeNodeFlags_.default_open):
|
||||
with imscope.child("Shots_child", imgui.ImVec2(-1, -1), True):
|
||||
for i, s in enumerate(self.screenshots):
|
||||
if imgui.button(f"x##s{i}"):
|
||||
self.screenshots.pop(i)
|
||||
break
|
||||
imgui.same_line(); imgui.text(s)
|
||||
if imgui.button("Add Screenshots##adds"):
|
||||
r = hide_tk_root(); paths = filedialog.askopenfilenames(filetypes=[("Images", "*.png *.jpg *.jpeg *.gif *.bmp *.webp"), ("All", "*.*")]); r.destroy()
|
||||
for p in paths:
|
||||
if p not in self.screenshots: self.screenshots.append(p)
|
||||
return
|
||||
|
||||
def _gui_func__abusrd_try_scope(self) -> None:
|
||||
self.perf_monitor.start_frame()
|
||||
self._autofocus_response_tab = self.controller._autofocus_response_tab
|
||||
@@ -824,8 +932,7 @@ class App:
|
||||
sys.stderr.flush()
|
||||
self._process_pending_gui_tasks()
|
||||
self._process_pending_history_adds()
|
||||
if self.controller._process_pending_tool_calls():
|
||||
self._tool_log_dirty = True
|
||||
if self.controller._process_pending_tool_calls(): self._tool_log_dirty = True
|
||||
#endregion: Process GUI task queue
|
||||
|
||||
self._render_track_proposal_modal()
|
||||
@@ -848,41 +955,34 @@ class App:
|
||||
models.save_config(self.config)
|
||||
except Exception:
|
||||
pass # silent — don't disrupt the GUI loop
|
||||
# Sync pending comms
|
||||
|
||||
# Sync pending comms
|
||||
with self._pending_comms_lock:
|
||||
if self._pending_comms:
|
||||
if self.ui_auto_scroll_comms:
|
||||
self._scroll_comms_to_bottom = True
|
||||
if self.ui_auto_scroll_comms: self._scroll_comms_to_bottom = True
|
||||
self._comms_log_dirty = True
|
||||
for c in self._pending_comms:
|
||||
self._comms_log.append(c)
|
||||
for c in self._pending_comms: self._comms_log.append(c)
|
||||
self._pending_comms.clear()
|
||||
|
||||
if self.ui_focus_agent != self._last_ui_focus_agent:
|
||||
self._comms_log_dirty = True
|
||||
self._tool_log_dirty = True
|
||||
self._comms_log_dirty = True
|
||||
self._tool_log_dirty = True
|
||||
self._last_ui_focus_agent = self.ui_focus_agent
|
||||
|
||||
if self._comms_log_dirty:
|
||||
if self.is_viewing_prior_session:
|
||||
self._comms_log_cache = self.prior_session_entries
|
||||
if self.is_viewing_prior_session: self._comms_log_cache = self.prior_session_entries
|
||||
else:
|
||||
log_raw = list(self._comms_log)
|
||||
if self.ui_focus_agent:
|
||||
self._comms_log_cache = [e for e in log_raw if e.get("source_tier", "").startswith(self.ui_focus_agent)]
|
||||
else:
|
||||
self._comms_log_cache = log_raw
|
||||
if self.ui_focus_agent: self._comms_log_cache = [e for e in log_raw if e.get("source_tier", "").startswith(self.ui_focus_agent)]
|
||||
else: self._comms_log_cache = log_raw
|
||||
self._comms_log_dirty = False
|
||||
|
||||
if self._tool_log_dirty:
|
||||
if self.is_viewing_prior_session:
|
||||
self._tool_log_cache = self.prior_tool_calls
|
||||
if self.is_viewing_prior_session: self._tool_log_cache = self.prior_tool_calls
|
||||
else:
|
||||
log_raw = list(self._tool_log)
|
||||
if self.ui_focus_agent:
|
||||
self._tool_log_cache = [e for e in log_raw if e.get("source_tier", "").startswith(self.ui_focus_agent)]
|
||||
else:
|
||||
self._tool_log_cache = log_raw
|
||||
if self.ui_focus_agent: self._tool_log_cache = [e for e in log_raw if e.get("source_tier", "").startswith(self.ui_focus_agent)]
|
||||
else: self._tool_log_cache = log_raw
|
||||
self._tool_log_dirty = False
|
||||
|
||||
#region: Project Settings
|
||||
@@ -898,119 +998,7 @@ class App:
|
||||
if self.show_windows.get("Files & Media", False):
|
||||
exp, opened = imgui.begin("Files & Media", self.show_windows["Files & Media"])
|
||||
self.show_windows["Files & Media"] = bool(opened)
|
||||
if opened:
|
||||
if exp:
|
||||
avail = imgui.get_content_region_avail().y
|
||||
if not hasattr(self, 'files_screenshots_split'):
|
||||
self.files_screenshots_split = 0.65
|
||||
split_y = int(avail * self.files_screenshots_split)
|
||||
if imgui.collapsing_header("Files", imgui.TreeNodeFlags_.default_open):
|
||||
imgui.begin_child("Files_child", imgui.ImVec2(-1, split_y), True)
|
||||
if not hasattr(self, 'files_last_selected'):
|
||||
self.files_last_selected = -1
|
||||
if imgui.begin_table("files_table", 5, imgui.TableFlags_.resizable | imgui.TableFlags_.borders):
|
||||
imgui.table_setup_column("", imgui.TableColumnFlags_.width_fixed, 20)
|
||||
imgui.table_setup_column("Path", imgui.TableColumnFlags_.width_stretch)
|
||||
imgui.table_setup_column("Agg", imgui.TableColumnFlags_.width_fixed, 0)
|
||||
imgui.table_setup_column("Full", imgui.TableColumnFlags_.width_fixed, 0)
|
||||
imgui.table_setup_column("Cache", imgui.TableColumnFlags_.width_fixed, 0)
|
||||
imgui.table_headers_row()
|
||||
self.files.sort(key=lambda f: f.path.lower() if hasattr(f, 'path') else str(f).lower())
|
||||
for i, f_item in enumerate(self.files):
|
||||
imgui.table_next_row()
|
||||
imgui.table_set_column_index(0)
|
||||
clicked, f_item.selected = imgui.checkbox(f"##{i}", f_item.selected)
|
||||
if clicked:
|
||||
if (imgui.is_key_down(imgui.Key.left_shift) or imgui.is_key_down(imgui.Key.right_shift)) and self.files_last_selected >= 0:
|
||||
start_i = min(self.files_last_selected, i)
|
||||
end_i = max(self.files_last_selected, i)
|
||||
for j in range(start_i, end_i + 1):
|
||||
self.files[j].selected = True
|
||||
self.files_last_selected = i
|
||||
imgui.table_set_column_index(1)
|
||||
imgui.text(f_item.path if hasattr(f_item, 'path') else str(f_item))
|
||||
imgui.table_set_column_index(2)
|
||||
if f_item.auto_aggregate:
|
||||
imgui.text_colored(imgui.ImVec4(0.3, 0.8, 1, 1), "A")
|
||||
else:
|
||||
imgui.text_disabled(" ")
|
||||
imgui.same_line(spacing=1)
|
||||
if imgui.invisible_button(f"agg{i}", imgui.ImVec2(15, 15)):
|
||||
f_item.auto_aggregate = not f_item.auto_aggregate
|
||||
if f_item.auto_aggregate:
|
||||
f_item.force_full = False
|
||||
imgui.table_set_column_index(3)
|
||||
if f_item.force_full:
|
||||
imgui.text_colored(imgui.ImVec4(1, 0.6, 0.3, 1), "F")
|
||||
else:
|
||||
imgui.text_disabled(" ")
|
||||
imgui.same_line(spacing=1)
|
||||
if imgui.invisible_button(f"full{i}", imgui.ImVec2(15, 15)):
|
||||
f_item.force_full = not f_item.force_full
|
||||
if f_item.force_full:
|
||||
f_item.auto_aggregate = False
|
||||
imgui.table_set_column_index(4)
|
||||
fpath = f_item.path if hasattr(f_item, 'path') else str(f_item)
|
||||
is_cached = any(fpath in c for c in getattr(self, '_cached_files', []))
|
||||
if is_cached:
|
||||
imgui.text_colored(imgui.ImVec4(0, 1, 0, 1), "Y")
|
||||
else:
|
||||
imgui.text_colored(imgui.ImVec4(0.5, 0.5, 0.5, 1), "-")
|
||||
imgui.end_table()
|
||||
if imgui.button("Add Files##addf"):
|
||||
r = hide_tk_root()
|
||||
paths = filedialog.askopenfilenames()
|
||||
r.destroy()
|
||||
for p in paths:
|
||||
if p not in [f.path if hasattr(f, 'path') else f for f in self.files]:
|
||||
self.files.append(models.FileItem(path=p))
|
||||
imgui.same_line()
|
||||
if imgui.button("Sel All##selall"):
|
||||
for f in self.files:
|
||||
f.selected = True
|
||||
imgui.same_line()
|
||||
if imgui.button("Unsel##unselall"):
|
||||
for f in self.files:
|
||||
f.selected = False
|
||||
imgui.same_line()
|
||||
if imgui.button("None##nonesel"):
|
||||
for f in self.files:
|
||||
if f.selected:
|
||||
f.auto_aggregate = False
|
||||
f.force_full = False
|
||||
imgui.same_line()
|
||||
if imgui.button("Agg##aggsel"):
|
||||
for f in self.files:
|
||||
if f.selected:
|
||||
f.auto_aggregate = True
|
||||
f.force_full = False
|
||||
imgui.same_line()
|
||||
if imgui.button("Full##fullsel"):
|
||||
for f in self.files:
|
||||
if f.selected:
|
||||
f.force_full = True
|
||||
f.auto_aggregate = False
|
||||
imgui.same_line()
|
||||
if imgui.button("Del##dels"):
|
||||
self.files = [f for f in self.files if not f.selected]
|
||||
imgui.end_child()
|
||||
imgui.separator()
|
||||
if imgui.collapsing_header("Screenshots", imgui.TreeNodeFlags_.default_open):
|
||||
imgui.begin_child("Shots_child", imgui.ImVec2(-1, -1), True)
|
||||
for i, s in enumerate(self.screenshots):
|
||||
if imgui.button(f"x##s{i}"):
|
||||
self.screenshots.pop(i)
|
||||
break
|
||||
imgui.same_line()
|
||||
imgui.text(s)
|
||||
if imgui.button("Add Screenshots##adds"):
|
||||
r = hide_tk_root()
|
||||
paths = filedialog.askopenfilenames(filetypes=[("Images", "*.png *.jpg *.jpeg *.gif *.bmp *.webp"), ("All", "*.*")])
|
||||
r.destroy()
|
||||
for p in paths:
|
||||
if p not in self.screenshots:
|
||||
self.screenshots.append(p)
|
||||
imgui.end_child()
|
||||
if opened and exp: self._render_files_and_media()
|
||||
imgui.end()
|
||||
#endregion: Files & Media window
|
||||
|
||||
@@ -1020,20 +1008,19 @@ class App:
|
||||
self.show_windows["AI Settings"] = bool(opened)
|
||||
if exp:
|
||||
self._render_persona_selector_panel()
|
||||
if imgui.collapsing_header("Provider & Model"):
|
||||
self._render_provider_panel()
|
||||
if imgui.collapsing_header("System Prompts"):
|
||||
self._render_system_prompts_panel()
|
||||
if imgui.collapsing_header("RAG Settings"):
|
||||
self._render_rag_panel()
|
||||
if imgui.collapsing_header("Provider & Model"): self._render_provider_panel()
|
||||
if imgui.collapsing_header("System Prompts"): self._render_system_prompts_panel()
|
||||
if imgui.collapsing_header("RAG Settings"): self._render_rag_panel()
|
||||
self._render_agent_tools_panel()
|
||||
|
||||
#endregion: AI Settings
|
||||
|
||||
if self.ui_separate_usage_analytics and self.show_windows.get("Usage Analytics", False):
|
||||
exp, opened = imgui.begin("Usage Analytics", self.show_windows["Usage Analytics"])
|
||||
self.show_windows["Usage Analytics"] = bool(opened)
|
||||
if exp:
|
||||
self._render_usage_analytics_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.show_windows.get("MMA Dashboard", False):
|
||||
exp, opened = imgui.begin("MMA Dashboard", self.show_windows["MMA Dashboard"])
|
||||
self.show_windows["MMA Dashboard"] = bool(opened)
|
||||
@@ -1042,68 +1029,55 @@ class App:
|
||||
self._render_mma_dashboard()
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_mma_dashboard")
|
||||
imgui.end()
|
||||
#endregion: AI Settings
|
||||
|
||||
#region: Seprate Task Dag to Tier 4
|
||||
if self.ui_separate_task_dag and self.show_windows.get("Task DAG", False):
|
||||
exp, opened = imgui.begin("Task DAG", self.show_windows["Task DAG"])
|
||||
self.show_windows["Task DAG"] = bool(opened)
|
||||
if exp:
|
||||
self._render_task_dag_panel()
|
||||
if exp: self._render_task_dag_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier1 and self.show_windows.get("Tier 1: Strategy", False):
|
||||
exp, opened = imgui.begin("Tier 1: Strategy", self.show_windows["Tier 1: Strategy"])
|
||||
self.show_windows["Tier 1: Strategy"] = bool(opened)
|
||||
if exp:
|
||||
self._render_tier_stream_panel("Tier 1", "Tier 1")
|
||||
if exp: self._render_tier_stream_panel("Tier 1", "Tier 1")
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier2 and self.show_windows.get("Tier 2: Tech Lead", False):
|
||||
exp, opened = imgui.begin("Tier 2: Tech Lead", self.show_windows["Tier 2: Tech Lead"])
|
||||
self.show_windows["Tier 2: Tech Lead"] = bool(opened)
|
||||
if exp:
|
||||
self._render_tier_stream_panel("Tier 2", "Tier 2 (Tech Lead)")
|
||||
if exp: self._render_tier_stream_panel("Tier 2", "Tier 2 (Tech Lead)")
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier3 and self.show_windows.get("Tier 3: Workers", False):
|
||||
exp, opened = imgui.begin("Tier 3: Workers", self.show_windows["Tier 3: Workers"])
|
||||
self.show_windows["Tier 3: Workers"] = bool(opened)
|
||||
if exp:
|
||||
self._render_tier_stream_panel("Tier 3", None)
|
||||
if exp: self._render_tier_stream_panel("Tier 3", None)
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier4 and self.show_windows.get("Tier 4: QA", False):
|
||||
exp, opened = imgui.begin("Tier 4: QA", self.show_windows["Tier 4: QA"])
|
||||
self.show_windows["Tier 4: QA"] = bool(opened)
|
||||
if exp:
|
||||
self._render_tier_stream_panel("Tier 4", "Tier 4 (QA)")
|
||||
if exp: self._render_tier_stream_panel("Tier 4", "Tier 4 (QA)")
|
||||
imgui.end()
|
||||
#endregion: Separate Task Dag to Tier 4
|
||||
|
||||
if self.show_windows.get("Theme", False):
|
||||
self._render_theme_panel()
|
||||
if self.show_windows.get("Theme", False): self._render_theme_panel()
|
||||
|
||||
#region: Discussion Hub
|
||||
if self.show_windows.get("Discussion Hub", False):
|
||||
exp, opened = imgui.begin("Discussion Hub", self.show_windows["Discussion Hub"])
|
||||
self.show_windows["Discussion Hub"] = bool(opened)
|
||||
if exp:
|
||||
if imgui.begin_tab_bar("discussion_hub_tabs"):
|
||||
if imgui.begin_tab_item("Discussion")[0]:
|
||||
self._render_discussion_tab()
|
||||
imgui.end_tab_item()
|
||||
if imgui.begin_tab_item("Context Composition")[0]:
|
||||
self._render_context_composition_panel()
|
||||
imgui.end_tab_item()
|
||||
if imgui.begin_tab_item("Snapshot")[0]:
|
||||
self._render_snapshot_tab()
|
||||
imgui.end_tab_item()
|
||||
if imgui.begin_tab_item("Takes")[0]:
|
||||
self._render_takes_panel()
|
||||
imgui.end_tab_item()
|
||||
imgui.end_tab_bar()
|
||||
imgui.end()
|
||||
with imscope.window("Discussion Hub", self.show_windows["Discussion Hub"]) as (exp, opened):
|
||||
self.show_windows["Discussion Hub"] = bool(opened)
|
||||
if exp:
|
||||
if imscope.tab_bar("discussion_hub_tabs"):
|
||||
if imscope.tab_item("Discussion"):
|
||||
self._render_discussion_tab()
|
||||
if imscope.tab_item("Context Composition"):
|
||||
self._render_context_composition_panel()
|
||||
if imscope.tab_item("Snapshot"):
|
||||
self._render_snapshot_tab()
|
||||
if imscope.tab_item("Takes"):
|
||||
self._render_takes_panel()
|
||||
#endregion: Discussion Hub
|
||||
|
||||
#region: Operations Hub
|
||||
@@ -1122,23 +1096,17 @@ class App:
|
||||
if ch3: self.show_windows['External Tools'] = self.ui_separate_external_tools
|
||||
imgui.pop_style_var()
|
||||
|
||||
show_tc_tab = not self.ui_separate_tool_calls_panel
|
||||
show_tc_tab = not self.ui_separate_tool_calls_panel
|
||||
show_usage_tab = not self.ui_separate_usage_analytics
|
||||
|
||||
if imgui.begin_tab_bar("ops_tabs"):
|
||||
if imgui.begin_tab_item("Comms History")[0]:
|
||||
self._render_comms_history_panel()
|
||||
imgui.end_tab_item()
|
||||
with imscope.tab_bar("ops_tabs"):
|
||||
with imscope.tab_item("Comms History"): self._render_comms_history_panel()
|
||||
if show_tc_tab:
|
||||
if imgui.begin_tab_item("Tool Calls")[0]:
|
||||
self._render_tool_calls_panel()
|
||||
imgui.end_tab_item()
|
||||
with imscope.tab_item("Tool Calls"): self._render_tool_calls_panel()
|
||||
if show_usage_tab:
|
||||
if imgui.begin_tab_item("Usage Analytics")[0]:
|
||||
self._render_usage_analytics_panel()
|
||||
imgui.end_tab_item()
|
||||
with imscope.tab_item("Usage Analytics"): self._render_usage_analytics_panel()
|
||||
if not self.ui_separate_external_tools:
|
||||
if imgui.begin_tab_item("External Tools")[0]:
|
||||
with imscope.tab_item("External Tools"):
|
||||
self._render_external_tools_panel()
|
||||
imgui.separator()
|
||||
imgui.text("")
|
||||
@@ -1146,8 +1114,7 @@ class App:
|
||||
self._render_external_editor_panel()
|
||||
except Exception as e:
|
||||
imgui.text_colored(vec4(1, 0.3, 0.3, 1), f"Error: {str(e)}")
|
||||
imgui.end_tab_item()
|
||||
if imgui.begin_tab_item("Workspace Layouts")[0]:
|
||||
with imscope.tab_item("Workspace Layouts"):
|
||||
imgui.text("Experimental: Auto-switch layout by Tier")
|
||||
ch, self.controller.ui_auto_switch_layout = imgui.checkbox("Enable Auto-Switch", self.controller.ui_auto_switch_layout)
|
||||
if self.controller.ui_auto_switch_layout:
|
||||
@@ -1155,43 +1122,36 @@ class App:
|
||||
imgui.text("Tier Bindings (select profile for each tier)")
|
||||
profiles = [""] + [p.name for p in self.controller.workspace_profiles.values()]
|
||||
for t in ["Tier 1", "Tier 2", "Tier 3", "Tier 4"]:
|
||||
curr = self.controller.ui_tier_layout_bindings.get(t, "")
|
||||
idx = profiles.index(curr) if curr in profiles else 0
|
||||
curr = self.controller.ui_tier_layout_bindings.get(t, "")
|
||||
idx = profiles.index(curr) if curr in profiles else 0
|
||||
ch_combo, new_idx = imgui.combo(t, idx, profiles)
|
||||
if ch_combo:
|
||||
self.controller.ui_tier_layout_bindings[t] = profiles[new_idx]
|
||||
imgui.end_tab_item()
|
||||
imgui.end_tab_bar()
|
||||
imgui.end()
|
||||
if ch_combo: self.controller.ui_tier_layout_bindings[t] = profiles[new_idx]
|
||||
imgui.end()
|
||||
#endregion: Operations Hub
|
||||
|
||||
#region: Separate Message, Response, Tool Calls, External Tools
|
||||
if self.ui_separate_message_panel and self.show_windows.get("Message", False):
|
||||
exp, opened = imgui.begin("Message", self.show_windows["Message"])
|
||||
self.show_windows["Message"] = bool(opened)
|
||||
if exp:
|
||||
self._render_message_panel()
|
||||
if exp: self._render_message_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_response_panel and self.show_windows.get("Response", False):
|
||||
exp, opened = imgui.begin("Response", self.show_windows["Response"])
|
||||
self.show_windows["Response"] = bool(opened)
|
||||
if exp:
|
||||
self._render_response_panel()
|
||||
if exp: self._render_response_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tool_calls_panel and self.show_windows.get("Tool Calls", False):
|
||||
exp, opened = imgui.begin("Tool Calls", self.show_windows["Tool Calls"])
|
||||
self.show_windows["Tool Calls"] = bool(opened)
|
||||
if exp:
|
||||
self._render_tool_calls_panel()
|
||||
if exp: self._render_tool_calls_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_external_tools and self.show_windows.get('External Tools', False):
|
||||
exp, opened = imgui.begin('External Tools', self.show_windows['External Tools'])
|
||||
self.show_windows['External Tools'] = bool(opened)
|
||||
if exp:
|
||||
self._render_external_tools_panel()
|
||||
if exp: self._render_external_tools_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.show_windows.get("Log Management", False):
|
||||
@@ -1200,8 +1160,7 @@ class App:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_log_management")
|
||||
#endregion: Separate Message, Response, Tool Calls, External Tools
|
||||
|
||||
if self.show_windows.get("Diagnostics", False):
|
||||
self._render_diagnostics_panel()
|
||||
if self.show_windows.get("Diagnostics", False): self._render_diagnostics_panel()
|
||||
|
||||
self.perf_monitor.end_frame()
|
||||
|
||||
|
||||
+3
-3
@@ -133,9 +133,9 @@ class _ScopeTabItem:
|
||||
self._flags = flags
|
||||
self._open = None
|
||||
def __enter__(self):
|
||||
self._open = imgui.begin_tab_item(self._label, self._flags)
|
||||
return self._open
|
||||
exp, self._open = imgui.begin_tab_item(self._label, None, self._flags)
|
||||
return exp, self._open
|
||||
def __exit__(self, *args):
|
||||
if self._open[0]:
|
||||
if self._open:
|
||||
imgui.end_tab_item()
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user