@timmeck/brain-core 2.36.4 → 2.36.5

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-service.test.js","sourceRoot":"","sources":["../../../src/llm/__tests__/llm-service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { LLMService, runLLMServiceMigration } from './llm-service.js';
2
+ export type { LLMServiceConfig, LLMResponse, LLMUsageStats, PromptTemplate, } from './llm-service.js';
@@ -0,0 +1,2 @@
1
+ export { LLMService, runLLMServiceMigration } from './llm-service.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,97 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface LLMServiceConfig {
3
+ /** Anthropic API key. Falls back to ANTHROPIC_API_KEY env var. */
4
+ apiKey?: string;
5
+ /** Model to use. Default: claude-sonnet-4-20250514 */
6
+ model?: string;
7
+ /** Max tokens per request. Default: 2048 */
8
+ maxTokens?: number;
9
+ /** Max API calls per hour. Default: 30 */
10
+ maxCallsPerHour?: number;
11
+ /** Max tokens per hour budget. Default: 100_000 */
12
+ tokenBudgetPerHour?: number;
13
+ /** Max tokens per day budget. Default: 500_000 */
14
+ tokenBudgetPerDay?: number;
15
+ /** Cache TTL in ms. Default: 3_600_000 (1 hour) */
16
+ cacheTtlMs?: number;
17
+ /** Max cache entries. Default: 500 */
18
+ maxCacheEntries?: number;
19
+ }
20
+ export interface LLMResponse {
21
+ text: string;
22
+ tokensUsed: number;
23
+ inputTokens: number;
24
+ outputTokens: number;
25
+ cached: boolean;
26
+ model: string;
27
+ durationMs: number;
28
+ }
29
+ export interface LLMUsageStats {
30
+ totalCalls: number;
31
+ totalTokens: number;
32
+ cacheHits: number;
33
+ cacheMisses: number;
34
+ cacheHitRate: number;
35
+ callsThisHour: number;
36
+ tokensThisHour: number;
37
+ tokensToday: number;
38
+ budgetRemainingHour: number;
39
+ budgetRemainingDay: number;
40
+ averageLatencyMs: number;
41
+ rateLimitHits: number;
42
+ errors: number;
43
+ lastCallAt: number | null;
44
+ model: string;
45
+ }
46
+ export type PromptTemplate = 'explain' | 'ask' | 'synthesize_debate' | 'creative_hypothesis' | 'research_question' | 'summarize' | 'analyze_contradiction' | 'custom';
47
+ export declare function runLLMServiceMigration(db: Database.Database): void;
48
+ export declare class LLMService {
49
+ private db;
50
+ private readonly apiKey;
51
+ private readonly model;
52
+ private readonly maxTokens;
53
+ private readonly maxCallsPerHour;
54
+ private readonly tokenBudgetPerHour;
55
+ private readonly tokenBudgetPerDay;
56
+ private readonly cacheTtlMs;
57
+ private readonly maxCacheEntries;
58
+ private readonly log;
59
+ private cache;
60
+ private callHistory;
61
+ private stats;
62
+ private stmtInsertUsage;
63
+ constructor(db: Database.Database, config?: LLMServiceConfig);
64
+ /** Check if LLM is available (API key set). */
65
+ isAvailable(): boolean;
66
+ /**
67
+ * Main entry point: call Claude with a template + context.
68
+ * Returns null if budget exhausted or API key not set (caller should fallback to heuristic).
69
+ */
70
+ call(template: PromptTemplate, userMessage: string, options?: {
71
+ maxTokens?: number;
72
+ temperature?: number;
73
+ }): Promise<LLMResponse | null>;
74
+ /** Get usage statistics. */
75
+ getStats(): LLMUsageStats;
76
+ /** Get usage history from DB (for dashboard). */
77
+ getUsageHistory(hours?: number): Array<{
78
+ hour: string;
79
+ calls: number;
80
+ tokens: number;
81
+ cached: number;
82
+ }>;
83
+ /** Get usage breakdown by template. */
84
+ getUsageByTemplate(): Array<{
85
+ template: string;
86
+ calls: number;
87
+ tokens: number;
88
+ avg_tokens: number;
89
+ }>;
90
+ private checkRateLimit;
91
+ private checkTokenBudget;
92
+ private getCacheKey;
93
+ private getFromCache;
94
+ private setCache;
95
+ private pruneCallHistory;
96
+ private recordUsage;
97
+ }
@@ -0,0 +1,323 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { getLogger } from '../utils/logger.js';
3
+ // ── Migration ───────────────────────────────────────────
4
+ export function runLLMServiceMigration(db) {
5
+ db.exec(`
6
+ CREATE TABLE IF NOT EXISTS llm_usage (
7
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
8
+ prompt_hash TEXT NOT NULL,
9
+ template TEXT NOT NULL,
10
+ model TEXT NOT NULL,
11
+ input_tokens INTEGER NOT NULL DEFAULT 0,
12
+ output_tokens INTEGER NOT NULL DEFAULT 0,
13
+ total_tokens INTEGER NOT NULL DEFAULT 0,
14
+ duration_ms INTEGER NOT NULL DEFAULT 0,
15
+ cached INTEGER NOT NULL DEFAULT 0,
16
+ created_at TEXT DEFAULT (datetime('now'))
17
+ );
18
+ CREATE INDEX IF NOT EXISTS idx_llm_usage_created ON llm_usage(created_at);
19
+ CREATE INDEX IF NOT EXISTS idx_llm_usage_template ON llm_usage(template);
20
+ `);
21
+ }
22
+ // ── Prompt Templates ────────────────────────────────────
23
+ const SYSTEM_PROMPTS = {
24
+ explain: `You are an analytical AI research assistant embedded in an autonomous Brain system.
25
+ Your task is to explain a topic based on the provided knowledge base (principles, hypotheses, experiments, journal entries).
26
+ Be concise, insightful, and synthesize across sources. Highlight confidence levels and knowledge gaps.
27
+ Output a coherent narrative explanation (2-4 paragraphs). Do not use markdown headers.`,
28
+ ask: `You are an analytical AI research assistant embedded in an autonomous Brain system.
29
+ Answer the user's question based ONLY on the provided knowledge context.
30
+ If the context doesn't contain enough information, say so honestly.
31
+ Be direct and precise. Cite which sources (principle, hypothesis, experiment, journal) support your answer.`,
32
+ synthesize_debate: `You are a debate synthesizer in an autonomous Brain system.
33
+ Multiple perspectives on a question have been gathered from different knowledge domains.
34
+ Your job is to:
35
+ 1. Identify points of agreement across perspectives
36
+ 2. Identify genuine conflicts and explain why they exist
37
+ 3. Propose a nuanced synthesis that respects all evidence
38
+ 4. Make clear recommendations based on the weight of evidence
39
+ Be balanced and analytical. Output a structured synthesis.`,
40
+ creative_hypothesis: `You are a creative research hypothesis generator in an autonomous Brain system.
41
+ Given the current knowledge base (confirmed principles, existing hypotheses, anomalies, patterns),
42
+ generate novel, testable hypotheses that push the boundaries of current understanding.
43
+ Each hypothesis should:
44
+ - Be specific and falsifiable
45
+ - Connect to existing evidence
46
+ - Explore non-obvious relationships
47
+ - Include what variables to track
48
+ Output exactly the requested number of hypotheses in JSON format.`,
49
+ research_question: `You are a research question generator in an autonomous Brain system.
50
+ Given knowledge gaps and topics of interest, generate precise, actionable research questions.
51
+ Questions should be specific enough to guide investigation and lead to measurable outcomes.
52
+ Consider what data or experiments could answer each question.`,
53
+ summarize: `You are a summarizer in an autonomous Brain system.
54
+ Condense the provided information into a clear, concise summary.
55
+ Preserve key insights, numbers, and conclusions. Remove redundancy.`,
56
+ analyze_contradiction: `You are a contradiction analyzer in an autonomous Brain system.
57
+ Two pieces of knowledge appear to conflict. Analyze:
58
+ 1. Are they truly contradictory, or is the conflict apparent?
59
+ 2. What context or conditions might make both true?
60
+ 3. What evidence favors each side?
61
+ 4. What experiment or data could resolve the contradiction?`,
62
+ custom: `You are an AI research assistant embedded in an autonomous Brain system.
63
+ Follow the user's instructions precisely.`,
64
+ };
65
+ // ── Service ─────────────────────────────────────────────
66
+ export class LLMService {
67
+ db;
68
+ apiKey;
69
+ model;
70
+ maxTokens;
71
+ maxCallsPerHour;
72
+ tokenBudgetPerHour;
73
+ tokenBudgetPerDay;
74
+ cacheTtlMs;
75
+ maxCacheEntries;
76
+ log = getLogger();
77
+ // In-memory state
78
+ cache = new Map();
79
+ callHistory = [];
80
+ stats = {
81
+ totalCalls: 0,
82
+ totalTokens: 0,
83
+ cacheHits: 0,
84
+ cacheMisses: 0,
85
+ rateLimitHits: 0,
86
+ errors: 0,
87
+ totalLatencyMs: 0,
88
+ lastCallAt: null,
89
+ };
90
+ // Prepared statements (lazy-initialized)
91
+ stmtInsertUsage = null;
92
+ constructor(db, config = {}) {
93
+ this.db = db;
94
+ this.apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY ?? null;
95
+ this.model = config.model ?? 'claude-sonnet-4-20250514';
96
+ this.maxTokens = config.maxTokens ?? 2048;
97
+ this.maxCallsPerHour = config.maxCallsPerHour ?? 30;
98
+ this.tokenBudgetPerHour = config.tokenBudgetPerHour ?? 100_000;
99
+ this.tokenBudgetPerDay = config.tokenBudgetPerDay ?? 500_000;
100
+ this.cacheTtlMs = config.cacheTtlMs ?? 3_600_000;
101
+ this.maxCacheEntries = config.maxCacheEntries ?? 500;
102
+ runLLMServiceMigration(db);
103
+ this.stmtInsertUsage = db.prepare('INSERT INTO llm_usage (prompt_hash, template, model, input_tokens, output_tokens, total_tokens, duration_ms, cached) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
104
+ this.log.debug(`[LLMService] Initialized (model=${this.model}, apiKey=${this.apiKey ? 'set' : 'NOT SET'}, budget=${this.tokenBudgetPerHour}/h)`);
105
+ }
106
+ /** Check if LLM is available (API key set). */
107
+ isAvailable() {
108
+ return this.apiKey !== null && this.apiKey.length > 0;
109
+ }
110
+ /**
111
+ * Main entry point: call Claude with a template + context.
112
+ * Returns null if budget exhausted or API key not set (caller should fallback to heuristic).
113
+ */
114
+ async call(template, userMessage, options) {
115
+ if (!this.isAvailable())
116
+ return null;
117
+ // Check rate limit
118
+ if (!this.checkRateLimit()) {
119
+ this.stats.rateLimitHits++;
120
+ this.log.debug('[LLMService] Rate limit reached, falling back to heuristic');
121
+ return null;
122
+ }
123
+ // Check token budget
124
+ if (!this.checkTokenBudget()) {
125
+ this.stats.rateLimitHits++;
126
+ this.log.debug('[LLMService] Token budget exhausted, falling back to heuristic');
127
+ return null;
128
+ }
129
+ // Check cache
130
+ const cacheKey = this.getCacheKey(template, userMessage);
131
+ const cached = this.getFromCache(cacheKey);
132
+ if (cached) {
133
+ this.stats.cacheHits++;
134
+ this.recordUsage(cacheKey, template, cached, true);
135
+ return { ...cached, cached: true };
136
+ }
137
+ this.stats.cacheMisses++;
138
+ // Make API call
139
+ const systemPrompt = SYSTEM_PROMPTS[template];
140
+ const start = Date.now();
141
+ try {
142
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
143
+ method: 'POST',
144
+ headers: {
145
+ 'Content-Type': 'application/json',
146
+ 'x-api-key': this.apiKey,
147
+ 'anthropic-version': '2023-06-01',
148
+ },
149
+ body: JSON.stringify({
150
+ model: this.model,
151
+ max_tokens: options?.maxTokens ?? this.maxTokens,
152
+ ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),
153
+ system: systemPrompt,
154
+ messages: [{ role: 'user', content: userMessage }],
155
+ }),
156
+ });
157
+ const durationMs = Date.now() - start;
158
+ if (!response.ok) {
159
+ const errText = await response.text();
160
+ this.stats.errors++;
161
+ this.log.warn(`[LLMService] API error (${response.status}): ${errText.substring(0, 200)}`);
162
+ return null;
163
+ }
164
+ const data = await response.json();
165
+ const text = data.content
166
+ ?.filter(c => c.type === 'text')
167
+ .map(c => c.text ?? '')
168
+ .join('\n') ?? '';
169
+ const inputTokens = data.usage?.input_tokens ?? 0;
170
+ const outputTokens = data.usage?.output_tokens ?? 0;
171
+ const totalTokens = inputTokens + outputTokens;
172
+ const result = {
173
+ text,
174
+ tokensUsed: totalTokens,
175
+ inputTokens,
176
+ outputTokens,
177
+ cached: false,
178
+ model: this.model,
179
+ durationMs,
180
+ };
181
+ // Update stats
182
+ this.stats.totalCalls++;
183
+ this.stats.totalTokens += totalTokens;
184
+ this.stats.totalLatencyMs += durationMs;
185
+ this.stats.lastCallAt = Date.now();
186
+ this.callHistory.push({ timestamp: Date.now(), tokens: totalTokens });
187
+ // Cache the response
188
+ this.setCache(cacheKey, result);
189
+ // Record to DB
190
+ this.recordUsage(cacheKey, template, result, false);
191
+ this.log.debug(`[LLMService] ${template}: ${totalTokens} tokens, ${durationMs}ms`);
192
+ return result;
193
+ }
194
+ catch (err) {
195
+ this.stats.errors++;
196
+ this.log.warn(`[LLMService] Call failed: ${err.message}`);
197
+ return null;
198
+ }
199
+ }
200
+ /** Get usage statistics. */
201
+ getStats() {
202
+ const now = Date.now();
203
+ const oneHourAgo = now - 3_600_000;
204
+ const oneDayAgo = now - 86_400_000;
205
+ this.pruneCallHistory();
206
+ const callsThisHour = this.callHistory.filter(c => c.timestamp > oneHourAgo).length;
207
+ const tokensThisHour = this.callHistory.filter(c => c.timestamp > oneHourAgo).reduce((s, c) => s + c.tokens, 0);
208
+ const tokensToday = this.callHistory.filter(c => c.timestamp > oneDayAgo).reduce((s, c) => s + c.tokens, 0);
209
+ return {
210
+ totalCalls: this.stats.totalCalls,
211
+ totalTokens: this.stats.totalTokens,
212
+ cacheHits: this.stats.cacheHits,
213
+ cacheMisses: this.stats.cacheMisses,
214
+ cacheHitRate: (this.stats.cacheHits + this.stats.cacheMisses) > 0
215
+ ? this.stats.cacheHits / (this.stats.cacheHits + this.stats.cacheMisses)
216
+ : 0,
217
+ callsThisHour,
218
+ tokensThisHour,
219
+ tokensToday,
220
+ budgetRemainingHour: Math.max(0, this.tokenBudgetPerHour - tokensThisHour),
221
+ budgetRemainingDay: Math.max(0, this.tokenBudgetPerDay - tokensToday),
222
+ averageLatencyMs: this.stats.totalCalls > 0 ? this.stats.totalLatencyMs / this.stats.totalCalls : 0,
223
+ rateLimitHits: this.stats.rateLimitHits,
224
+ errors: this.stats.errors,
225
+ lastCallAt: this.stats.lastCallAt,
226
+ model: this.model,
227
+ };
228
+ }
229
+ /** Get usage history from DB (for dashboard). */
230
+ getUsageHistory(hours = 24) {
231
+ try {
232
+ return this.db.prepare(`
233
+ SELECT strftime('%Y-%m-%d %H:00', created_at) as hour,
234
+ COUNT(*) as calls,
235
+ SUM(total_tokens) as tokens,
236
+ SUM(cached) as cached
237
+ FROM llm_usage
238
+ WHERE created_at > datetime('now', '-' || ? || ' hours')
239
+ GROUP BY hour
240
+ ORDER BY hour DESC
241
+ `).all(hours);
242
+ }
243
+ catch {
244
+ return [];
245
+ }
246
+ }
247
+ /** Get usage breakdown by template. */
248
+ getUsageByTemplate() {
249
+ try {
250
+ return this.db.prepare(`
251
+ SELECT template,
252
+ COUNT(*) as calls,
253
+ SUM(total_tokens) as tokens,
254
+ AVG(total_tokens) as avg_tokens
255
+ FROM llm_usage
256
+ WHERE cached = 0
257
+ GROUP BY template
258
+ ORDER BY tokens DESC
259
+ `).all();
260
+ }
261
+ catch {
262
+ return [];
263
+ }
264
+ }
265
+ // ── Private Helpers ────────────────────────────────────
266
+ checkRateLimit() {
267
+ const oneHourAgo = Date.now() - 3_600_000;
268
+ this.pruneCallHistory();
269
+ const recentCalls = this.callHistory.filter(c => c.timestamp > oneHourAgo).length;
270
+ return recentCalls < this.maxCallsPerHour;
271
+ }
272
+ checkTokenBudget() {
273
+ const now = Date.now();
274
+ const oneHourAgo = now - 3_600_000;
275
+ const oneDayAgo = now - 86_400_000;
276
+ const tokensThisHour = this.callHistory.filter(c => c.timestamp > oneHourAgo).reduce((s, c) => s + c.tokens, 0);
277
+ if (tokensThisHour >= this.tokenBudgetPerHour)
278
+ return false;
279
+ const tokensToday = this.callHistory.filter(c => c.timestamp > oneDayAgo).reduce((s, c) => s + c.tokens, 0);
280
+ if (tokensToday >= this.tokenBudgetPerDay)
281
+ return false;
282
+ return true;
283
+ }
284
+ getCacheKey(template, userMessage) {
285
+ const input = `${template}:${this.model}:${userMessage}`;
286
+ return createHash('sha256').update(input).digest('hex');
287
+ }
288
+ getFromCache(key) {
289
+ const entry = this.cache.get(key);
290
+ if (!entry)
291
+ return null;
292
+ if (Date.now() > entry.expiresAt) {
293
+ this.cache.delete(key);
294
+ return null;
295
+ }
296
+ return entry.response;
297
+ }
298
+ setCache(key, response) {
299
+ // Evict oldest entries if cache is full
300
+ if (this.cache.size >= this.maxCacheEntries) {
301
+ const firstKey = this.cache.keys().next().value;
302
+ if (firstKey)
303
+ this.cache.delete(firstKey);
304
+ }
305
+ this.cache.set(key, {
306
+ response,
307
+ expiresAt: Date.now() + this.cacheTtlMs,
308
+ });
309
+ }
310
+ pruneCallHistory() {
311
+ const oneDayAgo = Date.now() - 86_400_000;
312
+ this.callHistory = this.callHistory.filter(c => c.timestamp > oneDayAgo);
313
+ }
314
+ recordUsage(hash, template, response, cached) {
315
+ try {
316
+ this.stmtInsertUsage?.run(hash, template, response.model, response.inputTokens, response.outputTokens, response.tokensUsed, response.durationMs, cached ? 1 : 0);
317
+ }
318
+ catch {
319
+ // Best effort — don't crash on DB error
320
+ }
321
+ }
322
+ }
323
+ //# sourceMappingURL=llm-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-service.js","sourceRoot":"","sources":["../../src/llm/llm-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAuE/C,2DAA2D;AAE3D,MAAM,UAAU,sBAAsB,CAAC,EAAqB;IAC1D,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;GAeP,CAAC,CAAC;AACL,CAAC;AAED,2DAA2D;AAE3D,MAAM,cAAc,GAAmC;IACrD,OAAO,EAAE;;;uFAG4E;IAErF,GAAG,EAAE;;;4GAGqG;IAE1G,iBAAiB,EAAE;;;;;;;2DAOsC;IAEzD,mBAAmB,EAAE;;;;;;;;kEAQ2C;IAEhE,iBAAiB,EAAE;;;8DAGyC;IAE5D,SAAS,EAAE;;oEAEuD;IAElE,qBAAqB,EAAE;;;;;4DAKmC;IAE1D,MAAM,EAAE;0CACgC;CACzC,CAAC;AAEF,2DAA2D;AAE3D,MAAM,OAAO,UAAU;IA4BD;IA3BH,MAAM,CAAgB;IACtB,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,eAAe,CAAS;IACxB,kBAAkB,CAAS;IAC3B,iBAAiB,CAAS;IAC1B,UAAU,CAAS;IACnB,eAAe,CAAS;IACxB,GAAG,GAAG,SAAS,EAAE,CAAC;IAEnC,kBAAkB;IACV,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,WAAW,GAAiB,EAAE,CAAC;IAC/B,KAAK,GAAG;QACd,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC;QACT,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,IAAqB;KAClC,CAAC;IAEF,yCAAyC;IACjC,eAAe,GAA8B,IAAI,CAAC;IAE1D,YAAoB,EAAqB,EAAE,SAA2B,EAAE;QAApD,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC;QACrE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,0BAA0B,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,IAAI,OAAO,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,OAAO,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC;QACjD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,GAAG,CAAC;QAErD,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAE3B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,OAAO,CAC/B,sJAAsJ,CACvJ,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,kBAAkB,KAAK,CAAC,CAAC;IACnJ,CAAC;IAED,+CAA+C;IAC/C,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CACR,QAAwB,EACxB,WAAmB,EACnB,OAAsD;QAEtD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC;QAErC,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,cAAc;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAEzB,gBAAgB;QAChB,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;gBACpE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,WAAW,EAAE,IAAI,CAAC,MAAO;oBACzB,mBAAmB,EAAE,YAAY;iBAClC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS;oBAChD,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnF,MAAM,EAAE,YAAY;oBACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;iBACnD,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAEtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,MAAM,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3F,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAG/B,CAAC;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO;gBACvB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;iBACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEpB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;YAE/C,MAAM,MAAM,GAAgB;gBAC1B,IAAI;gBACJ,UAAU,EAAE,WAAW;gBACvB,WAAW;gBACX,YAAY;gBACZ,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU;aACX,CAAC;YAEF,eAAe;YACf,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,WAAW,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,UAAU,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAEtE,qBAAqB;YACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAEhC,eAAe;YACf,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAEpD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,QAAQ,KAAK,WAAW,YAAY,UAAU,IAAI,CAAC,CAAC;YAEnF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA8B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,QAAQ;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC;QACnC,MAAM,SAAS,GAAG,GAAG,GAAG,UAAU,CAAC;QAEnC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC;QACpF,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE5G,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YACnC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YACnC,YAAY,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;gBAC/D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBACxE,CAAC,CAAC,CAAC;YACL,aAAa;YACb,cAAc;YACd,WAAW;YACX,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;YAC1E,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC;YACrE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnG,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACzB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,eAAe,CAAC,KAAK,GAAG,EAAE;QACxB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;OAStB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA2E,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,kBAAkB;QAChB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;OAStB,CAAC,CAAC,GAAG,EAAoF,CAAC;QAC7F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,0DAA0D;IAElD,cAAc;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC;QAClF,OAAO,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC;IAC5C,CAAC;IAEO,gBAAgB;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC;QACnC,MAAM,SAAS,GAAG,GAAG,GAAG,UAAU,CAAC;QAEnC,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChH,IAAI,cAAc,IAAI,IAAI,CAAC,kBAAkB;YAAE,OAAO,KAAK,CAAC;QAE5D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5G,IAAI,WAAW,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO,KAAK,CAAC;QAExD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,WAAW,CAAC,QAAwB,EAAE,WAAmB;QAC/D,MAAM,KAAK,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC;QACzD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IAEO,QAAQ,CAAC,GAAW,EAAE,QAAqB;QACjD,wCAAwC;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU;SACxC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAC3E,CAAC;IAEO,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,QAAqB,EAAE,MAAe;QACxF,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,EAAE,GAAG,CACvB,IAAI,EACJ,QAAQ,EACR,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,UAAU,EACnB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACf,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;CACF"}
@@ -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;