-- Read-only PG role for the Overlord Agent's `query_telemetry_db` MCP tool. -- -- This is the second line of defense (the first is the sqlglot parser in -- agent/tools.py:assert_read_only). Even a parser bypass cannot mutate -- because this role only has SELECT. -- -- Apply on the dereth-db container: -- docker exec dereth-db psql -U postgres -d dereth -f - < agent/sql/0001_overlord_agent_ro.sql -- (substitute the password before running, or keep as a placeholder and -- ALTER ROLE … PASSWORD '…' separately) DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'overlord_agent_ro') THEN CREATE ROLE overlord_agent_ro NOINHERIT LOGIN PASSWORD 'change-me-set-via-alter-role'; END IF; END$$; GRANT CONNECT ON DATABASE dereth TO overlord_agent_ro; GRANT USAGE ON SCHEMA public TO overlord_agent_ro; -- Grant SELECT on all current public tables. GRANT SELECT ON ALL TABLES IN SCHEMA public TO overlord_agent_ro; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO overlord_agent_ro; -- And on any future tables created in public. ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO overlord_agent_ro; -- TimescaleDB-internal schema (chunks live here). Read on hypertable chunks -- requires SELECT on _timescaledb_internal too. GRANT USAGE ON SCHEMA _timescaledb_internal TO overlord_agent_ro; GRANT SELECT ON ALL TABLES IN SCHEMA _timescaledb_internal TO overlord_agent_ro; ALTER DEFAULT PRIVILEGES IN SCHEMA _timescaledb_internal GRANT SELECT ON TABLES TO overlord_agent_ro;