be24ef245c
Mirrors webhook_server.py's BaseHTTPRequestHandler + ThreadingHTTPServer shape. Pure stdlib, no pip deps. Routes: GET / overview (totals + 7-day sparkline + top repos) GET /r/<owner>/<name> repo summary (severity histogram + top findings) GET /r/<owner>/<name>/<index> one PR's findings GET /r/<owner>/<name>/<index>/raw raw Markdown body (via Gitea contents API) GET /static/style.css dark-mode stylesheet GET /login login form POST /login compare token, set HttpOnly+SameSite cookie POST /r/<owner>/<name>/edit (Tasks C+D) Auth: when PRAGENT_DASHBOARD_TOKEN is set, every route except /login and /static/* requires Cookie: pragent_dash=<token>. Unset → tailnet-only. All HTML rendered via string.Template; every dynamic value is escaped with html.escape(..., quote=True). No .format, no f-string templates. 12 tests under tests/pilot/test_dashboard.py.