lmgrep 0.1.18 → 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 (408) 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 +4 -953
  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 -45
  178. package/dist/index.js +30 -567
  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/{lib/native-tuning.js → infrastructure/lancedb/NativeTuning.js} +1 -1
  265. package/dist/infrastructure/lancedb/NativeTuning.js.map +1 -0
  266. package/dist/infrastructure/lancedb/RowReplication.d.ts +27 -0
  267. package/dist/infrastructure/lancedb/RowReplication.js +82 -0
  268. package/dist/infrastructure/lancedb/RowReplication.js.map +1 -0
  269. package/dist/infrastructure/lancedb/VectorIndexPolicy.d.ts +60 -0
  270. package/dist/infrastructure/lancedb/VectorIndexPolicy.js +72 -0
  271. package/dist/infrastructure/lancedb/VectorIndexPolicy.js.map +1 -0
  272. package/dist/infrastructure/p2p/IndexShare.d.ts +45 -0
  273. package/dist/infrastructure/p2p/IndexShare.js +160 -0
  274. package/dist/infrastructure/p2p/IndexShare.js.map +1 -0
  275. package/dist/infrastructure/p2p/PeerSwarm.d.ts +16 -0
  276. package/dist/infrastructure/p2p/PeerSwarm.js +41 -0
  277. package/dist/infrastructure/p2p/PeerSwarm.js.map +1 -0
  278. package/dist/infrastructure/p2p/SecureChannel.d.ts +60 -0
  279. package/dist/infrastructure/p2p/SecureChannel.js +71 -0
  280. package/dist/infrastructure/p2p/SecureChannel.js.map +1 -0
  281. package/dist/infrastructure/p2p/ShareCode.d.ts +25 -0
  282. package/dist/infrastructure/p2p/ShareCode.js +304 -0
  283. package/dist/infrastructure/p2p/ShareCode.js.map +1 -0
  284. package/dist/infrastructure/process/ProcessRegistry.d.ts +50 -0
  285. package/dist/infrastructure/process/ProcessRegistry.js +109 -0
  286. package/dist/infrastructure/process/ProcessRegistry.js.map +1 -0
  287. package/dist/infrastructure/treesitter/ChunkContextBuilder.d.ts +45 -0
  288. package/dist/infrastructure/treesitter/ChunkContextBuilder.js +159 -0
  289. package/dist/infrastructure/treesitter/ChunkContextBuilder.js.map +1 -0
  290. package/dist/infrastructure/treesitter/LanguageCatalog.d.ts +30 -0
  291. package/dist/{lib/chunker/languages.js → infrastructure/treesitter/LanguageCatalog.js} +34 -29
  292. package/dist/infrastructure/treesitter/LanguageCatalog.js.map +1 -0
  293. package/dist/infrastructure/treesitter/SlidingWindowChunker.d.ts +15 -0
  294. package/dist/infrastructure/treesitter/SlidingWindowChunker.js +42 -0
  295. package/dist/infrastructure/treesitter/SlidingWindowChunker.js.map +1 -0
  296. package/dist/infrastructure/treesitter/TreeSitterChunker.d.ts +42 -0
  297. package/dist/infrastructure/treesitter/TreeSitterChunker.js +163 -0
  298. package/dist/infrastructure/treesitter/TreeSitterChunker.js.map +1 -0
  299. package/dist/mcp.d.ts +1 -1
  300. package/dist/mcp.js +14 -72
  301. package/dist/mcp.js.map +1 -1
  302. package/dist/presentation/cli/Cli.d.ts +31 -0
  303. package/dist/presentation/cli/Cli.js +120 -0
  304. package/dist/presentation/cli/Cli.js.map +1 -0
  305. package/dist/presentation/cli/CliOptions.d.ts +18 -0
  306. package/dist/presentation/cli/CliOptions.js +25 -0
  307. package/dist/presentation/cli/CliOptions.js.map +1 -0
  308. package/dist/presentation/cli/CommandContext.d.ts +50 -0
  309. package/dist/presentation/cli/CommandContext.js +88 -0
  310. package/dist/presentation/cli/CommandContext.js.map +1 -0
  311. package/dist/presentation/cli/ConfigTemplate.d.ts +31 -0
  312. package/dist/presentation/cli/ConfigTemplate.js +83 -0
  313. package/dist/presentation/cli/ConfigTemplate.js.map +1 -0
  314. package/dist/presentation/cli/Renderer.d.ts +90 -0
  315. package/dist/presentation/cli/Renderer.js +290 -0
  316. package/dist/presentation/cli/Renderer.js.map +1 -0
  317. package/dist/presentation/cli/commands/AskCommand.d.ts +14 -0
  318. package/dist/presentation/cli/commands/AskCommand.js +48 -0
  319. package/dist/presentation/cli/commands/AskCommand.js.map +1 -0
  320. package/dist/presentation/cli/commands/CompletionsCommand.d.ts +18 -0
  321. package/dist/presentation/cli/commands/CompletionsCommand.js +96 -0
  322. package/dist/presentation/cli/commands/CompletionsCommand.js.map +1 -0
  323. package/dist/presentation/cli/commands/ConfigCommands.d.ts +55 -0
  324. package/dist/presentation/cli/commands/ConfigCommands.js +204 -0
  325. package/dist/presentation/cli/commands/ConfigCommands.js.map +1 -0
  326. package/dist/presentation/cli/commands/IndexCommand.d.ts +18 -0
  327. package/dist/presentation/cli/commands/IndexCommand.js +54 -0
  328. package/dist/presentation/cli/commands/IndexCommand.js.map +1 -0
  329. package/dist/presentation/cli/commands/ProjectsCommand.d.ts +48 -0
  330. package/dist/presentation/cli/commands/ProjectsCommand.js +240 -0
  331. package/dist/presentation/cli/commands/ProjectsCommand.js.map +1 -0
  332. package/dist/presentation/cli/commands/SearchCommand.d.ts +19 -0
  333. package/dist/presentation/cli/commands/SearchCommand.js +55 -0
  334. package/dist/presentation/cli/commands/SearchCommand.js.map +1 -0
  335. package/dist/presentation/cli/commands/ServerCommands.d.ts +13 -0
  336. package/dist/presentation/cli/commands/ServerCommands.js +40 -0
  337. package/dist/presentation/cli/commands/ServerCommands.js.map +1 -0
  338. package/dist/presentation/cli/commands/ShareCommands.d.ts +22 -0
  339. package/dist/presentation/cli/commands/ShareCommands.js +134 -0
  340. package/dist/presentation/cli/commands/ShareCommands.js.map +1 -0
  341. package/dist/presentation/cli/commands/StatusCommand.d.ts +15 -0
  342. package/dist/presentation/cli/commands/StatusCommand.js +53 -0
  343. package/dist/presentation/cli/commands/StatusCommand.js.map +1 -0
  344. package/dist/presentation/mcp/HitFormatter.d.ts +17 -0
  345. package/dist/presentation/mcp/HitFormatter.js +42 -0
  346. package/dist/presentation/mcp/HitFormatter.js.map +1 -0
  347. package/dist/presentation/mcp/IndexWatchController.d.ts +17 -0
  348. package/dist/presentation/mcp/IndexWatchController.js +31 -0
  349. package/dist/presentation/mcp/IndexWatchController.js.map +1 -0
  350. package/dist/presentation/mcp/LmgrepCore.d.ts +66 -0
  351. package/dist/presentation/mcp/LmgrepCore.js +178 -0
  352. package/dist/presentation/mcp/LmgrepCore.js.map +1 -0
  353. package/dist/presentation/mcp/McpServer.d.ts +18 -0
  354. package/dist/presentation/mcp/McpServer.js +63 -0
  355. package/dist/presentation/mcp/McpServer.js.map +1 -0
  356. package/dist/presentation/mcp/ToolDescriptions.d.ts +40 -0
  357. package/dist/presentation/mcp/ToolDescriptions.js +85 -0
  358. package/dist/presentation/mcp/ToolDescriptions.js.map +1 -0
  359. package/package.json +84 -89
  360. package/dist/lib/build.d.ts +0 -21
  361. package/dist/lib/build.js +0 -374
  362. package/dist/lib/build.js.map +0 -1
  363. package/dist/lib/chunker/context.d.ts +0 -21
  364. package/dist/lib/chunker/context.js +0 -131
  365. package/dist/lib/chunker/context.js.map +0 -1
  366. package/dist/lib/chunker/index.d.ts +0 -7
  367. package/dist/lib/chunker/index.js +0 -209
  368. package/dist/lib/chunker/index.js.map +0 -1
  369. package/dist/lib/chunker/languages.d.ts +0 -15
  370. package/dist/lib/chunker/languages.js.map +0 -1
  371. package/dist/lib/config.d.ts +0 -12
  372. package/dist/lib/config.js +0 -83
  373. package/dist/lib/config.js.map +0 -1
  374. package/dist/lib/embedder.d.ts +0 -65
  375. package/dist/lib/embedder.js +0 -236
  376. package/dist/lib/embedder.js.map +0 -1
  377. package/dist/lib/facet-session.d.ts +0 -44
  378. package/dist/lib/facet-session.js +0 -125
  379. package/dist/lib/facet-session.js.map +0 -1
  380. package/dist/lib/native-tuning.js.map +0 -1
  381. package/dist/lib/p2p.d.ts +0 -32
  382. package/dist/lib/p2p.js +0 -281
  383. package/dist/lib/p2p.js.map +0 -1
  384. package/dist/lib/providers.d.ts +0 -1
  385. package/dist/lib/providers.js +0 -41
  386. package/dist/lib/providers.js.map +0 -1
  387. package/dist/lib/repair.d.ts +0 -10
  388. package/dist/lib/repair.js +0 -57
  389. package/dist/lib/repair.js.map +0 -1
  390. package/dist/lib/scanner.d.ts +0 -34
  391. package/dist/lib/scanner.js +0 -242
  392. package/dist/lib/scanner.js.map +0 -1
  393. package/dist/lib/search-tool.d.ts +0 -55
  394. package/dist/lib/search-tool.js +0 -319
  395. package/dist/lib/search-tool.js.map +0 -1
  396. package/dist/lib/serve.d.ts +0 -11
  397. package/dist/lib/serve.js +0 -144
  398. package/dist/lib/serve.js.map +0 -1
  399. package/dist/lib/store.d.ts +0 -252
  400. package/dist/lib/store.js +0 -1216
  401. package/dist/lib/store.js.map +0 -1
  402. package/dist/lib/types.d.ts +0 -194
  403. package/dist/lib/types.js +0 -13
  404. package/dist/lib/types.js.map +0 -1
  405. package/dist/lib/vocab.d.ts +0 -20
  406. package/dist/lib/vocab.js +0 -275
  407. package/dist/lib/vocab.js.map +0 -1
  408. /package/dist/{lib/native-tuning.d.ts → infrastructure/lancedb/NativeTuning.d.ts} +0 -0
@@ -0,0 +1,166 @@
1
+ import { Chunk } from "../../domain/corpus/Chunk.js";
2
+ import { CodeLocation } from "../../domain/corpus/CodeLocation.js";
3
+ import { ContentHash } from "../../domain/corpus/ContentHash.js";
4
+ import { FileVersion } from "../../domain/corpus/FileVersion.js";
5
+ import { Hit } from "../../domain/retrieval/Hit.js";
6
+ import { HitList } from "../../domain/retrieval/HitList.js";
7
+ import { MissingIndexError } from "../../domain/retrieval/MissingIndexError.js";
8
+ import { LanceTables, TableName } from "./LanceTables.js";
9
+ import { SEARCH_COLUMNS, VectorIndexPolicy } from "./VectorIndexPolicy.js";
10
+ /**
11
+ * Embedded chunks in LanceDB.
12
+ *
13
+ * Branch scoping lives here because it is a property of how chunks are stored:
14
+ * they are shared across branches by content hash, so a query must intersect
15
+ * them with the manifest of file versions the branch actually references.
16
+ */
17
+ export class ChunkRepository {
18
+ tables;
19
+ manifest;
20
+ branch;
21
+ constructor(tables, manifest, branch) {
22
+ this.tables = tables;
23
+ this.manifest = manifest;
24
+ this.branch = branch;
25
+ }
26
+ async add(chunks) {
27
+ if (chunks.length === 0)
28
+ return;
29
+ const records = chunks.map(({ chunk, vector }) => this.toRow(chunk, vector));
30
+ const { table, seeded } = await this.tables.tableOrCreate(TableName.Chunks, records);
31
+ if (!seeded)
32
+ await table.add(records);
33
+ }
34
+ async search(query) {
35
+ const table = await this.tables.table(TableName.Chunks);
36
+ if (!table) {
37
+ throw new MissingIndexError();
38
+ }
39
+ const versions = query.scopeToBranch
40
+ ? await this.manifest.branchVersions()
41
+ : undefined;
42
+ // Over-fetch: branch/version filtering and dedup both discard rows, so
43
+ // pull extra to still return `limit` distinct results.
44
+ const fetchLimit = versions ? query.limit * 3 : query.limit * 2;
45
+ let builder = table
46
+ .query()
47
+ .nearestTo(query.vector.toArray())
48
+ .limit(fetchLimit)
49
+ .refineFactor(VectorIndexPolicy.REFINE_FACTOR)
50
+ .select([...SEARCH_COLUMNS]);
51
+ const predicate = this.buildPredicate(query);
52
+ if (predicate)
53
+ builder = builder.where(predicate);
54
+ const rows = await builder.toArray();
55
+ let hits = HitList.of(rows.map((r) => this.toHit(r)));
56
+ if (versions) {
57
+ hits = hits.filtered((h) => h.fileVersion.matches(versions.versionOf(h.location.filePath)));
58
+ }
59
+ return hits.deduplicated().takeAtMost(query.limit);
60
+ }
61
+ /**
62
+ * Delete chunks for files no longer referenced by ANY branch. A path still
63
+ * present in another branch's manifest keeps its chunks — they are shared
64
+ * by content, so deleting them would blank that branch's results.
65
+ */
66
+ async deleteByFiles(filePaths) {
67
+ const table = await this.tables.table(TableName.Chunks);
68
+ if (!table || filePaths.length === 0)
69
+ return;
70
+ const entries = await this.manifest.allEntries();
71
+ const referencedElsewhere = new Set(entries
72
+ .filter((e) => !e.branch.equals(this.branch))
73
+ .map((e) => e.filePath));
74
+ const toDelete = filePaths.filter((p) => !referencedElsewhere.has(p));
75
+ if (toDelete.length > 0) {
76
+ await LanceTables.deleteIn(table, "filePath", toDelete);
77
+ }
78
+ }
79
+ async existingHashes(hashes) {
80
+ const table = await this.tables.table(TableName.Chunks);
81
+ if (!table || hashes.length === 0)
82
+ return new Set();
83
+ const unique = [...new Set(hashes.map((h) => h.toString()))];
84
+ return LanceTables.selectIn(table, "hash", unique);
85
+ }
86
+ async count() {
87
+ const table = await this.tables.table(TableName.Chunks);
88
+ return table ? table.countRows() : 0;
89
+ }
90
+ async hashesByFile() {
91
+ const table = await this.tables.table(TableName.Chunks);
92
+ if (!table)
93
+ return new Map();
94
+ const rows = await table.query().select(["filePath", "hash"]).toArray();
95
+ const map = new Map();
96
+ for (const row of rows) {
97
+ const fp = row.filePath;
98
+ const existing = map.get(fp) ?? [];
99
+ existing.push(row.hash);
100
+ map.set(fp, existing);
101
+ }
102
+ return map;
103
+ }
104
+ async allHashes() {
105
+ const table = await this.tables.table(TableName.Chunks);
106
+ if (!table)
107
+ return new Set();
108
+ const rows = await table.query().select(["hash"]).toArray();
109
+ return new Set(rows.map((r) => r.hash));
110
+ }
111
+ async *streamTexts(batchSize = 1000) {
112
+ const table = await this.tables.table(TableName.Chunks);
113
+ if (!table)
114
+ return;
115
+ const rows = await table.query().select(["name", "content"]).toArray();
116
+ for (let i = 0; i < rows.length; i += batchSize) {
117
+ yield rows.slice(i, i + batchSize).map((r) => ({
118
+ name: r.name ?? "",
119
+ content: r.content ?? "",
120
+ }));
121
+ }
122
+ }
123
+ buildPredicate(query) {
124
+ const conditions = [];
125
+ if (query.filePrefix) {
126
+ conditions.push(`filePath LIKE '${LanceTables.quote(query.filePrefix)}%'`);
127
+ }
128
+ if (query.types && query.types.length > 0) {
129
+ const escaped = query.types.map((t) => `'${LanceTables.quote(t)}'`);
130
+ conditions.push(`type IN (${escaped.join(", ")})`);
131
+ }
132
+ return conditions.length > 0 ? conditions.join(" AND ") : undefined;
133
+ }
134
+ toRow(chunk, vector) {
135
+ return {
136
+ id: chunk.id,
137
+ filePath: chunk.location.filePath,
138
+ startLine: chunk.location.startLine,
139
+ endLine: chunk.location.endLine,
140
+ type: chunk.type,
141
+ name: chunk.name,
142
+ content: chunk.content,
143
+ context: chunk.context,
144
+ hash: chunk.hash.toString(),
145
+ fileHash: chunk.fileVersion.toStored(),
146
+ vector: vector.toArray(),
147
+ };
148
+ }
149
+ toHit(row) {
150
+ const distance = row._distance;
151
+ return new Hit(row.id, new CodeLocation(row.filePath, row.startLine, row.endLine), row.type, row.name, row.content, row.context, distance != null ? 1 - distance : 0, FileVersion.fromStored(row.fileHash));
152
+ }
153
+ /** Rebuild a domain Chunk from a stored row — used by import and dedup. */
154
+ static rowToChunk(row) {
155
+ return new Chunk({
156
+ location: new CodeLocation(row.filePath, row.startLine, row.endLine),
157
+ type: row.type,
158
+ name: row.name,
159
+ content: row.content,
160
+ context: row.context,
161
+ hash: ContentHash.fromStored(row.hash),
162
+ fileVersion: FileVersion.fromStored(row.fileHash),
163
+ });
164
+ }
165
+ }
166
+ //# sourceMappingURL=ChunkRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/lancedb/ChunkRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Branch } from "../../domain/project/Branch.js";
2
+ import { type LanceTables } from "./LanceTables.js";
3
+ export interface ImportResult {
4
+ chunks: number;
5
+ files: number;
6
+ }
7
+ /**
8
+ * Copies chunks and manifest rows out of another lmgrep database.
9
+ *
10
+ * Rows move verbatim, embeddings included — the point of importing is to avoid
11
+ * re-embedding, so re-deriving anything here would defeat it. The source must
12
+ * therefore have been built with a compatible model; the caller reports the
13
+ * source's model so the user can check.
14
+ */
15
+ export declare class DatabaseImporter {
16
+ private readonly tables;
17
+ private readonly branch;
18
+ constructor(tables: LanceTables, branch: Branch);
19
+ importFrom(sourcePath: string): Promise<ImportResult>;
20
+ private copyChunks;
21
+ private copyFiles;
22
+ }
@@ -0,0 +1,74 @@
1
+ import { connect } from "@lancedb/lancedb";
2
+ import { TableName } from "./LanceTables.js";
3
+ /**
4
+ * Copies chunks and manifest rows out of another lmgrep database.
5
+ *
6
+ * Rows move verbatim, embeddings included — the point of importing is to avoid
7
+ * re-embedding, so re-deriving anything here would defeat it. The source must
8
+ * therefore have been built with a compatible model; the caller reports the
9
+ * source's model so the user can check.
10
+ */
11
+ export class DatabaseImporter {
12
+ tables;
13
+ branch;
14
+ constructor(tables, branch) {
15
+ this.tables = tables;
16
+ this.branch = branch;
17
+ }
18
+ async importFrom(sourcePath) {
19
+ const source = await connect(sourcePath);
20
+ const available = await source.tableNames();
21
+ return {
22
+ chunks: available.includes(TableName.Chunks)
23
+ ? await this.copyChunks(source)
24
+ : 0,
25
+ files: available.includes(TableName.Files)
26
+ ? await this.copyFiles(source)
27
+ : 0,
28
+ };
29
+ }
30
+ async copyChunks(source) {
31
+ const rows = await (await source.openTable(TableName.Chunks))
32
+ .query()
33
+ .toArray();
34
+ if (rows.length === 0)
35
+ return 0;
36
+ // Arrow hands back typed arrays; LanceDB needs plain values to infer a
37
+ // schema when the destination table does not exist yet.
38
+ const records = rows.map((r) => ({
39
+ id: r.id,
40
+ filePath: r.filePath,
41
+ startLine: r.startLine,
42
+ endLine: r.endLine,
43
+ type: r.type,
44
+ name: r.name,
45
+ content: r.content,
46
+ context: r.context,
47
+ hash: r.hash,
48
+ fileHash: r.fileHash ?? "",
49
+ vector: Array.from(r.vector),
50
+ }));
51
+ const { table, seeded } = await this.tables.tableOrCreate(TableName.Chunks, records);
52
+ if (!seeded)
53
+ await table.add(records);
54
+ return records.length;
55
+ }
56
+ async copyFiles(source) {
57
+ const rows = await (await source.openTable(TableName.Files))
58
+ .query()
59
+ .toArray();
60
+ if (rows.length === 0)
61
+ return 0;
62
+ // Legacy databases predate the branch column; adopt ours for those.
63
+ const records = rows.map((r) => ({
64
+ filePath: r.filePath,
65
+ fileHash: r.fileHash,
66
+ branch: r.branch ?? this.branch.toString(),
67
+ }));
68
+ const { table, seeded } = await this.tables.tableOrCreate(TableName.Files, records);
69
+ if (!seeded)
70
+ await table.add(records);
71
+ return records.length;
72
+ }
73
+ }
74
+ //# sourceMappingURL=DatabaseImporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseImporter.js","sourceRoot":"","sources":["../../../src/infrastructure/lancedb/DatabaseImporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { ContentHash } from "../../domain/corpus/ContentHash.js";
2
+ import { FileManifest, type SourceFile } from "../../domain/corpus/SourceFile.js";
3
+ import type { FileManifestRepositoryPort, ManifestEntry } from "../../domain/ports/FileManifestRepositoryPort.js";
4
+ import { Branch } from "../../domain/project/Branch.js";
5
+ import { LanceTables } from "./LanceTables.js";
6
+ /**
7
+ * The branch-scoped file manifest in LanceDB.
8
+ *
9
+ * The current branch's manifest is cached because every search consults it to
10
+ * scope results, and re-reading it per query would dominate search latency.
11
+ * Anything that writes the manifest must {@link invalidate}.
12
+ */
13
+ export declare class FileManifestRepository implements FileManifestRepositoryPort {
14
+ private readonly tables;
15
+ private readonly branch;
16
+ private cached;
17
+ constructor(tables: LanceTables, branch: Branch);
18
+ current(): Promise<FileManifest>;
19
+ branchVersions(): Promise<FileManifest | undefined>;
20
+ invalidate(): void;
21
+ upsert(entries: SourceFile[]): Promise<void>;
22
+ deleteFiles(filePaths: string[]): Promise<void>;
23
+ /**
24
+ * Which of these file versions any branch has already indexed. A hit means
25
+ * the content is embedded, so the file can be registered on this branch
26
+ * without re-chunking it.
27
+ */
28
+ knownHashes(hashes: ContentHash[]): Promise<Set<string>>;
29
+ allEntries(): Promise<ManifestEntry[]>;
30
+ storedBranches(): Promise<string[]>;
31
+ deleteBranch(branch: string): Promise<void>;
32
+ /** Seed this branch's manifest from another's — used on a new branch. */
33
+ copyFromBranch(sourceBranch: string): Promise<number>;
34
+ }
@@ -0,0 +1,137 @@
1
+ import { ContentHash } from "../../domain/corpus/ContentHash.js";
2
+ import { FileManifest, } from "../../domain/corpus/SourceFile.js";
3
+ import { Branch } from "../../domain/project/Branch.js";
4
+ import { LanceTables, TableName } from "./LanceTables.js";
5
+ /**
6
+ * The branch-scoped file manifest in LanceDB.
7
+ *
8
+ * The current branch's manifest is cached because every search consults it to
9
+ * scope results, and re-reading it per query would dominate search latency.
10
+ * Anything that writes the manifest must {@link invalidate}.
11
+ */
12
+ export class FileManifestRepository {
13
+ tables;
14
+ branch;
15
+ cached;
16
+ constructor(tables, branch) {
17
+ this.tables = tables;
18
+ this.branch = branch;
19
+ }
20
+ async current() {
21
+ const table = await this.tables.table(TableName.Files);
22
+ if (!table)
23
+ return FileManifest.empty();
24
+ const rows = await table
25
+ .query()
26
+ .where(`branch = '${this.branch.toSqlLiteral()}'`)
27
+ .select(["filePath", "fileHash"])
28
+ .toArray();
29
+ return FileManifest.fromEntries(rows.map((r) => [
30
+ r.filePath,
31
+ ContentHash.fromStored(r.fileHash),
32
+ ]));
33
+ }
34
+ async branchVersions() {
35
+ if (this.cached)
36
+ return this.cached;
37
+ const table = await this.tables.table(TableName.Files);
38
+ if (!table)
39
+ return undefined;
40
+ this.cached = await this.current();
41
+ return this.cached;
42
+ }
43
+ invalidate() {
44
+ this.cached = undefined;
45
+ }
46
+ async upsert(entries) {
47
+ if (entries.length === 0)
48
+ return;
49
+ const records = entries.map((e) => ({
50
+ filePath: e.path,
51
+ fileHash: e.hash.toString(),
52
+ branch: this.branch.toString(),
53
+ }));
54
+ const { table, seeded } = await this.tables.tableOrCreate(TableName.Files, records);
55
+ if (seeded) {
56
+ this.invalidate();
57
+ return;
58
+ }
59
+ // Replace this branch's rows for these paths, leaving other branches'
60
+ // rows for the same paths untouched.
61
+ const paths = records.map((r) => r.filePath);
62
+ for (let i = 0; i < paths.length; i += LanceTables.FILTER_BATCH_SIZE) {
63
+ const batch = paths.slice(i, i + LanceTables.FILTER_BATCH_SIZE);
64
+ await table.delete(`branch = '${this.branch.toSqlLiteral()}' AND ${LanceTables.inFilter("filePath", batch)}`);
65
+ }
66
+ await table.add(records);
67
+ this.invalidate();
68
+ }
69
+ async deleteFiles(filePaths) {
70
+ const table = await this.tables.table(TableName.Files);
71
+ if (!table || filePaths.length === 0)
72
+ return;
73
+ for (let i = 0; i < filePaths.length; i += LanceTables.FILTER_BATCH_SIZE) {
74
+ const batch = filePaths.slice(i, i + LanceTables.FILTER_BATCH_SIZE);
75
+ await table.delete(`branch = '${this.branch.toSqlLiteral()}' AND ${LanceTables.inFilter("filePath", batch)}`);
76
+ }
77
+ this.invalidate();
78
+ }
79
+ /**
80
+ * Which of these file versions any branch has already indexed. A hit means
81
+ * the content is embedded, so the file can be registered on this branch
82
+ * without re-chunking it.
83
+ */
84
+ async knownHashes(hashes) {
85
+ const table = await this.tables.table(TableName.Files);
86
+ if (!table || hashes.length === 0)
87
+ return new Set();
88
+ return LanceTables.selectIn(table, "fileHash", hashes.map((h) => h.toString()));
89
+ }
90
+ async allEntries() {
91
+ const table = await this.tables.table(TableName.Files);
92
+ if (!table)
93
+ return [];
94
+ const rows = await table.query().toArray();
95
+ return rows.map((r) => ({
96
+ filePath: r.filePath,
97
+ fileHash: ContentHash.fromStored(r.fileHash),
98
+ branch: Branch.of(r.branch),
99
+ }));
100
+ }
101
+ async storedBranches() {
102
+ const table = await this.tables.table(TableName.Files);
103
+ if (!table)
104
+ return [];
105
+ const rows = await table.query().select(["branch"]).toArray();
106
+ return [...new Set(rows.map((r) => r.branch))];
107
+ }
108
+ async deleteBranch(branch) {
109
+ const table = await this.tables.table(TableName.Files);
110
+ if (!table)
111
+ return;
112
+ await table.delete(`branch = '${LanceTables.quote(branch)}'`);
113
+ this.invalidate();
114
+ }
115
+ /** Seed this branch's manifest from another's — used on a new branch. */
116
+ async copyFromBranch(sourceBranch) {
117
+ const table = await this.tables.table(TableName.Files);
118
+ if (!table)
119
+ return 0;
120
+ const rows = await table
121
+ .query()
122
+ .where(`branch = '${LanceTables.quote(sourceBranch)}'`)
123
+ .select(["filePath", "fileHash"])
124
+ .toArray();
125
+ if (rows.length === 0)
126
+ return 0;
127
+ const records = rows.map((r) => ({
128
+ filePath: r.filePath,
129
+ fileHash: r.fileHash,
130
+ branch: this.branch.toString(),
131
+ }));
132
+ await table.add(records);
133
+ this.invalidate();
134
+ return records.length;
135
+ }
136
+ }
137
+ //# sourceMappingURL=FileManifestRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileManifestRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/lancedb/FileManifestRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { FileManifestRepositoryPort } from "../../domain/ports/FileManifestRepositoryPort.js";
2
+ import type { DedupeReport, IndexMaintenancePort, OptimizeOptions, OptimizeReport, VectorIndexState } from "../../domain/ports/IndexMaintenancePort.js";
3
+ import { type LanceTables } from "./LanceTables.js";
4
+ /**
5
+ * Keeps the LanceDB tables compact and their ANN indexes current.
6
+ *
7
+ * Without a vector index LanceDB answers a search by brute force: it decodes
8
+ * every stored embedding to score it. At high dimensions that walks the whole
9
+ * table through memory per query, so peak RSS tracks index size roughly 1:1.
10
+ * IVF-PQ turns that into a handful of probes.
11
+ *
12
+ * Compaction matters for the same reason — small appends leave hundreds of
13
+ * fragments, each carrying its own decode buffers.
14
+ */
15
+ export declare class IndexMaintenance implements IndexMaintenancePort {
16
+ private readonly tables;
17
+ private readonly manifest;
18
+ /** Tables holding embeddings, and therefore wanting a vector index. */
19
+ private static readonly VECTOR_TABLES;
20
+ constructor(tables: LanceTables, manifest: FileManifestRepositoryPort);
21
+ /**
22
+ * Cheap and idempotent when there is nothing to do, so it is safe to call
23
+ * after every build.
24
+ */
25
+ optimize(options?: OptimizeOptions): Promise<OptimizeReport>;
26
+ /**
27
+ * What `lmgrep compact` runs: the same work as {@link optimize} but
28
+ * unconditional, plus compaction of the files table (which holds no
29
+ * embeddings, so it never needs a vector index).
30
+ */
31
+ compact(): Promise<OptimizeReport>;
32
+ /**
33
+ * Remove tables no longer part of the schema.
34
+ *
35
+ * Databases built before faceting was removed still carry a `vocab` table
36
+ * holding one embedding per corpus term — nothing reads it now, and at
37
+ * full embedding width that is real disk. Dropping it here means users
38
+ * reclaim the space by running the command they already run.
39
+ */
40
+ private dropLegacyTables;
41
+ private optimizeTable;
42
+ /**
43
+ * Remove rows that should not be there: exact id duplicates (from
44
+ * concurrent unlocked indexing) and chunks whose file version no branch
45
+ * references any more. Survivors are rewritten into a fresh table, which is
46
+ * also what reclaims the disk the dropped rows held.
47
+ */
48
+ dedupe(): Promise<DedupeReport>;
49
+ vectorIndexState(): Promise<VectorIndexState>;
50
+ reset(): Promise<void>;
51
+ /** Arrow rows carry typed arrays; LanceDB needs plain values to re-infer a schema. */
52
+ private toPlainRow;
53
+ }