"""Session resume state reconstruction – DB-backed thin wrapper. Beibehalten aus Kompatibilitätsgründen. Delegiert an db_state_store und compact_protocol. Neuer Code sollte direkt db_state_store / block_resume verwenden. """ import os from datetime import datetime from typing import Any, Dict, Optional from usr.plugins.a0_software_orchestrator.helpers.compact_protocol import get_resume_payload from usr.plugins.a0_software_orchestrator.helpers.db_state_store import get_project_id, create_snapshot as db_create_snapshot def read_resume_info(project_name: str = "", project_root: str = "") -> Dict[str, Any]: """Liest den Resume-State aus der DB (rückwärtskompatibler Wrapper). Args: project_name: Projektname (bevorzugt). project_root: Legacy – wird zu basename() aufgelöst. Returns: { "project_state": { project_id, block_compact: {...} }, "resume_notes": | None, "next_steps": , } """ # Bug-Fix: basename-Fallback entfernt – würde ungültige/Phantom-Namen # erzeugen. project_name ist Pflicht. if not project_name or not project_name.strip(): return {"project_state": {}, "resume_notes": None, "next_steps": ""} name = project_name.strip() payload = get_resume_payload(name) state: Dict[str, Any] = { "project_state": payload.get("project_state", {}), } if "resume" in payload: state["resume_notes"] = payload["resume"] if "conversation_summary" in payload: state["conversation_summary"] = payload["conversation_summary"] # next_steps als Liste von Dicts → String (rückwärtskompatibel) if payload.get("next_steps"): state["next_steps"] = "\n".join( f"- [id={s.get('id')}] {s.get('content')}" for s in payload["next_steps"] ) return state def create_snapshot(project_name: str = "", project_root: str = "") -> Optional[str]: """Erstellt einen Snapshot in der DB und gibt die Snapshot-ID zurück (String zur Rückwärtskompatibilität – war früher ein Dateipfad). Args: project_name: Projektname (bevorzugt). project_root: Legacy – wird zu basename() aufgelöst. Returns: Snapshot-ID als String, oder None wenn Projekt nicht existiert. """ # Bug-Fix: basename-Fallback entfernt – würde ungültige/Phantom-Namen # erzeugen. project_name ist Pflicht. if not project_name or not project_name.strip(): return None name = project_name.strip() try: pid = get_project_id(name) if pid is None: return None except (ValueError, LookupError): return None snap_id = db_create_snapshot(pid, trigger="resume_state.create_snapshot") return f"db://snapshots/{snap_id}"