codevault 1.8.4 → 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 (351) hide show
  1. package/README.md +3 -2
  2. package/dist/chunking/token-counter.d.ts.map +1 -1
  3. package/dist/chunking/token-counter.js +16 -10
  4. package/dist/chunking/token-counter.js.map +1 -1
  5. package/dist/cli/commands/index-cmd.d.ts.map +1 -1
  6. package/dist/cli/commands/index-cmd.js +108 -97
  7. package/dist/cli/commands/index-cmd.js.map +1 -1
  8. package/dist/cli/commands/interactive-config.d.ts.map +1 -1
  9. package/dist/cli/commands/interactive-config.js +40 -3
  10. package/dist/cli/commands/interactive-config.js.map +1 -1
  11. package/dist/cli/commands/search-cmd.d.ts.map +1 -1
  12. package/dist/cli/commands/search-cmd.js +11 -7
  13. package/dist/cli/commands/search-cmd.js.map +1 -1
  14. package/dist/cli/commands/search-with-code-cmd.d.ts.map +1 -1
  15. package/dist/cli/commands/search-with-code-cmd.js +3 -1
  16. package/dist/cli/commands/search-with-code-cmd.js.map +1 -1
  17. package/dist/cli/utils.d.ts +56 -0
  18. package/dist/cli/utils.d.ts.map +1 -0
  19. package/dist/cli/utils.js +98 -0
  20. package/dist/cli/utils.js.map +1 -0
  21. package/dist/config/constants.d.ts +4 -0
  22. package/dist/config/constants.d.ts.map +1 -1
  23. package/dist/config/constants.js +2 -0
  24. package/dist/config/constants.js.map +1 -1
  25. package/dist/context/packs.d.ts.map +1 -1
  26. package/dist/context/packs.js +3 -1
  27. package/dist/context/packs.js.map +1 -1
  28. package/dist/core/IndexerEngine.d.ts +2 -0
  29. package/dist/core/IndexerEngine.d.ts.map +1 -1
  30. package/dist/core/IndexerEngine.js +34 -26
  31. package/dist/core/IndexerEngine.js.map +1 -1
  32. package/dist/core/SearchService.d.ts +1 -0
  33. package/dist/core/SearchService.d.ts.map +1 -1
  34. package/dist/core/SearchService.js +18 -12
  35. package/dist/core/SearchService.js.map +1 -1
  36. package/dist/core/batch-indexer.d.ts.map +1 -1
  37. package/dist/core/batch-indexer.js +5 -13
  38. package/dist/core/batch-indexer.js.map +1 -1
  39. package/dist/core/indexing/IndexFinalizationStage.d.ts.map +1 -1
  40. package/dist/core/indexing/IndexFinalizationStage.js +21 -2
  41. package/dist/core/indexing/IndexFinalizationStage.js.map +1 -1
  42. package/dist/core/indexing/IndexState.d.ts +3 -8
  43. package/dist/core/indexing/IndexState.d.ts.map +1 -1
  44. package/dist/core/indexing/IndexState.js.map +1 -1
  45. package/dist/core/indexing/PersistManager.d.ts +1 -1
  46. package/dist/core/indexing/PersistManager.d.ts.map +1 -1
  47. package/dist/core/indexing/PersistManager.js +17 -17
  48. package/dist/core/indexing/PersistManager.js.map +1 -1
  49. package/dist/core/search/HybridFusion.d.ts +0 -1
  50. package/dist/core/search/HybridFusion.d.ts.map +1 -1
  51. package/dist/core/search/HybridFusion.js +2 -14
  52. package/dist/core/search/HybridFusion.js.map +1 -1
  53. package/dist/core/search/ResultMapper.d.ts +0 -1
  54. package/dist/core/search/ResultMapper.d.ts.map +1 -1
  55. package/dist/core/search/ResultMapper.js +2 -13
  56. package/dist/core/search/ResultMapper.js.map +1 -1
  57. package/dist/core/search/SearchContextManager.d.ts +3 -0
  58. package/dist/core/search/SearchContextManager.d.ts.map +1 -1
  59. package/dist/core/search/SearchContextManager.js +15 -2
  60. package/dist/core/search/SearchContextManager.js.map +1 -1
  61. package/dist/core/search.d.ts.map +1 -1
  62. package/dist/core/search.js +9 -4
  63. package/dist/core/search.js.map +1 -1
  64. package/dist/languages/rules.d.ts.map +1 -1
  65. package/dist/languages/rules.js +14 -5
  66. package/dist/languages/rules.js.map +1 -1
  67. package/dist/mcp/schemas.d.ts +2 -2
  68. package/dist/mcp-server.d.ts +1 -0
  69. package/dist/mcp-server.d.ts.map +1 -1
  70. package/dist/mcp-server.js +32 -21
  71. package/dist/mcp-server.js.map +1 -1
  72. package/dist/providers/base.d.ts +3 -2
  73. package/dist/providers/base.d.ts.map +1 -1
  74. package/dist/providers/base.js +3 -1
  75. package/dist/providers/base.js.map +1 -1
  76. package/dist/providers/chat-llm.d.ts +2 -2
  77. package/dist/providers/chat-llm.d.ts.map +1 -1
  78. package/dist/providers/chat-llm.js +4 -1
  79. package/dist/providers/chat-llm.js.map +1 -1
  80. package/dist/providers/openai.d.ts.map +1 -1
  81. package/dist/providers/openai.js +4 -1
  82. package/dist/providers/openai.js.map +1 -1
  83. package/dist/ranking/api-reranker.d.ts.map +1 -1
  84. package/dist/ranking/api-reranker.js +27 -8
  85. package/dist/ranking/api-reranker.js.map +1 -1
  86. package/dist/ranking/symbol-boost.d.ts.map +1 -1
  87. package/dist/ranking/symbol-boost.js +4 -11
  88. package/dist/ranking/symbol-boost.js.map +1 -1
  89. package/dist/search/bm25.d.ts +10 -0
  90. package/dist/search/bm25.d.ts.map +1 -1
  91. package/dist/search/bm25.js +16 -0
  92. package/dist/search/bm25.js.map +1 -1
  93. package/dist/storage/encrypted-chunks.d.ts +3 -0
  94. package/dist/storage/encrypted-chunks.d.ts.map +1 -1
  95. package/dist/storage/encrypted-chunks.js +108 -16
  96. package/dist/storage/encrypted-chunks.js.map +1 -1
  97. package/dist/synthesis/conversational-synthesizer.d.ts +2 -1
  98. package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -1
  99. package/dist/synthesis/conversational-synthesizer.js +6 -1
  100. package/dist/synthesis/conversational-synthesizer.js.map +1 -1
  101. package/dist/synthesis/prompt-builder.d.ts.map +1 -1
  102. package/dist/synthesis/prompt-builder.js +40 -13
  103. package/dist/synthesis/prompt-builder.js.map +1 -1
  104. package/dist/synthesis/synthesizer.d.ts.map +1 -1
  105. package/dist/synthesis/synthesizer.js +14 -2
  106. package/dist/synthesis/synthesizer.js.map +1 -1
  107. package/dist/tests/api-reranker.test.d.ts +2 -0
  108. package/dist/tests/api-reranker.test.d.ts.map +1 -0
  109. package/dist/tests/api-reranker.test.js +575 -0
  110. package/dist/tests/api-reranker.test.js.map +1 -0
  111. package/dist/tests/bm25.test.d.ts +2 -0
  112. package/dist/tests/bm25.test.d.ts.map +1 -0
  113. package/dist/tests/bm25.test.js +340 -0
  114. package/dist/tests/bm25.test.js.map +1 -0
  115. package/dist/tests/chunking/file-grouper.test.d.ts +2 -0
  116. package/dist/tests/chunking/file-grouper.test.d.ts.map +1 -0
  117. package/dist/tests/chunking/file-grouper.test.js +495 -0
  118. package/dist/tests/chunking/file-grouper.test.js.map +1 -0
  119. package/dist/tests/chunking/semantic-chunker.test.d.ts +2 -0
  120. package/dist/tests/chunking/semantic-chunker.test.d.ts.map +1 -0
  121. package/dist/tests/chunking/semantic-chunker.test.js +509 -0
  122. package/dist/tests/chunking/semantic-chunker.test.js.map +1 -0
  123. package/dist/tests/chunking/token-counter.test.d.ts +2 -0
  124. package/dist/tests/chunking/token-counter.test.d.ts.map +1 -0
  125. package/dist/tests/chunking/token-counter.test.js +441 -0
  126. package/dist/tests/chunking/token-counter.test.js.map +1 -0
  127. package/dist/tests/cli/ask-cmd.test.d.ts +2 -0
  128. package/dist/tests/cli/ask-cmd.test.d.ts.map +1 -0
  129. package/dist/tests/cli/ask-cmd.test.js +152 -0
  130. package/dist/tests/cli/ask-cmd.test.js.map +1 -0
  131. package/dist/tests/cli/chat-cmd.test.d.ts +2 -0
  132. package/dist/tests/cli/chat-cmd.test.d.ts.map +1 -0
  133. package/dist/tests/cli/chat-cmd.test.js +118 -0
  134. package/dist/tests/cli/chat-cmd.test.js.map +1 -0
  135. package/dist/tests/cli/config-cmd.test.d.ts +2 -0
  136. package/dist/tests/cli/config-cmd.test.d.ts.map +1 -0
  137. package/dist/tests/cli/config-cmd.test.js +226 -0
  138. package/dist/tests/cli/config-cmd.test.js.map +1 -0
  139. package/dist/tests/cli/context.test.d.ts +2 -0
  140. package/dist/tests/cli/context.test.d.ts.map +1 -0
  141. package/dist/tests/cli/context.test.js +158 -0
  142. package/dist/tests/cli/context.test.js.map +1 -0
  143. package/dist/tests/cli/index-cmd.test.d.ts +2 -0
  144. package/dist/tests/cli/index-cmd.test.d.ts.map +1 -0
  145. package/dist/tests/cli/index-cmd.test.js +89 -0
  146. package/dist/tests/cli/index-cmd.test.js.map +1 -0
  147. package/dist/tests/cli/index.test.d.ts +2 -0
  148. package/dist/tests/cli/index.test.d.ts.map +1 -0
  149. package/dist/tests/cli/index.test.js +167 -0
  150. package/dist/tests/cli/index.test.js.map +1 -0
  151. package/dist/tests/cli/info-cmd.test.d.ts +2 -0
  152. package/dist/tests/cli/info-cmd.test.d.ts.map +1 -0
  153. package/dist/tests/cli/info-cmd.test.js +47 -0
  154. package/dist/tests/cli/info-cmd.test.js.map +1 -0
  155. package/dist/tests/cli/interactive-config.test.d.ts +2 -0
  156. package/dist/tests/cli/interactive-config.test.d.ts.map +1 -0
  157. package/dist/tests/cli/interactive-config.test.js +30 -0
  158. package/dist/tests/cli/interactive-config.test.js.map +1 -0
  159. package/dist/tests/cli/mcp-cmd.test.d.ts +2 -0
  160. package/dist/tests/cli/mcp-cmd.test.d.ts.map +1 -0
  161. package/dist/tests/cli/mcp-cmd.test.js +47 -0
  162. package/dist/tests/cli/mcp-cmd.test.js.map +1 -0
  163. package/dist/tests/cli/search-cmd.test.d.ts +2 -0
  164. package/dist/tests/cli/search-cmd.test.d.ts.map +1 -0
  165. package/dist/tests/cli/search-cmd.test.js +120 -0
  166. package/dist/tests/cli/search-cmd.test.js.map +1 -0
  167. package/dist/tests/cli/search-with-code-cmd.test.d.ts +2 -0
  168. package/dist/tests/cli/search-with-code-cmd.test.d.ts.map +1 -0
  169. package/dist/tests/cli/search-with-code-cmd.test.js +140 -0
  170. package/dist/tests/cli/search-with-code-cmd.test.js.map +1 -0
  171. package/dist/tests/cli/update-cmd.test.d.ts +2 -0
  172. package/dist/tests/cli/update-cmd.test.d.ts.map +1 -0
  173. package/dist/tests/cli/update-cmd.test.js +75 -0
  174. package/dist/tests/cli/update-cmd.test.js.map +1 -0
  175. package/dist/tests/cli/utils.test.d.ts +2 -0
  176. package/dist/tests/cli/utils.test.d.ts.map +1 -0
  177. package/dist/tests/cli/utils.test.js +119 -0
  178. package/dist/tests/cli/utils.test.js.map +1 -0
  179. package/dist/tests/cli/watch-cmd.test.d.ts +2 -0
  180. package/dist/tests/cli/watch-cmd.test.d.ts.map +1 -0
  181. package/dist/tests/cli/watch-cmd.test.js +84 -0
  182. package/dist/tests/cli/watch-cmd.test.js.map +1 -0
  183. package/dist/tests/cli-ui.test.d.ts +2 -0
  184. package/dist/tests/cli-ui.test.d.ts.map +1 -0
  185. package/dist/tests/cli-ui.test.js +608 -0
  186. package/dist/tests/cli-ui.test.js.map +1 -0
  187. package/dist/tests/codemap-io.test.d.ts +2 -0
  188. package/dist/tests/codemap-io.test.d.ts.map +1 -0
  189. package/dist/tests/codemap-io.test.js +992 -0
  190. package/dist/tests/codemap-io.test.js.map +1 -0
  191. package/dist/tests/config/apply-env.test.d.ts +2 -0
  192. package/dist/tests/config/apply-env.test.d.ts.map +1 -0
  193. package/dist/tests/config/apply-env.test.js +717 -0
  194. package/dist/tests/config/apply-env.test.js.map +1 -0
  195. package/dist/tests/config/constants.test.d.ts +2 -0
  196. package/dist/tests/config/constants.test.d.ts.map +1 -0
  197. package/dist/tests/config/constants.test.js +406 -0
  198. package/dist/tests/config/constants.test.js.map +1 -0
  199. package/dist/tests/config/loader.test.d.ts +2 -0
  200. package/dist/tests/config/loader.test.d.ts.map +1 -0
  201. package/dist/tests/config/loader.test.js +716 -0
  202. package/dist/tests/config/loader.test.js.map +1 -0
  203. package/dist/tests/config/resolver.test.d.ts +2 -0
  204. package/dist/tests/config/resolver.test.d.ts.map +1 -0
  205. package/dist/tests/config/resolver.test.js +402 -0
  206. package/dist/tests/config/resolver.test.js.map +1 -0
  207. package/dist/tests/config/types.test.d.ts +2 -0
  208. package/dist/tests/config/types.test.d.ts.map +1 -0
  209. package/dist/tests/config/types.test.js +460 -0
  210. package/dist/tests/config/types.test.js.map +1 -0
  211. package/dist/tests/context-packs.test.d.ts +2 -0
  212. package/dist/tests/context-packs.test.d.ts.map +1 -0
  213. package/dist/tests/context-packs.test.js +826 -0
  214. package/dist/tests/context-packs.test.js.map +1 -0
  215. package/dist/tests/conversational-synthesizer.test.d.ts +2 -0
  216. package/dist/tests/conversational-synthesizer.test.d.ts.map +1 -0
  217. package/dist/tests/conversational-synthesizer.test.js +595 -0
  218. package/dist/tests/conversational-synthesizer.test.js.map +1 -0
  219. package/dist/tests/database.test.d.ts +2 -0
  220. package/dist/tests/database.test.d.ts.map +1 -0
  221. package/dist/tests/database.test.js +965 -0
  222. package/dist/tests/database.test.js.map +1 -0
  223. package/dist/tests/encrypted-chunks.test.d.ts +2 -0
  224. package/dist/tests/encrypted-chunks.test.d.ts.map +1 -0
  225. package/dist/tests/encrypted-chunks.test.js +1470 -0
  226. package/dist/tests/encrypted-chunks.test.js.map +1 -0
  227. package/dist/tests/hybrid.test.d.ts +2 -0
  228. package/dist/tests/hybrid.test.d.ts.map +1 -0
  229. package/dist/tests/hybrid.test.js +456 -0
  230. package/dist/tests/hybrid.test.js.map +1 -0
  231. package/dist/tests/indexer/ChangeQueue.test.d.ts +12 -0
  232. package/dist/tests/indexer/ChangeQueue.test.d.ts.map +1 -0
  233. package/dist/tests/indexer/ChangeQueue.test.js +441 -0
  234. package/dist/tests/indexer/ChangeQueue.test.js.map +1 -0
  235. package/dist/tests/indexer/ProviderManager.test.d.ts +12 -0
  236. package/dist/tests/indexer/ProviderManager.test.d.ts.map +1 -0
  237. package/dist/tests/indexer/ProviderManager.test.js +290 -0
  238. package/dist/tests/indexer/ProviderManager.test.js.map +1 -0
  239. package/dist/tests/indexer/WatchService.test.d.ts +14 -0
  240. package/dist/tests/indexer/WatchService.test.d.ts.map +1 -0
  241. package/dist/tests/indexer/WatchService.test.js +667 -0
  242. package/dist/tests/indexer/WatchService.test.js.map +1 -0
  243. package/dist/tests/indexer/merkle.test.d.ts +11 -0
  244. package/dist/tests/indexer/merkle.test.d.ts.map +1 -0
  245. package/dist/tests/indexer/merkle.test.js +497 -0
  246. package/dist/tests/indexer/merkle.test.js.map +1 -0
  247. package/dist/tests/indexer/update.test.d.ts +10 -0
  248. package/dist/tests/indexer/update.test.d.ts.map +1 -0
  249. package/dist/tests/indexer/update.test.js +317 -0
  250. package/dist/tests/indexer/update.test.js.map +1 -0
  251. package/dist/tests/indexer/watch.test.d.ts +8 -0
  252. package/dist/tests/indexer/watch.test.d.ts.map +1 -0
  253. package/dist/tests/indexer/watch.test.js +95 -0
  254. package/dist/tests/indexer/watch.test.js.map +1 -0
  255. package/dist/tests/integration/index-search.integration.test.js +1 -0
  256. package/dist/tests/integration/index-search.integration.test.js.map +1 -1
  257. package/dist/tests/languages.test.d.ts +2 -0
  258. package/dist/tests/languages.test.d.ts.map +1 -0
  259. package/dist/tests/languages.test.js +575 -0
  260. package/dist/tests/languages.test.js.map +1 -0
  261. package/dist/tests/logger-redaction.test.d.ts +2 -0
  262. package/dist/tests/logger-redaction.test.d.ts.map +1 -0
  263. package/dist/tests/logger-redaction.test.js +48 -0
  264. package/dist/tests/logger-redaction.test.js.map +1 -0
  265. package/dist/tests/logger.test.d.ts +2 -0
  266. package/dist/tests/logger.test.d.ts.map +1 -0
  267. package/dist/tests/logger.test.js +468 -0
  268. package/dist/tests/logger.test.js.map +1 -0
  269. package/dist/tests/markdown-formatter.test.d.ts +2 -0
  270. package/dist/tests/markdown-formatter.test.d.ts.map +1 -0
  271. package/dist/tests/markdown-formatter.test.js +453 -0
  272. package/dist/tests/markdown-formatter.test.js.map +1 -0
  273. package/dist/tests/mcp/tools/use-context-pack.test.d.ts +7 -0
  274. package/dist/tests/mcp/tools/use-context-pack.test.d.ts.map +1 -0
  275. package/dist/tests/mcp/tools/use-context-pack.test.js +505 -0
  276. package/dist/tests/mcp/tools/use-context-pack.test.js.map +1 -0
  277. package/dist/tests/mutex.test.d.ts +2 -0
  278. package/dist/tests/mutex.test.d.ts.map +1 -0
  279. package/dist/tests/mutex.test.js +489 -0
  280. package/dist/tests/mutex.test.js.map +1 -0
  281. package/dist/tests/path-helpers.test.d.ts +2 -0
  282. package/dist/tests/path-helpers.test.d.ts.map +1 -0
  283. package/dist/tests/path-helpers.test.js +332 -0
  284. package/dist/tests/path-helpers.test.js.map +1 -0
  285. package/dist/tests/prompt-builder.test.d.ts +2 -0
  286. package/dist/tests/prompt-builder.test.d.ts.map +1 -0
  287. package/dist/tests/prompt-builder.test.js +417 -0
  288. package/dist/tests/prompt-builder.test.js.map +1 -0
  289. package/dist/tests/providers/base.test.d.ts +2 -0
  290. package/dist/tests/providers/base.test.d.ts.map +1 -0
  291. package/dist/tests/providers/base.test.js +299 -0
  292. package/dist/tests/providers/base.test.js.map +1 -0
  293. package/dist/tests/providers/chat-llm.test.d.ts +2 -0
  294. package/dist/tests/providers/chat-llm.test.d.ts.map +1 -0
  295. package/dist/tests/providers/chat-llm.test.js +435 -0
  296. package/dist/tests/providers/chat-llm.test.js.map +1 -0
  297. package/dist/tests/providers/index.test.d.ts +2 -0
  298. package/dist/tests/providers/index.test.d.ts.map +1 -0
  299. package/dist/tests/providers/index.test.js +204 -0
  300. package/dist/tests/providers/index.test.js.map +1 -0
  301. package/dist/tests/providers/mock.test.d.ts +2 -0
  302. package/dist/tests/providers/mock.test.d.ts.map +1 -0
  303. package/dist/tests/providers/mock.test.js +225 -0
  304. package/dist/tests/providers/mock.test.js.map +1 -0
  305. package/dist/tests/providers/openai.test.d.ts +2 -0
  306. package/dist/tests/providers/openai.test.d.ts.map +1 -0
  307. package/dist/tests/providers/openai.test.js +408 -0
  308. package/dist/tests/providers/openai.test.js.map +1 -0
  309. package/dist/tests/providers/token-counter.test.d.ts +2 -0
  310. package/dist/tests/providers/token-counter.test.d.ts.map +1 -0
  311. package/dist/tests/providers/token-counter.test.js +247 -0
  312. package/dist/tests/providers/token-counter.test.js.map +1 -0
  313. package/dist/tests/rate-limiter.test.js +392 -1
  314. package/dist/tests/rate-limiter.test.js.map +1 -1
  315. package/dist/tests/scope.test.d.ts +2 -0
  316. package/dist/tests/scope.test.d.ts.map +1 -0
  317. package/dist/tests/scope.test.js +529 -0
  318. package/dist/tests/scope.test.js.map +1 -0
  319. package/dist/tests/simple-lru.test.js +377 -0
  320. package/dist/tests/simple-lru.test.js.map +1 -1
  321. package/dist/tests/symbol-boost.test.js +730 -10
  322. package/dist/tests/symbol-boost.test.js.map +1 -1
  323. package/dist/tests/symbols-extract.test.d.ts +2 -0
  324. package/dist/tests/symbols-extract.test.d.ts.map +1 -0
  325. package/dist/tests/symbols-extract.test.js +536 -0
  326. package/dist/tests/symbols-extract.test.js.map +1 -0
  327. package/dist/tests/symbols-graph.test.d.ts +2 -0
  328. package/dist/tests/symbols-graph.test.d.ts.map +1 -0
  329. package/dist/tests/symbols-graph.test.js +656 -0
  330. package/dist/tests/symbols-graph.test.js.map +1 -0
  331. package/dist/tests/synthesizer.test.d.ts +2 -0
  332. package/dist/tests/synthesizer.test.d.ts.map +1 -0
  333. package/dist/tests/synthesizer.test.js +381 -0
  334. package/dist/tests/synthesizer.test.js.map +1 -0
  335. package/dist/types/context-pack.d.ts +3 -3
  336. package/dist/utils/logger.d.ts +5 -1
  337. package/dist/utils/logger.d.ts.map +1 -1
  338. package/dist/utils/logger.js +149 -4
  339. package/dist/utils/logger.js.map +1 -1
  340. package/dist/utils/mutex.d.ts +7 -2
  341. package/dist/utils/mutex.d.ts.map +1 -1
  342. package/dist/utils/mutex.js +31 -7
  343. package/dist/utils/mutex.js.map +1 -1
  344. package/dist/utils/path-helpers.d.ts.map +1 -1
  345. package/dist/utils/path-helpers.js +5 -2
  346. package/dist/utils/path-helpers.js.map +1 -1
  347. package/dist/utils/simple-lru.d.ts +6 -0
  348. package/dist/utils/simple-lru.d.ts.map +1 -1
  349. package/dist/utils/simple-lru.js +26 -0
  350. package/dist/utils/simple-lru.js.map +1 -1
  351. package/package.json +1 -1
@@ -0,0 +1,441 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { analyzeCodeSize, batchAnalyzeCodeSize, getTokenCountStats, resetTokenCountStats, clearTokenCache } from '../../chunking/token-counter.js';
4
+ // Size limits for testing
5
+ const standardLimits = {
6
+ min: 50,
7
+ max: 500,
8
+ optimal: 300
9
+ };
10
+ const smallLimits = {
11
+ min: 10,
12
+ max: 100,
13
+ optimal: 50
14
+ };
15
+ // Simple synchronous token counter (1 char = 1 token for simplicity)
16
+ const syncTokenCounter = (text) => text.length;
17
+ // Async token counter
18
+ const asyncTokenCounter = async (text) => {
19
+ await new Promise((resolve) => setTimeout(resolve, 1));
20
+ return text.length;
21
+ };
22
+ // Token counter that returns 4 chars per token
23
+ const standardTokenCounter = (text) => Math.ceil(text.length / 4);
24
+ // Reset stats before each test
25
+ test.beforeEach(() => {
26
+ resetTokenCountStats();
27
+ clearTokenCache();
28
+ });
29
+ // -------------------------------------------------------------------
30
+ // Tests for analyzeCodeSize
31
+ // -------------------------------------------------------------------
32
+ test('analyzeCodeSize returns too_small for code below min threshold', async () => {
33
+ const code = 'x'.repeat(20); // Below min of 50
34
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
35
+ assert.equal(result.decision, 'too_small');
36
+ assert.equal(result.size, 20);
37
+ assert.equal(result.method, 'tokenized');
38
+ });
39
+ test('analyzeCodeSize returns too_large for code above max threshold', async () => {
40
+ const code = 'x'.repeat(600); // Above max of 500
41
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
42
+ assert.equal(result.decision, 'too_large');
43
+ assert.equal(result.size, 600);
44
+ assert.equal(result.method, 'tokenized');
45
+ });
46
+ test('analyzeCodeSize returns optimal for code within optimal range', async () => {
47
+ const code = 'x'.repeat(250); // Below optimal of 300
48
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
49
+ assert.equal(result.decision, 'optimal');
50
+ assert.equal(result.size, 250);
51
+ });
52
+ test('analyzeCodeSize returns needs_tokenization for code between optimal and max', async () => {
53
+ const code = 'x'.repeat(400); // Above optimal (300) but below max (500)
54
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
55
+ assert.equal(result.decision, 'needs_tokenization');
56
+ assert.equal(result.size, 400);
57
+ });
58
+ test('analyzeCodeSize uses char estimate for too_large with allowEstimateForSkip', async () => {
59
+ // With standard token counter (4 chars = 1 token), we need a lot of chars
60
+ // to exceed the max limit estimate (max * 1.2 = 600 tokens = 2400 chars)
61
+ const code = 'x'.repeat(3000); // Should estimate to ~750 tokens (3000/4)
62
+ const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter, true);
63
+ // When allowEstimateForSkip is true and estimate says too_large, skip tokenization
64
+ assert.equal(result.decision, 'too_large');
65
+ assert.equal(result.method, 'char_estimate');
66
+ });
67
+ test('analyzeCodeSize does not skip tokenization without allowEstimateForSkip', async () => {
68
+ const code = 'x'.repeat(3000);
69
+ const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter, false);
70
+ // Should still tokenize
71
+ assert.equal(result.method, 'tokenized');
72
+ });
73
+ test('analyzeCodeSize works with async token counter', async () => {
74
+ const code = 'x'.repeat(100);
75
+ const result = await analyzeCodeSize(code, standardLimits, asyncTokenCounter);
76
+ assert.equal(result.size, 100);
77
+ assert.equal(result.method, 'tokenized');
78
+ });
79
+ test('analyzeCodeSize uses cache for repeated calls', async () => {
80
+ const code = 'exact same code';
81
+ // First call
82
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
83
+ // Second call with same code should use cache
84
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
85
+ const stats = getTokenCountStats();
86
+ assert.ok(stats.cacheHits >= 1, 'Should have cache hits');
87
+ });
88
+ test('analyzeCodeSize falls back to estimate on tokenization error', async () => {
89
+ const code = 'test code';
90
+ const failingCounter = () => {
91
+ throw new Error('Tokenization failed');
92
+ };
93
+ const result = await analyzeCodeSize(code, standardLimits, failingCounter);
94
+ // Should fall back to character estimation
95
+ // Estimate: ceil(9/4) = 3 tokens, which is too_small
96
+ assert.ok(result.size > 0);
97
+ });
98
+ test('analyzeCodeSize handles empty code', async () => {
99
+ const result = await analyzeCodeSize('', standardLimits, syncTokenCounter);
100
+ assert.equal(result.size, 0);
101
+ assert.equal(result.decision, 'too_small');
102
+ });
103
+ test('analyzeCodeSize handles boundary values exactly at min', async () => {
104
+ const code = 'x'.repeat(50); // Exactly at min
105
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
106
+ // At or above min but at or below optimal = optimal
107
+ assert.equal(result.decision, 'optimal');
108
+ });
109
+ test('analyzeCodeSize handles boundary values exactly at max', async () => {
110
+ const code = 'x'.repeat(500); // Exactly at max
111
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
112
+ // Above optimal (300) but at max (500) = needs_tokenization
113
+ assert.equal(result.decision, 'needs_tokenization');
114
+ });
115
+ test('analyzeCodeSize handles boundary values exactly at optimal', async () => {
116
+ const code = 'x'.repeat(300); // Exactly at optimal
117
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
118
+ assert.equal(result.decision, 'optimal');
119
+ });
120
+ test('analyzeCodeSize handles one character above max', async () => {
121
+ const code = 'x'.repeat(501);
122
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
123
+ assert.equal(result.decision, 'too_large');
124
+ });
125
+ test('analyzeCodeSize handles one character below min', async () => {
126
+ const code = 'x'.repeat(49);
127
+ const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
128
+ assert.equal(result.decision, 'too_small');
129
+ });
130
+ // -------------------------------------------------------------------
131
+ // Tests for batchAnalyzeCodeSize
132
+ // -------------------------------------------------------------------
133
+ test('batchAnalyzeCodeSize analyzes multiple code snippets', async () => {
134
+ const snippets = [
135
+ 'x'.repeat(30), // too_small
136
+ 'x'.repeat(200), // optimal
137
+ 'x'.repeat(400), // needs_tokenization
138
+ 'x'.repeat(600) // too_large
139
+ ];
140
+ const results = await batchAnalyzeCodeSize(snippets, standardLimits, syncTokenCounter);
141
+ assert.equal(results.length, 4);
142
+ assert.equal(results[0].decision, 'too_small');
143
+ assert.equal(results[1].decision, 'optimal');
144
+ assert.equal(results[2].decision, 'needs_tokenization');
145
+ assert.equal(results[3].decision, 'too_large');
146
+ });
147
+ test('batchAnalyzeCodeSize uses char estimate for large items with allowEstimateForSkip', async () => {
148
+ const snippets = [
149
+ 'x'.repeat(100), // Normal
150
+ 'x'.repeat(3000), // Very large, should use estimate
151
+ 'x'.repeat(200) // Normal
152
+ ];
153
+ const results = await batchAnalyzeCodeSize(snippets, standardLimits, standardTokenCounter, true);
154
+ assert.equal(results.length, 3);
155
+ // The very large one should use char_estimate
156
+ const largeResult = results[1];
157
+ assert.equal(largeResult.method, 'char_estimate');
158
+ assert.equal(largeResult.decision, 'too_large');
159
+ });
160
+ test('batchAnalyzeCodeSize returns results in correct order', async () => {
161
+ const snippets = ['a', 'bb', 'ccc', 'dddd', 'eeeee'];
162
+ const results = await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
163
+ assert.equal(results.length, 5);
164
+ assert.equal(results[0].size, 1);
165
+ assert.equal(results[1].size, 2);
166
+ assert.equal(results[2].size, 3);
167
+ assert.equal(results[3].size, 4);
168
+ assert.equal(results[4].size, 5);
169
+ });
170
+ test('batchAnalyzeCodeSize uses cache for subsequent calls', async () => {
171
+ // First batch call
172
+ await batchAnalyzeCodeSize(['test1', 'test2', 'test3'], standardLimits, syncTokenCounter);
173
+ // Reset stats
174
+ resetTokenCountStats();
175
+ // Second batch with same items should hit cache
176
+ await batchAnalyzeCodeSize(['test1', 'test2', 'test3'], standardLimits, syncTokenCounter);
177
+ const stats = getTokenCountStats();
178
+ // All items should be cache hits on second call
179
+ assert.ok(stats.cacheHits >= 3, 'Should have cache hits on second batch call');
180
+ });
181
+ test('batchAnalyzeCodeSize handles empty array', async () => {
182
+ const results = await batchAnalyzeCodeSize([], standardLimits, syncTokenCounter);
183
+ assert.deepEqual(results, []);
184
+ });
185
+ test('batchAnalyzeCodeSize handles single item', async () => {
186
+ const results = await batchAnalyzeCodeSize(['test'], smallLimits, syncTokenCounter);
187
+ assert.equal(results.length, 1);
188
+ });
189
+ test('batchAnalyzeCodeSize works with async token counter', async () => {
190
+ const snippets = ['abc', 'defgh', 'ijklmno'];
191
+ const results = await batchAnalyzeCodeSize(snippets, smallLimits, asyncTokenCounter);
192
+ assert.equal(results.length, 3);
193
+ assert.equal(results[0].size, 3);
194
+ assert.equal(results[1].size, 5);
195
+ assert.equal(results[2].size, 7);
196
+ });
197
+ test('batchAnalyzeCodeSize increments stats correctly', async () => {
198
+ resetTokenCountStats();
199
+ const snippets = ['a', 'b', 'c'];
200
+ await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
201
+ const stats = getTokenCountStats();
202
+ assert.equal(stats.batchTokenizations, 1);
203
+ assert.equal(stats.actualTokenizations, 3);
204
+ });
205
+ test('batchAnalyzeCodeSize handles mixed cached and uncached items', async () => {
206
+ // Pre-cache one item
207
+ await analyzeCodeSize('cached item', standardLimits, syncTokenCounter);
208
+ // Now batch with cached and new items
209
+ const snippets = ['cached item', 'new item 1', 'new item 2'];
210
+ const results = await batchAnalyzeCodeSize(snippets, standardLimits, syncTokenCounter);
211
+ assert.equal(results.length, 3);
212
+ const stats = getTokenCountStats();
213
+ assert.ok(stats.cacheHits >= 1);
214
+ });
215
+ // -------------------------------------------------------------------
216
+ // Tests for getTokenCountStats
217
+ // -------------------------------------------------------------------
218
+ test('getTokenCountStats returns initial zero values after reset', () => {
219
+ resetTokenCountStats();
220
+ const stats = getTokenCountStats();
221
+ assert.equal(stats.totalRequests, 0);
222
+ assert.equal(stats.cacheHits, 0);
223
+ assert.equal(stats.charFilterSkips, 0);
224
+ assert.equal(stats.actualTokenizations, 0);
225
+ assert.equal(stats.batchTokenizations, 0);
226
+ assert.equal(stats.cacheHitRate, '0%');
227
+ assert.equal(stats.charFilterRate, '0%');
228
+ assert.equal(stats.tokenizationRate, '0%');
229
+ });
230
+ test('getTokenCountStats tracks total requests including internal calls', async () => {
231
+ await analyzeCodeSize('test1', standardLimits, syncTokenCounter);
232
+ await analyzeCodeSize('test2', standardLimits, syncTokenCounter);
233
+ await analyzeCodeSize('test3', standardLimits, syncTokenCounter);
234
+ const stats = getTokenCountStats();
235
+ // Implementation increments totalRequests in both analyzeCodeSize and countTokensWithCache
236
+ // So each call increments by 2: once at entry, once in the cache function
237
+ assert.ok(stats.totalRequests >= 3, 'Should track at least 3 requests');
238
+ });
239
+ test('getTokenCountStats calculates cache hit rate', async () => {
240
+ const code = 'repeated code';
241
+ // First call (miss)
242
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
243
+ // Second call (hit)
244
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
245
+ // Third call (hit)
246
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
247
+ const stats = getTokenCountStats();
248
+ // Cache hits occur in countTokensWithCache for the 2nd and 3rd calls
249
+ assert.ok(stats.cacheHits >= 2, 'Should have at least 2 cache hits');
250
+ });
251
+ test('getTokenCountStats calculates char filter rate', async () => {
252
+ // Need to trigger char filter skips
253
+ const veryLargeCode = 'x'.repeat(10000);
254
+ await analyzeCodeSize(veryLargeCode, standardLimits, standardTokenCounter, true);
255
+ await analyzeCodeSize(veryLargeCode, standardLimits, standardTokenCounter, true);
256
+ const stats = getTokenCountStats();
257
+ // All should use char filter
258
+ assert.ok(parseFloat(stats.charFilterRate) > 0);
259
+ });
260
+ test('getTokenCountStats calculates tokenization rate', async () => {
261
+ await analyzeCodeSize('test1', standardLimits, syncTokenCounter);
262
+ await analyzeCodeSize('test2', standardLimits, syncTokenCounter);
263
+ const stats = getTokenCountStats();
264
+ // Both unique, so actualTokenizations should be 2
265
+ assert.equal(stats.actualTokenizations, 2);
266
+ });
267
+ test('getTokenCountStats tracks batch tokenizations', async () => {
268
+ await batchAnalyzeCodeSize(['a', 'b', 'c'], smallLimits, syncTokenCounter);
269
+ await batchAnalyzeCodeSize(['d', 'e'], smallLimits, syncTokenCounter);
270
+ const stats = getTokenCountStats();
271
+ assert.equal(stats.batchTokenizations, 2);
272
+ });
273
+ // -------------------------------------------------------------------
274
+ // Tests for resetTokenCountStats
275
+ // -------------------------------------------------------------------
276
+ test('resetTokenCountStats clears all counters', async () => {
277
+ // Build up some stats
278
+ await analyzeCodeSize('test', standardLimits, syncTokenCounter);
279
+ await batchAnalyzeCodeSize(['a', 'b'], smallLimits, syncTokenCounter);
280
+ // Verify stats exist
281
+ let stats = getTokenCountStats();
282
+ assert.ok(stats.totalRequests > 0);
283
+ // Reset
284
+ resetTokenCountStats();
285
+ // Verify all cleared
286
+ stats = getTokenCountStats();
287
+ assert.equal(stats.totalRequests, 0);
288
+ assert.equal(stats.cacheHits, 0);
289
+ assert.equal(stats.charFilterSkips, 0);
290
+ assert.equal(stats.actualTokenizations, 0);
291
+ assert.equal(stats.batchTokenizations, 0);
292
+ });
293
+ // -------------------------------------------------------------------
294
+ // Tests for clearTokenCache
295
+ // -------------------------------------------------------------------
296
+ test('clearTokenCache removes cached values', async () => {
297
+ const code = 'cached content';
298
+ // First call caches
299
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
300
+ // Clear cache
301
+ clearTokenCache();
302
+ // Second call should not be a cache hit
303
+ resetTokenCountStats();
304
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
305
+ const stats = getTokenCountStats();
306
+ assert.equal(stats.cacheHits, 0, 'Should have no cache hits after clear');
307
+ });
308
+ test('clearTokenCache allows re-caching', async () => {
309
+ const code = 'test code';
310
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
311
+ clearTokenCache();
312
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
313
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
314
+ // After clear and re-cache, second call should hit
315
+ const stats = getTokenCountStats();
316
+ assert.ok(stats.cacheHits >= 1);
317
+ });
318
+ // -------------------------------------------------------------------
319
+ // Tests for pre-filtering logic
320
+ // -------------------------------------------------------------------
321
+ test('pre-filter correctly identifies too_small estimate', async () => {
322
+ // With standard token counter (4 chars = 1 token)
323
+ // min * 0.8 = 50 * 0.8 = 40 tokens = 160 chars
324
+ // Code of 100 chars = ~25 tokens, which is below minEstimate
325
+ const code = 'x'.repeat(100);
326
+ const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter);
327
+ // Even though pre-filter might say too_small, we still tokenize
328
+ // Actual: 100/4 = 25 tokens < 50 min = too_small
329
+ assert.equal(result.decision, 'too_small');
330
+ });
331
+ test('pre-filter correctly identifies optimal estimate', async () => {
332
+ // optimalLow = 300 * 0.8 = 240 tokens = 960 chars
333
+ // optimalHigh = 300 * 1.2 = 360 tokens = 1440 chars
334
+ // Code of 1200 chars = ~300 tokens
335
+ const code = 'x'.repeat(1200);
336
+ const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter, true);
337
+ // Estimated ~300 tokens, which is in optimal range
338
+ // Still tokenizes because we don't skip optimal
339
+ assert.equal(result.method, 'tokenized');
340
+ });
341
+ // -------------------------------------------------------------------
342
+ // Edge cases and error handling
343
+ // -------------------------------------------------------------------
344
+ test('handles unicode characters correctly', async () => {
345
+ const unicodeCode = 'const emoji = "\\uD83D\\uDE00\\uD83C\\uDF89"; // party';
346
+ const result = await analyzeCodeSize(unicodeCode, standardLimits, syncTokenCounter);
347
+ assert.ok(result.size > 0);
348
+ });
349
+ test('handles newlines and whitespace', async () => {
350
+ const code = 'line1\n line2\n\t\tline3\n';
351
+ const result = await analyzeCodeSize(code, smallLimits, syncTokenCounter);
352
+ assert.equal(result.size, code.length);
353
+ });
354
+ test('handles very long single-line code', async () => {
355
+ const longLine = 'x'.repeat(100000);
356
+ const result = await analyzeCodeSize(longLine, standardLimits, standardTokenCounter, true);
357
+ assert.equal(result.decision, 'too_large');
358
+ });
359
+ test('batch handles all empty strings', async () => {
360
+ const snippets = ['', '', ''];
361
+ const results = await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
362
+ assert.equal(results.length, 3);
363
+ results.forEach((r) => {
364
+ assert.equal(r.size, 0);
365
+ assert.equal(r.decision, 'too_small');
366
+ });
367
+ });
368
+ test('concurrent analyze calls complete correctly', async () => {
369
+ const code = 'shared code for concurrency test';
370
+ // Run multiple concurrent calls
371
+ const promises = Array.from({ length: 10 }, () => analyzeCodeSize(code, standardLimits, asyncTokenCounter));
372
+ const results = await Promise.all(promises);
373
+ // All should return same result
374
+ results.forEach((r) => {
375
+ assert.equal(r.size, code.length);
376
+ });
377
+ });
378
+ test('stats percentages format correctly', async () => {
379
+ // Create specific ratio
380
+ const code = 'test';
381
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
382
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
383
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
384
+ const stats = getTokenCountStats();
385
+ // Verify percentage format (ends with %)
386
+ assert.ok(stats.cacheHitRate.endsWith('%'));
387
+ assert.ok(stats.charFilterRate.endsWith('%'));
388
+ assert.ok(stats.tokenizationRate.endsWith('%'));
389
+ // Verify percentages are numeric
390
+ const cacheRate = parseFloat(stats.cacheHitRate);
391
+ assert.ok(!isNaN(cacheRate));
392
+ assert.ok(cacheRate >= 0 && cacheRate <= 100);
393
+ });
394
+ test('handles token counter returning zero', async () => {
395
+ const zeroCounter = () => 0;
396
+ const result = await analyzeCodeSize('test code', standardLimits, zeroCounter);
397
+ assert.equal(result.size, 0);
398
+ assert.equal(result.decision, 'too_small');
399
+ });
400
+ test('handles token counter returning very large numbers', async () => {
401
+ const largeCounter = () => 1000000;
402
+ const result = await analyzeCodeSize('tiny', standardLimits, largeCounter);
403
+ assert.equal(result.size, 1000000);
404
+ assert.equal(result.decision, 'too_large');
405
+ });
406
+ test('batch maintains correct index mapping with mixed cache hits', async () => {
407
+ // Pre-cache indices 1 and 3
408
+ await analyzeCodeSize('snippet_b', smallLimits, syncTokenCounter);
409
+ await analyzeCodeSize('snippet_d', smallLimits, syncTokenCounter);
410
+ resetTokenCountStats();
411
+ const snippets = ['snippet_a', 'snippet_b', 'snippet_c', 'snippet_d', 'snippet_e'];
412
+ const results = await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
413
+ // Verify correct sizes at correct indices
414
+ assert.equal(results[0].size, 9); // snippet_a
415
+ assert.equal(results[1].size, 9); // snippet_b (cached)
416
+ assert.equal(results[2].size, 9); // snippet_c
417
+ assert.equal(results[3].size, 9); // snippet_d (cached)
418
+ assert.equal(results[4].size, 9); // snippet_e
419
+ const stats = getTokenCountStats();
420
+ assert.equal(stats.cacheHits, 2);
421
+ assert.equal(stats.actualTokenizations, 3);
422
+ });
423
+ test('analyzeCodeSize increments totalRequests even with cache hits', async () => {
424
+ const code = 'test';
425
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
426
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
427
+ await analyzeCodeSize(code, standardLimits, syncTokenCounter);
428
+ const stats = getTokenCountStats();
429
+ // Note: analyzeCodeSize increments totalRequests at start
430
+ // The implementation may double-count due to countTokensWithCache also incrementing
431
+ // This test verifies the expected behavior
432
+ assert.ok(stats.totalRequests >= 3);
433
+ });
434
+ test('pre-filter needs_tokenization triggers actual tokenization', async () => {
435
+ // Create code that falls in needs_tokenization range in pre-filter
436
+ // but still needs actual tokenization
437
+ const code = 'x'.repeat(1500); // ~375 tokens, between optimal (300) and max (500)
438
+ const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter);
439
+ assert.equal(result.method, 'tokenized');
440
+ });
441
+ //# sourceMappingURL=token-counter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.test.js","sourceRoot":"","sources":["../../../src/tests/chunking/token-counter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ask-cmd.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-cmd.test.d.ts","sourceRoot":"","sources":["../../../src/tests/cli/ask-cmd.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Unit tests for ask-cmd.ts
3
+ * Tests the ask command registration and option handling
4
+ */
5
+ import test from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { Command } from 'commander';
8
+ import { registerAskCommand } from '../../cli/commands/ask-cmd.js';
9
+ test('registerAskCommand adds ask command to program', () => {
10
+ const program = new Command();
11
+ registerAskCommand(program);
12
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
13
+ assert.ok(askCmd, 'ask command should be registered');
14
+ });
15
+ test('ask command requires question argument', () => {
16
+ const program = new Command();
17
+ registerAskCommand(program);
18
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
19
+ assert.ok(askCmd, 'ask command should exist');
20
+ // Check for required question argument
21
+ const args = askCmd.registeredArguments || [];
22
+ assert.ok(args.length >= 1, 'should have at least one argument');
23
+ if (args.length > 0) {
24
+ assert.ok(args[0].required, 'question should be required');
25
+ }
26
+ });
27
+ test('ask command has correct description', () => {
28
+ const program = new Command();
29
+ registerAskCommand(program);
30
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
31
+ assert.ok(askCmd, 'ask command should exist');
32
+ const desc = askCmd.description().toLowerCase();
33
+ assert.ok(desc.includes('question') || desc.includes('ask') || desc.includes('answer'), 'description should mention question/ask/answer');
34
+ });
35
+ test('ask command has provider option with auto default', () => {
36
+ const program = new Command();
37
+ registerAskCommand(program);
38
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
39
+ assert.ok(askCmd, 'ask command should exist');
40
+ const providerOpt = askCmd.options.find(opt => opt.long === '--provider');
41
+ assert.ok(providerOpt, 'should have --provider option');
42
+ assert.equal(providerOpt.defaultValue, 'auto', 'default should be auto');
43
+ });
44
+ test('ask command has chat-provider option with auto default', () => {
45
+ const program = new Command();
46
+ registerAskCommand(program);
47
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
48
+ assert.ok(askCmd, 'ask command should exist');
49
+ const chatProviderOpt = askCmd.options.find(opt => opt.long === '--chat-provider');
50
+ assert.ok(chatProviderOpt, 'should have --chat-provider option');
51
+ assert.equal(chatProviderOpt.defaultValue, 'auto', 'default should be auto');
52
+ });
53
+ test('ask command has max-chunks option with default 10', () => {
54
+ const program = new Command();
55
+ registerAskCommand(program);
56
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
57
+ assert.ok(askCmd, 'ask command should exist');
58
+ const maxChunksOpt = askCmd.options.find(opt => opt.long === '--max-chunks');
59
+ assert.ok(maxChunksOpt, 'should have --max-chunks option');
60
+ assert.equal(maxChunksOpt.defaultValue, '10', 'default should be 10');
61
+ });
62
+ test('ask command has short flag -k for max-chunks', () => {
63
+ const program = new Command();
64
+ registerAskCommand(program);
65
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
66
+ assert.ok(askCmd, 'ask command should exist');
67
+ const maxChunksOpt = askCmd.options.find(opt => opt.long === '--max-chunks');
68
+ assert.ok(maxChunksOpt, 'should have --max-chunks option');
69
+ assert.equal(maxChunksOpt.short, '-k', 'should have -k short flag');
70
+ });
71
+ test('ask command has temperature option with default 0.7', () => {
72
+ const program = new Command();
73
+ registerAskCommand(program);
74
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
75
+ assert.ok(askCmd, 'ask command should exist');
76
+ const tempOpt = askCmd.options.find(opt => opt.long === '--temperature');
77
+ assert.ok(tempOpt, 'should have --temperature option');
78
+ assert.equal(tempOpt.defaultValue, '0.7', 'default should be 0.7');
79
+ });
80
+ test('ask command has reranker option with default on', () => {
81
+ const program = new Command();
82
+ registerAskCommand(program);
83
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
84
+ assert.ok(askCmd, 'ask command should exist');
85
+ const rerankerOpt = askCmd.options.find(opt => opt.long === '--reranker');
86
+ assert.ok(rerankerOpt, 'should have --reranker option');
87
+ assert.equal(rerankerOpt.defaultValue, 'on', 'default should be on');
88
+ });
89
+ test('ask command has multi-query flag', () => {
90
+ const program = new Command();
91
+ registerAskCommand(program);
92
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
93
+ assert.ok(askCmd, 'ask command should exist');
94
+ const multiQueryOpt = askCmd.options.find(opt => opt.long === '--multi-query');
95
+ assert.ok(multiQueryOpt, 'should have --multi-query option');
96
+ });
97
+ test('ask command has stream flag', () => {
98
+ const program = new Command();
99
+ registerAskCommand(program);
100
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
101
+ assert.ok(askCmd, 'ask command should exist');
102
+ const streamOpt = askCmd.options.find(opt => opt.long === '--stream');
103
+ assert.ok(streamOpt, 'should have --stream option');
104
+ });
105
+ test('ask command has citations flag', () => {
106
+ const program = new Command();
107
+ registerAskCommand(program);
108
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
109
+ assert.ok(askCmd, 'ask command should exist');
110
+ const citationsOpt = askCmd.options.find(opt => opt.long === '--citations');
111
+ assert.ok(citationsOpt, 'should have --citations option');
112
+ });
113
+ test('ask command has no-metadata flag', () => {
114
+ const program = new Command();
115
+ registerAskCommand(program);
116
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
117
+ assert.ok(askCmd, 'ask command should exist');
118
+ const noMetadataOpt = askCmd.options.find(opt => opt.long === '--no-metadata');
119
+ assert.ok(noMetadataOpt, 'should have --no-metadata option');
120
+ });
121
+ test('ask command has path filtering options', () => {
122
+ const program = new Command();
123
+ registerAskCommand(program);
124
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
125
+ assert.ok(askCmd, 'ask command should exist');
126
+ const pathGlobOpt = askCmd.options.find(opt => opt.long === '--path_glob');
127
+ const tagsOpt = askCmd.options.find(opt => opt.long === '--tags');
128
+ const langOpt = askCmd.options.find(opt => opt.long === '--lang');
129
+ assert.ok(pathGlobOpt, 'should have --path_glob option');
130
+ assert.ok(tagsOpt, 'should have --tags option');
131
+ assert.ok(langOpt, 'should have --lang option');
132
+ });
133
+ test('ask command has path option with default .', () => {
134
+ const program = new Command();
135
+ registerAskCommand(program);
136
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
137
+ assert.ok(askCmd, 'ask command should exist');
138
+ const pathOpt = askCmd.options.find(opt => opt.long === '--path');
139
+ assert.ok(pathOpt, 'should have --path option');
140
+ assert.equal(pathOpt.defaultValue, '.', 'default should be .');
141
+ });
142
+ test('ask command has project and directory path aliases', () => {
143
+ const program = new Command();
144
+ registerAskCommand(program);
145
+ const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
146
+ assert.ok(askCmd, 'ask command should exist');
147
+ const projectOpt = askCmd.options.find(opt => opt.long === '--project');
148
+ const directoryOpt = askCmd.options.find(opt => opt.long === '--directory');
149
+ assert.ok(projectOpt, 'should have --project option');
150
+ assert.ok(directoryOpt, 'should have --directory option');
151
+ });
152
+ //# sourceMappingURL=ask-cmd.test.js.map