import { createClient } from '@supabase/supabase-js'; import os from 'os'; import path from 'path'; import fs from 'fs'; import dotenv from 'dotenv'; // Load .env in development if present dotenv.config(); const CONFIG_DIR = path.join(os.homedir(), '.config', 'velowork'); const CONFIG_FILE = path.join(CONFIG_DIR, 'session.json'); // File-based Storage Provider for Supabase auth persistence const cliStorage = { getItem(key: string): string | null { try { if (!fs.existsSync(CONFIG_FILE)) return null; const fileContent = fs.readFileSync(CONFIG_FILE, 'utf8'); const data = JSON.parse(fileContent); return data[key] ?? null; } catch { return null; } }, setItem(key: string, value: string): void { try { fs.mkdirSync(CONFIG_DIR, { recursive: true }); let data: Record = {}; if (fs.existsSync(CONFIG_FILE)) { try { const fileContent = fs.readFileSync(CONFIG_FILE, 'utf8'); data = JSON.parse(fileContent); } catch {} } data[key] = value; fs.writeFileSync(CONFIG_FILE, JSON.stringify(data, null, 2), 'utf8'); } catch (e) { // Fail silently or handle error } }, removeItem(key: string): void { try { if (!fs.existsSync(CONFIG_FILE)) return; let data: Record = {}; try { const fileContent = fs.readFileSync(CONFIG_FILE, 'utf8'); data = JSON.parse(fileContent); } catch {} delete data[key]; fs.writeFileSync(CONFIG_FILE, JSON.stringify(data, null, 2), 'utf8'); } catch (e) { // Fail silently } } }; const supabaseUrl = process.env.VELOWORK_SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL || 'https://fhgswkdhndmgnaofewow.supabase.co'; const supabaseAnonKey = process.env.VELOWORK_SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImZoZ3N3a2RobmRtZ25hb2Zld293Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjQ1MjIxNDcsImV4cCI6MjA4MDA5ODE0N30.zHgEI8-JXpFUrjwcs9wAXKXTDAi0ZQcwRo2PoMHvThI'; export const supabase = createClient(supabaseUrl, supabaseAnonKey, { auth: { storage: cliStorage, autoRefreshToken: true, persistSession: true, detectSessionInUrl: false, } }); // Helper functions for session management export function getStoredSession() { try { if (!fs.existsSync(CONFIG_FILE)) return null; const fileContent = fs.readFileSync(CONFIG_FILE, 'utf8'); const data = JSON.parse(fileContent); // Supabase stores the session using a key like "sb--auth-token" const storageKey = Object.keys(data).find(key => key.startsWith('sb-') && key.endsWith('-auth-token')); if (storageKey && data[storageKey]) { return JSON.parse(data[storageKey]); } } catch {} return null; } export function clearStoredSession() { try { if (fs.existsSync(CONFIG_FILE)) { fs.unlinkSync(CONFIG_FILE); } } catch {} } export function getCachedValue(key: string): any { try { if (!fs.existsSync(CONFIG_FILE)) return null; const fileContent = fs.readFileSync(CONFIG_FILE, 'utf8'); const data = JSON.parse(fileContent); return data[key]; } catch { return null; } } export function setCachedValue(key: string, value: any): void { try { fs.mkdirSync(CONFIG_DIR, { recursive: true }); let data: any = {}; if (fs.existsSync(CONFIG_FILE)) { const fileContent = fs.readFileSync(CONFIG_FILE, 'utf8'); data = JSON.parse(fileContent); } data[key] = value; fs.writeFileSync(CONFIG_FILE, JSON.stringify(data, null, 2), 'utf8'); } catch {} }