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,570 @@
1
+ import Database from 'better-sqlite3';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+ import { existsSync, mkdirSync } from 'fs';
5
+ const DEFAULT_DB_PATH = join(homedir(), '.cursor-rag', 'memory.db');
6
+ /**
7
+ * SQLite-based metadata store for memory tracking
8
+ *
9
+ * This store maintains temporal metadata, access patterns, and relationships
10
+ * independently of the vector store, allowing any vector backend to gain
11
+ * memory capabilities.
12
+ */
13
+ export class MemoryMetadataStore {
14
+ db;
15
+ dbPath;
16
+ constructor(dbPath = DEFAULT_DB_PATH) {
17
+ this.dbPath = dbPath;
18
+ // Ensure directory exists
19
+ const dir = join(dbPath, '..');
20
+ if (!existsSync(dir)) {
21
+ mkdirSync(dir, { recursive: true });
22
+ }
23
+ this.db = new Database(dbPath);
24
+ this.db.pragma('journal_mode = WAL');
25
+ this.initialize();
26
+ }
27
+ initialize() {
28
+ this.db.exec(`
29
+ -- Chunk metadata (extends vector store data)
30
+ CREATE TABLE IF NOT EXISTS chunks_metadata (
31
+ chunk_id TEXT PRIMARY KEY,
32
+ source TEXT NOT NULL,
33
+ chunk_type TEXT NOT NULL DEFAULT 'documentation',
34
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
35
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
36
+ last_accessed_at DATETIME,
37
+ access_count INTEGER DEFAULT 0,
38
+ importance REAL DEFAULT 0.5,
39
+ decay_score REAL DEFAULT 1.0,
40
+ is_archived BOOLEAN DEFAULT FALSE,
41
+ source_conversation_id TEXT,
42
+ source_message_index INTEGER,
43
+ entities_json TEXT
44
+ );
45
+
46
+ -- Relationships between chunks
47
+ CREATE TABLE IF NOT EXISTS relationships (
48
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
49
+ from_chunk_id TEXT NOT NULL,
50
+ to_chunk_id TEXT NOT NULL,
51
+ relationship_type TEXT NOT NULL,
52
+ strength REAL DEFAULT 0.5,
53
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
54
+ metadata_json TEXT,
55
+ UNIQUE(from_chunk_id, to_chunk_id, relationship_type)
56
+ );
57
+
58
+ -- Access log for analytics
59
+ CREATE TABLE IF NOT EXISTS access_log (
60
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
61
+ chunk_id TEXT NOT NULL,
62
+ accessed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
63
+ query_text TEXT,
64
+ result_rank INTEGER,
65
+ was_clicked BOOLEAN DEFAULT FALSE
66
+ );
67
+
68
+ -- Category summaries
69
+ CREATE TABLE IF NOT EXISTS categories (
70
+ id TEXT PRIMARY KEY,
71
+ name TEXT UNIQUE NOT NULL,
72
+ description TEXT,
73
+ parent_id TEXT,
74
+ summary TEXT,
75
+ chunk_count INTEGER DEFAULT 0,
76
+ last_updated DATETIME DEFAULT CURRENT_TIMESTAMP,
77
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
78
+ );
79
+
80
+ -- Category items (chunk assignments)
81
+ CREATE TABLE IF NOT EXISTS category_items (
82
+ id TEXT PRIMARY KEY,
83
+ chunk_id TEXT NOT NULL,
84
+ category_id TEXT NOT NULL,
85
+ relevance_score REAL DEFAULT 0.5,
86
+ assigned_at DATETIME DEFAULT CURRENT_TIMESTAMP,
87
+ UNIQUE(chunk_id, category_id)
88
+ );
89
+
90
+ -- Processed conversations (to avoid re-processing)
91
+ CREATE TABLE IF NOT EXISTS processed_conversations (
92
+ id TEXT PRIMARY KEY,
93
+ conversation_id TEXT UNIQUE NOT NULL,
94
+ processed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
95
+ message_count INTEGER DEFAULT 0,
96
+ chunks_created INTEGER DEFAULT 0,
97
+ knowledge_extracted INTEGER DEFAULT 0
98
+ );
99
+
100
+ -- Indexes for performance
101
+ CREATE INDEX IF NOT EXISTS idx_chunks_decay ON chunks_metadata(decay_score);
102
+ CREATE INDEX IF NOT EXISTS idx_chunks_type ON chunks_metadata(chunk_type);
103
+ CREATE INDEX IF NOT EXISTS idx_chunks_archived ON chunks_metadata(is_archived);
104
+ CREATE INDEX IF NOT EXISTS idx_chunks_source ON chunks_metadata(source);
105
+ CREATE INDEX IF NOT EXISTS idx_relationships_from ON relationships(from_chunk_id);
106
+ CREATE INDEX IF NOT EXISTS idx_relationships_to ON relationships(to_chunk_id);
107
+ CREATE INDEX IF NOT EXISTS idx_relationships_type ON relationships(relationship_type);
108
+ CREATE INDEX IF NOT EXISTS idx_access_log_chunk ON access_log(chunk_id);
109
+ CREATE INDEX IF NOT EXISTS idx_access_log_time ON access_log(accessed_at);
110
+ CREATE INDEX IF NOT EXISTS idx_category_items_chunk ON category_items(chunk_id);
111
+ CREATE INDEX IF NOT EXISTS idx_category_items_category ON category_items(category_id);
112
+ `);
113
+ }
114
+ // ==================== Chunk Metadata Operations ====================
115
+ upsertChunkMetadata(metadata) {
116
+ const now = new Date().toISOString();
117
+ const stmt = this.db.prepare(`
118
+ INSERT INTO chunks_metadata (
119
+ chunk_id, source, chunk_type, created_at, updated_at,
120
+ last_accessed_at, access_count, importance, decay_score,
121
+ is_archived, source_conversation_id, source_message_index, entities_json
122
+ ) VALUES (
123
+ @chunkId, @source, @chunkType, @createdAt, @updatedAt,
124
+ @lastAccessedAt, @accessCount, @importance, @decayScore,
125
+ @isArchived, @sourceConversationId, @sourceMessageIndex, @entitiesJson
126
+ )
127
+ ON CONFLICT(chunk_id) DO UPDATE SET
128
+ source = COALESCE(@source, source),
129
+ chunk_type = COALESCE(@chunkType, chunk_type),
130
+ updated_at = @updatedAt,
131
+ last_accessed_at = COALESCE(@lastAccessedAt, last_accessed_at),
132
+ access_count = COALESCE(@accessCount, access_count),
133
+ importance = COALESCE(@importance, importance),
134
+ decay_score = COALESCE(@decayScore, decay_score),
135
+ is_archived = COALESCE(@isArchived, is_archived),
136
+ source_conversation_id = COALESCE(@sourceConversationId, source_conversation_id),
137
+ source_message_index = COALESCE(@sourceMessageIndex, source_message_index),
138
+ entities_json = COALESCE(@entitiesJson, entities_json)
139
+ `);
140
+ stmt.run({
141
+ chunkId: metadata.chunkId,
142
+ source: metadata.source || 'unknown',
143
+ chunkType: metadata.chunkType || 'documentation',
144
+ createdAt: metadata.createdAt || now,
145
+ updatedAt: now,
146
+ lastAccessedAt: metadata.lastAccessedAt || null,
147
+ accessCount: metadata.accessCount ?? 0,
148
+ importance: metadata.importance ?? 0.5,
149
+ decayScore: metadata.decayScore ?? 1.0,
150
+ isArchived: metadata.isArchived ? 1 : 0,
151
+ sourceConversationId: metadata.sourceConversationId || null,
152
+ sourceMessageIndex: metadata.sourceMessageIndex ?? null,
153
+ entitiesJson: null,
154
+ });
155
+ }
156
+ getChunkMetadata(chunkId) {
157
+ const stmt = this.db.prepare(`
158
+ SELECT * FROM chunks_metadata WHERE chunk_id = ?
159
+ `);
160
+ const row = stmt.get(chunkId);
161
+ if (!row)
162
+ return null;
163
+ return {
164
+ chunkId: row.chunk_id,
165
+ createdAt: row.created_at,
166
+ updatedAt: row.updated_at,
167
+ lastAccessedAt: row.last_accessed_at,
168
+ accessCount: row.access_count,
169
+ importance: row.importance,
170
+ decayScore: row.decay_score,
171
+ isArchived: Boolean(row.is_archived),
172
+ chunkType: row.chunk_type,
173
+ sourceConversationId: row.source_conversation_id,
174
+ sourceMessageIndex: row.source_message_index,
175
+ };
176
+ }
177
+ getAllChunkMetadata(options) {
178
+ let sql = 'SELECT * FROM chunks_metadata WHERE 1=1';
179
+ const params = [];
180
+ if (!options?.includeArchived) {
181
+ sql += ' AND is_archived = 0';
182
+ }
183
+ if (options?.minDecayScore !== undefined) {
184
+ sql += ' AND decay_score >= ?';
185
+ params.push(options.minDecayScore);
186
+ }
187
+ if (options?.chunkTypes && options.chunkTypes.length > 0) {
188
+ sql += ` AND chunk_type IN (${options.chunkTypes.map(() => '?').join(',')})`;
189
+ params.push(...options.chunkTypes);
190
+ }
191
+ sql += ' ORDER BY decay_score DESC';
192
+ const stmt = this.db.prepare(sql);
193
+ const rows = stmt.all(...params);
194
+ return rows.map(row => ({
195
+ chunkId: row.chunk_id,
196
+ createdAt: row.created_at,
197
+ updatedAt: row.updated_at,
198
+ lastAccessedAt: row.last_accessed_at,
199
+ accessCount: row.access_count,
200
+ importance: row.importance,
201
+ decayScore: row.decay_score,
202
+ isArchived: Boolean(row.is_archived),
203
+ chunkType: row.chunk_type,
204
+ sourceConversationId: row.source_conversation_id,
205
+ sourceMessageIndex: row.source_message_index,
206
+ }));
207
+ }
208
+ recordAccess(chunkId, queryText, resultRank) {
209
+ const now = new Date().toISOString();
210
+ // Update chunk metadata
211
+ const updateStmt = this.db.prepare(`
212
+ UPDATE chunks_metadata
213
+ SET last_accessed_at = ?, access_count = access_count + 1, updated_at = ?
214
+ WHERE chunk_id = ?
215
+ `);
216
+ updateStmt.run(now, now, chunkId);
217
+ // Log access
218
+ const logStmt = this.db.prepare(`
219
+ INSERT INTO access_log (chunk_id, accessed_at, query_text, result_rank)
220
+ VALUES (?, ?, ?, ?)
221
+ `);
222
+ logStmt.run(chunkId, now, queryText || null, resultRank ?? null);
223
+ }
224
+ updateDecayScore(chunkId, decayScore) {
225
+ const stmt = this.db.prepare(`
226
+ UPDATE chunks_metadata
227
+ SET decay_score = ?, updated_at = CURRENT_TIMESTAMP
228
+ WHERE chunk_id = ?
229
+ `);
230
+ stmt.run(decayScore, chunkId);
231
+ }
232
+ bulkUpdateDecayScores(updates) {
233
+ const stmt = this.db.prepare(`
234
+ UPDATE chunks_metadata
235
+ SET decay_score = ?, updated_at = CURRENT_TIMESTAMP
236
+ WHERE chunk_id = ?
237
+ `);
238
+ const transaction = this.db.transaction((items) => {
239
+ for (const item of items) {
240
+ stmt.run(item.decayScore, item.chunkId);
241
+ }
242
+ });
243
+ transaction(updates);
244
+ }
245
+ archiveChunk(chunkId) {
246
+ const stmt = this.db.prepare(`
247
+ UPDATE chunks_metadata
248
+ SET is_archived = 1, updated_at = CURRENT_TIMESTAMP
249
+ WHERE chunk_id = ?
250
+ `);
251
+ stmt.run(chunkId);
252
+ }
253
+ archiveStaleChunks(decayThreshold) {
254
+ const selectStmt = this.db.prepare(`
255
+ SELECT chunk_id FROM chunks_metadata
256
+ WHERE decay_score < ? AND is_archived = 0
257
+ `);
258
+ const rows = selectStmt.all(decayThreshold);
259
+ const chunkIds = rows.map(r => r.chunk_id);
260
+ if (chunkIds.length > 0) {
261
+ const updateStmt = this.db.prepare(`
262
+ UPDATE chunks_metadata
263
+ SET is_archived = 1, updated_at = CURRENT_TIMESTAMP
264
+ WHERE chunk_id = ?
265
+ `);
266
+ const transaction = this.db.transaction((ids) => {
267
+ for (const id of ids) {
268
+ updateStmt.run(id);
269
+ }
270
+ });
271
+ transaction(chunkIds);
272
+ }
273
+ return chunkIds;
274
+ }
275
+ deleteChunkMetadata(chunkId) {
276
+ // Delete in correct order to respect foreign keys
277
+ this.db.prepare('DELETE FROM access_log WHERE chunk_id = ?').run(chunkId);
278
+ this.db.prepare('DELETE FROM category_items WHERE chunk_id = ?').run(chunkId);
279
+ this.db.prepare('DELETE FROM relationships WHERE from_chunk_id = ? OR to_chunk_id = ?').run(chunkId, chunkId);
280
+ this.db.prepare('DELETE FROM chunks_metadata WHERE chunk_id = ?').run(chunkId);
281
+ }
282
+ // ==================== Relationship Operations ====================
283
+ addRelationship(fromChunkId, toChunkId, relationshipType, strength = 0.5, metadata) {
284
+ const stmt = this.db.prepare(`
285
+ INSERT INTO relationships (from_chunk_id, to_chunk_id, relationship_type, strength, metadata_json)
286
+ VALUES (?, ?, ?, ?, ?)
287
+ ON CONFLICT(from_chunk_id, to_chunk_id, relationship_type) DO UPDATE SET
288
+ strength = ?, metadata_json = COALESCE(?, metadata_json)
289
+ `);
290
+ const metadataJson = metadata ? JSON.stringify(metadata) : null;
291
+ stmt.run(fromChunkId, toChunkId, relationshipType, strength, metadataJson, strength, metadataJson);
292
+ }
293
+ getRelationships(chunkId, direction = 'both') {
294
+ let sql;
295
+ let params;
296
+ if (direction === 'from') {
297
+ sql = 'SELECT * FROM relationships WHERE from_chunk_id = ?';
298
+ params = [chunkId];
299
+ }
300
+ else if (direction === 'to') {
301
+ sql = 'SELECT * FROM relationships WHERE to_chunk_id = ?';
302
+ params = [chunkId];
303
+ }
304
+ else {
305
+ sql = 'SELECT * FROM relationships WHERE from_chunk_id = ? OR to_chunk_id = ?';
306
+ params = [chunkId, chunkId];
307
+ }
308
+ const rows = this.db.prepare(sql).all(...params);
309
+ return rows.map(row => ({
310
+ id: String(row.id),
311
+ sourceChunkId: row.from_chunk_id,
312
+ targetChunkId: row.to_chunk_id,
313
+ relationshipType: row.relationship_type,
314
+ strength: row.strength,
315
+ metadata: row.metadata_json ? JSON.parse(row.metadata_json) : {},
316
+ createdAt: row.created_at,
317
+ }));
318
+ }
319
+ getRelatedChunkIds(chunkId, relationshipType) {
320
+ let sql = `
321
+ SELECT DISTINCT
322
+ CASE WHEN from_chunk_id = ? THEN to_chunk_id ELSE from_chunk_id END as related_id
323
+ FROM relationships
324
+ WHERE from_chunk_id = ? OR to_chunk_id = ?
325
+ `;
326
+ const params = [chunkId, chunkId, chunkId];
327
+ if (relationshipType) {
328
+ sql += ' AND relationship_type = ?';
329
+ params.push(relationshipType);
330
+ }
331
+ const rows = this.db.prepare(sql).all(...params);
332
+ return rows.map(r => r.related_id);
333
+ }
334
+ findContradictions(chunkId) {
335
+ const stmt = this.db.prepare(`
336
+ SELECT * FROM relationships
337
+ WHERE (from_chunk_id = ? OR to_chunk_id = ?)
338
+ AND relationship_type = 'contradicts'
339
+ `);
340
+ const rows = stmt.all(chunkId, chunkId);
341
+ return rows.map(row => ({
342
+ id: String(row.id),
343
+ sourceChunkId: row.from_chunk_id,
344
+ targetChunkId: row.to_chunk_id,
345
+ relationshipType: row.relationship_type,
346
+ strength: row.strength,
347
+ metadata: row.metadata_json ? JSON.parse(row.metadata_json) : {},
348
+ createdAt: row.created_at,
349
+ }));
350
+ }
351
+ deleteRelationship(fromChunkId, toChunkId, relationshipType) {
352
+ this.db.prepare(`
353
+ DELETE FROM relationships
354
+ WHERE from_chunk_id = ? AND to_chunk_id = ? AND relationship_type = ?
355
+ `).run(fromChunkId, toChunkId, relationshipType);
356
+ }
357
+ // ==================== Category Operations ====================
358
+ upsertCategory(category) {
359
+ const now = new Date().toISOString();
360
+ const stmt = this.db.prepare(`
361
+ INSERT INTO categories (id, name, description, parent_id, summary, chunk_count, last_updated, created_at)
362
+ VALUES (@id, @name, @description, @parentId, @summary, @chunkCount, @lastUpdated, @createdAt)
363
+ ON CONFLICT(id) DO UPDATE SET
364
+ name = @name,
365
+ description = COALESCE(@description, description),
366
+ parent_id = COALESCE(@parentId, parent_id),
367
+ summary = COALESCE(@summary, summary),
368
+ chunk_count = COALESCE(@chunkCount, chunk_count),
369
+ last_updated = @lastUpdated
370
+ `);
371
+ stmt.run({
372
+ id: category.id,
373
+ name: category.name,
374
+ description: category.description || null,
375
+ parentId: category.parentId || null,
376
+ summary: category.summary || null,
377
+ chunkCount: category.chunkCount ?? 0,
378
+ lastUpdated: now,
379
+ createdAt: category.createdAt || now,
380
+ });
381
+ }
382
+ getCategory(id) {
383
+ const row = this.db.prepare('SELECT * FROM categories WHERE id = ?').get(id);
384
+ if (!row)
385
+ return null;
386
+ return {
387
+ id: row.id,
388
+ name: row.name,
389
+ description: row.description,
390
+ parentId: row.parent_id,
391
+ summary: row.summary,
392
+ chunkCount: row.chunk_count,
393
+ lastUpdated: row.last_updated,
394
+ createdAt: row.created_at,
395
+ };
396
+ }
397
+ getCategoryByName(name) {
398
+ const row = this.db.prepare('SELECT * FROM categories WHERE name = ?').get(name);
399
+ if (!row)
400
+ return null;
401
+ return {
402
+ id: row.id,
403
+ name: row.name,
404
+ description: row.description,
405
+ parentId: row.parent_id,
406
+ summary: row.summary,
407
+ chunkCount: row.chunk_count,
408
+ lastUpdated: row.last_updated,
409
+ createdAt: row.created_at,
410
+ };
411
+ }
412
+ listCategories() {
413
+ const rows = this.db.prepare('SELECT * FROM categories ORDER BY name').all();
414
+ return rows.map(row => ({
415
+ id: row.id,
416
+ name: row.name,
417
+ description: row.description,
418
+ parentId: row.parent_id,
419
+ summary: row.summary,
420
+ chunkCount: row.chunk_count,
421
+ lastUpdated: row.last_updated,
422
+ createdAt: row.created_at,
423
+ }));
424
+ }
425
+ assignChunkToCategory(chunkId, categoryId, relevanceScore = 0.5) {
426
+ const id = `${chunkId}:${categoryId}`;
427
+ const stmt = this.db.prepare(`
428
+ INSERT INTO category_items (id, chunk_id, category_id, relevance_score)
429
+ VALUES (?, ?, ?, ?)
430
+ ON CONFLICT(chunk_id, category_id) DO UPDATE SET
431
+ relevance_score = ?
432
+ `);
433
+ stmt.run(id, chunkId, categoryId, relevanceScore, relevanceScore);
434
+ // Update category chunk count
435
+ this.db.prepare(`
436
+ UPDATE categories SET
437
+ chunk_count = (SELECT COUNT(*) FROM category_items WHERE category_id = ?),
438
+ last_updated = CURRENT_TIMESTAMP
439
+ WHERE id = ?
440
+ `).run(categoryId, categoryId);
441
+ }
442
+ getChunkCategories(chunkId) {
443
+ const rows = this.db.prepare(`
444
+ SELECT * FROM category_items WHERE chunk_id = ?
445
+ `).all(chunkId);
446
+ return rows.map(row => ({
447
+ id: row.id,
448
+ chunkId: row.chunk_id,
449
+ categoryId: row.category_id,
450
+ relevanceScore: row.relevance_score,
451
+ assignedAt: row.assigned_at,
452
+ }));
453
+ }
454
+ getCategoryChunks(categoryId) {
455
+ const rows = this.db.prepare(`
456
+ SELECT * FROM category_items WHERE category_id = ?
457
+ ORDER BY relevance_score DESC
458
+ `).all(categoryId);
459
+ return rows.map(row => ({
460
+ id: row.id,
461
+ chunkId: row.chunk_id,
462
+ categoryId: row.category_id,
463
+ relevanceScore: row.relevance_score,
464
+ assignedAt: row.assigned_at,
465
+ }));
466
+ }
467
+ // ==================== Processed Conversations ====================
468
+ markConversationProcessed(conversationId, messageCount, chunksCreated, knowledgeExtracted) {
469
+ const id = `conv:${conversationId}`;
470
+ const stmt = this.db.prepare(`
471
+ INSERT INTO processed_conversations (id, conversation_id, message_count, chunks_created, knowledge_extracted)
472
+ VALUES (?, ?, ?, ?, ?)
473
+ ON CONFLICT(conversation_id) DO UPDATE SET
474
+ processed_at = CURRENT_TIMESTAMP,
475
+ message_count = ?,
476
+ chunks_created = ?,
477
+ knowledge_extracted = ?
478
+ `);
479
+ stmt.run(id, conversationId, messageCount, chunksCreated, knowledgeExtracted, messageCount, chunksCreated, knowledgeExtracted);
480
+ }
481
+ isConversationProcessed(conversationId) {
482
+ const row = this.db.prepare('SELECT 1 FROM processed_conversations WHERE conversation_id = ?').get(conversationId);
483
+ return !!row;
484
+ }
485
+ getProcessedConversation(conversationId) {
486
+ const row = this.db.prepare('SELECT * FROM processed_conversations WHERE conversation_id = ?').get(conversationId);
487
+ if (!row)
488
+ return null;
489
+ return {
490
+ id: row.id,
491
+ conversationId: row.conversation_id,
492
+ processedAt: row.processed_at,
493
+ messageCount: row.message_count,
494
+ chunksCreated: row.chunks_created,
495
+ knowledgeExtracted: row.knowledge_extracted,
496
+ };
497
+ }
498
+ // ==================== Analytics & Stats ====================
499
+ getMemoryStats() {
500
+ const totalChunks = this.db.prepare('SELECT COUNT(*) as count FROM chunks_metadata').get().count;
501
+ const activeChunks = this.db.prepare('SELECT COUNT(*) as count FROM chunks_metadata WHERE is_archived = 0').get().count;
502
+ const archivedChunks = this.db.prepare('SELECT COUNT(*) as count FROM chunks_metadata WHERE is_archived = 1').get().count;
503
+ const avgDecay = this.db.prepare('SELECT AVG(decay_score) as avg FROM chunks_metadata WHERE is_archived = 0').get().avg || 0;
504
+ const avgImportance = this.db.prepare('SELECT AVG(importance) as avg FROM chunks_metadata WHERE is_archived = 0').get().avg || 0;
505
+ const totalAccesses = this.db.prepare('SELECT COUNT(*) as count FROM access_log').get().count;
506
+ const relationshipCount = this.db.prepare('SELECT COUNT(*) as count FROM relationships').get().count;
507
+ const categoryCount = this.db.prepare('SELECT COUNT(*) as count FROM categories').get().count;
508
+ const typeRows = this.db.prepare(`
509
+ SELECT chunk_type, COUNT(*) as count
510
+ FROM chunks_metadata
511
+ WHERE is_archived = 0
512
+ GROUP BY chunk_type
513
+ `).all();
514
+ const chunksByType = {};
515
+ for (const row of typeRows) {
516
+ chunksByType[row.chunk_type] = row.count;
517
+ }
518
+ return {
519
+ totalChunks,
520
+ activeChunks,
521
+ archivedChunks,
522
+ avgDecayScore: avgDecay,
523
+ avgImportance: avgImportance,
524
+ totalAccesses,
525
+ chunksByType,
526
+ relationshipCount,
527
+ categoryCount,
528
+ };
529
+ }
530
+ getAccessStats(since) {
531
+ let sql = `
532
+ SELECT chunk_id, COUNT(*) as access_count, MAX(accessed_at) as last_access
533
+ FROM access_log
534
+ `;
535
+ const params = [];
536
+ if (since) {
537
+ sql += ' WHERE accessed_at >= ?';
538
+ params.push(since.toISOString());
539
+ }
540
+ sql += ' GROUP BY chunk_id ORDER BY access_count DESC LIMIT 100';
541
+ const rows = this.db.prepare(sql).all(...params);
542
+ return rows.map(r => ({
543
+ chunkId: r.chunk_id,
544
+ accessCount: r.access_count,
545
+ lastAccess: r.last_access,
546
+ }));
547
+ }
548
+ // ==================== Cleanup ====================
549
+ close() {
550
+ this.db.close();
551
+ }
552
+ vacuum() {
553
+ this.db.exec('VACUUM');
554
+ }
555
+ }
556
+ // Singleton instance
557
+ let instance = null;
558
+ export function getMemoryMetadataStore(dbPath) {
559
+ if (!instance) {
560
+ instance = new MemoryMetadataStore(dbPath);
561
+ }
562
+ return instance;
563
+ }
564
+ export function closeMemoryMetadataStore() {
565
+ if (instance) {
566
+ instance.close();
567
+ instance = null;
568
+ }
569
+ }
570
+ //# sourceMappingURL=memoryMetadataStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryMetadataStore.js","sourceRoot":"","sources":["../../src/services/memoryMetadataStore.ts"],"names":[],"mappings":"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"}