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
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
"""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}"
|
||||
Reference in New Issue
Block a user