@timmeck/brain-core 2.36.4 → 2.36.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/curiosity/curiosity-engine.d.ts +5 -0
  2. package/dist/curiosity/curiosity-engine.js +29 -0
  3. package/dist/curiosity/curiosity-engine.js.map +1 -1
  4. package/dist/debate/debate-engine.d.ts +5 -0
  5. package/dist/debate/debate-engine.js +53 -2
  6. package/dist/debate/debate-engine.js.map +1 -1
  7. package/dist/hypothesis/engine.d.ts +11 -2
  8. package/dist/hypothesis/engine.js +69 -3
  9. package/dist/hypothesis/engine.js.map +1 -1
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/llm/__tests__/llm-service.test.d.ts +1 -0
  14. package/dist/llm/__tests__/llm-service.test.js +366 -0
  15. package/dist/llm/__tests__/llm-service.test.js.map +1 -0
  16. package/dist/llm/index.d.ts +2 -0
  17. package/dist/llm/index.js +2 -0
  18. package/dist/llm/index.js.map +1 -0
  19. package/dist/llm/llm-service.d.ts +97 -0
  20. package/dist/llm/llm-service.js +323 -0
  21. package/dist/llm/llm-service.js.map +1 -0
  22. package/dist/missions/mission-engine.d.ts +114 -0
  23. package/dist/missions/mission-engine.js +528 -0
  24. package/dist/missions/mission-engine.js.map +1 -0
  25. package/dist/narrative/narrative-engine.d.ts +13 -0
  26. package/dist/narrative/narrative-engine.js +127 -37
  27. package/dist/narrative/narrative-engine.js.map +1 -1
  28. package/dist/research/adapters/web-research-adapter.d.ts +24 -0
  29. package/dist/research/adapters/web-research-adapter.js +103 -0
  30. package/dist/research/adapters/web-research-adapter.js.map +1 -0
  31. package/dist/research/research-orchestrator.d.ts +6 -0
  32. package/dist/research/research-orchestrator.js +12 -0
  33. package/dist/research/research-orchestrator.js.map +1 -1
  34. package/dist/unified/unified-server.d.ts +4 -0
  35. package/dist/unified/unified-server.js +26 -0
  36. package/dist/unified/unified-server.js.map +1 -1
  37. package/package.json +1 -1
  38. package/unified-dashboard.html +120 -1
@@ -0,0 +1,528 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runMissionMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS research_missions (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ topic TEXT NOT NULL,
8
+ depth TEXT NOT NULL DEFAULT 'standard',
9
+ status TEXT NOT NULL DEFAULT 'pending',
10
+ sub_questions TEXT NOT NULL DEFAULT '[]',
11
+ report TEXT,
12
+ source_count INTEGER NOT NULL DEFAULT 0,
13
+ created_at TEXT DEFAULT (datetime('now')),
14
+ completed_at TEXT,
15
+ error TEXT
16
+ );
17
+ CREATE INDEX IF NOT EXISTS idx_missions_status ON research_missions(status);
18
+
19
+ CREATE TABLE IF NOT EXISTS mission_phases (
20
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
21
+ mission_id INTEGER NOT NULL REFERENCES research_missions(id),
22
+ phase TEXT NOT NULL,
23
+ status TEXT NOT NULL DEFAULT 'pending',
24
+ result TEXT,
25
+ started_at TEXT,
26
+ completed_at TEXT
27
+ );
28
+ CREATE INDEX IF NOT EXISTS idx_phases_mission ON mission_phases(mission_id);
29
+
30
+ CREATE TABLE IF NOT EXISTS mission_sources (
31
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
32
+ mission_id INTEGER NOT NULL REFERENCES research_missions(id),
33
+ url TEXT NOT NULL DEFAULT '',
34
+ title TEXT NOT NULL,
35
+ content TEXT NOT NULL DEFAULT '',
36
+ source_type TEXT NOT NULL DEFAULT 'web',
37
+ relevance REAL NOT NULL DEFAULT 0,
38
+ fetched_at TEXT DEFAULT (datetime('now'))
39
+ );
40
+ CREATE INDEX IF NOT EXISTS idx_sources_mission ON mission_sources(mission_id);
41
+ `);
42
+ }
43
+ // ── Engine ──────────────────────────────────────────────
44
+ export class ResearchMissionEngine {
45
+ db;
46
+ log = getLogger();
47
+ thoughtStream = null;
48
+ llm = null;
49
+ braveSearch = null;
50
+ jinaReader = null;
51
+ knowledgeDistiller = null;
52
+ hypothesisEngine = null;
53
+ journal = null;
54
+ running = false;
55
+ config;
56
+ // Prepared statements
57
+ stmtInsertMission;
58
+ stmtUpdateMission;
59
+ stmtInsertPhase;
60
+ stmtUpdatePhase;
61
+ stmtInsertSource;
62
+ constructor(db, config = {}) {
63
+ this.db = db;
64
+ this.config = {
65
+ brainName: config.brainName ?? 'brain',
66
+ maxConcurrentMissions: config.maxConcurrentMissions ?? 3,
67
+ maxSourcesPerMission: config.maxSourcesPerMission ?? 20,
68
+ gatherDelayMs: config.gatherDelayMs ?? 1500,
69
+ };
70
+ runMissionMigration(db);
71
+ this.stmtInsertMission = db.prepare('INSERT INTO research_missions (topic, depth, status) VALUES (?, ?, ?)');
72
+ this.stmtUpdateMission = db.prepare('UPDATE research_missions SET status=?, sub_questions=?, report=?, source_count=?, completed_at=?, error=? WHERE id=?');
73
+ this.stmtInsertPhase = db.prepare('INSERT INTO mission_phases (mission_id, phase, status) VALUES (?, ?, ?)');
74
+ this.stmtUpdatePhase = db.prepare('UPDATE mission_phases SET status=?, result=?, started_at=COALESCE(started_at, ?), completed_at=? WHERE id=?');
75
+ this.stmtInsertSource = db.prepare('INSERT INTO mission_sources (mission_id, url, title, content, source_type, relevance) VALUES (?, ?, ?, ?, ?, ?)');
76
+ }
77
+ // ── Setters ─────────────────────────────────────────
78
+ setThoughtStream(ts) { this.thoughtStream = ts; }
79
+ setLLMService(llm) { this.llm = llm; }
80
+ setBraveSearch(adapter) { this.braveSearch = adapter; }
81
+ setJinaReader(adapter) { this.jinaReader = adapter; }
82
+ setDataSources(sources) {
83
+ this.knowledgeDistiller = sources.knowledgeDistiller ?? null;
84
+ this.hypothesisEngine = sources.hypothesisEngine ?? null;
85
+ this.journal = sources.journal ?? null;
86
+ }
87
+ // ── Public API ──────────────────────────────────────
88
+ /**
89
+ * Create a new research mission and start executing it asynchronously.
90
+ */
91
+ createMission(topic, depth = 'standard') {
92
+ const result = this.stmtInsertMission.run(topic, depth, 'pending');
93
+ const id = Number(result.lastInsertRowid);
94
+ // Create phase rows
95
+ const phases = ['decompose', 'gather', 'hypothesize', 'analyze', 'synthesize'];
96
+ for (const phase of phases) {
97
+ this.stmtInsertPhase.run(id, phase, 'pending');
98
+ }
99
+ this.thoughtStream?.emit('mission_engine', 'exploring', `New research mission: "${topic}" (depth: ${depth})`, 'notable');
100
+ // Start async execution (fire-and-forget)
101
+ this.executeMission(id, topic, depth).catch(err => {
102
+ this.log.warn(`[missions] Mission #${id} failed: ${err.message}`);
103
+ });
104
+ return this.getMission(id);
105
+ }
106
+ /** Get a single mission by ID. */
107
+ getMission(id) {
108
+ const row = this.db.prepare('SELECT * FROM research_missions WHERE id=?').get(id);
109
+ if (!row)
110
+ return null;
111
+ return this.rowToMission(row);
112
+ }
113
+ /** List missions with optional status filter. */
114
+ listMissions(status, limit = 20) {
115
+ const sql = status
116
+ ? 'SELECT * FROM research_missions WHERE status=? ORDER BY id DESC LIMIT ?'
117
+ : 'SELECT * FROM research_missions ORDER BY id DESC LIMIT ?';
118
+ const rows = (status
119
+ ? this.db.prepare(sql).all(status, limit)
120
+ : this.db.prepare(sql).all(limit));
121
+ return rows.map(r => this.rowToMission(r));
122
+ }
123
+ /** Get the report for a completed mission. */
124
+ getReport(id) {
125
+ const mission = this.getMission(id);
126
+ if (!mission)
127
+ return null;
128
+ const phases = this.db.prepare('SELECT * FROM mission_phases WHERE mission_id=? ORDER BY id').all(id)
129
+ .map(r => this.rowToPhase(r));
130
+ const sources = this.db.prepare('SELECT * FROM mission_sources WHERE mission_id=? ORDER BY relevance DESC').all(id)
131
+ .map(r => this.rowToSource(r));
132
+ return { mission, phases, sources };
133
+ }
134
+ /** Cancel a running mission. */
135
+ cancelMission(id) {
136
+ const mission = this.getMission(id);
137
+ if (!mission || mission.status === 'complete' || mission.status === 'failed')
138
+ return false;
139
+ this.stmtUpdateMission.run('failed', JSON.stringify(mission.subQuestions), null, mission.sourceCount, null, 'Cancelled by user', id);
140
+ return true;
141
+ }
142
+ /** Get engine status summary. */
143
+ getStatus() {
144
+ const total = this.db.prepare('SELECT COUNT(*) as c FROM research_missions').get().c;
145
+ const active = this.db.prepare("SELECT COUNT(*) as c FROM research_missions WHERE status NOT IN ('complete','failed')").get().c;
146
+ const completed = this.db.prepare("SELECT COUNT(*) as c FROM research_missions WHERE status='complete'").get().c;
147
+ const sources = this.db.prepare('SELECT COUNT(*) as c FROM mission_sources').get().c;
148
+ return { activeMissions: active, completedMissions: completed, totalMissions: total, totalSources: sources };
149
+ }
150
+ // ── Mission Execution Pipeline ──────────────────────
151
+ async executeMission(id, topic, depth) {
152
+ const maxSources = depth === 'quick' ? 5 : depth === 'standard' ? 10 : 20;
153
+ const maxSearchQueries = depth === 'quick' ? 2 : depth === 'standard' ? 4 : 8;
154
+ try {
155
+ // Phase 1: Decompose
156
+ this.updateMissionStatus(id, 'decomposing');
157
+ const subQuestions = await this.phaseDecompose(id, topic, maxSearchQueries);
158
+ // Phase 2: Gather
159
+ this.updateMissionStatus(id, 'gathering');
160
+ const sources = await this.phaseGather(id, topic, subQuestions, maxSources);
161
+ // Phase 3: Hypothesize
162
+ this.updateMissionStatus(id, 'hypothesizing');
163
+ await this.phaseHypothesize(id, topic, sources);
164
+ // Phase 4: Analyze
165
+ this.updateMissionStatus(id, 'analyzing');
166
+ await this.phaseAnalyze(id, topic, sources);
167
+ // Phase 5: Synthesize
168
+ this.updateMissionStatus(id, 'synthesizing');
169
+ const report = await this.phaseSynthesize(id, topic, subQuestions, sources);
170
+ // Complete
171
+ const sourceCount = this.db.prepare('SELECT COUNT(*) as c FROM mission_sources WHERE mission_id=?').get(id).c;
172
+ this.stmtUpdateMission.run('complete', JSON.stringify(subQuestions), report, sourceCount, new Date().toISOString(), null, id);
173
+ this.thoughtStream?.emit('mission_engine', 'discovering', `Mission complete: "${topic}" — ${sourceCount} sources, report ready`, 'breakthrough');
174
+ // Log to journal
175
+ this.journal?.recordDiscovery(`Research Mission: ${topic}`, report.substring(0, 2000), { missionId: id, sourceCount, depth }, 'notable');
176
+ }
177
+ catch (err) {
178
+ const msg = err.message;
179
+ this.stmtUpdateMission.run('failed', '[]', null, 0, null, msg, id);
180
+ this.log.warn(`[missions] Mission #${id} failed: ${msg}`);
181
+ }
182
+ }
183
+ // ── Phase 1: Decompose ──────────────────────────────
184
+ async phaseDecompose(missionId, topic, maxQuestions) {
185
+ const phaseId = this.startPhase(missionId, 'decompose');
186
+ this.thoughtStream?.emit('mission_engine', 'reasoning', `Decomposing: "${topic}"`, 'routine');
187
+ let subQuestions;
188
+ // Try LLM decomposition
189
+ if (this.llm?.isAvailable()) {
190
+ const response = await this.llm.call('research_question', [
191
+ `Decompose this research topic into ${maxQuestions} specific, searchable sub-questions.`,
192
+ `Topic: "${topic}"`,
193
+ `Return ONLY a JSON array of strings, nothing else.`,
194
+ `Example: ["What is X?", "How does X affect Y?", "What are the latest trends in X?"]`,
195
+ ].join('\n'));
196
+ if (response?.text) {
197
+ try {
198
+ const parsed = JSON.parse(response.text.replace(/```json?\n?/g, '').replace(/```/g, '').trim());
199
+ if (Array.isArray(parsed) && parsed.length > 0) {
200
+ subQuestions = parsed.slice(0, maxQuestions).map(String);
201
+ this.completePhase(phaseId, JSON.stringify(subQuestions));
202
+ return subQuestions;
203
+ }
204
+ }
205
+ catch { /* Fall through to heuristic */ }
206
+ }
207
+ }
208
+ // Heuristic decomposition
209
+ subQuestions = this.heuristicDecompose(topic, maxQuestions);
210
+ this.completePhase(phaseId, JSON.stringify(subQuestions));
211
+ return subQuestions;
212
+ }
213
+ heuristicDecompose(topic, maxQuestions) {
214
+ const questions = [
215
+ `What is ${topic}?`,
216
+ `What are the key aspects of ${topic}?`,
217
+ `What are the latest developments in ${topic}?`,
218
+ `What are the challenges and risks of ${topic}?`,
219
+ `What are best practices for ${topic}?`,
220
+ `How does ${topic} compare to alternatives?`,
221
+ `What is the future outlook for ${topic}?`,
222
+ `What are real-world examples of ${topic}?`,
223
+ ];
224
+ return questions.slice(0, maxQuestions);
225
+ }
226
+ // ── Phase 2: Gather ─────────────────────────────────
227
+ async phaseGather(missionId, topic, subQuestions, maxSources) {
228
+ const phaseId = this.startPhase(missionId, 'gather');
229
+ this.thoughtStream?.emit('mission_engine', 'exploring', `Gathering sources for: "${topic}"`, 'routine');
230
+ const allSources = [];
231
+ // 1. Search internal knowledge base
232
+ const internalSources = this.gatherInternal(missionId, topic);
233
+ allSources.push(...internalSources);
234
+ // 2. Web search via Brave
235
+ if (this.braveSearch?.isEnabled()) {
236
+ for (const query of [topic, ...subQuestions.slice(0, 3)]) {
237
+ if (allSources.length >= maxSources)
238
+ break;
239
+ try {
240
+ await this.sleep(this.config.gatherDelayMs);
241
+ const results = await this.braveSearch.search(query, 5);
242
+ for (const result of results) {
243
+ if (allSources.length >= maxSources)
244
+ break;
245
+ // Skip duplicates
246
+ if (allSources.some(s => s.url === result.url))
247
+ continue;
248
+ let content = result.description;
249
+ // Try to extract full content via Jina
250
+ if (this.jinaReader && result.url) {
251
+ try {
252
+ await this.sleep(1000);
253
+ const extracted = await this.jinaReader.extract(result.url);
254
+ if (extracted) {
255
+ content = extracted.content.substring(0, 5000); // Limit to 5KB per source
256
+ }
257
+ }
258
+ catch { /* Use description as fallback */ }
259
+ }
260
+ const source = {
261
+ missionId,
262
+ url: result.url,
263
+ title: result.title,
264
+ content,
265
+ sourceType: 'web',
266
+ relevance: result.relevanceScore,
267
+ fetchedAt: new Date().toISOString(),
268
+ };
269
+ this.stmtInsertSource.run(missionId, source.url, source.title, source.content, source.sourceType, source.relevance);
270
+ allSources.push(source);
271
+ }
272
+ }
273
+ catch (err) {
274
+ this.log.debug(`[missions] Gather error for "${query}": ${err.message}`);
275
+ }
276
+ }
277
+ }
278
+ this.completePhase(phaseId, `Gathered ${allSources.length} sources`);
279
+ return allSources;
280
+ }
281
+ gatherInternal(missionId, topic) {
282
+ const sources = [];
283
+ const keywords = topic.toLowerCase().split(/\s+/).filter(w => w.length > 3);
284
+ // Search principles
285
+ if (this.knowledgeDistiller) {
286
+ try {
287
+ const principles = this.knowledgeDistiller.getPrinciples(undefined, 100);
288
+ for (const p of principles) {
289
+ const text = (p.text ?? p.content ?? '');
290
+ const matches = keywords.filter(k => text.toLowerCase().includes(k)).length;
291
+ if (matches > 0) {
292
+ const source = {
293
+ missionId,
294
+ url: '',
295
+ title: `Principle: ${text.substring(0, 80)}`,
296
+ content: text,
297
+ sourceType: 'database',
298
+ relevance: matches / keywords.length,
299
+ fetchedAt: new Date().toISOString(),
300
+ };
301
+ this.stmtInsertSource.run(missionId, '', source.title, source.content, 'database', source.relevance);
302
+ sources.push(source);
303
+ }
304
+ }
305
+ }
306
+ catch { /* ignore */ }
307
+ }
308
+ // Search journal
309
+ if (this.journal) {
310
+ try {
311
+ const entries = this.journal.getEntries(undefined, 100);
312
+ for (const e of entries) {
313
+ const title = (e.title ?? '');
314
+ const content = (e.content ?? '');
315
+ const combined = `${title} ${content}`.toLowerCase();
316
+ const matches = keywords.filter(k => combined.includes(k)).length;
317
+ if (matches > 0) {
318
+ const source = {
319
+ missionId,
320
+ url: '',
321
+ title: `Journal: ${title.substring(0, 80)}`,
322
+ content: content.substring(0, 2000),
323
+ sourceType: 'journal',
324
+ relevance: matches / keywords.length,
325
+ fetchedAt: new Date().toISOString(),
326
+ };
327
+ this.stmtInsertSource.run(missionId, '', source.title, source.content, 'journal', source.relevance);
328
+ sources.push(source);
329
+ }
330
+ }
331
+ }
332
+ catch { /* ignore */ }
333
+ }
334
+ return sources.slice(0, 5); // Max 5 internal sources
335
+ }
336
+ // ── Phase 3: Hypothesize ────────────────────────────
337
+ async phaseHypothesize(missionId, topic, sources) {
338
+ const phaseId = this.startPhase(missionId, 'hypothesize');
339
+ this.thoughtStream?.emit('mission_engine', 'reasoning', `Forming hypotheses about: "${topic}"`, 'routine');
340
+ const sourceContext = sources.slice(0, 10).map(s => `[${s.title}]: ${s.content.substring(0, 300)}`).join('\n\n');
341
+ if (this.llm?.isAvailable()) {
342
+ const response = await this.llm.call('creative_hypothesis', [
343
+ `Based on these research sources about "${topic}", generate 3 testable hypotheses.`,
344
+ '',
345
+ sourceContext,
346
+ '',
347
+ 'Return a JSON array of objects: [{"hypothesis": "...", "evidence": "...", "testable_via": "..."}]',
348
+ ].join('\n'), { maxTokens: 1024 });
349
+ if (response?.text) {
350
+ this.completePhase(phaseId, response.text);
351
+ // Store hypotheses if engine available
352
+ if (this.hypothesisEngine) {
353
+ try {
354
+ const parsed = JSON.parse(response.text.replace(/```json?\n?/g, '').replace(/```/g, '').trim());
355
+ if (Array.isArray(parsed)) {
356
+ for (const h of parsed.slice(0, 3)) {
357
+ this.hypothesisEngine.create(h.hypothesis ?? h.title ?? String(h), `Mission #${missionId}: ${topic}`);
358
+ }
359
+ }
360
+ }
361
+ catch { /* hypothesis text stored in phase result */ }
362
+ }
363
+ return;
364
+ }
365
+ }
366
+ // Heuristic: create simple hypotheses from source titles
367
+ const hypotheses = sources.slice(0, 3).map(s => `Based on "${s.title}": ${topic} may be influenced by ${s.title.split(':').pop()?.trim() ?? 'this factor'}`);
368
+ this.completePhase(phaseId, JSON.stringify(hypotheses));
369
+ }
370
+ // ── Phase 4: Analyze ────────────────────────────────
371
+ async phaseAnalyze(missionId, topic, sources) {
372
+ const phaseId = this.startPhase(missionId, 'analyze');
373
+ this.thoughtStream?.emit('mission_engine', 'reasoning', `Analyzing evidence for: "${topic}"`, 'routine');
374
+ const sourceContext = sources.slice(0, 8).map(s => `[${s.sourceType}] ${s.title}: ${s.content.substring(0, 200)}`).join('\n');
375
+ if (this.llm?.isAvailable()) {
376
+ const response = await this.llm.call('analyze_contradiction', [
377
+ `Analyze the evidence gathered about "${topic}":`,
378
+ '',
379
+ sourceContext,
380
+ '',
381
+ 'Identify: 1) Consistent findings across sources, 2) Contradictions or gaps, 3) Strength of evidence (strong/moderate/weak)',
382
+ ].join('\n'), { maxTokens: 1024 });
383
+ if (response?.text) {
384
+ this.completePhase(phaseId, response.text);
385
+ return;
386
+ }
387
+ }
388
+ // Heuristic analysis: count source types and average relevance
389
+ const byType = {};
390
+ let totalRelevance = 0;
391
+ for (const s of sources) {
392
+ byType[s.sourceType] = (byType[s.sourceType] ?? 0) + 1;
393
+ totalRelevance += s.relevance;
394
+ }
395
+ const avgRelevance = sources.length > 0 ? totalRelevance / sources.length : 0;
396
+ const analysis = `Sources: ${sources.length} (${Object.entries(byType).map(([k, v]) => `${k}: ${v}`).join(', ')}). Average relevance: ${(avgRelevance * 100).toFixed(0)}%.`;
397
+ this.completePhase(phaseId, analysis);
398
+ }
399
+ // ── Phase 5: Synthesize ─────────────────────────────
400
+ async phaseSynthesize(missionId, topic, subQuestions, sources) {
401
+ const phaseId = this.startPhase(missionId, 'synthesize');
402
+ this.thoughtStream?.emit('mission_engine', 'discovering', `Synthesizing report for: "${topic}"`, 'notable');
403
+ const sourceContext = sources
404
+ .sort((a, b) => b.relevance - a.relevance)
405
+ .slice(0, 12)
406
+ .map((s, i) => `[Source ${i + 1}: ${s.title}] ${s.content.substring(0, 400)}`)
407
+ .join('\n\n');
408
+ if (this.llm?.isAvailable()) {
409
+ const response = await this.llm.call('summarize', [
410
+ `Create a comprehensive research report about: "${topic}"`,
411
+ '',
412
+ `Sub-questions investigated: ${subQuestions.join('; ')}`,
413
+ '',
414
+ 'Sources:',
415
+ sourceContext,
416
+ '',
417
+ 'Write a structured report with:',
418
+ '1. Executive Summary (2-3 sentences)',
419
+ '2. Key Findings (bullet points)',
420
+ '3. Evidence Assessment (strong/moderate/weak for each finding)',
421
+ '4. Gaps & Limitations',
422
+ '5. Conclusions & Recommendations',
423
+ `Use plain text, no markdown headers. Cite sources by number [Source N].`,
424
+ ].join('\n'), { maxTokens: 2048 });
425
+ if (response?.text) {
426
+ this.completePhase(phaseId, 'Report generated via LLM');
427
+ return response.text;
428
+ }
429
+ }
430
+ // Heuristic report
431
+ const report = this.heuristicReport(topic, subQuestions, sources);
432
+ this.completePhase(phaseId, 'Report generated via heuristic');
433
+ return report;
434
+ }
435
+ heuristicReport(topic, subQuestions, sources) {
436
+ const lines = [];
437
+ lines.push(`Research Report: ${topic}`);
438
+ lines.push(`Generated: ${new Date().toISOString()}`);
439
+ lines.push('');
440
+ lines.push('EXECUTIVE SUMMARY');
441
+ lines.push(`This report investigates "${topic}" using ${sources.length} sources (${sources.filter(s => s.sourceType === 'web').length} web, ${sources.filter(s => s.sourceType !== 'web').length} internal).`);
442
+ lines.push('');
443
+ lines.push('SUB-QUESTIONS INVESTIGATED');
444
+ for (const q of subQuestions) {
445
+ lines.push(`- ${q}`);
446
+ }
447
+ lines.push('');
448
+ lines.push('KEY FINDINGS');
449
+ const topSources = sources.sort((a, b) => b.relevance - a.relevance).slice(0, 8);
450
+ for (const s of topSources) {
451
+ lines.push(`- [${s.sourceType}] ${s.title}`);
452
+ lines.push(` ${s.content.substring(0, 200).replace(/\n/g, ' ')}`);
453
+ lines.push('');
454
+ }
455
+ lines.push('EVIDENCE ASSESSMENT');
456
+ const avgRelevance = sources.length > 0 ? sources.reduce((s, x) => s + x.relevance, 0) / sources.length : 0;
457
+ lines.push(`Average source relevance: ${(avgRelevance * 100).toFixed(0)}% — ${avgRelevance > 0.6 ? 'Strong' : avgRelevance > 0.3 ? 'Moderate' : 'Weak'} evidence base.`);
458
+ lines.push('');
459
+ lines.push('GAPS & LIMITATIONS');
460
+ if (sources.filter(s => s.sourceType === 'web').length === 0) {
461
+ lines.push('- No web sources available (Brave Search API key not set)');
462
+ }
463
+ if (sources.length < 5) {
464
+ lines.push('- Limited source count — deeper research recommended');
465
+ }
466
+ lines.push('');
467
+ lines.push('CONCLUSIONS');
468
+ lines.push(`Based on ${sources.length} sources, the research provides a ${avgRelevance > 0.5 ? 'solid' : 'preliminary'} overview of "${topic}".`);
469
+ return lines.join('\n');
470
+ }
471
+ // ── Helpers ─────────────────────────────────────────
472
+ updateMissionStatus(id, status) {
473
+ this.db.prepare('UPDATE research_missions SET status=? WHERE id=?').run(status, id);
474
+ }
475
+ startPhase(missionId, phase) {
476
+ const row = this.db.prepare('SELECT id FROM mission_phases WHERE mission_id=? AND phase=?').get(missionId, phase);
477
+ if (!row)
478
+ return 0;
479
+ this.stmtUpdatePhase.run('running', null, new Date().toISOString(), null, row.id);
480
+ return row.id;
481
+ }
482
+ completePhase(phaseId, result) {
483
+ if (phaseId === 0)
484
+ return;
485
+ this.stmtUpdatePhase.run('complete', result, null, new Date().toISOString(), phaseId);
486
+ }
487
+ rowToMission(row) {
488
+ return {
489
+ id: row.id,
490
+ topic: row.topic,
491
+ depth: row.depth,
492
+ status: row.status,
493
+ subQuestions: JSON.parse(row.sub_questions || '[]'),
494
+ report: row.report ?? null,
495
+ sourceCount: row.source_count ?? 0,
496
+ createdAt: row.created_at,
497
+ completedAt: row.completed_at ?? null,
498
+ error: row.error ?? null,
499
+ };
500
+ }
501
+ rowToPhase(row) {
502
+ return {
503
+ id: row.id,
504
+ missionId: row.mission_id,
505
+ phase: row.phase,
506
+ status: row.status,
507
+ result: row.result ?? null,
508
+ startedAt: row.started_at ?? null,
509
+ completedAt: row.completed_at ?? null,
510
+ };
511
+ }
512
+ rowToSource(row) {
513
+ return {
514
+ id: row.id,
515
+ missionId: row.mission_id,
516
+ url: row.url,
517
+ title: row.title,
518
+ content: row.content,
519
+ sourceType: row.source_type,
520
+ relevance: row.relevance,
521
+ fetchedAt: row.fetched_at,
522
+ };
523
+ }
524
+ sleep(ms) {
525
+ return new Promise(resolve => setTimeout(resolve, ms));
526
+ }
527
+ }
528
+ //# sourceMappingURL=mission-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-engine.js","sourceRoot":"","sources":["../../src/missions/mission-engine.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import type { ExperimentEngine } from '../research/experiment-engine.js';
8
8
  import type { AnomalyDetective } from '../research/anomaly-detective.js';
9
9
  import type { AttentionEngine } from '../attention/attention-engine.js';
10
10
  import type { TransferEngine } from '../transfer/transfer-engine.js';
11
+ import type { LLMService } from '../llm/llm-service.js';
11
12
  export interface NarrativeEngineConfig {
12
13
  brainName: string;
13
14
  }
@@ -87,12 +88,24 @@ export declare class NarrativeEngine {
87
88
  private brainName;
88
89
  private thoughtStream;
89
90
  private sources;
91
+ private llm;
90
92
  private log;
91
93
  constructor(db: Database.Database, config: NarrativeEngineConfig);
92
94
  setThoughtStream(stream: ThoughtStream): void;
93
95
  setDataSources(sources: NarrativeEngineDataSources): void;
96
+ setLLMService(llm: LLMService): void;
94
97
  explain(topic: string): Narrative;
98
+ /** Async version of explain() that waits for LLM response. */
99
+ explainAsync(topic: string): Promise<Narrative>;
100
+ private heuristicExplainSummary;
101
+ private gatherContext;
102
+ /** Try to get LLM response from cache synchronously (fire-and-forget for warming). */
103
+ private tryLLMSync;
104
+ private hashPrompt;
95
105
  ask(question: string): NarrativeAnswer;
106
+ /** Async version of ask() that waits for LLM response. */
107
+ askAsync(question: string): Promise<NarrativeAnswer>;
108
+ private gatherAskContext;
96
109
  findContradictions(): Contradiction[];
97
110
  generateDigest(days?: number): WeeklyDigest;
98
111
  getConfidenceReport(topic?: string): ConfidenceReport;