const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); const DB_DIR = path.join(__dirname, '../data'); /** * Persists local NeDB files to Hugging Face Hub via Git LFS */ exports.syncToCloud = async () => { try { const hfToken = process.env.HF_TOKEN; const hfRepo = process.env.HF_REPO || 'spaces/zhlajiex/Codeai'; if (!hfToken) { console.warn('[PERSISTENCE] HF_TOKEN missing. Cloud sync disabled.'); return; } console.log('[PERSISTENCE] Initiating Neural Sync to Cloud...'); const rootDir = path.join(__dirname, '../../'); const gitIdent = `-c user.name="Codex AI" -c user.email="ai@codex.bot"`; const remoteUrl = `https://zhlajiex:${hfToken}@huggingface.co/${hfRepo}`; try { execSync(`git add backend/data/*.db`, { cwd: rootDir }); execSync(`git ${gitIdent} commit -m "Neural Archive Sync: [$(date)]"`, { cwd: rootDir }); if (process.env.SPACE_ID || process.env.HF_TOKEN) { console.log('[PERSISTENCE] HF_SPACE detected. Skipping remote push to prevent restart loop.'); } else { execSync(`git push "${remoteUrl}" main`, { cwd: rootDir }); } console.log('[PERSISTENCE] Cloud Sync: SUCCESS ✅'); } catch (gitErr) { if (gitErr.message.includes('nothing to commit')) { console.log('[PERSISTENCE] Cloud Sync: ARCHIVE STABLE (No changes)'); } else { console.error('[PERSISTENCE] Cloud Sync: FAILED ❌', gitErr.message); } } } catch (err) { console.error('[PERSISTENCE] System Error:', err.message); } }; /** * Restore from cloud on startup if local files are missing */ exports.restoreFromCloud = async () => { // Logic handled by HF Spaces auto-clone, // but we can add manual pull if needed. console.log('[PERSISTENCE] Neural Restore: READY'); };