test: fix broken tests across suite and resolve port conflicts
This commit is contained in:
@@ -154,6 +154,7 @@ class AppController:
|
||||
self._loop_thread: Optional[threading.Thread] = None
|
||||
self.tracks: List[Dict[str, Any]] = []
|
||||
self.active_track: Optional[models.Track] = None
|
||||
self.engine: Optional[multi_agent_conductor.ConductorEngine] = None
|
||||
self.active_tickets: List[Dict[str, Any]] = []
|
||||
self.mma_streams: Dict[str, str] = {}
|
||||
self._worker_status: Dict[str, str] = {} # stream_id -> "running" | "completed" | "failed" | "killed"
|
||||
@@ -1795,6 +1796,11 @@ class AppController:
|
||||
try:
|
||||
self.project = project_manager.load_project(path)
|
||||
self.active_project_path = path
|
||||
new_root = Path(path).parent
|
||||
self.preset_manager = presets.PresetManager(new_root)
|
||||
self.tool_preset_manager = tool_presets.ToolPresetManager(new_root)
|
||||
from src.personas import PersonaManager
|
||||
self.persona_manager = PersonaManager(new_root)
|
||||
except Exception as e:
|
||||
self._set_status(f"failed to load project: {e}")
|
||||
return
|
||||
@@ -1870,6 +1876,7 @@ class AppController:
|
||||
self.bias_profiles = self.tool_preset_manager.load_all_bias_profiles()
|
||||
|
||||
def _apply_preset(self, name: str, scope: str) -> None:
|
||||
print(f"[DEBUG] _apply_preset: name={name}, scope={scope}")
|
||||
if name == "None":
|
||||
if scope == "global":
|
||||
self.ui_global_preset_name = ""
|
||||
@@ -1878,6 +1885,7 @@ class AppController:
|
||||
return
|
||||
preset = self.presets.get(name)
|
||||
if not preset:
|
||||
print(f"[DEBUG] _apply_preset: preset {name} not found in {list(self.presets.keys())}")
|
||||
return
|
||||
if scope == "global":
|
||||
self.ui_global_system_prompt = preset.system_prompt
|
||||
@@ -1887,6 +1895,7 @@ class AppController:
|
||||
self.ui_project_preset_name = name
|
||||
|
||||
def _cb_save_preset(self, name, content, scope):
|
||||
print(f"[DEBUG] _cb_save_preset: name={name}, scope={scope}")
|
||||
if not name or not name.strip():
|
||||
raise ValueError("Preset name cannot be empty or whitespace.")
|
||||
preset = models.Preset(
|
||||
@@ -1895,6 +1904,7 @@ class AppController:
|
||||
)
|
||||
self.preset_manager.save_preset(preset, scope)
|
||||
self.presets = self.preset_manager.load_all()
|
||||
print(f"[DEBUG] _cb_save_preset: saved {name}, total presets now {len(self.presets)}")
|
||||
|
||||
def _cb_delete_preset(self, name, scope):
|
||||
self.preset_manager.delete_preset(name, scope)
|
||||
@@ -2425,6 +2435,7 @@ class AppController:
|
||||
# Use the active track object directly to start execution
|
||||
self._set_mma_status("running")
|
||||
engine = multi_agent_conductor.ConductorEngine(self.active_track, self.event_queue, auto_queue=not self.mma_step_mode)
|
||||
self.engine = engine
|
||||
flat = project_manager.flat_config(self.project, self.active_discussion, track_id=self.active_track.id)
|
||||
full_md, _, _ = aggregate.run(flat)
|
||||
threading.Thread(target=engine.run, kwargs={"md_content": full_md}, daemon=True).start()
|
||||
@@ -2498,6 +2509,7 @@ class AppController:
|
||||
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)
|
||||
self.engine = engine
|
||||
# Use current full markdown context for the track execution
|
||||
track_id_param = track.id
|
||||
flat = project_manager.flat_config(self.project, self.active_discussion, track_id=track_id_param)
|
||||
@@ -2522,6 +2534,66 @@ class AppController:
|
||||
break
|
||||
self.event_queue.put("mma_skip", {"ticket_id": ticket_id})
|
||||
|
||||
def _spawn_worker(self, ticket_id: str, data: dict = None) -> None:
|
||||
"""Manually initiates a sub-agent execution for a ticket."""
|
||||
if self.engine:
|
||||
for t in self.active_track.tickets:
|
||||
if t.id == ticket_id:
|
||||
t.status = "todo"
|
||||
t.step_mode = False
|
||||
break
|
||||
self.engine.engine.auto_queue = True
|
||||
self.event_queue.put("mma_retry", {"ticket_id": ticket_id})
|
||||
|
||||
def kill_worker(self, worker_id: str) -> None:
|
||||
"""Aborts a running worker."""
|
||||
if self.engine:
|
||||
self.engine.kill_worker(worker_id)
|
||||
|
||||
def pause_mma(self) -> None:
|
||||
"""Pauses the global MMA loop."""
|
||||
self.mma_step_mode = True
|
||||
if self.engine:
|
||||
self.engine.pause()
|
||||
|
||||
def resume_mma(self) -> None:
|
||||
"""Resumes the global MMA loop."""
|
||||
self.mma_step_mode = False
|
||||
if self.engine:
|
||||
self.engine.resume()
|
||||
|
||||
def inject_context(self, data: dict) -> None:
|
||||
"""Programmatic context injection."""
|
||||
file_path = data.get("file_path")
|
||||
if file_path:
|
||||
if not os.path.isabs(file_path):
|
||||
file_path = os.path.relpath(file_path, self.ui_files_base_dir)
|
||||
existing = next((f for f in self.files if (f.path if hasattr(f, "path") else str(f)) == file_path), None)
|
||||
if not existing:
|
||||
item = models.FileItem(path=file_path)
|
||||
self.files.append(item)
|
||||
self._refresh_from_project()
|
||||
|
||||
def mutate_dag(self, data: dict) -> None:
|
||||
"""Modifies task dependencies."""
|
||||
ticket_id = data.get("ticket_id")
|
||||
depends_on = data.get("depends_on")
|
||||
if ticket_id and depends_on is not None:
|
||||
for t in self.active_tickets:
|
||||
if t.get("id") == ticket_id:
|
||||
t["depends_on"] = depends_on
|
||||
break
|
||||
if self.active_track:
|
||||
for t in self.active_track.tickets:
|
||||
if t.id == ticket_id:
|
||||
t.depends_on = depends_on
|
||||
break
|
||||
if self.engine:
|
||||
from src.dag_engine import TrackDAG, ExecutionEngine
|
||||
self.engine.dag = TrackDAG(self.active_track.tickets)
|
||||
self.engine.engine = ExecutionEngine(self.engine.dag, auto_queue=self.engine.engine.auto_queue)
|
||||
self._push_mma_state_update()
|
||||
|
||||
def _cb_run_conductor_setup(self) -> None:
|
||||
base = paths.get_conductor_dir()
|
||||
if not base.exists():
|
||||
|
||||
Reference in New Issue
Block a user