This commit is contained in:
123
scripts/nuclear-rebuild.mjs
Normal file
123
scripts/nuclear-rebuild.mjs
Normal file
@@ -0,0 +1,123 @@
|
||||
import path from 'node:path';
|
||||
import os from 'node:os';
|
||||
import { MindDB, KnowledgeGraph, FrameStore, HybridSearch, createEmbeddingProvider } from '@waggle/core';
|
||||
import { WikiCompiler, CompilationState } from '@waggle/wiki-compiler';
|
||||
|
||||
const db = new MindDB(path.join(os.homedir(), '.waggle', 'personal.mind'));
|
||||
const kg = new KnowledgeGraph(db);
|
||||
const raw = db.getDatabase();
|
||||
|
||||
// 1. Retire ALL entities and relations
|
||||
console.log('Nuclear: retiring all entities and relations...');
|
||||
raw.prepare("UPDATE knowledge_relations SET valid_to = datetime('now') WHERE valid_to IS NULL").run();
|
||||
raw.prepare("UPDATE knowledge_entities SET valid_to = datetime('now') WHERE valid_to IS NULL").run();
|
||||
console.log('Active entities after nuke:', kg.getEntityCount());
|
||||
|
||||
// 2. Re-create only the real entities
|
||||
function ent(type, name, props = {}) { return kg.createEntity(type, name, props); }
|
||||
function rel(srcId, tgtId, relType, conf = 1.0) { try { kg.createRelation(srcId, tgtId, relType, conf); } catch {} }
|
||||
|
||||
const marko = ent('person', 'Marko Markovic', { role: 'CEO & CTO', company: 'Egzakta Group' });
|
||||
const egzakta = ent('organization', 'Egzakta Group', { focus: 'enterprise AI' });
|
||||
const lmtek = ent('organization', 'LM TEK', { focus: 'GPU infrastructure' });
|
||||
const anthropic = ent('organization', 'Anthropic', { relation: 'LLM provider' });
|
||||
const waggle = ent('project', 'Waggle OS', { type: 'AI workspace platform' });
|
||||
const kvark = ent('project', 'KVARK', { type: 'enterprise sovereign AI', revenue: 'EUR 1.2M' });
|
||||
const wikiP = ent('project', 'Wiki Compiler', { status: 'v1 built' });
|
||||
const mmcp = ent('project', 'Memory MCP', { tools: 18 });
|
||||
const react = ent('technology', 'React', { version: '18' });
|
||||
const ts = ent('technology', 'TypeScript', {});
|
||||
const tauri = ent('technology', 'Tauri', { version: '2.0' });
|
||||
const sqlite = ent('technology', 'SQLite', {});
|
||||
const fastify = ent('technology', 'Fastify', {});
|
||||
const clerk = ent('technology', 'Clerk', {});
|
||||
const mcpT = ent('technology', 'MCP Protocol', {});
|
||||
const hiveMind = ent('concept', 'Hive Mind', { desc: 'Personal wiki from memory frames' });
|
||||
const harvestC = ent('concept', 'Memory Harvest', { desc: 'Import from external AI' });
|
||||
const aiAct = ent('concept', 'EU AI Act', { deadline: 'Aug 2 2026' });
|
||||
const tierC = ent('concept', 'Tier Strategy', { pricing: 'Free/Pro/Teams/Enterprise' });
|
||||
const sovC = ent('concept', 'Data Sovereignty', { desc: 'Customer data on their infra' });
|
||||
|
||||
rel(marko.id, egzakta.id, 'founded');
|
||||
rel(marko.id, waggle.id, 'leads');
|
||||
rel(marko.id, kvark.id, 'leads');
|
||||
rel(egzakta.id, waggle.id, 'builds');
|
||||
rel(egzakta.id, kvark.id, 'builds');
|
||||
rel(egzakta.id, lmtek.id, 'owns');
|
||||
rel(waggle.id, kvark.id, 'feeds_demand_to');
|
||||
rel(waggle.id, mmcp.id, 'includes');
|
||||
rel(waggle.id, wikiP.id, 'includes');
|
||||
rel(kvark.id, sovC.id, 'implements');
|
||||
rel(waggle.id, react.id, 'uses');
|
||||
rel(waggle.id, ts.id, 'uses');
|
||||
rel(waggle.id, tauri.id, 'uses');
|
||||
rel(waggle.id, sqlite.id, 'uses');
|
||||
rel(waggle.id, fastify.id, 'uses');
|
||||
rel(waggle.id, clerk.id, 'uses');
|
||||
rel(mmcp.id, mcpT.id, 'implements');
|
||||
rel(wikiP.id, hiveMind.id, 'implements');
|
||||
rel(waggle.id, harvestC.id, 'provides');
|
||||
rel(waggle.id, aiAct.id, 'complies_with');
|
||||
rel(waggle.id, tierC.id, 'follows');
|
||||
|
||||
console.log('Rebuilt:', kg.getEntityCount(), 'entities');
|
||||
|
||||
// 3. Clear wiki state
|
||||
try { raw.prepare('DELETE FROM wiki_pages').run(); } catch {}
|
||||
try { raw.prepare('DELETE FROM wiki_watermark').run(); } catch {}
|
||||
|
||||
// 4. Compile
|
||||
const frameStore = new FrameStore(db);
|
||||
const embeddingProvider = process.env.WAGGLE_EMBEDDING_PROVIDER ?? 'inprocess';
|
||||
console.log('Embedder:', embeddingProvider);
|
||||
const embedder = await createEmbeddingProvider({
|
||||
provider: embeddingProvider,
|
||||
inprocess: { cacheDir: path.join(os.homedir(), '.waggle', 'models') },
|
||||
});
|
||||
const search = new HybridSearch(db, embedder);
|
||||
const state = new CompilationState(db);
|
||||
|
||||
// Use real LLM synthesizer if available, else echo
|
||||
let synthesize;
|
||||
try {
|
||||
const { resolveSynthesizer } = await import('@waggle/wiki-compiler');
|
||||
const synth = await resolveSynthesizer();
|
||||
console.log('Synthesizer:', synth.provider, '(' + synth.model + ')');
|
||||
synthesize = synth.synthesize;
|
||||
} catch {
|
||||
synthesize = async (prompt) => {
|
||||
const fc = prompt.match(/\((\d+) total\)/)?.[1] ?? '?';
|
||||
const nm = prompt.match(/about "([^"]+)"/)?.[1] ?? prompt.match(/concept "([^"]+)"/)?.[1] ?? 'topic';
|
||||
const lines = (prompt.match(/\[Frame #\d+.*?\]: .+/g) || []);
|
||||
const facts = lines.slice(0, 8).map(l => {
|
||||
const m = l.match(/\[Frame (#\d+).*?\]: (.+)/);
|
||||
return m ? `- ${m[2].slice(0, 200)} *(${m[1]})*` : null;
|
||||
}).filter(Boolean);
|
||||
return `## Summary\nSynthesized from ${fc} frames about ${nm}.\n\n` +
|
||||
(facts.length > 0 ? `## Key Facts\n${facts.join('\n')}\n\n` : '') +
|
||||
`> *Connect LLM for deeper synthesis.*`;
|
||||
};
|
||||
}
|
||||
|
||||
const compiler = new WikiCompiler(kg, frameStore, search, state, { synthesize });
|
||||
|
||||
const concepts = ['Waggle OS', 'KVARK', 'Memory Harvest', 'Wiki Compiler', 'EU AI Act', 'Tier Strategy', 'Data Sovereignty'];
|
||||
const result = await compiler.compile({ incremental: false, concepts });
|
||||
|
||||
console.log('\n--- RESULTS ---');
|
||||
console.log('Entity pages:', result.entityPages.length, '-', result.entityPages.join(', '));
|
||||
console.log('Concept pages:', result.conceptPages.length, '-', result.conceptPages.join(', '));
|
||||
console.log('Synthesis pages:', result.synthesisPages.length, '-', result.synthesisPages.join(', '));
|
||||
console.log('Total:', result.pagesCreated, 'pages in', result.durationMs, 'ms');
|
||||
|
||||
const health = compiler.compileHealth();
|
||||
console.log('\nHealth:', health.dataQualityScore + '/100');
|
||||
console.log('Frames:', health.totalFrames, '| Entities:', health.totalEntities, '| Pages:', health.totalPages);
|
||||
|
||||
console.log('\nAll pages:');
|
||||
for (const p of state.getAllPages()) {
|
||||
console.log(` ${p.pageType.padEnd(10)} ${p.name.padEnd(25)} (${p.sourceCount} sources)`);
|
||||
}
|
||||
|
||||
db.close();
|
||||
console.log('\nDone!');
|
||||
Reference in New Issue
Block a user