#!/bin/bash
# SessionStart Hook v3 — Focused brain loading (17.04.2026)
# Loads ONLY agreed critical files, not all 215 brain files.
# Additional files loaded on demand during session.
# Backup of v2: session-start.sh.bak-2026-04-17

# CF-1 FIX (KAR-679): Worker sessions get their own scoped brain snapshot.
# Skip CEO brain build and Telegram ping entirely for worker sessions.
# Additive-only: if ARIA_WORKER_NAME is unset (CEO session), behaviour is 100% unchanged.
if [[ -n "${ARIA_WORKER_NAME:-}" ]]; then
    echo "[session-start] Worker session: ${ARIA_WORKER_NAME} — skipping CEO brain build" >&2
    exit 0
fi

BRAIN="${ARIA_BRAIN:-${HOME}/brain}"
# Snapshot in ein Verzeichnis, das dem laufenden User gehoert. Vorher lag er unter
# /tmp/aria-brain-full.md — als der Dienst von root auf aria umzog, blieb die alte
# root-Datei liegen, der Hook konnte sie weder leeren noch beschreiben (Permission
# denied), und jede Session las still einen 12 Tage alten Stand. Der Hook meldete
# dabei "Dateien: 0" bei 77 KB Inhalt: der einzige sichtbare Hinweis.
SNAPSHOT="${ARIA_BRAIN_SNAPSHOT:-${HOME}/.claude/aria-brain-full.md}"

# Frueh und laut scheitern, wenn der Vault-Pfad nicht stimmt: ein leerer Snapshot
# ist schlimmer als ein Abbruch, weil die Session dann ohne Gedaechtnis weiterlaeuft,
# ohne dass es jemandem auffaellt.
if [ ! -d "$BRAIN" ]; then
    echo "[session-start] FEHLER: Brain-Vault nicht gefunden unter '$BRAIN'" >&2
    echo "[session-start] ARIA_BRAIN setzen (z.B. in /home/aria/.env) oder Pfad pruefen." >&2
fi
MEMORY_DIR="/home/aria/.claude/projects/-/memory"
BYTES_LOADED=0
FILE_COUNT=0

# Log-Hygiene (KAR-Setup-Audit 2026-05-28): hook.log unbegrenzt gewachsen (>500KB).
# Bei jedem Session-Start auf die letzten 100KB trimmen.
HOOK_LOG="/home/aria/.claude/hooks/hook.log"
if [ -f "$HOOK_LOG" ] && [ "$(wc -c < "$HOOK_LOG" 2>/dev/null || echo 0)" -gt 150000 ]; then
    tail -c 100000 "$HOOK_LOG" > "${HOOK_LOG}.tmp" 2>/dev/null && mv "${HOOK_LOG}.tmp" "$HOOK_LOG"
fi

# V5 Sprint 1 Bootstrap-Limits (12 KB pro File, 60 KB total):
# Verhindert Token-Overflow durch wachsende Brain-Files.
BOOTSTRAP_MAX_CHARS_PER_FILE="${BOOTSTRAP_MAX_CHARS_PER_FILE:-12000}"
# Total-Cap am 11.05.2026 von 60000 → 80000 erhoeht (KAR-55):
# Tier-1 (Identity+Rules+Engineering+Vault-Schema) verbrauchte schon 58 KB,
# sodass HANDOFF.md + HOOKS.md + Daily-Log konsequent SKIPPED waren —
# also „Aria startet jeden Tag ohne aktuellen HANDOFF-Kontext" (Issue-Wortlaut).
# +20 KB ≈ +5k Tokens. CORRECTIONS.md-Truncation bleibt separates Issue.
BOOTSTRAP_TOTAL_MAX_CHARS="${BOOTSTRAP_TOTAL_MAX_CHARS:-80000}"
LIMIT_WARNINGS=()

# Generate unique session ID
SESSION_ID=$(cat /proc/sys/kernel/random/uuid 2>/dev/null | tr -d '-' | head -c 8 || date +%s%N | sha256sum | head -c 8)
# Test-Mode darf die echte Session-ID nicht ueberschreiben (Fix 08.07.2026, Audit-Nachlese)
[ "$ARIA_HOOK_TEST" = "1" ] || echo "$SESSION_ID" > /home/aria/.claude/current_session_id
ACTIVE_TASK="/home/aria/.claude/ACTIVE_TASK_${SESSION_ID}.md"

# Google: TOTP-based (Username/Password/TOTP via aria-google-totp.sh) — kein OAuth-Refresh
# Frueherer Block rief google_refresh_token.py das nie existierte. Entfernt 2026-05-09.

# --- Phase 1: Build focused brain snapshot ---
> "$SNAPSHOT"

add_file() {
    local file="$1"
    local label="${2:-$(basename "$file")}"
    if [ ! -f "$file" ]; then
        return 0
    fi

    local size
    size=$(wc -c < "$file" 2>/dev/null || echo 0)

    # Total-Cap erreicht? Skip + log warning
    if [ "$BYTES_LOADED" -ge "$BOOTSTRAP_TOTAL_MAX_CHARS" ]; then
        LIMIT_WARNINGS+=("SKIPPED $label (${size}B): Total-Cap ${BOOTSTRAP_TOTAL_MAX_CHARS} erreicht")
        return 0
    fi

    echo "" >> "$SNAPSHOT"
    echo "=== $label ===" >> "$SNAPSHOT"

    # Per-File-Cap? Truncate. $3="tail" laedt das Datei-ENDE (neueste Eintraege)
    # statt des Anfangs — noetig fuer append-only Logs wie HANDOFF.md.
    local trunc_mode="${3:-head}"
    if [ "$size" -gt "$BOOTSTRAP_MAX_CHARS_PER_FILE" ]; then
        if [ "$trunc_mode" = "tail" ]; then
            tail -c "$BOOTSTRAP_MAX_CHARS_PER_FILE" "$file" >> "$SNAPSHOT"
        else
            head -c "$BOOTSTRAP_MAX_CHARS_PER_FILE" "$file" >> "$SNAPSHOT"
        fi
        echo "" >> "$SNAPSHOT"
        echo "[TRUNCATED: file is ${size}B, loaded only ${BOOTSTRAP_MAX_CHARS_PER_FILE}B per V5-Bootstrap-Limit, mode=${trunc_mode}]" >> "$SNAPSHOT"
        BYTES_LOADED=$((BYTES_LOADED + BOOTSTRAP_MAX_CHARS_PER_FILE))
        LIMIT_WARNINGS+=("TRUNCATED $label: ${size}B → ${BOOTSTRAP_MAX_CHARS_PER_FILE}B")
    else
        cat "$file" >> "$SNAPSHOT"
        BYTES_LOADED=$((BYTES_LOADED + size))
    fi

    echo "=== /$label ===" >> "$SNAPSHOT"
    FILE_COUNT=$((FILE_COUNT + 1))
}

# === TIER 1: Identity & Rules (IMMER laden) ===
# V5 Sprint 3 Identity-Split: SOUL ist jetzt nur Werte/Hierarchie/Standing-Orders.
# IDENTITY (Mini-Bio), USER (Kais-Modell), TOOLS (Konventionen) sind separat.
add_file "$BRAIN/SOUL.md" "SOUL.md"
add_file "$BRAIN/IDENTITY.md" "IDENTITY.md"
add_file "$BRAIN/USER.md" "USER.md"
add_file "$BRAIN/AUTONOMY-BOUNDARIES.md" "AUTONOMY-BOUNDARIES.md"  # KAR-879, 08.07.2026
add_file "$BRAIN/TOOLS.md" "TOOLS.md"
add_file "$BRAIN/CORRECTIONS.md" "CORRECTIONS.md"
add_file "$BRAIN/SELF-IMPROVEMENT.md" "SELF-IMPROVEMENT.md"
add_file "$BRAIN/ENGINEERING.md" "ENGINEERING.md"
add_file "$BRAIN/CLAUDE.md" "CLAUDE.md (Vault-Schema)"
# CAPABILITIES.md entfernt (Agent-OS-Audit 08.07.2026): Datei existierte nie,
# brain/CLAUDE.md-§6-Referenz wird mitbereinigt. Inhalt gehoert nach TOOLS.md.

# === TIER 2: System & Infrastructure ===
# HEARTBEAT.md + HOOKS.md -> on-demand (KAR-879/D3, 08.07.2026): reine Referenz-/
# Diagnose-Doku, Auslassungs-Risiko gering; schafft Cap-Raum fuer AUTONOMY-
# BOUNDARIES + garantiertes Daily-Log. Bei Timer-/Infra-Fragen gezielt lesen.

# === TIER 3: Current Context (vor HOOKS — KAR-55: aktueller Session-Kontext schlaegt statisches Trigger-Inventory) ===
add_file "$BRAIN/WEEKLY-FOCUS.md" "WEEKLY-FOCUS.md"
add_file "$BRAIN/HANDOFF.md" "HANDOFF.md" "tail"

# Daily Log (today — auto-create if missing)
DAILY_LOG="$BRAIN/06-Daily/$(date +%Y-%m-%d).md"
if [ ! -f "$DAILY_LOG" ]; then
    CEST_NOW=$(TZ='Europe/Berlin' date '+%H:%M')
    cat > "$DAILY_LOG" << DAILYEOF
# Daily Log — $(date +%Y-%m-%d)

## Session-Start $CEST_NOW CEST
- Neue Session gestartet (ID: $SESSION_ID)
DAILYEOF
fi
add_file "$DAILY_LOG" "Daily-Log-$(basename "$DAILY_LOG")"


# === TIER 2 (cont.): statisches Trigger-Inventory ===
# HOOKS.md on-demand (s.o.)
# System-Karte.md raus (V5 Sprint 0, 08.05.2026): Datei existiert nicht im Brain,
# 01-Projekte/Aria/ ist leer. Erst wieder laden wenn sie angelegt wird.
# reference_all_access.md raus (V5 Sprint 0): Pfad-Typo /-root/ statt /-/, hat
# nie geladen. Bei Bedarf via on-demand grep statt Bootstrap.
# FEATURE_REQUESTS.md raus (V5 Sprint 0, 08.05.2026): war 88 Bytes leer, geloescht.
# OVERNIGHT_TASK.md raus (03.05.2026): ist Cron-Auftrag fuer Gemma um 3:00,
# nicht fuer aktive Sessions. Wird vom Cron-Worker direkt gelesen.

# === Pitch-Tag (02.05.2026): zusätzliche Pflichtlektüre ===
if [ "$(date +%Y-%m-%d)" = "2026-05-02" ]; then
    add_file "$BRAIN/01-Projekte/Vecura/Mallorca-Pitch-2026-05-02/00-STATUS-AKTUELL.md" "Pitch-STATUS-AKTUELL.md"
    add_file "$BRAIN/01-Projekte/Vecura/Mallorca-Pitch-2026-05-02/15-REISE-DETAILS.md" "Pitch-REISE-DETAILS.md"
    add_file "$BRAIN/01-Projekte/Vecura/Mallorca-Pitch-2026-05-02/16-PITCH-LIVE-DEMO.md" "Pitch-LIVE-DEMO-Spickzettel.md"
    add_file "$BRAIN/01-Projekte/Vecura/Mallorca-Pitch-2026-05-02/14-SKRIPT-V12.md" "Pitch-SKRIPT-V12.md"
fi

SNAPSHOT_SIZE=$(wc -c < "$SNAPSHOT" 2>/dev/null || echo 0)
SNAPSHOT_KB=$((SNAPSHOT_SIZE / 1024))
TOKENS_EST=$((SNAPSHOT_SIZE / 4))

# --- Phase 2: Print to stdout ---
echo "============================================="
echo "  ARIA SESSION START — BRAIN LOADED"
echo "============================================="
echo "Session-ID: $SESSION_ID"
echo "Datum: $(LC_TIME=de_DE.UTF-8 date '+%A, %d.%m.%Y') | $(TZ='Europe/Berlin' date '+%H:%M') CEST"
echo "Task-Datei: $ACTIVE_TASK"
echo ""
echo "BRAIN-SNAPSHOT: $SNAPSHOT"
echo "  Dateien: $FILE_COUNT (fokussiert, nicht alle 215)"
echo "  Groesse: ${SNAPSHOT_KB} KB (~${TOKENS_EST} Tokens)"
echo ""
echo "ANWEISUNG:"
echo "1. Lies $SNAPSHOT KOMPLETT (Read-Tool, je 2000 Zeilen)"
echo "2. SELBST-CHECK: Zähle die === Sektionen. Erwartet: $FILE_COUNT"
echo "3. Erst DANACH auf Nachrichten antworten"
echo "4. Weitere Brain-Dateien nur auf Kais' Anweisung"
echo "============================================="

# Active Task from last session
if ls /home/aria/.claude/ACTIVE_TASK_*.md 1>/dev/null 2>&1; then
    LATEST_TASK=$(ls -t /home/aria/.claude/ACTIVE_TASK_*.md 2>/dev/null | head -1)
    if [ -f "$LATEST_TASK" ]; then
        echo ""
        echo "=== ACTIVE TASK (letzte Session) ==="
        cat "$LATEST_TASK"
        echo "====================================="
    fi
fi

# Linear Issues (live, can't be in static snapshot)
echo ""
echo "=== LINEAR — Offene Issues (live) ==="
LINEAR_KEY=$(grep -oP '^LINEAR_API_KEY=\K.*' ${HOME}/aria/.env 2>/dev/null)
if [ -z "$LINEAR_KEY" ]; then
  echo "[Linear Key fehlt — LINEAR_API_KEY in ${HOME}/aria/.env nicht gesetzt]"
  echo "====================================="
  LINEAR_DATA=""
else
LINEAR_DATA=$(curl -s -X POST https://api.linear.app/graphql \
  -H "Authorization: $LINEAR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ issues(filter: { state: { type: { nin: [\"completed\",\"cancelled\"] } } }, orderBy: updatedAt, first: 20) { nodes { identifier title state { name } priority assignee { name } dueDate } } }"}' \
  2>/dev/null | python3 -c "
import sys, json
try:
    d = json.load(sys.stdin)
    issues = d['data']['issues']['nodes']
    for i in issues:
        prio = ['','🔴','🟠','🟡','🔵'][i.get('priority',0)] if i.get('priority',0) < 5 else ''
        due = f\" (faellig: {i['dueDate']})\" if i.get('dueDate') else ''
        print(f\"{prio} [{i['identifier']}] {i['title']} — {i['state']['name']}{due}\")
except Exception as e:
    print(f'[Linear Fehler: {e}]')
" 2>/dev/null || echo "[Linear nicht erreichbar]")
  echo "$LINEAR_DATA"
  echo "====================================="
fi

# Recent Chat (live, can't be in static snapshot)
echo ""
echo "=== Recent Chat (2h vor Restart — Supabase) ==="
CHAT_OUTPUT=$(python3 ${HOME}/aria/scripts/aria-context-restore-supabase.py 2 2>/dev/null || python3 ${HOME}/aria/scripts/aria-context-restore-sqlite.py 2 2>/dev/null || echo "[Kein Chat-Verlauf verfuegbar]")
echo "$CHAT_OUTPUT"
echo "==============================================="

# Brain-Graph-Health
echo ""
echo "=== BRAIN-GRAPH-HEALTH ==="
if [ -x ${HOME}/aria/scripts/aria-brain-health.sh ]; then
    ${HOME}/aria/scripts/aria-brain-health.sh 2>/dev/null || true
    echo "Hinweis: Orphans, Dangling Links und fehlende READMEs proaktiv abarbeiten — nicht auf Kais' Erinnerung warten."
else
    echo "[brain-health Script fehlt unter ${HOME}/aria/scripts/aria-brain-health.sh]"
fi
echo "==========================="

# Aria Mode (KAR-176: assist/auto/yolo)
echo ""
echo "=== ARIA-MODE ==="
ARIA_MODE=$(cat /home/aria/state/mode 2>/dev/null | tr -d '[:space:]')
case "$ARIA_MODE" in
    assist)
        echo "🔒 Mode: assist — Confirm-Pflicht vor jedem Edit/Write/Bash/MCP-Call"
        ;;
    yolo)
        echo "⚡ Mode: yolo — Power-Session, nur catastrophic blockiert"
        ;;
    auto|"")
        echo "✓ Mode: auto (Default) — reversible Aktionen ohne Confirm, destructive mit Confirm"
        ;;
    *)
        echo "⚠ Mode: '$ARIA_MODE' unbekannt — fallback auf 'auto'"
        ;;
esac
echo "Toggle mit /mode assist|auto|yolo (Skill: aria-mode-toggle)"
echo "================="

# Token budget
echo ""
echo "=== TOKEN BUDGET ==="
if [ "$TOKENS_EST" -gt 100000 ]; then
    echo "Brain-Snapshot: ~${TOKENS_EST} Tokens (${SNAPSHOT_KB} KB) 🔴 KRITISCH"
elif [ "$TOKENS_EST" -gt 50000 ]; then
    echo "Brain-Snapshot: ~${TOKENS_EST} Tokens (${SNAPSHOT_KB} KB) 🟡 HOCH"
else
    echo "Brain-Snapshot: ~${TOKENS_EST} Tokens (${SNAPSHOT_KB} KB) 🟢 OK"
fi
echo "Dateien geladen: $FILE_COUNT"

# V5 Sprint 1 Bootstrap-Limit-Warnings
if [ "${#LIMIT_WARNINGS[@]}" -gt 0 ]; then
    echo "Bootstrap-Limits aktiv (per-file ${BOOTSTRAP_MAX_CHARS_PER_FILE}B, total ${BOOTSTRAP_TOTAL_MAX_CHARS}B):"
    for w in "${LIMIT_WARNINGS[@]}"; do
        echo "  ⚠ $w"
    done
fi
echo "===================="

# --- Phase 3: Telegram Status-Ping (Failsafe) ---
# Pflicht laut Kais (30.04.2026): Bei jedem Neustart muss Kais sehen
# welche MD-Dateien geladen sind und ob Supabase-Chat-Log da ist.
# Hook macht es selbst, damit es nicht an Arias Disziplin haengt.
#
# TEST-Mode: ARIA_HOOK_TEST=1 bash session-start.sh ueberspringt Telegram-Ping.
# Eingefuehrt 03.05.2026 nach Kais-Feedback "Warum startest du staendig neu?"
if [ "$ARIA_HOOK_TEST" = "1" ]; then
    echo ""
    echo "[TEST-MODE] Telegram-Ping uebersprungen."
    exit 0
fi

TG_TOKEN=$(grep -oP '^TELEGRAM_BOT_TOKEN=\K.*' ${HOME}/aria/.env 2>/dev/null)
[ -z "$TG_TOKEN" ] && TG_TOKEN=$(grep -oP '^TELEGRAM_BOT_TOKEN=\K.*' /home/aria/.claude/channels/telegram/.env 2>/dev/null)
TG_CHAT=$(grep -oP '^TELEGRAM_CHAT_ID=\K.*' ${HOME}/aria/.env 2>/dev/null)
[ -z "$TG_CHAT" ] && TG_CHAT=$(grep -oP '^TELEGRAM_CHAT_ID=\K.*' /home/aria/.claude/channels/telegram/.env 2>/dev/null)

if [ -n "$TG_TOKEN" ] && [ -n "$TG_CHAT" ]; then
    # Datei-Liste aus Snapshot extrahieren
    FILE_LIST=$(grep -oP '^=== \K[^=]+(?= ===$)' "$SNAPSHOT" 2>/dev/null | grep -v '^/' | head -20 | sed 's/^/- /')

    # Supabase-Chat-Log Status pruefen.
    # Fix 2026-05-06 (LRN-folgt): Skript heisst aria-context-restore.py (nicht -supabase),
    # und braucht ARIA_SUPABASE_*-Env aus .env.aria/.env. In Subshell sourcen damit
    # der Hook-Scope sauber bleibt.
    CHAT_OUTPUT=$(
        set -a
        [ -f "${HOME}/aria/scripts/.env.aria" ] && source "${HOME}/aria/scripts/.env.aria"
        [ -f "${HOME}/aria/.env" ] && source "${HOME}/aria/.env"
        # Fallback fuer Skripte die ARIA_-Prefix erwarten
        : "${ARIA_SUPABASE_URL:=$SUPABASE_URL}"
        : "${ARIA_SUPABASE_SERVICE_KEY:=$SUPABASE_SERVICE_ROLE_KEY}"
        export ARIA_SUPABASE_URL ARIA_SUPABASE_SERVICE_KEY
        set +a
        python3 "${HOME}/aria/scripts/aria-context-restore.py" 2 2>/dev/null
    )
    CHAT_COUNT=$(printf '%s\n' "$CHAT_OUTPUT" | grep -cE '^\[CHAT ' || echo 0)
    if [ "$CHAT_COUNT" -gt 0 ]; then
        CHAT_STATUS="${CHAT_COUNT} Eintraege geladen"
        LAST_CHAT=$(printf '%s\n' "$CHAT_OUTPUT" | grep -E '^\[CHAT ' | tail -1 | head -c 120)
    else
        CHAT_STATUS="0 Eintraege (Supabase nicht erreichbar oder leer)"
        LAST_CHAT=""
    fi

    SESSION_TIME=$(TZ='Europe/Berlin' date '+%H:%M')

    MSG="*Aria Session-Start* ${SESSION_TIME} CEST
Session-ID: \`${SESSION_ID}\`

*Brain geladen* (${FILE_COUNT} Dateien, ~${TOKENS_EST} Tokens):
\`\`\`
${FILE_LIST}
\`\`\`

*Supabase-Chat:* ${CHAT_STATUS}"

    if [ -n "$LAST_CHAT" ]; then
        MSG="${MSG}
Letzter: ${LAST_CHAT}"
    fi

    curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
        --data-urlencode "chat_id=${TG_CHAT}" \
        --data-urlencode "text=${MSG}" \
        --data-urlencode "parse_mode=Markdown" \
        > /dev/null 2>&1 &
fi
