@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,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Planner
|
|
3
|
+
*
|
|
4
|
+
* Phase 11: Generates execution plans for queries based on analysis.
|
|
5
|
+
*
|
|
6
|
+
* @module search/QueryPlanner
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Query Planner generates execution plans from query analysis.
|
|
10
|
+
*
|
|
11
|
+
* Creates optimized plans that:
|
|
12
|
+
* - Select appropriate search layers
|
|
13
|
+
* - Determine execution strategy (parallel/sequential)
|
|
14
|
+
* - Set up query dependencies
|
|
15
|
+
* - Configure merge strategies
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const analyzer = new QueryAnalyzer();
|
|
20
|
+
* const planner = new QueryPlanner();
|
|
21
|
+
*
|
|
22
|
+
* const analysis = analyzer.analyze('Find projects by Alice');
|
|
23
|
+
* const plan = planner.createPlan('Find projects by Alice', analysis);
|
|
24
|
+
* // { originalQuery: '...', subQueries: [...], executionStrategy: 'iterative', ... }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class QueryPlanner {
|
|
28
|
+
/**
|
|
29
|
+
* Create an execution plan from query analysis.
|
|
30
|
+
*/
|
|
31
|
+
createPlan(query, analysis) {
|
|
32
|
+
const subQueries = this.createSubQueries(query, analysis);
|
|
33
|
+
const executionStrategy = this.selectExecutionStrategy(subQueries);
|
|
34
|
+
const mergeStrategy = this.selectMergeStrategy(analysis);
|
|
35
|
+
return {
|
|
36
|
+
originalQuery: query,
|
|
37
|
+
subQueries,
|
|
38
|
+
executionStrategy,
|
|
39
|
+
mergeStrategy,
|
|
40
|
+
estimatedComplexity: this.calculateComplexity(subQueries),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create sub-queries from analysis.
|
|
45
|
+
*/
|
|
46
|
+
createSubQueries(query, analysis) {
|
|
47
|
+
const subQueries = [];
|
|
48
|
+
let id = 0;
|
|
49
|
+
// If query was decomposed, create sub-query for each part
|
|
50
|
+
if (analysis.subQueries && analysis.subQueries.length > 1) {
|
|
51
|
+
for (const sq of analysis.subQueries) {
|
|
52
|
+
subQueries.push({
|
|
53
|
+
id: `sq_${id++}`,
|
|
54
|
+
query: sq,
|
|
55
|
+
targetLayer: this.selectLayer(analysis),
|
|
56
|
+
priority: id === 1 ? 1 : 2,
|
|
57
|
+
dependsOn: id > 1 ? [`sq_${id - 2}`] : undefined,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Single query
|
|
63
|
+
subQueries.push({
|
|
64
|
+
id: `sq_${id}`,
|
|
65
|
+
query,
|
|
66
|
+
targetLayer: this.selectLayer(analysis),
|
|
67
|
+
priority: 1,
|
|
68
|
+
filters: this.buildFilters(analysis),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return subQueries;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Select the most appropriate search layer.
|
|
75
|
+
*/
|
|
76
|
+
selectLayer(analysis) {
|
|
77
|
+
// Use symbolic for tag/type/date filtered queries
|
|
78
|
+
if (analysis.temporalRange || analysis.requiredInfoTypes.includes('temporal')) {
|
|
79
|
+
return 'symbolic';
|
|
80
|
+
}
|
|
81
|
+
// Use semantic for complex concept queries
|
|
82
|
+
if (analysis.complexity === 'high' || analysis.questionType === 'comparative') {
|
|
83
|
+
return 'semantic';
|
|
84
|
+
}
|
|
85
|
+
// Use hybrid for balanced approach
|
|
86
|
+
return 'hybrid';
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Select execution strategy based on sub-queries.
|
|
90
|
+
*/
|
|
91
|
+
selectExecutionStrategy(subQueries) {
|
|
92
|
+
const hasDependencies = subQueries.some(sq => sq.dependsOn && sq.dependsOn.length > 0);
|
|
93
|
+
if (hasDependencies)
|
|
94
|
+
return 'sequential';
|
|
95
|
+
if (subQueries.length > 1)
|
|
96
|
+
return 'parallel';
|
|
97
|
+
return 'iterative';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Select merge strategy based on question type.
|
|
101
|
+
*/
|
|
102
|
+
selectMergeStrategy(analysis) {
|
|
103
|
+
switch (analysis.questionType) {
|
|
104
|
+
case 'aggregation': return 'union';
|
|
105
|
+
case 'comparative': return 'intersection';
|
|
106
|
+
default: return 'weighted';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Build symbolic filters from analysis.
|
|
111
|
+
*/
|
|
112
|
+
buildFilters(analysis) {
|
|
113
|
+
const filters = {};
|
|
114
|
+
let hasFilters = false;
|
|
115
|
+
if (analysis.temporalRange) {
|
|
116
|
+
filters.dateRange = {
|
|
117
|
+
start: analysis.temporalRange.start || '',
|
|
118
|
+
end: analysis.temporalRange.end || '',
|
|
119
|
+
};
|
|
120
|
+
hasFilters = true;
|
|
121
|
+
}
|
|
122
|
+
return hasFilters ? filters : undefined;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Calculate plan complexity score.
|
|
126
|
+
*/
|
|
127
|
+
calculateComplexity(subQueries) {
|
|
128
|
+
let complexity = subQueries.length;
|
|
129
|
+
for (const sq of subQueries) {
|
|
130
|
+
if (sq.dependsOn)
|
|
131
|
+
complexity += sq.dependsOn.length * 0.5;
|
|
132
|
+
if (sq.filters)
|
|
133
|
+
complexity += 0.5;
|
|
134
|
+
}
|
|
135
|
+
return Math.min(complexity, 10);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=QueryPlanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryPlanner.js","sourceRoot":"","sources":["../../src/search/QueryPlanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranked Search
|
|
3
|
+
*
|
|
4
|
+
* TF-IDF relevance-based search with scoring and pre-calculated indexes.
|
|
5
|
+
*
|
|
6
|
+
* @module search/RankedSearch
|
|
7
|
+
*/
|
|
8
|
+
import type { SearchResult } from '../types/index.js';
|
|
9
|
+
import type { GraphStorage } from '../core/GraphStorage.js';
|
|
10
|
+
/**
|
|
11
|
+
* Performs TF-IDF ranked search with optional pre-calculated indexes.
|
|
12
|
+
*/
|
|
13
|
+
export declare class RankedSearch {
|
|
14
|
+
private storage;
|
|
15
|
+
private indexManager;
|
|
16
|
+
/**
|
|
17
|
+
* Phase 4 Sprint 2: Fallback token cache for entities.
|
|
18
|
+
* Maps entity name -> pre-tokenized entity data.
|
|
19
|
+
* Invalidated when graph changes (detected by entity count mismatch).
|
|
20
|
+
*/
|
|
21
|
+
private fallbackTokenCache;
|
|
22
|
+
private cachedEntityCount;
|
|
23
|
+
constructor(storage: GraphStorage, storageDir?: string);
|
|
24
|
+
/**
|
|
25
|
+
* Phase 4 Sprint 2: Clear the fallback token cache.
|
|
26
|
+
* Called when graph changes are detected or explicitly by external code.
|
|
27
|
+
*/
|
|
28
|
+
clearTokenCache(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Initialize and build the TF-IDF index for fast searches.
|
|
31
|
+
*
|
|
32
|
+
* Should be called after graph changes to keep index up-to-date.
|
|
33
|
+
*/
|
|
34
|
+
buildIndex(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Update the index incrementally after entity changes.
|
|
37
|
+
*
|
|
38
|
+
* @param changedEntityNames - Names of entities that were created, updated, or deleted
|
|
39
|
+
*/
|
|
40
|
+
updateIndex(changedEntityNames: Set<string>): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Load the TF-IDF index from disk if available.
|
|
43
|
+
*/
|
|
44
|
+
private ensureIndexLoaded;
|
|
45
|
+
/**
|
|
46
|
+
* Search with TF-IDF relevance ranking.
|
|
47
|
+
*
|
|
48
|
+
* Uses pre-calculated index if available, falls back to on-the-fly calculation.
|
|
49
|
+
*
|
|
50
|
+
* @param query - Search query
|
|
51
|
+
* @param tags - Optional tags filter
|
|
52
|
+
* @param minImportance - Optional minimum importance
|
|
53
|
+
* @param maxImportance - Optional maximum importance
|
|
54
|
+
* @param limit - Maximum results to return (default 50, max 200)
|
|
55
|
+
* @returns Array of search results sorted by relevance
|
|
56
|
+
*/
|
|
57
|
+
searchNodesRanked(query: string, tags?: string[], minImportance?: number, maxImportance?: number, limit?: number): Promise<SearchResult[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Search using pre-calculated TF-IDF index (fast path).
|
|
60
|
+
*/
|
|
61
|
+
private searchWithIndex;
|
|
62
|
+
/**
|
|
63
|
+
* Search without index (on-the-fly calculation, slow path).
|
|
64
|
+
*
|
|
65
|
+
* OPTIMIZED: Phase 4 Sprint 2 - Uses fallback token cache to avoid
|
|
66
|
+
* repeated tokenization of entities. Pre-tokenizes all documents once
|
|
67
|
+
* and caches for subsequent searches.
|
|
68
|
+
*/
|
|
69
|
+
private searchWithoutIndex;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=RankedSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RankedSearch.d.ts","sourceRoot":"","sources":["../../src/search/RankedSearch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAU,YAAY,EAA+B,MAAM,mBAAmB,CAAC;AAC3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAM5D;;GAEG;AACH,qBAAa,YAAY;IAYrB,OAAO,CAAC,OAAO;IAXjB,OAAO,CAAC,YAAY,CAAkC;IAEtD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAA2C;IACrE,OAAO,CAAC,iBAAiB,CAAa;gBAG5B,OAAO,EAAE,YAAY,EAC7B,UAAU,CAAC,EAAE,MAAM;IAQrB;;;OAGG;IACH,eAAe,IAAI,IAAI;IAKvB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC;;;;OAIG;IACG,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE;;OAEG;YACW,iBAAiB;IAe/B;;;;;;;;;;;OAWG;IACG,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,KAAK,GAAE,MAA8B,GACpC,OAAO,CAAC,YAAY,EAAE,CAAC;IAsB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAgEvB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;CAqF3B"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranked Search
|
|
3
|
+
*
|
|
4
|
+
* TF-IDF relevance-based search with scoring and pre-calculated indexes.
|
|
5
|
+
*
|
|
6
|
+
* @module search/RankedSearch
|
|
7
|
+
*/
|
|
8
|
+
import { calculateTF, calculateIDFFromTokenSets, tokenize } from '../utils/index.js';
|
|
9
|
+
import { SEARCH_LIMITS } from '../utils/constants.js';
|
|
10
|
+
import { TFIDFIndexManager } from './TFIDFIndexManager.js';
|
|
11
|
+
import { SearchFilterChain } from './SearchFilterChain.js';
|
|
12
|
+
/**
|
|
13
|
+
* Performs TF-IDF ranked search with optional pre-calculated indexes.
|
|
14
|
+
*/
|
|
15
|
+
export class RankedSearch {
|
|
16
|
+
storage;
|
|
17
|
+
indexManager = null;
|
|
18
|
+
/**
|
|
19
|
+
* Phase 4 Sprint 2: Fallback token cache for entities.
|
|
20
|
+
* Maps entity name -> pre-tokenized entity data.
|
|
21
|
+
* Invalidated when graph changes (detected by entity count mismatch).
|
|
22
|
+
*/
|
|
23
|
+
fallbackTokenCache = new Map();
|
|
24
|
+
cachedEntityCount = 0;
|
|
25
|
+
constructor(storage, storageDir) {
|
|
26
|
+
this.storage = storage;
|
|
27
|
+
// Initialize index manager if storage directory is provided
|
|
28
|
+
if (storageDir) {
|
|
29
|
+
this.indexManager = new TFIDFIndexManager(storageDir);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Phase 4 Sprint 2: Clear the fallback token cache.
|
|
34
|
+
* Called when graph changes are detected or explicitly by external code.
|
|
35
|
+
*/
|
|
36
|
+
clearTokenCache() {
|
|
37
|
+
this.fallbackTokenCache.clear();
|
|
38
|
+
this.cachedEntityCount = 0;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Initialize and build the TF-IDF index for fast searches.
|
|
42
|
+
*
|
|
43
|
+
* Should be called after graph changes to keep index up-to-date.
|
|
44
|
+
*/
|
|
45
|
+
async buildIndex() {
|
|
46
|
+
if (!this.indexManager) {
|
|
47
|
+
throw new Error('Index manager not initialized. Provide storageDir to constructor.');
|
|
48
|
+
}
|
|
49
|
+
const graph = await this.storage.loadGraph();
|
|
50
|
+
await this.indexManager.buildIndex(graph);
|
|
51
|
+
await this.indexManager.saveIndex();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Update the index incrementally after entity changes.
|
|
55
|
+
*
|
|
56
|
+
* @param changedEntityNames - Names of entities that were created, updated, or deleted
|
|
57
|
+
*/
|
|
58
|
+
async updateIndex(changedEntityNames) {
|
|
59
|
+
if (!this.indexManager) {
|
|
60
|
+
return; // No index manager, skip
|
|
61
|
+
}
|
|
62
|
+
const graph = await this.storage.loadGraph();
|
|
63
|
+
await this.indexManager.updateIndex(graph, changedEntityNames);
|
|
64
|
+
await this.indexManager.saveIndex();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Load the TF-IDF index from disk if available.
|
|
68
|
+
*/
|
|
69
|
+
async ensureIndexLoaded() {
|
|
70
|
+
if (!this.indexManager) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
// Return cached index if already loaded
|
|
74
|
+
const cached = this.indexManager.getIndex();
|
|
75
|
+
if (cached) {
|
|
76
|
+
return cached;
|
|
77
|
+
}
|
|
78
|
+
// Try to load from disk
|
|
79
|
+
return await this.indexManager.loadIndex();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Search with TF-IDF relevance ranking.
|
|
83
|
+
*
|
|
84
|
+
* Uses pre-calculated index if available, falls back to on-the-fly calculation.
|
|
85
|
+
*
|
|
86
|
+
* @param query - Search query
|
|
87
|
+
* @param tags - Optional tags filter
|
|
88
|
+
* @param minImportance - Optional minimum importance
|
|
89
|
+
* @param maxImportance - Optional maximum importance
|
|
90
|
+
* @param limit - Maximum results to return (default 50, max 200)
|
|
91
|
+
* @returns Array of search results sorted by relevance
|
|
92
|
+
*/
|
|
93
|
+
async searchNodesRanked(query, tags, minImportance, maxImportance, limit = SEARCH_LIMITS.DEFAULT) {
|
|
94
|
+
// Enforce maximum search limit
|
|
95
|
+
const effectiveLimit = Math.min(limit, SEARCH_LIMITS.MAX);
|
|
96
|
+
const graph = await this.storage.loadGraph();
|
|
97
|
+
// Apply tag and importance filters using SearchFilterChain
|
|
98
|
+
const filters = { tags, minImportance, maxImportance };
|
|
99
|
+
const filteredEntities = SearchFilterChain.applyFilters(graph.entities, filters);
|
|
100
|
+
// Try to use pre-calculated index
|
|
101
|
+
const index = await this.ensureIndexLoaded();
|
|
102
|
+
const queryTerms = tokenize(query);
|
|
103
|
+
if (index) {
|
|
104
|
+
// Use pre-calculated index for fast search
|
|
105
|
+
return this.searchWithIndex(filteredEntities, queryTerms, index, effectiveLimit);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Fall back to on-the-fly calculation
|
|
109
|
+
return this.searchWithoutIndex(filteredEntities, queryTerms, effectiveLimit);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Search using pre-calculated TF-IDF index (fast path).
|
|
114
|
+
*/
|
|
115
|
+
searchWithIndex(entities, queryTerms, index, limit) {
|
|
116
|
+
const results = [];
|
|
117
|
+
for (const entity of entities) {
|
|
118
|
+
const docVector = index.documents.get(entity.name);
|
|
119
|
+
if (!docVector) {
|
|
120
|
+
continue; // Entity not in index
|
|
121
|
+
}
|
|
122
|
+
// Calculate total terms in document (sum of all term frequencies)
|
|
123
|
+
const totalTerms = Object.values(docVector.terms).reduce((sum, count) => sum + count, 0);
|
|
124
|
+
if (totalTerms === 0)
|
|
125
|
+
continue;
|
|
126
|
+
// Calculate score using pre-calculated term frequencies and IDF
|
|
127
|
+
let totalScore = 0;
|
|
128
|
+
const matchedFields = {};
|
|
129
|
+
for (const term of queryTerms) {
|
|
130
|
+
const termCount = docVector.terms[term] || 0;
|
|
131
|
+
const idf = index.idf.get(term) || 0;
|
|
132
|
+
// Calculate TF-IDF: (termCount / totalTerms) * IDF
|
|
133
|
+
const tf = termCount / totalTerms;
|
|
134
|
+
const tfidf = tf * idf;
|
|
135
|
+
totalScore += tfidf;
|
|
136
|
+
// Track which fields matched
|
|
137
|
+
if (termCount > 0) {
|
|
138
|
+
if (entity.name.toLowerCase().includes(term)) {
|
|
139
|
+
matchedFields.name = true;
|
|
140
|
+
}
|
|
141
|
+
if (entity.entityType.toLowerCase().includes(term)) {
|
|
142
|
+
matchedFields.entityType = true;
|
|
143
|
+
}
|
|
144
|
+
const matchedObs = entity.observations.filter(o => o.toLowerCase().includes(term));
|
|
145
|
+
if (matchedObs.length > 0) {
|
|
146
|
+
matchedFields.observations = matchedObs;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Only include entities with non-zero scores
|
|
151
|
+
if (totalScore > 0) {
|
|
152
|
+
results.push({
|
|
153
|
+
entity,
|
|
154
|
+
score: totalScore,
|
|
155
|
+
matchedFields,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Sort by score descending and apply limit
|
|
160
|
+
return results
|
|
161
|
+
.sort((a, b) => b.score - a.score)
|
|
162
|
+
.slice(0, limit);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Search without index (on-the-fly calculation, slow path).
|
|
166
|
+
*
|
|
167
|
+
* OPTIMIZED: Phase 4 Sprint 2 - Uses fallback token cache to avoid
|
|
168
|
+
* repeated tokenization of entities. Pre-tokenizes all documents once
|
|
169
|
+
* and caches for subsequent searches.
|
|
170
|
+
*/
|
|
171
|
+
searchWithoutIndex(entities, queryTerms, limit) {
|
|
172
|
+
const results = [];
|
|
173
|
+
// Phase 4 Sprint 2: Check if cache needs invalidation
|
|
174
|
+
if (entities.length !== this.cachedEntityCount) {
|
|
175
|
+
this.clearTokenCache();
|
|
176
|
+
this.cachedEntityCount = entities.length;
|
|
177
|
+
}
|
|
178
|
+
// Phase 4 Sprint 2: Get or compute tokenized data for each entity
|
|
179
|
+
const documentData = entities.map(e => {
|
|
180
|
+
// Check cache first
|
|
181
|
+
const cached = this.fallbackTokenCache.get(e.name);
|
|
182
|
+
if (cached) {
|
|
183
|
+
return cached;
|
|
184
|
+
}
|
|
185
|
+
// Compute and cache tokenized data
|
|
186
|
+
const text = [e.name, e.entityType, ...e.observations].join(' ');
|
|
187
|
+
const tokens = tokenize(text);
|
|
188
|
+
const tokenized = {
|
|
189
|
+
entity: e,
|
|
190
|
+
text,
|
|
191
|
+
tokens,
|
|
192
|
+
tokenSet: new Set(tokens),
|
|
193
|
+
};
|
|
194
|
+
this.fallbackTokenCache.set(e.name, tokenized);
|
|
195
|
+
return tokenized;
|
|
196
|
+
});
|
|
197
|
+
// Pre-compute token sets for IDF calculation (O(1) lookup per document)
|
|
198
|
+
const tokenSets = documentData.map(d => d.tokenSet);
|
|
199
|
+
for (const docData of documentData) {
|
|
200
|
+
const { entity, text } = docData;
|
|
201
|
+
// Calculate score for each query term
|
|
202
|
+
let totalScore = 0;
|
|
203
|
+
const matchedFields = {};
|
|
204
|
+
for (const term of queryTerms) {
|
|
205
|
+
// Calculate TF using pre-tokenized tokens
|
|
206
|
+
const tf = calculateTF(term, text);
|
|
207
|
+
// Calculate IDF using pre-computed token sets (O(1) per document)
|
|
208
|
+
const idf = calculateIDFFromTokenSets(term, tokenSets);
|
|
209
|
+
// TF-IDF score
|
|
210
|
+
const score = tf * idf;
|
|
211
|
+
totalScore += score;
|
|
212
|
+
// Track which fields matched
|
|
213
|
+
if (entity.name.toLowerCase().includes(term)) {
|
|
214
|
+
matchedFields.name = true;
|
|
215
|
+
}
|
|
216
|
+
if (entity.entityType.toLowerCase().includes(term)) {
|
|
217
|
+
matchedFields.entityType = true;
|
|
218
|
+
}
|
|
219
|
+
const matchedObs = entity.observations.filter(o => o.toLowerCase().includes(term));
|
|
220
|
+
if (matchedObs.length > 0) {
|
|
221
|
+
matchedFields.observations = matchedObs;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Only include entities with non-zero scores
|
|
225
|
+
if (totalScore > 0) {
|
|
226
|
+
results.push({
|
|
227
|
+
entity,
|
|
228
|
+
score: totalScore,
|
|
229
|
+
matchedFields,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Sort by score descending and apply limit
|
|
234
|
+
return results
|
|
235
|
+
.sort((a, b) => b.score - a.score)
|
|
236
|
+
.slice(0, limit);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=RankedSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RankedSearch.js","sourceRoot":"","sources":["../../src/search/RankedSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reflection Manager
|
|
3
|
+
*
|
|
4
|
+
* Phase 11: Implements reflection-based iterative retrieval
|
|
5
|
+
* that refines results until adequate.
|
|
6
|
+
*
|
|
7
|
+
* @module search/ReflectionManager
|
|
8
|
+
*/
|
|
9
|
+
import type { ReadonlyKnowledgeGraph, HybridSearchResult, HybridSearchOptions } from '../types/index.js';
|
|
10
|
+
import type { HybridSearchManager } from './HybridSearchManager.js';
|
|
11
|
+
import type { QueryAnalyzer } from './QueryAnalyzer.js';
|
|
12
|
+
/**
|
|
13
|
+
* Options for reflection-based retrieval.
|
|
14
|
+
*/
|
|
15
|
+
export interface ReflectionOptions {
|
|
16
|
+
/** Maximum number of reflection iterations (default: 3) */
|
|
17
|
+
maxIterations?: number;
|
|
18
|
+
/** Adequacy threshold 0-1 (default: 0.7) */
|
|
19
|
+
adequacyThreshold?: number;
|
|
20
|
+
/** Minimum results required (default: 3) */
|
|
21
|
+
minResults?: number;
|
|
22
|
+
/** Hybrid search options */
|
|
23
|
+
searchOptions?: Partial<HybridSearchOptions>;
|
|
24
|
+
/** Phase 12 Sprint 4: Progressive limit increase factor (default: 1.5) */
|
|
25
|
+
limitIncreaseFactor?: number;
|
|
26
|
+
/** Phase 12 Sprint 4: Initial search limit (default: 10) */
|
|
27
|
+
initialLimit?: number;
|
|
28
|
+
/** Phase 12 Sprint 4: Focus on specific missing info types */
|
|
29
|
+
focusMissingTypes?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Phase 12 Sprint 4: Refinement history entry.
|
|
33
|
+
*/
|
|
34
|
+
export interface RefinementHistoryEntry {
|
|
35
|
+
/** Iteration number (1-based) */
|
|
36
|
+
iteration: number;
|
|
37
|
+
/** Query used in this iteration */
|
|
38
|
+
query: string;
|
|
39
|
+
/** Search limit used */
|
|
40
|
+
limit: number;
|
|
41
|
+
/** Results found in this iteration */
|
|
42
|
+
resultsFound: number;
|
|
43
|
+
/** Adequacy score after this iteration */
|
|
44
|
+
adequacyScore: number;
|
|
45
|
+
/** Reason for refinement (if not final) */
|
|
46
|
+
refinementReason?: string;
|
|
47
|
+
/** Missing info types that triggered refinement */
|
|
48
|
+
missingInfoTypes?: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Result of reflection-based retrieval.
|
|
52
|
+
*/
|
|
53
|
+
export interface ReflectionResult {
|
|
54
|
+
results: HybridSearchResult[];
|
|
55
|
+
iterations: number;
|
|
56
|
+
adequate: boolean;
|
|
57
|
+
refinements: string[];
|
|
58
|
+
adequacyScore: number;
|
|
59
|
+
/** Phase 12 Sprint 4: Detailed refinement history */
|
|
60
|
+
refinementHistory: RefinementHistoryEntry[];
|
|
61
|
+
/** Phase 12 Sprint 4: Final search limit used */
|
|
62
|
+
finalLimit: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Reflection Manager for iterative retrieval refinement.
|
|
66
|
+
*
|
|
67
|
+
* Implements the SimpleMem-inspired reflection loop:
|
|
68
|
+
* 1. Execute initial search
|
|
69
|
+
* 2. Check result adequacy
|
|
70
|
+
* 3. If inadequate, refine query and repeat
|
|
71
|
+
* 4. Combine results from all iterations
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* const reflection = new ReflectionManager(hybridSearch, analyzer);
|
|
76
|
+
* const result = await reflection.retrieveWithReflection(
|
|
77
|
+
* graph,
|
|
78
|
+
* 'What projects did Alice work on?',
|
|
79
|
+
* { maxIterations: 3 }
|
|
80
|
+
* );
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare class ReflectionManager {
|
|
84
|
+
private hybridSearch;
|
|
85
|
+
private analyzer;
|
|
86
|
+
constructor(hybridSearch: HybridSearchManager, analyzer: QueryAnalyzer);
|
|
87
|
+
/**
|
|
88
|
+
* Perform retrieval with reflection-based refinement.
|
|
89
|
+
*
|
|
90
|
+
* Phase 12 Sprint 4 enhancements:
|
|
91
|
+
* - Progressive limit increase per round
|
|
92
|
+
* - Focused query refinement based on missing information
|
|
93
|
+
* - Detailed refinement history tracking
|
|
94
|
+
*/
|
|
95
|
+
retrieveWithReflection(graph: ReadonlyKnowledgeGraph, query: string, options?: ReflectionOptions): Promise<ReflectionResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Find missing information types based on analysis requirements.
|
|
98
|
+
* @private
|
|
99
|
+
*/
|
|
100
|
+
private findMissingInfoTypes;
|
|
101
|
+
/**
|
|
102
|
+
* Refine query with focus on missing information types.
|
|
103
|
+
* @private
|
|
104
|
+
*/
|
|
105
|
+
private refineQueryFocused;
|
|
106
|
+
/**
|
|
107
|
+
* Get human-readable reason for refinement.
|
|
108
|
+
* @private
|
|
109
|
+
*/
|
|
110
|
+
private getRefinementReason;
|
|
111
|
+
/**
|
|
112
|
+
* Calculate result adequacy score.
|
|
113
|
+
*/
|
|
114
|
+
private calculateAdequacy;
|
|
115
|
+
/**
|
|
116
|
+
* Refine query based on current results and analysis.
|
|
117
|
+
*/
|
|
118
|
+
private refineQuery;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=ReflectionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReflectionManager.d.ts","sourceRoot":"","sources":["../../src/search/ReflectionManager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,sBAAsB,EAEtB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7C,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;IAC5C,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;gBADR,YAAY,EAAE,mBAAmB,EACjC,QAAQ,EAAE,aAAa;IAGjC;;;;;;;OAOG;IACG,sBAAsB,CAC1B,KAAK,EAAE,sBAAsB,EAC7B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IAwG5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAqC1B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,OAAO,CAAC,WAAW;CA6BpB"}
|