CREATE TABLE IF NOT EXISTS projects ( id TEXT PRIMARY KEY, name TEXT NOT NULL, root_path TEXT NOT NULL UNIQUE, canonical_path TEXT NOT NULL, is_git_repository INTEGER NOT NULL DEFAULT 0, trust_level TEXT NOT NULL DEFAULT 'readonly', detected_stack_json TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL DEFAULT (datetime('now')), last_opened_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS project_settings ( project_id TEXT PRIMARY KEY, model_profile_id TEXT, approval_mode TEXT NOT NULL DEFAULT 'balanced', git_isolation_mode TEXT NOT NULL DEFAULT 'worktree', network_policy TEXT NOT NULL DEFAULT 'local_only', read_roots_json TEXT NOT NULL DEFAULT '[]', write_roots_json TEXT NOT NULL DEFAULT '[]', ignored_paths_json TEXT NOT NULL DEFAULT '[]', commands_json TEXT NOT NULL DEFAULT '{}', FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS tasks ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, title TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', mode TEXT NOT NULL DEFAULT 'planAndExecute', status TEXT NOT NULL DEFAULT 'draft', base_revision TEXT, worktree_path TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), completed_at TEXT, failure_code TEXT, failure_message TEXT, FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS task_events ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL, sequence INTEGER NOT NULL, event_type TEXT NOT NULL, payload_json TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL DEFAULT (datetime('now')), UNIQUE(task_id, sequence), FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS messages ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL, role TEXT NOT NULL, content_markdown TEXT NOT NULL DEFAULT '', metadata_json TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS plans ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL, version INTEGER NOT NULL DEFAULT 1, status TEXT NOT NULL DEFAULT 'draft', content_json TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL DEFAULT (datetime('now')), approved_at TEXT, FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS tool_calls ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL, tool_name TEXT NOT NULL, arguments_json TEXT NOT NULL DEFAULT '{}', reason TEXT NOT NULL DEFAULT '', risk_level TEXT NOT NULL DEFAULT 'low', approval_status TEXT NOT NULL DEFAULT 'pending', status TEXT NOT NULL DEFAULT 'pending', output_summary TEXT, error_json TEXT, started_at TEXT, completed_at TEXT, FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS patches ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL, version INTEGER NOT NULL DEFAULT 1, status TEXT NOT NULL DEFAULT 'draft', base_revision TEXT, summary TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL DEFAULT (datetime('now')), applied_at TEXT, FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS patch_files ( id TEXT PRIMARY KEY, patch_id TEXT NOT NULL, file_path TEXT NOT NULL, operation TEXT NOT NULL, before_hash TEXT, after_hash TEXT, diff_text TEXT NOT NULL DEFAULT '', review_status TEXT NOT NULL DEFAULT 'pending', FOREIGN KEY(patch_id) REFERENCES patches(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS command_runs ( id TEXT PRIMARY KEY, task_id TEXT, program TEXT NOT NULL, args_json TEXT NOT NULL DEFAULT '[]', cwd TEXT NOT NULL, risk_level TEXT NOT NULL DEFAULT 'low', exit_code INTEGER, status TEXT NOT NULL DEFAULT 'pending', output_log_path TEXT, started_at TEXT NOT NULL DEFAULT (datetime('now')), completed_at TEXT ); CREATE TABLE IF NOT EXISTS model_profiles ( id TEXT PRIMARY KEY, name TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'planner', provider TEXT NOT NULL, base_url TEXT NOT NULL, model_id TEXT NOT NULL, api_key_ref TEXT, context_window INTEGER, max_output_tokens INTEGER, temperature REAL, capabilities_json TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS mcp_servers ( id TEXT PRIMARY KEY, name TEXT NOT NULL, transport TEXT NOT NULL DEFAULT 'stdio', command TEXT, args_json TEXT NOT NULL DEFAULT '[]', url TEXT, status TEXT NOT NULL DEFAULT 'stopped', auto_start INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS index_files ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, file_path TEXT NOT NULL, file_size INTEGER NOT NULL DEFAULT 0, modified_at TEXT NOT NULL, file_hash TEXT, language TEXT, is_ignored INTEGER NOT NULL DEFAULT 0, index_status TEXT NOT NULL DEFAULT 'pending', UNIQUE(project_id, file_path), FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS symbols ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, file_path TEXT NOT NULL, symbol_name TEXT NOT NULL, symbol_kind TEXT NOT NULL, start_line INTEGER NOT NULL, end_line INTEGER, parent_symbol_id TEXT, FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS app_settings ( key TEXT PRIMARY KEY, value_json TEXT NOT NULL DEFAULT '{}', updated_at TEXT NOT NULL DEFAULT (datetime('now')) );