UNPKG

scai

Version:

> AI-powered CLI tool for commit messages **and** pull request reviews — using local models.

64 lines (63 loc) 2.05 kB
import { getDbForRepo } from '../db/client.js'; import { runDaemonBatch } from './daemonBatch.js'; import { log } from '../utils/log.js'; const SLEEP_MS = 2000; const IDLE_SLEEP_MS = 5000; // 🚨 Immediate signal that the worker even starts log('🛠️ daemonWorker.js loaded'); async function isQueueEmpty() { try { const db = getDbForRepo(); const row = db.prepare(` SELECT COUNT(*) AS count FROM files WHERE processing_status IN ('unprocessed') `).get(); const castRow = row; if (typeof castRow.count !== 'number') { log('⚠️ Invalid count value in DB query result:', row); return true; } log(`📦 Queue size: ${castRow.count}`); return castRow.count === 0; } catch (error) { log('❌ Error checking if queue is empty:', error); return true; } } export async function daemonWorker() { log('🚀 Daemon worker starting up...'); while (true) { try { log('🔄 Running daemon batch...'); const didWork = await runDaemonBatch(); if (!didWork) { const queueEmpty = await isQueueEmpty(); if (queueEmpty) { log('🕊️ No work found. Idling...'); await sleep(IDLE_SLEEP_MS * 3); continue; } else { log('🟡 Work queue not empty, but no batch executed.'); } } else { log('✅ Batch executed, sleeping briefly...'); } await sleep(didWork ? SLEEP_MS : IDLE_SLEEP_MS); } catch (err) { log('🔥 Error in daemonWorker loop:', err); await sleep(IDLE_SLEEP_MS * 2); // prevent tight error loop } } } // Run the daemon daemonWorker().catch(err => { log('❌ daemonWorker failed to start:', err); }); function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }