@kernel.chat/kbot 3.39.0 → 3.40.0

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,95 @@
1
+ export type KnowledgeSource = 'conversation' | 'forge' | 'pattern' | 'web_search' | 'user_question' | 'email' | 'manual';
2
+ export interface KnowledgeEntry {
3
+ /** Unique ID (SHA-256 hash of content + source) */
4
+ id: string;
5
+ /** Primary topic this entry belongs to */
6
+ topic: string;
7
+ /** The actual knowledge content */
8
+ content: string;
9
+ /** Where this knowledge came from */
10
+ source: KnowledgeSource;
11
+ /** Source detail (e.g., tool name, email subject, URL) */
12
+ sourceDetail: string;
13
+ /** Confidence in this knowledge (0-1) */
14
+ confidence: number;
15
+ /** Tags for cross-referencing */
16
+ tags: string[];
17
+ /** When this entry was created */
18
+ createdAt: string;
19
+ /** When this entry was last verified/updated */
20
+ updatedAt: string;
21
+ }
22
+ export interface KnowledgeIndex {
23
+ /** Total number of entries across all topics */
24
+ totalEntries: number;
25
+ /** Map of topic slug -> entry count */
26
+ topics: Record<string, number>;
27
+ /** Map of source type -> entry count */
28
+ sources: Record<string, number>;
29
+ /** Last time the index was updated */
30
+ lastUpdated: string;
31
+ }
32
+ export interface KnowledgeQueryResult {
33
+ /** The matching entry */
34
+ entry: KnowledgeEntry;
35
+ /** Relevance score (higher = more relevant) */
36
+ relevance: number;
37
+ }
38
+ export interface KnowledgeStats {
39
+ total_entries: number;
40
+ topics: string[];
41
+ sources: Record<string, number>;
42
+ last_updated: string;
43
+ }
44
+ export declare class KnowledgeBase {
45
+ private indexCache;
46
+ constructor();
47
+ /**
48
+ * Add knowledge from any source.
49
+ * Deduplicates by content hash.
50
+ * Tags with source, confidence, timestamp.
51
+ */
52
+ ingest(source: KnowledgeSource, content: string, metadata?: {
53
+ topic?: string;
54
+ sourceDetail?: string;
55
+ confidence?: number;
56
+ tags?: string[];
57
+ }): KnowledgeEntry;
58
+ /**
59
+ * Search the knowledge base for relevant entries.
60
+ * Uses keyword matching + cosine similarity on TF-IDF vectors.
61
+ * Returns ranked results with sources.
62
+ */
63
+ query(question: string): KnowledgeQueryResult[];
64
+ /**
65
+ * Get everything kbot knows about a topic, synthesized into a readable summary.
66
+ * Pulls from all sources and organizes by type.
67
+ */
68
+ getTopicSummary(topic: string): string;
69
+ /**
70
+ * Extract knowledge from an email/conversation thread.
71
+ * Pulls out facts, decisions, recommendations.
72
+ */
73
+ addFromConversation(userEmail: string, messages: Array<{
74
+ role: string;
75
+ content: string;
76
+ }>): KnowledgeEntry[];
77
+ /**
78
+ * When a tool is forged, extract what problem it solves and add to KB.
79
+ */
80
+ addFromForge(tool: {
81
+ name: string;
82
+ description: string;
83
+ tags?: string[];
84
+ code?: string;
85
+ }): KnowledgeEntry;
86
+ /**
87
+ * Get knowledge base statistics.
88
+ */
89
+ getStats(): KnowledgeStats;
90
+ /** Load or rebuild the index */
91
+ private loadIndex;
92
+ /** Rebuild the index from all topic files */
93
+ private rebuildIndex;
94
+ }
95
+ //# sourceMappingURL=knowledge-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-base.d.ts","sourceRoot":"","sources":["../src/knowledge-base.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,OAAO,GACP,SAAS,GACT,YAAY,GACZ,eAAe,GACf,OAAO,GACP,QAAQ,CAAA;AAEZ,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,MAAM,EAAE,eAAe,CAAA;IACvB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,KAAK,EAAE,cAAc,CAAA;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;CACrB;AA+MD,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAA8B;;IAMhD;;;;OAIG;IACH,MAAM,CACJ,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAChB,GACA,cAAc;IA8CjB;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,EAAE;IAkD/C;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAsFtC;;;OAGG;IACH,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACjD,cAAc,EAAE;IAuBnB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GAAG,cAAc;IAgBlB;;OAEG;IACH,QAAQ,IAAI,cAAc;IAa1B,gCAAgC;IAChC,OAAO,CAAC,SAAS;IAWjB,6CAA6C;IAC7C,OAAO,CAAC,YAAY;CAuCrB"}
@@ -0,0 +1,468 @@
1
+ // kbot Living Knowledge Base — Self-Writing from Real Interactions
2
+ //
3
+ // A knowledge graph that grows from every source: conversations, forged tools,
4
+ // patterns, web searches, user questions. Stores per-topic JSON files with
5
+ // an index for fast lookup.
6
+ //
7
+ // Storage: ~/.kbot/knowledge/ directory
8
+ // - index.json — master index of all entries
9
+ // - <topic-slug>.json — entries for each topic
10
+ //
11
+ // Node built-ins only. No external dependencies.
12
+ import { homedir } from 'node:os';
13
+ import { join, dirname } from 'node:path';
14
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs';
15
+ import { createHash } from 'node:crypto';
16
+ // ── Paths ──
17
+ const KBOT_DIR = join(homedir(), '.kbot');
18
+ const KNOWLEDGE_DIR = join(KBOT_DIR, 'knowledge');
19
+ const INDEX_FILE = join(KNOWLEDGE_DIR, 'index.json');
20
+ // ── Helpers ──
21
+ function ensureDir(dir) {
22
+ if (!existsSync(dir))
23
+ mkdirSync(dir, { recursive: true });
24
+ }
25
+ function loadJSON(path, fallback) {
26
+ try {
27
+ if (existsSync(path)) {
28
+ return JSON.parse(readFileSync(path, 'utf-8'));
29
+ }
30
+ }
31
+ catch {
32
+ // Corrupt file — return fallback
33
+ }
34
+ return fallback;
35
+ }
36
+ function saveJSON(path, data) {
37
+ ensureDir(dirname(path));
38
+ writeFileSync(path, JSON.stringify(data, null, 2));
39
+ }
40
+ /** Convert a topic string to a filesystem-safe slug */
41
+ function slugify(topic) {
42
+ return topic
43
+ .toLowerCase()
44
+ .replace(/[^a-z0-9\s-]/g, '')
45
+ .replace(/\s+/g, '-')
46
+ .replace(/-+/g, '-')
47
+ .replace(/^-|-$/g, '')
48
+ .slice(0, 80) || 'general';
49
+ }
50
+ /** Generate a deterministic ID for deduplication */
51
+ function entryId(content, source) {
52
+ return createHash('sha256')
53
+ .update(`${content}:${source}`)
54
+ .digest('hex')
55
+ .slice(0, 16);
56
+ }
57
+ /** Get the file path for a topic's entries */
58
+ function topicFilePath(topicSlug) {
59
+ return join(KNOWLEDGE_DIR, `${topicSlug}.json`);
60
+ }
61
+ /** Load entries for a specific topic */
62
+ function loadTopicEntries(topicSlug) {
63
+ return loadJSON(topicFilePath(topicSlug), []);
64
+ }
65
+ /** Save entries for a specific topic */
66
+ function saveTopicEntries(topicSlug, entries) {
67
+ saveJSON(topicFilePath(topicSlug), entries);
68
+ }
69
+ // ── TF-IDF Scoring ──
70
+ /** Tokenize text into lowercase words, removing stop words */
71
+ function tokenize(text) {
72
+ const stopWords = new Set([
73
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
74
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
75
+ 'should', 'may', 'might', 'shall', 'can', 'to', 'of', 'in', 'for',
76
+ 'on', 'with', 'at', 'by', 'from', 'it', 'this', 'that', 'these',
77
+ 'those', 'i', 'me', 'my', 'we', 'you', 'your', 'he', 'she', 'they',
78
+ 'them', 'and', 'or', 'but', 'not', 'so', 'if', 'then', 'as', 'its',
79
+ 'what', 'which', 'who', 'whom', 'how', 'when', 'where', 'why',
80
+ ]);
81
+ return text
82
+ .toLowerCase()
83
+ .replace(/[^a-z0-9\s]/g, ' ')
84
+ .split(/\s+/)
85
+ .filter(w => w.length > 1 && !stopWords.has(w));
86
+ }
87
+ /** Compute term frequency vector for a token list */
88
+ function termFrequency(tokens) {
89
+ const tf = new Map();
90
+ for (const token of tokens) {
91
+ tf.set(token, (tf.get(token) || 0) + 1);
92
+ }
93
+ // Normalize by document length
94
+ const len = tokens.length || 1;
95
+ for (const [term, count] of tf) {
96
+ tf.set(term, count / len);
97
+ }
98
+ return tf;
99
+ }
100
+ /** Compute cosine similarity between two TF vectors */
101
+ function cosineSimilarity(a, b) {
102
+ let dotProduct = 0;
103
+ let normA = 0;
104
+ let normB = 0;
105
+ for (const [term, weightA] of a) {
106
+ normA += weightA * weightA;
107
+ const weightB = b.get(term) || 0;
108
+ dotProduct += weightA * weightB;
109
+ }
110
+ for (const [, weightB] of b) {
111
+ normB += weightB * weightB;
112
+ }
113
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
114
+ return denom > 0 ? dotProduct / denom : 0;
115
+ }
116
+ // ── Knowledge Extraction ──
117
+ /** Extract facts, decisions, and recommendations from message text */
118
+ function extractKnowledge(text) {
119
+ const facts = [];
120
+ const sentences = text
121
+ .split(/[.!?\n]+/)
122
+ .map(s => s.trim())
123
+ .filter(s => s.length > 15 && s.length < 500);
124
+ // Fact indicators
125
+ const factIndicators = [
126
+ /\b(?:is|are|was|were|has|have)\b/i,
127
+ /\b(?:uses?|requires?|needs?|supports?|provides?)\b/i,
128
+ /\b(?:built with|powered by|based on|runs on)\b/i,
129
+ /\b(?:costs?|prices?|takes?\s+\d)/i,
130
+ /\b(?:found that|discovered|learned|noticed)\b/i,
131
+ ];
132
+ // Decision indicators
133
+ const decisionIndicators = [
134
+ /\b(?:decided|chose|selected|went with|opted for)\b/i,
135
+ /\b(?:switched to|migrated to|moved to)\b/i,
136
+ /\b(?:recommend|suggest|advise|prefer)\b/i,
137
+ /\b(?:best practice|should|must|always|never)\b/i,
138
+ ];
139
+ for (const sentence of sentences) {
140
+ const isFactLike = factIndicators.some(r => r.test(sentence));
141
+ const isDecisionLike = decisionIndicators.some(r => r.test(sentence));
142
+ if (isFactLike || isDecisionLike) {
143
+ facts.push(sentence);
144
+ }
145
+ }
146
+ return facts;
147
+ }
148
+ /** Infer a topic from text content */
149
+ function inferTopic(text) {
150
+ const tokens = tokenize(text);
151
+ // Count tech-relevant term frequencies
152
+ const techTerms = new Set([
153
+ 'react', 'typescript', 'javascript', 'python', 'rust', 'go', 'docker',
154
+ 'api', 'database', 'test', 'deploy', 'build', 'component', 'server',
155
+ 'client', 'auth', 'security', 'performance', 'design', 'architecture',
156
+ 'mobile', 'web', 'cloud', 'devops', 'machine', 'learning', 'data',
157
+ 'analytics', 'payment', 'email', 'notification', 'search', 'cache',
158
+ 'queue', 'worker', 'microservice', 'monolith', 'frontend', 'backend',
159
+ 'fullstack', 'infrastructure', 'monitoring', 'logging', 'debugging',
160
+ 'refactoring', 'migration', 'integration', 'automation', 'workflow',
161
+ ]);
162
+ const termCounts = new Map();
163
+ for (const token of tokens) {
164
+ if (techTerms.has(token)) {
165
+ termCounts.set(token, (termCounts.get(token) || 0) + 1);
166
+ }
167
+ }
168
+ if (termCounts.size === 0)
169
+ return 'general';
170
+ // Return the most frequent tech term as topic
171
+ const sorted = Array.from(termCounts.entries())
172
+ .sort((a, b) => b[1] - a[1]);
173
+ return sorted[0][0];
174
+ }
175
+ /** Extract tags from text content */
176
+ function extractTags(text) {
177
+ const techTerms = new Set([
178
+ 'react', 'typescript', 'javascript', 'python', 'rust', 'go', 'docker',
179
+ 'api', 'database', 'test', 'deploy', 'build', 'component', 'server',
180
+ 'node', 'express', 'nextjs', 'vue', 'angular', 'svelte', 'django',
181
+ 'flask', 'rails', 'spring', 'prisma', 'supabase', 'stripe', 'vite',
182
+ 'webpack', 'postgres', 'mysql', 'redis', 'mongodb', 'graphql', 'rest',
183
+ 'websocket', 'terraform', 'kubernetes', 'aws', 'gcp', 'azure',
184
+ 'security', 'performance', 'auth', 'css', 'html', 'json', 'sql', 'git',
185
+ ]);
186
+ const tokens = tokenize(text);
187
+ const found = new Set();
188
+ for (const token of tokens) {
189
+ if (techTerms.has(token)) {
190
+ found.add(token);
191
+ }
192
+ }
193
+ return Array.from(found).slice(0, 10);
194
+ }
195
+ // ── KnowledgeBase Class ──
196
+ export class KnowledgeBase {
197
+ indexCache = null;
198
+ constructor() {
199
+ ensureDir(KNOWLEDGE_DIR);
200
+ }
201
+ /**
202
+ * Add knowledge from any source.
203
+ * Deduplicates by content hash.
204
+ * Tags with source, confidence, timestamp.
205
+ */
206
+ ingest(source, content, metadata) {
207
+ const topic = metadata?.topic || inferTopic(content);
208
+ const topicSlug = slugify(topic);
209
+ const id = entryId(content, source);
210
+ const now = new Date().toISOString();
211
+ // Check for duplicate
212
+ const existing = loadTopicEntries(topicSlug);
213
+ const duplicate = existing.find(e => e.id === id);
214
+ if (duplicate) {
215
+ // Update timestamp and confidence if new info
216
+ duplicate.updatedAt = now;
217
+ if (metadata?.confidence !== undefined && metadata.confidence > duplicate.confidence) {
218
+ duplicate.confidence = metadata.confidence;
219
+ }
220
+ saveTopicEntries(topicSlug, existing);
221
+ this.rebuildIndex();
222
+ return duplicate;
223
+ }
224
+ const entry = {
225
+ id,
226
+ topic,
227
+ content,
228
+ source,
229
+ sourceDetail: metadata?.sourceDetail || '',
230
+ confidence: metadata?.confidence ?? 0.7,
231
+ tags: metadata?.tags || extractTags(content),
232
+ createdAt: now,
233
+ updatedAt: now,
234
+ };
235
+ existing.push(entry);
236
+ // Cap entries per topic at 200 — keep highest confidence
237
+ if (existing.length > 200) {
238
+ existing.sort((a, b) => b.confidence - a.confidence);
239
+ existing.length = 200;
240
+ }
241
+ saveTopicEntries(topicSlug, existing);
242
+ this.rebuildIndex();
243
+ return entry;
244
+ }
245
+ /**
246
+ * Search the knowledge base for relevant entries.
247
+ * Uses keyword matching + cosine similarity on TF-IDF vectors.
248
+ * Returns ranked results with sources.
249
+ */
250
+ query(question) {
251
+ if (!question || typeof question !== 'string')
252
+ return [];
253
+ const queryTokens = tokenize(question);
254
+ if (queryTokens.length === 0)
255
+ return [];
256
+ const queryTf = termFrequency(queryTokens);
257
+ const results = [];
258
+ // Load all topic files
259
+ const index = this.loadIndex();
260
+ const topicSlugs = Object.keys(index.topics);
261
+ for (const slug of topicSlugs) {
262
+ const entries = loadTopicEntries(slug);
263
+ for (const entry of entries) {
264
+ // Compute relevance: TF-IDF cosine similarity + keyword overlap
265
+ const entryTokens = tokenize(`${entry.topic} ${entry.content} ${entry.tags.join(' ')}`);
266
+ const entryTf = termFrequency(entryTokens);
267
+ const similarity = cosineSimilarity(queryTf, entryTf);
268
+ // Keyword overlap bonus
269
+ let keywordBonus = 0;
270
+ for (const qt of queryTokens) {
271
+ if (entry.tags.some(t => t.includes(qt) || qt.includes(t))) {
272
+ keywordBonus += 0.1;
273
+ }
274
+ if (entry.topic.toLowerCase().includes(qt)) {
275
+ keywordBonus += 0.15;
276
+ }
277
+ }
278
+ const relevance = similarity + keywordBonus;
279
+ if (relevance > 0.05) {
280
+ results.push({
281
+ entry,
282
+ relevance: Math.min(relevance * entry.confidence, 1),
283
+ });
284
+ }
285
+ }
286
+ }
287
+ // Sort by relevance descending
288
+ results.sort((a, b) => b.relevance - a.relevance);
289
+ return results.slice(0, 20);
290
+ }
291
+ /**
292
+ * Get everything kbot knows about a topic, synthesized into a readable summary.
293
+ * Pulls from all sources and organizes by type.
294
+ */
295
+ getTopicSummary(topic) {
296
+ const topicSlug = slugify(topic);
297
+ // Try exact topic match first
298
+ let entries = loadTopicEntries(topicSlug);
299
+ // Also search across all topics for related entries
300
+ const index = this.loadIndex();
301
+ const topicSlugs = Object.keys(index.topics);
302
+ const normalizedTopic = topic.toLowerCase();
303
+ for (const slug of topicSlugs) {
304
+ if (slug === topicSlug)
305
+ continue;
306
+ // Check if the slug contains or is contained by the topic
307
+ if (slug.includes(normalizedTopic) || normalizedTopic.includes(slug)) {
308
+ entries = entries.concat(loadTopicEntries(slug));
309
+ }
310
+ }
311
+ // Also check entries from other topics that have matching tags
312
+ for (const slug of topicSlugs) {
313
+ if (slug === topicSlug || slug.includes(normalizedTopic) || normalizedTopic.includes(slug))
314
+ continue;
315
+ const otherEntries = loadTopicEntries(slug);
316
+ const matching = otherEntries.filter(e => e.tags.some(t => t.includes(normalizedTopic) || normalizedTopic.includes(t)));
317
+ entries = entries.concat(matching);
318
+ }
319
+ if (entries.length === 0) {
320
+ return `No knowledge found for topic: "${topic}".`;
321
+ }
322
+ // Deduplicate by ID
323
+ const seen = new Set();
324
+ entries = entries.filter(e => {
325
+ if (seen.has(e.id))
326
+ return false;
327
+ seen.add(e.id);
328
+ return true;
329
+ });
330
+ // Sort by confidence descending
331
+ entries.sort((a, b) => b.confidence - a.confidence);
332
+ // Group by source type
333
+ const bySource = new Map();
334
+ for (const entry of entries) {
335
+ const group = bySource.get(entry.source) || [];
336
+ group.push(entry);
337
+ bySource.set(entry.source, group);
338
+ }
339
+ // Build summary
340
+ const sections = [];
341
+ sections.push(`Knowledge Summary: ${topic}`);
342
+ sections.push(`${'='.repeat(40)}`);
343
+ sections.push(`${entries.length} entries from ${bySource.size} source type(s)\n`);
344
+ const sourceLabels = {
345
+ conversation: 'From Conversations',
346
+ forge: 'From Forged Tools',
347
+ pattern: 'From Learned Patterns',
348
+ web_search: 'From Web Searches',
349
+ user_question: 'From User Questions',
350
+ email: 'From Email Threads',
351
+ manual: 'Manually Added',
352
+ };
353
+ for (const [source, group] of bySource) {
354
+ sections.push(`--- ${sourceLabels[source] || source} (${group.length}) ---`);
355
+ for (const entry of group.slice(0, 10)) {
356
+ const confPct = Math.round(entry.confidence * 100);
357
+ sections.push(` [${confPct}%] ${entry.content}`);
358
+ if (entry.sourceDetail) {
359
+ sections.push(` source: ${entry.sourceDetail}`);
360
+ }
361
+ }
362
+ if (group.length > 10) {
363
+ sections.push(` ... and ${group.length - 10} more`);
364
+ }
365
+ sections.push('');
366
+ }
367
+ return sections.join('\n');
368
+ }
369
+ /**
370
+ * Extract knowledge from an email/conversation thread.
371
+ * Pulls out facts, decisions, recommendations.
372
+ */
373
+ addFromConversation(userEmail, messages) {
374
+ const added = [];
375
+ // Combine all message content for topic inference
376
+ const fullText = messages.map(m => m.content).join('\n');
377
+ const overallTopic = inferTopic(fullText);
378
+ for (const message of messages) {
379
+ const facts = extractKnowledge(message.content);
380
+ for (const fact of facts) {
381
+ const entry = this.ingest('email', fact, {
382
+ topic: overallTopic,
383
+ sourceDetail: `conversation with ${userEmail}`,
384
+ confidence: message.role === 'assistant' ? 0.8 : 0.6,
385
+ tags: extractTags(fact),
386
+ });
387
+ added.push(entry);
388
+ }
389
+ }
390
+ return added;
391
+ }
392
+ /**
393
+ * When a tool is forged, extract what problem it solves and add to KB.
394
+ */
395
+ addFromForge(tool) {
396
+ const content = `Forged tool "${tool.name}": ${tool.description}`;
397
+ const tags = [
398
+ ...(tool.tags || []),
399
+ 'forge',
400
+ 'tool',
401
+ ];
402
+ return this.ingest('forge', content, {
403
+ topic: inferTopic(tool.description),
404
+ sourceDetail: `forged tool: ${tool.name}`,
405
+ confidence: 0.9,
406
+ tags,
407
+ });
408
+ }
409
+ /**
410
+ * Get knowledge base statistics.
411
+ */
412
+ getStats() {
413
+ const index = this.loadIndex();
414
+ return {
415
+ total_entries: index.totalEntries,
416
+ topics: Object.keys(index.topics),
417
+ sources: index.sources,
418
+ last_updated: index.lastUpdated,
419
+ };
420
+ }
421
+ // ── Private Helpers ──
422
+ /** Load or rebuild the index */
423
+ loadIndex() {
424
+ if (this.indexCache)
425
+ return this.indexCache;
426
+ this.indexCache = loadJSON(INDEX_FILE, {
427
+ totalEntries: 0,
428
+ topics: {},
429
+ sources: {},
430
+ lastUpdated: new Date().toISOString(),
431
+ });
432
+ return this.indexCache;
433
+ }
434
+ /** Rebuild the index from all topic files */
435
+ rebuildIndex() {
436
+ ensureDir(KNOWLEDGE_DIR);
437
+ let totalEntries = 0;
438
+ const topics = {};
439
+ const sources = {};
440
+ let files;
441
+ try {
442
+ files = readdirSync(KNOWLEDGE_DIR).filter(f => f.endsWith('.json') && f !== 'index.json');
443
+ }
444
+ catch {
445
+ files = [];
446
+ }
447
+ for (const file of files) {
448
+ const slug = file.replace(/\.json$/, '');
449
+ const entries = loadTopicEntries(slug);
450
+ if (entries.length === 0)
451
+ continue;
452
+ topics[slug] = entries.length;
453
+ totalEntries += entries.length;
454
+ for (const entry of entries) {
455
+ sources[entry.source] = (sources[entry.source] || 0) + 1;
456
+ }
457
+ }
458
+ const index = {
459
+ totalEntries,
460
+ topics,
461
+ sources,
462
+ lastUpdated: new Date().toISOString(),
463
+ };
464
+ this.indexCache = index;
465
+ saveJSON(INDEX_FILE, index);
466
+ }
467
+ }
468
+ //# sourceMappingURL=knowledge-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-base.js","sourceRoot":"","sources":["../src/knowledge-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export interface FeedPattern {
2
+ /** Pattern type: intent_match, tool_sequence, etc. */
3
+ type: string;
4
+ /** Programming language (if detected) */
5
+ language: string | null;
6
+ /** Framework (if detected) */
7
+ framework: string | null;
8
+ /** Success rate 0-1 */
9
+ successRate: number;
10
+ /** Tool names used */
11
+ toolsUsed: string[];
12
+ /** Agent that handled it */
13
+ agentUsed: string | null;
14
+ /** Number of times this pattern was observed */
15
+ hits: number;
16
+ /** Keywords (generic tech terms) */
17
+ keywords: string[];
18
+ /** Confidence score (0-1) */
19
+ confidence: number;
20
+ /** Number of contributing sources */
21
+ sampleCount: number;
22
+ /** Last updated timestamp */
23
+ lastUpdated: string;
24
+ /** Source: 'local' or 'collective' */
25
+ source: 'local' | 'collective';
26
+ }
27
+ export interface FeedEntry {
28
+ /** Human-readable insight */
29
+ insight: string;
30
+ /** Feed category */
31
+ category: FeedCategory;
32
+ /** Relevance score (higher = more relevant) */
33
+ score: number;
34
+ /** Underlying pattern */
35
+ pattern: FeedPattern;
36
+ }
37
+ export type FeedCategory = 'tools_that_worked' | 'best_agents' | 'common_solutions' | 'forged_tools';
38
+ export interface FeedResult {
39
+ entries: FeedEntry[];
40
+ total_patterns_scanned: number;
41
+ project_type: string | null;
42
+ }
43
+ /** Format a single pattern as a readable insight */
44
+ export declare function formatFeedEntry(pattern: FeedPattern): string;
45
+ /**
46
+ * Run the pattern feed. Reads local + collective patterns, scores them,
47
+ * groups by category, and returns the top 20 insights.
48
+ *
49
+ * @param options.projectType - Optional project type filter (react, python, etc.)
50
+ * @returns Feed result with entries, total patterns scanned, and project type
51
+ */
52
+ export declare function runPatternFeed(options?: {
53
+ projectType?: string;
54
+ }): FeedResult;
55
+ /**
56
+ * Get a feed filtered for a specific project type.
57
+ * Returns patterns that other users of the same stack found useful.
58
+ */
59
+ export declare function getFeedForProject(projectType: string): FeedResult;
60
+ /**
61
+ * Full-text search across all patterns.
62
+ * Returns matching insights with confidence scores.
63
+ */
64
+ export declare function searchFeed(query: string): FeedEntry[];
65
+ //# sourceMappingURL=pattern-feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-feed.d.ts","sourceRoot":"","sources":["../src/pattern-feed.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,sBAAsB;IACtB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,MAAM,EAAE,OAAO,GAAG,YAAY,CAAA;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,oBAAoB;IACpB,QAAQ,EAAE,YAAY,CAAA;IACtB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,yBAAyB;IACzB,OAAO,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GACpB,mBAAmB,GACnB,aAAa,GACb,kBAAkB,GAClB,cAAc,CAAA;AAElB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AA2MD,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAiD5D;AAID;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CA+E7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAEjE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAsDrD"}