package store type migration struct { Name string SQL string } var migrations = []migration{ { Name: "initial_state", SQL: ` CREATE TABLE allowed_users ( telegram_user_id INTEGER PRIMARY KEY, username TEXT NOT NULL DEFAULT '', notes TEXT NOT NULL DEFAULT '', added_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE workspaces ( id INTEGER PRIMARY KEY AUTOINCREMENT, path TEXT NOT NULL UNIQUE, label TEXT NOT NULL, is_default INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE sessions ( telegram_user_id INTEGER PRIMARY KEY, active_thread_id INTEGER, active_workspace_id INTEGER, model TEXT NOT NULL DEFAULT '', sandbox TEXT NOT NULL DEFAULT 'workspace-write', active_turn_id TEXT NOT NULL DEFAULT '', updated_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY(active_thread_id) REFERENCES threads(id) ON DELETE SET NULL, FOREIGN KEY(active_workspace_id) REFERENCES workspaces(id) ON DELETE SET NULL ); CREATE TABLE threads ( id INTEGER PRIMARY KEY AUTOINCREMENT, telegram_user_id INTEGER NOT NULL, codex_thread_id TEXT NOT NULL UNIQUE, workspace_id INTEGER NOT NULL, title TEXT NOT NULL DEFAULT '', archived INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY(workspace_id) REFERENCES workspaces(id) ON DELETE RESTRICT ); CREATE INDEX idx_threads_user_updated ON threads(telegram_user_id, archived, updated_at DESC); CREATE TABLE pending_approvals ( id INTEGER PRIMARY KEY AUTOINCREMENT, telegram_user_id INTEGER NOT NULL, codex_request_id TEXT NOT NULL, codex_thread_id TEXT NOT NULL, turn_id TEXT NOT NULL DEFAULT '', item_id TEXT NOT NULL DEFAULT '', kind TEXT NOT NULL, payload_json TEXT NOT NULL, message_chat_id INTEGER NOT NULL DEFAULT 0, message_id INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'pending', created_at TEXT NOT NULL DEFAULT (datetime('now')), resolved_at TEXT NOT NULL DEFAULT '', UNIQUE(telegram_user_id, codex_request_id) ); CREATE INDEX idx_pending_approvals_status ON pending_approvals(telegram_user_id, status); CREATE TABLE audit_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, telegram_user_id INTEGER NOT NULL DEFAULT 0, action TEXT NOT NULL, details TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX idx_audit_user_created ON audit_log(telegram_user_id, created_at DESC); `, }, { Name: "session_reasoning_effort", SQL: "ALTER TABLE sessions ADD COLUMN reasoning_effort TEXT NOT NULL DEFAULT ''", }, { Name: "session_settings_message", SQL: ` ALTER TABLE sessions ADD COLUMN settings_chat_id INTEGER NOT NULL DEFAULT 0; ALTER TABLE sessions ADD COLUMN settings_message_id INTEGER NOT NULL DEFAULT 0; `, }, }