codevault 1.6.0 → 1.7.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 (301) hide show
  1. package/dist/chunking/file-grouper.d.ts +39 -0
  2. package/dist/chunking/file-grouper.d.ts.map +1 -0
  3. package/dist/chunking/file-grouper.js +164 -0
  4. package/dist/chunking/file-grouper.js.map +1 -0
  5. package/dist/chunking/semantic-chunker.d.ts +37 -0
  6. package/dist/chunking/semantic-chunker.d.ts.map +1 -0
  7. package/dist/chunking/semantic-chunker.js +157 -0
  8. package/dist/chunking/semantic-chunker.js.map +1 -0
  9. package/dist/chunking/token-counter.d.ts +28 -0
  10. package/dist/chunking/token-counter.d.ts.map +1 -0
  11. package/dist/chunking/token-counter.js +178 -0
  12. package/dist/chunking/token-counter.js.map +1 -0
  13. package/dist/cli/commands/ask-cmd.d.ts +3 -0
  14. package/dist/cli/commands/ask-cmd.d.ts.map +1 -0
  15. package/dist/cli/commands/ask-cmd.js +130 -0
  16. package/dist/cli/commands/ask-cmd.js.map +1 -0
  17. package/dist/cli/commands/chat-cmd.d.ts +3 -0
  18. package/dist/cli/commands/chat-cmd.d.ts.map +1 -0
  19. package/dist/cli/commands/chat-cmd.js +194 -0
  20. package/dist/cli/commands/chat-cmd.js.map +1 -0
  21. package/dist/cli/commands/config-cmd.d.ts +3 -0
  22. package/dist/cli/commands/config-cmd.d.ts.map +1 -0
  23. package/dist/cli/commands/config-cmd.js +245 -0
  24. package/dist/cli/commands/config-cmd.js.map +1 -0
  25. package/dist/cli/commands/context.d.ts +3 -0
  26. package/dist/cli/commands/context.d.ts.map +1 -0
  27. package/dist/cli/commands/context.js +98 -0
  28. package/dist/cli/commands/context.js.map +1 -0
  29. package/dist/cli/commands/interactive-config.d.ts +2 -0
  30. package/dist/cli/commands/interactive-config.d.ts.map +1 -0
  31. package/dist/cli/commands/interactive-config.js +274 -0
  32. package/dist/cli/commands/interactive-config.js.map +1 -0
  33. package/dist/cli.d.ts +3 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +401 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/codemap/io.d.ts +6 -0
  38. package/dist/codemap/io.d.ts.map +1 -0
  39. package/dist/codemap/io.js +46 -0
  40. package/dist/codemap/io.js.map +1 -0
  41. package/dist/config/apply-env.d.ts +23 -0
  42. package/dist/config/apply-env.d.ts.map +1 -0
  43. package/dist/config/apply-env.js +89 -0
  44. package/dist/config/apply-env.js.map +1 -0
  45. package/dist/config/constants.d.ts +326 -0
  46. package/dist/config/constants.d.ts.map +1 -0
  47. package/dist/config/constants.js +214 -0
  48. package/dist/config/constants.js.map +1 -0
  49. package/dist/config/loader.d.ts +57 -0
  50. package/dist/config/loader.d.ts.map +1 -0
  51. package/dist/config/loader.js +287 -0
  52. package/dist/config/loader.js.map +1 -0
  53. package/dist/config/resolver.d.ts +30 -0
  54. package/dist/config/resolver.d.ts.map +1 -0
  55. package/dist/config/resolver.js +29 -0
  56. package/dist/config/resolver.js.map +1 -0
  57. package/dist/config/types.d.ts +46 -0
  58. package/dist/config/types.d.ts.map +1 -0
  59. package/dist/config/types.js +2 -0
  60. package/dist/config/types.js.map +1 -0
  61. package/dist/context/packs.d.ts +33 -0
  62. package/dist/context/packs.d.ts.map +1 -0
  63. package/dist/context/packs.js +180 -0
  64. package/dist/context/packs.js.map +1 -0
  65. package/dist/core/IndexerEngine.d.ts +24 -0
  66. package/dist/core/IndexerEngine.d.ts.map +1 -0
  67. package/dist/core/IndexerEngine.js +372 -0
  68. package/dist/core/IndexerEngine.js.map +1 -0
  69. package/dist/core/SearchService.d.ts +25 -0
  70. package/dist/core/SearchService.d.ts.map +1 -0
  71. package/dist/core/SearchService.js +455 -0
  72. package/dist/core/SearchService.js.map +1 -0
  73. package/dist/core/batch-indexer.d.ts +56 -0
  74. package/dist/core/batch-indexer.d.ts.map +1 -0
  75. package/dist/core/batch-indexer.js +192 -0
  76. package/dist/core/batch-indexer.js.map +1 -0
  77. package/dist/core/indexer.d.ts +3 -0
  78. package/dist/core/indexer.d.ts.map +1 -0
  79. package/dist/core/indexer.js +6 -0
  80. package/dist/core/indexer.js.map +1 -0
  81. package/dist/core/indexing/chunk-pipeline.d.ts +39 -0
  82. package/dist/core/indexing/chunk-pipeline.d.ts.map +1 -0
  83. package/dist/core/indexing/chunk-pipeline.js +210 -0
  84. package/dist/core/indexing/chunk-pipeline.js.map +1 -0
  85. package/dist/core/indexing/file-scanner.d.ts +11 -0
  86. package/dist/core/indexing/file-scanner.d.ts.map +1 -0
  87. package/dist/core/indexing/file-scanner.js +49 -0
  88. package/dist/core/indexing/file-scanner.js.map +1 -0
  89. package/dist/core/metadata.d.ts +19 -0
  90. package/dist/core/metadata.d.ts.map +1 -0
  91. package/dist/core/metadata.js +161 -0
  92. package/dist/core/metadata.js.map +1 -0
  93. package/dist/core/search.d.ts +7 -0
  94. package/dist/core/search.d.ts.map +1 -0
  95. package/dist/core/search.js +16 -0
  96. package/dist/core/search.js.map +1 -0
  97. package/dist/core/symbol-extractor.d.ts +3 -0
  98. package/dist/core/symbol-extractor.d.ts.map +1 -0
  99. package/dist/core/symbol-extractor.js +78 -0
  100. package/dist/core/symbol-extractor.js.map +1 -0
  101. package/dist/core/types.d.ts +104 -0
  102. package/dist/core/types.d.ts.map +1 -0
  103. package/dist/core/types.js +2 -0
  104. package/dist/core/types.js.map +1 -0
  105. package/dist/database/db.d.ts +101 -0
  106. package/dist/database/db.d.ts.map +1 -0
  107. package/dist/database/db.js +326 -0
  108. package/dist/database/db.js.map +1 -0
  109. package/dist/indexer/merkle.d.ts +13 -0
  110. package/dist/indexer/merkle.d.ts.map +1 -0
  111. package/dist/indexer/merkle.js +86 -0
  112. package/dist/indexer/merkle.js.map +1 -0
  113. package/dist/indexer/update.d.ts +19 -0
  114. package/dist/indexer/update.d.ts.map +1 -0
  115. package/dist/indexer/update.js +40 -0
  116. package/dist/indexer/update.js.map +1 -0
  117. package/dist/indexer/watch.d.ts +21 -0
  118. package/dist/indexer/watch.d.ts.map +1 -0
  119. package/dist/indexer/watch.js +224 -0
  120. package/dist/indexer/watch.js.map +1 -0
  121. package/dist/languages/rules.d.ts +11 -0
  122. package/dist/languages/rules.d.ts.map +1 -0
  123. package/dist/languages/rules.js +371 -0
  124. package/dist/languages/rules.js.map +1 -0
  125. package/dist/languages/tree-sitter-loader.d.ts +27 -0
  126. package/dist/languages/tree-sitter-loader.d.ts.map +1 -0
  127. package/dist/languages/tree-sitter-loader.js +76 -0
  128. package/dist/languages/tree-sitter-loader.js.map +1 -0
  129. package/dist/mcp/handlers/context.d.ts +15 -0
  130. package/dist/mcp/handlers/context.d.ts.map +1 -0
  131. package/dist/mcp/handlers/context.js +31 -0
  132. package/dist/mcp/handlers/context.js.map +1 -0
  133. package/dist/mcp/handlers/index.d.ts +5 -0
  134. package/dist/mcp/handlers/index.d.ts.map +1 -0
  135. package/dist/mcp/handlers/index.js +5 -0
  136. package/dist/mcp/handlers/index.js.map +1 -0
  137. package/dist/mcp/handlers/project.d.ts +41 -0
  138. package/dist/mcp/handlers/project.d.ts.map +1 -0
  139. package/dist/mcp/handlers/project.js +76 -0
  140. package/dist/mcp/handlers/project.js.map +1 -0
  141. package/dist/mcp/handlers/search.d.ts +27 -0
  142. package/dist/mcp/handlers/search.d.ts.map +1 -0
  143. package/dist/mcp/handlers/search.js +108 -0
  144. package/dist/mcp/handlers/search.js.map +1 -0
  145. package/dist/mcp/handlers/synthesis.d.ts +15 -0
  146. package/dist/mcp/handlers/synthesis.d.ts.map +1 -0
  147. package/dist/mcp/handlers/synthesis.js +58 -0
  148. package/dist/mcp/handlers/synthesis.js.map +1 -0
  149. package/dist/mcp/schemas.d.ts +166 -0
  150. package/dist/mcp/schemas.d.ts.map +1 -0
  151. package/dist/mcp/schemas.js +159 -0
  152. package/dist/mcp/schemas.js.map +1 -0
  153. package/dist/mcp/tools/ask-codebase.d.ts +85 -0
  154. package/dist/mcp/tools/ask-codebase.d.ts.map +1 -0
  155. package/dist/mcp/tools/ask-codebase.js +125 -0
  156. package/dist/mcp/tools/ask-codebase.js.map +1 -0
  157. package/dist/mcp/tools/use-context-pack.d.ts +57 -0
  158. package/dist/mcp/tools/use-context-pack.d.ts.map +1 -0
  159. package/dist/mcp/tools/use-context-pack.js +91 -0
  160. package/dist/mcp/tools/use-context-pack.js.map +1 -0
  161. package/dist/mcp-server.d.ts +13 -0
  162. package/dist/mcp-server.d.ts.map +1 -0
  163. package/dist/mcp-server.js +263 -0
  164. package/dist/mcp-server.js.map +1 -0
  165. package/dist/providers/base.d.ts +39 -0
  166. package/dist/providers/base.d.ts.map +1 -0
  167. package/dist/providers/base.js +198 -0
  168. package/dist/providers/base.js.map +1 -0
  169. package/dist/providers/chat-llm.d.ts +35 -0
  170. package/dist/providers/chat-llm.d.ts.map +1 -0
  171. package/dist/providers/chat-llm.js +98 -0
  172. package/dist/providers/chat-llm.js.map +1 -0
  173. package/dist/providers/index.d.ts +6 -0
  174. package/dist/providers/index.d.ts.map +1 -0
  175. package/dist/providers/index.js +12 -0
  176. package/dist/providers/index.js.map +1 -0
  177. package/dist/providers/openai.d.ts +18 -0
  178. package/dist/providers/openai.d.ts.map +1 -0
  179. package/dist/providers/openai.js +132 -0
  180. package/dist/providers/openai.js.map +1 -0
  181. package/dist/providers/token-counter.d.ts +2 -0
  182. package/dist/providers/token-counter.d.ts.map +1 -0
  183. package/dist/providers/token-counter.js +18 -0
  184. package/dist/providers/token-counter.js.map +1 -0
  185. package/dist/ranking/api-reranker.d.ts +18 -0
  186. package/dist/ranking/api-reranker.d.ts.map +1 -0
  187. package/dist/ranking/api-reranker.js +137 -0
  188. package/dist/ranking/api-reranker.js.map +1 -0
  189. package/dist/ranking/symbol-boost.d.ts +15 -0
  190. package/dist/ranking/symbol-boost.d.ts.map +1 -0
  191. package/dist/ranking/symbol-boost.js +175 -0
  192. package/dist/ranking/symbol-boost.js.map +1 -0
  193. package/dist/search/bm25.d.ts +17 -0
  194. package/dist/search/bm25.d.ts.map +1 -0
  195. package/dist/search/bm25.js +56 -0
  196. package/dist/search/bm25.js.map +1 -0
  197. package/dist/search/hybrid.d.ts +21 -0
  198. package/dist/search/hybrid.d.ts.map +1 -0
  199. package/dist/search/hybrid.js +50 -0
  200. package/dist/search/hybrid.js.map +1 -0
  201. package/dist/search/scope.d.ts +5 -0
  202. package/dist/search/scope.d.ts.map +1 -0
  203. package/dist/search/scope.js +107 -0
  204. package/dist/search/scope.js.map +1 -0
  205. package/dist/storage/encrypted-chunks.d.ts +40 -0
  206. package/dist/storage/encrypted-chunks.d.ts.map +1 -0
  207. package/dist/storage/encrypted-chunks.js +238 -0
  208. package/dist/storage/encrypted-chunks.js.map +1 -0
  209. package/dist/symbols/extract.d.ts +15 -0
  210. package/dist/symbols/extract.d.ts.map +1 -0
  211. package/dist/symbols/extract.js +208 -0
  212. package/dist/symbols/extract.js.map +1 -0
  213. package/dist/symbols/graph.d.ts +3 -0
  214. package/dist/symbols/graph.d.ts.map +1 -0
  215. package/dist/symbols/graph.js +89 -0
  216. package/dist/symbols/graph.js.map +1 -0
  217. package/dist/synthesis/conversational-synthesizer.d.ts +61 -0
  218. package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -0
  219. package/dist/synthesis/conversational-synthesizer.js +289 -0
  220. package/dist/synthesis/conversational-synthesizer.js.map +1 -0
  221. package/dist/synthesis/markdown-formatter.d.ts +13 -0
  222. package/dist/synthesis/markdown-formatter.d.ts.map +1 -0
  223. package/dist/synthesis/markdown-formatter.js +104 -0
  224. package/dist/synthesis/markdown-formatter.js.map +1 -0
  225. package/dist/synthesis/prompt-builder.d.ts +21 -0
  226. package/dist/synthesis/prompt-builder.d.ts.map +1 -0
  227. package/dist/synthesis/prompt-builder.js +129 -0
  228. package/dist/synthesis/prompt-builder.js.map +1 -0
  229. package/dist/synthesis/synthesizer.d.ts +30 -0
  230. package/dist/synthesis/synthesizer.d.ts.map +1 -0
  231. package/dist/synthesis/synthesizer.js +213 -0
  232. package/dist/synthesis/synthesizer.js.map +1 -0
  233. package/dist/tests/rate-limiter.test.d.ts +2 -0
  234. package/dist/tests/rate-limiter.test.d.ts.map +1 -0
  235. package/dist/tests/rate-limiter.test.js +11 -0
  236. package/dist/tests/rate-limiter.test.js.map +1 -0
  237. package/dist/tests/search-normalization.test.d.ts +2 -0
  238. package/dist/tests/search-normalization.test.d.ts.map +1 -0
  239. package/dist/tests/search-normalization.test.js +9 -0
  240. package/dist/tests/search-normalization.test.js.map +1 -0
  241. package/dist/tests/semantic-chunker.test.d.ts +2 -0
  242. package/dist/tests/semantic-chunker.test.d.ts.map +1 -0
  243. package/dist/tests/semantic-chunker.test.js +48 -0
  244. package/dist/tests/semantic-chunker.test.js.map +1 -0
  245. package/dist/tests/simple-lru.test.d.ts +2 -0
  246. package/dist/tests/simple-lru.test.d.ts.map +1 -0
  247. package/dist/tests/simple-lru.test.js +21 -0
  248. package/dist/tests/simple-lru.test.js.map +1 -0
  249. package/dist/tests/symbol-boost.test.d.ts +2 -0
  250. package/dist/tests/symbol-boost.test.d.ts.map +1 -0
  251. package/dist/tests/symbol-boost.test.js +21 -0
  252. package/dist/tests/symbol-boost.test.js.map +1 -0
  253. package/dist/types/ast.d.ts +3 -0
  254. package/dist/types/ast.d.ts.map +1 -0
  255. package/dist/types/ast.js +2 -0
  256. package/dist/types/ast.js.map +1 -0
  257. package/dist/types/codemap.d.ts +58 -0
  258. package/dist/types/codemap.d.ts.map +1 -0
  259. package/dist/types/codemap.js +224 -0
  260. package/dist/types/codemap.js.map +1 -0
  261. package/dist/types/context-pack.d.ts +47 -0
  262. package/dist/types/context-pack.d.ts.map +1 -0
  263. package/dist/types/context-pack.js +44 -0
  264. package/dist/types/context-pack.js.map +1 -0
  265. package/dist/types/search.d.ts +15 -0
  266. package/dist/types/search.d.ts.map +1 -0
  267. package/dist/types/search.js +11 -0
  268. package/dist/types/search.js.map +1 -0
  269. package/dist/utils/cli-ui.d.ts +44 -0
  270. package/dist/utils/cli-ui.d.ts.map +1 -0
  271. package/dist/utils/cli-ui.js +139 -0
  272. package/dist/utils/cli-ui.js.map +1 -0
  273. package/dist/utils/indexer-with-progress.d.ts +10 -0
  274. package/dist/utils/indexer-with-progress.d.ts.map +1 -0
  275. package/dist/utils/indexer-with-progress.js +43 -0
  276. package/dist/utils/indexer-with-progress.js.map +1 -0
  277. package/dist/utils/logger.d.ts +55 -0
  278. package/dist/utils/logger.d.ts.map +1 -0
  279. package/dist/utils/logger.js +121 -0
  280. package/dist/utils/logger.js.map +1 -0
  281. package/dist/utils/mutex.d.ts +63 -0
  282. package/dist/utils/mutex.d.ts.map +1 -0
  283. package/dist/utils/mutex.js +123 -0
  284. package/dist/utils/mutex.js.map +1 -0
  285. package/dist/utils/path-helpers.d.ts +27 -0
  286. package/dist/utils/path-helpers.d.ts.map +1 -0
  287. package/dist/utils/path-helpers.js +55 -0
  288. package/dist/utils/path-helpers.js.map +1 -0
  289. package/dist/utils/rate-limiter.d.ts +34 -0
  290. package/dist/utils/rate-limiter.d.ts.map +1 -0
  291. package/dist/utils/rate-limiter.js +178 -0
  292. package/dist/utils/rate-limiter.js.map +1 -0
  293. package/dist/utils/scan-patterns.d.ts +5 -0
  294. package/dist/utils/scan-patterns.d.ts.map +1 -0
  295. package/dist/utils/scan-patterns.js +29 -0
  296. package/dist/utils/scan-patterns.js.map +1 -0
  297. package/dist/utils/simple-lru.d.ts +10 -0
  298. package/dist/utils/simple-lru.d.ts.map +1 -0
  299. package/dist/utils/simple-lru.js +38 -0
  300. package/dist/utils/simple-lru.js.map +1 -0
  301. package/package.json +3 -2
@@ -0,0 +1,213 @@
1
+ import { searchCode, getChunk } from '../core/search.js';
2
+ import { createChatLLMProvider } from '../providers/chat-llm.js';
3
+ import { buildSystemPrompt, buildUserPrompt, buildMultiQueryPrompt, parseMultiQueryResponse } from './prompt-builder.js';
4
+ import { resolveProviderContext } from '../config/resolver.js';
5
+ export async function synthesizeAnswer(query, options = {}) {
6
+ const { provider = 'auto', chatProvider = 'auto', workingPath = '.', scope = {}, maxChunks = 10, useReranking = true, useMultiQuery = false, temperature = 0.7 } = options;
7
+ try {
8
+ const providerContext = resolveProviderContext(workingPath);
9
+ const chatLLM = createChatLLMProvider(chatProvider, providerContext.chat);
10
+ if (chatLLM.init) {
11
+ await chatLLM.init();
12
+ }
13
+ let allResults = [];
14
+ let queriesUsed = [query];
15
+ let usedMultiQuery = false;
16
+ // Multi-query support for complex questions
17
+ if (useMultiQuery && isComplexQuestion(query)) {
18
+ try {
19
+ const multiQueryPrompt = buildMultiQueryPrompt(query);
20
+ const multiQueryResponse = await chatLLM.generateCompletion([
21
+ { role: 'user', content: multiQueryPrompt }
22
+ ], { temperature: 0.3, maxTokens: 500 });
23
+ const subQueries = parseMultiQueryResponse(multiQueryResponse);
24
+ if (subQueries.length > 0) {
25
+ queriesUsed = subQueries;
26
+ usedMultiQuery = true;
27
+ if (!process.env.CODEVAULT_QUIET) {
28
+ console.log(`📝 Breaking down query into ${subQueries.length} sub-queries:`);
29
+ subQueries.forEach((q, i) => console.log(` ${i + 1}. "${q}"`));
30
+ console.log('');
31
+ }
32
+ }
33
+ }
34
+ catch (error) {
35
+ // Fall back to single query if multi-query fails
36
+ if (!process.env.CODEVAULT_QUIET) {
37
+ console.warn('Multi-query breakdown failed, using original query');
38
+ }
39
+ }
40
+ }
41
+ // Execute searches
42
+ const searchScope = {
43
+ ...scope,
44
+ reranker: useReranking ? 'api' : 'off',
45
+ hybrid: true,
46
+ bm25: true,
47
+ symbol_boost: true
48
+ };
49
+ for (const searchQuery of queriesUsed) {
50
+ const searchResult = await searchCode(searchQuery, maxChunks, provider, workingPath, searchScope);
51
+ if (searchResult.success && searchResult.results.length > 0) {
52
+ allResults.push(...searchResult.results);
53
+ }
54
+ }
55
+ // Deduplicate results by SHA
56
+ const uniqueResults = new Map();
57
+ for (const result of allResults) {
58
+ if (!uniqueResults.has(result.sha)) {
59
+ uniqueResults.set(result.sha, result);
60
+ }
61
+ else {
62
+ // Keep the one with higher score
63
+ const existing = uniqueResults.get(result.sha);
64
+ if (result.meta.score > existing.meta.score) {
65
+ uniqueResults.set(result.sha, result);
66
+ }
67
+ }
68
+ }
69
+ const deduplicatedResults = Array.from(uniqueResults.values())
70
+ .sort((a, b) => b.meta.score - a.meta.score)
71
+ .slice(0, maxChunks);
72
+ if (deduplicatedResults.length === 0) {
73
+ return {
74
+ success: false,
75
+ error: 'no_results',
76
+ query,
77
+ queriesUsed,
78
+ chunksAnalyzed: 0,
79
+ chatProvider: chatLLM.getName(),
80
+ embeddingProvider: provider,
81
+ metadata: {
82
+ multiQuery: usedMultiQuery,
83
+ totalResults: 0
84
+ }
85
+ };
86
+ }
87
+ // Retrieve code chunks
88
+ const codeChunks = new Map();
89
+ if (!process.env.CODEVAULT_QUIET) {
90
+ console.log(`🔍 Retrieved ${deduplicatedResults.length} relevant code chunks`);
91
+ }
92
+ for (const result of deduplicatedResults) {
93
+ const chunkResult = await getChunk(result.sha, workingPath);
94
+ if (chunkResult.success && chunkResult.code) {
95
+ codeChunks.set(result.sha, chunkResult.code);
96
+ }
97
+ }
98
+ // Build context for LLM
99
+ const context = {
100
+ query,
101
+ results: deduplicatedResults,
102
+ codeChunks,
103
+ metadata: {
104
+ searchType: deduplicatedResults[0]?.meta?.searchType,
105
+ provider,
106
+ totalChunks: deduplicatedResults.length
107
+ }
108
+ };
109
+ // Generate synthesis
110
+ const systemPrompt = buildSystemPrompt();
111
+ const userPrompt = buildUserPrompt(context, { maxContextChunks: maxChunks });
112
+ const messages = [
113
+ { role: 'system', content: systemPrompt },
114
+ { role: 'user', content: userPrompt }
115
+ ];
116
+ if (!process.env.CODEVAULT_QUIET) {
117
+ console.log(`🤖 Synthesizing answer with ${chatLLM.getName()}...`);
118
+ }
119
+ const answer = await chatLLM.generateCompletion(messages, {
120
+ temperature,
121
+ maxTokens: parseInt(process.env.CODEVAULT_CHAT_MAX_TOKENS || '4096', 10)
122
+ });
123
+ return {
124
+ success: true,
125
+ answer,
126
+ query,
127
+ queriesUsed,
128
+ chunksAnalyzed: deduplicatedResults.length,
129
+ chatProvider: chatLLM.getName(),
130
+ embeddingProvider: provider,
131
+ metadata: {
132
+ searchType: deduplicatedResults[0]?.meta?.searchType,
133
+ totalResults: deduplicatedResults.length,
134
+ multiQuery: usedMultiQuery
135
+ }
136
+ };
137
+ }
138
+ catch (error) {
139
+ return {
140
+ success: false,
141
+ error: error.message,
142
+ query,
143
+ chunksAnalyzed: 0,
144
+ chatProvider: chatProvider,
145
+ embeddingProvider: provider
146
+ };
147
+ }
148
+ }
149
+ export async function* synthesizeAnswerStreaming(query, options = {}) {
150
+ const { provider = 'auto', chatProvider = 'auto', workingPath = '.', scope = {}, maxChunks = 10, useReranking = true, temperature = 0.7 } = options;
151
+ const providerContext = resolveProviderContext(workingPath);
152
+ const chatLLM = createChatLLMProvider(chatProvider, providerContext.chat);
153
+ if (chatLLM.init) {
154
+ await chatLLM.init();
155
+ }
156
+ // Execute search
157
+ const searchScope = {
158
+ ...scope,
159
+ reranker: useReranking ? 'api' : 'off',
160
+ hybrid: true,
161
+ bm25: true,
162
+ symbol_boost: true
163
+ };
164
+ const searchResult = await searchCode(query, maxChunks, provider, workingPath, searchScope);
165
+ if (!searchResult.success || searchResult.results.length === 0) {
166
+ yield `**No relevant code found for:** "${query}"\n\n`;
167
+ yield `Please ensure the project is indexed and try rephrasing your question.`;
168
+ return;
169
+ }
170
+ // Retrieve code chunks
171
+ const codeChunks = new Map();
172
+ for (const result of searchResult.results.slice(0, maxChunks)) {
173
+ const chunkResult = await getChunk(result.sha, workingPath);
174
+ if (chunkResult.success && chunkResult.code) {
175
+ codeChunks.set(result.sha, chunkResult.code);
176
+ }
177
+ }
178
+ // Build context
179
+ const context = {
180
+ query,
181
+ results: searchResult.results.slice(0, maxChunks),
182
+ codeChunks,
183
+ metadata: {
184
+ searchType: searchResult.searchType,
185
+ provider: searchResult.provider,
186
+ totalChunks: searchResult.results.length
187
+ }
188
+ };
189
+ // Generate streaming response
190
+ const systemPrompt = buildSystemPrompt();
191
+ const userPrompt = buildUserPrompt(context, { maxContextChunks: maxChunks });
192
+ const messages = [
193
+ { role: 'system', content: systemPrompt },
194
+ { role: 'user', content: userPrompt }
195
+ ];
196
+ for await (const chunk of chatLLM.generateStreamingCompletion(messages, { temperature })) {
197
+ yield chunk;
198
+ }
199
+ }
200
+ function isComplexQuestion(query) {
201
+ const complexIndicators = [
202
+ /\bhow\s+(does|do|can|should)\b/i,
203
+ /\bwhat\s+(is|are|does)\b/i,
204
+ /\bexplain\b/i,
205
+ /\bwalk\s+me\s+through\b/i,
206
+ /\bstep\s+by\s+step\b/i,
207
+ /\band\b.*\band\b/i, // Multiple "and"s suggest complex query
208
+ /\bor\b.*\bor\b/i, // Multiple "or"s
209
+ /\?.*\?/, // Multiple questions
210
+ ];
211
+ return complexIndicators.some(pattern => pattern.test(query));
212
+ }
213
+ //# sourceMappingURL=synthesizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesizer.js","sourceRoot":"","sources":["../../src/synthesis/synthesizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rate-limiter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.test.d.ts","sourceRoot":"","sources":["../../src/tests/rate-limiter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { RateLimiter } from '../utils/rate-limiter.js';
4
+ test('RateLimiter executes tasks under default limits', async () => {
5
+ const limiter = new RateLimiter(1000, null, 10);
6
+ const result = await limiter.execute(() => Promise.resolve('ok'));
7
+ assert.equal(result, 'ok');
8
+ const stats = limiter.getStats();
9
+ assert.ok(stats.requestsInLastMinute >= 0);
10
+ });
11
+ //# sourceMappingURL=rate-limiter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../../src/tests/rate-limiter.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;IACjE,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search-normalization.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-normalization.test.d.ts","sourceRoot":"","sources":["../../src/tests/search-normalization.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { SearchService } from '../core/SearchService.js';
4
+ test('SearchService.normalizeQuery trims and lowercases input', () => {
5
+ const service = new SearchService();
6
+ const normalized = service.normalizeQuery(' Foo Bar?? ');
7
+ assert.equal(normalized, 'foo bar');
8
+ });
9
+ //# sourceMappingURL=search-normalization.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-normalization.test.js","sourceRoot":"","sources":["../../src/tests/search-normalization.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,OAAO,GAAQ,IAAI,aAAa,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAE5D,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=semantic-chunker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-chunker.test.d.ts","sourceRoot":"","sources":["../../src/tests/semantic-chunker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { findSemanticSubdivisions, yieldStatementChunks } from '../chunking/semantic-chunker.js';
4
+ const dummyProfile = {
5
+ maxTokens: 100,
6
+ optimalTokens: 50,
7
+ minChunkTokens: 10,
8
+ maxChunkTokens: 80,
9
+ overlapTokens: 10,
10
+ optimalChars: 100,
11
+ minChunkChars: 10,
12
+ maxChunkChars: 80,
13
+ overlapChars: 10,
14
+ dimensions: 0,
15
+ useTokens: false,
16
+ tokenizerType: 'estimate'
17
+ };
18
+ function makeNode(type, children = [], startIndex = 0, endIndex = 0) {
19
+ return {
20
+ type,
21
+ startIndex,
22
+ endIndex,
23
+ childCount: children.length,
24
+ child: (idx) => children[idx] ?? null
25
+ };
26
+ }
27
+ test('findSemanticSubdivisions returns direct subdivision types', () => {
28
+ const child = makeNode('child');
29
+ const parent = makeNode('root', [child]);
30
+ const rule = { subdivisionTypes: { root: ['child'] } };
31
+ const subs = findSemanticSubdivisions(parent, rule);
32
+ assert.equal(subs.length, 1);
33
+ assert.equal(subs[0], child);
34
+ });
35
+ test('yieldStatementChunks preserves configured overlap', async () => {
36
+ const source = ['line1', 'line2', 'line3', 'line4', 'line5'].join('\n');
37
+ const node = makeNode('function', [], 0, source.length);
38
+ const maxSize = 20; // characters
39
+ const overlapSize = 4; // characters to overlap
40
+ const chunks = await yieldStatementChunks(node, source, maxSize, overlapSize, dummyProfile);
41
+ assert.ok(chunks.length > 1, 'should split into multiple chunks');
42
+ // Verify overlap by checking that the last line of first chunk appears at start of second chunk
43
+ const firstChunkLines = chunks[0].code.split('\n');
44
+ const secondChunkLines = chunks[1].code.split('\n');
45
+ const lastLineFirst = firstChunkLines[firstChunkLines.length - 1];
46
+ assert.equal(lastLineFirst, secondChunkLines[0]);
47
+ });
48
+ //# sourceMappingURL=semantic-chunker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-chunker.test.js","sourceRoot":"","sources":["../../src/tests/semantic-chunker.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGjG,MAAM,YAAY,GAAiB;IACjC,SAAS,EAAE,GAAG;IACd,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,GAAG;IACjB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,UAAU;CAC1B,CAAC;AAEF,SAAS,QAAQ,CAAC,IAAY,EAAE,WAAkB,EAAE,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC;IAChF,OAAO;QACL,IAAI;QACJ,UAAU;QACV,QAAQ;QACR,UAAU,EAAE,QAAQ,CAAC,MAAM;QAC3B,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI;KAC9C,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;IAEvD,MAAM,IAAI,GAAG,wBAAwB,CAAC,MAAa,EAAE,IAAW,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,aAAa;IACjC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,wBAAwB;IAE/C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACnG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,mCAAmC,CAAC,CAAC;IAElE,gGAAgG;IAChG,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=simple-lru.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-lru.test.d.ts","sourceRoot":"","sources":["../../src/tests/simple-lru.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { SimpleLRU } from '../utils/simple-lru.js';
4
+ test('SimpleLRU evicts only when capacity exceeded', () => {
5
+ const lru = new SimpleLRU(2);
6
+ lru.set('a', 1);
7
+ lru.set('b', 2);
8
+ lru.set('b', 3); // refresh recency
9
+ lru.set('c', 4); // should evict "a"
10
+ assert.equal(lru.size, 2);
11
+ assert.equal(lru.get('b'), 3);
12
+ assert.equal(lru.get('c'), 4);
13
+ assert.equal(lru.get('a'), undefined);
14
+ // Adding another should evict least recently used ("b")
15
+ lru.set('d', 5);
16
+ assert.equal(lru.size, 2);
17
+ assert.equal(lru.get('c'), 4);
18
+ assert.equal(lru.get('d'), 5);
19
+ assert.equal(lru.get('b'), undefined);
20
+ });
21
+ //# sourceMappingURL=simple-lru.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-lru.test.js","sourceRoot":"","sources":["../../src/tests/simple-lru.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;IACxD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAiB,CAAC,CAAC,CAAC;IAE7C,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB;IACnC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB;IAEpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IAEtC,wDAAwD;IACxD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=symbol-boost.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-boost.test.d.ts","sourceRoot":"","sources":["../../src/tests/symbol-boost.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { applySymbolBoost } from '../ranking/symbol-boost.js';
4
+ test('applySymbolBoost caps total score at or below 1.0', () => {
5
+ const codemap = {
6
+ chunk1: {
7
+ file: 'src/example.ts',
8
+ symbol: 'processPayment',
9
+ sha: 'sha-1',
10
+ lang: 'typescript',
11
+ symbol_neighbors: []
12
+ }
13
+ };
14
+ const results = [
15
+ { id: 'chunk1', score: 0.9, symbol: 'processPayment', symbolBoost: 0 }
16
+ ];
17
+ applySymbolBoost(results, { query: 'process payment', codemap });
18
+ assert.ok(results[0].score <= 1, 'score should not exceed 1.0');
19
+ assert.ok(results[0].symbolBoost <= 0.45, 'boost should respect cap');
20
+ });
21
+ //# sourceMappingURL=symbol-boost.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-boost.test.js","sourceRoot":"","sources":["../../src/tests/symbol-boost.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAY;QACvB,MAAM,EAAE;YACN,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,gBAAgB;YACxB,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,YAAY;YAClB,gBAAgB,EAAE,EAAE;SACrB;KACF,CAAC;IAEF,MAAM,OAAO,GAAG;QACd,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,EAAE;KACvE,CAAC;IAEF,gBAAgB,CAAC,OAAc,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;IAExE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAChE,MAAM,CAAC,EAAE,CAAE,OAAO,CAAC,CAAC,CAAS,CAAC,WAAY,IAAI,IAAI,EAAE,0BAA0B,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SyntaxNode } from 'tree-sitter';
2
+ export type TreeSitterNode = SyntaxNode;
3
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/types/ast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/types/ast.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ export declare const DEFAULT_PATH_WEIGHT = 1;
3
+ export declare const DEFAULT_SUCCESS_RATE = 0;
4
+ export declare const CodemapChunkSchema: z.ZodObject<{
5
+ file: z.ZodString;
6
+ symbol: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
7
+ sha: z.ZodString;
8
+ lang: z.ZodOptional<z.ZodString>;
9
+ chunkType: z.ZodOptional<z.ZodString>;
10
+ provider: z.ZodOptional<z.ZodString>;
11
+ dimensions: z.ZodOptional<z.ZodNumber>;
12
+ hasCodevaultTags: z.ZodOptional<z.ZodBoolean>;
13
+ hasIntent: z.ZodOptional<z.ZodBoolean>;
14
+ hasDocumentation: z.ZodOptional<z.ZodBoolean>;
15
+ variableCount: z.ZodOptional<z.ZodNumber>;
16
+ synonyms: z.ZodOptional<z.ZodArray<z.ZodString>>;
17
+ path_weight: z.ZodOptional<z.ZodNumber>;
18
+ last_used_at: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
19
+ success_rate: z.ZodOptional<z.ZodNumber>;
20
+ encrypted: z.ZodOptional<z.ZodBoolean>;
21
+ symbol_signature: z.ZodOptional<z.ZodString>;
22
+ symbol_parameters: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
+ symbol_return: z.ZodOptional<z.ZodString>;
24
+ symbol_calls: z.ZodOptional<z.ZodArray<z.ZodString>>;
25
+ symbol_call_targets: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ symbol_callers: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ symbol_neighbors: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ }, z.core.$loose>;
29
+ export declare const CodemapSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
30
+ file: z.ZodString;
31
+ symbol: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
32
+ sha: z.ZodString;
33
+ lang: z.ZodOptional<z.ZodString>;
34
+ chunkType: z.ZodOptional<z.ZodString>;
35
+ provider: z.ZodOptional<z.ZodString>;
36
+ dimensions: z.ZodOptional<z.ZodNumber>;
37
+ hasCodevaultTags: z.ZodOptional<z.ZodBoolean>;
38
+ hasIntent: z.ZodOptional<z.ZodBoolean>;
39
+ hasDocumentation: z.ZodOptional<z.ZodBoolean>;
40
+ variableCount: z.ZodOptional<z.ZodNumber>;
41
+ synonyms: z.ZodOptional<z.ZodArray<z.ZodString>>;
42
+ path_weight: z.ZodOptional<z.ZodNumber>;
43
+ last_used_at: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
44
+ success_rate: z.ZodOptional<z.ZodNumber>;
45
+ encrypted: z.ZodOptional<z.ZodBoolean>;
46
+ symbol_signature: z.ZodOptional<z.ZodString>;
47
+ symbol_parameters: z.ZodOptional<z.ZodArray<z.ZodString>>;
48
+ symbol_return: z.ZodOptional<z.ZodString>;
49
+ symbol_calls: z.ZodOptional<z.ZodArray<z.ZodString>>;
50
+ symbol_call_targets: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ symbol_callers: z.ZodOptional<z.ZodArray<z.ZodString>>;
52
+ symbol_neighbors: z.ZodOptional<z.ZodArray<z.ZodString>>;
53
+ }, z.core.$loose>>;
54
+ export type CodemapChunk = z.infer<typeof CodemapChunkSchema>;
55
+ export type Codemap = z.infer<typeof CodemapSchema>;
56
+ export declare function normalizeChunkMetadata(raw: any, previous?: CodemapChunk): CodemapChunk;
57
+ export declare function normalizeCodemapRecord(raw: any): Codemap;
58
+ //# sourceMappingURL=codemap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codemap.d.ts","sourceRoot":"","sources":["../../src/types/codemap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;iBAwBf,CAAC;AAEjB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;kBAA2C,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AA4MpD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,CAKtF;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAYxD"}