#!/bin/bash
# PreCompact Hook — garantierte Compaction-Summary (KAR-686, AgentScope-Pattern #2)
#
# Vorher (V5 Sprint 3): nur ein (TBD)-Stub nach HANDOFF.md → wenn Aria ihn nicht füllt,
# geht Kontext über die Compaction-Grenze verloren (HANDOFF-Drift-Wurzel, KAR-73).
# Jetzt: bettet die ACTIVE_TASK-Working-Memory + deterministischen Kontext (letzte Brain-Commits)
# GARANTIERT in den HANDOFF-Eintrag — "summary preserved, not discarded" (AgentScope AgentState.summary).
# Re-Injektion erfolgt via session-start.sh (lädt HANDOFF.md beim nächsten Start).
#
# Pfade env-überschreibbar für Tests (ARIA_ACTIVE_TASK / ARIA_HANDOFF / ARIA_BRAIN_DIR / ...).

ACTIVE_TASK="${ARIA_ACTIVE_TASK:-/home/aria/.claude/ACTIVE_TASK.md}"
BACKUP="${ARIA_PRECOMPACT_BACKUP:-/home/aria/.claude/ACTIVE_TASK_precompact.md}"
HANDOFF="${ARIA_HANDOFF:-/home/aria/brain/HANDOFF.md}"
BRAIN_DIR="${ARIA_BRAIN_DIR:-/home/aria/brain}"
LOG="${ARIA_HOOK_LOG:-/home/aria/.claude/hooks/hook.log}"
MAX_CHARS="${ARIA_PRECOMPACT_MAX_CHARS:-1800}"
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
TIMESTAMP_LOCAL=$(TZ='Europe/Berlin' date '+%Y-%m-%d %H:%M CEST')
SESSION_ID=$(cat /home/aria/.claude/current_session_id 2>/dev/null || echo "unknown")

# 1) Working-Memory sichern (wie bisher)
if [ -f "$ACTIVE_TASK" ]; then
    cp "$ACTIVE_TASK" "$BACKUP"
    echo "[$TIMESTAMP] PreCompact: ACTIVE_TASK.md backed up to $BACKUP" >> "$LOG"
fi

# 2) Deterministischen Kontext sammeln (kein LLM nötig → immer befüllt)
if [ -f "$ACTIVE_TASK" ]; then
    ACTIVE_SNAPSHOT=$(head -c "$MAX_CHARS" "$ACTIVE_TASK")
    [ -z "$ACTIVE_SNAPSHOT" ] && ACTIVE_SNAPSHOT="(ACTIVE_TASK.md ist leer)"
else
    ACTIVE_SNAPSHOT="(keine ACTIVE_TASK.md gefunden)"
fi
if [ -d "$BRAIN_DIR/.git" ]; then
    RECENT_COMMITS=$(git -C "$BRAIN_DIR" log --oneline -5 2>/dev/null || echo "(git log fehlgeschlagen)")
else
    RECENT_COMMITS="(kein git in $BRAIN_DIR)"
fi

# 3) GARANTIERTE Summary in HANDOFF anhängen (nie nur TBD)
# Idempotenz (Audit 08.07.2026, analog session-stop.sh/KAR-764): Mehrere
# Compaction-Events derselben Session ersetzen ihren Block statt anzuhängen.
if [ -f "$HANDOFF" ] && grep -q "^## Session-Compact" "$HANDOFF"; then
    python3 - "$HANDOFF" "$SESSION_ID" <<'PYDEDUP'
import sys
path, sid = sys.argv[1], sys.argv[2]
lines = open(path).read().splitlines(keepends=True)
starts = [i for i, l in enumerate(lines) if l.startswith("## Session-Compact ")]
if starts:
    s = starts[-1]
    # Block endet am naechsten '## '-Header oder EOF — NIE nachfolgende
    # Session-End-Bloecke mitloeschen (Bug im ersten Patch-Entwurf, Test 08.07.)
    e = next((j for j in range(s + 1, len(lines)) if lines[j].startswith("## ")), len(lines))
    if f"Session-ID: `{sid}`" in "".join(lines[s:e]):
        del lines[s:e]
        open(path, "w").write("".join(lines))
PYDEDUP
fi
if [ -f "$HANDOFF" ]; then
    {
        echo ""
        echo "## Session-Compact ${TIMESTAMP_LOCAL}"
        echo ""
        echo "Session-ID: \`${SESSION_ID}\`"
        echo ""
        echo "### Preserved Working-Memory (auto — garantiert, kein TBD)"
        echo ""
        echo '```'
        echo "${ACTIVE_SNAPSHOT}"
        echo '```'
        echo ""
        echo "### Letzte Brain-Commits"
        echo ""
        echo '```'
        echo "${RECENT_COMMITS}"
        echo '```'
        echo ""
        echo "### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)"
        echo "- Offene Decisions:"
        echo "- Nächster Schritt:"
    } >> "$HANDOFF"
    echo "[$TIMESTAMP] PreCompact: guaranteed summary (working-memory + commits) appended to HANDOFF" >> "$LOG"
fi

echo "PreCompact hook ran at $TIMESTAMP — Working-Memory + Kontext preserved (kein TBD-Verlust mehr)."
