@liendev/core 0.19.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +336 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +46 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/merge.d.ts +20 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +71 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/migration-manager.d.ts +46 -0
- package/dist/config/migration-manager.d.ts.map +1 -0
- package/dist/config/migration-manager.js +119 -0
- package/dist/config/migration-manager.js.map +1 -0
- package/dist/config/migration.d.ts +20 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +155 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/schema.d.ts +101 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +58 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/service.d.ts +122 -0
- package/dist/config/service.d.ts.map +1 -0
- package/dist/config/service.js +477 -0
- package/dist/config/service.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +43 -0
- package/dist/constants.js.map +1 -0
- package/dist/embeddings/cache.d.ts +45 -0
- package/dist/embeddings/cache.d.ts.map +1 -0
- package/dist/embeddings/cache.js +109 -0
- package/dist/embeddings/cache.js.map +1 -0
- package/dist/embeddings/local.d.ts +10 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +63 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/types.d.ts +9 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +5 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/errors/codes.d.ts +18 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +25 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/index.d.ts +85 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +134 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/frameworks/detector-service.d.ts +59 -0
- package/dist/frameworks/detector-service.d.ts.map +1 -0
- package/dist/frameworks/detector-service.js +219 -0
- package/dist/frameworks/detector-service.js.map +1 -0
- package/dist/frameworks/laravel/config.d.ts +6 -0
- package/dist/frameworks/laravel/config.d.ts.map +1 -0
- package/dist/frameworks/laravel/config.js +68 -0
- package/dist/frameworks/laravel/config.js.map +1 -0
- package/dist/frameworks/laravel/detector.d.ts +6 -0
- package/dist/frameworks/laravel/detector.d.ts.map +1 -0
- package/dist/frameworks/laravel/detector.js +96 -0
- package/dist/frameworks/laravel/detector.js.map +1 -0
- package/dist/frameworks/nodejs/config.d.ts +6 -0
- package/dist/frameworks/nodejs/config.d.ts.map +1 -0
- package/dist/frameworks/nodejs/config.js +57 -0
- package/dist/frameworks/nodejs/config.js.map +1 -0
- package/dist/frameworks/nodejs/detector.d.ts +6 -0
- package/dist/frameworks/nodejs/detector.d.ts.map +1 -0
- package/dist/frameworks/nodejs/detector.js +77 -0
- package/dist/frameworks/nodejs/detector.js.map +1 -0
- package/dist/frameworks/php/config.d.ts +6 -0
- package/dist/frameworks/php/config.d.ts.map +1 -0
- package/dist/frameworks/php/config.js +53 -0
- package/dist/frameworks/php/config.js.map +1 -0
- package/dist/frameworks/php/detector.d.ts +7 -0
- package/dist/frameworks/php/detector.d.ts.map +1 -0
- package/dist/frameworks/php/detector.js +101 -0
- package/dist/frameworks/php/detector.js.map +1 -0
- package/dist/frameworks/registry.d.ts +20 -0
- package/dist/frameworks/registry.d.ts.map +1 -0
- package/dist/frameworks/registry.js +38 -0
- package/dist/frameworks/registry.js.map +1 -0
- package/dist/frameworks/shopify/config.d.ts +6 -0
- package/dist/frameworks/shopify/config.d.ts.map +1 -0
- package/dist/frameworks/shopify/config.js +50 -0
- package/dist/frameworks/shopify/config.js.map +1 -0
- package/dist/frameworks/shopify/detector.d.ts +6 -0
- package/dist/frameworks/shopify/detector.d.ts.map +1 -0
- package/dist/frameworks/shopify/detector.js +103 -0
- package/dist/frameworks/shopify/detector.js.map +1 -0
- package/dist/frameworks/types.d.ts +51 -0
- package/dist/frameworks/types.d.ts.map +1 -0
- package/dist/frameworks/types.js +21 -0
- package/dist/frameworks/types.js.map +1 -0
- package/dist/git/tracker.d.ts +56 -0
- package/dist/git/tracker.d.ts.map +1 -0
- package/dist/git/tracker.js +189 -0
- package/dist/git/tracker.js.map +1 -0
- package/dist/git/utils.d.ts +60 -0
- package/dist/git/utils.d.ts.map +1 -0
- package/dist/git/utils.js +152 -0
- package/dist/git/utils.js.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/ast/chunker.d.ts +28 -0
- package/dist/indexer/ast/chunker.d.ts.map +1 -0
- package/dist/indexer/ast/chunker.js +268 -0
- package/dist/indexer/ast/chunker.js.map +1 -0
- package/dist/indexer/ast/complexity/cognitive.d.ts +16 -0
- package/dist/indexer/ast/complexity/cognitive.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/cognitive.js +106 -0
- package/dist/indexer/ast/complexity/cognitive.js.map +1 -0
- package/dist/indexer/ast/complexity/cyclomatic.d.ts +12 -0
- package/dist/indexer/ast/complexity/cyclomatic.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/cyclomatic.js +61 -0
- package/dist/indexer/ast/complexity/cyclomatic.js.map +1 -0
- package/dist/indexer/ast/complexity/halstead.d.ts +55 -0
- package/dist/indexer/ast/complexity/halstead.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/halstead.js +290 -0
- package/dist/indexer/ast/complexity/halstead.js.map +1 -0
- package/dist/indexer/ast/complexity/index.d.ts +13 -0
- package/dist/indexer/ast/complexity/index.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/index.js +12 -0
- package/dist/indexer/ast/complexity/index.js.map +1 -0
- package/dist/indexer/ast/parser.d.ts +27 -0
- package/dist/indexer/ast/parser.d.ts.map +1 -0
- package/dist/indexer/ast/parser.js +103 -0
- package/dist/indexer/ast/parser.js.map +1 -0
- package/dist/indexer/ast/symbols.d.ts +17 -0
- package/dist/indexer/ast/symbols.d.ts.map +1 -0
- package/dist/indexer/ast/symbols.js +265 -0
- package/dist/indexer/ast/symbols.js.map +1 -0
- package/dist/indexer/ast/traversers/index.d.ts +19 -0
- package/dist/indexer/ast/traversers/index.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/index.js +42 -0
- package/dist/indexer/ast/traversers/index.js.map +1 -0
- package/dist/indexer/ast/traversers/php.d.ts +21 -0
- package/dist/indexer/ast/traversers/php.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/php.js +67 -0
- package/dist/indexer/ast/traversers/php.js.map +1 -0
- package/dist/indexer/ast/traversers/python.d.ts +28 -0
- package/dist/indexer/ast/traversers/python.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/python.js +67 -0
- package/dist/indexer/ast/traversers/python.js.map +1 -0
- package/dist/indexer/ast/traversers/types.d.ts +98 -0
- package/dist/indexer/ast/traversers/types.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/types.js +2 -0
- package/dist/indexer/ast/traversers/types.js.map +1 -0
- package/dist/indexer/ast/traversers/typescript.d.ts +29 -0
- package/dist/indexer/ast/traversers/typescript.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/typescript.js +88 -0
- package/dist/indexer/ast/traversers/typescript.js.map +1 -0
- package/dist/indexer/ast/types.d.ts +59 -0
- package/dist/indexer/ast/types.d.ts.map +1 -0
- package/dist/indexer/ast/types.js +2 -0
- package/dist/indexer/ast/types.js.map +1 -0
- package/dist/indexer/change-detector.d.ts +17 -0
- package/dist/indexer/change-detector.d.ts.map +1 -0
- package/dist/indexer/change-detector.js +207 -0
- package/dist/indexer/change-detector.js.map +1 -0
- package/dist/indexer/chunk-batch-processor.d.ts +103 -0
- package/dist/indexer/chunk-batch-processor.d.ts.map +1 -0
- package/dist/indexer/chunk-batch-processor.js +179 -0
- package/dist/indexer/chunk-batch-processor.js.map +1 -0
- package/dist/indexer/chunker.d.ts +10 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +96 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/dependency-analyzer.d.ts +60 -0
- package/dist/indexer/dependency-analyzer.d.ts.map +1 -0
- package/dist/indexer/dependency-analyzer.js +261 -0
- package/dist/indexer/dependency-analyzer.js.map +1 -0
- package/dist/indexer/incremental.d.ts +47 -0
- package/dist/indexer/incremental.d.ts.map +1 -0
- package/dist/indexer/incremental.js +284 -0
- package/dist/indexer/incremental.js.map +1 -0
- package/dist/indexer/index.d.ts +80 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +364 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/json-template-chunker.d.ts +9 -0
- package/dist/indexer/json-template-chunker.d.ts.map +1 -0
- package/dist/indexer/json-template-chunker.js +83 -0
- package/dist/indexer/json-template-chunker.js.map +1 -0
- package/dist/indexer/liquid-chunker.d.ts +13 -0
- package/dist/indexer/liquid-chunker.d.ts.map +1 -0
- package/dist/indexer/liquid-chunker.js +272 -0
- package/dist/indexer/liquid-chunker.js.map +1 -0
- package/dist/indexer/manifest.d.ts +122 -0
- package/dist/indexer/manifest.d.ts.map +1 -0
- package/dist/indexer/manifest.js +262 -0
- package/dist/indexer/manifest.js.map +1 -0
- package/dist/indexer/progress-tracker.d.ts +35 -0
- package/dist/indexer/progress-tracker.d.ts.map +1 -0
- package/dist/indexer/progress-tracker.js +33 -0
- package/dist/indexer/progress-tracker.js.map +1 -0
- package/dist/indexer/scanner.d.ts +16 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +159 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/symbol-extractor.d.ts +18 -0
- package/dist/indexer/symbol-extractor.d.ts.map +1 -0
- package/dist/indexer/symbol-extractor.js +351 -0
- package/dist/indexer/symbol-extractor.js.map +1 -0
- package/dist/indexer/types.d.ts +34 -0
- package/dist/indexer/types.d.ts.map +1 -0
- package/dist/indexer/types.js +2 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/insights/complexity-analyzer.d.ts +82 -0
- package/dist/insights/complexity-analyzer.d.ts.map +1 -0
- package/dist/insights/complexity-analyzer.js +356 -0
- package/dist/insights/complexity-analyzer.js.map +1 -0
- package/dist/insights/formatters/index.d.ts +11 -0
- package/dist/insights/formatters/index.d.ts.map +1 -0
- package/dist/insights/formatters/index.js +20 -0
- package/dist/insights/formatters/index.js.map +1 -0
- package/dist/insights/formatters/json.d.ts +7 -0
- package/dist/insights/formatters/json.d.ts.map +1 -0
- package/dist/insights/formatters/json.js +14 -0
- package/dist/insights/formatters/json.js.map +1 -0
- package/dist/insights/formatters/sarif.d.ts +6 -0
- package/dist/insights/formatters/sarif.d.ts.map +1 -0
- package/dist/insights/formatters/sarif.js +113 -0
- package/dist/insights/formatters/sarif.js.map +1 -0
- package/dist/insights/formatters/text.d.ts +6 -0
- package/dist/insights/formatters/text.d.ts.map +1 -0
- package/dist/insights/formatters/text.js +154 -0
- package/dist/insights/formatters/text.js.map +1 -0
- package/dist/insights/types.d.ts +73 -0
- package/dist/insights/types.d.ts.map +1 -0
- package/dist/insights/types.js +9 -0
- package/dist/insights/types.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/path-matching.d.ts +69 -0
- package/dist/utils/path-matching.d.ts.map +1 -0
- package/dist/utils/path-matching.js +123 -0
- package/dist/utils/path-matching.js.map +1 -0
- package/dist/utils/result.d.ts +65 -0
- package/dist/utils/result.d.ts.map +1 -0
- package/dist/utils/result.js +67 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/version.d.ts +22 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +28 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/vectordb/batch-insert.d.ts +14 -0
- package/dist/vectordb/batch-insert.d.ts.map +1 -0
- package/dist/vectordb/batch-insert.js +185 -0
- package/dist/vectordb/batch-insert.js.map +1 -0
- package/dist/vectordb/boosting/composer.d.ts +51 -0
- package/dist/vectordb/boosting/composer.d.ts.map +1 -0
- package/dist/vectordb/boosting/composer.js +65 -0
- package/dist/vectordb/boosting/composer.js.map +1 -0
- package/dist/vectordb/boosting/index.d.ts +22 -0
- package/dist/vectordb/boosting/index.d.ts.map +1 -0
- package/dist/vectordb/boosting/index.js +22 -0
- package/dist/vectordb/boosting/index.js.map +1 -0
- package/dist/vectordb/boosting/strategies.d.ts +40 -0
- package/dist/vectordb/boosting/strategies.d.ts.map +1 -0
- package/dist/vectordb/boosting/strategies.js +174 -0
- package/dist/vectordb/boosting/strategies.js.map +1 -0
- package/dist/vectordb/boosting/types.d.ts +20 -0
- package/dist/vectordb/boosting/types.d.ts.map +1 -0
- package/dist/vectordb/boosting/types.js +2 -0
- package/dist/vectordb/boosting/types.js.map +1 -0
- package/dist/vectordb/intent-classifier.d.ts +99 -0
- package/dist/vectordb/intent-classifier.d.ts.map +1 -0
- package/dist/vectordb/intent-classifier.js +193 -0
- package/dist/vectordb/intent-classifier.js.map +1 -0
- package/dist/vectordb/lancedb.d.ts +45 -0
- package/dist/vectordb/lancedb.d.ts.map +1 -0
- package/dist/vectordb/lancedb.js +203 -0
- package/dist/vectordb/lancedb.js.map +1 -0
- package/dist/vectordb/maintenance.d.ts +18 -0
- package/dist/vectordb/maintenance.d.ts.map +1 -0
- package/dist/vectordb/maintenance.js +87 -0
- package/dist/vectordb/maintenance.js.map +1 -0
- package/dist/vectordb/query.d.ts +34 -0
- package/dist/vectordb/query.d.ts.map +1 -0
- package/dist/vectordb/query.js +303 -0
- package/dist/vectordb/query.js.map +1 -0
- package/dist/vectordb/relevance.d.ts +15 -0
- package/dist/vectordb/relevance.d.ts.map +1 -0
- package/dist/vectordb/relevance.js +19 -0
- package/dist/vectordb/relevance.js.map +1 -0
- package/dist/vectordb/types.d.ts +29 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +2 -0
- package/dist/vectordb/types.js.map +1 -0
- package/dist/vectordb/version.d.ts +16 -0
- package/dist/vectordb/version.d.ts.map +1 -0
- package/dist/vectordb/version.js +40 -0
- package/dist/vectordb/version.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core indexing module - programmatic API without CLI dependencies.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the core indexing functionality that can be used by:
|
|
5
|
+
* - @liendev/cli (with UI wrapper)
|
|
6
|
+
* - @liendev/action (directly)
|
|
7
|
+
* - @liendev/cloud (worker processes)
|
|
8
|
+
* - Third-party integrations
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'fs/promises';
|
|
11
|
+
import pLimit from 'p-limit';
|
|
12
|
+
import { scanCodebase, scanCodebaseWithFrameworks } from './scanner.js';
|
|
13
|
+
import { chunkFile } from './chunker.js';
|
|
14
|
+
import { LocalEmbeddings } from '../embeddings/local.js';
|
|
15
|
+
import { VectorDB } from '../vectordb/lancedb.js';
|
|
16
|
+
import { configService } from '../config/service.js';
|
|
17
|
+
import { writeVersionFile } from '../vectordb/version.js';
|
|
18
|
+
import { isLegacyConfig, isModernConfig } from '../config/schema.js';
|
|
19
|
+
import { ManifestManager } from './manifest.js';
|
|
20
|
+
import { isGitAvailable, isGitRepo } from '../git/utils.js';
|
|
21
|
+
import { GitStateTracker } from '../git/tracker.js';
|
|
22
|
+
import { detectChanges } from './change-detector.js';
|
|
23
|
+
import { indexMultipleFiles } from './incremental.js';
|
|
24
|
+
import { ChunkBatchProcessor } from './chunk-batch-processor.js';
|
|
25
|
+
/** Extract indexing config values with defaults */
|
|
26
|
+
function getIndexingConfig(config) {
|
|
27
|
+
if (isModernConfig(config)) {
|
|
28
|
+
return {
|
|
29
|
+
concurrency: config.core.concurrency,
|
|
30
|
+
embeddingBatchSize: config.core.embeddingBatchSize,
|
|
31
|
+
chunkSize: config.core.chunkSize,
|
|
32
|
+
chunkOverlap: config.core.chunkOverlap,
|
|
33
|
+
useAST: config.chunking.useAST,
|
|
34
|
+
astFallback: config.chunking.astFallback,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Legacy defaults
|
|
38
|
+
return {
|
|
39
|
+
concurrency: 4,
|
|
40
|
+
embeddingBatchSize: 50,
|
|
41
|
+
chunkSize: 75,
|
|
42
|
+
chunkOverlap: 10,
|
|
43
|
+
useAST: true,
|
|
44
|
+
astFallback: 'line-based',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Scan files based on config type */
|
|
48
|
+
async function scanFilesToIndex(rootDir, config) {
|
|
49
|
+
if (isModernConfig(config) && config.frameworks.length > 0) {
|
|
50
|
+
return scanCodebaseWithFrameworks(rootDir, config);
|
|
51
|
+
}
|
|
52
|
+
if (isLegacyConfig(config)) {
|
|
53
|
+
return scanCodebase({
|
|
54
|
+
rootDir,
|
|
55
|
+
includePatterns: config.indexing.include,
|
|
56
|
+
excludePatterns: config.indexing.exclude,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return scanCodebase({ rootDir, includePatterns: [], excludePatterns: [] });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Update git state after indexing (if in a git repo).
|
|
63
|
+
*/
|
|
64
|
+
async function updateGitState(rootDir, vectorDB, manifest) {
|
|
65
|
+
const gitAvailable = await isGitAvailable();
|
|
66
|
+
const isRepo = await isGitRepo(rootDir);
|
|
67
|
+
if (!gitAvailable || !isRepo) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const gitTracker = new GitStateTracker(rootDir, vectorDB.dbPath);
|
|
71
|
+
await gitTracker.initialize();
|
|
72
|
+
const gitState = gitTracker.getState();
|
|
73
|
+
if (gitState) {
|
|
74
|
+
await manifest.updateGitState(gitState);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Handle file deletions during incremental indexing.
|
|
79
|
+
*/
|
|
80
|
+
async function handleDeletions(deletedFiles, vectorDB, manifest) {
|
|
81
|
+
if (deletedFiles.length === 0) {
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
let removedCount = 0;
|
|
85
|
+
for (const filepath of deletedFiles) {
|
|
86
|
+
try {
|
|
87
|
+
await vectorDB.deleteByFile(filepath);
|
|
88
|
+
await manifest.removeFile(filepath);
|
|
89
|
+
removedCount++;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Continue on error, just count failures
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return removedCount;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Handle file updates (additions and modifications) during incremental indexing.
|
|
99
|
+
*/
|
|
100
|
+
async function handleUpdates(addedFiles, modifiedFiles, vectorDB, embeddings, config, options) {
|
|
101
|
+
const filesToIndex = [...addedFiles, ...modifiedFiles];
|
|
102
|
+
if (filesToIndex.length === 0) {
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
const count = await indexMultipleFiles(filesToIndex, vectorDB, embeddings, config, { verbose: options.verbose });
|
|
106
|
+
await writeVersionFile(vectorDB.dbPath);
|
|
107
|
+
return count;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Try incremental indexing if a manifest exists.
|
|
111
|
+
* Returns result if incremental completed, null if full index needed.
|
|
112
|
+
*/
|
|
113
|
+
async function tryIncrementalIndex(rootDir, vectorDB, config, options, startTime) {
|
|
114
|
+
const manifest = new ManifestManager(vectorDB.dbPath);
|
|
115
|
+
const savedManifest = await manifest.load();
|
|
116
|
+
if (!savedManifest) {
|
|
117
|
+
return null; // No manifest, need full index
|
|
118
|
+
}
|
|
119
|
+
const changes = await detectChanges(rootDir, vectorDB, config);
|
|
120
|
+
if (changes.reason === 'full') {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const totalChanges = changes.added.length + changes.modified.length;
|
|
124
|
+
const totalDeleted = changes.deleted.length;
|
|
125
|
+
if (totalChanges === 0 && totalDeleted === 0) {
|
|
126
|
+
options.onProgress?.({
|
|
127
|
+
phase: 'complete',
|
|
128
|
+
message: 'Index is up to date - no changes detected',
|
|
129
|
+
filesTotal: 0,
|
|
130
|
+
filesProcessed: 0,
|
|
131
|
+
});
|
|
132
|
+
return {
|
|
133
|
+
success: true,
|
|
134
|
+
filesIndexed: 0,
|
|
135
|
+
chunksCreated: 0,
|
|
136
|
+
durationMs: Date.now() - startTime,
|
|
137
|
+
incremental: true,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
options.onProgress?.({
|
|
141
|
+
phase: 'embedding',
|
|
142
|
+
message: `Detected ${totalChanges} files to index, ${totalDeleted} to remove`,
|
|
143
|
+
});
|
|
144
|
+
// Initialize embeddings for incremental update
|
|
145
|
+
const embeddings = options.embeddings ?? new LocalEmbeddings();
|
|
146
|
+
if (!options.embeddings) {
|
|
147
|
+
await embeddings.initialize();
|
|
148
|
+
}
|
|
149
|
+
// Process changes
|
|
150
|
+
await handleDeletions(changes.deleted, vectorDB, manifest);
|
|
151
|
+
const indexedCount = await handleUpdates(changes.added, changes.modified, vectorDB, embeddings, config, options);
|
|
152
|
+
// Update git state
|
|
153
|
+
await updateGitState(rootDir, vectorDB, manifest);
|
|
154
|
+
options.onProgress?.({
|
|
155
|
+
phase: 'complete',
|
|
156
|
+
message: `Updated ${indexedCount} file${indexedCount !== 1 ? 's' : ''}, removed ${totalDeleted}`,
|
|
157
|
+
filesTotal: totalChanges + totalDeleted,
|
|
158
|
+
filesProcessed: indexedCount + totalDeleted,
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
filesIndexed: indexedCount,
|
|
163
|
+
chunksCreated: 0, // Not tracked in incremental mode
|
|
164
|
+
durationMs: Date.now() - startTime,
|
|
165
|
+
incremental: true,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Process a single file for indexing.
|
|
170
|
+
* Extracts chunks and adds them to the batch processor.
|
|
171
|
+
*
|
|
172
|
+
* @returns true if file was processed successfully, false if skipped
|
|
173
|
+
*/
|
|
174
|
+
async function processFileForIndexing(file, batchProcessor, indexConfig, progressTracker, _verbose) {
|
|
175
|
+
try {
|
|
176
|
+
// Get file stats to capture actual modification time
|
|
177
|
+
const stats = await fs.stat(file);
|
|
178
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
179
|
+
const chunks = chunkFile(file, content, {
|
|
180
|
+
chunkSize: indexConfig.chunkSize,
|
|
181
|
+
chunkOverlap: indexConfig.chunkOverlap,
|
|
182
|
+
useAST: indexConfig.useAST,
|
|
183
|
+
astFallback: indexConfig.astFallback,
|
|
184
|
+
});
|
|
185
|
+
if (chunks.length === 0) {
|
|
186
|
+
progressTracker.incrementFiles();
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
// Add chunks to batch processor (handles mutex internally)
|
|
190
|
+
await batchProcessor.addChunks(chunks, file, stats.mtimeMs);
|
|
191
|
+
progressTracker.incrementFiles();
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
progressTracker.incrementFiles();
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Perform a full index of the codebase.
|
|
201
|
+
*/
|
|
202
|
+
async function performFullIndex(rootDir, vectorDB, config, options, startTime) {
|
|
203
|
+
// 1. Clear existing index (required for schema changes)
|
|
204
|
+
options.onProgress?.({ phase: 'initializing', message: 'Clearing existing index...' });
|
|
205
|
+
await vectorDB.clear();
|
|
206
|
+
// 2. Scan for files
|
|
207
|
+
options.onProgress?.({ phase: 'scanning', message: 'Scanning codebase...' });
|
|
208
|
+
const files = await scanFilesToIndex(rootDir, config);
|
|
209
|
+
if (files.length === 0) {
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
filesIndexed: 0,
|
|
213
|
+
chunksCreated: 0,
|
|
214
|
+
durationMs: Date.now() - startTime,
|
|
215
|
+
incremental: false,
|
|
216
|
+
error: 'No files found to index',
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// 3. Initialize embeddings model
|
|
220
|
+
options.onProgress?.({
|
|
221
|
+
phase: 'embedding',
|
|
222
|
+
message: 'Loading embedding model...',
|
|
223
|
+
filesTotal: files.length,
|
|
224
|
+
});
|
|
225
|
+
const embeddings = options.embeddings ?? new LocalEmbeddings();
|
|
226
|
+
if (!options.embeddings) {
|
|
227
|
+
await embeddings.initialize();
|
|
228
|
+
}
|
|
229
|
+
// 4. Setup processing infrastructure
|
|
230
|
+
const indexConfig = getIndexingConfig(config);
|
|
231
|
+
const processedCount = { value: 0 };
|
|
232
|
+
// Create a simple progress tracker that works with callbacks
|
|
233
|
+
const progressTracker = {
|
|
234
|
+
incrementFiles: () => {
|
|
235
|
+
processedCount.value++;
|
|
236
|
+
options.onProgress?.({
|
|
237
|
+
phase: 'indexing',
|
|
238
|
+
message: `Processing files...`,
|
|
239
|
+
filesTotal: files.length,
|
|
240
|
+
filesProcessed: processedCount.value,
|
|
241
|
+
});
|
|
242
|
+
},
|
|
243
|
+
incrementChunks: () => { },
|
|
244
|
+
getProcessedCount: () => processedCount.value,
|
|
245
|
+
start: () => { },
|
|
246
|
+
stop: () => { },
|
|
247
|
+
};
|
|
248
|
+
const batchProcessor = new ChunkBatchProcessor(vectorDB, embeddings, {
|
|
249
|
+
batchThreshold: 100,
|
|
250
|
+
embeddingBatchSize: indexConfig.embeddingBatchSize,
|
|
251
|
+
}, progressTracker);
|
|
252
|
+
options.onProgress?.({
|
|
253
|
+
phase: 'indexing',
|
|
254
|
+
message: `Processing ${files.length} files...`,
|
|
255
|
+
filesTotal: files.length,
|
|
256
|
+
filesProcessed: 0,
|
|
257
|
+
});
|
|
258
|
+
try {
|
|
259
|
+
// 5. Process files with concurrency limit
|
|
260
|
+
const limit = pLimit(indexConfig.concurrency);
|
|
261
|
+
const filePromises = files.map(file => limit(() => processFileForIndexing(file, batchProcessor, indexConfig, progressTracker, options.verbose ?? false)));
|
|
262
|
+
await Promise.all(filePromises);
|
|
263
|
+
// 6. Flush remaining chunks
|
|
264
|
+
await batchProcessor.flush();
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
return {
|
|
268
|
+
success: false,
|
|
269
|
+
filesIndexed: processedCount.value,
|
|
270
|
+
chunksCreated: 0,
|
|
271
|
+
durationMs: Date.now() - startTime,
|
|
272
|
+
incremental: false,
|
|
273
|
+
error: error instanceof Error ? error.message : String(error),
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
// 7. Save results
|
|
277
|
+
options.onProgress?.({ phase: 'saving', message: 'Saving index manifest...' });
|
|
278
|
+
const { processedChunks, indexedFiles } = batchProcessor.getResults();
|
|
279
|
+
const manifest = new ManifestManager(vectorDB.dbPath);
|
|
280
|
+
await manifest.updateFiles(indexedFiles.map(entry => ({
|
|
281
|
+
filepath: entry.filepath,
|
|
282
|
+
lastModified: entry.mtime,
|
|
283
|
+
chunkCount: entry.chunkCount,
|
|
284
|
+
})));
|
|
285
|
+
// Save git state if in a git repo
|
|
286
|
+
await updateGitState(rootDir, vectorDB, manifest);
|
|
287
|
+
// Write version file to mark successful completion
|
|
288
|
+
await writeVersionFile(vectorDB.dbPath);
|
|
289
|
+
options.onProgress?.({
|
|
290
|
+
phase: 'complete',
|
|
291
|
+
message: 'Indexing complete',
|
|
292
|
+
filesTotal: files.length,
|
|
293
|
+
filesProcessed: processedCount.value,
|
|
294
|
+
chunksProcessed: processedChunks,
|
|
295
|
+
});
|
|
296
|
+
return {
|
|
297
|
+
success: true,
|
|
298
|
+
filesIndexed: processedCount.value,
|
|
299
|
+
chunksCreated: processedChunks,
|
|
300
|
+
durationMs: Date.now() - startTime,
|
|
301
|
+
incremental: false,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Index a codebase, creating vector embeddings for semantic search.
|
|
306
|
+
*
|
|
307
|
+
* This is the main entry point for indexing. It:
|
|
308
|
+
* - Tries incremental indexing first (if not forced)
|
|
309
|
+
* - Falls back to full indexing if needed
|
|
310
|
+
* - Provides progress callbacks for UI integration
|
|
311
|
+
*
|
|
312
|
+
* @param options - Indexing options
|
|
313
|
+
* @returns Indexing result with stats
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* // Basic usage
|
|
318
|
+
* const result = await indexCodebase({ rootDir: '/path/to/project' });
|
|
319
|
+
*
|
|
320
|
+
* // With progress callback
|
|
321
|
+
* const result = await indexCodebase({
|
|
322
|
+
* rootDir: '/path/to/project',
|
|
323
|
+
* onProgress: (p) => console.log(`${p.phase}: ${p.message}`)
|
|
324
|
+
* });
|
|
325
|
+
*
|
|
326
|
+
* // With pre-initialized embeddings (warm worker)
|
|
327
|
+
* const embeddings = new LocalEmbeddings();
|
|
328
|
+
* await embeddings.initialize();
|
|
329
|
+
* const result = await indexCodebase({ embeddings });
|
|
330
|
+
* ```
|
|
331
|
+
*/
|
|
332
|
+
export async function indexCodebase(options = {}) {
|
|
333
|
+
const rootDir = options.rootDir ?? process.cwd();
|
|
334
|
+
const startTime = Date.now();
|
|
335
|
+
try {
|
|
336
|
+
options.onProgress?.({ phase: 'initializing', message: 'Loading configuration...' });
|
|
337
|
+
// Load configuration
|
|
338
|
+
const config = options.config ?? await configService.load(rootDir);
|
|
339
|
+
// Initialize vector database
|
|
340
|
+
options.onProgress?.({ phase: 'initializing', message: 'Initializing vector database...' });
|
|
341
|
+
const vectorDB = new VectorDB(rootDir);
|
|
342
|
+
await vectorDB.initialize();
|
|
343
|
+
// Try incremental indexing first (unless forced)
|
|
344
|
+
if (!options.force) {
|
|
345
|
+
const incrementalResult = await tryIncrementalIndex(rootDir, vectorDB, config, options, startTime);
|
|
346
|
+
if (incrementalResult) {
|
|
347
|
+
return incrementalResult;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Fall back to full index
|
|
351
|
+
return await performFullIndex(rootDir, vectorDB, config, options, startTime);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
return {
|
|
355
|
+
success: false,
|
|
356
|
+
filesIndexed: 0,
|
|
357
|
+
chunksCreated: 0,
|
|
358
|
+
durationMs: Date.now() - startTime,
|
|
359
|
+
incremental: false,
|
|
360
|
+
error: error instanceof Error ? error.message : String(error),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CodeChunk } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Chunk a Shopify JSON template file
|
|
4
|
+
*
|
|
5
|
+
* JSON templates are typically small (define section layout),
|
|
6
|
+
* so we keep them as a single chunk and extract section references.
|
|
7
|
+
*/
|
|
8
|
+
export declare function chunkJSONTemplate(filepath: string, content: string): CodeChunk[];
|
|
9
|
+
//# sourceMappingURL=json-template-chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-template-chunker.d.ts","sourceRoot":"","sources":["../../src/indexer/json-template-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA8D5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,SAAS,EAAE,CAuBb"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shopify JSON template chunking
|
|
3
|
+
*
|
|
4
|
+
* JSON template files define which sections appear on a template page.
|
|
5
|
+
* We extract section references to track dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Example structure:
|
|
8
|
+
* {
|
|
9
|
+
* "sections": {
|
|
10
|
+
* "main": { "type": "main-product", "settings": {...} },
|
|
11
|
+
* "recommendations": { "type": "product-recommendations", "settings": {...} }
|
|
12
|
+
* },
|
|
13
|
+
* "order": ["main", "recommendations"]
|
|
14
|
+
* }
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Extract section types from a Shopify JSON template
|
|
18
|
+
*
|
|
19
|
+
* These are the actual section file names (e.g., "main-product" → sections/main-product.liquid)
|
|
20
|
+
*/
|
|
21
|
+
function extractSectionReferences(jsonContent) {
|
|
22
|
+
try {
|
|
23
|
+
const template = JSON.parse(jsonContent);
|
|
24
|
+
const sectionTypes = new Set();
|
|
25
|
+
// Extract from sections object
|
|
26
|
+
if (template.sections && typeof template.sections === 'object') {
|
|
27
|
+
for (const section of Object.values(template.sections)) {
|
|
28
|
+
if (typeof section === 'object' &&
|
|
29
|
+
section !== null &&
|
|
30
|
+
'type' in section &&
|
|
31
|
+
typeof section.type === 'string') {
|
|
32
|
+
sectionTypes.add(section.type);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return Array.from(sectionTypes);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Invalid JSON - return empty array
|
|
40
|
+
console.warn(`[Lien] Failed to parse JSON template: ${error instanceof Error ? error.message : String(error)}`);
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Extract the template name from the filepath
|
|
46
|
+
*
|
|
47
|
+
* templates/customers/account.json → "customers/account"
|
|
48
|
+
* templates/product.json → "product"
|
|
49
|
+
*/
|
|
50
|
+
function extractTemplateName(filepath) {
|
|
51
|
+
// Match everything after templates/ up to .json
|
|
52
|
+
const match = filepath.match(/templates\/(.+)\.json$/);
|
|
53
|
+
return match ? match[1] : undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Chunk a Shopify JSON template file
|
|
57
|
+
*
|
|
58
|
+
* JSON templates are typically small (define section layout),
|
|
59
|
+
* so we keep them as a single chunk and extract section references.
|
|
60
|
+
*/
|
|
61
|
+
export function chunkJSONTemplate(filepath, content) {
|
|
62
|
+
// Skip empty files
|
|
63
|
+
if (content.trim().length === 0) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
const lines = content.split('\n');
|
|
67
|
+
const templateName = extractTemplateName(filepath);
|
|
68
|
+
const sectionReferences = extractSectionReferences(content);
|
|
69
|
+
return [{
|
|
70
|
+
content,
|
|
71
|
+
metadata: {
|
|
72
|
+
file: filepath,
|
|
73
|
+
startLine: 1,
|
|
74
|
+
endLine: lines.length,
|
|
75
|
+
language: 'json',
|
|
76
|
+
type: 'template',
|
|
77
|
+
symbolName: templateName,
|
|
78
|
+
symbolType: 'template',
|
|
79
|
+
imports: sectionReferences.length > 0 ? sectionReferences : undefined,
|
|
80
|
+
},
|
|
81
|
+
}];
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=json-template-chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-template-chunker.js","sourceRoot":"","sources":["../../src/indexer/json-template-chunker.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,WAAmB;IACnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QAEvC,+BAA+B;QAC/B,IAAI,QAAQ,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvD,IACE,OAAO,OAAO,KAAK,QAAQ;oBAC3B,OAAO,KAAK,IAAI;oBAChB,MAAM,IAAI,OAAO;oBACjB,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAChC,CAAC;oBACD,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oCAAoC;QACpC,OAAO,CAAC,IAAI,CAAC,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChH,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,gDAAgD;IAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,OAAe;IAEf,mBAAmB;IACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAE5D,OAAO,CAAC;YACN,OAAO;YACP,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,KAAK,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,YAAY;gBACxB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;aACtE;SACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CodeChunk } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Chunk a Liquid template file
|
|
4
|
+
*
|
|
5
|
+
* Special handling for:
|
|
6
|
+
* - {% schema %} blocks (kept together, extract section name)
|
|
7
|
+
* - {% style %} blocks (kept together)
|
|
8
|
+
* - {% javascript %} blocks (kept together)
|
|
9
|
+
* - {% render %}, {% include %}, and {% section %} tags (tracked as imports)
|
|
10
|
+
* - Regular template content (chunked by lines)
|
|
11
|
+
*/
|
|
12
|
+
export declare function chunkLiquidFile(filepath: string, content: string, chunkSize?: number, chunkOverlap?: number): CodeChunk[];
|
|
13
|
+
//# sourceMappingURL=liquid-chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquid-chunker.d.ts","sourceRoot":"","sources":["../../src/indexer/liquid-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA6W5C;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAW,EACtB,YAAY,GAAE,MAAW,GACxB,SAAS,EAAE,CAqBb"}
|