CREATE TABLE IF NOT EXISTS packages ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL, pkgbuild_hash TEXT, description TEXT DEFAULT '', last_built_hash TEXT, status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'building', 'built', 'failed')), created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS builds ( id INTEGER PRIMARY KEY AUTOINCREMENT, package_name TEXT NOT NULL, target TEXT NOT NULL DEFAULT 'x86_64-semios-linux', atombuild INTEGER NOT NULL DEFAULT 1, status TEXT NOT NULL DEFAULT 'queued' CHECK(status IN ('queued', 'running', 'success', 'failed', 'cancelled')), machine_id INTEGER, trigger TEXT NOT NULL DEFAULT 'manual' CHECK(trigger IN ('manual', 'auto', 'hash-change')), created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, started_at DATETIME, finished_at DATETIME, log_path TEXT, error_message TEXT, FOREIGN KEY (machine_id) REFERENCES machines(id) ); CREATE TABLE IF NOT EXISTS machines ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, hostname TEXT NOT NULL, port INTEGER NOT NULL DEFAULT 3001, is_primary INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'offline' CHECK(status IN ('online', 'offline', 'building')), current_build_id INTEGER, cpu_usage REAL DEFAULT 0.0, memory_usage REAL DEFAULT 0.0, memory_total_mb REAL DEFAULT 0.0, disk_usage REAL DEFAULT 0.0, last_heartbeat DATETIME, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (current_build_id) REFERENCES builds(id) ); CREATE INDEX IF NOT EXISTS idx_builds_status ON builds(status); CREATE INDEX IF NOT EXISTS idx_builds_package ON builds(package_name); CREATE INDEX IF NOT EXISTS idx_builds_machine ON builds(machine_id); CREATE INDEX IF NOT EXISTS idx_packages_status ON packages(status); CREATE INDEX IF NOT EXISTS idx_machines_status ON machines(status);