@danielsimonjr/memoryjs 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/LICENSE +22 -0
- package/README.md +266 -0
- package/dist/core/EntityManager.d.ts +268 -0
- package/dist/core/EntityManager.d.ts.map +1 -0
- package/dist/core/EntityManager.js +512 -0
- package/dist/core/EntityManager.js.map +1 -0
- package/dist/core/GraphEventEmitter.d.ts +202 -0
- package/dist/core/GraphEventEmitter.d.ts.map +1 -0
- package/dist/core/GraphEventEmitter.js +347 -0
- package/dist/core/GraphEventEmitter.js.map +1 -0
- package/dist/core/GraphStorage.d.ts +395 -0
- package/dist/core/GraphStorage.d.ts.map +1 -0
- package/dist/core/GraphStorage.js +786 -0
- package/dist/core/GraphStorage.js.map +1 -0
- package/dist/core/GraphTraversal.d.ts +141 -0
- package/dist/core/GraphTraversal.d.ts.map +1 -0
- package/dist/core/GraphTraversal.js +574 -0
- package/dist/core/GraphTraversal.js.map +1 -0
- package/dist/core/HierarchyManager.d.ts +111 -0
- package/dist/core/HierarchyManager.d.ts.map +1 -0
- package/dist/core/HierarchyManager.js +225 -0
- package/dist/core/HierarchyManager.js.map +1 -0
- package/dist/core/ManagerContext.d.ts +76 -0
- package/dist/core/ManagerContext.d.ts.map +1 -0
- package/dist/core/ManagerContext.js +129 -0
- package/dist/core/ManagerContext.js.map +1 -0
- package/dist/core/ObservationManager.d.ts +85 -0
- package/dist/core/ObservationManager.d.ts.map +1 -0
- package/dist/core/ObservationManager.js +124 -0
- package/dist/core/ObservationManager.js.map +1 -0
- package/dist/core/RelationManager.d.ts +131 -0
- package/dist/core/RelationManager.d.ts.map +1 -0
- package/dist/core/RelationManager.js +212 -0
- package/dist/core/RelationManager.js.map +1 -0
- package/dist/core/SQLiteStorage.d.ts +354 -0
- package/dist/core/SQLiteStorage.d.ts.map +1 -0
- package/dist/core/SQLiteStorage.js +919 -0
- package/dist/core/SQLiteStorage.js.map +1 -0
- package/dist/core/StorageFactory.d.ts +45 -0
- package/dist/core/StorageFactory.d.ts.map +1 -0
- package/dist/core/StorageFactory.js +65 -0
- package/dist/core/StorageFactory.js.map +1 -0
- package/dist/core/TransactionManager.d.ts +464 -0
- package/dist/core/TransactionManager.d.ts.map +1 -0
- package/dist/core/TransactionManager.js +869 -0
- package/dist/core/TransactionManager.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/features/AnalyticsManager.d.ts +44 -0
- package/dist/features/AnalyticsManager.d.ts.map +1 -0
- package/dist/features/AnalyticsManager.js +224 -0
- package/dist/features/AnalyticsManager.js.map +1 -0
- package/dist/features/ArchiveManager.d.ts +133 -0
- package/dist/features/ArchiveManager.d.ts.map +1 -0
- package/dist/features/ArchiveManager.js +282 -0
- package/dist/features/ArchiveManager.js.map +1 -0
- package/dist/features/CompressionManager.d.ts +119 -0
- package/dist/features/CompressionManager.d.ts.map +1 -0
- package/dist/features/CompressionManager.js +470 -0
- package/dist/features/CompressionManager.js.map +1 -0
- package/dist/features/IOManager.d.ts +225 -0
- package/dist/features/IOManager.d.ts.map +1 -0
- package/dist/features/IOManager.js +1093 -0
- package/dist/features/IOManager.js.map +1 -0
- package/dist/features/KeywordExtractor.d.ts +61 -0
- package/dist/features/KeywordExtractor.d.ts.map +1 -0
- package/dist/features/KeywordExtractor.js +127 -0
- package/dist/features/KeywordExtractor.js.map +1 -0
- package/dist/features/ObservationNormalizer.d.ts +90 -0
- package/dist/features/ObservationNormalizer.d.ts.map +1 -0
- package/dist/features/ObservationNormalizer.js +194 -0
- package/dist/features/ObservationNormalizer.js.map +1 -0
- package/dist/features/StreamingExporter.d.ts +128 -0
- package/dist/features/StreamingExporter.d.ts.map +1 -0
- package/dist/features/StreamingExporter.js +212 -0
- package/dist/features/StreamingExporter.js.map +1 -0
- package/dist/features/TagManager.d.ts +147 -0
- package/dist/features/TagManager.d.ts.map +1 -0
- package/dist/features/TagManager.js +211 -0
- package/dist/features/TagManager.js.map +1 -0
- package/dist/features/index.d.ts +14 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +15 -0
- package/dist/features/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/search/BM25Search.d.ts +148 -0
- package/dist/search/BM25Search.d.ts.map +1 -0
- package/dist/search/BM25Search.js +340 -0
- package/dist/search/BM25Search.js.map +1 -0
- package/dist/search/BasicSearch.d.ts +51 -0
- package/dist/search/BasicSearch.d.ts.map +1 -0
- package/dist/search/BasicSearch.js +138 -0
- package/dist/search/BasicSearch.js.map +1 -0
- package/dist/search/BooleanSearch.d.ts +98 -0
- package/dist/search/BooleanSearch.d.ts.map +1 -0
- package/dist/search/BooleanSearch.js +431 -0
- package/dist/search/BooleanSearch.js.map +1 -0
- package/dist/search/EarlyTerminationManager.d.ts +140 -0
- package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
- package/dist/search/EarlyTerminationManager.js +280 -0
- package/dist/search/EarlyTerminationManager.js.map +1 -0
- package/dist/search/EmbeddingCache.d.ts +175 -0
- package/dist/search/EmbeddingCache.d.ts.map +1 -0
- package/dist/search/EmbeddingCache.js +247 -0
- package/dist/search/EmbeddingCache.js.map +1 -0
- package/dist/search/EmbeddingService.d.ts +277 -0
- package/dist/search/EmbeddingService.d.ts.map +1 -0
- package/dist/search/EmbeddingService.js +531 -0
- package/dist/search/EmbeddingService.js.map +1 -0
- package/dist/search/FuzzySearch.d.ts +118 -0
- package/dist/search/FuzzySearch.d.ts.map +1 -0
- package/dist/search/FuzzySearch.js +313 -0
- package/dist/search/FuzzySearch.js.map +1 -0
- package/dist/search/HybridScorer.d.ts +181 -0
- package/dist/search/HybridScorer.d.ts.map +1 -0
- package/dist/search/HybridScorer.js +258 -0
- package/dist/search/HybridScorer.js.map +1 -0
- package/dist/search/HybridSearchManager.d.ts +80 -0
- package/dist/search/HybridSearchManager.d.ts.map +1 -0
- package/dist/search/HybridSearchManager.js +188 -0
- package/dist/search/HybridSearchManager.js.map +1 -0
- package/dist/search/IncrementalIndexer.d.ts +201 -0
- package/dist/search/IncrementalIndexer.d.ts.map +1 -0
- package/dist/search/IncrementalIndexer.js +343 -0
- package/dist/search/IncrementalIndexer.js.map +1 -0
- package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
- package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
- package/dist/search/OptimizedInvertedIndex.js +359 -0
- package/dist/search/OptimizedInvertedIndex.js.map +1 -0
- package/dist/search/ParallelSearchExecutor.d.ts +172 -0
- package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
- package/dist/search/ParallelSearchExecutor.js +310 -0
- package/dist/search/ParallelSearchExecutor.js.map +1 -0
- package/dist/search/QuantizedVectorStore.d.ts +171 -0
- package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
- package/dist/search/QuantizedVectorStore.js +308 -0
- package/dist/search/QuantizedVectorStore.js.map +1 -0
- package/dist/search/QueryAnalyzer.d.ts +76 -0
- package/dist/search/QueryAnalyzer.d.ts.map +1 -0
- package/dist/search/QueryAnalyzer.js +228 -0
- package/dist/search/QueryAnalyzer.js.map +1 -0
- package/dist/search/QueryCostEstimator.d.ts +244 -0
- package/dist/search/QueryCostEstimator.d.ts.map +1 -0
- package/dist/search/QueryCostEstimator.js +653 -0
- package/dist/search/QueryCostEstimator.js.map +1 -0
- package/dist/search/QueryPlanCache.d.ts +220 -0
- package/dist/search/QueryPlanCache.d.ts.map +1 -0
- package/dist/search/QueryPlanCache.js +380 -0
- package/dist/search/QueryPlanCache.js.map +1 -0
- package/dist/search/QueryPlanner.d.ts +58 -0
- package/dist/search/QueryPlanner.d.ts.map +1 -0
- package/dist/search/QueryPlanner.js +138 -0
- package/dist/search/QueryPlanner.js.map +1 -0
- package/dist/search/RankedSearch.d.ts +71 -0
- package/dist/search/RankedSearch.d.ts.map +1 -0
- package/dist/search/RankedSearch.js +239 -0
- package/dist/search/RankedSearch.js.map +1 -0
- package/dist/search/ReflectionManager.d.ts +120 -0
- package/dist/search/ReflectionManager.d.ts.map +1 -0
- package/dist/search/ReflectionManager.js +232 -0
- package/dist/search/ReflectionManager.js.map +1 -0
- package/dist/search/SavedSearchManager.d.ts +79 -0
- package/dist/search/SavedSearchManager.d.ts.map +1 -0
- package/dist/search/SavedSearchManager.js +147 -0
- package/dist/search/SavedSearchManager.js.map +1 -0
- package/dist/search/SearchFilterChain.d.ts +120 -0
- package/dist/search/SearchFilterChain.d.ts.map +1 -0
- package/dist/search/SearchFilterChain.js +186 -0
- package/dist/search/SearchFilterChain.js.map +1 -0
- package/dist/search/SearchManager.d.ts +326 -0
- package/dist/search/SearchManager.d.ts.map +1 -0
- package/dist/search/SearchManager.js +454 -0
- package/dist/search/SearchManager.js.map +1 -0
- package/dist/search/SearchSuggestions.d.ts +27 -0
- package/dist/search/SearchSuggestions.d.ts.map +1 -0
- package/dist/search/SearchSuggestions.js +58 -0
- package/dist/search/SearchSuggestions.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +149 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +324 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/search/SymbolicSearch.d.ts +61 -0
- package/dist/search/SymbolicSearch.d.ts.map +1 -0
- package/dist/search/SymbolicSearch.js +164 -0
- package/dist/search/SymbolicSearch.js.map +1 -0
- package/dist/search/TFIDFEventSync.d.ts +85 -0
- package/dist/search/TFIDFEventSync.d.ts.map +1 -0
- package/dist/search/TFIDFEventSync.js +134 -0
- package/dist/search/TFIDFEventSync.js.map +1 -0
- package/dist/search/TFIDFIndexManager.d.ts +151 -0
- package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
- package/dist/search/TFIDFIndexManager.js +433 -0
- package/dist/search/TFIDFIndexManager.js.map +1 -0
- package/dist/search/VectorStore.d.ts +235 -0
- package/dist/search/VectorStore.d.ts.map +1 -0
- package/dist/search/VectorStore.js +312 -0
- package/dist/search/VectorStore.js.map +1 -0
- package/dist/search/index.d.ts +35 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +53 -0
- package/dist/search/index.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/types.d.ts +1811 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +10 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/BatchProcessor.d.ts +271 -0
- package/dist/utils/BatchProcessor.d.ts.map +1 -0
- package/dist/utils/BatchProcessor.js +377 -0
- package/dist/utils/BatchProcessor.js.map +1 -0
- package/dist/utils/MemoryMonitor.d.ts +176 -0
- package/dist/utils/MemoryMonitor.d.ts.map +1 -0
- package/dist/utils/MemoryMonitor.js +306 -0
- package/dist/utils/MemoryMonitor.js.map +1 -0
- package/dist/utils/WorkerPoolManager.d.ts +233 -0
- package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
- package/dist/utils/WorkerPoolManager.js +421 -0
- package/dist/utils/WorkerPoolManager.js.map +1 -0
- package/dist/utils/compressedCache.d.ts +221 -0
- package/dist/utils/compressedCache.d.ts.map +1 -0
- package/dist/utils/compressedCache.js +349 -0
- package/dist/utils/compressedCache.js.map +1 -0
- package/dist/utils/compressionUtil.d.ts +214 -0
- package/dist/utils/compressionUtil.d.ts.map +1 -0
- package/dist/utils/compressionUtil.js +248 -0
- package/dist/utils/compressionUtil.js.map +1 -0
- package/dist/utils/constants.d.ts +245 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +253 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/entityUtils.d.ts +379 -0
- package/dist/utils/entityUtils.d.ts.map +1 -0
- package/dist/utils/entityUtils.js +649 -0
- package/dist/utils/entityUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +95 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +146 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatters.d.ts +145 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +133 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/index.d.ts +26 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +88 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/indexes.d.ts +270 -0
- package/dist/utils/indexes.d.ts.map +1 -0
- package/dist/utils/indexes.js +527 -0
- package/dist/utils/indexes.js.map +1 -0
- package/dist/utils/logger.d.ts +31 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operationUtils.d.ts +124 -0
- package/dist/utils/operationUtils.d.ts.map +1 -0
- package/dist/utils/operationUtils.js +176 -0
- package/dist/utils/operationUtils.js.map +1 -0
- package/dist/utils/parallelUtils.d.ts +76 -0
- package/dist/utils/parallelUtils.d.ts.map +1 -0
- package/dist/utils/parallelUtils.js +192 -0
- package/dist/utils/parallelUtils.js.map +1 -0
- package/dist/utils/schemas.d.ts +556 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +485 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/searchAlgorithms.d.ts +99 -0
- package/dist/utils/searchAlgorithms.d.ts.map +1 -0
- package/dist/utils/searchAlgorithms.js +168 -0
- package/dist/utils/searchAlgorithms.js.map +1 -0
- package/dist/utils/searchCache.d.ts +108 -0
- package/dist/utils/searchCache.d.ts.map +1 -0
- package/dist/utils/searchCache.js +210 -0
- package/dist/utils/searchCache.js.map +1 -0
- package/dist/utils/taskScheduler.d.ts +294 -0
- package/dist/utils/taskScheduler.d.ts.map +1 -0
- package/dist/utils/taskScheduler.js +487 -0
- package/dist/utils/taskScheduler.js.map +1 -0
- package/dist/workers/index.d.ts +12 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +10 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/levenshteinWorker.d.ts +60 -0
- package/dist/workers/levenshteinWorker.d.ts.map +1 -0
- package/dist/workers/levenshteinWorker.js +99 -0
- package/dist/workers/levenshteinWorker.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbolic Search Layer
|
|
3
|
+
*
|
|
4
|
+
* Phase 11: Provides metadata-based filtering using structured predicates.
|
|
5
|
+
* Part of the three-layer hybrid search architecture.
|
|
6
|
+
*
|
|
7
|
+
* @module search/SymbolicSearch
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Symbolic Search provides metadata-based filtering.
|
|
11
|
+
*
|
|
12
|
+
* Filters entities using structured predicates on tags, types,
|
|
13
|
+
* dates, importance, and hierarchy.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const symbolic = new SymbolicSearch();
|
|
18
|
+
* const results = symbolic.search(entities, {
|
|
19
|
+
* tags: ['important'],
|
|
20
|
+
* entityTypes: ['person'],
|
|
21
|
+
* importance: { min: 5 }
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class SymbolicSearch {
|
|
26
|
+
/**
|
|
27
|
+
* Filter entities using structured metadata predicates.
|
|
28
|
+
* All filters are AND-combined.
|
|
29
|
+
*
|
|
30
|
+
* @param entities - Entities to filter
|
|
31
|
+
* @param filters - Symbolic filter criteria
|
|
32
|
+
* @returns Filtered entities with match scores
|
|
33
|
+
*/
|
|
34
|
+
search(entities, filters) {
|
|
35
|
+
const results = [];
|
|
36
|
+
for (const entity of entities) {
|
|
37
|
+
const { matches, score, matchedFilters } = this.evaluateFilters(entity, filters);
|
|
38
|
+
if (matches) {
|
|
39
|
+
results.push({ entity, score, matchedFilters });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Sort by score descending
|
|
43
|
+
return results.sort((a, b) => b.score - a.score);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Evaluate all filters against an entity.
|
|
47
|
+
*/
|
|
48
|
+
evaluateFilters(entity, filters) {
|
|
49
|
+
const matchedFilters = [];
|
|
50
|
+
let totalFilters = 0;
|
|
51
|
+
let matchedCount = 0;
|
|
52
|
+
// Tag filter
|
|
53
|
+
if (filters.tags && filters.tags.length > 0) {
|
|
54
|
+
totalFilters++;
|
|
55
|
+
const entityTags = entity.tags ?? [];
|
|
56
|
+
const matchingTags = filters.tags.filter((t) => entityTags.some((et) => et.toLowerCase() === t.toLowerCase()));
|
|
57
|
+
if (matchingTags.length > 0) {
|
|
58
|
+
matchedCount++;
|
|
59
|
+
matchedFilters.push(`tags:${matchingTags.join(',')}`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return { matches: false, score: 0, matchedFilters: [] };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Entity type filter
|
|
66
|
+
if (filters.entityTypes && filters.entityTypes.length > 0) {
|
|
67
|
+
totalFilters++;
|
|
68
|
+
if (filters.entityTypes.some((t) => t.toLowerCase() === entity.entityType.toLowerCase())) {
|
|
69
|
+
matchedCount++;
|
|
70
|
+
matchedFilters.push(`type:${entity.entityType}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return { matches: false, score: 0, matchedFilters: [] };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Date range filter
|
|
77
|
+
if (filters.dateRange) {
|
|
78
|
+
totalFilters++;
|
|
79
|
+
const entityDate = entity.createdAt || entity.lastModified;
|
|
80
|
+
if (!entityDate) {
|
|
81
|
+
// Entities without dates are excluded when date filter is applied
|
|
82
|
+
return { matches: false, score: 0, matchedFilters: [] };
|
|
83
|
+
}
|
|
84
|
+
const date = new Date(entityDate);
|
|
85
|
+
const start = filters.dateRange.start ? new Date(filters.dateRange.start) : null;
|
|
86
|
+
const end = filters.dateRange.end ? new Date(filters.dateRange.end) : null;
|
|
87
|
+
const inRange = (!start || date >= start) && (!end || date <= end);
|
|
88
|
+
if (inRange) {
|
|
89
|
+
matchedCount++;
|
|
90
|
+
matchedFilters.push('dateRange');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return { matches: false, score: 0, matchedFilters: [] };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Importance filter
|
|
97
|
+
if (filters.importance) {
|
|
98
|
+
totalFilters++;
|
|
99
|
+
const importance = entity.importance ?? 5;
|
|
100
|
+
const { min, max } = filters.importance;
|
|
101
|
+
const inRange = (min === undefined || importance >= min) &&
|
|
102
|
+
(max === undefined || importance <= max);
|
|
103
|
+
if (inRange) {
|
|
104
|
+
matchedCount++;
|
|
105
|
+
matchedFilters.push(`importance:${importance}`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
return { matches: false, score: 0, matchedFilters: [] };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Parent filter
|
|
112
|
+
if (filters.parentId !== undefined) {
|
|
113
|
+
totalFilters++;
|
|
114
|
+
if (entity.parentId === filters.parentId) {
|
|
115
|
+
matchedCount++;
|
|
116
|
+
matchedFilters.push(`parent:${filters.parentId}`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return { matches: false, score: 0, matchedFilters: [] };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Has observations filter
|
|
123
|
+
if (filters.hasObservations !== undefined) {
|
|
124
|
+
totalFilters++;
|
|
125
|
+
const hasObs = entity.observations.length > 0;
|
|
126
|
+
if (hasObs === filters.hasObservations) {
|
|
127
|
+
matchedCount++;
|
|
128
|
+
matchedFilters.push('hasObservations');
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
return { matches: false, score: 0, matchedFilters: [] };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// If no filters specified, match all with base score
|
|
135
|
+
if (totalFilters === 0) {
|
|
136
|
+
return { matches: true, score: 0.5, matchedFilters: [] };
|
|
137
|
+
}
|
|
138
|
+
// Score based on proportion of filters matched
|
|
139
|
+
const score = matchedCount / totalFilters;
|
|
140
|
+
return { matches: true, score, matchedFilters };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get entities matching a specific tag.
|
|
144
|
+
*/
|
|
145
|
+
byTag(entities, tag) {
|
|
146
|
+
return entities.filter(e => e.tags?.some(t => t.toLowerCase() === tag.toLowerCase()));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get entities of a specific type.
|
|
150
|
+
*/
|
|
151
|
+
byType(entities, entityType) {
|
|
152
|
+
return entities.filter(e => e.entityType.toLowerCase() === entityType.toLowerCase());
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get entities within importance range.
|
|
156
|
+
*/
|
|
157
|
+
byImportance(entities, min, max) {
|
|
158
|
+
return entities.filter(e => {
|
|
159
|
+
const imp = e.importance ?? 5;
|
|
160
|
+
return imp >= min && imp <= max;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=SymbolicSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolicSearch.js","sourceRoot":"","sources":["../../src/search/SymbolicSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TF-IDF Event Sync
|
|
3
|
+
*
|
|
4
|
+
* Phase 10 Sprint 3: Hooks TFIDFIndexManager to graph events for automatic
|
|
5
|
+
* incremental index updates when entities change.
|
|
6
|
+
*
|
|
7
|
+
* @module search/TFIDFEventSync
|
|
8
|
+
*/
|
|
9
|
+
import type { GraphEventEmitter } from '../core/GraphEventEmitter.js';
|
|
10
|
+
import type { TFIDFIndexManager } from './TFIDFIndexManager.js';
|
|
11
|
+
import type { IGraphStorage } from '../types/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Phase 10 Sprint 3: Synchronizes TF-IDF index with graph changes via events.
|
|
14
|
+
*
|
|
15
|
+
* Listens to graph events and triggers incremental index updates automatically.
|
|
16
|
+
* More efficient than rebuilding the entire index on every change.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const storage = new GraphStorage('/data/memory.jsonl');
|
|
21
|
+
* const indexManager = new TFIDFIndexManager('/data');
|
|
22
|
+
*
|
|
23
|
+
* // Load or build index
|
|
24
|
+
* await indexManager.loadIndex();
|
|
25
|
+
*
|
|
26
|
+
* // Enable automatic sync
|
|
27
|
+
* const sync = new TFIDFEventSync(indexManager, storage.events, storage);
|
|
28
|
+
* sync.enable();
|
|
29
|
+
*
|
|
30
|
+
* // Now entities added to storage will automatically update the index
|
|
31
|
+
* await storage.appendEntity({ name: 'New', entityType: 'test', observations: [] });
|
|
32
|
+
*
|
|
33
|
+
* // Disable when done
|
|
34
|
+
* sync.disable();
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class TFIDFEventSync {
|
|
38
|
+
private indexManager;
|
|
39
|
+
private eventEmitter;
|
|
40
|
+
private storage;
|
|
41
|
+
private unsubscribers;
|
|
42
|
+
private enabled;
|
|
43
|
+
/**
|
|
44
|
+
* Create a new TFIDFEventSync instance.
|
|
45
|
+
*
|
|
46
|
+
* @param indexManager - TFIDFIndexManager to sync
|
|
47
|
+
* @param eventEmitter - GraphEventEmitter to listen to
|
|
48
|
+
* @param storage - Storage to fetch entity data from (for updates)
|
|
49
|
+
*/
|
|
50
|
+
constructor(indexManager: TFIDFIndexManager, eventEmitter: GraphEventEmitter, storage: IGraphStorage);
|
|
51
|
+
/**
|
|
52
|
+
* Enable automatic index synchronization.
|
|
53
|
+
*
|
|
54
|
+
* Subscribes to entity:created, entity:updated, and entity:deleted events.
|
|
55
|
+
*/
|
|
56
|
+
enable(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Disable automatic index synchronization.
|
|
59
|
+
*
|
|
60
|
+
* Unsubscribes from all events.
|
|
61
|
+
*/
|
|
62
|
+
disable(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Check if synchronization is enabled.
|
|
65
|
+
*
|
|
66
|
+
* @returns True if enabled
|
|
67
|
+
*/
|
|
68
|
+
isEnabled(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Handle entity:created event.
|
|
71
|
+
* @private
|
|
72
|
+
*/
|
|
73
|
+
private handleEntityCreated;
|
|
74
|
+
/**
|
|
75
|
+
* Handle entity:updated event.
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
private handleEntityUpdated;
|
|
79
|
+
/**
|
|
80
|
+
* Handle entity:deleted event.
|
|
81
|
+
* @private
|
|
82
|
+
*/
|
|
83
|
+
private handleEntityDeleted;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=TFIDFEventSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TFIDFEventSync.d.ts","sourceRoot":"","sources":["../../src/search/TFIDFEventSync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOvD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,OAAO,CAAkB;IAEjC;;;;;;OAMG;gBAED,YAAY,EAAE,iBAAiB,EAC/B,YAAY,EAAE,iBAAiB,EAC/B,OAAO,EAAE,aAAa;IAOxB;;;;OAIG;IACH,MAAM,IAAI,IAAI;IAqBd;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAYf;;;;OAIG;IACH,SAAS,IAAI,OAAO;IAIpB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;OAGG;YACW,mBAAmB;IAkBjC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAO5B"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TF-IDF Event Sync
|
|
3
|
+
*
|
|
4
|
+
* Phase 10 Sprint 3: Hooks TFIDFIndexManager to graph events for automatic
|
|
5
|
+
* incremental index updates when entities change.
|
|
6
|
+
*
|
|
7
|
+
* @module search/TFIDFEventSync
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Phase 10 Sprint 3: Synchronizes TF-IDF index with graph changes via events.
|
|
11
|
+
*
|
|
12
|
+
* Listens to graph events and triggers incremental index updates automatically.
|
|
13
|
+
* More efficient than rebuilding the entire index on every change.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const storage = new GraphStorage('/data/memory.jsonl');
|
|
18
|
+
* const indexManager = new TFIDFIndexManager('/data');
|
|
19
|
+
*
|
|
20
|
+
* // Load or build index
|
|
21
|
+
* await indexManager.loadIndex();
|
|
22
|
+
*
|
|
23
|
+
* // Enable automatic sync
|
|
24
|
+
* const sync = new TFIDFEventSync(indexManager, storage.events, storage);
|
|
25
|
+
* sync.enable();
|
|
26
|
+
*
|
|
27
|
+
* // Now entities added to storage will automatically update the index
|
|
28
|
+
* await storage.appendEntity({ name: 'New', entityType: 'test', observations: [] });
|
|
29
|
+
*
|
|
30
|
+
* // Disable when done
|
|
31
|
+
* sync.disable();
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export class TFIDFEventSync {
|
|
35
|
+
indexManager;
|
|
36
|
+
eventEmitter;
|
|
37
|
+
storage;
|
|
38
|
+
unsubscribers = [];
|
|
39
|
+
enabled = false;
|
|
40
|
+
/**
|
|
41
|
+
* Create a new TFIDFEventSync instance.
|
|
42
|
+
*
|
|
43
|
+
* @param indexManager - TFIDFIndexManager to sync
|
|
44
|
+
* @param eventEmitter - GraphEventEmitter to listen to
|
|
45
|
+
* @param storage - Storage to fetch entity data from (for updates)
|
|
46
|
+
*/
|
|
47
|
+
constructor(indexManager, eventEmitter, storage) {
|
|
48
|
+
this.indexManager = indexManager;
|
|
49
|
+
this.eventEmitter = eventEmitter;
|
|
50
|
+
this.storage = storage;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Enable automatic index synchronization.
|
|
54
|
+
*
|
|
55
|
+
* Subscribes to entity:created, entity:updated, and entity:deleted events.
|
|
56
|
+
*/
|
|
57
|
+
enable() {
|
|
58
|
+
if (this.enabled) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Subscribe to entity events
|
|
62
|
+
this.unsubscribers.push(this.eventEmitter.on('entity:created', this.handleEntityCreated.bind(this)));
|
|
63
|
+
this.unsubscribers.push(this.eventEmitter.on('entity:updated', this.handleEntityUpdated.bind(this)));
|
|
64
|
+
this.unsubscribers.push(this.eventEmitter.on('entity:deleted', this.handleEntityDeleted.bind(this)));
|
|
65
|
+
this.enabled = true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Disable automatic index synchronization.
|
|
69
|
+
*
|
|
70
|
+
* Unsubscribes from all events.
|
|
71
|
+
*/
|
|
72
|
+
disable() {
|
|
73
|
+
if (!this.enabled) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
for (const unsubscribe of this.unsubscribers) {
|
|
77
|
+
unsubscribe();
|
|
78
|
+
}
|
|
79
|
+
this.unsubscribers = [];
|
|
80
|
+
this.enabled = false;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if synchronization is enabled.
|
|
84
|
+
*
|
|
85
|
+
* @returns True if enabled
|
|
86
|
+
*/
|
|
87
|
+
isEnabled() {
|
|
88
|
+
return this.enabled;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Handle entity:created event.
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
handleEntityCreated(event) {
|
|
95
|
+
if (!this.indexManager.isInitialized()) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.indexManager.addDocument({
|
|
99
|
+
name: event.entity.name,
|
|
100
|
+
entityType: event.entity.entityType,
|
|
101
|
+
observations: event.entity.observations,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Handle entity:updated event.
|
|
106
|
+
* @private
|
|
107
|
+
*/
|
|
108
|
+
async handleEntityUpdated(event) {
|
|
109
|
+
if (!this.indexManager.isInitialized()) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Fetch the current entity state
|
|
113
|
+
const graph = await this.storage.loadGraph();
|
|
114
|
+
const entity = graph.entities.find(e => e.name === event.entityName);
|
|
115
|
+
if (entity) {
|
|
116
|
+
this.indexManager.updateDocument({
|
|
117
|
+
name: entity.name,
|
|
118
|
+
entityType: entity.entityType,
|
|
119
|
+
observations: entity.observations,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Handle entity:deleted event.
|
|
125
|
+
* @private
|
|
126
|
+
*/
|
|
127
|
+
handleEntityDeleted(event) {
|
|
128
|
+
if (!this.indexManager.isInitialized()) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.indexManager.removeDocument(event.entityName);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=TFIDFEventSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TFIDFEventSync.js","sourceRoot":"","sources":["../../src/search/TFIDFEventSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TF-IDF Index Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages pre-calculated TF-IDF indexes for fast ranked search.
|
|
5
|
+
* Handles index building, incremental updates, and persistence.
|
|
6
|
+
*
|
|
7
|
+
* @module search/TFIDFIndexManager
|
|
8
|
+
*/
|
|
9
|
+
import type { TFIDFIndex, KnowledgeGraph, ReadonlyKnowledgeGraph } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Manages TF-IDF index lifecycle: building, updating, and persistence.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TFIDFIndexManager {
|
|
14
|
+
private indexPath;
|
|
15
|
+
private index;
|
|
16
|
+
constructor(storageDir: string);
|
|
17
|
+
/**
|
|
18
|
+
* Build a complete TF-IDF index from a knowledge graph.
|
|
19
|
+
*
|
|
20
|
+
* @param graph - Knowledge graph to index
|
|
21
|
+
* @returns Newly built TF-IDF index
|
|
22
|
+
*/
|
|
23
|
+
buildIndex(graph: ReadonlyKnowledgeGraph): Promise<TFIDFIndex>;
|
|
24
|
+
/**
|
|
25
|
+
* Update the index incrementally when entities change.
|
|
26
|
+
*
|
|
27
|
+
* More efficient than rebuilding the entire index.
|
|
28
|
+
*
|
|
29
|
+
* @param graph - Updated knowledge graph
|
|
30
|
+
* @param changedEntityNames - Names of entities that changed
|
|
31
|
+
*/
|
|
32
|
+
updateIndex(graph: ReadonlyKnowledgeGraph, changedEntityNames: Set<string>): Promise<TFIDFIndex>;
|
|
33
|
+
/**
|
|
34
|
+
* Load index from disk.
|
|
35
|
+
*
|
|
36
|
+
* @returns Loaded index or null if not found
|
|
37
|
+
*/
|
|
38
|
+
loadIndex(): Promise<TFIDFIndex | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Save index to disk.
|
|
41
|
+
*
|
|
42
|
+
* @param index - Index to save (uses cached index if not provided)
|
|
43
|
+
*/
|
|
44
|
+
saveIndex(index?: TFIDFIndex): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get the current cached index.
|
|
47
|
+
*
|
|
48
|
+
* @returns Cached index or null if not loaded
|
|
49
|
+
*/
|
|
50
|
+
getIndex(): TFIDFIndex | null;
|
|
51
|
+
/**
|
|
52
|
+
* Clear the cached index and delete from disk.
|
|
53
|
+
*/
|
|
54
|
+
clearIndex(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Check if the index needs rebuilding based on graph state.
|
|
57
|
+
*
|
|
58
|
+
* @param graph - Current knowledge graph
|
|
59
|
+
* @returns True if index should be rebuilt
|
|
60
|
+
*/
|
|
61
|
+
needsRebuild(graph: KnowledgeGraph): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Phase 10 Sprint 3: Add a single document to the index incrementally.
|
|
64
|
+
*
|
|
65
|
+
* More efficient than rebuilding the entire index for single entity additions.
|
|
66
|
+
* Updates TF for the new document and recalculates IDF for affected terms.
|
|
67
|
+
*
|
|
68
|
+
* @param entity - The entity to add
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const indexManager = new TFIDFIndexManager('/data');
|
|
73
|
+
* await indexManager.loadIndex();
|
|
74
|
+
*
|
|
75
|
+
* // Add new entity
|
|
76
|
+
* indexManager.addDocument({
|
|
77
|
+
* name: 'NewEntity',
|
|
78
|
+
* entityType: 'person',
|
|
79
|
+
* observations: ['Software engineer']
|
|
80
|
+
* });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
addDocument(entity: {
|
|
84
|
+
name: string;
|
|
85
|
+
entityType: string;
|
|
86
|
+
observations: string[];
|
|
87
|
+
}): void;
|
|
88
|
+
/**
|
|
89
|
+
* Phase 10 Sprint 3: Remove a single document from the index incrementally.
|
|
90
|
+
*
|
|
91
|
+
* More efficient than rebuilding the entire index for single entity deletions.
|
|
92
|
+
* Recalculates IDF for terms that were in the removed document.
|
|
93
|
+
*
|
|
94
|
+
* @param entityName - Name of the entity to remove
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* indexManager.removeDocument('DeletedEntity');
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
removeDocument(entityName: string): void;
|
|
102
|
+
/**
|
|
103
|
+
* Phase 10 Sprint 3: Update a single document in the index incrementally.
|
|
104
|
+
*
|
|
105
|
+
* More efficient than rebuilding the entire index for single entity updates.
|
|
106
|
+
* Handles both term changes and observation updates.
|
|
107
|
+
*
|
|
108
|
+
* @param entity - The updated entity
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* indexManager.updateDocument({
|
|
113
|
+
* name: 'ExistingEntity',
|
|
114
|
+
* entityType: 'person',
|
|
115
|
+
* observations: ['Updated observations']
|
|
116
|
+
* });
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
updateDocument(entity: {
|
|
120
|
+
name: string;
|
|
121
|
+
entityType: string;
|
|
122
|
+
observations: string[];
|
|
123
|
+
}): void;
|
|
124
|
+
/**
|
|
125
|
+
* Phase 10 Sprint 3: Recalculate IDF scores for a set of terms.
|
|
126
|
+
*
|
|
127
|
+
* @param terms - Set of terms to recalculate IDF for
|
|
128
|
+
* @private
|
|
129
|
+
*/
|
|
130
|
+
private recalculateIDFForTerms;
|
|
131
|
+
/**
|
|
132
|
+
* Phase 10 Sprint 3: Recalculate IDF scores for ALL terms in the index.
|
|
133
|
+
*
|
|
134
|
+
* Called when the total document count changes (add/remove document).
|
|
135
|
+
* @private
|
|
136
|
+
*/
|
|
137
|
+
private recalculateAllIDF;
|
|
138
|
+
/**
|
|
139
|
+
* Phase 10 Sprint 3: Check if the index is loaded/initialized.
|
|
140
|
+
*
|
|
141
|
+
* @returns True if index is available
|
|
142
|
+
*/
|
|
143
|
+
isInitialized(): boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Phase 10 Sprint 3: Get the number of documents in the index.
|
|
146
|
+
*
|
|
147
|
+
* @returns Document count or 0 if not initialized
|
|
148
|
+
*/
|
|
149
|
+
getDocumentCount(): number;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=TFIDFIndexManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TFIDFIndexManager.d.ts","sourceRoot":"","sources":["../../src/search/TFIDFIndexManager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAkB,cAAc,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAgB5G;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA2B;gBAE5B,UAAU,EAAE,MAAM;IAI9B;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgDpE;;;;;;;OAOG;IACG,WAAW,CAAC,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAgEtG;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAmB7C;;;;OAIG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlD;;;;OAIG;IACH,QAAQ,IAAI,UAAU,GAAG,IAAI;IAI7B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO;IAsB5C;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IA+BvF;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAqBxC;;;;;;;;;;;;;;;;OAgBG;IACH,cAAc,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAgD1F;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAkC9B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;;;OAIG;IACH,aAAa,IAAI,OAAO;IAIxB;;;;OAIG;IACH,gBAAgB,IAAI,MAAM;CAG3B"}
|