2.6 KiB
2.6 KiB
Architecture
Stack
- Backend: ASP.NET (.NET 10), Minimal API
- Frontend: Vanilla HTML/CSS/JS (SPA, kein Framework)
- Datenbank: SQLite via Dapper (read) + better-sqlite3 (import)
- Port: 18684
Komponenten
Backend (Program.cs)
Minimal API mit Endpunkten für Kosten-Analyse:
GET /api/cost-buckets- Zeitraum in N Buckets aggregiertGET /api/cost-entries- Einzelne Einträge mit KostenGET /api/cost-chains- Konversations-Ketten nach Kosten sortiertGET /api/cost-summary- Gesamtkosten für ZeitraumGET /api/entry-chain/{id}- Volle Kette eines Eintrags (parentId vor/zurück)GET /api/entry-chains- Einträge mit chainId-ZuordnungGET /api/config- Dashboard-Konfiguration lesenPUT /api/config- Dashboard-Konfiguration speichernPOST /api/sync- Triggert JSONL-Import viaexport.mjs
DB-Zugriff über Dapper + Microsoft.Data.Sqlite. Connection per Request via Factory.
Beim Start wird ein Index auf json_extract(data, '$.parentId') erstellt für schnelle Vorwärts-Ketten-Auflösung.
Konfiguration
Server-seitige Config als dashboard-config.json neben der DB. Einstellungen:
weeklyBudget- Wochen-Budget in Dollar (Default: 500)anchorDay- Budget-Anker Wochentag (0=So, 6=Sa)anchorHour- Anker-Stunde (0-23)minBarWidth- Minimale Balkenbreite in Pixel (Default: 12)
JSONL Sync (jsonl-sync/export.mjs)
Node.js Script das OpenClaw Session-JSONL-Files in SQLite importiert:
- Liest alle
.jsonlaus dem Sessions-Verzeichnis - Parsed Einträge, speichert in
entriesTabelle viaINSERT OR IGNORE - Berechnet
chainIddurch parentId-Walk bis zum nächsten User-Message - Full-Scan bei jedem Lauf - robust gegen Session-Kompaktierung durch OpenClaw
Frontend (wwwroot/)
SPA mit Zoom-Navigation durch Zeiträume:
- Bucket-View: Balkendiagramm mit klickbarem Drill-Down (Monat → Woche → Tag)
- Entry-View: Einzelne API-Calls als Balken, farblich nach Konversations-Kette
- Chain-Blocks: Teuerste Konversationen als klickbare Blöcke
- Ketten-Modal: Konversations-Kontext mit User/Assistant Messages + Kosten
- Config-Modal: Budget, Anker, Balkenbreite - serverseitig gespeichert
- Dynamische Balkenanzahl: Viewport-Breite / minBarWidth, gerundet auf Vielfache von 28
- Automatisches Re-Render bei Resize
- State wird im URL-Hash gespeichert
Datenfluss
OpenClaw JSONL Files → export.mjs → SQLite (sessions.db) → .NET API → Frontend
Deployment
./deploy.sh
Baut Release, kopiert nach publish/, restartet den token-analytics systemd Service auf stein2.