codesearch-mcp 0.2.3-alpha → 0.4.0-alpha

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 (317) hide show
  1. package/CHANGELOG.md +88 -5
  2. package/LICENSE +661 -21
  3. package/README.md +76 -40
  4. package/dist/app.js +17 -38
  5. package/dist/src/ast/CallExtractor.d.ts +8 -0
  6. package/dist/src/ast/CallExtractor.js +68 -0
  7. package/dist/src/ast/GraphqlNameExtractor.d.ts +22 -0
  8. package/dist/src/ast/GraphqlNameExtractor.js +240 -0
  9. package/dist/src/ast/ImportEdgeExtractor.d.ts +11 -0
  10. package/dist/src/ast/ImportEdgeExtractor.js +129 -0
  11. package/dist/src/ast/IndexedNodeResolver.d.ts +14 -0
  12. package/dist/src/ast/IndexedNodeResolver.js +217 -0
  13. package/dist/src/ast/MemberExtractor.d.ts +8 -0
  14. package/dist/src/ast/MemberExtractor.js +129 -0
  15. package/dist/src/ast/TopLevelSymbolExtractor.d.ts +5 -0
  16. package/dist/src/ast/TopLevelSymbolExtractor.js +86 -0
  17. package/dist/src/ast/graphql-grammar.d.ts +24 -0
  18. package/dist/src/ast/graphql-grammar.js +93 -0
  19. package/dist/src/ast/node-helpers.d.ts +11 -0
  20. package/dist/src/ast/node-helpers.js +55 -0
  21. package/dist/src/chunking/AstChunker.d.ts +12 -0
  22. package/dist/src/chunking/AstChunker.js +30 -0
  23. package/dist/src/chunking/CharacterChunkStrategy.d.ts +8 -0
  24. package/dist/src/chunking/CharacterChunkStrategy.js +15 -0
  25. package/dist/src/chunking/DeclarationChunkStrategy.d.ts +15 -0
  26. package/dist/src/chunking/DeclarationChunkStrategy.js +87 -0
  27. package/dist/src/chunking/FragmentMerger.d.ts +11 -0
  28. package/dist/src/chunking/FragmentMerger.js +61 -0
  29. package/dist/src/chunking/ImportOnlyFilter.d.ts +5 -0
  30. package/dist/src/chunking/ImportOnlyFilter.js +14 -0
  31. package/dist/src/chunking/LangchainTextSplitter.d.ts +21 -0
  32. package/dist/src/chunking/LangchainTextSplitter.js +133 -0
  33. package/dist/src/chunking/MinSizeSplitPolicy.d.ts +9 -0
  34. package/dist/src/chunking/MinSizeSplitPolicy.js +18 -0
  35. package/dist/src/chunking/RunPacker.d.ts +12 -0
  36. package/dist/src/chunking/RunPacker.js +84 -0
  37. package/dist/src/chunking/create-chunker.d.ts +3 -0
  38. package/dist/src/chunking/create-chunker.js +15 -0
  39. package/dist/src/chunking/interfaces.d.ts +27 -0
  40. package/dist/src/commands/ConfigCommand.js +1 -9
  41. package/dist/src/commands/EvalCommand.d.ts +10 -5
  42. package/dist/src/commands/EvalCommand.js +60 -149
  43. package/dist/src/commands/IndexCommand.d.ts +10 -4
  44. package/dist/src/commands/IndexCommand.js +52 -146
  45. package/dist/src/commands/McpCommand.d.ts +6 -3
  46. package/dist/src/commands/McpCommand.js +19 -20
  47. package/dist/src/commands/WebCommand.d.ts +9 -3
  48. package/dist/src/commands/WebCommand.js +17 -11
  49. package/dist/src/commands/eval/baseline-comparison.d.ts +6 -0
  50. package/dist/src/commands/eval/baseline-comparison.js +54 -0
  51. package/dist/src/commands/eval/eval-args.d.ts +6 -0
  52. package/dist/src/commands/eval/eval-args.js +71 -0
  53. package/dist/src/commands/eval/eval-corpora.d.ts +6 -0
  54. package/dist/src/commands/eval/eval-corpora.js +76 -0
  55. package/dist/src/commands/eval/eval-metadata.d.ts +17 -0
  56. package/dist/src/commands/eval/eval-metadata.js +75 -0
  57. package/dist/src/commands/eval/index-inspector.d.ts +3 -0
  58. package/dist/src/commands/eval/index-inspector.js +21 -0
  59. package/dist/src/commands/eval/staged-search.d.ts +3 -0
  60. package/dist/src/commands/eval/staged-search.js +20 -0
  61. package/dist/src/commands/eval/suite-loader.d.ts +8 -0
  62. package/dist/src/commands/eval/suite-loader.js +52 -0
  63. package/dist/src/commands/index/backend-probe.d.ts +2 -0
  64. package/dist/src/commands/index/backend-probe.js +15 -0
  65. package/dist/src/commands/index/embedding-setup.d.ts +3 -0
  66. package/dist/src/commands/index/embedding-setup.js +16 -0
  67. package/dist/src/commands/index/index-summary.d.ts +2 -0
  68. package/dist/src/commands/index/index-summary.js +22 -0
  69. package/dist/src/commands/index/legacy-ollama-guard.d.ts +3 -0
  70. package/dist/src/commands/index/legacy-ollama-guard.js +23 -0
  71. package/dist/src/commands/index/prune-step.d.ts +3 -0
  72. package/dist/src/commands/index/prune-step.js +22 -0
  73. package/dist/src/commands/index/scan-targets.d.ts +8 -0
  74. package/dist/src/commands/index/scan-targets.js +107 -0
  75. package/dist/src/config-error.d.ts +0 -4
  76. package/dist/src/config-error.js +0 -4
  77. package/dist/src/config-store.d.ts +1 -55
  78. package/dist/src/config-store.js +11 -73
  79. package/dist/src/config.d.ts +9 -18
  80. package/dist/src/config.js +36 -35
  81. package/dist/src/constants.d.ts +17 -28
  82. package/dist/src/constants.js +35 -29
  83. package/dist/src/container.d.ts +10 -2
  84. package/dist/src/container.js +19 -8
  85. package/dist/src/db/drizzle-types.d.ts +7 -0
  86. package/dist/src/db/drizzle-types.js +2 -0
  87. package/dist/src/db/index.d.ts +1 -0
  88. package/dist/src/db/schema-steps.d.ts +8 -0
  89. package/dist/src/db/schema-steps.js +105 -0
  90. package/dist/src/db/schema.d.ts +17 -0
  91. package/dist/src/db/schema.js +1 -6
  92. package/dist/src/declarations/DeclarationTree.d.ts +19 -0
  93. package/dist/src/declarations/DeclarationTree.js +66 -0
  94. package/dist/src/declarations/DeclarationTreeBuilder.d.ts +22 -0
  95. package/dist/src/declarations/DeclarationTreeBuilder.js +179 -0
  96. package/dist/src/declarations/SourceLines.d.ts +37 -0
  97. package/dist/src/declarations/SourceLines.js +415 -0
  98. package/dist/src/dependency-traversal.d.ts +0 -6
  99. package/dist/src/dependency-traversal.js +0 -6
  100. package/dist/src/enriched-prompt.d.ts +0 -6
  101. package/dist/src/enriched-prompt.js +0 -6
  102. package/dist/src/error-record.d.ts +12 -0
  103. package/dist/src/error-record.js +248 -0
  104. package/dist/src/eval-corpus.d.ts +16 -0
  105. package/dist/src/eval-corpus.js +169 -0
  106. package/dist/src/eval-results.d.ts +6 -3
  107. package/dist/src/eval-results.js +323 -26
  108. package/dist/src/eval-vector-index.d.ts +5 -0
  109. package/dist/src/eval-vector-index.js +60 -0
  110. package/dist/src/file-utils.d.ts +0 -5
  111. package/dist/src/file-utils.js +0 -5
  112. package/dist/src/graph.d.ts +0 -25
  113. package/dist/src/graph.js +0 -28
  114. package/dist/src/help.js +9 -1
  115. package/dist/src/hnsw-settings.d.ts +3 -0
  116. package/dist/src/hnsw-settings.js +24 -0
  117. package/dist/src/index-args.d.ts +13 -0
  118. package/dist/src/index-args.js +48 -0
  119. package/dist/src/indexing/AnalysisBatcher.d.ts +12 -0
  120. package/dist/src/indexing/AnalysisBatcher.js +28 -0
  121. package/dist/src/indexing/ChunkEmbedder.d.ts +24 -0
  122. package/dist/src/indexing/ChunkEmbedder.js +37 -0
  123. package/dist/src/indexing/ConsoleScanReporter.d.ts +10 -0
  124. package/dist/src/indexing/ConsoleScanReporter.js +73 -0
  125. package/dist/src/indexing/EmbeddingSchemaPreparer.d.ts +14 -0
  126. package/dist/src/indexing/EmbeddingSchemaPreparer.js +66 -0
  127. package/dist/src/indexing/FileIngestor.d.ts +22 -0
  128. package/dist/src/indexing/FileIngestor.js +116 -0
  129. package/dist/src/indexing/IndexStore.d.ts +24 -0
  130. package/dist/src/indexing/IndexStore.js +69 -0
  131. package/dist/src/indexing/StaleFilePruner.d.ts +8 -0
  132. package/dist/src/indexing/StaleFilePruner.js +55 -0
  133. package/dist/src/indexing/analysis-rows.d.ts +4 -0
  134. package/dist/src/indexing/analysis-rows.js +65 -0
  135. package/dist/src/indexing/project-notices.d.ts +2 -0
  136. package/dist/src/indexing/project-notices.js +63 -0
  137. package/dist/src/interfaces/IAstParser.d.ts +4 -40
  138. package/dist/src/interfaces/ICallGraph.d.ts +28 -0
  139. package/dist/src/interfaces/ICallGraph.js +2 -0
  140. package/dist/src/interfaces/IChunkSearch.d.ts +42 -0
  141. package/dist/src/interfaces/IChunkSearch.js +2 -0
  142. package/dist/src/interfaces/IChunker.d.ts +3 -12
  143. package/dist/src/interfaces/ICorpusInspector.d.ts +7 -0
  144. package/dist/src/interfaces/ICorpusInspector.js +2 -0
  145. package/dist/src/interfaces/IDatabase.d.ts +8 -24
  146. package/dist/src/interfaces/IDependencyGraph.d.ts +24 -0
  147. package/dist/src/interfaces/IDependencyGraph.js +2 -0
  148. package/dist/src/interfaces/IEmbedder.d.ts +0 -9
  149. package/dist/src/interfaces/IIndexIdentityGuard.d.ts +3 -0
  150. package/dist/src/interfaces/IIndexIdentityGuard.js +2 -0
  151. package/dist/src/interfaces/IIndexedNodeResolver.d.ts +10 -0
  152. package/dist/src/interfaces/IIndexedNodeResolver.js +2 -0
  153. package/dist/src/interfaces/ILogger.d.ts +1 -11
  154. package/dist/src/interfaces/IMcpReadiness.d.ts +12 -0
  155. package/dist/src/interfaces/IMcpReadiness.js +2 -0
  156. package/dist/src/interfaces/IMcpToolHandler.d.ts +0 -5
  157. package/dist/src/interfaces/IMonorepoResolver.d.ts +0 -22
  158. package/dist/src/interfaces/IProjectCatalog.d.ts +13 -0
  159. package/dist/src/interfaces/IProjectCatalog.js +2 -0
  160. package/dist/src/interfaces/IProjectDiscovery.d.ts +0 -17
  161. package/dist/src/interfaces/IProjectRoots.d.ts +3 -0
  162. package/dist/src/interfaces/IProjectRoots.js +2 -0
  163. package/dist/src/interfaces/IRetrievalEvaluator.d.ts +153 -12
  164. package/dist/src/interfaces/IScanReporter.d.ts +13 -0
  165. package/dist/src/interfaces/IScanReporter.js +2 -0
  166. package/dist/src/interfaces/ISymbolLookup.d.ts +49 -0
  167. package/dist/src/interfaces/ISymbolLookup.js +2 -0
  168. package/dist/src/interfaces/IToolPaths.d.ts +62 -0
  169. package/dist/src/interfaces/IToolPaths.js +2 -0
  170. package/dist/src/interfaces/IWorkspaceFiles.d.ts +28 -0
  171. package/dist/src/interfaces/IWorkspaceFiles.js +2 -0
  172. package/dist/src/interfaces/SymbolKind.d.ts +1 -0
  173. package/dist/src/interfaces/SymbolKind.js +2 -0
  174. package/dist/src/interfaces/index.d.ts +12 -1
  175. package/dist/src/interrupt.js +0 -2
  176. package/dist/src/owner-path.d.ts +9 -10
  177. package/dist/src/owner-path.js +11 -23
  178. package/dist/src/project-scope.d.ts +1 -12
  179. package/dist/src/project-scope.js +5 -12
  180. package/dist/src/project-selector.d.ts +0 -5
  181. package/dist/src/project-selector.js +0 -11
  182. package/dist/src/retrieval-eval.d.ts +15 -6
  183. package/dist/src/retrieval-eval.js +388 -59
  184. package/dist/src/search/CallGraph.d.ts +9 -0
  185. package/dist/src/search/CallGraph.js +84 -0
  186. package/dist/src/search/ChunkSearch.d.ts +23 -0
  187. package/dist/src/search/ChunkSearch.js +115 -0
  188. package/dist/src/search/DependencyGraph.d.ts +19 -0
  189. package/dist/src/search/DependencyGraph.js +180 -0
  190. package/dist/src/search/IndexIdentityGuard.d.ts +11 -0
  191. package/dist/src/search/IndexIdentityGuard.js +37 -0
  192. package/dist/src/search/ProjectCatalog.d.ts +11 -0
  193. package/dist/src/search/ProjectCatalog.js +38 -0
  194. package/dist/src/search/SymbolLookup.d.ts +24 -0
  195. package/dist/src/search/SymbolLookup.js +97 -0
  196. package/dist/src/search/chunks/CandidateFetcher.d.ts +19 -0
  197. package/dist/src/search/chunks/CandidateFetcher.js +40 -0
  198. package/dist/src/search/chunks/IterativeScanGate.d.ts +10 -0
  199. package/dist/src/search/chunks/IterativeScanGate.js +42 -0
  200. package/dist/src/search/chunks/RerankStage.d.ts +15 -0
  201. package/dist/src/search/chunks/RerankStage.js +42 -0
  202. package/dist/src/search/chunks/search-metrics.d.ts +18 -0
  203. package/dist/src/search/chunks/search-metrics.js +32 -0
  204. package/dist/src/search/chunks/search-plan.d.ts +18 -0
  205. package/dist/src/search/chunks/search-plan.js +19 -0
  206. package/dist/src/search/create-search-services.d.ts +26 -0
  207. package/dist/src/search/create-search-services.js +29 -0
  208. package/dist/src/search/index-paths.d.ts +1 -0
  209. package/dist/src/search/index-paths.js +5 -0
  210. package/dist/src/search/result-shaping.d.ts +4 -0
  211. package/dist/src/search/result-shaping.js +19 -0
  212. package/dist/src/search/symbol-sql.d.ts +13 -0
  213. package/dist/src/search/symbol-sql.js +66 -0
  214. package/dist/src/search/symbols/SymbolGrepFallback.d.ts +19 -0
  215. package/dist/src/search/symbols/SymbolGrepFallback.js +106 -0
  216. package/dist/src/search/symbols/SymbolIndexQuery.d.ts +14 -0
  217. package/dist/src/search/symbols/SymbolIndexQuery.js +52 -0
  218. package/dist/src/search/symbols/SymbolTextSearch.d.ts +13 -0
  219. package/dist/src/search/symbols/SymbolTextSearch.js +84 -0
  220. package/dist/src/search/symbols/TargetColumnGate.d.ts +7 -0
  221. package/dist/src/search/symbols/TargetColumnGate.js +23 -0
  222. package/dist/src/search/symbols/find-symbol-constants.d.ts +4 -0
  223. package/dist/src/search/symbols/find-symbol-constants.js +8 -0
  224. package/dist/src/search/symbols/grep-args.d.ts +3 -0
  225. package/dist/src/search/symbols/grep-args.js +7 -0
  226. package/dist/src/search/symbols/grep-patterns.d.ts +4 -0
  227. package/dist/src/search/symbols/grep-patterns.js +60 -0
  228. package/dist/src/services/AstParserService.d.ts +10 -106
  229. package/dist/src/services/AstParserService.js +37 -1068
  230. package/dist/src/services/DatabaseService.d.ts +10 -17
  231. package/dist/src/services/DatabaseService.js +71 -115
  232. package/dist/src/services/EmbedderFactory.d.ts +0 -4
  233. package/dist/src/services/EmbedderFactory.js +0 -5
  234. package/dist/src/services/IndexerService.d.ts +7 -26
  235. package/dist/src/services/IndexerService.js +38 -286
  236. package/dist/src/services/InfinityEmbedder.d.ts +0 -21
  237. package/dist/src/services/InfinityEmbedder.js +0 -15
  238. package/dist/src/services/LoggerService.d.ts +7 -5
  239. package/dist/src/services/LoggerService.js +37 -41
  240. package/dist/src/services/McpReadiness.d.ts +18 -0
  241. package/dist/src/services/McpReadiness.js +73 -0
  242. package/dist/src/services/McpServer.d.ts +50 -19
  243. package/dist/src/services/McpServer.js +132 -62
  244. package/dist/src/services/MonorepoAwareDiscoveryService.d.ts +1 -45
  245. package/dist/src/services/MonorepoAwareDiscoveryService.js +1 -51
  246. package/dist/src/services/NxMonorepoResolver.d.ts +0 -29
  247. package/dist/src/services/NxMonorepoResolver.js +5 -56
  248. package/dist/src/services/OpenAICompatibleEmbedder.d.ts +0 -6
  249. package/dist/src/services/OpenAICompatibleEmbedder.js +0 -14
  250. package/dist/src/services/ProjectDiscoveryService.d.ts +0 -4
  251. package/dist/src/services/ProjectDiscoveryService.js +0 -4
  252. package/dist/src/services/VoyageEmbedder.d.ts +0 -6
  253. package/dist/src/services/VoyageEmbedder.js +0 -6
  254. package/dist/src/services/WebServerService.d.ts +5 -56
  255. package/dist/src/services/WebServerService.js +25 -63
  256. package/dist/src/services/http-retry.d.ts +0 -7
  257. package/dist/src/services/http-retry.js +1 -10
  258. package/dist/src/services/infinity-provisioning.d.ts +0 -74
  259. package/dist/src/services/infinity-provisioning.js +5 -88
  260. package/dist/src/services/legacy-ollama-index.d.ts +0 -16
  261. package/dist/src/services/legacy-ollama-index.js +0 -23
  262. package/dist/src/services/reranker.d.ts +0 -9
  263. package/dist/src/services/reranker.js +46 -12
  264. package/dist/src/setup.d.ts +24 -24
  265. package/dist/src/setup.js +205 -103
  266. package/dist/src/symbol-name.d.ts +1 -12
  267. package/dist/src/symbol-name.js +16 -25
  268. package/dist/src/symbol-rows.d.ts +0 -14
  269. package/dist/src/symbol-rows.js +0 -14
  270. package/dist/src/tool-call-log.d.ts +2 -0
  271. package/dist/src/tool-call-log.js +24 -0
  272. package/dist/src/tools/FindSymbolTool.d.ts +17 -7
  273. package/dist/src/tools/FindSymbolTool.js +54 -35
  274. package/dist/src/tools/GetCallersTool.d.ts +16 -8
  275. package/dist/src/tools/GetCallersTool.js +65 -35
  276. package/dist/src/tools/GetDependenciesTool.d.ts +16 -8
  277. package/dist/src/tools/GetDependenciesTool.js +36 -29
  278. package/dist/src/tools/GetDependentsTool.d.ts +20 -8
  279. package/dist/src/tools/GetDependentsTool.js +48 -34
  280. package/dist/src/tools/ListFilesTool.d.ts +16 -8
  281. package/dist/src/tools/ListFilesTool.js +20 -26
  282. package/dist/src/tools/ListProjectsTool.d.ts +11 -7
  283. package/dist/src/tools/ListProjectsTool.js +13 -11
  284. package/dist/src/tools/McpTool.d.ts +17 -0
  285. package/dist/src/tools/McpTool.js +28 -0
  286. package/dist/src/tools/ReadFileRangeTool.d.ts +16 -8
  287. package/dist/src/tools/ReadFileRangeTool.js +23 -25
  288. package/dist/src/tools/ReadFileTool.d.ts +15 -8
  289. package/dist/src/tools/ReadFileTool.js +19 -24
  290. package/dist/src/tools/SearchCodebaseTool.d.ts +22 -10
  291. package/dist/src/tools/SearchCodebaseTool.js +71 -50
  292. package/dist/src/tools/format-helpers.d.ts +9 -9
  293. package/dist/src/tools/format-helpers.js +146 -28
  294. package/dist/src/tools/tool-args.d.ts +38 -0
  295. package/dist/src/tools/tool-args.js +95 -0
  296. package/dist/src/web/dashboard.d.ts +0 -8
  297. package/dist/src/web/dashboard.js +7 -10
  298. package/dist/src/workspace/GrepRunner.d.ts +15 -0
  299. package/dist/src/workspace/GrepRunner.js +104 -0
  300. package/dist/src/workspace/ProjectRoots.d.ts +22 -0
  301. package/dist/src/workspace/ProjectRoots.js +102 -0
  302. package/dist/src/workspace/ToolPaths.d.ts +31 -0
  303. package/dist/src/workspace/ToolPaths.js +312 -0
  304. package/dist/src/workspace/WorkspaceFiles.d.ts +19 -0
  305. package/dist/src/workspace/WorkspaceFiles.js +285 -0
  306. package/dist/src/workspace/fs-access.d.ts +9 -0
  307. package/dist/src/workspace/fs-access.js +47 -0
  308. package/dist/src/workspace/path-helpers.d.ts +3 -0
  309. package/dist/src/workspace/path-helpers.js +43 -0
  310. package/package.json +5 -4
  311. package/dist/src/interfaces/ISearcher.d.ts +0 -35
  312. package/dist/src/services/AstChunker.d.ts +0 -42
  313. package/dist/src/services/AstChunker.js +0 -158
  314. package/dist/src/services/SearcherService.d.ts +0 -342
  315. package/dist/src/services/SearcherService.js +0 -1199
  316. package/docs/web-dashboard.md +0 -206
  317. /package/dist/src/{interfaces/ISearcher.js → chunking/interfaces.js} +0 -0
@@ -1,9 +1,15 @@
1
- import type { Container } from '../container';
1
+ import type { IndexerService } from '../services/IndexerService';
2
+ import type { Config } from '../config';
3
+ import type { IDatabase, IDependencyGraph, IEmbedder, IProjectDiscovery } from '../interfaces';
2
4
  import type { ICommand } from './ICommand';
3
5
  export declare class IndexCommand implements ICommand {
4
- private container;
6
+ private db;
7
+ private embedder;
8
+ private indexer;
9
+ private dependencies;
10
+ private discovery;
11
+ private config;
5
12
  private argv1;
6
- constructor(container: Container, argv1: string);
13
+ constructor(db: IDatabase, embedder: IEmbedder, indexer: IndexerService, dependencies: IDependencyGraph, discovery: IProjectDiscovery, config: Config, argv1: string);
7
14
  execute(): Promise<void>;
8
- private printSummary;
9
15
  }
@@ -5,186 +5,92 @@ const interrupt_1 = require("../interrupt");
5
5
  const project_selector_1 = require("../project-selector");
6
6
  const graph_1 = require("../graph");
7
7
  const MonorepoAwareDiscoveryService_1 = require("../services/MonorepoAwareDiscoveryService");
8
- const project_scope_1 = require("../project-scope");
9
8
  const file_utils_1 = require("../file-utils");
10
- const legacy_ollama_index_1 = require("../services/legacy-ollama-index");
11
- /** `--project`'s index in `args`; the following token is its name unless absent or itself a flag. */
12
- function parseProjectFlag(args) {
13
- const i = args.indexOf('--project');
14
- if (i === -1)
15
- return { present: false };
16
- const next = args[i + 1];
17
- return next !== undefined && !next.startsWith('-') ? { present: true, name: next } : { present: true };
18
- }
9
+ const index_args_1 = require("../index-args");
10
+ const scan_targets_1 = require("./index/scan-targets");
11
+ const legacy_ollama_guard_1 = require("./index/legacy-ollama-guard");
12
+ const embedding_setup_1 = require("./index/embedding-setup");
13
+ const prune_step_1 = require("./index/prune-step");
14
+ const backend_probe_1 = require("./index/backend-probe");
15
+ const index_summary_1 = require("./index/index-summary");
19
16
  class IndexCommand {
20
- container;
17
+ db;
18
+ embedder;
19
+ indexer;
20
+ dependencies;
21
+ discovery;
22
+ config;
21
23
  argv1;
22
- constructor(container, argv1) {
23
- this.container = container;
24
+ constructor(db, embedder, indexer, dependencies, discovery, config, argv1) {
25
+ this.db = db;
26
+ this.embedder = embedder;
27
+ this.indexer = indexer;
28
+ this.dependencies = dependencies;
29
+ this.discovery = discovery;
30
+ this.config = config;
24
31
  this.argv1 = argv1;
25
32
  }
26
33
  async execute() {
27
- const { db, indexer, searcher, config, discovery, embedder } = this.container;
28
- const args = process.argv.slice(this.argv1 === 'rag-index' ? 2 : 3);
29
- const force = args.includes('--reindex');
30
- const forceSelect = args.includes('--select');
31
- const projectFlag = parseProjectFlag(args);
32
- let discovered;
33
- try {
34
- discovered = discovery.discover(config.workspaceRoot);
35
- }
36
- catch (err) {
37
- console.error(`\n${err.message}`);
38
- process.exitCode = 1;
34
+ const args = (0, index_args_1.parseIndexArgs)(process.argv.slice(this.argv1 === 'rag-index' ? 2 : 3));
35
+ const { force, forceSelect } = args;
36
+ const targets = await (0, scan_targets_1.resolveScanTargets)(this.discovery, this.config, args);
37
+ if (!targets)
38
+ return;
39
+ await this.db.initDbWithSchema();
40
+ if (!force && await (0, legacy_ollama_guard_1.refusesLegacyOllamaIndex)(this.db, this.config))
39
41
  return;
40
- }
41
- // Resolve --project before any database or embedding work, so a bad name
42
- // (or a cancelled no-name prompt) has zero side effects.
43
- let scanTargets;
44
- if (projectFlag.present) {
45
- let name = projectFlag.name;
46
- if (name === undefined) {
47
- if (discovered.length === 0) {
48
- console.error('\nNo projects available to select.');
49
- process.exitCode = 1;
50
- return;
51
- }
52
- name = await (0, project_selector_1.selectSingleProject)(discovered);
53
- if (name === undefined) {
54
- process.exitCode = 1;
55
- return;
56
- }
57
- }
58
- const { targets, notFound } = (0, project_scope_1.resolveProjectNames)([name], discovered);
59
- if (notFound.length > 0) {
60
- const available = (0, project_scope_1.listAvailableNames)(discovered).join(', ');
61
- console.error(`\nProject '${notFound[0]}' not found. Available projects: ${available}`);
62
- process.exitCode = 1;
63
- return;
64
- }
65
- scanTargets = targets;
66
- }
67
- await db.initDbWithSchema();
68
- // A former Ollama installation the config layer cannot recognise (old
69
- // defaults, no `embedding`/`ollama` block) is protected here: without an
70
- // explicit `--reindex`, refuse to touch an index built by `ollama` (or a
71
- // pre-`index_meta` install, which is indistinguishable from one) before
72
- // any backend readiness check, Docker command, or schema work.
73
- if (!force) {
74
- let identity;
75
- try {
76
- identity = await (0, legacy_ollama_index_1.resolveIndexedIdentity)(db);
77
- }
78
- catch (err) {
79
- console.error(`\n${err.message}`);
80
- process.exitCode = 1;
81
- return;
82
- }
83
- if (identity?.provider === 'ollama') {
84
- console.error(`\nThe existing index was built with ${identity.provider}/${identity.model}, but "ollama" is no ` +
85
- `longer a supported embedding provider (configured: ${config.embedding.provider}/${config.embedding.model}). ` +
86
- `Run \`rag-index --reindex\` to confirm rebuilding the index under the configured provider.`);
87
- process.exitCode = 1;
88
- return;
89
- }
90
- }
91
42
  let projects;
92
- if (scanTargets) {
93
- projects = scanTargets;
43
+ if (targets.scanTargets) {
44
+ projects = targets.scanTargets;
94
45
  }
95
46
  else {
96
- const selected = await new project_selector_1.ProjectSelector(config.workspaceRoot).select(discovered, forceSelect);
47
+ const selected = await new project_selector_1.ProjectSelector(this.config.workspaceRoot).select(targets.discovered, forceSelect);
97
48
  if (selected.length === 0)
98
49
  return;
99
- // Expand any selected nested-monorepo unit (e.g. an Nx repo) into its
100
- // sub-projects; ordinary projects pass through unchanged.
101
50
  projects = (0, MonorepoAwareDiscoveryService_1.toLeafProjects)(selected);
102
51
  }
103
- // The post-index graph always reflects the full workspace, regardless of
104
- // what this run actually scanned.
105
- const fullLeafProjects = (0, MonorepoAwareDiscoveryService_1.toLeafProjects)(discovered);
106
- // Ensure the local model is served (Infinity only — no-op for cloud), then
107
- // resolve the active embedding dimension and reconcile it with index_meta
108
- // (recreate code_chunk on a dimension change, clear rows on a model change)
109
- // before scanning. A clear error here beats a mid-run vector width mismatch.
110
- try {
111
- await embedder.ensureModelAvailable?.();
112
- const meta = await indexer.prepareEmbeddingSchema();
113
- console.log(`Embedding: ${meta.provider} / ${meta.model} (${meta.dimensions} dims)`);
114
- }
115
- catch (err) {
116
- console.error(`\nEmbedding setup failed: ${err.message}`);
117
- process.exitCode = 1;
52
+ const fullLeafProjects = (0, MonorepoAwareDiscoveryService_1.toLeafProjects)(targets.discovered);
53
+ if (!await (0, embedding_setup_1.prepareEmbedding)(this.embedder, this.indexer))
118
54
  return;
119
- }
120
55
  const controller = new AbortController();
121
56
  const teardown = (0, interrupt_1.setupInterrupt)(controller);
122
57
  try {
123
- // --project bypasses pruning entirely — it promises "touch only this
124
- // project," so nothing outside the resolved target(s) is ever removed.
125
- if (!scanTargets) {
126
- let pruneResult;
127
- try {
128
- pruneResult = await indexer.pruneProjects(projects.map(p => p.name));
129
- }
130
- catch (err) {
131
- console.error(`\nPruning failed: ${err.message}`);
132
- process.exitCode = 1;
133
- return;
134
- }
135
- const { removed, failed } = pruneResult;
136
- for (const name of removed) {
137
- console.log(`Removed project ${name} (not selected)`);
138
- }
139
- if (failed.length > 0) {
140
- process.exitCode = 1;
141
- }
142
- }
58
+ if (!targets.scanTargets && !await (0, prune_step_1.pruneUnselected)(this.indexer, projects))
59
+ return;
143
60
  const filesPerProject = projects.map(p => (0, file_utils_1.collectFiles)(p.path, (0, file_utils_1.loadIgnore)(p.path), p.path));
144
61
  const totalFiles = filesPerProject.reduce((sum, f) => sum + f.length, 0);
145
62
  console.log(`\n${projects.length} projects — ${totalFiles} files total`);
146
63
  if (force)
147
64
  console.log('Reindex mode: all files will be re-indexed.');
148
- const allStats = await indexer.scanProjects(projects, force, controller.signal, filesPerProject);
149
- if (controller.signal.aborted)
65
+ const allStats = await this.indexer.scanProjects(projects, force, controller.signal, filesPerProject);
66
+ const interrupted = controller.signal.aborted;
67
+ if (interrupted)
150
68
  console.log('\nIndexing interrupted.');
151
- this.printSummary(allStats);
152
- if (!controller.signal.aborted) {
153
- // The graph is a post-index nicety — a failure here (DB dropped after a
154
- // long run, unreadable dir) must not fail the whole run: indexing already
155
- // succeeded and the summary is printed.
69
+ (0, index_summary_1.printIndexSummary)(allStats);
70
+ const sum = (field) => allStats.reduce((total, s) => total + s[field], 0);
71
+ const failed = sum('failed');
72
+ const total = failed + sum('indexed') + sum('skipped');
73
+ if (failed > 0) {
74
+ console.error(`Indexing finished with ${failed} of ${total} file(s) failed.`);
75
+ }
76
+ if (!interrupted) {
156
77
  try {
157
- // Real import edges (code_dependency, just written) → intra-repo graph links.
158
- const projectEdges = await searcher.getProjectEdges();
159
- (0, graph_1.generateProjectGraph)(fullLeafProjects, projectEdges, config.workspaceRoot);
78
+ const projectEdges = await this.dependencies.getProjectEdges();
79
+ (0, graph_1.generateProjectGraph)(fullLeafProjects, projectEdges, this.config.workspaceRoot);
160
80
  }
161
81
  catch (err) {
162
82
  console.error(` ⚠ Could not build project graph: ${err.message}`);
163
83
  }
164
84
  }
85
+ if (failed > 0) {
86
+ const nothingUsable = sum('skipped') === 0 && sum('chunks') === 0;
87
+ const alreadyFailed = interrupted || !!process.exitCode || nothingUsable;
88
+ process.exitCode = alreadyFailed || !(await (0, backend_probe_1.isBackendAvailable)(this.db, this.embedder)) ? 1 : 2;
89
+ }
165
90
  }
166
91
  finally {
167
92
  teardown();
168
93
  }
169
94
  }
170
- printSummary(allStats) {
171
- const cols = { name: 30, num: 8 };
172
- const line = '─'.repeat(cols.name + cols.num * 5 + 5);
173
- console.log('\n=== Indexing Summary ===');
174
- console.log('Service'.padEnd(cols.name), 'Indexed'.padStart(cols.num), 'Skipped'.padStart(cols.num), 'Failed'.padStart(cols.num), 'Chunks'.padStart(cols.num), 'Time(s)'.padStart(cols.num));
175
- console.log(line);
176
- for (const s of allStats) {
177
- console.log(s.serviceName.padEnd(cols.name), String(s.indexed).padStart(cols.num), String(s.skipped).padStart(cols.num), String(s.failed).padStart(cols.num), String(s.chunks).padStart(cols.num), String(s.elapsedSec).padStart(cols.num));
178
- }
179
- console.log(line);
180
- const total = allStats.reduce((acc, s) => ({
181
- indexed: acc.indexed + s.indexed,
182
- skipped: acc.skipped + s.skipped,
183
- failed: acc.failed + s.failed,
184
- chunks: acc.chunks + s.chunks,
185
- elapsedSec: acc.elapsedSec + s.elapsedSec,
186
- }), { indexed: 0, skipped: 0, failed: 0, chunks: 0, elapsedSec: 0 });
187
- console.log('TOTAL'.padEnd(cols.name), String(total.indexed).padStart(cols.num), String(total.skipped).padStart(cols.num), String(total.failed).padStart(cols.num), String(total.chunks).padStart(cols.num), String(total.elapsedSec.toFixed(1)).padStart(cols.num));
188
- }
189
95
  }
190
96
  exports.IndexCommand = IndexCommand;
@@ -1,7 +1,10 @@
1
- import type { Container } from '../container';
2
1
  import type { ICommand } from './ICommand';
2
+ import type { IMcpReadiness, ILogger } from '../interfaces';
3
+ import type { McpServer } from '../services/McpServer';
3
4
  export declare class McpCommand implements ICommand {
4
- private container;
5
- constructor(container: Container);
5
+ private readiness;
6
+ private mcp;
7
+ private logger;
8
+ constructor(readiness: IMcpReadiness, mcp: McpServer, logger: ILogger);
6
9
  execute(): Promise<void>;
7
10
  }
@@ -1,35 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.McpCommand = void 0;
4
+ const error_record_1 = require("../error-record");
4
5
  class McpCommand {
5
- container;
6
- constructor(container) {
7
- this.container = container;
6
+ readiness;
7
+ mcp;
8
+ logger;
9
+ constructor(readiness, mcp, logger) {
10
+ this.readiness = readiness;
11
+ this.mcp = mcp;
12
+ this.logger = logger;
8
13
  }
9
14
  async execute() {
10
- const { db, mcp, searcher, logger } = this.container;
11
- let startupError;
12
- try {
13
- await db.initDb();
14
- // Refuse to serve searches embedded into a foreign vector space — surface
15
- // the mismatch through the existing startup-error plumbing so every tool
16
- // call reports it clearly.
17
- await searcher.assertIndexMatches();
18
- }
19
- catch (err) {
20
- startupError = err instanceof Error ? err : new Error(String(err));
21
- logger.error('McpCommand: startup check failed', { reason: startupError.message });
15
+ const check = await this.readiness.start();
16
+ if (!check.ok) {
17
+ this.logger.error('McpCommand: startup check failed', { err: check.err });
18
+ writeStartupCause(check.err);
22
19
  }
23
20
  try {
24
- await mcp.start(startupError);
21
+ await this.mcp.start(check.ok ? undefined : check);
25
22
  }
26
23
  catch (err) {
27
- const reason = err instanceof Error ? err.message : String(err);
28
- logger.error('McpCommand: MCP server failed to start', { reason });
24
+ this.logger.error('McpCommand: MCP server failed to start', { err });
25
+ writeStartupCause(err);
26
+ process.exitCode = 1;
29
27
  return;
30
28
  }
31
- // server.connect() resolves immediately after setup; keep the process alive
32
- // until the MCP client disconnects (stdin closes)
33
29
  await new Promise(resolve => {
34
30
  process.stdin.once('close', resolve);
35
31
  process.stdin.once('end', resolve);
@@ -37,3 +33,6 @@ class McpCommand {
37
33
  }
38
34
  }
39
35
  exports.McpCommand = McpCommand;
36
+ function writeStartupCause(err) {
37
+ process.stderr.write(`codesearch-mcp: ${(0, error_record_1.errorMessage)(err)}\n`);
38
+ }
@@ -1,8 +1,14 @@
1
- import type { Container } from '../container';
2
1
  import type { ICommand } from './ICommand';
2
+ import type { Config } from '../config';
3
+ import type { IDatabase, IDependencyGraph, IEmbedder, ILogger, IProjectCatalog } from '../interfaces';
3
4
  export declare class WebCommand implements ICommand {
4
- private container;
5
+ private db;
6
+ private embedder;
7
+ private catalog;
8
+ private dependencies;
9
+ private config;
10
+ private logger;
5
11
  private readonly port;
6
- constructor(container: Container, args?: string[]);
12
+ constructor(db: IDatabase, embedder: IEmbedder, catalog: IProjectCatalog, dependencies: IDependencyGraph, config: Config, logger: ILogger, args?: string[]);
7
13
  execute(): Promise<void>;
8
14
  }
@@ -4,37 +4,43 @@ exports.WebCommand = void 0;
4
4
  const WebServerService_1 = require("../services/WebServerService");
5
5
  const DEFAULT_PORT = 4319;
6
6
  class WebCommand {
7
- container;
7
+ db;
8
+ embedder;
9
+ catalog;
10
+ dependencies;
11
+ config;
12
+ logger;
8
13
  port;
9
- constructor(container, args = []) {
10
- this.container = container;
14
+ constructor(db, embedder, catalog, dependencies, config, logger, args = []) {
15
+ this.db = db;
16
+ this.embedder = embedder;
17
+ this.catalog = catalog;
18
+ this.dependencies = dependencies;
19
+ this.config = config;
20
+ this.logger = logger;
11
21
  this.port = parsePort(args) ?? DEFAULT_PORT;
12
22
  }
13
23
  async execute() {
14
- const { db, searcher, config, logger, embedder } = this.container;
15
24
  try {
16
- await db.initDb();
25
+ await this.db.initDb();
17
26
  }
18
27
  catch (err) {
19
28
  const reason = err instanceof Error ? err.message : String(err);
20
- logger.error('WebCommand: database connection failed', { reason });
29
+ this.logger.error('WebCommand: database connection failed', { err });
21
30
  console.error(`Database connection failed: ${reason}`);
22
- // Continue: config editing still works; project/graph tabs will error in-page.
23
31
  }
24
- const server = new WebServerService_1.WebServer(searcher, config, logger, embedder);
32
+ const server = new WebServerService_1.WebServer(this.catalog, this.dependencies, this.config, this.logger, this.embedder);
25
33
  const host = '127.0.0.1';
26
34
  try {
27
35
  await server.start(this.port, host);
28
36
  }
29
37
  catch (err) {
30
38
  const reason = err instanceof Error ? err.message : String(err);
31
- logger.error('WebCommand: server failed to start', { reason });
39
+ this.logger.error('WebCommand: server failed to start', { err });
32
40
  console.error(`Failed to start web server on ${host}:${this.port}: ${reason}`);
33
41
  return;
34
42
  }
35
43
  console.log(`RAG dashboard: http://${host}:${this.port} (Ctrl+C to stop)`);
36
- // Keep execute() pending until a shutdown signal, otherwise app.ts tears
37
- // down the DB and exits immediately (mirrors McpCommand's keep-alive).
38
44
  await new Promise(resolve => {
39
45
  const shutdown = () => { void server.stop().then(resolve); };
40
46
  process.once('SIGINT', shutdown);
@@ -0,0 +1,6 @@
1
+ import { compare } from '../../retrieval-eval';
2
+ import type { EvalResultFile } from '../../interfaces/IRetrievalEvaluator';
3
+ export declare function compareWithBaseline(projectRoot: string, baselinePath: string, resultFile: EvalResultFile): {
4
+ baselinePath: string;
5
+ result: ReturnType<typeof compare>;
6
+ } | undefined;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.compareWithBaseline = compareWithBaseline;
37
+ const path = __importStar(require("path"));
38
+ const retrieval_eval_1 = require("../../retrieval-eval");
39
+ const eval_results_1 = require("../../eval-results");
40
+ function compareWithBaseline(projectRoot, baselinePath, resultFile) {
41
+ let comparison;
42
+ try {
43
+ const baseline = (0, eval_results_1.readResultFile)(path.resolve(projectRoot, baselinePath));
44
+ const cmp = (0, retrieval_eval_1.compare)(baseline, resultFile);
45
+ comparison = { baselinePath, result: cmp };
46
+ for (const line of (0, eval_results_1.renderComparison)(baselinePath, cmp))
47
+ console.log(line);
48
+ }
49
+ catch (err) {
50
+ console.error(`\nFailed to read baseline '${baselinePath}': ${err.message}`);
51
+ process.exitCode = 1;
52
+ }
53
+ return comparison;
54
+ }
@@ -0,0 +1,6 @@
1
+ export interface EvalArgs {
2
+ suitePath: string;
3
+ baselinePath: string | null;
4
+ projectFilter: string | null;
5
+ }
6
+ export declare function parseEvalArgs(args: string[]): EvalArgs;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseEvalArgs = parseEvalArgs;
37
+ const path = __importStar(require("path"));
38
+ const DEFAULT_SUITE_DIR = path.join('benchmarks', 'eval');
39
+ function parseSuiteFlag(args) {
40
+ const i = args.indexOf('--suite');
41
+ if (i === -1)
42
+ return DEFAULT_SUITE_DIR;
43
+ const next = args[i + 1];
44
+ if (next === undefined || next.startsWith('-'))
45
+ throw new Error('--suite requires a path');
46
+ return next;
47
+ }
48
+ function parseBaselineFlag(args) {
49
+ const i = args.indexOf('--baseline');
50
+ if (i === -1)
51
+ return null;
52
+ const next = args[i + 1];
53
+ if (next === undefined || next.startsWith('-'))
54
+ throw new Error('--baseline requires a path');
55
+ return next;
56
+ }
57
+ function parseProjectFlag(args) {
58
+ const i = args.indexOf('--project');
59
+ if (i === -1)
60
+ return null;
61
+ const next = args[i + 1];
62
+ if (next === undefined || next.startsWith('-'))
63
+ throw new Error('--project requires a name');
64
+ return next;
65
+ }
66
+ function parseEvalArgs(args) {
67
+ const suitePath = parseSuiteFlag(args);
68
+ const baselinePath = parseBaselineFlag(args);
69
+ const projectFilter = parseProjectFlag(args);
70
+ return { suitePath, baselinePath, projectFilter };
71
+ }
@@ -0,0 +1,6 @@
1
+ import type { Config } from '../../config';
2
+ import type { IDatabase } from '../../interfaces';
3
+ import type { ICorpusInspector } from '../../interfaces/ICorpusInspector';
4
+ import type { CorpusRef, CorpusRecord } from '../../interfaces/IRetrievalEvaluator';
5
+ export declare function refusesMovedCorpus(runCorpora: CorpusRef[], config: Config, projectRoot: string, inspector: ICorpusInspector): Promise<boolean>;
6
+ export declare function recordCorpora(db: IDatabase, runCorpora: CorpusRef[], projectDirs: Map<string, string | null>): Promise<CorpusRecord[]>;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.refusesMovedCorpus = refusesMovedCorpus;
37
+ exports.recordCorpora = recordCorpora;
38
+ const path = __importStar(require("path"));
39
+ const eval_corpus_1 = require("../../eval-corpus");
40
+ const retrieval_eval_1 = require("../../retrieval-eval");
41
+ const KEPT_CORPUS_DIR = path.join('benchmarks', 'corpus');
42
+ async function refusesMovedCorpus(runCorpora, config, projectRoot, inspector) {
43
+ let refused = false;
44
+ for (const corpus of runCorpora) {
45
+ let failures;
46
+ try {
47
+ failures = await (0, eval_corpus_1.checkCorpus)(corpus, path.join(config.workspaceRoot, corpus.root), path.join(projectRoot, KEPT_CORPUS_DIR, corpus.root), inspector);
48
+ }
49
+ catch (err) {
50
+ failures = [`cannot inspect the checkout: ${err.message}`];
51
+ }
52
+ if (failures.length === 0)
53
+ continue;
54
+ refused = true;
55
+ console.error(`\nCorpus ${corpus.root} does not match ${corpus.commit}:`);
56
+ for (const f of failures)
57
+ console.error(` - ${f}`);
58
+ }
59
+ if (refused) {
60
+ console.error('\nNo search was run and no result file was written.');
61
+ process.exitCode = 1;
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ async function recordCorpora(db, runCorpora, projectDirs) {
67
+ const corpusRecords = [];
68
+ for (const corpus of runCorpora) {
69
+ const projects = [...projectDirs].filter(([, dir]) => dir !== null && (0, retrieval_eval_1.isUnderRoot)(dir, corpus.root)).map(([name]) => name).sort();
70
+ const started = Date.now();
71
+ const record = { ...corpus, projects, ...(await (0, eval_corpus_1.fingerprintCorpus)(db, projects)) };
72
+ console.log(`Corpus ${corpus.root}: ${record.chunks} chunks in ${projects.length} project(s), fingerprint ${record.fingerprint} (${((Date.now() - started) / 1000).toFixed(1)}s)`);
73
+ corpusRecords.push(record);
74
+ }
75
+ return corpusRecords;
76
+ }
@@ -0,0 +1,17 @@
1
+ import type { Config } from '../../config';
2
+ import type { IndexMeta } from '../../interfaces/IDatabase';
3
+ import type { ResultMetadata, ObservedSearchParams, VectorIndexRecord, CorpusRecord } from '../../interfaces/IRetrievalEvaluator';
4
+ export declare function gitCommit(projectRoot: string): string;
5
+ export declare function hashContent(text: string): string;
6
+ export interface ResultMetadataInput {
7
+ suitePath: string;
8
+ rawContent: string;
9
+ config: Config;
10
+ indexMeta: IndexMeta | null;
11
+ observed: ObservedSearchParams;
12
+ vectorIndex: VectorIndexRecord;
13
+ corpusRecords: CorpusRecord[];
14
+ liveCases: number;
15
+ projectRoot: string;
16
+ }
17
+ export declare function buildResultMetadata(input: ResultMetadataInput): ResultMetadata;