grepmind-core 0.1.0-alpha
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/LICENSE +190 -0
- package/dist/config/types.d.ts +174 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +137 -0
- package/dist/config/types.js.map +1 -0
- package/dist/git.d.ts +98 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +298 -0
- package/dist/git.js.map +1 -0
- package/dist/git.test.d.ts +7 -0
- package/dist/git.test.d.ts.map +1 -0
- package/dist/git.test.js +242 -0
- package/dist/git.test.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/branch.d.ts +121 -0
- package/dist/indexer/branch.d.ts.map +1 -0
- package/dist/indexer/branch.js +451 -0
- package/dist/indexer/branch.js.map +1 -0
- package/dist/indexer/chunker.d.ts +9 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +70 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/chunker.test.d.ts +2 -0
- package/dist/indexer/chunker.test.d.ts.map +1 -0
- package/dist/indexer/chunker.test.js +180 -0
- package/dist/indexer/chunker.test.js.map +1 -0
- package/dist/indexer/code/branch.d.ts +155 -0
- package/dist/indexer/code/branch.d.ts.map +1 -0
- package/dist/indexer/code/branch.js +550 -0
- package/dist/indexer/code/branch.js.map +1 -0
- package/dist/indexer/code/branch.test.d.ts +7 -0
- package/dist/indexer/code/branch.test.d.ts.map +1 -0
- package/dist/indexer/code/branch.test.js +241 -0
- package/dist/indexer/code/branch.test.js.map +1 -0
- package/dist/indexer/code/chunker.d.ts +61 -0
- package/dist/indexer/code/chunker.d.ts.map +1 -0
- package/dist/indexer/code/chunker.js +311 -0
- package/dist/indexer/code/chunker.js.map +1 -0
- package/dist/indexer/code/chunker.test.d.ts +2 -0
- package/dist/indexer/code/chunker.test.d.ts.map +1 -0
- package/dist/indexer/code/chunker.test.js +552 -0
- package/dist/indexer/code/chunker.test.js.map +1 -0
- package/dist/indexer/code/fts.test.d.ts +2 -0
- package/dist/indexer/code/fts.test.d.ts.map +1 -0
- package/dist/indexer/code/fts.test.js +14 -0
- package/dist/indexer/code/fts.test.js.map +1 -0
- package/dist/indexer/code/graph/embedded.d.ts +11 -0
- package/dist/indexer/code/graph/embedded.d.ts.map +1 -0
- package/dist/indexer/code/graph/embedded.js +152 -0
- package/dist/indexer/code/graph/embedded.js.map +1 -0
- package/dist/indexer/code/graph/embedded.test.d.ts +2 -0
- package/dist/indexer/code/graph/embedded.test.d.ts.map +1 -0
- package/dist/indexer/code/graph/embedded.test.js +105 -0
- package/dist/indexer/code/graph/embedded.test.js.map +1 -0
- package/dist/indexer/code/graph/facts.d.ts +11 -0
- package/dist/indexer/code/graph/facts.d.ts.map +1 -0
- package/dist/indexer/code/graph/facts.js +456 -0
- package/dist/indexer/code/graph/facts.js.map +1 -0
- package/dist/indexer/code/graph/facts.test.d.ts +2 -0
- package/dist/indexer/code/graph/facts.test.d.ts.map +1 -0
- package/dist/indexer/code/graph/facts.test.js +181 -0
- package/dist/indexer/code/graph/facts.test.js.map +1 -0
- package/dist/indexer/code/graph/id.d.ts +14 -0
- package/dist/indexer/code/graph/id.d.ts.map +1 -0
- package/dist/indexer/code/graph/id.js +40 -0
- package/dist/indexer/code/graph/id.js.map +1 -0
- package/dist/indexer/code/graph/id.test.d.ts +2 -0
- package/dist/indexer/code/graph/id.test.d.ts.map +1 -0
- package/dist/indexer/code/graph/id.test.js +86 -0
- package/dist/indexer/code/graph/id.test.js.map +1 -0
- package/dist/indexer/code/graph/index.d.ts +133 -0
- package/dist/indexer/code/graph/index.d.ts.map +1 -0
- package/dist/indexer/code/graph/index.js +1876 -0
- package/dist/indexer/code/graph/index.js.map +1 -0
- package/dist/indexer/code/graph/index.test.d.ts +2 -0
- package/dist/indexer/code/graph/index.test.d.ts.map +1 -0
- package/dist/indexer/code/graph/index.test.js +210 -0
- package/dist/indexer/code/graph/index.test.js.map +1 -0
- package/dist/indexer/code/graph/queries.d.ts +22 -0
- package/dist/indexer/code/graph/queries.d.ts.map +1 -0
- package/dist/indexer/code/graph/queries.js +79 -0
- package/dist/indexer/code/graph/queries.js.map +1 -0
- package/dist/indexer/code/graph/queries.test.d.ts +2 -0
- package/dist/indexer/code/graph/queries.test.d.ts.map +1 -0
- package/dist/indexer/code/graph/queries.test.js +108 -0
- package/dist/indexer/code/graph/queries.test.js.map +1 -0
- package/dist/indexer/code/graph/resolver.d.ts +136 -0
- package/dist/indexer/code/graph/resolver.d.ts.map +1 -0
- package/dist/indexer/code/graph/resolver.js +839 -0
- package/dist/indexer/code/graph/resolver.js.map +1 -0
- package/dist/indexer/code/graph/resolver.test.d.ts +2 -0
- package/dist/indexer/code/graph/resolver.test.d.ts.map +1 -0
- package/dist/indexer/code/graph/resolver.test.js +482 -0
- package/dist/indexer/code/graph/resolver.test.js.map +1 -0
- package/dist/indexer/code/graph/semantic.d.ts +33 -0
- package/dist/indexer/code/graph/semantic.d.ts.map +1 -0
- package/dist/indexer/code/graph/semantic.js +279 -0
- package/dist/indexer/code/graph/semantic.js.map +1 -0
- package/dist/indexer/code/graph/semantic.test.d.ts +2 -0
- package/dist/indexer/code/graph/semantic.test.d.ts.map +1 -0
- package/dist/indexer/code/graph/semantic.test.js +127 -0
- package/dist/indexer/code/graph/semantic.test.js.map +1 -0
- package/dist/indexer/code/index.d.ts +404 -0
- package/dist/indexer/code/index.d.ts.map +1 -0
- package/dist/indexer/code/index.js +2070 -0
- package/dist/indexer/code/index.js.map +1 -0
- package/dist/indexer/code/languages/bash.d.ts +14 -0
- package/dist/indexer/code/languages/bash.d.ts.map +1 -0
- package/dist/indexer/code/languages/bash.js +125 -0
- package/dist/indexer/code/languages/bash.js.map +1 -0
- package/dist/indexer/code/languages/css.d.ts +16 -0
- package/dist/indexer/code/languages/css.d.ts.map +1 -0
- package/dist/indexer/code/languages/css.js +204 -0
- package/dist/indexer/code/languages/css.js.map +1 -0
- package/dist/indexer/code/languages/generic.d.ts +61 -0
- package/dist/indexer/code/languages/generic.d.ts.map +1 -0
- package/dist/indexer/code/languages/generic.js +150 -0
- package/dist/indexer/code/languages/generic.js.map +1 -0
- package/dist/indexer/code/languages/graphql.d.ts +13 -0
- package/dist/indexer/code/languages/graphql.d.ts.map +1 -0
- package/dist/indexer/code/languages/graphql.js +180 -0
- package/dist/indexer/code/languages/graphql.js.map +1 -0
- package/dist/indexer/code/languages/html.d.ts +16 -0
- package/dist/indexer/code/languages/html.d.ts.map +1 -0
- package/dist/indexer/code/languages/html.js +138 -0
- package/dist/indexer/code/languages/html.js.map +1 -0
- package/dist/indexer/code/languages/index.d.ts +9 -0
- package/dist/indexer/code/languages/index.d.ts.map +1 -0
- package/dist/indexer/code/languages/index.js +12 -0
- package/dist/indexer/code/languages/index.js.map +1 -0
- package/dist/indexer/code/languages/json.d.ts +12 -0
- package/dist/indexer/code/languages/json.d.ts.map +1 -0
- package/dist/indexer/code/languages/json.js +66 -0
- package/dist/indexer/code/languages/json.js.map +1 -0
- package/dist/indexer/code/languages/registry.d.ts +78 -0
- package/dist/indexer/code/languages/registry.d.ts.map +1 -0
- package/dist/indexer/code/languages/registry.js +72 -0
- package/dist/indexer/code/languages/registry.js.map +1 -0
- package/dist/indexer/code/languages/typescript.d.ts +39 -0
- package/dist/indexer/code/languages/typescript.d.ts.map +1 -0
- package/dist/indexer/code/languages/typescript.js +300 -0
- package/dist/indexer/code/languages/typescript.js.map +1 -0
- package/dist/indexer/code/languages/yaml.d.ts +13 -0
- package/dist/indexer/code/languages/yaml.d.ts.map +1 -0
- package/dist/indexer/code/languages/yaml.js +90 -0
- package/dist/indexer/code/languages/yaml.js.map +1 -0
- package/dist/indexer/code/parser.d.ts +26 -0
- package/dist/indexer/code/parser.d.ts.map +1 -0
- package/dist/indexer/code/parser.js +332 -0
- package/dist/indexer/code/parser.js.map +1 -0
- package/dist/indexer/code/retry.d.ts +58 -0
- package/dist/indexer/code/retry.d.ts.map +1 -0
- package/dist/indexer/code/retry.js +192 -0
- package/dist/indexer/code/retry.js.map +1 -0
- package/dist/indexer/code/tree/builder.d.ts +30 -0
- package/dist/indexer/code/tree/builder.d.ts.map +1 -0
- package/dist/indexer/code/tree/builder.js +132 -0
- package/dist/indexer/code/tree/builder.js.map +1 -0
- package/dist/indexer/code/tree/builder.test.d.ts +2 -0
- package/dist/indexer/code/tree/builder.test.d.ts.map +1 -0
- package/dist/indexer/code/tree/builder.test.js +31 -0
- package/dist/indexer/code/tree/builder.test.js.map +1 -0
- package/dist/indexer/code/tree/cache.d.ts +22 -0
- package/dist/indexer/code/tree/cache.d.ts.map +1 -0
- package/dist/indexer/code/tree/cache.js +85 -0
- package/dist/indexer/code/tree/cache.js.map +1 -0
- package/dist/indexer/code/tree/context.d.ts +32 -0
- package/dist/indexer/code/tree/context.d.ts.map +1 -0
- package/dist/indexer/code/tree/context.js +78 -0
- package/dist/indexer/code/tree/context.js.map +1 -0
- package/dist/indexer/code/tree/embedding.d.ts +9 -0
- package/dist/indexer/code/tree/embedding.d.ts.map +1 -0
- package/dist/indexer/code/tree/embedding.js +53 -0
- package/dist/indexer/code/tree/embedding.js.map +1 -0
- package/dist/indexer/code/tree/embedding.test.d.ts +2 -0
- package/dist/indexer/code/tree/embedding.test.d.ts.map +1 -0
- package/dist/indexer/code/tree/embedding.test.js +57 -0
- package/dist/indexer/code/tree/embedding.test.js.map +1 -0
- package/dist/indexer/code/tree/id.d.ts +3 -0
- package/dist/indexer/code/tree/id.d.ts.map +1 -0
- package/dist/indexer/code/tree/id.js +8 -0
- package/dist/indexer/code/tree/id.js.map +1 -0
- package/dist/indexer/code/tree/index.d.ts +113 -0
- package/dist/indexer/code/tree/index.d.ts.map +1 -0
- package/dist/indexer/code/tree/index.js +1146 -0
- package/dist/indexer/code/tree/index.js.map +1 -0
- package/dist/indexer/code/tree/rename.d.ts +13 -0
- package/dist/indexer/code/tree/rename.d.ts.map +1 -0
- package/dist/indexer/code/tree/rename.js +46 -0
- package/dist/indexer/code/tree/rename.js.map +1 -0
- package/dist/indexer/code/tree/repomap.d.ts +29 -0
- package/dist/indexer/code/tree/repomap.d.ts.map +1 -0
- package/dist/indexer/code/tree/repomap.js +95 -0
- package/dist/indexer/code/tree/repomap.js.map +1 -0
- package/dist/indexer/code/tree/repomap.test.d.ts +2 -0
- package/dist/indexer/code/tree/repomap.test.d.ts.map +1 -0
- package/dist/indexer/code/tree/repomap.test.js +93 -0
- package/dist/indexer/code/tree/repomap.test.js.map +1 -0
- package/dist/indexer/code/tree/stats.d.ts +26 -0
- package/dist/indexer/code/tree/stats.d.ts.map +1 -0
- package/dist/indexer/code/tree/stats.js +49 -0
- package/dist/indexer/code/tree/stats.js.map +1 -0
- package/dist/indexer/code/tree/types.d.ts +186 -0
- package/dist/indexer/code/tree/types.d.ts.map +1 -0
- package/dist/indexer/code/tree/types.js +10 -0
- package/dist/indexer/code/tree/types.js.map +1 -0
- package/dist/indexer/code/wal.d.ts +144 -0
- package/dist/indexer/code/wal.d.ts.map +1 -0
- package/dist/indexer/code/wal.js +283 -0
- package/dist/indexer/code/wal.js.map +1 -0
- package/dist/indexer/embeddings.d.ts +113 -0
- package/dist/indexer/embeddings.d.ts.map +1 -0
- package/dist/indexer/embeddings.js +477 -0
- package/dist/indexer/embeddings.js.map +1 -0
- package/dist/indexer/git-sync.d.ts +117 -0
- package/dist/indexer/git-sync.d.ts.map +1 -0
- package/dist/indexer/git-sync.js +398 -0
- package/dist/indexer/git-sync.js.map +1 -0
- package/dist/indexer/index.d.ts +175 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +1096 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/mocks/mock-reranker.d.ts +12 -0
- package/dist/indexer/mocks/mock-reranker.d.ts.map +1 -0
- package/dist/indexer/mocks/mock-reranker.js +26 -0
- package/dist/indexer/mocks/mock-reranker.js.map +1 -0
- package/dist/indexer/parser.d.ts +8 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +44 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/parser.test.d.ts +2 -0
- package/dist/indexer/parser.test.d.ts.map +1 -0
- package/dist/indexer/parser.test.js +197 -0
- package/dist/indexer/parser.test.js.map +1 -0
- package/dist/indexer/reranking.d.ts +71 -0
- package/dist/indexer/reranking.d.ts.map +1 -0
- package/dist/indexer/reranking.integration.test.d.ts +2 -0
- package/dist/indexer/reranking.integration.test.d.ts.map +1 -0
- package/dist/indexer/reranking.integration.test.js +104 -0
- package/dist/indexer/reranking.integration.test.js.map +1 -0
- package/dist/indexer/reranking.js +256 -0
- package/dist/indexer/reranking.js.map +1 -0
- package/dist/indexer/reranking.test.d.ts +2 -0
- package/dist/indexer/reranking.test.d.ts.map +1 -0
- package/dist/indexer/reranking.test.js +130 -0
- package/dist/indexer/reranking.test.js.map +1 -0
- package/dist/indexer/wal/file-storage.d.ts +60 -0
- package/dist/indexer/wal/file-storage.d.ts.map +1 -0
- package/dist/indexer/wal/file-storage.js +277 -0
- package/dist/indexer/wal/file-storage.js.map +1 -0
- package/dist/indexer/wal/file-storage.test.d.ts +8 -0
- package/dist/indexer/wal/file-storage.test.d.ts.map +1 -0
- package/dist/indexer/wal/file-storage.test.js +444 -0
- package/dist/indexer/wal/file-storage.test.js.map +1 -0
- package/dist/indexer/wal/index.d.ts +41 -0
- package/dist/indexer/wal/index.d.ts.map +1 -0
- package/dist/indexer/wal/index.js +61 -0
- package/dist/indexer/wal/index.js.map +1 -0
- package/dist/indexer/wal/integration.test.d.ts +11 -0
- package/dist/indexer/wal/integration.test.d.ts.map +1 -0
- package/dist/indexer/wal/integration.test.js +378 -0
- package/dist/indexer/wal/integration.test.js.map +1 -0
- package/dist/indexer/wal/lancedb-storage.d.ts +72 -0
- package/dist/indexer/wal/lancedb-storage.d.ts.map +1 -0
- package/dist/indexer/wal/lancedb-storage.js +462 -0
- package/dist/indexer/wal/lancedb-storage.js.map +1 -0
- package/dist/indexer/wal/lancedb-storage.test.d.ts +8 -0
- package/dist/indexer/wal/lancedb-storage.test.d.ts.map +1 -0
- package/dist/indexer/wal/lancedb-storage.test.js +415 -0
- package/dist/indexer/wal/lancedb-storage.test.js.map +1 -0
- package/dist/indexer/wal/sync-wal.d.ts +144 -0
- package/dist/indexer/wal/sync-wal.d.ts.map +1 -0
- package/dist/indexer/wal/sync-wal.js +863 -0
- package/dist/indexer/wal/sync-wal.js.map +1 -0
- package/dist/indexer/wal/sync-wal.test.d.ts +8 -0
- package/dist/indexer/wal/sync-wal.test.d.ts.map +1 -0
- package/dist/indexer/wal/sync-wal.test.js +752 -0
- package/dist/indexer/wal/sync-wal.test.js.map +1 -0
- package/dist/indexer/wal/types.d.ts +167 -0
- package/dist/indexer/wal/types.d.ts.map +1 -0
- package/dist/indexer/wal/types.js +12 -0
- package/dist/indexer/wal/types.js.map +1 -0
- package/dist/indexer/watcher.d.ts +36 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +110 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/search/explore.d.ts +62 -0
- package/dist/search/explore.d.ts.map +1 -0
- package/dist/search/explore.js +111 -0
- package/dist/search/explore.js.map +1 -0
- package/dist/search/fts.d.ts +23 -0
- package/dist/search/fts.d.ts.map +1 -0
- package/dist/search/fts.js +64 -0
- package/dist/search/fts.js.map +1 -0
- package/dist/search/fts.test.d.ts +2 -0
- package/dist/search/fts.test.d.ts.map +1 -0
- package/dist/search/fts.test.js +27 -0
- package/dist/search/fts.test.js.map +1 -0
- package/dist/search/grep.d.ts +75 -0
- package/dist/search/grep.d.ts.map +1 -0
- package/dist/search/grep.js +96 -0
- package/dist/search/grep.js.map +1 -0
- package/dist/search/grep.test.d.ts +2 -0
- package/dist/search/grep.test.d.ts.map +1 -0
- package/dist/search/grep.test.js +178 -0
- package/dist/search/grep.test.js.map +1 -0
- package/dist/search/hybrid-grep.d.ts +43 -0
- package/dist/search/hybrid-grep.d.ts.map +1 -0
- package/dist/search/hybrid-grep.js +130 -0
- package/dist/search/hybrid-grep.js.map +1 -0
- package/dist/search/hybrid-grep.test.d.ts +2 -0
- package/dist/search/hybrid-grep.test.d.ts.map +1 -0
- package/dist/search/hybrid-grep.test.js +133 -0
- package/dist/search/hybrid-grep.test.js.map +1 -0
- package/dist/search/rg-executor.d.ts +63 -0
- package/dist/search/rg-executor.d.ts.map +1 -0
- package/dist/search/rg-executor.js +146 -0
- package/dist/search/rg-executor.js.map +1 -0
- package/dist/search/rg-executor.test.d.ts +2 -0
- package/dist/search/rg-executor.test.d.ts.map +1 -0
- package/dist/search/rg-executor.test.js +104 -0
- package/dist/search/rg-executor.test.js.map +1 -0
- package/dist/search/rg-parser/extractor.d.ts +14 -0
- package/dist/search/rg-parser/extractor.d.ts.map +1 -0
- package/dist/search/rg-parser/extractor.js +82 -0
- package/dist/search/rg-parser/extractor.js.map +1 -0
- package/dist/search/rg-parser/extractor.test.d.ts +2 -0
- package/dist/search/rg-parser/extractor.test.d.ts.map +1 -0
- package/dist/search/rg-parser/extractor.test.js +35 -0
- package/dist/search/rg-parser/extractor.test.js.map +1 -0
- package/dist/search/rg-parser/fts-builder.d.ts +7 -0
- package/dist/search/rg-parser/fts-builder.d.ts.map +1 -0
- package/dist/search/rg-parser/fts-builder.js +18 -0
- package/dist/search/rg-parser/fts-builder.js.map +1 -0
- package/dist/search/rg-parser/fts-builder.test.d.ts +2 -0
- package/dist/search/rg-parser/fts-builder.test.d.ts.map +1 -0
- package/dist/search/rg-parser/fts-builder.test.js +26 -0
- package/dist/search/rg-parser/fts-builder.test.js.map +1 -0
- package/dist/search/rg-parser/index.d.ts +36 -0
- package/dist/search/rg-parser/index.d.ts.map +1 -0
- package/dist/search/rg-parser/index.js +83 -0
- package/dist/search/rg-parser/index.js.map +1 -0
- package/dist/search/rg-parser/index.test.d.ts +2 -0
- package/dist/search/rg-parser/index.test.d.ts.map +1 -0
- package/dist/search/rg-parser/index.test.js +34 -0
- package/dist/search/rg-parser/index.test.js.map +1 -0
- package/dist/search/rg-parser/strategy.d.ts +14 -0
- package/dist/search/rg-parser/strategy.d.ts.map +1 -0
- package/dist/search/rg-parser/strategy.js +31 -0
- package/dist/search/rg-parser/strategy.js.map +1 -0
- package/dist/search/rg-parser/strategy.test.d.ts +2 -0
- package/dist/search/rg-parser/strategy.test.d.ts.map +1 -0
- package/dist/search/rg-parser/strategy.test.js +29 -0
- package/dist/search/rg-parser/strategy.test.js.map +1 -0
- package/dist/types.d.ts +345 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/vault.d.ts +84 -0
- package/dist/utils/vault.d.ts.map +1 -0
- package/dist/utils/vault.js +138 -0
- package/dist/utils/vault.js.map +1 -0
- package/dist/utils/vault.test.d.ts +2 -0
- package/dist/utils/vault.test.d.ts.map +1 -0
- package/dist/utils/vault.test.js +153 -0
- package/dist/utils/vault.test.js.map +1 -0
- package/package.json +69 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// grepmind-core - Core indexing library
|
|
2
|
+
// No MCP dependencies, no singletons
|
|
3
|
+
// Config types
|
|
4
|
+
export * from './config/types.js';
|
|
5
|
+
// Domain types
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
// Git utilities
|
|
8
|
+
export * from './git.js';
|
|
9
|
+
// Vault utilities
|
|
10
|
+
export { resolveNotePath, globVaults, getVaultRoot, toRelativePath, getVaultIndex, createVaultUtils, } from './utils/vault.js';
|
|
11
|
+
// Indexer
|
|
12
|
+
export { Indexer, } from './indexer/index.js';
|
|
13
|
+
// Branch Indexer (overlay support for feature branches)
|
|
14
|
+
export { BranchIndexer, createBranchIndexer, } from './indexer/branch.js';
|
|
15
|
+
// Parser
|
|
16
|
+
export { parseNote, extractLinks, extractHashtags, extractTitle, generateContentHash, generateChunkId, } from './indexer/parser.js';
|
|
17
|
+
// Chunker
|
|
18
|
+
export { chunkNote } from './indexer/chunker.js';
|
|
19
|
+
// Embeddings
|
|
20
|
+
export { WasmEmbeddingProvider, VoyageEmbeddingProvider, OllamaEmbeddingProvider, LocalAIEmbeddingProvider, createEmbeddingProvider, getModelDimensions, } from './indexer/embeddings.js';
|
|
21
|
+
// Reranking
|
|
22
|
+
export { WasmRerankerProvider, VoyageRerankerProvider, LocalAIRerankerProvider, normalizeScores, truncateDocument, batchArray, createRerankerProvider, } from './indexer/reranking.js';
|
|
23
|
+
// Code indexing
|
|
24
|
+
export { TreeSitterParser, createTreeSitterParser, } from './indexer/code/parser.js';
|
|
25
|
+
export { symbolsToChunks, createFileChunk, buildEmbeddingText, smartTruncate, generateCodeChunkId, applyStableChunkIds, extractSignature, extractDocstring, } from './indexer/code/chunker.js';
|
|
26
|
+
export { CodeIndexWal, } from './indexer/code/wal.js';
|
|
27
|
+
// Unified SyncWal (for both notes and code)
|
|
28
|
+
export { SyncWal, FileWalStorage, createWalStorage, DEFAULT_SYNC_WAL_CONFIG, } from './indexer/wal/index.js';
|
|
29
|
+
// CodeIndexer
|
|
30
|
+
export { CodeIndexer, createCodeIndexer, normalizeIdentifiers, withIndexLock, } from './indexer/code/index.js';
|
|
31
|
+
// Tree indexing
|
|
32
|
+
export { TreeIndexer, } from './indexer/code/tree/index.js';
|
|
33
|
+
// Code graph indexing
|
|
34
|
+
export { GraphIndexer, ReverseIndexBuilder, QUALITY_PRESETS, detectChanges, } from './indexer/code/graph/index.js';
|
|
35
|
+
export { extractFacts, IMPORT_QUERY, EXPORT_QUERY, } from './indexer/code/graph/facts.js';
|
|
36
|
+
export { resolveModule, loadTSConfig, ExportMapBuilder, } from './indexer/code/graph/resolver.js';
|
|
37
|
+
export { analyzeFileSemantics, getImportClosure, loadTypeScript, } from './indexer/code/graph/semantic.js';
|
|
38
|
+
export { extractEmbedded, extractTemplateContent, parseGraphQLContent, parseCSSContent, } from './indexer/code/graph/embedded.js';
|
|
39
|
+
export { buildNodeEmbeddingText, hybridSearch, rerankWithGraph, } from './indexer/code/graph/queries.js';
|
|
40
|
+
// Code Branch Indexer (overlay support for feature branches)
|
|
41
|
+
export { CodeBranchIndexer, createCodeBranchIndexer, } from './indexer/code/branch.js';
|
|
42
|
+
export { withRetry, withRetryResult, sleep, isRetryableError, calculateBackoff, getRetryAfter, DEFAULT_RETRY_OPTIONS, } from './indexer/code/retry.js';
|
|
43
|
+
// Language extractors
|
|
44
|
+
export { languageRegistry, inferSymbolTypeFromNode, } from './indexer/code/languages/index.js';
|
|
45
|
+
export { genericExtractor, GenericExtractor, createGenericExtractor } from './indexer/code/languages/generic.js';
|
|
46
|
+
export { cssExtractor, CssExtractor } from './indexer/code/languages/css.js';
|
|
47
|
+
export { graphqlExtractor, GraphqlExtractor } from './indexer/code/languages/graphql.js';
|
|
48
|
+
export { jsonExtractor, JsonExtractor } from './indexer/code/languages/json.js';
|
|
49
|
+
export { yamlExtractor, YamlExtractor } from './indexer/code/languages/yaml.js';
|
|
50
|
+
export { htmlExtractor, HtmlExtractor } from './indexer/code/languages/html.js';
|
|
51
|
+
export { bashExtractor, BashExtractor } from './indexer/code/languages/bash.js';
|
|
52
|
+
// Watcher
|
|
53
|
+
export { Watcher, createWatcher, } from './indexer/watcher.js';
|
|
54
|
+
// Git Sync
|
|
55
|
+
export { GitSyncer, createGitSyncer, } from './indexer/git-sync.js';
|
|
56
|
+
// Search - Grep
|
|
57
|
+
export { escapeSqlLiteral, escapeSqlLikePattern, buildPathPrefixFilter, buildJsonStringArrayContainsAnyFilter, combineFilters, } from './search/fts.js';
|
|
58
|
+
export { Grep, createGrep, highlightMatches, } from './search/grep.js';
|
|
59
|
+
export { HybridGrep, } from './search/hybrid-grep.js';
|
|
60
|
+
export { executeRg, buildRgArgs, processRgMessage, } from './search/rg-executor.js';
|
|
61
|
+
export { parseRgQuery, resolveRegexMode, } from './search/rg-parser/index.js';
|
|
62
|
+
export { extractLiterals, } from './search/rg-parser/extractor.js';
|
|
63
|
+
export { decideStrategy, } from './search/rg-parser/strategy.js';
|
|
64
|
+
export { buildFtsQuery, escapeTantivyTerm, } from './search/rg-parser/fts-builder.js';
|
|
65
|
+
// Search - Knowledge Graph Explorer
|
|
66
|
+
export { KnowledgeGraphExplorer, createKnowledgeGraphExplorer, } from './search/explore.js';
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch-aware indexer with overlay support.
|
|
3
|
+
* All dependencies are passed via constructor (no singletons).
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - Base index: Full index for main branch (.lancedb/)
|
|
7
|
+
* - Overlay index: Diff index for feature branches (.lancedb/overlays/{branch}/)
|
|
8
|
+
*
|
|
9
|
+
* On feature branches:
|
|
10
|
+
* - Only changed/new chunks are stored in overlay
|
|
11
|
+
* - Deleted chunk IDs are tracked separately
|
|
12
|
+
* - Search merges base + overlay - deleted
|
|
13
|
+
*/
|
|
14
|
+
import type { IndexerConfig } from '../config/types.js';
|
|
15
|
+
import type { EmbeddingProvider } from './embeddings.js';
|
|
16
|
+
import type { VaultUtils } from '../utils/vault.js';
|
|
17
|
+
import type { SearchResult, NotesError } from '../types.js';
|
|
18
|
+
import { Indexer } from './index.js';
|
|
19
|
+
import { type GitInfo } from '../git.js';
|
|
20
|
+
/**
|
|
21
|
+
* Dependencies required by the BranchIndexer.
|
|
22
|
+
*/
|
|
23
|
+
export interface BranchIndexerDependencies {
|
|
24
|
+
config: IndexerConfig;
|
|
25
|
+
embeddingProvider: EmbeddingProvider;
|
|
26
|
+
vaultUtils: VaultUtils;
|
|
27
|
+
indexer: Indexer;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* BranchIndexer - branch-aware indexing with overlay support.
|
|
31
|
+
* All dependencies are passed via constructor (no singletons).
|
|
32
|
+
*/
|
|
33
|
+
export declare class BranchIndexer {
|
|
34
|
+
private config;
|
|
35
|
+
private embeddingProvider;
|
|
36
|
+
private vaultUtils;
|
|
37
|
+
private indexer;
|
|
38
|
+
private db;
|
|
39
|
+
private overlayTable;
|
|
40
|
+
private deletedTable;
|
|
41
|
+
private gitInfo;
|
|
42
|
+
private initialized;
|
|
43
|
+
constructor(deps: BranchIndexerDependencies);
|
|
44
|
+
/**
|
|
45
|
+
* Get overlay directory for a branch.
|
|
46
|
+
*/
|
|
47
|
+
private getOverlayPath;
|
|
48
|
+
/**
|
|
49
|
+
* Get embedding dimensions from provider.
|
|
50
|
+
*/
|
|
51
|
+
private getDimensions;
|
|
52
|
+
/**
|
|
53
|
+
* Initialize branch indexer.
|
|
54
|
+
* Returns null if on main branch (use base indexer directly).
|
|
55
|
+
*/
|
|
56
|
+
initialize(): Promise<GitInfo | null>;
|
|
57
|
+
private ensureOverlayTable;
|
|
58
|
+
private ensureDeletedTable;
|
|
59
|
+
/**
|
|
60
|
+
* Get all deleted chunk IDs for current branch.
|
|
61
|
+
*/
|
|
62
|
+
private getDeletedIds;
|
|
63
|
+
/**
|
|
64
|
+
* Get all overlay chunk IDs.
|
|
65
|
+
*/
|
|
66
|
+
private getOverlayIds;
|
|
67
|
+
/**
|
|
68
|
+
* Index a chunk in the overlay.
|
|
69
|
+
*/
|
|
70
|
+
private indexOverlayChunk;
|
|
71
|
+
/**
|
|
72
|
+
* Mark chunks as deleted in overlay.
|
|
73
|
+
*/
|
|
74
|
+
private markDeleted;
|
|
75
|
+
/**
|
|
76
|
+
* Index a file in the current branch context.
|
|
77
|
+
* - On main: indexes directly to base
|
|
78
|
+
* - On feature: indexes to overlay
|
|
79
|
+
*/
|
|
80
|
+
indexFile(filePath: string): Promise<void | NotesError>;
|
|
81
|
+
/**
|
|
82
|
+
* Remove a file from index in current branch context.
|
|
83
|
+
*/
|
|
84
|
+
removeFile(filePath: string): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Search with overlay support.
|
|
87
|
+
* Merges results from base + overlay, excluding deleted.
|
|
88
|
+
*/
|
|
89
|
+
search(query: string, options?: {
|
|
90
|
+
limit?: number;
|
|
91
|
+
threshold?: number;
|
|
92
|
+
tags?: string[];
|
|
93
|
+
}): Promise<SearchResult[] | NotesError>;
|
|
94
|
+
/**
|
|
95
|
+
* Sync overlay with current branch changes.
|
|
96
|
+
* Call this when switching to a feature branch.
|
|
97
|
+
*/
|
|
98
|
+
syncOverlay(): Promise<{
|
|
99
|
+
indexed: number;
|
|
100
|
+
deleted: number;
|
|
101
|
+
errors: NotesError[];
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* Clear overlay for current branch.
|
|
105
|
+
*/
|
|
106
|
+
clearOverlay(): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Get info about current indexing context.
|
|
109
|
+
*/
|
|
110
|
+
getInfo(): Promise<{
|
|
111
|
+
branch: string | null;
|
|
112
|
+
isMainBranch: boolean;
|
|
113
|
+
overlayChunks: number;
|
|
114
|
+
deletedChunks: number;
|
|
115
|
+
}>;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Factory function to create BranchIndexer.
|
|
119
|
+
*/
|
|
120
|
+
export declare function createBranchIndexer(deps: BranchIndexerDependencies): BranchIndexer;
|
|
121
|
+
//# sourceMappingURL=branch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/indexer/branch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAa,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIvE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,WAAW,CAAC;AAuBnB;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,aAAa,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,EAAE,yBAAyB;IAO3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YA6C7B,kBAAkB;YAsBlB,kBAAkB;IAchC;;OAEG;YACW,aAAa;IAO3B;;OAEG;YACW,aAAa;IAO3B;;OAEG;YACW,iBAAiB;IA0C/B;;OAEG;YACW,WAAW;IAwBzB;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC;IA4C7D;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCjD;;;OAGG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACZ,GACL,OAAO,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC;IA+FvC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAgCxF;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBnC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC;QACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,YAAY,EAAE,OAAO,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CAqBH;AAUD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,yBAAyB,GAAG,aAAa,CAElF"}
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch-aware indexer with overlay support.
|
|
3
|
+
* All dependencies are passed via constructor (no singletons).
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - Base index: Full index for main branch (.lancedb/)
|
|
7
|
+
* - Overlay index: Diff index for feature branches (.lancedb/overlays/{branch}/)
|
|
8
|
+
*
|
|
9
|
+
* On feature branches:
|
|
10
|
+
* - Only changed/new chunks are stored in overlay
|
|
11
|
+
* - Deleted chunk IDs are tracked separately
|
|
12
|
+
* - Search merges base + overlay - deleted
|
|
13
|
+
*/
|
|
14
|
+
import * as lancedb from '@lancedb/lancedb';
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
import fs from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { createError, isError } from '../types.js';
|
|
19
|
+
import { parseNote, generateContentHash } from './parser.js';
|
|
20
|
+
import { chunkNote } from './chunker.js';
|
|
21
|
+
import { getGitInfo, getChangedFilesFromMain, sanitizeBranchName, } from '../git.js';
|
|
22
|
+
/**
|
|
23
|
+
* BranchIndexer - branch-aware indexing with overlay support.
|
|
24
|
+
* All dependencies are passed via constructor (no singletons).
|
|
25
|
+
*/
|
|
26
|
+
export class BranchIndexer {
|
|
27
|
+
config;
|
|
28
|
+
embeddingProvider;
|
|
29
|
+
vaultUtils;
|
|
30
|
+
indexer;
|
|
31
|
+
db = null;
|
|
32
|
+
overlayTable = null;
|
|
33
|
+
deletedTable = null;
|
|
34
|
+
gitInfo = null;
|
|
35
|
+
initialized = false;
|
|
36
|
+
constructor(deps) {
|
|
37
|
+
this.config = deps.config;
|
|
38
|
+
this.embeddingProvider = deps.embeddingProvider;
|
|
39
|
+
this.vaultUtils = deps.vaultUtils;
|
|
40
|
+
this.indexer = deps.indexer;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get overlay directory for a branch.
|
|
44
|
+
*/
|
|
45
|
+
getOverlayPath(branch) {
|
|
46
|
+
return path.join(this.config.lancedb.dbPath, 'overlays', sanitizeBranchName(branch));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get embedding dimensions from provider.
|
|
50
|
+
*/
|
|
51
|
+
getDimensions() {
|
|
52
|
+
return this.embeddingProvider.getDimensions();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Initialize branch indexer.
|
|
56
|
+
* Returns null if on main branch (use base indexer directly).
|
|
57
|
+
*/
|
|
58
|
+
async initialize() {
|
|
59
|
+
if (this.initialized)
|
|
60
|
+
return this.gitInfo;
|
|
61
|
+
// Ensure base indexer is initialized
|
|
62
|
+
await this.indexer.initialize();
|
|
63
|
+
// Get git info from first vault path
|
|
64
|
+
const vaultPath = this.config.vaultPaths[0];
|
|
65
|
+
this.gitInfo = getGitInfo(vaultPath);
|
|
66
|
+
// If not in git repo or on main branch, no overlay needed
|
|
67
|
+
if (!this.gitInfo || this.gitInfo.isMainBranch) {
|
|
68
|
+
this.initialized = true;
|
|
69
|
+
return this.gitInfo;
|
|
70
|
+
}
|
|
71
|
+
// Overlay mode is only supported for local LanceDB paths.
|
|
72
|
+
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(this.config.lancedb.dbPath)) {
|
|
73
|
+
this.initialized = true;
|
|
74
|
+
return this.gitInfo;
|
|
75
|
+
}
|
|
76
|
+
// Create overlay directory
|
|
77
|
+
const overlayPath = this.getOverlayPath(this.gitInfo.branch);
|
|
78
|
+
await fs.mkdir(overlayPath, { recursive: true });
|
|
79
|
+
// Connect to overlay database
|
|
80
|
+
this.db = await lancedb.connect(overlayPath, {
|
|
81
|
+
storageOptions: this.config.lancedb.storageOptions,
|
|
82
|
+
});
|
|
83
|
+
const tableNames = await this.db.tableNames();
|
|
84
|
+
// Open or create overlay tables
|
|
85
|
+
if (tableNames.includes('overlay_chunks')) {
|
|
86
|
+
this.overlayTable = await this.db.openTable('overlay_chunks');
|
|
87
|
+
}
|
|
88
|
+
if (tableNames.includes('deleted_chunks')) {
|
|
89
|
+
this.deletedTable = await this.db.openTable('deleted_chunks');
|
|
90
|
+
}
|
|
91
|
+
this.initialized = true;
|
|
92
|
+
return this.gitInfo;
|
|
93
|
+
}
|
|
94
|
+
async ensureOverlayTable() {
|
|
95
|
+
if (this.overlayTable)
|
|
96
|
+
return this.overlayTable;
|
|
97
|
+
const dimensions = this.getDimensions();
|
|
98
|
+
const sampleData = [{
|
|
99
|
+
id: '__init__',
|
|
100
|
+
vector: new Array(dimensions).fill(0),
|
|
101
|
+
path: '',
|
|
102
|
+
section: '',
|
|
103
|
+
title: '',
|
|
104
|
+
tags: '[]',
|
|
105
|
+
links: '[]',
|
|
106
|
+
modified: 0,
|
|
107
|
+
content_hash: '',
|
|
108
|
+
content: '',
|
|
109
|
+
}];
|
|
110
|
+
this.overlayTable = await this.db.createTable('overlay_chunks', sampleData, { mode: 'overwrite' });
|
|
111
|
+
await this.overlayTable.delete("id = '__init__'");
|
|
112
|
+
return this.overlayTable;
|
|
113
|
+
}
|
|
114
|
+
async ensureDeletedTable() {
|
|
115
|
+
if (this.deletedTable)
|
|
116
|
+
return this.deletedTable;
|
|
117
|
+
const sampleData = [{
|
|
118
|
+
id: '__init__',
|
|
119
|
+
path: '',
|
|
120
|
+
deleted_at: 0,
|
|
121
|
+
}];
|
|
122
|
+
this.deletedTable = await this.db.createTable('deleted_chunks', sampleData, { mode: 'overwrite' });
|
|
123
|
+
await this.deletedTable.delete("id = '__init__'");
|
|
124
|
+
return this.deletedTable;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get all deleted chunk IDs for current branch.
|
|
128
|
+
*/
|
|
129
|
+
async getDeletedIds() {
|
|
130
|
+
if (!this.deletedTable)
|
|
131
|
+
return new Set();
|
|
132
|
+
const results = await this.deletedTable.query().select(['id']).toArray();
|
|
133
|
+
return new Set(results.map(r => r.id));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get all overlay chunk IDs.
|
|
137
|
+
*/
|
|
138
|
+
async getOverlayIds() {
|
|
139
|
+
if (!this.overlayTable)
|
|
140
|
+
return new Set();
|
|
141
|
+
const results = await this.overlayTable.query().select(['id']).toArray();
|
|
142
|
+
return new Set(results.map(r => r.id));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Index a chunk in the overlay.
|
|
146
|
+
*/
|
|
147
|
+
async indexOverlayChunk(chunk, modified) {
|
|
148
|
+
const contentHash = generateContentHash(chunk.content);
|
|
149
|
+
const table = await this.ensureOverlayTable();
|
|
150
|
+
// Check if chunk already exists with same content
|
|
151
|
+
const existing = await table.query()
|
|
152
|
+
.where(`id = '${chunk.id}'`)
|
|
153
|
+
.toArray();
|
|
154
|
+
if (existing.length > 0 && existing[0].content_hash === contentHash) {
|
|
155
|
+
return chunk.id;
|
|
156
|
+
}
|
|
157
|
+
const embedding = await this.embeddingProvider.getEmbedding(chunk.content);
|
|
158
|
+
if (isError(embedding))
|
|
159
|
+
return embedding;
|
|
160
|
+
// Delete existing if present
|
|
161
|
+
if (existing.length > 0) {
|
|
162
|
+
await table.delete(`id = '${chunk.id}'`);
|
|
163
|
+
}
|
|
164
|
+
// Also remove from deleted table if it was there
|
|
165
|
+
const deletedTable = await this.ensureDeletedTable();
|
|
166
|
+
await deletedTable.delete(`id = '${chunk.id}'`);
|
|
167
|
+
// Insert new chunk
|
|
168
|
+
await table.add([{
|
|
169
|
+
id: chunk.id,
|
|
170
|
+
vector: embedding,
|
|
171
|
+
path: chunk.path,
|
|
172
|
+
section: chunk.section,
|
|
173
|
+
title: chunk.title,
|
|
174
|
+
tags: JSON.stringify(chunk.tags),
|
|
175
|
+
links: JSON.stringify(chunk.links),
|
|
176
|
+
modified,
|
|
177
|
+
content_hash: contentHash,
|
|
178
|
+
content: chunk.content,
|
|
179
|
+
}]);
|
|
180
|
+
return chunk.id;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Mark chunks as deleted in overlay.
|
|
184
|
+
*/
|
|
185
|
+
async markDeleted(chunkIds, filePath) {
|
|
186
|
+
if (chunkIds.length === 0)
|
|
187
|
+
return;
|
|
188
|
+
const table = await this.ensureDeletedTable();
|
|
189
|
+
const now = Date.now();
|
|
190
|
+
for (const id of chunkIds) {
|
|
191
|
+
// Remove from overlay if exists
|
|
192
|
+
if (this.overlayTable) {
|
|
193
|
+
await this.overlayTable.delete(`id = '${id}'`);
|
|
194
|
+
}
|
|
195
|
+
// Check if not already marked
|
|
196
|
+
const existing = await table.query().where(`id = '${id}'`).toArray();
|
|
197
|
+
if (existing.length === 0) {
|
|
198
|
+
await table.add([{
|
|
199
|
+
id,
|
|
200
|
+
path: filePath,
|
|
201
|
+
deleted_at: now,
|
|
202
|
+
}]);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Index a file in the current branch context.
|
|
208
|
+
* - On main: indexes directly to base
|
|
209
|
+
* - On feature: indexes to overlay
|
|
210
|
+
*/
|
|
211
|
+
async indexFile(filePath) {
|
|
212
|
+
const gitInfo = await this.initialize();
|
|
213
|
+
// On main branch, use base indexer
|
|
214
|
+
if (!gitInfo || gitInfo.isMainBranch) {
|
|
215
|
+
return this.indexer.indexFile(filePath);
|
|
216
|
+
}
|
|
217
|
+
// On feature branch, index to overlay
|
|
218
|
+
let absolutePath;
|
|
219
|
+
if (path.isAbsolute(filePath)) {
|
|
220
|
+
absolutePath = filePath;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
const resolved = this.vaultUtils.resolveNotePath(filePath);
|
|
224
|
+
if (!resolved) {
|
|
225
|
+
return createError('FILE_NOT_FOUND', `File not found in any vault: ${filePath}`);
|
|
226
|
+
}
|
|
227
|
+
absolutePath = resolved;
|
|
228
|
+
}
|
|
229
|
+
const relativePath = this.vaultUtils.toRelativePath(absolutePath);
|
|
230
|
+
try {
|
|
231
|
+
const content = await fs.readFile(absolutePath, 'utf-8');
|
|
232
|
+
const stat = await fs.stat(absolutePath);
|
|
233
|
+
const note = parseNote(relativePath, content);
|
|
234
|
+
const chunks = chunkNote(note, this.config.chunking);
|
|
235
|
+
// Remove old overlay chunks for this file
|
|
236
|
+
if (this.overlayTable) {
|
|
237
|
+
await this.overlayTable.delete(`path = '${relativePath.replace(/'/g, "''")}'`);
|
|
238
|
+
}
|
|
239
|
+
// Index new chunks to overlay
|
|
240
|
+
for (const chunk of chunks) {
|
|
241
|
+
const result = await this.indexOverlayChunk(chunk, stat.mtimeMs);
|
|
242
|
+
if (isError(result))
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
return createError('INDEX_FILE_ERROR', `Failed to index ${relativePath}`, {
|
|
248
|
+
error: err.message,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Remove a file from index in current branch context.
|
|
254
|
+
*/
|
|
255
|
+
async removeFile(filePath) {
|
|
256
|
+
const gitInfo = await this.initialize();
|
|
257
|
+
const relativePath = path.isAbsolute(filePath)
|
|
258
|
+
? this.vaultUtils.toRelativePath(filePath)
|
|
259
|
+
: filePath;
|
|
260
|
+
// On main branch, use base indexer
|
|
261
|
+
if (!gitInfo || gitInfo.isMainBranch) {
|
|
262
|
+
return this.indexer.removeFile(filePath);
|
|
263
|
+
}
|
|
264
|
+
// On feature branch:
|
|
265
|
+
// 1. Remove from overlay
|
|
266
|
+
if (this.overlayTable) {
|
|
267
|
+
// Get chunk IDs before deleting
|
|
268
|
+
const chunks = await this.overlayTable.query()
|
|
269
|
+
.where(`path = '${relativePath.replace(/'/g, "''")}'`)
|
|
270
|
+
.select(['id'])
|
|
271
|
+
.toArray();
|
|
272
|
+
await this.overlayTable.delete(`path = '${relativePath.replace(/'/g, "''")}'`);
|
|
273
|
+
// Mark as deleted (they might exist in base)
|
|
274
|
+
const chunkIds = chunks.map(c => c.id);
|
|
275
|
+
await this.markDeleted(chunkIds, relativePath);
|
|
276
|
+
}
|
|
277
|
+
// 2. Also mark base chunks as deleted
|
|
278
|
+
// We need to find base chunk IDs for this file
|
|
279
|
+
// This requires querying base index - use path-based deletion marker
|
|
280
|
+
const deletedTable = await this.ensureDeletedTable();
|
|
281
|
+
await deletedTable.add([{
|
|
282
|
+
id: `__file__${relativePath}`,
|
|
283
|
+
path: relativePath,
|
|
284
|
+
deleted_at: Date.now(),
|
|
285
|
+
}]);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Search with overlay support.
|
|
289
|
+
* Merges results from base + overlay, excluding deleted.
|
|
290
|
+
*/
|
|
291
|
+
async search(query, options = {}) {
|
|
292
|
+
const gitInfo = await this.initialize();
|
|
293
|
+
// On main branch, use base indexer directly
|
|
294
|
+
if (!gitInfo || gitInfo.isMainBranch) {
|
|
295
|
+
return this.indexer.search(query, options);
|
|
296
|
+
}
|
|
297
|
+
const { limit = this.config.search.defaultLimit, threshold = this.config.search.defaultThreshold, tags, } = options;
|
|
298
|
+
const queryEmbedding = await this.embeddingProvider.getEmbedding(query, 'query');
|
|
299
|
+
if (isError(queryEmbedding))
|
|
300
|
+
return queryEmbedding;
|
|
301
|
+
// Get deleted IDs and overlay IDs
|
|
302
|
+
const deletedIds = await this.getDeletedIds();
|
|
303
|
+
const overlayIds = await this.getOverlayIds();
|
|
304
|
+
// Get deleted file paths
|
|
305
|
+
const deletedPaths = new Set();
|
|
306
|
+
if (this.deletedTable) {
|
|
307
|
+
const deletedRecords = await this.deletedTable.query().toArray();
|
|
308
|
+
for (const r of deletedRecords) {
|
|
309
|
+
const id = r.id;
|
|
310
|
+
if (id.startsWith('__file__')) {
|
|
311
|
+
deletedPaths.add(id.slice(8));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const results = [];
|
|
316
|
+
// 1. Search overlay first
|
|
317
|
+
if (this.overlayTable) {
|
|
318
|
+
const count = await this.overlayTable.countRows();
|
|
319
|
+
if (count > 0) {
|
|
320
|
+
const overlayResults = await this.overlayTable
|
|
321
|
+
.search(queryEmbedding)
|
|
322
|
+
.limit(limit * 2)
|
|
323
|
+
.toArray();
|
|
324
|
+
for (const r of overlayResults) {
|
|
325
|
+
const distance = r._distance;
|
|
326
|
+
const score = 1 - (distance / 2);
|
|
327
|
+
if (score < threshold)
|
|
328
|
+
continue;
|
|
329
|
+
const itemTags = JSON.parse(r.tags);
|
|
330
|
+
const itemLinks = JSON.parse(r.links);
|
|
331
|
+
if (tags && tags.length > 0) {
|
|
332
|
+
if (!tags.some((tag) => itemTags.includes(tag)))
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
results.push({
|
|
336
|
+
path: r.path,
|
|
337
|
+
section: r.section,
|
|
338
|
+
score,
|
|
339
|
+
content: r.content,
|
|
340
|
+
title: r.title,
|
|
341
|
+
tags: itemTags,
|
|
342
|
+
links: itemLinks,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// 2. Search base index, excluding deleted and overlay IDs
|
|
348
|
+
const baseResults = await this.indexer.search(query, {
|
|
349
|
+
limit: limit * 2,
|
|
350
|
+
threshold,
|
|
351
|
+
tags,
|
|
352
|
+
});
|
|
353
|
+
if (isError(baseResults))
|
|
354
|
+
return baseResults;
|
|
355
|
+
for (const r of baseResults) {
|
|
356
|
+
// Skip if file is deleted in this branch
|
|
357
|
+
if (deletedPaths.has(r.path))
|
|
358
|
+
continue;
|
|
359
|
+
// Generate chunk ID to check if it's in overlay or deleted
|
|
360
|
+
const chunkId = generateChunkIdFromResult(r);
|
|
361
|
+
if (overlayIds.has(chunkId) || deletedIds.has(chunkId))
|
|
362
|
+
continue;
|
|
363
|
+
results.push(r);
|
|
364
|
+
}
|
|
365
|
+
// 3. Sort by score and limit
|
|
366
|
+
results.sort((a, b) => b.score - a.score);
|
|
367
|
+
return results.slice(0, limit);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Sync overlay with current branch changes.
|
|
371
|
+
* Call this when switching to a feature branch.
|
|
372
|
+
*/
|
|
373
|
+
async syncOverlay() {
|
|
374
|
+
const gitInfo = await this.initialize();
|
|
375
|
+
if (!gitInfo || gitInfo.isMainBranch) {
|
|
376
|
+
return { indexed: 0, deleted: 0, errors: [] };
|
|
377
|
+
}
|
|
378
|
+
const vaultPath = this.config.vaultPaths[0];
|
|
379
|
+
const changes = getChangedFilesFromMain(vaultPath);
|
|
380
|
+
let indexed = 0;
|
|
381
|
+
let deleted = 0;
|
|
382
|
+
const errors = [];
|
|
383
|
+
// Index modified files
|
|
384
|
+
for (const file of changes.modified) {
|
|
385
|
+
const result = await this.indexFile(file);
|
|
386
|
+
if (isError(result)) {
|
|
387
|
+
errors.push(result);
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
indexed++;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// Mark deleted files
|
|
394
|
+
for (const file of changes.deleted) {
|
|
395
|
+
await this.removeFile(file);
|
|
396
|
+
deleted++;
|
|
397
|
+
}
|
|
398
|
+
return { indexed, deleted, errors };
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Clear overlay for current branch.
|
|
402
|
+
*/
|
|
403
|
+
async clearOverlay() {
|
|
404
|
+
const gitInfo = await this.initialize();
|
|
405
|
+
if (!gitInfo || gitInfo.isMainBranch)
|
|
406
|
+
return;
|
|
407
|
+
const overlayPath = this.getOverlayPath(gitInfo.branch);
|
|
408
|
+
try {
|
|
409
|
+
await fs.rm(overlayPath, { recursive: true });
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
// Directory might not exist
|
|
413
|
+
}
|
|
414
|
+
this.overlayTable = null;
|
|
415
|
+
this.deletedTable = null;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Get info about current indexing context.
|
|
419
|
+
*/
|
|
420
|
+
async getInfo() {
|
|
421
|
+
const gitInfo = await this.initialize();
|
|
422
|
+
let overlayChunks = 0;
|
|
423
|
+
let deletedChunks = 0;
|
|
424
|
+
if (this.overlayTable) {
|
|
425
|
+
overlayChunks = await this.overlayTable.countRows();
|
|
426
|
+
}
|
|
427
|
+
if (this.deletedTable) {
|
|
428
|
+
deletedChunks = await this.deletedTable.countRows();
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
branch: gitInfo?.branch || null,
|
|
432
|
+
isMainBranch: gitInfo?.isMainBranch ?? true,
|
|
433
|
+
overlayChunks,
|
|
434
|
+
deletedChunks,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Generate chunk ID from search result (for filtering).
|
|
440
|
+
*/
|
|
441
|
+
function generateChunkIdFromResult(result) {
|
|
442
|
+
const input = result.section ? `${result.path}#${result.section}` : result.path;
|
|
443
|
+
return createHash('sha256').update(input).digest('hex').slice(0, 16);
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Factory function to create BranchIndexer.
|
|
447
|
+
*/
|
|
448
|
+
export function createBranchIndexer(deps) {
|
|
449
|
+
return new BranchIndexer(deps);
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=branch.js.map
|