4 Commits

13 changed files with 77 additions and 110 deletions
@@ -36,5 +36,8 @@ Finalize the migration and decommission the original `gui.py`.
- [x] Task: Update project entry point or documentation to point to `gui_2.py` as the primary interface. [b92fa90] - [x] Task: Update project entry point or documentation to point to `gui_2.py` as the primary interface. [b92fa90]
- [x] Task: Final project-wide link validation and documentation update. [14984c5] - [x] Task: Final project-wide link validation and documentation update. [14984c5]
- [x] Task: Conductor - User Manual Verification 'Phase 4: Deprecation and Cleanup' (Protocol in workflow.md) [14984c5] - [x] Task: Conductor - User Manual Verification 'Phase 4: Deprecation and Cleanup' (Protocol in workflow.md) [14984c5]
## Phase: Review Fixes
- [x] Task: Apply review suggestions [6f1e00b]
--- ---
[checkpoint: (SHA will be recorded here)] [checkpoint: 6f1e00b]
-5
View File
@@ -30,11 +30,6 @@ This file tracks all major tracks for the project. Each track has its own detail
--- ---
- [x] **Track: Investigate differences left between gui.py and gui_2.py. Needs to reach full parity, so we can sunset guy.py**
*Link: [./tracks/gui2_parity_20260224/](./tracks/gui2_parity_20260224/)*
---
- [ ] **Track: 4-Tier Architecture Implementation & Conductor Self-Improvement** - [ ] **Track: 4-Tier Architecture Implementation & Conductor Self-Improvement**
*Link: [./tracks/mma_implementation_20260224/](./tracks/mma_implementation_20260224/)* *Link: [./tracks/mma_implementation_20260224/](./tracks/mma_implementation_20260224/)*
+2 -2
View File
@@ -8,9 +8,9 @@ system_prompt = ""
[theme] [theme]
palette = "Gold" palette = "Gold"
font_path = ""
font_size = 14.0 font_size = 14.0
scale = 1.5 scale = 1.2000000476837158
font_path = ""
[projects] [projects]
paths = [ paths = [
+10
View File
@@ -36,15 +36,18 @@ def save_config(config: dict):
with open(CONFIG_PATH, "wb") as f: with open(CONFIG_PATH, "wb") as f:
tomli_w.dump(config, f) tomli_w.dump(config, f)
def hide_tk_root() -> Tk: def hide_tk_root() -> Tk:
root = Tk() root = Tk()
root.withdraw() root.withdraw()
root.wm_attributes("-topmost", True) root.wm_attributes("-topmost", True)
return root return root
# Color Helpers # Color Helpers
def vec4(r, g, b, a=1.0): return imgui.ImVec4(r/255, g/255, b/255, a) def vec4(r, g, b, a=1.0): return imgui.ImVec4(r/255, g/255, b/255, a)
C_OUT = vec4(100, 200, 255) C_OUT = vec4(100, 200, 255)
C_IN = vec4(140, 255, 160) C_IN = vec4(140, 255, 160)
C_REQ = vec4(255, 220, 100) C_REQ = vec4(255, 220, 100)
@@ -65,6 +68,7 @@ HEAVY_KEYS = {"message", "text", "script", "output", "content"}
DISC_ROLES = ["User", "AI", "Vendor API", "System"] DISC_ROLES = ["User", "AI", "Vendor API", "System"]
AGENT_TOOL_NAMES = ["run_powershell", "read_file", "list_directory", "search_files", "get_file_summary", "web_search", "fetch_url"] AGENT_TOOL_NAMES = ["run_powershell", "read_file", "list_directory", "search_files", "get_file_summary", "web_search", "fetch_url"]
def truncate_entries(entries: list[dict], max_pairs: int) -> list[dict]: def truncate_entries(entries: list[dict], max_pairs: int) -> list[dict]:
if max_pairs <= 0: if max_pairs <= 0:
return [] return []
@@ -73,6 +77,7 @@ def truncate_entries(entries: list[dict], max_pairs: int) -> list[dict]:
return entries return entries
return entries[-target_count:] return entries[-target_count:]
def _parse_history_entries(history: list[str], roles: list[str] | None = None) -> list[dict]: def _parse_history_entries(history: list[str], roles: list[str] | None = None) -> list[dict]:
known = roles if roles is not None else DISC_ROLES known = roles if roles is not None else DISC_ROLES
entries = [] entries = []
@@ -80,6 +85,7 @@ def _parse_history_entries(history: list[str], roles: list[str] | None = None) -
entries.append(project_manager.str_to_entry(raw, known)) entries.append(project_manager.str_to_entry(raw, known))
return entries return entries
class ConfirmDialog: class ConfirmDialog:
_next_id = 0 _next_id = 0
def __init__(self, script: str, base_dir: str): def __init__(self, script: str, base_dir: str):
@@ -94,7 +100,10 @@ class ConfirmDialog:
self._event.wait() self._event.wait()
return self._approved, self._script return self._approved, self._script
class App: class App:
"""The main ImGui interface orchestrator for Manual Slop."""
def __init__(self): def __init__(self):
self.config = load_config() self.config = load_config()
@@ -1870,6 +1879,7 @@ class App:
theme.apply_current() theme.apply_current()
def run(self): def run(self):
"""Initializes the ImGui runner and starts the main application loop."""
theme.load_from_config(self.config) theme.load_from_config(self.config)
self.runner_params = hello_imgui.RunnerParams() self.runner_params = hello_imgui.RunnerParams()
+1 -1
View File
@@ -121,7 +121,7 @@ history = [
[discussion.discussions."test gemini mock interaction"] [discussion.discussions."test gemini mock interaction"]
git_commit = "" git_commit = ""
last_updated = "2026-02-23T22:59:50" last_updated = "2026-02-24T21:42:09"
history = [] history = []
[agent.tools] [agent.tools]
+38 -40
View File
@@ -12,7 +12,7 @@ ViewportPos=43,95
ViewportId=0x78C57832 ViewportId=0x78C57832
Size=897,649 Size=897,649
Collapsed=0 Collapsed=0
DockId=0x00000002,0 DockId=0x00000007,0
[Window][Files] [Window][Files]
ViewportPos=3125,170 ViewportPos=3125,170
@@ -33,7 +33,7 @@ DockId=0x0000000A,0
Pos=0,17 Pos=0,17
Size=1680,730 Size=1680,730
Collapsed=0 Collapsed=0
DockId=0x00000011,0 DockId=0x00000007,0
[Window][Provider] [Window][Provider]
ViewportPos=43,95 ViewportPos=43,95
@@ -41,7 +41,7 @@ ViewportId=0x78C57832
Pos=0,651 Pos=0,651
Size=897,468 Size=897,468
Collapsed=0 Collapsed=0
DockId=0x00000002,0 DockId=0x00000007,0
[Window][Message] [Window][Message]
Pos=0,749 Pos=0,749
@@ -78,11 +78,10 @@ Collapsed=0
DockId=0x0000000F,2 DockId=0x0000000F,2
[Window][Theme] [Window][Theme]
ViewportPos=43,95 Pos=0,17
ViewportId=0x78C57832 Size=432,858
Size=897,1896
Collapsed=0 Collapsed=0
DockId=0x00000002,0 DockId=0x00000007,2
[Window][Text Viewer - Entry #7] [Window][Text Viewer - Entry #7]
Pos=379,324 Pos=379,324
@@ -90,16 +89,16 @@ Size=900,700
Collapsed=0 Collapsed=0
[Window][Diagnostics] [Window][Diagnostics]
Pos=1190,794 Pos=863,794
Size=490,406 Size=817,406
Collapsed=0 Collapsed=0
DockId=0x00000006,0 DockId=0x00000006,0
[Window][Context Hub] [Window][Context Hub]
Pos=0,17 Pos=0,17
Size=270,728 Size=432,858
Collapsed=0 Collapsed=0
DockId=0x00000011,0 DockId=0x00000007,0
[Window][AI Settings Hub] [Window][AI Settings Hub]
Pos=406,17 Pos=406,17
@@ -108,49 +107,48 @@ Collapsed=0
DockId=0x0000000D,0 DockId=0x0000000D,0
[Window][Discussion Hub] [Window][Discussion Hub]
Pos=1190,17 Pos=863,17
Size=490,775 Size=817,775
Collapsed=0 Collapsed=0
DockId=0x00000005,0 DockId=0x00000005,0
[Window][Operations Hub] [Window][Operations Hub]
Pos=272,17 Pos=434,17
Size=916,1183 Size=427,858
Collapsed=0 Collapsed=0
DockId=0x00000010,0 DockId=0x0000000E,0
[Window][Files & Media] [Window][Files & Media]
Pos=0,17 Pos=0,17
Size=270,728 Size=432,858
Collapsed=0 Collapsed=0
DockId=0x00000011,1 DockId=0x00000007,1
[Window][AI Settings] [Window][AI Settings]
Pos=0,747 Pos=0,877
Size=270,453 Size=861,323
Collapsed=0 Collapsed=0
DockId=0x00000012,0 DockId=0x00000013,0
[Docking][Data] [Docking][Data]
DockNode ID=0x00000007 Pos=43,95 Size=897,1896 Split=Y DockNode ID=0x00000008 Pos=3125,170 Size=593,1157 Split=Y
DockNode ID=0x00000002 Parent=0x00000007 SizeRef=1029,1119 Selected=0x8CA2375C DockNode ID=0x00000009 Parent=0x00000008 SizeRef=1029,147 Selected=0x0469CA7A
DockNode ID=0x00000001 Parent=0x00000007 SizeRef=1029,775 Selected=0x8B4EBFA6 DockNode ID=0x0000000A Parent=0x00000008 SizeRef=1029,145 Selected=0xDF822E02
DockNode ID=0x00000008 Pos=3125,170 Size=593,1157 Split=Y DockSpace ID=0xAFC85805 Window=0x079D3A04 Pos=0,17 Size=1680,1183 Split=Y
DockNode ID=0x00000009 Parent=0x00000008 SizeRef=1029,147 Selected=0x0469CA7A DockNode ID=0x0000000C Parent=0xAFC85805 SizeRef=1362,1041 Split=X Selected=0x5D11106F
DockNode ID=0x0000000A Parent=0x00000008 SizeRef=1029,145 Selected=0xDF822E02 DockNode ID=0x00000003 Parent=0x0000000C SizeRef=861,1183 Split=X
DockSpace ID=0xAFC85805 Window=0x079D3A04 Pos=216,256 Size=1680,1183 Split=Y DockNode ID=0x0000000B Parent=0x00000003 SizeRef=404,1186 Split=Y Selected=0xF4139CA2
DockNode ID=0x0000000C Parent=0xAFC85805 SizeRef=1362,1041 Split=X Selected=0x5D11106F DockNode ID=0x00000002 Parent=0x0000000B SizeRef=1029,1119 Split=Y Selected=0xF4139CA2
DockNode ID=0x00000003 Parent=0x0000000C SizeRef=1188,1183 Split=X DockNode ID=0x00000010 Parent=0x00000002 SizeRef=432,328 Split=X Selected=0x8CA2375C
DockNode ID=0x0000000B Parent=0x00000003 SizeRef=404,1186 Split=X Selected=0xF4139CA2 DockNode ID=0x00000007 Parent=0x00000010 SizeRef=432,858 CentralNode=1 Selected=0x8CA2375C
DockNode ID=0x0000000E Parent=0x0000000B SizeRef=270,1183 Split=Y Selected=0xF4139CA2 DockNode ID=0x0000000E Parent=0x00000010 SizeRef=427,858 Selected=0x418C7449
DockNode ID=0x00000011 Parent=0x0000000E SizeRef=422,728 CentralNode=1 Selected=0xF4139CA2 DockNode ID=0x00000013 Parent=0x00000002 SizeRef=432,323 Selected=0x7BD57D6A
DockNode ID=0x00000012 Parent=0x0000000E SizeRef=422,453 Selected=0x7BD57D6A DockNode ID=0x00000001 Parent=0x0000000B SizeRef=1029,775 Selected=0x8B4EBFA6
DockNode ID=0x00000010 Parent=0x0000000B SizeRef=916,1183 Selected=0x418C7449 DockNode ID=0x0000000D Parent=0x00000003 SizeRef=435,1186 Selected=0x363E93D6
DockNode ID=0x0000000D Parent=0x00000003 SizeRef=435,1186 Selected=0x363E93D6 DockNode ID=0x00000004 Parent=0x0000000C SizeRef=817,1183 Split=Y Selected=0x418C7449
DockNode ID=0x00000004 Parent=0x0000000C SizeRef=490,1183 Split=Y Selected=0x418C7449 DockNode ID=0x00000005 Parent=0x00000004 SizeRef=837,775 Selected=0x6F2B5B04
DockNode ID=0x00000005 Parent=0x00000004 SizeRef=837,775 Selected=0x6F2B5B04 DockNode ID=0x00000006 Parent=0x00000004 SizeRef=837,406 Selected=0xB4CBF21A
DockNode ID=0x00000006 Parent=0x00000004 SizeRef=837,406 Selected=0xB4CBF21A DockNode ID=0x0000000F Parent=0xAFC85805 SizeRef=1362,451 Selected=0xDD6419BC
DockNode ID=0x0000000F Parent=0xAFC85805 SizeRef=1362,451 Selected=0xDD6419BC
;;;<<<Layout_655921752_Default>>>;;; ;;;<<<Layout_655921752_Default>>>;;;
;;;<<<HelloImGui_Misc>>>;;; ;;;<<<HelloImGui_Misc>>>;;;
+1 -1
View File
@@ -35,5 +35,5 @@ active = "main"
[discussion.discussions.main] [discussion.discussions.main]
git_commit = "" git_commit = ""
last_updated = "2026-02-24T19:59:19" last_updated = "2026-02-24T21:55:23"
history = [] history = []
+14
View File
@@ -4,6 +4,13 @@ import time
import requests import requests
import os import os
import signal import signal
import sys
import os
# Ensure project root is in path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from api_hook_client import ApiHookClient
def kill_process_tree(pid): def kill_process_tree(pid):
"""Robustly kills a process and all its children.""" """Robustly kills a process and all its children."""
@@ -67,10 +74,17 @@ def live_gui(request):
kill_process_tree(process.pid) kill_process_tree(process.pid)
pytest.fail(f"Failed to start {gui_script} with test hooks.") pytest.fail(f"Failed to start {gui_script} with test hooks.")
client = ApiHookClient() # Initialize client here
try: try:
yield process, gui_script yield process, gui_script
finally: finally:
print(f"\n[Fixture] Finally block triggered: Shutting down {gui_script}...") print(f"\n[Fixture] Finally block triggered: Shutting down {gui_script}...")
# Reset the GUI state before shutting down
try:
client.reset_session()
time.sleep(1) # Give GUI time to process reset
except Exception as e:
print(f"[Fixture] Error resetting GUI session: {e}")
kill_process_tree(process.pid) kill_process_tree(process.pid)
log_file.close() log_file.close()
+2 -55
View File
@@ -38,58 +38,5 @@ auto_add = true
[discussion.discussions.main] [discussion.discussions.main]
git_commit = "" git_commit = ""
last_updated = "2026-02-24T19:59:10" last_updated = "2026-02-24T21:55:18"
history = [ history = []
"@1771981100.9238136\nUser:\nStress test entry 0 Stress test entry 0 Stress test entry 0 Stress test entry 0 Stress test entry 0",
"@1771981100.9238136\nUser:\nStress test entry 1 Stress test entry 1 Stress test entry 1 Stress test entry 1 Stress test entry 1",
"@1771981100.9238136\nUser:\nStress test entry 2 Stress test entry 2 Stress test entry 2 Stress test entry 2 Stress test entry 2",
"@1771981100.9238136\nUser:\nStress test entry 3 Stress test entry 3 Stress test entry 3 Stress test entry 3 Stress test entry 3",
"@1771981100.9238136\nUser:\nStress test entry 4 Stress test entry 4 Stress test entry 4 Stress test entry 4 Stress test entry 4",
"@1771981100.9238136\nUser:\nStress test entry 5 Stress test entry 5 Stress test entry 5 Stress test entry 5 Stress test entry 5",
"@1771981100.9238136\nUser:\nStress test entry 6 Stress test entry 6 Stress test entry 6 Stress test entry 6 Stress test entry 6",
"@1771981100.9238136\nUser:\nStress test entry 7 Stress test entry 7 Stress test entry 7 Stress test entry 7 Stress test entry 7",
"@1771981100.9238136\nUser:\nStress test entry 8 Stress test entry 8 Stress test entry 8 Stress test entry 8 Stress test entry 8",
"@1771981100.9238136\nUser:\nStress test entry 9 Stress test entry 9 Stress test entry 9 Stress test entry 9 Stress test entry 9",
"@1771981100.9238136\nUser:\nStress test entry 10 Stress test entry 10 Stress test entry 10 Stress test entry 10 Stress test entry 10",
"@1771981100.9238136\nUser:\nStress test entry 11 Stress test entry 11 Stress test entry 11 Stress test entry 11 Stress test entry 11",
"@1771981100.9238136\nUser:\nStress test entry 12 Stress test entry 12 Stress test entry 12 Stress test entry 12 Stress test entry 12",
"@1771981100.9238136\nUser:\nStress test entry 13 Stress test entry 13 Stress test entry 13 Stress test entry 13 Stress test entry 13",
"@1771981100.9238136\nUser:\nStress test entry 14 Stress test entry 14 Stress test entry 14 Stress test entry 14 Stress test entry 14",
"@1771981100.9238136\nUser:\nStress test entry 15 Stress test entry 15 Stress test entry 15 Stress test entry 15 Stress test entry 15",
"@1771981100.9238136\nUser:\nStress test entry 16 Stress test entry 16 Stress test entry 16 Stress test entry 16 Stress test entry 16",
"@1771981100.9238136\nUser:\nStress test entry 17 Stress test entry 17 Stress test entry 17 Stress test entry 17 Stress test entry 17",
"@1771981100.9238136\nUser:\nStress test entry 18 Stress test entry 18 Stress test entry 18 Stress test entry 18 Stress test entry 18",
"@1771981100.9238136\nUser:\nStress test entry 19 Stress test entry 19 Stress test entry 19 Stress test entry 19 Stress test entry 19",
"@1771981100.9238136\nUser:\nStress test entry 20 Stress test entry 20 Stress test entry 20 Stress test entry 20 Stress test entry 20",
"@1771981100.9238136\nUser:\nStress test entry 21 Stress test entry 21 Stress test entry 21 Stress test entry 21 Stress test entry 21",
"@1771981100.9238136\nUser:\nStress test entry 22 Stress test entry 22 Stress test entry 22 Stress test entry 22 Stress test entry 22",
"@1771981100.9238136\nUser:\nStress test entry 23 Stress test entry 23 Stress test entry 23 Stress test entry 23 Stress test entry 23",
"@1771981100.9238136\nUser:\nStress test entry 24 Stress test entry 24 Stress test entry 24 Stress test entry 24 Stress test entry 24",
"@1771981100.9238136\nUser:\nStress test entry 25 Stress test entry 25 Stress test entry 25 Stress test entry 25 Stress test entry 25",
"@1771981100.9238136\nUser:\nStress test entry 26 Stress test entry 26 Stress test entry 26 Stress test entry 26 Stress test entry 26",
"@1771981100.9238136\nUser:\nStress test entry 27 Stress test entry 27 Stress test entry 27 Stress test entry 27 Stress test entry 27",
"@1771981100.9238136\nUser:\nStress test entry 28 Stress test entry 28 Stress test entry 28 Stress test entry 28 Stress test entry 28",
"@1771981100.9238136\nUser:\nStress test entry 29 Stress test entry 29 Stress test entry 29 Stress test entry 29 Stress test entry 29",
"@1771981100.9238136\nUser:\nStress test entry 30 Stress test entry 30 Stress test entry 30 Stress test entry 30 Stress test entry 30",
"@1771981100.9238136\nUser:\nStress test entry 31 Stress test entry 31 Stress test entry 31 Stress test entry 31 Stress test entry 31",
"@1771981100.9238136\nUser:\nStress test entry 32 Stress test entry 32 Stress test entry 32 Stress test entry 32 Stress test entry 32",
"@1771981100.9238136\nUser:\nStress test entry 33 Stress test entry 33 Stress test entry 33 Stress test entry 33 Stress test entry 33",
"@1771981100.9238136\nUser:\nStress test entry 34 Stress test entry 34 Stress test entry 34 Stress test entry 34 Stress test entry 34",
"@1771981100.9238136\nUser:\nStress test entry 35 Stress test entry 35 Stress test entry 35 Stress test entry 35 Stress test entry 35",
"@1771981100.9238136\nUser:\nStress test entry 36 Stress test entry 36 Stress test entry 36 Stress test entry 36 Stress test entry 36",
"@1771981100.9238136\nUser:\nStress test entry 37 Stress test entry 37 Stress test entry 37 Stress test entry 37 Stress test entry 37",
"@1771981100.9238136\nUser:\nStress test entry 38 Stress test entry 38 Stress test entry 38 Stress test entry 38 Stress test entry 38",
"@1771981100.9238136\nUser:\nStress test entry 39 Stress test entry 39 Stress test entry 39 Stress test entry 39 Stress test entry 39",
"@1771981100.9238136\nUser:\nStress test entry 40 Stress test entry 40 Stress test entry 40 Stress test entry 40 Stress test entry 40",
"@1771981100.9238136\nUser:\nStress test entry 41 Stress test entry 41 Stress test entry 41 Stress test entry 41 Stress test entry 41",
"@1771981100.9238136\nUser:\nStress test entry 42 Stress test entry 42 Stress test entry 42 Stress test entry 42 Stress test entry 42",
"@1771981100.9238136\nUser:\nStress test entry 43 Stress test entry 43 Stress test entry 43 Stress test entry 43 Stress test entry 43",
"@1771981100.9238136\nUser:\nStress test entry 44 Stress test entry 44 Stress test entry 44 Stress test entry 44 Stress test entry 44",
"@1771981100.9238136\nUser:\nStress test entry 45 Stress test entry 45 Stress test entry 45 Stress test entry 45 Stress test entry 45",
"@1771981100.9238136\nUser:\nStress test entry 46 Stress test entry 46 Stress test entry 46 Stress test entry 46 Stress test entry 46",
"@1771981100.9238136\nUser:\nStress test entry 47 Stress test entry 47 Stress test entry 47 Stress test entry 47 Stress test entry 47",
"@1771981100.9238136\nUser:\nStress test entry 48 Stress test entry 48 Stress test entry 48 Stress test entry 48 Stress test entry 48",
"@1771981100.9238136\nUser:\nStress test entry 49 Stress test entry 49 Stress test entry 49 Stress test entry 49 Stress test entry 49",
"@2026-02-24T19:58:27\nUser:\nHello! This is an automated test. Just say 'Acknowledged'.",
"@2026-02-24T19:58:29\nAI:\nAcknowledged",
]
+5 -5
View File
@@ -9,18 +9,18 @@ from unittest.mock import patch
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from api_hook_client import ApiHookClient from api_hook_client import ApiHookClient
import gui import gui_legacy
def test_hooks_enabled_via_cli(): def test_hooks_enabled_via_cli():
with patch.object(sys, 'argv', ['gui.py', '--enable-test-hooks']): with patch.object(sys, 'argv', ['gui_legacy.py', '--enable-test-hooks']):
app = gui.App() app = gui_legacy.App()
assert app.test_hooks_enabled is True assert app.test_hooks_enabled is True
def test_hooks_disabled_by_default(): def test_hooks_disabled_by_default():
with patch.object(sys, 'argv', ['gui.py']): with patch.object(sys, 'argv', ['gui_legacy.py']):
if 'SLOP_TEST_HOOKS' in os.environ: if 'SLOP_TEST_HOOKS' in os.environ:
del os.environ['SLOP_TEST_HOOKS'] del os.environ['SLOP_TEST_HOOKS']
app = gui.App() app = gui_legacy.App()
assert getattr(app, 'test_hooks_enabled', False) is False assert getattr(app, 'test_hooks_enabled', False) is False
def test_live_hook_server_responses(live_gui): def test_live_hook_server_responses(live_gui):