codevault 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/.env.example +37 -0
  2. package/LICENSE +21 -0
  3. package/README.md +174 -0
  4. package/dist/chunking/file-grouper.d.ts +39 -0
  5. package/dist/chunking/file-grouper.d.ts.map +1 -0
  6. package/dist/chunking/file-grouper.js +181 -0
  7. package/dist/chunking/file-grouper.js.map +1 -0
  8. package/dist/chunking/semantic-chunker.d.ts +37 -0
  9. package/dist/chunking/semantic-chunker.d.ts.map +1 -0
  10. package/dist/chunking/semantic-chunker.js +172 -0
  11. package/dist/chunking/semantic-chunker.js.map +1 -0
  12. package/dist/chunking/token-counter.d.ts +28 -0
  13. package/dist/chunking/token-counter.d.ts.map +1 -0
  14. package/dist/chunking/token-counter.js +207 -0
  15. package/dist/chunking/token-counter.js.map +1 -0
  16. package/dist/cli/commands/context.d.ts +3 -0
  17. package/dist/cli/commands/context.d.ts.map +1 -0
  18. package/dist/cli/commands/context.js +98 -0
  19. package/dist/cli/commands/context.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +222 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/codemap/io.d.ts +5 -0
  25. package/dist/codemap/io.d.ts.map +1 -0
  26. package/dist/codemap/io.js +30 -0
  27. package/dist/codemap/io.js.map +1 -0
  28. package/dist/context/packs.d.ts +33 -0
  29. package/dist/context/packs.d.ts.map +1 -0
  30. package/dist/context/packs.js +180 -0
  31. package/dist/context/packs.js.map +1 -0
  32. package/dist/core/indexer.d.ts +3 -0
  33. package/dist/core/indexer.d.ts.map +1 -0
  34. package/dist/core/indexer.js +610 -0
  35. package/dist/core/indexer.js.map +1 -0
  36. package/dist/core/metadata.d.ts +19 -0
  37. package/dist/core/metadata.d.ts.map +1 -0
  38. package/dist/core/metadata.js +161 -0
  39. package/dist/core/metadata.js.map +1 -0
  40. package/dist/core/search.d.ts +6 -0
  41. package/dist/core/search.d.ts.map +1 -0
  42. package/dist/core/search.js +482 -0
  43. package/dist/core/search.js.map +1 -0
  44. package/dist/core/symbol-extractor.d.ts +3 -0
  45. package/dist/core/symbol-extractor.d.ts.map +1 -0
  46. package/dist/core/symbol-extractor.js +78 -0
  47. package/dist/core/symbol-extractor.js.map +1 -0
  48. package/dist/core/types.d.ts +96 -0
  49. package/dist/core/types.d.ts.map +1 -0
  50. package/dist/core/types.js +2 -0
  51. package/dist/core/types.js.map +1 -0
  52. package/dist/database/db.d.ts +63 -0
  53. package/dist/database/db.d.ts.map +1 -0
  54. package/dist/database/db.js +205 -0
  55. package/dist/database/db.js.map +1 -0
  56. package/dist/indexer/merkle.d.ts +13 -0
  57. package/dist/indexer/merkle.d.ts.map +1 -0
  58. package/dist/indexer/merkle.js +86 -0
  59. package/dist/indexer/merkle.js.map +1 -0
  60. package/dist/indexer/update.d.ts +19 -0
  61. package/dist/indexer/update.d.ts.map +1 -0
  62. package/dist/indexer/update.js +40 -0
  63. package/dist/indexer/update.js.map +1 -0
  64. package/dist/indexer/watch.d.ts +21 -0
  65. package/dist/indexer/watch.d.ts.map +1 -0
  66. package/dist/indexer/watch.js +204 -0
  67. package/dist/indexer/watch.js.map +1 -0
  68. package/dist/languages/rules.d.ts +11 -0
  69. package/dist/languages/rules.d.ts.map +1 -0
  70. package/dist/languages/rules.js +371 -0
  71. package/dist/languages/rules.js.map +1 -0
  72. package/dist/languages/tree-sitter-loader.d.ts +27 -0
  73. package/dist/languages/tree-sitter-loader.d.ts.map +1 -0
  74. package/dist/languages/tree-sitter-loader.js +75 -0
  75. package/dist/languages/tree-sitter-loader.js.map +1 -0
  76. package/dist/mcp/tools/use-context-pack.d.ts +57 -0
  77. package/dist/mcp/tools/use-context-pack.d.ts.map +1 -0
  78. package/dist/mcp/tools/use-context-pack.js +91 -0
  79. package/dist/mcp/tools/use-context-pack.js.map +1 -0
  80. package/dist/mcp-server.d.ts +3 -0
  81. package/dist/mcp-server.d.ts.map +1 -0
  82. package/dist/mcp-server.js +363 -0
  83. package/dist/mcp-server.js.map +1 -0
  84. package/dist/providers/base.d.ts +34 -0
  85. package/dist/providers/base.d.ts.map +1 -0
  86. package/dist/providers/base.js +160 -0
  87. package/dist/providers/base.js.map +1 -0
  88. package/dist/providers/index.d.ts +6 -0
  89. package/dist/providers/index.d.ts.map +1 -0
  90. package/dist/providers/index.js +22 -0
  91. package/dist/providers/index.js.map +1 -0
  92. package/dist/providers/ollama.d.ts +13 -0
  93. package/dist/providers/ollama.d.ts.map +1 -0
  94. package/dist/providers/ollama.js +50 -0
  95. package/dist/providers/ollama.js.map +1 -0
  96. package/dist/providers/openai.d.ts +13 -0
  97. package/dist/providers/openai.d.ts.map +1 -0
  98. package/dist/providers/openai.js +59 -0
  99. package/dist/providers/openai.js.map +1 -0
  100. package/dist/providers/token-counter.d.ts +2 -0
  101. package/dist/providers/token-counter.d.ts.map +1 -0
  102. package/dist/providers/token-counter.js +18 -0
  103. package/dist/providers/token-counter.js.map +1 -0
  104. package/dist/ranking/api-reranker.d.ts +18 -0
  105. package/dist/ranking/api-reranker.d.ts.map +1 -0
  106. package/dist/ranking/api-reranker.js +148 -0
  107. package/dist/ranking/api-reranker.js.map +1 -0
  108. package/dist/ranking/symbol-boost.d.ts +15 -0
  109. package/dist/ranking/symbol-boost.d.ts.map +1 -0
  110. package/dist/ranking/symbol-boost.js +154 -0
  111. package/dist/ranking/symbol-boost.js.map +1 -0
  112. package/dist/search/bm25.d.ts +17 -0
  113. package/dist/search/bm25.d.ts.map +1 -0
  114. package/dist/search/bm25.js +56 -0
  115. package/dist/search/bm25.js.map +1 -0
  116. package/dist/search/hybrid.d.ts +21 -0
  117. package/dist/search/hybrid.d.ts.map +1 -0
  118. package/dist/search/hybrid.js +50 -0
  119. package/dist/search/hybrid.js.map +1 -0
  120. package/dist/search/scope.d.ts +5 -0
  121. package/dist/search/scope.d.ts.map +1 -0
  122. package/dist/search/scope.js +107 -0
  123. package/dist/search/scope.js.map +1 -0
  124. package/dist/storage/encrypted-chunks.d.ts +40 -0
  125. package/dist/storage/encrypted-chunks.d.ts.map +1 -0
  126. package/dist/storage/encrypted-chunks.js +236 -0
  127. package/dist/storage/encrypted-chunks.js.map +1 -0
  128. package/dist/symbols/extract.d.ts +15 -0
  129. package/dist/symbols/extract.d.ts.map +1 -0
  130. package/dist/symbols/extract.js +187 -0
  131. package/dist/symbols/extract.js.map +1 -0
  132. package/dist/symbols/graph.d.ts +3 -0
  133. package/dist/symbols/graph.d.ts.map +1 -0
  134. package/dist/symbols/graph.js +89 -0
  135. package/dist/symbols/graph.js.map +1 -0
  136. package/dist/types/ast.d.ts +3 -0
  137. package/dist/types/ast.d.ts.map +1 -0
  138. package/dist/types/ast.js +2 -0
  139. package/dist/types/ast.js.map +1 -0
  140. package/dist/types/codemap.d.ts +58 -0
  141. package/dist/types/codemap.d.ts.map +1 -0
  142. package/dist/types/codemap.js +224 -0
  143. package/dist/types/codemap.js.map +1 -0
  144. package/dist/types/context-pack.d.ts +47 -0
  145. package/dist/types/context-pack.d.ts.map +1 -0
  146. package/dist/types/context-pack.js +44 -0
  147. package/dist/types/context-pack.js.map +1 -0
  148. package/dist/types/search.d.ts +15 -0
  149. package/dist/types/search.d.ts.map +1 -0
  150. package/dist/types/search.js +11 -0
  151. package/dist/types/search.js.map +1 -0
  152. package/dist/utils/rate-limiter.d.ts +31 -0
  153. package/dist/utils/rate-limiter.d.ts.map +1 -0
  154. package/dist/utils/rate-limiter.js +168 -0
  155. package/dist/utils/rate-limiter.js.map +1 -0
  156. package/package.json +92 -0
@@ -0,0 +1,610 @@
1
+ import crypto from 'crypto';
2
+ import fg from 'fast-glob';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import Parser from 'tree-sitter';
6
+ import { createEmbeddingProvider, getModelProfile, getSizeLimits } from '../providers/index.js';
7
+ import { analyzeNodeForChunking, batchAnalyzeNodes, yieldStatementChunks } from '../chunking/semantic-chunker.js';
8
+ import { groupNodesForChunking, createCombinedChunk } from '../chunking/file-grouper.js';
9
+ import { getTokenCountStats } from '../chunking/token-counter.js';
10
+ import { readCodemap, writeCodemap } from '../codemap/io.js';
11
+ import { normalizeChunkMetadata } from '../types/codemap.js';
12
+ import { LANG_RULES, getSupportedLanguageExtensions } from '../languages/rules.js';
13
+ import { cloneMerkle, computeFastHash, loadMerkle, normalizeToProjectPath, removeMerkleEntry, saveMerkle } from '../indexer/merkle.js';
14
+ import { extractSymbolMetadata } from '../symbols/extract.js';
15
+ import { attachSymbolGraphToCodemap } from '../symbols/graph.js';
16
+ import { resolveEncryptionPreference, writeChunkToDisk, removeChunkArtifacts } from '../storage/encrypted-chunks.js';
17
+ import { extractSymbolName } from './symbol-extractor.js';
18
+ import { extractCodevaultMetadata, extractSemanticTags, extractImportantVariables, extractDocComments, generateEnhancedEmbeddingText } from './metadata.js';
19
+ import { Database, initDatabase } from '../database/db.js';
20
+ export async function indexProject({ repoPath = '.', provider = 'auto', onProgress = null, changedFiles = null, deletedFiles = [], embeddingProviderOverride = null, encryptMode = undefined } = {}) {
21
+ const repo = path.resolve(repoPath);
22
+ if (!fs.existsSync(repo)) {
23
+ throw new Error(`Directory ${repo} does not exist`);
24
+ }
25
+ const normalizedChanged = Array.isArray(changedFiles)
26
+ ? Array.from(new Set(changedFiles
27
+ .map(file => normalizeToProjectPath(repo, file))
28
+ .filter(Boolean)))
29
+ : null;
30
+ const normalizedDeleted = Array.from(new Set((Array.isArray(deletedFiles) ? deletedFiles : [])
31
+ .map(file => normalizeToProjectPath(repo, file))
32
+ .filter(Boolean)));
33
+ const deletedSet = new Set(normalizedDeleted);
34
+ const languagePatterns = getSupportedLanguageExtensions().map(ext => `**/*${ext}`);
35
+ let files = [];
36
+ if (normalizedChanged === null) {
37
+ files = await fg(languagePatterns, {
38
+ cwd: repo,
39
+ absolute: false,
40
+ followSymbolicLinks: false,
41
+ ignore: [
42
+ '**/vendor/**',
43
+ '**/node_modules/**',
44
+ '**/.git/**',
45
+ '**/storage/**',
46
+ '**/dist/**',
47
+ '**/build/**',
48
+ '**/tmp/**',
49
+ '**/temp/**',
50
+ '**/.npm/**',
51
+ '**/.yarn/**',
52
+ '**/Library/**',
53
+ '**/System/**',
54
+ '**/.Trash/**',
55
+ '**/.codevault/**',
56
+ '**/codevault.codemap.json',
57
+ '**/codevault.codemap.json.backup-*',
58
+ '**/package-lock.json',
59
+ '**/yarn.lock',
60
+ '**/pnpm-lock.yaml',
61
+ '**/*.json',
62
+ '**/*.sh',
63
+ '**/examples/**',
64
+ '**/assets/**'
65
+ ],
66
+ onlyFiles: true,
67
+ dot: false
68
+ });
69
+ }
70
+ else {
71
+ files = normalizedChanged.filter(rel => {
72
+ const ext = path.extname(rel).toLowerCase();
73
+ return !!LANG_RULES[ext];
74
+ });
75
+ }
76
+ const uniqueFiles = [];
77
+ const seenFiles = new Set();
78
+ for (const rel of files) {
79
+ if (!rel || seenFiles.has(rel)) {
80
+ continue;
81
+ }
82
+ const absPath = path.join(repo, rel);
83
+ if (!fs.existsSync(absPath)) {
84
+ deletedSet.add(rel);
85
+ continue;
86
+ }
87
+ seenFiles.add(rel);
88
+ uniqueFiles.push(rel);
89
+ }
90
+ files = uniqueFiles;
91
+ const isPartialUpdate = normalizedChanged !== null;
92
+ const embeddingProvider = embeddingProviderOverride || createEmbeddingProvider(provider);
93
+ if (!embeddingProviderOverride && embeddingProvider.init) {
94
+ await embeddingProvider.init();
95
+ }
96
+ const providerName = embeddingProvider.getName();
97
+ const modelName = embeddingProvider.getModelName ? embeddingProvider.getModelName() : null;
98
+ const modelProfile = await getModelProfile(providerName, modelName || providerName);
99
+ const limits = getSizeLimits(modelProfile);
100
+ console.log(`\n📊 Chunking Configuration:`);
101
+ console.log(` Provider: ${providerName}`);
102
+ if (modelName)
103
+ console.log(` Model: ${modelName}`);
104
+ console.log(` Dimensions: ${embeddingProvider.getDimensions()}`);
105
+ console.log(` Chunking mode: ${limits.unit}`);
106
+ console.log(` Optimal size: ${limits.optimal} ${limits.unit}`);
107
+ console.log(` Min/Max: ${limits.min}-${limits.max} ${limits.unit}`);
108
+ console.log(` Overlap: ${limits.overlap} ${limits.unit}`);
109
+ if (modelProfile.useTokens && modelProfile.tokenCounter) {
110
+ console.log(` ✓ Token counting enabled`);
111
+ }
112
+ else {
113
+ console.log(` ℹ Using character estimation (token counting unavailable)`);
114
+ }
115
+ if (embeddingProvider.rateLimiter) {
116
+ const rateLimiterStats = embeddingProvider.rateLimiter.getStats();
117
+ if (rateLimiterStats.isLimited) {
118
+ console.log(` 🔒 Rate limiting: ${rateLimiterStats.rpm} requests/minute`);
119
+ }
120
+ else {
121
+ console.log(` ⚡ Rate limiting: disabled (local model)`);
122
+ }
123
+ }
124
+ console.log('');
125
+ await initDatabase(embeddingProvider.getDimensions(), repo);
126
+ const codemapPath = path.join(repo, 'codevault.codemap.json');
127
+ const chunkDir = path.join(repo, '.codevault/chunks');
128
+ const dbPath = path.join(repo, '.codevault/codevault.db');
129
+ if (fs.existsSync(dbPath)) {
130
+ const db = new Database(dbPath);
131
+ try {
132
+ const existingDimensions = await db.getExistingDimensions();
133
+ if (existingDimensions.length > 0) {
134
+ const currentProvider = embeddingProvider.getName();
135
+ const currentDimensions = embeddingProvider.getDimensions();
136
+ const hasMismatch = existingDimensions.some(row => row.embedding_provider !== currentProvider ||
137
+ row.embedding_dimensions !== currentDimensions);
138
+ if (hasMismatch) {
139
+ console.log('\n⚠️ WARNING: Dimension/Provider Mismatch Detected!');
140
+ console.log('='.repeat(60));
141
+ console.log('Existing index:');
142
+ existingDimensions.forEach(row => {
143
+ console.log(` ${row.embedding_provider} (${row.embedding_dimensions}D)`);
144
+ });
145
+ console.log(`Current config: ${currentProvider} (${currentDimensions}D)`);
146
+ console.log('\nRecommendation: Full re-index for consistent results');
147
+ console.log('='.repeat(60) + '\n');
148
+ await new Promise(resolve => setTimeout(resolve, 2000));
149
+ }
150
+ }
151
+ }
152
+ catch (error) {
153
+ // Ignore migration check errors
154
+ }
155
+ finally {
156
+ db.close();
157
+ }
158
+ }
159
+ const encryptionPreference = resolveEncryptionPreference({ mode: encryptMode, logger: console });
160
+ let codemap = readCodemap(codemapPath);
161
+ const merkle = loadMerkle(repo);
162
+ const updatedMerkle = cloneMerkle(merkle);
163
+ let merkleDirty = false;
164
+ let indexMutated = false;
165
+ const parser = new Parser();
166
+ let processedChunks = 0;
167
+ const errors = [];
168
+ const chunkingStats = {
169
+ totalNodes: 0,
170
+ skippedSmall: 0,
171
+ subdivided: 0,
172
+ statementFallback: 0,
173
+ normalChunks: 0,
174
+ mergedSmall: 0
175
+ };
176
+ const db = new Database(dbPath);
177
+ async function deleteChunks(chunkIds, metadataLookup = new Map()) {
178
+ if (!Array.isArray(chunkIds) || chunkIds.length === 0) {
179
+ return;
180
+ }
181
+ await db.deleteChunks(chunkIds);
182
+ for (const chunkId of chunkIds) {
183
+ const metadata = metadataLookup.get(chunkId) || codemap[chunkId];
184
+ if (metadata && metadata.sha) {
185
+ removeChunkArtifacts(chunkDir, metadata.sha);
186
+ }
187
+ delete codemap[chunkId];
188
+ }
189
+ }
190
+ async function embedAndStore(params) {
191
+ try {
192
+ const embedding = await embeddingProvider.generateEmbedding(params.enhancedEmbeddingText);
193
+ await db.insertChunk({
194
+ id: params.chunkId,
195
+ file_path: params.rel,
196
+ symbol: params.symbol,
197
+ sha: params.sha,
198
+ lang: params.lang,
199
+ chunk_type: params.chunkType,
200
+ embedding,
201
+ embedding_provider: embeddingProvider.getName(),
202
+ embedding_dimensions: embeddingProvider.getDimensions(),
203
+ codevault_tags: params.codevaultMetadata.tags,
204
+ codevault_intent: params.codevaultMetadata.intent,
205
+ codevault_description: params.codevaultMetadata.description,
206
+ doc_comments: params.docComments,
207
+ variables_used: params.importantVariables,
208
+ context_info: params.contextInfo
209
+ });
210
+ indexMutated = true;
211
+ fs.mkdirSync(chunkDir, { recursive: true });
212
+ const writeResult = writeChunkToDisk({
213
+ chunkDir,
214
+ sha: params.sha,
215
+ code: params.code,
216
+ encryption: encryptionPreference
217
+ });
218
+ const previousMetadata = codemap[params.chunkId];
219
+ codemap[params.chunkId] = normalizeChunkMetadata({
220
+ file: params.rel,
221
+ symbol: params.symbol,
222
+ sha: params.sha,
223
+ lang: params.lang,
224
+ chunkType: params.chunkType,
225
+ provider: embeddingProvider.getName(),
226
+ dimensions: embeddingProvider.getDimensions(),
227
+ hasCodevaultTags: Array.isArray(params.codevaultMetadata.tags) && params.codevaultMetadata.tags.length > 0,
228
+ hasIntent: !!params.codevaultMetadata.intent,
229
+ hasDocumentation: !!params.docComments,
230
+ variableCount: Array.isArray(params.importantVariables) ? params.importantVariables.length : 0,
231
+ encrypted: !!(writeResult && writeResult.encrypted),
232
+ symbol_signature: params.symbolData && params.symbolData.signature ? params.symbolData.signature : undefined,
233
+ symbol_parameters: params.symbolData && Array.isArray(params.symbolData.parameters) ? params.symbolData.parameters : undefined,
234
+ symbol_return: params.symbolData && params.symbolData.returnType ? params.symbolData.returnType : undefined,
235
+ symbol_calls: params.symbolData && Array.isArray(params.symbolData.calls) ? params.symbolData.calls : undefined
236
+ }, previousMetadata);
237
+ }
238
+ catch (error) {
239
+ errors.push({ type: 'indexing_error', chunkId: params.chunkId, error: error.message });
240
+ throw error;
241
+ }
242
+ }
243
+ async function removeFileArtifacts(fileRel) {
244
+ const entries = Object.entries(codemap)
245
+ .filter(([, metadata]) => metadata && metadata.file === fileRel);
246
+ if (entries.length > 0) {
247
+ const metadataLookup = new Map(entries);
248
+ await deleteChunks(entries.map(([chunkId]) => chunkId), metadataLookup);
249
+ indexMutated = true;
250
+ }
251
+ if (removeMerkleEntry(updatedMerkle, fileRel)) {
252
+ merkleDirty = true;
253
+ }
254
+ }
255
+ for (const rel of files) {
256
+ deletedSet.delete(rel);
257
+ const abs = path.join(repo, rel);
258
+ const ext = path.extname(rel).toLowerCase();
259
+ const rule = LANG_RULES[ext];
260
+ if (!rule)
261
+ continue;
262
+ const existingChunks = new Map(Object.entries(codemap)
263
+ .filter(([, metadata]) => metadata && metadata.file === rel));
264
+ const staleChunkIds = new Set(existingChunks.keys());
265
+ const chunkMerkleHashes = [];
266
+ let fileHash = null;
267
+ try {
268
+ const source = fs.readFileSync(abs, 'utf8');
269
+ fileHash = await computeFastHash(source);
270
+ const previousMerkle = merkle[rel];
271
+ if (previousMerkle && previousMerkle.shaFile === fileHash) {
272
+ continue;
273
+ }
274
+ const SIZE_THRESHOLD = 30000;
275
+ const CHUNK_SIZE = 30000;
276
+ let tree;
277
+ try {
278
+ parser.setLanguage(rule.ts);
279
+ if (source.length > SIZE_THRESHOLD) {
280
+ tree = parser.parse((index) => {
281
+ if (index < source.length) {
282
+ return source.slice(index, Math.min(index + CHUNK_SIZE, source.length));
283
+ }
284
+ return null;
285
+ });
286
+ }
287
+ else {
288
+ tree = parser.parse(source);
289
+ }
290
+ if (!tree || !tree.rootNode) {
291
+ throw new Error('Failed to create syntax tree');
292
+ }
293
+ }
294
+ catch (parseError) {
295
+ throw parseError;
296
+ }
297
+ const collectedNodes = [];
298
+ function collectNodes(node) {
299
+ if (node.type === 'export_statement') {
300
+ let hasDeclaration = false;
301
+ for (let i = 0; i < node.childCount; i++) {
302
+ const child = node.child(i);
303
+ if (child && ['function_declaration', 'class_declaration', 'method_definition'].includes(child.type)) {
304
+ hasDeclaration = true;
305
+ break;
306
+ }
307
+ }
308
+ if (!hasDeclaration && rule.nodeTypes.includes(node.type)) {
309
+ collectedNodes.push(node);
310
+ return;
311
+ }
312
+ if (hasDeclaration) {
313
+ for (let i = 0; i < node.childCount; i++) {
314
+ const child = node.child(i);
315
+ if (child) {
316
+ collectNodes(child);
317
+ }
318
+ }
319
+ return;
320
+ }
321
+ }
322
+ if (rule.nodeTypes.includes(node.type)) {
323
+ collectedNodes.push(node);
324
+ }
325
+ for (let i = 0; i < node.childCount; i++) {
326
+ const child = node.child(i);
327
+ if (child) {
328
+ collectNodes(child);
329
+ }
330
+ }
331
+ }
332
+ collectNodes(tree.rootNode);
333
+ const nodeGroups = await groupNodesForChunking(collectedNodes, source, modelProfile, rule);
334
+ const processedNodes = new Set();
335
+ async function processNodeGroup(nodeGroup) {
336
+ if (nodeGroup.nodes.length === 1) {
337
+ await yieldChunk(nodeGroup.nodes[0]);
338
+ return;
339
+ }
340
+ const combinedChunk = createCombinedChunk(nodeGroup, source, rel);
341
+ if (combinedChunk) {
342
+ chunkingStats.totalNodes += nodeGroup.nodes.length;
343
+ chunkingStats.fileGrouped = (chunkingStats.fileGrouped || 0) + 1;
344
+ chunkingStats.functionsGrouped = (chunkingStats.functionsGrouped || 0) + nodeGroup.nodes.length;
345
+ await processChunk(combinedChunk.node, combinedChunk.code, `group_${nodeGroup.nodes.length}funcs`, null);
346
+ }
347
+ }
348
+ async function yieldChunk(node, parentNode = null) {
349
+ chunkingStats.totalNodes++;
350
+ const analysis = await analyzeNodeForChunking(node, source, rule, modelProfile);
351
+ if (analysis.size < limits.min && parentNode !== null) {
352
+ chunkingStats.skippedSmall++;
353
+ return;
354
+ }
355
+ if (analysis.needsSubdivision && analysis.subdivisionCandidates.length > 0) {
356
+ chunkingStats.subdivided++;
357
+ const subAnalyses = await batchAnalyzeNodes(analysis.subdivisionCandidates, source, rule, modelProfile, true);
358
+ const smallChunks = [];
359
+ for (let i = 0; i < subAnalyses.length; i++) {
360
+ const subAnalysis = subAnalyses[i];
361
+ const subNode = subAnalysis.node;
362
+ if (subAnalysis.size < limits.min) {
363
+ const subCode = source.slice(subNode.startIndex, subNode.endIndex);
364
+ smallChunks.push({
365
+ node: subNode,
366
+ code: subCode,
367
+ size: subAnalysis.size
368
+ });
369
+ if (subNode.id !== undefined) {
370
+ processedNodes.add(subNode.id);
371
+ }
372
+ }
373
+ else {
374
+ if (subNode.id !== undefined) {
375
+ processedNodes.add(subNode.id);
376
+ }
377
+ await yieldChunk(subNode, node);
378
+ }
379
+ }
380
+ if (smallChunks.length > 0) {
381
+ const totalSmallSize = smallChunks.reduce((sum, c) => sum + c.size, 0);
382
+ if (totalSmallSize >= limits.min || smallChunks.length >= 3) {
383
+ const mergedCode = smallChunks.map((c) => c.code).join('\n\n');
384
+ const mergedNode = {
385
+ ...node,
386
+ type: `${node.type}_merged`,
387
+ startIndex: smallChunks[0].node.startIndex,
388
+ endIndex: smallChunks[smallChunks.length - 1].node.endIndex
389
+ };
390
+ const suffix = `small_methods_${smallChunks.length}`;
391
+ chunkingStats.mergedSmall++;
392
+ await processChunk(mergedNode, mergedCode, suffix, parentNode);
393
+ }
394
+ else {
395
+ chunkingStats.skippedSmall += smallChunks.length;
396
+ }
397
+ }
398
+ return;
399
+ }
400
+ else if (analysis.size > limits.max) {
401
+ chunkingStats.statementFallback++;
402
+ const code = source.slice(node.startIndex, node.endIndex);
403
+ const statementChunks = await yieldStatementChunks(node, source, limits.max, limits.overlap, modelProfile);
404
+ for (let i = 0; i < statementChunks.length; i++) {
405
+ const stmtChunk = statementChunks[i];
406
+ await processChunk(node, stmtChunk.code, `${i + 1}`, parentNode);
407
+ }
408
+ return;
409
+ }
410
+ chunkingStats.normalChunks++;
411
+ const code = source.slice(node.startIndex, node.endIndex);
412
+ await processChunk(node, code, null, parentNode);
413
+ }
414
+ async function processChunk(node, code, suffix = null, parentNode = null) {
415
+ let symbol = extractSymbolName(node, source);
416
+ if (!symbol)
417
+ return;
418
+ if (suffix) {
419
+ symbol = `${symbol}_part${suffix}`;
420
+ }
421
+ const docComments = extractDocComments(source, node, rule);
422
+ const codevaultMetadata = extractCodevaultMetadata(docComments);
423
+ const automaticTags = extractSemanticTags(rel, symbol, code);
424
+ const allTags = [...new Set([...codevaultMetadata.tags, ...automaticTags])];
425
+ codevaultMetadata.tags = allTags;
426
+ const importantVariables = extractImportantVariables(node, source, rule);
427
+ const symbolData = extractSymbolMetadata({ node, source, symbol });
428
+ const enhancedEmbeddingText = generateEnhancedEmbeddingText(code, codevaultMetadata, importantVariables, docComments);
429
+ const chunkType = node.type.includes('class') ? 'class' :
430
+ node.type.includes('method') ? 'method' : 'function';
431
+ const contextInfo = {
432
+ nodeType: node.type,
433
+ startLine: source.slice(0, node.startIndex).split('\n').length,
434
+ endLine: source.slice(0, node.endIndex).split('\n').length,
435
+ codeLength: code.length,
436
+ hasDocumentation: !!docComments,
437
+ variableCount: importantVariables.length,
438
+ isSubdivision: !!suffix,
439
+ hasParentContext: !!parentNode
440
+ };
441
+ const sha = crypto.createHash('sha1').update(code).digest('hex');
442
+ const chunkId = `${rel}:${symbol}:${sha.substring(0, 8)}`;
443
+ const chunkMerkleHash = await computeFastHash(code);
444
+ if (codemap[chunkId]?.sha === sha) {
445
+ staleChunkIds.delete(chunkId);
446
+ chunkMerkleHashes.push(chunkMerkleHash);
447
+ return;
448
+ }
449
+ await embedAndStore({
450
+ code,
451
+ enhancedEmbeddingText,
452
+ chunkId,
453
+ sha,
454
+ lang: rule.lang,
455
+ rel,
456
+ symbol,
457
+ chunkType,
458
+ codevaultMetadata,
459
+ importantVariables,
460
+ docComments,
461
+ contextInfo,
462
+ symbolData
463
+ });
464
+ staleChunkIds.delete(chunkId);
465
+ chunkMerkleHashes.push(chunkMerkleHash);
466
+ processedChunks++;
467
+ if (onProgress) {
468
+ onProgress({ type: 'chunk_processed', file: rel, symbol, chunkId });
469
+ }
470
+ }
471
+ for (const nodeGroup of nodeGroups) {
472
+ await processNodeGroup(nodeGroup);
473
+ }
474
+ if (staleChunkIds.size > 0) {
475
+ await deleteChunks(Array.from(staleChunkIds), existingChunks);
476
+ indexMutated = true;
477
+ }
478
+ if (fileHash) {
479
+ updatedMerkle[rel] = {
480
+ shaFile: fileHash,
481
+ chunkShas: chunkMerkleHashes
482
+ };
483
+ merkleDirty = true;
484
+ }
485
+ }
486
+ catch (error) {
487
+ errors.push({ type: 'processing_error', file: rel, error: error.message });
488
+ try {
489
+ const abs = path.join(repo, rel);
490
+ if (!fs.existsSync(abs)) {
491
+ continue;
492
+ }
493
+ const source = fs.readFileSync(abs, 'utf8');
494
+ const fallbackSymbol = path.basename(rel) || rel;
495
+ const sha = crypto.createHash('sha1').update(source).digest('hex');
496
+ const chunkId = `${rel}:fallback:${sha.substring(0, 8)}`;
497
+ const chunkMerkleHash = await computeFastHash(source);
498
+ const fallbackMetadata = { tags: [], intent: null, description: null };
499
+ const contextInfo = {
500
+ nodeType: 'file',
501
+ startLine: 1,
502
+ endLine: source.split('\n').length,
503
+ codeLength: source.length,
504
+ hasDocumentation: false,
505
+ variableCount: 0
506
+ };
507
+ await embedAndStore({
508
+ code: source,
509
+ enhancedEmbeddingText: source,
510
+ chunkId,
511
+ sha,
512
+ lang: rule.lang,
513
+ rel,
514
+ symbol: fallbackSymbol,
515
+ chunkType: 'file',
516
+ codevaultMetadata: fallbackMetadata,
517
+ importantVariables: [],
518
+ docComments: null,
519
+ contextInfo,
520
+ symbolData: {
521
+ signature: `${fallbackSymbol}()`,
522
+ parameters: [],
523
+ returnType: null,
524
+ calls: []
525
+ }
526
+ });
527
+ processedChunks++;
528
+ indexMutated = true;
529
+ if (onProgress) {
530
+ onProgress({ type: 'chunk_processed', file: rel, symbol: fallbackSymbol, chunkId });
531
+ }
532
+ staleChunkIds.delete(chunkId);
533
+ if (staleChunkIds.size > 0) {
534
+ await deleteChunks(Array.from(staleChunkIds), existingChunks);
535
+ indexMutated = true;
536
+ }
537
+ chunkMerkleHashes.length = 0;
538
+ chunkMerkleHashes.push(chunkMerkleHash);
539
+ fileHash = chunkMerkleHash;
540
+ updatedMerkle[rel] = {
541
+ shaFile: chunkMerkleHash,
542
+ chunkShas: [...chunkMerkleHashes]
543
+ };
544
+ merkleDirty = true;
545
+ }
546
+ catch (fallbackError) {
547
+ errors.push({ type: 'fallback_error', file: rel, error: fallbackError.message });
548
+ }
549
+ }
550
+ }
551
+ for (const fileRel of deletedSet) {
552
+ await removeFileArtifacts(fileRel);
553
+ }
554
+ if (!isPartialUpdate) {
555
+ const existingFilesSet = new Set(files);
556
+ for (const fileRel of Object.keys(merkle)) {
557
+ if (!existingFilesSet.has(fileRel)) {
558
+ await removeFileArtifacts(fileRel);
559
+ }
560
+ }
561
+ }
562
+ if (merkleDirty) {
563
+ saveMerkle(repo, updatedMerkle);
564
+ }
565
+ db.close();
566
+ attachSymbolGraphToCodemap(codemap);
567
+ codemap = writeCodemap(codemapPath, codemap);
568
+ const tokenStats = getTokenCountStats();
569
+ if (chunkingStats.totalNodes > 0) {
570
+ console.log(`\n📈 Chunking Statistics:`);
571
+ console.log(` Total AST nodes analyzed: ${chunkingStats.totalNodes}`);
572
+ if (chunkingStats.fileGrouped && chunkingStats.functionsGrouped) {
573
+ console.log(` 🎯 File-grouped chunks: ${chunkingStats.fileGrouped} (${chunkingStats.functionsGrouped} functions combined)`);
574
+ }
575
+ console.log(` Normal chunks (optimal size): ${chunkingStats.normalChunks || 0}`);
576
+ console.log(` Subdivided (too large): ${chunkingStats.subdivided || 0}`);
577
+ console.log(` Merged small chunks: ${chunkingStats.mergedSmall || 0}`);
578
+ console.log(` Statement-level fallback: ${chunkingStats.statementFallback || 0}`);
579
+ console.log(` Skipped (too small): ${chunkingStats.skippedSmall || 0}`);
580
+ console.log(` Final chunk count: ${processedChunks}`);
581
+ const reductionRatio = chunkingStats.totalNodes > 0
582
+ ? ((1 - processedChunks / chunkingStats.totalNodes) * 100).toFixed(1)
583
+ : 0;
584
+ console.log(` Chunk reduction: ${reductionRatio}% fewer chunks vs naive approach`);
585
+ console.log('');
586
+ }
587
+ if (modelProfile.useTokens && tokenStats.totalRequests > 0) {
588
+ console.log(`⚡ Token Counting Performance:`);
589
+ console.log(` Total size checks: ${tokenStats.totalRequests}`);
590
+ console.log(` Character pre-filter: ${tokenStats.charFilterRate} (${tokenStats.charFilterSkips} skipped)`);
591
+ console.log(` Cache hits: ${tokenStats.cacheHitRate} (${tokenStats.cacheHits} cached)`);
592
+ console.log(` Actual tokenizations: ${tokenStats.actualTokenizations}`);
593
+ console.log(` Batch operations: ${tokenStats.batchTokenizations}`);
594
+ const efficiency = tokenStats.totalRequests > 0
595
+ ? (((tokenStats.charFilterSkips + tokenStats.cacheHits) / tokenStats.totalRequests) * 100).toFixed(1)
596
+ : 0;
597
+ console.log(` Overall efficiency: ${efficiency}% avoided expensive tokenization`);
598
+ console.log('');
599
+ }
600
+ return {
601
+ success: true,
602
+ processedChunks,
603
+ totalChunks: Object.keys(codemap).length,
604
+ provider: embeddingProvider.getName(),
605
+ errors,
606
+ chunkingStats,
607
+ tokenStats: modelProfile.useTokens ? tokenStats : undefined
608
+ };
609
+ }
610
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/core/indexer.ts"],"names":[],"mappings":"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"}