@timmeck/brain-core 2.36.29 → 2.36.31

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,601 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Regex patterns for feature detection ─────────────────
3
+ const FEATURE_PATTERNS = [
4
+ // Utility functions (exported, standalone)
5
+ {
6
+ category: 'utility_function',
7
+ pattern: /export\s+(?:async\s+)?function\s+(\w+)\s*\([^)]*\)[^{]*\{/g,
8
+ nameExtract: (m) => m[1],
9
+ minLines: 3,
10
+ maxLines: 50,
11
+ },
12
+ // Exported arrow functions
13
+ {
14
+ category: 'utility_function',
15
+ pattern: /export\s+const\s+(\w+)\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*\w[^=]*)?=>/g,
16
+ nameExtract: (m) => m[1],
17
+ minLines: 2,
18
+ maxLines: 40,
19
+ },
20
+ // Class patterns (exported classes with interesting methods)
21
+ {
22
+ category: 'design_pattern',
23
+ pattern: /export\s+(?:abstract\s+)?class\s+(\w+)(?:\s+extends\s+\w+)?(?:\s+implements\s+\w+)?\s*\{/g,
24
+ nameExtract: (m) => m[1],
25
+ minLines: 10,
26
+ maxLines: 80,
27
+ },
28
+ // Error handling patterns (custom error classes, error boundaries)
29
+ {
30
+ category: 'error_handling',
31
+ pattern: /export\s+class\s+(\w*Error\w*)\s+extends\s+(?:Error|BaseError|CustomError)\s*\{/g,
32
+ nameExtract: (m) => m[1],
33
+ minLines: 3,
34
+ maxLines: 30,
35
+ },
36
+ // Testing utilities (describe wrappers, custom matchers, test helpers)
37
+ {
38
+ category: 'testing_pattern',
39
+ pattern: /export\s+(?:async\s+)?function\s+((?:create|mock|setup|build|make)\w+)\s*\(/g,
40
+ nameExtract: (m) => m[1],
41
+ minLines: 3,
42
+ maxLines: 40,
43
+ },
44
+ // CLI patterns (command builders, argument parsers)
45
+ {
46
+ category: 'cli_pattern',
47
+ pattern: /export\s+(?:async\s+)?function\s+(\w*[Cc]ommand\w*)\s*\(/g,
48
+ nameExtract: (m) => m[1],
49
+ minLines: 5,
50
+ maxLines: 60,
51
+ },
52
+ // Config patterns (config builders, validators)
53
+ {
54
+ category: 'config_pattern',
55
+ pattern: /export\s+(?:async\s+)?function\s+((?:load|parse|validate|create)\w*[Cc]onfig\w*)\s*\(/g,
56
+ nameExtract: (m) => m[1],
57
+ minLines: 3,
58
+ maxLines: 40,
59
+ },
60
+ // Data structures (exported interfaces/types with methods)
61
+ {
62
+ category: 'data_structure',
63
+ pattern: /export\s+interface\s+(\w+)\s*\{/g,
64
+ nameExtract: (m) => m[1],
65
+ minLines: 3,
66
+ maxLines: 30,
67
+ },
68
+ // Go: public functions (capitalized)
69
+ {
70
+ category: 'utility_function',
71
+ pattern: /^func\s+([A-Z]\w+)\s*\(/gm,
72
+ nameExtract: (m) => m[1],
73
+ minLines: 3,
74
+ maxLines: 50,
75
+ },
76
+ // Go: method receivers
77
+ {
78
+ category: 'design_pattern',
79
+ pattern: /^func\s+\(\w+\s+\*?(\w+)\)\s+([A-Z]\w+)\s*\(/gm,
80
+ nameExtract: (m) => `${m[1]}.${m[2]}`,
81
+ minLines: 3,
82
+ maxLines: 50,
83
+ },
84
+ // Python: class definitions
85
+ {
86
+ category: 'design_pattern',
87
+ pattern: /^class\s+([A-Z]\w+)(?:\([^)]*\))?\s*:/gm,
88
+ nameExtract: (m) => m[1],
89
+ minLines: 5,
90
+ maxLines: 60,
91
+ },
92
+ // Python: top-level function definitions
93
+ {
94
+ category: 'utility_function',
95
+ pattern: /^def\s+([a-z_]\w+)\s*\([^)]*\)/gm,
96
+ nameExtract: (m) => m[1],
97
+ minLines: 3,
98
+ maxLines: 50,
99
+ },
100
+ // Python: async functions
101
+ {
102
+ category: 'utility_function',
103
+ pattern: /^async\s+def\s+([a-z_]\w+)\s*\([^)]*\)/gm,
104
+ nameExtract: (m) => m[1],
105
+ minLines: 3,
106
+ maxLines: 50,
107
+ },
108
+ // Rust: public functions
109
+ {
110
+ category: 'utility_function',
111
+ pattern: /pub\s+(?:async\s+)?fn\s+(\w+)\s*[(<]/gm,
112
+ nameExtract: (m) => m[1],
113
+ minLines: 3,
114
+ maxLines: 50,
115
+ },
116
+ // Rust: impl blocks
117
+ {
118
+ category: 'design_pattern',
119
+ pattern: /impl(?:<[^>]*>)?\s+(\w+)(?:\s+for\s+(\w+))?\s*\{/gm,
120
+ nameExtract: (m) => m[2] ? `${m[1]}_for_${m[2]}` : m[1],
121
+ minLines: 5,
122
+ maxLines: 80,
123
+ },
124
+ ];
125
+ // Keywords that boost usefulness score
126
+ const USEFULNESS_KEYWORDS = {
127
+ 'retry': 0.15, 'cache': 0.15, 'throttle': 0.15, 'debounce': 0.15,
128
+ 'queue': 0.12, 'pool': 0.12, 'batch': 0.12,
129
+ 'parse': 0.10, 'serialize': 0.10, 'transform': 0.10,
130
+ 'validate': 0.10, 'sanitize': 0.10,
131
+ 'hash': 0.08, 'encrypt': 0.08, 'compress': 0.08,
132
+ 'stream': 0.10, 'pipe': 0.08, 'buffer': 0.08,
133
+ 'middleware': 0.12, 'plugin': 0.12, 'hook': 0.10,
134
+ 'logger': 0.08, 'monitor': 0.10, 'metric': 0.10,
135
+ 'scheduler': 0.12, 'worker': 0.10, 'parallel': 0.10,
136
+ 'EventEmitter': 0.08, 'Observable': 0.08,
137
+ 'singleton': 0.08, 'factory': 0.10, 'builder': 0.10,
138
+ 'adapter': 0.10, 'proxy': 0.08, 'decorator': 0.08,
139
+ };
140
+ const EXT_TO_LANG = {
141
+ '.ts': 'typescript', '.tsx': 'typescript', '.js': 'javascript', '.jsx': 'javascript',
142
+ '.py': 'python', '.go': 'go', '.rs': 'rust', '.java': 'java',
143
+ '.rb': 'ruby', '.php': 'php', '.cs': 'csharp', '.swift': 'swift', '.kt': 'kotlin',
144
+ };
145
+ // ── FeatureExtractor ─────────────────────────────────────
146
+ export class FeatureExtractor {
147
+ db;
148
+ log = getLogger();
149
+ ragEngine = null;
150
+ knowledgeGraph = null;
151
+ llmService = null;
152
+ constructor(db) {
153
+ this.db = db;
154
+ this.ensureTable();
155
+ }
156
+ setRAGEngine(rag) { this.ragEngine = rag; }
157
+ setKnowledgeGraph(kg) { this.knowledgeGraph = kg; }
158
+ setLLMService(llm) { this.llmService = llm; }
159
+ ensureTable() {
160
+ this.db.exec(`
161
+ CREATE TABLE IF NOT EXISTS extracted_features (
162
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
163
+ repo TEXT NOT NULL,
164
+ name TEXT NOT NULL,
165
+ category TEXT NOT NULL,
166
+ description TEXT NOT NULL DEFAULT '',
167
+ code_snippet TEXT NOT NULL,
168
+ file_path TEXT NOT NULL,
169
+ language TEXT NOT NULL DEFAULT 'unknown',
170
+ usefulness REAL DEFAULT 0.5,
171
+ applicability TEXT DEFAULT '',
172
+ tags TEXT DEFAULT '[]',
173
+ extracted_at TEXT DEFAULT (datetime('now')),
174
+ UNIQUE(repo, name, file_path)
175
+ );
176
+ CREATE INDEX IF NOT EXISTS idx_features_repo ON extracted_features(repo);
177
+ CREATE INDEX IF NOT EXISTS idx_features_category ON extracted_features(category);
178
+ CREATE INDEX IF NOT EXISTS idx_features_usefulness ON extracted_features(usefulness DESC);
179
+ `);
180
+ }
181
+ /**
182
+ * Extract features from absorbed code via RAG search.
183
+ * Searches for interesting patterns in the absorbed_code collection.
184
+ */
185
+ async extractFromAbsorbedCode(repo) {
186
+ const start = Date.now();
187
+ const categories = {};
188
+ let featuresExtracted = 0;
189
+ const targetRepo = repo ?? 'all';
190
+ // Get absorbed code from RAG
191
+ const codeEntries = this.getAbsorbedCode(repo);
192
+ this.log.info(`[FeatureExtractor] Analyzing ${codeEntries.length} files from ${targetRepo}`);
193
+ for (const entry of codeEntries) {
194
+ try {
195
+ const features = this.extractFeaturesFromCode(entry.content, entry.filePath, entry.repo, entry.ext);
196
+ for (const feature of features) {
197
+ const saved = this.saveFeature(feature);
198
+ if (saved) {
199
+ featuresExtracted++;
200
+ categories[feature.category] = (categories[feature.category] ?? 0) + 1;
201
+ }
202
+ }
203
+ }
204
+ catch {
205
+ // skip file
206
+ }
207
+ }
208
+ // Optional: use LLM to enrich top features with descriptions
209
+ if (this.llmService && featuresExtracted > 0) {
210
+ await this.enrichTopFeatures(5);
211
+ }
212
+ this.log.info(`[FeatureExtractor] Extracted ${featuresExtracted} features from ${targetRepo}`);
213
+ return {
214
+ repo: targetRepo,
215
+ featuresExtracted,
216
+ categories,
217
+ durationMs: Date.now() - start,
218
+ };
219
+ }
220
+ /**
221
+ * Extract features from a raw code string.
222
+ */
223
+ extractFeaturesFromCode(content, filePath, repo, ext) {
224
+ const features = [];
225
+ const lines = content.split('\n');
226
+ const language = EXT_TO_LANG[ext] ?? 'unknown';
227
+ for (const fp of FEATURE_PATTERNS) {
228
+ // Only apply relevant patterns to right languages
229
+ if (fp.category === 'data_structure' && language !== 'typescript')
230
+ continue;
231
+ const regex = new RegExp(fp.pattern.source, fp.pattern.flags);
232
+ let match;
233
+ while ((match = regex.exec(content)) !== null) {
234
+ const name = fp.nameExtract(match);
235
+ if (!name || name.length < 3)
236
+ continue;
237
+ // Skip common/boring names
238
+ if (['constructor', 'toString', 'valueOf', 'default'].includes(name))
239
+ continue;
240
+ // Find the code block (from match position to closing brace)
241
+ const startLine = content.substring(0, match.index).split('\n').length - 1;
242
+ const snippet = this.extractCodeBlock(lines, startLine, fp.minLines, fp.maxLines, language);
243
+ if (!snippet || snippet.split('\n').length < fp.minLines)
244
+ continue;
245
+ // Calculate usefulness score
246
+ const usefulness = this.calculateUsefulness(name, snippet, fp.category);
247
+ // Only keep features above threshold
248
+ if (usefulness < 0.3)
249
+ continue;
250
+ // Generate tags from content
251
+ const tags = this.extractTags(name, snippet);
252
+ features.push({
253
+ repo,
254
+ name,
255
+ category: fp.category,
256
+ description: this.generateBasicDescription(name, fp.category, language),
257
+ codeSnippet: snippet,
258
+ filePath,
259
+ language,
260
+ usefulness,
261
+ applicability: '',
262
+ tags,
263
+ });
264
+ }
265
+ }
266
+ return features;
267
+ }
268
+ /**
269
+ * Extract features from code and save them to the database.
270
+ * Returns the number of features saved.
271
+ */
272
+ extractAndSave(content, filePath, repo, ext) {
273
+ const features = this.extractFeaturesFromCode(content, filePath, repo, ext);
274
+ let saved = 0;
275
+ for (const f of features) {
276
+ if (this.saveFeature(f))
277
+ saved++;
278
+ }
279
+ return saved;
280
+ }
281
+ /**
282
+ * Search for features matching criteria.
283
+ */
284
+ search(options = {}) {
285
+ const conditions = ['1=1'];
286
+ const params = [];
287
+ if (options.category) {
288
+ conditions.push('category = ?');
289
+ params.push(options.category);
290
+ }
291
+ if (options.repo) {
292
+ conditions.push('repo = ?');
293
+ params.push(options.repo);
294
+ }
295
+ if (options.minUsefulness) {
296
+ conditions.push('usefulness >= ?');
297
+ params.push(options.minUsefulness);
298
+ }
299
+ if (options.query) {
300
+ conditions.push('(name LIKE ? OR description LIKE ? OR code_snippet LIKE ?)');
301
+ const q = `%${options.query}%`;
302
+ params.push(q, q, q);
303
+ }
304
+ const limit = options.limit ?? 20;
305
+ params.push(limit);
306
+ return this.db.prepare(`
307
+ SELECT id, repo, name, category, description, code_snippet as codeSnippet,
308
+ file_path as filePath, language, usefulness, applicability,
309
+ tags, extracted_at as extractedAt
310
+ FROM extracted_features
311
+ WHERE ${conditions.join(' AND ')}
312
+ ORDER BY usefulness DESC
313
+ LIMIT ?
314
+ `).all(...params);
315
+ }
316
+ /**
317
+ * Semantic search for features using RAG.
318
+ */
319
+ async semanticSearch(query, limit = 10) {
320
+ if (!this.ragEngine)
321
+ return this.search({ query, limit });
322
+ // Search absorbed code
323
+ const results = await this.ragEngine.search(query, {
324
+ collections: ['absorbed_code'],
325
+ limit: limit * 3,
326
+ });
327
+ if (!results.length)
328
+ return [];
329
+ // Map RAG results to features by matching repo+path
330
+ const features = [];
331
+ for (const r of results) {
332
+ const meta = r.metadata;
333
+ if (!meta?.repo || !meta?.path)
334
+ continue;
335
+ const matching = this.db.prepare(`
336
+ SELECT id, repo, name, category, description, code_snippet as codeSnippet,
337
+ file_path as filePath, language, usefulness, applicability,
338
+ tags, extracted_at as extractedAt
339
+ FROM extracted_features
340
+ WHERE repo = ? AND file_path = ?
341
+ ORDER BY usefulness DESC
342
+ `).all(meta.repo, meta.path);
343
+ for (const f of matching) {
344
+ if (!features.some(e => e.id === f.id)) {
345
+ features.push(f);
346
+ }
347
+ }
348
+ if (features.length >= limit)
349
+ break;
350
+ }
351
+ return features.slice(0, limit);
352
+ }
353
+ /**
354
+ * Suggest features that could help improve Brain based on current weaknesses.
355
+ */
356
+ async suggest(context) {
357
+ // Get top features by usefulness
358
+ const topFeatures = this.search({ minUsefulness: 0.6, limit: 20 });
359
+ if (!context || !this.ragEngine)
360
+ return topFeatures;
361
+ // Use RAG to find features relevant to context
362
+ const relevant = await this.semanticSearch(context, 10);
363
+ // Merge: relevant first, then top features (deduplicated)
364
+ const seen = new Set();
365
+ const merged = [];
366
+ for (const f of [...relevant, ...topFeatures]) {
367
+ if (!seen.has(f.id)) {
368
+ seen.add(f.id);
369
+ merged.push(f);
370
+ }
371
+ }
372
+ return merged.slice(0, 15);
373
+ }
374
+ /**
375
+ * Get statistics about extracted features.
376
+ */
377
+ getStats() {
378
+ const total = this.db.prepare('SELECT COUNT(*) as c FROM extracted_features').get();
379
+ const byCategory = this.db.prepare('SELECT category, COUNT(*) as c FROM extracted_features GROUP BY category ORDER BY c DESC').all();
380
+ const byRepo = this.db.prepare('SELECT repo, COUNT(*) as c FROM extracted_features GROUP BY repo ORDER BY c DESC LIMIT 10').all();
381
+ const avg = this.db.prepare('SELECT AVG(usefulness) as avg FROM extracted_features').get();
382
+ const topFeatures = this.search({ minUsefulness: 0.6, limit: 5 });
383
+ return {
384
+ totalFeatures: total.c,
385
+ byCategory: Object.fromEntries(byCategory.map(r => [r.category, r.c])),
386
+ byRepo: Object.fromEntries(byRepo.map(r => [r.repo, r.c])),
387
+ topFeatures,
388
+ avgUsefulness: avg.avg ?? 0,
389
+ };
390
+ }
391
+ // ── Private helpers ───────────────────────────────────────
392
+ getAbsorbedCode(repo) {
393
+ // Get metadata from RAG vectors (absorbed_code collection)
394
+ try {
395
+ const condition = repo
396
+ ? `WHERE collection = 'absorbed_code' AND metadata LIKE '%"repo":"${repo.replace(/'/g, "''")}"%'`
397
+ : `WHERE collection = 'absorbed_code'`;
398
+ const rows = this.db.prepare(`
399
+ SELECT text_preview, metadata FROM rag_vectors ${condition} LIMIT 500
400
+ `).all();
401
+ return rows
402
+ .filter(r => r.metadata)
403
+ .map(r => {
404
+ const meta = JSON.parse(r.metadata);
405
+ return {
406
+ content: r.text_preview ?? '',
407
+ filePath: meta.path ?? '',
408
+ repo: meta.repo ?? 'unknown',
409
+ ext: meta.ext ?? '',
410
+ };
411
+ });
412
+ }
413
+ catch {
414
+ return [];
415
+ }
416
+ }
417
+ extractCodeBlock(lines, startLine, minLines, maxLines, language) {
418
+ // Python: indent-based block extraction
419
+ if (language === 'python') {
420
+ const block = [lines[startLine]];
421
+ const baseIndent = lines[startLine].search(/\S/);
422
+ for (let i = startLine + 1; i < lines.length && block.length < maxLines; i++) {
423
+ const line = lines[i];
424
+ if (line.trim() === '') {
425
+ block.push(line);
426
+ continue;
427
+ }
428
+ const indent = line.search(/\S/);
429
+ if (indent <= baseIndent && line.trim() !== '')
430
+ break;
431
+ block.push(line);
432
+ }
433
+ if (block.length < minLines)
434
+ return null;
435
+ return block.join('\n');
436
+ }
437
+ // Brace-based languages (JS/TS, Go, Rust, Java, C)
438
+ let depth = 0;
439
+ let started = false;
440
+ const block = [];
441
+ for (let i = startLine; i < lines.length && block.length < maxLines; i++) {
442
+ const line = lines[i];
443
+ block.push(line);
444
+ for (const ch of line) {
445
+ if (ch === '{') {
446
+ depth++;
447
+ started = true;
448
+ }
449
+ if (ch === '}')
450
+ depth--;
451
+ }
452
+ if (started && depth <= 0)
453
+ break;
454
+ }
455
+ if (block.length < minLines)
456
+ return null;
457
+ return block.join('\n');
458
+ }
459
+ calculateUsefulness(name, snippet, category) {
460
+ let score = 0.4; // base score
461
+ // Boost for category
462
+ const categoryBoost = {
463
+ utility_function: 0.1,
464
+ error_handling: 0.1,
465
+ design_pattern: 0.05,
466
+ performance: 0.15,
467
+ testing_pattern: 0.05,
468
+ api_pattern: 0.1,
469
+ cli_pattern: 0.05,
470
+ config_pattern: 0.05,
471
+ data_structure: 0.0,
472
+ architecture: 0.05,
473
+ };
474
+ score += categoryBoost[category] ?? 0;
475
+ // Boost for useful keywords in name and snippet
476
+ const lowerName = name.toLowerCase();
477
+ const lowerSnippet = snippet.toLowerCase();
478
+ for (const [keyword, boost] of Object.entries(USEFULNESS_KEYWORDS)) {
479
+ if (lowerName.includes(keyword.toLowerCase()) || lowerSnippet.includes(keyword.toLowerCase())) {
480
+ score += boost;
481
+ }
482
+ }
483
+ // Boost for JSDoc/documentation
484
+ if (snippet.includes('/**') || snippet.includes('///'))
485
+ score += 0.05;
486
+ // Boost for TypeScript types (well-typed code)
487
+ if (snippet.includes(': ') && snippet.includes('=> '))
488
+ score += 0.03;
489
+ // Penalize very short or very long snippets
490
+ const lineCount = snippet.split('\n').length;
491
+ if (lineCount < 5)
492
+ score -= 0.1;
493
+ if (lineCount > 60)
494
+ score -= 0.05;
495
+ // Penalize generic names
496
+ if (['index', 'main', 'init', 'run', 'start', 'setup'].includes(lowerName)) {
497
+ score -= 0.15;
498
+ }
499
+ return Math.max(0, Math.min(1, score));
500
+ }
501
+ extractTags(name, snippet) {
502
+ const tags = [];
503
+ const lower = (name + ' ' + snippet).toLowerCase();
504
+ if (lower.includes('async') || lower.includes('await') || lower.includes('promise'))
505
+ tags.push('async');
506
+ if (lower.includes('stream') || lower.includes('pipe'))
507
+ tags.push('streaming');
508
+ if (lower.includes('cache') || lower.includes('memo'))
509
+ tags.push('caching');
510
+ if (lower.includes('retry') || lower.includes('backoff'))
511
+ tags.push('retry');
512
+ if (lower.includes('queue') || lower.includes('batch'))
513
+ tags.push('batching');
514
+ if (lower.includes('validate') || lower.includes('schema'))
515
+ tags.push('validation');
516
+ if (lower.includes('parse') || lower.includes('serialize'))
517
+ tags.push('parsing');
518
+ if (lower.includes('test') || lower.includes('mock') || lower.includes('stub'))
519
+ tags.push('testing');
520
+ if (lower.includes('log') || lower.includes('debug') || lower.includes('trace'))
521
+ tags.push('logging');
522
+ if (lower.includes('event') || lower.includes('emit') || lower.includes('listen'))
523
+ tags.push('events');
524
+ if (lower.includes('middleware') || lower.includes('plugin') || lower.includes('hook'))
525
+ tags.push('extensible');
526
+ if (lower.includes('concurr') || lower.includes('parallel') || lower.includes('worker'))
527
+ tags.push('concurrency');
528
+ return tags.slice(0, 5);
529
+ }
530
+ generateBasicDescription(name, category, language) {
531
+ const categoryLabels = {
532
+ utility_function: 'Utility function',
533
+ design_pattern: 'Design pattern / class',
534
+ architecture: 'Architecture component',
535
+ error_handling: 'Error handling',
536
+ testing_pattern: 'Test utility',
537
+ performance: 'Performance optimization',
538
+ api_pattern: 'API pattern',
539
+ data_structure: 'Data structure / interface',
540
+ config_pattern: 'Configuration utility',
541
+ cli_pattern: 'CLI command pattern',
542
+ };
543
+ return `${categoryLabels[category] ?? 'Code'}: ${name} (${language})`;
544
+ }
545
+ saveFeature(feature) {
546
+ try {
547
+ this.db.prepare(`
548
+ INSERT OR IGNORE INTO extracted_features
549
+ (repo, name, category, description, code_snippet, file_path, language, usefulness, applicability, tags)
550
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
551
+ `).run(feature.repo, feature.name, feature.category, feature.description, feature.codeSnippet, feature.filePath, feature.language, feature.usefulness, feature.applicability, JSON.stringify(feature.tags));
552
+ return true;
553
+ }
554
+ catch {
555
+ return false; // duplicate
556
+ }
557
+ }
558
+ /**
559
+ * Use LLM to enrich top features with better descriptions and applicability.
560
+ */
561
+ async enrichTopFeatures(count) {
562
+ if (!this.llmService)
563
+ return;
564
+ const features = this.db.prepare(`
565
+ SELECT id, name, category, code_snippet as codeSnippet, language
566
+ FROM extracted_features
567
+ WHERE description = '' OR applicability = ''
568
+ ORDER BY usefulness DESC
569
+ LIMIT ?
570
+ `).all(count);
571
+ for (const f of features) {
572
+ try {
573
+ const prompt = `Analyze this ${f.language} code feature "${f.name}" (category: ${f.category}).
574
+ Return a JSON object with:
575
+ - "description": one-line description of what it does (max 100 chars)
576
+ - "applicability": how this could help an AI assistant system (max 150 chars)
577
+
578
+ Code:
579
+ \`\`\`${f.language}
580
+ ${f.codeSnippet.slice(0, 1000)}
581
+ \`\`\`
582
+
583
+ Respond with ONLY the JSON object, no markdown.`;
584
+ const response = await this.llmService.complete(prompt, {
585
+ template: 'custom',
586
+ maxTokens: 200,
587
+ });
588
+ const parsed = JSON.parse(response.text);
589
+ if (parsed.description && parsed.applicability) {
590
+ this.db.prepare(`
591
+ UPDATE extracted_features SET description = ?, applicability = ? WHERE id = ?
592
+ `).run(parsed.description, parsed.applicability, f.id);
593
+ }
594
+ }
595
+ catch {
596
+ // LLM enrichment is optional
597
+ }
598
+ }
599
+ }
600
+ }
601
+ //# sourceMappingURL=feature-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-extractor.js","sourceRoot":"","sources":["../../src/codegen/feature-extractor.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,6 @@ export { CodegenServer } from './codegen-server.js';
7
7
  export type { CodegenServerOptions } from './codegen-server.js';
8
8
  export { RepoAbsorber } from './repo-absorber.js';
9
9
  export type { AbsorbResult, RepoAbsorberStatus } from './repo-absorber.js';
10
+ export { FeatureExtractor } from './feature-extractor.js';
11
+ export type { ExtractedFeature, FeatureCategory, FeatureExtractionResult, FeatureSearchOptions, FeatureStats } from './feature-extractor.js';
10
12
  export type { CodeMinerConfig, RepoContent, CodeMinerSummary, ExtractedPattern, DependencyPattern, TechStack, ProjectStructure, ReadmePattern, ContextBuilderConfig, BuiltContext, CodeGeneratorConfig, GenerationTrigger, GenerationStatus, GenerationRequest, GenerationResult, GenerationRecord, CodeGeneratorSummary, } from './types.js';
@@ -4,4 +4,5 @@ export { ContextBuilder } from './context-builder.js';
4
4
  export { CodeGenerator, runCodeGeneratorMigration } from './code-generator.js';
5
5
  export { CodegenServer } from './codegen-server.js';
6
6
  export { RepoAbsorber } from './repo-absorber.js';
7
+ export { FeatureExtractor } from './feature-extractor.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}