lmgrep 0.1.17 → 0.2.0

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 (401) hide show
  1. package/README.md +226 -63
  2. package/completions/_lmgrep +49 -40
  3. package/dist/application/Lmgrep.d.ts +107 -0
  4. package/dist/application/Lmgrep.js +99 -0
  5. package/dist/application/Lmgrep.js.map +1 -0
  6. package/dist/application/LmgrepFactory.d.ts +40 -0
  7. package/dist/application/LmgrepFactory.js +155 -0
  8. package/dist/application/LmgrepFactory.js.map +1 -0
  9. package/dist/application/indexing/BranchBootstrapper.d.ts +21 -0
  10. package/dist/application/indexing/BranchBootstrapper.js +52 -0
  11. package/dist/application/indexing/BranchBootstrapper.js.map +1 -0
  12. package/dist/application/indexing/BranchManifestSweeper.d.ts +17 -0
  13. package/dist/application/indexing/BranchManifestSweeper.js +35 -0
  14. package/dist/application/indexing/BranchManifestSweeper.js.map +1 -0
  15. package/dist/application/indexing/Duration.d.ts +9 -0
  16. package/dist/application/indexing/Duration.js +25 -0
  17. package/dist/application/indexing/Duration.js.map +1 -0
  18. package/dist/application/indexing/EmbeddingAbortError.d.ts +11 -0
  19. package/dist/application/indexing/EmbeddingAbortError.js +20 -0
  20. package/dist/application/indexing/EmbeddingAbortError.js.map +1 -0
  21. package/dist/application/indexing/EmbeddingPipeline.d.ts +59 -0
  22. package/dist/application/indexing/EmbeddingPipeline.js +140 -0
  23. package/dist/application/indexing/EmbeddingPipeline.js.map +1 -0
  24. package/dist/application/indexing/IndexBuilder.d.ts +112 -0
  25. package/dist/application/indexing/IndexBuilder.js +370 -0
  26. package/dist/application/indexing/IndexBuilder.js.map +1 -0
  27. package/dist/application/indexing/IndexingProgress.d.ts +34 -0
  28. package/dist/application/indexing/IndexingProgress.js +2 -0
  29. package/dist/application/indexing/IndexingProgress.js.map +1 -0
  30. package/dist/application/operations/Deadline.d.ts +13 -0
  31. package/dist/application/operations/Deadline.js +29 -0
  32. package/dist/application/operations/Deadline.js.map +1 -0
  33. package/dist/application/operations/HealthMonitor.d.ts +58 -0
  34. package/dist/application/operations/HealthMonitor.js +128 -0
  35. package/dist/application/operations/HealthMonitor.js.map +1 -0
  36. package/dist/application/operations/IndexAlternatives.d.ts +35 -0
  37. package/dist/application/operations/IndexAlternatives.js +61 -0
  38. package/dist/application/operations/IndexAlternatives.js.map +1 -0
  39. package/dist/application/operations/IndexInventory.d.ts +69 -0
  40. package/dist/application/operations/IndexInventory.js +99 -0
  41. package/dist/application/operations/IndexInventory.js.map +1 -0
  42. package/dist/application/operations/StatusService.d.ts +90 -0
  43. package/dist/application/operations/StatusService.js +171 -0
  44. package/dist/application/operations/StatusService.js.map +1 -0
  45. package/dist/application/operations/WatchService.d.ts +67 -0
  46. package/dist/application/operations/WatchService.js +145 -0
  47. package/dist/application/operations/WatchService.js.map +1 -0
  48. package/dist/application/operations/WorkingTreeDiff.d.ts +19 -0
  49. package/dist/application/operations/WorkingTreeDiff.js +36 -0
  50. package/dist/application/operations/WorkingTreeDiff.js.map +1 -0
  51. package/dist/application/research/ResearchAgent.d.ts +68 -0
  52. package/dist/application/research/ResearchAgent.js +201 -0
  53. package/dist/application/research/ResearchAgent.js.map +1 -0
  54. package/dist/application/research/ResearchPrompts.d.ts +16 -0
  55. package/dist/application/research/ResearchPrompts.js +34 -0
  56. package/dist/application/research/ResearchPrompts.js.map +1 -0
  57. package/dist/application/search/SearchCriteria.d.ts +37 -0
  58. package/dist/application/search/SearchCriteria.js +48 -0
  59. package/dist/application/search/SearchCriteria.js.map +1 -0
  60. package/dist/application/search/SearchService.d.ts +36 -0
  61. package/dist/application/search/SearchService.js +108 -0
  62. package/dist/application/search/SearchService.js.map +1 -0
  63. package/dist/application/search/SearchTargetResolver.d.ts +56 -0
  64. package/dist/application/search/SearchTargetResolver.js +104 -0
  65. package/dist/application/search/SearchTargetResolver.js.map +1 -0
  66. package/dist/cli.d.ts +1 -1
  67. package/dist/cli.js +5 -754
  68. package/dist/cli.js.map +1 -1
  69. package/dist/domain/config/ConfigSource.d.ts +16 -0
  70. package/dist/domain/config/ConfigSource.js +2 -0
  71. package/dist/domain/config/ConfigSource.js.map +1 -0
  72. package/dist/domain/config/LmgrepConfig.d.ts +53 -0
  73. package/dist/domain/config/LmgrepConfig.js +2 -0
  74. package/dist/domain/config/LmgrepConfig.js.map +1 -0
  75. package/dist/domain/corpus/Chunk.d.ts +49 -0
  76. package/dist/domain/corpus/Chunk.js +60 -0
  77. package/dist/domain/corpus/Chunk.js.map +1 -0
  78. package/dist/domain/corpus/CodeLocation.d.ts +18 -0
  79. package/dist/domain/corpus/CodeLocation.js +34 -0
  80. package/dist/domain/corpus/CodeLocation.js.map +1 -0
  81. package/dist/domain/corpus/ContentHash.d.ts +15 -0
  82. package/dist/domain/corpus/ContentHash.js +30 -0
  83. package/dist/domain/corpus/ContentHash.js.map +1 -0
  84. package/dist/domain/corpus/FileVersion.d.ts +31 -0
  85. package/dist/domain/corpus/FileVersion.js +47 -0
  86. package/dist/domain/corpus/FileVersion.js.map +1 -0
  87. package/dist/domain/corpus/SourceFile.d.ts +26 -0
  88. package/dist/domain/corpus/SourceFile.js +47 -0
  89. package/dist/domain/corpus/SourceFile.js.map +1 -0
  90. package/dist/domain/corpus/Vector.d.ts +37 -0
  91. package/dist/domain/corpus/Vector.js +96 -0
  92. package/dist/domain/corpus/Vector.js.map +1 -0
  93. package/dist/domain/ports/ChatModelPort.d.ts +57 -0
  94. package/dist/domain/ports/ChatModelPort.js +2 -0
  95. package/dist/domain/ports/ChatModelPort.js.map +1 -0
  96. package/dist/domain/ports/ChunkRepositoryPort.d.ts +42 -0
  97. package/dist/domain/ports/ChunkRepositoryPort.js +2 -0
  98. package/dist/domain/ports/ChunkRepositoryPort.js.map +1 -0
  99. package/dist/domain/ports/ChunkerPort.d.ts +5 -0
  100. package/dist/domain/ports/ChunkerPort.js +2 -0
  101. package/dist/domain/ports/ChunkerPort.js.map +1 -0
  102. package/dist/domain/ports/DatabaseSessionPort.d.ts +10 -0
  103. package/dist/domain/ports/DatabaseSessionPort.js +2 -0
  104. package/dist/domain/ports/DatabaseSessionPort.js.map +1 -0
  105. package/dist/domain/ports/EmbedderPort.d.ts +14 -0
  106. package/dist/domain/ports/EmbedderPort.js +2 -0
  107. package/dist/domain/ports/EmbedderPort.js.map +1 -0
  108. package/dist/domain/ports/FileManifestRepositoryPort.d.ts +32 -0
  109. package/dist/domain/ports/FileManifestRepositoryPort.js +2 -0
  110. package/dist/domain/ports/FileManifestRepositoryPort.js.map +1 -0
  111. package/dist/domain/ports/GitPort.d.ts +24 -0
  112. package/dist/domain/ports/GitPort.js +2 -0
  113. package/dist/domain/ports/GitPort.js.map +1 -0
  114. package/dist/domain/ports/IndexMaintenancePort.d.ts +58 -0
  115. package/dist/domain/ports/IndexMaintenancePort.js +2 -0
  116. package/dist/domain/ports/IndexMaintenancePort.js.map +1 -0
  117. package/dist/domain/ports/IndexMetadataPort.d.ts +23 -0
  118. package/dist/domain/ports/IndexMetadataPort.js +2 -0
  119. package/dist/domain/ports/IndexMetadataPort.js.map +1 -0
  120. package/dist/domain/ports/LockPort.d.ts +17 -0
  121. package/dist/domain/ports/LockPort.js +2 -0
  122. package/dist/domain/ports/LockPort.js.map +1 -0
  123. package/dist/domain/ports/LoggerPort.d.ts +5 -0
  124. package/dist/domain/ports/LoggerPort.js +2 -0
  125. package/dist/domain/ports/LoggerPort.js.map +1 -0
  126. package/dist/domain/ports/ProjectIndexesPort.d.ts +20 -0
  127. package/dist/domain/ports/ProjectIndexesPort.js +2 -0
  128. package/dist/domain/ports/ProjectIndexesPort.js.map +1 -0
  129. package/dist/domain/ports/ProjectRegistryPort.d.ts +42 -0
  130. package/dist/domain/ports/ProjectRegistryPort.js +2 -0
  131. package/dist/domain/ports/ProjectRegistryPort.js.map +1 -0
  132. package/dist/domain/ports/StateDirectoryPort.d.ts +29 -0
  133. package/dist/domain/ports/StateDirectoryPort.js +2 -0
  134. package/dist/domain/ports/StateDirectoryPort.js.map +1 -0
  135. package/dist/domain/ports/WorkspacePort.d.ts +38 -0
  136. package/dist/domain/ports/WorkspacePort.js +2 -0
  137. package/dist/domain/ports/WorkspacePort.js.map +1 -0
  138. package/dist/domain/project/Branch.d.ts +20 -0
  139. package/dist/domain/project/Branch.js +33 -0
  140. package/dist/domain/project/Branch.js.map +1 -0
  141. package/dist/domain/project/DatabaseLocation.d.ts +32 -0
  142. package/dist/domain/project/DatabaseLocation.js +35 -0
  143. package/dist/domain/project/DatabaseLocation.js.map +1 -0
  144. package/dist/domain/project/IndexMetadata.d.ts +17 -0
  145. package/dist/domain/project/IndexMetadata.js +2 -0
  146. package/dist/domain/project/IndexMetadata.js.map +1 -0
  147. package/dist/domain/project/ModelIdentity.d.ts +58 -0
  148. package/dist/domain/project/ModelIdentity.js +97 -0
  149. package/dist/domain/project/ModelIdentity.js.map +1 -0
  150. package/dist/domain/project/Project.d.ts +17 -0
  151. package/dist/domain/project/Project.js +21 -0
  152. package/dist/domain/project/Project.js.map +1 -0
  153. package/dist/domain/project/ProjectId.d.ts +28 -0
  154. package/dist/domain/project/ProjectId.js +58 -0
  155. package/dist/domain/project/ProjectId.js.map +1 -0
  156. package/dist/domain/project/ProjectLocator.d.ts +112 -0
  157. package/dist/domain/project/ProjectLocator.js +178 -0
  158. package/dist/domain/project/ProjectLocator.js.map +1 -0
  159. package/dist/domain/research/Citation.d.ts +27 -0
  160. package/dist/domain/research/Citation.js +43 -0
  161. package/dist/domain/research/Citation.js.map +1 -0
  162. package/dist/domain/research/EvidenceLedger.d.ts +47 -0
  163. package/dist/domain/research/EvidenceLedger.js +111 -0
  164. package/dist/domain/research/EvidenceLedger.js.map +1 -0
  165. package/dist/domain/research/ResearchTrace.d.ts +19 -0
  166. package/dist/domain/research/ResearchTrace.js +22 -0
  167. package/dist/domain/research/ResearchTrace.js.map +1 -0
  168. package/dist/domain/retrieval/Hit.d.ts +19 -0
  169. package/dist/domain/retrieval/Hit.js +28 -0
  170. package/dist/domain/retrieval/Hit.js.map +1 -0
  171. package/dist/domain/retrieval/HitList.d.ts +35 -0
  172. package/dist/domain/retrieval/HitList.js +81 -0
  173. package/dist/domain/retrieval/HitList.js.map +1 -0
  174. package/dist/domain/retrieval/MissingIndexError.d.ts +11 -0
  175. package/dist/domain/retrieval/MissingIndexError.js +15 -0
  176. package/dist/domain/retrieval/MissingIndexError.js.map +1 -0
  177. package/dist/index.d.ts +43 -33
  178. package/dist/index.js +32 -215
  179. package/dist/index.js.map +1 -1
  180. package/dist/infrastructure/ai/AiSdkChatModel.d.ts +31 -0
  181. package/dist/infrastructure/ai/AiSdkChatModel.js +137 -0
  182. package/dist/infrastructure/ai/AiSdkChatModel.js.map +1 -0
  183. package/dist/infrastructure/ai/AiSdkEmbedder.d.ts +28 -0
  184. package/dist/infrastructure/ai/AiSdkEmbedder.js +79 -0
  185. package/dist/infrastructure/ai/AiSdkEmbedder.js.map +1 -0
  186. package/dist/infrastructure/ai/EmbeddingPrefixes.d.ts +21 -0
  187. package/dist/infrastructure/ai/EmbeddingPrefixes.js +40 -0
  188. package/dist/infrastructure/ai/EmbeddingPrefixes.js.map +1 -0
  189. package/dist/infrastructure/ai/LmStudioProbe.d.ts +18 -0
  190. package/dist/infrastructure/ai/LmStudioProbe.js +49 -0
  191. package/dist/infrastructure/ai/LmStudioProbe.js.map +1 -0
  192. package/dist/infrastructure/ai/LocalModelReloader.d.ts +21 -0
  193. package/dist/infrastructure/ai/LocalModelReloader.js +61 -0
  194. package/dist/infrastructure/ai/LocalModelReloader.js.map +1 -0
  195. package/dist/infrastructure/ai/LocalRuntimeDetector.d.ts +36 -0
  196. package/dist/infrastructure/ai/LocalRuntimeDetector.js +61 -0
  197. package/dist/infrastructure/ai/LocalRuntimeDetector.js.map +1 -0
  198. package/dist/infrastructure/ai/ModelRuntime.d.ts +32 -0
  199. package/dist/infrastructure/ai/ModelRuntime.js +2 -0
  200. package/dist/infrastructure/ai/ModelRuntime.js.map +1 -0
  201. package/dist/infrastructure/ai/OllamaProbe.d.ts +21 -0
  202. package/dist/infrastructure/ai/OllamaProbe.js +69 -0
  203. package/dist/infrastructure/ai/OllamaProbe.js.map +1 -0
  204. package/dist/infrastructure/ai/ProviderFailure.d.ts +16 -0
  205. package/dist/infrastructure/ai/ProviderFailure.js +35 -0
  206. package/dist/infrastructure/ai/ProviderFailure.js.map +1 -0
  207. package/dist/infrastructure/ai/ProviderModuleLoader.d.ts +13 -0
  208. package/dist/infrastructure/ai/ProviderModuleLoader.js +49 -0
  209. package/dist/infrastructure/ai/ProviderModuleLoader.js.map +1 -0
  210. package/dist/infrastructure/ai/ProviderRegistry.d.ts +37 -0
  211. package/dist/infrastructure/ai/ProviderRegistry.js +55 -0
  212. package/dist/infrastructure/ai/ProviderRegistry.js.map +1 -0
  213. package/dist/infrastructure/fs/ConfigLoader.d.ts +59 -0
  214. package/dist/infrastructure/fs/ConfigLoader.js +194 -0
  215. package/dist/infrastructure/fs/ConfigLoader.js.map +1 -0
  216. package/dist/infrastructure/fs/DatabaseLocks.d.ts +52 -0
  217. package/dist/infrastructure/fs/DatabaseLocks.js +92 -0
  218. package/dist/infrastructure/fs/DatabaseLocks.js.map +1 -0
  219. package/dist/infrastructure/fs/DiskUsage.d.ts +6 -0
  220. package/dist/infrastructure/fs/DiskUsage.js +41 -0
  221. package/dist/infrastructure/fs/DiskUsage.js.map +1 -0
  222. package/dist/infrastructure/fs/IndexableFileRules.d.ts +33 -0
  223. package/dist/infrastructure/fs/IndexableFileRules.js +177 -0
  224. package/dist/infrastructure/fs/IndexableFileRules.js.map +1 -0
  225. package/dist/infrastructure/fs/Loggers.d.ts +14 -0
  226. package/dist/infrastructure/fs/Loggers.js +18 -0
  227. package/dist/infrastructure/fs/Loggers.js.map +1 -0
  228. package/dist/infrastructure/fs/PidFileLock.d.ts +40 -0
  229. package/dist/infrastructure/fs/PidFileLock.js +97 -0
  230. package/dist/infrastructure/fs/PidFileLock.js.map +1 -0
  231. package/dist/infrastructure/fs/ProjectIndexes.d.ts +8 -0
  232. package/dist/infrastructure/fs/ProjectIndexes.js +35 -0
  233. package/dist/infrastructure/fs/ProjectIndexes.js.map +1 -0
  234. package/dist/infrastructure/fs/ProjectMetadataStore.d.ts +42 -0
  235. package/dist/infrastructure/fs/ProjectMetadataStore.js +86 -0
  236. package/dist/infrastructure/fs/ProjectMetadataStore.js.map +1 -0
  237. package/dist/infrastructure/fs/ProjectRegistry.d.ts +25 -0
  238. package/dist/infrastructure/fs/ProjectRegistry.js +83 -0
  239. package/dist/infrastructure/fs/ProjectRegistry.js.map +1 -0
  240. package/dist/infrastructure/fs/StateDirectory.d.ts +28 -0
  241. package/dist/infrastructure/fs/StateDirectory.js +71 -0
  242. package/dist/infrastructure/fs/StateDirectory.js.map +1 -0
  243. package/dist/infrastructure/fs/Workspace.d.ts +25 -0
  244. package/dist/infrastructure/fs/Workspace.js +90 -0
  245. package/dist/infrastructure/fs/Workspace.js.map +1 -0
  246. package/dist/infrastructure/git/GitClient.d.ts +34 -0
  247. package/dist/infrastructure/git/GitClient.js +74 -0
  248. package/dist/infrastructure/git/GitClient.js.map +1 -0
  249. package/dist/infrastructure/lancedb/ChunkRepository.d.ts +38 -0
  250. package/dist/infrastructure/lancedb/ChunkRepository.js +166 -0
  251. package/dist/infrastructure/lancedb/ChunkRepository.js.map +1 -0
  252. package/dist/infrastructure/lancedb/DatabaseImporter.d.ts +22 -0
  253. package/dist/infrastructure/lancedb/DatabaseImporter.js +74 -0
  254. package/dist/infrastructure/lancedb/DatabaseImporter.js.map +1 -0
  255. package/dist/infrastructure/lancedb/FileManifestRepository.d.ts +34 -0
  256. package/dist/infrastructure/lancedb/FileManifestRepository.js +137 -0
  257. package/dist/infrastructure/lancedb/FileManifestRepository.js.map +1 -0
  258. package/dist/infrastructure/lancedb/IndexMaintenance.d.ts +53 -0
  259. package/dist/infrastructure/lancedb/IndexMaintenance.js +227 -0
  260. package/dist/infrastructure/lancedb/IndexMaintenance.js.map +1 -0
  261. package/dist/infrastructure/lancedb/LanceTables.d.ts +67 -0
  262. package/dist/infrastructure/lancedb/LanceTables.js +159 -0
  263. package/dist/infrastructure/lancedb/LanceTables.js.map +1 -0
  264. package/dist/infrastructure/lancedb/NativeTuning.d.ts +1 -0
  265. package/dist/infrastructure/lancedb/NativeTuning.js +9 -0
  266. package/dist/infrastructure/lancedb/NativeTuning.js.map +1 -0
  267. package/dist/infrastructure/lancedb/RowReplication.d.ts +27 -0
  268. package/dist/infrastructure/lancedb/RowReplication.js +82 -0
  269. package/dist/infrastructure/lancedb/RowReplication.js.map +1 -0
  270. package/dist/infrastructure/lancedb/VectorIndexPolicy.d.ts +60 -0
  271. package/dist/infrastructure/lancedb/VectorIndexPolicy.js +72 -0
  272. package/dist/infrastructure/lancedb/VectorIndexPolicy.js.map +1 -0
  273. package/dist/infrastructure/p2p/IndexShare.d.ts +45 -0
  274. package/dist/infrastructure/p2p/IndexShare.js +160 -0
  275. package/dist/infrastructure/p2p/IndexShare.js.map +1 -0
  276. package/dist/infrastructure/p2p/PeerSwarm.d.ts +16 -0
  277. package/dist/infrastructure/p2p/PeerSwarm.js +41 -0
  278. package/dist/infrastructure/p2p/PeerSwarm.js.map +1 -0
  279. package/dist/infrastructure/p2p/SecureChannel.d.ts +60 -0
  280. package/dist/infrastructure/p2p/SecureChannel.js +71 -0
  281. package/dist/infrastructure/p2p/SecureChannel.js.map +1 -0
  282. package/dist/infrastructure/p2p/ShareCode.d.ts +25 -0
  283. package/dist/infrastructure/p2p/ShareCode.js +304 -0
  284. package/dist/infrastructure/p2p/ShareCode.js.map +1 -0
  285. package/dist/infrastructure/process/ProcessRegistry.d.ts +50 -0
  286. package/dist/infrastructure/process/ProcessRegistry.js +109 -0
  287. package/dist/infrastructure/process/ProcessRegistry.js.map +1 -0
  288. package/dist/infrastructure/treesitter/ChunkContextBuilder.d.ts +45 -0
  289. package/dist/infrastructure/treesitter/ChunkContextBuilder.js +159 -0
  290. package/dist/infrastructure/treesitter/ChunkContextBuilder.js.map +1 -0
  291. package/dist/infrastructure/treesitter/LanguageCatalog.d.ts +30 -0
  292. package/dist/{lib/chunker/languages.js → infrastructure/treesitter/LanguageCatalog.js} +65 -41
  293. package/dist/infrastructure/treesitter/LanguageCatalog.js.map +1 -0
  294. package/dist/infrastructure/treesitter/SlidingWindowChunker.d.ts +15 -0
  295. package/dist/infrastructure/treesitter/SlidingWindowChunker.js +42 -0
  296. package/dist/infrastructure/treesitter/SlidingWindowChunker.js.map +1 -0
  297. package/dist/infrastructure/treesitter/TreeSitterChunker.d.ts +42 -0
  298. package/dist/infrastructure/treesitter/TreeSitterChunker.js +163 -0
  299. package/dist/infrastructure/treesitter/TreeSitterChunker.js.map +1 -0
  300. package/dist/mcp.d.ts +1 -1
  301. package/dist/mcp.js +15 -61
  302. package/dist/mcp.js.map +1 -1
  303. package/dist/presentation/cli/Cli.d.ts +31 -0
  304. package/dist/presentation/cli/Cli.js +120 -0
  305. package/dist/presentation/cli/Cli.js.map +1 -0
  306. package/dist/presentation/cli/CliOptions.d.ts +18 -0
  307. package/dist/presentation/cli/CliOptions.js +25 -0
  308. package/dist/presentation/cli/CliOptions.js.map +1 -0
  309. package/dist/presentation/cli/CommandContext.d.ts +50 -0
  310. package/dist/presentation/cli/CommandContext.js +88 -0
  311. package/dist/presentation/cli/CommandContext.js.map +1 -0
  312. package/dist/presentation/cli/ConfigTemplate.d.ts +31 -0
  313. package/dist/presentation/cli/ConfigTemplate.js +83 -0
  314. package/dist/presentation/cli/ConfigTemplate.js.map +1 -0
  315. package/dist/presentation/cli/Renderer.d.ts +90 -0
  316. package/dist/presentation/cli/Renderer.js +290 -0
  317. package/dist/presentation/cli/Renderer.js.map +1 -0
  318. package/dist/presentation/cli/commands/AskCommand.d.ts +14 -0
  319. package/dist/presentation/cli/commands/AskCommand.js +48 -0
  320. package/dist/presentation/cli/commands/AskCommand.js.map +1 -0
  321. package/dist/presentation/cli/commands/CompletionsCommand.d.ts +18 -0
  322. package/dist/presentation/cli/commands/CompletionsCommand.js +96 -0
  323. package/dist/presentation/cli/commands/CompletionsCommand.js.map +1 -0
  324. package/dist/presentation/cli/commands/ConfigCommands.d.ts +55 -0
  325. package/dist/presentation/cli/commands/ConfigCommands.js +204 -0
  326. package/dist/presentation/cli/commands/ConfigCommands.js.map +1 -0
  327. package/dist/presentation/cli/commands/IndexCommand.d.ts +18 -0
  328. package/dist/presentation/cli/commands/IndexCommand.js +54 -0
  329. package/dist/presentation/cli/commands/IndexCommand.js.map +1 -0
  330. package/dist/presentation/cli/commands/ProjectsCommand.d.ts +48 -0
  331. package/dist/presentation/cli/commands/ProjectsCommand.js +240 -0
  332. package/dist/presentation/cli/commands/ProjectsCommand.js.map +1 -0
  333. package/dist/presentation/cli/commands/SearchCommand.d.ts +19 -0
  334. package/dist/presentation/cli/commands/SearchCommand.js +55 -0
  335. package/dist/presentation/cli/commands/SearchCommand.js.map +1 -0
  336. package/dist/presentation/cli/commands/ServerCommands.d.ts +13 -0
  337. package/dist/presentation/cli/commands/ServerCommands.js +40 -0
  338. package/dist/presentation/cli/commands/ServerCommands.js.map +1 -0
  339. package/dist/presentation/cli/commands/ShareCommands.d.ts +22 -0
  340. package/dist/presentation/cli/commands/ShareCommands.js +134 -0
  341. package/dist/presentation/cli/commands/ShareCommands.js.map +1 -0
  342. package/dist/presentation/cli/commands/StatusCommand.d.ts +15 -0
  343. package/dist/presentation/cli/commands/StatusCommand.js +53 -0
  344. package/dist/presentation/cli/commands/StatusCommand.js.map +1 -0
  345. package/dist/presentation/mcp/HitFormatter.d.ts +17 -0
  346. package/dist/presentation/mcp/HitFormatter.js +42 -0
  347. package/dist/presentation/mcp/HitFormatter.js.map +1 -0
  348. package/dist/presentation/mcp/IndexWatchController.d.ts +17 -0
  349. package/dist/presentation/mcp/IndexWatchController.js +31 -0
  350. package/dist/presentation/mcp/IndexWatchController.js.map +1 -0
  351. package/dist/presentation/mcp/LmgrepCore.d.ts +66 -0
  352. package/dist/presentation/mcp/LmgrepCore.js +178 -0
  353. package/dist/presentation/mcp/LmgrepCore.js.map +1 -0
  354. package/dist/presentation/mcp/McpServer.d.ts +18 -0
  355. package/dist/presentation/mcp/McpServer.js +63 -0
  356. package/dist/presentation/mcp/McpServer.js.map +1 -0
  357. package/dist/presentation/mcp/ToolDescriptions.d.ts +40 -0
  358. package/dist/presentation/mcp/ToolDescriptions.js +85 -0
  359. package/dist/presentation/mcp/ToolDescriptions.js.map +1 -0
  360. package/package.json +84 -63
  361. package/dist/lib/build.d.ts +0 -7
  362. package/dist/lib/build.js +0 -284
  363. package/dist/lib/build.js.map +0 -1
  364. package/dist/lib/chunker/context.d.ts +0 -21
  365. package/dist/lib/chunker/context.js +0 -131
  366. package/dist/lib/chunker/context.js.map +0 -1
  367. package/dist/lib/chunker/index.d.ts +0 -7
  368. package/dist/lib/chunker/index.js +0 -150
  369. package/dist/lib/chunker/index.js.map +0 -1
  370. package/dist/lib/chunker/languages.d.ts +0 -15
  371. package/dist/lib/chunker/languages.js.map +0 -1
  372. package/dist/lib/config.d.ts +0 -12
  373. package/dist/lib/config.js +0 -83
  374. package/dist/lib/config.js.map +0 -1
  375. package/dist/lib/embedder.d.ts +0 -55
  376. package/dist/lib/embedder.js +0 -221
  377. package/dist/lib/embedder.js.map +0 -1
  378. package/dist/lib/p2p.d.ts +0 -32
  379. package/dist/lib/p2p.js +0 -281
  380. package/dist/lib/p2p.js.map +0 -1
  381. package/dist/lib/providers.d.ts +0 -1
  382. package/dist/lib/providers.js +0 -41
  383. package/dist/lib/providers.js.map +0 -1
  384. package/dist/lib/repair.d.ts +0 -10
  385. package/dist/lib/repair.js +0 -57
  386. package/dist/lib/repair.js.map +0 -1
  387. package/dist/lib/scanner.d.ts +0 -34
  388. package/dist/lib/scanner.js +0 -242
  389. package/dist/lib/scanner.js.map +0 -1
  390. package/dist/lib/search-tool.d.ts +0 -47
  391. package/dist/lib/search-tool.js +0 -239
  392. package/dist/lib/search-tool.js.map +0 -1
  393. package/dist/lib/serve.d.ts +0 -11
  394. package/dist/lib/serve.js +0 -127
  395. package/dist/lib/serve.js.map +0 -1
  396. package/dist/lib/store.d.ts +0 -177
  397. package/dist/lib/store.js +0 -825
  398. package/dist/lib/store.js.map +0 -1
  399. package/dist/lib/types.d.ts +0 -129
  400. package/dist/lib/types.js +0 -13
  401. package/dist/lib/types.js.map +0 -1
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Thrown when a search reaches a database that has no chunk table.
3
+ *
4
+ * A distinct type rather than a plain Error because the *reason* it is missing
5
+ * is only knowable further out — most often the configured model changed and
6
+ * this project's other models are sitting right beside it — and matching on a
7
+ * message string to detect that would break the first time the wording did.
8
+ */
9
+ export declare class MissingIndexError extends Error {
10
+ constructor(message?: string);
11
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Thrown when a search reaches a database that has no chunk table.
3
+ *
4
+ * A distinct type rather than a plain Error because the *reason* it is missing
5
+ * is only knowable further out — most often the configured model changed and
6
+ * this project's other models are sitting right beside it — and matching on a
7
+ * message string to detect that would break the first time the wording did.
8
+ */
9
+ export class MissingIndexError extends Error {
10
+ constructor(message = "No index found. Run `lmgrep index` first.") {
11
+ super(message);
12
+ this.name = "MissingIndexError";
13
+ }
14
+ }
15
+ //# sourceMappingURL=MissingIndexError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MissingIndexError.js","sourceRoot":"","sources":["../../../src/domain/retrieval/MissingIndexError.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC3C,YAAY,OAAO,GAAG,2CAA2C;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACjC,CAAC;CACD"}
package/dist/index.d.ts CHANGED
@@ -1,33 +1,43 @@
1
- import { type Embedder } from "./lib/embedder.js";
2
- import type { BuildOptions, Chunker, Logger, LmgrepConfig, RepairResult, SearchOptions, SearchResult, StatusInfo } from "./lib/types.js";
3
- export type { BuildOptions, Chunk, Chunker, FileChange, FileEntry, IndexedChunk, Logger, LmgrepConfig, ProgressEvent, RepairResult, SearchOptions, SearchResult, StatusInfo, } from "./lib/types.js";
4
- export { consoleLogger, silentLogger } from "./lib/types.js";
5
- export type { Embedder } from "./lib/embedder.js";
6
- export { AISDKEmbedder, EmbeddingAbortError } from "./lib/embedder.js";
7
- export { TreeSitterChunker } from "./lib/chunker/index.js";
8
- export { Store, findIndexedAncestor, getDbPath, getLegacyDbPath, resolveProject, discoverIndexedProjects, writeProjectMetadata, readProjectMetadata, extractModelFamily, acquireDbLock, releaseDbLock, isDbLocked, discoverRunningProcesses, } from "./lib/store.js";
9
- export type { ProjectMetadata, RunningProcess } from "./lib/store.js";
10
- export { startWatcher } from "./lib/serve.js";
11
- export { loadConfig, getConfigDir, getGlobalConfigPath } from "./lib/config.js";
12
- export { startExport, startImport, generateShareCode, SHARE_CODE_RE } from "./lib/p2p.js";
13
- export interface CreateIndexOptions {
14
- cwd: string;
15
- config?: Partial<LmgrepConfig>;
16
- embedder?: Embedder;
17
- chunker?: Chunker;
18
- logger?: Logger;
19
- }
20
- export interface LmgrepIndex {
21
- readonly cwd: string;
22
- readonly config: LmgrepConfig;
23
- build(opts?: BuildOptions): Promise<{
24
- succeeded: number;
25
- failed: number;
26
- }>;
27
- search(query: string, opts?: SearchOptions): Promise<SearchResult[]>;
28
- repair(dry?: boolean): Promise<RepairResult>;
29
- watch(): Promise<void>;
30
- status(): Promise<StatusInfo>;
31
- close(): Promise<void>;
32
- }
33
- export declare function createIndex(options: CreateIndexOptions): Promise<LmgrepIndex>;
1
+ /**
2
+ * Public entry point.
3
+ *
4
+ * Composition lives in {@link LmgrepFactory}; this module only re-exports, so
5
+ * nothing here should ever contain logic.
6
+ */
7
+ export type { IndexBuildOptions, IndexBuildResult, IndexingProgressEvent, } from "./application/indexing/IndexingProgress.js";
8
+ export { Lmgrep } from "./application/Lmgrep.js";
9
+ export { LmgrepFactory, type LmgrepOptions, } from "./application/LmgrepFactory.js";
10
+ export type { HealthState } from "./application/operations/HealthMonitor.js";
11
+ export type { StatusInfo } from "./application/operations/StatusService.js";
12
+ export type { ResearchResult } from "./application/research/ResearchAgent.js";
13
+ export type { SearchOptions } from "./application/search/SearchCriteria.js";
14
+ export type { LmgrepConfig } from "./domain/config/LmgrepConfig.js";
15
+ export { Chunk } from "./domain/corpus/Chunk.js";
16
+ export { CodeLocation } from "./domain/corpus/CodeLocation.js";
17
+ export { ContentHash } from "./domain/corpus/ContentHash.js";
18
+ export { FileVersion } from "./domain/corpus/FileVersion.js";
19
+ export { FileManifest, SourceFile } from "./domain/corpus/SourceFile.js";
20
+ export { Vector } from "./domain/corpus/Vector.js";
21
+ export type { ChunkerPort } from "./domain/ports/ChunkerPort.js";
22
+ export type { EmbedderPort } from "./domain/ports/EmbedderPort.js";
23
+ export type { LoggerPort } from "./domain/ports/LoggerPort.js";
24
+ export { Branch } from "./domain/project/Branch.js";
25
+ export { DatabaseLocation } from "./domain/project/DatabaseLocation.js";
26
+ export type { IndexMetadata } from "./domain/project/IndexMetadata.js";
27
+ export { ModelIdentity } from "./domain/project/ModelIdentity.js";
28
+ export { Project } from "./domain/project/Project.js";
29
+ export { ProjectId } from "./domain/project/ProjectId.js";
30
+ export { ProjectLocator } from "./domain/project/ProjectLocator.js";
31
+ export type { TraceEntry } from "./domain/research/ResearchTrace.js";
32
+ export { Hit } from "./domain/retrieval/Hit.js";
33
+ export { HitList } from "./domain/retrieval/HitList.js";
34
+ export { AiSdkEmbedder } from "./infrastructure/ai/AiSdkEmbedder.js";
35
+ export { ConfigLoader } from "./infrastructure/fs/ConfigLoader.js";
36
+ export { ConsoleLogger, SilentLogger } from "./infrastructure/fs/Loggers.js";
37
+ export { ProjectMetadataStore } from "./infrastructure/fs/ProjectMetadataStore.js";
38
+ export { StateDirectory } from "./infrastructure/fs/StateDirectory.js";
39
+ export { IndexShare } from "./infrastructure/p2p/IndexShare.js";
40
+ export { ShareCode } from "./infrastructure/p2p/ShareCode.js";
41
+ export { ProcessRegistry, type RunningProcess, } from "./infrastructure/process/ProcessRegistry.js";
42
+ export { TreeSitterChunker } from "./infrastructure/treesitter/TreeSitterChunker.js";
43
+ export { LmgrepCore } from "./presentation/mcp/LmgrepCore.js";
package/dist/index.js CHANGED
@@ -1,216 +1,33 @@
1
- import { loadConfig } from "./lib/config.js";
2
- import { TreeSitterChunker } from "./lib/chunker/index.js";
3
- import { AISDKEmbedder } from "./lib/embedder.js";
4
- import { build } from "./lib/build.js";
5
- import { repair } from "./lib/repair.js";
6
- import { serve } from "./lib/serve.js";
7
- import { resolve } from "node:path";
8
- import { Store, findIndexedAncestor, resolveProject, readProjectMetadata, getDbPath, extractModelFamily, } from "./lib/store.js";
9
- import { consoleLogger } from "./lib/types.js";
10
- export { consoleLogger, silentLogger } from "./lib/types.js";
11
- export { AISDKEmbedder, EmbeddingAbortError } from "./lib/embedder.js";
12
- export { TreeSitterChunker } from "./lib/chunker/index.js";
13
- export { Store, findIndexedAncestor, getDbPath, getLegacyDbPath, resolveProject, discoverIndexedProjects, writeProjectMetadata, readProjectMetadata, extractModelFamily, acquireDbLock, releaseDbLock, isDbLocked, discoverRunningProcesses, } from "./lib/store.js";
14
- export { startWatcher } from "./lib/serve.js";
15
- export { loadConfig, getConfigDir, getGlobalConfigPath } from "./lib/config.js";
16
- export { startExport, startImport, generateShareCode, SHARE_CODE_RE } from "./lib/p2p.js";
17
- export async function createIndex(options) {
18
- const { cwd } = options;
19
- // Resolve config: user overrides > file config > defaults
20
- const fileConfig = loadConfig(cwd);
21
- const config = { ...fileConfig, ...options.config };
22
- const store = Store.forProject(cwd);
23
- const embedder = options.embedder ?? new AISDKEmbedder(config);
24
- const chunker = options.chunker ?? new TreeSitterChunker();
25
- const logger = options.logger ?? consoleLogger;
26
- return {
27
- cwd,
28
- config,
29
- async build(opts) {
30
- return build(cwd, store, config, embedder, chunker, opts, logger);
31
- },
32
- async search(query, opts = {}) {
33
- let queryVector = await embedder.embedQuery(query);
34
- // Check model compatibility with the index
35
- const dbPath = getDbPath(cwd);
36
- const meta = readProjectMetadata(dbPath);
37
- if (meta) {
38
- // Hard error: dimension mismatch
39
- if (meta.dimensions != null && queryVector.length !== meta.dimensions) {
40
- throw new Error(`Dimension mismatch: index has ${meta.dimensions}-dim vectors but your model produces ${queryVector.length}-dim. ` +
41
- `These embeddings are incompatible.`);
42
- }
43
- // Advisory: model family mismatch
44
- if (meta.model) {
45
- const indexFamily = extractModelFamily(meta.model);
46
- const queryFamily = extractModelFamily(config.model);
47
- if (indexFamily !== queryFamily) {
48
- logger.info(`Warning: index was built with "${meta.model}" (${indexFamily}) ` +
49
- `but searching with "${config.model}" (${queryFamily}). ` +
50
- `Results may be degraded if these are different model families.`);
51
- }
52
- }
53
- }
54
- // Subtract the --not vector to push away unwanted results
55
- if (opts.not) {
56
- const notVector = await embedder.embedQuery(opts.not);
57
- queryVector = queryVector.map((v, i) => v - notVector[i] * 0.5);
58
- }
59
- // Determine which stores to search
60
- const targets = resolveSearchTargets(cwd, store, opts);
61
- const limit = opts.limit ?? 25;
62
- // Search all targets
63
- let results = [];
64
- for (const target of targets) {
65
- const targetResults = await target.store.search(queryVector, limit, target.filePrefix, opts.type, !target.projectRoot);
66
- // Tag results from foreign projects with their root
67
- if (target.projectRoot) {
68
- for (const r of targetResults) {
69
- r.filePath = `${target.projectRoot}/${r.filePath}`;
70
- }
71
- }
72
- results.push(...targetResults);
73
- }
74
- // When searching multiple targets, sort by score and trim
75
- if (targets.length > 1) {
76
- results.sort((a, b) => b.score - a.score);
77
- results = results.slice(0, limit);
78
- }
79
- // Post-filter by language (file extension)
80
- if (opts.language && opts.language.length > 0) {
81
- const exts = new Set(opts.language.map((l) => (l.startsWith(".") ? l : `.${l}`)));
82
- results = results.filter((r) => exts.has(r.filePath.slice(r.filePath.lastIndexOf("."))));
83
- }
84
- if (opts.minScore != null) {
85
- results = results.filter((r) => r.score >= opts.minScore);
86
- }
87
- // Close any foreign stores we opened
88
- for (const target of targets) {
89
- if (target.store !== store) {
90
- await target.store.close();
91
- }
92
- }
93
- return results;
94
- },
95
- async repair(dry = false) {
96
- return repair(cwd, store, dry, logger);
97
- },
98
- async watch() {
99
- return serve(cwd, store, config, embedder, chunker, logger);
100
- },
101
- async status() {
102
- const ancestor = findIndexedAncestor(cwd);
103
- const projectRoot = ancestor ? ancestor.root : cwd;
104
- const prefix = ancestor?.prefix ?? "";
105
- const statusStore = projectRoot === cwd ? store : Store.forProject(projectRoot);
106
- const files = await statusStore.getIndexedFiles();
107
- const hashes = await statusStore.getIndexedHashes();
108
- let totalChunks = 0;
109
- for (const [, h] of files)
110
- totalChunks += h.length;
111
- // Embed once with a generic query, then reuse the vector for the
112
- // smoke search — one network roundtrip covers both checks.
113
- let embeddingOk = false;
114
- let embeddingLatencyMs;
115
- let embeddingError;
116
- let searchOk = false;
117
- let searchResultCount;
118
- let searchLatencyMs;
119
- try {
120
- const embedStart = Date.now();
121
- const vector = await withTimeout(embedder.embedQuery("code"), 3000);
122
- embeddingLatencyMs = Date.now() - embedStart;
123
- embeddingOk = true;
124
- if (files.size > 0) {
125
- try {
126
- const searchStart = Date.now();
127
- const results = await withTimeout(statusStore.search(vector, 1), 3000);
128
- searchLatencyMs = Date.now() - searchStart;
129
- searchResultCount = results.length;
130
- searchOk = results.length > 0;
131
- }
132
- catch { }
133
- }
134
- }
135
- catch (err) {
136
- embeddingError = err instanceof Error ? err.message : String(err);
137
- }
138
- // Read index metadata for model/dimensions info
139
- const meta = readProjectMetadata(getDbPath(projectRoot));
140
- return {
141
- projectRoot,
142
- prefix,
143
- config,
144
- fileCount: files.size,
145
- chunkCount: totalChunks,
146
- uniqueHashes: hashes.size,
147
- embeddingOk,
148
- embeddingLatencyMs,
149
- embeddingError,
150
- searchOk,
151
- searchResultCount,
152
- searchLatencyMs,
153
- indexModel: meta?.model,
154
- indexDimensions: meta?.dimensions,
155
- };
156
- },
157
- async close() {
158
- await store.close();
159
- },
160
- };
161
- }
162
- // --- Internal helpers ---
163
- function withTimeout(promise, ms) {
164
- return new Promise((resolve, reject) => {
165
- const timer = setTimeout(() => reject(new Error(`timeout after ${ms}ms`)), ms);
166
- promise.then((v) => {
167
- clearTimeout(timer);
168
- resolve(v);
169
- }, (e) => {
170
- clearTimeout(timer);
171
- reject(e);
172
- });
173
- });
174
- }
175
- function resolveSearchTargets(cwd, localStore, opts) {
176
- // --across: search multiple projects
177
- if (opts.across && opts.across.length > 0) {
178
- const targets = [
179
- { store: localStore, filePrefix: opts.filePrefix },
180
- ];
181
- for (const p of opts.across) {
182
- const abs = resolve(cwd, p);
183
- const { root } = resolveProject(abs);
184
- targets.push({
185
- store: Store.forProject(abs),
186
- filePrefix: opts.filePrefix,
187
- projectRoot: root,
188
- });
189
- }
190
- return targets;
191
- }
192
- // --project: search a single foreign project
193
- if (opts.project) {
194
- const abs = resolve(cwd, opts.project);
195
- const { root } = resolveProject(abs);
196
- return [
197
- {
198
- store: Store.forProject(abs),
199
- filePrefix: opts.filePrefix,
200
- projectRoot: root,
201
- },
202
- ];
203
- }
204
- // Default: search local project, resolving ancestor prefix
205
- let filePrefix = opts.filePrefix;
206
- let searchStore = localStore;
207
- const ancestor = findIndexedAncestor(cwd);
208
- if (ancestor?.prefix) {
209
- searchStore = Store.forProject(ancestor.root);
210
- filePrefix = filePrefix
211
- ? `${ancestor.prefix}/${filePrefix}`
212
- : ancestor.prefix;
213
- }
214
- return [{ store: searchStore, filePrefix }];
215
- }
1
+ /**
2
+ * Public entry point.
3
+ *
4
+ * Composition lives in {@link LmgrepFactory}; this module only re-exports, so
5
+ * nothing here should ever contain logic.
6
+ */
7
+ export { Lmgrep } from "./application/Lmgrep.js";
8
+ export { LmgrepFactory, } from "./application/LmgrepFactory.js";
9
+ export { Chunk } from "./domain/corpus/Chunk.js";
10
+ export { CodeLocation } from "./domain/corpus/CodeLocation.js";
11
+ export { ContentHash } from "./domain/corpus/ContentHash.js";
12
+ export { FileVersion } from "./domain/corpus/FileVersion.js";
13
+ export { FileManifest, SourceFile } from "./domain/corpus/SourceFile.js";
14
+ export { Vector } from "./domain/corpus/Vector.js";
15
+ export { Branch } from "./domain/project/Branch.js";
16
+ export { DatabaseLocation } from "./domain/project/DatabaseLocation.js";
17
+ export { ModelIdentity } from "./domain/project/ModelIdentity.js";
18
+ export { Project } from "./domain/project/Project.js";
19
+ export { ProjectId } from "./domain/project/ProjectId.js";
20
+ export { ProjectLocator } from "./domain/project/ProjectLocator.js";
21
+ export { Hit } from "./domain/retrieval/Hit.js";
22
+ export { HitList } from "./domain/retrieval/HitList.js";
23
+ export { AiSdkEmbedder } from "./infrastructure/ai/AiSdkEmbedder.js";
24
+ export { ConfigLoader } from "./infrastructure/fs/ConfigLoader.js";
25
+ export { ConsoleLogger, SilentLogger } from "./infrastructure/fs/Loggers.js";
26
+ export { ProjectMetadataStore } from "./infrastructure/fs/ProjectMetadataStore.js";
27
+ export { StateDirectory } from "./infrastructure/fs/StateDirectory.js";
28
+ export { IndexShare } from "./infrastructure/p2p/IndexShare.js";
29
+ export { ShareCode } from "./infrastructure/p2p/ShareCode.js";
30
+ export { ProcessRegistry, } from "./infrastructure/process/ProcessRegistry.js";
31
+ export { TreeSitterChunker } from "./infrastructure/treesitter/TreeSitterChunker.js";
32
+ export { LmgrepCore } from "./presentation/mcp/LmgrepCore.js";
216
33
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EACN,aAAa,GAEb,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAInD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EACN,eAAe,GAEf,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { LmgrepConfig } from "../../domain/config/LmgrepConfig.js";
2
+ import type { ChatModelPort, ChatOutcome, CompletionRequest, ToolLoopRequest } from "../../domain/ports/ChatModelPort.js";
3
+ import { ProviderRegistry } from "./ProviderRegistry.js";
4
+ /**
5
+ * The generative model behind `lmgrep ask`.
6
+ *
7
+ * It defaults to the embedding provider's package and baseURL, so enabling
8
+ * `ask` on a local LM Studio or Ollama setup is a single config line rather
9
+ * than a second provider block.
10
+ */
11
+ export declare class AiSdkChatModel implements ChatModelPort {
12
+ private readonly config;
13
+ private readonly providers;
14
+ private model;
15
+ constructor(config: LmgrepConfig, providers?: ProviderRegistry);
16
+ /** Whether a chat model is configured at all — `ask` is hidden when not. */
17
+ get isConfigured(): boolean;
18
+ /**
19
+ * Run the agentic loop, translating provider failures into outcomes.
20
+ *
21
+ * A timeout or an overflowed context is reported as `interrupted` rather
22
+ * than thrown: the caller still holds usable evidence and can synthesize
23
+ * from it, which is the difference between a slow answer and no answer.
24
+ */
25
+ runToolLoop(request: ToolLoopRequest): Promise<ChatOutcome>;
26
+ complete(request: CompletionRequest): Promise<string | undefined>;
27
+ private resolve;
28
+ /** Env overrides exist so several models can be benchmarked without edits. */
29
+ private get modelString();
30
+ private get baseURL();
31
+ }
@@ -0,0 +1,137 @@
1
+ import { createProviderRegistry, generateText, stepCountIs, tool, } from "ai";
2
+ import { z } from "zod";
3
+ import { ProviderFailure } from "./ProviderFailure.js";
4
+ import { ModelReference, ProviderRegistry } from "./ProviderRegistry.js";
5
+ /**
6
+ * The generative model behind `lmgrep ask`.
7
+ *
8
+ * It defaults to the embedding provider's package and baseURL, so enabling
9
+ * `ask` on a local LM Studio or Ollama setup is a single config line rather
10
+ * than a second provider block.
11
+ */
12
+ export class AiSdkChatModel {
13
+ config;
14
+ providers;
15
+ model;
16
+ constructor(config, providers = new ProviderRegistry()) {
17
+ this.config = config;
18
+ this.providers = providers;
19
+ }
20
+ /** Whether a chat model is configured at all — `ask` is hidden when not. */
21
+ get isConfigured() {
22
+ return Boolean(this.modelString);
23
+ }
24
+ /**
25
+ * Run the agentic loop, translating provider failures into outcomes.
26
+ *
27
+ * A timeout or an overflowed context is reported as `interrupted` rather
28
+ * than thrown: the caller still holds usable evidence and can synthesize
29
+ * from it, which is the difference between a slow answer and no answer.
30
+ */
31
+ async runToolLoop(request) {
32
+ const model = await this.resolve();
33
+ let steps = 0;
34
+ const searchTool = tool({
35
+ description: request.toolDescription,
36
+ inputSchema: z.object({
37
+ query: z
38
+ .string()
39
+ .describe("Natural-language intent, phrased as a question."),
40
+ filePrefix: z
41
+ .string()
42
+ .optional()
43
+ .describe("Restrict to files under this path prefix."),
44
+ type: z
45
+ .array(z.string())
46
+ .optional()
47
+ .describe("Filter by AST node type (e.g. ['function_declaration'])."),
48
+ language: z
49
+ .array(z.string())
50
+ .optional()
51
+ .describe("Filter by file extension (e.g. ['.ts'])."),
52
+ limit: z.number().optional().describe("Max hits (default 5)."),
53
+ }),
54
+ execute: async (call) => request.onSearch(call),
55
+ });
56
+ try {
57
+ const result = await generateText({
58
+ model,
59
+ system: request.system,
60
+ prompt: request.prompt,
61
+ tools: { search: searchTool },
62
+ stopWhen: stepCountIs(request.maxSteps),
63
+ temperature: 0,
64
+ abortSignal: AbortSignal.timeout(request.timeoutMs),
65
+ onStepFinish: () => {
66
+ steps++;
67
+ },
68
+ });
69
+ return { status: "completed", text: result.text.trim(), steps };
70
+ }
71
+ catch (err) {
72
+ if (ProviderFailure.isAbort(err)) {
73
+ return { status: "interrupted", reason: "timeout", steps };
74
+ }
75
+ if (ProviderFailure.isContextOverflow(err)) {
76
+ return {
77
+ status: "interrupted",
78
+ reason: "context-overflow",
79
+ steps,
80
+ };
81
+ }
82
+ return { status: "failed", error: err, steps };
83
+ }
84
+ }
85
+ async complete(request) {
86
+ try {
87
+ const result = await generateText({
88
+ model: await this.resolve(),
89
+ system: request.system,
90
+ prompt: request.prompt,
91
+ temperature: 0,
92
+ abortSignal: AbortSignal.timeout(request.timeoutMs),
93
+ });
94
+ return result.text.trim() || undefined;
95
+ }
96
+ catch (err) {
97
+ ProviderFailure.debug("completion", err);
98
+ return undefined;
99
+ }
100
+ }
101
+ async resolve() {
102
+ if (this.model)
103
+ return this.model;
104
+ const modelString = this.modelString;
105
+ if (!modelString) {
106
+ throw new Error("No chat model configured. Set `chatModel` in your lmgrep config " +
107
+ "(e.g. `chatModel: lmstudio:qwen/qwen3.5-9b`) to use `lmgrep ask`.");
108
+ }
109
+ const reference = ModelReference.parse(modelString, "chatModel");
110
+ const instance = await this.providers.instantiate({
111
+ reference,
112
+ // Reuse the embedding provider package unless overridden — on a
113
+ // shared local endpoint chat and embeddings sit behind one
114
+ // OpenAI-compatible provider.
115
+ packageName: this.config.chatProvider ?? this.config.provider,
116
+ baseURL: this.baseURL,
117
+ // A bare default export ignores baseURL and would hit the cloud, so
118
+ // prefer the factory whenever one is configured.
119
+ preferFactoryWhenBaseUrlSet: true,
120
+ });
121
+ const registry = createProviderRegistry({
122
+ [reference.provider]: instance,
123
+ });
124
+ this.model = registry.languageModel(reference.full);
125
+ return this.model;
126
+ }
127
+ /** Env overrides exist so several models can be benchmarked without edits. */
128
+ get modelString() {
129
+ return process.env.LMGREP_CHAT_MODEL ?? this.config.chatModel;
130
+ }
131
+ get baseURL() {
132
+ return (process.env.LMGREP_CHAT_BASEURL ??
133
+ this.config.chatBaseURL ??
134
+ this.config.baseURL);
135
+ }
136
+ }
137
+ //# sourceMappingURL=AiSdkChatModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AiSdkChatModel.js","sourceRoot":"","sources":["../../../src/infrastructure/ai/AiSdkChatModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { LmgrepConfig } from "../../domain/config/LmgrepConfig.js";
2
+ import { Vector } from "../../domain/corpus/Vector.js";
3
+ import type { EmbedderPort } from "../../domain/ports/EmbedderPort.js";
4
+ import { ProviderRegistry } from "./ProviderRegistry.js";
5
+ /**
6
+ * Embeddings via the Vercel AI SDK.
7
+ *
8
+ * Documents and queries take different prefixes because asymmetric models
9
+ * (nomic, e5, bge) are trained to expect them; omitting them degrades recall
10
+ * without any visible error, so the distinction is enforced by having two
11
+ * methods rather than one with a flag.
12
+ */
13
+ export declare class AiSdkEmbedder implements EmbedderPort {
14
+ private readonly config;
15
+ private readonly providers;
16
+ private model;
17
+ private dimensionsChecked;
18
+ constructor(config: LmgrepConfig, providers?: ProviderRegistry);
19
+ embedDocuments(texts: string[]): Promise<Vector[]>;
20
+ embedQuery(query: string): Promise<Vector>;
21
+ /**
22
+ * Check the configured width once, on the first embedding seen. A mismatch
23
+ * means the model is not the one the config describes, and every vector
24
+ * after this would be silently unusable against the index.
25
+ */
26
+ private verifyDimensions;
27
+ private getModel;
28
+ }