Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
161 lines
6 KiB
SQL
161 lines
6 KiB
SQL
-- Mnemosyne Object Store Schema
|
|
-- PostgreSQL 16 + pgvector
|
|
-- See SCHEMA.md for full documentation.
|
|
|
|
CREATE EXTENSION IF NOT EXISTS vector;
|
|
|
|
-- 1.1 Sessions
|
|
CREATE TABLE sessions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
external_id TEXT UNIQUE NOT NULL,
|
|
model TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
last_active_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
total_turns INTEGER NOT NULL DEFAULT 0,
|
|
total_objects INTEGER NOT NULL DEFAULT 0,
|
|
total_faults INTEGER NOT NULL DEFAULT 0,
|
|
total_micro_faults INTEGER NOT NULL DEFAULT 0,
|
|
status TEXT NOT NULL DEFAULT 'active',
|
|
config JSONB NOT NULL DEFAULT '{}'
|
|
);
|
|
|
|
CREATE INDEX idx_sessions_external ON sessions(external_id);
|
|
CREATE INDEX idx_sessions_active ON sessions(status) WHERE status = 'active';
|
|
|
|
-- 1.2 Semantic Objects
|
|
CREATE TABLE semantic_objects (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
|
|
-- Identity
|
|
object_type TEXT NOT NULL,
|
|
source_tool TEXT,
|
|
source_key TEXT,
|
|
|
|
-- Multi-fidelity content
|
|
content_full TEXT NOT NULL,
|
|
summary_detailed TEXT,
|
|
summary_compact TEXT,
|
|
stub TEXT NOT NULL,
|
|
|
|
-- Declared losses
|
|
losses_l1 JSONB DEFAULT '[]',
|
|
losses_l2 JSONB DEFAULT '[]',
|
|
can_answer_l1 JSONB DEFAULT '[]',
|
|
can_answer_l2 JSONB DEFAULT '[]',
|
|
fault_when JSONB DEFAULT '[]',
|
|
|
|
-- Entities and tags
|
|
key_entities JSONB DEFAULT '[]',
|
|
tags TEXT[] DEFAULT '{}',
|
|
|
|
-- State
|
|
current_fidelity INTEGER NOT NULL DEFAULT 0,
|
|
pinned BOOLEAN NOT NULL DEFAULT false,
|
|
pin_reason TEXT,
|
|
|
|
-- Metrics
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
last_accessed TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
access_count INTEGER NOT NULL DEFAULT 0,
|
|
fault_count INTEGER NOT NULL DEFAULT 0,
|
|
micro_fault_count INTEGER NOT NULL DEFAULT 0,
|
|
|
|
-- Token counts
|
|
tokens_l0 INTEGER NOT NULL DEFAULT 0,
|
|
tokens_l1 INTEGER,
|
|
tokens_l2 INTEGER,
|
|
tokens_l3 INTEGER NOT NULL DEFAULT 0,
|
|
|
|
-- Source range
|
|
source_turn_start INTEGER,
|
|
source_turn_end INTEGER,
|
|
|
|
-- Embedding
|
|
embedding vector(384) NOT NULL
|
|
);
|
|
|
|
CREATE INDEX idx_objects_session ON semantic_objects(session_id);
|
|
CREATE INDEX idx_objects_session_fidelity ON semantic_objects(session_id, current_fidelity);
|
|
CREATE INDEX idx_objects_session_type ON semantic_objects(session_id, object_type);
|
|
CREATE INDEX idx_objects_source_key ON semantic_objects(session_id, source_key)
|
|
WHERE source_key IS NOT NULL;
|
|
CREATE INDEX idx_objects_created ON semantic_objects(session_id, created_at);
|
|
CREATE INDEX idx_objects_last_accessed ON semantic_objects(session_id, last_accessed);
|
|
CREATE INDEX idx_objects_tags ON semantic_objects USING GIN(tags);
|
|
CREATE INDEX idx_objects_embedding ON semantic_objects
|
|
USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
|
CREATE INDEX idx_objects_content_fts ON semantic_objects
|
|
USING GIN(to_tsvector('english', content_full));
|
|
|
|
-- 1.3 Object Relationships
|
|
CREATE TABLE object_relationships (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
source_id UUID NOT NULL REFERENCES semantic_objects(id) ON DELETE CASCADE,
|
|
target_id UUID NOT NULL REFERENCES semantic_objects(id) ON DELETE CASCADE,
|
|
relationship TEXT NOT NULL,
|
|
metadata JSONB DEFAULT '{}',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
|
|
UNIQUE(source_id, target_id, relationship)
|
|
);
|
|
|
|
CREATE INDEX idx_rels_source ON object_relationships(source_id);
|
|
CREATE INDEX idx_rels_target ON object_relationships(target_id);
|
|
CREATE INDEX idx_rels_session ON object_relationships(session_id);
|
|
|
|
-- 1.4 Fault History
|
|
CREATE TABLE fault_history (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
object_id UUID NOT NULL REFERENCES semantic_objects(id) ON DELETE CASCADE,
|
|
fault_type TEXT NOT NULL,
|
|
turn_number INTEGER NOT NULL,
|
|
content_hash TEXT NOT NULL,
|
|
question TEXT,
|
|
answer TEXT,
|
|
answer_tokens INTEGER,
|
|
avoided_tokens INTEGER,
|
|
latency_ms INTEGER,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX idx_faults_session ON fault_history(session_id);
|
|
CREATE INDEX idx_faults_object ON fault_history(object_id);
|
|
CREATE INDEX idx_faults_content_hash ON fault_history(content_hash);
|
|
|
|
-- 1.5 Fidelity Transitions
|
|
CREATE TABLE fidelity_transitions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
object_id UUID NOT NULL REFERENCES semantic_objects(id) ON DELETE CASCADE,
|
|
from_fidelity INTEGER NOT NULL,
|
|
to_fidelity INTEGER NOT NULL,
|
|
trigger TEXT NOT NULL,
|
|
turn_number INTEGER NOT NULL,
|
|
pressure_zone TEXT,
|
|
token_count INTEGER,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX idx_transitions_session ON fidelity_transitions(session_id);
|
|
CREATE INDEX idx_transitions_object ON fidelity_transitions(object_id);
|
|
|
|
-- 1.6 Admission Scores
|
|
CREATE TABLE admission_scores (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
object_id UUID REFERENCES semantic_objects(id) ON DELETE SET NULL,
|
|
admitted BOOLEAN NOT NULL,
|
|
score_total REAL NOT NULL,
|
|
score_type REAL NOT NULL,
|
|
score_novelty REAL NOT NULL,
|
|
score_utility REAL NOT NULL,
|
|
score_recency REAL NOT NULL,
|
|
threshold REAL NOT NULL,
|
|
content_preview TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX idx_admission_session ON admission_scores(session_id);
|