codevault 1.8.3 → 1.8.5

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 (479) hide show
  1. package/README.md +33 -5
  2. package/dist/chunking/file-grouper.d.ts +1 -1
  3. package/dist/chunking/file-grouper.d.ts.map +1 -1
  4. package/dist/chunking/file-grouper.js +3 -3
  5. package/dist/chunking/file-grouper.js.map +1 -1
  6. package/dist/chunking/semantic-chunker.d.ts +1 -1
  7. package/dist/chunking/semantic-chunker.d.ts.map +1 -1
  8. package/dist/chunking/token-counter.d.ts +1 -1
  9. package/dist/chunking/token-counter.d.ts.map +1 -1
  10. package/dist/chunking/token-counter.js +16 -10
  11. package/dist/chunking/token-counter.js.map +1 -1
  12. package/dist/cli/commands/ask-cmd.js +15 -15
  13. package/dist/cli/commands/ask-cmd.js.map +1 -1
  14. package/dist/cli/commands/chat-cmd.d.ts.map +1 -1
  15. package/dist/cli/commands/chat-cmd.js +40 -40
  16. package/dist/cli/commands/chat-cmd.js.map +1 -1
  17. package/dist/cli/commands/config-cmd.d.ts.map +1 -1
  18. package/dist/cli/commands/config-cmd.js +61 -52
  19. package/dist/cli/commands/config-cmd.js.map +1 -1
  20. package/dist/cli/commands/context.d.ts.map +1 -1
  21. package/dist/cli/commands/context.js +20 -11
  22. package/dist/cli/commands/context.js.map +1 -1
  23. package/dist/cli/commands/index-cmd.d.ts.map +1 -1
  24. package/dist/cli/commands/index-cmd.js +109 -85
  25. package/dist/cli/commands/index-cmd.js.map +1 -1
  26. package/dist/cli/commands/info-cmd.d.ts.map +1 -1
  27. package/dist/cli/commands/info-cmd.js +12 -11
  28. package/dist/cli/commands/info-cmd.js.map +1 -1
  29. package/dist/cli/commands/interactive-config.d.ts.map +1 -1
  30. package/dist/cli/commands/interactive-config.js +60 -20
  31. package/dist/cli/commands/interactive-config.js.map +1 -1
  32. package/dist/cli/commands/search-cmd.d.ts.map +1 -1
  33. package/dist/cli/commands/search-cmd.js +22 -11
  34. package/dist/cli/commands/search-cmd.js.map +1 -1
  35. package/dist/cli/commands/search-with-code-cmd.d.ts.map +1 -1
  36. package/dist/cli/commands/search-with-code-cmd.js +25 -16
  37. package/dist/cli/commands/search-with-code-cmd.js.map +1 -1
  38. package/dist/cli/commands/update-cmd.d.ts.map +1 -1
  39. package/dist/cli/commands/update-cmd.js +16 -7
  40. package/dist/cli/commands/update-cmd.js.map +1 -1
  41. package/dist/cli/commands/watch-cmd.d.ts.map +1 -1
  42. package/dist/cli/commands/watch-cmd.js +21 -11
  43. package/dist/cli/commands/watch-cmd.js.map +1 -1
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/cli/utils.d.ts +56 -0
  46. package/dist/cli/utils.d.ts.map +1 -0
  47. package/dist/cli/utils.js +98 -0
  48. package/dist/cli/utils.js.map +1 -0
  49. package/dist/cli.js +0 -0
  50. package/dist/codemap/io.js.map +1 -1
  51. package/dist/config/constants.d.ts +4 -0
  52. package/dist/config/constants.d.ts.map +1 -1
  53. package/dist/config/constants.js +2 -0
  54. package/dist/config/constants.js.map +1 -1
  55. package/dist/config/loader.js.map +1 -1
  56. package/dist/context/packs.d.ts +2 -2
  57. package/dist/context/packs.d.ts.map +1 -1
  58. package/dist/context/packs.js +7 -4
  59. package/dist/context/packs.js.map +1 -1
  60. package/dist/core/IndexerEngine.d.ts +2 -0
  61. package/dist/core/IndexerEngine.d.ts.map +1 -1
  62. package/dist/core/IndexerEngine.js +34 -26
  63. package/dist/core/IndexerEngine.js.map +1 -1
  64. package/dist/core/SearchService.d.ts +2 -1
  65. package/dist/core/SearchService.d.ts.map +1 -1
  66. package/dist/core/SearchService.js +25 -18
  67. package/dist/core/SearchService.js.map +1 -1
  68. package/dist/core/batch-indexer.d.ts +4 -3
  69. package/dist/core/batch-indexer.d.ts.map +1 -1
  70. package/dist/core/batch-indexer.js +32 -35
  71. package/dist/core/batch-indexer.js.map +1 -1
  72. package/dist/core/indexing/FileProcessor.d.ts +1 -0
  73. package/dist/core/indexing/FileProcessor.d.ts.map +1 -1
  74. package/dist/core/indexing/FileProcessor.js +32 -9
  75. package/dist/core/indexing/FileProcessor.js.map +1 -1
  76. package/dist/core/indexing/IndexContext.d.ts +6 -4
  77. package/dist/core/indexing/IndexContext.d.ts.map +1 -1
  78. package/dist/core/indexing/IndexContext.js +3 -3
  79. package/dist/core/indexing/IndexContext.js.map +1 -1
  80. package/dist/core/indexing/IndexFinalizationStage.d.ts +6 -1
  81. package/dist/core/indexing/IndexFinalizationStage.d.ts.map +1 -1
  82. package/dist/core/indexing/IndexFinalizationStage.js +22 -3
  83. package/dist/core/indexing/IndexFinalizationStage.js.map +1 -1
  84. package/dist/core/indexing/IndexState.d.ts +3 -8
  85. package/dist/core/indexing/IndexState.d.ts.map +1 -1
  86. package/dist/core/indexing/IndexState.js.map +1 -1
  87. package/dist/core/indexing/PersistManager.d.ts +1 -1
  88. package/dist/core/indexing/PersistManager.d.ts.map +1 -1
  89. package/dist/core/indexing/PersistManager.js +17 -17
  90. package/dist/core/indexing/PersistManager.js.map +1 -1
  91. package/dist/core/indexing/chunk-pipeline.d.ts +33 -7
  92. package/dist/core/indexing/chunk-pipeline.d.ts.map +1 -1
  93. package/dist/core/indexing/chunk-pipeline.js +20 -8
  94. package/dist/core/indexing/chunk-pipeline.js.map +1 -1
  95. package/dist/core/metadata.d.ts +1 -1
  96. package/dist/core/metadata.d.ts.map +1 -1
  97. package/dist/core/metadata.js +1 -1
  98. package/dist/core/metadata.js.map +1 -1
  99. package/dist/core/search/CandidateRetriever.d.ts +1 -1
  100. package/dist/core/search/CandidateRetriever.d.ts.map +1 -1
  101. package/dist/core/search/CandidateRetriever.js +7 -5
  102. package/dist/core/search/CandidateRetriever.js.map +1 -1
  103. package/dist/core/search/HybridFusion.d.ts +1 -2
  104. package/dist/core/search/HybridFusion.d.ts.map +1 -1
  105. package/dist/core/search/HybridFusion.js +5 -17
  106. package/dist/core/search/HybridFusion.js.map +1 -1
  107. package/dist/core/search/ResultMapper.d.ts +0 -1
  108. package/dist/core/search/ResultMapper.d.ts.map +1 -1
  109. package/dist/core/search/ResultMapper.js +3 -14
  110. package/dist/core/search/ResultMapper.js.map +1 -1
  111. package/dist/core/search/SearchContextManager.d.ts +4 -1
  112. package/dist/core/search/SearchContextManager.d.ts.map +1 -1
  113. package/dist/core/search/SearchContextManager.js +19 -6
  114. package/dist/core/search/SearchContextManager.js.map +1 -1
  115. package/dist/core/search.d.ts.map +1 -1
  116. package/dist/core/search.js +9 -4
  117. package/dist/core/search.js.map +1 -1
  118. package/dist/core/types.d.ts +2 -2
  119. package/dist/core/types.d.ts.map +1 -1
  120. package/dist/database/db.d.ts +14 -14
  121. package/dist/database/db.d.ts.map +1 -1
  122. package/dist/database/db.js +14 -14
  123. package/dist/database/db.js.map +1 -1
  124. package/dist/indexer/merkle.js +1 -1
  125. package/dist/indexer/merkle.js.map +1 -1
  126. package/dist/languages/rules.d.ts +2 -1
  127. package/dist/languages/rules.d.ts.map +1 -1
  128. package/dist/languages/rules.js +14 -5
  129. package/dist/languages/rules.js.map +1 -1
  130. package/dist/languages/tree-sitter-loader.d.ts +24 -24
  131. package/dist/languages/tree-sitter-loader.d.ts.map +1 -1
  132. package/dist/languages/tree-sitter-loader.js +14 -10
  133. package/dist/languages/tree-sitter-loader.js.map +1 -1
  134. package/dist/mcp/handlers/context.d.ts +5 -11
  135. package/dist/mcp/handlers/context.d.ts.map +1 -1
  136. package/dist/mcp/handlers/context.js.map +1 -1
  137. package/dist/mcp/handlers/project.d.ts +9 -27
  138. package/dist/mcp/handlers/project.d.ts.map +1 -1
  139. package/dist/mcp/handlers/search.d.ts +24 -18
  140. package/dist/mcp/handlers/search.d.ts.map +1 -1
  141. package/dist/mcp/handlers/search.js +8 -2
  142. package/dist/mcp/handlers/search.js.map +1 -1
  143. package/dist/mcp/handlers/synthesis.d.ts +15 -11
  144. package/dist/mcp/handlers/synthesis.d.ts.map +1 -1
  145. package/dist/mcp/handlers/synthesis.js +4 -1
  146. package/dist/mcp/handlers/synthesis.js.map +1 -1
  147. package/dist/mcp/schemas.d.ts +2 -2
  148. package/dist/mcp/tools/ask-codebase.d.ts +10 -28
  149. package/dist/mcp/tools/ask-codebase.d.ts.map +1 -1
  150. package/dist/mcp/tools/ask-codebase.js +1 -1
  151. package/dist/mcp/tools/ask-codebase.js.map +1 -1
  152. package/dist/mcp/tools/use-context-pack.d.ts +14 -23
  153. package/dist/mcp/tools/use-context-pack.d.ts.map +1 -1
  154. package/dist/mcp/tools/use-context-pack.js +4 -3
  155. package/dist/mcp/tools/use-context-pack.js.map +1 -1
  156. package/dist/mcp-server.d.ts +1 -0
  157. package/dist/mcp-server.d.ts.map +1 -1
  158. package/dist/mcp-server.js +39 -24
  159. package/dist/mcp-server.js.map +1 -1
  160. package/dist/providers/base.d.ts +3 -2
  161. package/dist/providers/base.d.ts.map +1 -1
  162. package/dist/providers/base.js +3 -10
  163. package/dist/providers/base.js.map +1 -1
  164. package/dist/providers/chat-llm.d.ts +3 -2
  165. package/dist/providers/chat-llm.d.ts.map +1 -1
  166. package/dist/providers/chat-llm.js +13 -9
  167. package/dist/providers/chat-llm.js.map +1 -1
  168. package/dist/providers/mock.d.ts.map +1 -1
  169. package/dist/providers/mock.js +6 -5
  170. package/dist/providers/mock.js.map +1 -1
  171. package/dist/providers/openai.d.ts +2 -1
  172. package/dist/providers/openai.d.ts.map +1 -1
  173. package/dist/providers/openai.js +15 -19
  174. package/dist/providers/openai.js.map +1 -1
  175. package/dist/providers/token-counter.d.ts.map +1 -1
  176. package/dist/providers/token-counter.js +11 -3
  177. package/dist/providers/token-counter.js.map +1 -1
  178. package/dist/ranking/api-reranker.d.ts +1 -1
  179. package/dist/ranking/api-reranker.d.ts.map +1 -1
  180. package/dist/ranking/api-reranker.js +50 -13
  181. package/dist/ranking/api-reranker.js.map +1 -1
  182. package/dist/ranking/symbol-boost.d.ts.map +1 -1
  183. package/dist/ranking/symbol-boost.js +4 -11
  184. package/dist/ranking/symbol-boost.js.map +1 -1
  185. package/dist/search/bm25.d.ts +10 -0
  186. package/dist/search/bm25.d.ts.map +1 -1
  187. package/dist/search/bm25.js +16 -0
  188. package/dist/search/bm25.js.map +1 -1
  189. package/dist/search/hybrid.js.map +1 -1
  190. package/dist/search/scope.d.ts.map +1 -1
  191. package/dist/search/scope.js +3 -2
  192. package/dist/search/scope.js.map +1 -1
  193. package/dist/storage/encrypted-chunks.d.ts +3 -0
  194. package/dist/storage/encrypted-chunks.d.ts.map +1 -1
  195. package/dist/storage/encrypted-chunks.js +126 -47
  196. package/dist/storage/encrypted-chunks.js.map +1 -1
  197. package/dist/symbols/extract.d.ts.map +1 -1
  198. package/dist/symbols/extract.js +3 -2
  199. package/dist/symbols/extract.js.map +1 -1
  200. package/dist/symbols/graph.d.ts.map +1 -1
  201. package/dist/symbols/graph.js +14 -8
  202. package/dist/symbols/graph.js.map +1 -1
  203. package/dist/synthesis/conversational-synthesizer.d.ts +2 -1
  204. package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -1
  205. package/dist/synthesis/conversational-synthesizer.js +6 -1
  206. package/dist/synthesis/conversational-synthesizer.js.map +1 -1
  207. package/dist/synthesis/markdown-formatter.d.ts.map +1 -1
  208. package/dist/synthesis/markdown-formatter.js +1 -1
  209. package/dist/synthesis/markdown-formatter.js.map +1 -1
  210. package/dist/synthesis/prompt-builder.d.ts.map +1 -1
  211. package/dist/synthesis/prompt-builder.js +42 -15
  212. package/dist/synthesis/prompt-builder.js.map +1 -1
  213. package/dist/synthesis/synthesizer.d.ts.map +1 -1
  214. package/dist/synthesis/synthesizer.js +23 -10
  215. package/dist/synthesis/synthesizer.js.map +1 -1
  216. package/dist/tests/api-reranker.test.d.ts +2 -0
  217. package/dist/tests/api-reranker.test.d.ts.map +1 -0
  218. package/dist/tests/api-reranker.test.js +575 -0
  219. package/dist/tests/api-reranker.test.js.map +1 -0
  220. package/dist/tests/bm25.test.d.ts +2 -0
  221. package/dist/tests/bm25.test.d.ts.map +1 -0
  222. package/dist/tests/bm25.test.js +340 -0
  223. package/dist/tests/bm25.test.js.map +1 -0
  224. package/dist/tests/chunking/file-grouper.test.d.ts +2 -0
  225. package/dist/tests/chunking/file-grouper.test.d.ts.map +1 -0
  226. package/dist/tests/chunking/file-grouper.test.js +495 -0
  227. package/dist/tests/chunking/file-grouper.test.js.map +1 -0
  228. package/dist/tests/chunking/semantic-chunker.test.d.ts +2 -0
  229. package/dist/tests/chunking/semantic-chunker.test.d.ts.map +1 -0
  230. package/dist/tests/chunking/semantic-chunker.test.js +509 -0
  231. package/dist/tests/chunking/semantic-chunker.test.js.map +1 -0
  232. package/dist/tests/chunking/token-counter.test.d.ts +2 -0
  233. package/dist/tests/chunking/token-counter.test.d.ts.map +1 -0
  234. package/dist/tests/chunking/token-counter.test.js +441 -0
  235. package/dist/tests/chunking/token-counter.test.js.map +1 -0
  236. package/dist/tests/cli/ask-cmd.test.d.ts +2 -0
  237. package/dist/tests/cli/ask-cmd.test.d.ts.map +1 -0
  238. package/dist/tests/cli/ask-cmd.test.js +152 -0
  239. package/dist/tests/cli/ask-cmd.test.js.map +1 -0
  240. package/dist/tests/cli/chat-cmd.test.d.ts +2 -0
  241. package/dist/tests/cli/chat-cmd.test.d.ts.map +1 -0
  242. package/dist/tests/cli/chat-cmd.test.js +118 -0
  243. package/dist/tests/cli/chat-cmd.test.js.map +1 -0
  244. package/dist/tests/cli/config-cmd.test.d.ts +2 -0
  245. package/dist/tests/cli/config-cmd.test.d.ts.map +1 -0
  246. package/dist/tests/cli/config-cmd.test.js +226 -0
  247. package/dist/tests/cli/config-cmd.test.js.map +1 -0
  248. package/dist/tests/cli/context.test.d.ts +2 -0
  249. package/dist/tests/cli/context.test.d.ts.map +1 -0
  250. package/dist/tests/cli/context.test.js +158 -0
  251. package/dist/tests/cli/context.test.js.map +1 -0
  252. package/dist/tests/cli/index-cmd.test.d.ts +2 -0
  253. package/dist/tests/cli/index-cmd.test.d.ts.map +1 -0
  254. package/dist/tests/cli/index-cmd.test.js +89 -0
  255. package/dist/tests/cli/index-cmd.test.js.map +1 -0
  256. package/dist/tests/cli/index.test.d.ts +2 -0
  257. package/dist/tests/cli/index.test.d.ts.map +1 -0
  258. package/dist/tests/cli/index.test.js +167 -0
  259. package/dist/tests/cli/index.test.js.map +1 -0
  260. package/dist/tests/cli/info-cmd.test.d.ts +2 -0
  261. package/dist/tests/cli/info-cmd.test.d.ts.map +1 -0
  262. package/dist/tests/cli/info-cmd.test.js +47 -0
  263. package/dist/tests/cli/info-cmd.test.js.map +1 -0
  264. package/dist/tests/cli/interactive-config.test.d.ts +2 -0
  265. package/dist/tests/cli/interactive-config.test.d.ts.map +1 -0
  266. package/dist/tests/cli/interactive-config.test.js +30 -0
  267. package/dist/tests/cli/interactive-config.test.js.map +1 -0
  268. package/dist/tests/cli/mcp-cmd.test.d.ts +2 -0
  269. package/dist/tests/cli/mcp-cmd.test.d.ts.map +1 -0
  270. package/dist/tests/cli/mcp-cmd.test.js +47 -0
  271. package/dist/tests/cli/mcp-cmd.test.js.map +1 -0
  272. package/dist/tests/cli/search-cmd.test.d.ts +2 -0
  273. package/dist/tests/cli/search-cmd.test.d.ts.map +1 -0
  274. package/dist/tests/cli/search-cmd.test.js +120 -0
  275. package/dist/tests/cli/search-cmd.test.js.map +1 -0
  276. package/dist/tests/cli/search-with-code-cmd.test.d.ts +2 -0
  277. package/dist/tests/cli/search-with-code-cmd.test.d.ts.map +1 -0
  278. package/dist/tests/cli/search-with-code-cmd.test.js +140 -0
  279. package/dist/tests/cli/search-with-code-cmd.test.js.map +1 -0
  280. package/dist/tests/cli/update-cmd.test.d.ts +2 -0
  281. package/dist/tests/cli/update-cmd.test.d.ts.map +1 -0
  282. package/dist/tests/cli/update-cmd.test.js +75 -0
  283. package/dist/tests/cli/update-cmd.test.js.map +1 -0
  284. package/dist/tests/cli/utils.test.d.ts +2 -0
  285. package/dist/tests/cli/utils.test.d.ts.map +1 -0
  286. package/dist/tests/cli/utils.test.js +119 -0
  287. package/dist/tests/cli/utils.test.js.map +1 -0
  288. package/dist/tests/cli/watch-cmd.test.d.ts +2 -0
  289. package/dist/tests/cli/watch-cmd.test.d.ts.map +1 -0
  290. package/dist/tests/cli/watch-cmd.test.js +84 -0
  291. package/dist/tests/cli/watch-cmd.test.js.map +1 -0
  292. package/dist/tests/cli-ui.test.d.ts +2 -0
  293. package/dist/tests/cli-ui.test.d.ts.map +1 -0
  294. package/dist/tests/cli-ui.test.js +608 -0
  295. package/dist/tests/cli-ui.test.js.map +1 -0
  296. package/dist/tests/codemap-io.test.d.ts +2 -0
  297. package/dist/tests/codemap-io.test.d.ts.map +1 -0
  298. package/dist/tests/codemap-io.test.js +992 -0
  299. package/dist/tests/codemap-io.test.js.map +1 -0
  300. package/dist/tests/config/apply-env.test.d.ts +2 -0
  301. package/dist/tests/config/apply-env.test.d.ts.map +1 -0
  302. package/dist/tests/config/apply-env.test.js +717 -0
  303. package/dist/tests/config/apply-env.test.js.map +1 -0
  304. package/dist/tests/config/constants.test.d.ts +2 -0
  305. package/dist/tests/config/constants.test.d.ts.map +1 -0
  306. package/dist/tests/config/constants.test.js +406 -0
  307. package/dist/tests/config/constants.test.js.map +1 -0
  308. package/dist/tests/config/loader.test.d.ts +2 -0
  309. package/dist/tests/config/loader.test.d.ts.map +1 -0
  310. package/dist/tests/config/loader.test.js +716 -0
  311. package/dist/tests/config/loader.test.js.map +1 -0
  312. package/dist/tests/config/resolver.test.d.ts +2 -0
  313. package/dist/tests/config/resolver.test.d.ts.map +1 -0
  314. package/dist/tests/config/resolver.test.js +402 -0
  315. package/dist/tests/config/resolver.test.js.map +1 -0
  316. package/dist/tests/config/types.test.d.ts +2 -0
  317. package/dist/tests/config/types.test.d.ts.map +1 -0
  318. package/dist/tests/config/types.test.js +460 -0
  319. package/dist/tests/config/types.test.js.map +1 -0
  320. package/dist/tests/context-packs.test.d.ts +2 -0
  321. package/dist/tests/context-packs.test.d.ts.map +1 -0
  322. package/dist/tests/context-packs.test.js +826 -0
  323. package/dist/tests/context-packs.test.js.map +1 -0
  324. package/dist/tests/conversational-synthesizer.test.d.ts +2 -0
  325. package/dist/tests/conversational-synthesizer.test.d.ts.map +1 -0
  326. package/dist/tests/conversational-synthesizer.test.js +595 -0
  327. package/dist/tests/conversational-synthesizer.test.js.map +1 -0
  328. package/dist/tests/database.test.d.ts +2 -0
  329. package/dist/tests/database.test.d.ts.map +1 -0
  330. package/dist/tests/database.test.js +965 -0
  331. package/dist/tests/database.test.js.map +1 -0
  332. package/dist/tests/encrypted-chunks.test.d.ts +2 -0
  333. package/dist/tests/encrypted-chunks.test.d.ts.map +1 -0
  334. package/dist/tests/encrypted-chunks.test.js +1470 -0
  335. package/dist/tests/encrypted-chunks.test.js.map +1 -0
  336. package/dist/tests/hybrid.test.d.ts +2 -0
  337. package/dist/tests/hybrid.test.d.ts.map +1 -0
  338. package/dist/tests/hybrid.test.js +456 -0
  339. package/dist/tests/hybrid.test.js.map +1 -0
  340. package/dist/tests/indexer/ChangeQueue.test.d.ts +12 -0
  341. package/dist/tests/indexer/ChangeQueue.test.d.ts.map +1 -0
  342. package/dist/tests/indexer/ChangeQueue.test.js +441 -0
  343. package/dist/tests/indexer/ChangeQueue.test.js.map +1 -0
  344. package/dist/tests/indexer/ProviderManager.test.d.ts +12 -0
  345. package/dist/tests/indexer/ProviderManager.test.d.ts.map +1 -0
  346. package/dist/tests/indexer/ProviderManager.test.js +290 -0
  347. package/dist/tests/indexer/ProviderManager.test.js.map +1 -0
  348. package/dist/tests/indexer/WatchService.test.d.ts +14 -0
  349. package/dist/tests/indexer/WatchService.test.d.ts.map +1 -0
  350. package/dist/tests/indexer/WatchService.test.js +667 -0
  351. package/dist/tests/indexer/WatchService.test.js.map +1 -0
  352. package/dist/tests/indexer/merkle.test.d.ts +11 -0
  353. package/dist/tests/indexer/merkle.test.d.ts.map +1 -0
  354. package/dist/tests/indexer/merkle.test.js +497 -0
  355. package/dist/tests/indexer/merkle.test.js.map +1 -0
  356. package/dist/tests/indexer/update.test.d.ts +10 -0
  357. package/dist/tests/indexer/update.test.d.ts.map +1 -0
  358. package/dist/tests/indexer/update.test.js +317 -0
  359. package/dist/tests/indexer/update.test.js.map +1 -0
  360. package/dist/tests/indexer/watch.test.d.ts +8 -0
  361. package/dist/tests/indexer/watch.test.d.ts.map +1 -0
  362. package/dist/tests/indexer/watch.test.js +95 -0
  363. package/dist/tests/indexer/watch.test.js.map +1 -0
  364. package/dist/tests/integration/index-search.integration.test.js +6 -4
  365. package/dist/tests/integration/index-search.integration.test.js.map +1 -1
  366. package/dist/tests/languages.test.d.ts +2 -0
  367. package/dist/tests/languages.test.d.ts.map +1 -0
  368. package/dist/tests/languages.test.js +575 -0
  369. package/dist/tests/languages.test.js.map +1 -0
  370. package/dist/tests/logger-redaction.test.d.ts +2 -0
  371. package/dist/tests/logger-redaction.test.d.ts.map +1 -0
  372. package/dist/tests/logger-redaction.test.js +48 -0
  373. package/dist/tests/logger-redaction.test.js.map +1 -0
  374. package/dist/tests/logger.test.d.ts +2 -0
  375. package/dist/tests/logger.test.d.ts.map +1 -0
  376. package/dist/tests/logger.test.js +468 -0
  377. package/dist/tests/logger.test.js.map +1 -0
  378. package/dist/tests/markdown-formatter.test.d.ts +2 -0
  379. package/dist/tests/markdown-formatter.test.d.ts.map +1 -0
  380. package/dist/tests/markdown-formatter.test.js +453 -0
  381. package/dist/tests/markdown-formatter.test.js.map +1 -0
  382. package/dist/tests/mcp/tools/use-context-pack.test.d.ts +7 -0
  383. package/dist/tests/mcp/tools/use-context-pack.test.d.ts.map +1 -0
  384. package/dist/tests/mcp/tools/use-context-pack.test.js +505 -0
  385. package/dist/tests/mcp/tools/use-context-pack.test.js.map +1 -0
  386. package/dist/tests/mutex.test.d.ts +2 -0
  387. package/dist/tests/mutex.test.d.ts.map +1 -0
  388. package/dist/tests/mutex.test.js +489 -0
  389. package/dist/tests/mutex.test.js.map +1 -0
  390. package/dist/tests/path-helpers.test.d.ts +2 -0
  391. package/dist/tests/path-helpers.test.d.ts.map +1 -0
  392. package/dist/tests/path-helpers.test.js +332 -0
  393. package/dist/tests/path-helpers.test.js.map +1 -0
  394. package/dist/tests/prompt-builder.test.d.ts +2 -0
  395. package/dist/tests/prompt-builder.test.d.ts.map +1 -0
  396. package/dist/tests/prompt-builder.test.js +417 -0
  397. package/dist/tests/prompt-builder.test.js.map +1 -0
  398. package/dist/tests/providers/base.test.d.ts +2 -0
  399. package/dist/tests/providers/base.test.d.ts.map +1 -0
  400. package/dist/tests/providers/base.test.js +299 -0
  401. package/dist/tests/providers/base.test.js.map +1 -0
  402. package/dist/tests/providers/chat-llm.test.d.ts +2 -0
  403. package/dist/tests/providers/chat-llm.test.d.ts.map +1 -0
  404. package/dist/tests/providers/chat-llm.test.js +435 -0
  405. package/dist/tests/providers/chat-llm.test.js.map +1 -0
  406. package/dist/tests/providers/index.test.d.ts +2 -0
  407. package/dist/tests/providers/index.test.d.ts.map +1 -0
  408. package/dist/tests/providers/index.test.js +204 -0
  409. package/dist/tests/providers/index.test.js.map +1 -0
  410. package/dist/tests/providers/mock.test.d.ts +2 -0
  411. package/dist/tests/providers/mock.test.d.ts.map +1 -0
  412. package/dist/tests/providers/mock.test.js +225 -0
  413. package/dist/tests/providers/mock.test.js.map +1 -0
  414. package/dist/tests/providers/openai.test.d.ts +2 -0
  415. package/dist/tests/providers/openai.test.d.ts.map +1 -0
  416. package/dist/tests/providers/openai.test.js +408 -0
  417. package/dist/tests/providers/openai.test.js.map +1 -0
  418. package/dist/tests/providers/token-counter.test.d.ts +2 -0
  419. package/dist/tests/providers/token-counter.test.d.ts.map +1 -0
  420. package/dist/tests/providers/token-counter.test.js +247 -0
  421. package/dist/tests/providers/token-counter.test.js.map +1 -0
  422. package/dist/tests/rate-limiter.test.js +392 -1
  423. package/dist/tests/rate-limiter.test.js.map +1 -1
  424. package/dist/tests/scope.test.d.ts +2 -0
  425. package/dist/tests/scope.test.d.ts.map +1 -0
  426. package/dist/tests/scope.test.js +529 -0
  427. package/dist/tests/scope.test.js.map +1 -0
  428. package/dist/tests/search-normalization.test.js.map +1 -1
  429. package/dist/tests/semantic-chunker.test.js.map +1 -1
  430. package/dist/tests/simple-lru.test.js +377 -0
  431. package/dist/tests/simple-lru.test.js.map +1 -1
  432. package/dist/tests/symbol-boost.test.js +730 -10
  433. package/dist/tests/symbol-boost.test.js.map +1 -1
  434. package/dist/tests/symbols-extract.test.d.ts +2 -0
  435. package/dist/tests/symbols-extract.test.d.ts.map +1 -0
  436. package/dist/tests/symbols-extract.test.js +536 -0
  437. package/dist/tests/symbols-extract.test.js.map +1 -0
  438. package/dist/tests/symbols-graph.test.d.ts +2 -0
  439. package/dist/tests/symbols-graph.test.d.ts.map +1 -0
  440. package/dist/tests/symbols-graph.test.js +656 -0
  441. package/dist/tests/symbols-graph.test.js.map +1 -0
  442. package/dist/tests/synthesizer.test.d.ts +2 -0
  443. package/dist/tests/synthesizer.test.d.ts.map +1 -0
  444. package/dist/tests/synthesizer.test.js +381 -0
  445. package/dist/tests/synthesizer.test.js.map +1 -0
  446. package/dist/types/codemap.d.ts +2 -2
  447. package/dist/types/codemap.d.ts.map +1 -1
  448. package/dist/types/codemap.js +17 -9
  449. package/dist/types/codemap.js.map +1 -1
  450. package/dist/types/context-pack.d.ts +5 -5
  451. package/dist/types/context-pack.d.ts.map +1 -1
  452. package/dist/types/context-pack.js +6 -3
  453. package/dist/types/context-pack.js.map +1 -1
  454. package/dist/utils/cli-ui.d.ts +1 -1
  455. package/dist/utils/cli-ui.d.ts.map +1 -1
  456. package/dist/utils/cli-ui.js +26 -26
  457. package/dist/utils/cli-ui.js.map +1 -1
  458. package/dist/utils/indexer-with-progress.d.ts.map +1 -1
  459. package/dist/utils/indexer-with-progress.js +0 -6
  460. package/dist/utils/indexer-with-progress.js.map +1 -1
  461. package/dist/utils/logger.d.ts +10 -1
  462. package/dist/utils/logger.d.ts.map +1 -1
  463. package/dist/utils/logger.js +158 -6
  464. package/dist/utils/logger.js.map +1 -1
  465. package/dist/utils/mutex.d.ts +7 -2
  466. package/dist/utils/mutex.d.ts.map +1 -1
  467. package/dist/utils/mutex.js +35 -7
  468. package/dist/utils/mutex.js.map +1 -1
  469. package/dist/utils/path-helpers.d.ts.map +1 -1
  470. package/dist/utils/path-helpers.js +5 -2
  471. package/dist/utils/path-helpers.js.map +1 -1
  472. package/dist/utils/rate-limiter.d.ts.map +1 -1
  473. package/dist/utils/rate-limiter.js +23 -4
  474. package/dist/utils/rate-limiter.js.map +1 -1
  475. package/dist/utils/simple-lru.d.ts +6 -0
  476. package/dist/utils/simple-lru.d.ts.map +1 -1
  477. package/dist/utils/simple-lru.js +26 -0
  478. package/dist/utils/simple-lru.js.map +1 -1
  479. package/package.json +1 -1
@@ -0,0 +1,656 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { attachSymbolGraphToCodemap } from '../symbols/graph.js';
4
+ /**
5
+ * Helper to create a minimal valid CodemapChunk for testing
6
+ */
7
+ function createChunk(options) {
8
+ return {
9
+ file: options.file,
10
+ symbol: options.symbol,
11
+ sha: options.sha,
12
+ lang: 'typescript',
13
+ symbol_calls: options.symbol_calls ?? []
14
+ };
15
+ }
16
+ // ============================================================================
17
+ // Tests for attachSymbolGraphToCodemap - Basic functionality
18
+ // ============================================================================
19
+ test('attachSymbolGraphToCodemap returns empty codemap unchanged', () => {
20
+ const codemap = {};
21
+ const result = attachSymbolGraphToCodemap(codemap);
22
+ assert.deepEqual(result, {});
23
+ });
24
+ test('attachSymbolGraphToCodemap handles null input gracefully', () => {
25
+ const result = attachSymbolGraphToCodemap(null);
26
+ assert.equal(result, null);
27
+ });
28
+ test('attachSymbolGraphToCodemap handles undefined input gracefully', () => {
29
+ const result = attachSymbolGraphToCodemap(undefined);
30
+ assert.equal(result, undefined);
31
+ });
32
+ test('attachSymbolGraphToCodemap handles non-object input gracefully', () => {
33
+ const result = attachSymbolGraphToCodemap('not an object');
34
+ assert.equal(result, 'not an object');
35
+ });
36
+ test('attachSymbolGraphToCodemap adds symbol_call_targets for direct calls', () => {
37
+ const codemap = {
38
+ chunk1: createChunk({
39
+ file: 'src/a.ts',
40
+ symbol: 'caller',
41
+ sha: 'sha-caller',
42
+ symbol_calls: ['callee']
43
+ }),
44
+ chunk2: createChunk({
45
+ file: 'src/b.ts',
46
+ symbol: 'callee',
47
+ sha: 'sha-callee',
48
+ symbol_calls: []
49
+ })
50
+ };
51
+ const result = attachSymbolGraphToCodemap(codemap);
52
+ assert.ok(Array.isArray(result.chunk1.symbol_call_targets));
53
+ assert.ok(result.chunk1.symbol_call_targets.includes('sha-callee'));
54
+ });
55
+ test('attachSymbolGraphToCodemap adds symbol_callers for reverse references', () => {
56
+ const codemap = {
57
+ chunk1: createChunk({
58
+ file: 'src/a.ts',
59
+ symbol: 'caller',
60
+ sha: 'sha-caller',
61
+ symbol_calls: ['callee']
62
+ }),
63
+ chunk2: createChunk({
64
+ file: 'src/b.ts',
65
+ symbol: 'callee',
66
+ sha: 'sha-callee',
67
+ symbol_calls: []
68
+ })
69
+ };
70
+ const result = attachSymbolGraphToCodemap(codemap);
71
+ assert.ok(Array.isArray(result.chunk2.symbol_callers));
72
+ assert.ok(result.chunk2.symbol_callers.includes('sha-caller'));
73
+ });
74
+ test('attachSymbolGraphToCodemap adds symbol_neighbors combining both directions', () => {
75
+ const codemap = {
76
+ chunk1: createChunk({
77
+ file: 'src/a.ts',
78
+ symbol: 'caller',
79
+ sha: 'sha-caller',
80
+ symbol_calls: ['callee']
81
+ }),
82
+ chunk2: createChunk({
83
+ file: 'src/b.ts',
84
+ symbol: 'callee',
85
+ sha: 'sha-callee',
86
+ symbol_calls: []
87
+ })
88
+ };
89
+ const result = attachSymbolGraphToCodemap(codemap);
90
+ // caller's neighbors should include callee (outgoing)
91
+ assert.ok(result.chunk1.symbol_neighbors.includes('sha-callee'));
92
+ // callee's neighbors should include caller (incoming)
93
+ assert.ok(result.chunk2.symbol_neighbors.includes('sha-caller'));
94
+ });
95
+ // ============================================================================
96
+ // Tests for symbol resolution
97
+ // ============================================================================
98
+ test('attachSymbolGraphToCodemap resolves symbols case-insensitively', () => {
99
+ // Use unique symbols that don't collide
100
+ const codemap = {
101
+ chunk1: createChunk({
102
+ file: 'src/a.ts',
103
+ symbol: 'callerFunc',
104
+ sha: 'sha-1',
105
+ symbol_calls: ['TARGETFUNC'] // uppercase call to lowercase symbol
106
+ }),
107
+ chunk2: createChunk({
108
+ file: 'src/b.ts',
109
+ symbol: 'targetFunc', // lowercase symbol
110
+ sha: 'sha-2',
111
+ symbol_calls: []
112
+ })
113
+ };
114
+ const result = attachSymbolGraphToCodemap(codemap);
115
+ // 'TARGETFUNC'.toLowerCase() === 'targetfunc' === 'targetFunc'.toLowerCase()
116
+ assert.ok(result.chunk1.symbol_call_targets.includes('sha-2'));
117
+ });
118
+ test('attachSymbolGraphToCodemap handles multiple chunks with same symbol name', () => {
119
+ const codemap = {
120
+ chunk1: createChunk({
121
+ file: 'src/a.ts',
122
+ symbol: 'caller',
123
+ sha: 'sha-caller',
124
+ symbol_calls: ['helper']
125
+ }),
126
+ chunk2: createChunk({
127
+ file: 'src/a.ts', // same file
128
+ symbol: 'helper',
129
+ sha: 'sha-helper-1',
130
+ symbol_calls: []
131
+ }),
132
+ chunk3: createChunk({
133
+ file: 'src/b.ts', // different file
134
+ symbol: 'helper',
135
+ sha: 'sha-helper-2',
136
+ symbol_calls: []
137
+ })
138
+ };
139
+ const result = attachSymbolGraphToCodemap(codemap);
140
+ // Should prefer the helper in the same file
141
+ assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper-1'));
142
+ assert.ok(!result.chunk1.symbol_call_targets.includes('sha-helper-2'));
143
+ });
144
+ test('attachSymbolGraphToCodemap falls back to first candidate when no same-file match', () => {
145
+ const codemap = {
146
+ chunk1: createChunk({
147
+ file: 'src/a.ts',
148
+ symbol: 'caller',
149
+ sha: 'sha-caller',
150
+ symbol_calls: ['helper']
151
+ }),
152
+ chunk2: createChunk({
153
+ file: 'src/b.ts', // different file
154
+ symbol: 'helper',
155
+ sha: 'sha-helper',
156
+ symbol_calls: []
157
+ })
158
+ };
159
+ const result = attachSymbolGraphToCodemap(codemap);
160
+ assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper'));
161
+ });
162
+ test('attachSymbolGraphToCodemap ignores calls to non-existent symbols', () => {
163
+ const codemap = {
164
+ chunk1: createChunk({
165
+ file: 'src/a.ts',
166
+ symbol: 'caller',
167
+ sha: 'sha-caller',
168
+ symbol_calls: ['nonExistentFunction']
169
+ })
170
+ };
171
+ const result = attachSymbolGraphToCodemap(codemap);
172
+ assert.deepEqual(result.chunk1.symbol_call_targets, []);
173
+ });
174
+ test('attachSymbolGraphToCodemap ignores self-references', () => {
175
+ const codemap = {
176
+ chunk1: createChunk({
177
+ file: 'src/a.ts',
178
+ symbol: 'recursive',
179
+ sha: 'sha-recursive',
180
+ symbol_calls: ['recursive'] // calls itself
181
+ })
182
+ };
183
+ const result = attachSymbolGraphToCodemap(codemap);
184
+ // Should not include self in call targets
185
+ assert.ok(!result.chunk1.symbol_call_targets.includes('sha-recursive'));
186
+ });
187
+ // ============================================================================
188
+ // Tests for edge cases and malformed data
189
+ // ============================================================================
190
+ test('attachSymbolGraphToCodemap handles entries with null symbol', () => {
191
+ const codemap = {
192
+ chunk1: createChunk({
193
+ file: 'src/a.ts',
194
+ symbol: null,
195
+ sha: 'sha-1',
196
+ symbol_calls: []
197
+ }),
198
+ chunk2: createChunk({
199
+ file: 'src/b.ts',
200
+ symbol: 'helper',
201
+ sha: 'sha-2',
202
+ symbol_calls: []
203
+ })
204
+ };
205
+ // Should not throw
206
+ const result = attachSymbolGraphToCodemap(codemap);
207
+ assert.ok(result.chunk1 !== undefined);
208
+ });
209
+ test('attachSymbolGraphToCodemap handles entries with empty string symbol', () => {
210
+ const codemap = {
211
+ chunk1: createChunk({
212
+ file: 'src/a.ts',
213
+ symbol: '',
214
+ sha: 'sha-1',
215
+ symbol_calls: []
216
+ })
217
+ };
218
+ // Should not throw
219
+ const result = attachSymbolGraphToCodemap(codemap);
220
+ assert.deepEqual(result.chunk1.symbol_call_targets, []);
221
+ });
222
+ test('attachSymbolGraphToCodemap handles entries with whitespace-only symbol', () => {
223
+ const codemap = {
224
+ chunk1: createChunk({
225
+ file: 'src/a.ts',
226
+ symbol: ' ',
227
+ sha: 'sha-1',
228
+ symbol_calls: []
229
+ })
230
+ };
231
+ const result = attachSymbolGraphToCodemap(codemap);
232
+ assert.deepEqual(result.chunk1.symbol_call_targets, []);
233
+ });
234
+ test('attachSymbolGraphToCodemap handles entries without sha', () => {
235
+ const codemap = {
236
+ chunk1: {
237
+ file: 'src/a.ts',
238
+ symbol: 'test',
239
+ sha: undefined // missing sha
240
+ }
241
+ };
242
+ // Should not throw
243
+ const result = attachSymbolGraphToCodemap(codemap);
244
+ assert.ok(result !== null);
245
+ });
246
+ test('attachSymbolGraphToCodemap handles null entries in codemap', () => {
247
+ const codemap = {
248
+ chunk1: null,
249
+ chunk2: createChunk({
250
+ file: 'src/b.ts',
251
+ symbol: 'valid',
252
+ sha: 'sha-2',
253
+ symbol_calls: []
254
+ })
255
+ };
256
+ // Should not throw
257
+ const result = attachSymbolGraphToCodemap(codemap);
258
+ assert.ok(result.chunk2.symbol_call_targets !== undefined);
259
+ });
260
+ test('attachSymbolGraphToCodemap handles non-object entries', () => {
261
+ const codemap = {
262
+ chunk1: 'not an object',
263
+ chunk2: createChunk({
264
+ file: 'src/b.ts',
265
+ symbol: 'valid',
266
+ sha: 'sha-2',
267
+ symbol_calls: []
268
+ })
269
+ };
270
+ // Should not throw
271
+ const result = attachSymbolGraphToCodemap(codemap);
272
+ assert.ok(result !== null);
273
+ });
274
+ test('attachSymbolGraphToCodemap handles non-array symbol_calls', () => {
275
+ const codemap = {
276
+ chunk1: {
277
+ file: 'src/a.ts',
278
+ symbol: 'caller',
279
+ sha: 'sha-1',
280
+ symbol_calls: 'not an array'
281
+ }
282
+ };
283
+ // Should not throw
284
+ const result = attachSymbolGraphToCodemap(codemap);
285
+ assert.deepEqual(result.chunk1.symbol_call_targets, []);
286
+ });
287
+ test('attachSymbolGraphToCodemap handles null values in symbol_calls array', () => {
288
+ const codemap = {
289
+ chunk1: createChunk({
290
+ file: 'src/a.ts',
291
+ symbol: 'caller',
292
+ sha: 'sha-caller',
293
+ symbol_calls: ['helper', null, undefined]
294
+ }),
295
+ chunk2: createChunk({
296
+ file: 'src/b.ts',
297
+ symbol: 'helper',
298
+ sha: 'sha-helper',
299
+ symbol_calls: []
300
+ })
301
+ };
302
+ // Should not throw and should still resolve 'helper'
303
+ const result = attachSymbolGraphToCodemap(codemap);
304
+ assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper'));
305
+ });
306
+ test('attachSymbolGraphToCodemap handles empty string in symbol_calls array', () => {
307
+ const codemap = {
308
+ chunk1: createChunk({
309
+ file: 'src/a.ts',
310
+ symbol: 'caller',
311
+ sha: 'sha-caller',
312
+ symbol_calls: ['', ' ', 'helper']
313
+ }),
314
+ chunk2: createChunk({
315
+ file: 'src/b.ts',
316
+ symbol: 'helper',
317
+ sha: 'sha-helper',
318
+ symbol_calls: []
319
+ })
320
+ };
321
+ const result = attachSymbolGraphToCodemap(codemap);
322
+ assert.ok(result.chunk1.symbol_call_targets.includes('sha-helper'));
323
+ // Empty strings should not produce invalid entries
324
+ assert.equal(result.chunk1.symbol_call_targets.length, 1);
325
+ });
326
+ // ============================================================================
327
+ // Tests for MAX_NEIGHBORS limit
328
+ // ============================================================================
329
+ test('attachSymbolGraphToCodemap limits symbol_call_targets to MAX_NEIGHBORS', () => {
330
+ // Create a caller that calls many different functions
331
+ const callees = {};
332
+ const calls = [];
333
+ for (let i = 0; i < 20; i++) {
334
+ const name = `helper${i}`;
335
+ calls.push(name);
336
+ callees[`chunk${i + 1}`] = createChunk({
337
+ file: 'src/helpers.ts',
338
+ symbol: name,
339
+ sha: `sha-${i}`,
340
+ symbol_calls: []
341
+ });
342
+ }
343
+ const codemap = {
344
+ caller: createChunk({
345
+ file: 'src/main.ts',
346
+ symbol: 'main',
347
+ sha: 'sha-main',
348
+ symbol_calls: calls
349
+ }),
350
+ ...callees
351
+ };
352
+ const result = attachSymbolGraphToCodemap(codemap);
353
+ // MAX_NEIGHBORS is 12 (from constants)
354
+ assert.ok(result.caller.symbol_call_targets.length <= 12);
355
+ });
356
+ test('attachSymbolGraphToCodemap limits symbol_callers to MAX_NEIGHBORS', () => {
357
+ // Create a callee that is called by many different functions
358
+ const callers = {};
359
+ for (let i = 0; i < 20; i++) {
360
+ callers[`caller${i}`] = createChunk({
361
+ file: 'src/callers.ts',
362
+ symbol: `caller${i}`,
363
+ sha: `sha-caller-${i}`,
364
+ symbol_calls: ['helper']
365
+ });
366
+ }
367
+ const codemap = {
368
+ ...callers,
369
+ helper: createChunk({
370
+ file: 'src/utils.ts',
371
+ symbol: 'helper',
372
+ sha: 'sha-helper',
373
+ symbol_calls: []
374
+ })
375
+ };
376
+ const result = attachSymbolGraphToCodemap(codemap);
377
+ // MAX_NEIGHBORS is 12 (from constants)
378
+ assert.ok(result.helper.symbol_callers.length <= 12);
379
+ });
380
+ test('attachSymbolGraphToCodemap limits symbol_neighbors to MAX_NEIGHBORS * 2', () => {
381
+ // Create a node with many incoming and outgoing edges
382
+ const otherChunks = {};
383
+ const callsOut = [];
384
+ // 15 outgoing
385
+ for (let i = 0; i < 15; i++) {
386
+ const name = `outgoing${i}`;
387
+ callsOut.push(name);
388
+ otherChunks[`out${i}`] = createChunk({
389
+ file: 'src/out.ts',
390
+ symbol: name,
391
+ sha: `sha-out-${i}`,
392
+ symbol_calls: []
393
+ });
394
+ }
395
+ // 15 incoming
396
+ for (let i = 0; i < 15; i++) {
397
+ otherChunks[`in${i}`] = createChunk({
398
+ file: 'src/in.ts',
399
+ symbol: `incoming${i}`,
400
+ sha: `sha-in-${i}`,
401
+ symbol_calls: ['central']
402
+ });
403
+ }
404
+ const codemap = {
405
+ ...otherChunks,
406
+ central: createChunk({
407
+ file: 'src/central.ts',
408
+ symbol: 'central',
409
+ sha: 'sha-central',
410
+ symbol_calls: callsOut
411
+ })
412
+ };
413
+ const result = attachSymbolGraphToCodemap(codemap);
414
+ // MAX_NEIGHBORS * 2 = 24
415
+ assert.ok(result.central.symbol_neighbors.length <= 24);
416
+ });
417
+ // ============================================================================
418
+ // Tests for complex graph structures
419
+ // ============================================================================
420
+ test('attachSymbolGraphToCodemap handles circular dependencies', () => {
421
+ const codemap = {
422
+ a: createChunk({
423
+ file: 'src/a.ts',
424
+ symbol: 'funcA',
425
+ sha: 'sha-a',
426
+ symbol_calls: ['funcB']
427
+ }),
428
+ b: createChunk({
429
+ file: 'src/b.ts',
430
+ symbol: 'funcB',
431
+ sha: 'sha-b',
432
+ symbol_calls: ['funcA']
433
+ })
434
+ };
435
+ const result = attachSymbolGraphToCodemap(codemap);
436
+ // Both should reference each other
437
+ assert.ok(result.a.symbol_call_targets.includes('sha-b'));
438
+ assert.ok(result.b.symbol_call_targets.includes('sha-a'));
439
+ assert.ok(result.a.symbol_callers.includes('sha-b'));
440
+ assert.ok(result.b.symbol_callers.includes('sha-a'));
441
+ });
442
+ test('attachSymbolGraphToCodemap handles transitive call chains', () => {
443
+ const codemap = {
444
+ a: createChunk({
445
+ file: 'src/a.ts',
446
+ symbol: 'funcA',
447
+ sha: 'sha-a',
448
+ symbol_calls: ['funcB']
449
+ }),
450
+ b: createChunk({
451
+ file: 'src/b.ts',
452
+ symbol: 'funcB',
453
+ sha: 'sha-b',
454
+ symbol_calls: ['funcC']
455
+ }),
456
+ c: createChunk({
457
+ file: 'src/c.ts',
458
+ symbol: 'funcC',
459
+ sha: 'sha-c',
460
+ symbol_calls: []
461
+ })
462
+ };
463
+ const result = attachSymbolGraphToCodemap(codemap);
464
+ // A calls B
465
+ assert.ok(result.a.symbol_call_targets.includes('sha-b'));
466
+ // B calls C
467
+ assert.ok(result.b.symbol_call_targets.includes('sha-c'));
468
+ // A does NOT directly call C (no transitive closure)
469
+ assert.ok(!result.a.symbol_call_targets.includes('sha-c'));
470
+ });
471
+ test('attachSymbolGraphToCodemap handles multiple callers to same target', () => {
472
+ const codemap = {
473
+ caller1: createChunk({
474
+ file: 'src/a.ts',
475
+ symbol: 'caller1',
476
+ sha: 'sha-caller1',
477
+ symbol_calls: ['shared']
478
+ }),
479
+ caller2: createChunk({
480
+ file: 'src/b.ts',
481
+ symbol: 'caller2',
482
+ sha: 'sha-caller2',
483
+ symbol_calls: ['shared']
484
+ }),
485
+ shared: createChunk({
486
+ file: 'src/shared.ts',
487
+ symbol: 'shared',
488
+ sha: 'sha-shared',
489
+ symbol_calls: []
490
+ })
491
+ };
492
+ const result = attachSymbolGraphToCodemap(codemap);
493
+ assert.ok(result.shared.symbol_callers.includes('sha-caller1'));
494
+ assert.ok(result.shared.symbol_callers.includes('sha-caller2'));
495
+ assert.equal(result.shared.symbol_callers.length, 2);
496
+ });
497
+ test('attachSymbolGraphToCodemap handles one function calling multiple targets', () => {
498
+ const codemap = {
499
+ orchestrator: createChunk({
500
+ file: 'src/main.ts',
501
+ symbol: 'orchestrator',
502
+ sha: 'sha-orch',
503
+ symbol_calls: ['step1', 'step2', 'step3']
504
+ }),
505
+ step1: createChunk({
506
+ file: 'src/steps.ts',
507
+ symbol: 'step1',
508
+ sha: 'sha-step1',
509
+ symbol_calls: []
510
+ }),
511
+ step2: createChunk({
512
+ file: 'src/steps.ts',
513
+ symbol: 'step2',
514
+ sha: 'sha-step2',
515
+ symbol_calls: []
516
+ }),
517
+ step3: createChunk({
518
+ file: 'src/steps.ts',
519
+ symbol: 'step3',
520
+ sha: 'sha-step3',
521
+ symbol_calls: []
522
+ })
523
+ };
524
+ const result = attachSymbolGraphToCodemap(codemap);
525
+ assert.ok(result.orchestrator.symbol_call_targets.includes('sha-step1'));
526
+ assert.ok(result.orchestrator.symbol_call_targets.includes('sha-step2'));
527
+ assert.ok(result.orchestrator.symbol_call_targets.includes('sha-step3'));
528
+ assert.equal(result.orchestrator.symbol_call_targets.length, 3);
529
+ });
530
+ // ============================================================================
531
+ // Tests for cross-file symbol resolution
532
+ // ============================================================================
533
+ test('attachSymbolGraphToCodemap prefers same-file symbol when duplicates exist', () => {
534
+ const codemap = {
535
+ main: createChunk({
536
+ file: 'src/main.ts',
537
+ symbol: 'main',
538
+ sha: 'sha-main',
539
+ symbol_calls: ['helper']
540
+ }),
541
+ helperLocal: createChunk({
542
+ file: 'src/main.ts', // same file as caller
543
+ symbol: 'helper',
544
+ sha: 'sha-helper-local',
545
+ symbol_calls: []
546
+ }),
547
+ helperRemote: createChunk({
548
+ file: 'src/utils.ts', // different file
549
+ symbol: 'helper',
550
+ sha: 'sha-helper-remote',
551
+ symbol_calls: []
552
+ })
553
+ };
554
+ const result = attachSymbolGraphToCodemap(codemap);
555
+ // Should prefer the local helper
556
+ assert.ok(result.main.symbol_call_targets.includes('sha-helper-local'));
557
+ assert.ok(!result.main.symbol_call_targets.includes('sha-helper-remote'));
558
+ });
559
+ test('attachSymbolGraphToCodemap resolves cross-file references correctly', () => {
560
+ const codemap = {
561
+ serviceA: createChunk({
562
+ file: 'src/services/a.ts',
563
+ symbol: 'ServiceA',
564
+ sha: 'sha-a',
565
+ symbol_calls: ['ServiceB', 'utils']
566
+ }),
567
+ serviceB: createChunk({
568
+ file: 'src/services/b.ts',
569
+ symbol: 'ServiceB',
570
+ sha: 'sha-b',
571
+ symbol_calls: ['utils']
572
+ }),
573
+ utils: createChunk({
574
+ file: 'src/utils/helpers.ts',
575
+ symbol: 'utils',
576
+ sha: 'sha-utils',
577
+ symbol_calls: []
578
+ })
579
+ };
580
+ const result = attachSymbolGraphToCodemap(codemap);
581
+ // ServiceA should call both ServiceB and utils
582
+ assert.ok(result.serviceA.symbol_call_targets.includes('sha-b'));
583
+ assert.ok(result.serviceA.symbol_call_targets.includes('sha-utils'));
584
+ // utils should be called by both ServiceA and ServiceB
585
+ assert.ok(result.utils.symbol_callers.includes('sha-a'));
586
+ assert.ok(result.utils.symbol_callers.includes('sha-b'));
587
+ });
588
+ // ============================================================================
589
+ // Tests for data integrity
590
+ // ============================================================================
591
+ test('attachSymbolGraphToCodemap preserves original chunk properties', () => {
592
+ const codemap = {
593
+ chunk1: {
594
+ file: 'src/test.ts',
595
+ symbol: 'testFunc',
596
+ sha: 'sha-test',
597
+ lang: 'typescript',
598
+ chunkType: 'function',
599
+ provider: 'openai',
600
+ dimensions: 1536,
601
+ hasCodevaultTags: true,
602
+ hasIntent: false,
603
+ hasDocumentation: true,
604
+ variableCount: 5,
605
+ synonyms: ['test', 'check'],
606
+ path_weight: 1.5,
607
+ success_rate: 0.95,
608
+ symbol_calls: []
609
+ }
610
+ };
611
+ const result = attachSymbolGraphToCodemap(codemap);
612
+ assert.equal(result.chunk1.file, 'src/test.ts');
613
+ assert.equal(result.chunk1.symbol, 'testFunc');
614
+ assert.equal(result.chunk1.sha, 'sha-test');
615
+ assert.equal(result.chunk1.lang, 'typescript');
616
+ assert.equal(result.chunk1.chunkType, 'function');
617
+ assert.equal(result.chunk1.provider, 'openai');
618
+ assert.equal(result.chunk1.dimensions, 1536);
619
+ assert.equal(result.chunk1.hasCodevaultTags, true);
620
+ assert.equal(result.chunk1.hasIntent, false);
621
+ assert.equal(result.chunk1.hasDocumentation, true);
622
+ assert.equal(result.chunk1.variableCount, 5);
623
+ assert.deepEqual(result.chunk1.synonyms, ['test', 'check']);
624
+ assert.equal(result.chunk1.path_weight, 1.5);
625
+ assert.equal(result.chunk1.success_rate, 0.95);
626
+ });
627
+ test('attachSymbolGraphToCodemap returns the same object reference (mutates in place)', () => {
628
+ const codemap = {
629
+ chunk1: createChunk({
630
+ file: 'src/a.ts',
631
+ symbol: 'test',
632
+ sha: 'sha-1',
633
+ symbol_calls: []
634
+ })
635
+ };
636
+ const result = attachSymbolGraphToCodemap(codemap);
637
+ assert.strictEqual(result, codemap);
638
+ });
639
+ test('attachSymbolGraphToCodemap initializes empty arrays for isolated nodes', () => {
640
+ const codemap = {
641
+ isolated: createChunk({
642
+ file: 'src/isolated.ts',
643
+ symbol: 'isolated',
644
+ sha: 'sha-isolated',
645
+ symbol_calls: []
646
+ })
647
+ };
648
+ const result = attachSymbolGraphToCodemap(codemap);
649
+ assert.ok(Array.isArray(result.isolated.symbol_call_targets));
650
+ assert.ok(Array.isArray(result.isolated.symbol_callers));
651
+ assert.ok(Array.isArray(result.isolated.symbol_neighbors));
652
+ assert.equal(result.isolated.symbol_call_targets.length, 0);
653
+ assert.equal(result.isolated.symbol_callers.length, 0);
654
+ assert.equal(result.isolated.symbol_neighbors.length, 0);
655
+ });
656
+ //# sourceMappingURL=symbols-graph.test.js.map