docs update, fix JSONL import (full-scan instead of line-offset tracking), sync button UX

This commit is contained in:
Meleki committed 2026-02-23 21:54:19 +01:00
1 parent 9aa8b8a1c6
commit 90139430f7
6 files changed
+81 -23

No files matched your search

+19 -5
View File
@@ -17,23 +17,37 @@ Minimal API mit Endpunkten für Kosten-Analyse:
- `GET /api/cost-summary` - Gesamtkosten für Zeitraum
- `GET /api/entry-chain/{id}` - Volle Kette eines Eintrags (parentId vor/zurück)
- `GET /api/entry-chains` - Einträge mit chainId-Zuordnung
- `GET /api/config` - Dashboard-Konfiguration lesen
- `PUT /api/config` - Dashboard-Konfiguration speichern
- `POST /api/sync` - Triggert JSONL-Import via `export.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:
1. Liest alle `.jsonl` aus `/home/node/.openclaw/agents/main/sessions/`
2. Parsed Einträge, speichert in `entries` Tabelle
1. Liest alle `.jsonl` aus dem Sessions-Verzeichnis
2. Parsed Einträge, speichert in `entries` Tabelle via `INSERT OR IGNORE`
3. Berechnet `chainId` durch parentId-Walk bis zum nächsten User-Message
4. Inkrementell - merkt sich pro File die letzte verarbeitete Zeile
4. 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 → Stunden)
- **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
- **Modal:** Konversations-Kontext mit User/Assistant Messages
- **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