cursor-recursive-rag 0.2.0-alpha.2 → 0.2.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/README.md +179 -203
- package/dist/adapters/llm/anthropic.d.ts +27 -0
- package/dist/adapters/llm/anthropic.d.ts.map +1 -0
- package/dist/adapters/llm/anthropic.js +287 -0
- package/dist/adapters/llm/anthropic.js.map +1 -0
- package/dist/adapters/llm/base.d.ts +62 -0
- package/dist/adapters/llm/base.d.ts.map +1 -0
- package/dist/adapters/llm/base.js +140 -0
- package/dist/adapters/llm/base.js.map +1 -0
- package/dist/adapters/llm/deepseek.d.ts +24 -0
- package/dist/adapters/llm/deepseek.d.ts.map +1 -0
- package/dist/adapters/llm/deepseek.js +228 -0
- package/dist/adapters/llm/deepseek.js.map +1 -0
- package/dist/adapters/llm/groq.d.ts +25 -0
- package/dist/adapters/llm/groq.d.ts.map +1 -0
- package/dist/adapters/llm/groq.js +265 -0
- package/dist/adapters/llm/groq.js.map +1 -0
- package/dist/adapters/llm/index.d.ts +62 -0
- package/dist/adapters/llm/index.d.ts.map +1 -0
- package/dist/adapters/llm/index.js +380 -0
- package/dist/adapters/llm/index.js.map +1 -0
- package/dist/adapters/llm/ollama.d.ts +23 -0
- package/dist/adapters/llm/ollama.d.ts.map +1 -0
- package/dist/adapters/llm/ollama.js +261 -0
- package/dist/adapters/llm/ollama.js.map +1 -0
- package/dist/adapters/llm/openai.d.ts +22 -0
- package/dist/adapters/llm/openai.d.ts.map +1 -0
- package/dist/adapters/llm/openai.js +232 -0
- package/dist/adapters/llm/openai.js.map +1 -0
- package/dist/adapters/llm/openrouter.d.ts +27 -0
- package/dist/adapters/llm/openrouter.d.ts.map +1 -0
- package/dist/adapters/llm/openrouter.js +305 -0
- package/dist/adapters/llm/openrouter.js.map +1 -0
- package/dist/adapters/vector/index.d.ts.map +1 -1
- package/dist/adapters/vector/index.js +8 -0
- package/dist/adapters/vector/index.js.map +1 -1
- package/dist/adapters/vector/redis-native.d.ts +35 -0
- package/dist/adapters/vector/redis-native.d.ts.map +1 -0
- package/dist/adapters/vector/redis-native.js +170 -0
- package/dist/adapters/vector/redis-native.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +4 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +374 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +4 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +237 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +9 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +639 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/setup.js +5 -4
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/memoryConfig.d.ts +427 -0
- package/dist/config/memoryConfig.d.ts.map +1 -0
- package/dist/config/memoryConfig.js +258 -0
- package/dist/config/memoryConfig.js.map +1 -0
- package/dist/config/rulesConfig.d.ts +486 -0
- package/dist/config/rulesConfig.d.ts.map +1 -0
- package/dist/config/rulesConfig.js +345 -0
- package/dist/config/rulesConfig.js.map +1 -0
- package/dist/dashboard/coreTools.d.ts +14 -0
- package/dist/dashboard/coreTools.d.ts.map +1 -0
- package/dist/dashboard/coreTools.js +413 -0
- package/dist/dashboard/coreTools.js.map +1 -0
- package/dist/dashboard/public/index.html +1982 -13
- package/dist/dashboard/server.d.ts +1 -8
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +846 -13
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/toolRegistry.d.ts +192 -0
- package/dist/dashboard/toolRegistry.d.ts.map +1 -0
- package/dist/dashboard/toolRegistry.js +322 -0
- package/dist/dashboard/toolRegistry.js.map +1 -0
- package/dist/proxy/index.d.ts +1 -1
- package/dist/proxy/index.d.ts.map +1 -1
- package/dist/proxy/index.js +9 -6
- package/dist/proxy/index.js.map +1 -1
- package/dist/server/index.js +21 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/tools/crawl.d.ts.map +1 -1
- package/dist/server/tools/crawl.js +8 -0
- package/dist/server/tools/crawl.js.map +1 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +19 -1
- package/dist/server/tools/index.js.map +1 -1
- package/dist/server/tools/ingest.d.ts.map +1 -1
- package/dist/server/tools/ingest.js +5 -0
- package/dist/server/tools/ingest.js.map +1 -1
- package/dist/server/tools/memory.d.ts +250 -0
- package/dist/server/tools/memory.d.ts.map +1 -0
- package/dist/server/tools/memory.js +472 -0
- package/dist/server/tools/memory.js.map +1 -0
- package/dist/server/tools/recursive-query.d.ts.map +1 -1
- package/dist/server/tools/recursive-query.js +6 -0
- package/dist/server/tools/recursive-query.js.map +1 -1
- package/dist/server/tools/search.d.ts.map +1 -1
- package/dist/server/tools/search.js +6 -0
- package/dist/server/tools/search.js.map +1 -1
- package/dist/services/activity-log.d.ts +10 -0
- package/dist/services/activity-log.d.ts.map +1 -0
- package/dist/services/activity-log.js +53 -0
- package/dist/services/activity-log.js.map +1 -0
- package/dist/services/categoryManager.d.ts +110 -0
- package/dist/services/categoryManager.d.ts.map +1 -0
- package/dist/services/categoryManager.js +549 -0
- package/dist/services/categoryManager.js.map +1 -0
- package/dist/services/contextEnvironment.d.ts +206 -0
- package/dist/services/contextEnvironment.d.ts.map +1 -0
- package/dist/services/contextEnvironment.js +481 -0
- package/dist/services/contextEnvironment.js.map +1 -0
- package/dist/services/conversationProcessor.d.ts +99 -0
- package/dist/services/conversationProcessor.d.ts.map +1 -0
- package/dist/services/conversationProcessor.js +311 -0
- package/dist/services/conversationProcessor.js.map +1 -0
- package/dist/services/cursorChatReader.d.ts +129 -0
- package/dist/services/cursorChatReader.d.ts.map +1 -0
- package/dist/services/cursorChatReader.js +419 -0
- package/dist/services/cursorChatReader.js.map +1 -0
- package/dist/services/decayCalculator.d.ts +85 -0
- package/dist/services/decayCalculator.d.ts.map +1 -0
- package/dist/services/decayCalculator.js +182 -0
- package/dist/services/decayCalculator.js.map +1 -0
- package/dist/services/enhancedVectorStore.d.ts +102 -0
- package/dist/services/enhancedVectorStore.d.ts.map +1 -0
- package/dist/services/enhancedVectorStore.js +245 -0
- package/dist/services/enhancedVectorStore.js.map +1 -0
- package/dist/services/hybridScorer.d.ts +120 -0
- package/dist/services/hybridScorer.d.ts.map +1 -0
- package/dist/services/hybridScorer.js +334 -0
- package/dist/services/hybridScorer.js.map +1 -0
- package/dist/services/knowledgeExtractor.d.ts +45 -0
- package/dist/services/knowledgeExtractor.d.ts.map +1 -0
- package/dist/services/knowledgeExtractor.js +436 -0
- package/dist/services/knowledgeExtractor.js.map +1 -0
- package/dist/services/knowledgeStorage.d.ts +102 -0
- package/dist/services/knowledgeStorage.d.ts.map +1 -0
- package/dist/services/knowledgeStorage.js +383 -0
- package/dist/services/knowledgeStorage.js.map +1 -0
- package/dist/services/maintenanceScheduler.d.ts +89 -0
- package/dist/services/maintenanceScheduler.d.ts.map +1 -0
- package/dist/services/maintenanceScheduler.js +479 -0
- package/dist/services/maintenanceScheduler.js.map +1 -0
- package/dist/services/memoryMetadataStore.d.ts +62 -0
- package/dist/services/memoryMetadataStore.d.ts.map +1 -0
- package/dist/services/memoryMetadataStore.js +570 -0
- package/dist/services/memoryMetadataStore.js.map +1 -0
- package/dist/services/recursiveRetrieval.d.ts +122 -0
- package/dist/services/recursiveRetrieval.d.ts.map +1 -0
- package/dist/services/recursiveRetrieval.js +443 -0
- package/dist/services/recursiveRetrieval.js.map +1 -0
- package/dist/services/relationshipGraph.d.ts +77 -0
- package/dist/services/relationshipGraph.d.ts.map +1 -0
- package/dist/services/relationshipGraph.js +411 -0
- package/dist/services/relationshipGraph.js.map +1 -0
- package/dist/services/rlmSafeguards.d.ts +273 -0
- package/dist/services/rlmSafeguards.d.ts.map +1 -0
- package/dist/services/rlmSafeguards.js +705 -0
- package/dist/services/rlmSafeguards.js.map +1 -0
- package/dist/services/rulesAnalyzer.d.ts +119 -0
- package/dist/services/rulesAnalyzer.d.ts.map +1 -0
- package/dist/services/rulesAnalyzer.js +768 -0
- package/dist/services/rulesAnalyzer.js.map +1 -0
- package/dist/services/rulesMerger.d.ts +75 -0
- package/dist/services/rulesMerger.d.ts.map +1 -0
- package/dist/services/rulesMerger.js +404 -0
- package/dist/services/rulesMerger.js.map +1 -0
- package/dist/services/rulesParser.d.ts +127 -0
- package/dist/services/rulesParser.d.ts.map +1 -0
- package/dist/services/rulesParser.js +594 -0
- package/dist/services/rulesParser.js.map +1 -0
- package/dist/services/smartChunker.d.ts +110 -0
- package/dist/services/smartChunker.d.ts.map +1 -0
- package/dist/services/smartChunker.js +520 -0
- package/dist/services/smartChunker.js.map +1 -0
- package/dist/types/categories.d.ts +105 -0
- package/dist/types/categories.d.ts.map +1 -0
- package/dist/types/categories.js +108 -0
- package/dist/types/categories.js.map +1 -0
- package/dist/types/extractedKnowledge.d.ts +233 -0
- package/dist/types/extractedKnowledge.d.ts.map +1 -0
- package/dist/types/extractedKnowledge.js +56 -0
- package/dist/types/extractedKnowledge.js.map +1 -0
- package/dist/types/index.d.ts +9 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +12 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/llmProvider.d.ts +282 -0
- package/dist/types/llmProvider.d.ts.map +1 -0
- package/dist/types/llmProvider.js +48 -0
- package/dist/types/llmProvider.js.map +1 -0
- package/dist/types/memory.d.ts +227 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +76 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/relationships.d.ts +167 -0
- package/dist/types/relationships.d.ts.map +1 -0
- package/dist/types/relationships.js +106 -0
- package/dist/types/relationships.js.map +1 -0
- package/dist/types/rulesOptimizer.d.ts +345 -0
- package/dist/types/rulesOptimizer.d.ts.map +1 -0
- package/dist/types/rulesOptimizer.js +22 -0
- package/dist/types/rulesOptimizer.js.map +1 -0
- package/docs/cursor-recursive-rag-memory-spec.md +4569 -0
- package/docs/cursor-recursive-rag-tasks.md +1355 -0
- package/package.json +6 -3
- package/restart-rag.sh +16 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export const DEFAULT_DECAY_CALCULATOR_CONFIG = {
|
|
2
|
+
halfLifeDays: 60,
|
|
3
|
+
expectedAccessesPerMonth: 5,
|
|
4
|
+
recencyBoostDays: 7,
|
|
5
|
+
recencyBoostMultiplier: 1.5,
|
|
6
|
+
weights: {
|
|
7
|
+
age: 0.3,
|
|
8
|
+
access: 0.3,
|
|
9
|
+
importance: 0.4,
|
|
10
|
+
},
|
|
11
|
+
archivalThreshold: 0.2,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Calculates decay scores for chunks based on multiple factors
|
|
15
|
+
*
|
|
16
|
+
* Formula: decayScore = (ageFactor * weightAge) + (accessFactor * weightAccess) + (importanceFactor * weightImportance)
|
|
17
|
+
*
|
|
18
|
+
* Where:
|
|
19
|
+
* - ageFactor = 1.0 / (1.0 + (ageDays / halfLifeDays))
|
|
20
|
+
* - accessFactor = min(1.0, accessCount / expectedAccesses) * recencyBoost
|
|
21
|
+
* - importanceFactor = chunk.importance
|
|
22
|
+
*/
|
|
23
|
+
export class DecayCalculator {
|
|
24
|
+
config;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.config = {
|
|
27
|
+
...DEFAULT_DECAY_CALCULATOR_CONFIG,
|
|
28
|
+
...config,
|
|
29
|
+
weights: {
|
|
30
|
+
...DEFAULT_DECAY_CALCULATOR_CONFIG.weights,
|
|
31
|
+
...config?.weights,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Calculate decay score for a single chunk
|
|
37
|
+
*/
|
|
38
|
+
calculateDecayScore(chunk, now = new Date()) {
|
|
39
|
+
const ageFactor = this.calculateAgeFactor(chunk.createdAt, now);
|
|
40
|
+
const accessFactor = this.calculateAccessFactor(chunk, now);
|
|
41
|
+
const importanceFactor = chunk.importance;
|
|
42
|
+
const score = ageFactor * this.config.weights.age +
|
|
43
|
+
accessFactor * this.config.weights.access +
|
|
44
|
+
importanceFactor * this.config.weights.importance;
|
|
45
|
+
// Clamp to 0-1 range
|
|
46
|
+
return Math.max(0, Math.min(1, score));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Calculate age factor using exponential decay
|
|
50
|
+
* Returns 1.0 for new chunks, approaches 0 for very old chunks
|
|
51
|
+
*/
|
|
52
|
+
calculateAgeFactor(createdAt, now) {
|
|
53
|
+
const createdDate = new Date(createdAt);
|
|
54
|
+
const ageDays = (now.getTime() - createdDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
55
|
+
// Exponential decay: 1 / (1 + (age / halfLife))
|
|
56
|
+
// At halfLife days, factor = 0.5
|
|
57
|
+
return 1.0 / (1.0 + ageDays / this.config.halfLifeDays);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate access factor based on access count and recency
|
|
61
|
+
*/
|
|
62
|
+
calculateAccessFactor(chunk, now) {
|
|
63
|
+
// Base score from access count
|
|
64
|
+
const baseAccessScore = Math.min(1.0, chunk.accessCount / this.config.expectedAccessesPerMonth);
|
|
65
|
+
// Apply recency boost if accessed recently
|
|
66
|
+
if (chunk.lastAccessedAt) {
|
|
67
|
+
const lastAccessDate = new Date(chunk.lastAccessedAt);
|
|
68
|
+
const daysSinceAccess = (now.getTime() - lastAccessDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
69
|
+
if (daysSinceAccess <= this.config.recencyBoostDays) {
|
|
70
|
+
// Linear decay of boost based on days since access
|
|
71
|
+
const boostFactor = 1 - daysSinceAccess / this.config.recencyBoostDays;
|
|
72
|
+
const boost = 1 + (this.config.recencyBoostMultiplier - 1) * boostFactor;
|
|
73
|
+
return Math.min(1.0, baseAccessScore * boost);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return baseAccessScore;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Calculate decay scores for multiple chunks
|
|
80
|
+
*/
|
|
81
|
+
calculateBatchDecayScores(chunks, now = new Date()) {
|
|
82
|
+
return chunks.map(chunk => ({
|
|
83
|
+
chunkId: chunk.chunkId,
|
|
84
|
+
decayScore: this.calculateDecayScore(chunk, now),
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Update all decay scores in the metadata store
|
|
89
|
+
*/
|
|
90
|
+
updateAllDecayScores(store, autoArchive = false) {
|
|
91
|
+
const startTime = Date.now();
|
|
92
|
+
const now = new Date();
|
|
93
|
+
// Get all non-archived chunks
|
|
94
|
+
const chunks = store.getAllChunkMetadata({ includeArchived: false });
|
|
95
|
+
// Calculate new decay scores
|
|
96
|
+
const updates = this.calculateBatchDecayScores(chunks, now);
|
|
97
|
+
// Batch update scores
|
|
98
|
+
store.bulkUpdateDecayScores(updates);
|
|
99
|
+
// Optionally archive chunks below threshold
|
|
100
|
+
let archived = 0;
|
|
101
|
+
if (autoArchive) {
|
|
102
|
+
const archivedIds = store.archiveStaleChunks(this.config.archivalThreshold);
|
|
103
|
+
archived = archivedIds.length;
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
updated: updates.length,
|
|
107
|
+
archived,
|
|
108
|
+
duration: Date.now() - startTime,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get chunks that are candidates for archival
|
|
113
|
+
*/
|
|
114
|
+
getArchivalCandidates(chunks, threshold) {
|
|
115
|
+
const archiveThreshold = threshold ?? this.config.archivalThreshold;
|
|
116
|
+
return chunks.filter(chunk => chunk.decayScore < archiveThreshold && !chunk.isArchived);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Simulate decay over time for testing/visualization
|
|
120
|
+
*/
|
|
121
|
+
simulateDecay(initialImportance, accessPattern, daysToSimulate) {
|
|
122
|
+
const results = [];
|
|
123
|
+
const baseDate = new Date();
|
|
124
|
+
// Create a mock chunk
|
|
125
|
+
const mockChunk = {
|
|
126
|
+
chunkId: 'simulation',
|
|
127
|
+
createdAt: baseDate.toISOString(),
|
|
128
|
+
updatedAt: baseDate.toISOString(),
|
|
129
|
+
lastAccessedAt: null,
|
|
130
|
+
accessCount: 0,
|
|
131
|
+
importance: initialImportance,
|
|
132
|
+
decayScore: 1.0,
|
|
133
|
+
isArchived: false,
|
|
134
|
+
chunkType: 'documentation',
|
|
135
|
+
sourceConversationId: null,
|
|
136
|
+
sourceMessageIndex: null,
|
|
137
|
+
};
|
|
138
|
+
for (let day = 0; day <= daysToSimulate; day++) {
|
|
139
|
+
const simulationDate = new Date(baseDate.getTime() + day * 24 * 60 * 60 * 1000);
|
|
140
|
+
// Apply any accesses for this day
|
|
141
|
+
const todayAccesses = accessPattern.filter(a => a.dayOffset === day);
|
|
142
|
+
for (const _ of todayAccesses) {
|
|
143
|
+
mockChunk.accessCount++;
|
|
144
|
+
mockChunk.lastAccessedAt = simulationDate.toISOString();
|
|
145
|
+
}
|
|
146
|
+
const score = this.calculateDecayScore(mockChunk, simulationDate);
|
|
147
|
+
results.push({ day, decayScore: score });
|
|
148
|
+
}
|
|
149
|
+
return results;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get the current configuration
|
|
153
|
+
*/
|
|
154
|
+
getConfig() {
|
|
155
|
+
return { ...this.config };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Update configuration
|
|
159
|
+
*/
|
|
160
|
+
updateConfig(config) {
|
|
161
|
+
this.config = {
|
|
162
|
+
...this.config,
|
|
163
|
+
...config,
|
|
164
|
+
weights: {
|
|
165
|
+
...this.config.weights,
|
|
166
|
+
...config?.weights,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Default instance
|
|
172
|
+
let instance = null;
|
|
173
|
+
export function getDecayCalculator(config) {
|
|
174
|
+
if (!instance) {
|
|
175
|
+
instance = new DecayCalculator(config);
|
|
176
|
+
}
|
|
177
|
+
return instance;
|
|
178
|
+
}
|
|
179
|
+
export function resetDecayCalculator() {
|
|
180
|
+
instance = null;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=decayCalculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decayCalculator.js","sourceRoot":"","sources":["../../src/services/decayCalculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { VectorStore, VectorDocument, SearchResult, SearchOptions } from '../types/index.js';
|
|
2
|
+
import type { ChunkMetadata, EnhancedSearchResult, EnhancedSearchOptions } from '../types/memory.js';
|
|
3
|
+
import { MemoryMetadataStore } from './memoryMetadataStore.js';
|
|
4
|
+
import { type DecayCalculatorConfig } from './decayCalculator.js';
|
|
5
|
+
/**
|
|
6
|
+
* Score weights for hybrid ranking
|
|
7
|
+
*/
|
|
8
|
+
export interface ScoreWeights {
|
|
9
|
+
similarity: number;
|
|
10
|
+
decay: number;
|
|
11
|
+
importance: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const DEFAULT_SCORE_WEIGHTS: ScoreWeights;
|
|
14
|
+
/**
|
|
15
|
+
* Enhanced vector store that wraps existing implementation with memory capabilities
|
|
16
|
+
*
|
|
17
|
+
* This wrapper:
|
|
18
|
+
* 1. Maintains temporal metadata (creation time, access patterns)
|
|
19
|
+
* 2. Calculates decay scores for all chunks
|
|
20
|
+
* 3. Re-ranks search results using hybrid scoring (similarity + decay + importance)
|
|
21
|
+
* 4. Records access patterns for future decay calculations
|
|
22
|
+
*/
|
|
23
|
+
export declare class EnhancedVectorStore implements VectorStore {
|
|
24
|
+
private vectorStore;
|
|
25
|
+
private metadataStore;
|
|
26
|
+
private decayCalculator;
|
|
27
|
+
private scoreWeights;
|
|
28
|
+
constructor(vectorStore: VectorStore, options?: {
|
|
29
|
+
metadataStore?: MemoryMetadataStore;
|
|
30
|
+
decayConfig?: Partial<DecayCalculatorConfig>;
|
|
31
|
+
scoreWeights?: Partial<ScoreWeights>;
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Add documents to both vector store and metadata store
|
|
35
|
+
*/
|
|
36
|
+
add(docs: VectorDocument[]): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Search with hybrid scoring (similarity + decay + importance)
|
|
39
|
+
*/
|
|
40
|
+
search(embedding: number[], options: SearchOptions): Promise<SearchResult[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Enhanced search with full options
|
|
43
|
+
*/
|
|
44
|
+
enhancedSearch(embedding: number[], options: EnhancedSearchOptions): Promise<EnhancedSearchResult[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Delete documents from both stores
|
|
47
|
+
*/
|
|
48
|
+
delete(ids: string[]): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Count documents in vector store
|
|
51
|
+
*/
|
|
52
|
+
count(): Promise<number>;
|
|
53
|
+
/**
|
|
54
|
+
* Get memory statistics
|
|
55
|
+
*/
|
|
56
|
+
getMemoryStats(): import("../types/memory.js").MemoryStats;
|
|
57
|
+
/**
|
|
58
|
+
* Update decay scores for all chunks
|
|
59
|
+
*/
|
|
60
|
+
updateDecayScores(autoArchive?: boolean): import("./decayCalculator.js").UpdateResult;
|
|
61
|
+
/**
|
|
62
|
+
* Get chunk metadata
|
|
63
|
+
*/
|
|
64
|
+
getChunkMetadata(chunkId: string): ChunkMetadata | null;
|
|
65
|
+
/**
|
|
66
|
+
* Update chunk importance
|
|
67
|
+
*/
|
|
68
|
+
updateImportance(chunkId: string, importance: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get the underlying vector store (for direct access if needed)
|
|
71
|
+
*/
|
|
72
|
+
getUnderlyingStore(): VectorStore;
|
|
73
|
+
/**
|
|
74
|
+
* Get the metadata store (for advanced operations)
|
|
75
|
+
*/
|
|
76
|
+
getMetadataStore(): MemoryMetadataStore;
|
|
77
|
+
/**
|
|
78
|
+
* Enrich search results with metadata
|
|
79
|
+
*/
|
|
80
|
+
private enrichWithMetadata;
|
|
81
|
+
/**
|
|
82
|
+
* Re-rank results using hybrid scoring
|
|
83
|
+
*/
|
|
84
|
+
private rerank;
|
|
85
|
+
/**
|
|
86
|
+
* Calculate final score using weighted combination
|
|
87
|
+
*/
|
|
88
|
+
private calculateFinalScore;
|
|
89
|
+
/**
|
|
90
|
+
* Record access for results
|
|
91
|
+
*/
|
|
92
|
+
private recordAccess;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create an enhanced vector store from an existing vector store
|
|
96
|
+
*/
|
|
97
|
+
export declare function createEnhancedVectorStore(vectorStore: VectorStore, options?: {
|
|
98
|
+
metadataDbPath?: string;
|
|
99
|
+
decayConfig?: Partial<DecayCalculatorConfig>;
|
|
100
|
+
scoreWeights?: Partial<ScoreWeights>;
|
|
101
|
+
}): EnhancedVectorStore;
|
|
102
|
+
//# sourceMappingURL=enhancedVectorStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhancedVectorStore.d.ts","sourceRoot":"","sources":["../../src/services/enhancedVectorStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,KAAK,EAEV,aAAa,EAEb,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAA0B,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAuC,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEvG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAInC,CAAC;AAEF;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAe;gBAGjC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,mBAAmB,CAAC;QACpC,WAAW,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC7C,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;KACtC;IAaH;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAehD;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkClF;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA2ClC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B;;OAEG;IACH,cAAc;IAId;;OAEG;IACH,iBAAiB,CAAC,WAAW,GAAE,OAAe;IAI9C;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAIvD;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAI3D;;OAEG;IACH,kBAAkB,IAAI,WAAW;IAIjC;;OAEG;IACH,gBAAgB,IAAI,mBAAmB;IAIvC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoC1B;;OAEG;IACH,OAAO,CAAC,MAAM;IASd;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,YAAY;CAKrB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CACtC,GACA,mBAAmB,CAUrB"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { MemoryMetadataStore, getMemoryMetadataStore } from './memoryMetadataStore.js';
|
|
2
|
+
import { DecayCalculator, getDecayCalculator } from './decayCalculator.js';
|
|
3
|
+
export const DEFAULT_SCORE_WEIGHTS = {
|
|
4
|
+
similarity: 0.5,
|
|
5
|
+
decay: 0.3,
|
|
6
|
+
importance: 0.2,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Enhanced vector store that wraps existing implementation with memory capabilities
|
|
10
|
+
*
|
|
11
|
+
* This wrapper:
|
|
12
|
+
* 1. Maintains temporal metadata (creation time, access patterns)
|
|
13
|
+
* 2. Calculates decay scores for all chunks
|
|
14
|
+
* 3. Re-ranks search results using hybrid scoring (similarity + decay + importance)
|
|
15
|
+
* 4. Records access patterns for future decay calculations
|
|
16
|
+
*/
|
|
17
|
+
export class EnhancedVectorStore {
|
|
18
|
+
vectorStore;
|
|
19
|
+
metadataStore;
|
|
20
|
+
decayCalculator;
|
|
21
|
+
scoreWeights;
|
|
22
|
+
constructor(vectorStore, options) {
|
|
23
|
+
this.vectorStore = vectorStore;
|
|
24
|
+
this.metadataStore = options?.metadataStore || getMemoryMetadataStore();
|
|
25
|
+
this.decayCalculator = options?.decayConfig
|
|
26
|
+
? new DecayCalculator(options.decayConfig)
|
|
27
|
+
: getDecayCalculator();
|
|
28
|
+
this.scoreWeights = {
|
|
29
|
+
...DEFAULT_SCORE_WEIGHTS,
|
|
30
|
+
...options?.scoreWeights,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Add documents to both vector store and metadata store
|
|
35
|
+
*/
|
|
36
|
+
async add(docs) {
|
|
37
|
+
// Add to vector store
|
|
38
|
+
await this.vectorStore.add(docs);
|
|
39
|
+
// Add metadata for each document
|
|
40
|
+
for (const doc of docs) {
|
|
41
|
+
this.metadataStore.upsertChunkMetadata({
|
|
42
|
+
chunkId: doc.id,
|
|
43
|
+
source: doc.metadata?.source || 'unknown',
|
|
44
|
+
chunkType: doc.metadata?.chunkType || 'documentation',
|
|
45
|
+
importance: typeof doc.metadata?.importance === 'number' ? doc.metadata.importance : 0.5,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Search with hybrid scoring (similarity + decay + importance)
|
|
51
|
+
*/
|
|
52
|
+
async search(embedding, options) {
|
|
53
|
+
// Over-fetch to allow for re-ranking
|
|
54
|
+
const overFetchMultiplier = 2;
|
|
55
|
+
const overFetchOptions = {
|
|
56
|
+
...options,
|
|
57
|
+
topK: options.topK * overFetchMultiplier,
|
|
58
|
+
};
|
|
59
|
+
// Get candidates from vector store
|
|
60
|
+
const candidates = await this.vectorStore.search(embedding, overFetchOptions);
|
|
61
|
+
// Enrich with metadata and calculate final scores
|
|
62
|
+
const enriched = this.enrichWithMetadata(candidates);
|
|
63
|
+
// Re-rank by final score
|
|
64
|
+
const reranked = this.rerank(enriched);
|
|
65
|
+
// Record access for top results
|
|
66
|
+
const topResults = reranked.slice(0, options.topK);
|
|
67
|
+
this.recordAccess(topResults);
|
|
68
|
+
// Return SearchResult format (compatible with existing interface)
|
|
69
|
+
return topResults.map(r => ({
|
|
70
|
+
id: r.id,
|
|
71
|
+
content: r.content,
|
|
72
|
+
metadata: {
|
|
73
|
+
...r.metadata,
|
|
74
|
+
decayScore: r.decayAdjustedScore,
|
|
75
|
+
finalScore: r.finalScore,
|
|
76
|
+
},
|
|
77
|
+
score: r.finalScore,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Enhanced search with full options
|
|
82
|
+
*/
|
|
83
|
+
async enhancedSearch(embedding, options) {
|
|
84
|
+
// Over-fetch to allow for re-ranking and filtering
|
|
85
|
+
const overFetchMultiplier = 3;
|
|
86
|
+
const baseOptions = {
|
|
87
|
+
topK: options.topK * overFetchMultiplier,
|
|
88
|
+
filter: options.filter,
|
|
89
|
+
};
|
|
90
|
+
// Get candidates from vector store
|
|
91
|
+
const candidates = await this.vectorStore.search(embedding, baseOptions);
|
|
92
|
+
// Enrich with metadata
|
|
93
|
+
let enriched = this.enrichWithMetadata(candidates);
|
|
94
|
+
// Apply filters
|
|
95
|
+
if (options.minDecayScore !== undefined) {
|
|
96
|
+
enriched = enriched.filter(r => r.decayAdjustedScore >= options.minDecayScore);
|
|
97
|
+
}
|
|
98
|
+
if (options.chunkTypes && options.chunkTypes.length > 0) {
|
|
99
|
+
enriched = enriched.filter(r => {
|
|
100
|
+
const metadata = this.metadataStore.getChunkMetadata(r.id);
|
|
101
|
+
return metadata && options.chunkTypes.includes(metadata.chunkType);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (!options.includeArchived) {
|
|
105
|
+
enriched = enriched.filter(r => {
|
|
106
|
+
const metadata = this.metadataStore.getChunkMetadata(r.id);
|
|
107
|
+
return metadata && !metadata.isArchived;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Re-rank
|
|
111
|
+
const reranked = this.rerank(enriched);
|
|
112
|
+
// Record access for top results
|
|
113
|
+
const topResults = reranked.slice(0, options.topK);
|
|
114
|
+
this.recordAccess(topResults);
|
|
115
|
+
return topResults;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Delete documents from both stores
|
|
119
|
+
*/
|
|
120
|
+
async delete(ids) {
|
|
121
|
+
await this.vectorStore.delete(ids);
|
|
122
|
+
for (const id of ids) {
|
|
123
|
+
this.metadataStore.deleteChunkMetadata(id);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Count documents in vector store
|
|
128
|
+
*/
|
|
129
|
+
async count() {
|
|
130
|
+
return this.vectorStore.count();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get memory statistics
|
|
134
|
+
*/
|
|
135
|
+
getMemoryStats() {
|
|
136
|
+
return this.metadataStore.getMemoryStats();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Update decay scores for all chunks
|
|
140
|
+
*/
|
|
141
|
+
updateDecayScores(autoArchive = false) {
|
|
142
|
+
return this.decayCalculator.updateAllDecayScores(this.metadataStore, autoArchive);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get chunk metadata
|
|
146
|
+
*/
|
|
147
|
+
getChunkMetadata(chunkId) {
|
|
148
|
+
return this.metadataStore.getChunkMetadata(chunkId);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Update chunk importance
|
|
152
|
+
*/
|
|
153
|
+
updateImportance(chunkId, importance) {
|
|
154
|
+
this.metadataStore.upsertChunkMetadata({ chunkId, importance });
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get the underlying vector store (for direct access if needed)
|
|
158
|
+
*/
|
|
159
|
+
getUnderlyingStore() {
|
|
160
|
+
return this.vectorStore;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the metadata store (for advanced operations)
|
|
164
|
+
*/
|
|
165
|
+
getMetadataStore() {
|
|
166
|
+
return this.metadataStore;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Enrich search results with metadata
|
|
170
|
+
*/
|
|
171
|
+
enrichWithMetadata(results) {
|
|
172
|
+
return results.map(result => {
|
|
173
|
+
const metadata = this.metadataStore.getChunkMetadata(result.id);
|
|
174
|
+
const decayScore = metadata?.decayScore ?? 1.0;
|
|
175
|
+
const importance = metadata?.importance ?? 0.5;
|
|
176
|
+
return {
|
|
177
|
+
chunk: {
|
|
178
|
+
id: result.id,
|
|
179
|
+
content: result.content,
|
|
180
|
+
embedding: [],
|
|
181
|
+
source: result.metadata?.source || 'unknown',
|
|
182
|
+
metadata: result.metadata,
|
|
183
|
+
createdAt: metadata ? new Date(metadata.createdAt) : new Date(),
|
|
184
|
+
updatedAt: metadata ? new Date(metadata.updatedAt) : new Date(),
|
|
185
|
+
lastAccessedAt: metadata?.lastAccessedAt ? new Date(metadata.lastAccessedAt) : null,
|
|
186
|
+
accessCount: metadata?.accessCount ?? 0,
|
|
187
|
+
importance,
|
|
188
|
+
decayScore,
|
|
189
|
+
isArchived: metadata?.isArchived ?? false,
|
|
190
|
+
chunkType: metadata?.chunkType || 'documentation',
|
|
191
|
+
relatedChunkIds: [],
|
|
192
|
+
entities: [],
|
|
193
|
+
},
|
|
194
|
+
similarityScore: result.score,
|
|
195
|
+
decayAdjustedScore: decayScore,
|
|
196
|
+
finalScore: 0, // Will be calculated in rerank
|
|
197
|
+
id: result.id,
|
|
198
|
+
content: result.content,
|
|
199
|
+
metadata: result.metadata,
|
|
200
|
+
score: result.score,
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Re-rank results using hybrid scoring
|
|
206
|
+
*/
|
|
207
|
+
rerank(results) {
|
|
208
|
+
return results
|
|
209
|
+
.map(r => ({
|
|
210
|
+
...r,
|
|
211
|
+
finalScore: this.calculateFinalScore(r),
|
|
212
|
+
}))
|
|
213
|
+
.sort((a, b) => b.finalScore - a.finalScore);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Calculate final score using weighted combination
|
|
217
|
+
*/
|
|
218
|
+
calculateFinalScore(result) {
|
|
219
|
+
return (result.similarityScore * this.scoreWeights.similarity +
|
|
220
|
+
result.decayAdjustedScore * this.scoreWeights.decay +
|
|
221
|
+
result.chunk.importance * this.scoreWeights.importance);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Record access for results
|
|
225
|
+
*/
|
|
226
|
+
recordAccess(results) {
|
|
227
|
+
for (let i = 0; i < results.length; i++) {
|
|
228
|
+
this.metadataStore.recordAccess(results[i].id, undefined, i + 1);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Create an enhanced vector store from an existing vector store
|
|
234
|
+
*/
|
|
235
|
+
export function createEnhancedVectorStore(vectorStore, options) {
|
|
236
|
+
const metadataStore = options?.metadataDbPath
|
|
237
|
+
? new MemoryMetadataStore(options.metadataDbPath)
|
|
238
|
+
: getMemoryMetadataStore();
|
|
239
|
+
return new EnhancedVectorStore(vectorStore, {
|
|
240
|
+
metadataStore,
|
|
241
|
+
decayConfig: options?.decayConfig,
|
|
242
|
+
scoreWeights: options?.scoreWeights,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=enhancedVectorStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhancedVectorStore.js","sourceRoot":"","sources":["../../src/services/enhancedVectorStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { EnhancedChunk, ChunkType } from '../types/memory.js';
|
|
2
|
+
import { RelationshipGraph } from './relationshipGraph.js';
|
|
3
|
+
import { CategoryManager } from './categoryManager.js';
|
|
4
|
+
import { MemoryMetadataStore } from './memoryMetadataStore.js';
|
|
5
|
+
export interface ScoreWeights {
|
|
6
|
+
similarity: number;
|
|
7
|
+
decay: number;
|
|
8
|
+
importance: number;
|
|
9
|
+
recency: number;
|
|
10
|
+
graphBoost: number;
|
|
11
|
+
typeBoost: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const DEFAULT_SCORE_WEIGHTS: ScoreWeights;
|
|
14
|
+
export interface TypeBoosts {
|
|
15
|
+
[key: string]: number;
|
|
16
|
+
}
|
|
17
|
+
export declare const DEFAULT_TYPE_BOOSTS: TypeBoosts;
|
|
18
|
+
export interface ScoringConfig {
|
|
19
|
+
weights: ScoreWeights;
|
|
20
|
+
typeBoosts: TypeBoosts;
|
|
21
|
+
recencyHalfLifeDays: number;
|
|
22
|
+
graphTraversalDepth: number;
|
|
23
|
+
graphMinStrength: number;
|
|
24
|
+
}
|
|
25
|
+
export declare const DEFAULT_SCORING_CONFIG: ScoringConfig;
|
|
26
|
+
export interface ScoringContext {
|
|
27
|
+
seedChunkIds?: string[];
|
|
28
|
+
preferredTypes?: ChunkType[];
|
|
29
|
+
project?: string;
|
|
30
|
+
boostCategories?: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface ScoreComponents {
|
|
33
|
+
similarity: number;
|
|
34
|
+
decay: number;
|
|
35
|
+
importance: number;
|
|
36
|
+
recency: number;
|
|
37
|
+
graphBoost: number;
|
|
38
|
+
typeBoost: number;
|
|
39
|
+
}
|
|
40
|
+
export interface ScoredResult {
|
|
41
|
+
id: string;
|
|
42
|
+
content: string;
|
|
43
|
+
metadata: Record<string, unknown>;
|
|
44
|
+
scores: ScoreComponents;
|
|
45
|
+
finalScore: number;
|
|
46
|
+
chunk?: EnhancedChunk;
|
|
47
|
+
}
|
|
48
|
+
export interface CategorySummary {
|
|
49
|
+
category: string;
|
|
50
|
+
summary: string;
|
|
51
|
+
itemCount: number;
|
|
52
|
+
}
|
|
53
|
+
export interface TieredResult {
|
|
54
|
+
tier: 'summary' | 'item' | 'both';
|
|
55
|
+
results: ScoredResult[];
|
|
56
|
+
categorySummaries?: CategorySummary[];
|
|
57
|
+
message: string;
|
|
58
|
+
totalFound: number;
|
|
59
|
+
}
|
|
60
|
+
export interface SearchResultInput {
|
|
61
|
+
id: string;
|
|
62
|
+
content: string;
|
|
63
|
+
score: number;
|
|
64
|
+
metadata?: Record<string, unknown>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Hybrid scoring system that combines multiple signals for final ranking
|
|
68
|
+
*
|
|
69
|
+
* Signals combined:
|
|
70
|
+
* - Vector similarity (base retrieval score)
|
|
71
|
+
* - Temporal decay (age-based relevance)
|
|
72
|
+
* - Importance (user-defined or inferred)
|
|
73
|
+
* - Recency (recently accessed items)
|
|
74
|
+
* - Graph boost (related to known-relevant items)
|
|
75
|
+
* - Type boost (favor solutions/patterns over raw docs)
|
|
76
|
+
*/
|
|
77
|
+
export declare class HybridScorer {
|
|
78
|
+
private config;
|
|
79
|
+
private graph;
|
|
80
|
+
private metadataStore;
|
|
81
|
+
private categoryManager;
|
|
82
|
+
constructor(graph?: RelationshipGraph, metadataStore?: MemoryMetadataStore, categoryManager?: CategoryManager, config?: Partial<ScoringConfig>);
|
|
83
|
+
/**
|
|
84
|
+
* Score and rank search results using hybrid scoring
|
|
85
|
+
*/
|
|
86
|
+
scoreResults(results: SearchResultInput[], query: string, context?: ScoringContext): Promise<ScoredResult[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Tiered retrieval: try category summaries first, then drill down
|
|
89
|
+
*/
|
|
90
|
+
tieredRetrieval(query: string, searchResults: SearchResultInput[], options?: {
|
|
91
|
+
maxSummaries?: number;
|
|
92
|
+
maxItems?: number;
|
|
93
|
+
requireSpecificItems?: boolean;
|
|
94
|
+
}): Promise<TieredResult>;
|
|
95
|
+
/**
|
|
96
|
+
* Score a single result (useful for on-the-fly scoring)
|
|
97
|
+
*/
|
|
98
|
+
scoreOne(result: SearchResultInput, context?: ScoringContext): ScoredResult;
|
|
99
|
+
/**
|
|
100
|
+
* Re-rank existing scored results with updated context
|
|
101
|
+
*/
|
|
102
|
+
rerankWithContext(results: ScoredResult[], context: ScoringContext): Promise<ScoredResult[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Get score breakdown for debugging/transparency
|
|
105
|
+
*/
|
|
106
|
+
explainScore(result: ScoredResult): string;
|
|
107
|
+
/**
|
|
108
|
+
* Update scoring configuration
|
|
109
|
+
*/
|
|
110
|
+
updateConfig(config: Partial<ScoringConfig>): void;
|
|
111
|
+
getConfig(): ScoringConfig;
|
|
112
|
+
private calculateFinalScore;
|
|
113
|
+
private calculateRecencyScore;
|
|
114
|
+
private getTypeBoost;
|
|
115
|
+
private getGraphContext;
|
|
116
|
+
private checkSufficiency;
|
|
117
|
+
}
|
|
118
|
+
export declare function getHybridScorer(config?: Partial<ScoringConfig>): HybridScorer;
|
|
119
|
+
export declare function resetHybridScorer(): void;
|
|
120
|
+
//# sourceMappingURL=hybridScorer.d.ts.map
|