#!/usr/bin/env python3
"""driver.py — treibt EINE Aider-Sitzung ueber die Scripting-API durch den Governor.

Jede Zeile der Nachrichtendatei ist eine User-Runde. Weil derselbe Coder alle Runden
bedient, akkumuliert die Historie und die Anfrage waechst jede Runde — genau das, was
der Governor beobachtet. Aiders EIGENE History-Zusammenfassung wird abgeschaltet, damit
der Governor die alleinige Sitzungsgrenze ist (der Plan verwirft Auto-Compaction bewusst).

Aufruf (cwd muss das Test-Repo sein, mit venv-python):
  .../aider-chat/bin/python driver.py <messages-file>
"""
import os
import sys

from aider.coders import Coder
from aider.io import InputOutput
from aider.models import Model


def main() -> int:
    # Endpoint VOR den Aider-Aufrufen setzen (litellm liest es zur Laufzeit).
    os.environ.setdefault("OPENAI_API_BASE", "http://127.0.0.1:8100/v1")
    os.environ.setdefault("OPENAI_API_KEY", "dummy")
    if len(sys.argv) < 2:
        print("usage: driver.py <messages-file>", file=sys.stderr)
        return 2
    with open(sys.argv[1], encoding="utf-8") as fh:
        messages = [ln.strip() for ln in fh if ln.strip() and not ln.lstrip().startswith("#")]

    model = Model("openai/Qwen3-Coder-Next")
    io = InputOutput(yes=True)  # alle Rueckfragen automatisch bejahen
    coder = Coder.create(
        main_model=model,
        io=io,
        fnames=["SAVEPOINT.md"],            # editierbar
        read_only_fnames=["CONVENTIONS.md"],  # nur-lesbar
        auto_commits=True,                  # jede Etappe -> git-Commit
        stream=False,                       # deterministische Logs fuer P0
        map_tokens=512,
        use_git=True,
    )

    # Aiders eigene Zusammenfassung ausschalten: too_big() wird nie wahr.
    try:
        coder.summarizer.max_tokens = 10 ** 9
        print(f"[driver] summarizer.max_tokens -> {coder.summarizer.max_tokens}", flush=True)
    except Exception as exc:
        print(f"[driver] WARN konnte summarizer nicht abschalten: {exc}", flush=True)

    for i, msg in enumerate(messages, 1):
        print(f"\n===== TURN {i}/{len(messages)} =====", flush=True)
        print(f">> {msg[:140]}", flush=True)
        try:
            coder.run(with_message=msg)
        except Exception as exc:
            print(f"[driver] TURN {i} Fehler: {exc!r}", flush=True)
            break
        sent = getattr(coder, "total_tokens_sent", "?")
        recv = getattr(coder, "total_tokens_received", "?")
        print(f"-- aider kum: gesendet={sent} empfangen={recv}", flush=True)

    print("\n===== SESSION ENDE =====", flush=True)
    return 0


if __name__ == "__main__":
    sys.exit(main())
