@nahisaho/musubix-pattern-mcp 1.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.
- package/dist/compression/index.d.ts +7 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +7 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/compression/pattern-compressor.d.ts +111 -0
- package/dist/compression/pattern-compressor.d.ts.map +1 -0
- package/dist/compression/pattern-compressor.js +307 -0
- package/dist/compression/pattern-compressor.js.map +1 -0
- package/dist/compression/quality-evaluator.d.ts +97 -0
- package/dist/compression/quality-evaluator.d.ts.map +1 -0
- package/dist/compression/quality-evaluator.js +210 -0
- package/dist/compression/quality-evaluator.js.map +1 -0
- package/dist/extractor/anti-unifier.d.ts +63 -0
- package/dist/extractor/anti-unifier.d.ts.map +1 -0
- package/dist/extractor/anti-unifier.js +167 -0
- package/dist/extractor/anti-unifier.js.map +1 -0
- package/dist/extractor/index.d.ts +9 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +9 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/pattern-extractor.d.ts +58 -0
- package/dist/extractor/pattern-extractor.d.ts.map +1 -0
- package/dist/extractor/pattern-extractor.js +201 -0
- package/dist/extractor/pattern-extractor.js.map +1 -0
- package/dist/extractor/subtree-finder.d.ts +81 -0
- package/dist/extractor/subtree-finder.d.ts.map +1 -0
- package/dist/extractor/subtree-finder.js +155 -0
- package/dist/extractor/subtree-finder.js.map +1 -0
- package/dist/extractor/typescript-parser.d.ts +91 -0
- package/dist/extractor/typescript-parser.d.ts.map +1 -0
- package/dist/extractor/typescript-parser.js +219 -0
- package/dist/extractor/typescript-parser.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/learning/index.d.ts +6 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +6 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/wake-sleep.d.ts +144 -0
- package/dist/learning/wake-sleep.d.ts.map +1 -0
- package/dist/learning/wake-sleep.js +312 -0
- package/dist/learning/wake-sleep.js.map +1 -0
- package/dist/library/index.d.ts +6 -0
- package/dist/library/index.d.ts.map +1 -0
- package/dist/library/index.js +6 -0
- package/dist/library/index.js.map +1 -0
- package/dist/library/pattern-library.d.ts +59 -0
- package/dist/library/pattern-library.d.ts.map +1 -0
- package/dist/library/pattern-library.js +139 -0
- package/dist/library/pattern-library.js.map +1 -0
- package/dist/privacy/index.d.ts +6 -0
- package/dist/privacy/index.d.ts.map +1 -0
- package/dist/privacy/index.js +6 -0
- package/dist/privacy/index.js.map +1 -0
- package/dist/privacy/privacy-filter.d.ts +46 -0
- package/dist/privacy/privacy-filter.d.ts.map +1 -0
- package/dist/privacy/privacy-filter.js +105 -0
- package/dist/privacy/privacy-filter.js.map +1 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Wake-Sleep Cycle Learning System
|
|
3
|
+
* @traceability TSK-WAKE-002, REQ-PATTERN-003
|
|
4
|
+
*
|
|
5
|
+
* Implements DreamCoder-style wake-sleep learning:
|
|
6
|
+
* - Wake Phase: Extract patterns from observed code
|
|
7
|
+
* - Sleep Phase: Compress and optimize pattern library
|
|
8
|
+
*/
|
|
9
|
+
import { PatternCompressor } from '../compression/pattern-compressor.js';
|
|
10
|
+
import { PatternQualityEvaluator } from '../compression/quality-evaluator.js';
|
|
11
|
+
/**
|
|
12
|
+
* Wake-Sleep Cycle Learning System
|
|
13
|
+
*
|
|
14
|
+
* Implements alternating wake and sleep phases for continuous learning:
|
|
15
|
+
*
|
|
16
|
+
* Wake Phase:
|
|
17
|
+
* - Observe new code/patterns
|
|
18
|
+
* - Extract potential patterns
|
|
19
|
+
* - Add to candidate pool
|
|
20
|
+
*
|
|
21
|
+
* Sleep Phase:
|
|
22
|
+
* - Compress pattern library using MDL
|
|
23
|
+
* - Remove low-quality patterns
|
|
24
|
+
* - Merge similar patterns
|
|
25
|
+
* - Optimize for generality/utility balance
|
|
26
|
+
*/
|
|
27
|
+
export class WakeSleepCycle {
|
|
28
|
+
config;
|
|
29
|
+
compressor;
|
|
30
|
+
evaluator;
|
|
31
|
+
library = new Map();
|
|
32
|
+
wakeBuffer = [];
|
|
33
|
+
stats;
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.config = {
|
|
36
|
+
minQualityThreshold: config?.minQualityThreshold ?? 0.3,
|
|
37
|
+
maxLibrarySize: config?.maxLibrarySize ?? 1000,
|
|
38
|
+
compressionIterations: config?.compressionIterations ?? 3,
|
|
39
|
+
autoSleep: config?.autoSleep ?? true,
|
|
40
|
+
wakeThreshold: config?.wakeThreshold ?? 100,
|
|
41
|
+
};
|
|
42
|
+
this.compressor = new PatternCompressor({
|
|
43
|
+
minCompressionRatio: 1.1,
|
|
44
|
+
});
|
|
45
|
+
this.evaluator = new PatternQualityEvaluator({
|
|
46
|
+
minFrequency: 2,
|
|
47
|
+
maxHoles: 5,
|
|
48
|
+
idealDepthRange: [3, 8],
|
|
49
|
+
});
|
|
50
|
+
this.stats = {
|
|
51
|
+
totalWakeObservations: 0,
|
|
52
|
+
totalSleepCycles: 0,
|
|
53
|
+
currentLibrarySize: 0,
|
|
54
|
+
averagePatternQuality: 0,
|
|
55
|
+
totalPatternsExtracted: 0,
|
|
56
|
+
totalPatternsRemoved: 0,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Wake Phase: Observe new code and extract patterns
|
|
61
|
+
*/
|
|
62
|
+
wake(observation) {
|
|
63
|
+
this.wakeBuffer.push(observation);
|
|
64
|
+
this.stats.totalWakeObservations++;
|
|
65
|
+
// Simple pattern extraction from observation
|
|
66
|
+
const patterns = this.extractPatternsFromAST(observation);
|
|
67
|
+
// Add to library candidates
|
|
68
|
+
for (const pattern of patterns) {
|
|
69
|
+
this.addToLibrary(pattern);
|
|
70
|
+
}
|
|
71
|
+
// Auto-trigger sleep if threshold reached
|
|
72
|
+
if (this.config.autoSleep && this.wakeBuffer.length >= this.config.wakeThreshold) {
|
|
73
|
+
this.sleep();
|
|
74
|
+
}
|
|
75
|
+
return patterns;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Sleep Phase: Consolidate and optimize pattern library
|
|
79
|
+
*/
|
|
80
|
+
sleep() {
|
|
81
|
+
const startTime = Date.now();
|
|
82
|
+
const initialSize = this.library.size;
|
|
83
|
+
let patternsRemoved = 0;
|
|
84
|
+
// Get all patterns
|
|
85
|
+
const patterns = Array.from(this.library.values());
|
|
86
|
+
// Calculate initial MDL
|
|
87
|
+
const allAsts = this.wakeBuffer.map(o => o.ast);
|
|
88
|
+
const initialMDLResult = allAsts.length > 0
|
|
89
|
+
? this.compressor.calculateMDL(patterns, allAsts)
|
|
90
|
+
: null;
|
|
91
|
+
const initialMDL = initialMDLResult?.total ?? this.estimateLibraryMDL(patterns);
|
|
92
|
+
// Phase 1: Quality filtering
|
|
93
|
+
const qualityFiltered = this.evaluator.filterByQuality(patterns, this.config.minQualityThreshold);
|
|
94
|
+
patternsRemoved += patterns.length - qualityFiltered.length;
|
|
95
|
+
// Phase 2: MDL-based compression
|
|
96
|
+
let compressed = qualityFiltered;
|
|
97
|
+
for (let i = 0; i < this.config.compressionIterations; i++) {
|
|
98
|
+
const beforeCompression = compressed.length;
|
|
99
|
+
compressed = this.compressor.compressLibrary(compressed);
|
|
100
|
+
if (compressed.length >= beforeCompression)
|
|
101
|
+
break; // No improvement
|
|
102
|
+
}
|
|
103
|
+
patternsRemoved += qualityFiltered.length - compressed.length;
|
|
104
|
+
// Phase 3: Size limiting
|
|
105
|
+
if (compressed.length > this.config.maxLibrarySize) {
|
|
106
|
+
const ranked = this.evaluator.rankPatterns(compressed);
|
|
107
|
+
compressed = ranked.slice(0, this.config.maxLibrarySize).map(r => r.pattern);
|
|
108
|
+
patternsRemoved += ranked.length - this.config.maxLibrarySize;
|
|
109
|
+
}
|
|
110
|
+
// Update library
|
|
111
|
+
this.library.clear();
|
|
112
|
+
for (const pattern of compressed) {
|
|
113
|
+
const enhanced = pattern;
|
|
114
|
+
enhanced.quality = this.evaluator.evaluate(pattern);
|
|
115
|
+
enhanced.lastUsed = new Date().toISOString();
|
|
116
|
+
this.library.set(pattern.id, enhanced);
|
|
117
|
+
}
|
|
118
|
+
// Calculate final MDL
|
|
119
|
+
const finalMDLResult = allAsts.length > 0
|
|
120
|
+
? this.compressor.calculateMDL(compressed, allAsts)
|
|
121
|
+
: null;
|
|
122
|
+
const finalMDL = finalMDLResult?.total ?? this.estimateLibraryMDL(compressed);
|
|
123
|
+
// Update stats
|
|
124
|
+
this.stats.totalSleepCycles++;
|
|
125
|
+
this.stats.currentLibrarySize = this.library.size;
|
|
126
|
+
this.stats.totalPatternsRemoved += patternsRemoved;
|
|
127
|
+
this.updateAverageQuality();
|
|
128
|
+
// Clear wake buffer
|
|
129
|
+
this.wakeBuffer = [];
|
|
130
|
+
return {
|
|
131
|
+
patternsConsolidated: initialSize - patternsRemoved,
|
|
132
|
+
patternsRemoved,
|
|
133
|
+
compressionRatio: initialSize > 0 ? this.library.size / initialSize : 1,
|
|
134
|
+
mdlImprovement: initialMDL > 0 ? (initialMDL - finalMDL) / initialMDL : 0,
|
|
135
|
+
cycleTimeMs: Date.now() - startTime,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Extract patterns from AST
|
|
140
|
+
*/
|
|
141
|
+
extractPatternsFromAST(observation) {
|
|
142
|
+
const patterns = [];
|
|
143
|
+
const seen = new Set();
|
|
144
|
+
// Traverse AST and extract subtrees as pattern candidates
|
|
145
|
+
const traverse = (node, depth) => {
|
|
146
|
+
// Only extract patterns of reasonable depth
|
|
147
|
+
if (depth >= 2 && depth <= 6) {
|
|
148
|
+
const key = this.getPatternKey(node);
|
|
149
|
+
if (!seen.has(key)) {
|
|
150
|
+
seen.add(key);
|
|
151
|
+
const pattern = {
|
|
152
|
+
id: `WP-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
153
|
+
name: `${node.type}_pattern`,
|
|
154
|
+
language: observation.context.language,
|
|
155
|
+
ast: node,
|
|
156
|
+
holes: [],
|
|
157
|
+
frequency: 1,
|
|
158
|
+
createdAt: observation.timestamp,
|
|
159
|
+
updatedAt: observation.timestamp,
|
|
160
|
+
};
|
|
161
|
+
patterns.push(pattern);
|
|
162
|
+
this.stats.totalPatternsExtracted++;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Recurse into children
|
|
166
|
+
for (const child of node.children) {
|
|
167
|
+
traverse(child, depth + 1);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
traverse(observation.ast, 0);
|
|
171
|
+
return patterns;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Add pattern to library (or update existing)
|
|
175
|
+
*/
|
|
176
|
+
addToLibrary(pattern) {
|
|
177
|
+
const key = this.getPatternKey(pattern.ast);
|
|
178
|
+
const existing = this.findSimilarPattern(key);
|
|
179
|
+
if (existing) {
|
|
180
|
+
// Update existing pattern
|
|
181
|
+
existing.frequency = (existing.frequency ?? 0) + 1;
|
|
182
|
+
existing.lastUsed = new Date().toISOString();
|
|
183
|
+
existing.updatedAt = new Date().toISOString();
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// Add new pattern
|
|
187
|
+
const enhanced = {
|
|
188
|
+
...pattern,
|
|
189
|
+
lastUsed: new Date().toISOString(),
|
|
190
|
+
};
|
|
191
|
+
this.library.set(pattern.id, enhanced);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Find similar pattern in library
|
|
196
|
+
*/
|
|
197
|
+
findSimilarPattern(key) {
|
|
198
|
+
for (const pattern of this.library.values()) {
|
|
199
|
+
if (this.getPatternKey(pattern.ast) === key) {
|
|
200
|
+
return pattern;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Generate key for pattern deduplication
|
|
207
|
+
*/
|
|
208
|
+
getPatternKey(ast) {
|
|
209
|
+
const parts = [];
|
|
210
|
+
const traverse = (node) => {
|
|
211
|
+
parts.push(node.type);
|
|
212
|
+
if (node.type === 'Hole') {
|
|
213
|
+
parts.push('?');
|
|
214
|
+
}
|
|
215
|
+
else if (node.value) {
|
|
216
|
+
parts.push(node.value.slice(0, 20));
|
|
217
|
+
}
|
|
218
|
+
for (const child of node.children) {
|
|
219
|
+
traverse(child);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
traverse(ast);
|
|
223
|
+
return parts.join('|');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Estimate MDL for library without data
|
|
227
|
+
*/
|
|
228
|
+
estimateLibraryMDL(patterns) {
|
|
229
|
+
return patterns.reduce((sum, p) => {
|
|
230
|
+
return sum + this.countNodes(p.ast) + p.holes.length * 2;
|
|
231
|
+
}, 0);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Count nodes in AST
|
|
235
|
+
*/
|
|
236
|
+
countNodes(ast) {
|
|
237
|
+
return 1 + ast.children.reduce((sum, child) => sum + this.countNodes(child), 0);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Update average quality statistic
|
|
241
|
+
*/
|
|
242
|
+
updateAverageQuality() {
|
|
243
|
+
const patterns = Array.from(this.library.values());
|
|
244
|
+
if (patterns.length === 0) {
|
|
245
|
+
this.stats.averagePatternQuality = 0;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const totalQuality = patterns.reduce((sum, p) => {
|
|
249
|
+
return sum + (p.quality?.score ?? 0);
|
|
250
|
+
}, 0);
|
|
251
|
+
this.stats.averagePatternQuality = totalQuality / patterns.length;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get current pattern library
|
|
255
|
+
*/
|
|
256
|
+
getLibrary() {
|
|
257
|
+
return Array.from(this.library.values());
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get learning statistics
|
|
261
|
+
*/
|
|
262
|
+
getStats() {
|
|
263
|
+
return { ...this.stats };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get pattern by ID
|
|
267
|
+
*/
|
|
268
|
+
getPattern(id) {
|
|
269
|
+
return this.library.get(id);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Clear library and reset stats
|
|
273
|
+
*/
|
|
274
|
+
reset() {
|
|
275
|
+
this.library.clear();
|
|
276
|
+
this.wakeBuffer = [];
|
|
277
|
+
this.stats = {
|
|
278
|
+
totalWakeObservations: 0,
|
|
279
|
+
totalSleepCycles: 0,
|
|
280
|
+
currentLibrarySize: 0,
|
|
281
|
+
averagePatternQuality: 0,
|
|
282
|
+
totalPatternsExtracted: 0,
|
|
283
|
+
totalPatternsRemoved: 0,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Export library to JSON
|
|
288
|
+
*/
|
|
289
|
+
exportLibrary() {
|
|
290
|
+
return JSON.stringify({
|
|
291
|
+
patterns: Array.from(this.library.values()),
|
|
292
|
+
stats: this.stats,
|
|
293
|
+
exportedAt: new Date().toISOString(),
|
|
294
|
+
}, null, 2);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Import library from JSON
|
|
298
|
+
*/
|
|
299
|
+
importLibrary(json) {
|
|
300
|
+
const data = JSON.parse(json);
|
|
301
|
+
let imported = 0;
|
|
302
|
+
for (const pattern of data.patterns ?? []) {
|
|
303
|
+
if (pattern.id && pattern.ast) {
|
|
304
|
+
this.library.set(pattern.id, pattern);
|
|
305
|
+
imported++;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
this.stats.currentLibrarySize = this.library.size;
|
|
309
|
+
return imported;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=wake-sleep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake-sleep.js","sourceRoot":"","sources":["../../src/learning/wake-sleep.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAuB,MAAM,qCAAqC,CAAC;AAgEnG;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,CAAkB;IACxB,UAAU,CAAoB;IAC9B,SAAS,CAA0B;IACnC,OAAO,GAAiC,IAAI,GAAG,EAAE,CAAC;IAClD,UAAU,GAAsB,EAAE,CAAC;IACnC,KAAK,CAAgB;IAE7B,YAAY,MAAiC;QAC3C,IAAI,CAAC,MAAM,GAAG;YACZ,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,IAAI,GAAG;YACvD,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,IAAI;YAC9C,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,IAAI,CAAC;YACzD,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI;YACpC,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,GAAG;SAC5C,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CAAC;YACtC,mBAAmB,EAAE,GAAG;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,IAAI,uBAAuB,CAAC;YAC3C,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG;YACX,qBAAqB,EAAE,CAAC;YACxB,gBAAgB,EAAE,CAAC;YACnB,kBAAkB,EAAE,CAAC;YACrB,qBAAqB,EAAE,CAAC;YACxB,sBAAsB,EAAE,CAAC;YACzB,oBAAoB,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,WAA4B;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAEnC,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAE1D,4BAA4B;QAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,0CAA0C;QAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACjF,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACtC,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,mBAAmB;QACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEnD,wBAAwB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;YACjD,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,UAAU,GAAG,gBAAgB,EAAE,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEhF,6BAA6B;QAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CACpD,QAAQ,EACR,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAChC,CAAC;QACF,eAAe,IAAI,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QAE5D,iCAAiC;QACjC,IAAI,UAAU,GAAG,eAAe,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3D,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC;YAC5C,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACzD,IAAI,UAAU,CAAC,MAAM,IAAI,iBAAiB;gBAAE,MAAM,CAAC,iBAAiB;QACtE,CAAC;QACD,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QAE9D,yBAAyB;QACzB,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACvD,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7E,eAAe,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAChE,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,OAA0B,CAAC;YAC5C,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpD,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,sBAAsB;QACtB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,QAAQ,GAAG,cAAc,EAAE,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAE9E,eAAe;QACf,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,oBAAoB,IAAI,eAAe,CAAC;QACnD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,oBAAoB;QACpB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,OAAO;YACL,oBAAoB,EAAE,WAAW,GAAG,eAAe;YACnD,eAAe;YACf,gBAAgB,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACvE,cAAc,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACzE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACpC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,WAA4B;QACzD,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAE,KAAa,EAAQ,EAAE;YACtD,4CAA4C;YAC5C,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAEd,MAAM,OAAO,GAAY;wBACvB,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;wBAChE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,UAAU;wBAC5B,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ;wBACtC,GAAG,EAAE,IAAI;wBACT,KAAK,EAAE,EAAE;wBACT,SAAS,EAAE,CAAC;wBACZ,SAAS,EAAE,WAAW,CAAC,SAAS;wBAChC,SAAS,EAAE,WAAW,CAAC,SAAS;qBACjC,CAAC;oBAEF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACvB,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;gBACtC,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAgB;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,QAAQ,EAAE,CAAC;YACb,0BAA0B;YAC1B,QAAQ,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnD,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,MAAM,QAAQ,GAAoB;gBAChC,GAAG,OAAO;gBACV,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,GAAW;QACpC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC5C,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,GAAY;QAChC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAQ,EAAE;YACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,QAAmB;QAC5C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAChC,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,GAAY;QAC7B,OAAO,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC9C,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG;YACX,qBAAqB,EAAE,CAAC;YACxB,gBAAgB,EAAE,CAAC;YACnB,kBAAkB,EAAE,CAAC;YACrB,qBAAqB,EAAE,CAAC;YACxB,sBAAsB,EAAE,CAAC;YACzB,oBAAoB,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAA0B,CAAC,CAAC;gBACzD,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/library/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/library/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pattern library with local persistence
|
|
3
|
+
* @traceability TSK-PATTERN-005, REQ-PATTERN-001-F005
|
|
4
|
+
*/
|
|
5
|
+
import type { Pattern, PatternLibraryConfig } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Pattern library manager with JSON persistence
|
|
8
|
+
*
|
|
9
|
+
* @description
|
|
10
|
+
* Manages pattern storage locally (no external communication).
|
|
11
|
+
* Supports CRUD operations and import/export.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PatternLibrary {
|
|
14
|
+
private patterns;
|
|
15
|
+
private config;
|
|
16
|
+
private dirty;
|
|
17
|
+
constructor(config?: Partial<PatternLibraryConfig>);
|
|
18
|
+
/**
|
|
19
|
+
* Load library from disk
|
|
20
|
+
*/
|
|
21
|
+
load(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Save library to disk
|
|
24
|
+
*/
|
|
25
|
+
save(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Add pattern to library
|
|
28
|
+
*/
|
|
29
|
+
add(pattern: Pattern): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get pattern by ID
|
|
32
|
+
*/
|
|
33
|
+
get(id: string): Pattern | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Update existing pattern
|
|
36
|
+
*/
|
|
37
|
+
update(id: string, updates: Partial<Pattern>): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Delete pattern
|
|
40
|
+
*/
|
|
41
|
+
delete(id: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* List all patterns
|
|
44
|
+
*/
|
|
45
|
+
list(): Pattern[];
|
|
46
|
+
/**
|
|
47
|
+
* Get pattern count
|
|
48
|
+
*/
|
|
49
|
+
get size(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Export library to JSON string
|
|
52
|
+
*/
|
|
53
|
+
export(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Import patterns from JSON string
|
|
56
|
+
*/
|
|
57
|
+
import(json: string): number;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=pattern-library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-library.d.ts","sourceRoot":"","sources":["../../src/library/pattern-library.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEjE;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAQtD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAS9B;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;IAetD;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ3B;;OAEG;IACH,IAAI,IAAI,OAAO,EAAE;IAIjB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,MAAM,IAAI,MAAM;IAQhB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAU7B"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pattern library with local persistence
|
|
3
|
+
* @traceability TSK-PATTERN-005, REQ-PATTERN-001-F005
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
6
|
+
import { dirname } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Pattern library manager with JSON persistence
|
|
9
|
+
*
|
|
10
|
+
* @description
|
|
11
|
+
* Manages pattern storage locally (no external communication).
|
|
12
|
+
* Supports CRUD operations and import/export.
|
|
13
|
+
*/
|
|
14
|
+
export class PatternLibrary {
|
|
15
|
+
patterns = new Map();
|
|
16
|
+
config;
|
|
17
|
+
dirty = false;
|
|
18
|
+
constructor(config = {}) {
|
|
19
|
+
this.config = {
|
|
20
|
+
storagePath: config.storagePath ?? './storage/patterns/library.json',
|
|
21
|
+
maxPatterns: config.maxPatterns ?? 10000,
|
|
22
|
+
enablePrivacyFilter: config.enablePrivacyFilter ?? true,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load library from disk
|
|
27
|
+
*/
|
|
28
|
+
async load() {
|
|
29
|
+
try {
|
|
30
|
+
const data = await readFile(this.config.storagePath, 'utf-8');
|
|
31
|
+
const parsed = JSON.parse(data);
|
|
32
|
+
this.patterns.clear();
|
|
33
|
+
for (const pattern of parsed.patterns) {
|
|
34
|
+
this.patterns.set(pattern.id, pattern);
|
|
35
|
+
}
|
|
36
|
+
this.dirty = false;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// File doesn't exist yet - start with empty library
|
|
40
|
+
this.patterns.clear();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Save library to disk
|
|
45
|
+
*/
|
|
46
|
+
async save() {
|
|
47
|
+
if (!this.dirty)
|
|
48
|
+
return;
|
|
49
|
+
const dir = dirname(this.config.storagePath);
|
|
50
|
+
await mkdir(dir, { recursive: true });
|
|
51
|
+
const data = {
|
|
52
|
+
version: '1.0.0',
|
|
53
|
+
updatedAt: new Date().toISOString(),
|
|
54
|
+
patterns: Array.from(this.patterns.values()),
|
|
55
|
+
};
|
|
56
|
+
await writeFile(this.config.storagePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
57
|
+
this.dirty = false;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Add pattern to library
|
|
61
|
+
*/
|
|
62
|
+
add(pattern) {
|
|
63
|
+
if (this.patterns.size >= this.config.maxPatterns) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
this.patterns.set(pattern.id, pattern);
|
|
67
|
+
this.dirty = true;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get pattern by ID
|
|
72
|
+
*/
|
|
73
|
+
get(id) {
|
|
74
|
+
return this.patterns.get(id);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Update existing pattern
|
|
78
|
+
*/
|
|
79
|
+
update(id, updates) {
|
|
80
|
+
const existing = this.patterns.get(id);
|
|
81
|
+
if (!existing)
|
|
82
|
+
return false;
|
|
83
|
+
const updated = {
|
|
84
|
+
...existing,
|
|
85
|
+
...updates,
|
|
86
|
+
id: existing.id, // ID cannot be changed
|
|
87
|
+
updatedAt: new Date().toISOString(),
|
|
88
|
+
};
|
|
89
|
+
this.patterns.set(id, updated);
|
|
90
|
+
this.dirty = true;
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Delete pattern
|
|
95
|
+
*/
|
|
96
|
+
delete(id) {
|
|
97
|
+
const deleted = this.patterns.delete(id);
|
|
98
|
+
if (deleted) {
|
|
99
|
+
this.dirty = true;
|
|
100
|
+
}
|
|
101
|
+
return deleted;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* List all patterns
|
|
105
|
+
*/
|
|
106
|
+
list() {
|
|
107
|
+
return Array.from(this.patterns.values());
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get pattern count
|
|
111
|
+
*/
|
|
112
|
+
get size() {
|
|
113
|
+
return this.patterns.size;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Export library to JSON string
|
|
117
|
+
*/
|
|
118
|
+
export() {
|
|
119
|
+
return JSON.stringify({
|
|
120
|
+
version: '1.0.0',
|
|
121
|
+
exportedAt: new Date().toISOString(),
|
|
122
|
+
patterns: Array.from(this.patterns.values()),
|
|
123
|
+
}, null, 2);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Import patterns from JSON string
|
|
127
|
+
*/
|
|
128
|
+
import(json) {
|
|
129
|
+
const data = JSON.parse(json);
|
|
130
|
+
let imported = 0;
|
|
131
|
+
for (const pattern of data.patterns) {
|
|
132
|
+
if (this.add(pattern)) {
|
|
133
|
+
imported++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return imported;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=pattern-library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-library.js","sourceRoot":"","sources":["../../src/library/pattern-library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/privacy/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/privacy/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Privacy filter for pattern library
|
|
3
|
+
* @traceability TSK-PATTERN-007, REQ-PATTERN-001-F007
|
|
4
|
+
*/
|
|
5
|
+
import type { Pattern, PrivacyFilterResult } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Privacy filter configuration
|
|
8
|
+
*/
|
|
9
|
+
export interface PrivacyFilterConfig {
|
|
10
|
+
/** Patterns for sensitive data (regex strings) */
|
|
11
|
+
sensitivePatterns: string[];
|
|
12
|
+
/** Whether to block external network calls */
|
|
13
|
+
blockExternalCommunication: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Privacy filter to prevent sensitive data leakage
|
|
17
|
+
*
|
|
18
|
+
* @description
|
|
19
|
+
* - Filters patterns containing sensitive information
|
|
20
|
+
* - Blocks all external network communication
|
|
21
|
+
* - All data stays local (Article: privacy protection)
|
|
22
|
+
*/
|
|
23
|
+
export declare class PrivacyFilter {
|
|
24
|
+
private config;
|
|
25
|
+
private sensitiveRegexes;
|
|
26
|
+
constructor(config?: Partial<PrivacyFilterConfig>);
|
|
27
|
+
/**
|
|
28
|
+
* Check if pattern contains sensitive data
|
|
29
|
+
*/
|
|
30
|
+
filter(pattern: Pattern): PrivacyFilterResult;
|
|
31
|
+
/**
|
|
32
|
+
* Recursively check AST for sensitive values
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
private findSensitiveValue;
|
|
36
|
+
/**
|
|
37
|
+
* Assert no external communication is allowed
|
|
38
|
+
* @throws Error if external communication is attempted
|
|
39
|
+
*/
|
|
40
|
+
assertNoExternalCommunication(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Check if external communication is blocked
|
|
43
|
+
*/
|
|
44
|
+
isExternalCommunicationBlocked(): boolean;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=privacy-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-filter.d.ts","sourceRoot":"","sources":["../../src/privacy/privacy-filter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,0BAA0B,EAAE,OAAO,CAAC;CACrC;AAwBD;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,gBAAgB,CAAW;gBAEvB,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAWrD;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB;IAuB7C;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;;OAGG;IACH,6BAA6B,IAAI,IAAI;IAOrC;;OAEG;IACH,8BAA8B,IAAI,OAAO;CAG1C"}
|