feat(conductor): Implement configurable paths and mark track 'Conductor Path Configuration' as complete

This commit is contained in:
2026-03-06 16:43:11 -05:00
parent 1294104f7f
commit f580165c5b
17 changed files with 284 additions and 58 deletions

View File

@@ -17,6 +17,7 @@ from fastapi.security.api_key import APIKeyHeader
from pydantic import BaseModel
from src import events
from src import paths
from src import session_logger
from src import project_manager
from src import performance_monitor
@@ -640,7 +641,7 @@ class AppController:
root = hide_tk_root()
path = filedialog.askopenfilename(
title="Load Session Log",
initialdir="logs/sessions",
initialdir=str(paths.get_logs_dir()),
filetypes=[("Log/JSONL", "*.log *.jsonl"), ("All Files", "*.*")]
)
root.destroy()
@@ -671,8 +672,8 @@ class AppController:
try:
from src import log_registry
from src import log_pruner
registry = log_registry.LogRegistry("logs/sessions/log_registry.toml")
pruner = log_pruner.LogPruner(registry, "logs/sessions")
registry = log_registry.LogRegistry(str(paths.get_logs_dir() / "log_registry.toml"))
pruner = log_pruner.LogPruner(registry, str(paths.get_logs_dir()))
# Aggressive: Prune anything not whitelisted, even if just created, if under 100KB
# Note: max_age_days=0 means cutoff is NOW.
pruner.prune(max_age_days=0, min_size_kb=100)
@@ -715,8 +716,8 @@ class AppController:
try:
from src import log_registry
from src import log_pruner
registry = log_registry.LogRegistry("logs/sessions/log_registry.toml")
pruner = log_pruner.LogPruner(registry, "logs/sessions")
registry = log_registry.LogRegistry(str(paths.get_logs_dir() / "log_registry.toml"))
pruner = log_pruner.LogPruner(registry, str(paths.get_logs_dir()))
pruner.prune()
except Exception as e:
print(f"Error during log pruning: {e}")
@@ -1238,7 +1239,7 @@ class AppController:
@api.get("/api/v1/sessions", dependencies=[Depends(get_api_key)])
def list_sessions() -> list[str]:
"""Lists all session IDs."""
log_dir = Path("logs/sessions")
log_dir = paths.get_logs_dir()
if not log_dir.exists():
return []
return [d.name for d in log_dir.iterdir() if d.is_dir()]
@@ -1246,7 +1247,7 @@ class AppController:
@api.get("/api/v1/sessions/{session_id}", dependencies=[Depends(get_api_key)])
def get_session(session_id: str) -> dict[str, Any]:
"""Returns the content of the comms.log for a specific session."""
log_path = Path("logs/sessions") / session_id / "comms.log"
log_path = paths.get_logs_dir() / session_id / "comms.log"
if not log_path.exists():
raise HTTPException(status_code=404, detail="Session log not found")
return {"id": session_id, "content": log_path.read_text(encoding="utf-8", errors="replace")}
@@ -1254,7 +1255,7 @@ class AppController:
@api.delete("/api/v1/sessions/{session_id}", dependencies=[Depends(get_api_key)])
def delete_session(session_id: str) -> dict[str, str]:
"""Deletes a specific session directory."""
log_path = Path("logs/sessions") / session_id
log_path = paths.get_logs_dir() / session_id
if not log_path.exists() or not log_path.is_dir():
raise HTTPException(status_code=404, detail="Session directory not found")
import shutil
@@ -1904,9 +1905,9 @@ class AppController:
self.event_queue.put("mma_skip", {"ticket_id": ticket_id})
def _cb_run_conductor_setup(self) -> None:
base = Path("conductor")
base = paths.get_conductor_dir()
if not base.exists():
self.ui_conductor_setup_summary = "Error: conductor/ directory not found."
self.ui_conductor_setup_summary = f"Error: {base}/ directory not found."
return
files = list(base.glob("**/*"))
files = [f for f in files if f.is_file()]
@@ -1934,7 +1935,7 @@ class AppController:
if not name: return
date_suffix = datetime.now().strftime("%Y%m%d")
track_id = f"{name.lower().replace(' ', '_')}_{date_suffix}"
track_dir = Path("conductor/tracks") / track_id
track_dir = paths.get_tracks_dir() / track_id
track_dir.mkdir(parents=True, exist_ok=True)
spec_file = track_dir / "spec.md"
with open(spec_file, "w", encoding="utf-8") as f: