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,109 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { PidFileLock } from "../fs/PidFileLock.js";
|
|
4
|
+
/**
|
|
5
|
+
* Discovers which lmgrep processes are alive and what they hold.
|
|
6
|
+
*
|
|
7
|
+
* Maintainer lock files double as the registry: each records its owner's pid,
|
|
8
|
+
* worktree and database, so scanning them and testing liveness gives an
|
|
9
|
+
* accurate picture without any separate bookkeeping that could drift from
|
|
10
|
+
* reality.
|
|
11
|
+
*/
|
|
12
|
+
export class ProcessRegistry {
|
|
13
|
+
state;
|
|
14
|
+
static LOCK_SUFFIX = ".lock";
|
|
15
|
+
constructor(state) {
|
|
16
|
+
this.state = state;
|
|
17
|
+
}
|
|
18
|
+
discoverRunning() {
|
|
19
|
+
const results = [];
|
|
20
|
+
// One process can hold several databases; report it once.
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
for (const path of this.lockFiles()) {
|
|
23
|
+
const owner = new PidFileLock(path).read();
|
|
24
|
+
if (owner === undefined)
|
|
25
|
+
continue;
|
|
26
|
+
if (!PidFileLock.isAlive(owner.pid) || seen.has(owner.pid))
|
|
27
|
+
continue;
|
|
28
|
+
seen.add(owner.pid);
|
|
29
|
+
const info = this.inspect(owner.pid);
|
|
30
|
+
if (!info)
|
|
31
|
+
continue;
|
|
32
|
+
results.push({
|
|
33
|
+
pid: owner.pid,
|
|
34
|
+
processName: info.name,
|
|
35
|
+
cmdline: info.cmdline,
|
|
36
|
+
kind: this.classify(info),
|
|
37
|
+
// The lock records the worktree its owner actually watches,
|
|
38
|
+
// which is what the user wants to see — several worktrees can
|
|
39
|
+
// share one database, so the database's own recorded root
|
|
40
|
+
// would name the wrong tree.
|
|
41
|
+
projectRoot: owner.root,
|
|
42
|
+
databasePath: owner.database,
|
|
43
|
+
// Every lock in this scan is a maintainer lock, and only a
|
|
44
|
+
// watcher ever takes one — so holding it *is* watching. This
|
|
45
|
+
// used to be inferred from the command line, which cannot
|
|
46
|
+
// work: setting process.title overwrites that buffer, so the
|
|
47
|
+
// subcommand a process was launched with is no longer there
|
|
48
|
+
// to match against.
|
|
49
|
+
watching: true,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Lock files, from the locks directory and from the state root.
|
|
56
|
+
*
|
|
57
|
+
* The root is scanned too because a watcher started before locks moved is
|
|
58
|
+
* still running and still holds its database — reporting "no running
|
|
59
|
+
* processes" right after an upgrade would be wrong in exactly the moment
|
|
60
|
+
* someone is most likely to check.
|
|
61
|
+
*/
|
|
62
|
+
lockFiles() {
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const directory of [this.state.locksDirectory(), this.state.root()]) {
|
|
65
|
+
let entries;
|
|
66
|
+
try {
|
|
67
|
+
entries = readdirSync(directory);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
if (entry.endsWith(ProcessRegistry.LOCK_SUFFIX)) {
|
|
74
|
+
out.push(join(directory, entry));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
inspect(pid) {
|
|
81
|
+
try {
|
|
82
|
+
return {
|
|
83
|
+
name: readFileSync(`/proc/${pid}/comm`, "utf-8").trim(),
|
|
84
|
+
cmdline: readFileSync(`/proc/${pid}/cmdline`, "utf-8")
|
|
85
|
+
.replace(/\0/g, " ")
|
|
86
|
+
.trim(),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// No procfs (macOS) or the process exited mid-scan.
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* What kind of process this is, from its title.
|
|
96
|
+
*
|
|
97
|
+
* The title is the only reliable signal: `process.title` rewrites the argv
|
|
98
|
+
* buffer, so /proc/<pid>/cmdline reads back as the title alone and carries
|
|
99
|
+
* no subcommand. The MCP entry point titles itself distinctly; anything
|
|
100
|
+
* else holding a maintainer lock reached it through `lmgrep serve`.
|
|
101
|
+
*/
|
|
102
|
+
classify(info) {
|
|
103
|
+
if (info.name === "lmgrep-mcp" || info.cmdline.includes("mcp")) {
|
|
104
|
+
return "mcp";
|
|
105
|
+
}
|
|
106
|
+
return "serve";
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=ProcessRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessRegistry.js","sourceRoot":"","sources":["../../../src/infrastructure/process/ProcessRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Node } from "web-tree-sitter";
|
|
2
|
+
import type { LanguageConfig } from "./LanguageCatalog.js";
|
|
3
|
+
/** What kind of thing a chunk is, structurally. */
|
|
4
|
+
export type StructuralRole = "definition" | "orchestration" | "implementation";
|
|
5
|
+
/** One enclosing scope, e.g. `class Foo`. */
|
|
6
|
+
export interface ScopeEntry {
|
|
7
|
+
kind: string;
|
|
8
|
+
name: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Builds the context header prepended to a chunk before embedding.
|
|
12
|
+
*
|
|
13
|
+
* The header is what makes an isolated function retrievable: on its own,
|
|
14
|
+
* `async function handle(req)` shares little vocabulary with "how are webhooks
|
|
15
|
+
* authenticated", but stamped with its file, enclosing class and doc comment
|
|
16
|
+
* it does. Retrieval quality depends on this at least as much as on the text.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ChunkContextBuilder {
|
|
19
|
+
/** How far above a node to look for its doc comment. */
|
|
20
|
+
private static readonly MAX_COMMENT_LOOKBACK;
|
|
21
|
+
/** AST node type -> the word used for it in the header. */
|
|
22
|
+
private static readonly SCOPE_KINDS;
|
|
23
|
+
/** Node types that declare a shape rather than behaviour. */
|
|
24
|
+
private static readonly DEFINITION_TYPES;
|
|
25
|
+
/** Node types that wire things together rather than implement them. */
|
|
26
|
+
private static readonly ORCHESTRATION_TYPES;
|
|
27
|
+
/** The full header for one chunk. */
|
|
28
|
+
build(node: Node, filePath: string, source: string, language: LanguageConfig): string;
|
|
29
|
+
/** The minimal header for a file with no parsed structure. */
|
|
30
|
+
buildFileOnly(filePath: string): string;
|
|
31
|
+
/** Walk up from a node collecting the named scopes that enclose it. */
|
|
32
|
+
extractScope(node: Node, language: LanguageConfig): ScopeEntry[];
|
|
33
|
+
/**
|
|
34
|
+
* Collect the comment block or decorators immediately above a node.
|
|
35
|
+
*
|
|
36
|
+
* A blank line ends the block only once something has been collected, so a
|
|
37
|
+
* comment separated from its node by whitespace is still picked up, while
|
|
38
|
+
* unrelated code above it is not.
|
|
39
|
+
*/
|
|
40
|
+
extractLeadingComment(node: Node, source: string): string | null;
|
|
41
|
+
classifyRole(node: Node): StructuralRole;
|
|
42
|
+
/** Comment syntax across every supported language, plus decorators. */
|
|
43
|
+
private looksLikeCommentOrDecorator;
|
|
44
|
+
private nodeName;
|
|
45
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the context header prepended to a chunk before embedding.
|
|
3
|
+
*
|
|
4
|
+
* The header is what makes an isolated function retrievable: on its own,
|
|
5
|
+
* `async function handle(req)` shares little vocabulary with "how are webhooks
|
|
6
|
+
* authenticated", but stamped with its file, enclosing class and doc comment
|
|
7
|
+
* it does. Retrieval quality depends on this at least as much as on the text.
|
|
8
|
+
*/
|
|
9
|
+
export class ChunkContextBuilder {
|
|
10
|
+
/** How far above a node to look for its doc comment. */
|
|
11
|
+
static MAX_COMMENT_LOOKBACK = 10;
|
|
12
|
+
/** AST node type -> the word used for it in the header. */
|
|
13
|
+
static SCOPE_KINDS = {
|
|
14
|
+
// TypeScript / JavaScript
|
|
15
|
+
class_declaration: "class",
|
|
16
|
+
class_body: "class",
|
|
17
|
+
interface_declaration: "interface",
|
|
18
|
+
module: "module",
|
|
19
|
+
namespace_declaration: "namespace",
|
|
20
|
+
// Python
|
|
21
|
+
class_definition: "class",
|
|
22
|
+
// Rust
|
|
23
|
+
impl_item: "impl",
|
|
24
|
+
trait_item: "trait",
|
|
25
|
+
mod_item: "mod",
|
|
26
|
+
// Go
|
|
27
|
+
type_declaration: "type",
|
|
28
|
+
// Ruby
|
|
29
|
+
class: "class",
|
|
30
|
+
// C / C++
|
|
31
|
+
struct_specifier: "struct",
|
|
32
|
+
class_specifier: "class",
|
|
33
|
+
namespace_definition: "namespace",
|
|
34
|
+
// Swift
|
|
35
|
+
struct_declaration: "struct",
|
|
36
|
+
extension_declaration: "extension",
|
|
37
|
+
// Scala
|
|
38
|
+
object_definition: "object",
|
|
39
|
+
trait_definition: "trait",
|
|
40
|
+
// Generic
|
|
41
|
+
ContainerDecl: "container",
|
|
42
|
+
};
|
|
43
|
+
/** Node types that declare a shape rather than behaviour. */
|
|
44
|
+
static DEFINITION_TYPES = new Set([
|
|
45
|
+
"class_declaration",
|
|
46
|
+
"class_definition",
|
|
47
|
+
"interface_declaration",
|
|
48
|
+
"type_alias_declaration",
|
|
49
|
+
"enum_declaration",
|
|
50
|
+
"struct_item",
|
|
51
|
+
"enum_item",
|
|
52
|
+
"trait_item",
|
|
53
|
+
"type_item",
|
|
54
|
+
"type_declaration",
|
|
55
|
+
"struct_specifier",
|
|
56
|
+
"class_specifier",
|
|
57
|
+
"enum_specifier",
|
|
58
|
+
"type_definition",
|
|
59
|
+
"struct_declaration",
|
|
60
|
+
"protocol_declaration",
|
|
61
|
+
"trait_definition",
|
|
62
|
+
"ContainerDecl",
|
|
63
|
+
]);
|
|
64
|
+
/** Node types that wire things together rather than implement them. */
|
|
65
|
+
static ORCHESTRATION_TYPES = new Set([
|
|
66
|
+
"export_statement",
|
|
67
|
+
"decorated_definition",
|
|
68
|
+
]);
|
|
69
|
+
/** The full header for one chunk. */
|
|
70
|
+
build(node, filePath, source, language) {
|
|
71
|
+
const lines = [
|
|
72
|
+
`[file: ${filePath}]`,
|
|
73
|
+
`[role: ${this.classifyRole(node)}]`,
|
|
74
|
+
];
|
|
75
|
+
const scope = this.extractScope(node, language);
|
|
76
|
+
if (scope.length > 0) {
|
|
77
|
+
lines.push(`[scope: ${scope.map((s) => `${s.kind} ${s.name}`).join(" > ")}]`);
|
|
78
|
+
}
|
|
79
|
+
const comment = this.extractLeadingComment(node, source);
|
|
80
|
+
if (comment)
|
|
81
|
+
lines.push(`[doc: ${comment}]`);
|
|
82
|
+
return lines.join("\n");
|
|
83
|
+
}
|
|
84
|
+
/** The minimal header for a file with no parsed structure. */
|
|
85
|
+
buildFileOnly(filePath) {
|
|
86
|
+
return `[file: ${filePath}]`;
|
|
87
|
+
}
|
|
88
|
+
/** Walk up from a node collecting the named scopes that enclose it. */
|
|
89
|
+
extractScope(node, language) {
|
|
90
|
+
const scopes = [];
|
|
91
|
+
let current = node.parent;
|
|
92
|
+
while (current) {
|
|
93
|
+
if (language.scopeTypes.includes(current.type)) {
|
|
94
|
+
const name = this.nodeName(current);
|
|
95
|
+
if (name) {
|
|
96
|
+
scopes.unshift({
|
|
97
|
+
kind: ChunkContextBuilder.SCOPE_KINDS[current.type] ?? current.type,
|
|
98
|
+
name,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
current = current.parent;
|
|
103
|
+
}
|
|
104
|
+
return scopes;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Collect the comment block or decorators immediately above a node.
|
|
108
|
+
*
|
|
109
|
+
* A blank line ends the block only once something has been collected, so a
|
|
110
|
+
* comment separated from its node by whitespace is still picked up, while
|
|
111
|
+
* unrelated code above it is not.
|
|
112
|
+
*/
|
|
113
|
+
extractLeadingComment(node, source) {
|
|
114
|
+
const lines = source.split("\n");
|
|
115
|
+
const start = node.startPosition.row;
|
|
116
|
+
const collected = [];
|
|
117
|
+
for (let i = start - 1; i >= 0 && i >= start - ChunkContextBuilder.MAX_COMMENT_LOOKBACK; i--) {
|
|
118
|
+
const line = lines[i].trim();
|
|
119
|
+
if (this.looksLikeCommentOrDecorator(line)) {
|
|
120
|
+
collected.unshift(lines[i]);
|
|
121
|
+
}
|
|
122
|
+
else if (line === "") {
|
|
123
|
+
if (collected.length > 0)
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return collected.length === 0 ? null : collected.join("\n").trim();
|
|
131
|
+
}
|
|
132
|
+
classifyRole(node) {
|
|
133
|
+
if (ChunkContextBuilder.DEFINITION_TYPES.has(node.type)) {
|
|
134
|
+
return "definition";
|
|
135
|
+
}
|
|
136
|
+
if (ChunkContextBuilder.ORCHESTRATION_TYPES.has(node.type)) {
|
|
137
|
+
return "orchestration";
|
|
138
|
+
}
|
|
139
|
+
return "implementation";
|
|
140
|
+
}
|
|
141
|
+
/** Comment syntax across every supported language, plus decorators. */
|
|
142
|
+
looksLikeCommentOrDecorator(line) {
|
|
143
|
+
return (line.startsWith("//") ||
|
|
144
|
+
line.startsWith("#") ||
|
|
145
|
+
line.startsWith("*") ||
|
|
146
|
+
line.startsWith("/*") ||
|
|
147
|
+
line.startsWith("*/") ||
|
|
148
|
+
line.startsWith("///") ||
|
|
149
|
+
line.startsWith("--") ||
|
|
150
|
+
line.startsWith("@") ||
|
|
151
|
+
line.startsWith('"""') ||
|
|
152
|
+
line.startsWith("'''"));
|
|
153
|
+
}
|
|
154
|
+
nodeName(node) {
|
|
155
|
+
return (node.childForFieldName("name") ??
|
|
156
|
+
node.children.find((c) => c.type === "identifier" || c.type === "type_identifier"))?.text;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=ChunkContextBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChunkContextBuilder.js","sourceRoot":"","sources":["../../../src/infrastructure/treesitter/ChunkContextBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type LanguageId = "javascript" | "typescript" | "tsx" | "python" | "rust" | "go" | "ruby" | "c" | "cpp" | "swift" | "json" | "yaml" | "toml" | "lua" | "scala" | "zig" | "bash" | "html" | "css" | "java" | "kotlin" | "php" | "c_sharp" | "vue" | "markdown" | "nix";
|
|
2
|
+
export interface LanguageConfig {
|
|
3
|
+
id: LanguageId;
|
|
4
|
+
extensions: string[];
|
|
5
|
+
wasmFile: string;
|
|
6
|
+
/** AST node types that represent top-level or nestable definitions */
|
|
7
|
+
chunkTypes: string[];
|
|
8
|
+
/** AST node types that represent import/require statements */
|
|
9
|
+
importTypes: string[];
|
|
10
|
+
/** AST node types that represent class/struct/module wrappers */
|
|
11
|
+
scopeTypes: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare const LANGUAGES: LanguageConfig[];
|
|
14
|
+
/**
|
|
15
|
+
* The grammar table and the lookups over it.
|
|
16
|
+
*
|
|
17
|
+
* Grammars ship as separate `@lumis-sh/wasm-<slug>` packages built for the
|
|
18
|
+
* current web-tree-sitter ABI, so resolution is a runtime `require.resolve`
|
|
19
|
+
* that may legitimately fail — a missing grammar means "chunk this file by
|
|
20
|
+
* sliding window", not an error.
|
|
21
|
+
*/
|
|
22
|
+
export declare class LanguageCatalog {
|
|
23
|
+
private readonly languages;
|
|
24
|
+
private readonly byExtension;
|
|
25
|
+
constructor(languages?: readonly LanguageConfig[]);
|
|
26
|
+
/** Grammar for a path's extension, or undefined when none is known. */
|
|
27
|
+
forFile(filePath: string): LanguageConfig | undefined;
|
|
28
|
+
/** Absolute path to a grammar's wasm, or undefined when not installed. */
|
|
29
|
+
wasmPathFor(lang: LanguageConfig): string | undefined;
|
|
30
|
+
}
|
|
@@ -141,30 +141,21 @@ export const LANGUAGES = [
|
|
|
141
141
|
"enum_specifier",
|
|
142
142
|
],
|
|
143
143
|
importTypes: ["preproc_include", "using_declaration"],
|
|
144
|
-
scopeTypes: [
|
|
145
|
-
"class_specifier",
|
|
146
|
-
"struct_specifier",
|
|
147
|
-
"namespace_definition",
|
|
148
|
-
],
|
|
144
|
+
scopeTypes: ["class_specifier", "struct_specifier", "namespace_definition"],
|
|
149
145
|
},
|
|
150
146
|
{
|
|
151
147
|
id: "swift",
|
|
152
148
|
extensions: [".swift"],
|
|
153
149
|
wasmFile: "tree-sitter-swift.wasm",
|
|
150
|
+
// Modern tree-sitter-swift represents struct/enum/extension/actor all as
|
|
151
|
+
// class_declaration (distinguished by keyword), so it covers them all.
|
|
154
152
|
chunkTypes: [
|
|
155
153
|
"function_declaration",
|
|
156
154
|
"class_declaration",
|
|
157
|
-
"struct_declaration",
|
|
158
|
-
"enum_declaration",
|
|
159
155
|
"protocol_declaration",
|
|
160
|
-
"extension_declaration",
|
|
161
156
|
],
|
|
162
157
|
importTypes: ["import_declaration"],
|
|
163
|
-
scopeTypes: [
|
|
164
|
-
"class_declaration",
|
|
165
|
-
"struct_declaration",
|
|
166
|
-
"extension_declaration",
|
|
167
|
-
],
|
|
158
|
+
scopeTypes: ["class_declaration"],
|
|
168
159
|
},
|
|
169
160
|
{
|
|
170
161
|
id: "json",
|
|
@@ -194,11 +185,8 @@ export const LANGUAGES = [
|
|
|
194
185
|
id: "lua",
|
|
195
186
|
extensions: [".lua"],
|
|
196
187
|
wasmFile: "tree-sitter-lua.wasm",
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
"local_function",
|
|
200
|
-
"function_definition",
|
|
201
|
-
],
|
|
188
|
+
// Modern tree-sitter-lua folds `local function` into function_declaration.
|
|
189
|
+
chunkTypes: ["function_declaration", "function_definition"],
|
|
202
190
|
importTypes: ["call"],
|
|
203
191
|
scopeTypes: [],
|
|
204
192
|
},
|
|
@@ -215,19 +203,19 @@ export const LANGUAGES = [
|
|
|
215
203
|
"trait_definition",
|
|
216
204
|
],
|
|
217
205
|
importTypes: ["import_declaration"],
|
|
218
|
-
scopeTypes: [
|
|
219
|
-
"class_definition",
|
|
220
|
-
"object_definition",
|
|
221
|
-
"trait_definition",
|
|
222
|
-
],
|
|
206
|
+
scopeTypes: ["class_definition", "object_definition", "trait_definition"],
|
|
223
207
|
},
|
|
224
208
|
{
|
|
225
209
|
id: "zig",
|
|
226
210
|
extensions: [".zig"],
|
|
227
211
|
wasmFile: "tree-sitter-zig.wasm",
|
|
228
|
-
chunkTypes: [
|
|
212
|
+
chunkTypes: [
|
|
213
|
+
"function_declaration",
|
|
214
|
+
"variable_declaration",
|
|
215
|
+
"test_declaration",
|
|
216
|
+
],
|
|
229
217
|
importTypes: [],
|
|
230
|
-
scopeTypes: ["
|
|
218
|
+
scopeTypes: ["struct_declaration", "enum_declaration", "union_declaration"],
|
|
231
219
|
},
|
|
232
220
|
{
|
|
233
221
|
id: "bash",
|
|
@@ -303,7 +291,7 @@ export const LANGUAGES = [
|
|
|
303
291
|
{
|
|
304
292
|
id: "c_sharp",
|
|
305
293
|
extensions: [".cs"],
|
|
306
|
-
wasmFile: "tree-sitter-
|
|
294
|
+
wasmFile: "tree-sitter-csharp.wasm",
|
|
307
295
|
chunkTypes: [
|
|
308
296
|
"class_declaration",
|
|
309
297
|
"interface_declaration",
|
|
@@ -330,23 +318,59 @@ export const LANGUAGES = [
|
|
|
330
318
|
importTypes: [],
|
|
331
319
|
scopeTypes: [],
|
|
332
320
|
},
|
|
321
|
+
{
|
|
322
|
+
id: "markdown",
|
|
323
|
+
extensions: [".md", ".markdown", ".mdx"],
|
|
324
|
+
wasmFile: "tree-sitter-markdown.wasm",
|
|
325
|
+
// Markdown is chunked by a heading-aware splitter (see chunker), not by
|
|
326
|
+
// collectChunks — its `section` nodes nest, so emitting them whole would
|
|
327
|
+
// collapse a doc into one chunk. chunkTypes/scopeTypes are unused here.
|
|
328
|
+
chunkTypes: ["section"],
|
|
329
|
+
importTypes: [],
|
|
330
|
+
scopeTypes: ["section"],
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
id: "nix",
|
|
334
|
+
extensions: [".nix"],
|
|
335
|
+
wasmFile: "tree-sitter-nix.wasm",
|
|
336
|
+
chunkTypes: ["binding"],
|
|
337
|
+
importTypes: [],
|
|
338
|
+
scopeTypes: ["attrset_expression", "binding_set"],
|
|
339
|
+
},
|
|
333
340
|
];
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
341
|
+
/**
|
|
342
|
+
* The grammar table and the lookups over it.
|
|
343
|
+
*
|
|
344
|
+
* Grammars ship as separate `@lumis-sh/wasm-<slug>` packages built for the
|
|
345
|
+
* current web-tree-sitter ABI, so resolution is a runtime `require.resolve`
|
|
346
|
+
* that may legitimately fail — a missing grammar means "chunk this file by
|
|
347
|
+
* sliding window", not an error.
|
|
348
|
+
*/
|
|
349
|
+
export class LanguageCatalog {
|
|
350
|
+
languages;
|
|
351
|
+
byExtension = new Map();
|
|
352
|
+
constructor(languages = LANGUAGES) {
|
|
353
|
+
this.languages = languages;
|
|
354
|
+
for (const lang of this.languages) {
|
|
355
|
+
for (const ext of lang.extensions)
|
|
356
|
+
this.byExtension.set(ext, lang);
|
|
357
|
+
}
|
|
338
358
|
}
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
return extToLang.get(ext);
|
|
343
|
-
}
|
|
344
|
-
export function getWasmPath(lang) {
|
|
345
|
-
try {
|
|
346
|
-
return require.resolve(`tree-sitter-wasms/out/${lang.wasmFile}`);
|
|
359
|
+
/** Grammar for a path's extension, or undefined when none is known. */
|
|
360
|
+
forFile(filePath) {
|
|
361
|
+
return this.byExtension.get(filePath.slice(filePath.lastIndexOf(".")));
|
|
347
362
|
}
|
|
348
|
-
|
|
349
|
-
|
|
363
|
+
/** Absolute path to a grammar's wasm, or undefined when not installed. */
|
|
364
|
+
wasmPathFor(lang) {
|
|
365
|
+
const slug = lang.wasmFile
|
|
366
|
+
.replace(/^tree-sitter-/, "")
|
|
367
|
+
.replace(/\.wasm$/, "");
|
|
368
|
+
try {
|
|
369
|
+
return require.resolve(`@lumis-sh/wasm-${slug}/${lang.wasmFile}`);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
350
374
|
}
|
|
351
375
|
}
|
|
352
|
-
//# sourceMappingURL=
|
|
376
|
+
//# sourceMappingURL=LanguageCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageCatalog.js","sourceRoot":"","sources":["../../../src/infrastructure/treesitter/LanguageCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Chunk } from "../../domain/corpus/Chunk.js";
|
|
2
|
+
import type { ChunkerPort } from "../../domain/ports/ChunkerPort.js";
|
|
3
|
+
/**
|
|
4
|
+
* Fixed-size windows over a file, for sources with no grammar or no chunkable
|
|
5
|
+
* structure (a linear shell script, say).
|
|
6
|
+
*
|
|
7
|
+
* Windows overlap slightly so a passage straddling a boundary is still
|
|
8
|
+
* retrievable. The overlap is kept small because search deduplicates
|
|
9
|
+
* overlapping hits anyway, making a larger one pure index bloat.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SlidingWindowChunker implements ChunkerPort {
|
|
12
|
+
private static readonly WINDOW_LINES;
|
|
13
|
+
private static readonly STRIDE_LINES;
|
|
14
|
+
chunk(filePath: string, cwd: string): Promise<Chunk[]>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Chunk } from "../../domain/corpus/Chunk.js";
|
|
4
|
+
import { CodeLocation } from "../../domain/corpus/CodeLocation.js";
|
|
5
|
+
import { ContentHash } from "../../domain/corpus/ContentHash.js";
|
|
6
|
+
/**
|
|
7
|
+
* Fixed-size windows over a file, for sources with no grammar or no chunkable
|
|
8
|
+
* structure (a linear shell script, say).
|
|
9
|
+
*
|
|
10
|
+
* Windows overlap slightly so a passage straddling a boundary is still
|
|
11
|
+
* retrievable. The overlap is kept small because search deduplicates
|
|
12
|
+
* overlapping hits anyway, making a larger one pure index bloat.
|
|
13
|
+
*/
|
|
14
|
+
export class SlidingWindowChunker {
|
|
15
|
+
static WINDOW_LINES = 50;
|
|
16
|
+
static STRIDE_LINES = 40;
|
|
17
|
+
async chunk(filePath, cwd) {
|
|
18
|
+
const source = readFileSync(join(cwd, filePath), "utf-8");
|
|
19
|
+
const lines = source.split("\n");
|
|
20
|
+
if (lines.length === 0)
|
|
21
|
+
return [];
|
|
22
|
+
const chunks = [];
|
|
23
|
+
for (let i = 0; i < lines.length; i += SlidingWindowChunker.STRIDE_LINES) {
|
|
24
|
+
const content = lines
|
|
25
|
+
.slice(i, i + SlidingWindowChunker.WINDOW_LINES)
|
|
26
|
+
.join("\n");
|
|
27
|
+
if (content.trim().length === 0)
|
|
28
|
+
continue;
|
|
29
|
+
const endLine = Math.min(i + SlidingWindowChunker.WINDOW_LINES, lines.length);
|
|
30
|
+
chunks.push(new Chunk({
|
|
31
|
+
location: new CodeLocation(filePath, i + 1, endLine),
|
|
32
|
+
type: "block",
|
|
33
|
+
name: `lines_${i + 1}_${endLine}`,
|
|
34
|
+
content,
|
|
35
|
+
context: `[file: ${filePath}]`,
|
|
36
|
+
hash: ContentHash.of(content),
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
return chunks;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=SlidingWindowChunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlidingWindowChunker.js","sourceRoot":"","sources":["../../../src/infrastructure/treesitter/SlidingWindowChunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAGjE;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACxB,MAAM,CAAU,YAAY,GAAG,EAAE,CAAC;IAClC,MAAM,CAAU,YAAY,GAAG,EAAE,CAAC;IAE1C,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,GAAW;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,oBAAoB,CAAC,YAAY,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAG,KAAK;iBACnB,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC;iBAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,GAAG,oBAAoB,CAAC,YAAY,EACrC,KAAK,CAAC,MAAM,CACZ,CAAC;YACF,MAAM,CAAC,IAAI,CACV,IAAI,KAAK,CAAC;gBACT,QAAQ,EAAE,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;gBACpD,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE;gBACjC,OAAO;gBACP,OAAO,EAAE,UAAU,QAAQ,GAAG;gBAC9B,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC;aAC7B,CAAC,CACF,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Chunk } from "../../domain/corpus/Chunk.js";
|
|
2
|
+
import type { ChunkerPort } from "../../domain/ports/ChunkerPort.js";
|
|
3
|
+
import { ChunkContextBuilder } from "./ChunkContextBuilder.js";
|
|
4
|
+
import { LanguageCatalog } from "./LanguageCatalog.js";
|
|
5
|
+
import { SlidingWindowChunker } from "./SlidingWindowChunker.js";
|
|
6
|
+
/**
|
|
7
|
+
* Splits source into chunks along AST boundaries.
|
|
8
|
+
*
|
|
9
|
+
* Node-bounded chunks are what make results readable: a hit is a whole
|
|
10
|
+
* function or class, not an arbitrary window through the middle of one. Files
|
|
11
|
+
* with no grammar, or no chunkable structure, fall back to a sliding window.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TreeSitterChunker implements ChunkerPort {
|
|
14
|
+
private readonly catalog;
|
|
15
|
+
private readonly context;
|
|
16
|
+
private readonly fallback;
|
|
17
|
+
/** Chunks larger than this are split by recursing into their children. */
|
|
18
|
+
private static readonly MAX_CHUNK_TOKENS;
|
|
19
|
+
/** A one-line fragment shorter than this is noise, not a unit of code. */
|
|
20
|
+
private static readonly MIN_CHUNK_CHARS;
|
|
21
|
+
private parser;
|
|
22
|
+
private readonly loaded;
|
|
23
|
+
constructor(catalog?: LanguageCatalog, context?: ChunkContextBuilder, fallback?: SlidingWindowChunker);
|
|
24
|
+
chunk(filePath: string, cwd: string): Promise<Chunk[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Markdown needs its own pass: the block grammar nests `section` nodes by
|
|
27
|
+
* heading level, so emitting them whole would collapse a document into one
|
|
28
|
+
* chunk. Splitting at every heading the grammar reports (so a `#` inside a
|
|
29
|
+
* fenced code block is not mistaken for one) gives complete,
|
|
30
|
+
* non-overlapping, heading-granular chunks instead.
|
|
31
|
+
*/
|
|
32
|
+
private chunkMarkdown;
|
|
33
|
+
private collect;
|
|
34
|
+
private hasChunkableDescendants;
|
|
35
|
+
private nodeName;
|
|
36
|
+
private getParser;
|
|
37
|
+
/**
|
|
38
|
+
* Grammars are cached for the process lifetime. They are wasm modules whose
|
|
39
|
+
* linear memory only ever grows, so loading one repeatedly would leak.
|
|
40
|
+
*/
|
|
41
|
+
private loadGrammar;
|
|
42
|
+
}
|