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.
- package/README.md +226 -63
- package/completions/_lmgrep +49 -40
- package/dist/application/Lmgrep.d.ts +107 -0
- package/dist/application/Lmgrep.js +99 -0
- package/dist/application/Lmgrep.js.map +1 -0
- package/dist/application/LmgrepFactory.d.ts +40 -0
- package/dist/application/LmgrepFactory.js +155 -0
- package/dist/application/LmgrepFactory.js.map +1 -0
- package/dist/application/indexing/BranchBootstrapper.d.ts +21 -0
- package/dist/application/indexing/BranchBootstrapper.js +52 -0
- package/dist/application/indexing/BranchBootstrapper.js.map +1 -0
- package/dist/application/indexing/BranchManifestSweeper.d.ts +17 -0
- package/dist/application/indexing/BranchManifestSweeper.js +35 -0
- package/dist/application/indexing/BranchManifestSweeper.js.map +1 -0
- package/dist/application/indexing/Duration.d.ts +9 -0
- package/dist/application/indexing/Duration.js +25 -0
- package/dist/application/indexing/Duration.js.map +1 -0
- package/dist/application/indexing/EmbeddingAbortError.d.ts +11 -0
- package/dist/application/indexing/EmbeddingAbortError.js +20 -0
- package/dist/application/indexing/EmbeddingAbortError.js.map +1 -0
- package/dist/application/indexing/EmbeddingPipeline.d.ts +59 -0
- package/dist/application/indexing/EmbeddingPipeline.js +140 -0
- package/dist/application/indexing/EmbeddingPipeline.js.map +1 -0
- package/dist/application/indexing/IndexBuilder.d.ts +112 -0
- package/dist/application/indexing/IndexBuilder.js +370 -0
- package/dist/application/indexing/IndexBuilder.js.map +1 -0
- package/dist/application/indexing/IndexingProgress.d.ts +34 -0
- package/dist/application/indexing/IndexingProgress.js +2 -0
- package/dist/application/indexing/IndexingProgress.js.map +1 -0
- package/dist/application/operations/Deadline.d.ts +13 -0
- package/dist/application/operations/Deadline.js +29 -0
- package/dist/application/operations/Deadline.js.map +1 -0
- package/dist/application/operations/HealthMonitor.d.ts +58 -0
- package/dist/application/operations/HealthMonitor.js +128 -0
- package/dist/application/operations/HealthMonitor.js.map +1 -0
- package/dist/application/operations/IndexAlternatives.d.ts +35 -0
- package/dist/application/operations/IndexAlternatives.js +61 -0
- package/dist/application/operations/IndexAlternatives.js.map +1 -0
- package/dist/application/operations/IndexInventory.d.ts +69 -0
- package/dist/application/operations/IndexInventory.js +99 -0
- package/dist/application/operations/IndexInventory.js.map +1 -0
- package/dist/application/operations/StatusService.d.ts +90 -0
- package/dist/application/operations/StatusService.js +171 -0
- package/dist/application/operations/StatusService.js.map +1 -0
- package/dist/application/operations/WatchService.d.ts +67 -0
- package/dist/application/operations/WatchService.js +145 -0
- package/dist/application/operations/WatchService.js.map +1 -0
- package/dist/application/operations/WorkingTreeDiff.d.ts +19 -0
- package/dist/application/operations/WorkingTreeDiff.js +36 -0
- package/dist/application/operations/WorkingTreeDiff.js.map +1 -0
- package/dist/application/research/ResearchAgent.d.ts +68 -0
- package/dist/application/research/ResearchAgent.js +201 -0
- package/dist/application/research/ResearchAgent.js.map +1 -0
- package/dist/application/research/ResearchPrompts.d.ts +16 -0
- package/dist/application/research/ResearchPrompts.js +34 -0
- package/dist/application/research/ResearchPrompts.js.map +1 -0
- package/dist/application/search/SearchCriteria.d.ts +37 -0
- package/dist/application/search/SearchCriteria.js +48 -0
- package/dist/application/search/SearchCriteria.js.map +1 -0
- package/dist/application/search/SearchService.d.ts +36 -0
- package/dist/application/search/SearchService.js +108 -0
- package/dist/application/search/SearchService.js.map +1 -0
- package/dist/application/search/SearchTargetResolver.d.ts +56 -0
- package/dist/application/search/SearchTargetResolver.js +104 -0
- package/dist/application/search/SearchTargetResolver.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +5 -754
- package/dist/cli.js.map +1 -1
- package/dist/domain/config/ConfigSource.d.ts +16 -0
- package/dist/domain/config/ConfigSource.js +2 -0
- package/dist/domain/config/ConfigSource.js.map +1 -0
- package/dist/domain/config/LmgrepConfig.d.ts +53 -0
- package/dist/domain/config/LmgrepConfig.js +2 -0
- package/dist/domain/config/LmgrepConfig.js.map +1 -0
- package/dist/domain/corpus/Chunk.d.ts +49 -0
- package/dist/domain/corpus/Chunk.js +60 -0
- package/dist/domain/corpus/Chunk.js.map +1 -0
- package/dist/domain/corpus/CodeLocation.d.ts +18 -0
- package/dist/domain/corpus/CodeLocation.js +34 -0
- package/dist/domain/corpus/CodeLocation.js.map +1 -0
- package/dist/domain/corpus/ContentHash.d.ts +15 -0
- package/dist/domain/corpus/ContentHash.js +30 -0
- package/dist/domain/corpus/ContentHash.js.map +1 -0
- package/dist/domain/corpus/FileVersion.d.ts +31 -0
- package/dist/domain/corpus/FileVersion.js +47 -0
- package/dist/domain/corpus/FileVersion.js.map +1 -0
- package/dist/domain/corpus/SourceFile.d.ts +26 -0
- package/dist/domain/corpus/SourceFile.js +47 -0
- package/dist/domain/corpus/SourceFile.js.map +1 -0
- package/dist/domain/corpus/Vector.d.ts +37 -0
- package/dist/domain/corpus/Vector.js +96 -0
- package/dist/domain/corpus/Vector.js.map +1 -0
- package/dist/domain/ports/ChatModelPort.d.ts +57 -0
- package/dist/domain/ports/ChatModelPort.js +2 -0
- package/dist/domain/ports/ChatModelPort.js.map +1 -0
- package/dist/domain/ports/ChunkRepositoryPort.d.ts +42 -0
- package/dist/domain/ports/ChunkRepositoryPort.js +2 -0
- package/dist/domain/ports/ChunkRepositoryPort.js.map +1 -0
- package/dist/domain/ports/ChunkerPort.d.ts +5 -0
- package/dist/domain/ports/ChunkerPort.js +2 -0
- package/dist/domain/ports/ChunkerPort.js.map +1 -0
- package/dist/domain/ports/DatabaseSessionPort.d.ts +10 -0
- package/dist/domain/ports/DatabaseSessionPort.js +2 -0
- package/dist/domain/ports/DatabaseSessionPort.js.map +1 -0
- package/dist/domain/ports/EmbedderPort.d.ts +14 -0
- package/dist/domain/ports/EmbedderPort.js +2 -0
- package/dist/domain/ports/EmbedderPort.js.map +1 -0
- package/dist/domain/ports/FileManifestRepositoryPort.d.ts +32 -0
- package/dist/domain/ports/FileManifestRepositoryPort.js +2 -0
- package/dist/domain/ports/FileManifestRepositoryPort.js.map +1 -0
- package/dist/domain/ports/GitPort.d.ts +24 -0
- package/dist/domain/ports/GitPort.js +2 -0
- package/dist/domain/ports/GitPort.js.map +1 -0
- package/dist/domain/ports/IndexMaintenancePort.d.ts +58 -0
- package/dist/domain/ports/IndexMaintenancePort.js +2 -0
- package/dist/domain/ports/IndexMaintenancePort.js.map +1 -0
- package/dist/domain/ports/IndexMetadataPort.d.ts +23 -0
- package/dist/domain/ports/IndexMetadataPort.js +2 -0
- package/dist/domain/ports/IndexMetadataPort.js.map +1 -0
- package/dist/domain/ports/LockPort.d.ts +17 -0
- package/dist/domain/ports/LockPort.js +2 -0
- package/dist/domain/ports/LockPort.js.map +1 -0
- package/dist/domain/ports/LoggerPort.d.ts +5 -0
- package/dist/domain/ports/LoggerPort.js +2 -0
- package/dist/domain/ports/LoggerPort.js.map +1 -0
- package/dist/domain/ports/ProjectIndexesPort.d.ts +20 -0
- package/dist/domain/ports/ProjectIndexesPort.js +2 -0
- package/dist/domain/ports/ProjectIndexesPort.js.map +1 -0
- package/dist/domain/ports/ProjectRegistryPort.d.ts +42 -0
- package/dist/domain/ports/ProjectRegistryPort.js +2 -0
- package/dist/domain/ports/ProjectRegistryPort.js.map +1 -0
- package/dist/domain/ports/StateDirectoryPort.d.ts +29 -0
- package/dist/domain/ports/StateDirectoryPort.js +2 -0
- package/dist/domain/ports/StateDirectoryPort.js.map +1 -0
- package/dist/domain/ports/WorkspacePort.d.ts +38 -0
- package/dist/domain/ports/WorkspacePort.js +2 -0
- package/dist/domain/ports/WorkspacePort.js.map +1 -0
- package/dist/domain/project/Branch.d.ts +20 -0
- package/dist/domain/project/Branch.js +33 -0
- package/dist/domain/project/Branch.js.map +1 -0
- package/dist/domain/project/DatabaseLocation.d.ts +32 -0
- package/dist/domain/project/DatabaseLocation.js +35 -0
- package/dist/domain/project/DatabaseLocation.js.map +1 -0
- package/dist/domain/project/IndexMetadata.d.ts +17 -0
- package/dist/domain/project/IndexMetadata.js +2 -0
- package/dist/domain/project/IndexMetadata.js.map +1 -0
- package/dist/domain/project/ModelIdentity.d.ts +58 -0
- package/dist/domain/project/ModelIdentity.js +97 -0
- package/dist/domain/project/ModelIdentity.js.map +1 -0
- package/dist/domain/project/Project.d.ts +17 -0
- package/dist/domain/project/Project.js +21 -0
- package/dist/domain/project/Project.js.map +1 -0
- package/dist/domain/project/ProjectId.d.ts +28 -0
- package/dist/domain/project/ProjectId.js +58 -0
- package/dist/domain/project/ProjectId.js.map +1 -0
- package/dist/domain/project/ProjectLocator.d.ts +112 -0
- package/dist/domain/project/ProjectLocator.js +178 -0
- package/dist/domain/project/ProjectLocator.js.map +1 -0
- package/dist/domain/research/Citation.d.ts +27 -0
- package/dist/domain/research/Citation.js +43 -0
- package/dist/domain/research/Citation.js.map +1 -0
- package/dist/domain/research/EvidenceLedger.d.ts +47 -0
- package/dist/domain/research/EvidenceLedger.js +111 -0
- package/dist/domain/research/EvidenceLedger.js.map +1 -0
- package/dist/domain/research/ResearchTrace.d.ts +19 -0
- package/dist/domain/research/ResearchTrace.js +22 -0
- package/dist/domain/research/ResearchTrace.js.map +1 -0
- package/dist/domain/retrieval/Hit.d.ts +19 -0
- package/dist/domain/retrieval/Hit.js +28 -0
- package/dist/domain/retrieval/Hit.js.map +1 -0
- package/dist/domain/retrieval/HitList.d.ts +35 -0
- package/dist/domain/retrieval/HitList.js +81 -0
- package/dist/domain/retrieval/HitList.js.map +1 -0
- package/dist/domain/retrieval/MissingIndexError.d.ts +11 -0
- package/dist/domain/retrieval/MissingIndexError.js +15 -0
- package/dist/domain/retrieval/MissingIndexError.js.map +1 -0
- package/dist/index.d.ts +43 -33
- package/dist/index.js +32 -215
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/ai/AiSdkChatModel.d.ts +31 -0
- package/dist/infrastructure/ai/AiSdkChatModel.js +137 -0
- package/dist/infrastructure/ai/AiSdkChatModel.js.map +1 -0
- package/dist/infrastructure/ai/AiSdkEmbedder.d.ts +28 -0
- package/dist/infrastructure/ai/AiSdkEmbedder.js +79 -0
- package/dist/infrastructure/ai/AiSdkEmbedder.js.map +1 -0
- package/dist/infrastructure/ai/EmbeddingPrefixes.d.ts +21 -0
- package/dist/infrastructure/ai/EmbeddingPrefixes.js +40 -0
- package/dist/infrastructure/ai/EmbeddingPrefixes.js.map +1 -0
- package/dist/infrastructure/ai/LmStudioProbe.d.ts +18 -0
- package/dist/infrastructure/ai/LmStudioProbe.js +49 -0
- package/dist/infrastructure/ai/LmStudioProbe.js.map +1 -0
- package/dist/infrastructure/ai/LocalModelReloader.d.ts +21 -0
- package/dist/infrastructure/ai/LocalModelReloader.js +61 -0
- package/dist/infrastructure/ai/LocalModelReloader.js.map +1 -0
- package/dist/infrastructure/ai/LocalRuntimeDetector.d.ts +36 -0
- package/dist/infrastructure/ai/LocalRuntimeDetector.js +61 -0
- package/dist/infrastructure/ai/LocalRuntimeDetector.js.map +1 -0
- package/dist/infrastructure/ai/ModelRuntime.d.ts +32 -0
- package/dist/infrastructure/ai/ModelRuntime.js +2 -0
- package/dist/infrastructure/ai/ModelRuntime.js.map +1 -0
- package/dist/infrastructure/ai/OllamaProbe.d.ts +21 -0
- package/dist/infrastructure/ai/OllamaProbe.js +69 -0
- package/dist/infrastructure/ai/OllamaProbe.js.map +1 -0
- package/dist/infrastructure/ai/ProviderFailure.d.ts +16 -0
- package/dist/infrastructure/ai/ProviderFailure.js +35 -0
- package/dist/infrastructure/ai/ProviderFailure.js.map +1 -0
- package/dist/infrastructure/ai/ProviderModuleLoader.d.ts +13 -0
- package/dist/infrastructure/ai/ProviderModuleLoader.js +49 -0
- package/dist/infrastructure/ai/ProviderModuleLoader.js.map +1 -0
- package/dist/infrastructure/ai/ProviderRegistry.d.ts +37 -0
- package/dist/infrastructure/ai/ProviderRegistry.js +55 -0
- package/dist/infrastructure/ai/ProviderRegistry.js.map +1 -0
- package/dist/infrastructure/fs/ConfigLoader.d.ts +59 -0
- package/dist/infrastructure/fs/ConfigLoader.js +194 -0
- package/dist/infrastructure/fs/ConfigLoader.js.map +1 -0
- package/dist/infrastructure/fs/DatabaseLocks.d.ts +52 -0
- package/dist/infrastructure/fs/DatabaseLocks.js +92 -0
- package/dist/infrastructure/fs/DatabaseLocks.js.map +1 -0
- package/dist/infrastructure/fs/DiskUsage.d.ts +6 -0
- package/dist/infrastructure/fs/DiskUsage.js +41 -0
- package/dist/infrastructure/fs/DiskUsage.js.map +1 -0
- package/dist/infrastructure/fs/IndexableFileRules.d.ts +33 -0
- package/dist/infrastructure/fs/IndexableFileRules.js +177 -0
- package/dist/infrastructure/fs/IndexableFileRules.js.map +1 -0
- package/dist/infrastructure/fs/Loggers.d.ts +14 -0
- package/dist/infrastructure/fs/Loggers.js +18 -0
- package/dist/infrastructure/fs/Loggers.js.map +1 -0
- package/dist/infrastructure/fs/PidFileLock.d.ts +40 -0
- package/dist/infrastructure/fs/PidFileLock.js +97 -0
- package/dist/infrastructure/fs/PidFileLock.js.map +1 -0
- package/dist/infrastructure/fs/ProjectIndexes.d.ts +8 -0
- package/dist/infrastructure/fs/ProjectIndexes.js +35 -0
- package/dist/infrastructure/fs/ProjectIndexes.js.map +1 -0
- package/dist/infrastructure/fs/ProjectMetadataStore.d.ts +42 -0
- package/dist/infrastructure/fs/ProjectMetadataStore.js +86 -0
- package/dist/infrastructure/fs/ProjectMetadataStore.js.map +1 -0
- package/dist/infrastructure/fs/ProjectRegistry.d.ts +25 -0
- package/dist/infrastructure/fs/ProjectRegistry.js +83 -0
- package/dist/infrastructure/fs/ProjectRegistry.js.map +1 -0
- package/dist/infrastructure/fs/StateDirectory.d.ts +28 -0
- package/dist/infrastructure/fs/StateDirectory.js +71 -0
- package/dist/infrastructure/fs/StateDirectory.js.map +1 -0
- package/dist/infrastructure/fs/Workspace.d.ts +25 -0
- package/dist/infrastructure/fs/Workspace.js +90 -0
- package/dist/infrastructure/fs/Workspace.js.map +1 -0
- package/dist/infrastructure/git/GitClient.d.ts +34 -0
- package/dist/infrastructure/git/GitClient.js +74 -0
- package/dist/infrastructure/git/GitClient.js.map +1 -0
- package/dist/infrastructure/lancedb/ChunkRepository.d.ts +38 -0
- package/dist/infrastructure/lancedb/ChunkRepository.js +166 -0
- package/dist/infrastructure/lancedb/ChunkRepository.js.map +1 -0
- package/dist/infrastructure/lancedb/DatabaseImporter.d.ts +22 -0
- package/dist/infrastructure/lancedb/DatabaseImporter.js +74 -0
- package/dist/infrastructure/lancedb/DatabaseImporter.js.map +1 -0
- package/dist/infrastructure/lancedb/FileManifestRepository.d.ts +34 -0
- package/dist/infrastructure/lancedb/FileManifestRepository.js +137 -0
- package/dist/infrastructure/lancedb/FileManifestRepository.js.map +1 -0
- package/dist/infrastructure/lancedb/IndexMaintenance.d.ts +53 -0
- package/dist/infrastructure/lancedb/IndexMaintenance.js +227 -0
- package/dist/infrastructure/lancedb/IndexMaintenance.js.map +1 -0
- package/dist/infrastructure/lancedb/LanceTables.d.ts +67 -0
- package/dist/infrastructure/lancedb/LanceTables.js +159 -0
- package/dist/infrastructure/lancedb/LanceTables.js.map +1 -0
- package/dist/infrastructure/lancedb/NativeTuning.d.ts +1 -0
- package/dist/infrastructure/lancedb/NativeTuning.js +9 -0
- package/dist/infrastructure/lancedb/NativeTuning.js.map +1 -0
- package/dist/infrastructure/lancedb/RowReplication.d.ts +27 -0
- package/dist/infrastructure/lancedb/RowReplication.js +82 -0
- package/dist/infrastructure/lancedb/RowReplication.js.map +1 -0
- package/dist/infrastructure/lancedb/VectorIndexPolicy.d.ts +60 -0
- package/dist/infrastructure/lancedb/VectorIndexPolicy.js +72 -0
- package/dist/infrastructure/lancedb/VectorIndexPolicy.js.map +1 -0
- package/dist/infrastructure/p2p/IndexShare.d.ts +45 -0
- package/dist/infrastructure/p2p/IndexShare.js +160 -0
- package/dist/infrastructure/p2p/IndexShare.js.map +1 -0
- package/dist/infrastructure/p2p/PeerSwarm.d.ts +16 -0
- package/dist/infrastructure/p2p/PeerSwarm.js +41 -0
- package/dist/infrastructure/p2p/PeerSwarm.js.map +1 -0
- package/dist/infrastructure/p2p/SecureChannel.d.ts +60 -0
- package/dist/infrastructure/p2p/SecureChannel.js +71 -0
- package/dist/infrastructure/p2p/SecureChannel.js.map +1 -0
- package/dist/infrastructure/p2p/ShareCode.d.ts +25 -0
- package/dist/infrastructure/p2p/ShareCode.js +304 -0
- package/dist/infrastructure/p2p/ShareCode.js.map +1 -0
- package/dist/infrastructure/process/ProcessRegistry.d.ts +50 -0
- package/dist/infrastructure/process/ProcessRegistry.js +109 -0
- package/dist/infrastructure/process/ProcessRegistry.js.map +1 -0
- package/dist/infrastructure/treesitter/ChunkContextBuilder.d.ts +45 -0
- package/dist/infrastructure/treesitter/ChunkContextBuilder.js +159 -0
- package/dist/infrastructure/treesitter/ChunkContextBuilder.js.map +1 -0
- package/dist/infrastructure/treesitter/LanguageCatalog.d.ts +30 -0
- package/dist/{lib/chunker/languages.js → infrastructure/treesitter/LanguageCatalog.js} +65 -41
- package/dist/infrastructure/treesitter/LanguageCatalog.js.map +1 -0
- package/dist/infrastructure/treesitter/SlidingWindowChunker.d.ts +15 -0
- package/dist/infrastructure/treesitter/SlidingWindowChunker.js +42 -0
- package/dist/infrastructure/treesitter/SlidingWindowChunker.js.map +1 -0
- package/dist/infrastructure/treesitter/TreeSitterChunker.d.ts +42 -0
- package/dist/infrastructure/treesitter/TreeSitterChunker.js +163 -0
- package/dist/infrastructure/treesitter/TreeSitterChunker.js.map +1 -0
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +15 -61
- package/dist/mcp.js.map +1 -1
- package/dist/presentation/cli/Cli.d.ts +31 -0
- package/dist/presentation/cli/Cli.js +120 -0
- package/dist/presentation/cli/Cli.js.map +1 -0
- package/dist/presentation/cli/CliOptions.d.ts +18 -0
- package/dist/presentation/cli/CliOptions.js +25 -0
- package/dist/presentation/cli/CliOptions.js.map +1 -0
- package/dist/presentation/cli/CommandContext.d.ts +50 -0
- package/dist/presentation/cli/CommandContext.js +88 -0
- package/dist/presentation/cli/CommandContext.js.map +1 -0
- package/dist/presentation/cli/ConfigTemplate.d.ts +31 -0
- package/dist/presentation/cli/ConfigTemplate.js +83 -0
- package/dist/presentation/cli/ConfigTemplate.js.map +1 -0
- package/dist/presentation/cli/Renderer.d.ts +90 -0
- package/dist/presentation/cli/Renderer.js +290 -0
- package/dist/presentation/cli/Renderer.js.map +1 -0
- package/dist/presentation/cli/commands/AskCommand.d.ts +14 -0
- package/dist/presentation/cli/commands/AskCommand.js +48 -0
- package/dist/presentation/cli/commands/AskCommand.js.map +1 -0
- package/dist/presentation/cli/commands/CompletionsCommand.d.ts +18 -0
- package/dist/presentation/cli/commands/CompletionsCommand.js +96 -0
- package/dist/presentation/cli/commands/CompletionsCommand.js.map +1 -0
- package/dist/presentation/cli/commands/ConfigCommands.d.ts +55 -0
- package/dist/presentation/cli/commands/ConfigCommands.js +204 -0
- package/dist/presentation/cli/commands/ConfigCommands.js.map +1 -0
- package/dist/presentation/cli/commands/IndexCommand.d.ts +18 -0
- package/dist/presentation/cli/commands/IndexCommand.js +54 -0
- package/dist/presentation/cli/commands/IndexCommand.js.map +1 -0
- package/dist/presentation/cli/commands/ProjectsCommand.d.ts +48 -0
- package/dist/presentation/cli/commands/ProjectsCommand.js +240 -0
- package/dist/presentation/cli/commands/ProjectsCommand.js.map +1 -0
- package/dist/presentation/cli/commands/SearchCommand.d.ts +19 -0
- package/dist/presentation/cli/commands/SearchCommand.js +55 -0
- package/dist/presentation/cli/commands/SearchCommand.js.map +1 -0
- package/dist/presentation/cli/commands/ServerCommands.d.ts +13 -0
- package/dist/presentation/cli/commands/ServerCommands.js +40 -0
- package/dist/presentation/cli/commands/ServerCommands.js.map +1 -0
- package/dist/presentation/cli/commands/ShareCommands.d.ts +22 -0
- package/dist/presentation/cli/commands/ShareCommands.js +134 -0
- package/dist/presentation/cli/commands/ShareCommands.js.map +1 -0
- package/dist/presentation/cli/commands/StatusCommand.d.ts +15 -0
- package/dist/presentation/cli/commands/StatusCommand.js +53 -0
- package/dist/presentation/cli/commands/StatusCommand.js.map +1 -0
- package/dist/presentation/mcp/HitFormatter.d.ts +17 -0
- package/dist/presentation/mcp/HitFormatter.js +42 -0
- package/dist/presentation/mcp/HitFormatter.js.map +1 -0
- package/dist/presentation/mcp/IndexWatchController.d.ts +17 -0
- package/dist/presentation/mcp/IndexWatchController.js +31 -0
- package/dist/presentation/mcp/IndexWatchController.js.map +1 -0
- package/dist/presentation/mcp/LmgrepCore.d.ts +66 -0
- package/dist/presentation/mcp/LmgrepCore.js +178 -0
- package/dist/presentation/mcp/LmgrepCore.js.map +1 -0
- package/dist/presentation/mcp/McpServer.d.ts +18 -0
- package/dist/presentation/mcp/McpServer.js +63 -0
- package/dist/presentation/mcp/McpServer.js.map +1 -0
- package/dist/presentation/mcp/ToolDescriptions.d.ts +40 -0
- package/dist/presentation/mcp/ToolDescriptions.js +85 -0
- package/dist/presentation/mcp/ToolDescriptions.js.map +1 -0
- package/package.json +84 -63
- package/dist/lib/build.d.ts +0 -7
- package/dist/lib/build.js +0 -284
- package/dist/lib/build.js.map +0 -1
- package/dist/lib/chunker/context.d.ts +0 -21
- package/dist/lib/chunker/context.js +0 -131
- package/dist/lib/chunker/context.js.map +0 -1
- package/dist/lib/chunker/index.d.ts +0 -7
- package/dist/lib/chunker/index.js +0 -150
- package/dist/lib/chunker/index.js.map +0 -1
- package/dist/lib/chunker/languages.d.ts +0 -15
- package/dist/lib/chunker/languages.js.map +0 -1
- package/dist/lib/config.d.ts +0 -12
- package/dist/lib/config.js +0 -83
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/embedder.d.ts +0 -55
- package/dist/lib/embedder.js +0 -221
- package/dist/lib/embedder.js.map +0 -1
- package/dist/lib/p2p.d.ts +0 -32
- package/dist/lib/p2p.js +0 -281
- package/dist/lib/p2p.js.map +0 -1
- package/dist/lib/providers.d.ts +0 -1
- package/dist/lib/providers.js +0 -41
- package/dist/lib/providers.js.map +0 -1
- package/dist/lib/repair.d.ts +0 -10
- package/dist/lib/repair.js +0 -57
- package/dist/lib/repair.js.map +0 -1
- package/dist/lib/scanner.d.ts +0 -34
- package/dist/lib/scanner.js +0 -242
- package/dist/lib/scanner.js.map +0 -1
- package/dist/lib/search-tool.d.ts +0 -47
- package/dist/lib/search-tool.js +0 -239
- package/dist/lib/search-tool.js.map +0 -1
- package/dist/lib/serve.d.ts +0 -11
- package/dist/lib/serve.js +0 -127
- package/dist/lib/serve.js.map +0 -1
- package/dist/lib/store.d.ts +0 -177
- package/dist/lib/store.js +0 -825
- package/dist/lib/store.js.map +0 -1
- package/dist/lib/types.d.ts +0 -129
- package/dist/lib/types.js +0 -13
- package/dist/lib/types.js.map +0 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Everything `init` managed to work out about the local setup. */
|
|
2
|
+
export interface DetectedSettings {
|
|
3
|
+
model?: string;
|
|
4
|
+
baseURL?: string;
|
|
5
|
+
providerPackage?: string;
|
|
6
|
+
local?: boolean;
|
|
7
|
+
chatModel?: string;
|
|
8
|
+
prefixes?: {
|
|
9
|
+
query: string;
|
|
10
|
+
document: string;
|
|
11
|
+
family?: string;
|
|
12
|
+
};
|
|
13
|
+
/** Deliberate tuning from an existing config, carried through untouched. */
|
|
14
|
+
batchSize?: number;
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
dimensions?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The starter `config.yml` written by `lmgrep init`.
|
|
20
|
+
*
|
|
21
|
+
* Every optional setting is present but commented out. That is deliberate: it
|
|
22
|
+
* doubles as the reference documentation a user actually reads, so an option
|
|
23
|
+
* they never knew existed is one line away rather than in a README.
|
|
24
|
+
*
|
|
25
|
+
* Only machine settings appear here. `ignore` and `extensions` describe a
|
|
26
|
+
* repository and belong in its `.lmgrep.yml`, where they can be committed and
|
|
27
|
+
* mean the same thing on every machine that checks it out.
|
|
28
|
+
*/
|
|
29
|
+
export declare class ConfigTemplate {
|
|
30
|
+
static render(detected?: DetectedSettings): string;
|
|
31
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The starter `config.yml` written by `lmgrep init`.
|
|
3
|
+
*
|
|
4
|
+
* Every optional setting is present but commented out. That is deliberate: it
|
|
5
|
+
* doubles as the reference documentation a user actually reads, so an option
|
|
6
|
+
* they never knew existed is one line away rather than in a README.
|
|
7
|
+
*
|
|
8
|
+
* Only machine settings appear here. `ignore` and `extensions` describe a
|
|
9
|
+
* repository and belong in its `.lmgrep.yml`, where they can be committed and
|
|
10
|
+
* mean the same thing on every machine that checks it out.
|
|
11
|
+
*/
|
|
12
|
+
export class ConfigTemplate {
|
|
13
|
+
static render(detected) {
|
|
14
|
+
const modelLine = detected?.model
|
|
15
|
+
? `model: ${detected.model}`
|
|
16
|
+
: "# model: ollama:nomic-embed-text # ← set your model here";
|
|
17
|
+
const baseURLLine = detected?.baseURL
|
|
18
|
+
? `baseURL: ${detected.baseURL}`
|
|
19
|
+
: "# baseURL: http://localhost:11434/v1";
|
|
20
|
+
const providerLine = detected?.providerPackage
|
|
21
|
+
? `provider: "${detected.providerPackage}"`
|
|
22
|
+
: '# provider: "@ai-sdk/openai-compatible"';
|
|
23
|
+
const localLine = detected?.local ? "local: true" : "# local: true";
|
|
24
|
+
// Asymmetric models need these and fail silently without them, so they
|
|
25
|
+
// are written out rather than left commented.
|
|
26
|
+
const prefixLines = detected?.prefixes
|
|
27
|
+
? [
|
|
28
|
+
detected.prefixes.family
|
|
29
|
+
? `# ${detected.prefixes.family} models are asymmetric — these prefixes are required.`
|
|
30
|
+
: "# Prefixes required by this model.",
|
|
31
|
+
`queryPrefix: ${JSON.stringify(detected.prefixes.query)}`,
|
|
32
|
+
`documentPrefix: ${JSON.stringify(detected.prefixes.document)}`,
|
|
33
|
+
].join("\n")
|
|
34
|
+
: [
|
|
35
|
+
'# queryPrefix: "search_query: "',
|
|
36
|
+
'# documentPrefix: "search_document: "',
|
|
37
|
+
].join("\n");
|
|
38
|
+
const chatLine = detected?.chatModel
|
|
39
|
+
? `chatModel: ${detected.chatModel}`
|
|
40
|
+
: "# chatModel: lmstudio:qwen/qwen3.5-9b";
|
|
41
|
+
return `# lmgrep — this machine's inference setup.
|
|
42
|
+
#
|
|
43
|
+
# These settings say which local models to use and where they listen. They are
|
|
44
|
+
# not per project: each model keeps its own index, so changing \`model\` here
|
|
45
|
+
# selects a different database rather than invalidating an existing one.
|
|
46
|
+
#
|
|
47
|
+
# Per-repository settings (ignore patterns, file extensions) go in a
|
|
48
|
+
# .lmgrep.yml inside that repository.
|
|
49
|
+
#
|
|
50
|
+
# Quick start with Ollama:
|
|
51
|
+
# 1. Install: curl -fsSL https://ollama.com/install.sh | sh
|
|
52
|
+
# 2. Pull a model: ollama pull nomic-embed-text
|
|
53
|
+
# 3. Run: lmgrep init --force (to auto-detect)
|
|
54
|
+
|
|
55
|
+
# Embedding model in "provider:model" format
|
|
56
|
+
${modelLine}
|
|
57
|
+
|
|
58
|
+
# Base URL for the embedding API
|
|
59
|
+
${baseURLLine}
|
|
60
|
+
|
|
61
|
+
# AI SDK package providing the model
|
|
62
|
+
${providerLine}
|
|
63
|
+
|
|
64
|
+
# Provider runs locally, so health checks may probe it freely
|
|
65
|
+
${localLine}
|
|
66
|
+
|
|
67
|
+
# Batch size for embedding API calls
|
|
68
|
+
batchSize: ${detected?.batchSize ?? 100}
|
|
69
|
+
|
|
70
|
+
${prefixLines}
|
|
71
|
+
|
|
72
|
+
# Generative model for \`lmgrep ask\`. Optional — without it, \`ask\` is hidden.
|
|
73
|
+
${chatLine}
|
|
74
|
+
|
|
75
|
+
# Optional: embedding dimensions (if model supports it)
|
|
76
|
+
${detected?.dimensions ? `dimensions: ${detected.dimensions}` : "# dimensions: 384"}
|
|
77
|
+
|
|
78
|
+
# Optional: max tokens per chunk (estimated at 4 chars/token)
|
|
79
|
+
${detected?.maxTokens ? `maxTokens: ${detected.maxTokens}` : "# maxTokens: 8192"}
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ConfigTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigTemplate.js","sourceRoot":"","sources":["../../../src/presentation/cli/ConfigTemplate.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IAC1B,MAAM,CAAC,MAAM,CAAC,QAA2B;QACxC,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK;YAChC,CAAC,CAAC,UAAU,QAAQ,CAAC,KAAK,EAAE;YAC5B,CAAC,CAAC,2DAA2D,CAAC;QAC/D,MAAM,WAAW,GAAG,QAAQ,EAAE,OAAO;YACpC,CAAC,CAAC,YAAY,QAAQ,CAAC,OAAO,EAAE;YAChC,CAAC,CAAC,sCAAsC,CAAC;QAC1C,MAAM,YAAY,GAAG,QAAQ,EAAE,eAAe;YAC7C,CAAC,CAAC,cAAc,QAAQ,CAAC,eAAe,GAAG;YAC3C,CAAC,CAAC,yCAAyC,CAAC;QAC7C,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC;QAEpE,uEAAuE;QACvE,8CAA8C;QAC9C,MAAM,WAAW,GAAG,QAAQ,EAAE,QAAQ;YACrC,CAAC,CAAC;gBACA,QAAQ,CAAC,QAAQ,CAAC,MAAM;oBACvB,CAAC,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,uDAAuD;oBACtF,CAAC,CAAC,oCAAoC;gBACvC,gBAAgB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACzD,mBAAmB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;aAC/D,CAAC,IAAI,CAAC,IAAI,CAAC;YACb,CAAC,CAAC;gBACA,iCAAiC;gBACjC,uCAAuC;aACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEf,MAAM,QAAQ,GAAG,QAAQ,EAAE,SAAS;YACnC,CAAC,CAAC,cAAc,QAAQ,CAAC,SAAS,EAAE;YACpC,CAAC,CAAC,uCAAuC,CAAC;QAE3C,OAAO;;;;;;;;;;;;;;;EAeP,SAAS;;;EAGT,WAAW;;;EAGX,YAAY;;;EAGZ,SAAS;;;aAGE,QAAQ,EAAE,SAAS,IAAI,GAAG;;EAErC,WAAW;;;EAGX,QAAQ;;;EAGR,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,mBAAmB;;;EAGjF,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,mBAAmB;CAC/E,CAAC;IACD,CAAC;CACD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { TidyReport } from "../../application/Lmgrep.js";
|
|
2
|
+
import type { Inventory } from "../../application/operations/IndexInventory.js";
|
|
3
|
+
import type { StatusInfo } from "../../application/operations/StatusService.js";
|
|
4
|
+
import type { ProjectIndex } from "../../domain/ports/ProjectIndexesPort.js";
|
|
5
|
+
import type { TraceEntry } from "../../domain/research/ResearchTrace.js";
|
|
6
|
+
import type { Hit } from "../../domain/retrieval/Hit.js";
|
|
7
|
+
import type { RunningProcess } from "../../infrastructure/process/ProcessRegistry.js";
|
|
8
|
+
/**
|
|
9
|
+
* All terminal output for the CLI.
|
|
10
|
+
*
|
|
11
|
+
* Separated from the commands so that what a command *does* and how it *reads*
|
|
12
|
+
* are independently changeable — the commands became testable the moment they
|
|
13
|
+
* stopped calling console.log directly.
|
|
14
|
+
*/
|
|
15
|
+
export declare class Renderer {
|
|
16
|
+
private readonly out;
|
|
17
|
+
private static readonly RULE_WIDTH;
|
|
18
|
+
constructor(out?: (line: string) => void);
|
|
19
|
+
line(text?: string): void;
|
|
20
|
+
rule(): void;
|
|
21
|
+
json(value: unknown): void;
|
|
22
|
+
/**
|
|
23
|
+
* Full result view: a ruled header, the context block, then the source.
|
|
24
|
+
*
|
|
25
|
+
* The score is always shown. It used to be behind `--scores`, which meant
|
|
26
|
+
* the one number that says how much to trust a result was hidden by
|
|
27
|
+
* default and cost a flag to see.
|
|
28
|
+
*/
|
|
29
|
+
hits(hits: readonly Hit[]): void;
|
|
30
|
+
/** Just the distinct file paths, in first-hit order. */
|
|
31
|
+
hitPaths(hits: readonly Hit[]): void;
|
|
32
|
+
/** One research step, written to stderr so stdout stays pipeable. */
|
|
33
|
+
static formatTrace(entry: TraceEntry): string;
|
|
34
|
+
/**
|
|
35
|
+
* The verdict, first and alone.
|
|
36
|
+
*
|
|
37
|
+
* Everything below it is detail for when the answer is "no". This line is
|
|
38
|
+
* the whole reason to run the command.
|
|
39
|
+
*/
|
|
40
|
+
statusVerdict(info: StatusInfo): void;
|
|
41
|
+
/** Configuration and paths — shown even when there is no index yet. */
|
|
42
|
+
statusHeader(info: StatusInfo): void;
|
|
43
|
+
/**
|
|
44
|
+
* Which file supplied which settings.
|
|
45
|
+
*
|
|
46
|
+
* Worth a section of its own because the alternative is guessing. With two
|
|
47
|
+
* files able to set the same key, an effective value printed on its own
|
|
48
|
+
* tells you what lmgrep decided but not where to go to change it — which
|
|
49
|
+
* is the actual question when the answer surprises you.
|
|
50
|
+
*/
|
|
51
|
+
statusConfig(info: StatusInfo): void;
|
|
52
|
+
statusStats(info: StatusInfo): void;
|
|
53
|
+
/**
|
|
54
|
+
* How searches are answered.
|
|
55
|
+
*
|
|
56
|
+
* Worth its own line because the difference is invisible otherwise: without
|
|
57
|
+
* an index every query scans every embedding, costing roughly the index's
|
|
58
|
+
* size in memory and an order of magnitude in latency. Nothing else tells
|
|
59
|
+
* the user that is happening.
|
|
60
|
+
*/
|
|
61
|
+
private vectorIndex;
|
|
62
|
+
statusChecks(info: StatusInfo): void;
|
|
63
|
+
/** Who else is holding this index, and whether they are watching it. */
|
|
64
|
+
runningProcesses(processes: readonly RunningProcess[]): void;
|
|
65
|
+
/** Working-tree drift, truncated so a large diff stays readable. */
|
|
66
|
+
changes(changes: {
|
|
67
|
+
added: string[];
|
|
68
|
+
modified: string[];
|
|
69
|
+
deleted: string[];
|
|
70
|
+
}): void;
|
|
71
|
+
private changeGroup;
|
|
72
|
+
/**
|
|
73
|
+
* Warn that this run builds a *second* index for the project.
|
|
74
|
+
*
|
|
75
|
+
* Silent unless another model's index already exists, which is the only
|
|
76
|
+
* case where a full re-embed is about to happen for a reason the user may
|
|
77
|
+
* not have intended.
|
|
78
|
+
*/
|
|
79
|
+
newModelNotice(others: readonly ProjectIndex[]): void;
|
|
80
|
+
/** What a maintenance pass changed; silent when it changed nothing. */
|
|
81
|
+
maintenance(report: TidyReport): void;
|
|
82
|
+
/**
|
|
83
|
+
* Every index on this machine.
|
|
84
|
+
*
|
|
85
|
+
* Sorted by size and leading with the total, because the question this
|
|
86
|
+
* answers is almost always "what is using my disk, and can I delete it".
|
|
87
|
+
*/
|
|
88
|
+
inventory(inventory: Inventory): void;
|
|
89
|
+
error(message: string): void;
|
|
90
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { DiskUsage } from "../../infrastructure/fs/DiskUsage.js";
|
|
2
|
+
/**
|
|
3
|
+
* All terminal output for the CLI.
|
|
4
|
+
*
|
|
5
|
+
* Separated from the commands so that what a command *does* and how it *reads*
|
|
6
|
+
* are independently changeable — the commands became testable the moment they
|
|
7
|
+
* stopped calling console.log directly.
|
|
8
|
+
*/
|
|
9
|
+
export class Renderer {
|
|
10
|
+
out;
|
|
11
|
+
static RULE_WIDTH = 60;
|
|
12
|
+
constructor(out = console.log) {
|
|
13
|
+
this.out = out;
|
|
14
|
+
}
|
|
15
|
+
line(text = "") {
|
|
16
|
+
this.out(text);
|
|
17
|
+
}
|
|
18
|
+
rule() {
|
|
19
|
+
this.out("─".repeat(Renderer.RULE_WIDTH));
|
|
20
|
+
}
|
|
21
|
+
json(value) {
|
|
22
|
+
this.out(JSON.stringify(value, null, 2));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Full result view: a ruled header, the context block, then the source.
|
|
26
|
+
*
|
|
27
|
+
* The score is always shown. It used to be behind `--scores`, which meant
|
|
28
|
+
* the one number that says how much to trust a result was hidden by
|
|
29
|
+
* default and cost a flag to see.
|
|
30
|
+
*/
|
|
31
|
+
hits(hits) {
|
|
32
|
+
for (const hit of hits) {
|
|
33
|
+
const score = ` (${hit.score.toFixed(3)})`;
|
|
34
|
+
this.out(`\n${"─".repeat(Renderer.RULE_WIDTH)}`);
|
|
35
|
+
this.out(`${hit.location} [${hit.type}] ${hit.name}${score}`);
|
|
36
|
+
this.rule();
|
|
37
|
+
this.out(hit.context);
|
|
38
|
+
this.out("");
|
|
39
|
+
this.out(hit.content);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Just the distinct file paths, in first-hit order. */
|
|
43
|
+
hitPaths(hits) {
|
|
44
|
+
const seen = new Set();
|
|
45
|
+
for (const hit of hits) {
|
|
46
|
+
if (seen.has(hit.location.filePath))
|
|
47
|
+
continue;
|
|
48
|
+
seen.add(hit.location.filePath);
|
|
49
|
+
this.out(hit.location.filePath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** One research step, written to stderr so stdout stays pipeable. */
|
|
53
|
+
static formatTrace(entry) {
|
|
54
|
+
return entry.kind === "search"
|
|
55
|
+
? ` search "${entry.query}" → ${entry.hits} hits`
|
|
56
|
+
: ` · ${entry.message}`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The verdict, first and alone.
|
|
60
|
+
*
|
|
61
|
+
* Everything below it is detail for when the answer is "no". This line is
|
|
62
|
+
* the whole reason to run the command.
|
|
63
|
+
*/
|
|
64
|
+
statusVerdict(info) {
|
|
65
|
+
if (!info.verdict.searchable) {
|
|
66
|
+
this.out(`Not searchable — ${info.verdict.reason}`);
|
|
67
|
+
this.out(` Fix: ${info.verdict.fix}`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.out("Searchable.");
|
|
71
|
+
if (info.verdict.note)
|
|
72
|
+
this.out(` Note: ${info.verdict.note}`);
|
|
73
|
+
}
|
|
74
|
+
/** Configuration and paths — shown even when there is no index yet. */
|
|
75
|
+
statusHeader(info) {
|
|
76
|
+
this.out(`\nProject: ${info.projectRoot}`);
|
|
77
|
+
if (info.prefix)
|
|
78
|
+
this.out(`Subdirectory: ${info.prefix}`);
|
|
79
|
+
this.out(`Index: ${info.databasePath}`);
|
|
80
|
+
this.out(`Model: ${info.config.model}`);
|
|
81
|
+
if (info.config.baseURL)
|
|
82
|
+
this.out(`Server: ${info.config.baseURL}`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Which file supplied which settings.
|
|
86
|
+
*
|
|
87
|
+
* Worth a section of its own because the alternative is guessing. With two
|
|
88
|
+
* files able to set the same key, an effective value printed on its own
|
|
89
|
+
* tells you what lmgrep decided but not where to go to change it — which
|
|
90
|
+
* is the actual question when the answer surprises you.
|
|
91
|
+
*/
|
|
92
|
+
statusConfig(info) {
|
|
93
|
+
this.out("\nConfiguration:");
|
|
94
|
+
if (info.configSources.length === 0) {
|
|
95
|
+
this.out(" (none — defaults only)");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
for (const source of info.configSources) {
|
|
99
|
+
const marks = [
|
|
100
|
+
source.scope === "project" ? "project" : "machine",
|
|
101
|
+
source.deprecated ? "deprecated location" : undefined,
|
|
102
|
+
].filter(Boolean);
|
|
103
|
+
this.out(` ${source.path} [${marks.join(", ")}]`);
|
|
104
|
+
this.out(` ${source.keys.join(", ") || "(nothing applied)"}`);
|
|
105
|
+
}
|
|
106
|
+
if (info.configSources.length > 1) {
|
|
107
|
+
this.out(" Later files override earlier ones, key by key.");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
statusStats(info) {
|
|
111
|
+
this.out("\nIndex stats:");
|
|
112
|
+
this.out(` Files: ${info.fileCount}`);
|
|
113
|
+
this.out(` Chunks: ${info.chunkCount}`);
|
|
114
|
+
this.out(` Unique hashes: ${info.uniqueHashes}`);
|
|
115
|
+
if (info.indexModel)
|
|
116
|
+
this.out(` Index model: ${info.indexModel}`);
|
|
117
|
+
if (info.indexDimensions) {
|
|
118
|
+
this.out(` Dimensions: ${info.indexDimensions}`);
|
|
119
|
+
}
|
|
120
|
+
// A gap between rows and distinct hashes means duplicate chunks, which
|
|
121
|
+
// `lmgrep compact` removes.
|
|
122
|
+
if (info.chunkCount !== info.uniqueHashes) {
|
|
123
|
+
this.out(` Duplicates: ${info.chunkCount - info.uniqueHashes}`);
|
|
124
|
+
}
|
|
125
|
+
this.vectorIndex(info.vectorIndex);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* How searches are answered.
|
|
129
|
+
*
|
|
130
|
+
* Worth its own line because the difference is invisible otherwise: without
|
|
131
|
+
* an index every query scans every embedding, costing roughly the index's
|
|
132
|
+
* size in memory and an order of magnitude in latency. Nothing else tells
|
|
133
|
+
* the user that is happening.
|
|
134
|
+
*/
|
|
135
|
+
vectorIndex(state) {
|
|
136
|
+
if (state.built) {
|
|
137
|
+
this.out(state.unindexed > 0
|
|
138
|
+
? ` Vector index: yes (${state.unindexed} rows awaiting the next optimize)`
|
|
139
|
+
: " Vector index: yes");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (!state.worthBuilding) {
|
|
143
|
+
this.out(" Vector index: not needed at this size");
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
this.out(" Vector index: MISSING — every search scans all " +
|
|
147
|
+
`${state.rows} embeddings. Run \`lmgrep index\` to build it.`);
|
|
148
|
+
}
|
|
149
|
+
statusChecks(info) {
|
|
150
|
+
this.out("\nEmbedding check:");
|
|
151
|
+
if (info.embeddingOk) {
|
|
152
|
+
this.out(` OK (${info.embeddingLatencyMs}ms)`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
this.out(" FAILED");
|
|
156
|
+
for (const line of (info.embeddingError ?? "").split("\n")) {
|
|
157
|
+
if (info.embeddingError)
|
|
158
|
+
this.out(` ${line}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
this.out("\nSearch check:");
|
|
162
|
+
if (info.searchOk) {
|
|
163
|
+
this.out(` OK (${info.searchResultCount} result, ${info.searchLatencyMs}ms)`);
|
|
164
|
+
}
|
|
165
|
+
else if (info.embeddingOk && info.fileCount > 0) {
|
|
166
|
+
this.out(" FAILED (query returned no results)");
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.out(" SKIPPED");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Who else is holding this index, and whether they are watching it. */
|
|
173
|
+
runningProcesses(processes) {
|
|
174
|
+
if (processes.length === 0) {
|
|
175
|
+
this.out("\nNo running lmgrep processes.");
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.out("\nRunning processes:");
|
|
179
|
+
for (const proc of processes) {
|
|
180
|
+
const label = proc.kind === "mcp"
|
|
181
|
+
? "MCP server"
|
|
182
|
+
: proc.kind === "serve"
|
|
183
|
+
? "serve"
|
|
184
|
+
: "CLI";
|
|
185
|
+
this.out(` ${label} (pid ${proc.pid})${proc.watching ? ", watching" : ""}`);
|
|
186
|
+
this.out(` project: ${proc.projectRoot ?? "unknown"}`);
|
|
187
|
+
if (proc.databasePath)
|
|
188
|
+
this.out(` index: ${proc.databasePath}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** Working-tree drift, truncated so a large diff stays readable. */
|
|
192
|
+
changes(changes) {
|
|
193
|
+
const total = changes.added.length + changes.modified.length + changes.deleted.length;
|
|
194
|
+
if (total === 0) {
|
|
195
|
+
this.out(" No changes detected.");
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
this.changeGroup("Added", "+", changes.added);
|
|
199
|
+
this.changeGroup("Modified", "~", changes.modified);
|
|
200
|
+
this.changeGroup("Deleted", "-", changes.deleted);
|
|
201
|
+
this.out("\n Run `lmgrep index` to update the index.");
|
|
202
|
+
}
|
|
203
|
+
changeGroup(label, marker, files) {
|
|
204
|
+
if (files.length === 0)
|
|
205
|
+
return;
|
|
206
|
+
const SHOWN = 10;
|
|
207
|
+
this.out(` ${label}: ${files.length}`);
|
|
208
|
+
for (const f of files.slice(0, SHOWN))
|
|
209
|
+
this.out(` ${marker} ${f}`);
|
|
210
|
+
if (files.length > SHOWN) {
|
|
211
|
+
this.out(` ... and ${files.length - SHOWN} more`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Warn that this run builds a *second* index for the project.
|
|
216
|
+
*
|
|
217
|
+
* Silent unless another model's index already exists, which is the only
|
|
218
|
+
* case where a full re-embed is about to happen for a reason the user may
|
|
219
|
+
* not have intended.
|
|
220
|
+
*/
|
|
221
|
+
newModelNotice(others) {
|
|
222
|
+
if (others.length === 0)
|
|
223
|
+
return;
|
|
224
|
+
this.out("This project is already indexed with " +
|
|
225
|
+
others
|
|
226
|
+
.map((o) => `${o.model ?? "an unrecorded model"} (${DiskUsage.format(o.bytes)})`)
|
|
227
|
+
.join(", "));
|
|
228
|
+
this.out("Embedding it again under the newly configured model. The existing index is kept —");
|
|
229
|
+
this.out("setting `model` back returns to it instantly. `lmgrep projects` lists both.\n");
|
|
230
|
+
}
|
|
231
|
+
/** What a maintenance pass changed; silent when it changed nothing. */
|
|
232
|
+
maintenance(report) {
|
|
233
|
+
const { duplicateIds, staleVersions, before, after } = report.deduped;
|
|
234
|
+
if (duplicateIds + staleVersions > 0) {
|
|
235
|
+
this.out(`Removed ${duplicateIds} duplicate and ${staleVersions} superseded chunks (${before} → ${after}).`);
|
|
236
|
+
}
|
|
237
|
+
for (const table of report.optimized.tables) {
|
|
238
|
+
if (table.action === "created") {
|
|
239
|
+
this.out(`Built vector index on ${table.table} (${table.rows} rows).`);
|
|
240
|
+
}
|
|
241
|
+
else if (table.action === "dropped") {
|
|
242
|
+
this.out(`Dropped the unused ${table.table} table (${table.rows} rows).`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Every index on this machine.
|
|
248
|
+
*
|
|
249
|
+
* Sorted by size and leading with the total, because the question this
|
|
250
|
+
* answers is almost always "what is using my disk, and can I delete it".
|
|
251
|
+
*/
|
|
252
|
+
inventory(inventory) {
|
|
253
|
+
if (inventory.entries.length === 0) {
|
|
254
|
+
this.out("No indexes on this machine yet. Run `lmgrep index` in a project.");
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
for (const entry of inventory.entries) {
|
|
258
|
+
const marks = [
|
|
259
|
+
entry.kind === "legacy" ? "legacy" : undefined,
|
|
260
|
+
entry.name ? "standalone" : undefined,
|
|
261
|
+
entry.state === "orphaned" ? "project gone" : undefined,
|
|
262
|
+
entry.state === "unattributable" ? "unattributable" : undefined,
|
|
263
|
+
].filter(Boolean);
|
|
264
|
+
this.out(`${DiskUsage.format(entry.bytes).padStart(7)} ${entry.name ?? entry.root ?? "(unknown project)"}` +
|
|
265
|
+
(marks.length > 0 ? ` [${marks.join(", ")}]` : ""));
|
|
266
|
+
this.out(` ${entry.model ?? "unknown model"}${entry.dimensions ? ` · ${entry.dimensions} dims` : ""}`);
|
|
267
|
+
this.out(` ${entry.databasePath}`);
|
|
268
|
+
}
|
|
269
|
+
this.out(`\n${inventory.entries.length} index(es), ${DiskUsage.format(inventory.totalBytes)} total.`);
|
|
270
|
+
const legacy = inventory.entries.filter((e) => e.kind === "legacy").length;
|
|
271
|
+
const dead = inventory.entries.filter((e) => e.state === "orphaned").length;
|
|
272
|
+
const unknown = inventory.entries.filter((e) => e.state === "unattributable").length;
|
|
273
|
+
if (legacy > 0) {
|
|
274
|
+
this.out(`${legacy} still in the state directory — run \`lmgrep projects adopt\` in each project to move them in.`);
|
|
275
|
+
}
|
|
276
|
+
if (dead > 0) {
|
|
277
|
+
this.out(`${dead} whose project no longer exists — \`lmgrep projects gc\` reclaims them.`);
|
|
278
|
+
}
|
|
279
|
+
if (unknown > 0) {
|
|
280
|
+
this.out(`${unknown} record no project — \`lmgrep projects gc --unknown\` includes them.`);
|
|
281
|
+
}
|
|
282
|
+
if (inventory.dangling > 0) {
|
|
283
|
+
this.out(`${inventory.dangling} stale pointer(s) to deleted indexes — \`lmgrep projects gc\` forgets them.`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
error(message) {
|
|
287
|
+
console.error(message);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=Renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Renderer.js","sourceRoot":"","sources":["../../../src/presentation/cli/Renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../CommandContext.js";
|
|
3
|
+
/**
|
|
4
|
+
* `lmgrep ask` — a synthesized, cited answer.
|
|
5
|
+
*
|
|
6
|
+
* The live trace goes to stderr and the answer to stdout, so the command stays
|
|
7
|
+
* pipeable while still showing progress on a run that can take minutes.
|
|
8
|
+
*/
|
|
9
|
+
export declare class AskCommand {
|
|
10
|
+
private readonly context;
|
|
11
|
+
constructor(context: CommandContext);
|
|
12
|
+
register(program: Command): void;
|
|
13
|
+
private run;
|
|
14
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CliOptions } from "../CliOptions.js";
|
|
2
|
+
import { Renderer } from "../Renderer.js";
|
|
3
|
+
/**
|
|
4
|
+
* `lmgrep ask` — a synthesized, cited answer.
|
|
5
|
+
*
|
|
6
|
+
* The live trace goes to stderr and the answer to stdout, so the command stays
|
|
7
|
+
* pipeable while still showing progress on a run that can take minutes.
|
|
8
|
+
*/
|
|
9
|
+
export class AskCommand {
|
|
10
|
+
context;
|
|
11
|
+
constructor(context) {
|
|
12
|
+
this.context = context;
|
|
13
|
+
}
|
|
14
|
+
register(program) {
|
|
15
|
+
CliOptions.target(program
|
|
16
|
+
.command("ask <question...>")
|
|
17
|
+
.description("Answer a question with a local research loop (search, read, synthesize)")
|
|
18
|
+
.option("--json", "Print the full result (answer, sources, trace) as JSON")
|
|
19
|
+
.option("--quiet", "Suppress the live research trace on stderr")).action((question, options) => this.run(question.join(" "), options));
|
|
20
|
+
}
|
|
21
|
+
async run(question, options) {
|
|
22
|
+
const { renderer } = this.context;
|
|
23
|
+
await this.context.withLmgrep(options, async (lmgrep) => {
|
|
24
|
+
const result = await lmgrep.ask(question, options.quiet
|
|
25
|
+
? undefined
|
|
26
|
+
: (entry) => process.stderr.write(`${Renderer.formatTrace(entry)}\n`));
|
|
27
|
+
if (options.json) {
|
|
28
|
+
renderer.json(result);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!options.quiet)
|
|
32
|
+
process.stderr.write("\n");
|
|
33
|
+
renderer.line(result.answer);
|
|
34
|
+
if (result.sources.length > 0) {
|
|
35
|
+
renderer.line("\nSources:");
|
|
36
|
+
for (const s of result.sources) {
|
|
37
|
+
renderer.line(` [${s.n}] ${s.path}:${s.startLine}-${s.endLine}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const seconds = (result.elapsedMs / 1000).toFixed(1);
|
|
41
|
+
const degraded = result.degraded
|
|
42
|
+
? " (degraded: synthesis unavailable)"
|
|
43
|
+
: "";
|
|
44
|
+
process.stderr.write(`\n(${result.steps} steps, ${seconds}s)${degraded}\n`);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=AskCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AskCommand.js","sourceRoot":"","sources":["../../../../src/presentation/cli/commands/AskCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO1C;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACO;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD,QAAQ,CAAC,OAAgB;QACxB,UAAU,CAAC,MAAM,CAChB,OAAO;aACL,OAAO,CAAC,mBAAmB,CAAC;aAC5B,WAAW,CACX,yEAAyE,CACzE;aACA,MAAM,CACN,QAAQ,EACR,wDAAwD,CACxD;aACA,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC,CACjE,CAAC,MAAM,CAAC,CAAC,QAAkB,EAAE,OAAmB,EAAE,EAAE,CACpD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CACrC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,OAAmB;QACtD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC9B,QAAQ,EACR,OAAO,CAAC,KAAK;gBACZ,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CACtE,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,OAAO;YACR,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE7B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAChC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,CAAC;YACF,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;gBAC/B,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,EAAE,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,MAAM,MAAM,CAAC,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI,CACrD,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;CACD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../CommandContext.js";
|
|
3
|
+
/** `lmgrep completions` — shell completion scripts. */
|
|
4
|
+
export declare class CompletionsCommand {
|
|
5
|
+
private readonly context;
|
|
6
|
+
/** Preferred first: a user-local path needs no privileges. */
|
|
7
|
+
private static readonly ZSH_CANDIDATES;
|
|
8
|
+
constructor(context: CommandContext);
|
|
9
|
+
register(program: Command): void;
|
|
10
|
+
private runZsh;
|
|
11
|
+
/**
|
|
12
|
+
* The first candidate directory that exists and is writable, or that we can
|
|
13
|
+
* create. `$fpath` is consulted too, since a user's zsh setup may put
|
|
14
|
+
* site-functions somewhere unusual.
|
|
15
|
+
*/
|
|
16
|
+
private findSiteFunctions;
|
|
17
|
+
private fpathEntries;
|
|
18
|
+
}
|