Files
tasq/node_modules/agentic-flow/dist/reasoningbank/test-validation.js
T
2026-04-09 19:01:53 +08:00

173 lines
6.4 KiB
JavaScript

#!/usr/bin/env node
/**
* ReasoningBank Validation Test
* Tests database queries, core algorithms, and integration
*/
import { getDb, fetchMemoryCandidates, upsertMemory, upsertEmbedding, incrementUsage, logMetric } from './db/queries.js';
import { ulid } from 'ulid';
console.log('🧪 ReasoningBank Validation Test\n');
// Test 1: Database Connection
console.log('1️⃣ Testing database connection...');
try {
const db = getDb();
console.log(' ✅ Database connected successfully');
}
catch (error) {
console.error(' ❌ Database connection failed:', error);
process.exit(1);
}
// Test 2: Schema Verification
console.log('\n2️⃣ Verifying database schema...');
try {
const db = getDb();
const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all();
const views = db.prepare("SELECT name FROM sqlite_master WHERE type='view' ORDER BY name").all();
console.log(' Tables:', tables.map(t => t.name).join(', '));
console.log(' Views:', views.map(v => v.name).join(', '));
const requiredTables = ['patterns', 'pattern_embeddings', 'pattern_links', 'task_trajectories', 'matts_runs', 'consolidation_runs'];
const missingTables = requiredTables.filter(t => !tables.some(table => table.name === t));
if (missingTables.length > 0) {
console.error(' ❌ Missing tables:', missingTables);
process.exit(1);
}
console.log(' ✅ All required tables present');
}
catch (error) {
console.error(' ❌ Schema verification failed:', error);
process.exit(1);
}
// Test 3: Insert Mock Memory
console.log('\n3️⃣ Testing memory insertion...');
try {
const memoryId = ulid();
const mockMemory = {
id: memoryId,
type: 'reasoning_memory',
pattern_data: {
title: 'Test CSRF Token Handling',
description: 'Always extract CSRF tokens before form submission',
content: '1) Check for CSRF token in meta tags, form inputs, or cookies. 2) Include token in request headers or form data. 3) Verify token extraction succeeded before submission.',
source: {
task_id: 'test_task_001',
agent_id: 'test_agent',
outcome: 'Success',
evidence: ['step_1', 'step_2']
},
tags: ['csrf', 'web', 'security', 'test'],
domain: 'test.domain',
created_at: new Date().toISOString(),
confidence: 0.85,
n_uses: 0
},
confidence: 0.85,
usage_count: 0
};
upsertMemory(mockMemory);
console.log(' ✅ Memory inserted successfully:', memoryId);
// Insert embedding
const mockEmbedding = new Float32Array(1024);
for (let i = 0; i < 1024; i++) {
mockEmbedding[i] = Math.sin(i * 0.01) * 0.1;
}
upsertEmbedding({
id: memoryId,
model: 'test-model',
dims: 1024,
vector: mockEmbedding,
created_at: new Date().toISOString()
});
console.log(' ✅ Embedding inserted successfully');
}
catch (error) {
console.error(' ❌ Memory insertion failed:', error);
process.exit(1);
}
// Test 4: Fetch Memory Candidates
console.log('\n4️⃣ Testing memory retrieval...');
try {
const candidates = fetchMemoryCandidates({
domain: 'test.domain',
minConfidence: 0.5
});
console.log(` ✅ Retrieved ${candidates.length} candidate(s)`);
if (candidates.length > 0) {
const first = candidates[0];
console.log(' Sample memory:');
console.log(' - Title:', first.pattern_data.title);
console.log(' - Confidence:', first.confidence);
console.log(' - Age (days):', first.age_days);
console.log(' - Embedding dims:', first.embedding.length);
}
}
catch (error) {
console.error(' ❌ Memory retrieval failed:', error);
process.exit(1);
}
// Test 5: Usage Tracking
console.log('\n5️⃣ Testing usage tracking...');
try {
const candidates = fetchMemoryCandidates({ minConfidence: 0.5 });
if (candidates.length > 0) {
const memoryId = candidates[0].id;
const beforeCount = candidates[0].usage_count;
incrementUsage(memoryId);
const afterCandidates = fetchMemoryCandidates({ minConfidence: 0.5 });
const afterCount = afterCandidates.find(c => c.id === memoryId)?.usage_count || 0;
console.log(` ✅ Usage count: ${beforeCount}${afterCount}`);
}
else {
console.log(' ⚠️ No candidates to test usage tracking');
}
}
catch (error) {
console.error(' ❌ Usage tracking failed:', error);
process.exit(1);
}
// Test 6: Metrics Logging
console.log('\n6️⃣ Testing metrics logging...');
try {
logMetric('rb.test.validation', 1.0);
logMetric('rb.retrieve.latency_ms', 42);
const db = getDb();
const metrics = db.prepare(`
SELECT metric_name, value
FROM performance_metrics
WHERE metric_name LIKE 'rb.%'
ORDER BY timestamp DESC
LIMIT 5
`).all();
console.log(` ✅ Logged ${metrics.length} metric(s)`);
metrics.forEach((m) => {
console.log(` - ${m.metric_name}: ${m.value}`);
});
}
catch (error) {
console.error(' ❌ Metrics logging failed:', error);
process.exit(1);
}
// Test 7: Views
console.log('\n7️⃣ Testing database views...');
try {
const db = getDb();
const activeMemories = db.prepare('SELECT COUNT(*) as count FROM v_active_memories').get();
console.log(' ✅ v_active_memories:', activeMemories.count, 'memories');
const contradictions = db.prepare('SELECT COUNT(*) as count FROM v_memory_contradictions').get();
console.log(' ✅ v_memory_contradictions:', contradictions.count, 'contradictions');
const agentPerf = db.prepare('SELECT COUNT(*) as count FROM v_agent_performance').get();
console.log(' ✅ v_agent_performance:', agentPerf.count, 'agents');
}
catch (error) {
console.error(' ❌ Views test failed:', error);
process.exit(1);
}
console.log('\n✅ All validation tests passed!\n');
console.log('📊 Summary:');
console.log(' ✓ Database connection');
console.log(' ✓ Schema verification');
console.log(' ✓ Memory insertion');
console.log(' ✓ Memory retrieval');
console.log(' ✓ Usage tracking');
console.log(' ✓ Metrics logging');
console.log(' ✓ Database views');
console.log('\n🚀 ReasoningBank is production-ready!\n');
//# sourceMappingURL=test-validation.js.map