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
@@ -0,0 +1,75 @@
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.gitCommit = gitCommit;
37
+ exports.hashContent = hashContent;
38
+ exports.buildResultMetadata = buildResultMetadata;
39
+ const crypto = __importStar(require("crypto"));
40
+ const child_process_1 = require("child_process");
41
+ function gitCommit(projectRoot) {
42
+ try {
43
+ return (0, child_process_1.execFileSync)('git', ['rev-parse', 'HEAD'], { cwd: projectRoot, encoding: 'utf-8' }).trim();
44
+ }
45
+ catch {
46
+ return 'unknown';
47
+ }
48
+ }
49
+ function hashContent(text) {
50
+ return crypto.createHash('sha256').update(text).digest('hex').slice(0, 16);
51
+ }
52
+ function buildResultMetadata(input) {
53
+ const { suitePath, rawContent, config, indexMeta, observed, vectorIndex, corpusRecords, liveCases, projectRoot } = input;
54
+ return {
55
+ suitePath,
56
+ suiteHash: hashContent(rawContent),
57
+ embeddingProvider: config.embedding.provider,
58
+ embeddingModel: config.embedding.model,
59
+ rerankerModel: config.reranker.enabled ? config.reranker.model : null,
60
+ indexMeta: indexMeta ? { provider: indexMeta.provider, model: indexMeta.model, dimensions: indexMeta.dimensions } : null,
61
+ gitCommit: gitCommit(projectRoot),
62
+ timestamp: new Date().toISOString(),
63
+ conditions: {
64
+ thresholds: observed.thresholds,
65
+ overfetch: config.reranker.overfetch,
66
+ candidateFloor: config.reranker.candidateFloor,
67
+ fetchLimit: observed.fetchLimit,
68
+ efSearch: observed.efSearch,
69
+ iterativeScan: observed.iterativeScan,
70
+ },
71
+ vectorIndex,
72
+ corpora: corpusRecords,
73
+ liveCases,
74
+ };
75
+ }
@@ -0,0 +1,3 @@
1
+ import type { IDatabase } from '../../interfaces';
2
+ import type { IndexInspector } from '../../interfaces/IRetrievalEvaluator';
3
+ export declare function createIndexInspector(db: IDatabase, projectDirs: Map<string, string | null>): IndexInspector;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIndexInspector = createIndexInspector;
4
+ function createIndexInspector(db, projectDirs) {
5
+ const knownFilesCache = new Map();
6
+ return {
7
+ async isFileIndexed(project, file) {
8
+ if (!knownFilesCache.has(project))
9
+ knownFilesCache.set(project, db.listKnownFiles(project));
10
+ const files = await knownFilesCache.get(project);
11
+ return files.includes(file);
12
+ },
13
+ async ownerPathsOfFile(project, file) {
14
+ const rows = await db.query(`SELECT DISTINCT "ownerPath" FROM code_chunk WHERE "serviceName" = $1 AND "filePath" = $2 AND "ownerPath" IS NOT NULL`, [project, file]);
15
+ return rows.map(r => r.ownerPath);
16
+ },
17
+ async projectDir(project) {
18
+ return projectDirs.get(project) ?? null;
19
+ },
20
+ };
21
+ }
@@ -0,0 +1,3 @@
1
+ import type { IChunkSearch } from '../../interfaces';
2
+ import type { SearchFn } from '../../interfaces/IRetrievalEvaluator';
3
+ export declare function createStagedSearch(chunks: IChunkSearch): SearchFn;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStagedSearch = createStagedSearch;
4
+ const toHits = (rows) => rows.map(r => ({ filePath: r.filePath, ownerPath: r.ownerPath ?? null }));
5
+ function createStagedSearch(chunks) {
6
+ return async (query, limit, project, threshold) => {
7
+ const prepared = await chunks.prepareQuery(query);
8
+ const r = await chunks.searchChunksWithStages(prepared.query, limit, project, threshold, undefined, limit);
9
+ return {
10
+ pool: toHits(r.pool),
11
+ stages: r.stages.reranked
12
+ ? { vector: toHits(r.stages.vector), reranked: toHits(r.stages.reranked) }
13
+ : { vector: toHits(r.stages.vector) },
14
+ rerankFailed: r.rerankFailed,
15
+ fetchLimit: r.fetchLimit,
16
+ indexParams: r.indexParams,
17
+ threshold: r.threshold,
18
+ };
19
+ };
20
+ }
@@ -0,0 +1,8 @@
1
+ import type { EvalSuite, CorpusRef } from '../../interfaces/IRetrievalEvaluator';
2
+ export interface LoadedSuite {
3
+ suite: EvalSuite;
4
+ corpora: CorpusRef[];
5
+ rawContent: string;
6
+ label: string;
7
+ }
8
+ export declare function loadSuite(projectRoot: string, suitePath: string): LoadedSuite;
@@ -0,0 +1,52 @@
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.loadSuite = loadSuite;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const retrieval_eval_1 = require("../../retrieval-eval");
40
+ function loadSuite(projectRoot, suitePath) {
41
+ const resolved = path.resolve(projectRoot, suitePath);
42
+ const stat = fs.statSync(resolved);
43
+ if (stat.isDirectory()) {
44
+ const files = fs.readdirSync(resolved).filter(f => f.endsWith('.json')).sort();
45
+ const parts = files.map(f => fs.readFileSync(path.join(resolved, f), 'utf-8'));
46
+ const suites = parts.map(text => (0, retrieval_eval_1.parseSuite)(JSON.parse(text)));
47
+ return { suite: (0, retrieval_eval_1.mergeSuites)(suites), corpora: (0, retrieval_eval_1.corporaOf)(suites), rawContent: parts.join('\n'), label: 'all' };
48
+ }
49
+ const text = fs.readFileSync(resolved, 'utf-8');
50
+ const suite = (0, retrieval_eval_1.parseSuite)(JSON.parse(text));
51
+ return { suite, corpora: (0, retrieval_eval_1.corporaOf)([suite]), rawContent: text, label: path.basename(resolved, '.json') };
52
+ }
@@ -0,0 +1,2 @@
1
+ import type { IDatabase, IEmbedder } from '../../interfaces';
2
+ export declare function isBackendAvailable(db: IDatabase, embedder: IEmbedder): Promise<boolean>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isBackendAvailable = isBackendAvailable;
4
+ const error_record_1 = require("../../error-record");
5
+ async function isBackendAvailable(db, embedder) {
6
+ try {
7
+ await db.query('SELECT 1');
8
+ await embedder.embed('probe', 'document');
9
+ return true;
10
+ }
11
+ catch (err) {
12
+ console.error(`Indexing backend unavailable: ${(0, error_record_1.rootCauseMessage)(err).replace(/\s*[\r\n]+\s*/g, ' ')}`);
13
+ return false;
14
+ }
15
+ }
@@ -0,0 +1,3 @@
1
+ import type { IndexerService } from '../../services/IndexerService';
2
+ import type { IEmbedder } from '../../interfaces';
3
+ export declare function prepareEmbedding(embedder: IEmbedder, indexer: IndexerService): Promise<boolean>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareEmbedding = prepareEmbedding;
4
+ async function prepareEmbedding(embedder, indexer) {
5
+ try {
6
+ await embedder.ensureModelAvailable?.();
7
+ const meta = await indexer.prepareEmbeddingSchema();
8
+ console.log(`Embedding: ${meta.provider} / ${meta.model} (${meta.dimensions} dims)`);
9
+ }
10
+ catch (err) {
11
+ console.error(`\nEmbedding setup failed: ${err.message}`);
12
+ process.exitCode = 1;
13
+ return false;
14
+ }
15
+ return true;
16
+ }
@@ -0,0 +1,2 @@
1
+ import type { IndexStats } from '../../services/IndexerService';
2
+ export declare function printIndexSummary(allStats: IndexStats[]): void;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.printIndexSummary = printIndexSummary;
4
+ function printIndexSummary(allStats) {
5
+ const cols = { name: 30, num: 8 };
6
+ const line = '─'.repeat(cols.name + cols.num * 5 + 5);
7
+ console.log('\n=== Indexing Summary ===');
8
+ 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));
9
+ console.log(line);
10
+ for (const s of allStats) {
11
+ 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));
12
+ }
13
+ console.log(line);
14
+ const total = allStats.reduce((acc, s) => ({
15
+ indexed: acc.indexed + s.indexed,
16
+ skipped: acc.skipped + s.skipped,
17
+ failed: acc.failed + s.failed,
18
+ chunks: acc.chunks + s.chunks,
19
+ elapsedSec: acc.elapsedSec + s.elapsedSec,
20
+ }), { indexed: 0, skipped: 0, failed: 0, chunks: 0, elapsedSec: 0 });
21
+ 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));
22
+ }
@@ -0,0 +1,3 @@
1
+ import type { Config } from '../../config';
2
+ import type { IDatabase } from '../../interfaces';
3
+ export declare function refusesLegacyOllamaIndex(db: IDatabase, config: Config): Promise<boolean>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.refusesLegacyOllamaIndex = refusesLegacyOllamaIndex;
4
+ const legacy_ollama_index_1 = require("../../services/legacy-ollama-index");
5
+ async function refusesLegacyOllamaIndex(db, config) {
6
+ let identity;
7
+ try {
8
+ identity = await (0, legacy_ollama_index_1.resolveIndexedIdentity)(db);
9
+ }
10
+ catch (err) {
11
+ console.error(`\n${err.message}`);
12
+ process.exitCode = 1;
13
+ return true;
14
+ }
15
+ if (identity?.provider === 'ollama') {
16
+ console.error(`\nThe existing index was built with ${identity.provider}/${identity.model}, but "ollama" is no ` +
17
+ `longer a supported embedding provider (configured: ${config.embedding.provider}/${config.embedding.model}). ` +
18
+ `Run \`rag-index --reindex\` to confirm rebuilding the index under the configured provider.`);
19
+ process.exitCode = 1;
20
+ return true;
21
+ }
22
+ return false;
23
+ }
@@ -0,0 +1,3 @@
1
+ import type { IndexerService } from '../../services/IndexerService';
2
+ import type { DiscoveredProject } from '../../interfaces';
3
+ export declare function pruneUnselected(indexer: IndexerService, projects: DiscoveredProject[]): Promise<boolean>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pruneUnselected = pruneUnselected;
4
+ async function pruneUnselected(indexer, projects) {
5
+ let pruneResult;
6
+ try {
7
+ pruneResult = await indexer.pruneProjects(projects.map(p => p.name));
8
+ }
9
+ catch (err) {
10
+ console.error(`\nPruning failed: ${err.message}`);
11
+ process.exitCode = 1;
12
+ return false;
13
+ }
14
+ const { removed, failed } = pruneResult;
15
+ for (const name of removed) {
16
+ console.log(`Removed project ${name} (not selected)`);
17
+ }
18
+ if (failed.length > 0) {
19
+ process.exitCode = 1;
20
+ }
21
+ return true;
22
+ }
@@ -0,0 +1,8 @@
1
+ import type { Config } from '../../config';
2
+ import type { IndexArgs } from '../../index-args';
3
+ import type { DiscoveredProject, IProjectDiscovery } from '../../interfaces';
4
+ export interface ScanTargets {
5
+ discovered: DiscoveredProject[];
6
+ scanTargets?: DiscoveredProject[];
7
+ }
8
+ export declare function resolveScanTargets(discovery: IProjectDiscovery, config: Config, args: IndexArgs): Promise<ScanTargets | null>;
@@ -0,0 +1,107 @@
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.resolveScanTargets = resolveScanTargets;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const project_selector_1 = require("../../project-selector");
40
+ const project_scope_1 = require("../../project-scope");
41
+ async function resolveScanTargets(discovery, config, args) {
42
+ const { projectFlag, requireCwd } = args;
43
+ let discovered;
44
+ try {
45
+ discovered = discovery.discover(config.workspaceRoot);
46
+ }
47
+ catch (err) {
48
+ console.error(`\n${err.message}`);
49
+ process.exitCode = 1;
50
+ return null;
51
+ }
52
+ if (requireCwd && projectFlag.name === undefined) {
53
+ console.error('\n--require-cwd needs --project <name>.');
54
+ process.exitCode = 1;
55
+ return null;
56
+ }
57
+ let scanTargets;
58
+ if (projectFlag.present) {
59
+ let name = projectFlag.name;
60
+ if (name === undefined) {
61
+ if (discovered.length === 0) {
62
+ console.error('\nNo projects available to select.');
63
+ process.exitCode = 1;
64
+ return null;
65
+ }
66
+ name = await (0, project_selector_1.selectSingleProject)(discovered);
67
+ if (name === undefined) {
68
+ process.exitCode = 1;
69
+ return null;
70
+ }
71
+ }
72
+ const { targets, notFound } = (0, project_scope_1.resolveProjectNames)([name], discovered);
73
+ if (notFound.length > 0) {
74
+ const available = (0, project_scope_1.listAvailableNames)(discovered).join(', ');
75
+ console.error(`\nProject '${notFound[0]}' not found. Available projects: ${available}`);
76
+ process.exitCode = 1;
77
+ return null;
78
+ }
79
+ if (requireCwd && !isInProjectDir(config, name, discovered)) {
80
+ process.exitCode = 1;
81
+ return null;
82
+ }
83
+ scanTargets = targets;
84
+ }
85
+ return { discovered, scanTargets };
86
+ }
87
+ function isInProjectDir(config, name, discovered) {
88
+ const { workspaceRoot } = config;
89
+ if (!path.isAbsolute(workspaceRoot)) {
90
+ console.error(`\nworkspaceRoot '${workspaceRoot}' is relative, so it moves with the current directory and --require-cwd cannot tell checkouts apart.`);
91
+ return false;
92
+ }
93
+ let cwd;
94
+ let projectDir;
95
+ try {
96
+ cwd = fs.realpathSync.native(process.cwd());
97
+ projectDir = fs.realpathSync.native((0, project_scope_1.matchedProjectDir)(name, discovered));
98
+ }
99
+ catch (err) {
100
+ console.error(`\n${err.message}`);
101
+ return false;
102
+ }
103
+ if (cwd === projectDir)
104
+ return true;
105
+ console.error(`\nCurrent directory ${cwd} is not the directory of project '${name}' (${projectDir}).`);
106
+ return false;
107
+ }
@@ -1,7 +1,3 @@
1
- /**
2
- * Own module (not `config.ts`) so `config-store.ts` can throw it too without
3
- * an import cycle — `config.ts` imports from `config-store.ts`.
4
- */
5
1
  export declare class ConfigError extends Error {
6
2
  constructor(message: string);
7
3
  }
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ConfigError = void 0;
4
- /**
5
- * Own module (not `config.ts`) so `config-store.ts` can throw it too without
6
- * an import cycle — `config.ts` imports from `config-store.ts`.
7
- */
8
4
  class ConfigError extends Error {
9
5
  constructor(message) {
10
6
  super(message);
@@ -42,6 +42,7 @@ declare const jsonSchema: z.ZodObject<{
42
42
  enabled: z.ZodOptional<z.ZodBoolean>;
43
43
  provider: z.ZodOptional<z.ZodEnum<{
44
44
  "openai-compatible": "openai-compatible";
45
+ voyage: "voyage";
45
46
  }>>;
46
47
  baseURL: z.ZodOptional<z.ZodString>;
47
48
  apiKey: z.ZodOptional<z.ZodString>;
@@ -58,24 +59,11 @@ declare const jsonSchema: z.ZodObject<{
58
59
  warn: "warn";
59
60
  }>>;
60
61
  dir: z.ZodOptional<z.ZodString>;
61
- searchMetrics: z.ZodOptional<z.ZodBoolean>;
62
62
  }, z.core.$strip>>;
63
63
  workspaceRoot: z.ZodOptional<z.ZodString>;
64
64
  }, z.core.$strip>;
65
65
  export type JsonConfig = z.infer<typeof jsonSchema>;
66
66
  export declare const ALL_KEYS: string[];
67
- /**
68
- * Single source of truth for built-in defaults, keyed by raw config.json dotted
69
- * key. Consumed both by the web dashboard (`GET /api/defaults`) and by
70
- * `resolvedSchema` in `src/config.ts`, whose `.default(...)` calls reference
71
- * these values — so the runtime default and the dashboard-displayed default
72
- * cannot diverge. `as const` keeps the literal types so those `.default()`
73
- * lookups stay type-safe. Keys omitted here have no static default: required
74
- * fields (db.host/user/password) and values derived at runtime — db.name →
75
- * rag_<user>, and the provider-dependent URLs (embedding.baseURL,
76
- * reranker.baseURL, reranker.url), which are computed in the `Config`
77
- * constructor per provider rather than through a schema `.default(...)`.
78
- */
79
67
  export declare const CONFIG_DEFAULTS: {
80
68
  readonly 'db.port': 5433;
81
69
  readonly 'embedding.provider': "infinity";
@@ -87,7 +75,6 @@ export declare const CONFIG_DEFAULTS: {
87
75
  readonly 'indexing.embedBatchSize': 5;
88
76
  readonly 'indexing.astBatchSize': 3000;
89
77
  readonly 'indexing.chunkStrategy': "ast";
90
- readonly 'search.similarityThreshold': 0.6;
91
78
  readonly 'search.defaultLimit': 5;
92
79
  readonly 'search.maxLimit': 20;
93
80
  readonly 'reranker.enabled': true;
@@ -97,54 +84,13 @@ export declare const CONFIG_DEFAULTS: {
97
84
  readonly 'reranker.overfetch': 5;
98
85
  readonly 'reranker.candidateFloor': 80;
99
86
  readonly 'logging.level': "error";
100
- readonly 'logging.searchMetrics': false;
101
87
  };
102
88
  export declare function readConfigJson(): JsonConfig | null;
103
- /**
104
- * Detect a raw (pre-migration) config object that still selects the removed
105
- * `ollama` embedding provider — explicitly, via a legacy top-level `ollama`
106
- * block, or implicitly (no `provider` set, but `baseURL`/`model` point at
107
- * Ollama's defaults) — and throw a `ConfigError` with migration guidance
108
- * instead of letting it validate under a silently reinterpreted provider.
109
- * Runs before `migrateRawConfig` so a legacy `ollama.*` block is never
110
- * converted into an `embedding` block first. Pure — never mutates `raw`.
111
- */
112
89
  export declare function detectFormerOllamaConfig(raw: unknown): void;
113
- /**
114
- * Migrate a legacy raw config object to the current shape, in place of a
115
- * versioned migration system. Pure — returns a new object, never mutates input.
116
- *
117
- * - Removed translation keys (`search.autoTranslate`, `search.translateModel`)
118
- * are dropped so they neither validate-fail nor take effect.
119
- * - Legacy `reranker.provider: 'ollama'` (a dead value — Ollama has no rerank
120
- * API) is rewritten to `openai-compatible`, and a stale `/api/rerank` URL is
121
- * dropped so it re-derives to `/rerank`. Otherwise the tightened enum would
122
- * fail validation on existing configs and lock the user out.
123
- *
124
- * A legacy top-level `ollama` block reaches here only when `detectFormerOllamaConfig`
125
- * did not already reject it (i.e. an `embedding` block is also present); it is
126
- * dropped rather than merged. Exported for unit testing.
127
- */
128
90
  export declare function migrateRawConfig(raw: unknown): unknown;
129
- /**
130
- * Validate a raw (pre-migration) config object against the Zod schema: first
131
- * `detectFormerOllamaConfig` (a `ConfigError` on a former-Ollama config takes
132
- * priority over both migration and the regular Zod enum rejection), then
133
- * `migrateRawConfig`, then the schema itself. Unknown keys (e.g. the "$schema"
134
- * editor reference) are stripped. Throws with a caller-friendly message on
135
- * validation failure. The single entry point for both `readConfigJson` and
136
- * `PUT /api/config`, so both apply identical rules with an identical message.
137
- * Pure — no file I/O.
138
- */
139
91
  export declare function parseConfig(raw: unknown, source?: string): JsonConfig;
140
- /** Build the JSON Schema object generated from the Zod config schema. Pure. */
141
92
  export declare function buildJsonSchema(): Record<string, unknown>;
142
93
  export declare function writeConfigJson(data: JsonConfig): void;
143
- /**
144
- * Generate a JSON Schema from the Zod config schema and write it next to
145
- * config.json. Editors resolve it via the "$schema" reference and provide
146
- * key autocomplete, type hints, and inline validation while editing.
147
- */
148
94
  export declare function writeSchemaFile(): void;
149
95
  export declare function getNestedValue(cfg: JsonConfig, key: string): unknown;
150
96
  export declare function setNestedValue(cfg: JsonConfig, key: string, raw: string): JsonConfig;