@nahisaho/musubix-library-learner 2.0.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.
Files changed (66) hide show
  1. package/README.md +117 -0
  2. package/dist/LibraryLearner.d.ts +36 -0
  3. package/dist/LibraryLearner.d.ts.map +1 -0
  4. package/dist/LibraryLearner.js +217 -0
  5. package/dist/LibraryLearner.js.map +1 -0
  6. package/dist/abstraction/Abstractor.d.ts +29 -0
  7. package/dist/abstraction/Abstractor.d.ts.map +1 -0
  8. package/dist/abstraction/Abstractor.js +290 -0
  9. package/dist/abstraction/Abstractor.js.map +1 -0
  10. package/dist/abstraction/PatternMiner.d.ts +23 -0
  11. package/dist/abstraction/PatternMiner.d.ts.map +1 -0
  12. package/dist/abstraction/PatternMiner.js +263 -0
  13. package/dist/abstraction/PatternMiner.js.map +1 -0
  14. package/dist/abstraction/TypeAnalyzer.d.ts +27 -0
  15. package/dist/abstraction/TypeAnalyzer.d.ts.map +1 -0
  16. package/dist/abstraction/TypeAnalyzer.js +239 -0
  17. package/dist/abstraction/TypeAnalyzer.js.map +1 -0
  18. package/dist/abstraction/index.d.ts +10 -0
  19. package/dist/abstraction/index.d.ts.map +1 -0
  20. package/dist/abstraction/index.js +7 -0
  21. package/dist/abstraction/index.js.map +1 -0
  22. package/dist/egraph/EGraph.d.ts +29 -0
  23. package/dist/egraph/EGraph.d.ts.map +1 -0
  24. package/dist/egraph/EGraph.js +86 -0
  25. package/dist/egraph/EGraph.js.map +1 -0
  26. package/dist/egraph/EGraphBuilder.d.ts +24 -0
  27. package/dist/egraph/EGraphBuilder.d.ts.map +1 -0
  28. package/dist/egraph/EGraphBuilder.js +37 -0
  29. package/dist/egraph/EGraphBuilder.js.map +1 -0
  30. package/dist/egraph/Extractor.d.ts +24 -0
  31. package/dist/egraph/Extractor.d.ts.map +1 -0
  32. package/dist/egraph/Extractor.js +61 -0
  33. package/dist/egraph/Extractor.js.map +1 -0
  34. package/dist/egraph/index.d.ts +10 -0
  35. package/dist/egraph/index.d.ts.map +1 -0
  36. package/dist/egraph/index.js +7 -0
  37. package/dist/egraph/index.js.map +1 -0
  38. package/dist/errors.d.ts +66 -0
  39. package/dist/errors.d.ts.map +1 -0
  40. package/dist/errors.js +99 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/index.d.ts +48 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +40 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/library/Consolidator.d.ts +26 -0
  47. package/dist/library/Consolidator.d.ts.map +1 -0
  48. package/dist/library/Consolidator.js +54 -0
  49. package/dist/library/Consolidator.js.map +1 -0
  50. package/dist/library/LibraryStore.d.ts +33 -0
  51. package/dist/library/LibraryStore.d.ts.map +1 -0
  52. package/dist/library/LibraryStore.js +61 -0
  53. package/dist/library/LibraryStore.js.map +1 -0
  54. package/dist/library/Pruner.d.ts +24 -0
  55. package/dist/library/Pruner.d.ts.map +1 -0
  56. package/dist/library/Pruner.js +41 -0
  57. package/dist/library/Pruner.js.map +1 -0
  58. package/dist/library/index.d.ts +10 -0
  59. package/dist/library/index.d.ts.map +1 -0
  60. package/dist/library/index.js +7 -0
  61. package/dist/library/index.js.map +1 -0
  62. package/dist/types.d.ts +365 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +10 -0
  65. package/dist/types.js.map +1 -0
  66. package/package.json +66 -0
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Abstractor - Hierarchical abstraction of patterns
3
+ *
4
+ * REQ-LL-001: 階層的抽象化
5
+ * DES-PHASE2-001: Abstraction Engine / Abstractor
6
+ */
7
+ /**
8
+ * Default Abstractor implementation
9
+ */
10
+ class AbstractorImpl {
11
+ extractConcretePatterns(candidates) {
12
+ if (!candidates || candidates.length === 0) {
13
+ return [];
14
+ }
15
+ return candidates.map((candidate) => ({
16
+ id: candidate.id,
17
+ ast: candidate.ast,
18
+ occurrenceCount: candidate.occurrences.length,
19
+ locations: candidate.occurrences,
20
+ }));
21
+ }
22
+ parameterize(patterns) {
23
+ if (!patterns || patterns.length === 0) {
24
+ return [];
25
+ }
26
+ const templates = [];
27
+ const groups = this.groupSimilarPatterns(patterns);
28
+ for (const group of groups) {
29
+ if (group.length < 2) {
30
+ // Single pattern - create simple template
31
+ templates.push(this.createSimpleTemplate(group[0]));
32
+ }
33
+ else {
34
+ // Multiple similar patterns - find common structure
35
+ const template = this.findCommonTemplate(group);
36
+ if (template) {
37
+ templates.push(template);
38
+ }
39
+ }
40
+ }
41
+ return templates;
42
+ }
43
+ generalize(templates) {
44
+ if (!templates || templates.length === 0) {
45
+ return [];
46
+ }
47
+ const concepts = [];
48
+ const categories = this.categorizeTemplates(templates);
49
+ let conceptId = 0;
50
+ for (const [category, categoryTemplates] of categories) {
51
+ concepts.push({
52
+ id: `CONCEPT-${++conceptId}`,
53
+ name: this.generateConceptName(category),
54
+ description: this.generateConceptDescription(category, categoryTemplates),
55
+ templates: categoryTemplates.map((t) => t.id),
56
+ category,
57
+ });
58
+ }
59
+ return concepts;
60
+ }
61
+ abstract(candidates) {
62
+ const concrete = this.extractConcretePatterns(candidates);
63
+ const templates = this.parameterize(concrete);
64
+ const concepts = this.generalize(templates);
65
+ return { concrete, templates, concepts };
66
+ }
67
+ // =========================================================================
68
+ // Private methods
69
+ // =========================================================================
70
+ groupSimilarPatterns(patterns) {
71
+ const groups = [];
72
+ const used = new Set();
73
+ for (const pattern of patterns) {
74
+ if (used.has(pattern.id))
75
+ continue;
76
+ const group = [pattern];
77
+ used.add(pattern.id);
78
+ for (const other of patterns) {
79
+ if (used.has(other.id))
80
+ continue;
81
+ if (this.isSimilar(pattern, other)) {
82
+ group.push(other);
83
+ used.add(other.id);
84
+ }
85
+ }
86
+ groups.push(group);
87
+ }
88
+ return groups;
89
+ }
90
+ isSimilar(a, b) {
91
+ // Compare AST structure similarity
92
+ return this.computeSimilarity(a.ast, b.ast) > 0.7;
93
+ }
94
+ computeSimilarity(a, b) {
95
+ if (typeof a !== 'object' || typeof b !== 'object') {
96
+ return a === b ? 1 : 0;
97
+ }
98
+ if (a === null || b === null) {
99
+ return a === b ? 1 : 0;
100
+ }
101
+ const aObj = a;
102
+ const bObj = b;
103
+ // Compare type
104
+ if (aObj.type !== bObj.type) {
105
+ return 0;
106
+ }
107
+ let score = 1;
108
+ let count = 1;
109
+ // Compare children
110
+ const aChildren = aObj.children ?? [];
111
+ const bChildren = bObj.children ?? [];
112
+ if (aChildren.length === bChildren.length) {
113
+ for (let i = 0; i < aChildren.length; i++) {
114
+ score += this.computeSimilarity(aChildren[i], bChildren[i]);
115
+ count++;
116
+ }
117
+ }
118
+ else {
119
+ // Different number of children - less similar
120
+ score += 0.5;
121
+ count++;
122
+ }
123
+ return score / count;
124
+ }
125
+ createSimpleTemplate(pattern) {
126
+ return {
127
+ id: `TMPL-${pattern.id}`,
128
+ template: this.astToTemplate(pattern.ast),
129
+ parameters: [],
130
+ concretePatterns: [pattern.id],
131
+ };
132
+ }
133
+ findCommonTemplate(patterns) {
134
+ if (patterns.length === 0)
135
+ return null;
136
+ // Use first pattern as base and find differences with others
137
+ const base = patterns[0];
138
+ const template = this.astToTemplate(base.ast);
139
+ const parameters = [];
140
+ let paramCount = 0;
141
+ for (let i = 1; i < patterns.length; i++) {
142
+ const diffs = this.findDifferences(base.ast, patterns[i].ast);
143
+ for (const diff of diffs) {
144
+ const paramName = `$${++paramCount}`;
145
+ parameters.push({
146
+ name: paramName,
147
+ type: this.inferType(diff.value),
148
+ });
149
+ this.markAsHole(template, diff.path, paramName);
150
+ }
151
+ }
152
+ return {
153
+ id: `TMPL-${patterns.map((p) => p.id).join('-')}`,
154
+ template,
155
+ parameters,
156
+ concretePatterns: patterns.map((p) => p.id),
157
+ };
158
+ }
159
+ astToTemplate(ast) {
160
+ if (typeof ast !== 'object' || ast === null) {
161
+ return { type: 'Literal', value: ast };
162
+ }
163
+ const node = ast;
164
+ const template = {
165
+ type: String(node.type ?? 'Unknown'),
166
+ };
167
+ if (node.value !== undefined) {
168
+ template.value = node.value;
169
+ }
170
+ if (Array.isArray(node.children)) {
171
+ template.children = node.children.map((c) => this.astToTemplate(c));
172
+ }
173
+ return template;
174
+ }
175
+ findDifferences(a, b, path = []) {
176
+ const diffs = [];
177
+ if (typeof a !== typeof b) {
178
+ diffs.push({ path, value: b });
179
+ return diffs;
180
+ }
181
+ if (typeof a !== 'object' || a === null) {
182
+ if (a !== b) {
183
+ diffs.push({ path, value: b });
184
+ }
185
+ return diffs;
186
+ }
187
+ const aObj = a;
188
+ const bObj = b;
189
+ // Compare properties
190
+ const keys = new Set([...Object.keys(aObj), ...Object.keys(bObj)]);
191
+ for (const key of keys) {
192
+ if (key === 'children')
193
+ continue;
194
+ if (aObj[key] !== bObj[key]) {
195
+ diffs.push({ path: [...path, key], value: bObj[key] });
196
+ }
197
+ }
198
+ // Compare children
199
+ const aChildren = aObj.children ?? [];
200
+ const bChildren = bObj.children ?? [];
201
+ const minLen = Math.min(aChildren.length, bChildren.length);
202
+ for (let i = 0; i < minLen; i++) {
203
+ diffs.push(...this.findDifferences(aChildren[i], bChildren[i], [...path, 'children', String(i)]));
204
+ }
205
+ return diffs;
206
+ }
207
+ markAsHole(template, path, holeName) {
208
+ let current = template;
209
+ for (let i = 0; i < path.length - 1; i++) {
210
+ const key = path[i];
211
+ if (key === 'children') {
212
+ const index = parseInt(path[++i], 10);
213
+ if (current.children && current.children[index]) {
214
+ current = current.children[index];
215
+ }
216
+ else {
217
+ return;
218
+ }
219
+ }
220
+ }
221
+ current.isHole = true;
222
+ current.holeName = holeName;
223
+ }
224
+ inferType(value) {
225
+ if (value === null || value === undefined) {
226
+ return { kind: 'primitive', name: 'null' };
227
+ }
228
+ switch (typeof value) {
229
+ case 'string':
230
+ return { kind: 'primitive', name: 'string' };
231
+ case 'number':
232
+ return { kind: 'primitive', name: 'number' };
233
+ case 'boolean':
234
+ return { kind: 'primitive', name: 'boolean' };
235
+ case 'object':
236
+ if (Array.isArray(value)) {
237
+ return { kind: 'array', elementType: { kind: 'primitive', name: 'unknown' } };
238
+ }
239
+ return { kind: 'object', properties: {} };
240
+ default:
241
+ return { kind: 'primitive', name: 'unknown' };
242
+ }
243
+ }
244
+ categorizeTemplates(templates) {
245
+ const categories = new Map();
246
+ for (const template of templates) {
247
+ const category = this.determineCategory(template);
248
+ const existing = categories.get(category) ?? [];
249
+ existing.push(template);
250
+ categories.set(category, existing);
251
+ }
252
+ return categories;
253
+ }
254
+ determineCategory(template) {
255
+ const type = template.template.type;
256
+ // Map AST types to semantic categories
257
+ const categoryMap = {
258
+ Declaration: 'declaration',
259
+ IfStatement: 'control-flow',
260
+ ForLoop: 'iteration',
261
+ WhileLoop: 'iteration',
262
+ ReturnStatement: 'return',
263
+ FunctionCall: 'invocation',
264
+ Assignment: 'assignment',
265
+ };
266
+ return categoryMap[type] ?? 'general';
267
+ }
268
+ generateConceptName(category) {
269
+ const nameMap = {
270
+ declaration: 'Variable Declaration Pattern',
271
+ 'control-flow': 'Conditional Logic Pattern',
272
+ iteration: 'Loop Pattern',
273
+ return: 'Return Statement Pattern',
274
+ invocation: 'Function Call Pattern',
275
+ assignment: 'Assignment Pattern',
276
+ general: 'General Pattern',
277
+ };
278
+ return nameMap[category] ?? 'Unknown Pattern';
279
+ }
280
+ generateConceptDescription(category, templates) {
281
+ return `A ${category} pattern abstracted from ${templates.length} template(s)`;
282
+ }
283
+ }
284
+ /**
285
+ * Factory function to create an Abstractor
286
+ */
287
+ export function createAbstractor() {
288
+ return new AbstractorImpl();
289
+ }
290
+ //# sourceMappingURL=Abstractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Abstractor.js","sourceRoot":"","sources":["../../src/abstraction/Abstractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * PatternMiner - Extracts patterns from code corpus
3
+ *
4
+ * REQ-LL-001: 階層的抽象化
5
+ * DES-PHASE2-001: Abstraction Engine / PatternMiner
6
+ */
7
+ import type { CodeCorpus, PatternCandidate, PatternMinerConfig } from '../types.js';
8
+ /**
9
+ * PatternMiner interface
10
+ */
11
+ export interface PatternMiner {
12
+ /** Mine patterns from a code corpus */
13
+ mine(corpus: CodeCorpus): Promise<PatternCandidate[]>;
14
+ /** Set minimum occurrences threshold */
15
+ setMinOccurrences(count: number): void;
16
+ /** Get current configuration */
17
+ getConfig(): PatternMinerConfig;
18
+ }
19
+ /**
20
+ * Factory function to create a PatternMiner
21
+ */
22
+ export declare function createPatternMiner(config?: PatternMinerConfig): PatternMiner;
23
+ //# sourceMappingURL=PatternMiner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatternMiner.d.ts","sourceRoot":"","sources":["../../src/abstraction/PatternMiner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAGnB,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEtD,wCAAwC;IACxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvC,gCAAgC;IAChC,SAAS,IAAI,kBAAkB,CAAC;CACjC;AAuTD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAE5E"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * PatternMiner - Extracts patterns from code corpus
3
+ *
4
+ * REQ-LL-001: 階層的抽象化
5
+ * DES-PHASE2-001: Abstraction Engine / PatternMiner
6
+ */
7
+ import { PatternMiningError } from '../errors.js';
8
+ /**
9
+ * Default PatternMiner implementation
10
+ */
11
+ class PatternMinerImpl {
12
+ config;
13
+ constructor(config = {}) {
14
+ this.config = {
15
+ minOccurrences: config.minOccurrences ?? 2,
16
+ maxDepth: config.maxDepth ?? 10,
17
+ minSize: config.minSize ?? 3,
18
+ maxSize: config.maxSize ?? 50,
19
+ };
20
+ }
21
+ async mine(corpus) {
22
+ if (!corpus || !corpus.files || corpus.files.length === 0) {
23
+ throw new PatternMiningError('Corpus is empty or invalid');
24
+ }
25
+ const candidates = [];
26
+ const patternMap = new Map();
27
+ // Parse and extract subtrees from each file
28
+ for (const file of corpus.files) {
29
+ try {
30
+ const ast = this.parseFile(file.content);
31
+ const subtrees = this.extractSubtrees(ast, file.path);
32
+ for (const { hash, occurrence } of subtrees) {
33
+ const occurrences = patternMap.get(hash) ?? [];
34
+ occurrences.push(occurrence);
35
+ patternMap.set(hash, occurrences);
36
+ }
37
+ }
38
+ catch (error) {
39
+ // Skip files that fail to parse
40
+ console.warn(`Failed to parse ${file.path}: ${error}`);
41
+ }
42
+ }
43
+ // Filter by minimum occurrences and create candidates
44
+ let idCounter = 0;
45
+ for (const [hash, occurrences] of patternMap) {
46
+ if (occurrences.length >= this.config.minOccurrences) {
47
+ const ast = this.hashToAST(hash);
48
+ if (ast && this.isValidPatternSize(ast)) {
49
+ candidates.push({
50
+ id: `PAT-${++idCounter}`,
51
+ ast,
52
+ occurrences,
53
+ score: this.computeScore(occurrences.length, ast),
54
+ });
55
+ }
56
+ }
57
+ }
58
+ // Sort by score descending
59
+ candidates.sort((a, b) => b.score - a.score);
60
+ return candidates;
61
+ }
62
+ setMinOccurrences(count) {
63
+ if (count < 1) {
64
+ throw new PatternMiningError('minOccurrences must be at least 1');
65
+ }
66
+ this.config.minOccurrences = count;
67
+ }
68
+ getConfig() {
69
+ return { ...this.config };
70
+ }
71
+ // =========================================================================
72
+ // Private methods
73
+ // =========================================================================
74
+ parseFile(content) {
75
+ // Simplified parser - in production, use a real parser like TypeScript compiler API
76
+ // For now, we create a simple token-based AST
77
+ const tokens = this.tokenize(content);
78
+ return this.buildAST(tokens);
79
+ }
80
+ tokenize(content) {
81
+ // Simple tokenization
82
+ return content
83
+ .replace(/\/\/.*$/gm, '') // Remove single-line comments
84
+ .replace(/\/\*[\s\S]*?\*\//g, '') // Remove multi-line comments
85
+ .split(/(\s+|[{}()\[\];,.:=<>+\-*/&|!?])/g)
86
+ .filter((t) => t.trim().length > 0);
87
+ }
88
+ buildAST(tokens) {
89
+ // Simplified AST building
90
+ const root = { type: 'Program', children: [] };
91
+ let i = 0;
92
+ while (i < tokens.length) {
93
+ const node = this.parseStatement(tokens, i);
94
+ if (node.node) {
95
+ root.children.push(node.node);
96
+ }
97
+ i = node.nextIndex;
98
+ }
99
+ return root;
100
+ }
101
+ parseStatement(tokens, start) {
102
+ if (start >= tokens.length) {
103
+ return { node: null, nextIndex: start };
104
+ }
105
+ const token = tokens[start];
106
+ // Handle different statement types
107
+ if (token === 'function' || token === 'const' || token === 'let' || token === 'var') {
108
+ return this.parseDeclaration(tokens, start);
109
+ }
110
+ if (token === 'if') {
111
+ return this.parseIfStatement(tokens, start);
112
+ }
113
+ if (token === 'for' || token === 'while') {
114
+ return this.parseLoop(tokens, start);
115
+ }
116
+ if (token === 'return') {
117
+ return this.parseReturn(tokens, start);
118
+ }
119
+ // Default: wrap as expression
120
+ return {
121
+ node: { type: 'Expression', value: token },
122
+ nextIndex: start + 1,
123
+ };
124
+ }
125
+ parseDeclaration(tokens, start) {
126
+ const kind = tokens[start];
127
+ const name = tokens[start + 1] ?? 'unknown';
128
+ return {
129
+ node: {
130
+ type: 'Declaration',
131
+ kind,
132
+ name,
133
+ children: [],
134
+ },
135
+ nextIndex: this.findStatementEnd(tokens, start),
136
+ };
137
+ }
138
+ parseIfStatement(tokens, start) {
139
+ return {
140
+ node: {
141
+ type: 'IfStatement',
142
+ children: [],
143
+ },
144
+ nextIndex: this.findBlockEnd(tokens, start),
145
+ };
146
+ }
147
+ parseLoop(tokens, start) {
148
+ const kind = tokens[start];
149
+ return {
150
+ node: {
151
+ type: kind === 'for' ? 'ForLoop' : 'WhileLoop',
152
+ children: [],
153
+ },
154
+ nextIndex: this.findBlockEnd(tokens, start),
155
+ };
156
+ }
157
+ parseReturn(tokens, start) {
158
+ return {
159
+ node: {
160
+ type: 'ReturnStatement',
161
+ children: [],
162
+ },
163
+ nextIndex: this.findStatementEnd(tokens, start),
164
+ };
165
+ }
166
+ findStatementEnd(tokens, start) {
167
+ let i = start;
168
+ while (i < tokens.length && tokens[i] !== ';' && tokens[i] !== '}') {
169
+ i++;
170
+ }
171
+ return Math.min(i + 1, tokens.length);
172
+ }
173
+ findBlockEnd(tokens, start) {
174
+ let depth = 0;
175
+ let i = start;
176
+ while (i < tokens.length) {
177
+ if (tokens[i] === '{')
178
+ depth++;
179
+ if (tokens[i] === '}') {
180
+ depth--;
181
+ if (depth === 0)
182
+ return i + 1;
183
+ }
184
+ i++;
185
+ }
186
+ return tokens.length;
187
+ }
188
+ extractSubtrees(ast, filePath, depth = 0) {
189
+ const results = [];
190
+ if (depth > this.config.maxDepth) {
191
+ return results;
192
+ }
193
+ // Add current node as potential pattern
194
+ const hash = this.hashAST(ast);
195
+ results.push({
196
+ hash,
197
+ node: ast,
198
+ occurrence: {
199
+ file: filePath,
200
+ startLine: 1, // Simplified - would need source map in production
201
+ endLine: 1,
202
+ bindings: new Map(),
203
+ },
204
+ });
205
+ // Recurse into children
206
+ if (ast.children) {
207
+ for (const child of ast.children) {
208
+ results.push(...this.extractSubtrees(child, filePath, depth + 1));
209
+ }
210
+ }
211
+ return results;
212
+ }
213
+ hashAST(node) {
214
+ // Create a structural hash of the AST
215
+ const parts = [node.type];
216
+ if (node.kind)
217
+ parts.push(String(node.kind));
218
+ if (node.value !== undefined)
219
+ parts.push(String(node.value));
220
+ if (node.children) {
221
+ for (const child of node.children) {
222
+ parts.push(this.hashAST(child));
223
+ }
224
+ }
225
+ return parts.join('|');
226
+ }
227
+ hashToAST(hash) {
228
+ // Reconstruct AST from hash (simplified)
229
+ const parts = hash.split('|');
230
+ if (parts.length === 0)
231
+ return null;
232
+ return {
233
+ type: parts[0],
234
+ children: [],
235
+ };
236
+ }
237
+ isValidPatternSize(ast) {
238
+ const size = this.countNodes(ast);
239
+ return size >= this.config.minSize && size <= this.config.maxSize;
240
+ }
241
+ countNodes(ast) {
242
+ let count = 1;
243
+ if (ast.children) {
244
+ for (const child of ast.children) {
245
+ count += this.countNodes(child);
246
+ }
247
+ }
248
+ return count;
249
+ }
250
+ computeScore(occurrences, ast) {
251
+ // Score based on occurrences and pattern complexity
252
+ const size = this.countNodes(ast);
253
+ // Higher occurrences and moderate size = better score
254
+ return occurrences * Math.log2(size + 1);
255
+ }
256
+ }
257
+ /**
258
+ * Factory function to create a PatternMiner
259
+ */
260
+ export function createPatternMiner(config) {
261
+ return new PatternMinerImpl(config);
262
+ }
263
+ //# sourceMappingURL=PatternMiner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatternMiner.js","sourceRoot":"","sources":["../../src/abstraction/PatternMiner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * TypeAnalyzer - Type-directed search and analysis
3
+ *
4
+ * REQ-LL-003: 型指向探索
5
+ * DES-PHASE2-001: Abstraction Engine / TypeAnalyzer
6
+ */
7
+ import type { TypeSignature, TypeContext, PatternCandidate } from '../types.js';
8
+ /**
9
+ * TypeAnalyzer interface
10
+ */
11
+ export interface TypeAnalyzer {
12
+ /** Check if two types are compatible */
13
+ isCompatible(source: TypeSignature, target: TypeSignature): boolean;
14
+ /** Filter candidates by expected type */
15
+ filterByType(candidates: PatternCandidate[], expectedType: TypeSignature): PatternCandidate[];
16
+ /** Score a candidate by type match quality */
17
+ scoreByTypeMatch(candidate: PatternCandidate, context: TypeContext): number;
18
+ /** Infer type of an expression */
19
+ inferType(expression: unknown): TypeSignature;
20
+ /** Check if type A is subtype of type B */
21
+ isSubtype(sub: TypeSignature, sup: TypeSignature): boolean;
22
+ }
23
+ /**
24
+ * Factory function to create a TypeAnalyzer
25
+ */
26
+ export declare function createTypeAnalyzer(): TypeAnalyzer;
27
+ //# sourceMappingURL=TypeAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeAnalyzer.d.ts","sourceRoot":"","sources":["../../src/abstraction/TypeAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;IAEpE,yCAAyC;IACzC,YAAY,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,YAAY,EAAE,aAAa,GAAG,gBAAgB,EAAE,CAAC;IAE9F,8CAA8C;IAC9C,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC;IAE5E,kCAAkC;IAClC,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,aAAa,CAAC;IAE9C,2CAA2C;IAC3C,SAAS,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC;CAC5D;AAyRD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}