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,479 @@
|
|
|
1
|
+
import { getMemoryMetadataStore } from './memoryMetadataStore.js';
|
|
2
|
+
import { getDecayCalculator } from './decayCalculator.js';
|
|
3
|
+
import { getCategoryManager } from './categoryManager.js';
|
|
4
|
+
import { getRelationshipGraph } from './relationshipGraph.js';
|
|
5
|
+
const DEFAULT_SCHEDULER_CONFIG = {
|
|
6
|
+
nightlyCron: '0 3 * * *', // 3 AM daily
|
|
7
|
+
weeklyCron: '0 4 * * 0', // 4 AM Sunday
|
|
8
|
+
monthlyCron: '0 5 1 * *', // 5 AM 1st of month
|
|
9
|
+
enableAutoScheduling: false,
|
|
10
|
+
};
|
|
11
|
+
export class MaintenanceScheduler {
|
|
12
|
+
metadataStore;
|
|
13
|
+
decayCalculator;
|
|
14
|
+
categoryManager;
|
|
15
|
+
relationshipGraph;
|
|
16
|
+
config;
|
|
17
|
+
running = false;
|
|
18
|
+
intervalIds = [];
|
|
19
|
+
stats;
|
|
20
|
+
constructor(metadataStore, decayCalculator, categoryManager, relationshipGraph, config) {
|
|
21
|
+
this.metadataStore = metadataStore || getMemoryMetadataStore();
|
|
22
|
+
this.decayCalculator = decayCalculator || getDecayCalculator();
|
|
23
|
+
this.categoryManager = categoryManager || getCategoryManager(this.metadataStore);
|
|
24
|
+
this.relationshipGraph = relationshipGraph || getRelationshipGraph(this.metadataStore);
|
|
25
|
+
this.config = { ...DEFAULT_SCHEDULER_CONFIG, ...config };
|
|
26
|
+
this.stats = {
|
|
27
|
+
lastDecayUpdate: null,
|
|
28
|
+
lastConsolidation: null,
|
|
29
|
+
lastSummarization: null,
|
|
30
|
+
lastReindex: null,
|
|
31
|
+
totalJobsRun: 0,
|
|
32
|
+
totalErrors: 0,
|
|
33
|
+
jobHistory: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
isRunning() {
|
|
37
|
+
return this.running;
|
|
38
|
+
}
|
|
39
|
+
getStats() {
|
|
40
|
+
return { ...this.stats, jobHistory: [...this.stats.jobHistory] };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Start the background scheduler using setInterval
|
|
44
|
+
* Note: For production use with persistent scheduling, consider using node-cron
|
|
45
|
+
*/
|
|
46
|
+
start() {
|
|
47
|
+
if (this.running) {
|
|
48
|
+
console.log('Scheduler already running');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.running = true;
|
|
52
|
+
console.log('Maintenance scheduler started');
|
|
53
|
+
console.log('Schedules:');
|
|
54
|
+
console.log(` - Decay updates: hourly`);
|
|
55
|
+
console.log(` - Nightly consolidation: daily at 3 AM`);
|
|
56
|
+
console.log(` - Weekly summarization: Sunday at 4 AM`);
|
|
57
|
+
console.log(` - Monthly reindex: 1st of month at 5 AM`);
|
|
58
|
+
// Hourly decay update (every hour)
|
|
59
|
+
const hourlyId = setInterval(async () => {
|
|
60
|
+
await this.runDecayUpdate().catch(err => {
|
|
61
|
+
console.error('Hourly decay update failed:', err);
|
|
62
|
+
});
|
|
63
|
+
}, 60 * 60 * 1000); // 1 hour
|
|
64
|
+
this.intervalIds.push(hourlyId);
|
|
65
|
+
// Calculate next run times and schedule
|
|
66
|
+
this.scheduleNightly();
|
|
67
|
+
this.scheduleWeekly();
|
|
68
|
+
this.scheduleMonthly();
|
|
69
|
+
}
|
|
70
|
+
stop() {
|
|
71
|
+
if (!this.running)
|
|
72
|
+
return;
|
|
73
|
+
for (const id of this.intervalIds) {
|
|
74
|
+
clearInterval(id);
|
|
75
|
+
}
|
|
76
|
+
this.intervalIds = [];
|
|
77
|
+
this.running = false;
|
|
78
|
+
console.log('Maintenance scheduler stopped');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Run a specific maintenance job manually
|
|
82
|
+
*/
|
|
83
|
+
async runJob(jobName) {
|
|
84
|
+
switch (jobName) {
|
|
85
|
+
case 'decay':
|
|
86
|
+
return this.runDecayUpdate();
|
|
87
|
+
case 'consolidate':
|
|
88
|
+
return this.runNightlyConsolidation();
|
|
89
|
+
case 'summarize':
|
|
90
|
+
return this.runWeeklySummarization();
|
|
91
|
+
case 'reindex':
|
|
92
|
+
return this.runMonthlyReindex();
|
|
93
|
+
case 'cleanup':
|
|
94
|
+
return this.runCleanup();
|
|
95
|
+
default:
|
|
96
|
+
throw new Error(`Unknown job type: ${jobName}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Update decay scores for all chunks
|
|
101
|
+
*/
|
|
102
|
+
async runDecayUpdate() {
|
|
103
|
+
const startTime = new Date();
|
|
104
|
+
const errors = [];
|
|
105
|
+
const metrics = {};
|
|
106
|
+
try {
|
|
107
|
+
const result = this.decayCalculator.updateAllDecayScores(this.metadataStore, false);
|
|
108
|
+
metrics.chunksUpdated = result.updated;
|
|
109
|
+
metrics.duration = result.duration;
|
|
110
|
+
this.stats.lastDecayUpdate = new Date();
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
114
|
+
}
|
|
115
|
+
const endTime = new Date();
|
|
116
|
+
const jobResult = this.createJobResult('decay', startTime, endTime, metrics, errors);
|
|
117
|
+
this.recordJobResult(jobResult);
|
|
118
|
+
return jobResult;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Nightly consolidation: decay updates, duplicate detection, hot item promotion
|
|
122
|
+
*/
|
|
123
|
+
async runNightlyConsolidation() {
|
|
124
|
+
const startTime = new Date();
|
|
125
|
+
const errors = [];
|
|
126
|
+
const metrics = {
|
|
127
|
+
decayUpdated: 0,
|
|
128
|
+
duplicatesFound: 0,
|
|
129
|
+
hotItemsPromoted: 0,
|
|
130
|
+
itemsArchived: 0,
|
|
131
|
+
};
|
|
132
|
+
console.log('Running nightly consolidation...');
|
|
133
|
+
try {
|
|
134
|
+
// 1. Update all decay scores
|
|
135
|
+
const decayResult = this.decayCalculator.updateAllDecayScores(this.metadataStore, false);
|
|
136
|
+
metrics.decayUpdated = decayResult.updated;
|
|
137
|
+
console.log(` Updated ${decayResult.updated} decay scores`);
|
|
138
|
+
// 2. Find and consolidate near-duplicates
|
|
139
|
+
const duplicates = await this.findDuplicates();
|
|
140
|
+
metrics.duplicatesFound = duplicates.length;
|
|
141
|
+
for (const group of duplicates) {
|
|
142
|
+
try {
|
|
143
|
+
await this.mergeDuplicates(group);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
errors.push(`Failed to merge duplicates: ${err instanceof Error ? err.message : String(err)}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
console.log(` Found ${duplicates.length} duplicate groups`);
|
|
150
|
+
// 3. Promote frequently accessed items (increase importance)
|
|
151
|
+
const hotItems = this.getHotItems(24); // Last 24 hours
|
|
152
|
+
for (const item of hotItems) {
|
|
153
|
+
this.promoteItem(item.chunkId, 0.05);
|
|
154
|
+
}
|
|
155
|
+
metrics.hotItemsPromoted = hotItems.length;
|
|
156
|
+
console.log(` Promoted ${hotItems.length} hot items`);
|
|
157
|
+
// 4. Archive items with very low decay scores
|
|
158
|
+
const archivedIds = this.metadataStore.archiveStaleChunks(0.15);
|
|
159
|
+
metrics.itemsArchived = archivedIds.length;
|
|
160
|
+
console.log(` Archived ${archivedIds.length} stale items`);
|
|
161
|
+
this.stats.lastConsolidation = new Date();
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
165
|
+
}
|
|
166
|
+
const endTime = new Date();
|
|
167
|
+
const duration = (endTime.getTime() - startTime.getTime()) / 1000;
|
|
168
|
+
console.log(`Nightly consolidation completed in ${duration.toFixed(1)}s`);
|
|
169
|
+
const jobResult = this.createJobResult('consolidate', startTime, endTime, metrics, errors);
|
|
170
|
+
this.recordJobResult(jobResult);
|
|
171
|
+
return jobResult;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Weekly summarization: update all category summaries
|
|
175
|
+
*/
|
|
176
|
+
async runWeeklySummarization() {
|
|
177
|
+
const startTime = new Date();
|
|
178
|
+
const errors = [];
|
|
179
|
+
const metrics = {
|
|
180
|
+
categoriesUpdated: 0,
|
|
181
|
+
contradictionsFound: 0,
|
|
182
|
+
};
|
|
183
|
+
console.log('Running weekly summarization...');
|
|
184
|
+
try {
|
|
185
|
+
await this.categoryManager.initialize();
|
|
186
|
+
const categories = this.metadataStore.listCategories();
|
|
187
|
+
for (const category of categories) {
|
|
188
|
+
try {
|
|
189
|
+
const result = await this.categoryManager.evolveSummary(category.name);
|
|
190
|
+
if (result && result.itemsIntegrated > 0) {
|
|
191
|
+
metrics.categoriesUpdated++;
|
|
192
|
+
if (result.hadContradictions) {
|
|
193
|
+
metrics.contradictionsFound++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
errors.push(`Failed to evolve summary for ${category.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
console.log(` Updated ${metrics.categoriesUpdated} category summaries`);
|
|
202
|
+
if (metrics.contradictionsFound > 0) {
|
|
203
|
+
console.log(` Resolved ${metrics.contradictionsFound} contradictions`);
|
|
204
|
+
}
|
|
205
|
+
this.stats.lastSummarization = new Date();
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
209
|
+
}
|
|
210
|
+
const endTime = new Date();
|
|
211
|
+
const duration = (endTime.getTime() - startTime.getTime()) / 1000;
|
|
212
|
+
console.log(`Weekly summarization completed in ${duration.toFixed(1)}s`);
|
|
213
|
+
const jobResult = this.createJobResult('summarize', startTime, endTime, metrics, errors);
|
|
214
|
+
this.recordJobResult(jobResult);
|
|
215
|
+
return jobResult;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Monthly reindex: cleanup, relationship re-weighting, database optimization
|
|
219
|
+
*/
|
|
220
|
+
async runMonthlyReindex() {
|
|
221
|
+
const startTime = new Date();
|
|
222
|
+
const errors = [];
|
|
223
|
+
const metrics = {
|
|
224
|
+
relationshipsReweighted: 0,
|
|
225
|
+
oldItemsArchived: 0,
|
|
226
|
+
orphanedItemsCleaned: 0,
|
|
227
|
+
};
|
|
228
|
+
console.log('Running monthly reindex...');
|
|
229
|
+
try {
|
|
230
|
+
// 1. Re-weight relationships based on graph analysis
|
|
231
|
+
const graphStats = this.relationshipGraph.getStats();
|
|
232
|
+
metrics.totalRelationships = graphStats.totalRelationships;
|
|
233
|
+
// Find isolated chunks and weak relationships
|
|
234
|
+
metrics.isolatedChunks = graphStats.isolatedChunks;
|
|
235
|
+
console.log(` Graph has ${graphStats.totalRelationships} relationships, ${graphStats.isolatedChunks} isolated chunks`);
|
|
236
|
+
// 2. Archive very old, never-accessed items
|
|
237
|
+
const oldChunks = this.getOldUnusedChunks(180); // 6 months
|
|
238
|
+
for (const chunk of oldChunks) {
|
|
239
|
+
this.metadataStore.archiveChunk(chunk.chunkId);
|
|
240
|
+
}
|
|
241
|
+
metrics.oldItemsArchived = oldChunks.length;
|
|
242
|
+
console.log(` Archived ${oldChunks.length} old unused items`);
|
|
243
|
+
// 3. Clean up orphaned data
|
|
244
|
+
const orphanedCleaned = await this.cleanupOrphanedData();
|
|
245
|
+
metrics.orphanedItemsCleaned = orphanedCleaned;
|
|
246
|
+
console.log(` Cleaned ${orphanedCleaned} orphaned records`);
|
|
247
|
+
// 4. Vacuum database
|
|
248
|
+
this.metadataStore.vacuum();
|
|
249
|
+
console.log(` Database vacuumed`);
|
|
250
|
+
this.stats.lastReindex = new Date();
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
254
|
+
}
|
|
255
|
+
const endTime = new Date();
|
|
256
|
+
const duration = (endTime.getTime() - startTime.getTime()) / 1000;
|
|
257
|
+
console.log(`Monthly reindex completed in ${duration.toFixed(1)}s`);
|
|
258
|
+
const jobResult = this.createJobResult('reindex', startTime, endTime, metrics, errors);
|
|
259
|
+
this.recordJobResult(jobResult);
|
|
260
|
+
return jobResult;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* General cleanup: remove archived items, compress data
|
|
264
|
+
*/
|
|
265
|
+
async runCleanup(dryRun = false) {
|
|
266
|
+
const startTime = new Date();
|
|
267
|
+
const errors = [];
|
|
268
|
+
const metrics = {
|
|
269
|
+
archivedChunksFound: 0,
|
|
270
|
+
lowDecayChunksFound: 0,
|
|
271
|
+
orphanedRelationships: 0,
|
|
272
|
+
wouldDelete: 0,
|
|
273
|
+
deleted: 0,
|
|
274
|
+
};
|
|
275
|
+
console.log(`Running cleanup${dryRun ? ' (dry run)' : ''}...`);
|
|
276
|
+
try {
|
|
277
|
+
// 1. Find all archived chunks
|
|
278
|
+
const allChunks = this.metadataStore.getAllChunkMetadata({ includeArchived: true });
|
|
279
|
+
const archivedChunks = allChunks.filter(c => c.isArchived);
|
|
280
|
+
metrics.archivedChunksFound = archivedChunks.length;
|
|
281
|
+
// 2. Find chunks with very low decay scores
|
|
282
|
+
const lowDecayChunks = allChunks.filter(c => !c.isArchived && c.decayScore < 0.1);
|
|
283
|
+
metrics.lowDecayChunksFound = lowDecayChunks.length;
|
|
284
|
+
// 3. Calculate what would be deleted
|
|
285
|
+
metrics.wouldDelete = archivedChunks.length;
|
|
286
|
+
if (dryRun) {
|
|
287
|
+
console.log(` Would delete ${archivedChunks.length} archived chunks`);
|
|
288
|
+
console.log(` ${lowDecayChunks.length} chunks have low decay scores (candidates for archival)`);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
// Actually delete archived chunks
|
|
292
|
+
for (const chunk of archivedChunks) {
|
|
293
|
+
try {
|
|
294
|
+
this.metadataStore.deleteChunkMetadata(chunk.chunkId);
|
|
295
|
+
metrics.deleted++;
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
errors.push(`Failed to delete ${chunk.chunkId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
console.log(` Deleted ${metrics.deleted} archived chunks`);
|
|
302
|
+
}
|
|
303
|
+
// 4. Vacuum if actual deletion happened
|
|
304
|
+
if (!dryRun && metrics.deleted > 0) {
|
|
305
|
+
this.metadataStore.vacuum();
|
|
306
|
+
console.log(` Database vacuumed`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
311
|
+
}
|
|
312
|
+
const endTime = new Date();
|
|
313
|
+
const duration = (endTime.getTime() - startTime.getTime()) / 1000;
|
|
314
|
+
console.log(`Cleanup completed in ${duration.toFixed(1)}s`);
|
|
315
|
+
const jobResult = this.createJobResult('cleanup', startTime, endTime, metrics, errors);
|
|
316
|
+
this.recordJobResult(jobResult);
|
|
317
|
+
return jobResult;
|
|
318
|
+
}
|
|
319
|
+
scheduleNightly() {
|
|
320
|
+
const now = new Date();
|
|
321
|
+
const next3AM = new Date(now);
|
|
322
|
+
next3AM.setHours(3, 0, 0, 0);
|
|
323
|
+
if (next3AM <= now) {
|
|
324
|
+
next3AM.setDate(next3AM.getDate() + 1);
|
|
325
|
+
}
|
|
326
|
+
const msUntil3AM = next3AM.getTime() - now.getTime();
|
|
327
|
+
setTimeout(() => {
|
|
328
|
+
this.runNightlyConsolidation().catch(console.error);
|
|
329
|
+
// Then run every 24 hours
|
|
330
|
+
const dailyId = setInterval(() => {
|
|
331
|
+
this.runNightlyConsolidation().catch(console.error);
|
|
332
|
+
}, 24 * 60 * 60 * 1000);
|
|
333
|
+
this.intervalIds.push(dailyId);
|
|
334
|
+
}, msUntil3AM);
|
|
335
|
+
}
|
|
336
|
+
scheduleWeekly() {
|
|
337
|
+
const now = new Date();
|
|
338
|
+
const nextSunday4AM = new Date(now);
|
|
339
|
+
nextSunday4AM.setHours(4, 0, 0, 0);
|
|
340
|
+
const daysUntilSunday = (7 - now.getDay()) % 7;
|
|
341
|
+
nextSunday4AM.setDate(nextSunday4AM.getDate() + (daysUntilSunday === 0 && now.getHours() >= 4 ? 7 : daysUntilSunday));
|
|
342
|
+
const msUntilSunday = nextSunday4AM.getTime() - now.getTime();
|
|
343
|
+
setTimeout(() => {
|
|
344
|
+
this.runWeeklySummarization().catch(console.error);
|
|
345
|
+
// Then run every 7 days
|
|
346
|
+
const weeklyId = setInterval(() => {
|
|
347
|
+
this.runWeeklySummarization().catch(console.error);
|
|
348
|
+
}, 7 * 24 * 60 * 60 * 1000);
|
|
349
|
+
this.intervalIds.push(weeklyId);
|
|
350
|
+
}, msUntilSunday);
|
|
351
|
+
}
|
|
352
|
+
scheduleMonthly() {
|
|
353
|
+
const now = new Date();
|
|
354
|
+
const nextFirst5AM = new Date(now.getFullYear(), now.getMonth() + 1, 1, 5, 0, 0);
|
|
355
|
+
if (now.getDate() === 1 && now.getHours() < 5) {
|
|
356
|
+
nextFirst5AM.setMonth(now.getMonth());
|
|
357
|
+
}
|
|
358
|
+
const msUntilFirst = nextFirst5AM.getTime() - now.getTime();
|
|
359
|
+
setTimeout(() => {
|
|
360
|
+
this.runMonthlyReindex().catch(console.error);
|
|
361
|
+
// Schedule next month
|
|
362
|
+
this.scheduleMonthly();
|
|
363
|
+
}, msUntilFirst);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Find potential duplicate chunks based on high similarity
|
|
367
|
+
*/
|
|
368
|
+
async findDuplicates() {
|
|
369
|
+
// For now, we do a basic approach: find chunks with identical sources and similar timestamps
|
|
370
|
+
// A more sophisticated approach would use vector similarity
|
|
371
|
+
const chunks = this.metadataStore.getAllChunkMetadata({ includeArchived: false });
|
|
372
|
+
const duplicateGroups = [];
|
|
373
|
+
const processed = new Set();
|
|
374
|
+
for (const chunk of chunks) {
|
|
375
|
+
if (processed.has(chunk.chunkId))
|
|
376
|
+
continue;
|
|
377
|
+
// Find chunks from the same source within 1 minute
|
|
378
|
+
const potentialDuplicates = chunks.filter(c => {
|
|
379
|
+
if (c.chunkId === chunk.chunkId || processed.has(c.chunkId))
|
|
380
|
+
return false;
|
|
381
|
+
const metadata1 = this.metadataStore.getChunkMetadata(chunk.chunkId);
|
|
382
|
+
const metadata2 = this.metadataStore.getChunkMetadata(c.chunkId);
|
|
383
|
+
if (!metadata1 || !metadata2)
|
|
384
|
+
return false;
|
|
385
|
+
const time1 = new Date(chunk.createdAt).getTime();
|
|
386
|
+
const time2 = new Date(c.createdAt).getTime();
|
|
387
|
+
const timeDiff = Math.abs(time1 - time2);
|
|
388
|
+
return timeDiff < 60000; // Within 1 minute
|
|
389
|
+
});
|
|
390
|
+
if (potentialDuplicates.length > 0) {
|
|
391
|
+
duplicateGroups.push({
|
|
392
|
+
primaryChunkId: chunk.chunkId,
|
|
393
|
+
duplicateChunkIds: potentialDuplicates.map(c => c.chunkId),
|
|
394
|
+
similarity: 0.95,
|
|
395
|
+
});
|
|
396
|
+
processed.add(chunk.chunkId);
|
|
397
|
+
for (const dup of potentialDuplicates) {
|
|
398
|
+
processed.add(dup.chunkId);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return duplicateGroups;
|
|
403
|
+
}
|
|
404
|
+
async mergeDuplicates(group) {
|
|
405
|
+
// Keep the primary chunk, archive the duplicates
|
|
406
|
+
// Transfer any unique relationships to the primary
|
|
407
|
+
for (const dupId of group.duplicateChunkIds) {
|
|
408
|
+
this.metadataStore.archiveChunk(dupId);
|
|
409
|
+
// Could also create a SUPERSEDES relationship
|
|
410
|
+
this.relationshipGraph.markSupersedes(group.primaryChunkId, dupId, group.similarity);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
getHotItems(hours) {
|
|
414
|
+
const since = new Date(Date.now() - hours * 60 * 60 * 1000);
|
|
415
|
+
return this.metadataStore.getAccessStats(since).slice(0, 50);
|
|
416
|
+
}
|
|
417
|
+
promoteItem(chunkId, boost) {
|
|
418
|
+
const metadata = this.metadataStore.getChunkMetadata(chunkId);
|
|
419
|
+
if (metadata) {
|
|
420
|
+
const newImportance = Math.min(1.0, metadata.importance + boost);
|
|
421
|
+
this.metadataStore.upsertChunkMetadata({
|
|
422
|
+
...metadata,
|
|
423
|
+
importance: newImportance,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
getOldUnusedChunks(days) {
|
|
428
|
+
const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
|
|
429
|
+
const chunks = this.metadataStore.getAllChunkMetadata({ includeArchived: false });
|
|
430
|
+
return chunks.filter(c => {
|
|
431
|
+
const createdAt = new Date(c.createdAt);
|
|
432
|
+
return createdAt < cutoff && c.accessCount === 0;
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
async cleanupOrphanedData() {
|
|
436
|
+
// This would clean up:
|
|
437
|
+
// - Category items pointing to non-existent chunks
|
|
438
|
+
// - Relationships pointing to non-existent chunks
|
|
439
|
+
// - Access logs for deleted chunks
|
|
440
|
+
// For now, return 0 as a placeholder - the delete function handles cascading deletes
|
|
441
|
+
return 0;
|
|
442
|
+
}
|
|
443
|
+
createJobResult(jobName, startTime, endTime, metrics, errors) {
|
|
444
|
+
return {
|
|
445
|
+
jobName,
|
|
446
|
+
success: errors.length === 0,
|
|
447
|
+
startTime,
|
|
448
|
+
endTime,
|
|
449
|
+
duration: endTime.getTime() - startTime.getTime(),
|
|
450
|
+
metrics,
|
|
451
|
+
errors,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
recordJobResult(result) {
|
|
455
|
+
this.stats.totalJobsRun++;
|
|
456
|
+
if (!result.success) {
|
|
457
|
+
this.stats.totalErrors += result.errors.length;
|
|
458
|
+
}
|
|
459
|
+
// Keep last 100 job results
|
|
460
|
+
this.stats.jobHistory.push(result);
|
|
461
|
+
if (this.stats.jobHistory.length > 100) {
|
|
462
|
+
this.stats.jobHistory.shift();
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
let instance = null;
|
|
467
|
+
export function getMaintenanceScheduler(metadataStore, config) {
|
|
468
|
+
if (!instance) {
|
|
469
|
+
instance = new MaintenanceScheduler(metadataStore, undefined, undefined, undefined, config);
|
|
470
|
+
}
|
|
471
|
+
return instance;
|
|
472
|
+
}
|
|
473
|
+
export function resetMaintenanceScheduler() {
|
|
474
|
+
if (instance) {
|
|
475
|
+
instance.stop();
|
|
476
|
+
instance = null;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=maintenanceScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenanceScheduler.js","sourceRoot":"","sources":["../../src/services/maintenanceScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ChunkMetadata, ChunkRelationship, RelationshipType, Category, CategoryItem, ProcessedConversation, MemoryStats, ChunkType } from '../types/memory.js';
|
|
2
|
+
/**
|
|
3
|
+
* SQLite-based metadata store for memory tracking
|
|
4
|
+
*
|
|
5
|
+
* This store maintains temporal metadata, access patterns, and relationships
|
|
6
|
+
* independently of the vector store, allowing any vector backend to gain
|
|
7
|
+
* memory capabilities.
|
|
8
|
+
*/
|
|
9
|
+
export declare class MemoryMetadataStore {
|
|
10
|
+
private db;
|
|
11
|
+
private dbPath;
|
|
12
|
+
constructor(dbPath?: string);
|
|
13
|
+
private initialize;
|
|
14
|
+
upsertChunkMetadata(metadata: Partial<ChunkMetadata> & {
|
|
15
|
+
chunkId: string;
|
|
16
|
+
source?: string;
|
|
17
|
+
}): void;
|
|
18
|
+
getChunkMetadata(chunkId: string): ChunkMetadata | null;
|
|
19
|
+
getAllChunkMetadata(options?: {
|
|
20
|
+
includeArchived?: boolean;
|
|
21
|
+
minDecayScore?: number;
|
|
22
|
+
chunkTypes?: ChunkType[];
|
|
23
|
+
}): ChunkMetadata[];
|
|
24
|
+
recordAccess(chunkId: string, queryText?: string, resultRank?: number): void;
|
|
25
|
+
updateDecayScore(chunkId: string, decayScore: number): void;
|
|
26
|
+
bulkUpdateDecayScores(updates: Array<{
|
|
27
|
+
chunkId: string;
|
|
28
|
+
decayScore: number;
|
|
29
|
+
}>): void;
|
|
30
|
+
archiveChunk(chunkId: string): void;
|
|
31
|
+
archiveStaleChunks(decayThreshold: number): string[];
|
|
32
|
+
deleteChunkMetadata(chunkId: string): void;
|
|
33
|
+
addRelationship(fromChunkId: string, toChunkId: string, relationshipType: RelationshipType, strength?: number, metadata?: Record<string, unknown>): void;
|
|
34
|
+
getRelationships(chunkId: string, direction?: 'from' | 'to' | 'both'): ChunkRelationship[];
|
|
35
|
+
getRelatedChunkIds(chunkId: string, relationshipType?: RelationshipType): string[];
|
|
36
|
+
findContradictions(chunkId: string): ChunkRelationship[];
|
|
37
|
+
deleteRelationship(fromChunkId: string, toChunkId: string, relationshipType: RelationshipType): void;
|
|
38
|
+
upsertCategory(category: Partial<Category> & {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
}): void;
|
|
42
|
+
getCategory(id: string): Category | null;
|
|
43
|
+
getCategoryByName(name: string): Category | null;
|
|
44
|
+
listCategories(): Category[];
|
|
45
|
+
assignChunkToCategory(chunkId: string, categoryId: string, relevanceScore?: number): void;
|
|
46
|
+
getChunkCategories(chunkId: string): CategoryItem[];
|
|
47
|
+
getCategoryChunks(categoryId: string): CategoryItem[];
|
|
48
|
+
markConversationProcessed(conversationId: string, messageCount: number, chunksCreated: number, knowledgeExtracted: number): void;
|
|
49
|
+
isConversationProcessed(conversationId: string): boolean;
|
|
50
|
+
getProcessedConversation(conversationId: string): ProcessedConversation | null;
|
|
51
|
+
getMemoryStats(): MemoryStats;
|
|
52
|
+
getAccessStats(since?: Date): {
|
|
53
|
+
chunkId: string;
|
|
54
|
+
accessCount: number;
|
|
55
|
+
lastAccess: string;
|
|
56
|
+
}[];
|
|
57
|
+
close(): void;
|
|
58
|
+
vacuum(): void;
|
|
59
|
+
}
|
|
60
|
+
export declare function getMemoryMetadataStore(dbPath?: string): MemoryMetadataStore;
|
|
61
|
+
export declare function closeMemoryMetadataStore(): void;
|
|
62
|
+
//# sourceMappingURL=memoryMetadataStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryMetadataStore.d.ts","sourceRoot":"","sources":["../../src/services/memoryMetadataStore.ts"],"names":[],"mappings":"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"}
|