/**
* Test Supabase Cloud Persistence
*
* Verifies that conversation state persists to Supabase cloud database
*/
require('dotenv').config();
const { createClient } = require('@supabase/supabase-js');
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.SUPABASE_SERVICE_ROLE_KEY
);
async function testSupabasePersistence() {
console.log('๐งช Testing Supabase Cloud Persistence\n');
console.log(`๐ก Connected to: ${process.env.NEXT_PUBLIC_SUPABASE_URL}\n`);
try {
// Step 1: Check if conversations table exists
console.log('Step 1: Verifying conversations table exists...');
const { data: tables, error: tableError } = await supabase
.from('conversations')
.select('conversation_id')
.limit(1);
if (tableError) {
console.error('โ FAIL: Table does not exist or cannot be accessed');
console.error(' Error:', tableError.message);
console.log('\n๐ Action Required: Execute SQL schema in Supabase dashboard');
console.log(' File: supabase/create_conversations_table.sql\n');
return;
}
console.log('โ
PASS: conversations table exists\n');
// Step 2: Query existing conversations
console.log('Step 2: Querying existing conversations...');
const { data: allConversations, error: queryError } = await supabase
.from('conversations')
.select('*')
.order('updated_at', { ascending: false });
if (queryError) {
console.error('โ FAIL: Query error:', queryError.message);
return;
}
console.log(`โ
PASS: Found ${allConversations.length} conversations in Supabase\n`);
if (allConversations.length > 0) {
console.log('Existing conversations:');
allConversations.forEach(conv => {
console.log(` - ID: ${conv.conversation_id}`);
console.log(` WHO: ${conv.identity.toolName} v${conv.identity.version}`);
console.log(` WHAT: ${conv.intent_history.length} intents recorded`);
console.log(` HOW: ${conv.permissions.length} permissions granted`);
console.log(` Updated: ${conv.updated_at}`);
console.log('');
});
}
// Step 3: Test create/update (upsert)
console.log('Step 3: Testing upsert (create or update)...');
const testConversation = {
conversation_id: 'test-supabase-persistence',
identity: {
toolName: 'test-tool',
version: '1.0.0',
capabilities: ['test-action']
},
intent_history: [
{
action: 'test-action',
alignment: 'aligned',
timestamp: Date.now()
}
],
permissions: [
{
level: 2,
scope: 'test-permission',
grantedAt: Date.now()
}
],
updated_at: new Date().toISOString()
};
const { data: upsertData, error: upsertError } = await supabase
.from('conversations')
.upsert(testConversation, { onConflict: 'conversation_id' })
.select();
if (upsertError) {
console.error('โ FAIL: Upsert error:', upsertError.message);
return;
}
console.log('โ
PASS: Test conversation upserted successfully\n');
// Step 4: Verify data persisted
console.log('Step 4: Verifying persisted data...');
const { data: verifyData, error: verifyError } = await supabase
.from('conversations')
.select('*')
.eq('conversation_id', 'test-supabase-persistence')
.single();
if (verifyError) {
console.error('โ FAIL: Verification error:', verifyError.message);
return;
}
console.log('โ
PASS: Test conversation retrieved from cloud');
console.log(` WHO: ${verifyData.identity.toolName} v${verifyData.identity.version}`);
console.log(` WHAT: ${verifyData.intent_history.length} intents`);
console.log(` HOW: ${verifyData.permissions.length} permissions\n`);
// Step 5: Cleanup test data
console.log('Step 5: Cleaning up test data...');
const { error: deleteError } = await supabase
.from('conversations')
.delete()
.eq('conversation_id', 'test-supabase-persistence');
if (deleteError) {
console.error('โ ๏ธ Warning: Cleanup failed:', deleteError.message);
} else {
console.log('โ
PASS: Test data cleaned up\n');
}
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
console.log('โจ All Supabase persistence tests PASSED!');
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n');
console.log('๐ Next: Verify on Supabase Dashboard');
console.log(' 1. Go to https://supabase.com/dashboard');
console.log(' 2. Select project: fjvsrzppgykdrtnrwqsr');
console.log(' 3. Table Editor โ conversations');
console.log(' 4. See real-time conversation data\n');
} catch (error) {
console.error('\n๐ฅ Unexpected error:', error);
}
}
testSupabasePersistence();