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.
Files changed (85) hide show
  1. package/.env.example +75 -40
  2. package/README.md +112 -345
  3. package/dist/chunking/file-grouper.d.ts +1 -1
  4. package/dist/chunking/file-grouper.d.ts.map +1 -1
  5. package/dist/chunking/file-grouper.js +2 -19
  6. package/dist/chunking/file-grouper.js.map +1 -1
  7. package/dist/chunking/semantic-chunker.d.ts.map +1 -1
  8. package/dist/chunking/semantic-chunker.js +4 -19
  9. package/dist/chunking/semantic-chunker.js.map +1 -1
  10. package/dist/cli/commands/chat-cmd.d.ts +3 -0
  11. package/dist/cli/commands/chat-cmd.d.ts.map +1 -0
  12. package/dist/cli/commands/chat-cmd.js +194 -0
  13. package/dist/cli/commands/chat-cmd.js.map +1 -0
  14. package/dist/cli.js +5 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/config/constants.d.ts +326 -0
  17. package/dist/config/constants.d.ts.map +1 -0
  18. package/dist/config/constants.js +214 -0
  19. package/dist/config/constants.js.map +1 -0
  20. package/dist/config/loader.d.ts.map +1 -1
  21. package/dist/config/loader.js +11 -3
  22. package/dist/config/loader.js.map +1 -1
  23. package/dist/core/batch-indexer.d.ts +14 -2
  24. package/dist/core/batch-indexer.d.ts.map +1 -1
  25. package/dist/core/batch-indexer.js +107 -79
  26. package/dist/core/batch-indexer.js.map +1 -1
  27. package/dist/core/indexer.d.ts.map +1 -1
  28. package/dist/core/indexer.js +4 -28
  29. package/dist/core/indexer.js.map +1 -1
  30. package/dist/core/search.d.ts.map +1 -1
  31. package/dist/core/search.js +8 -5
  32. package/dist/core/search.js.map +1 -1
  33. package/dist/database/db.d.ts +44 -5
  34. package/dist/database/db.d.ts.map +1 -1
  35. package/dist/database/db.js +270 -109
  36. package/dist/database/db.js.map +1 -1
  37. package/dist/mcp/schemas.d.ts +166 -0
  38. package/dist/mcp/schemas.d.ts.map +1 -0
  39. package/dist/mcp/schemas.js +159 -0
  40. package/dist/mcp/schemas.js.map +1 -0
  41. package/dist/mcp-server.js +31 -38
  42. package/dist/mcp-server.js.map +1 -1
  43. package/dist/providers/chat-llm.d.ts.map +1 -1
  44. package/dist/providers/chat-llm.js +4 -1
  45. package/dist/providers/chat-llm.js.map +1 -1
  46. package/dist/ranking/symbol-boost.d.ts.map +1 -1
  47. package/dist/ranking/symbol-boost.js +28 -7
  48. package/dist/ranking/symbol-boost.js.map +1 -1
  49. package/dist/storage/encrypted-chunks.d.ts.map +1 -1
  50. package/dist/storage/encrypted-chunks.js +3 -2
  51. package/dist/storage/encrypted-chunks.js.map +1 -1
  52. package/dist/symbols/extract.d.ts.map +1 -1
  53. package/dist/symbols/extract.js +27 -6
  54. package/dist/symbols/extract.js.map +1 -1
  55. package/dist/symbols/graph.d.ts.map +1 -1
  56. package/dist/symbols/graph.js +1 -1
  57. package/dist/symbols/graph.js.map +1 -1
  58. package/dist/synthesis/conversational-synthesizer.d.ts +61 -0
  59. package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -0
  60. package/dist/synthesis/conversational-synthesizer.js +286 -0
  61. package/dist/synthesis/conversational-synthesizer.js.map +1 -0
  62. package/dist/utils/indexer-with-progress.d.ts.map +1 -1
  63. package/dist/utils/indexer-with-progress.js +12 -27
  64. package/dist/utils/indexer-with-progress.js.map +1 -1
  65. package/dist/utils/logger.d.ts +55 -0
  66. package/dist/utils/logger.d.ts.map +1 -0
  67. package/dist/utils/logger.js +121 -0
  68. package/dist/utils/logger.js.map +1 -0
  69. package/dist/utils/mutex.d.ts +63 -0
  70. package/dist/utils/mutex.d.ts.map +1 -0
  71. package/dist/utils/mutex.js +123 -0
  72. package/dist/utils/mutex.js.map +1 -0
  73. package/dist/utils/path-helpers.d.ts +27 -0
  74. package/dist/utils/path-helpers.d.ts.map +1 -0
  75. package/dist/utils/path-helpers.js +55 -0
  76. package/dist/utils/path-helpers.js.map +1 -0
  77. package/dist/utils/scan-patterns.d.ts +5 -0
  78. package/dist/utils/scan-patterns.d.ts.map +1 -0
  79. package/dist/utils/scan-patterns.js +29 -0
  80. package/dist/utils/scan-patterns.js.map +1 -0
  81. package/package.json +4 -3
  82. package/dist/providers/ollama.d.ts +0 -13
  83. package/dist/providers/ollama.d.ts.map +0 -1
  84. package/dist/providers/ollama.js +0 -50
  85. 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":"AAKA,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,CAwD7B"}
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
- processedCount++;
52
- callbacks.onFileProgress(processedCount, files.length, event.file);
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;AASvE,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;YACN,cAAc;YACd,oBAAoB;YACpB,YAAY;YACZ,eAAe;YACf,YAAY;YACZ,aAAa;YACb,WAAW;YACX,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,eAAe;YACf,cAAc;YACd,cAAc;YACd,kBAAkB;YAClB,2BAA2B;YAC3B,oCAAoC;YACpC,sBAAsB;YACtB,cAAc;YACd,mBAAmB;YACnB,WAAW;YACX,SAAS;YACT,gBAAgB;YAChB,cAAc;SACf;QACD,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,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,cAAc,EAAE,CAAC;gBACjB,SAAS,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,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"}