CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'admin', created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS agents ( id TEXT PRIMARY KEY, name TEXT NOT NULL, hostname TEXT NOT NULL, os TEXT NOT NULL, arch TEXT NOT NULL, version TEXT NOT NULL, ip TEXT, status TEXT NOT NULL DEFAULT 'offline', secret_hash TEXT NOT NULL, capabilities_json TEXT NOT NULL DEFAULT '{}', last_seen_at TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS agent_metrics ( id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id TEXT NOT NULL, cpu_usage REAL NOT NULL, memory_total INTEGER NOT NULL, memory_used INTEGER NOT NULL, disk_total INTEGER NOT NULL, disk_used INTEGER NOT NULL, load_avg REAL NOT NULL, uptime INTEGER NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY(agent_id) REFERENCES agents(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_agent_metrics_agent_created ON agent_metrics(agent_id, created_at DESC); CREATE TABLE IF NOT EXISTS registration_tokens ( id TEXT PRIMARY KEY, token_hash TEXT NOT NULL UNIQUE, name TEXT, expires_at TEXT NOT NULL, used_at TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS tasks ( id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, user_id INTEGER, action TEXT NOT NULL, params_json TEXT NOT NULL, status TEXT NOT NULL, result_json TEXT, error TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), started_at TEXT, finished_at TEXT, FOREIGN KEY(agent_id) REFERENCES agents(id) ON DELETE CASCADE, FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE SET NULL ); CREATE INDEX IF NOT EXISTS idx_tasks_agent_created ON tasks(agent_id, created_at DESC); CREATE TABLE IF NOT EXISTS audit_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, agent_id TEXT, action TEXT NOT NULL, target TEXT, params_summary TEXT, success INTEGER NOT NULL, error TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE SET NULL, FOREIGN KEY(agent_id) REFERENCES agents(id) ON DELETE SET NULL ); CREATE INDEX IF NOT EXISTS idx_audit_logs_created ON audit_logs(created_at DESC); CREATE TABLE IF NOT EXISTS settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL );