Spaces:
Sleeping
Sleeping
| -- 001_core (sqlite) — existing app schema, ported verbatim. | |
| -- | |
| -- Tables users/walks/walk_events/sr_cards/podcast_state/feedback/ | |
| -- socratic_sessions come from agents/persistence.py `_SCHEMA`; jobs comes | |
| -- from agents/jobs.py `_ensure_table`. Column names/types unchanged so | |
| -- existing callers (and existing dev DBs — hence IF NOT EXISTS) keep working. | |
| -- | |
| -- Statement separator convention: a line containing only `--;;` splits this | |
| -- file into statements (see atp/db.py). Plain ';' inside a statement is NOT | |
| -- a separator once the marker is used anywhere in the file. | |
| CREATE TABLE IF NOT EXISTS users ( | |
| user_id TEXT PRIMARY KEY, | |
| display_name TEXT, | |
| created_at REAL NOT NULL | |
| ); | |
| --;; | |
| CREATE TABLE IF NOT EXISTS walks ( | |
| walk_id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| user_id TEXT NOT NULL, | |
| start_node TEXT NOT NULL, | |
| planned_json TEXT NOT NULL, | |
| completed INTEGER NOT NULL DEFAULT 0, | |
| started_at REAL NOT NULL, | |
| completed_at REAL | |
| ); | |
| --;; | |
| CREATE TABLE IF NOT EXISTS walk_events ( | |
| event_id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| walk_id INTEGER NOT NULL, | |
| user_id TEXT NOT NULL, | |
| node TEXT, | |
| step_idx INTEGER, | |
| lesson_mode TEXT, | |
| quiz_quality INTEGER, | |
| duration_s REAL, | |
| ts REAL NOT NULL, | |
| FOREIGN KEY (walk_id) REFERENCES walks(walk_id) | |
| ); | |
| --;; | |
| CREATE INDEX IF NOT EXISTS idx_walk_events_user_node | |
| ON walk_events(user_id, node); | |
| --;; | |
| CREATE TABLE IF NOT EXISTS sr_cards ( | |
| user_id TEXT NOT NULL, | |
| node TEXT NOT NULL, | |
| repetitions INTEGER NOT NULL DEFAULT 0, | |
| ef REAL NOT NULL DEFAULT 2.5, | |
| interval_days REAL NOT NULL DEFAULT 0, | |
| due_ts REAL NOT NULL DEFAULT 0, | |
| last_quality INTEGER NOT NULL DEFAULT -1, | |
| last_review_ts REAL NOT NULL DEFAULT 0, | |
| PRIMARY KEY (user_id, node) | |
| ); | |
| --;; | |
| CREATE INDEX IF NOT EXISTS idx_sr_due ON sr_cards(user_id, due_ts); | |
| --;; | |
| CREATE TABLE IF NOT EXISTS podcast_state ( | |
| user_id TEXT NOT NULL, | |
| episode_key TEXT NOT NULL, | |
| current_turn INTEGER NOT NULL DEFAULT 0, | |
| interjections TEXT, | |
| last_played REAL NOT NULL, | |
| PRIMARY KEY (user_id, episode_key) | |
| ); | |
| --;; | |
| CREATE TABLE IF NOT EXISTS feedback ( | |
| feedback_id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| user_id TEXT NOT NULL, | |
| target_kind TEXT NOT NULL, | |
| target_id TEXT NOT NULL, | |
| thumb INTEGER NOT NULL, | |
| note TEXT, | |
| ts REAL NOT NULL | |
| ); | |
| --;; | |
| CREATE INDEX IF NOT EXISTS idx_feedback_target | |
| ON feedback(target_kind, target_id); | |
| --;; | |
| CREATE TABLE IF NOT EXISTS socratic_sessions ( | |
| session_id TEXT PRIMARY KEY, | |
| user_id TEXT NOT NULL, | |
| node TEXT NOT NULL, | |
| state_json TEXT NOT NULL, | |
| updated_at REAL NOT NULL | |
| ); | |
| --;; | |
| CREATE TABLE IF NOT EXISTS jobs ( | |
| job_id TEXT PRIMARY KEY, | |
| kind TEXT NOT NULL, | |
| status TEXT NOT NULL, | |
| result TEXT, | |
| error TEXT, | |
| created_at REAL NOT NULL, | |
| updated_at REAL NOT NULL | |
| ); | |