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:
Software Orchestrator
2026-06-16 22:13:06 +00:00
commit 5769c1cd22
236 changed files with 17825 additions and 0 deletions
+75
View File
@@ -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}"