scai
Version:
> **AI-powered CLI for local code analysis, commit message suggestions, and natural-language queries.** 100% local, private, GDPR-friendly, made in Denmark/EU with ❤️.
58 lines (57 loc) • 2.58 kB
JavaScript
import { hasUnindexedFiles, hasUncapsuledFolders, hasPendingKgWork, } from './daemonQueues.js';
import { log } from '../utils/log.js';
import { Config } from '../config.js';
import { runIndexingBatch } from './runIndexingBatch.js';
import { runKgBatch } from './runKgBatch.js';
import { runFolderCapsuleBatch } from './runFolderCapsuleBatch.js';
import { sleep } from '../utils/sleep.js';
// 🚨 Immediate signal that the worker even starts
log('🛠️ daemonWorker.js loaded');
export async function daemonWorker() {
log('🚀 Daemon worker starting (3-loop mode)...');
const { sleepMs, idleSleepMs } = Config.getDaemonConfig();
while (true) {
try {
// --------------------------------------------------
// LOOP 1: FAST FILE INDEXING (HIGHEST PRIORITY)
// --------------------------------------------------
if (await hasUnindexedFiles()) {
log('⚡ Indexing loop: processing files...');
const didWork = await runIndexingBatch();
if (didWork)
continue; // process next batch immediately
}
// --------------------------------------------------
// LOOP 2: FOLDER CAPSULE GENERATION (BLOCKING, FINITE)
// --------------------------------------------------
if (await hasUncapsuledFolders()) {
log('📦 Folder capsule loop: generating capsules...');
const didWork = await runFolderCapsuleBatch();
if (didWork)
continue; // process next folder batch immediately
}
// --------------------------------------------------
// LOOP 3: KNOWLEDGE GRAPH (BACKGROUND / BEST EFFORT)
// --------------------------------------------------
if (await hasPendingKgWork()) {
log('🧠 KG loop: background enrichment...');
await runKgBatch(); // intentionally ignore didWork
await sleep(idleSleepMs);
continue;
}
// --------------------------------------------------
// IDLE
// --------------------------------------------------
log('🕊️ All queues empty. Idling...');
await sleep(idleSleepMs * 6);
}
catch (err) {
log('🔥 Fatal error in daemon worker:', err);
await sleep(idleSleepMs);
}
}
}
// Boot
daemonWorker().catch(err => {
log('❌ daemonWorker failed to start:', err);
});