@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,109 @@
1
+ /**
2
+ * LRU cache for embeddings with configurable max size.
3
+ * Wraps any EmbeddingService to add caching functionality.
4
+ *
5
+ * Benefits:
6
+ * - Faster repeated searches
7
+ * - Reduced CPU usage
8
+ * - Better user experience for common queries
9
+ */
10
+ export class CachedEmbeddings {
11
+ cache = new Map();
12
+ maxSize;
13
+ underlying;
14
+ /**
15
+ * Creates a new cached embeddings service
16
+ * @param underlying - The underlying embedding service to wrap
17
+ * @param maxSize - Maximum number of embeddings to cache (default: 1000)
18
+ */
19
+ constructor(underlying, maxSize = 1000) {
20
+ this.underlying = underlying;
21
+ this.maxSize = maxSize;
22
+ }
23
+ async initialize() {
24
+ return this.underlying.initialize();
25
+ }
26
+ async embed(text) {
27
+ // Check cache first
28
+ const cached = this.cache.get(text);
29
+ if (cached) {
30
+ return cached;
31
+ }
32
+ // Generate embedding
33
+ const result = await this.underlying.embed(text);
34
+ // Add to cache with LRU eviction
35
+ if (this.cache.size >= this.maxSize) {
36
+ // Remove oldest entry (first key in Map)
37
+ const firstKey = this.cache.keys().next().value;
38
+ if (firstKey !== undefined) {
39
+ this.cache.delete(firstKey);
40
+ }
41
+ }
42
+ this.cache.set(text, result);
43
+ return result;
44
+ }
45
+ async embedBatch(texts) {
46
+ const results = [];
47
+ const uncachedTexts = [];
48
+ const uncachedIndices = [];
49
+ // Check cache for each text
50
+ for (let i = 0; i < texts.length; i++) {
51
+ const cached = this.cache.get(texts[i]);
52
+ if (cached) {
53
+ results[i] = cached;
54
+ }
55
+ else {
56
+ uncachedTexts.push(texts[i]);
57
+ uncachedIndices.push(i);
58
+ }
59
+ }
60
+ // Generate embeddings for uncached texts
61
+ if (uncachedTexts.length > 0) {
62
+ const newEmbeddings = await this.underlying.embedBatch(uncachedTexts);
63
+ // Store in cache and results
64
+ for (let i = 0; i < newEmbeddings.length; i++) {
65
+ const text = uncachedTexts[i];
66
+ const embedding = newEmbeddings[i];
67
+ const resultIndex = uncachedIndices[i];
68
+ // Add to cache with LRU eviction
69
+ if (this.cache.size >= this.maxSize) {
70
+ const firstKey = this.cache.keys().next().value;
71
+ if (firstKey !== undefined) {
72
+ this.cache.delete(firstKey);
73
+ }
74
+ }
75
+ this.cache.set(text, embedding);
76
+ results[resultIndex] = embedding;
77
+ }
78
+ }
79
+ return results;
80
+ }
81
+ /**
82
+ * Gets the current cache size
83
+ */
84
+ getCacheSize() {
85
+ return this.cache.size;
86
+ }
87
+ /**
88
+ * Gets cache statistics
89
+ */
90
+ getCacheStats() {
91
+ return {
92
+ size: this.cache.size,
93
+ maxSize: this.maxSize,
94
+ };
95
+ }
96
+ /**
97
+ * Clears the cache
98
+ */
99
+ clearCache() {
100
+ this.cache.clear();
101
+ }
102
+ /**
103
+ * Checks if a text is in the cache
104
+ */
105
+ has(text) {
106
+ return this.cache.has(text);
107
+ }
108
+ }
109
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/embeddings/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { EmbeddingService } from './types.js';
2
+ export declare class LocalEmbeddings implements EmbeddingService {
3
+ private extractor;
4
+ private readonly modelName;
5
+ private initPromise;
6
+ initialize(): Promise<void>;
7
+ embed(text: string): Promise<Float32Array>;
8
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
9
+ }
10
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQ9C,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,WAAW,CAA8B;IAE3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmB1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAkB3D"}
@@ -0,0 +1,63 @@
1
+ import { pipeline, env } from '@xenova/transformers';
2
+ import { EmbeddingError, wrapError } from '../errors/index.js';
3
+ import { DEFAULT_EMBEDDING_MODEL } from '../constants.js';
4
+ // Configure transformers.js to cache models locally
5
+ env.allowRemoteModels = true;
6
+ env.allowLocalModels = true;
7
+ export class LocalEmbeddings {
8
+ extractor = null;
9
+ modelName = DEFAULT_EMBEDDING_MODEL;
10
+ initPromise = null;
11
+ async initialize() {
12
+ // Prevent multiple simultaneous initializations
13
+ if (this.initPromise) {
14
+ return this.initPromise;
15
+ }
16
+ if (this.extractor) {
17
+ return;
18
+ }
19
+ this.initPromise = (async () => {
20
+ try {
21
+ // This downloads ~100MB on first run, then caches in ~/.cache/huggingface
22
+ this.extractor = await pipeline('feature-extraction', this.modelName);
23
+ }
24
+ catch (error) {
25
+ this.initPromise = null;
26
+ throw wrapError(error, 'Failed to initialize embedding model');
27
+ }
28
+ })();
29
+ return this.initPromise;
30
+ }
31
+ async embed(text) {
32
+ await this.initialize();
33
+ if (!this.extractor) {
34
+ throw new EmbeddingError('Embedding model not initialized');
35
+ }
36
+ try {
37
+ const output = await this.extractor(text, {
38
+ pooling: 'mean',
39
+ normalize: true,
40
+ });
41
+ return output.data;
42
+ }
43
+ catch (error) {
44
+ throw wrapError(error, 'Failed to generate embedding', { textLength: text.length });
45
+ }
46
+ }
47
+ async embedBatch(texts) {
48
+ await this.initialize();
49
+ if (!this.extractor) {
50
+ throw new EmbeddingError('Embedding model not initialized');
51
+ }
52
+ try {
53
+ // Process embeddings with Promise.all for concurrent execution
54
+ // Each call is sequential but Promise.all allows task interleaving
55
+ const results = await Promise.all(texts.map(text => this.embed(text)));
56
+ return results;
57
+ }
58
+ catch (error) {
59
+ throw wrapError(error, 'Failed to generate batch embeddings', { batchSize: texts.length });
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAkC,MAAM,sBAAsB,CAAC;AAErF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,oDAAoD;AACpD,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC7B,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAE5B,MAAM,OAAO,eAAe;IAClB,SAAS,GAAqC,IAAI,CAAC;IAC1C,SAAS,GAAG,uBAAuB,CAAC;IAC7C,WAAW,GAAyB,IAAI,CAAC;IAEjD,KAAK,CAAC,UAAU;QACd,gDAAgD;QAChD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;YAC7B,IAAI,CAAC;gBACH,0EAA0E;gBAC1E,IAAI,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAA8B,CAAC;YACrG,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACxB,MAAM,SAAS,CAAC,KAAK,EAAE,sCAAsC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,cAAc,CAAC,iCAAiC,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBACxC,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,IAAoB,CAAC;QACrC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,SAAS,CAAC,KAAK,EAAE,8BAA8B,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,cAAc,CAAC,iCAAiC,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC;YACH,+DAA+D;YAC/D,mEAAmE;YACnE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACpC,CAAC;YACF,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,SAAS,CAAC,KAAK,EAAE,qCAAqC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { EMBEDDING_DIMENSIONS } from '../constants.js';
2
+ export interface EmbeddingService {
3
+ initialize(): Promise<void>;
4
+ embed(text: string): Promise<Float32Array>;
5
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
6
+ }
7
+ export declare const EMBEDDING_DIMENSION = 384;
8
+ export { EMBEDDING_DIMENSIONS };
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACtD;AAED,eAAO,MAAM,mBAAmB,MAAuB,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { EMBEDDING_DIMENSIONS } from '../constants.js';
2
+ export const EMBEDDING_DIMENSION = EMBEDDING_DIMENSIONS;
3
+ // Re-export for convenience
4
+ export { EMBEDDING_DIMENSIONS };
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAQvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAExD,4BAA4B;AAC5B,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Error codes for all Lien-specific errors.
3
+ * Used to identify error types programmatically.
4
+ */
5
+ export declare enum LienErrorCode {
6
+ CONFIG_NOT_FOUND = "CONFIG_NOT_FOUND",
7
+ CONFIG_INVALID = "CONFIG_INVALID",
8
+ INDEX_NOT_FOUND = "INDEX_NOT_FOUND",
9
+ INDEX_CORRUPTED = "INDEX_CORRUPTED",
10
+ EMBEDDING_MODEL_FAILED = "EMBEDDING_MODEL_FAILED",
11
+ EMBEDDING_GENERATION_FAILED = "EMBEDDING_GENERATION_FAILED",
12
+ FILE_NOT_FOUND = "FILE_NOT_FOUND",
13
+ FILE_NOT_READABLE = "FILE_NOT_READABLE",
14
+ INVALID_PATH = "INVALID_PATH",
15
+ INVALID_INPUT = "INVALID_INPUT",
16
+ INTERNAL_ERROR = "INTERNAL_ERROR"
17
+ }
18
+ //# sourceMappingURL=codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../src/errors/codes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,aAAa;IAEvB,gBAAgB,qBAAqB;IACrC,cAAc,mBAAmB;IAGjC,eAAe,oBAAoB;IACnC,eAAe,oBAAoB;IAGnC,sBAAsB,2BAA2B;IACjD,2BAA2B,gCAAgC;IAG3D,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;IAG7B,aAAa,kBAAkB;IAG/B,cAAc,mBAAmB;CAClC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Error codes for all Lien-specific errors.
3
+ * Used to identify error types programmatically.
4
+ */
5
+ export var LienErrorCode;
6
+ (function (LienErrorCode) {
7
+ // Configuration
8
+ LienErrorCode["CONFIG_NOT_FOUND"] = "CONFIG_NOT_FOUND";
9
+ LienErrorCode["CONFIG_INVALID"] = "CONFIG_INVALID";
10
+ // Index
11
+ LienErrorCode["INDEX_NOT_FOUND"] = "INDEX_NOT_FOUND";
12
+ LienErrorCode["INDEX_CORRUPTED"] = "INDEX_CORRUPTED";
13
+ // Embeddings
14
+ LienErrorCode["EMBEDDING_MODEL_FAILED"] = "EMBEDDING_MODEL_FAILED";
15
+ LienErrorCode["EMBEDDING_GENERATION_FAILED"] = "EMBEDDING_GENERATION_FAILED";
16
+ // File System
17
+ LienErrorCode["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
18
+ LienErrorCode["FILE_NOT_READABLE"] = "FILE_NOT_READABLE";
19
+ LienErrorCode["INVALID_PATH"] = "INVALID_PATH";
20
+ // Tool Input
21
+ LienErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
22
+ // System
23
+ LienErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
24
+ })(LienErrorCode || (LienErrorCode = {}));
25
+ //# sourceMappingURL=codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/errors/codes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAN,IAAY,aAuBX;AAvBD,WAAY,aAAa;IACvB,gBAAgB;IAChB,sDAAqC,CAAA;IACrC,kDAAiC,CAAA;IAEjC,QAAQ;IACR,oDAAmC,CAAA;IACnC,oDAAmC,CAAA;IAEnC,aAAa;IACb,kEAAiD,CAAA;IACjD,4EAA2D,CAAA;IAE3D,cAAc;IACd,kDAAiC,CAAA;IACjC,wDAAuC,CAAA;IACvC,8CAA6B,CAAA;IAE7B,aAAa;IACb,gDAA+B,CAAA;IAE/B,SAAS;IACT,kDAAiC,CAAA;AACnC,CAAC,EAvBW,aAAa,KAAb,aAAa,QAuBxB"}
@@ -0,0 +1,85 @@
1
+ import { LienErrorCode } from './codes.js';
2
+ export { LienErrorCode } from './codes.js';
3
+ /**
4
+ * Severity levels for errors
5
+ */
6
+ export type ErrorSeverity = 'low' | 'medium' | 'high' | 'critical';
7
+ /**
8
+ * Base error class for all Lien-specific errors
9
+ */
10
+ export declare class LienError extends Error {
11
+ readonly code: LienErrorCode;
12
+ readonly context?: Record<string, unknown> | undefined;
13
+ readonly severity: ErrorSeverity;
14
+ readonly recoverable: boolean;
15
+ readonly retryable: boolean;
16
+ constructor(message: string, code: LienErrorCode, context?: Record<string, unknown> | undefined, severity?: ErrorSeverity, recoverable?: boolean, retryable?: boolean);
17
+ /**
18
+ * Serialize error to JSON for MCP responses
19
+ */
20
+ toJSON(): {
21
+ error: string;
22
+ code: LienErrorCode;
23
+ severity: ErrorSeverity;
24
+ recoverable: boolean;
25
+ context: Record<string, unknown> | undefined;
26
+ };
27
+ /**
28
+ * Check if this error is retryable
29
+ */
30
+ isRetryable(): boolean;
31
+ /**
32
+ * Check if this error is recoverable
33
+ */
34
+ isRecoverable(): boolean;
35
+ }
36
+ /**
37
+ * Configuration-related errors (loading, parsing, migration)
38
+ */
39
+ export declare class ConfigError extends LienError {
40
+ constructor(message: string, context?: Record<string, unknown>);
41
+ }
42
+ /**
43
+ * Indexing-related errors (file processing, chunking)
44
+ */
45
+ export declare class IndexingError extends LienError {
46
+ readonly file?: string | undefined;
47
+ constructor(message: string, file?: string | undefined, context?: Record<string, unknown>);
48
+ }
49
+ /**
50
+ * Embedding generation errors
51
+ */
52
+ export declare class EmbeddingError extends LienError {
53
+ constructor(message: string, context?: Record<string, unknown>);
54
+ }
55
+ /**
56
+ * Vector database errors (connection, query, storage)
57
+ */
58
+ export declare class DatabaseError extends LienError {
59
+ constructor(message: string, context?: Record<string, unknown>);
60
+ }
61
+ /**
62
+ * Helper function to wrap unknown errors with context
63
+ * @param error - Unknown error object to wrap
64
+ * @param context - Context message describing what operation failed
65
+ * @param additionalContext - Optional additional context data
66
+ * @returns LienError with proper message and context
67
+ */
68
+ export declare function wrapError(error: unknown, context: string, additionalContext?: Record<string, unknown>): LienError;
69
+ /**
70
+ * Type guard to check if an error is a LienError
71
+ */
72
+ export declare function isLienError(error: unknown): error is LienError;
73
+ /**
74
+ * Extract error message from unknown error type
75
+ * @param error - Unknown error object
76
+ * @returns Error message string
77
+ */
78
+ export declare function getErrorMessage(error: unknown): string;
79
+ /**
80
+ * Extract stack trace from unknown error type
81
+ * @param error - Unknown error object
82
+ * @returns Stack trace string or undefined
83
+ */
84
+ export declare function getErrorStack(error: unknown): string | undefined;
85
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnE;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;aAGhB,IAAI,EAAE,aAAa;aACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;aACjC,QAAQ,EAAE,aAAa;aACvB,WAAW,EAAE,OAAO;aACpB,SAAS,EAAE,OAAO;gBALlC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA,EACjC,QAAQ,GAAE,aAAwB,EAClC,WAAW,GAAE,OAAc,EAC3B,SAAS,GAAE,OAAe;IAW5C;;OAEG;IACH,MAAM;;;;;;;IAUN;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;aAGxB,IAAI,CAAC,EAAE,MAAM;gBAD7B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAKpC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC1C,SAAS,CAgBX;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAKhE"}
@@ -0,0 +1,134 @@
1
+ import { LienErrorCode } from './codes.js';
2
+ // Re-export for consumers
3
+ export { LienErrorCode } from './codes.js';
4
+ /**
5
+ * Base error class for all Lien-specific errors
6
+ */
7
+ export class LienError extends Error {
8
+ code;
9
+ context;
10
+ severity;
11
+ recoverable;
12
+ retryable;
13
+ constructor(message, code, context, severity = 'medium', recoverable = true, retryable = false) {
14
+ super(message);
15
+ this.code = code;
16
+ this.context = context;
17
+ this.severity = severity;
18
+ this.recoverable = recoverable;
19
+ this.retryable = retryable;
20
+ this.name = 'LienError';
21
+ // Maintains proper stack trace for where our error was thrown (only available on V8)
22
+ if (Error.captureStackTrace) {
23
+ Error.captureStackTrace(this, this.constructor);
24
+ }
25
+ }
26
+ /**
27
+ * Serialize error to JSON for MCP responses
28
+ */
29
+ toJSON() {
30
+ return {
31
+ error: this.message,
32
+ code: this.code,
33
+ severity: this.severity,
34
+ recoverable: this.recoverable,
35
+ context: this.context,
36
+ };
37
+ }
38
+ /**
39
+ * Check if this error is retryable
40
+ */
41
+ isRetryable() {
42
+ return this.retryable;
43
+ }
44
+ /**
45
+ * Check if this error is recoverable
46
+ */
47
+ isRecoverable() {
48
+ return this.recoverable;
49
+ }
50
+ }
51
+ /**
52
+ * Configuration-related errors (loading, parsing, migration)
53
+ */
54
+ export class ConfigError extends LienError {
55
+ constructor(message, context) {
56
+ super(message, LienErrorCode.CONFIG_INVALID, context, 'medium', true, false);
57
+ this.name = 'ConfigError';
58
+ }
59
+ }
60
+ /**
61
+ * Indexing-related errors (file processing, chunking)
62
+ */
63
+ export class IndexingError extends LienError {
64
+ file;
65
+ constructor(message, file, context) {
66
+ super(message, LienErrorCode.INTERNAL_ERROR, { ...context, file }, 'medium', true, false);
67
+ this.file = file;
68
+ this.name = 'IndexingError';
69
+ }
70
+ }
71
+ /**
72
+ * Embedding generation errors
73
+ */
74
+ export class EmbeddingError extends LienError {
75
+ constructor(message, context) {
76
+ super(message, LienErrorCode.EMBEDDING_GENERATION_FAILED, context, 'high', true, true);
77
+ this.name = 'EmbeddingError';
78
+ }
79
+ }
80
+ /**
81
+ * Vector database errors (connection, query, storage)
82
+ */
83
+ export class DatabaseError extends LienError {
84
+ constructor(message, context) {
85
+ super(message, LienErrorCode.INTERNAL_ERROR, context, 'high', true, true);
86
+ this.name = 'DatabaseError';
87
+ }
88
+ }
89
+ /**
90
+ * Helper function to wrap unknown errors with context
91
+ * @param error - Unknown error object to wrap
92
+ * @param context - Context message describing what operation failed
93
+ * @param additionalContext - Optional additional context data
94
+ * @returns LienError with proper message and context
95
+ */
96
+ export function wrapError(error, context, additionalContext) {
97
+ const message = error instanceof Error ? error.message : String(error);
98
+ const stack = error instanceof Error ? error.stack : undefined;
99
+ const wrappedError = new LienError(`${context}: ${message}`, LienErrorCode.INTERNAL_ERROR, additionalContext);
100
+ // Preserve original stack trace if available
101
+ if (stack) {
102
+ wrappedError.stack = `${wrappedError.stack}\n\nCaused by:\n${stack}`;
103
+ }
104
+ return wrappedError;
105
+ }
106
+ /**
107
+ * Type guard to check if an error is a LienError
108
+ */
109
+ export function isLienError(error) {
110
+ return error instanceof LienError;
111
+ }
112
+ /**
113
+ * Extract error message from unknown error type
114
+ * @param error - Unknown error object
115
+ * @returns Error message string
116
+ */
117
+ export function getErrorMessage(error) {
118
+ if (error instanceof Error) {
119
+ return error.message;
120
+ }
121
+ return String(error);
122
+ }
123
+ /**
124
+ * Extract stack trace from unknown error type
125
+ * @param error - Unknown error object
126
+ * @returns Stack trace string or undefined
127
+ */
128
+ export function getErrorStack(error) {
129
+ if (error instanceof Error) {
130
+ return error.stack;
131
+ }
132
+ return undefined;
133
+ }
134
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { DetectionResult, DetectionOptions } from './types.js';
2
+ /** Detection result with internal priority for conflict resolution */
3
+ export type DetectionWithPriority = DetectionResult & {
4
+ priority: number;
5
+ };
6
+ /** Detections grouped by confidence level */
7
+ export interface GroupedDetections {
8
+ high: DetectionWithPriority[];
9
+ medium: DetectionWithPriority[];
10
+ low: DetectionWithPriority[];
11
+ }
12
+ /**
13
+ * Group detections by confidence level.
14
+ */
15
+ export declare function groupByConfidence(detections: DetectionWithPriority[]): GroupedDetections;
16
+ /**
17
+ * Select the winner from a list using priority (highest priority wins).
18
+ * Returns the winner and the remaining (skipped) detections.
19
+ *
20
+ * @throws Error if detections array is empty
21
+ */
22
+ export declare function selectByPriority(detections: DetectionWithPriority[]): {
23
+ winner: DetectionWithPriority;
24
+ skipped: DetectionWithPriority[];
25
+ };
26
+ /**
27
+ * Resolve conflicts when multiple frameworks are detected at the same path.
28
+ *
29
+ * Resolution rules (applied in order):
30
+ * 1. Multiple HIGH confidence → keep ALL (hybrid project support)
31
+ * 2. Single HIGH confidence → keep it, skip lower confidence
32
+ * 3. No HIGH but have MEDIUM → use priority to select winner
33
+ * 4. Only LOW confidence → use priority to select winner
34
+ *
35
+ * @param detections - All detected frameworks with their priorities
36
+ * @param relativePath - Path being analyzed (for logging)
37
+ * @returns Array of resolved detection results
38
+ */
39
+ export declare function resolveFrameworkConflicts(detections: DetectionWithPriority[], relativePath: string): DetectionResult[];
40
+ /**
41
+ * Run all framework detectors at a path and collect results.
42
+ *
43
+ * @param rootDir - Project root directory
44
+ * @param relativePath - Path relative to root being scanned
45
+ * @returns Array of detection results with priorities
46
+ */
47
+ export declare function runAllDetectors(rootDir: string, relativePath: string): Promise<DetectionWithPriority[]>;
48
+ /**
49
+ * Detect all frameworks in a monorepo by recursively scanning subdirectories
50
+ * @param rootDir - Absolute path to project root
51
+ * @param options - Detection options (max depth, skip dirs)
52
+ * @returns Array of detected frameworks with their paths
53
+ */
54
+ export declare function detectAllFrameworks(rootDir: string, options?: Partial<DetectionOptions>): Promise<DetectionResult[]>;
55
+ /**
56
+ * Get a human-readable summary of detected frameworks
57
+ */
58
+ export declare function getDetectionSummary(results: DetectionResult[]): string;
59
+ //# sourceMappingURL=detector-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector-service.d.ts","sourceRoot":"","sources":["../../src/frameworks/detector-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAA2B,MAAM,YAAY,CAAC;AAGxF,sEAAsE;AACtE,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAC9B,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,GAAG,EAAE,qBAAqB,EAAE,CAAC;CAC9B;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,qBAAqB,EAAE,GAAG,iBAAiB,CAMxF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,qBAAqB,EAAE,GAClC;IAAE,MAAM,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;CAAE,CASrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,qBAAqB,EAAE,EACnC,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CA4CnB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAkBlC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC,CAY5B;AAgFD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAmBtE"}