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,419 @@
1
+ import Database from 'better-sqlite3';
2
+ import { platform, homedir } from 'os';
3
+ import { join } from 'path';
4
+ import { existsSync } from 'fs';
5
+ /**
6
+ * Message types in Cursor chat
7
+ */
8
+ export var MessageType;
9
+ (function (MessageType) {
10
+ MessageType[MessageType["USER"] = 1] = "USER";
11
+ MessageType[MessageType["ASSISTANT"] = 2] = "ASSISTANT";
12
+ })(MessageType || (MessageType = {}));
13
+ /**
14
+ * Reads chat history directly from Cursor's SQLite database
15
+ *
16
+ * Cursor stores data in two tables:
17
+ * - ItemTable: General key-value storage
18
+ * - cursorDiskKV: Composer (chat) data including conversations and messages
19
+ *
20
+ * Conversation structure:
21
+ * - composerData:{uuid} - Contains conversation metadata and list of bubble IDs
22
+ * - bubbleId:{conversationId}:{bubbleId} - Contains individual message content
23
+ */
24
+ export class CursorChatReader {
25
+ dbPath;
26
+ constructor(customPath) {
27
+ this.dbPath = customPath ?? this.getDefaultDbPath();
28
+ }
29
+ /**
30
+ * Get the default database path based on OS
31
+ */
32
+ getDefaultDbPath() {
33
+ const home = homedir();
34
+ const os = platform();
35
+ switch (os) {
36
+ case 'darwin':
37
+ return join(home, 'Library/Application Support/Cursor/User/globalStorage/state.vscdb');
38
+ case 'win32':
39
+ return join(process.env.APPDATA ?? home, 'Cursor/User/globalStorage/state.vscdb');
40
+ case 'linux':
41
+ return join(home, '.config/Cursor/User/globalStorage/state.vscdb');
42
+ default:
43
+ throw new Error(`Unsupported platform: ${os}`);
44
+ }
45
+ }
46
+ /**
47
+ * Check if the database exists
48
+ */
49
+ isDatabaseAvailable() {
50
+ return existsSync(this.dbPath);
51
+ }
52
+ /**
53
+ * Get the database path
54
+ */
55
+ getDatabasePath() {
56
+ return this.dbPath;
57
+ }
58
+ /**
59
+ * List all conversations with summaries
60
+ */
61
+ listConversations(options) {
62
+ if (!this.isDatabaseAvailable()) {
63
+ return [];
64
+ }
65
+ const db = new Database(this.dbPath, { readonly: true, fileMustExist: true });
66
+ try {
67
+ // Get all composerData keys
68
+ const rows = db.prepare(`
69
+ SELECT key, value FROM cursorDiskKV
70
+ WHERE key LIKE 'composerData:%'
71
+ `).all();
72
+ const conversations = [];
73
+ for (const row of rows) {
74
+ try {
75
+ const conversationId = row.key.replace('composerData:', '');
76
+ const data = JSON.parse(row.value.toString('utf-8'));
77
+ // Get message count from fullConversationHeadersOnly
78
+ const messageHeaders = data.fullConversationHeadersOnly || [];
79
+ const messageCount = messageHeaders.length;
80
+ if (messageCount === 0)
81
+ continue;
82
+ // Get first message timestamp if available
83
+ let createdAt = null;
84
+ let updatedAt = null;
85
+ if (messageHeaders.length > 0) {
86
+ const firstBubble = this.getBubble(db, conversationId, messageHeaders[0].bubbleId);
87
+ if (firstBubble?.createdAt) {
88
+ createdAt = new Date(firstBubble.createdAt);
89
+ }
90
+ const lastBubble = this.getBubble(db, conversationId, messageHeaders[messageHeaders.length - 1].bubbleId);
91
+ if (lastBubble?.createdAt) {
92
+ updatedAt = new Date(lastBubble.createdAt);
93
+ }
94
+ }
95
+ // Apply filters
96
+ if (options?.since && createdAt && createdAt < options.since) {
97
+ continue;
98
+ }
99
+ // Get preview from first user message
100
+ let preview = '';
101
+ let hasCodeBlocks = false;
102
+ for (const header of messageHeaders) {
103
+ if (header.type === MessageType.USER) {
104
+ const bubble = this.getBubble(db, conversationId, header.bubbleId);
105
+ if (bubble) {
106
+ preview = this.extractTextFromRichText(bubble.richText || '');
107
+ if (preview)
108
+ break;
109
+ }
110
+ }
111
+ }
112
+ // Check for code blocks if filter requested
113
+ if (options?.hasCode) {
114
+ for (const header of messageHeaders) {
115
+ const bubble = this.getBubble(db, conversationId, header.bubbleId);
116
+ if (bubble?.suggestedCodeBlocks?.length > 0) {
117
+ hasCodeBlocks = true;
118
+ break;
119
+ }
120
+ }
121
+ if (!hasCodeBlocks)
122
+ continue;
123
+ }
124
+ conversations.push({
125
+ id: conversationId,
126
+ messageCount,
127
+ createdAt,
128
+ updatedAt,
129
+ hasCodeBlocks,
130
+ preview: preview.substring(0, 200) + (preview.length > 200 ? '...' : ''),
131
+ });
132
+ }
133
+ catch (e) {
134
+ // Skip malformed entries
135
+ continue;
136
+ }
137
+ }
138
+ // Sort by updatedAt descending
139
+ conversations.sort((a, b) => {
140
+ if (!a.updatedAt && !b.updatedAt)
141
+ return 0;
142
+ if (!a.updatedAt)
143
+ return 1;
144
+ if (!b.updatedAt)
145
+ return -1;
146
+ return b.updatedAt.getTime() - a.updatedAt.getTime();
147
+ });
148
+ // Apply limit
149
+ if (options?.limit) {
150
+ return conversations.slice(0, options.limit);
151
+ }
152
+ return conversations;
153
+ }
154
+ finally {
155
+ db.close();
156
+ }
157
+ }
158
+ /**
159
+ * Get a full conversation with all messages
160
+ */
161
+ getConversation(conversationId) {
162
+ if (!this.isDatabaseAvailable()) {
163
+ return null;
164
+ }
165
+ const db = new Database(this.dbPath, { readonly: true, fileMustExist: true });
166
+ try {
167
+ // Get composerData
168
+ const row = db.prepare(`
169
+ SELECT value FROM cursorDiskKV
170
+ WHERE key = ?
171
+ `).get(`composerData:${conversationId}`);
172
+ if (!row)
173
+ return null;
174
+ const data = JSON.parse(row.value.toString('utf-8'));
175
+ const messageHeaders = data.fullConversationHeadersOnly || [];
176
+ const messages = [];
177
+ let createdAt = null;
178
+ let updatedAt = null;
179
+ let hasCodeBlocks = false;
180
+ let preview = '';
181
+ for (const header of messageHeaders) {
182
+ const bubble = this.getBubble(db, conversationId, header.bubbleId);
183
+ if (!bubble)
184
+ continue;
185
+ const content = this.extractTextFromRichText(bubble.richText || '');
186
+ const codeBlocks = this.extractCodeBlocks(bubble);
187
+ if (codeBlocks.length > 0)
188
+ hasCodeBlocks = true;
189
+ // Track timestamps
190
+ if (bubble.createdAt) {
191
+ const timestamp = new Date(bubble.createdAt);
192
+ if (!createdAt || timestamp < createdAt)
193
+ createdAt = timestamp;
194
+ if (!updatedAt || timestamp > updatedAt)
195
+ updatedAt = timestamp;
196
+ }
197
+ // Get preview from first user message
198
+ if (!preview && header.type === MessageType.USER && content) {
199
+ preview = content;
200
+ }
201
+ messages.push({
202
+ id: header.bubbleId,
203
+ type: header.type,
204
+ content,
205
+ createdAt: bubble.createdAt ? new Date(bubble.createdAt) : new Date(),
206
+ codeBlocks,
207
+ filesReferenced: this.extractFilesReferenced(bubble),
208
+ isAgentic: bubble.isAgentic || false,
209
+ toolResults: bubble.toolResults || [],
210
+ });
211
+ }
212
+ return {
213
+ id: conversationId,
214
+ messageCount: messages.length,
215
+ createdAt,
216
+ updatedAt,
217
+ hasCodeBlocks,
218
+ preview: preview.substring(0, 200) + (preview.length > 200 ? '...' : ''),
219
+ messages,
220
+ };
221
+ }
222
+ finally {
223
+ db.close();
224
+ }
225
+ }
226
+ /**
227
+ * Search conversations by content
228
+ */
229
+ searchConversations(query, options) {
230
+ const conversations = this.listConversations({ limit: 100, hasCode: options?.hasCode });
231
+ const queryLower = query.toLowerCase();
232
+ const results = [];
233
+ for (const summary of conversations) {
234
+ const conversation = this.getConversation(summary.id);
235
+ if (!conversation)
236
+ continue;
237
+ // Search in message content
238
+ const matches = conversation.messages.some(m => m.content.toLowerCase().includes(queryLower));
239
+ if (matches) {
240
+ results.push(conversation);
241
+ if (options?.maxResults && results.length >= options.maxResults) {
242
+ break;
243
+ }
244
+ }
245
+ }
246
+ return results;
247
+ }
248
+ /**
249
+ * Get conversation count
250
+ */
251
+ getConversationCount() {
252
+ if (!this.isDatabaseAvailable()) {
253
+ return 0;
254
+ }
255
+ const db = new Database(this.dbPath, { readonly: true, fileMustExist: true });
256
+ try {
257
+ const row = db.prepare(`
258
+ SELECT COUNT(*) as count FROM cursorDiskKV
259
+ WHERE key LIKE 'composerData:%'
260
+ `).get();
261
+ return row.count;
262
+ }
263
+ finally {
264
+ db.close();
265
+ }
266
+ }
267
+ /**
268
+ * Get a single bubble (message) from the database
269
+ */
270
+ getBubble(db, conversationId, bubbleId) {
271
+ try {
272
+ const row = db.prepare(`
273
+ SELECT value FROM cursorDiskKV
274
+ WHERE key = ?
275
+ `).get(`bubbleId:${conversationId}:${bubbleId}`);
276
+ if (!row)
277
+ return null;
278
+ return JSON.parse(row.value.toString('utf-8'));
279
+ }
280
+ catch {
281
+ return null;
282
+ }
283
+ }
284
+ /**
285
+ * Extract plain text from Cursor's rich text format (Lexical)
286
+ */
287
+ extractTextFromRichText(richText) {
288
+ if (!richText)
289
+ return '';
290
+ try {
291
+ const parsed = JSON.parse(richText);
292
+ return this.extractTextFromNode(parsed.root);
293
+ }
294
+ catch {
295
+ return '';
296
+ }
297
+ }
298
+ /**
299
+ * Recursively extract text from Lexical nodes
300
+ */
301
+ extractTextFromNode(node) {
302
+ if (!node)
303
+ return '';
304
+ let text = '';
305
+ if (node.text) {
306
+ text += node.text;
307
+ }
308
+ if (node.children && Array.isArray(node.children)) {
309
+ for (const child of node.children) {
310
+ text += this.extractTextFromNode(child);
311
+ }
312
+ // Add newline after paragraphs
313
+ if (node.type === 'paragraph') {
314
+ text += '\n';
315
+ }
316
+ }
317
+ return text;
318
+ }
319
+ /**
320
+ * Extract code blocks from a bubble
321
+ */
322
+ extractCodeBlocks(bubble) {
323
+ const blocks = [];
324
+ // From suggestedCodeBlocks
325
+ if (bubble.suggestedCodeBlocks && Array.isArray(bubble.suggestedCodeBlocks)) {
326
+ for (const block of bubble.suggestedCodeBlocks) {
327
+ blocks.push({
328
+ language: block.language || 'text',
329
+ code: block.code || '',
330
+ filename: block.filename,
331
+ });
332
+ }
333
+ }
334
+ // From assistantSuggestedDiffs
335
+ if (bubble.assistantSuggestedDiffs && Array.isArray(bubble.assistantSuggestedDiffs)) {
336
+ for (const diff of bubble.assistantSuggestedDiffs) {
337
+ if (diff.newContent) {
338
+ blocks.push({
339
+ language: this.guessLanguageFromFilename(diff.filePath || ''),
340
+ code: diff.newContent,
341
+ filename: diff.filePath,
342
+ });
343
+ }
344
+ }
345
+ }
346
+ return blocks;
347
+ }
348
+ /**
349
+ * Extract files referenced in a bubble
350
+ */
351
+ extractFilesReferenced(bubble) {
352
+ const files = [];
353
+ if (bubble.attachedFileCodeChunksMetadataOnly) {
354
+ for (const chunk of bubble.attachedFileCodeChunksMetadataOnly) {
355
+ if (chunk.relativeWorkspacePath) {
356
+ files.push(chunk.relativeWorkspacePath);
357
+ }
358
+ }
359
+ }
360
+ if (bubble.relevantFiles) {
361
+ for (const file of bubble.relevantFiles) {
362
+ if (typeof file === 'string') {
363
+ files.push(file);
364
+ }
365
+ else if (file.path) {
366
+ files.push(file.path);
367
+ }
368
+ }
369
+ }
370
+ return [...new Set(files)];
371
+ }
372
+ /**
373
+ * Guess programming language from filename
374
+ */
375
+ guessLanguageFromFilename(filename) {
376
+ const ext = filename.split('.').pop()?.toLowerCase();
377
+ const languageMap = {
378
+ 'ts': 'typescript',
379
+ 'tsx': 'typescript',
380
+ 'js': 'javascript',
381
+ 'jsx': 'javascript',
382
+ 'py': 'python',
383
+ 'rb': 'ruby',
384
+ 'go': 'go',
385
+ 'rs': 'rust',
386
+ 'php': 'php',
387
+ 'java': 'java',
388
+ 'kt': 'kotlin',
389
+ 'swift': 'swift',
390
+ 'cs': 'csharp',
391
+ 'cpp': 'cpp',
392
+ 'c': 'c',
393
+ 'h': 'c',
394
+ 'hpp': 'cpp',
395
+ 'vue': 'vue',
396
+ 'svelte': 'svelte',
397
+ 'html': 'html',
398
+ 'css': 'css',
399
+ 'scss': 'scss',
400
+ 'less': 'less',
401
+ 'json': 'json',
402
+ 'yaml': 'yaml',
403
+ 'yml': 'yaml',
404
+ 'md': 'markdown',
405
+ 'sql': 'sql',
406
+ 'sh': 'bash',
407
+ 'bash': 'bash',
408
+ 'zsh': 'bash',
409
+ };
410
+ return languageMap[ext || ''] || 'text';
411
+ }
412
+ }
413
+ /**
414
+ * Create a CursorChatReader instance
415
+ */
416
+ export function createCursorChatReader(customPath) {
417
+ return new CursorChatReader(customPath);
418
+ }
419
+ //# sourceMappingURL=cursorChatReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorChatReader.js","sourceRoot":"","sources":["../../src/services/cursorChatReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import type { ChunkMetadata } from '../types/memory.js';
2
+ import type { MemoryMetadataStore } from './memoryMetadataStore.js';
3
+ /**
4
+ * Configuration for decay calculation
5
+ */
6
+ export interface DecayCalculatorConfig {
7
+ halfLifeDays: number;
8
+ expectedAccessesPerMonth: number;
9
+ recencyBoostDays: number;
10
+ recencyBoostMultiplier: number;
11
+ weights: {
12
+ age: number;
13
+ access: number;
14
+ importance: number;
15
+ };
16
+ archivalThreshold: number;
17
+ }
18
+ export declare const DEFAULT_DECAY_CALCULATOR_CONFIG: DecayCalculatorConfig;
19
+ export interface UpdateResult {
20
+ updated: number;
21
+ archived: number;
22
+ duration: number;
23
+ }
24
+ /**
25
+ * Calculates decay scores for chunks based on multiple factors
26
+ *
27
+ * Formula: decayScore = (ageFactor * weightAge) + (accessFactor * weightAccess) + (importanceFactor * weightImportance)
28
+ *
29
+ * Where:
30
+ * - ageFactor = 1.0 / (1.0 + (ageDays / halfLifeDays))
31
+ * - accessFactor = min(1.0, accessCount / expectedAccesses) * recencyBoost
32
+ * - importanceFactor = chunk.importance
33
+ */
34
+ export declare class DecayCalculator {
35
+ private config;
36
+ constructor(config?: Partial<DecayCalculatorConfig>);
37
+ /**
38
+ * Calculate decay score for a single chunk
39
+ */
40
+ calculateDecayScore(chunk: ChunkMetadata, now?: Date): number;
41
+ /**
42
+ * Calculate age factor using exponential decay
43
+ * Returns 1.0 for new chunks, approaches 0 for very old chunks
44
+ */
45
+ private calculateAgeFactor;
46
+ /**
47
+ * Calculate access factor based on access count and recency
48
+ */
49
+ private calculateAccessFactor;
50
+ /**
51
+ * Calculate decay scores for multiple chunks
52
+ */
53
+ calculateBatchDecayScores(chunks: ChunkMetadata[], now?: Date): Array<{
54
+ chunkId: string;
55
+ decayScore: number;
56
+ }>;
57
+ /**
58
+ * Update all decay scores in the metadata store
59
+ */
60
+ updateAllDecayScores(store: MemoryMetadataStore, autoArchive?: boolean): UpdateResult;
61
+ /**
62
+ * Get chunks that are candidates for archival
63
+ */
64
+ getArchivalCandidates(chunks: ChunkMetadata[], threshold?: number): ChunkMetadata[];
65
+ /**
66
+ * Simulate decay over time for testing/visualization
67
+ */
68
+ simulateDecay(initialImportance: number, accessPattern: Array<{
69
+ dayOffset: number;
70
+ }>, daysToSimulate: number): Array<{
71
+ day: number;
72
+ decayScore: number;
73
+ }>;
74
+ /**
75
+ * Get the current configuration
76
+ */
77
+ getConfig(): DecayCalculatorConfig;
78
+ /**
79
+ * Update configuration
80
+ */
81
+ updateConfig(config: Partial<DecayCalculatorConfig>): void;
82
+ }
83
+ export declare function getDecayCalculator(config?: Partial<DecayCalculatorConfig>): DecayCalculator;
84
+ export declare function resetDecayCalculator(): void;
85
+ //# sourceMappingURL=decayCalculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decayCalculator.d.ts","sourceRoot":"","sources":["../../src/services/decayCalculator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,oBAAoB,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,+BAA+B,EAAE,qBAW7C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAWnD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM;IAczE;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,GAAE,IAAiB,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAO1H;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,EAAE,WAAW,GAAE,OAAe,GAAG,YAAY;IA2B5F;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAKnF;;OAEG;IACH,aAAa,CACX,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,EAC3C,cAAc,EAAE,MAAM,GACrB,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAoC7C;;OAEG;IACH,SAAS,IAAI,qBAAqB;IAIlC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI;CAU3D;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAK3F;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}