@mcampa/ai-context-core 0.0.1 → 0.0.2-beta.357ea87

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.
Files changed (109) hide show
  1. package/README.md +55 -47
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/context.d.ts +30 -5
  4. package/dist/context.d.ts.map +1 -1
  5. package/dist/context.js +160 -16
  6. package/dist/context.js.map +1 -1
  7. package/dist/embedding/base-embedding.d.ts.map +1 -1
  8. package/dist/embedding/base-embedding.js +4 -0
  9. package/dist/embedding/base-embedding.js.map +1 -1
  10. package/dist/embedding/gemini-embedding.d.ts +43 -1
  11. package/dist/embedding/gemini-embedding.d.ts.map +1 -1
  12. package/dist/embedding/gemini-embedding.js +164 -26
  13. package/dist/embedding/gemini-embedding.js.map +1 -1
  14. package/dist/embedding/huggingface-embedding.d.ts +70 -0
  15. package/dist/embedding/huggingface-embedding.d.ts.map +1 -0
  16. package/dist/embedding/huggingface-embedding.js +270 -0
  17. package/dist/embedding/huggingface-embedding.js.map +1 -0
  18. package/dist/embedding/index.d.ts +3 -2
  19. package/dist/embedding/index.d.ts.map +1 -1
  20. package/dist/embedding/index.js +3 -2
  21. package/dist/embedding/index.js.map +1 -1
  22. package/dist/embedding/ollama-embedding.d.ts +2 -1
  23. package/dist/embedding/ollama-embedding.d.ts.map +1 -1
  24. package/dist/embedding/ollama-embedding.js +2 -3
  25. package/dist/embedding/ollama-embedding.js.map +1 -1
  26. package/dist/embedding/openai-embedding.d.ts +2 -1
  27. package/dist/embedding/openai-embedding.d.ts.map +1 -1
  28. package/dist/embedding/openai-embedding.js +3 -3
  29. package/dist/embedding/openai-embedding.js.map +1 -1
  30. package/dist/embedding/voyageai-embedding.d.ts +2 -1
  31. package/dist/embedding/voyageai-embedding.d.ts.map +1 -1
  32. package/dist/embedding/voyageai-embedding.js +2 -2
  33. package/dist/embedding/voyageai-embedding.js.map +1 -1
  34. package/dist/index.d.ts +4 -4
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4 -4
  37. package/dist/index.js.map +1 -1
  38. package/dist/splitter/ast-splitter.d.ts +1 -1
  39. package/dist/splitter/ast-splitter.d.ts.map +1 -1
  40. package/dist/splitter/ast-splitter.js +7 -7
  41. package/dist/splitter/ast-splitter.js.map +1 -1
  42. package/dist/splitter/index.d.ts +4 -4
  43. package/dist/splitter/index.d.ts.map +1 -1
  44. package/dist/splitter/index.js +1 -1
  45. package/dist/splitter/index.js.map +1 -1
  46. package/dist/splitter/langchain-splitter.d.ts +1 -1
  47. package/dist/splitter/langchain-splitter.d.ts.map +1 -1
  48. package/dist/splitter/langchain-splitter.js +2 -2
  49. package/dist/splitter/langchain-splitter.js.map +1 -1
  50. package/dist/sync/merkle.js +1 -1
  51. package/dist/sync/merkle.js.map +1 -1
  52. package/dist/sync/synchronizer.js +6 -6
  53. package/dist/sync/synchronizer.js.map +1 -1
  54. package/dist/utils/env-manager.js +4 -4
  55. package/dist/utils/env-manager.js.map +1 -1
  56. package/dist/vectordb/base/base-vector-database.d.ts +58 -0
  57. package/dist/vectordb/base/base-vector-database.d.ts.map +1 -0
  58. package/dist/vectordb/base/base-vector-database.js +32 -0
  59. package/dist/vectordb/base/base-vector-database.js.map +1 -0
  60. package/dist/vectordb/factory.d.ts +113 -0
  61. package/dist/vectordb/factory.d.ts.map +1 -0
  62. package/dist/vectordb/factory.js +170 -0
  63. package/dist/vectordb/factory.js.map +1 -0
  64. package/dist/vectordb/faiss-vectordb.d.ts +162 -0
  65. package/dist/vectordb/faiss-vectordb.d.ts.map +1 -0
  66. package/dist/vectordb/faiss-vectordb.js +777 -0
  67. package/dist/vectordb/faiss-vectordb.js.map +1 -0
  68. package/dist/vectordb/index.d.ts +13 -4
  69. package/dist/vectordb/index.d.ts.map +1 -1
  70. package/dist/vectordb/index.js +39 -5
  71. package/dist/vectordb/index.js.map +1 -1
  72. package/dist/vectordb/libsql-vectordb.d.ts +170 -0
  73. package/dist/vectordb/libsql-vectordb.d.ts.map +1 -0
  74. package/dist/vectordb/libsql-vectordb.js +837 -0
  75. package/dist/vectordb/libsql-vectordb.js.map +1 -0
  76. package/dist/vectordb/milvus-restful-vectordb.d.ts +12 -11
  77. package/dist/vectordb/milvus-restful-vectordb.d.ts.map +1 -1
  78. package/dist/vectordb/milvus-restful-vectordb.js +29 -31
  79. package/dist/vectordb/milvus-restful-vectordb.js.map +1 -1
  80. package/dist/vectordb/milvus-vectordb.d.ts +12 -12
  81. package/dist/vectordb/milvus-vectordb.d.ts.map +1 -1
  82. package/dist/vectordb/milvus-vectordb.js +31 -28
  83. package/dist/vectordb/milvus-vectordb.js.map +1 -1
  84. package/dist/vectordb/qdrant-vectordb.d.ts +149 -0
  85. package/dist/vectordb/qdrant-vectordb.d.ts.map +1 -0
  86. package/dist/vectordb/qdrant-vectordb.js +856 -0
  87. package/dist/vectordb/qdrant-vectordb.js.map +1 -0
  88. package/dist/vectordb/sparse/index.d.ts +4 -0
  89. package/dist/vectordb/sparse/index.d.ts.map +1 -0
  90. package/dist/vectordb/sparse/index.js +23 -0
  91. package/dist/vectordb/sparse/index.js.map +1 -0
  92. package/dist/vectordb/sparse/simple-bm25.d.ts +115 -0
  93. package/dist/vectordb/sparse/simple-bm25.d.ts.map +1 -0
  94. package/dist/vectordb/sparse/simple-bm25.js +249 -0
  95. package/dist/vectordb/sparse/simple-bm25.js.map +1 -0
  96. package/dist/vectordb/sparse/sparse-vector-generator.d.ts +54 -0
  97. package/dist/vectordb/sparse/sparse-vector-generator.d.ts.map +1 -0
  98. package/dist/vectordb/sparse/sparse-vector-generator.js +3 -0
  99. package/dist/vectordb/sparse/sparse-vector-generator.js.map +1 -0
  100. package/dist/vectordb/sparse/types.d.ts +38 -0
  101. package/dist/vectordb/sparse/types.d.ts.map +1 -0
  102. package/dist/vectordb/sparse/types.js +3 -0
  103. package/dist/vectordb/sparse/types.js.map +1 -0
  104. package/dist/vectordb/types.d.ts +16 -16
  105. package/dist/vectordb/types.d.ts.map +1 -1
  106. package/dist/vectordb/types.js.map +1 -1
  107. package/dist/vectordb/zilliz-utils.js +3 -3
  108. package/dist/vectordb/zilliz-utils.js.map +1 -1
  109. package/package.json +32 -22
@@ -0,0 +1,58 @@
1
+ import type { HybridSearchOptions, HybridSearchRequest, HybridSearchResult, SearchOptions, VectorDatabase, VectorDocument, VectorSearchResult } from "../types";
2
+ /**
3
+ * Base configuration interface for all vector databases
4
+ */
5
+ export interface BaseDatabaseConfig {
6
+ address?: string;
7
+ token?: string;
8
+ username?: string;
9
+ password?: string;
10
+ }
11
+ /**
12
+ * Abstract base class for vector database implementations
13
+ *
14
+ * Provides common functionality:
15
+ * - Asynchronous initialization pattern
16
+ * - Configuration management
17
+ * - Address resolution
18
+ *
19
+ * Subclasses must implement:
20
+ * - initialize(): Database-specific initialization logic
21
+ * - All VectorDatabase interface methods
22
+ *
23
+ * @template TConfig - The configuration type for the database
24
+ */
25
+ export declare abstract class BaseVectorDatabase<TConfig extends BaseDatabaseConfig = BaseDatabaseConfig> implements VectorDatabase {
26
+ protected config: TConfig;
27
+ protected initializationPromise: Promise<void>;
28
+ constructor(config: TConfig);
29
+ /**
30
+ * Initialize the database connection
31
+ * Called automatically in constructor
32
+ * Subclasses should implement database-specific initialization
33
+ */
34
+ protected abstract initialize(): Promise<void>;
35
+ /**
36
+ * Ensure initialization is complete before method execution
37
+ * Should be called at the start of every public method
38
+ */
39
+ protected ensureInitialized(): Promise<void>;
40
+ /**
41
+ * Ensure collection is loaded before search/query operations
42
+ * Subclasses should implement database-specific loading logic
43
+ */
44
+ protected abstract ensureLoaded(collectionName: string): Promise<void>;
45
+ abstract createCollection(collectionName: string, dimension: number, description?: string): Promise<void>;
46
+ abstract createHybridCollection(collectionName: string, dimension: number, description?: string): Promise<void>;
47
+ abstract dropCollection(collectionName: string): Promise<void>;
48
+ abstract hasCollection(collectionName: string): Promise<boolean>;
49
+ abstract listCollections(): Promise<string[]>;
50
+ abstract insert(collectionName: string, documents: VectorDocument[]): Promise<void>;
51
+ abstract insertHybrid(collectionName: string, documents: VectorDocument[]): Promise<void>;
52
+ abstract search(collectionName: string, queryVector: number[], options?: SearchOptions): Promise<VectorSearchResult[]>;
53
+ abstract hybridSearch(collectionName: string, searchRequests: HybridSearchRequest[], options?: HybridSearchOptions): Promise<HybridSearchResult[]>;
54
+ abstract delete(collectionName: string, ids: string[]): Promise<void>;
55
+ abstract query(collectionName: string, filter: string, outputFields: string[], limit?: number): Promise<Record<string, any>[]>;
56
+ abstract checkCollectionLimit(): Promise<boolean>;
57
+ }
58
+ //# sourceMappingURL=base-vector-database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-vector-database.d.ts","sourceRoot":"","sources":["../../../src/vectordb/base/base-vector-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,8BAAsB,kBAAkB,CACtC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,CACvD,YAAW,cAAc;IACzB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAEnC,MAAM,EAAE,OAAO;IAK3B;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9C;;;OAGG;cACa,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlD;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGtE,QAAQ,CAAC,gBAAgB,CACvB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,sBAAsB,CAC7B,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9D,QAAQ,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhE,QAAQ,CAAC,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAE7C,QAAQ,CAAC,MAAM,CACb,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,cAAc,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,YAAY,CACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,cAAc,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,MAAM,CACb,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAEhC,QAAQ,CAAC,YAAY,CACnB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,mBAAmB,EAAE,EACrC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAEhC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAErE,QAAQ,CAAC,KAAK,CACZ,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IAEjC,QAAQ,CAAC,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;CAClD"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseVectorDatabase = void 0;
4
+ /**
5
+ * Abstract base class for vector database implementations
6
+ *
7
+ * Provides common functionality:
8
+ * - Asynchronous initialization pattern
9
+ * - Configuration management
10
+ * - Address resolution
11
+ *
12
+ * Subclasses must implement:
13
+ * - initialize(): Database-specific initialization logic
14
+ * - All VectorDatabase interface methods
15
+ *
16
+ * @template TConfig - The configuration type for the database
17
+ */
18
+ class BaseVectorDatabase {
19
+ constructor(config) {
20
+ this.config = config;
21
+ this.initializationPromise = this.initialize();
22
+ }
23
+ /**
24
+ * Ensure initialization is complete before method execution
25
+ * Should be called at the start of every public method
26
+ */
27
+ async ensureInitialized() {
28
+ await this.initializationPromise;
29
+ }
30
+ }
31
+ exports.BaseVectorDatabase = BaseVectorDatabase;
32
+ //# sourceMappingURL=base-vector-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-vector-database.js","sourceRoot":"","sources":["../../../src/vectordb/base/base-vector-database.ts"],"names":[],"mappings":";;;AAoBA;;;;;;;;;;;;;GAaG;AACH,MAAsB,kBAAkB;IAMtC,YAAY,MAAe;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACjD,CAAC;IASD;;;OAGG;IACO,KAAK,CAAC,iBAAiB;QAC/B,MAAM,IAAI,CAAC,qBAAqB,CAAC;IACnC,CAAC;CA2DF;AAnFD,gDAmFC"}
@@ -0,0 +1,113 @@
1
+ import type { FaissConfig } from "./faiss-vectordb";
2
+ import type { LibSQLConfig } from "./libsql-vectordb";
3
+ import type { MilvusRestfulConfig } from "./milvus-restful-vectordb";
4
+ import type { MilvusConfig } from "./milvus-vectordb";
5
+ import type { QdrantConfig } from "./qdrant-vectordb";
6
+ import type { VectorDatabase } from "./types";
7
+ /**
8
+ * Supported vector database types
9
+ */
10
+ export declare enum VectorDatabaseType {
11
+ /**
12
+ * Milvus with gRPC protocol
13
+ * Use for Node.js environments with full gRPC support
14
+ */
15
+ MILVUS_GRPC = "milvus-grpc",
16
+ /**
17
+ * Milvus with RESTful API
18
+ * Use for browser/VSCode extension environments where gRPC is not available
19
+ */
20
+ MILVUS_RESTFUL = "milvus-restful",
21
+ /**
22
+ * Qdrant with gRPC protocol
23
+ * Use for Node.js environments with native hybrid search support
24
+ * Supports both self-hosted and Qdrant Cloud
25
+ */
26
+ QDRANT_GRPC = "qdrant-grpc",
27
+ /**
28
+ * FAISS local file-based vector database
29
+ * Use for local-only deployments with zero configuration
30
+ * Ideal for development and small-to-medium codebases
31
+ */
32
+ FAISS_LOCAL = "faiss-local",
33
+ /**
34
+ * LibSQL local file-based vector database
35
+ * Use for local-only deployments without native bindings
36
+ * Advantages over FAISS: supports deletion, filtering, pure JS
37
+ */
38
+ LIBSQL_LOCAL = "libsql"
39
+ }
40
+ /**
41
+ * Configuration type for each database type
42
+ */
43
+ export interface VectorDatabaseConfig {
44
+ [VectorDatabaseType.MILVUS_GRPC]: MilvusConfig;
45
+ [VectorDatabaseType.MILVUS_RESTFUL]: MilvusRestfulConfig;
46
+ [VectorDatabaseType.QDRANT_GRPC]: QdrantConfig;
47
+ [VectorDatabaseType.FAISS_LOCAL]: FaissConfig;
48
+ [VectorDatabaseType.LIBSQL_LOCAL]: LibSQLConfig;
49
+ }
50
+ /**
51
+ * Factory class for creating vector database instances
52
+ *
53
+ * Usage:
54
+ * ```typescript
55
+ * const db = VectorDatabaseFactory.create(
56
+ * VectorDatabaseType.MILVUS_GRPC,
57
+ * { address: 'localhost:19530', token: 'xxx' }
58
+ * );
59
+ * ```
60
+ */
61
+ export declare class VectorDatabaseFactory {
62
+ /**
63
+ * Create a vector database instance
64
+ *
65
+ * @param type - The type of vector database to create
66
+ * @param config - Configuration for the database
67
+ * @returns A VectorDatabase instance
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * // Create Milvus gRPC database
72
+ * const db = VectorDatabaseFactory.create(
73
+ * VectorDatabaseType.MILVUS_GRPC,
74
+ * { address: 'localhost:19530' }
75
+ * );
76
+ *
77
+ * // Create Milvus RESTful database
78
+ * const restDb = VectorDatabaseFactory.create(
79
+ * VectorDatabaseType.MILVUS_RESTFUL,
80
+ * { address: 'https://your-cluster.com', token: 'xxx' }
81
+ * );
82
+ *
83
+ * // Create Qdrant gRPC database
84
+ * const qdrantDb = VectorDatabaseFactory.create(
85
+ * VectorDatabaseType.QDRANT_GRPC,
86
+ * { address: 'localhost:6334', apiKey: 'xxx' }
87
+ * );
88
+ *
89
+ * // Create FAISS local database
90
+ * const faissDb = VectorDatabaseFactory.create(
91
+ * VectorDatabaseType.FAISS_LOCAL,
92
+ * { storageDir: '~/.context/faiss-indexes' }
93
+ * );
94
+ *
95
+ * // Create LibSQL local database
96
+ * const libsqlDB = VectorDatabaseFactory.create(
97
+ * VectorDatabaseType.LIBSQL_LOCAL,
98
+ * { storageDir: '~/.context/libsql-indexes' }
99
+ * );
100
+ * ```
101
+ */
102
+ static create<T extends VectorDatabaseType>(type: T, config: VectorDatabaseConfig[T]): VectorDatabase;
103
+ /**
104
+ * Get all supported database types
105
+ * Note: FAISS may not be available if native bindings are missing
106
+ */
107
+ static getSupportedTypes(): VectorDatabaseType[];
108
+ /**
109
+ * Check if FAISS is available in the current environment
110
+ */
111
+ static isFaissAvailable(): boolean;
112
+ }
113
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/vectordb/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAqD9C;;GAEG;AACH,oBAAY,kBAAkB;IAC5B;;;OAGG;IACH,WAAW,gBAAgB;IAE3B;;;OAGG;IACH,cAAc,mBAAmB;IAEjC;;;;OAIG;IACH,WAAW,gBAAgB;IAE3B;;;;OAIG;IACH,WAAW,gBAAgB;IAE3B;;;;OAIG;IACH,YAAY,WAAW;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC/C,CAAC,kBAAkB,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACzD,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC/C,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC9C,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACjD;AAED;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,kBAAkB,EACxC,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,cAAc;IA6BjB;;;OAGG;IACH,MAAM,CAAC,iBAAiB,IAAI,kBAAkB,EAAE;IAQhD;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,OAAO;CAGnC"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VectorDatabaseFactory = exports.VectorDatabaseType = void 0;
4
+ const libsql_vectordb_1 = require("./libsql-vectordb");
5
+ const milvus_restful_vectordb_1 = require("./milvus-restful-vectordb");
6
+ const milvus_vectordb_1 = require("./milvus-vectordb");
7
+ const qdrant_vectordb_1 = require("./qdrant-vectordb");
8
+ // FAISS is optional - may not be available in all environments (e.g., CI without native bindings)
9
+ // Use lazy loading to avoid import errors
10
+ let FaissVectorDatabase;
11
+ let faissAvailable = null; // null = not checked yet
12
+ let faissCheckError = null;
13
+ function checkFaissAvailability() {
14
+ if (faissAvailable !== null) {
15
+ return faissAvailable;
16
+ }
17
+ try {
18
+ FaissVectorDatabase = require("./faiss-vectordb").FaissVectorDatabase;
19
+ faissAvailable = true;
20
+ return true;
21
+ }
22
+ catch (error) {
23
+ const errorMsg = error.message || String(error);
24
+ const errorCode = error.code;
25
+ // Treat as "FAISS unavailable" for:
26
+ // 1. Native binding errors (faiss-node not compiled)
27
+ // 2. Module not found errors (module path resolution in test environments)
28
+ const isExpectedUnavailableError = errorMsg.includes("Could not locate the bindings file") ||
29
+ errorMsg.includes("faiss-node") ||
30
+ errorCode === "MODULE_NOT_FOUND";
31
+ if (isExpectedUnavailableError) {
32
+ faissAvailable = false;
33
+ faissCheckError = errorMsg.includes("faiss-node")
34
+ ? "FAISS native bindings not available"
35
+ : "FAISS module not found";
36
+ console.warn(`[VectorDatabaseFactory] ${faissCheckError}. FAISS support disabled.`);
37
+ return false;
38
+ }
39
+ // For syntax errors, type errors, or other real bugs - re-throw
40
+ console.error("[VectorDatabaseFactory] Unexpected error loading FAISS module:", errorMsg);
41
+ throw error;
42
+ }
43
+ }
44
+ /**
45
+ * Supported vector database types
46
+ */
47
+ var VectorDatabaseType;
48
+ (function (VectorDatabaseType) {
49
+ /**
50
+ * Milvus with gRPC protocol
51
+ * Use for Node.js environments with full gRPC support
52
+ */
53
+ VectorDatabaseType["MILVUS_GRPC"] = "milvus-grpc";
54
+ /**
55
+ * Milvus with RESTful API
56
+ * Use for browser/VSCode extension environments where gRPC is not available
57
+ */
58
+ VectorDatabaseType["MILVUS_RESTFUL"] = "milvus-restful";
59
+ /**
60
+ * Qdrant with gRPC protocol
61
+ * Use for Node.js environments with native hybrid search support
62
+ * Supports both self-hosted and Qdrant Cloud
63
+ */
64
+ VectorDatabaseType["QDRANT_GRPC"] = "qdrant-grpc";
65
+ /**
66
+ * FAISS local file-based vector database
67
+ * Use for local-only deployments with zero configuration
68
+ * Ideal for development and small-to-medium codebases
69
+ */
70
+ VectorDatabaseType["FAISS_LOCAL"] = "faiss-local";
71
+ /**
72
+ * LibSQL local file-based vector database
73
+ * Use for local-only deployments without native bindings
74
+ * Advantages over FAISS: supports deletion, filtering, pure JS
75
+ */
76
+ VectorDatabaseType["LIBSQL_LOCAL"] = "libsql";
77
+ })(VectorDatabaseType || (exports.VectorDatabaseType = VectorDatabaseType = {}));
78
+ /**
79
+ * Factory class for creating vector database instances
80
+ *
81
+ * Usage:
82
+ * ```typescript
83
+ * const db = VectorDatabaseFactory.create(
84
+ * VectorDatabaseType.MILVUS_GRPC,
85
+ * { address: 'localhost:19530', token: 'xxx' }
86
+ * );
87
+ * ```
88
+ */
89
+ class VectorDatabaseFactory {
90
+ /**
91
+ * Create a vector database instance
92
+ *
93
+ * @param type - The type of vector database to create
94
+ * @param config - Configuration for the database
95
+ * @returns A VectorDatabase instance
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * // Create Milvus gRPC database
100
+ * const db = VectorDatabaseFactory.create(
101
+ * VectorDatabaseType.MILVUS_GRPC,
102
+ * { address: 'localhost:19530' }
103
+ * );
104
+ *
105
+ * // Create Milvus RESTful database
106
+ * const restDb = VectorDatabaseFactory.create(
107
+ * VectorDatabaseType.MILVUS_RESTFUL,
108
+ * { address: 'https://your-cluster.com', token: 'xxx' }
109
+ * );
110
+ *
111
+ * // Create Qdrant gRPC database
112
+ * const qdrantDb = VectorDatabaseFactory.create(
113
+ * VectorDatabaseType.QDRANT_GRPC,
114
+ * { address: 'localhost:6334', apiKey: 'xxx' }
115
+ * );
116
+ *
117
+ * // Create FAISS local database
118
+ * const faissDb = VectorDatabaseFactory.create(
119
+ * VectorDatabaseType.FAISS_LOCAL,
120
+ * { storageDir: '~/.context/faiss-indexes' }
121
+ * );
122
+ *
123
+ * // Create LibSQL local database
124
+ * const libsqlDB = VectorDatabaseFactory.create(
125
+ * VectorDatabaseType.LIBSQL_LOCAL,
126
+ * { storageDir: '~/.context/libsql-indexes' }
127
+ * );
128
+ * ```
129
+ */
130
+ static create(type, config) {
131
+ switch (type) {
132
+ case VectorDatabaseType.MILVUS_GRPC:
133
+ return new milvus_vectordb_1.MilvusVectorDatabase(config);
134
+ case VectorDatabaseType.MILVUS_RESTFUL:
135
+ return new milvus_restful_vectordb_1.MilvusRestfulVectorDatabase(config);
136
+ case VectorDatabaseType.QDRANT_GRPC:
137
+ return new qdrant_vectordb_1.QdrantVectorDatabase(config);
138
+ case VectorDatabaseType.FAISS_LOCAL:
139
+ if (!checkFaissAvailability()) {
140
+ throw new Error(`FAISS vector database is not available. ${faissCheckError || "Native bindings could not be loaded"}. ` +
141
+ "This usually happens in environments without C++ build tools. " +
142
+ "Please use another vector database type (MILVUS_GRPC, MILVUS_RESTFUL, QDRANT_GRPC, or LIBSQL_LOCAL).");
143
+ }
144
+ return new FaissVectorDatabase(config);
145
+ case VectorDatabaseType.LIBSQL_LOCAL:
146
+ return new libsql_vectordb_1.LibSQLVectorDatabase(config);
147
+ default:
148
+ throw new Error(`Unsupported database type: ${type}`);
149
+ }
150
+ }
151
+ /**
152
+ * Get all supported database types
153
+ * Note: FAISS may not be available if native bindings are missing
154
+ */
155
+ static getSupportedTypes() {
156
+ const types = Object.values(VectorDatabaseType);
157
+ if (!checkFaissAvailability()) {
158
+ return types.filter((t) => t !== VectorDatabaseType.FAISS_LOCAL);
159
+ }
160
+ return types;
161
+ }
162
+ /**
163
+ * Check if FAISS is available in the current environment
164
+ */
165
+ static isFaissAvailable() {
166
+ return checkFaissAvailability();
167
+ }
168
+ }
169
+ exports.VectorDatabaseFactory = VectorDatabaseFactory;
170
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/vectordb/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { BaseDatabaseConfig, BaseVectorDatabase } from "./base/base-vector-database";
2
+ import { BM25Config } from "./sparse/simple-bm25";
3
+ import { HybridSearchOptions, HybridSearchRequest, HybridSearchResult, SearchOptions, VectorDocument, VectorSearchResult } from "./types";
4
+ export interface FaissConfig extends BaseDatabaseConfig {
5
+ /**
6
+ * Storage directory for FAISS indexes
7
+ * @default ~/.context/faiss-indexes
8
+ */
9
+ storageDir?: string;
10
+ /**
11
+ * BM25 configuration for sparse vector generation
12
+ */
13
+ bm25Config?: BM25Config;
14
+ }
15
+ /**
16
+ * FAISS Vector Database implementation for local-only deployments
17
+ *
18
+ * Features:
19
+ * - Zero-configuration file-based storage
20
+ * - Hybrid search with BM25 sparse vectors
21
+ * - RRF (Reciprocal Rank Fusion) reranking
22
+ * - Perfect for local development and small-to-medium codebases
23
+ *
24
+ * Architecture:
25
+ * - Dense vectors: Stored in FAISS IndexFlatL2 (L2 distance)
26
+ * - Sparse vectors: Generated using SimpleBM25 for keyword matching
27
+ * - Hybrid search: Combines both using RRF fusion
28
+ *
29
+ * Storage structure:
30
+ * ~/.context/faiss-indexes/
31
+ * └── {collection_name}/
32
+ * ├── dense.index # FAISS index file
33
+ * ├── sparse.json # BM25 model (vocabulary, IDF)
34
+ * └── metadata.json # Document metadata
35
+ *
36
+ * Limitations:
37
+ * - Document deletion is NOT supported (FAISS IndexFlatL2 limitation)
38
+ * - Query filters are NOT supported (returns all documents)
39
+ * - To remove documents, you must drop and recreate the collection
40
+ */
41
+ export declare class FaissVectorDatabase extends BaseVectorDatabase<FaissConfig> {
42
+ private collections;
43
+ constructor(config: FaissConfig);
44
+ /**
45
+ * Get storage directory (lazily computed from config)
46
+ */
47
+ private get storageDir();
48
+ /**
49
+ * Initialize FAISS storage directory
50
+ */
51
+ protected initialize(): Promise<void>;
52
+ /**
53
+ * FAISS indexes are loaded on-demand when accessed
54
+ */
55
+ protected ensureLoaded(collectionName: string): Promise<void>;
56
+ /**
57
+ * Get collection storage path
58
+ */
59
+ private getCollectionPath;
60
+ /**
61
+ * Load collection from disk
62
+ */
63
+ private loadCollection;
64
+ /**
65
+ * Save collection to disk
66
+ */
67
+ private saveCollection;
68
+ /**
69
+ * Create collection with dense vectors only
70
+ */
71
+ createCollection(collectionName: string, dimension: number, description?: string): Promise<void>;
72
+ /**
73
+ * Create collection with hybrid search support (dense + sparse vectors)
74
+ */
75
+ createHybridCollection(collectionName: string, dimension: number, description?: string): Promise<void>;
76
+ /**
77
+ * Drop collection
78
+ */
79
+ dropCollection(collectionName: string): Promise<void>;
80
+ /**
81
+ * Check if collection exists
82
+ */
83
+ hasCollection(collectionName: string): Promise<boolean>;
84
+ /**
85
+ * List all collections
86
+ */
87
+ listCollections(): Promise<string[]>;
88
+ /**
89
+ * Insert vector documents (dense only)
90
+ */
91
+ insert(collectionName: string, documents: VectorDocument[]): Promise<void>;
92
+ /**
93
+ * Insert hybrid vector documents (dense + sparse)
94
+ */
95
+ insertHybrid(collectionName: string, documents: VectorDocument[]): Promise<void>;
96
+ /**
97
+ * Search similar vectors (dense search only)
98
+ */
99
+ search(collectionName: string, queryVector: number[], options?: SearchOptions): Promise<VectorSearchResult[]>;
100
+ /**
101
+ * Hybrid search with multiple vector fields (dense + sparse)
102
+ */
103
+ hybridSearch(collectionName: string, searchRequests: HybridSearchRequest[], options?: HybridSearchOptions): Promise<HybridSearchResult[]>;
104
+ /**
105
+ * Perform dense vector search using FAISS index
106
+ */
107
+ private performDenseSearch;
108
+ /**
109
+ * Perform sparse search using BM25
110
+ */
111
+ private performSparseSearch;
112
+ /**
113
+ * Calculate sparse vector dot product score
114
+ */
115
+ private calculateSparseScore;
116
+ /**
117
+ * Pre-compute ranks from scores (O(n log n) instead of O(n²))
118
+ */
119
+ private computeRanks;
120
+ /**
121
+ * Apply Reciprocal Rank Fusion (RRF) reranking
122
+ */
123
+ private applyRRF;
124
+ /**
125
+ * Delete documents by IDs
126
+ *
127
+ * ⚠️ NOT IMPLEMENTED: FAISS does not support document deletion
128
+ *
129
+ * The FAISS IndexFlatL2 library does not provide a way to remove vectors
130
+ * from an existing index. To fully remove documents, you must:
131
+ *
132
+ * 1. Drop the collection using dropCollection()
133
+ * 2. Recreate it using createCollection() or createHybridCollection()
134
+ * 3. Re-insert all documents except the ones you want to delete
135
+ *
136
+ * @throws Error Always throws - deletion is not supported
137
+ * @param collectionName Collection name
138
+ * @param ids Document IDs to delete (not used)
139
+ */
140
+ delete(collectionName: string, ids: string[]): Promise<void>;
141
+ /**
142
+ * Query documents with filter conditions
143
+ *
144
+ * ⚠️ LIMITATION: Filter parameter is currently ignored
145
+ *
146
+ * This method returns ALL documents in the collection (up to limit),
147
+ * not filtered results. Filter parsing is not yet implemented for FAISS.
148
+ *
149
+ * @param collectionName Collection name
150
+ * @param filter Filter expression (currently ignored - returns all documents)
151
+ * @param outputFields Fields to return in results
152
+ * @param limit Maximum number of results (only limit is enforced)
153
+ * @returns All documents with specified fields (up to limit)
154
+ */
155
+ query(collectionName: string, filter: string, outputFields: string[], limit?: number): Promise<Record<string, any>[]>;
156
+ /**
157
+ * Check collection limit
158
+ * FAISS has no inherent collection limit (only limited by disk space)
159
+ */
160
+ checkCollectionLimit(): Promise<boolean>;
161
+ }
162
+ //# sourceMappingURL=faiss-vectordb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faiss-vectordb.d.ts","sourceRoot":"","sources":["../../src/vectordb/faiss-vectordb.ts"],"names":[],"mappings":"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"}