@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,47 @@
1
+ import { EmbeddingService } from '../embeddings/types.js';
2
+ import { VectorDB } from '../vectordb/lancedb.js';
3
+ import { LienConfig, LegacyLienConfig } from '../config/schema.js';
4
+ /**
5
+ * Normalize a file path to a consistent relative format.
6
+ * This ensures paths from different sources (git diff, scanner, etc.)
7
+ * are stored and queried consistently in the index.
8
+ *
9
+ * @param filepath - Absolute or relative file path
10
+ * @param rootDir - Workspace root directory (defaults to cwd)
11
+ * @returns Relative path from rootDir
12
+ */
13
+ export declare function normalizeToRelativePath(filepath: string, rootDir?: string): string;
14
+ export interface IncrementalIndexOptions {
15
+ verbose?: boolean;
16
+ }
17
+ /**
18
+ * Indexes a single file incrementally by updating its chunks in the vector database.
19
+ * This is the core function for incremental reindexing - it handles file changes,
20
+ * deletions, and additions.
21
+ *
22
+ * @param filepath - Absolute path to the file to index
23
+ * @param vectorDB - Initialized VectorDB instance
24
+ * @param embeddings - Initialized embeddings service
25
+ * @param config - Lien configuration
26
+ * @param options - Optional settings
27
+ */
28
+ export declare function indexSingleFile(filepath: string, vectorDB: VectorDB, embeddings: EmbeddingService, config: LienConfig | LegacyLienConfig, options?: IncrementalIndexOptions): Promise<void>;
29
+ /**
30
+ * Indexes multiple files incrementally.
31
+ * Processes files sequentially for simplicity and reliability.
32
+ *
33
+ * Uses Result type for explicit error handling, making it easier to test
34
+ * and reason about failure modes.
35
+ *
36
+ * Note: This function counts both successfully indexed files AND successfully
37
+ * handled deletions (files that don't exist but were removed from the index).
38
+ *
39
+ * @param filepaths - Array of absolute file paths to index
40
+ * @param vectorDB - Initialized VectorDB instance
41
+ * @param embeddings - Initialized embeddings service
42
+ * @param config - Lien configuration
43
+ * @param options - Optional settings
44
+ * @returns Number of successfully processed files (indexed or deleted)
45
+ */
46
+ export declare function indexMultipleFiles(filepaths: string[], vectorDB: VectorDB, embeddings: EmbeddingService, config: LienConfig | LegacyLienConfig, options?: IncrementalIndexOptions): Promise<number>;
47
+ //# sourceMappingURL=incremental.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../src/indexer/incremental.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAkC,MAAM,qBAAqB,CAAC;AAMnG;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBlF;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA+FD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,UAAU,GAAG,gBAAgB,EACrC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAkEf;AAkCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,UAAU,GAAG,gBAAgB,EACrC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC,CAmGjB"}
@@ -0,0 +1,284 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { chunkFile } from './chunker.js';
4
+ import { isModernConfig, isLegacyConfig } from '../config/schema.js';
5
+ import { ManifestManager } from './manifest.js';
6
+ import { EMBEDDING_MICRO_BATCH_SIZE } from '../constants.js';
7
+ import { Ok, Err, isOk } from '../utils/result.js';
8
+ /**
9
+ * Normalize a file path to a consistent relative format.
10
+ * This ensures paths from different sources (git diff, scanner, etc.)
11
+ * are stored and queried consistently in the index.
12
+ *
13
+ * @param filepath - Absolute or relative file path
14
+ * @param rootDir - Workspace root directory (defaults to cwd)
15
+ * @returns Relative path from rootDir
16
+ */
17
+ export function normalizeToRelativePath(filepath, rootDir) {
18
+ // Normalize root and strip trailing slash to ensure consistent comparison
19
+ const root = (rootDir || process.cwd()).replace(/\\/g, '/').replace(/\/$/, '');
20
+ const normalized = filepath.replace(/\\/g, '/');
21
+ // If already relative, return as-is
22
+ if (!path.isAbsolute(filepath)) {
23
+ return normalized;
24
+ }
25
+ // Convert absolute to relative
26
+ if (normalized.startsWith(root + '/')) {
27
+ return normalized.slice(root.length + 1);
28
+ }
29
+ if (normalized.startsWith(root)) {
30
+ return normalized.slice(root.length);
31
+ }
32
+ // Fallback: use path.relative
33
+ return path.relative(root, filepath).replace(/\\/g, '/');
34
+ }
35
+ /**
36
+ * Shared helper that processes file content into chunks and embeddings.
37
+ * This is the core logic shared between indexSingleFile and indexMultipleFiles.
38
+ *
39
+ * Returns null for empty files (0 chunks), which callers should handle appropriately.
40
+ *
41
+ * @param filepath - Path to the file being processed
42
+ * @param content - File content
43
+ * @param embeddings - Embeddings service
44
+ * @param config - Lien configuration
45
+ * @param verbose - Whether to log verbose output
46
+ * @returns ProcessFileResult for non-empty files, null for empty files
47
+ */
48
+ async function processFileContent(filepath, content, embeddings, config, verbose) {
49
+ // Get chunk settings (support both v0.3.0 and legacy v0.2.0 configs)
50
+ const chunkSize = isModernConfig(config)
51
+ ? config.core.chunkSize
52
+ : (isLegacyConfig(config) ? config.indexing.chunkSize : 75);
53
+ const chunkOverlap = isModernConfig(config)
54
+ ? config.core.chunkOverlap
55
+ : (isLegacyConfig(config) ? config.indexing.chunkOverlap : 10);
56
+ const useAST = isModernConfig(config)
57
+ ? config.chunking.useAST
58
+ : true;
59
+ const astFallback = isModernConfig(config)
60
+ ? config.chunking.astFallback
61
+ : 'line-based';
62
+ // Chunk the file
63
+ const chunks = chunkFile(filepath, content, {
64
+ chunkSize,
65
+ chunkOverlap,
66
+ useAST,
67
+ astFallback,
68
+ });
69
+ if (chunks.length === 0) {
70
+ // Empty file - return null so caller can handle appropriately
71
+ if (verbose) {
72
+ console.error(`[Lien] Empty file: ${filepath}`);
73
+ }
74
+ return null;
75
+ }
76
+ // Generate embeddings for all chunks
77
+ // Use micro-batching to prevent event loop blocking
78
+ const texts = chunks.map(c => c.content);
79
+ const vectors = [];
80
+ for (let j = 0; j < texts.length; j += EMBEDDING_MICRO_BATCH_SIZE) {
81
+ const microBatch = texts.slice(j, Math.min(j + EMBEDDING_MICRO_BATCH_SIZE, texts.length));
82
+ const microResults = await embeddings.embedBatch(microBatch);
83
+ vectors.push(...microResults);
84
+ // Yield to event loop for responsiveness
85
+ if (texts.length > EMBEDDING_MICRO_BATCH_SIZE) {
86
+ await new Promise(resolve => setImmediate(resolve));
87
+ }
88
+ }
89
+ return {
90
+ chunkCount: chunks.length,
91
+ vectors,
92
+ chunks,
93
+ texts,
94
+ };
95
+ }
96
+ /**
97
+ * Indexes a single file incrementally by updating its chunks in the vector database.
98
+ * This is the core function for incremental reindexing - it handles file changes,
99
+ * deletions, and additions.
100
+ *
101
+ * @param filepath - Absolute path to the file to index
102
+ * @param vectorDB - Initialized VectorDB instance
103
+ * @param embeddings - Initialized embeddings service
104
+ * @param config - Lien configuration
105
+ * @param options - Optional settings
106
+ */
107
+ export async function indexSingleFile(filepath, vectorDB, embeddings, config, options = {}) {
108
+ const { verbose } = options;
109
+ // Normalize to relative path for consistent storage and queries
110
+ // This ensures paths from git diff (absolute) match paths from scanner (relative)
111
+ const normalizedPath = normalizeToRelativePath(filepath);
112
+ try {
113
+ // Check if file exists (use original filepath for filesystem operations)
114
+ try {
115
+ await fs.access(filepath);
116
+ }
117
+ catch {
118
+ // File doesn't exist - delete from index and manifest using normalized path
119
+ if (verbose) {
120
+ console.error(`[Lien] File deleted: ${normalizedPath}`);
121
+ }
122
+ await vectorDB.deleteByFile(normalizedPath);
123
+ const manifest = new ManifestManager(vectorDB.dbPath);
124
+ await manifest.removeFile(normalizedPath);
125
+ return;
126
+ }
127
+ // Read file content
128
+ const content = await fs.readFile(filepath, 'utf-8');
129
+ // Process file content (chunking + embeddings) - use normalized path for storage
130
+ const result = await processFileContent(normalizedPath, content, embeddings, config, verbose || false);
131
+ // Get actual file mtime for manifest
132
+ const stats = await fs.stat(filepath);
133
+ const manifest = new ManifestManager(vectorDB.dbPath);
134
+ if (result === null) {
135
+ // Empty file - remove from vector DB but keep in manifest with chunkCount: 0
136
+ await vectorDB.deleteByFile(normalizedPath);
137
+ await manifest.updateFile(normalizedPath, {
138
+ filepath: normalizedPath,
139
+ lastModified: stats.mtimeMs,
140
+ chunkCount: 0,
141
+ });
142
+ return;
143
+ }
144
+ // Non-empty file - update in database (atomic: delete old + insert new)
145
+ await vectorDB.updateFile(normalizedPath, result.vectors, result.chunks.map(c => c.metadata), result.texts);
146
+ // Update manifest after successful indexing
147
+ await manifest.updateFile(normalizedPath, {
148
+ filepath: normalizedPath,
149
+ lastModified: stats.mtimeMs,
150
+ chunkCount: result.chunkCount,
151
+ });
152
+ if (verbose) {
153
+ console.error(`[Lien] ✓ Updated ${normalizedPath} (${result.chunkCount} chunks)`);
154
+ }
155
+ }
156
+ catch (error) {
157
+ // Log error but don't throw - we want to continue with other files
158
+ console.error(`[Lien] ⚠️ Failed to index ${normalizedPath}: ${error}`);
159
+ }
160
+ }
161
+ /**
162
+ * Process a single file, returning a Result type.
163
+ * This helper makes error handling explicit and testable.
164
+ *
165
+ * @param filepath - Original filepath (may be absolute)
166
+ * @param normalizedPath - Normalized relative path for storage
167
+ */
168
+ async function processSingleFileForIndexing(filepath, normalizedPath, embeddings, config, verbose) {
169
+ try {
170
+ // Read file stats and content using original path (for filesystem access)
171
+ const stats = await fs.stat(filepath);
172
+ const content = await fs.readFile(filepath, 'utf-8');
173
+ // Process content using normalized path (for storage)
174
+ const result = await processFileContent(normalizedPath, content, embeddings, config, verbose);
175
+ return Ok({
176
+ filepath: normalizedPath, // Store normalized path
177
+ result,
178
+ mtime: stats.mtimeMs,
179
+ });
180
+ }
181
+ catch (error) {
182
+ return Err(`Failed to process ${normalizedPath}: ${error}`);
183
+ }
184
+ }
185
+ /**
186
+ * Indexes multiple files incrementally.
187
+ * Processes files sequentially for simplicity and reliability.
188
+ *
189
+ * Uses Result type for explicit error handling, making it easier to test
190
+ * and reason about failure modes.
191
+ *
192
+ * Note: This function counts both successfully indexed files AND successfully
193
+ * handled deletions (files that don't exist but were removed from the index).
194
+ *
195
+ * @param filepaths - Array of absolute file paths to index
196
+ * @param vectorDB - Initialized VectorDB instance
197
+ * @param embeddings - Initialized embeddings service
198
+ * @param config - Lien configuration
199
+ * @param options - Optional settings
200
+ * @returns Number of successfully processed files (indexed or deleted)
201
+ */
202
+ export async function indexMultipleFiles(filepaths, vectorDB, embeddings, config, options = {}) {
203
+ const { verbose } = options;
204
+ let processedCount = 0;
205
+ // Batch manifest updates for performance
206
+ const manifestEntries = [];
207
+ // Process each file sequentially (simple and reliable)
208
+ for (const filepath of filepaths) {
209
+ // Normalize to relative path for consistent storage and queries
210
+ // This ensures paths from git diff (absolute) match paths from scanner (relative)
211
+ const normalizedPath = normalizeToRelativePath(filepath);
212
+ const result = await processSingleFileForIndexing(filepath, normalizedPath, embeddings, config, verbose || false);
213
+ if (isOk(result)) {
214
+ const { filepath: storedPath, result: processResult, mtime } = result.value;
215
+ if (processResult === null) {
216
+ // Empty file - remove from vector DB but keep in manifest with chunkCount: 0
217
+ try {
218
+ await vectorDB.deleteByFile(storedPath);
219
+ }
220
+ catch (error) {
221
+ // Ignore errors if file wasn't in index
222
+ }
223
+ // Update manifest immediately for empty files (not batched)
224
+ const manifest = new ManifestManager(vectorDB.dbPath);
225
+ await manifest.updateFile(storedPath, {
226
+ filepath: storedPath,
227
+ lastModified: mtime,
228
+ chunkCount: 0,
229
+ });
230
+ processedCount++;
231
+ continue;
232
+ }
233
+ // Non-empty file - delete old chunks if they exist
234
+ try {
235
+ await vectorDB.deleteByFile(storedPath);
236
+ }
237
+ catch (error) {
238
+ // Ignore - file might not be in index yet
239
+ }
240
+ // Insert new chunks
241
+ await vectorDB.insertBatch(processResult.vectors, processResult.chunks.map(c => c.metadata), processResult.texts);
242
+ // Queue manifest update (batch at end)
243
+ manifestEntries.push({
244
+ filepath: storedPath,
245
+ chunkCount: processResult.chunkCount,
246
+ mtime,
247
+ });
248
+ if (verbose) {
249
+ console.error(`[Lien] ✓ Updated ${storedPath} (${processResult.chunkCount} chunks)`);
250
+ }
251
+ processedCount++;
252
+ }
253
+ else {
254
+ // File doesn't exist or couldn't be read - handle deletion
255
+ if (verbose) {
256
+ console.error(`[Lien] ${result.error}`);
257
+ }
258
+ try {
259
+ await vectorDB.deleteByFile(normalizedPath);
260
+ const manifest = new ManifestManager(vectorDB.dbPath);
261
+ await manifest.removeFile(normalizedPath);
262
+ }
263
+ catch (error) {
264
+ // Ignore errors if file wasn't in index
265
+ if (verbose) {
266
+ console.error(`[Lien] Note: ${normalizedPath} not in index`);
267
+ }
268
+ }
269
+ // Count as processed regardless of deletion success/failure
270
+ processedCount++;
271
+ }
272
+ }
273
+ // Batch update manifest at the end (much faster than updating after each file)
274
+ if (manifestEntries.length > 0) {
275
+ const manifest = new ManifestManager(vectorDB.dbPath);
276
+ await manifest.updateFiles(manifestEntries.map(entry => ({
277
+ filepath: entry.filepath,
278
+ lastModified: entry.mtime, // Use actual file mtime for accurate change detection
279
+ chunkCount: entry.chunkCount,
280
+ })));
281
+ }
282
+ return processedCount;
283
+ }
284
+ //# sourceMappingURL=incremental.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/indexer/incremental.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
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 { type LienConfig } from '../config/schema.js';
11
+ import type { EmbeddingService } from '../embeddings/types.js';
12
+ /**
13
+ * Options for indexing a codebase
14
+ */
15
+ export interface IndexingOptions {
16
+ /** Root directory to index (defaults to cwd) */
17
+ rootDir?: string;
18
+ /** Show verbose output */
19
+ verbose?: boolean;
20
+ /** Force full reindex, skip incremental */
21
+ force?: boolean;
22
+ /** Pre-initialized embedding service (for warm workers) */
23
+ embeddings?: EmbeddingService;
24
+ /** Pre-loaded config (skip loading from disk) */
25
+ config?: LienConfig;
26
+ /** Progress callback for external UI */
27
+ onProgress?: (progress: IndexingProgress) => void;
28
+ }
29
+ /**
30
+ * Progress information during indexing
31
+ */
32
+ export interface IndexingProgress {
33
+ phase: 'initializing' | 'scanning' | 'embedding' | 'indexing' | 'saving' | 'complete';
34
+ message: string;
35
+ filesTotal?: number;
36
+ filesProcessed?: number;
37
+ chunksProcessed?: number;
38
+ }
39
+ /**
40
+ * Result of indexing operation
41
+ */
42
+ export interface IndexingResult {
43
+ success: boolean;
44
+ filesIndexed: number;
45
+ chunksCreated: number;
46
+ durationMs: number;
47
+ incremental: boolean;
48
+ error?: string;
49
+ }
50
+ /**
51
+ * Index a codebase, creating vector embeddings for semantic search.
52
+ *
53
+ * This is the main entry point for indexing. It:
54
+ * - Tries incremental indexing first (if not forced)
55
+ * - Falls back to full indexing if needed
56
+ * - Provides progress callbacks for UI integration
57
+ *
58
+ * @param options - Indexing options
59
+ * @returns Indexing result with stats
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * // Basic usage
64
+ * const result = await indexCodebase({ rootDir: '/path/to/project' });
65
+ *
66
+ * // With progress callback
67
+ * const result = await indexCodebase({
68
+ * rootDir: '/path/to/project',
69
+ * onProgress: (p) => console.log(`${p.phase}: ${p.message}`)
70
+ * });
71
+ *
72
+ * // With pre-initialized embeddings (warm worker)
73
+ * const embeddings = new LocalEmbeddings();
74
+ * await embeddings.initialize();
75
+ * const result = await indexCodebase({ embeddings });
76
+ * ```
77
+ */
78
+ export declare function indexCodebase(options?: IndexingOptions): Promise<IndexingResult>;
79
+ export type { FileIndexEntry } from './chunk-batch-processor.js';
80
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAAkC,KAAK,UAAU,EAAyB,MAAM,qBAAqB,CAAC;AAM7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iDAAiD;IACjD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4YD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC1F;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}