5769c1cd22
- Auto-Registration-Bug behoben (register_project/get_project_id/resolve_project Trennung) - 25 Tests gruen (Pytest) - block_compactor-Tool refactored (Option B: Soft-Check statt Hard-Block) - 4 Restbaustellen gefixt - DB-Schema: plugin_settings-Tabelle hinzugefuegt - 3 Schattenprojekte aus DB geloescht - Plan v3 + Refactor-Plan + Worklog dokumentiert
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}"
|