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,472 @@
|
|
|
1
|
+
import { ChunkType, RelationshipType } from '../../types/memory.js';
|
|
2
|
+
import { getMemoryMetadataStore } from '../../services/memoryMetadataStore.js';
|
|
3
|
+
import { getRelationshipGraph } from '../../services/relationshipGraph.js';
|
|
4
|
+
import { getCategoryManager } from '../../services/categoryManager.js';
|
|
5
|
+
import { getHybridScorer } from '../../services/hybridScorer.js';
|
|
6
|
+
import { createEnhancedVectorStore } from '../../services/enhancedVectorStore.js';
|
|
7
|
+
import { createCursorChatReader } from '../../services/cursorChatReader.js';
|
|
8
|
+
import { createConversationProcessor } from '../../services/conversationProcessor.js';
|
|
9
|
+
import { createKnowledgeExtractor } from '../../services/knowledgeExtractor.js';
|
|
10
|
+
import { createKnowledgeStorageService } from '../../services/knowledgeStorage.js';
|
|
11
|
+
import { countExtractedItems } from '../../types/extractedKnowledge.js';
|
|
12
|
+
export async function searchPastSolutionsTool(args, deps) {
|
|
13
|
+
const { problem, topK = 5, minScore = 0.3 } = args;
|
|
14
|
+
const enhancedStore = createEnhancedVectorStore(deps.vectorStore);
|
|
15
|
+
const metadataStore = getMemoryMetadataStore();
|
|
16
|
+
const hybridScorer = getHybridScorer();
|
|
17
|
+
const embedding = await deps.embedder.embed(problem);
|
|
18
|
+
const results = await enhancedStore.enhancedSearch(embedding, {
|
|
19
|
+
topK: topK * 3,
|
|
20
|
+
chunkTypes: [ChunkType.SOLUTION],
|
|
21
|
+
minDecayScore: 0.1,
|
|
22
|
+
includeArchived: false,
|
|
23
|
+
});
|
|
24
|
+
const searchInputs = results.map(r => ({
|
|
25
|
+
id: r.id,
|
|
26
|
+
content: r.content,
|
|
27
|
+
score: r.similarityScore,
|
|
28
|
+
metadata: r.metadata,
|
|
29
|
+
}));
|
|
30
|
+
const scored = await hybridScorer.scoreResults(searchInputs, problem, {
|
|
31
|
+
preferredTypes: [ChunkType.SOLUTION],
|
|
32
|
+
});
|
|
33
|
+
const filtered = scored.filter(r => r.finalScore >= minScore).slice(0, topK);
|
|
34
|
+
if (filtered.length === 0) {
|
|
35
|
+
return {
|
|
36
|
+
content: [{
|
|
37
|
+
type: 'text',
|
|
38
|
+
text: 'No past solutions found for this problem. Try rephrasing or check if relevant conversations have been ingested.',
|
|
39
|
+
}],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const output = filtered.map((r, i) => {
|
|
43
|
+
return `## Solution ${i + 1} (Score: ${r.finalScore.toFixed(2)})\n\n${r.content}`;
|
|
44
|
+
}).join('\n\n---\n\n');
|
|
45
|
+
return {
|
|
46
|
+
content: [{
|
|
47
|
+
type: 'text',
|
|
48
|
+
text: `Found ${filtered.length} past solutions:\n\n${output}`,
|
|
49
|
+
}],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export async function findSimilarIssuesTool(args, deps) {
|
|
53
|
+
const { issue, topK = 5 } = args;
|
|
54
|
+
const enhancedStore = createEnhancedVectorStore(deps.vectorStore);
|
|
55
|
+
const hybridScorer = getHybridScorer();
|
|
56
|
+
const graph = getRelationshipGraph();
|
|
57
|
+
const embedding = await deps.embedder.embed(issue);
|
|
58
|
+
const results = await enhancedStore.enhancedSearch(embedding, {
|
|
59
|
+
topK: topK * 3,
|
|
60
|
+
chunkTypes: [ChunkType.SOLUTION, ChunkType.CODE, ChunkType.DOCUMENTATION],
|
|
61
|
+
minDecayScore: 0.05,
|
|
62
|
+
includeArchived: false,
|
|
63
|
+
});
|
|
64
|
+
const searchInputs = results.map(r => ({
|
|
65
|
+
id: r.id,
|
|
66
|
+
content: r.content,
|
|
67
|
+
score: r.similarityScore,
|
|
68
|
+
metadata: r.metadata,
|
|
69
|
+
}));
|
|
70
|
+
const scored = await hybridScorer.scoreResults(searchInputs, issue);
|
|
71
|
+
const topResults = scored.slice(0, topK);
|
|
72
|
+
// Find related items through graph
|
|
73
|
+
const relatedItems = [];
|
|
74
|
+
for (const result of topResults.slice(0, 3)) {
|
|
75
|
+
const related = graph.findRelated(result.id, {
|
|
76
|
+
types: [RelationshipType.RELATES_TO, RelationshipType.SIMILAR_TO, RelationshipType.SOLVES],
|
|
77
|
+
maxResults: 3,
|
|
78
|
+
minStrength: 0.4,
|
|
79
|
+
});
|
|
80
|
+
relatedItems.push(...related.map(r => r.chunkId));
|
|
81
|
+
}
|
|
82
|
+
const output = topResults.map((r, i) => {
|
|
83
|
+
const type = r.metadata?.chunkType || 'unknown';
|
|
84
|
+
return `### ${i + 1}. [${type}] Score: ${r.finalScore.toFixed(2)}\n\n${r.content.substring(0, 500)}${r.content.length > 500 ? '...' : ''}`;
|
|
85
|
+
}).join('\n\n');
|
|
86
|
+
let response = `Found ${topResults.length} similar issues:\n\n${output}`;
|
|
87
|
+
if (relatedItems.length > 0) {
|
|
88
|
+
response += `\n\n**Related items**: ${[...new Set(relatedItems)].slice(0, 5).join(', ')}`;
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
content: [{
|
|
92
|
+
type: 'text',
|
|
93
|
+
text: response,
|
|
94
|
+
}],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export async function getProjectPatternsTool(args, deps) {
|
|
98
|
+
const { category, topK = 10 } = args;
|
|
99
|
+
const metadataStore = getMemoryMetadataStore();
|
|
100
|
+
const categoryManager = getCategoryManager(metadataStore);
|
|
101
|
+
await categoryManager.initialize();
|
|
102
|
+
const allPatterns = metadataStore.getAllChunkMetadata({
|
|
103
|
+
includeArchived: false,
|
|
104
|
+
chunkTypes: [ChunkType.PATTERN, ChunkType.STANDARD],
|
|
105
|
+
});
|
|
106
|
+
// Filter by category if specified
|
|
107
|
+
let patterns = allPatterns;
|
|
108
|
+
if (category) {
|
|
109
|
+
const categoryChunks = new Set(categoryManager.getCategoryItems(category).map(item => item.chunkId));
|
|
110
|
+
patterns = patterns.filter(p => categoryChunks.has(p.chunkId));
|
|
111
|
+
}
|
|
112
|
+
// Sort by importance and decay
|
|
113
|
+
patterns.sort((a, b) => {
|
|
114
|
+
const scoreA = a.importance * 0.6 + a.decayScore * 0.4;
|
|
115
|
+
const scoreB = b.importance * 0.6 + b.decayScore * 0.4;
|
|
116
|
+
return scoreB - scoreA;
|
|
117
|
+
});
|
|
118
|
+
const topPatterns = patterns.slice(0, topK);
|
|
119
|
+
if (topPatterns.length === 0) {
|
|
120
|
+
return {
|
|
121
|
+
content: [{
|
|
122
|
+
type: 'text',
|
|
123
|
+
text: category
|
|
124
|
+
? `No patterns found for category "${category}". Try ingesting more conversations or documents.`
|
|
125
|
+
: 'No patterns found. Try ingesting conversations with `cursor-rag chat ingest --extract`.',
|
|
126
|
+
}],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const output = topPatterns.map((p, i) => {
|
|
130
|
+
return `${i + 1}. **${p.chunkType}** (importance: ${p.importance.toFixed(2)}, decay: ${p.decayScore.toFixed(2)})\n ID: ${p.chunkId}`;
|
|
131
|
+
}).join('\n');
|
|
132
|
+
return {
|
|
133
|
+
content: [{
|
|
134
|
+
type: 'text',
|
|
135
|
+
text: `Found ${topPatterns.length} patterns${category ? ` in category "${category}"` : ''}:\n\n${output}`,
|
|
136
|
+
}],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export async function recallDecisionTool(args, deps) {
|
|
140
|
+
const { topic, topK = 5 } = args;
|
|
141
|
+
const enhancedStore = createEnhancedVectorStore(deps.vectorStore);
|
|
142
|
+
const hybridScorer = getHybridScorer();
|
|
143
|
+
const embedding = await deps.embedder.embed(`decision about ${topic}`);
|
|
144
|
+
const results = await enhancedStore.enhancedSearch(embedding, {
|
|
145
|
+
topK: topK * 3,
|
|
146
|
+
chunkTypes: [ChunkType.DECISION, ChunkType.STANDARD],
|
|
147
|
+
minDecayScore: 0.05,
|
|
148
|
+
includeArchived: false,
|
|
149
|
+
});
|
|
150
|
+
const searchInputs = results.map(r => ({
|
|
151
|
+
id: r.id,
|
|
152
|
+
content: r.content,
|
|
153
|
+
score: r.similarityScore,
|
|
154
|
+
metadata: r.metadata,
|
|
155
|
+
}));
|
|
156
|
+
const scored = await hybridScorer.scoreResults(searchInputs, topic, {
|
|
157
|
+
preferredTypes: [ChunkType.DECISION],
|
|
158
|
+
});
|
|
159
|
+
const decisions = scored.slice(0, topK);
|
|
160
|
+
if (decisions.length === 0) {
|
|
161
|
+
return {
|
|
162
|
+
content: [{
|
|
163
|
+
type: 'text',
|
|
164
|
+
text: `No decisions found about "${topic}". Decisions are extracted from chat history using \`cursor-rag chat ingest --extract\`.`,
|
|
165
|
+
}],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const output = decisions.map((d, i) => {
|
|
169
|
+
const type = d.metadata?.chunkType || 'decision';
|
|
170
|
+
return `## Decision ${i + 1} [${type}]\n**Score**: ${d.finalScore.toFixed(2)}\n\n${d.content}`;
|
|
171
|
+
}).join('\n\n---\n\n');
|
|
172
|
+
return {
|
|
173
|
+
content: [{
|
|
174
|
+
type: 'text',
|
|
175
|
+
text: `Found ${decisions.length} decisions about "${topic}":\n\n${output}`,
|
|
176
|
+
}],
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export async function getCategorySummaryTool(args, deps) {
|
|
180
|
+
const { category } = args;
|
|
181
|
+
const metadataStore = getMemoryMetadataStore();
|
|
182
|
+
const categoryManager = getCategoryManager(metadataStore);
|
|
183
|
+
await categoryManager.initialize();
|
|
184
|
+
const summary = categoryManager.getCategorySummary(category);
|
|
185
|
+
const categories = metadataStore.listCategories();
|
|
186
|
+
const targetCategory = categories.find(c => c.name.toLowerCase() === category.toLowerCase());
|
|
187
|
+
if (!targetCategory) {
|
|
188
|
+
const availableCategories = categories.map(c => c.name).join(', ');
|
|
189
|
+
return {
|
|
190
|
+
content: [{
|
|
191
|
+
type: 'text',
|
|
192
|
+
text: `Category "${category}" not found. Available categories: ${availableCategories}`,
|
|
193
|
+
}],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
let response = `## ${targetCategory.name}\n\n`;
|
|
197
|
+
response += `**Description**: ${targetCategory.description || 'No description'}\n`;
|
|
198
|
+
response += `**Items**: ${targetCategory.chunkCount}\n`;
|
|
199
|
+
response += `**Last Updated**: ${targetCategory.lastUpdated || 'Never'}\n\n`;
|
|
200
|
+
if (summary) {
|
|
201
|
+
response += `### Summary\n\n${summary}`;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
response += '*No summary available. Run `cursor-rag maintenance run summarize` to generate summaries.*';
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
content: [{
|
|
208
|
+
type: 'text',
|
|
209
|
+
text: response,
|
|
210
|
+
}],
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export async function ingestChatHistoryTool(args, deps) {
|
|
214
|
+
const { limit, extract = false, since } = args;
|
|
215
|
+
const enhancedStore = createEnhancedVectorStore(deps.vectorStore);
|
|
216
|
+
const metadataStore = getMemoryMetadataStore();
|
|
217
|
+
const reader = createCursorChatReader();
|
|
218
|
+
if (!reader.isDatabaseAvailable()) {
|
|
219
|
+
return {
|
|
220
|
+
content: [{
|
|
221
|
+
type: 'text',
|
|
222
|
+
text: 'Cursor database not found. Make sure Cursor is installed and has been used at least once.',
|
|
223
|
+
}],
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const filterOptions = {};
|
|
227
|
+
if (limit)
|
|
228
|
+
filterOptions.limit = limit;
|
|
229
|
+
if (since)
|
|
230
|
+
filterOptions.since = new Date(since);
|
|
231
|
+
const conversations = reader.listConversations(filterOptions);
|
|
232
|
+
const toProcess = conversations.filter(c => !metadataStore.isConversationProcessed(c.id));
|
|
233
|
+
if (toProcess.length === 0) {
|
|
234
|
+
return {
|
|
235
|
+
content: [{
|
|
236
|
+
type: 'text',
|
|
237
|
+
text: `All ${conversations.length} conversations already processed. Use --force in CLI to re-process.`,
|
|
238
|
+
}],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const processor = createConversationProcessor();
|
|
242
|
+
const knowledgeExtractor = extract ? createKnowledgeExtractor(deps.config) : null;
|
|
243
|
+
const knowledgeStorage = extract ? createKnowledgeStorageService(enhancedStore, deps.embedder) : null;
|
|
244
|
+
let totalChunks = 0;
|
|
245
|
+
let totalKnowledge = 0;
|
|
246
|
+
let processedCount = 0;
|
|
247
|
+
for (const summary of toProcess.slice(0, limit || 10)) {
|
|
248
|
+
try {
|
|
249
|
+
const conversation = reader.getConversation(summary.id);
|
|
250
|
+
if (!conversation)
|
|
251
|
+
continue;
|
|
252
|
+
const result = processor.processConversation(conversation);
|
|
253
|
+
if (result.chunks.length === 0)
|
|
254
|
+
continue;
|
|
255
|
+
const documents = await Promise.all(result.chunks.map(async (chunk) => {
|
|
256
|
+
const embedding = await deps.embedder.embed(chunk.content);
|
|
257
|
+
return {
|
|
258
|
+
id: chunk.id,
|
|
259
|
+
content: chunk.content,
|
|
260
|
+
embedding,
|
|
261
|
+
metadata: {
|
|
262
|
+
...chunk.metadata,
|
|
263
|
+
source: chunk.source,
|
|
264
|
+
chunkType: chunk.chunkType,
|
|
265
|
+
importance: chunk.importance,
|
|
266
|
+
sourceConversationId: chunk.sourceConversationId,
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}));
|
|
270
|
+
await enhancedStore.add(documents);
|
|
271
|
+
totalChunks += result.chunks.length;
|
|
272
|
+
if (knowledgeExtractor && knowledgeStorage) {
|
|
273
|
+
try {
|
|
274
|
+
const extracted = await knowledgeExtractor.extract(conversation);
|
|
275
|
+
const knowledgeCount = countExtractedItems(extracted);
|
|
276
|
+
if (knowledgeCount > 0) {
|
|
277
|
+
await knowledgeStorage.store(extracted);
|
|
278
|
+
totalKnowledge += knowledgeCount;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
// Knowledge extraction failure is not fatal
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
metadataStore.markConversationProcessed(summary.id, summary.messageCount, result.chunks.length, totalKnowledge);
|
|
286
|
+
processedCount++;
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
289
|
+
// Continue processing other conversations
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
let response = `Processed ${processedCount} conversations, created ${totalChunks} chunks.`;
|
|
293
|
+
if (extract) {
|
|
294
|
+
response += ` Extracted ${totalKnowledge} knowledge items.`;
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
content: [{
|
|
298
|
+
type: 'text',
|
|
299
|
+
text: response,
|
|
300
|
+
}],
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
export async function memoryStatsTool(deps) {
|
|
304
|
+
const metadataStore = getMemoryMetadataStore();
|
|
305
|
+
const graph = getRelationshipGraph(metadataStore);
|
|
306
|
+
const categoryManager = getCategoryManager(metadataStore);
|
|
307
|
+
await categoryManager.initialize();
|
|
308
|
+
const memoryStats = metadataStore.getMemoryStats();
|
|
309
|
+
const graphStats = graph.getStats();
|
|
310
|
+
const categories = categoryManager.getAllCategoriesWithStats();
|
|
311
|
+
let response = `## Memory System Statistics\n\n`;
|
|
312
|
+
response += `### Chunks\n`;
|
|
313
|
+
response += `- Total: ${memoryStats.totalChunks}\n`;
|
|
314
|
+
response += `- Active: ${memoryStats.activeChunks}\n`;
|
|
315
|
+
response += `- Archived: ${memoryStats.archivedChunks}\n`;
|
|
316
|
+
response += `- Avg Decay: ${memoryStats.avgDecayScore.toFixed(3)}\n`;
|
|
317
|
+
response += `- Avg Importance: ${memoryStats.avgImportance.toFixed(3)}\n`;
|
|
318
|
+
response += `- Total Accesses: ${memoryStats.totalAccesses}\n\n`;
|
|
319
|
+
if (Object.keys(memoryStats.chunksByType).length > 0) {
|
|
320
|
+
response += `### By Type\n`;
|
|
321
|
+
for (const [type, count] of Object.entries(memoryStats.chunksByType)) {
|
|
322
|
+
response += `- ${type}: ${count}\n`;
|
|
323
|
+
}
|
|
324
|
+
response += '\n';
|
|
325
|
+
}
|
|
326
|
+
response += `### Relationships\n`;
|
|
327
|
+
response += `- Total: ${graphStats.totalRelationships}\n`;
|
|
328
|
+
response += `- Avg per chunk: ${graphStats.avgRelationshipsPerChunk.toFixed(2)}\n`;
|
|
329
|
+
response += `- Max depth: ${graphStats.maxDepth}\n`;
|
|
330
|
+
response += `- Isolated chunks: ${graphStats.isolatedChunks}\n\n`;
|
|
331
|
+
response += `### Categories\n`;
|
|
332
|
+
response += `- Total: ${memoryStats.categoryCount}\n`;
|
|
333
|
+
const activeCategories = categories.filter(c => c.chunkCount > 0);
|
|
334
|
+
if (activeCategories.length > 0) {
|
|
335
|
+
for (const cat of activeCategories.slice(0, 5)) {
|
|
336
|
+
response += `- ${cat.name}: ${cat.chunkCount} items\n`;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return {
|
|
340
|
+
content: [{
|
|
341
|
+
type: 'text',
|
|
342
|
+
text: response,
|
|
343
|
+
}],
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
export const memoryToolDefinitions = [
|
|
347
|
+
{
|
|
348
|
+
name: 'search_past_solutions',
|
|
349
|
+
description: 'Search for past solutions to similar problems from ingested chat history and documents.',
|
|
350
|
+
inputSchema: {
|
|
351
|
+
type: 'object',
|
|
352
|
+
properties: {
|
|
353
|
+
problem: {
|
|
354
|
+
type: 'string',
|
|
355
|
+
description: 'Description of the problem to find solutions for',
|
|
356
|
+
},
|
|
357
|
+
topK: {
|
|
358
|
+
type: 'number',
|
|
359
|
+
description: 'Number of solutions to return (default: 5)',
|
|
360
|
+
default: 5,
|
|
361
|
+
},
|
|
362
|
+
minScore: {
|
|
363
|
+
type: 'number',
|
|
364
|
+
description: 'Minimum relevance score (default: 0.3)',
|
|
365
|
+
default: 0.3,
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
required: ['problem'],
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
name: 'find_similar_issues',
|
|
373
|
+
description: 'Find issues or discussions similar to the current one, including related items through the knowledge graph.',
|
|
374
|
+
inputSchema: {
|
|
375
|
+
type: 'object',
|
|
376
|
+
properties: {
|
|
377
|
+
issue: {
|
|
378
|
+
type: 'string',
|
|
379
|
+
description: 'Description of the issue to find similar ones for',
|
|
380
|
+
},
|
|
381
|
+
topK: {
|
|
382
|
+
type: 'number',
|
|
383
|
+
description: 'Number of results to return (default: 5)',
|
|
384
|
+
default: 5,
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
required: ['issue'],
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
name: 'get_project_patterns',
|
|
392
|
+
description: 'Get coding patterns and standards from the knowledge base.',
|
|
393
|
+
inputSchema: {
|
|
394
|
+
type: 'object',
|
|
395
|
+
properties: {
|
|
396
|
+
category: {
|
|
397
|
+
type: 'string',
|
|
398
|
+
description: 'Filter by category (e.g., authentication, database, api)',
|
|
399
|
+
},
|
|
400
|
+
topK: {
|
|
401
|
+
type: 'number',
|
|
402
|
+
description: 'Number of patterns to return (default: 10)',
|
|
403
|
+
default: 10,
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
name: 'recall_decision',
|
|
410
|
+
description: 'Recall past architectural or design decisions about a topic.',
|
|
411
|
+
inputSchema: {
|
|
412
|
+
type: 'object',
|
|
413
|
+
properties: {
|
|
414
|
+
topic: {
|
|
415
|
+
type: 'string',
|
|
416
|
+
description: 'Topic to recall decisions about',
|
|
417
|
+
},
|
|
418
|
+
topK: {
|
|
419
|
+
type: 'number',
|
|
420
|
+
description: 'Number of decisions to return (default: 5)',
|
|
421
|
+
default: 5,
|
|
422
|
+
},
|
|
423
|
+
},
|
|
424
|
+
required: ['topic'],
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
name: 'get_category_summary',
|
|
429
|
+
description: 'Get the summary for a knowledge category.',
|
|
430
|
+
inputSchema: {
|
|
431
|
+
type: 'object',
|
|
432
|
+
properties: {
|
|
433
|
+
category: {
|
|
434
|
+
type: 'string',
|
|
435
|
+
description: 'Category name (e.g., authentication, database, testing)',
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
required: ['category'],
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
name: 'ingest_chat_history',
|
|
443
|
+
description: 'Ingest Cursor chat history into the knowledge base.',
|
|
444
|
+
inputSchema: {
|
|
445
|
+
type: 'object',
|
|
446
|
+
properties: {
|
|
447
|
+
limit: {
|
|
448
|
+
type: 'number',
|
|
449
|
+
description: 'Maximum conversations to process (default: 10)',
|
|
450
|
+
},
|
|
451
|
+
extract: {
|
|
452
|
+
type: 'boolean',
|
|
453
|
+
description: 'Extract knowledge (solutions, patterns, decisions) using LLM',
|
|
454
|
+
default: false,
|
|
455
|
+
},
|
|
456
|
+
since: {
|
|
457
|
+
type: 'string',
|
|
458
|
+
description: 'Only process conversations since this date (YYYY-MM-DD)',
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
name: 'memory_stats',
|
|
465
|
+
description: 'Get statistics about the memory system.',
|
|
466
|
+
inputSchema: {
|
|
467
|
+
type: 'object',
|
|
468
|
+
properties: {},
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
];
|
|
472
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/server/tools/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recursive-query.d.ts","sourceRoot":"","sources":["../../../src/server/tools/recursive-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"recursive-query.d.ts","sourceRoot":"","sources":["../../../src/server/tools/recursive-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAItD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACxE,OAAO,CAAC,GAAG,CAAC,CAqFd"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { decomposeQuery, generateFollowUps, assessConfidence } from '../../services/query-decomposer.js';
|
|
2
|
+
import { logActivity } from '../../services/activity-log.js';
|
|
2
3
|
export async function recursiveQueryTool(args, deps) {
|
|
3
4
|
const { query, maxIterations = 5, minConfidence = 0.7, sources } = args;
|
|
4
5
|
const { vectorStore, embedder } = deps;
|
|
@@ -53,6 +54,11 @@ export async function recursiveQueryTool(args, deps) {
|
|
|
53
54
|
const answer = topChunks
|
|
54
55
|
.map((chunk, idx) => `[${idx + 1}] ${chunk.content}`)
|
|
55
56
|
.join('\n\n');
|
|
57
|
+
logActivity('query', `Query: "${query.substring(0, 50)}${query.length > 50 ? '...' : ''}"`, {
|
|
58
|
+
subQuestions: subQuestions.length,
|
|
59
|
+
retrievalSteps: context.length,
|
|
60
|
+
chunksFound: uniqueChunks.length
|
|
61
|
+
});
|
|
56
62
|
return {
|
|
57
63
|
content: [
|
|
58
64
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recursive-query.js","sourceRoot":"","sources":["../../../src/server/tools/recursive-query.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"recursive-query.js","sourceRoot":"","sources":["../../../src/server/tools/recursive-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/server/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/server/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACxE,OAAO,CAAC,GAAG,CAAC,CA+Bd"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logActivity } from '../../services/activity-log.js';
|
|
1
2
|
export async function searchKnowledgeTool(args, deps) {
|
|
2
3
|
const { query, topK = 10, sources } = args;
|
|
3
4
|
const { vectorStore, embedder } = deps;
|
|
@@ -7,6 +8,11 @@ export async function searchKnowledgeTool(args, deps) {
|
|
|
7
8
|
searchOptions.filter = { source: { $in: sources } };
|
|
8
9
|
}
|
|
9
10
|
const results = await vectorStore.search(embedding, searchOptions);
|
|
11
|
+
logActivity('search', `Search: "${query.substring(0, 50)}${query.length > 50 ? '...' : ''}"`, {
|
|
12
|
+
resultsCount: results.length,
|
|
13
|
+
topK,
|
|
14
|
+
sources: sources || []
|
|
15
|
+
});
|
|
10
16
|
const formattedResults = results.map((result, idx) => `[${idx + 1}] Score: ${result.score.toFixed(4)}\nSource: ${result.metadata.source || 'unknown'}\n${result.content}`).join('\n\n---\n\n');
|
|
11
17
|
return {
|
|
12
18
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/server/tools/search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/server/tools/search.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAQ7D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAyB,EACzB,IAAyE;IAEzE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3C,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAEvC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,aAAa,GAAQ,EAAE,IAAI,EAAE,CAAC;IACpC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,aAAa,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAEnE,WAAW,CAAC,QAAQ,EAAE,YAAY,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE;QAC5F,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,IAAI;QACJ,OAAO,EAAE,OAAO,IAAI,EAAE;KACvB,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAW,EAAE,GAAW,EAAE,EAAE,CAChE,IAAI,GAAG,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS,KAAK,MAAM,CAAC,OAAO,EAAE,CACpH,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAEtB,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS,OAAO,CAAC,MAAM,gBAAgB,gBAAgB,EAAE;aAChE;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ActivityEntry {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
type: 'ingest' | 'search' | 'crawl' | 'error' | 'query';
|
|
4
|
+
message: string;
|
|
5
|
+
details?: Record<string, any>;
|
|
6
|
+
}
|
|
7
|
+
export declare function logActivity(type: ActivityEntry['type'], message: string, details?: Record<string, any>): void;
|
|
8
|
+
export declare function getActivityLog(): ActivityEntry[];
|
|
9
|
+
export declare function clearActivityLog(): void;
|
|
10
|
+
//# sourceMappingURL=activity-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-log.d.ts","sourceRoot":"","sources":["../../src/services/activity-log.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAYD,wBAAgB,WAAW,CACzB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,IAAI,CAqBN;AAED,wBAAgB,cAAc,IAAI,aAAa,EAAE,CAahD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAOvC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
const ACTIVITY_LOG_DIR = join(homedir(), '.cursor-rag');
|
|
5
|
+
const ACTIVITY_LOG_FILE = join(ACTIVITY_LOG_DIR, 'activity.json');
|
|
6
|
+
const MAX_ENTRIES = 100;
|
|
7
|
+
function ensureLogDir() {
|
|
8
|
+
if (!existsSync(ACTIVITY_LOG_DIR)) {
|
|
9
|
+
mkdirSync(ACTIVITY_LOG_DIR, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function logActivity(type, message, details) {
|
|
13
|
+
try {
|
|
14
|
+
ensureLogDir();
|
|
15
|
+
const entries = getActivityLog();
|
|
16
|
+
entries.unshift({
|
|
17
|
+
timestamp: new Date().toISOString(),
|
|
18
|
+
type,
|
|
19
|
+
message,
|
|
20
|
+
details
|
|
21
|
+
});
|
|
22
|
+
// Keep only the most recent entries
|
|
23
|
+
const trimmed = entries.slice(0, MAX_ENTRIES);
|
|
24
|
+
writeFileSync(ACTIVITY_LOG_FILE, JSON.stringify(trimmed, null, 2), 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// Silently fail - activity logging shouldn't break the main flow
|
|
28
|
+
console.error('Failed to log activity:', error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function getActivityLog() {
|
|
32
|
+
try {
|
|
33
|
+
ensureLogDir();
|
|
34
|
+
if (!existsSync(ACTIVITY_LOG_FILE)) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const content = readFileSync(ACTIVITY_LOG_FILE, 'utf-8');
|
|
38
|
+
return JSON.parse(content);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function clearActivityLog() {
|
|
45
|
+
try {
|
|
46
|
+
ensureLogDir();
|
|
47
|
+
writeFileSync(ACTIVITY_LOG_FILE, '[]', 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Failed to clear activity log:', error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=activity-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-log.js","sourceRoot":"","sources":["../../src/services/activity-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAS7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAClE,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,IAA2B,EAC3B,OAAe,EACf,OAA6B;IAE7B,IAAI,CAAC;QACH,YAAY,EAAE,CAAC;QAEf,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QAEjC,OAAO,CAAC,OAAO,CAAC;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI;YACJ,OAAO;YACP,OAAO;SACR,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAE9C,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iEAAiE;QACjE,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,YAAY,EAAE,CAAC;QAEf,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,YAAY,EAAE,CAAC;QACf,aAAa,CAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|