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,16 @@
|
|
|
1
|
+
import type { DuplexSocket } from "./SecureChannel.js";
|
|
2
|
+
/**
|
|
3
|
+
* Peer discovery over Hyperswarm.
|
|
4
|
+
*
|
|
5
|
+
* Imported lazily and treated as optional: sharing is a side feature, and its
|
|
6
|
+
* native dependency should not be required to run a search.
|
|
7
|
+
*/
|
|
8
|
+
export declare class PeerSwarm {
|
|
9
|
+
private readonly swarm;
|
|
10
|
+
private constructor();
|
|
11
|
+
static create(): Promise<PeerSwarm>;
|
|
12
|
+
onConnection(handler: (socket: DuplexSocket) => void): void;
|
|
13
|
+
/** Announce as a server (sharer) or dial as a client (receiver). */
|
|
14
|
+
join(topic: Buffer, role: "server" | "client"): Promise<void>;
|
|
15
|
+
destroy(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Peer discovery over Hyperswarm.
|
|
3
|
+
*
|
|
4
|
+
* Imported lazily and treated as optional: sharing is a side feature, and its
|
|
5
|
+
* native dependency should not be required to run a search.
|
|
6
|
+
*/
|
|
7
|
+
export class PeerSwarm {
|
|
8
|
+
swarm;
|
|
9
|
+
constructor(swarm) {
|
|
10
|
+
this.swarm = swarm;
|
|
11
|
+
}
|
|
12
|
+
static async create() {
|
|
13
|
+
let module;
|
|
14
|
+
try {
|
|
15
|
+
// @ts-expect-error -- no type declarations for hyperswarm
|
|
16
|
+
module = await import("hyperswarm");
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error("hyperswarm is not installed. Run: pnpm add hyperswarm");
|
|
20
|
+
}
|
|
21
|
+
const Constructor = (module.default ??
|
|
22
|
+
module);
|
|
23
|
+
return new PeerSwarm(new Constructor());
|
|
24
|
+
}
|
|
25
|
+
onConnection(handler) {
|
|
26
|
+
this.swarm.on("connection", handler);
|
|
27
|
+
}
|
|
28
|
+
/** Announce as a server (sharer) or dial as a client (receiver). */
|
|
29
|
+
async join(topic, role) {
|
|
30
|
+
await this.swarm
|
|
31
|
+
.join(topic, {
|
|
32
|
+
server: role === "server",
|
|
33
|
+
client: role === "client",
|
|
34
|
+
})
|
|
35
|
+
.flushed();
|
|
36
|
+
}
|
|
37
|
+
async destroy() {
|
|
38
|
+
await this.swarm.destroy().catch(() => { });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=PeerSwarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeerSwarm.js","sourceRoot":"","sources":["../../../src/infrastructure/p2p/PeerSwarm.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACgB;IAArC,YAAqC,KAAyB;QAAzB,UAAK,GAAL,KAAK,CAAoB;IAAG,CAAC;IAElE,MAAM,CAAC,KAAK,CAAC,MAAM;QAClB,IAAI,MAAkD,CAAC;QACvD,IAAI,CAAC;YACJ,0DAA0D;YAC1D,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,OAAO;YAClC,MAAM,CAAiC,CAAC;QACzC,OAAO,IAAI,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,YAAY,CAAC,OAAuC;QACnD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,IAAyB;QAClD,MAAM,IAAI,CAAC,KAAK;aACd,IAAI,CAAC,KAAK,EAAE;YACZ,MAAM,EAAE,IAAI,KAAK,QAAQ;YACzB,MAAM,EAAE,IAAI,KAAK,QAAQ;SACzB,CAAC;aACD,OAAO,EAAE,CAAC;IACb,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;CACD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Messages exchanged during a share. */
|
|
2
|
+
export type ShareMessage = {
|
|
3
|
+
type: "meta";
|
|
4
|
+
model?: string;
|
|
5
|
+
dimensions?: number;
|
|
6
|
+
chunkCount: number;
|
|
7
|
+
branch: string;
|
|
8
|
+
remote?: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: "ready";
|
|
11
|
+
} | {
|
|
12
|
+
type: "chunks";
|
|
13
|
+
batch: Record<string, unknown>[];
|
|
14
|
+
} | {
|
|
15
|
+
type: "files";
|
|
16
|
+
batch: Array<{
|
|
17
|
+
filePath: string;
|
|
18
|
+
fileHash: string;
|
|
19
|
+
branch: string;
|
|
20
|
+
}>;
|
|
21
|
+
} | {
|
|
22
|
+
type: "done";
|
|
23
|
+
} | {
|
|
24
|
+
type: "ack";
|
|
25
|
+
};
|
|
26
|
+
/** The transport a share runs over. */
|
|
27
|
+
export interface DuplexSocket {
|
|
28
|
+
write(data: Buffer): boolean;
|
|
29
|
+
on(event: "data", cb: (chunk: Buffer) => void): void;
|
|
30
|
+
on(event: "end" | "close" | "error", cb: (err?: Error) => void): void;
|
|
31
|
+
end(): void;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Authenticated encryption and message framing over a raw peer socket.
|
|
36
|
+
*
|
|
37
|
+
* AES-256-GCM, so a tampered payload fails to decrypt rather than being parsed
|
|
38
|
+
* — a peer discovered over a public DHT is not trusted. Frames carry an
|
|
39
|
+
* explicit length prefix because a stream socket splits and merges writes
|
|
40
|
+
* arbitrarily, and JSON alone gives no way to find a message boundary.
|
|
41
|
+
*/
|
|
42
|
+
export declare class SecureChannel {
|
|
43
|
+
private readonly key;
|
|
44
|
+
private static readonly IV_BYTES;
|
|
45
|
+
private static readonly TAG_BYTES;
|
|
46
|
+
private static readonly LENGTH_PREFIX_BYTES;
|
|
47
|
+
constructor(key: Buffer);
|
|
48
|
+
send(socket: {
|
|
49
|
+
write(data: Buffer): boolean;
|
|
50
|
+
}, message: ShareMessage): void;
|
|
51
|
+
/**
|
|
52
|
+
* A stateful reader: feed it raw socket chunks, and it emits whole
|
|
53
|
+
* messages as their frames complete.
|
|
54
|
+
*/
|
|
55
|
+
reader(onMessage: (message: ShareMessage) => void): (chunk: Buffer) => void;
|
|
56
|
+
/** Resolve once a message of the expected type arrives. */
|
|
57
|
+
await(socket: DuplexSocket, expected: ShareMessage["type"]): Promise<ShareMessage>;
|
|
58
|
+
private encrypt;
|
|
59
|
+
private decrypt;
|
|
60
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Authenticated encryption and message framing over a raw peer socket.
|
|
4
|
+
*
|
|
5
|
+
* AES-256-GCM, so a tampered payload fails to decrypt rather than being parsed
|
|
6
|
+
* — a peer discovered over a public DHT is not trusted. Frames carry an
|
|
7
|
+
* explicit length prefix because a stream socket splits and merges writes
|
|
8
|
+
* arbitrarily, and JSON alone gives no way to find a message boundary.
|
|
9
|
+
*/
|
|
10
|
+
export class SecureChannel {
|
|
11
|
+
key;
|
|
12
|
+
static IV_BYTES = 12;
|
|
13
|
+
static TAG_BYTES = 16;
|
|
14
|
+
static LENGTH_PREFIX_BYTES = 4;
|
|
15
|
+
constructor(key) {
|
|
16
|
+
this.key = key;
|
|
17
|
+
}
|
|
18
|
+
send(socket, message) {
|
|
19
|
+
const encrypted = this.encrypt(Buffer.from(JSON.stringify(message)));
|
|
20
|
+
const frame = Buffer.alloc(SecureChannel.LENGTH_PREFIX_BYTES + encrypted.length);
|
|
21
|
+
frame.writeUInt32BE(encrypted.length, 0);
|
|
22
|
+
encrypted.copy(frame, SecureChannel.LENGTH_PREFIX_BYTES);
|
|
23
|
+
socket.write(frame);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A stateful reader: feed it raw socket chunks, and it emits whole
|
|
27
|
+
* messages as their frames complete.
|
|
28
|
+
*/
|
|
29
|
+
reader(onMessage) {
|
|
30
|
+
let buffered = Buffer.alloc(0);
|
|
31
|
+
return (chunk) => {
|
|
32
|
+
buffered = Buffer.concat([buffered, chunk]);
|
|
33
|
+
while (buffered.length >= SecureChannel.LENGTH_PREFIX_BYTES) {
|
|
34
|
+
const length = buffered.readUInt32BE(0);
|
|
35
|
+
if (buffered.length < SecureChannel.LENGTH_PREFIX_BYTES + length) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
const frame = buffered.subarray(SecureChannel.LENGTH_PREFIX_BYTES, SecureChannel.LENGTH_PREFIX_BYTES + length);
|
|
39
|
+
buffered = buffered.subarray(SecureChannel.LENGTH_PREFIX_BYTES + length);
|
|
40
|
+
onMessage(JSON.parse(this.decrypt(frame).toString()));
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Resolve once a message of the expected type arrives. */
|
|
45
|
+
await(socket, expected) {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const read = this.reader((message) => {
|
|
48
|
+
if (message.type === expected)
|
|
49
|
+
resolve(message);
|
|
50
|
+
});
|
|
51
|
+
socket.on("data", read);
|
|
52
|
+
socket.on("error", reject);
|
|
53
|
+
socket.on("close", () => reject(new Error("Connection closed")));
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
encrypt(plaintext) {
|
|
57
|
+
const iv = randomBytes(SecureChannel.IV_BYTES);
|
|
58
|
+
const cipher = createCipheriv("aes-256-gcm", this.key, iv);
|
|
59
|
+
const body = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
60
|
+
return Buffer.concat([iv, cipher.getAuthTag(), body]);
|
|
61
|
+
}
|
|
62
|
+
decrypt(data) {
|
|
63
|
+
const iv = data.subarray(0, SecureChannel.IV_BYTES);
|
|
64
|
+
const tag = data.subarray(SecureChannel.IV_BYTES, SecureChannel.IV_BYTES + SecureChannel.TAG_BYTES);
|
|
65
|
+
const body = data.subarray(SecureChannel.IV_BYTES + SecureChannel.TAG_BYTES);
|
|
66
|
+
const decipher = createDecipheriv("aes-256-gcm", this.key, iv);
|
|
67
|
+
decipher.setAuthTag(tag);
|
|
68
|
+
return Buffer.concat([decipher.update(body), decipher.final()]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=SecureChannel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecureChannel.js","sourceRoot":"","sources":["../../../src/infrastructure/p2p/SecureChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA8B5E;;;;;;;GAOG;AACH,MAAM,OAAO,aAAa;IAKI;IAJrB,MAAM,CAAU,QAAQ,GAAG,EAAE,CAAC;IAC9B,MAAM,CAAU,SAAS,GAAG,EAAE,CAAC;IAC/B,MAAM,CAAU,mBAAmB,GAAG,CAAC,CAAC;IAEhD,YAA6B,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAE5C,IAAI,CAAC,MAAwC,EAAE,OAAqB;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CACzB,aAAa,CAAC,mBAAmB,GAAG,SAAS,CAAC,MAAM,CACpD,CAAC;QACF,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,SAA0C;QAChD,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAa,EAAE,EAAE;YACxB,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5C,OAAO,QAAQ,CAAC,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,CAAC;gBAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC,mBAAmB,GAAG,MAAM,EAAE,CAAC;oBAClE,MAAM;gBACP,CAAC;gBACD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAC9B,aAAa,CAAC,mBAAmB,EACjC,aAAa,CAAC,mBAAmB,GAAG,MAAM,CAC1C,CAAC;gBACF,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAC3B,aAAa,CAAC,mBAAmB,GAAG,MAAM,CAC1C,CAAC;gBACF,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACF,CAAC,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,KAAK,CACJ,MAAoB,EACpB,QAA8B;QAE9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;gBACpC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,OAAO,CAAC,SAAiB;QAChC,MAAM,EAAE,GAAG,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,OAAO,CAAC,IAAY;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CACxB,aAAa,CAAC,QAAQ,EACtB,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,SAAS,CAChD,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CACzB,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,SAAS,CAChD,CAAC;QACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/D,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A human-transcribable one-time code that both names a rendezvous topic and
|
|
3
|
+
* derives the encryption key for a share.
|
|
4
|
+
*
|
|
5
|
+
* Three words plus hex: short enough to read aloud, with 40 bits of entropy in
|
|
6
|
+
* the suffix so a code cannot be guessed within its lifetime.
|
|
7
|
+
*
|
|
8
|
+
* Topic and key are derived from the code by *separate* HKDF labels. That
|
|
9
|
+
* separation is the point — peer discovery necessarily publishes the topic, and
|
|
10
|
+
* it must not leak anything about the key protecting the payload.
|
|
11
|
+
*/
|
|
12
|
+
export declare class ShareCode {
|
|
13
|
+
readonly value: string;
|
|
14
|
+
private static readonly WORDS;
|
|
15
|
+
static readonly PATTERN: RegExp;
|
|
16
|
+
private constructor();
|
|
17
|
+
static generate(): ShareCode;
|
|
18
|
+
static parse(value: string): ShareCode | undefined;
|
|
19
|
+
static looksLikeCode(value: string): boolean;
|
|
20
|
+
toString(): string;
|
|
21
|
+
/** Rendezvous topic for peer discovery. Public by nature. */
|
|
22
|
+
toTopic(): Buffer;
|
|
23
|
+
/** AES-256 key for the payload. Never derivable from the topic. */
|
|
24
|
+
toEncryptionKey(): Buffer;
|
|
25
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { hkdfSync, randomBytes } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* A human-transcribable one-time code that both names a rendezvous topic and
|
|
4
|
+
* derives the encryption key for a share.
|
|
5
|
+
*
|
|
6
|
+
* Three words plus hex: short enough to read aloud, with 40 bits of entropy in
|
|
7
|
+
* the suffix so a code cannot be guessed within its lifetime.
|
|
8
|
+
*
|
|
9
|
+
* Topic and key are derived from the code by *separate* HKDF labels. That
|
|
10
|
+
* separation is the point — peer discovery necessarily publishes the topic, and
|
|
11
|
+
* it must not leak anything about the key protecting the payload.
|
|
12
|
+
*/
|
|
13
|
+
export class ShareCode {
|
|
14
|
+
value;
|
|
15
|
+
static WORDS = [
|
|
16
|
+
"acid",
|
|
17
|
+
"acme",
|
|
18
|
+
"aged",
|
|
19
|
+
"also",
|
|
20
|
+
"arch",
|
|
21
|
+
"area",
|
|
22
|
+
"army",
|
|
23
|
+
"away",
|
|
24
|
+
"back",
|
|
25
|
+
"bail",
|
|
26
|
+
"bake",
|
|
27
|
+
"band",
|
|
28
|
+
"bank",
|
|
29
|
+
"barn",
|
|
30
|
+
"base",
|
|
31
|
+
"bath",
|
|
32
|
+
"beam",
|
|
33
|
+
"bean",
|
|
34
|
+
"bear",
|
|
35
|
+
"beat",
|
|
36
|
+
"beef",
|
|
37
|
+
"beer",
|
|
38
|
+
"bell",
|
|
39
|
+
"belt",
|
|
40
|
+
"bend",
|
|
41
|
+
"bike",
|
|
42
|
+
"bird",
|
|
43
|
+
"bite",
|
|
44
|
+
"blow",
|
|
45
|
+
"blue",
|
|
46
|
+
"boat",
|
|
47
|
+
"body",
|
|
48
|
+
"bolt",
|
|
49
|
+
"bomb",
|
|
50
|
+
"bond",
|
|
51
|
+
"bone",
|
|
52
|
+
"book",
|
|
53
|
+
"boot",
|
|
54
|
+
"born",
|
|
55
|
+
"boss",
|
|
56
|
+
"bowl",
|
|
57
|
+
"bulk",
|
|
58
|
+
"bull",
|
|
59
|
+
"burn",
|
|
60
|
+
"cage",
|
|
61
|
+
"cake",
|
|
62
|
+
"calm",
|
|
63
|
+
"came",
|
|
64
|
+
"camp",
|
|
65
|
+
"cape",
|
|
66
|
+
"card",
|
|
67
|
+
"care",
|
|
68
|
+
"cart",
|
|
69
|
+
"case",
|
|
70
|
+
"cash",
|
|
71
|
+
"cast",
|
|
72
|
+
"cave",
|
|
73
|
+
"chef",
|
|
74
|
+
"chip",
|
|
75
|
+
"city",
|
|
76
|
+
"clan",
|
|
77
|
+
"clay",
|
|
78
|
+
"clip",
|
|
79
|
+
"club",
|
|
80
|
+
"clue",
|
|
81
|
+
"coal",
|
|
82
|
+
"coat",
|
|
83
|
+
"code",
|
|
84
|
+
"coil",
|
|
85
|
+
"coin",
|
|
86
|
+
"cold",
|
|
87
|
+
"come",
|
|
88
|
+
"cook",
|
|
89
|
+
"cool",
|
|
90
|
+
"cope",
|
|
91
|
+
"copy",
|
|
92
|
+
"cord",
|
|
93
|
+
"core",
|
|
94
|
+
"corn",
|
|
95
|
+
"cost",
|
|
96
|
+
"crew",
|
|
97
|
+
"crop",
|
|
98
|
+
"crow",
|
|
99
|
+
"cure",
|
|
100
|
+
"curl",
|
|
101
|
+
"cute",
|
|
102
|
+
"dame",
|
|
103
|
+
"damp",
|
|
104
|
+
"dare",
|
|
105
|
+
"dark",
|
|
106
|
+
"dash",
|
|
107
|
+
"data",
|
|
108
|
+
"dawn",
|
|
109
|
+
"deal",
|
|
110
|
+
"dean",
|
|
111
|
+
"deck",
|
|
112
|
+
"deep",
|
|
113
|
+
"deer",
|
|
114
|
+
"demo",
|
|
115
|
+
"desk",
|
|
116
|
+
"dial",
|
|
117
|
+
"dice",
|
|
118
|
+
"diet",
|
|
119
|
+
"dirt",
|
|
120
|
+
"disk",
|
|
121
|
+
"dock",
|
|
122
|
+
"door",
|
|
123
|
+
"dose",
|
|
124
|
+
"down",
|
|
125
|
+
"draw",
|
|
126
|
+
"drop",
|
|
127
|
+
"drum",
|
|
128
|
+
"dual",
|
|
129
|
+
"duck",
|
|
130
|
+
"dull",
|
|
131
|
+
"dump",
|
|
132
|
+
"dune",
|
|
133
|
+
"dust",
|
|
134
|
+
"duty",
|
|
135
|
+
"each",
|
|
136
|
+
"earl",
|
|
137
|
+
"earn",
|
|
138
|
+
"ease",
|
|
139
|
+
"east",
|
|
140
|
+
"edge",
|
|
141
|
+
"else",
|
|
142
|
+
"epic",
|
|
143
|
+
"even",
|
|
144
|
+
"ever",
|
|
145
|
+
"exam",
|
|
146
|
+
"exit",
|
|
147
|
+
"face",
|
|
148
|
+
"fact",
|
|
149
|
+
"fade",
|
|
150
|
+
"fail",
|
|
151
|
+
"fair",
|
|
152
|
+
"fall",
|
|
153
|
+
"fame",
|
|
154
|
+
"farm",
|
|
155
|
+
"fast",
|
|
156
|
+
"fate",
|
|
157
|
+
"fawn",
|
|
158
|
+
"feed",
|
|
159
|
+
"feel",
|
|
160
|
+
"file",
|
|
161
|
+
"film",
|
|
162
|
+
"find",
|
|
163
|
+
"fine",
|
|
164
|
+
"fire",
|
|
165
|
+
"firm",
|
|
166
|
+
"fish",
|
|
167
|
+
"flag",
|
|
168
|
+
"flat",
|
|
169
|
+
"fled",
|
|
170
|
+
"flip",
|
|
171
|
+
"flow",
|
|
172
|
+
"foam",
|
|
173
|
+
"fold",
|
|
174
|
+
"folk",
|
|
175
|
+
"fond",
|
|
176
|
+
"food",
|
|
177
|
+
"fool",
|
|
178
|
+
"fork",
|
|
179
|
+
"form",
|
|
180
|
+
"fort",
|
|
181
|
+
"foul",
|
|
182
|
+
"four",
|
|
183
|
+
"free",
|
|
184
|
+
"frog",
|
|
185
|
+
"fuel",
|
|
186
|
+
"full",
|
|
187
|
+
"fund",
|
|
188
|
+
"fury",
|
|
189
|
+
"fuse",
|
|
190
|
+
"gain",
|
|
191
|
+
"gale",
|
|
192
|
+
"game",
|
|
193
|
+
"gang",
|
|
194
|
+
"gate",
|
|
195
|
+
"gave",
|
|
196
|
+
"gaze",
|
|
197
|
+
"gear",
|
|
198
|
+
"gene",
|
|
199
|
+
"gift",
|
|
200
|
+
"glad",
|
|
201
|
+
"glow",
|
|
202
|
+
"glue",
|
|
203
|
+
"goat",
|
|
204
|
+
"gold",
|
|
205
|
+
"golf",
|
|
206
|
+
"gone",
|
|
207
|
+
"good",
|
|
208
|
+
"grab",
|
|
209
|
+
"gray",
|
|
210
|
+
"grid",
|
|
211
|
+
"grip",
|
|
212
|
+
"grow",
|
|
213
|
+
"gulf",
|
|
214
|
+
"guru",
|
|
215
|
+
"gust",
|
|
216
|
+
"hack",
|
|
217
|
+
"half",
|
|
218
|
+
"hall",
|
|
219
|
+
"halt",
|
|
220
|
+
"hand",
|
|
221
|
+
"hang",
|
|
222
|
+
"hare",
|
|
223
|
+
"harm",
|
|
224
|
+
"harp",
|
|
225
|
+
"hash",
|
|
226
|
+
"hate",
|
|
227
|
+
"haul",
|
|
228
|
+
"have",
|
|
229
|
+
"hawk",
|
|
230
|
+
"haze",
|
|
231
|
+
"head",
|
|
232
|
+
"heap",
|
|
233
|
+
"heat",
|
|
234
|
+
"held",
|
|
235
|
+
"helm",
|
|
236
|
+
"help",
|
|
237
|
+
"herb",
|
|
238
|
+
"herd",
|
|
239
|
+
"here",
|
|
240
|
+
"hero",
|
|
241
|
+
"hide",
|
|
242
|
+
"high",
|
|
243
|
+
"hike",
|
|
244
|
+
"hill",
|
|
245
|
+
"hilt",
|
|
246
|
+
"hint",
|
|
247
|
+
"hire",
|
|
248
|
+
"hold",
|
|
249
|
+
"hole",
|
|
250
|
+
"holy",
|
|
251
|
+
"home",
|
|
252
|
+
"hood",
|
|
253
|
+
"hook",
|
|
254
|
+
"hope",
|
|
255
|
+
"horn",
|
|
256
|
+
"host",
|
|
257
|
+
"hour",
|
|
258
|
+
"huge",
|
|
259
|
+
"hull",
|
|
260
|
+
"hung",
|
|
261
|
+
"hunt",
|
|
262
|
+
"hurt",
|
|
263
|
+
"icon",
|
|
264
|
+
"idea",
|
|
265
|
+
"inch",
|
|
266
|
+
"info",
|
|
267
|
+
"iron",
|
|
268
|
+
"isle",
|
|
269
|
+
"item",
|
|
270
|
+
"jack",
|
|
271
|
+
"jade",
|
|
272
|
+
];
|
|
273
|
+
static PATTERN = /^lmgrep[a-z]+[0-9a-f]{10}$/;
|
|
274
|
+
constructor(value) {
|
|
275
|
+
this.value = value;
|
|
276
|
+
}
|
|
277
|
+
static generate() {
|
|
278
|
+
const bytes = randomBytes(16);
|
|
279
|
+
const words = [
|
|
280
|
+
ShareCode.WORDS[bytes[0]],
|
|
281
|
+
ShareCode.WORDS[bytes[1]],
|
|
282
|
+
ShareCode.WORDS[bytes[2]],
|
|
283
|
+
].join("");
|
|
284
|
+
return new ShareCode(`lmgrep${words}${bytes.subarray(3, 8).toString("hex")}`);
|
|
285
|
+
}
|
|
286
|
+
static parse(value) {
|
|
287
|
+
return ShareCode.looksLikeCode(value) ? new ShareCode(value) : undefined;
|
|
288
|
+
}
|
|
289
|
+
static looksLikeCode(value) {
|
|
290
|
+
return ShareCode.PATTERN.test(value);
|
|
291
|
+
}
|
|
292
|
+
toString() {
|
|
293
|
+
return this.value;
|
|
294
|
+
}
|
|
295
|
+
/** Rendezvous topic for peer discovery. Public by nature. */
|
|
296
|
+
toTopic() {
|
|
297
|
+
return Buffer.from(hkdfSync("sha256", this.value, "lmgrep-topic", "topic", 32));
|
|
298
|
+
}
|
|
299
|
+
/** AES-256 key for the payload. Never derivable from the topic. */
|
|
300
|
+
toEncryptionKey() {
|
|
301
|
+
return Buffer.from(hkdfSync("sha256", this.value, "lmgrep-key", "encryption", 32));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=ShareCode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShareCode.js","sourceRoot":"","sources":["../../../src/infrastructure/p2p/ShareCode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,SAAS;IAsQQ;IArQrB,MAAM,CAAU,KAAK,GAAG;QAC/B,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;KACN,CAAC;IAEF,MAAM,CAAU,OAAO,GAAG,4BAA4B,CAAC;IAEvD,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAE9C,MAAM,CAAC,QAAQ;QACd,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG;YACb,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACzB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,OAAO,IAAI,SAAS,CACnB,SAAS,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CACvD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAa;QACzB,OAAO,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,KAAa;QACjC,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,QAAQ;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,6DAA6D;IAC7D,OAAO;QACN,OAAO,MAAM,CAAC,IAAI,CACjB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,CAAC,CAC3D,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,eAAe;QACd,OAAO,MAAM,CAAC,IAAI,CACjB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC,CAC9D,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { StateDirectoryPort } from "../../domain/ports/StateDirectoryPort.js";
|
|
2
|
+
/** What kind of lmgrep invocation a process is. */
|
|
3
|
+
export type ProcessKind = "mcp" | "serve" | "cli";
|
|
4
|
+
/** A live lmgrep process holding a database's maintainer lock. */
|
|
5
|
+
export interface RunningProcess {
|
|
6
|
+
pid: number;
|
|
7
|
+
/** Process title from /proc/<pid>/comm (e.g. "lmgrep-mcp"). */
|
|
8
|
+
processName: string;
|
|
9
|
+
cmdline: string;
|
|
10
|
+
kind: ProcessKind;
|
|
11
|
+
/** Working tree this process watches. */
|
|
12
|
+
projectRoot?: string;
|
|
13
|
+
/** Database it holds. */
|
|
14
|
+
databasePath?: string;
|
|
15
|
+
/** Whether this process is watching the index for changes. */
|
|
16
|
+
watching: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Discovers which lmgrep processes are alive and what they hold.
|
|
20
|
+
*
|
|
21
|
+
* Maintainer lock files double as the registry: each records its owner's pid,
|
|
22
|
+
* worktree and database, so scanning them and testing liveness gives an
|
|
23
|
+
* accurate picture without any separate bookkeeping that could drift from
|
|
24
|
+
* reality.
|
|
25
|
+
*/
|
|
26
|
+
export declare class ProcessRegistry {
|
|
27
|
+
private readonly state;
|
|
28
|
+
private static readonly LOCK_SUFFIX;
|
|
29
|
+
constructor(state: StateDirectoryPort);
|
|
30
|
+
discoverRunning(): RunningProcess[];
|
|
31
|
+
/**
|
|
32
|
+
* Lock files, from the locks directory and from the state root.
|
|
33
|
+
*
|
|
34
|
+
* The root is scanned too because a watcher started before locks moved is
|
|
35
|
+
* still running and still holds its database — reporting "no running
|
|
36
|
+
* processes" right after an upgrade would be wrong in exactly the moment
|
|
37
|
+
* someone is most likely to check.
|
|
38
|
+
*/
|
|
39
|
+
private lockFiles;
|
|
40
|
+
private inspect;
|
|
41
|
+
/**
|
|
42
|
+
* What kind of process this is, from its title.
|
|
43
|
+
*
|
|
44
|
+
* The title is the only reliable signal: `process.title` rewrites the argv
|
|
45
|
+
* buffer, so /proc/<pid>/cmdline reads back as the title alone and carries
|
|
46
|
+
* no subcommand. The MCP entry point titles itself distinctly; anything
|
|
47
|
+
* else holding a maintainer lock reached it through `lmgrep serve`.
|
|
48
|
+
*/
|
|
49
|
+
private classify;
|
|
50
|
+
}
|