fix(mma): Unblock visual simulation - event routing, loop passing, adapter preservation

Three independent root causes fixed:
- gui_2.py: Route mma_spawn_approval/mma_step_approval events in _process_event_queue
- multi_agent_conductor.py: Pass asyncio loop from ConductorEngine.run() through to
  thread-pool workers for thread-safe event queue access; add _queue_put helper
- ai_client.py: Preserve GeminiCliAdapter in reset_session() instead of nulling it

Test: visual_sim_mma_v2::test_mma_complete_lifecycle passes in ~8s

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-01 08:32:31 -05:00
parent db32a874fd
commit da21ed543d
11 changed files with 144 additions and 122 deletions

View File

@@ -129,8 +129,12 @@ class HookHandler(BaseHTTPRequestHandler):
result["active_track"] = at.id if hasattr(at, "id") else at
result["active_tickets"] = getattr(app, "active_tickets", [])
result["mma_step_mode"] = getattr(app, "mma_step_mode", False)
result["pending_approval"] = (getattr(app, "_pending_mma_approval", None) is not None) or getattr(app, "_pending_ask_dialog", False)
result["pending_spawn"] = getattr(app, "_pending_mma_spawn", None) is not None
result["pending_tool_approval"] = getattr(app, "_pending_ask_dialog", False)
result["pending_mma_step_approval"] = getattr(app, "_pending_mma_approval", None) is not None
result["pending_mma_spawn_approval"] = getattr(app, "_pending_mma_spawn", None) is not None
# Keep old fields for backward compatibility but add specific ones above
result["pending_approval"] = result["pending_mma_step_approval"] or result["pending_tool_approval"]
result["pending_spawn"] = result["pending_mma_spawn_approval"]
# Added lines for tracks and proposed_tracks
result["tracks"] = getattr(app, "tracks", [])
result["proposed_tracks"] = getattr(app, "proposed_tracks", [])