codevault 1.5.0 → 1.6.1
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/.env.example +75 -40
- package/README.md +112 -345
- package/dist/chunking/file-grouper.d.ts +1 -1
- package/dist/chunking/file-grouper.d.ts.map +1 -1
- package/dist/chunking/file-grouper.js +2 -19
- package/dist/chunking/file-grouper.js.map +1 -1
- package/dist/chunking/semantic-chunker.d.ts.map +1 -1
- package/dist/chunking/semantic-chunker.js +4 -19
- package/dist/chunking/semantic-chunker.js.map +1 -1
- package/dist/cli/commands/chat-cmd.d.ts +3 -0
- package/dist/cli/commands/chat-cmd.d.ts.map +1 -0
- package/dist/cli/commands/chat-cmd.js +194 -0
- package/dist/cli/commands/chat-cmd.js.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/constants.d.ts +326 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +214 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +11 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/core/batch-indexer.d.ts +14 -2
- package/dist/core/batch-indexer.d.ts.map +1 -1
- package/dist/core/batch-indexer.js +107 -79
- package/dist/core/batch-indexer.js.map +1 -1
- package/dist/core/indexer.d.ts.map +1 -1
- package/dist/core/indexer.js +4 -28
- package/dist/core/indexer.js.map +1 -1
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +8 -5
- package/dist/core/search.js.map +1 -1
- package/dist/database/db.d.ts +44 -5
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +270 -109
- package/dist/database/db.js.map +1 -1
- package/dist/mcp/schemas.d.ts +166 -0
- package/dist/mcp/schemas.d.ts.map +1 -0
- package/dist/mcp/schemas.js +159 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp-server.js +31 -38
- package/dist/mcp-server.js.map +1 -1
- package/dist/providers/chat-llm.d.ts.map +1 -1
- package/dist/providers/chat-llm.js +4 -1
- package/dist/providers/chat-llm.js.map +1 -1
- package/dist/ranking/symbol-boost.d.ts.map +1 -1
- package/dist/ranking/symbol-boost.js +28 -7
- package/dist/ranking/symbol-boost.js.map +1 -1
- package/dist/storage/encrypted-chunks.d.ts.map +1 -1
- package/dist/storage/encrypted-chunks.js +3 -2
- package/dist/storage/encrypted-chunks.js.map +1 -1
- package/dist/symbols/extract.d.ts.map +1 -1
- package/dist/symbols/extract.js +27 -6
- package/dist/symbols/extract.js.map +1 -1
- package/dist/symbols/graph.d.ts.map +1 -1
- package/dist/symbols/graph.js +1 -1
- package/dist/symbols/graph.js.map +1 -1
- package/dist/synthesis/conversational-synthesizer.d.ts +61 -0
- package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -0
- package/dist/synthesis/conversational-synthesizer.js +286 -0
- package/dist/synthesis/conversational-synthesizer.js.map +1 -0
- package/dist/utils/indexer-with-progress.d.ts.map +1 -1
- package/dist/utils/indexer-with-progress.js +12 -27
- package/dist/utils/indexer-with-progress.js.map +1 -1
- package/dist/utils/logger.d.ts +55 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +121 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mutex.d.ts +63 -0
- package/dist/utils/mutex.d.ts.map +1 -0
- package/dist/utils/mutex.js +123 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/path-helpers.d.ts +27 -0
- package/dist/utils/path-helpers.d.ts.map +1 -0
- package/dist/utils/path-helpers.js +55 -0
- package/dist/utils/path-helpers.js.map +1 -0
- package/dist/utils/scan-patterns.d.ts +5 -0
- package/dist/utils/scan-patterns.d.ts.map +1 -0
- package/dist/utils/scan-patterns.js +29 -0
- package/dist/utils/scan-patterns.js.map +1 -0
- package/package.json +4 -3
- package/dist/providers/ollama.d.ts +0 -13
- package/dist/providers/ollama.d.ts.map +0 -1
- package/dist/providers/ollama.js +0 -50
- package/dist/providers/ollama.js.map +0 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { searchCode, getChunk } from '../core/search.js';
|
|
2
|
+
import { PROMPT_TRUNCATE_LENGTH, CONVERSATION_MAX_CONTEXT_CHUNKS } from '../config/constants.js';
|
|
3
|
+
import { createChatLLMProvider } from '../providers/chat-llm.js';
|
|
4
|
+
/**
|
|
5
|
+
* Synthesize an answer in the context of an ongoing conversation
|
|
6
|
+
*/
|
|
7
|
+
export async function synthesizeConversationalAnswer(query, conversationContext, options = {}) {
|
|
8
|
+
const { provider = 'auto', chatProvider = 'auto', workingPath = '.', scope = {}, maxChunks = 10, useReranking = true, temperature = 0.7, maxHistoryTurns = 5 } = options;
|
|
9
|
+
try {
|
|
10
|
+
const chatLLM = createChatLLMProvider(chatProvider);
|
|
11
|
+
if (chatLLM.init) {
|
|
12
|
+
await chatLLM.init();
|
|
13
|
+
}
|
|
14
|
+
// Search for relevant code chunks for current query
|
|
15
|
+
const searchScope = {
|
|
16
|
+
...scope,
|
|
17
|
+
reranker: useReranking ? 'api' : 'off',
|
|
18
|
+
hybrid: true,
|
|
19
|
+
bm25: true,
|
|
20
|
+
symbol_boost: true
|
|
21
|
+
};
|
|
22
|
+
const searchResult = await searchCode(query, maxChunks, provider, workingPath, searchScope);
|
|
23
|
+
if (!searchResult.success || searchResult.results.length === 0) {
|
|
24
|
+
return {
|
|
25
|
+
success: false,
|
|
26
|
+
error: 'no_results',
|
|
27
|
+
query,
|
|
28
|
+
chunksAnalyzed: 0,
|
|
29
|
+
chatProvider: chatLLM.getName(),
|
|
30
|
+
embeddingProvider: provider
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Retrieve code for new chunks
|
|
34
|
+
const newChunks = searchResult.results.slice(0, maxChunks);
|
|
35
|
+
for (const result of newChunks) {
|
|
36
|
+
if (!conversationContext.allChunks.has(result.sha)) {
|
|
37
|
+
const chunkResult = await getChunk(result.sha, workingPath);
|
|
38
|
+
if (chunkResult.success && chunkResult.code) {
|
|
39
|
+
conversationContext.allChunks.set(result.sha, {
|
|
40
|
+
result,
|
|
41
|
+
code: chunkResult.code
|
|
42
|
+
});
|
|
43
|
+
// Enforce LRU cap on cached chunks
|
|
44
|
+
evictOldChunksIfNeeded(conversationContext);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Build conversational prompt
|
|
49
|
+
const messages = buildConversationalMessages(query, conversationContext, newChunks, maxHistoryTurns);
|
|
50
|
+
// Expose selected chunks to caller for tracking
|
|
51
|
+
if (options.onChunksSelected) {
|
|
52
|
+
options.onChunksSelected(newChunks);
|
|
53
|
+
}
|
|
54
|
+
// Generate answer (non-streaming)
|
|
55
|
+
const answer = await chatLLM.generateCompletion(messages, {
|
|
56
|
+
temperature,
|
|
57
|
+
maxTokens: parseInt(process.env.CODEVAULT_CHAT_MAX_TOKENS || '4096', 10)
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
success: true,
|
|
61
|
+
answer,
|
|
62
|
+
query,
|
|
63
|
+
chunksAnalyzed: newChunks.length,
|
|
64
|
+
chatProvider: chatLLM.getName(),
|
|
65
|
+
embeddingProvider: provider,
|
|
66
|
+
newChunks
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return {
|
|
71
|
+
success: false,
|
|
72
|
+
error: error.message,
|
|
73
|
+
query,
|
|
74
|
+
chunksAnalyzed: 0,
|
|
75
|
+
chatProvider: chatProvider,
|
|
76
|
+
embeddingProvider: provider
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Streaming version for real-time responses
|
|
82
|
+
*/
|
|
83
|
+
export async function* synthesizeConversationalAnswerStreaming(query, conversationContext, options = {}) {
|
|
84
|
+
const { provider = 'auto', chatProvider = 'auto', workingPath = '.', scope = {}, maxChunks = 10, useReranking = true, temperature = 0.7, maxHistoryTurns = 5 } = options;
|
|
85
|
+
const chatLLM = createChatLLMProvider(chatProvider);
|
|
86
|
+
if (chatLLM.init) {
|
|
87
|
+
await chatLLM.init();
|
|
88
|
+
}
|
|
89
|
+
// Search for relevant code chunks
|
|
90
|
+
const searchScope = {
|
|
91
|
+
...scope,
|
|
92
|
+
reranker: useReranking ? 'api' : 'off',
|
|
93
|
+
hybrid: true,
|
|
94
|
+
bm25: true,
|
|
95
|
+
symbol_boost: true
|
|
96
|
+
};
|
|
97
|
+
const searchResult = await searchCode(query, maxChunks, provider, workingPath, searchScope);
|
|
98
|
+
if (!searchResult.success || searchResult.results.length === 0) {
|
|
99
|
+
yield `**No relevant code found for:** "${query}"\n\n`;
|
|
100
|
+
yield `Please try rephrasing your question or ensure the project is indexed.`;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Retrieve code for new chunks
|
|
104
|
+
const newChunks = searchResult.results.slice(0, maxChunks);
|
|
105
|
+
for (const result of newChunks) {
|
|
106
|
+
if (!conversationContext.allChunks.has(result.sha)) {
|
|
107
|
+
const chunkResult = await getChunk(result.sha, workingPath);
|
|
108
|
+
if (chunkResult.success && chunkResult.code) {
|
|
109
|
+
conversationContext.allChunks.set(result.sha, {
|
|
110
|
+
result,
|
|
111
|
+
code: chunkResult.code
|
|
112
|
+
});
|
|
113
|
+
// Enforce LRU cap on cached chunks
|
|
114
|
+
evictOldChunksIfNeeded(conversationContext);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Build messages with conversation history
|
|
119
|
+
const messages = buildConversationalMessages(query, conversationContext, newChunks, maxHistoryTurns);
|
|
120
|
+
// Expose selected chunks to caller for tracking
|
|
121
|
+
if (options.onChunksSelected) {
|
|
122
|
+
options.onChunksSelected(newChunks);
|
|
123
|
+
}
|
|
124
|
+
// Stream the response
|
|
125
|
+
for await (const chunk of chatLLM.generateStreamingCompletion(messages, { temperature })) {
|
|
126
|
+
yield chunk;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build messages array with conversation history
|
|
131
|
+
*/
|
|
132
|
+
function buildConversationalMessages(currentQuery, context, newChunks, maxHistoryTurns) {
|
|
133
|
+
const messages = [];
|
|
134
|
+
// System prompt for conversational mode
|
|
135
|
+
messages.push({
|
|
136
|
+
role: 'system',
|
|
137
|
+
content: buildConversationalSystemPrompt()
|
|
138
|
+
});
|
|
139
|
+
// Add conversation history (last N turns)
|
|
140
|
+
const recentTurns = context.turns.slice(-maxHistoryTurns);
|
|
141
|
+
for (const turn of recentTurns) {
|
|
142
|
+
messages.push({
|
|
143
|
+
role: 'user',
|
|
144
|
+
content: turn.question
|
|
145
|
+
});
|
|
146
|
+
messages.push({
|
|
147
|
+
role: 'assistant',
|
|
148
|
+
content: turn.answer
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Add current query with code context
|
|
152
|
+
const userPrompt = buildConversationalUserPrompt(currentQuery, context, newChunks);
|
|
153
|
+
messages.push({
|
|
154
|
+
role: 'user',
|
|
155
|
+
content: userPrompt
|
|
156
|
+
});
|
|
157
|
+
return messages;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Build system prompt for conversational mode
|
|
161
|
+
*/
|
|
162
|
+
function buildConversationalSystemPrompt() {
|
|
163
|
+
return `You are an expert code analyst helping a developer understand their codebase through an interactive conversation.
|
|
164
|
+
|
|
165
|
+
Your role is to:
|
|
166
|
+
1. Answer questions clearly and concisely based on the provided code context
|
|
167
|
+
2. Maintain continuity with the conversation history
|
|
168
|
+
3. Reference previous discussions when relevant
|
|
169
|
+
4. Use proper markdown formatting with code citations
|
|
170
|
+
5. Cite specific files using the format: \`[filename.ext](filename.ext:line)\`
|
|
171
|
+
6. Be conversational but professional
|
|
172
|
+
7. If the question builds on previous context, acknowledge that connection
|
|
173
|
+
|
|
174
|
+
Format guidelines:
|
|
175
|
+
- Use clear headings and sections
|
|
176
|
+
- Include code blocks with language tags
|
|
177
|
+
- Use bullet points for clarity
|
|
178
|
+
- Bold/italic for emphasis
|
|
179
|
+
- Keep responses focused and relevant to the current question
|
|
180
|
+
|
|
181
|
+
Remember: You're having an ongoing conversation, not answering isolated questions.`;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Build user prompt with conversation-aware context
|
|
185
|
+
*/
|
|
186
|
+
function buildConversationalUserPrompt(currentQuery, context, newChunks) {
|
|
187
|
+
let prompt = `# Current Question\n\n${currentQuery}\n\n`;
|
|
188
|
+
// Show relevant code chunks for current question
|
|
189
|
+
if (newChunks.length > 0) {
|
|
190
|
+
prompt += `# Relevant Code (for current question)\n\n`;
|
|
191
|
+
prompt += `I found ${newChunks.length} code chunks relevant to your current question:\n\n`;
|
|
192
|
+
newChunks.forEach((result, index) => {
|
|
193
|
+
const chunkData = context.allChunks.get(result.sha);
|
|
194
|
+
const relevanceScore = (result.meta.score * 100).toFixed(1);
|
|
195
|
+
prompt += `## Chunk ${index + 1}: ${result.meta.symbol} (${relevanceScore}% relevant)\n\n`;
|
|
196
|
+
prompt += `**File:** \`${result.path}\`\n`;
|
|
197
|
+
prompt += `**Language:** ${result.lang}\n`;
|
|
198
|
+
prompt += `**Symbol:** ${result.meta.symbol}\n`;
|
|
199
|
+
if (result.meta.description) {
|
|
200
|
+
prompt += `**Description:** ${result.meta.description}\n`;
|
|
201
|
+
}
|
|
202
|
+
if (chunkData && chunkData.code) {
|
|
203
|
+
const limit = PROMPT_TRUNCATE_LENGTH;
|
|
204
|
+
const truncatedCode = chunkData.code.length > limit
|
|
205
|
+
? chunkData.code.substring(0, limit) + '\n... [truncated]'
|
|
206
|
+
: chunkData.code;
|
|
207
|
+
prompt += `\n**Code:**\n\n\`\`\`${result.lang}\n${truncatedCode}\n\`\`\`\n\n`;
|
|
208
|
+
}
|
|
209
|
+
prompt += `---\n\n`;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// Add reference to previously discussed code if relevant
|
|
213
|
+
if (context.turns.length > 0) {
|
|
214
|
+
const previousChunks = new Set();
|
|
215
|
+
context.turns.forEach(turn => {
|
|
216
|
+
turn.chunks.forEach(chunk => previousChunks.add(chunk.sha));
|
|
217
|
+
});
|
|
218
|
+
const previouslySeenChunks = Array.from(previousChunks)
|
|
219
|
+
.filter(sha => !newChunks.some(c => c.sha === sha))
|
|
220
|
+
.slice(0, 5);
|
|
221
|
+
if (previouslySeenChunks.length > 0) {
|
|
222
|
+
prompt += `# Previously Discussed Code (available for reference)\n\n`;
|
|
223
|
+
previouslySeenChunks.forEach(sha => {
|
|
224
|
+
const chunkData = context.allChunks.get(sha);
|
|
225
|
+
if (chunkData) {
|
|
226
|
+
prompt += `- \`${chunkData.result.path}\` - ${chunkData.result.meta.symbol}\n`;
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
prompt += `\n`;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Instructions for response
|
|
233
|
+
prompt += `# Instructions\n\n`;
|
|
234
|
+
prompt += `Based on our conversation and the code provided, please answer: "${currentQuery}"\n\n`;
|
|
235
|
+
prompt += `Your response should:\n`;
|
|
236
|
+
prompt += `1. Build on our previous conversation if relevant\n`;
|
|
237
|
+
prompt += `2. Directly answer the current question\n`;
|
|
238
|
+
prompt += `3. Use inline citations like: \`[filename.ext](filename.ext)\`\n`;
|
|
239
|
+
prompt += `4. Include relevant code snippets\n`;
|
|
240
|
+
prompt += `5. Use proper markdown formatting\n`;
|
|
241
|
+
prompt += `6. Be concise but thorough\n`;
|
|
242
|
+
return prompt;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Create a new conversation context
|
|
246
|
+
*/
|
|
247
|
+
export function createConversationContext() {
|
|
248
|
+
return {
|
|
249
|
+
turns: [],
|
|
250
|
+
allChunks: new Map()
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Add a turn to the conversation history
|
|
255
|
+
*/
|
|
256
|
+
export function addConversationTurn(context, turn) {
|
|
257
|
+
context.turns.push(turn);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Clear conversation history
|
|
261
|
+
*/
|
|
262
|
+
export function clearConversationHistory(context) {
|
|
263
|
+
context.turns = [];
|
|
264
|
+
context.allChunks.clear();
|
|
265
|
+
}
|
|
266
|
+
function evictOldChunksIfNeeded(context) {
|
|
267
|
+
const max = CONVERSATION_MAX_CONTEXT_CHUNKS || 200;
|
|
268
|
+
if (context.allChunks.size <= max)
|
|
269
|
+
return;
|
|
270
|
+
const excess = context.allChunks.size - max;
|
|
271
|
+
// Remove first N inserted entries (Map preserves insertion order)
|
|
272
|
+
const keys = Array.from(context.allChunks.keys());
|
|
273
|
+
for (let i = 0; i < excess; i++) {
|
|
274
|
+
context.allChunks.delete(keys[i]);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get conversation summary for display
|
|
279
|
+
*/
|
|
280
|
+
export function getConversationSummary(context) {
|
|
281
|
+
const turnCount = context.turns.length;
|
|
282
|
+
const uniqueChunks = context.allChunks.size;
|
|
283
|
+
const uniqueFiles = new Set(Array.from(context.allChunks.values()).map(chunk => chunk.result.path)).size;
|
|
284
|
+
return `Conversation: ${turnCount} turn${turnCount !== 1 ? 's' : ''} | ${uniqueChunks} code chunks | ${uniqueFiles} file${uniqueFiles !== 1 ? 's' : ''}`;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=conversational-synthesizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversational-synthesizer.js","sourceRoot":"","sources":["../../src/synthesis/conversational-synthesizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer-with-progress.d.ts","sourceRoot":"","sources":["../../src/utils/indexer-with-progress.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"indexer-with-progress.d.ts","sourceRoot":"","sources":["../../src/utils/indexer-with-progress.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5E,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,mBAAmB,GAAG;IAAE,SAAS,CAAC,EAAE,0BAA0B,CAAA;CAAE,GACxE,OAAO,CAAC,kBAAkB,CAAC,CAwC7B"}
|
|
@@ -2,6 +2,7 @@ import fg from 'fast-glob';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { indexProject } from '../core/indexer.js';
|
|
4
4
|
import { getSupportedLanguageExtensions } from '../languages/rules.js';
|
|
5
|
+
import { DEFAULT_SCAN_IGNORES } from './scan-patterns.js';
|
|
5
6
|
export async function indexProjectWithProgress(options) {
|
|
6
7
|
const { callbacks, ...indexOptions } = options;
|
|
7
8
|
const repo = path.resolve(options.repoPath || '.');
|
|
@@ -11,31 +12,7 @@ export async function indexProjectWithProgress(options) {
|
|
|
11
12
|
cwd: repo,
|
|
12
13
|
absolute: false,
|
|
13
14
|
followSymbolicLinks: false,
|
|
14
|
-
ignore:
|
|
15
|
-
'**/vendor/**',
|
|
16
|
-
'**/node_modules/**',
|
|
17
|
-
'**/.git/**',
|
|
18
|
-
'**/storage/**',
|
|
19
|
-
'**/dist/**',
|
|
20
|
-
'**/build/**',
|
|
21
|
-
'**/tmp/**',
|
|
22
|
-
'**/temp/**',
|
|
23
|
-
'**/.npm/**',
|
|
24
|
-
'**/.yarn/**',
|
|
25
|
-
'**/Library/**',
|
|
26
|
-
'**/System/**',
|
|
27
|
-
'**/.Trash/**',
|
|
28
|
-
'**/.codevault/**',
|
|
29
|
-
'**/codevault.codemap.json',
|
|
30
|
-
'**/codevault.codemap.json.backup-*',
|
|
31
|
-
'**/package-lock.json',
|
|
32
|
-
'**/yarn.lock',
|
|
33
|
-
'**/pnpm-lock.yaml',
|
|
34
|
-
'**/*.json',
|
|
35
|
-
'**/*.sh',
|
|
36
|
-
'**/examples/**',
|
|
37
|
-
'**/assets/**'
|
|
38
|
-
],
|
|
15
|
+
ignore: DEFAULT_SCAN_IGNORES,
|
|
39
16
|
onlyFiles: true,
|
|
40
17
|
dot: false
|
|
41
18
|
});
|
|
@@ -44,12 +21,20 @@ export async function indexProjectWithProgress(options) {
|
|
|
44
21
|
}
|
|
45
22
|
// Phase 2: Index with progress tracking
|
|
46
23
|
let processedCount = 0;
|
|
24
|
+
const processedFiles = new Set();
|
|
47
25
|
const result = await indexProject({
|
|
48
26
|
...indexOptions,
|
|
49
27
|
onProgress: (event) => {
|
|
50
28
|
if (event.type === 'chunk_processed' && event.file && callbacks?.onFileProgress) {
|
|
51
|
-
|
|
52
|
-
|
|
29
|
+
// Only count each file once (not per chunk)
|
|
30
|
+
if (!processedFiles.has(event.file)) {
|
|
31
|
+
processedFiles.add(event.file);
|
|
32
|
+
processedCount++;
|
|
33
|
+
callbacks.onFileProgress(processedCount, files.length, event.file);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (event.type === 'finalizing' && callbacks?.onFinalizing) {
|
|
37
|
+
callbacks.onFinalizing();
|
|
53
38
|
}
|
|
54
39
|
}
|
|
55
40
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer-with-progress.js","sourceRoot":"","sources":["../../src/utils/indexer-with-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"indexer-with-progress.js","sourceRoot":"","sources":["../../src/utils/indexer-with-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS1D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAyE;IAEzE,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;IAEnD,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,8BAA8B,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,gBAAgB,EAAE;QACvC,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,KAAK;QACf,mBAAmB,EAAE,KAAK;QAC1B,MAAM,EAAE,oBAAoB;QAC5B,SAAS,EAAE,IAAI;QACf,GAAG,EAAE,KAAK;KACX,CAAC,CAAC;IAEH,IAAI,SAAS,EAAE,cAAc,EAAE,CAAC;QAC9B,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,wCAAwC;IACxC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,GAAG,YAAY;QACf,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,cAAc,EAAE,CAAC;gBAChF,4CAA4C;gBAC5C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/B,cAAc,EAAE,CAAC;oBACjB,SAAS,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,SAAS,EAAE,YAAY,EAAE,CAAC;gBAC3D,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging utility for CodeVault
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent logging with levels, structured metadata, and
|
|
5
|
+
* environment-based configuration.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum LogLevel {
|
|
8
|
+
DEBUG = 0,
|
|
9
|
+
INFO = 1,
|
|
10
|
+
WARN = 2,
|
|
11
|
+
ERROR = 3,
|
|
12
|
+
SILENT = 4
|
|
13
|
+
}
|
|
14
|
+
interface LogMetadata {
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}
|
|
17
|
+
declare class Logger {
|
|
18
|
+
private level;
|
|
19
|
+
private quiet;
|
|
20
|
+
constructor();
|
|
21
|
+
private parseLogLevel;
|
|
22
|
+
private shouldLog;
|
|
23
|
+
private formatMessage;
|
|
24
|
+
debug(message: string, meta?: LogMetadata): void;
|
|
25
|
+
info(message: string, meta?: LogMetadata): void;
|
|
26
|
+
warn(message: string, meta?: LogMetadata): void;
|
|
27
|
+
error(message: string, error?: Error | any, meta?: LogMetadata): void;
|
|
28
|
+
/**
|
|
29
|
+
* Check if quiet mode is enabled
|
|
30
|
+
*/
|
|
31
|
+
isQuiet(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Set quiet mode (suppresses INFO and DEBUG)
|
|
34
|
+
*/
|
|
35
|
+
setQuiet(quiet: boolean): void;
|
|
36
|
+
/**
|
|
37
|
+
* Set log level
|
|
38
|
+
*/
|
|
39
|
+
setLevel(level: LogLevel): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get current log level
|
|
42
|
+
*/
|
|
43
|
+
getLevel(): LogLevel;
|
|
44
|
+
}
|
|
45
|
+
export declare const logger: Logger;
|
|
46
|
+
export declare const log: {
|
|
47
|
+
debug: (message: string, meta?: LogMetadata) => void;
|
|
48
|
+
info: (message: string, meta?: LogMetadata) => void;
|
|
49
|
+
warn: (message: string, meta?: LogMetadata) => void;
|
|
50
|
+
error: (message: string, error?: Error | any, meta?: LogMetadata) => void;
|
|
51
|
+
isQuiet: () => boolean;
|
|
52
|
+
setQuiet: (quiet: boolean) => void;
|
|
53
|
+
};
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,MAAM,IAAI;CACX;AAED,UAAU,WAAW;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,KAAK,CAAU;;IAOvB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAYrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI;IAKhD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI;IAK/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI;IAK/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI;IAiBrE;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAO9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B;;OAEG;IACH,QAAQ,IAAI,QAAQ;CAGrB;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC;AAGnC,eAAO,MAAM,GAAG;qBACG,MAAM,SAAS,WAAW;oBAC3B,MAAM,SAAS,WAAW;oBAC1B,MAAM,SAAS,WAAW;qBACzB,MAAM,UAAU,KAAK,GAAG,GAAG,SAAS,WAAW;;sBAG9C,OAAO;CAC1B,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging utility for CodeVault
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent logging with levels, structured metadata, and
|
|
5
|
+
* environment-based configuration.
|
|
6
|
+
*/
|
|
7
|
+
export var LogLevel;
|
|
8
|
+
(function (LogLevel) {
|
|
9
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
10
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
11
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
12
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
13
|
+
LogLevel[LogLevel["SILENT"] = 4] = "SILENT";
|
|
14
|
+
})(LogLevel || (LogLevel = {}));
|
|
15
|
+
class Logger {
|
|
16
|
+
level;
|
|
17
|
+
quiet;
|
|
18
|
+
constructor() {
|
|
19
|
+
this.quiet = process.env.CODEVAULT_QUIET === 'true';
|
|
20
|
+
this.level = this.parseLogLevel(process.env.CODEVAULT_LOG_LEVEL);
|
|
21
|
+
}
|
|
22
|
+
parseLogLevel(level) {
|
|
23
|
+
if (!level)
|
|
24
|
+
return this.quiet ? LogLevel.ERROR : LogLevel.INFO;
|
|
25
|
+
switch (level.toLowerCase()) {
|
|
26
|
+
case 'debug':
|
|
27
|
+
return LogLevel.DEBUG;
|
|
28
|
+
case 'info':
|
|
29
|
+
return LogLevel.INFO;
|
|
30
|
+
case 'warn':
|
|
31
|
+
return LogLevel.WARN;
|
|
32
|
+
case 'error':
|
|
33
|
+
return LogLevel.ERROR;
|
|
34
|
+
case 'silent':
|
|
35
|
+
return LogLevel.SILENT;
|
|
36
|
+
default:
|
|
37
|
+
return LogLevel.INFO;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
shouldLog(level) {
|
|
41
|
+
return level >= this.level;
|
|
42
|
+
}
|
|
43
|
+
formatMessage(level, message, meta) {
|
|
44
|
+
const timestamp = new Date().toISOString();
|
|
45
|
+
const prefix = `[${timestamp}] [${level}]`;
|
|
46
|
+
if (meta && Object.keys(meta).length > 0) {
|
|
47
|
+
const metaStr = JSON.stringify(meta);
|
|
48
|
+
return `${prefix} ${message} ${metaStr}`;
|
|
49
|
+
}
|
|
50
|
+
return `${prefix} ${message}`;
|
|
51
|
+
}
|
|
52
|
+
debug(message, meta) {
|
|
53
|
+
if (!this.shouldLog(LogLevel.DEBUG))
|
|
54
|
+
return;
|
|
55
|
+
console.log(this.formatMessage('DEBUG', message, meta));
|
|
56
|
+
}
|
|
57
|
+
info(message, meta) {
|
|
58
|
+
if (!this.shouldLog(LogLevel.INFO))
|
|
59
|
+
return;
|
|
60
|
+
console.log(this.formatMessage('INFO', message, meta));
|
|
61
|
+
}
|
|
62
|
+
warn(message, meta) {
|
|
63
|
+
if (!this.shouldLog(LogLevel.WARN))
|
|
64
|
+
return;
|
|
65
|
+
console.warn(this.formatMessage('WARN', message, meta));
|
|
66
|
+
}
|
|
67
|
+
error(message, error, meta) {
|
|
68
|
+
if (!this.shouldLog(LogLevel.ERROR))
|
|
69
|
+
return;
|
|
70
|
+
const errorMeta = {
|
|
71
|
+
...meta,
|
|
72
|
+
...(error instanceof Error
|
|
73
|
+
? {
|
|
74
|
+
errorMessage: error.message,
|
|
75
|
+
errorStack: error.stack,
|
|
76
|
+
errorName: error.name,
|
|
77
|
+
}
|
|
78
|
+
: { error: String(error) }),
|
|
79
|
+
};
|
|
80
|
+
console.error(this.formatMessage('ERROR', message, errorMeta));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if quiet mode is enabled
|
|
84
|
+
*/
|
|
85
|
+
isQuiet() {
|
|
86
|
+
return this.quiet;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Set quiet mode (suppresses INFO and DEBUG)
|
|
90
|
+
*/
|
|
91
|
+
setQuiet(quiet) {
|
|
92
|
+
this.quiet = quiet;
|
|
93
|
+
if (quiet && this.level < LogLevel.WARN) {
|
|
94
|
+
this.level = LogLevel.WARN;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Set log level
|
|
99
|
+
*/
|
|
100
|
+
setLevel(level) {
|
|
101
|
+
this.level = level;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get current log level
|
|
105
|
+
*/
|
|
106
|
+
getLevel() {
|
|
107
|
+
return this.level;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Export singleton instance
|
|
111
|
+
export const logger = new Logger();
|
|
112
|
+
// Export convenience functions
|
|
113
|
+
export const log = {
|
|
114
|
+
debug: (message, meta) => logger.debug(message, meta),
|
|
115
|
+
info: (message, meta) => logger.info(message, meta),
|
|
116
|
+
warn: (message, meta) => logger.warn(message, meta),
|
|
117
|
+
error: (message, error, meta) => logger.error(message, error, meta),
|
|
118
|
+
isQuiet: () => logger.isQuiet(),
|
|
119
|
+
setQuiet: (quiet) => logger.setQuiet(quiet),
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutex implementation for coordinating async operations
|
|
3
|
+
*
|
|
4
|
+
* Provides a proper mutex/lock mechanism to replace polling-based
|
|
5
|
+
* concurrency control patterns.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Mutex {
|
|
8
|
+
private locked;
|
|
9
|
+
private queue;
|
|
10
|
+
/**
|
|
11
|
+
* Check if the mutex is currently locked
|
|
12
|
+
*/
|
|
13
|
+
isLocked(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Acquire the mutex lock
|
|
16
|
+
* Waits if already locked
|
|
17
|
+
*/
|
|
18
|
+
acquire(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Release the mutex lock
|
|
21
|
+
* Allows next queued operation to proceed
|
|
22
|
+
*/
|
|
23
|
+
release(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Run a function with automatic acquire/release
|
|
26
|
+
* Ensures lock is always released even if function throws
|
|
27
|
+
*/
|
|
28
|
+
runExclusive<T>(fn: () => Promise<T>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Get queue length (for debugging)
|
|
31
|
+
*/
|
|
32
|
+
getQueueLength(): number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Async semaphore for limiting concurrent operations
|
|
36
|
+
*/
|
|
37
|
+
export declare class Semaphore {
|
|
38
|
+
private permits;
|
|
39
|
+
private maxPermits;
|
|
40
|
+
private queue;
|
|
41
|
+
constructor(permits: number);
|
|
42
|
+
/**
|
|
43
|
+
* Acquire a permit
|
|
44
|
+
*/
|
|
45
|
+
acquire(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Release a permit
|
|
48
|
+
*/
|
|
49
|
+
release(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Run function with automatic acquire/release
|
|
52
|
+
*/
|
|
53
|
+
runExclusive<T>(fn: () => Promise<T>): Promise<T>;
|
|
54
|
+
/**
|
|
55
|
+
* Get available permits
|
|
56
|
+
*/
|
|
57
|
+
getAvailablePermits(): number;
|
|
58
|
+
/**
|
|
59
|
+
* Get queue length
|
|
60
|
+
*/
|
|
61
|
+
getQueueLength(): number;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=mutex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.d.ts","sourceRoot":"","sources":["../../src/utils/mutex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAyB;IAEtC;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B;;;OAGG;IACH,OAAO,IAAI,IAAI;IASf;;;OAGG;IACG,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASvD;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAyB;gBAE1B,OAAO,EAAE,MAAM;IAK3B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACG,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASvD;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
|