Spaces:
Running
Running
| -- GAP-SUP1: Supabase Skill Tracker persistence | |
| -- Eseguire nel SQL Editor di Supabase: | |
| -- https://app.supabase.com/project/_/sql/new | |
| -- | |
| -- Tabella skill_stats: statistiche tool per sessione (backend skill_tracker.py) | |
| -- Tabella skill_patterns: pattern tool sequenze (frontend skillPersistence.ts) | |
| -- ─── skill_stats ────────────────────────────────────────────────────────────── | |
| CREATE TABLE IF NOT EXISTS skill_stats ( | |
| session_id text NOT NULL, | |
| tool_name text NOT NULL, | |
| success_count integer NOT NULL DEFAULT 0, | |
| fail_count integer NOT NULL DEFAULT 0, | |
| last_used double precision NOT NULL DEFAULT 0, | |
| total_latency_ms double precision NOT NULL DEFAULT 0, | |
| updated_at timestamptz NOT NULL DEFAULT now(), | |
| PRIMARY KEY (session_id, tool_name) | |
| ); | |
| -- Index per query per sessione (GET ?session_id=eq.xxx) | |
| CREATE INDEX IF NOT EXISTS idx_skill_stats_session ON skill_stats (session_id); | |
| -- Row Level Security: anon può leggere e scrivere (chiave anon pubblica) | |
| ALTER TABLE skill_stats ENABLE ROW LEVEL SECURITY; | |
| DO $$ BEGIN | |
| IF NOT EXISTS ( | |
| SELECT 1 FROM pg_policies | |
| WHERE tablename = 'skill_stats' AND policyname = 'anon full access' | |
| ) THEN | |
| CREATE POLICY "anon full access" ON skill_stats | |
| FOR ALL TO anon | |
| USING (true) | |
| WITH CHECK (true); | |
| END IF; | |
| END $$; | |
| -- Trigger: aggiorna updated_at ad ogni upsert | |
| CREATE OR REPLACE FUNCTION _touch_updated_at() | |
| RETURNS TRIGGER LANGUAGE plpgsql AS $$ | |
| BEGIN NEW.updated_at = now(); RETURN NEW; END; | |
| $$; | |
| DROP TRIGGER IF EXISTS trg_skill_stats_updated_at ON skill_stats; | |
| CREATE TRIGGER trg_skill_stats_updated_at | |
| BEFORE UPDATE ON skill_stats | |
| FOR EACH ROW EXECUTE FUNCTION _touch_updated_at(); | |
| -- ─── skill_patterns ──────────────────────────────────────────────────────────── | |
| -- Persistenza cross-device per skillPersistence.ts (frontend Dexie → Supabase cloud) | |
| CREATE TABLE IF NOT EXISTS skill_patterns ( | |
| id text PRIMARY KEY, -- djb2(taskSignature) | |
| task_signature text NOT NULL, | |
| tool_sequence text[] NOT NULL, | |
| success_count integer NOT NULL DEFAULT 0, | |
| total_count integer NOT NULL DEFAULT 0, | |
| last_used bigint NOT NULL DEFAULT 0, | |
| confidence double precision NOT NULL DEFAULT 0, | |
| updated_at timestamptz NOT NULL DEFAULT now() | |
| ); | |
| CREATE INDEX IF NOT EXISTS idx_skill_patterns_confidence ON skill_patterns (confidence DESC); | |
| CREATE INDEX IF NOT EXISTS idx_skill_patterns_last_used ON skill_patterns (last_used DESC); | |
| ALTER TABLE skill_patterns ENABLE ROW LEVEL SECURITY; | |
| DO $$ BEGIN | |
| IF NOT EXISTS ( | |
| SELECT 1 FROM pg_policies | |
| WHERE tablename = 'skill_patterns' AND policyname = 'anon full access' | |
| ) THEN | |
| CREATE POLICY "anon full access" ON skill_patterns | |
| FOR ALL TO anon | |
| USING (true) | |
| WITH CHECK (true); | |
| END IF; | |
| END $$; | |
| DROP TRIGGER IF EXISTS trg_skill_patterns_updated_at ON skill_patterns; | |
| CREATE TRIGGER trg_skill_patterns_updated_at | |
| BEFORE UPDATE ON skill_patterns | |
| FOR EACH ROW EXECUTE FUNCTION _touch_updated_at(); | |