scai
Version:
> AI-powered CLI tool for commit messages **and** pull request reviews — using local models.
64 lines (63 loc) • 2.05 kB
JavaScript
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));
}