add worker event tracking; implement worker rates display in admin panel

This commit is contained in:
ImBenji
2026-04-23 17:13:57 +01:00
parent 16d95f5392
commit 30104c6e66
6 changed files with 145 additions and 23 deletions
+12
View File
@@ -11,6 +11,15 @@ async function runAugorWorker(archiveDb, intelligenceDb, config) {
SELECT * FROM article_queue WHERE status = 'pending' LIMIT 1
`);
const recordEvent = intelligenceDb.prepare(
`INSERT INTO worker_events (worker) VALUES ('augor')`
);
const pruneEvents = intelligenceDb.prepare(
`DELETE FROM worker_events WHERE worker = 'augor' AND completed_at < datetime('now', '-1 hour')`
);
let pruneCounter = 0;
const setStatus = intelligenceDb.prepare(`
UPDATE article_queue SET status = ?, updated_at = CURRENT_TIMESTAMP WHERE article_id = ?
`);
@@ -149,6 +158,9 @@ async function runAugorWorker(archiveDb, intelligenceDb, config) {
}
for (const r of getEventArticleIds.all(eventId)) setStatusByArticleId.run(r.id);
recordEvent.run();
pruneCounter++;
if (pruneCounter >= 100) { pruneEvents.run(); pruneCounter = 0; }
console.log(`[augor] processed event ${eventId} (${matchedCompanies.length} companies, ${eventArticles.length} articles)`);
} catch (err) {
+11
View File
@@ -12,6 +12,13 @@ async function runConsolidationWorker(archiveDb, intelligenceDb, config) {
const getCompanies = intelligenceDb.prepare("SELECT * FROM tracked_companies");
const recordEvent = intelligenceDb.prepare(
`INSERT INTO worker_events (worker) VALUES ('consolidation')`
);
const pruneEvents = intelligenceDb.prepare(
`DELETE FROM worker_events WHERE worker = 'consolidation' AND completed_at < datetime('now', '-1 hour')`
);
const getKnowledge = intelligenceDb.prepare(`
SELECT * FROM event_knowledge WHERE company_id = ? ORDER BY event_date ASC
`);
@@ -41,12 +48,16 @@ async function runConsolidationWorker(archiveDb, intelligenceDb, config) {
try {
const companies = getCompanies.all();
let pruneCounter = 0;
for (const company of companies) {
try {
await processCompany(
company, intelligenceDb, llmConfig,
getKnowledge, getExistingFirstSeen, deleteCompanyFacts, insertFact
);
recordEvent.run();
pruneCounter++;
if (pruneCounter >= 50) { pruneEvents.run(); pruneCounter = 0; }
} catch (err) {
console.error(`[consolidation] error on ${company.name}:`, err.message);
}
+12
View File
@@ -110,6 +110,18 @@ function runColumnMigrations(db) {
try { db.exec("ALTER TABLE event_predictions ADD COLUMN event_date TEXT"); } catch (_) {}
try { db.exec("ALTER TABLE event_knowledge ADD COLUMN event_date TEXT"); } catch (_) {}
db.exec(`
CREATE TABLE IF NOT EXISTS worker_events (
id INTEGER PRIMARY KEY,
worker TEXT NOT NULL,
completed_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_worker_events_lookup ON worker_events (worker, completed_at);
`);
// prune rows older than 1 hour so the table doesnt grow unbounded
db.exec(`DELETE FROM worker_events WHERE completed_at < datetime('now', '-1 hour')`);
}
function seedCompanies(db) {
+16
View File
@@ -105,6 +105,13 @@ async function runGraphWorker(archiveDb, intelligenceDb, config) {
SELECT * FROM company_facts WHERE type = 'relationship'
`);
const recordEvents = intelligenceDb.prepare(
`INSERT INTO worker_events (worker) VALUES ('graph')`
);
const pruneEvents = intelligenceDb.prepare(
`DELETE FROM worker_events WHERE worker = 'graph' AND completed_at < datetime('now', '-1 hour')`
);
const getCompanies = intelligenceDb.prepare("SELECT * FROM tracked_companies");
const getCompanyById = intelligenceDb.prepare("SELECT * FROM tracked_companies WHERE id = ?");
@@ -236,6 +243,15 @@ async function runGraphWorker(archiveDb, intelligenceDb, config) {
processAll();
// record one event per edge upserted so the rate tracks actual work
if (upserted > 0) {
const insertMany = intelligenceDb.transaction((n) => {
for (let i = 0; i < n; i++) recordEvents.run();
});
insertMany(upserted);
pruneEvents.run();
}
if (upserted > 0 || reciprocals > 0) {
console.log(`[graph] cycle complete — ${upserted} edges upserted, ${reciprocals} reciprocals added`);
} else {