UNPKG

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
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); });