@liendev/core 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +10 -26
  2. package/dist/config/global-config.d.ts +37 -0
  3. package/dist/config/global-config.d.ts.map +1 -0
  4. package/dist/config/global-config.js +160 -0
  5. package/dist/config/global-config.js.map +1 -0
  6. package/dist/config/merge.js +1 -1
  7. package/dist/config/merge.js.map +1 -1
  8. package/dist/config/schema.d.ts +8 -1
  9. package/dist/config/schema.d.ts.map +1 -1
  10. package/dist/config/schema.js +2 -2
  11. package/dist/config/schema.js.map +1 -1
  12. package/dist/config/service.d.ts +2 -25
  13. package/dist/config/service.d.ts.map +1 -1
  14. package/dist/config/service.js +4 -79
  15. package/dist/config/service.js.map +1 -1
  16. package/dist/constants.d.ts +0 -1
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +0 -3
  19. package/dist/constants.js.map +1 -1
  20. package/dist/index.d.ts +20 -8
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +25 -9
  23. package/dist/index.js.map +1 -1
  24. package/dist/indexer/ast/chunker.d.ts +2 -0
  25. package/dist/indexer/ast/chunker.d.ts.map +1 -1
  26. package/dist/indexer/ast/chunker.js +13 -7
  27. package/dist/indexer/ast/chunker.js.map +1 -1
  28. package/dist/indexer/change-detector.d.ts +2 -3
  29. package/dist/indexer/change-detector.d.ts.map +1 -1
  30. package/dist/indexer/change-detector.js +19 -34
  31. package/dist/indexer/change-detector.js.map +1 -1
  32. package/dist/indexer/chunk-batch-processor.d.ts +2 -2
  33. package/dist/indexer/chunk-batch-processor.d.ts.map +1 -1
  34. package/dist/indexer/chunk-batch-processor.js.map +1 -1
  35. package/dist/indexer/chunker.d.ts +2 -0
  36. package/dist/indexer/chunker.d.ts.map +1 -1
  37. package/dist/indexer/chunker.js +9 -5
  38. package/dist/indexer/chunker.js.map +1 -1
  39. package/dist/indexer/incremental.d.ts +4 -4
  40. package/dist/indexer/incremental.d.ts.map +1 -1
  41. package/dist/indexer/incremental.js +35 -23
  42. package/dist/indexer/incremental.js.map +1 -1
  43. package/dist/indexer/index.d.ts +3 -1
  44. package/dist/indexer/index.d.ts.map +1 -1
  45. package/dist/indexer/index.js +109 -47
  46. package/dist/indexer/index.js.map +1 -1
  47. package/dist/indexer/json-template-chunker.d.ts +4 -1
  48. package/dist/indexer/json-template-chunker.d.ts.map +1 -1
  49. package/dist/indexer/json-template-chunker.js +3 -1
  50. package/dist/indexer/json-template-chunker.js.map +1 -1
  51. package/dist/indexer/liquid-chunker.d.ts +4 -1
  52. package/dist/indexer/liquid-chunker.d.ts.map +1 -1
  53. package/dist/indexer/liquid-chunker.js +16 -14
  54. package/dist/indexer/liquid-chunker.js.map +1 -1
  55. package/dist/indexer/progress-tracker.d.ts +3 -1
  56. package/dist/indexer/progress-tracker.d.ts.map +1 -1
  57. package/dist/indexer/progress-tracker.js +8 -2
  58. package/dist/indexer/progress-tracker.js.map +1 -1
  59. package/dist/indexer/scanner.d.ts.map +1 -1
  60. package/dist/indexer/scanner.js +28 -6
  61. package/dist/indexer/scanner.js.map +1 -1
  62. package/dist/indexer/types.d.ts +12 -0
  63. package/dist/indexer/types.d.ts.map +1 -1
  64. package/dist/insights/complexity-analyzer.d.ts +6 -5
  65. package/dist/insights/complexity-analyzer.d.ts.map +1 -1
  66. package/dist/insights/complexity-analyzer.js +33 -14
  67. package/dist/insights/complexity-analyzer.js.map +1 -1
  68. package/dist/test/helpers/mock-embeddings.d.ts +12 -0
  69. package/dist/test/helpers/mock-embeddings.d.ts.map +1 -0
  70. package/dist/test/helpers/mock-embeddings.js +43 -0
  71. package/dist/test/helpers/mock-embeddings.js.map +1 -0
  72. package/dist/test/helpers/test-db.d.ts +21 -0
  73. package/dist/test/helpers/test-db.d.ts.map +1 -0
  74. package/dist/test/helpers/test-db.js +48 -0
  75. package/dist/test/helpers/test-db.js.map +1 -0
  76. package/dist/vectordb/factory.d.ts +15 -0
  77. package/dist/vectordb/factory.d.ts.map +1 -0
  78. package/dist/vectordb/factory.js +64 -0
  79. package/dist/vectordb/factory.js.map +1 -0
  80. package/dist/vectordb/qdrant-payload-mapper.d.ts +47 -0
  81. package/dist/vectordb/qdrant-payload-mapper.d.ts.map +1 -0
  82. package/dist/vectordb/qdrant-payload-mapper.js +78 -0
  83. package/dist/vectordb/qdrant-payload-mapper.js.map +1 -0
  84. package/dist/vectordb/qdrant.d.ts +87 -0
  85. package/dist/vectordb/qdrant.d.ts.map +1 -0
  86. package/dist/vectordb/qdrant.js +462 -0
  87. package/dist/vectordb/qdrant.js.map +1 -0
  88. package/dist/vectordb/types.d.ts +11 -1
  89. package/dist/vectordb/types.d.ts.map +1 -1
  90. package/package.json +2 -1
  91. package/dist/config/loader.d.ts +0 -12
  92. package/dist/config/loader.d.ts.map +0 -1
  93. package/dist/config/loader.js +0 -46
  94. package/dist/config/loader.js.map +0 -1
  95. package/dist/config/migration-manager.d.ts +0 -46
  96. package/dist/config/migration-manager.d.ts.map +0 -1
  97. package/dist/config/migration-manager.js +0 -119
  98. package/dist/config/migration-manager.js.map +0 -1
  99. package/dist/config/migration.d.ts +0 -20
  100. package/dist/config/migration.d.ts.map +0 -1
  101. package/dist/config/migration.js +0 -155
  102. package/dist/config/migration.js.map +0 -1
@@ -0,0 +1,48 @@
1
+ import { VectorDB } from '../../vectordb/lancedb.js';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ /**
6
+ * Creates a temporary test directory for database operations
7
+ */
8
+ export async function createTestDir() {
9
+ const tmpBase = path.join(os.tmpdir(), 'lien-test');
10
+ await fs.mkdir(tmpBase, { recursive: true });
11
+ const testDir = path.join(tmpBase, `test-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`);
12
+ await fs.mkdir(testDir, { recursive: true });
13
+ return testDir;
14
+ }
15
+ /**
16
+ * Cleans up a test directory
17
+ */
18
+ export async function cleanupTestDir(testDir) {
19
+ try {
20
+ await fs.rm(testDir, { recursive: true, force: true });
21
+ }
22
+ catch (error) {
23
+ // Ignore cleanup errors
24
+ console.warn(`Failed to cleanup test directory ${testDir}:`, error);
25
+ }
26
+ }
27
+ /**
28
+ * Creates a VectorDB instance for testing with automatic cleanup
29
+ */
30
+ export async function createTestVectorDB() {
31
+ const testDir = await createTestDir();
32
+ const db = new VectorDB(testDir);
33
+ await db.initialize();
34
+ const cleanup = async () => {
35
+ await cleanupTestDir(testDir);
36
+ };
37
+ return { db, cleanup };
38
+ }
39
+ /**
40
+ * Creates a test file in a directory
41
+ */
42
+ export async function createTestFile(dir, filename, content) {
43
+ const filepath = path.join(dir, filename);
44
+ await fs.mkdir(path.dirname(filepath), { recursive: true });
45
+ await fs.writeFile(filepath, content, 'utf-8');
46
+ return filepath;
47
+ }
48
+ //# sourceMappingURL=test-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-db.js","sourceRoot":"","sources":["../../../src/test/helpers/test-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACnG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wBAAwB;QACxB,OAAO,CAAC,IAAI,CAAC,oCAAoC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;IAEtB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,OAAe;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { VectorDBInterface } from './types.js';
2
+ /**
3
+ * Factory function to create a VectorDB instance based on global configuration.
4
+ *
5
+ * Selects the backend (LanceDB or Qdrant) based on global config.
6
+ * Defaults to LanceDB if no config is provided.
7
+ *
8
+ * For Qdrant backend, automatically detects orgId from git remote URL.
9
+ *
10
+ * @param projectRoot - Root directory of the project
11
+ * @returns VectorDBInterface instance (LanceDB or QdrantDB)
12
+ * @throws Error if Qdrant config is invalid or orgId cannot be detected
13
+ */
14
+ export declare function createVectorDB(projectRoot: string): Promise<VectorDBInterface>;
15
+ //# 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,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAK/C;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAwD5B"}
@@ -0,0 +1,64 @@
1
+ import { VectorDB } from './lancedb.js';
2
+ import { QdrantDB } from './qdrant.js';
3
+ import { loadGlobalConfig, extractOrgIdFromGit } from '../config/global-config.js';
4
+ /**
5
+ * Factory function to create a VectorDB instance based on global configuration.
6
+ *
7
+ * Selects the backend (LanceDB or Qdrant) based on global config.
8
+ * Defaults to LanceDB if no config is provided.
9
+ *
10
+ * For Qdrant backend, automatically detects orgId from git remote URL.
11
+ *
12
+ * @param projectRoot - Root directory of the project
13
+ * @returns VectorDBInterface instance (LanceDB or QdrantDB)
14
+ * @throws Error if Qdrant config is invalid or orgId cannot be detected
15
+ */
16
+ export async function createVectorDB(projectRoot) {
17
+ try {
18
+ const globalConfig = await loadGlobalConfig();
19
+ // Default to LanceDB if no backend specified or backend is lancedb
20
+ if (!globalConfig.backend || globalConfig.backend === 'lancedb') {
21
+ const db = new VectorDB(projectRoot);
22
+ // Verify it has the required methods
23
+ if (typeof db.initialize !== 'function') {
24
+ throw new Error('VectorDB instance missing initialize method');
25
+ }
26
+ return db;
27
+ }
28
+ // Create QdrantDB instance
29
+ if (globalConfig.backend === 'qdrant') {
30
+ if (!globalConfig.qdrant) {
31
+ throw new Error('Qdrant backend requires qdrant configuration in global config');
32
+ }
33
+ const { url, apiKey } = globalConfig.qdrant;
34
+ if (!url) {
35
+ throw new Error('Qdrant backend requires qdrant.url in global config');
36
+ }
37
+ // Auto-detect orgId from git remote
38
+ const orgId = await extractOrgIdFromGit(projectRoot);
39
+ if (!orgId) {
40
+ throw new Error('Qdrant backend requires a git repository with a remote URL. ' +
41
+ 'Could not extract organization ID from git remote. ' +
42
+ 'Make sure your project is a git repo with a remote configured (e.g., origin).');
43
+ }
44
+ const db = new QdrantDB(url, apiKey, orgId, projectRoot);
45
+ // Verify it has the required methods
46
+ if (typeof db.initialize !== 'function') {
47
+ throw new Error('QdrantDB instance missing initialize method');
48
+ }
49
+ return db;
50
+ }
51
+ // Unknown backend - fallback to LanceDB
52
+ throw new Error(`Unknown storage backend: ${globalConfig.backend}. Supported backends: 'lancedb', 'qdrant'`);
53
+ }
54
+ catch (error) {
55
+ // If anything goes wrong, fall back to LanceDB
56
+ console.warn(`[Lien] Error creating vector DB, falling back to LanceDB: ${error}`);
57
+ const db = new VectorDB(projectRoot);
58
+ if (typeof db.initialize !== 'function') {
59
+ throw new Error(`Failed to create VectorDB: ${error instanceof Error ? error.message : String(error)}`);
60
+ }
61
+ return db;
62
+ }
63
+ }
64
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/vectordb/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEnF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAE9C,mEAAmE;QACnE,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;YACrC,qCAAqC;YACrC,IAAI,OAAO,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,2BAA2B;QAC3B,IAAI,YAAY,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnF,CAAC;YAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC;YAE5C,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;YAED,oCAAoC;YACpC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAErD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACb,8DAA8D;oBAC9D,qDAAqD;oBACrD,+EAA+E,CAChF,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACzD,qCAAqC;YACrC,IAAI,OAAO,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,wCAAwC;QACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,CAAC,OAAO,2CAA2C,CAAC,CAAC;IAC/G,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+CAA+C;QAC/C,OAAO,CAAC,IAAI,CAAC,6DAA6D,KAAK,EAAE,CAAC,CAAC;QACnF,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1G,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { ChunkMetadata } from '../indexer/types.js';
2
+ /**
3
+ * Qdrant payload structure for storing chunk metadata.
4
+ */
5
+ export interface QdrantPayload {
6
+ content: string;
7
+ file: string;
8
+ startLine: number;
9
+ endLine: number;
10
+ type: string;
11
+ language: string;
12
+ functionNames: string[];
13
+ classNames: string[];
14
+ interfaceNames: string[];
15
+ symbolName: string;
16
+ symbolType: string;
17
+ parentClass: string;
18
+ complexity: number;
19
+ cognitiveComplexity: number;
20
+ parameters: string[];
21
+ signature: string;
22
+ imports: string[];
23
+ halsteadVolume: number;
24
+ halsteadDifficulty: number;
25
+ halsteadEffort: number;
26
+ halsteadBugs: number;
27
+ orgId: string;
28
+ repoId: string;
29
+ }
30
+ /**
31
+ * Maps between ChunkMetadata and Qdrant payload format.
32
+ * Encapsulates the transformation logic for multi-tenant Qdrant storage.
33
+ */
34
+ export declare class QdrantPayloadMapper {
35
+ private orgId;
36
+ private repoId;
37
+ constructor(orgId: string, repoId: string);
38
+ /**
39
+ * Transform chunk metadata to Qdrant payload format.
40
+ */
41
+ toPayload(metadata: ChunkMetadata, content?: string): QdrantPayload;
42
+ /**
43
+ * Transform Qdrant payload back to ChunkMetadata.
44
+ */
45
+ fromPayload(payload: Record<string, any>): ChunkMetadata;
46
+ }
47
+ //# sourceMappingURL=qdrant-payload-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-payload-mapper.d.ts","sourceRoot":"","sources":["../../src/vectordb/qdrant-payload-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IAEjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IAErB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;gBADN,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAGxB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,GAAE,MAAW,GAAG,aAAa;IAgCvE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,aAAa;CA4BzD"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Maps between ChunkMetadata and Qdrant payload format.
3
+ * Encapsulates the transformation logic for multi-tenant Qdrant storage.
4
+ */
5
+ export class QdrantPayloadMapper {
6
+ orgId;
7
+ repoId;
8
+ constructor(orgId, repoId) {
9
+ this.orgId = orgId;
10
+ this.repoId = repoId;
11
+ }
12
+ /**
13
+ * Transform chunk metadata to Qdrant payload format.
14
+ */
15
+ toPayload(metadata, content = '') {
16
+ return {
17
+ content,
18
+ file: metadata.file,
19
+ startLine: metadata.startLine,
20
+ endLine: metadata.endLine,
21
+ type: metadata.type,
22
+ language: metadata.language,
23
+ // Symbols
24
+ functionNames: metadata.symbols?.functions || [],
25
+ classNames: metadata.symbols?.classes || [],
26
+ interfaceNames: metadata.symbols?.interfaces || [],
27
+ // AST-derived metadata
28
+ symbolName: metadata.symbolName || '',
29
+ symbolType: metadata.symbolType || '',
30
+ parentClass: metadata.parentClass || '',
31
+ complexity: metadata.complexity || 0,
32
+ cognitiveComplexity: metadata.cognitiveComplexity || 0,
33
+ parameters: metadata.parameters || [],
34
+ signature: metadata.signature || '',
35
+ imports: metadata.imports || [],
36
+ // Halstead metrics
37
+ halsteadVolume: metadata.halsteadVolume || 0,
38
+ halsteadDifficulty: metadata.halsteadDifficulty || 0,
39
+ halsteadEffort: metadata.halsteadEffort || 0,
40
+ halsteadBugs: metadata.halsteadBugs || 0,
41
+ // Multi-tenant fields
42
+ orgId: this.orgId,
43
+ repoId: this.repoId,
44
+ };
45
+ }
46
+ /**
47
+ * Transform Qdrant payload back to ChunkMetadata.
48
+ */
49
+ fromPayload(payload) {
50
+ return {
51
+ file: payload.file,
52
+ startLine: payload.startLine,
53
+ endLine: payload.endLine,
54
+ type: payload.type,
55
+ language: payload.language,
56
+ symbols: {
57
+ functions: payload.functionNames || [],
58
+ classes: payload.classNames || [],
59
+ interfaces: payload.interfaceNames || [],
60
+ },
61
+ symbolName: payload.symbolName || undefined,
62
+ symbolType: payload.symbolType || undefined,
63
+ parentClass: payload.parentClass || undefined,
64
+ complexity: payload.complexity || undefined,
65
+ cognitiveComplexity: payload.cognitiveComplexity || undefined,
66
+ parameters: payload.parameters || undefined,
67
+ signature: payload.signature || undefined,
68
+ imports: payload.imports || undefined,
69
+ halsteadVolume: payload.halsteadVolume || undefined,
70
+ halsteadDifficulty: payload.halsteadDifficulty || undefined,
71
+ halsteadEffort: payload.halsteadEffort || undefined,
72
+ halsteadBugs: payload.halsteadBugs || undefined,
73
+ repoId: payload.repoId || undefined,
74
+ orgId: payload.orgId || undefined,
75
+ };
76
+ }
77
+ }
78
+ //# sourceMappingURL=qdrant-payload-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-payload-mapper.js","sourceRoot":"","sources":["../../src/vectordb/qdrant-payload-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { SearchResult, VectorDBInterface } from './types.js';
2
+ import { ChunkMetadata } from '../indexer/types.js';
3
+ /**
4
+ * QdrantDB implements VectorDBInterface using Qdrant vector database.
5
+ *
6
+ * Features:
7
+ * - Multi-tenant support via payload filtering (orgId/repoId)
8
+ * - Collection naming: `lien_org_{orgId}`
9
+ * - Cross-repo search by omitting repoId filter
10
+ * - Tenant isolation via orgId filtering
11
+ */
12
+ export declare class QdrantDB implements VectorDBInterface {
13
+ private client;
14
+ private collectionName;
15
+ private orgId;
16
+ private repoId;
17
+ private initialized;
18
+ readonly dbPath: string;
19
+ private lastVersionCheck;
20
+ private currentVersion;
21
+ private payloadMapper;
22
+ constructor(url: string, apiKey: string | undefined, orgId: string, projectRoot: string);
23
+ /**
24
+ * Extract repository identifier from project root.
25
+ * Uses project name + path hash for stable, unique identification.
26
+ */
27
+ private extractRepoId;
28
+ /**
29
+ * Generate a unique point ID from chunk metadata.
30
+ * Uses hash of file path + line range for stable identification.
31
+ */
32
+ private generatePointId;
33
+ initialize(): Promise<void>;
34
+ insertBatch(vectors: Float32Array[], metadatas: ChunkMetadata[], contents: string[]): Promise<void>;
35
+ search(queryVector: Float32Array, limit?: number, _query?: string): Promise<SearchResult[]>;
36
+ /**
37
+ * Search across all repos in the organization (cross-repo search).
38
+ * Omits repoId filter to enable cross-repo queries.
39
+ */
40
+ searchCrossRepo(queryVector: Float32Array, limit?: number, repoIds?: string[]): Promise<SearchResult[]>;
41
+ scanWithFilter(options: {
42
+ language?: string;
43
+ pattern?: string;
44
+ limit?: number;
45
+ }): Promise<SearchResult[]>;
46
+ scanAll(options?: {
47
+ language?: string;
48
+ pattern?: string;
49
+ }): Promise<SearchResult[]>;
50
+ /**
51
+ * Scan with filter across all repos in the organization (cross-repo).
52
+ * Omits repoId filter to enable cross-repo queries.
53
+ */
54
+ scanCrossRepo(options: {
55
+ language?: string;
56
+ pattern?: string;
57
+ limit?: number;
58
+ repoIds?: string[];
59
+ }): Promise<SearchResult[]>;
60
+ querySymbols(options: {
61
+ language?: string;
62
+ pattern?: string;
63
+ symbolType?: 'function' | 'class' | 'interface';
64
+ limit?: number;
65
+ }): Promise<SearchResult[]>;
66
+ clear(): Promise<void>;
67
+ deleteByFile(filepath: string): Promise<void>;
68
+ updateFile(filepath: string, vectors: Float32Array[], metadatas: ChunkMetadata[], contents: string[]): Promise<void>;
69
+ hasData(): Promise<boolean>;
70
+ /**
71
+ * Get the collection name (useful for debugging).
72
+ */
73
+ getCollectionName(): string;
74
+ /**
75
+ * Get the organization ID.
76
+ */
77
+ getOrgId(): string;
78
+ /**
79
+ * Get the repository ID.
80
+ */
81
+ getRepoId(): string;
82
+ checkVersion(): Promise<boolean>;
83
+ reconnect(): Promise<void>;
84
+ getCurrentVersion(): number;
85
+ getVersionDate(): string;
86
+ }
87
+ //# sourceMappingURL=qdrant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant.d.ts","sourceRoot":"","sources":["../../src/vectordb/qdrant.ts"],"names":[],"mappings":"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"}