import * as SqlClient from "effect/unstable/sql/SqlClient"; import * as Effect from "effect/Effect"; export default Effect.gen(function* () { const sql = yield* SqlClient.SqlClient; yield* sql` CREATE TABLE IF NOT EXISTS projection_projects ( project_id TEXT PRIMARY KEY, title TEXT NOT NULL, workspace_root TEXT NOT NULL, default_model TEXT, scripts_json TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, deleted_at TEXT ) `; yield* sql` CREATE TABLE IF NOT EXISTS projection_threads ( thread_id TEXT PRIMARY KEY, project_id TEXT NOT NULL, title TEXT NOT NULL, model TEXT NOT NULL, branch TEXT, worktree_path TEXT, latest_turn_id TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, deleted_at TEXT ) `; yield* sql` CREATE TABLE IF NOT EXISTS projection_thread_messages ( message_id TEXT PRIMARY KEY, thread_id TEXT NOT NULL, turn_id TEXT, role TEXT NOT NULL, text TEXT NOT NULL, is_streaming INTEGER NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ) `; yield* sql` CREATE TABLE IF NOT EXISTS projection_thread_activities ( activity_id TEXT PRIMARY KEY, thread_id TEXT NOT NULL, turn_id TEXT, tone TEXT NOT NULL, kind TEXT NOT NULL, summary TEXT NOT NULL, payload_json TEXT NOT NULL, created_at TEXT NOT NULL ) `; yield* sql` CREATE TABLE IF NOT EXISTS projection_thread_sessions ( thread_id TEXT PRIMARY KEY, status TEXT NOT NULL, provider_name TEXT, provider_session_id TEXT, provider_thread_id TEXT, active_turn_id TEXT, last_error TEXT, updated_at TEXT NOT NULL ) `; yield* sql` CREATE TABLE IF NOT EXISTS projection_turns ( row_id INTEGER PRIMARY KEY AUTOINCREMENT, thread_id TEXT NOT NULL, turn_id TEXT, pending_message_id TEXT, assistant_message_id TEXT, state TEXT NOT NULL, requested_at TEXT NOT NULL, started_at TEXT, completed_at TEXT, checkpoint_turn_count INTEGER, checkpoint_ref TEXT, checkpoint_status TEXT, checkpoint_files_json TEXT NOT NULL, UNIQUE (thread_id, turn_id), UNIQUE (thread_id, checkpoint_turn_count) ) `; yield* sql` CREATE TABLE IF NOT EXISTS projection_pending_approvals ( request_id TEXT PRIMARY KEY, thread_id TEXT NOT NULL, turn_id TEXT, status TEXT NOT NULL, decision TEXT, created_at TEXT NOT NULL, resolved_at TEXT ) `; yield* sql` CREATE TABLE IF NOT EXISTS projection_state ( projector TEXT PRIMARY KEY, last_applied_sequence INTEGER NOT NULL, updated_at TEXT NOT NULL ) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_projects_updated_at ON projection_projects(updated_at) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_threads_project_id ON projection_threads(project_id) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_thread_messages_thread_created ON projection_thread_messages(thread_id, created_at) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_thread_activities_thread_created ON projection_thread_activities(thread_id, created_at) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_thread_sessions_provider_session ON projection_thread_sessions(provider_session_id) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_turns_thread_requested ON projection_turns(thread_id, requested_at) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_turns_thread_checkpoint_completed ON projection_turns(thread_id, checkpoint_turn_count, completed_at) `; yield* sql` CREATE INDEX IF NOT EXISTS idx_projection_pending_approvals_thread_status ON projection_pending_approvals(thread_id, status) `; });