CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE IF NOT EXISTS wiki_units ( id TEXT PRIMARY KEY, type TEXT NOT NULL, topic TEXT NOT NULL, subtopic TEXT NOT NULL, content TEXT NOT NULL, problem_ids TEXT NOT NULL DEFAULT '[]', source TEXT NOT NULL DEFAULT 'manual', source_url TEXT, deleted BOOLEAN NOT NULL DEFAULT FALSE, version INTEGER NOT NULL DEFAULT 1, last_edited_by TEXT, embedding vector(1024), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS problems ( problem_id TEXT PRIMARY KEY, problem_text TEXT NOT NULL, choices TEXT, correct_answer TEXT, topic TEXT NOT NULL, subtopic TEXT NOT NULL, difficulty TEXT NOT NULL, problem_type TEXT NOT NULL, figure_svg TEXT, problem_hash TEXT, figure_type TEXT NOT NULL DEFAULT 'svg' ); CREATE TABLE IF NOT EXISTS wiki_unit_history ( id SERIAL PRIMARY KEY, unit_id TEXT NOT NULL, version INTEGER NOT NULL, content TEXT NOT NULL, edited_by TEXT, reason TEXT, edited_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS unit_feedback ( id SERIAL PRIMARY KEY, unit_id TEXT NOT NULL, problem_text TEXT, feedback_type TEXT NOT NULL DEFAULT 'general', comment TEXT, resolved BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS flagged_solutions ( id SERIAL PRIMARY KEY, problem_text TEXT NOT NULL, problem_hash TEXT NOT NULL, solver_output TEXT NOT NULL, flag_reason TEXT, reviewed BOOLEAN NOT NULL DEFAULT FALSE, flagged_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS wiki_drafts ( draft_id TEXT PRIMARY KEY, source_url TEXT, source_text TEXT NOT NULL, proposed_units_json TEXT NOT NULL DEFAULT '[]', final_units_json TEXT, topic_hint TEXT, status TEXT NOT NULL DEFAULT 'pending', reviewed_by TEXT, reviewed_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS solution_logs ( id SERIAL PRIMARY KEY, problem_text TEXT NOT NULL, problem_hash TEXT NOT NULL, classified_topic TEXT NOT NULL, retrieved_ids TEXT NOT NULL DEFAULT '[]', used_knowledge_ids TEXT NOT NULL DEFAULT '[]', solver_confidence TEXT NOT NULL DEFAULT 'medium', validation_valid BOOLEAN NOT NULL DEFAULT FALSE, validation_issues TEXT NOT NULL DEFAULT '[]', wiki_assisted BOOLEAN NOT NULL DEFAULT TRUE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS staged_wiki_units ( staged_id TEXT PRIMARY KEY, unit_data TEXT NOT NULL, source TEXT NOT NULL DEFAULT 'manual', source_url TEXT, status TEXT NOT NULL DEFAULT 'pending', proposed_by TEXT NOT NULL DEFAULT 'system', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS wiki_units_topic_idx ON wiki_units (topic); CREATE INDEX IF NOT EXISTS wiki_units_deleted_idx ON wiki_units (deleted); CREATE INDEX IF NOT EXISTS problems_hash_idx ON problems (problem_hash); CREATE INDEX IF NOT EXISTS solution_logs_created_idx ON solution_logs (created_at); CREATE INDEX IF NOT EXISTS staged_wiki_units_status_idx ON staged_wiki_units (status); -- HNSW index for vector similarity search -- Note: cannot use CONCURRENTLY inside a transaction; plain CREATE INDEX IF NOT EXISTS is used here CREATE INDEX IF NOT EXISTS wiki_units_embedding_hnsw ON wiki_units USING hnsw (embedding vector_cosine_ops);