@code-rag/core 0.1.0

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 (347) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/auth/audit-log.d.ts +35 -0
  4. package/dist/auth/audit-log.js +110 -0
  5. package/dist/auth/audit-log.js.map +1 -0
  6. package/dist/auth/audit-log.test.d.ts +1 -0
  7. package/dist/auth/audit-log.test.js +261 -0
  8. package/dist/auth/audit-log.test.js.map +1 -0
  9. package/dist/auth/index.d.ts +6 -0
  10. package/dist/auth/index.js +5 -0
  11. package/dist/auth/index.js.map +1 -0
  12. package/dist/auth/oidc-provider.d.ts +49 -0
  13. package/dist/auth/oidc-provider.js +358 -0
  14. package/dist/auth/oidc-provider.js.map +1 -0
  15. package/dist/auth/oidc-provider.test.d.ts +1 -0
  16. package/dist/auth/oidc-provider.test.js +520 -0
  17. package/dist/auth/oidc-provider.test.js.map +1 -0
  18. package/dist/auth/rbac.d.ts +29 -0
  19. package/dist/auth/rbac.js +75 -0
  20. package/dist/auth/rbac.js.map +1 -0
  21. package/dist/auth/rbac.test.d.ts +1 -0
  22. package/dist/auth/rbac.test.js +224 -0
  23. package/dist/auth/rbac.test.js.map +1 -0
  24. package/dist/auth/saml-provider.d.ts +51 -0
  25. package/dist/auth/saml-provider.js +355 -0
  26. package/dist/auth/saml-provider.js.map +1 -0
  27. package/dist/auth/saml-provider.test.d.ts +1 -0
  28. package/dist/auth/saml-provider.test.js +422 -0
  29. package/dist/auth/saml-provider.test.js.map +1 -0
  30. package/dist/auth/types.d.ts +81 -0
  31. package/dist/auth/types.js +11 -0
  32. package/dist/auth/types.js.map +1 -0
  33. package/dist/auth/types.test.d.ts +1 -0
  34. package/dist/auth/types.test.js +147 -0
  35. package/dist/auth/types.test.js.map +1 -0
  36. package/dist/backlog/ab-reference-scanner.d.ts +10 -0
  37. package/dist/backlog/ab-reference-scanner.js +22 -0
  38. package/dist/backlog/ab-reference-scanner.js.map +1 -0
  39. package/dist/backlog/ab-reference-scanner.test.d.ts +1 -0
  40. package/dist/backlog/ab-reference-scanner.test.js +83 -0
  41. package/dist/backlog/ab-reference-scanner.test.js.map +1 -0
  42. package/dist/backlog/azure-devops-provider.d.ts +59 -0
  43. package/dist/backlog/azure-devops-provider.js +283 -0
  44. package/dist/backlog/azure-devops-provider.js.map +1 -0
  45. package/dist/backlog/backlog-provider.d.ts +13 -0
  46. package/dist/backlog/backlog-provider.js +6 -0
  47. package/dist/backlog/backlog-provider.js.map +1 -0
  48. package/dist/backlog/backlog-provider.test.d.ts +1 -0
  49. package/dist/backlog/backlog-provider.test.js +426 -0
  50. package/dist/backlog/backlog-provider.test.js.map +1 -0
  51. package/dist/backlog/clickup-provider.d.ts +55 -0
  52. package/dist/backlog/clickup-provider.js +301 -0
  53. package/dist/backlog/clickup-provider.js.map +1 -0
  54. package/dist/backlog/clickup-provider.test.d.ts +1 -0
  55. package/dist/backlog/clickup-provider.test.js +426 -0
  56. package/dist/backlog/clickup-provider.test.js.map +1 -0
  57. package/dist/backlog/clickup-reference-scanner.d.ts +10 -0
  58. package/dist/backlog/clickup-reference-scanner.js +32 -0
  59. package/dist/backlog/clickup-reference-scanner.js.map +1 -0
  60. package/dist/backlog/clickup-reference-scanner.test.d.ts +1 -0
  61. package/dist/backlog/clickup-reference-scanner.test.js +92 -0
  62. package/dist/backlog/clickup-reference-scanner.test.js.map +1 -0
  63. package/dist/backlog/code-linker.d.ts +63 -0
  64. package/dist/backlog/code-linker.js +90 -0
  65. package/dist/backlog/code-linker.js.map +1 -0
  66. package/dist/backlog/code-linker.test.d.ts +1 -0
  67. package/dist/backlog/code-linker.test.js +325 -0
  68. package/dist/backlog/code-linker.test.js.map +1 -0
  69. package/dist/backlog/index.d.ts +14 -0
  70. package/dist/backlog/index.js +8 -0
  71. package/dist/backlog/index.js.map +1 -0
  72. package/dist/backlog/jira-provider.d.ts +60 -0
  73. package/dist/backlog/jira-provider.js +272 -0
  74. package/dist/backlog/jira-provider.js.map +1 -0
  75. package/dist/backlog/jira-provider.test.d.ts +1 -0
  76. package/dist/backlog/jira-provider.test.js +449 -0
  77. package/dist/backlog/jira-provider.test.js.map +1 -0
  78. package/dist/backlog/jira-reference-scanner.d.ts +11 -0
  79. package/dist/backlog/jira-reference-scanner.js +26 -0
  80. package/dist/backlog/jira-reference-scanner.js.map +1 -0
  81. package/dist/backlog/jira-reference-scanner.test.d.ts +1 -0
  82. package/dist/backlog/jira-reference-scanner.test.js +127 -0
  83. package/dist/backlog/jira-reference-scanner.test.js.map +1 -0
  84. package/dist/backlog/types.d.ts +22 -0
  85. package/dist/backlog/types.js +1 -0
  86. package/dist/backlog/types.js.map +1 -0
  87. package/dist/chunker/ast-chunker.d.ts +45 -0
  88. package/dist/chunker/ast-chunker.js +292 -0
  89. package/dist/chunker/ast-chunker.js.map +1 -0
  90. package/dist/chunker/ast-chunker.test.d.ts +1 -0
  91. package/dist/chunker/ast-chunker.test.js +391 -0
  92. package/dist/chunker/ast-chunker.test.js.map +1 -0
  93. package/dist/chunker/chunker.d.ts +8 -0
  94. package/dist/chunker/chunker.js +1 -0
  95. package/dist/chunker/chunker.js.map +1 -0
  96. package/dist/chunker/index.d.ts +3 -0
  97. package/dist/chunker/index.js +2 -0
  98. package/dist/chunker/index.js.map +1 -0
  99. package/dist/config/config-parser.d.ts +15 -0
  100. package/dist/config/config-parser.js +283 -0
  101. package/dist/config/config-parser.js.map +1 -0
  102. package/dist/config/config-parser.test.d.ts +1 -0
  103. package/dist/config/config-parser.test.js +699 -0
  104. package/dist/config/config-parser.test.js.map +1 -0
  105. package/dist/docs/confluence-provider.d.ts +121 -0
  106. package/dist/docs/confluence-provider.js +459 -0
  107. package/dist/docs/confluence-provider.js.map +1 -0
  108. package/dist/docs/confluence-provider.test.d.ts +1 -0
  109. package/dist/docs/confluence-provider.test.js +765 -0
  110. package/dist/docs/confluence-provider.test.js.map +1 -0
  111. package/dist/docs/index.d.ts +4 -0
  112. package/dist/docs/index.js +2 -0
  113. package/dist/docs/index.js.map +1 -0
  114. package/dist/docs/sharepoint-provider.d.ts +150 -0
  115. package/dist/docs/sharepoint-provider.js +637 -0
  116. package/dist/docs/sharepoint-provider.js.map +1 -0
  117. package/dist/docs/sharepoint-provider.test.d.ts +1 -0
  118. package/dist/docs/sharepoint-provider.test.js +873 -0
  119. package/dist/docs/sharepoint-provider.test.js.map +1 -0
  120. package/dist/embedding/bm25-index.d.ts +12 -0
  121. package/dist/embedding/bm25-index.js +89 -0
  122. package/dist/embedding/bm25-index.js.map +1 -0
  123. package/dist/embedding/bm25-index.test.d.ts +1 -0
  124. package/dist/embedding/bm25-index.test.js +289 -0
  125. package/dist/embedding/bm25-index.test.js.map +1 -0
  126. package/dist/embedding/hybrid-search.d.ts +13 -0
  127. package/dist/embedding/hybrid-search.js +124 -0
  128. package/dist/embedding/hybrid-search.js.map +1 -0
  129. package/dist/embedding/hybrid-search.test.d.ts +1 -0
  130. package/dist/embedding/hybrid-search.test.js +266 -0
  131. package/dist/embedding/hybrid-search.test.js.map +1 -0
  132. package/dist/embedding/index.d.ts +11 -0
  133. package/dist/embedding/index.js +7 -0
  134. package/dist/embedding/index.js.map +1 -0
  135. package/dist/embedding/lancedb-store.d.ts +21 -0
  136. package/dist/embedding/lancedb-store.js +172 -0
  137. package/dist/embedding/lancedb-store.js.map +1 -0
  138. package/dist/embedding/lancedb-store.test.d.ts +1 -0
  139. package/dist/embedding/lancedb-store.test.js +268 -0
  140. package/dist/embedding/lancedb-store.test.js.map +1 -0
  141. package/dist/embedding/model-lifecycle-manager.d.ts +83 -0
  142. package/dist/embedding/model-lifecycle-manager.js +419 -0
  143. package/dist/embedding/model-lifecycle-manager.js.map +1 -0
  144. package/dist/embedding/model-lifecycle-manager.test.d.ts +1 -0
  145. package/dist/embedding/model-lifecycle-manager.test.js +642 -0
  146. package/dist/embedding/model-lifecycle-manager.test.js.map +1 -0
  147. package/dist/embedding/ollama-embedding-provider.d.ts +16 -0
  148. package/dist/embedding/ollama-embedding-provider.js +74 -0
  149. package/dist/embedding/ollama-embedding-provider.js.map +1 -0
  150. package/dist/embedding/ollama-embedding-provider.test.d.ts +1 -0
  151. package/dist/embedding/ollama-embedding-provider.test.js +198 -0
  152. package/dist/embedding/ollama-embedding-provider.test.js.map +1 -0
  153. package/dist/embedding/openai-compatible-embedding-provider.d.ts +19 -0
  154. package/dist/embedding/openai-compatible-embedding-provider.js +108 -0
  155. package/dist/embedding/openai-compatible-embedding-provider.js.map +1 -0
  156. package/dist/embedding/openai-compatible-embedding-provider.test.d.ts +1 -0
  157. package/dist/embedding/openai-compatible-embedding-provider.test.js +456 -0
  158. package/dist/embedding/openai-compatible-embedding-provider.test.js.map +1 -0
  159. package/dist/embedding/qdrant-store.d.ts +28 -0
  160. package/dist/embedding/qdrant-store.js +174 -0
  161. package/dist/embedding/qdrant-store.js.map +1 -0
  162. package/dist/embedding/qdrant-store.test.d.ts +1 -0
  163. package/dist/embedding/qdrant-store.test.js +359 -0
  164. package/dist/embedding/qdrant-store.test.js.map +1 -0
  165. package/dist/enrichment/index.d.ts +4 -0
  166. package/dist/enrichment/index.js +2 -0
  167. package/dist/enrichment/index.js.map +1 -0
  168. package/dist/enrichment/nl-enricher.d.ts +16 -0
  169. package/dist/enrichment/nl-enricher.js +47 -0
  170. package/dist/enrichment/nl-enricher.js.map +1 -0
  171. package/dist/enrichment/nl-enricher.test.d.ts +1 -0
  172. package/dist/enrichment/nl-enricher.test.js +154 -0
  173. package/dist/enrichment/nl-enricher.test.js.map +1 -0
  174. package/dist/enrichment/ollama-client.d.ts +18 -0
  175. package/dist/enrichment/ollama-client.js +55 -0
  176. package/dist/enrichment/ollama-client.js.map +1 -0
  177. package/dist/enrichment/ollama-client.test.d.ts +1 -0
  178. package/dist/enrichment/ollama-client.test.js +129 -0
  179. package/dist/enrichment/ollama-client.test.js.map +1 -0
  180. package/dist/git/git-client.d.ts +22 -0
  181. package/dist/git/git-client.js +6 -0
  182. package/dist/git/git-client.js.map +1 -0
  183. package/dist/git/git-client.test.d.ts +1 -0
  184. package/dist/git/git-client.test.js +200 -0
  185. package/dist/git/git-client.test.js.map +1 -0
  186. package/dist/git/ignore-filter.d.ts +2 -0
  187. package/dist/git/ignore-filter.js +31 -0
  188. package/dist/git/ignore-filter.js.map +1 -0
  189. package/dist/git/ignore-filter.test.d.ts +1 -0
  190. package/dist/git/ignore-filter.test.js +87 -0
  191. package/dist/git/ignore-filter.test.js.map +1 -0
  192. package/dist/git/index.d.ts +4 -0
  193. package/dist/git/index.js +3 -0
  194. package/dist/git/index.js.map +1 -0
  195. package/dist/git/simple-git-client.d.ts +12 -0
  196. package/dist/git/simple-git-client.js +138 -0
  197. package/dist/git/simple-git-client.js.map +1 -0
  198. package/dist/graph/cross-repo-resolver.d.ts +50 -0
  199. package/dist/graph/cross-repo-resolver.js +315 -0
  200. package/dist/graph/cross-repo-resolver.js.map +1 -0
  201. package/dist/graph/cross-repo-resolver.test.d.ts +1 -0
  202. package/dist/graph/cross-repo-resolver.test.js +548 -0
  203. package/dist/graph/cross-repo-resolver.test.js.map +1 -0
  204. package/dist/graph/dependency-graph.d.ts +44 -0
  205. package/dist/graph/dependency-graph.js +108 -0
  206. package/dist/graph/dependency-graph.js.map +1 -0
  207. package/dist/graph/dependency-graph.test.d.ts +1 -0
  208. package/dist/graph/dependency-graph.test.js +276 -0
  209. package/dist/graph/dependency-graph.test.js.map +1 -0
  210. package/dist/graph/graph-builder.d.ts +11 -0
  211. package/dist/graph/graph-builder.js +113 -0
  212. package/dist/graph/graph-builder.js.map +1 -0
  213. package/dist/graph/graph-builder.test.d.ts +1 -0
  214. package/dist/graph/graph-builder.test.js +178 -0
  215. package/dist/graph/graph-builder.test.js.map +1 -0
  216. package/dist/graph/import-resolver.d.ts +11 -0
  217. package/dist/graph/import-resolver.js +199 -0
  218. package/dist/graph/import-resolver.js.map +1 -0
  219. package/dist/graph/import-resolver.test.d.ts +1 -0
  220. package/dist/graph/import-resolver.test.js +282 -0
  221. package/dist/graph/import-resolver.test.js.map +1 -0
  222. package/dist/graph/index.d.ts +7 -0
  223. package/dist/graph/index.js +4 -0
  224. package/dist/graph/index.js.map +1 -0
  225. package/dist/index.d.ts +31 -0
  226. package/dist/index.js +15 -0
  227. package/dist/index.js.map +1 -0
  228. package/dist/indexer/file-scanner.d.ts +34 -0
  229. package/dist/indexer/file-scanner.js +69 -0
  230. package/dist/indexer/file-scanner.js.map +1 -0
  231. package/dist/indexer/file-scanner.test.d.ts +1 -0
  232. package/dist/indexer/file-scanner.test.js +110 -0
  233. package/dist/indexer/file-scanner.test.js.map +1 -0
  234. package/dist/indexer/file-watcher.d.ts +79 -0
  235. package/dist/indexer/file-watcher.js +148 -0
  236. package/dist/indexer/incremental-indexer.d.ts +67 -0
  237. package/dist/indexer/incremental-indexer.js +142 -0
  238. package/dist/indexer/incremental-indexer.js.map +1 -0
  239. package/dist/indexer/incremental-indexer.test.d.ts +1 -0
  240. package/dist/indexer/incremental-indexer.test.js +266 -0
  241. package/dist/indexer/incremental-indexer.test.js.map +1 -0
  242. package/dist/indexer/index-check.d.ts +22 -0
  243. package/dist/indexer/index-check.js +74 -0
  244. package/dist/indexer/index-check.js.map +1 -0
  245. package/dist/indexer/index-check.test.d.ts +1 -0
  246. package/dist/indexer/index-check.test.js +100 -0
  247. package/dist/indexer/index-check.test.js.map +1 -0
  248. package/dist/indexer/index-state.d.ts +61 -0
  249. package/dist/indexer/index-state.js +82 -0
  250. package/dist/indexer/index-state.js.map +1 -0
  251. package/dist/indexer/index-state.test.d.ts +1 -0
  252. package/dist/indexer/index-state.test.js +140 -0
  253. package/dist/indexer/index-state.test.js.map +1 -0
  254. package/dist/indexer/index.d.ts +12 -0
  255. package/dist/indexer/index.js +6 -0
  256. package/dist/indexer/index.js.map +1 -0
  257. package/dist/indexer/multi-repo-indexer.d.ts +63 -0
  258. package/dist/indexer/multi-repo-indexer.js +144 -0
  259. package/dist/indexer/multi-repo-indexer.js.map +1 -0
  260. package/dist/indexer/multi-repo-indexer.test.d.ts +1 -0
  261. package/dist/indexer/multi-repo-indexer.test.js +238 -0
  262. package/dist/indexer/multi-repo-indexer.test.js.map +1 -0
  263. package/dist/parser/index.d.ts +4 -0
  264. package/dist/parser/index.js +3 -0
  265. package/dist/parser/index.js.map +1 -0
  266. package/dist/parser/language-registry.d.ts +46 -0
  267. package/dist/parser/language-registry.js +219 -0
  268. package/dist/parser/language-registry.js.map +1 -0
  269. package/dist/parser/language-registry.test.d.ts +1 -0
  270. package/dist/parser/language-registry.test.js +225 -0
  271. package/dist/parser/language-registry.test.js.map +1 -0
  272. package/dist/parser/markdown-parser.d.ts +124 -0
  273. package/dist/parser/markdown-parser.js +487 -0
  274. package/dist/parser/markdown-parser.js.map +1 -0
  275. package/dist/parser/markdown-parser.test.d.ts +1 -0
  276. package/dist/parser/markdown-parser.test.js +600 -0
  277. package/dist/parser/markdown-parser.test.js.map +1 -0
  278. package/dist/parser/tree-sitter-parser.d.ts +32 -0
  279. package/dist/parser/tree-sitter-parser.js +146 -0
  280. package/dist/parser/tree-sitter-parser.js.map +1 -0
  281. package/dist/retrieval/context-expander.d.ts +51 -0
  282. package/dist/retrieval/context-expander.js +218 -0
  283. package/dist/retrieval/context-expander.js.map +1 -0
  284. package/dist/retrieval/context-expander.test.d.ts +1 -0
  285. package/dist/retrieval/context-expander.test.js +339 -0
  286. package/dist/retrieval/context-expander.test.js.map +1 -0
  287. package/dist/retrieval/cross-encoder-reranker.d.ts +16 -0
  288. package/dist/retrieval/cross-encoder-reranker.js +90 -0
  289. package/dist/retrieval/cross-encoder-reranker.js.map +1 -0
  290. package/dist/retrieval/cross-encoder-reranker.test.d.ts +1 -0
  291. package/dist/retrieval/cross-encoder-reranker.test.js +305 -0
  292. package/dist/retrieval/cross-encoder-reranker.test.js.map +1 -0
  293. package/dist/retrieval/index.d.ts +8 -0
  294. package/dist/retrieval/index.js +4 -0
  295. package/dist/retrieval/index.js.map +1 -0
  296. package/dist/retrieval/query-analyzer.d.ts +29 -0
  297. package/dist/retrieval/query-analyzer.js +238 -0
  298. package/dist/retrieval/query-analyzer.js.map +1 -0
  299. package/dist/retrieval/query-analyzer.test.d.ts +1 -0
  300. package/dist/retrieval/query-analyzer.test.js +236 -0
  301. package/dist/retrieval/query-analyzer.test.js.map +1 -0
  302. package/dist/retrieval/token-budget.d.ts +51 -0
  303. package/dist/retrieval/token-budget.js +141 -0
  304. package/dist/retrieval/token-budget.js.map +1 -0
  305. package/dist/retrieval/token-budget.test.d.ts +1 -0
  306. package/dist/retrieval/token-budget.test.js +404 -0
  307. package/dist/retrieval/token-budget.test.js.map +1 -0
  308. package/dist/storage/azure-blob-provider.d.ts +19 -0
  309. package/dist/storage/azure-blob-provider.js +199 -0
  310. package/dist/storage/azure-blob-provider.js.map +1 -0
  311. package/dist/storage/azure-blob-provider.test.d.ts +1 -0
  312. package/dist/storage/azure-blob-provider.test.js +250 -0
  313. package/dist/storage/azure-blob-provider.test.js.map +1 -0
  314. package/dist/storage/gcs-provider.d.ts +22 -0
  315. package/dist/storage/gcs-provider.js +241 -0
  316. package/dist/storage/gcs-provider.js.map +1 -0
  317. package/dist/storage/gcs-provider.test.d.ts +1 -0
  318. package/dist/storage/gcs-provider.test.js +299 -0
  319. package/dist/storage/gcs-provider.test.js.map +1 -0
  320. package/dist/storage/index.d.ts +5 -0
  321. package/dist/storage/index.js +4 -0
  322. package/dist/storage/index.js.map +1 -0
  323. package/dist/storage/s3-provider.d.ts +21 -0
  324. package/dist/storage/s3-provider.js +220 -0
  325. package/dist/storage/s3-provider.js.map +1 -0
  326. package/dist/storage/s3-provider.test.d.ts +1 -0
  327. package/dist/storage/s3-provider.test.js +329 -0
  328. package/dist/storage/s3-provider.test.js.map +1 -0
  329. package/dist/storage/types.d.ts +65 -0
  330. package/dist/storage/types.js +12 -0
  331. package/dist/storage/types.js.map +1 -0
  332. package/dist/types/chunk.d.ts +32 -0
  333. package/dist/types/chunk.js +1 -0
  334. package/dist/types/chunk.js.map +1 -0
  335. package/dist/types/config.d.ts +71 -0
  336. package/dist/types/config.js +1 -0
  337. package/dist/types/config.js.map +1 -0
  338. package/dist/types/index.d.ts +5 -0
  339. package/dist/types/index.js +1 -0
  340. package/dist/types/index.js.map +1 -0
  341. package/dist/types/provider.d.ts +54 -0
  342. package/dist/types/provider.js +36 -0
  343. package/dist/types/provider.js.map +1 -0
  344. package/dist/types/search.d.ts +27 -0
  345. package/dist/types/search.js +1 -0
  346. package/dist/types/search.js.map +1 -0
  347. package/package.json +70 -0
@@ -0,0 +1,329 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { S3StorageProvider } from './s3-provider.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Mock node:https and node:http
5
+ // ---------------------------------------------------------------------------
6
+ const { mockHttpsRequest, mockHttpRequest } = vi.hoisted(() => ({
7
+ mockHttpsRequest: vi.fn(),
8
+ mockHttpRequest: vi.fn(),
9
+ }));
10
+ vi.mock('node:https', () => ({ request: mockHttpsRequest }));
11
+ vi.mock('node:http', () => ({ request: mockHttpRequest }));
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ const DEFAULT_CONFIG = {
16
+ provider: 's3',
17
+ bucket: 'test-bucket',
18
+ region: 'us-east-1',
19
+ accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
20
+ secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
21
+ };
22
+ function setupMockResponse(statusCode, body) {
23
+ const bodyBuf = typeof body === 'string' ? Buffer.from(body) : body;
24
+ mockHttpsRequest.mockImplementation((_options, callback) => {
25
+ const res = {
26
+ statusCode,
27
+ on: vi.fn((event, handler) => {
28
+ if (event === 'data') {
29
+ process.nextTick(() => handler(bodyBuf));
30
+ }
31
+ if (event === 'end') {
32
+ process.nextTick(() => process.nextTick(() => handler()));
33
+ }
34
+ return res;
35
+ }),
36
+ };
37
+ process.nextTick(() => callback(res));
38
+ return {
39
+ on: vi.fn(),
40
+ write: vi.fn(),
41
+ end: vi.fn(),
42
+ };
43
+ });
44
+ }
45
+ function setupNetworkError(errorMessage) {
46
+ mockHttpsRequest.mockImplementation((_options, _callback) => {
47
+ const req = {
48
+ on: vi.fn((event, handler) => {
49
+ if (event === 'error') {
50
+ process.nextTick(() => handler(new Error(errorMessage)));
51
+ }
52
+ return req;
53
+ }),
54
+ write: vi.fn(),
55
+ end: vi.fn(),
56
+ };
57
+ return req;
58
+ });
59
+ }
60
+ function setupMockResponseForHttp(statusCode, body) {
61
+ const bodyBuf = typeof body === 'string' ? Buffer.from(body) : body;
62
+ mockHttpRequest.mockImplementation((_options, callback) => {
63
+ const res = {
64
+ statusCode,
65
+ on: vi.fn((event, handler) => {
66
+ if (event === 'data') {
67
+ process.nextTick(() => handler(bodyBuf));
68
+ }
69
+ if (event === 'end') {
70
+ process.nextTick(() => process.nextTick(() => handler()));
71
+ }
72
+ return res;
73
+ }),
74
+ };
75
+ process.nextTick(() => callback(res));
76
+ return {
77
+ on: vi.fn(),
78
+ write: vi.fn(),
79
+ end: vi.fn(),
80
+ };
81
+ });
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Tests
85
+ // ---------------------------------------------------------------------------
86
+ describe('S3StorageProvider', () => {
87
+ beforeEach(() => {
88
+ vi.clearAllMocks();
89
+ setupMockResponse(200, '');
90
+ });
91
+ describe('constructor', () => {
92
+ it('should set host from bucket and region for standard S3', () => {
93
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
94
+ const urlResult = provider.getUrl('test-key');
95
+ expect(urlResult.isOk()).toBe(true);
96
+ if (urlResult.isOk()) {
97
+ expect(urlResult.value).toContain('test-bucket.s3.us-east-1.amazonaws.com');
98
+ }
99
+ });
100
+ it('should use custom endpoint for S3-compatible stores', () => {
101
+ const config = {
102
+ ...DEFAULT_CONFIG,
103
+ endpoint: 'http://localhost:9000',
104
+ };
105
+ const provider = new S3StorageProvider(config);
106
+ const urlResult = provider.getUrl('test-key');
107
+ expect(urlResult.isOk()).toBe(true);
108
+ if (urlResult.isOk()) {
109
+ expect(urlResult.value).toContain('http://localhost:9000/test-bucket/');
110
+ }
111
+ });
112
+ });
113
+ describe('upload', () => {
114
+ it('should return ok on successful upload', async () => {
115
+ setupMockResponse(200, '');
116
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
117
+ const result = await provider.upload('my-key', Buffer.from('hello'));
118
+ expect(result.isOk()).toBe(true);
119
+ });
120
+ it('should return err on HTTP error', async () => {
121
+ setupMockResponse(500, 'InternalServerError');
122
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
123
+ const result = await provider.upload('my-key', Buffer.from('hello'));
124
+ expect(result.isErr()).toBe(true);
125
+ if (result.isErr()) {
126
+ expect(result.error.message).toContain('S3 upload failed');
127
+ expect(result.error.name).toBe('StorageError');
128
+ }
129
+ });
130
+ it('should return err on network error', async () => {
131
+ setupNetworkError('ECONNREFUSED');
132
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
133
+ const result = await provider.upload('my-key', Buffer.from('hello'));
134
+ expect(result.isErr()).toBe(true);
135
+ if (result.isErr()) {
136
+ expect(result.error.message).toContain('ECONNREFUSED');
137
+ }
138
+ });
139
+ it('should call write with body data', async () => {
140
+ setupMockResponse(200, '');
141
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
142
+ const data = Buffer.from('test-data');
143
+ await provider.upload('my-key', data);
144
+ const lastCall = mockHttpsRequest.mock.results[0]?.value;
145
+ expect(lastCall.write).toHaveBeenCalledWith(data);
146
+ });
147
+ });
148
+ describe('download', () => {
149
+ it('should return buffer on success', async () => {
150
+ const expectedData = Buffer.from('file-contents');
151
+ setupMockResponse(200, expectedData);
152
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
153
+ const result = await provider.download('my-key');
154
+ expect(result.isOk()).toBe(true);
155
+ if (result.isOk()) {
156
+ expect(result.value.toString()).toBe('file-contents');
157
+ }
158
+ });
159
+ it('should return err on 404', async () => {
160
+ setupMockResponse(404, 'NoSuchKey');
161
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
162
+ const result = await provider.download('missing-key');
163
+ expect(result.isErr()).toBe(true);
164
+ if (result.isErr()) {
165
+ expect(result.error.message).toContain('S3 download failed');
166
+ }
167
+ });
168
+ it('should return err on 403', async () => {
169
+ setupMockResponse(403, 'AccessDenied');
170
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
171
+ const result = await provider.download('forbidden-key');
172
+ expect(result.isErr()).toBe(true);
173
+ if (result.isErr()) {
174
+ expect(result.error.message).toContain('S3 download failed');
175
+ }
176
+ });
177
+ });
178
+ describe('delete', () => {
179
+ it('should return ok on successful delete', async () => {
180
+ setupMockResponse(204, '');
181
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
182
+ const result = await provider.delete('my-key');
183
+ expect(result.isOk()).toBe(true);
184
+ });
185
+ it('should return err on failure', async () => {
186
+ setupMockResponse(500, 'Error');
187
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
188
+ const result = await provider.delete('my-key');
189
+ expect(result.isErr()).toBe(true);
190
+ if (result.isErr()) {
191
+ expect(result.error.message).toContain('S3 delete failed');
192
+ }
193
+ });
194
+ });
195
+ describe('list', () => {
196
+ it('should parse XML response and return keys', async () => {
197
+ const xml = `<?xml version="1.0"?>
198
+ <ListBucketResult>
199
+ <Contents><Key>file1.ts</Key></Contents>
200
+ <Contents><Key>file2.ts</Key></Contents>
201
+ </ListBucketResult>`;
202
+ setupMockResponse(200, xml);
203
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
204
+ const result = await provider.list('src/');
205
+ expect(result.isOk()).toBe(true);
206
+ if (result.isOk()) {
207
+ expect(result.value).toEqual(['file1.ts', 'file2.ts']);
208
+ }
209
+ });
210
+ it('should return empty array when no keys match', async () => {
211
+ const xml = `<?xml version="1.0"?><ListBucketResult></ListBucketResult>`;
212
+ setupMockResponse(200, xml);
213
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
214
+ const result = await provider.list('nonexistent/');
215
+ expect(result.isOk()).toBe(true);
216
+ if (result.isOk()) {
217
+ expect(result.value).toEqual([]);
218
+ }
219
+ });
220
+ it('should return err on failure', async () => {
221
+ setupMockResponse(500, 'Error');
222
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
223
+ const result = await provider.list('src/');
224
+ expect(result.isErr()).toBe(true);
225
+ if (result.isErr()) {
226
+ expect(result.error.message).toContain('S3 list failed');
227
+ }
228
+ });
229
+ });
230
+ describe('exists', () => {
231
+ it('should return true when object exists', async () => {
232
+ setupMockResponse(200, '');
233
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
234
+ const result = await provider.exists('my-key');
235
+ expect(result.isOk()).toBe(true);
236
+ if (result.isOk()) {
237
+ expect(result.value).toBe(true);
238
+ }
239
+ });
240
+ it('should return false when object does not exist (404)', async () => {
241
+ // HEAD request with 404 triggers reject with '404 Not Found'
242
+ setupMockResponse(404, '');
243
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
244
+ const result = await provider.exists('missing-key');
245
+ expect(result.isOk()).toBe(true);
246
+ if (result.isOk()) {
247
+ expect(result.value).toBe(false);
248
+ }
249
+ });
250
+ it('should return err on non-404 error', async () => {
251
+ setupMockResponse(500, 'InternalError');
252
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
253
+ const result = await provider.exists('error-key');
254
+ expect(result.isErr()).toBe(true);
255
+ if (result.isErr()) {
256
+ expect(result.error.message).toContain('S3 exists check failed');
257
+ }
258
+ });
259
+ });
260
+ describe('getUrl', () => {
261
+ it('should return standard S3 URL', () => {
262
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
263
+ const result = provider.getUrl('my-file.ts');
264
+ expect(result.isOk()).toBe(true);
265
+ if (result.isOk()) {
266
+ expect(result.value).toBe('https://test-bucket.s3.us-east-1.amazonaws.com/my-file.ts');
267
+ }
268
+ });
269
+ it('should return custom endpoint URL', () => {
270
+ const config = { ...DEFAULT_CONFIG, endpoint: 'http://minio:9000' };
271
+ const provider = new S3StorageProvider(config);
272
+ const result = provider.getUrl('my-file.ts');
273
+ expect(result.isOk()).toBe(true);
274
+ if (result.isOk()) {
275
+ expect(result.value).toBe('http://minio:9000/test-bucket/my-file.ts');
276
+ }
277
+ });
278
+ });
279
+ describe('custom endpoint (MinIO)', () => {
280
+ it('should use http for http:// endpoint', async () => {
281
+ setupMockResponseForHttp(200, '');
282
+ const config = {
283
+ ...DEFAULT_CONFIG,
284
+ endpoint: 'http://localhost:9000',
285
+ };
286
+ const provider = new S3StorageProvider(config);
287
+ const result = await provider.upload('test', Buffer.from('data'));
288
+ expect(result.isOk()).toBe(true);
289
+ expect(mockHttpRequest).toHaveBeenCalled();
290
+ });
291
+ it('should use https for https:// endpoint', async () => {
292
+ setupMockResponse(200, '');
293
+ const config = {
294
+ ...DEFAULT_CONFIG,
295
+ endpoint: 'https://minio.example.com',
296
+ };
297
+ const provider = new S3StorageProvider(config);
298
+ const result = await provider.upload('test', Buffer.from('data'));
299
+ expect(result.isOk()).toBe(true);
300
+ expect(mockHttpsRequest).toHaveBeenCalled();
301
+ });
302
+ });
303
+ describe('AWS Signature V4', () => {
304
+ it('should include Authorization header in request', async () => {
305
+ setupMockResponse(200, '');
306
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
307
+ await provider.upload('my-key', Buffer.from('hello'));
308
+ const options = mockHttpsRequest.mock.calls[0]?.[0];
309
+ expect(options.headers).toBeDefined();
310
+ expect(options.headers['authorization']).toContain('AWS4-HMAC-SHA256');
311
+ expect(options.headers['authorization']).toContain('Credential=AKIAIOSFODNN7EXAMPLE');
312
+ });
313
+ it('should include x-amz-date header', async () => {
314
+ setupMockResponse(200, '');
315
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
316
+ await provider.upload('my-key', Buffer.from('hello'));
317
+ const options = mockHttpsRequest.mock.calls[0]?.[0];
318
+ expect(options.headers['x-amz-date']).toMatch(/^\d{8}T\d{6}Z$/);
319
+ });
320
+ it('should include content-sha256 header', async () => {
321
+ setupMockResponse(200, '');
322
+ const provider = new S3StorageProvider(DEFAULT_CONFIG);
323
+ await provider.upload('my-key', Buffer.from('hello'));
324
+ const options = mockHttpsRequest.mock.calls[0]?.[0];
325
+ expect(options.headers['x-amz-content-sha256']).toMatch(/^[a-f0-9]{64}$/);
326
+ });
327
+ });
328
+ });
329
+ //# sourceMappingURL=s3-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-provider.test.js","sourceRoot":"","sources":["../../src/storage/s3-provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { Result } from 'neverthrow';
2
+ /**
3
+ * Error class for cloud storage operations.
4
+ */
5
+ export declare class StorageError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ /**
9
+ * Provider-agnostic interface for cloud object storage.
10
+ * All operations return Result<T, StorageError> for safe error handling.
11
+ */
12
+ export interface CloudStorageProvider {
13
+ /**
14
+ * Upload data to the given key.
15
+ */
16
+ upload(key: string, data: Buffer): Promise<Result<void, StorageError>>;
17
+ /**
18
+ * Download data from the given key.
19
+ */
20
+ download(key: string): Promise<Result<Buffer, StorageError>>;
21
+ /**
22
+ * Delete the object at the given key.
23
+ */
24
+ delete(key: string): Promise<Result<void, StorageError>>;
25
+ /**
26
+ * List object keys matching a prefix.
27
+ */
28
+ list(prefix: string): Promise<Result<readonly string[], StorageError>>;
29
+ /**
30
+ * Check whether an object exists at the given key.
31
+ */
32
+ exists(key: string): Promise<Result<boolean, StorageError>>;
33
+ /**
34
+ * Get a URL (or presigned URL) for the given key.
35
+ */
36
+ getUrl(key: string): Result<string, StorageError>;
37
+ }
38
+ export interface S3Config {
39
+ readonly provider: 's3';
40
+ readonly bucket: string;
41
+ readonly region: string;
42
+ readonly accessKeyId: string;
43
+ readonly secretAccessKey: string;
44
+ /** Optional custom endpoint for S3-compatible stores like MinIO. */
45
+ readonly endpoint?: string;
46
+ }
47
+ export interface AzureBlobConfig {
48
+ readonly provider: 'azure-blob';
49
+ readonly accountName: string;
50
+ readonly accountKey: string;
51
+ readonly containerName: string;
52
+ }
53
+ export interface GCSConfig {
54
+ readonly provider: 'gcs';
55
+ readonly projectId: string;
56
+ readonly bucket: string;
57
+ /** Service account JSON key (parsed object). */
58
+ readonly credentials: GCSCredentials;
59
+ }
60
+ export interface GCSCredentials {
61
+ readonly client_email: string;
62
+ readonly private_key: string;
63
+ readonly token_uri: string;
64
+ }
65
+ export type CloudStorageConfig = S3Config | AzureBlobConfig | GCSConfig;
@@ -0,0 +1,12 @@
1
+ // ---------------------------------------------------------------------------
2
+ // StorageError
3
+ // ---------------------------------------------------------------------------
4
+ /**
5
+ * Error class for cloud storage operations.
6
+ */
7
+ export class StorageError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'StorageError';
11
+ }
12
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ export interface ChunkMetadata {
2
+ chunkType: ChunkType;
3
+ name: string;
4
+ parentName?: string;
5
+ declarations: string[];
6
+ imports: string[];
7
+ exports: string[];
8
+ repoName?: string;
9
+ /** Wikilinks extracted from documentation chunks ([[link]] syntax). */
10
+ links?: string[];
11
+ /** Tags extracted from documentation chunks (#tag syntax + frontmatter). */
12
+ tags?: string[];
13
+ /** Aliases from Obsidian frontmatter. */
14
+ aliases?: string[];
15
+ /** Document title from frontmatter. */
16
+ docTitle?: string;
17
+ }
18
+ export type ChunkType = 'function' | 'method' | 'class' | 'module' | 'interface' | 'type_alias' | 'config_block' | 'import_block' | 'doc';
19
+ export interface Chunk {
20
+ id: string;
21
+ content: string;
22
+ nlSummary: string;
23
+ filePath: string;
24
+ startLine: number;
25
+ endLine: number;
26
+ language: string;
27
+ metadata: ChunkMetadata;
28
+ embedding?: number[];
29
+ }
30
+ export interface ChunkWithEmbedding extends Chunk {
31
+ embedding: number[];
32
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../src/types/chunk.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ export interface OpenAICompatibleConfig {
2
+ baseUrl: string;
3
+ apiKey?: string;
4
+ maxBatchSize: number;
5
+ }
6
+ export interface EmbeddingDockerConfig {
7
+ image: string;
8
+ gpu: 'auto' | 'nvidia' | 'none';
9
+ }
10
+ export interface EmbeddingConfig {
11
+ provider: string;
12
+ model: string;
13
+ dimensions: number;
14
+ openaiCompatible?: OpenAICompatibleConfig;
15
+ autoStart: boolean;
16
+ autoStop: boolean;
17
+ docker: EmbeddingDockerConfig;
18
+ }
19
+ export interface LLMConfig {
20
+ provider: string;
21
+ model: string;
22
+ }
23
+ export interface IngestionConfig {
24
+ maxTokensPerChunk: number;
25
+ exclude: string[];
26
+ }
27
+ export interface SearchConfig {
28
+ topK: number;
29
+ vectorWeight: number;
30
+ bm25Weight: number;
31
+ }
32
+ export interface QdrantStorageConfig {
33
+ url?: string;
34
+ collectionName?: string;
35
+ }
36
+ export interface StorageConfig {
37
+ path: string;
38
+ provider?: 'lancedb' | 'qdrant';
39
+ qdrant?: QdrantStorageConfig;
40
+ }
41
+ export interface ProjectConfig {
42
+ name: string;
43
+ languages: string[] | 'auto';
44
+ }
45
+ export interface ReRankerConfig {
46
+ enabled: boolean;
47
+ model: string;
48
+ topN: number;
49
+ }
50
+ export interface RepoConfig {
51
+ path: string;
52
+ name?: string;
53
+ languages?: string[];
54
+ exclude?: string[];
55
+ }
56
+ export interface BacklogConfig {
57
+ provider: string;
58
+ config?: Record<string, unknown>;
59
+ }
60
+ export interface CodeRAGConfig {
61
+ version: string;
62
+ project: ProjectConfig;
63
+ ingestion: IngestionConfig;
64
+ embedding: EmbeddingConfig;
65
+ llm: LLMConfig;
66
+ search: SearchConfig;
67
+ storage: StorageConfig;
68
+ reranker?: ReRankerConfig;
69
+ repos?: RepoConfig[];
70
+ backlog?: BacklogConfig;
71
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export type { ChunkMetadata, ChunkType, Chunk, ChunkWithEmbedding } from './chunk.js';
2
+ export type { CodeRAGConfig, EmbeddingConfig, OpenAICompatibleConfig, EmbeddingDockerConfig, LLMConfig, IngestionConfig, SearchConfig, StorageConfig, QdrantStorageConfig, ProjectConfig, ReRankerConfig, RepoConfig, BacklogConfig, } from './config.js';
3
+ export type { EmbeddingProvider, VectorStore, LLMProvider, ReRanker, Parser, Chunker, ParsedFile, } from './provider.js';
4
+ export { EmbedError, StoreError, LLMError, ParseError, ChunkError, ReRankerError } from './provider.js';
5
+ export type { SearchQuery, SearchFilters, SearchOptions, SearchResult, SearchMethod, } from './search.js';
@@ -0,0 +1 @@
1
+ export { EmbedError, StoreError, LLMError, ParseError, ChunkError, ReRankerError } from './provider.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { Result } from 'neverthrow';
2
+ import type { Chunk } from './chunk.js';
3
+ export declare class ParseError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ export declare class ChunkError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export declare class EmbedError extends Error {
10
+ constructor(message: string);
11
+ }
12
+ export declare class StoreError extends Error {
13
+ constructor(message: string);
14
+ }
15
+ export declare class LLMError extends Error {
16
+ constructor(message: string);
17
+ }
18
+ export interface ParsedFile {
19
+ filePath: string;
20
+ language: string;
21
+ content: string;
22
+ declarations: string[];
23
+ }
24
+ export interface Parser {
25
+ parse(filePath: string, content: string): Promise<Result<ParsedFile, ParseError>>;
26
+ supportedLanguages(): string[];
27
+ }
28
+ export interface Chunker {
29
+ chunk(parsed: ParsedFile): Promise<Result<Chunk[], ChunkError>>;
30
+ }
31
+ export interface EmbeddingProvider {
32
+ embed(texts: string[]): Promise<Result<number[][], EmbedError>>;
33
+ readonly dimensions: number;
34
+ }
35
+ export interface VectorStore {
36
+ upsert(ids: string[], embeddings: number[][], metadata: Record<string, unknown>[]): Promise<Result<void, StoreError>>;
37
+ query(embedding: number[], topK: number): Promise<Result<{
38
+ id: string;
39
+ score: number;
40
+ metadata?: Record<string, unknown>;
41
+ }[], StoreError>>;
42
+ delete(ids: string[]): Promise<Result<void, StoreError>>;
43
+ count(): Promise<Result<number, StoreError>>;
44
+ close(): void;
45
+ }
46
+ export interface LLMProvider {
47
+ generate(prompt: string): Promise<Result<string, LLMError>>;
48
+ }
49
+ export declare class ReRankerError extends Error {
50
+ constructor(message: string);
51
+ }
52
+ export interface ReRanker {
53
+ rerank(query: string, results: import('./search.js').SearchResult[]): Promise<Result<import('./search.js').SearchResult[], ReRankerError>>;
54
+ }
@@ -0,0 +1,36 @@
1
+ export class ParseError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'ParseError';
5
+ }
6
+ }
7
+ export class ChunkError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'ChunkError';
11
+ }
12
+ }
13
+ export class EmbedError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = 'EmbedError';
17
+ }
18
+ }
19
+ export class StoreError extends Error {
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = 'StoreError';
23
+ }
24
+ }
25
+ export class LLMError extends Error {
26
+ constructor(message) {
27
+ super(message);
28
+ this.name = 'LLMError';
29
+ }
30
+ }
31
+ export class ReRankerError extends Error {
32
+ constructor(message) {
33
+ super(message);
34
+ this.name = 'ReRankerError';
35
+ }
36
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AA0CD,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}