@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.
Files changed (298) hide show
  1. package/README.md +336 -0
  2. package/dist/config/loader.d.ts +12 -0
  3. package/dist/config/loader.d.ts.map +1 -0
  4. package/dist/config/loader.js +46 -0
  5. package/dist/config/loader.js.map +1 -0
  6. package/dist/config/merge.d.ts +20 -0
  7. package/dist/config/merge.d.ts.map +1 -0
  8. package/dist/config/merge.js +71 -0
  9. package/dist/config/merge.js.map +1 -0
  10. package/dist/config/migration-manager.d.ts +46 -0
  11. package/dist/config/migration-manager.d.ts.map +1 -0
  12. package/dist/config/migration-manager.js +119 -0
  13. package/dist/config/migration-manager.js.map +1 -0
  14. package/dist/config/migration.d.ts +20 -0
  15. package/dist/config/migration.d.ts.map +1 -0
  16. package/dist/config/migration.js +155 -0
  17. package/dist/config/migration.js.map +1 -0
  18. package/dist/config/schema.d.ts +101 -0
  19. package/dist/config/schema.d.ts.map +1 -0
  20. package/dist/config/schema.js +58 -0
  21. package/dist/config/schema.js.map +1 -0
  22. package/dist/config/service.d.ts +122 -0
  23. package/dist/config/service.d.ts.map +1 -0
  24. package/dist/config/service.js +477 -0
  25. package/dist/config/service.js.map +1 -0
  26. package/dist/constants.d.ts +20 -0
  27. package/dist/constants.d.ts.map +1 -0
  28. package/dist/constants.js +43 -0
  29. package/dist/constants.js.map +1 -0
  30. package/dist/embeddings/cache.d.ts +45 -0
  31. package/dist/embeddings/cache.d.ts.map +1 -0
  32. package/dist/embeddings/cache.js +109 -0
  33. package/dist/embeddings/cache.js.map +1 -0
  34. package/dist/embeddings/local.d.ts +10 -0
  35. package/dist/embeddings/local.d.ts.map +1 -0
  36. package/dist/embeddings/local.js +63 -0
  37. package/dist/embeddings/local.js.map +1 -0
  38. package/dist/embeddings/types.d.ts +9 -0
  39. package/dist/embeddings/types.d.ts.map +1 -0
  40. package/dist/embeddings/types.js +5 -0
  41. package/dist/embeddings/types.js.map +1 -0
  42. package/dist/errors/codes.d.ts +18 -0
  43. package/dist/errors/codes.d.ts.map +1 -0
  44. package/dist/errors/codes.js +25 -0
  45. package/dist/errors/codes.js.map +1 -0
  46. package/dist/errors/index.d.ts +85 -0
  47. package/dist/errors/index.d.ts.map +1 -0
  48. package/dist/errors/index.js +134 -0
  49. package/dist/errors/index.js.map +1 -0
  50. package/dist/frameworks/detector-service.d.ts +59 -0
  51. package/dist/frameworks/detector-service.d.ts.map +1 -0
  52. package/dist/frameworks/detector-service.js +219 -0
  53. package/dist/frameworks/detector-service.js.map +1 -0
  54. package/dist/frameworks/laravel/config.d.ts +6 -0
  55. package/dist/frameworks/laravel/config.d.ts.map +1 -0
  56. package/dist/frameworks/laravel/config.js +68 -0
  57. package/dist/frameworks/laravel/config.js.map +1 -0
  58. package/dist/frameworks/laravel/detector.d.ts +6 -0
  59. package/dist/frameworks/laravel/detector.d.ts.map +1 -0
  60. package/dist/frameworks/laravel/detector.js +96 -0
  61. package/dist/frameworks/laravel/detector.js.map +1 -0
  62. package/dist/frameworks/nodejs/config.d.ts +6 -0
  63. package/dist/frameworks/nodejs/config.d.ts.map +1 -0
  64. package/dist/frameworks/nodejs/config.js +57 -0
  65. package/dist/frameworks/nodejs/config.js.map +1 -0
  66. package/dist/frameworks/nodejs/detector.d.ts +6 -0
  67. package/dist/frameworks/nodejs/detector.d.ts.map +1 -0
  68. package/dist/frameworks/nodejs/detector.js +77 -0
  69. package/dist/frameworks/nodejs/detector.js.map +1 -0
  70. package/dist/frameworks/php/config.d.ts +6 -0
  71. package/dist/frameworks/php/config.d.ts.map +1 -0
  72. package/dist/frameworks/php/config.js +53 -0
  73. package/dist/frameworks/php/config.js.map +1 -0
  74. package/dist/frameworks/php/detector.d.ts +7 -0
  75. package/dist/frameworks/php/detector.d.ts.map +1 -0
  76. package/dist/frameworks/php/detector.js +101 -0
  77. package/dist/frameworks/php/detector.js.map +1 -0
  78. package/dist/frameworks/registry.d.ts +20 -0
  79. package/dist/frameworks/registry.d.ts.map +1 -0
  80. package/dist/frameworks/registry.js +38 -0
  81. package/dist/frameworks/registry.js.map +1 -0
  82. package/dist/frameworks/shopify/config.d.ts +6 -0
  83. package/dist/frameworks/shopify/config.d.ts.map +1 -0
  84. package/dist/frameworks/shopify/config.js +50 -0
  85. package/dist/frameworks/shopify/config.js.map +1 -0
  86. package/dist/frameworks/shopify/detector.d.ts +6 -0
  87. package/dist/frameworks/shopify/detector.d.ts.map +1 -0
  88. package/dist/frameworks/shopify/detector.js +103 -0
  89. package/dist/frameworks/shopify/detector.js.map +1 -0
  90. package/dist/frameworks/types.d.ts +51 -0
  91. package/dist/frameworks/types.d.ts.map +1 -0
  92. package/dist/frameworks/types.js +21 -0
  93. package/dist/frameworks/types.js.map +1 -0
  94. package/dist/git/tracker.d.ts +56 -0
  95. package/dist/git/tracker.d.ts.map +1 -0
  96. package/dist/git/tracker.js +189 -0
  97. package/dist/git/tracker.js.map +1 -0
  98. package/dist/git/utils.d.ts +60 -0
  99. package/dist/git/utils.d.ts.map +1 -0
  100. package/dist/git/utils.js +152 -0
  101. package/dist/git/utils.js.map +1 -0
  102. package/dist/index.d.ts +77 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +95 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/indexer/ast/chunker.d.ts +28 -0
  107. package/dist/indexer/ast/chunker.d.ts.map +1 -0
  108. package/dist/indexer/ast/chunker.js +268 -0
  109. package/dist/indexer/ast/chunker.js.map +1 -0
  110. package/dist/indexer/ast/complexity/cognitive.d.ts +16 -0
  111. package/dist/indexer/ast/complexity/cognitive.d.ts.map +1 -0
  112. package/dist/indexer/ast/complexity/cognitive.js +106 -0
  113. package/dist/indexer/ast/complexity/cognitive.js.map +1 -0
  114. package/dist/indexer/ast/complexity/cyclomatic.d.ts +12 -0
  115. package/dist/indexer/ast/complexity/cyclomatic.d.ts.map +1 -0
  116. package/dist/indexer/ast/complexity/cyclomatic.js +61 -0
  117. package/dist/indexer/ast/complexity/cyclomatic.js.map +1 -0
  118. package/dist/indexer/ast/complexity/halstead.d.ts +55 -0
  119. package/dist/indexer/ast/complexity/halstead.d.ts.map +1 -0
  120. package/dist/indexer/ast/complexity/halstead.js +290 -0
  121. package/dist/indexer/ast/complexity/halstead.js.map +1 -0
  122. package/dist/indexer/ast/complexity/index.d.ts +13 -0
  123. package/dist/indexer/ast/complexity/index.d.ts.map +1 -0
  124. package/dist/indexer/ast/complexity/index.js +12 -0
  125. package/dist/indexer/ast/complexity/index.js.map +1 -0
  126. package/dist/indexer/ast/parser.d.ts +27 -0
  127. package/dist/indexer/ast/parser.d.ts.map +1 -0
  128. package/dist/indexer/ast/parser.js +103 -0
  129. package/dist/indexer/ast/parser.js.map +1 -0
  130. package/dist/indexer/ast/symbols.d.ts +17 -0
  131. package/dist/indexer/ast/symbols.d.ts.map +1 -0
  132. package/dist/indexer/ast/symbols.js +265 -0
  133. package/dist/indexer/ast/symbols.js.map +1 -0
  134. package/dist/indexer/ast/traversers/index.d.ts +19 -0
  135. package/dist/indexer/ast/traversers/index.d.ts.map +1 -0
  136. package/dist/indexer/ast/traversers/index.js +42 -0
  137. package/dist/indexer/ast/traversers/index.js.map +1 -0
  138. package/dist/indexer/ast/traversers/php.d.ts +21 -0
  139. package/dist/indexer/ast/traversers/php.d.ts.map +1 -0
  140. package/dist/indexer/ast/traversers/php.js +67 -0
  141. package/dist/indexer/ast/traversers/php.js.map +1 -0
  142. package/dist/indexer/ast/traversers/python.d.ts +28 -0
  143. package/dist/indexer/ast/traversers/python.d.ts.map +1 -0
  144. package/dist/indexer/ast/traversers/python.js +67 -0
  145. package/dist/indexer/ast/traversers/python.js.map +1 -0
  146. package/dist/indexer/ast/traversers/types.d.ts +98 -0
  147. package/dist/indexer/ast/traversers/types.d.ts.map +1 -0
  148. package/dist/indexer/ast/traversers/types.js +2 -0
  149. package/dist/indexer/ast/traversers/types.js.map +1 -0
  150. package/dist/indexer/ast/traversers/typescript.d.ts +29 -0
  151. package/dist/indexer/ast/traversers/typescript.d.ts.map +1 -0
  152. package/dist/indexer/ast/traversers/typescript.js +88 -0
  153. package/dist/indexer/ast/traversers/typescript.js.map +1 -0
  154. package/dist/indexer/ast/types.d.ts +59 -0
  155. package/dist/indexer/ast/types.d.ts.map +1 -0
  156. package/dist/indexer/ast/types.js +2 -0
  157. package/dist/indexer/ast/types.js.map +1 -0
  158. package/dist/indexer/change-detector.d.ts +17 -0
  159. package/dist/indexer/change-detector.d.ts.map +1 -0
  160. package/dist/indexer/change-detector.js +207 -0
  161. package/dist/indexer/change-detector.js.map +1 -0
  162. package/dist/indexer/chunk-batch-processor.d.ts +103 -0
  163. package/dist/indexer/chunk-batch-processor.d.ts.map +1 -0
  164. package/dist/indexer/chunk-batch-processor.js +179 -0
  165. package/dist/indexer/chunk-batch-processor.js.map +1 -0
  166. package/dist/indexer/chunker.d.ts +10 -0
  167. package/dist/indexer/chunker.d.ts.map +1 -0
  168. package/dist/indexer/chunker.js +96 -0
  169. package/dist/indexer/chunker.js.map +1 -0
  170. package/dist/indexer/dependency-analyzer.d.ts +60 -0
  171. package/dist/indexer/dependency-analyzer.d.ts.map +1 -0
  172. package/dist/indexer/dependency-analyzer.js +261 -0
  173. package/dist/indexer/dependency-analyzer.js.map +1 -0
  174. package/dist/indexer/incremental.d.ts +47 -0
  175. package/dist/indexer/incremental.d.ts.map +1 -0
  176. package/dist/indexer/incremental.js +284 -0
  177. package/dist/indexer/incremental.js.map +1 -0
  178. package/dist/indexer/index.d.ts +80 -0
  179. package/dist/indexer/index.d.ts.map +1 -0
  180. package/dist/indexer/index.js +364 -0
  181. package/dist/indexer/index.js.map +1 -0
  182. package/dist/indexer/json-template-chunker.d.ts +9 -0
  183. package/dist/indexer/json-template-chunker.d.ts.map +1 -0
  184. package/dist/indexer/json-template-chunker.js +83 -0
  185. package/dist/indexer/json-template-chunker.js.map +1 -0
  186. package/dist/indexer/liquid-chunker.d.ts +13 -0
  187. package/dist/indexer/liquid-chunker.d.ts.map +1 -0
  188. package/dist/indexer/liquid-chunker.js +272 -0
  189. package/dist/indexer/liquid-chunker.js.map +1 -0
  190. package/dist/indexer/manifest.d.ts +122 -0
  191. package/dist/indexer/manifest.d.ts.map +1 -0
  192. package/dist/indexer/manifest.js +262 -0
  193. package/dist/indexer/manifest.js.map +1 -0
  194. package/dist/indexer/progress-tracker.d.ts +35 -0
  195. package/dist/indexer/progress-tracker.d.ts.map +1 -0
  196. package/dist/indexer/progress-tracker.js +33 -0
  197. package/dist/indexer/progress-tracker.js.map +1 -0
  198. package/dist/indexer/scanner.d.ts +16 -0
  199. package/dist/indexer/scanner.d.ts.map +1 -0
  200. package/dist/indexer/scanner.js +159 -0
  201. package/dist/indexer/scanner.js.map +1 -0
  202. package/dist/indexer/symbol-extractor.d.ts +18 -0
  203. package/dist/indexer/symbol-extractor.d.ts.map +1 -0
  204. package/dist/indexer/symbol-extractor.js +351 -0
  205. package/dist/indexer/symbol-extractor.js.map +1 -0
  206. package/dist/indexer/types.d.ts +34 -0
  207. package/dist/indexer/types.d.ts.map +1 -0
  208. package/dist/indexer/types.js +2 -0
  209. package/dist/indexer/types.js.map +1 -0
  210. package/dist/insights/complexity-analyzer.d.ts +82 -0
  211. package/dist/insights/complexity-analyzer.d.ts.map +1 -0
  212. package/dist/insights/complexity-analyzer.js +356 -0
  213. package/dist/insights/complexity-analyzer.js.map +1 -0
  214. package/dist/insights/formatters/index.d.ts +11 -0
  215. package/dist/insights/formatters/index.d.ts.map +1 -0
  216. package/dist/insights/formatters/index.js +20 -0
  217. package/dist/insights/formatters/index.js.map +1 -0
  218. package/dist/insights/formatters/json.d.ts +7 -0
  219. package/dist/insights/formatters/json.d.ts.map +1 -0
  220. package/dist/insights/formatters/json.js +14 -0
  221. package/dist/insights/formatters/json.js.map +1 -0
  222. package/dist/insights/formatters/sarif.d.ts +6 -0
  223. package/dist/insights/formatters/sarif.d.ts.map +1 -0
  224. package/dist/insights/formatters/sarif.js +113 -0
  225. package/dist/insights/formatters/sarif.js.map +1 -0
  226. package/dist/insights/formatters/text.d.ts +6 -0
  227. package/dist/insights/formatters/text.d.ts.map +1 -0
  228. package/dist/insights/formatters/text.js +154 -0
  229. package/dist/insights/formatters/text.js.map +1 -0
  230. package/dist/insights/types.d.ts +73 -0
  231. package/dist/insights/types.d.ts.map +1 -0
  232. package/dist/insights/types.js +9 -0
  233. package/dist/insights/types.js.map +1 -0
  234. package/dist/types/index.d.ts +14 -0
  235. package/dist/types/index.d.ts.map +1 -0
  236. package/dist/types/index.js +8 -0
  237. package/dist/types/index.js.map +1 -0
  238. package/dist/utils/path-matching.d.ts +69 -0
  239. package/dist/utils/path-matching.d.ts.map +1 -0
  240. package/dist/utils/path-matching.js +123 -0
  241. package/dist/utils/path-matching.js.map +1 -0
  242. package/dist/utils/result.d.ts +65 -0
  243. package/dist/utils/result.d.ts.map +1 -0
  244. package/dist/utils/result.js +67 -0
  245. package/dist/utils/result.js.map +1 -0
  246. package/dist/utils/version.d.ts +22 -0
  247. package/dist/utils/version.d.ts.map +1 -0
  248. package/dist/utils/version.js +28 -0
  249. package/dist/utils/version.js.map +1 -0
  250. package/dist/vectordb/batch-insert.d.ts +14 -0
  251. package/dist/vectordb/batch-insert.d.ts.map +1 -0
  252. package/dist/vectordb/batch-insert.js +185 -0
  253. package/dist/vectordb/batch-insert.js.map +1 -0
  254. package/dist/vectordb/boosting/composer.d.ts +51 -0
  255. package/dist/vectordb/boosting/composer.d.ts.map +1 -0
  256. package/dist/vectordb/boosting/composer.js +65 -0
  257. package/dist/vectordb/boosting/composer.js.map +1 -0
  258. package/dist/vectordb/boosting/index.d.ts +22 -0
  259. package/dist/vectordb/boosting/index.d.ts.map +1 -0
  260. package/dist/vectordb/boosting/index.js +22 -0
  261. package/dist/vectordb/boosting/index.js.map +1 -0
  262. package/dist/vectordb/boosting/strategies.d.ts +40 -0
  263. package/dist/vectordb/boosting/strategies.d.ts.map +1 -0
  264. package/dist/vectordb/boosting/strategies.js +174 -0
  265. package/dist/vectordb/boosting/strategies.js.map +1 -0
  266. package/dist/vectordb/boosting/types.d.ts +20 -0
  267. package/dist/vectordb/boosting/types.d.ts.map +1 -0
  268. package/dist/vectordb/boosting/types.js +2 -0
  269. package/dist/vectordb/boosting/types.js.map +1 -0
  270. package/dist/vectordb/intent-classifier.d.ts +99 -0
  271. package/dist/vectordb/intent-classifier.d.ts.map +1 -0
  272. package/dist/vectordb/intent-classifier.js +193 -0
  273. package/dist/vectordb/intent-classifier.js.map +1 -0
  274. package/dist/vectordb/lancedb.d.ts +45 -0
  275. package/dist/vectordb/lancedb.d.ts.map +1 -0
  276. package/dist/vectordb/lancedb.js +203 -0
  277. package/dist/vectordb/lancedb.js.map +1 -0
  278. package/dist/vectordb/maintenance.d.ts +18 -0
  279. package/dist/vectordb/maintenance.d.ts.map +1 -0
  280. package/dist/vectordb/maintenance.js +87 -0
  281. package/dist/vectordb/maintenance.js.map +1 -0
  282. package/dist/vectordb/query.d.ts +34 -0
  283. package/dist/vectordb/query.d.ts.map +1 -0
  284. package/dist/vectordb/query.js +303 -0
  285. package/dist/vectordb/query.js.map +1 -0
  286. package/dist/vectordb/relevance.d.ts +15 -0
  287. package/dist/vectordb/relevance.d.ts.map +1 -0
  288. package/dist/vectordb/relevance.js +19 -0
  289. package/dist/vectordb/relevance.js.map +1 -0
  290. package/dist/vectordb/types.d.ts +29 -0
  291. package/dist/vectordb/types.d.ts.map +1 -0
  292. package/dist/vectordb/types.js +2 -0
  293. package/dist/vectordb/types.js.map +1 -0
  294. package/dist/vectordb/version.d.ts +16 -0
  295. package/dist/vectordb/version.d.ts.map +1 -0
  296. package/dist/vectordb/version.js +40 -0
  297. package/dist/vectordb/version.js.map +1 -0
  298. 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"}