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,489 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { setTimeout as delay } from 'timers/promises';
4
+ import { Mutex, MutexTimeoutError, Semaphore } from '../utils/mutex.js';
5
+ // ============================================================================
6
+ // MutexTimeoutError Tests
7
+ // ============================================================================
8
+ test('MutexTimeoutError has correct message', () => {
9
+ const error = new MutexTimeoutError(5000);
10
+ assert.equal(error.message, 'Mutex acquire timed out after 5000ms');
11
+ assert.equal(error.name, 'MutexTimeoutError');
12
+ assert.ok(error instanceof Error);
13
+ assert.ok(error instanceof MutexTimeoutError);
14
+ });
15
+ // ============================================================================
16
+ // Mutex Basic Tests
17
+ // ============================================================================
18
+ test('Mutex is initially unlocked', () => {
19
+ const mutex = new Mutex();
20
+ assert.equal(mutex.isLocked(), false);
21
+ });
22
+ test('Mutex acquire locks the mutex', async () => {
23
+ const mutex = new Mutex();
24
+ await mutex.acquire();
25
+ assert.equal(mutex.isLocked(), true);
26
+ });
27
+ test('Mutex release unlocks the mutex', async () => {
28
+ const mutex = new Mutex();
29
+ await mutex.acquire();
30
+ mutex.release();
31
+ assert.equal(mutex.isLocked(), false);
32
+ });
33
+ test('Mutex acquire waits when already locked', async () => {
34
+ const mutex = new Mutex();
35
+ const order = [];
36
+ await mutex.acquire();
37
+ order.push(1);
38
+ const waitingAcquire = (async () => {
39
+ await mutex.acquire();
40
+ order.push(3);
41
+ mutex.release();
42
+ })();
43
+ // Small delay to ensure the waiting acquire is queued
44
+ await delay(10);
45
+ order.push(2);
46
+ mutex.release();
47
+ await waitingAcquire;
48
+ assert.deepEqual(order, [1, 2, 3]);
49
+ });
50
+ test('Mutex multiple waiters are processed in order', async () => {
51
+ const mutex = new Mutex();
52
+ const order = [];
53
+ await mutex.acquire();
54
+ const waiter1 = (async () => {
55
+ await mutex.acquire();
56
+ order.push(1);
57
+ mutex.release();
58
+ })();
59
+ const waiter2 = (async () => {
60
+ await delay(5); // Ensure waiter1 is queued first
61
+ await mutex.acquire();
62
+ order.push(2);
63
+ mutex.release();
64
+ })();
65
+ const waiter3 = (async () => {
66
+ await delay(10); // Ensure waiter2 is queued second
67
+ await mutex.acquire();
68
+ order.push(3);
69
+ mutex.release();
70
+ })();
71
+ await delay(20); // Allow all waiters to queue
72
+ mutex.release(); // Release initial lock
73
+ await Promise.all([waiter1, waiter2, waiter3]);
74
+ assert.deepEqual(order, [1, 2, 3]);
75
+ });
76
+ // ============================================================================
77
+ // Mutex Timeout Tests
78
+ // ============================================================================
79
+ test('Mutex acquire with timeout succeeds when available', async () => {
80
+ const mutex = new Mutex();
81
+ await mutex.acquire(1000);
82
+ assert.equal(mutex.isLocked(), true);
83
+ mutex.release();
84
+ });
85
+ test('Mutex acquire throws MutexTimeoutError on timeout', async () => {
86
+ const mutex = new Mutex();
87
+ await mutex.acquire();
88
+ await assert.rejects(mutex.acquire(50), (error) => {
89
+ return error instanceof MutexTimeoutError &&
90
+ error.message === 'Mutex acquire timed out after 50ms';
91
+ });
92
+ mutex.release();
93
+ });
94
+ test('Mutex timeout removes waiter from queue', async () => {
95
+ const mutex = new Mutex();
96
+ await mutex.acquire();
97
+ assert.equal(mutex.getQueueLength(), 0);
98
+ // Start a waiter that will timeout
99
+ const timeoutPromise = mutex.acquire(20);
100
+ // Wait a bit for the waiter to be queued
101
+ await delay(5);
102
+ assert.equal(mutex.getQueueLength(), 1);
103
+ // Wait for timeout
104
+ await assert.rejects(timeoutPromise, MutexTimeoutError);
105
+ // Queue should be empty after timeout
106
+ assert.equal(mutex.getQueueLength(), 0);
107
+ mutex.release();
108
+ });
109
+ test('Mutex timeout does not affect subsequent acquires', async () => {
110
+ const mutex = new Mutex();
111
+ await mutex.acquire();
112
+ // First acquire times out
113
+ const timeout1 = mutex.acquire(20);
114
+ await assert.rejects(timeout1, MutexTimeoutError);
115
+ // Second acquire should still work once released
116
+ const acquire2 = mutex.acquire();
117
+ mutex.release();
118
+ await acquire2;
119
+ assert.equal(mutex.isLocked(), true);
120
+ mutex.release();
121
+ });
122
+ test('Mutex acquire clears timeout on successful acquire', async () => {
123
+ const mutex = new Mutex();
124
+ const order = [];
125
+ await mutex.acquire();
126
+ const waiter = (async () => {
127
+ await mutex.acquire(1000); // Long timeout
128
+ order.push('acquired');
129
+ mutex.release();
130
+ })();
131
+ await delay(10);
132
+ order.push('releasing');
133
+ mutex.release();
134
+ await waiter;
135
+ assert.deepEqual(order, ['releasing', 'acquired']);
136
+ });
137
+ test('Mutex acquire with zero timeout does not timeout', async () => {
138
+ const mutex = new Mutex();
139
+ await mutex.acquire();
140
+ // timeout = 0 should not set up a timeout
141
+ const acquirePromise = mutex.acquire(0);
142
+ await delay(50);
143
+ mutex.release();
144
+ await acquirePromise;
145
+ assert.equal(mutex.isLocked(), true);
146
+ mutex.release();
147
+ });
148
+ test('Mutex acquire with negative timeout does not timeout', async () => {
149
+ const mutex = new Mutex();
150
+ await mutex.acquire();
151
+ // timeout = -1 should not set up a timeout
152
+ const acquirePromise = mutex.acquire(-1);
153
+ await delay(50);
154
+ mutex.release();
155
+ await acquirePromise;
156
+ assert.equal(mutex.isLocked(), true);
157
+ mutex.release();
158
+ });
159
+ // ============================================================================
160
+ // Mutex runExclusive Tests
161
+ // ============================================================================
162
+ test('Mutex runExclusive acquires and releases automatically', async () => {
163
+ const mutex = new Mutex();
164
+ const result = await mutex.runExclusive(async () => {
165
+ assert.equal(mutex.isLocked(), true);
166
+ return 42;
167
+ });
168
+ assert.equal(result, 42);
169
+ assert.equal(mutex.isLocked(), false);
170
+ });
171
+ test('Mutex runExclusive releases on error', async () => {
172
+ const mutex = new Mutex();
173
+ await assert.rejects(mutex.runExclusive(async () => {
174
+ throw new Error('Function error');
175
+ }), { message: 'Function error' });
176
+ assert.equal(mutex.isLocked(), false);
177
+ });
178
+ test('Mutex runExclusive serializes concurrent calls', async () => {
179
+ const mutex = new Mutex();
180
+ const order = [];
181
+ const results = await Promise.all([
182
+ mutex.runExclusive(async () => {
183
+ order.push(1);
184
+ await delay(30);
185
+ order.push(2);
186
+ return 'first';
187
+ }),
188
+ mutex.runExclusive(async () => {
189
+ order.push(3);
190
+ await delay(10);
191
+ order.push(4);
192
+ return 'second';
193
+ }),
194
+ ]);
195
+ assert.deepEqual(order, [1, 2, 3, 4]);
196
+ assert.deepEqual(results, ['first', 'second']);
197
+ });
198
+ test('Mutex runExclusive returns correct value type', async () => {
199
+ const mutex = new Mutex();
200
+ const numResult = await mutex.runExclusive(async () => 42);
201
+ const strResult = await mutex.runExclusive(async () => 'hello');
202
+ const objResult = await mutex.runExclusive(async () => ({ key: 'value' }));
203
+ assert.equal(numResult, 42);
204
+ assert.equal(strResult, 'hello');
205
+ assert.deepEqual(objResult, { key: 'value' });
206
+ });
207
+ // ============================================================================
208
+ // Mutex Queue Length Tests
209
+ // ============================================================================
210
+ test('Mutex getQueueLength returns 0 when no waiters', () => {
211
+ const mutex = new Mutex();
212
+ assert.equal(mutex.getQueueLength(), 0);
213
+ });
214
+ test('Mutex getQueueLength tracks waiting acquires', async () => {
215
+ const mutex = new Mutex();
216
+ await mutex.acquire();
217
+ const waiter1 = mutex.acquire();
218
+ await delay(5);
219
+ assert.equal(mutex.getQueueLength(), 1);
220
+ const waiter2 = mutex.acquire();
221
+ await delay(5);
222
+ assert.equal(mutex.getQueueLength(), 2);
223
+ mutex.release();
224
+ await delay(5);
225
+ assert.equal(mutex.getQueueLength(), 1);
226
+ mutex.release();
227
+ await waiter1;
228
+ await waiter2;
229
+ assert.equal(mutex.getQueueLength(), 0);
230
+ });
231
+ // ============================================================================
232
+ // Mutex Edge Cases
233
+ // ============================================================================
234
+ test('Mutex release when not locked has no effect', () => {
235
+ const mutex = new Mutex();
236
+ mutex.release();
237
+ assert.equal(mutex.isLocked(), false);
238
+ });
239
+ test('Mutex double release after single acquire', async () => {
240
+ const mutex = new Mutex();
241
+ await mutex.acquire();
242
+ mutex.release();
243
+ mutex.release(); // Should not throw
244
+ assert.equal(mutex.isLocked(), false);
245
+ });
246
+ test('Mutex handles rapid acquire/release cycles', async () => {
247
+ const mutex = new Mutex();
248
+ for (let i = 0; i < 100; i++) {
249
+ await mutex.acquire();
250
+ assert.equal(mutex.isLocked(), true);
251
+ mutex.release();
252
+ assert.equal(mutex.isLocked(), false);
253
+ }
254
+ });
255
+ // ============================================================================
256
+ // Semaphore Basic Tests
257
+ // ============================================================================
258
+ test('Semaphore is initialized with correct permits', () => {
259
+ const sem = new Semaphore(3);
260
+ assert.equal(sem.getAvailablePermits(), 3);
261
+ assert.equal(sem.getQueueLength(), 0);
262
+ });
263
+ test('Semaphore acquire decrements permits', async () => {
264
+ const sem = new Semaphore(3);
265
+ await sem.acquire();
266
+ assert.equal(sem.getAvailablePermits(), 2);
267
+ await sem.acquire();
268
+ assert.equal(sem.getAvailablePermits(), 1);
269
+ await sem.acquire();
270
+ assert.equal(sem.getAvailablePermits(), 0);
271
+ });
272
+ test('Semaphore release increments permits', async () => {
273
+ const sem = new Semaphore(3);
274
+ await sem.acquire();
275
+ await sem.acquire();
276
+ assert.equal(sem.getAvailablePermits(), 1);
277
+ sem.release();
278
+ assert.equal(sem.getAvailablePermits(), 2);
279
+ sem.release();
280
+ assert.equal(sem.getAvailablePermits(), 3);
281
+ });
282
+ test('Semaphore acquire waits when no permits available', async () => {
283
+ const sem = new Semaphore(1);
284
+ const order = [];
285
+ await sem.acquire();
286
+ order.push(1);
287
+ const waitingAcquire = (async () => {
288
+ await sem.acquire();
289
+ order.push(3);
290
+ sem.release();
291
+ })();
292
+ await delay(10);
293
+ order.push(2);
294
+ sem.release();
295
+ await waitingAcquire;
296
+ assert.deepEqual(order, [1, 2, 3]);
297
+ });
298
+ // ============================================================================
299
+ // Semaphore Concurrency Tests
300
+ // ============================================================================
301
+ test('Semaphore allows multiple concurrent acquires up to limit', async () => {
302
+ const sem = new Semaphore(3);
303
+ let concurrent = 0;
304
+ let maxConcurrent = 0;
305
+ const task = async () => {
306
+ await sem.acquire();
307
+ concurrent++;
308
+ maxConcurrent = Math.max(maxConcurrent, concurrent);
309
+ await delay(50);
310
+ concurrent--;
311
+ sem.release();
312
+ };
313
+ // Start 5 tasks, but only 3 should run concurrently
314
+ await Promise.all([
315
+ task(), task(), task(), task(), task()
316
+ ]);
317
+ assert.equal(maxConcurrent, 3);
318
+ assert.equal(concurrent, 0);
319
+ });
320
+ test('Semaphore processes queue in order', async () => {
321
+ const sem = new Semaphore(1);
322
+ const order = [];
323
+ await sem.acquire();
324
+ const waiter1 = (async () => {
325
+ await sem.acquire();
326
+ order.push(1);
327
+ sem.release();
328
+ })();
329
+ await delay(5);
330
+ const waiter2 = (async () => {
331
+ await sem.acquire();
332
+ order.push(2);
333
+ sem.release();
334
+ })();
335
+ await delay(5);
336
+ const waiter3 = (async () => {
337
+ await sem.acquire();
338
+ order.push(3);
339
+ sem.release();
340
+ })();
341
+ await delay(10);
342
+ sem.release();
343
+ await Promise.all([waiter1, waiter2, waiter3]);
344
+ assert.deepEqual(order, [1, 2, 3]);
345
+ });
346
+ // ============================================================================
347
+ // Semaphore runExclusive Tests
348
+ // ============================================================================
349
+ test('Semaphore runExclusive acquires and releases automatically', async () => {
350
+ const sem = new Semaphore(2);
351
+ const result = await sem.runExclusive(async () => {
352
+ assert.equal(sem.getAvailablePermits(), 1);
353
+ return 'result';
354
+ });
355
+ assert.equal(result, 'result');
356
+ assert.equal(sem.getAvailablePermits(), 2);
357
+ });
358
+ test('Semaphore runExclusive releases on error', async () => {
359
+ const sem = new Semaphore(1);
360
+ await assert.rejects(sem.runExclusive(async () => {
361
+ throw new Error('Task error');
362
+ }), { message: 'Task error' });
363
+ assert.equal(sem.getAvailablePermits(), 1);
364
+ });
365
+ test('Semaphore runExclusive allows parallel execution up to limit', async () => {
366
+ const sem = new Semaphore(2);
367
+ let concurrent = 0;
368
+ let maxConcurrent = 0;
369
+ const task = async () => {
370
+ return sem.runExclusive(async () => {
371
+ concurrent++;
372
+ maxConcurrent = Math.max(maxConcurrent, concurrent);
373
+ await delay(30);
374
+ concurrent--;
375
+ return maxConcurrent;
376
+ });
377
+ };
378
+ await Promise.all([task(), task(), task(), task()]);
379
+ assert.equal(maxConcurrent, 2);
380
+ assert.equal(concurrent, 0);
381
+ });
382
+ // ============================================================================
383
+ // Semaphore Edge Cases
384
+ // ============================================================================
385
+ test('Semaphore release does not exceed max permits', async () => {
386
+ const sem = new Semaphore(2);
387
+ sem.release(); // Extra release
388
+ sem.release(); // Extra release
389
+ sem.release(); // Extra release
390
+ // Should still be capped at maxPermits
391
+ assert.equal(sem.getAvailablePermits(), 2);
392
+ });
393
+ test('Semaphore with single permit acts like mutex', async () => {
394
+ const sem = new Semaphore(1);
395
+ const order = [];
396
+ const results = await Promise.all([
397
+ sem.runExclusive(async () => {
398
+ order.push(1);
399
+ await delay(20);
400
+ order.push(2);
401
+ return 'first';
402
+ }),
403
+ sem.runExclusive(async () => {
404
+ order.push(3);
405
+ await delay(10);
406
+ order.push(4);
407
+ return 'second';
408
+ }),
409
+ ]);
410
+ assert.deepEqual(order, [1, 2, 3, 4]);
411
+ assert.deepEqual(results, ['first', 'second']);
412
+ });
413
+ test('Semaphore getQueueLength reflects waiting tasks', async () => {
414
+ const sem = new Semaphore(1);
415
+ await sem.acquire();
416
+ const waiter1 = sem.acquire();
417
+ await delay(5);
418
+ assert.equal(sem.getQueueLength(), 1);
419
+ const waiter2 = sem.acquire();
420
+ await delay(5);
421
+ assert.equal(sem.getQueueLength(), 2);
422
+ sem.release();
423
+ await delay(5);
424
+ sem.release();
425
+ await waiter1;
426
+ await waiter2;
427
+ assert.equal(sem.getQueueLength(), 0);
428
+ });
429
+ test('Semaphore handles rapid acquire/release cycles', async () => {
430
+ const sem = new Semaphore(3);
431
+ for (let i = 0; i < 50; i++) {
432
+ await sem.acquire();
433
+ sem.release();
434
+ }
435
+ assert.equal(sem.getAvailablePermits(), 3);
436
+ });
437
+ test('Semaphore with zero permits blocks all acquires', async () => {
438
+ const sem = new Semaphore(1);
439
+ await sem.acquire(); // Now 0 permits
440
+ let acquired = false;
441
+ const acquire = (async () => {
442
+ await sem.acquire();
443
+ acquired = true;
444
+ sem.release();
445
+ })();
446
+ await delay(30);
447
+ assert.equal(acquired, false);
448
+ sem.release();
449
+ await acquire;
450
+ assert.equal(acquired, true);
451
+ });
452
+ // ============================================================================
453
+ // Integration Tests
454
+ // ============================================================================
455
+ test('Mutex protects shared state correctly', async () => {
456
+ const mutex = new Mutex();
457
+ let counter = 0;
458
+ const increment = async () => {
459
+ await mutex.runExclusive(async () => {
460
+ const current = counter;
461
+ await delay(Math.random() * 10);
462
+ counter = current + 1;
463
+ });
464
+ };
465
+ // Run 10 concurrent increments
466
+ await Promise.all(Array(10).fill(null).map(() => increment()));
467
+ assert.equal(counter, 10);
468
+ });
469
+ test('Semaphore limits concurrent operations', async () => {
470
+ const sem = new Semaphore(3);
471
+ const activeTasks = [];
472
+ const completedTasks = [];
473
+ const task = async (id) => {
474
+ await sem.runExclusive(async () => {
475
+ activeTasks.push(id);
476
+ assert.ok(activeTasks.length <= 3, `Too many concurrent tasks: ${activeTasks.length}`);
477
+ await delay(20 + Math.random() * 20);
478
+ activeTasks.splice(activeTasks.indexOf(id), 1);
479
+ completedTasks.push(id);
480
+ });
481
+ };
482
+ await Promise.all([
483
+ task(1), task(2), task(3), task(4), task(5),
484
+ task(6), task(7), task(8), task(9), task(10)
485
+ ]);
486
+ assert.equal(completedTasks.length, 10);
487
+ assert.equal(activeTasks.length, 0);
488
+ });
489
+ //# sourceMappingURL=mutex.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutex.test.js","sourceRoot":"","sources":["../../src/tests/mutex.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=path-helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-helpers.test.d.ts","sourceRoot":"","sources":["../../src/tests/path-helpers.test.ts"],"names":[],"mappings":""}