CREATE TABLE webhook_endpoints ( id TEXT PRIMARY KEY, name TEXT NOT NULL, url TEXT NOT NULL, secret_cipher TEXT NOT NULL, enabled INTEGER NOT NULL DEFAULT 1, generation INTEGER NOT NULL DEFAULT 1, events_json TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE TABLE webhook_deliveries ( id TEXT PRIMARY KEY, endpoint_id TEXT NOT NULL REFERENCES webhook_endpoints(id) ON DELETE CASCADE, event_type TEXT NOT NULL, resource_id TEXT NOT NULL, payload_json TEXT NOT NULL, endpoint_generation INTEGER NOT NULL DEFAULT 1, status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','dead')), attempts INTEGER NOT NULL DEFAULT 0, next_attempt_at TEXT NOT NULL, created_at TEXT NOT NULL, last_error TEXT ); CREATE INDEX idx_webhook_due ON webhook_deliveries(status,next_attempt_at); CREATE TABLE webhook_transitions ( endpoint_id TEXT NOT NULL REFERENCES webhook_endpoints(id) ON DELETE CASCADE, event_type TEXT NOT NULL, resource_id TEXT NOT NULL, state TEXT NOT NULL, last_emitted_at TEXT, PRIMARY KEY(endpoint_id,event_type,resource_id) ); CREATE TABLE webhook_metrics (id INTEGER PRIMARY KEY CHECK(id=1), dropped INTEGER NOT NULL DEFAULT 0); INSERT INTO webhook_metrics(id) VALUES (1);