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.
Files changed (210) hide show
  1. package/README.md +179 -203
  2. package/dist/adapters/llm/anthropic.d.ts +27 -0
  3. package/dist/adapters/llm/anthropic.d.ts.map +1 -0
  4. package/dist/adapters/llm/anthropic.js +287 -0
  5. package/dist/adapters/llm/anthropic.js.map +1 -0
  6. package/dist/adapters/llm/base.d.ts +62 -0
  7. package/dist/adapters/llm/base.d.ts.map +1 -0
  8. package/dist/adapters/llm/base.js +140 -0
  9. package/dist/adapters/llm/base.js.map +1 -0
  10. package/dist/adapters/llm/deepseek.d.ts +24 -0
  11. package/dist/adapters/llm/deepseek.d.ts.map +1 -0
  12. package/dist/adapters/llm/deepseek.js +228 -0
  13. package/dist/adapters/llm/deepseek.js.map +1 -0
  14. package/dist/adapters/llm/groq.d.ts +25 -0
  15. package/dist/adapters/llm/groq.d.ts.map +1 -0
  16. package/dist/adapters/llm/groq.js +265 -0
  17. package/dist/adapters/llm/groq.js.map +1 -0
  18. package/dist/adapters/llm/index.d.ts +62 -0
  19. package/dist/adapters/llm/index.d.ts.map +1 -0
  20. package/dist/adapters/llm/index.js +380 -0
  21. package/dist/adapters/llm/index.js.map +1 -0
  22. package/dist/adapters/llm/ollama.d.ts +23 -0
  23. package/dist/adapters/llm/ollama.d.ts.map +1 -0
  24. package/dist/adapters/llm/ollama.js +261 -0
  25. package/dist/adapters/llm/ollama.js.map +1 -0
  26. package/dist/adapters/llm/openai.d.ts +22 -0
  27. package/dist/adapters/llm/openai.d.ts.map +1 -0
  28. package/dist/adapters/llm/openai.js +232 -0
  29. package/dist/adapters/llm/openai.js.map +1 -0
  30. package/dist/adapters/llm/openrouter.d.ts +27 -0
  31. package/dist/adapters/llm/openrouter.d.ts.map +1 -0
  32. package/dist/adapters/llm/openrouter.js +305 -0
  33. package/dist/adapters/llm/openrouter.js.map +1 -0
  34. package/dist/adapters/vector/index.d.ts.map +1 -1
  35. package/dist/adapters/vector/index.js +8 -0
  36. package/dist/adapters/vector/index.js.map +1 -1
  37. package/dist/adapters/vector/redis-native.d.ts +35 -0
  38. package/dist/adapters/vector/redis-native.d.ts.map +1 -0
  39. package/dist/adapters/vector/redis-native.js +170 -0
  40. package/dist/adapters/vector/redis-native.js.map +1 -0
  41. package/dist/cli/commands/chat.d.ts +4 -0
  42. package/dist/cli/commands/chat.d.ts.map +1 -0
  43. package/dist/cli/commands/chat.js +374 -0
  44. package/dist/cli/commands/chat.js.map +1 -0
  45. package/dist/cli/commands/maintenance.d.ts +4 -0
  46. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  47. package/dist/cli/commands/maintenance.js +237 -0
  48. package/dist/cli/commands/maintenance.js.map +1 -0
  49. package/dist/cli/commands/rules.d.ts +9 -0
  50. package/dist/cli/commands/rules.d.ts.map +1 -0
  51. package/dist/cli/commands/rules.js +639 -0
  52. package/dist/cli/commands/rules.js.map +1 -0
  53. package/dist/cli/commands/setup.js +5 -4
  54. package/dist/cli/commands/setup.js.map +1 -1
  55. package/dist/cli/index.js +6 -0
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/config/memoryConfig.d.ts +427 -0
  58. package/dist/config/memoryConfig.d.ts.map +1 -0
  59. package/dist/config/memoryConfig.js +258 -0
  60. package/dist/config/memoryConfig.js.map +1 -0
  61. package/dist/config/rulesConfig.d.ts +486 -0
  62. package/dist/config/rulesConfig.d.ts.map +1 -0
  63. package/dist/config/rulesConfig.js +345 -0
  64. package/dist/config/rulesConfig.js.map +1 -0
  65. package/dist/dashboard/coreTools.d.ts +14 -0
  66. package/dist/dashboard/coreTools.d.ts.map +1 -0
  67. package/dist/dashboard/coreTools.js +413 -0
  68. package/dist/dashboard/coreTools.js.map +1 -0
  69. package/dist/dashboard/public/index.html +1982 -13
  70. package/dist/dashboard/server.d.ts +1 -8
  71. package/dist/dashboard/server.d.ts.map +1 -1
  72. package/dist/dashboard/server.js +846 -13
  73. package/dist/dashboard/server.js.map +1 -1
  74. package/dist/dashboard/toolRegistry.d.ts +192 -0
  75. package/dist/dashboard/toolRegistry.d.ts.map +1 -0
  76. package/dist/dashboard/toolRegistry.js +322 -0
  77. package/dist/dashboard/toolRegistry.js.map +1 -0
  78. package/dist/proxy/index.d.ts +1 -1
  79. package/dist/proxy/index.d.ts.map +1 -1
  80. package/dist/proxy/index.js +9 -6
  81. package/dist/proxy/index.js.map +1 -1
  82. package/dist/server/index.js +21 -0
  83. package/dist/server/index.js.map +1 -1
  84. package/dist/server/tools/crawl.d.ts.map +1 -1
  85. package/dist/server/tools/crawl.js +8 -0
  86. package/dist/server/tools/crawl.js.map +1 -1
  87. package/dist/server/tools/index.d.ts.map +1 -1
  88. package/dist/server/tools/index.js +19 -1
  89. package/dist/server/tools/index.js.map +1 -1
  90. package/dist/server/tools/ingest.d.ts.map +1 -1
  91. package/dist/server/tools/ingest.js +5 -0
  92. package/dist/server/tools/ingest.js.map +1 -1
  93. package/dist/server/tools/memory.d.ts +250 -0
  94. package/dist/server/tools/memory.d.ts.map +1 -0
  95. package/dist/server/tools/memory.js +472 -0
  96. package/dist/server/tools/memory.js.map +1 -0
  97. package/dist/server/tools/recursive-query.d.ts.map +1 -1
  98. package/dist/server/tools/recursive-query.js +6 -0
  99. package/dist/server/tools/recursive-query.js.map +1 -1
  100. package/dist/server/tools/search.d.ts.map +1 -1
  101. package/dist/server/tools/search.js +6 -0
  102. package/dist/server/tools/search.js.map +1 -1
  103. package/dist/services/activity-log.d.ts +10 -0
  104. package/dist/services/activity-log.d.ts.map +1 -0
  105. package/dist/services/activity-log.js +53 -0
  106. package/dist/services/activity-log.js.map +1 -0
  107. package/dist/services/categoryManager.d.ts +110 -0
  108. package/dist/services/categoryManager.d.ts.map +1 -0
  109. package/dist/services/categoryManager.js +549 -0
  110. package/dist/services/categoryManager.js.map +1 -0
  111. package/dist/services/contextEnvironment.d.ts +206 -0
  112. package/dist/services/contextEnvironment.d.ts.map +1 -0
  113. package/dist/services/contextEnvironment.js +481 -0
  114. package/dist/services/contextEnvironment.js.map +1 -0
  115. package/dist/services/conversationProcessor.d.ts +99 -0
  116. package/dist/services/conversationProcessor.d.ts.map +1 -0
  117. package/dist/services/conversationProcessor.js +311 -0
  118. package/dist/services/conversationProcessor.js.map +1 -0
  119. package/dist/services/cursorChatReader.d.ts +129 -0
  120. package/dist/services/cursorChatReader.d.ts.map +1 -0
  121. package/dist/services/cursorChatReader.js +419 -0
  122. package/dist/services/cursorChatReader.js.map +1 -0
  123. package/dist/services/decayCalculator.d.ts +85 -0
  124. package/dist/services/decayCalculator.d.ts.map +1 -0
  125. package/dist/services/decayCalculator.js +182 -0
  126. package/dist/services/decayCalculator.js.map +1 -0
  127. package/dist/services/enhancedVectorStore.d.ts +102 -0
  128. package/dist/services/enhancedVectorStore.d.ts.map +1 -0
  129. package/dist/services/enhancedVectorStore.js +245 -0
  130. package/dist/services/enhancedVectorStore.js.map +1 -0
  131. package/dist/services/hybridScorer.d.ts +120 -0
  132. package/dist/services/hybridScorer.d.ts.map +1 -0
  133. package/dist/services/hybridScorer.js +334 -0
  134. package/dist/services/hybridScorer.js.map +1 -0
  135. package/dist/services/knowledgeExtractor.d.ts +45 -0
  136. package/dist/services/knowledgeExtractor.d.ts.map +1 -0
  137. package/dist/services/knowledgeExtractor.js +436 -0
  138. package/dist/services/knowledgeExtractor.js.map +1 -0
  139. package/dist/services/knowledgeStorage.d.ts +102 -0
  140. package/dist/services/knowledgeStorage.d.ts.map +1 -0
  141. package/dist/services/knowledgeStorage.js +383 -0
  142. package/dist/services/knowledgeStorage.js.map +1 -0
  143. package/dist/services/maintenanceScheduler.d.ts +89 -0
  144. package/dist/services/maintenanceScheduler.d.ts.map +1 -0
  145. package/dist/services/maintenanceScheduler.js +479 -0
  146. package/dist/services/maintenanceScheduler.js.map +1 -0
  147. package/dist/services/memoryMetadataStore.d.ts +62 -0
  148. package/dist/services/memoryMetadataStore.d.ts.map +1 -0
  149. package/dist/services/memoryMetadataStore.js +570 -0
  150. package/dist/services/memoryMetadataStore.js.map +1 -0
  151. package/dist/services/recursiveRetrieval.d.ts +122 -0
  152. package/dist/services/recursiveRetrieval.d.ts.map +1 -0
  153. package/dist/services/recursiveRetrieval.js +443 -0
  154. package/dist/services/recursiveRetrieval.js.map +1 -0
  155. package/dist/services/relationshipGraph.d.ts +77 -0
  156. package/dist/services/relationshipGraph.d.ts.map +1 -0
  157. package/dist/services/relationshipGraph.js +411 -0
  158. package/dist/services/relationshipGraph.js.map +1 -0
  159. package/dist/services/rlmSafeguards.d.ts +273 -0
  160. package/dist/services/rlmSafeguards.d.ts.map +1 -0
  161. package/dist/services/rlmSafeguards.js +705 -0
  162. package/dist/services/rlmSafeguards.js.map +1 -0
  163. package/dist/services/rulesAnalyzer.d.ts +119 -0
  164. package/dist/services/rulesAnalyzer.d.ts.map +1 -0
  165. package/dist/services/rulesAnalyzer.js +768 -0
  166. package/dist/services/rulesAnalyzer.js.map +1 -0
  167. package/dist/services/rulesMerger.d.ts +75 -0
  168. package/dist/services/rulesMerger.d.ts.map +1 -0
  169. package/dist/services/rulesMerger.js +404 -0
  170. package/dist/services/rulesMerger.js.map +1 -0
  171. package/dist/services/rulesParser.d.ts +127 -0
  172. package/dist/services/rulesParser.d.ts.map +1 -0
  173. package/dist/services/rulesParser.js +594 -0
  174. package/dist/services/rulesParser.js.map +1 -0
  175. package/dist/services/smartChunker.d.ts +110 -0
  176. package/dist/services/smartChunker.d.ts.map +1 -0
  177. package/dist/services/smartChunker.js +520 -0
  178. package/dist/services/smartChunker.js.map +1 -0
  179. package/dist/types/categories.d.ts +105 -0
  180. package/dist/types/categories.d.ts.map +1 -0
  181. package/dist/types/categories.js +108 -0
  182. package/dist/types/categories.js.map +1 -0
  183. package/dist/types/extractedKnowledge.d.ts +233 -0
  184. package/dist/types/extractedKnowledge.d.ts.map +1 -0
  185. package/dist/types/extractedKnowledge.js +56 -0
  186. package/dist/types/extractedKnowledge.js.map +1 -0
  187. package/dist/types/index.d.ts +9 -2
  188. package/dist/types/index.d.ts.map +1 -1
  189. package/dist/types/index.js +12 -1
  190. package/dist/types/index.js.map +1 -1
  191. package/dist/types/llmProvider.d.ts +282 -0
  192. package/dist/types/llmProvider.d.ts.map +1 -0
  193. package/dist/types/llmProvider.js +48 -0
  194. package/dist/types/llmProvider.js.map +1 -0
  195. package/dist/types/memory.d.ts +227 -0
  196. package/dist/types/memory.d.ts.map +1 -0
  197. package/dist/types/memory.js +76 -0
  198. package/dist/types/memory.js.map +1 -0
  199. package/dist/types/relationships.d.ts +167 -0
  200. package/dist/types/relationships.d.ts.map +1 -0
  201. package/dist/types/relationships.js +106 -0
  202. package/dist/types/relationships.js.map +1 -0
  203. package/dist/types/rulesOptimizer.d.ts +345 -0
  204. package/dist/types/rulesOptimizer.d.ts.map +1 -0
  205. package/dist/types/rulesOptimizer.js +22 -0
  206. package/dist/types/rulesOptimizer.js.map +1 -0
  207. package/docs/cursor-recursive-rag-memory-spec.md +4569 -0
  208. package/docs/cursor-recursive-rag-tasks.md +1355 -0
  209. package/package.json +6 -3
  210. 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