WIP: PAIN3
This commit is contained in:
@@ -298,6 +298,7 @@ class AppController:
|
||||
'show_confirm_modal': 'show_confirm_modal',
|
||||
'mma_epic_input': 'ui_epic_input',
|
||||
'mma_status': 'mma_status',
|
||||
'ai_status': 'ai_status',
|
||||
'mma_active_tier': 'active_tier',
|
||||
'ui_new_track_name': 'ui_new_track_name',
|
||||
'ui_new_track_desc': 'ui_new_track_desc',
|
||||
@@ -409,10 +410,10 @@ class AppController:
|
||||
"collapsed": False,
|
||||
"ts": project_manager.now_ts()
|
||||
})
|
||||
elif action == "mma_stream_append":
|
||||
payload = task.get("payload", {})
|
||||
stream_id = payload.get("stream_id")
|
||||
text = payload.get("text", "")
|
||||
elif action in ("mma_stream", "mma_stream_append"):
|
||||
# Some events might have these at top level, some in a 'payload' dict
|
||||
stream_id = task.get("stream_id") or task.get("payload", {}).get("stream_id")
|
||||
text = task.get("text") or task.get("payload", {}).get("text", "")
|
||||
if stream_id:
|
||||
if stream_id not in self.mma_streams:
|
||||
self.mma_streams[stream_id] = ""
|
||||
@@ -421,7 +422,11 @@ class AppController:
|
||||
self.proposed_tracks = task.get("payload", [])
|
||||
self._show_track_proposal_modal = True
|
||||
elif action == "mma_state_update":
|
||||
payload = task.get("payload", {})
|
||||
# Handle both internal (nested) and hook-server (flattened) payloads
|
||||
payload = task.get("payload")
|
||||
if not isinstance(payload, dict):
|
||||
payload = task # Fallback to task if payload missing or wrong type
|
||||
|
||||
self.mma_status = payload.get("status", "idle")
|
||||
self.active_tier = payload.get("active_tier")
|
||||
self.mma_tier_usage = payload.get("tier_usage", self.mma_tier_usage)
|
||||
@@ -783,12 +788,11 @@ class AppController:
|
||||
break
|
||||
if event_name == "user_request":
|
||||
threading.Thread(target=self._handle_request_event, args=(payload,), daemon=True).start()
|
||||
elif event_name == "response":
|
||||
elif event_name == "gui_task":
|
||||
with self._pending_gui_tasks_lock:
|
||||
self._pending_gui_tasks.append({
|
||||
"action": "handle_ai_response",
|
||||
"payload": payload
|
||||
})
|
||||
# Directly append the task from the hook server.
|
||||
# It already contains 'action' and any necessary fields.
|
||||
self._pending_gui_tasks.append(payload)
|
||||
elif event_name == "mma_state_update":
|
||||
with self._pending_gui_tasks_lock:
|
||||
self._pending_gui_tasks.append({
|
||||
@@ -803,6 +807,7 @@ class AppController:
|
||||
})
|
||||
elif event_name in ("mma_spawn_approval", "mma_step_approval"):
|
||||
with self._pending_gui_tasks_lock:
|
||||
# These payloads already contain the 'action' field
|
||||
self._pending_gui_tasks.append(payload)
|
||||
|
||||
def _handle_request_event(self, event: events.UserRequestEvent) -> None:
|
||||
@@ -1679,13 +1684,17 @@ class AppController:
|
||||
def _cb_accept_tracks(self) -> None:
|
||||
self._show_track_proposal_modal = False
|
||||
def _bg_task() -> None:
|
||||
sys.stderr.write("[DEBUG] _cb_accept_tracks _bg_task started\n")
|
||||
# Generate skeletons once
|
||||
self._set_status("Phase 2: Generating skeletons for all tracks...")
|
||||
parser = file_cache.ASTParser(language="python")
|
||||
sys.stderr.write("[DEBUG] Creating ASTParser...\n")
|
||||
parser = ASTParser(language="python")
|
||||
|
||||
generated_skeletons = ""
|
||||
try:
|
||||
# Use a local copy of files to avoid concurrent modification issues
|
||||
files_to_scan = list(self.files)
|
||||
sys.stderr.write(f"[DEBUG] Scanning {len(files_to_scan)} files for skeletons...\n")
|
||||
for i, file_path in enumerate(files_to_scan):
|
||||
try:
|
||||
self._set_status(f"Phase 2: Scanning files ({i+1}/{len(files_to_scan)})...")
|
||||
@@ -1695,12 +1704,13 @@ class AppController:
|
||||
code = f.read()
|
||||
generated_skeletons += f"\nFile: {file_path}\n{parser.get_skeleton(code)}\n"
|
||||
except Exception as e:
|
||||
print(f"Error parsing skeleton for {file_path}: {e}")
|
||||
sys.stderr.write(f"[DEBUG] Error parsing skeleton for {file_path}: {e}\n")
|
||||
except Exception as e:
|
||||
sys.stderr.write(f"[DEBUG] Error in scan loop: {e}\n")
|
||||
self._set_status(f"Error generating skeletons: {e}")
|
||||
print(f"Error generating skeletons: {e}")
|
||||
return # Exit if skeleton generation fails
|
||||
|
||||
sys.stderr.write("[DEBUG] Skeleton generation complete. Starting tracks...\n")
|
||||
# Now loop through tracks and call _start_track_logic with generated skeletons
|
||||
total_tracks = len(self.proposed_tracks)
|
||||
for i, track_data in enumerate(self.proposed_tracks):
|
||||
@@ -1708,6 +1718,7 @@ class AppController:
|
||||
self._set_status(f"Processing track {i+1} of {total_tracks}: '{title}'...")
|
||||
self._start_track_logic(track_data, skeletons_str=generated_skeletons) # Pass skeletons
|
||||
|
||||
sys.stderr.write("[DEBUG] All tracks started. Refreshing...\n")
|
||||
with self._pending_gui_tasks_lock:
|
||||
self._pending_gui_tasks.append({'action': 'refresh_from_project'}) # Ensure UI refresh after tracks are started
|
||||
self._set_status(f"All {total_tracks} tracks accepted and execution started.")
|
||||
@@ -1797,6 +1808,12 @@ class AppController:
|
||||
meta = models.Metadata(id=track_id, name=title, status="todo", created_at=datetime.now(), updated_at=datetime.now())
|
||||
state = models.TrackState(metadata=meta, discussion=[], tasks=tickets)
|
||||
project_manager.save_track_state(track_id, state, self.ui_files_base_dir)
|
||||
|
||||
# Add to memory and notify UI
|
||||
self.tracks.append({"id": track_id, "title": title, "status": "todo"})
|
||||
with self._pending_gui_tasks_lock:
|
||||
self._pending_gui_tasks.append({'action': 'refresh_from_project'})
|
||||
|
||||
# 4. Initialize ConductorEngine and run loop
|
||||
engine = multi_agent_conductor.ConductorEngine(track, self.event_queue, auto_queue=not self.mma_step_mode)
|
||||
# Use current full markdown context for the track execution
|
||||
|
||||
Reference in New Issue
Block a user