mirror of
https://github.com/Heretek-AI/AetherTable.git
synced 2026-11-13 04:31:39 -10:00
- storage.py: dual-mode store — PostgresStore (asyncpg pool) when
DATABASE_URL is reachable, MemoryStore fallback otherwise; idempotent
_ensure_tables() DDL at startup; PBKDF2 credential helpers centralized
- 03_campaign_persistence.sql: narrative_state.users, campaigns (anchors
the previously free-floating campaign_id), campaign_saves (JSONB
snapshots) + owner/updated index — also auto-run by compose init
- auth routes now persist users across restarts (verified live: seeded GM
account survives process restarts via Postgres)
- new token-guarded API: POST /api/v1/campaign/save (upsert by owner+name),
GET /campaign/saves, GET /campaign/save/{id}, DELETE /campaign/save/{id}
- client: CampaignSaveModal (save/list/load/delete with round + timestamp),
Campaign Saves entry in Table Tools dropdown, snapshot build/apply in App
- fix compose postgres crash-loop on SELinux systems (:ro,z relabel flag)
- tests: memory-mode API CRUD always runs; PG end-to-end incl. cross-owner
denial and durability-across-reinit skips without DATABASE_URL
(58 pytest pass with Postgres up, cargo clean, MCR 100%)
Co-Authored-By: Claude <[email protected]>