src-mcp 1.0.1 → 1.0.2
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/dist/bin.d.mts +1 -0
- package/dist/bin.mjs +205 -0
- package/dist/bin.mjs.map +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +8 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server-B2Ms4jQx.mjs +3889 -0
- package/dist/server-B2Ms4jQx.mjs.map +1 -0
- package/package.json +10 -9
- package/dist/bin.d.ts +0 -3
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js +0 -4
- package/dist/bin.js.map +0 -1
- package/dist/cli/adapter.d.ts +0 -7
- package/dist/cli/adapter.d.ts.map +0 -1
- package/dist/cli/adapter.js +0 -39
- package/dist/cli/adapter.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -24
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/index.js +0 -13
- package/dist/cli/commands/index.js.map +0 -1
- package/dist/cli/commands/serve.command.d.ts +0 -21
- package/dist/cli/commands/serve.command.d.ts.map +0 -1
- package/dist/cli/commands/serve.command.js +0 -62
- package/dist/cli/commands/serve.command.js.map +0 -1
- package/dist/cli/commands/version.command.d.ts +0 -2
- package/dist/cli/commands/version.command.d.ts.map +0 -1
- package/dist/cli/commands/version.command.js +0 -12
- package/dist/cli/commands/version.command.js.map +0 -1
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -15
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/parser.d.ts +0 -7
- package/dist/cli/parser.d.ts.map +0 -1
- package/dist/cli/parser.js +0 -99
- package/dist/cli/parser.js.map +0 -1
- package/dist/config/index.d.ts +0 -24
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -38
- package/dist/config/index.js.map +0 -1
- package/dist/core/ast/index.d.ts +0 -82
- package/dist/core/ast/index.d.ts.map +0 -1
- package/dist/core/ast/index.js +0 -204
- package/dist/core/ast/index.js.map +0 -1
- package/dist/core/ast/types.d.ts +0 -152
- package/dist/core/ast/types.d.ts.map +0 -1
- package/dist/core/ast/types.js +0 -5
- package/dist/core/ast/types.js.map +0 -1
- package/dist/core/constants.d.ts +0 -17
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/constants.js +0 -49
- package/dist/core/constants.js.map +0 -1
- package/dist/core/embeddings/callgraph.d.ts +0 -98
- package/dist/core/embeddings/callgraph.d.ts.map +0 -1
- package/dist/core/embeddings/callgraph.js +0 -415
- package/dist/core/embeddings/callgraph.js.map +0 -1
- package/dist/core/embeddings/chunker.d.ts +0 -37
- package/dist/core/embeddings/chunker.d.ts.map +0 -1
- package/dist/core/embeddings/chunker.js +0 -298
- package/dist/core/embeddings/chunker.js.map +0 -1
- package/dist/core/embeddings/client.d.ts +0 -30
- package/dist/core/embeddings/client.d.ts.map +0 -1
- package/dist/core/embeddings/client.js +0 -65
- package/dist/core/embeddings/client.js.map +0 -1
- package/dist/core/embeddings/crossfile.d.ts +0 -58
- package/dist/core/embeddings/crossfile.d.ts.map +0 -1
- package/dist/core/embeddings/crossfile.js +0 -202
- package/dist/core/embeddings/crossfile.js.map +0 -1
- package/dist/core/embeddings/enricher.d.ts +0 -53
- package/dist/core/embeddings/enricher.d.ts.map +0 -1
- package/dist/core/embeddings/enricher.js +0 -308
- package/dist/core/embeddings/enricher.js.map +0 -1
- package/dist/core/embeddings/index.d.ts +0 -13
- package/dist/core/embeddings/index.d.ts.map +0 -1
- package/dist/core/embeddings/index.js +0 -20
- package/dist/core/embeddings/index.js.map +0 -1
- package/dist/core/embeddings/reranker.d.ts +0 -41
- package/dist/core/embeddings/reranker.d.ts.map +0 -1
- package/dist/core/embeddings/reranker.js +0 -117
- package/dist/core/embeddings/reranker.js.map +0 -1
- package/dist/core/embeddings/store.d.ts +0 -93
- package/dist/core/embeddings/store.d.ts.map +0 -1
- package/dist/core/embeddings/store.js +0 -304
- package/dist/core/embeddings/store.js.map +0 -1
- package/dist/core/embeddings/types.d.ts +0 -77
- package/dist/core/embeddings/types.d.ts.map +0 -1
- package/dist/core/embeddings/types.js +0 -5
- package/dist/core/embeddings/types.js.map +0 -1
- package/dist/core/embeddings/watcher.d.ts +0 -130
- package/dist/core/embeddings/watcher.d.ts.map +0 -1
- package/dist/core/embeddings/watcher.js +0 -448
- package/dist/core/embeddings/watcher.js.map +0 -1
- package/dist/core/fallback/index.d.ts +0 -26
- package/dist/core/fallback/index.d.ts.map +0 -1
- package/dist/core/fallback/index.js +0 -76
- package/dist/core/fallback/index.js.map +0 -1
- package/dist/core/parser/index.d.ts +0 -64
- package/dist/core/parser/index.d.ts.map +0 -1
- package/dist/core/parser/index.js +0 -205
- package/dist/core/parser/index.js.map +0 -1
- package/dist/core/parser/languages.d.ts +0 -26
- package/dist/core/parser/languages.d.ts.map +0 -1
- package/dist/core/parser/languages.js +0 -101
- package/dist/core/parser/languages.js.map +0 -1
- package/dist/core/queries/helpers.d.ts +0 -72
- package/dist/core/queries/helpers.d.ts.map +0 -1
- package/dist/core/queries/helpers.js +0 -101
- package/dist/core/queries/helpers.js.map +0 -1
- package/dist/core/queries/index.d.ts +0 -144
- package/dist/core/queries/index.d.ts.map +0 -1
- package/dist/core/queries/index.js +0 -396
- package/dist/core/queries/index.js.map +0 -1
- package/dist/core/queries/loader.d.ts +0 -46
- package/dist/core/queries/loader.d.ts.map +0 -1
- package/dist/core/queries/loader.js +0 -216
- package/dist/core/queries/loader.js.map +0 -1
- package/dist/core/queries/patterns.d.ts +0 -10
- package/dist/core/queries/patterns.d.ts.map +0 -1
- package/dist/core/queries/patterns.js +0 -112
- package/dist/core/queries/patterns.js.map +0 -1
- package/dist/core/symbols/index.d.ts +0 -70
- package/dist/core/symbols/index.d.ts.map +0 -1
- package/dist/core/symbols/index.js +0 -359
- package/dist/core/symbols/index.js.map +0 -1
- package/dist/core/unified/index.d.ts +0 -118
- package/dist/core/unified/index.d.ts.map +0 -1
- package/dist/core/unified/index.js +0 -428
- package/dist/core/unified/index.js.map +0 -1
- package/dist/core/utils/assets.d.ts +0 -34
- package/dist/core/utils/assets.d.ts.map +0 -1
- package/dist/core/utils/assets.js +0 -85
- package/dist/core/utils/assets.js.map +0 -1
- package/dist/core/utils/cache.d.ts +0 -43
- package/dist/core/utils/cache.d.ts.map +0 -1
- package/dist/core/utils/cache.js +0 -60
- package/dist/core/utils/cache.js.map +0 -1
- package/dist/core/utils/index.d.ts +0 -7
- package/dist/core/utils/index.d.ts.map +0 -1
- package/dist/core/utils/index.js +0 -10
- package/dist/core/utils/index.js.map +0 -1
- package/dist/core/utils/tsconfig.d.ts +0 -34
- package/dist/core/utils/tsconfig.d.ts.map +0 -1
- package/dist/core/utils/tsconfig.js +0 -173
- package/dist/core/utils/tsconfig.js.map +0 -1
- package/dist/features/analyze-file/index.d.ts +0 -15
- package/dist/features/analyze-file/index.d.ts.map +0 -1
- package/dist/features/analyze-file/index.js +0 -164
- package/dist/features/analyze-file/index.js.map +0 -1
- package/dist/features/get-call-graph/index.d.ts +0 -24
- package/dist/features/get-call-graph/index.d.ts.map +0 -1
- package/dist/features/get-call-graph/index.js +0 -246
- package/dist/features/get-call-graph/index.js.map +0 -1
- package/dist/features/get-index-status/index.d.ts +0 -20
- package/dist/features/get-index-status/index.d.ts.map +0 -1
- package/dist/features/get-index-status/index.js +0 -90
- package/dist/features/get-index-status/index.js.map +0 -1
- package/dist/features/index-codebase/index.d.ts +0 -24
- package/dist/features/index-codebase/index.d.ts.map +0 -1
- package/dist/features/index-codebase/index.js +0 -283
- package/dist/features/index-codebase/index.js.map +0 -1
- package/dist/features/index.d.ts +0 -15
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/index.js +0 -28
- package/dist/features/index.js.map +0 -1
- package/dist/features/info/index.d.ts +0 -19
- package/dist/features/info/index.d.ts.map +0 -1
- package/dist/features/info/index.js +0 -41
- package/dist/features/info/index.js.map +0 -1
- package/dist/features/list-symbols/index.d.ts +0 -22
- package/dist/features/list-symbols/index.d.ts.map +0 -1
- package/dist/features/list-symbols/index.js +0 -74
- package/dist/features/list-symbols/index.js.map +0 -1
- package/dist/features/parse-ast/index.d.ts +0 -12
- package/dist/features/parse-ast/index.d.ts.map +0 -1
- package/dist/features/parse-ast/index.js +0 -71
- package/dist/features/parse-ast/index.js.map +0 -1
- package/dist/features/query-code/index.d.ts +0 -23
- package/dist/features/query-code/index.d.ts.map +0 -1
- package/dist/features/query-code/index.js +0 -96
- package/dist/features/query-code/index.js.map +0 -1
- package/dist/features/search-code/index.d.ts +0 -39
- package/dist/features/search-code/index.d.ts.map +0 -1
- package/dist/features/search-code/index.js +0 -258
- package/dist/features/search-code/index.js.map +0 -1
- package/dist/features/types.d.ts +0 -14
- package/dist/features/types.d.ts.map +0 -1
- package/dist/features/types.js +0 -2
- package/dist/features/types.js.map +0 -1
- package/dist/features/update-index/index.d.ts +0 -24
- package/dist/features/update-index/index.d.ts.map +0 -1
- package/dist/features/update-index/index.js +0 -358
- package/dist/features/update-index/index.js.map +0 -1
- package/dist/features/utils/content.d.ts +0 -30
- package/dist/features/utils/content.d.ts.map +0 -1
- package/dist/features/utils/content.js +0 -49
- package/dist/features/utils/content.js.map +0 -1
- package/dist/features/utils/index.d.ts +0 -6
- package/dist/features/utils/index.d.ts.map +0 -1
- package/dist/features/utils/index.js +0 -8
- package/dist/features/utils/index.js.map +0 -1
- package/dist/features/utils/result.d.ts +0 -37
- package/dist/features/utils/result.d.ts.map +0 -1
- package/dist/features/utils/result.js +0 -53
- package/dist/features/utils/result.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -9
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -188
- package/dist/prompts/index.js.map +0 -1
- package/dist/resources/index.d.ts +0 -3
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/resources/index.js +0 -17
- package/dist/resources/index.js.map +0 -1
- package/dist/server.d.ts +0 -4
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -24
- package/dist/server.js.map +0 -1
- package/dist/tools/adapter.d.ts +0 -4
- package/dist/tools/adapter.d.ts.map +0 -1
- package/dist/tools/adapter.js +0 -28
- package/dist/tools/adapter.js.map +0 -1
- package/dist/tools/index.d.ts +0 -5
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -9
- package/dist/tools/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -20
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/utils/colors.d.ts +0 -24
- package/dist/utils/colors.d.ts.map +0 -1
- package/dist/utils/colors.js +0 -30
- package/dist/utils/colors.js.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -4
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -8
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -57
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/spinner.d.ts +0 -11
- package/dist/utils/spinner.d.ts.map +0 -1
- package/dist/utils/spinner.js +0 -36
- package/dist/utils/spinner.js.map +0 -1
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LanceDB vector store for code embeddings
|
|
3
|
-
*
|
|
4
|
-
* Supports:
|
|
5
|
-
* - Vector similarity search (embeddings)
|
|
6
|
-
* - Full-text search (BM25)
|
|
7
|
-
* - Hybrid search with RRF (Reciprocal Rank Fusion)
|
|
8
|
-
*/
|
|
9
|
-
import type { EmbeddedChunk, EmbeddingConfig, IndexStatus, SearchResult } from "@core/embeddings/types";
|
|
10
|
-
/**
|
|
11
|
-
* Search mode for queries
|
|
12
|
-
*/
|
|
13
|
-
export type SearchMode = "vector" | "fts" | "hybrid";
|
|
14
|
-
/**
|
|
15
|
-
* Options for hybrid search
|
|
16
|
-
*/
|
|
17
|
-
export interface HybridSearchOptions {
|
|
18
|
-
/** Search mode: vector only, fts only, or hybrid (default: hybrid) */
|
|
19
|
-
mode?: SearchMode;
|
|
20
|
-
/** Weight for vector search in hybrid mode (0-1, default: 0.5) */
|
|
21
|
-
vectorWeight?: number;
|
|
22
|
-
/** RRF constant k for rank fusion (default: 60) */
|
|
23
|
-
rrfK?: number;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* LanceDB vector store wrapper
|
|
27
|
-
*/
|
|
28
|
-
export declare class VectorStore {
|
|
29
|
-
private db;
|
|
30
|
-
private table;
|
|
31
|
-
private readonly indexPath;
|
|
32
|
-
private ftsIndexCreated;
|
|
33
|
-
constructor(directory: string, _config: Pick<EmbeddingConfig, "embeddingDimensions">);
|
|
34
|
-
/**
|
|
35
|
-
* Initialize the database connection
|
|
36
|
-
*/
|
|
37
|
-
connect(): Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* Close the database connection
|
|
40
|
-
*/
|
|
41
|
-
close(): void;
|
|
42
|
-
/**
|
|
43
|
-
* Check if the index exists
|
|
44
|
-
*/
|
|
45
|
-
exists(): boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Add embedded chunks to the store
|
|
48
|
-
*/
|
|
49
|
-
addChunks(chunks: EmbeddedChunk[]): Promise<void>;
|
|
50
|
-
/**
|
|
51
|
-
* Create FTS (Full-Text Search) index on content column
|
|
52
|
-
* This enables BM25-based text search
|
|
53
|
-
*/
|
|
54
|
-
createFtsIndex(): Promise<void>;
|
|
55
|
-
/**
|
|
56
|
-
* Search for similar chunks using vector similarity
|
|
57
|
-
*/
|
|
58
|
-
search(queryVector: number[], limit?: number): Promise<SearchResult[]>;
|
|
59
|
-
/**
|
|
60
|
-
* Full-text search using BM25
|
|
61
|
-
*/
|
|
62
|
-
searchFts(queryText: string, limit?: number): Promise<SearchResult[]>;
|
|
63
|
-
/**
|
|
64
|
-
* Hybrid search combining vector similarity and full-text search
|
|
65
|
-
* Uses Reciprocal Rank Fusion (RRF) to combine results
|
|
66
|
-
*/
|
|
67
|
-
searchHybrid(queryVector: number[], queryText: string, limit?: number, options?: HybridSearchOptions): Promise<SearchResult[]>;
|
|
68
|
-
/**
|
|
69
|
-
* Delete chunks by file path
|
|
70
|
-
*/
|
|
71
|
-
deleteByFilePath(filePath: string): Promise<void>;
|
|
72
|
-
/**
|
|
73
|
-
* Clear all data from the store
|
|
74
|
-
*/
|
|
75
|
-
clear(): Promise<void>;
|
|
76
|
-
/**
|
|
77
|
-
* Get index status
|
|
78
|
-
*/
|
|
79
|
-
getStatus(directory: string): Promise<IndexStatus>;
|
|
80
|
-
/**
|
|
81
|
-
* Get all indexed file paths
|
|
82
|
-
*/
|
|
83
|
-
getIndexedFiles(): Promise<string[]>;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Create a vector store for a directory
|
|
87
|
-
*/
|
|
88
|
-
export declare function createVectorStore(directory: string, config: Pick<EmbeddingConfig, "embeddingDimensions">): VectorStore;
|
|
89
|
-
/**
|
|
90
|
-
* Get the index path for a directory
|
|
91
|
-
*/
|
|
92
|
-
export declare function getIndexPath(directory: string): string;
|
|
93
|
-
//# sourceMappingURL=store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/embeddings/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,YAAY,EACb,MAAM,wBAAwB,CAAC;AAMhC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAkED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,eAAe,CAAS;gBAG9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAKvD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvD;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBrC;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyBxE;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqCvE;;;OAGG;IACG,YAAY,CAChB,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,KAAK,SAAK,EACV,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,YAAY,EAAE,CAAC;IA8B1B;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiCxD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAiB3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,qBAAqB,CAAC,GACnD,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LanceDB vector store for code embeddings
|
|
3
|
-
*
|
|
4
|
-
* Supports:
|
|
5
|
-
* - Vector similarity search (embeddings)
|
|
6
|
-
* - Full-text search (BM25)
|
|
7
|
-
* - Hybrid search with RRF (Reciprocal Rank Fusion)
|
|
8
|
-
*/
|
|
9
|
-
import * as lancedb from "@lancedb/lancedb";
|
|
10
|
-
import * as fs from "node:fs";
|
|
11
|
-
import * as path from "node:path";
|
|
12
|
-
import { logger } from "@utils";
|
|
13
|
-
const TABLE_NAME = "code_chunks";
|
|
14
|
-
const INDEX_DIR_NAME = ".src-index";
|
|
15
|
-
/**
|
|
16
|
-
* Reciprocal Rank Fusion (RRF) to combine ranked lists
|
|
17
|
-
*
|
|
18
|
-
* RRF score = sum(1 / (k + rank_i)) for each list
|
|
19
|
-
* where k is a constant (typically 60) and rank_i is the 1-based rank in list i
|
|
20
|
-
*/
|
|
21
|
-
function rrfFusion(vectorResults, ftsResults, k = 60) {
|
|
22
|
-
const scores = new Map();
|
|
23
|
-
// Add vector results with RRF scoring
|
|
24
|
-
vectorResults.forEach((result, index) => {
|
|
25
|
-
const rank = index + 1;
|
|
26
|
-
const rrfScore = 1 / (k + rank);
|
|
27
|
-
const existing = scores.get(result.chunk.id);
|
|
28
|
-
if (existing) {
|
|
29
|
-
existing.score += rrfScore;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
scores.set(result.chunk.id, { score: rrfScore, result });
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
// Add FTS results with RRF scoring
|
|
36
|
-
ftsResults.forEach((result, index) => {
|
|
37
|
-
const rank = index + 1;
|
|
38
|
-
const rrfScore = 1 / (k + rank);
|
|
39
|
-
const existing = scores.get(result.chunk.id);
|
|
40
|
-
if (existing) {
|
|
41
|
-
existing.score += rrfScore;
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
scores.set(result.chunk.id, { score: rrfScore, result });
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
// Sort by combined RRF score (higher is better)
|
|
48
|
-
const combined = Array.from(scores.values())
|
|
49
|
-
.sort((a, b) => b.score - a.score)
|
|
50
|
-
.map(({ score, result }) => ({
|
|
51
|
-
...result,
|
|
52
|
-
score, // Replace distance with RRF score
|
|
53
|
-
}));
|
|
54
|
-
return combined;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* LanceDB vector store wrapper
|
|
58
|
-
*/
|
|
59
|
-
export class VectorStore {
|
|
60
|
-
db = null;
|
|
61
|
-
table = null;
|
|
62
|
-
indexPath;
|
|
63
|
-
ftsIndexCreated = false;
|
|
64
|
-
constructor(directory, _config) {
|
|
65
|
-
this.indexPath = path.join(directory, INDEX_DIR_NAME);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Initialize the database connection
|
|
69
|
-
*/
|
|
70
|
-
async connect() {
|
|
71
|
-
this.db = await lancedb.connect(this.indexPath);
|
|
72
|
-
const tableNames = await this.db.tableNames();
|
|
73
|
-
if (tableNames.includes(TABLE_NAME)) {
|
|
74
|
-
this.table = await this.db.openTable(TABLE_NAME);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Close the database connection
|
|
79
|
-
*/
|
|
80
|
-
close() {
|
|
81
|
-
this.db = null;
|
|
82
|
-
this.table = null;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Check if the index exists
|
|
86
|
-
*/
|
|
87
|
-
exists() {
|
|
88
|
-
return fs.existsSync(this.indexPath);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Add embedded chunks to the store
|
|
92
|
-
*/
|
|
93
|
-
async addChunks(chunks) {
|
|
94
|
-
if (!this.db) {
|
|
95
|
-
throw new Error("Database not connected. Call connect() first.");
|
|
96
|
-
}
|
|
97
|
-
const records = chunks.map((chunk) => ({
|
|
98
|
-
id: chunk.id,
|
|
99
|
-
content: chunk.content,
|
|
100
|
-
filePath: chunk.filePath,
|
|
101
|
-
language: chunk.language,
|
|
102
|
-
startLine: chunk.startLine,
|
|
103
|
-
endLine: chunk.endLine,
|
|
104
|
-
symbolName: chunk.symbolName ?? "",
|
|
105
|
-
symbolType: chunk.symbolType ?? "",
|
|
106
|
-
vector: chunk.vector,
|
|
107
|
-
}));
|
|
108
|
-
if (!this.table) {
|
|
109
|
-
this.table = await this.db.createTable(TABLE_NAME, records);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
await this.table.add(records);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Create FTS (Full-Text Search) index on content column
|
|
117
|
-
* This enables BM25-based text search
|
|
118
|
-
*/
|
|
119
|
-
async createFtsIndex() {
|
|
120
|
-
if (!this.table || this.ftsIndexCreated) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
try {
|
|
124
|
-
await this.table.createIndex("content", {
|
|
125
|
-
config: lancedb.Index.fts(),
|
|
126
|
-
});
|
|
127
|
-
this.ftsIndexCreated = true;
|
|
128
|
-
logger.debug("FTS index created on content column");
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
// Index may already exist
|
|
132
|
-
if (error instanceof Error && error.message.includes("already exists")) {
|
|
133
|
-
this.ftsIndexCreated = true;
|
|
134
|
-
logger.debug("FTS index already exists");
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
logger.warn(`Failed to create FTS index: ${error instanceof Error ? error.message : String(error)}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Search for similar chunks using vector similarity
|
|
143
|
-
*/
|
|
144
|
-
async search(queryVector, limit = 10) {
|
|
145
|
-
if (!this.table) {
|
|
146
|
-
return [];
|
|
147
|
-
}
|
|
148
|
-
const results = (await this.table
|
|
149
|
-
.vectorSearch(queryVector)
|
|
150
|
-
.limit(limit)
|
|
151
|
-
.toArray());
|
|
152
|
-
return results.map((row) => ({
|
|
153
|
-
chunk: {
|
|
154
|
-
id: row.id,
|
|
155
|
-
content: row.content,
|
|
156
|
-
filePath: row.filePath,
|
|
157
|
-
language: row.language,
|
|
158
|
-
startLine: row.startLine,
|
|
159
|
-
endLine: row.endLine,
|
|
160
|
-
symbolName: row.symbolName || undefined,
|
|
161
|
-
symbolType: row.symbolType || undefined,
|
|
162
|
-
},
|
|
163
|
-
score: row._distance ?? 0,
|
|
164
|
-
}));
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Full-text search using BM25
|
|
168
|
-
*/
|
|
169
|
-
async searchFts(queryText, limit = 10) {
|
|
170
|
-
if (!this.table) {
|
|
171
|
-
return [];
|
|
172
|
-
}
|
|
173
|
-
// Ensure FTS index exists
|
|
174
|
-
await this.createFtsIndex();
|
|
175
|
-
try {
|
|
176
|
-
const results = (await this.table
|
|
177
|
-
.query()
|
|
178
|
-
.nearestToText(queryText)
|
|
179
|
-
.limit(limit)
|
|
180
|
-
.toArray());
|
|
181
|
-
return results.map((row, index) => ({
|
|
182
|
-
chunk: {
|
|
183
|
-
id: row.id,
|
|
184
|
-
content: row.content,
|
|
185
|
-
filePath: row.filePath,
|
|
186
|
-
language: row.language,
|
|
187
|
-
startLine: row.startLine,
|
|
188
|
-
endLine: row.endLine,
|
|
189
|
-
symbolName: row.symbolName || undefined,
|
|
190
|
-
symbolType: row.symbolType || undefined,
|
|
191
|
-
},
|
|
192
|
-
// FTS doesn't return distance, use rank-based score
|
|
193
|
-
score: 1 / (index + 1),
|
|
194
|
-
}));
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
logger.warn(`FTS search failed, falling back to empty results: ${error instanceof Error ? error.message : String(error)}`);
|
|
198
|
-
return [];
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Hybrid search combining vector similarity and full-text search
|
|
203
|
-
* Uses Reciprocal Rank Fusion (RRF) to combine results
|
|
204
|
-
*/
|
|
205
|
-
async searchHybrid(queryVector, queryText, limit = 10, options = {}) {
|
|
206
|
-
const { mode = "hybrid", rrfK = 60 } = options;
|
|
207
|
-
if (!this.table) {
|
|
208
|
-
return [];
|
|
209
|
-
}
|
|
210
|
-
// Vector-only search
|
|
211
|
-
if (mode === "vector") {
|
|
212
|
-
return this.search(queryVector, limit);
|
|
213
|
-
}
|
|
214
|
-
// FTS-only search
|
|
215
|
-
if (mode === "fts") {
|
|
216
|
-
return this.searchFts(queryText, limit);
|
|
217
|
-
}
|
|
218
|
-
// Hybrid search: run both searches in parallel
|
|
219
|
-
const [vectorResults, ftsResults] = await Promise.all([
|
|
220
|
-
this.search(queryVector, limit * 2), // Get more results for fusion
|
|
221
|
-
this.searchFts(queryText, limit * 2),
|
|
222
|
-
]);
|
|
223
|
-
// Fuse results using RRF
|
|
224
|
-
const fusedResults = rrfFusion(vectorResults, ftsResults, rrfK);
|
|
225
|
-
// Return top N results
|
|
226
|
-
return fusedResults.slice(0, limit);
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Delete chunks by file path
|
|
230
|
-
*/
|
|
231
|
-
async deleteByFilePath(filePath) {
|
|
232
|
-
if (!this.table) {
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
await this.table.delete(`"filePath" = '${filePath.replace(/'/g, "''")}'`);
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Clear all data from the store
|
|
239
|
-
*/
|
|
240
|
-
async clear() {
|
|
241
|
-
if (this.db && this.table) {
|
|
242
|
-
await this.db.dropTable(TABLE_NAME);
|
|
243
|
-
this.table = null;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Get index status
|
|
248
|
-
*/
|
|
249
|
-
async getStatus(directory) {
|
|
250
|
-
const status = {
|
|
251
|
-
directory,
|
|
252
|
-
indexPath: this.indexPath,
|
|
253
|
-
exists: this.exists(),
|
|
254
|
-
totalChunks: 0,
|
|
255
|
-
totalFiles: 0,
|
|
256
|
-
languages: {},
|
|
257
|
-
};
|
|
258
|
-
if (!this.table) {
|
|
259
|
-
return status;
|
|
260
|
-
}
|
|
261
|
-
const allRows = (await this.table.query().toArray());
|
|
262
|
-
status.totalChunks = allRows.length;
|
|
263
|
-
const uniqueFiles = new Set();
|
|
264
|
-
const languageCounts = {};
|
|
265
|
-
for (const row of allRows) {
|
|
266
|
-
uniqueFiles.add(row.filePath);
|
|
267
|
-
const lang = row.language;
|
|
268
|
-
languageCounts[lang] = (languageCounts[lang] ?? 0) + 1;
|
|
269
|
-
}
|
|
270
|
-
status.totalFiles = uniqueFiles.size;
|
|
271
|
-
status.languages = languageCounts;
|
|
272
|
-
return status;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Get all indexed file paths
|
|
276
|
-
*/
|
|
277
|
-
async getIndexedFiles() {
|
|
278
|
-
if (!this.table) {
|
|
279
|
-
return [];
|
|
280
|
-
}
|
|
281
|
-
const rows = (await this.table
|
|
282
|
-
.query()
|
|
283
|
-
.select(["filePath"])
|
|
284
|
-
.toArray());
|
|
285
|
-
const uniqueFiles = new Set();
|
|
286
|
-
for (const row of rows) {
|
|
287
|
-
uniqueFiles.add(row.filePath);
|
|
288
|
-
}
|
|
289
|
-
return Array.from(uniqueFiles);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Create a vector store for a directory
|
|
294
|
-
*/
|
|
295
|
-
export function createVectorStore(directory, config) {
|
|
296
|
-
return new VectorStore(directory, config);
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Get the index path for a directory
|
|
300
|
-
*/
|
|
301
|
-
export function getIndexPath(directory) {
|
|
302
|
-
return path.join(directory, INDEX_DIR_NAME);
|
|
303
|
-
}
|
|
304
|
-
//# sourceMappingURL=store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/embeddings/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedding types for Ollama + LanceDB integration
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* A chunk of code with metadata
|
|
6
|
-
*/
|
|
7
|
-
export interface CodeChunk {
|
|
8
|
-
id: string;
|
|
9
|
-
content: string;
|
|
10
|
-
filePath: string;
|
|
11
|
-
language: string;
|
|
12
|
-
startLine: number;
|
|
13
|
-
endLine: number;
|
|
14
|
-
symbolName?: string;
|
|
15
|
-
symbolType?: string;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* A chunk with its embedding vector
|
|
19
|
-
*/
|
|
20
|
-
export interface EmbeddedChunk extends CodeChunk {
|
|
21
|
-
vector: number[];
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Search result from LanceDB
|
|
25
|
-
*/
|
|
26
|
-
export interface SearchResult {
|
|
27
|
-
chunk: CodeChunk;
|
|
28
|
-
score: number;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Index status information
|
|
32
|
-
*/
|
|
33
|
-
export interface IndexStatus {
|
|
34
|
-
directory: string;
|
|
35
|
-
indexPath: string;
|
|
36
|
-
exists: boolean;
|
|
37
|
-
totalChunks: number;
|
|
38
|
-
totalFiles: number;
|
|
39
|
-
languages: Record<string, number>;
|
|
40
|
-
lastUpdated?: Date;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Embedding configuration
|
|
44
|
-
*/
|
|
45
|
-
export interface EmbeddingConfig {
|
|
46
|
-
ollamaBaseUrl: string;
|
|
47
|
-
embeddingModel: string;
|
|
48
|
-
embeddingDimensions: number;
|
|
49
|
-
defaultChunkSize: number;
|
|
50
|
-
defaultChunkOverlap: number;
|
|
51
|
-
batchSize: number;
|
|
52
|
-
/** Model for re-ranking search results (lightweight model recommended) */
|
|
53
|
-
rerankModel?: string;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* A symbol contained within a chunk
|
|
57
|
-
*/
|
|
58
|
-
export interface ChunkSymbol {
|
|
59
|
-
/** Symbol name */
|
|
60
|
-
name: string;
|
|
61
|
-
/** Symbol type (function, class, variable, etc.) */
|
|
62
|
-
type: string;
|
|
63
|
-
/** Optional signature for functions/methods */
|
|
64
|
-
signature?: string;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* A chunk enriched with semantic metadata
|
|
68
|
-
*/
|
|
69
|
-
export interface EnrichedChunk extends CodeChunk {
|
|
70
|
-
/** The enriched content to be used for embedding */
|
|
71
|
-
enrichedContent: string;
|
|
72
|
-
/** Symbols contained within this chunk */
|
|
73
|
-
containedSymbols: ChunkSymbol[];
|
|
74
|
-
/** Whether enrichment was successfully applied */
|
|
75
|
-
wasEnriched: boolean;
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/embeddings/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,kDAAkD;IAClD,WAAW,EAAE,OAAO,CAAC;CACtB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/embeddings/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File watcher for automatic index updates
|
|
3
|
-
*
|
|
4
|
-
* Features:
|
|
5
|
-
* - SHA-256 hash comparison to detect real content changes
|
|
6
|
-
* - Debounce (5s default) to handle rapid changes
|
|
7
|
-
* - Persistent hash cache to avoid unnecessary re-indexing
|
|
8
|
-
* - fast-glob for efficient file scanning
|
|
9
|
-
*/
|
|
10
|
-
import type { EmbeddingConfig } from "@core/embeddings/types";
|
|
11
|
-
export interface WatcherOptions {
|
|
12
|
-
directory: string;
|
|
13
|
-
config: EmbeddingConfig;
|
|
14
|
-
/** Debounce delay in ms (default: 5000) */
|
|
15
|
-
debounceMs?: number;
|
|
16
|
-
onReady?: () => void;
|
|
17
|
-
onError?: (error: Error) => void;
|
|
18
|
-
onIndexed?: (filePath: string) => void;
|
|
19
|
-
onRemoved?: (filePath: string) => void;
|
|
20
|
-
}
|
|
21
|
-
export declare class IndexWatcher {
|
|
22
|
-
private readonly directory;
|
|
23
|
-
private readonly config;
|
|
24
|
-
private readonly debounceMs;
|
|
25
|
-
private readonly ollamaClient;
|
|
26
|
-
private readonly vectorStore;
|
|
27
|
-
private watcher;
|
|
28
|
-
private ig;
|
|
29
|
-
private isProcessing;
|
|
30
|
-
private hashCache;
|
|
31
|
-
private pendingChanges;
|
|
32
|
-
private operationQueue;
|
|
33
|
-
private readonly onReady?;
|
|
34
|
-
private readonly onError?;
|
|
35
|
-
private readonly onIndexed?;
|
|
36
|
-
private readonly onRemoved?;
|
|
37
|
-
constructor(options: WatcherOptions);
|
|
38
|
-
/**
|
|
39
|
-
* Compute SHA-256 hash of content
|
|
40
|
-
*/
|
|
41
|
-
private computeHash;
|
|
42
|
-
/**
|
|
43
|
-
* Get hash cache file path
|
|
44
|
-
*/
|
|
45
|
-
private getHashCachePath;
|
|
46
|
-
/**
|
|
47
|
-
* Load hash cache from disk
|
|
48
|
-
*/
|
|
49
|
-
private loadHashCache;
|
|
50
|
-
/**
|
|
51
|
-
* Save hash cache to disk
|
|
52
|
-
*/
|
|
53
|
-
private saveHashCache;
|
|
54
|
-
/**
|
|
55
|
-
* Check if file content has changed by comparing hashes
|
|
56
|
-
*/
|
|
57
|
-
private hasContentChanged;
|
|
58
|
-
/**
|
|
59
|
-
* Remove file from hash cache
|
|
60
|
-
*/
|
|
61
|
-
private removeFromHashCache;
|
|
62
|
-
/**
|
|
63
|
-
* Create ignore filter from .gitignore
|
|
64
|
-
*/
|
|
65
|
-
private createIgnoreFilter;
|
|
66
|
-
/**
|
|
67
|
-
* Check if a file should be indexed
|
|
68
|
-
*/
|
|
69
|
-
private shouldIndex;
|
|
70
|
-
/**
|
|
71
|
-
* Schedule a file change with debouncing
|
|
72
|
-
*/
|
|
73
|
-
private scheduleChange;
|
|
74
|
-
/**
|
|
75
|
-
* Process a file change after debounce
|
|
76
|
-
*/
|
|
77
|
-
private processChange;
|
|
78
|
-
/**
|
|
79
|
-
* Index a single file
|
|
80
|
-
*/
|
|
81
|
-
private indexFile;
|
|
82
|
-
/**
|
|
83
|
-
* Remove a file from the index
|
|
84
|
-
*/
|
|
85
|
-
private removeFile;
|
|
86
|
-
/**
|
|
87
|
-
* Queue an operation to prevent concurrent modifications
|
|
88
|
-
*/
|
|
89
|
-
private queueOperation;
|
|
90
|
-
/**
|
|
91
|
-
* Process queued operations sequentially
|
|
92
|
-
*/
|
|
93
|
-
private processQueue;
|
|
94
|
-
/**
|
|
95
|
-
* Collect files using fast-glob
|
|
96
|
-
*/
|
|
97
|
-
private collectFilesWithGlob;
|
|
98
|
-
/**
|
|
99
|
-
* Perform full initial indexing
|
|
100
|
-
*/
|
|
101
|
-
private fullIndex;
|
|
102
|
-
/**
|
|
103
|
-
* Start watching for file changes
|
|
104
|
-
*/
|
|
105
|
-
start(): Promise<void>;
|
|
106
|
-
/**
|
|
107
|
-
* Stop watching and cleanup
|
|
108
|
-
*/
|
|
109
|
-
stop(): Promise<void>;
|
|
110
|
-
/**
|
|
111
|
-
* Check if watcher is running
|
|
112
|
-
*/
|
|
113
|
-
isRunning(): boolean;
|
|
114
|
-
/**
|
|
115
|
-
* Clear the hash cache
|
|
116
|
-
*/
|
|
117
|
-
clearCache(): void;
|
|
118
|
-
/**
|
|
119
|
-
* Get cache statistics
|
|
120
|
-
*/
|
|
121
|
-
getCacheStats(): {
|
|
122
|
-
cachedFiles: number;
|
|
123
|
-
cacheSize: number;
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Create a new index watcher
|
|
128
|
-
*/
|
|
129
|
-
export declare function createIndexWatcher(options: WatcherOptions): IndexWatcher;
|
|
130
|
-
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/core/embeddings/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAiB9D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAUD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,cAAc,CAA+B;IAErD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA6B;gBAE5C,OAAO,EAAE,cAAc;IAgBnC;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAkBnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;YACW,aAAa;IAW3B;;OAEG;YACW,SAAS;IAsDvB;;OAEG;YACW,UAAU;IAexB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;YACW,YAAY;IAsB1B;;OAEG;YACW,oBAAoB;IAsBlC;;OAEG;YACW,SAAS;IAyDvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmE5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,UAAU,IAAI,IAAI;IASlB;;OAEG;IACH,aAAa,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAM5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAExE"}
|