b1a3e2a11d
Dataset export (source data for model training): - GET /api/v1/export?format=jsonl|csv|geojson with category/data_source filters; streams a labeled dataset (signal params + identified device + routed category) suitable for training a Sub-GHz classifier. SQLite dev-mode (corrects FABLE brief: SQLite was NOT a drop-in swap): - models.py made dialect-aware — JSONB->JSON, ARRAY(Text)->JSON, TSVECTOR ->Text via .with_variant(); PostGIS Geometry column + GiST index only defined when not on SQLite (lat/lon + haversine bbox used instead). - config/database.py honors DATABASE_URL / a full-URL override and builds a SQLite engine (check_same_thread=False, no server pool) when the URL is sqlite; PostgreSQL keeps pooling + UTC session. Verified: create_all + Capture/CaptureMatch/Device CRUD + JSON round-trip + bbox query all work on sqlite; postgres mode still defines geom + gist index; 52/52 unit tests pass. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>