@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,29 @@
1
+ import type Parser from 'tree-sitter';
2
+ import type { LanguageTraverser, DeclarationFunctionInfo } from './types.js';
3
+ /**
4
+ * TypeScript/JavaScript AST traverser
5
+ *
6
+ * Handles TypeScript and JavaScript AST node types and traversal patterns.
7
+ * Both languages share the same AST structure (via tree-sitter-typescript).
8
+ */
9
+ export declare class TypeScriptTraverser implements LanguageTraverser {
10
+ targetNodeTypes: string[];
11
+ containerTypes: string[];
12
+ declarationTypes: string[];
13
+ functionTypes: string[];
14
+ shouldExtractChildren(node: Parser.SyntaxNode): boolean;
15
+ isDeclarationWithFunction(node: Parser.SyntaxNode): boolean;
16
+ getContainerBody(node: Parser.SyntaxNode): Parser.SyntaxNode | null;
17
+ shouldTraverseChildren(node: Parser.SyntaxNode): boolean;
18
+ findParentContainerName(node: Parser.SyntaxNode): string | undefined;
19
+ /**
20
+ * Check if a declaration node contains a function (arrow, function expression, etc.)
21
+ */
22
+ findFunctionInDeclaration(node: Parser.SyntaxNode): DeclarationFunctionInfo;
23
+ }
24
+ /**
25
+ * JavaScript uses the same traverser as TypeScript
26
+ */
27
+ export declare class JavaScriptTraverser extends TypeScriptTraverser {
28
+ }
29
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../../src/indexer/ast/traversers/typescript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE7E;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,iBAAiB;IAC3D,eAAe,WAOb;IAEF,cAAc,WAEZ;IAEF,gBAAgB,WAGd;IAEF,aAAa,WAIX;IAEF,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO;IAIvD,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO;IAI3D,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI;IAOnE,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO;IAMxD,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,SAAS;IAYpE;;OAEG;IACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,uBAAuB;CAyB5E;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,mBAAmB;CAAG"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * TypeScript/JavaScript AST traverser
3
+ *
4
+ * Handles TypeScript and JavaScript AST node types and traversal patterns.
5
+ * Both languages share the same AST structure (via tree-sitter-typescript).
6
+ */
7
+ export class TypeScriptTraverser {
8
+ targetNodeTypes = [
9
+ 'function_declaration',
10
+ 'function',
11
+ 'interface_declaration',
12
+ 'method_definition',
13
+ 'lexical_declaration', // For const/let with arrow functions
14
+ 'variable_declaration', // For var with functions
15
+ ];
16
+ containerTypes = [
17
+ 'class_declaration', // We extract methods, not the class itself
18
+ ];
19
+ declarationTypes = [
20
+ 'lexical_declaration', // const/let
21
+ 'variable_declaration', // var
22
+ ];
23
+ functionTypes = [
24
+ 'arrow_function',
25
+ 'function_expression',
26
+ 'function',
27
+ ];
28
+ shouldExtractChildren(node) {
29
+ return this.containerTypes.includes(node.type);
30
+ }
31
+ isDeclarationWithFunction(node) {
32
+ return this.declarationTypes.includes(node.type);
33
+ }
34
+ getContainerBody(node) {
35
+ if (node.type === 'class_declaration') {
36
+ return node.childForFieldName('body');
37
+ }
38
+ return null;
39
+ }
40
+ shouldTraverseChildren(node) {
41
+ return node.type === 'program' ||
42
+ node.type === 'export_statement' ||
43
+ node.type === 'class_body';
44
+ }
45
+ findParentContainerName(node) {
46
+ let current = node.parent;
47
+ while (current) {
48
+ if (current.type === 'class_declaration') {
49
+ const nameNode = current.childForFieldName('name');
50
+ return nameNode?.text;
51
+ }
52
+ current = current.parent;
53
+ }
54
+ return undefined;
55
+ }
56
+ /**
57
+ * Check if a declaration node contains a function (arrow, function expression, etc.)
58
+ */
59
+ findFunctionInDeclaration(node) {
60
+ const search = (n, depth) => {
61
+ if (depth > 3)
62
+ return null; // Don't search too deep
63
+ if (this.functionTypes.includes(n.type)) {
64
+ return n;
65
+ }
66
+ for (let i = 0; i < n.childCount; i++) {
67
+ const child = n.child(i);
68
+ if (child) {
69
+ const result = search(child, depth + 1);
70
+ if (result)
71
+ return result;
72
+ }
73
+ }
74
+ return null;
75
+ };
76
+ const functionNode = search(node, 0);
77
+ return {
78
+ hasFunction: functionNode !== null,
79
+ functionNode,
80
+ };
81
+ }
82
+ }
83
+ /**
84
+ * JavaScript uses the same traverser as TypeScript
85
+ */
86
+ export class JavaScriptTraverser extends TypeScriptTraverser {
87
+ }
88
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../../src/indexer/ast/traversers/typescript.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IAC9B,eAAe,GAAG;QAChB,sBAAsB;QACtB,UAAU;QACV,uBAAuB;QACvB,mBAAmB;QACnB,qBAAqB,EAAK,qCAAqC;QAC/D,sBAAsB,EAAI,yBAAyB;KACpD,CAAC;IAEF,cAAc,GAAG;QACf,mBAAmB,EAAO,2CAA2C;KACtE,CAAC;IAEF,gBAAgB,GAAG;QACjB,qBAAqB,EAAK,YAAY;QACtC,sBAAsB,EAAI,MAAM;KACjC,CAAC;IAEF,aAAa,GAAG;QACd,gBAAgB;QAChB,qBAAqB;QACrB,UAAU;KACX,CAAC;IAEF,qBAAqB,CAAC,IAAuB;QAC3C,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,yBAAyB,CAAC,IAAuB;QAC/C,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,gBAAgB,CAAC,IAAuB;QACtC,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sBAAsB,CAAC,IAAuB;QAC5C,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS;YACvB,IAAI,CAAC,IAAI,KAAK,kBAAkB;YAChC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;IACpC,CAAC;IAED,uBAAuB,CAAC,IAAuB;QAC7C,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,OAAO,OAAO,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACnD,OAAO,QAAQ,EAAE,IAAI,CAAC;YACxB,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,yBAAyB,CAAC,IAAuB;QAC/C,MAAM,MAAM,GAAG,CAAC,CAAoB,EAAE,KAAa,EAA4B,EAAE;YAC/E,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,wBAAwB;YAEpD,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,CAAC;YACX,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;oBACxC,IAAI,MAAM;wBAAE,OAAO,MAAM,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,WAAW,EAAE,YAAY,KAAK,IAAI;YAClC,YAAY;SACb,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,mBAAmB;CAAG"}
@@ -0,0 +1,59 @@
1
+ import type Parser from 'tree-sitter';
2
+ import type { CodeChunk } from '../types.js';
3
+ /**
4
+ * AST parse result containing the tree and any errors
5
+ */
6
+ export interface ASTParseResult {
7
+ tree: Parser.Tree | null;
8
+ error?: string;
9
+ }
10
+ /**
11
+ * Symbol information extracted from AST nodes
12
+ */
13
+ export interface SymbolInfo {
14
+ name: string;
15
+ type: 'function' | 'method' | 'class' | 'interface';
16
+ startLine: number;
17
+ endLine: number;
18
+ parentClass?: string;
19
+ signature?: string;
20
+ parameters?: string[];
21
+ returnType?: string;
22
+ complexity?: number;
23
+ cognitiveComplexity?: number;
24
+ }
25
+ /**
26
+ * Semantic metadata for AST-aware chunks
27
+ */
28
+ export interface SemanticMetadata {
29
+ symbolName?: string;
30
+ symbolType?: 'function' | 'method' | 'class' | 'interface';
31
+ parentClass?: string;
32
+ complexity?: number;
33
+ cognitiveComplexity?: number;
34
+ parameters?: string[];
35
+ signature?: string;
36
+ imports?: string[];
37
+ halsteadVolume?: number;
38
+ halsteadDifficulty?: number;
39
+ halsteadEffort?: number;
40
+ halsteadBugs?: number;
41
+ }
42
+ /**
43
+ * AST-aware chunk with enhanced semantic metadata
44
+ */
45
+ export interface ASTChunk extends CodeChunk {
46
+ metadata: CodeChunk['metadata'] & SemanticMetadata;
47
+ }
48
+ /**
49
+ * Language-specific parser configuration
50
+ */
51
+ export interface LanguageConfig {
52
+ extensions: string[];
53
+ parserName: string;
54
+ }
55
+ /**
56
+ * Supported languages for AST parsing
57
+ */
58
+ export type SupportedLanguage = 'typescript' | 'javascript' | 'php' | 'python';
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/indexer/ast/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAGnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,gBAAgB,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/indexer/ast/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { VectorDB } from '../vectordb/lancedb.js';
2
+ import { LienConfig, LegacyLienConfig } from '../config/schema.js';
3
+ /**
4
+ * Result of change detection, categorized by type of change
5
+ */
6
+ export interface ChangeDetectionResult {
7
+ added: string[];
8
+ modified: string[];
9
+ deleted: string[];
10
+ reason: 'mtime' | 'full' | 'git-state-changed';
11
+ }
12
+ /**
13
+ * Detects which files have changed since last indexing.
14
+ * Uses git state detection to handle branch switches, then falls back to mtime.
15
+ */
16
+ export declare function detectChanges(rootDir: string, vectorDB: VectorDB, config: LienConfig | LegacyLienConfig): Promise<ChangeDetectionResult>;
17
+ //# sourceMappingURL=change-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detector.d.ts","sourceRoot":"","sources":["../../src/indexer/change-detector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAkC,MAAM,qBAAqB,CAAC;AAKnG;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,mBAAmB,CAAC;CAChD;AAwID;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,GAAG,gBAAgB,GACpC,OAAO,CAAC,qBAAqB,CAAC,CAwBhC"}
@@ -0,0 +1,207 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { ManifestManager } from './manifest.js';
4
+ import { scanCodebase, scanCodebaseWithFrameworks } from './scanner.js';
5
+ import { isModernConfig, isLegacyConfig } from '../config/schema.js';
6
+ import { GitStateTracker } from '../git/tracker.js';
7
+ import { isGitAvailable, isGitRepo, getChangedFiles } from '../git/utils.js';
8
+ import { normalizeToRelativePath } from './incremental.js';
9
+ /**
10
+ * Check if git state has changed (branch switch, new commits).
11
+ */
12
+ async function hasGitStateChanged(rootDir, dbPath, savedGitState) {
13
+ if (!savedGitState)
14
+ return { changed: false };
15
+ const gitAvailable = await isGitAvailable();
16
+ const isRepo = await isGitRepo(rootDir);
17
+ if (!gitAvailable || !isRepo)
18
+ return { changed: false };
19
+ const gitTracker = new GitStateTracker(rootDir, dbPath);
20
+ await gitTracker.initialize();
21
+ const currentState = gitTracker.getState();
22
+ if (!currentState)
23
+ return { changed: false };
24
+ const changed = currentState.branch !== savedGitState.branch ||
25
+ currentState.commit !== savedGitState.commit;
26
+ return { changed, currentState };
27
+ }
28
+ /**
29
+ * Categorize files from git diff into added, modified, deleted.
30
+ */
31
+ function categorizeChangedFiles(changedFilesPaths, currentFileSet, normalizedManifestFiles, allFiles) {
32
+ const changedFilesSet = new Set(changedFilesPaths);
33
+ const added = [];
34
+ const modified = [];
35
+ const deleted = [];
36
+ // Categorize files from git diff
37
+ for (const filepath of changedFilesPaths) {
38
+ if (currentFileSet.has(filepath)) {
39
+ if (normalizedManifestFiles.has(filepath)) {
40
+ modified.push(filepath);
41
+ }
42
+ else {
43
+ added.push(filepath);
44
+ }
45
+ }
46
+ }
47
+ // Find truly new files (not in git diff, but not in old manifest)
48
+ for (const filepath of allFiles) {
49
+ if (!normalizedManifestFiles.has(filepath) && !changedFilesSet.has(filepath)) {
50
+ added.push(filepath);
51
+ }
52
+ }
53
+ // Find deleted files (in old manifest but not in current)
54
+ for (const normalizedPath of normalizedManifestFiles) {
55
+ if (!currentFileSet.has(normalizedPath)) {
56
+ deleted.push(normalizedPath);
57
+ }
58
+ }
59
+ return { added, modified, deleted };
60
+ }
61
+ /**
62
+ * Build normalized set of manifest file paths for comparison.
63
+ */
64
+ function normalizeManifestPaths(manifestFiles, rootDir) {
65
+ const normalized = new Set();
66
+ for (const filepath of Object.keys(manifestFiles)) {
67
+ normalized.add(normalizeToRelativePath(filepath, rootDir));
68
+ }
69
+ return normalized;
70
+ }
71
+ /**
72
+ * Detect changes using git diff between commits.
73
+ */
74
+ async function detectGitBasedChanges(rootDir, savedManifest, currentCommit, config) {
75
+ const changedFilesAbsolute = await getChangedFiles(rootDir, savedManifest.gitState.commit, currentCommit);
76
+ const changedFilesPaths = changedFilesAbsolute.map(fp => normalizeToRelativePath(fp, rootDir));
77
+ const allFiles = await getAllFiles(rootDir, config);
78
+ const currentFileSet = new Set(allFiles);
79
+ const normalizedManifestFiles = normalizeManifestPaths(savedManifest.files, rootDir);
80
+ const { added, modified, deleted } = categorizeChangedFiles(changedFilesPaths, currentFileSet, normalizedManifestFiles, allFiles);
81
+ return { added, modified, deleted, reason: 'git-state-changed' };
82
+ }
83
+ /**
84
+ * Fall back to full reindex when git diff fails.
85
+ */
86
+ async function fallbackToFullReindex(rootDir, savedManifest, config) {
87
+ const allFiles = await getAllFiles(rootDir, config);
88
+ const currentFileSet = new Set(allFiles);
89
+ const deleted = [];
90
+ for (const filepath of Object.keys(savedManifest.files)) {
91
+ const normalizedPath = normalizeToRelativePath(filepath, rootDir);
92
+ if (!currentFileSet.has(normalizedPath)) {
93
+ deleted.push(normalizedPath);
94
+ }
95
+ }
96
+ return { added: allFiles, modified: [], deleted, reason: 'git-state-changed' };
97
+ }
98
+ /**
99
+ * Detects which files have changed since last indexing.
100
+ * Uses git state detection to handle branch switches, then falls back to mtime.
101
+ */
102
+ export async function detectChanges(rootDir, vectorDB, config) {
103
+ const manifest = new ManifestManager(vectorDB.dbPath);
104
+ const savedManifest = await manifest.load();
105
+ // No manifest = first run = full index
106
+ if (!savedManifest) {
107
+ const allFiles = await getAllFiles(rootDir, config);
108
+ return { added: allFiles, modified: [], deleted: [], reason: 'full' };
109
+ }
110
+ // Check if git state has changed
111
+ const gitCheck = await hasGitStateChanged(rootDir, vectorDB.dbPath, savedManifest.gitState);
112
+ if (gitCheck.changed && gitCheck.currentState) {
113
+ try {
114
+ return await detectGitBasedChanges(rootDir, savedManifest, gitCheck.currentState.commit, config);
115
+ }
116
+ catch (error) {
117
+ console.warn(`[Lien] Git diff failed, falling back to full reindex: ${error}`);
118
+ return await fallbackToFullReindex(rootDir, savedManifest, config);
119
+ }
120
+ }
121
+ // Use mtime-based detection for file-level changes
122
+ return await mtimeBasedDetection(rootDir, savedManifest, config);
123
+ }
124
+ /**
125
+ * Gets all files in the project based on configuration.
126
+ * Always returns relative paths for consistent comparison with manifest and git diff.
127
+ */
128
+ async function getAllFiles(rootDir, config) {
129
+ let files;
130
+ if (isModernConfig(config) && config.frameworks.length > 0) {
131
+ files = await scanCodebaseWithFrameworks(rootDir, config);
132
+ }
133
+ else if (isLegacyConfig(config)) {
134
+ files = await scanCodebase({
135
+ rootDir,
136
+ includePatterns: config.indexing.include,
137
+ excludePatterns: config.indexing.exclude,
138
+ });
139
+ }
140
+ else {
141
+ files = await scanCodebase({
142
+ rootDir,
143
+ includePatterns: [],
144
+ excludePatterns: [],
145
+ });
146
+ }
147
+ // Normalize all paths to relative for consistent comparison
148
+ return files.map(fp => normalizeToRelativePath(fp, rootDir));
149
+ }
150
+ /**
151
+ * Detects changes by comparing file modification times
152
+ */
153
+ async function mtimeBasedDetection(rootDir, savedManifest, config) {
154
+ const added = [];
155
+ const modified = [];
156
+ const deleted = [];
157
+ // Get all current files (already normalized to relative paths by getAllFiles)
158
+ const currentFiles = await getAllFiles(rootDir, config);
159
+ const currentFileSet = new Set(currentFiles);
160
+ // Build a normalized map of manifest files for comparison
161
+ // This handles cases where manifest has absolute paths (from tests or legacy data)
162
+ const normalizedManifestFiles = new Map();
163
+ for (const [filepath, entry] of Object.entries(savedManifest.files)) {
164
+ const normalizedPath = normalizeToRelativePath(filepath, rootDir);
165
+ normalizedManifestFiles.set(normalizedPath, entry);
166
+ }
167
+ // Get mtimes for all current files
168
+ // Note: need to construct absolute path for fs.stat since currentFiles are relative
169
+ const fileStats = new Map();
170
+ for (const filepath of currentFiles) {
171
+ try {
172
+ // Construct absolute path for filesystem access (use path.join for cross-platform)
173
+ const absolutePath = path.isAbsolute(filepath) ? filepath : path.join(rootDir, filepath);
174
+ const stats = await fs.stat(absolutePath);
175
+ fileStats.set(filepath, stats.mtimeMs);
176
+ }
177
+ catch {
178
+ // Ignore files we can't stat
179
+ continue;
180
+ }
181
+ }
182
+ // Check for new and modified files
183
+ for (const [filepath, mtime] of fileStats) {
184
+ const entry = normalizedManifestFiles.get(filepath);
185
+ if (!entry) {
186
+ // New file
187
+ added.push(filepath);
188
+ }
189
+ else if (entry.lastModified < mtime) {
190
+ // File modified since last index
191
+ modified.push(filepath);
192
+ }
193
+ }
194
+ // Check for deleted files (use normalized manifest paths)
195
+ for (const normalizedPath of normalizedManifestFiles.keys()) {
196
+ if (!currentFileSet.has(normalizedPath)) {
197
+ deleted.push(normalizedPath);
198
+ }
199
+ }
200
+ return {
201
+ added,
202
+ modified,
203
+ deleted,
204
+ reason: 'mtime',
205
+ };
206
+ }
207
+ //# sourceMappingURL=change-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detector.js","sourceRoot":"","sources":["../../src/indexer/change-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * ChunkBatchProcessor - Handles concurrent chunk accumulation and batch processing.
3
+ *
4
+ * Extracted from performFullIndex to:
5
+ * 1. Encapsulate mutex/lock management complexity
6
+ * 2. Make the batch processing logic testable
7
+ * 3. Separate concerns (accumulation vs processing vs coordination)
8
+ *
9
+ * Key responsibilities:
10
+ * - Accumulate chunks from concurrent file processing
11
+ * - Batch chunks for embedding generation
12
+ * - Manage concurrent access with mutex pattern
13
+ * - Process batches through embedding → vectordb pipeline
14
+ */
15
+ import type { VectorDB } from '../vectordb/lancedb.js';
16
+ import type { EmbeddingService } from '../embeddings/types.js';
17
+ import type { ProgressTracker } from './progress-tracker.js';
18
+ import type { CodeChunk } from './types.js';
19
+ /** A chunk with its content ready for embedding */
20
+ export interface ChunkWithContent {
21
+ chunk: CodeChunk;
22
+ content: string;
23
+ }
24
+ /** Configuration for batch processing */
25
+ export interface BatchProcessorConfig {
26
+ /** Number of chunks to accumulate before triggering a batch */
27
+ batchThreshold: number;
28
+ /** Size of embedding batches (for API/memory limits) */
29
+ embeddingBatchSize: number;
30
+ }
31
+ /** Result of adding chunks - includes file metadata for manifest */
32
+ export interface FileIndexEntry {
33
+ filepath: string;
34
+ chunkCount: number;
35
+ mtime: number;
36
+ }
37
+ /**
38
+ * Process embeddings in micro-batches to prevent event loop blocking.
39
+ * Yields to the event loop between batches for UI responsiveness.
40
+ */
41
+ export declare function processEmbeddingMicroBatches(texts: string[], embeddings: EmbeddingService): Promise<Float32Array[]>;
42
+ /**
43
+ * ChunkBatchProcessor handles the complex concurrent chunk accumulation
44
+ * and batch processing logic for indexing.
45
+ *
46
+ * Usage:
47
+ * ```typescript
48
+ * const processor = new ChunkBatchProcessor(vectorDB, embeddings, config, tracker);
49
+ *
50
+ * // From concurrent file processing tasks:
51
+ * await processor.addChunks(chunks, filepath, mtime);
52
+ *
53
+ * // After all files processed:
54
+ * await processor.flush();
55
+ *
56
+ * // Get results:
57
+ * const { processedChunks, indexedFiles } = processor.getResults();
58
+ * ```
59
+ */
60
+ export declare class ChunkBatchProcessor {
61
+ private readonly vectorDB;
62
+ private readonly embeddings;
63
+ private readonly config;
64
+ private readonly progressTracker;
65
+ private readonly accumulator;
66
+ private readonly indexedFiles;
67
+ private processedChunkCount;
68
+ private addChunksLock;
69
+ private processingQueue;
70
+ constructor(vectorDB: VectorDB, embeddings: EmbeddingService, config: BatchProcessorConfig, progressTracker: ProgressTracker);
71
+ /**
72
+ * Add chunks from a processed file.
73
+ * Thread-safe: uses mutex to prevent race conditions with concurrent calls.
74
+ *
75
+ * @param chunks - Code chunks to add
76
+ * @param filepath - Source file path (for manifest)
77
+ * @param mtime - File modification time in ms (for change detection)
78
+ */
79
+ addChunks(chunks: CodeChunk[], filepath: string, mtime: number): Promise<void>;
80
+ /**
81
+ * Flush any remaining accumulated chunks.
82
+ * Call this after all files have been processed.
83
+ */
84
+ flush(): Promise<void>;
85
+ /**
86
+ * Get processing results.
87
+ */
88
+ getResults(): {
89
+ processedChunks: number;
90
+ indexedFiles: FileIndexEntry[];
91
+ };
92
+ /**
93
+ * Trigger batch processing. Uses queue-based synchronization
94
+ * to prevent TOCTOU race conditions.
95
+ */
96
+ private triggerProcessing;
97
+ /**
98
+ * The actual batch processing logic.
99
+ * Processes accumulated chunks through embedding → vectordb pipeline.
100
+ */
101
+ private doProcess;
102
+ }
103
+ //# sourceMappingURL=chunk-batch-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-batch-processor.d.ts","sourceRoot":"","sources":["../../src/indexer/chunk-batch-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC,CAazB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAmB;IAU5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAZlC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,mBAAmB,CAAK;IAGhC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAA8B;gBAGlC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,oBAAoB,EAC5B,eAAe,EAAE,eAAe;IAGnD;;;;;;;OAOG;IACG,SAAS,CACb,MAAM,EAAE,SAAS,EAAE,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IA2ChB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,UAAU,IAAI;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,cAAc,EAAE,CAAA;KAAE;IAOzE;;;OAGG;YACW,iBAAiB;IAU/B;;;OAGG;YACW,SAAS;CA4CxB"}