feat(mma): Consolidate Agent Streams into MMA Dashboard with popout options

This commit is contained in:
2026-03-09 23:39:02 -04:00
parent 322f42db74
commit 3e531980d4
5 changed files with 135 additions and 49 deletions

View File

@@ -24,28 +24,28 @@ separate_response_panel = false
separate_tool_calls_panel = false separate_tool_calls_panel = false
bg_shader_enabled = true bg_shader_enabled = true
crt_filter_enabled = false crt_filter_enabled = false
separate_task_dag = false separate_task_dag = true
separate_usage_analytics = false separate_usage_analytics = true
[gui.show_windows] [gui.show_windows]
"Context Hub" = true "Context Hub" = true
"Files & Media" = true "Files & Media" = true
"AI Settings" = true "AI Settings" = true
"MMA Dashboard" = true "MMA Dashboard" = true
"Task DAG" = false "Task DAG" = true
"Usage Analytics" = false "Usage Analytics" = true
"Tier 1: Strategy" = true "Tier 1: Strategy" = true
"Tier 2: Tech Lead" = true "Tier 2: Tech Lead" = true
"Tier 3: Workers" = true "Tier 3: Workers" = true
"Tier 4: QA" = true "Tier 4: QA" = true
"Discussion Hub" = true "Discussion Hub" = true
"Operations Hub" = true "Operations Hub" = true
Message = false Message = true
Response = false Response = true
"Tool Calls" = false "Tool Calls" = true
Theme = true Theme = true
"Log Management" = true "Log Management" = true
Diagnostics = true Diagnostics = false
[theme] [theme]
palette = "Nord Dark" palette = "Nord Dark"

View File

@@ -73,8 +73,8 @@ Collapsed=0
DockId=0xAFC85805,2 DockId=0xAFC85805,2
[Window][Theme] [Window][Theme]
Pos=0,1164 Pos=0,1079
Size=760,973 Size=629,1058
Collapsed=0 Collapsed=0
DockId=0x00000002,2 DockId=0x00000002,2
@@ -84,14 +84,14 @@ Size=900,700
Collapsed=0 Collapsed=0
[Window][Diagnostics] [Window][Diagnostics]
Pos=2719,28 Pos=2833,28
Size=1121,1686 Size=1007,1695
Collapsed=0 Collapsed=0
DockId=0x0000000C,2 DockId=0x0000000C,2
[Window][Context Hub] [Window][Context Hub]
Pos=0,1164 Pos=0,1079
Size=760,973 Size=629,1058
Collapsed=0 Collapsed=0
DockId=0x00000002,1 DockId=0x00000002,1
@@ -102,26 +102,26 @@ Collapsed=0
DockId=0x0000000D,0 DockId=0x0000000D,0
[Window][Discussion Hub] [Window][Discussion Hub]
Pos=1606,28 Pos=1701,28
Size=1111,2109 Size=1130,2109
Collapsed=0 Collapsed=0
DockId=0x00000013,0 DockId=0x00000013,0
[Window][Operations Hub] [Window][Operations Hub]
Pos=762,28 Pos=631,28
Size=842,2109 Size=1068,2109
Collapsed=0 Collapsed=0
DockId=0x00000012,0 DockId=0x00000012,0
[Window][Files & Media] [Window][Files & Media]
Pos=0,1164 Pos=0,1079
Size=760,973 Size=629,1058
Collapsed=0 Collapsed=0
DockId=0x00000002,0 DockId=0x00000002,0
[Window][AI Settings] [Window][AI Settings]
Pos=0,28 Pos=0,28
Size=760,1134 Size=629,1049
Collapsed=0 Collapsed=0
DockId=0x00000001,0 DockId=0x00000001,0
@@ -131,14 +131,14 @@ Size=416,325
Collapsed=0 Collapsed=0
[Window][MMA Dashboard] [Window][MMA Dashboard]
Pos=2719,28 Pos=2833,28
Size=1121,1686 Size=1007,1695
Collapsed=0 Collapsed=0
DockId=0x0000000C,0 DockId=0x0000000C,0
[Window][Log Management] [Window][Log Management]
Pos=2719,28 Pos=2833,28
Size=1121,1686 Size=1007,1695
Collapsed=0 Collapsed=0
DockId=0x0000000C,1 DockId=0x0000000C,1
@@ -148,26 +148,26 @@ Size=262,209
Collapsed=0 Collapsed=0
[Window][Tier 1: Strategy] [Window][Tier 1: Strategy]
Pos=2719,1716 Pos=2833,1725
Size=1121,421 Size=1007,412
Collapsed=0 Collapsed=0
DockId=0x0000000F,0 DockId=0x0000000F,0
[Window][Tier 2: Tech Lead] [Window][Tier 2: Tech Lead]
Pos=2719,1716 Pos=2833,1725
Size=1121,421 Size=1007,412
Collapsed=0 Collapsed=0
DockId=0x0000000F,1 DockId=0x0000000F,1
[Window][Tier 4: QA] [Window][Tier 4: QA]
Pos=2719,1716 Pos=2833,1725
Size=1121,421 Size=1007,412
Collapsed=0 Collapsed=0
DockId=0x0000000F,2 DockId=0x0000000F,2
[Window][Tier 3: Workers] [Window][Tier 3: Workers]
Pos=762,28 Pos=631,28
Size=842,2109 Size=1068,2109
Collapsed=0 Collapsed=0
DockId=0x00000012,1 DockId=0x00000012,1
@@ -331,6 +331,11 @@ Pos=1461,823
Size=1190,872 Size=1190,872
Collapsed=0 Collapsed=0
[Window][Usage Analytics]
Pos=1636,680
Size=644,666
Collapsed=0
[Table][0xFB6E3870,4] [Table][0xFB6E3870,4]
RefScale=13 RefScale=13
Column 0 Width=80 Column 0 Width=80
@@ -420,18 +425,18 @@ DockNode ID=0x00000008 Pos=3125,170 Size=593,1157 Split=Y
DockNode ID=0x00000009 Parent=0x00000008 SizeRef=1029,147 Selected=0x0469CA7A DockNode ID=0x00000009 Parent=0x00000008 SizeRef=1029,147 Selected=0x0469CA7A
DockNode ID=0x0000000A Parent=0x00000008 SizeRef=1029,145 Selected=0xDF822E02 DockNode ID=0x0000000A Parent=0x00000008 SizeRef=1029,145 Selected=0xDF822E02
DockSpace ID=0xAFC85805 Window=0x079D3A04 Pos=0,28 Size=3840,2109 Split=X DockSpace ID=0xAFC85805 Window=0x079D3A04 Pos=0,28 Size=3840,2109 Split=X
DockNode ID=0x00000003 Parent=0xAFC85805 SizeRef=2717,1183 Split=X DockNode ID=0x00000003 Parent=0xAFC85805 SizeRef=2831,1183 Split=X
DockNode ID=0x0000000B Parent=0x00000003 SizeRef=404,1186 Split=X Selected=0xF4139CA2 DockNode ID=0x0000000B Parent=0x00000003 SizeRef=404,1186 Split=X Selected=0xF4139CA2
DockNode ID=0x00000007 Parent=0x0000000B SizeRef=760,858 Split=Y Selected=0x8CA2375C DockNode ID=0x00000007 Parent=0x0000000B SizeRef=629,858 Split=Y Selected=0x8CA2375C
DockNode ID=0x00000001 Parent=0x00000007 SizeRef=824,1134 CentralNode=1 Selected=0x7BD57D6A DockNode ID=0x00000001 Parent=0x00000007 SizeRef=824,1049 CentralNode=1 Selected=0x7BD57D6A
DockNode ID=0x00000002 Parent=0x00000007 SizeRef=824,973 Selected=0x1DCB2623 DockNode ID=0x00000002 Parent=0x00000007 SizeRef=824,1058 Selected=0x1DCB2623
DockNode ID=0x0000000E Parent=0x0000000B SizeRef=1955,858 Split=X Selected=0x418C7449 DockNode ID=0x0000000E Parent=0x0000000B SizeRef=2200,858 Split=X Selected=0x418C7449
DockNode ID=0x00000012 Parent=0x0000000E SizeRef=842,402 Selected=0x418C7449 DockNode ID=0x00000012 Parent=0x0000000E SizeRef=1068,402 Selected=0x418C7449
DockNode ID=0x00000013 Parent=0x0000000E SizeRef=1111,402 Selected=0x6F2B5B04 DockNode ID=0x00000013 Parent=0x0000000E SizeRef=1130,402 Selected=0x6F2B5B04
DockNode ID=0x0000000D Parent=0x00000003 SizeRef=435,1186 Selected=0x363E93D6 DockNode ID=0x0000000D Parent=0x00000003 SizeRef=435,1186 Selected=0x363E93D6
DockNode ID=0x00000004 Parent=0xAFC85805 SizeRef=1121,1183 Split=Y Selected=0x3AEC3498 DockNode ID=0x00000004 Parent=0xAFC85805 SizeRef=1007,1183 Split=Y Selected=0x3AEC3498
DockNode ID=0x0000000C Parent=0x00000004 SizeRef=1074,1681 Selected=0x3AEC3498 DockNode ID=0x0000000C Parent=0x00000004 SizeRef=1074,1695 Selected=0x3AEC3498
DockNode ID=0x0000000F Parent=0x00000004 SizeRef=1074,420 Selected=0xBB346584 DockNode ID=0x0000000F Parent=0x00000004 SizeRef=1074,412 Selected=0xBB346584
;;;<<<Layout_655921752_Default>>>;;; ;;;<<<Layout_655921752_Default>>>;;;
;;;<<<HelloImGui_Misc>>>;;; ;;;<<<HelloImGui_Misc>>>;;;

View File

@@ -0,0 +1,12 @@
prompt = """
In src/gui_2.py:
1. In '__init__', initialize 'self.ui_separate_tier1' through 'self.ui_separate_tier4' from 'gui_cfg'.
2. In '_gui_func', replace the existing Tier window rendering (around line 480) with logic that checks 'self.ui_separate_tierN' and 'self.show_windows.get("Tier N", False)'.
3. At the end of '_render_mma_dashboard', add a 'Agent Streams' tab bar.
4. For each Tier (1-4), add a tab.
5. Inside each tab:
- Add a 'Pop Out Tier [N]' checkbox. If changed, update 'self.show_windows["Tier [N]"]'.
- If 'not self.ui_separate_tierN', call 'self._render_tier_stream_panel("Tier N", "Display Name")'.
- If 'self.ui_separate_tierN', show 'imgui.text_disabled("Tier [N] stream is detached.")'.
Use 1-space indentation.
"""

View File

@@ -345,7 +345,11 @@ class AppController:
'_editing_preset_scope': '_editing_preset_scope', '_editing_preset_scope': '_editing_preset_scope',
'show_windows': 'show_windows', 'show_windows': 'show_windows',
'ui_separate_task_dag': 'ui_separate_task_dag', 'ui_separate_task_dag': 'ui_separate_task_dag',
'ui_separate_usage_analytics': 'ui_separate_usage_analytics' 'ui_separate_usage_analytics': 'ui_separate_usage_analytics',
'ui_separate_tier1': 'ui_separate_tier1',
'ui_separate_tier2': 'ui_separate_tier2',
'ui_separate_tier3': 'ui_separate_tier3',
'ui_separate_tier4': 'ui_separate_tier4'
} }
self._gettable_fields = dict(self._settable_fields) self._gettable_fields = dict(self._settable_fields)
self._gettable_fields.update({ self._gettable_fields.update({
@@ -384,7 +388,11 @@ class AppController:
'_editing_preset_max_output_tokens': '_editing_preset_max_output_tokens', '_editing_preset_max_output_tokens': '_editing_preset_max_output_tokens',
'_editing_preset_scope': '_editing_preset_scope', '_editing_preset_scope': '_editing_preset_scope',
'ui_separate_task_dag': 'ui_separate_task_dag', 'ui_separate_task_dag': 'ui_separate_task_dag',
'ui_separate_usage_analytics': 'ui_separate_usage_analytics' 'ui_separate_usage_analytics': 'ui_separate_usage_analytics',
'ui_separate_tier1': 'ui_separate_tier1',
'ui_separate_tier2': 'ui_separate_tier2',
'ui_separate_tier3': 'ui_separate_tier3',
'ui_separate_tier4': 'ui_separate_tier4'
}) })
self.perf_monitor = performance_monitor.get_monitor() self.perf_monitor = performance_monitor.get_monitor()
self._perf_profiling_enabled = False self._perf_profiling_enabled = False
@@ -786,6 +794,10 @@ class AppController:
"""Initializes the application state from configurations.""" """Initializes the application state from configurations."""
self.ui_separate_task_dag = False self.ui_separate_task_dag = False
self.ui_separate_usage_analytics = False self.ui_separate_usage_analytics = False
self.ui_separate_tier1 = False
self.ui_separate_tier2 = False
self.ui_separate_tier3 = False
self.ui_separate_tier4 = False
self.config = models.load_config() self.config = models.load_config()
theme.load_from_config(self.config) theme.load_from_config(self.config)
ai_cfg = self.config.get("ai", {}) ai_cfg = self.config.get("ai", {})
@@ -846,6 +858,10 @@ class AppController:
"MMA Dashboard": True, "MMA Dashboard": True,
"Task DAG": False, "Task DAG": False,
"Usage Analytics": False, "Usage Analytics": False,
"Tier 1": False,
"Tier 2": False,
"Tier 3": False,
"Tier 4": False,
"Tier 1: Strategy": True, "Tier 1: Strategy": True,
"Tier 2: Tech Lead": True, "Tier 2: Tech Lead": True,
"Tier 3: Workers": True, "Tier 3: Workers": True,
@@ -2189,6 +2205,10 @@ class AppController:
"separate_tool_calls_panel": getattr(self, "ui_separate_tool_calls_panel", False), "separate_tool_calls_panel": getattr(self, "ui_separate_tool_calls_panel", False),
"separate_task_dag": self.ui_separate_task_dag, "separate_task_dag": self.ui_separate_task_dag,
"separate_usage_analytics": self.ui_separate_usage_analytics, "separate_usage_analytics": self.ui_separate_usage_analytics,
"separate_tier1": self.ui_separate_tier1,
"separate_tier2": self.ui_separate_tier2,
"separate_tier3": self.ui_separate_tier3,
"separate_tier4": self.ui_separate_tier4,
"bg_shader_enabled": bg_shader.get_bg().enabled "bg_shader_enabled": bg_shader.get_bg().enabled
}) })
self.config["gui"] = gui_cfg self.config["gui"] = gui_cfg

View File

@@ -128,7 +128,15 @@ class App:
self.ui_separate_tool_calls_panel = gui_cfg.get("separate_tool_calls_panel", False) self.ui_separate_tool_calls_panel = gui_cfg.get("separate_tool_calls_panel", False)
self.ui_separate_task_dag = gui_cfg.get("separate_task_dag", False) self.ui_separate_task_dag = gui_cfg.get("separate_task_dag", False)
self.ui_separate_usage_analytics = gui_cfg.get("separate_usage_analytics", False) self.ui_separate_usage_analytics = gui_cfg.get("separate_usage_analytics", False)
self.ui_separate_tier1 = gui_cfg.get("separate_tier1", False)
self.ui_separate_tier2 = gui_cfg.get("separate_tier2", False)
self.ui_separate_tier3 = gui_cfg.get("separate_tier3", False)
self.ui_separate_tier4 = gui_cfg.get("separate_tier4", False)
self.show_windows.setdefault("Usage Analytics", False) self.show_windows.setdefault("Usage Analytics", False)
self.show_windows.setdefault("Tier 1: Strategy", False)
self.show_windows.setdefault("Tier 2: Tech Lead", False)
self.show_windows.setdefault("Tier 3: Workers", False)
self.show_windows.setdefault("Tier 4: QA", False)
self.ui_multi_viewport = gui_cfg.get("multi_viewport", False) self.ui_multi_viewport = gui_cfg.get("multi_viewport", False)
self.layout_presets = self.config.get("layout_presets", {}) self.layout_presets = self.config.get("layout_presets", {})
self._new_preset_name = "" self._new_preset_name = ""
@@ -438,25 +446,25 @@ class App:
if exp: if exp:
self._render_task_dag_panel() self._render_task_dag_panel()
imgui.end() imgui.end()
if self.show_windows.get("Tier 1: Strategy", False): 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"]) exp, opened = imgui.begin("Tier 1: Strategy", self.show_windows["Tier 1: Strategy"])
self.show_windows["Tier 1: Strategy"] = bool(opened) self.show_windows["Tier 1: Strategy"] = bool(opened)
if exp: if exp:
self._render_tier_stream_panel("Tier 1", "Tier 1") self._render_tier_stream_panel("Tier 1", "Tier 1")
imgui.end() imgui.end()
if self.show_windows.get("Tier 2: Tech Lead", False): 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"]) exp, opened = imgui.begin("Tier 2: Tech Lead", self.show_windows["Tier 2: Tech Lead"])
self.show_windows["Tier 2: Tech Lead"] = bool(opened) self.show_windows["Tier 2: Tech Lead"] = bool(opened)
if exp: if exp:
self._render_tier_stream_panel("Tier 2", "Tier 2 (Tech Lead)") self._render_tier_stream_panel("Tier 2", "Tier 2 (Tech Lead)")
imgui.end() imgui.end()
if self.show_windows.get("Tier 3: Workers", False): 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"]) exp, opened = imgui.begin("Tier 3: Workers", self.show_windows["Tier 3: Workers"])
self.show_windows["Tier 3: Workers"] = bool(opened) self.show_windows["Tier 3: Workers"] = bool(opened)
if exp: if exp:
self._render_tier_stream_panel("Tier 3", None) self._render_tier_stream_panel("Tier 3", None)
imgui.end() imgui.end()
if self.show_windows.get("Tier 4: QA", False): 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"]) exp, opened = imgui.begin("Tier 4: QA", self.show_windows["Tier 4: QA"])
self.show_windows["Tier 4: QA"] = bool(opened) self.show_windows["Tier 4: QA"] = bool(opened)
if exp: if exp:
@@ -2771,6 +2779,47 @@ def hello():
self.ui_selected_ticket_id = None self.ui_selected_ticket_id = None
self._push_mma_state_update() self._push_mma_state_update()
imgui.separator()
imgui.text("Agent Streams")
if imgui.begin_tab_bar("mma_streams_tabs"):
# Tier 1
if imgui.begin_tab_item("Tier 1")[0]:
ch, self.ui_separate_tier1 = imgui.checkbox("Pop Out Tier 1", self.ui_separate_tier1)
if ch: self.show_windows["Tier 1: Strategy"] = self.ui_separate_tier1
if not self.ui_separate_tier1:
self._render_tier_stream_panel("Tier 1", "Tier 1")
else:
imgui.text_disabled("Tier 1 stream is detached.")
imgui.end_tab_item()
# Tier 2
if imgui.begin_tab_item("Tier 2")[0]:
ch, self.ui_separate_tier2 = imgui.checkbox("Pop Out Tier 2", self.ui_separate_tier2)
if ch: self.show_windows["Tier 2: Tech Lead"] = self.ui_separate_tier2
if not self.ui_separate_tier2:
self._render_tier_stream_panel("Tier 2", "Tier 2 (Tech Lead)")
else:
imgui.text_disabled("Tier 2 stream is detached.")
imgui.end_tab_item()
# Tier 3
if imgui.begin_tab_item("Tier 3")[0]:
ch, self.ui_separate_tier3 = imgui.checkbox("Pop Out Tier 3", self.ui_separate_tier3)
if ch: self.show_windows["Tier 3: Workers"] = self.ui_separate_tier3
if not self.ui_separate_tier3:
self._render_tier_stream_panel("Tier 3", None)
else:
imgui.text_disabled("Tier 3 stream is detached.")
imgui.end_tab_item()
# Tier 4
if imgui.begin_tab_item("Tier 4")[0]:
ch, self.ui_separate_tier4 = imgui.checkbox("Pop Out Tier 4", self.ui_separate_tier4)
if ch: self.show_windows["Tier 4: QA"] = self.ui_separate_tier4
if not self.ui_separate_tier4:
self._render_tier_stream_panel("Tier 4", "Tier 4 (QA)")
else:
imgui.text_disabled("Tier 4 stream is detached.")
imgui.end_tab_item()
imgui.end_tab_bar()
def _render_task_dag_panel(self) -> None: def _render_task_dag_panel(self) -> None:
# 4. Task DAG Visualizer # 4. Task DAG Visualizer
imgui.text("Task DAG") imgui.text("Task DAG")