Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'
This commit is contained in:
380
vendor/ruvector/crates/ruvector-cli/sql/hooks_schema.sql
vendored
Normal file
380
vendor/ruvector/crates/ruvector-cli/sql/hooks_schema.sql
vendored
Normal file
@@ -0,0 +1,380 @@
|
||||
-- RuVector Hooks Intelligence Schema
|
||||
-- PostgreSQL schema for self-learning hooks with pgvector support
|
||||
-- Requires: ruvector extension (CREATE EXTENSION ruvector CASCADE)
|
||||
|
||||
-- ============================================================================
|
||||
-- Q-Learning Patterns Table
|
||||
-- Stores state-action pairs with Q-values for agent routing decisions
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_patterns (
|
||||
id SERIAL PRIMARY KEY,
|
||||
state TEXT NOT NULL,
|
||||
action TEXT NOT NULL,
|
||||
q_value REAL DEFAULT 0.0,
|
||||
visits INTEGER DEFAULT 0,
|
||||
last_update TIMESTAMPTZ DEFAULT NOW(),
|
||||
UNIQUE(state, action)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_patterns_state ON ruvector_hooks_patterns(state);
|
||||
CREATE INDEX IF NOT EXISTS idx_patterns_q_value ON ruvector_hooks_patterns(q_value DESC);
|
||||
|
||||
-- ============================================================================
|
||||
-- Vector Memory Table
|
||||
-- Semantic memory with pgvector embeddings for context retrieval
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_memories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
memory_type TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
embedding ruvector, -- Uses native ruvector type
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_memories_type ON ruvector_hooks_memories(memory_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_memories_created ON ruvector_hooks_memories(created_at DESC);
|
||||
-- Note: HNSW index on embedding created after extension is ready
|
||||
-- CREATE INDEX IF NOT EXISTS idx_memories_embedding ON ruvector_hooks_memories
|
||||
-- USING hnsw (embedding ruvector_cosine_ops) WITH (m = 16, ef_construction = 64);
|
||||
|
||||
-- ============================================================================
|
||||
-- Learning Trajectories Table
|
||||
-- Records of state-action-reward sequences for reinforcement learning
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_trajectories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
state TEXT NOT NULL,
|
||||
action TEXT NOT NULL,
|
||||
outcome TEXT,
|
||||
reward REAL DEFAULT 0.0,
|
||||
context JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_trajectories_state ON ruvector_hooks_trajectories(state);
|
||||
CREATE INDEX IF NOT EXISTS idx_trajectories_reward ON ruvector_hooks_trajectories(reward DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_trajectories_created ON ruvector_hooks_trajectories(created_at DESC);
|
||||
|
||||
-- ============================================================================
|
||||
-- Error Patterns Table
|
||||
-- Learned error patterns with suggested fixes
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_errors (
|
||||
id SERIAL PRIMARY KEY,
|
||||
code TEXT NOT NULL UNIQUE,
|
||||
error_type TEXT NOT NULL,
|
||||
message TEXT,
|
||||
fixes TEXT[] DEFAULT '{}',
|
||||
occurrences INTEGER DEFAULT 1,
|
||||
last_seen TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_errors_code ON ruvector_hooks_errors(code);
|
||||
CREATE INDEX IF NOT EXISTS idx_errors_type ON ruvector_hooks_errors(error_type);
|
||||
|
||||
-- ============================================================================
|
||||
-- File Sequences Table
|
||||
-- Tracks file edit sequences for predicting next files
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_file_sequences (
|
||||
id SERIAL PRIMARY KEY,
|
||||
from_file TEXT NOT NULL,
|
||||
to_file TEXT NOT NULL,
|
||||
count INTEGER DEFAULT 1,
|
||||
last_seen TIMESTAMPTZ DEFAULT NOW(),
|
||||
UNIQUE(from_file, to_file)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_sequences_from ON ruvector_hooks_file_sequences(from_file);
|
||||
CREATE INDEX IF NOT EXISTS idx_sequences_count ON ruvector_hooks_file_sequences(count DESC);
|
||||
|
||||
-- ============================================================================
|
||||
-- Swarm Agents Table
|
||||
-- Registered agents in the swarm with performance metrics
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_swarm_agents (
|
||||
id TEXT PRIMARY KEY,
|
||||
agent_type TEXT NOT NULL,
|
||||
capabilities TEXT[] DEFAULT '{}',
|
||||
success_rate REAL DEFAULT 1.0,
|
||||
task_count INTEGER DEFAULT 0,
|
||||
status TEXT DEFAULT 'active',
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_agents_type ON ruvector_hooks_swarm_agents(agent_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_agents_status ON ruvector_hooks_swarm_agents(status);
|
||||
|
||||
-- ============================================================================
|
||||
-- Swarm Edges Table
|
||||
-- Coordination edges between agents
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_swarm_edges (
|
||||
id SERIAL PRIMARY KEY,
|
||||
source_agent TEXT NOT NULL REFERENCES ruvector_hooks_swarm_agents(id) ON DELETE CASCADE,
|
||||
target_agent TEXT NOT NULL REFERENCES ruvector_hooks_swarm_agents(id) ON DELETE CASCADE,
|
||||
weight REAL DEFAULT 1.0,
|
||||
coordination_count INTEGER DEFAULT 1,
|
||||
last_coordination TIMESTAMPTZ DEFAULT NOW(),
|
||||
UNIQUE(source_agent, target_agent)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_edges_source ON ruvector_hooks_swarm_edges(source_agent);
|
||||
CREATE INDEX IF NOT EXISTS idx_edges_target ON ruvector_hooks_swarm_edges(target_agent);
|
||||
|
||||
-- ============================================================================
|
||||
-- Session Stats Table
|
||||
-- Global statistics for the intelligence layer
|
||||
-- ============================================================================
|
||||
CREATE TABLE IF NOT EXISTS ruvector_hooks_stats (
|
||||
id INTEGER PRIMARY KEY DEFAULT 1,
|
||||
session_count INTEGER DEFAULT 0,
|
||||
last_session TIMESTAMPTZ DEFAULT NOW(),
|
||||
total_edits INTEGER DEFAULT 0,
|
||||
total_commands INTEGER DEFAULT 0,
|
||||
total_errors_learned INTEGER DEFAULT 0,
|
||||
CHECK (id = 1) -- Single row table
|
||||
);
|
||||
|
||||
INSERT INTO ruvector_hooks_stats (id) VALUES (1) ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- ============================================================================
|
||||
-- Helper Functions
|
||||
-- ============================================================================
|
||||
|
||||
-- Update Q-value using Q-learning formula
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_update_q(
|
||||
p_state TEXT,
|
||||
p_action TEXT,
|
||||
p_reward REAL,
|
||||
p_alpha REAL DEFAULT 0.1
|
||||
) RETURNS VOID AS $$
|
||||
BEGIN
|
||||
INSERT INTO ruvector_hooks_patterns (state, action, q_value, visits, last_update)
|
||||
VALUES (p_state, p_action, p_reward * p_alpha, 1, NOW())
|
||||
ON CONFLICT (state, action) DO UPDATE SET
|
||||
q_value = ruvector_hooks_patterns.q_value + p_alpha * (p_reward - ruvector_hooks_patterns.q_value),
|
||||
visits = ruvector_hooks_patterns.visits + 1,
|
||||
last_update = NOW();
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Get best action for state
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_best_action(
|
||||
p_state TEXT,
|
||||
p_actions TEXT[]
|
||||
) RETURNS TABLE(action TEXT, q_value REAL, confidence REAL) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
p.action,
|
||||
p.q_value,
|
||||
CASE WHEN p.q_value > 0 THEN LEAST(p.q_value, 1.0) ELSE 0.0 END as confidence
|
||||
FROM ruvector_hooks_patterns p
|
||||
WHERE p.state = p_state
|
||||
AND p.action = ANY(p_actions)
|
||||
ORDER BY p.q_value DESC
|
||||
LIMIT 1;
|
||||
|
||||
-- If no match found, return first action with 0 confidence
|
||||
IF NOT FOUND THEN
|
||||
RETURN QUERY SELECT p_actions[1], 0.0::REAL, 0.0::REAL;
|
||||
END IF;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Remember content with embedding
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_remember(
|
||||
p_type TEXT,
|
||||
p_content TEXT,
|
||||
p_embedding REAL[] DEFAULT NULL,
|
||||
p_metadata JSONB DEFAULT '{}'
|
||||
) RETURNS INTEGER AS $$
|
||||
DECLARE
|
||||
v_id INTEGER;
|
||||
BEGIN
|
||||
INSERT INTO ruvector_hooks_memories (memory_type, content, embedding, metadata)
|
||||
VALUES (p_type, p_content,
|
||||
CASE WHEN p_embedding IS NOT NULL THEN p_embedding::TEXT::ruvector ELSE NULL END,
|
||||
p_metadata)
|
||||
RETURNING id INTO v_id;
|
||||
|
||||
-- Cleanup old memories (keep last 5000)
|
||||
DELETE FROM ruvector_hooks_memories
|
||||
WHERE id IN (
|
||||
SELECT id FROM ruvector_hooks_memories
|
||||
ORDER BY created_at ASC
|
||||
OFFSET 5000
|
||||
);
|
||||
|
||||
RETURN v_id;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Recall from memory using semantic search
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_recall(
|
||||
p_query_embedding REAL[],
|
||||
p_limit INTEGER DEFAULT 5
|
||||
) RETURNS TABLE(
|
||||
id INTEGER,
|
||||
memory_type TEXT,
|
||||
content TEXT,
|
||||
metadata JSONB,
|
||||
similarity REAL
|
||||
) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
m.id,
|
||||
m.memory_type,
|
||||
m.content,
|
||||
m.metadata,
|
||||
1.0 - (m.embedding <=> p_query_embedding::TEXT::ruvector) as similarity
|
||||
FROM ruvector_hooks_memories m
|
||||
WHERE m.embedding IS NOT NULL
|
||||
ORDER BY m.embedding <=> p_query_embedding::TEXT::ruvector
|
||||
LIMIT p_limit;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Record file sequence
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_record_sequence(
|
||||
p_from_file TEXT,
|
||||
p_to_file TEXT
|
||||
) RETURNS VOID AS $$
|
||||
BEGIN
|
||||
INSERT INTO ruvector_hooks_file_sequences (from_file, to_file, count, last_seen)
|
||||
VALUES (p_from_file, p_to_file, 1, NOW())
|
||||
ON CONFLICT (from_file, to_file) DO UPDATE SET
|
||||
count = ruvector_hooks_file_sequences.count + 1,
|
||||
last_seen = NOW();
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Get suggested next files
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_suggest_next(
|
||||
p_file TEXT,
|
||||
p_limit INTEGER DEFAULT 3
|
||||
) RETURNS TABLE(to_file TEXT, count INTEGER) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT fs.to_file, fs.count
|
||||
FROM ruvector_hooks_file_sequences fs
|
||||
WHERE fs.from_file = p_file
|
||||
ORDER BY fs.count DESC
|
||||
LIMIT p_limit;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Record error pattern
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_record_error(
|
||||
p_code TEXT,
|
||||
p_type TEXT,
|
||||
p_message TEXT DEFAULT NULL
|
||||
) RETURNS VOID AS $$
|
||||
BEGIN
|
||||
INSERT INTO ruvector_hooks_errors (code, error_type, message, occurrences, last_seen)
|
||||
VALUES (p_code, p_type, p_message, 1, NOW())
|
||||
ON CONFLICT (code) DO UPDATE SET
|
||||
occurrences = ruvector_hooks_errors.occurrences + 1,
|
||||
last_seen = NOW(),
|
||||
message = COALESCE(p_message, ruvector_hooks_errors.message);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Register swarm agent
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_swarm_register(
|
||||
p_id TEXT,
|
||||
p_type TEXT,
|
||||
p_capabilities TEXT[] DEFAULT '{}'
|
||||
) RETURNS VOID AS $$
|
||||
BEGIN
|
||||
INSERT INTO ruvector_hooks_swarm_agents (id, agent_type, capabilities)
|
||||
VALUES (p_id, p_type, p_capabilities)
|
||||
ON CONFLICT (id) DO UPDATE SET
|
||||
agent_type = p_type,
|
||||
capabilities = p_capabilities,
|
||||
updated_at = NOW();
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Record swarm coordination
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_swarm_coordinate(
|
||||
p_source TEXT,
|
||||
p_target TEXT,
|
||||
p_weight REAL DEFAULT 1.0
|
||||
) RETURNS VOID AS $$
|
||||
BEGIN
|
||||
INSERT INTO ruvector_hooks_swarm_edges (source_agent, target_agent, weight, coordination_count)
|
||||
VALUES (p_source, p_target, p_weight, 1)
|
||||
ON CONFLICT (source_agent, target_agent) DO UPDATE SET
|
||||
weight = (ruvector_hooks_swarm_edges.weight + p_weight) / 2,
|
||||
coordination_count = ruvector_hooks_swarm_edges.coordination_count + 1,
|
||||
last_coordination = NOW();
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Get swarm stats
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_swarm_stats()
|
||||
RETURNS TABLE(
|
||||
agent_count INTEGER,
|
||||
edge_count INTEGER,
|
||||
avg_success_rate REAL
|
||||
) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_swarm_agents WHERE status = 'active'),
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_swarm_edges),
|
||||
(SELECT COALESCE(AVG(success_rate), 0.0)::REAL FROM ruvector_hooks_swarm_agents WHERE status = 'active');
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Increment session count
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_session_start()
|
||||
RETURNS VOID AS $$
|
||||
BEGIN
|
||||
UPDATE ruvector_hooks_stats
|
||||
SET session_count = session_count + 1,
|
||||
last_session = NOW()
|
||||
WHERE id = 1;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Get full stats
|
||||
CREATE OR REPLACE FUNCTION ruvector_hooks_get_stats()
|
||||
RETURNS TABLE(
|
||||
patterns INTEGER,
|
||||
memories INTEGER,
|
||||
trajectories INTEGER,
|
||||
errors INTEGER,
|
||||
sessions INTEGER,
|
||||
agents INTEGER,
|
||||
edges INTEGER
|
||||
) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_patterns),
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_memories),
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_trajectories),
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_errors),
|
||||
(SELECT session_count FROM ruvector_hooks_stats WHERE id = 1),
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_swarm_agents),
|
||||
(SELECT COUNT(*)::INTEGER FROM ruvector_hooks_swarm_edges);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- ============================================================================
|
||||
-- Comments
|
||||
-- ============================================================================
|
||||
COMMENT ON TABLE ruvector_hooks_patterns IS 'Q-learning patterns for agent routing decisions';
|
||||
COMMENT ON TABLE ruvector_hooks_memories IS 'Semantic memory with vector embeddings';
|
||||
COMMENT ON TABLE ruvector_hooks_trajectories IS 'Reinforcement learning trajectories';
|
||||
COMMENT ON TABLE ruvector_hooks_errors IS 'Learned error patterns and fixes';
|
||||
COMMENT ON TABLE ruvector_hooks_file_sequences IS 'File edit sequence predictions';
|
||||
COMMENT ON TABLE ruvector_hooks_swarm_agents IS 'Registered swarm agents';
|
||||
COMMENT ON TABLE ruvector_hooks_swarm_edges IS 'Agent coordination graph';
|
||||
COMMENT ON TABLE ruvector_hooks_stats IS 'Global intelligence statistics';
|
||||
Reference in New Issue
Block a user