Files
a0_software_orchestrator/helpers/resume_state.py
T
Software Orchestrator 5769c1cd22 Initial commit: a0_software_orchestrator v1.0
- 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
2026-06-16 22:13:06 +00:00

76 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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}"