@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.
- package/command-center.html +185 -4
- package/dist/codegen/feature-extractor.d.ts +91 -0
- package/dist/codegen/feature-extractor.js +601 -0
- package/dist/codegen/feature-extractor.js.map +1 -0
- package/dist/codegen/index.d.ts +2 -0
- package/dist/codegen/index.js +1 -0
- package/dist/codegen/index.js.map +1 -1
- package/dist/codegen/repo-absorber.d.ts +4 -0
- package/dist/codegen/repo-absorber.js +11 -1
- package/dist/codegen/repo-absorber.js.map +1 -1
- package/dist/dashboard/command-center-server.d.ts +1 -0
- package/dist/dashboard/command-center-server.js +13 -1
- package/dist/dashboard/command-center-server.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|
package/dist/codegen/index.d.ts
CHANGED
|
@@ -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';
|
package/dist/codegen/index.js
CHANGED
|
@@ -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"}
|