76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
|
|
"""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": <resume_md string> | None,
|
|||
|
|
"next_steps": <list of pending step dicts>,
|
|||
|
|
}
|
|||
|
|
"""
|
|||
|
|
# 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}"
|