@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,174 @@
1
+ import { ok, err } from 'neverthrow';
2
+ import { StoreError } from '../types/provider.js';
3
+ import { QdrantClient } from '@qdrant/js-client-rest';
4
+ const DEFAULT_URL = 'http://localhost:6333';
5
+ const DEFAULT_COLLECTION = 'coderag';
6
+ const SAFE_ID_PATTERN = /^[a-zA-Z0-9_\-:.]+$/;
7
+ function validateId(id) {
8
+ return SAFE_ID_PATTERN.test(id) && id.length > 0 && id.length <= 256;
9
+ }
10
+ /**
11
+ * Deterministic numeric hash for a string ID.
12
+ * Qdrant requires point IDs to be either unsigned integers or UUIDs.
13
+ * We use a string-based UUID-like ID by leveraging Qdrant's named ID support,
14
+ * but the simplest compatible approach is to store our string ID in the payload
15
+ * and use a numeric hash as the point ID.
16
+ *
17
+ * We use a simple FNV-1a-like hash mapped to a positive integer.
18
+ */
19
+ function stringToPointId(id) {
20
+ let hash = 2166136261;
21
+ for (let i = 0; i < id.length; i++) {
22
+ hash ^= id.charCodeAt(i);
23
+ hash = (hash * 16777619) >>> 0;
24
+ }
25
+ // Ensure positive non-zero integer
26
+ return (hash >>> 0) || 1;
27
+ }
28
+ export class QdrantVectorStore {
29
+ url;
30
+ collectionName;
31
+ _dimensions;
32
+ apiKey;
33
+ client = null;
34
+ collectionReady = false;
35
+ constructor(dimensions, config) {
36
+ this._dimensions = dimensions;
37
+ this.url = config?.url ?? DEFAULT_URL;
38
+ this.collectionName = config?.collectionName ?? DEFAULT_COLLECTION;
39
+ this.apiKey = config?.apiKey;
40
+ }
41
+ get dimensions() {
42
+ return this._dimensions;
43
+ }
44
+ async connect() {
45
+ this.client = new QdrantClient({
46
+ url: this.url,
47
+ apiKey: this.apiKey,
48
+ checkCompatibility: false,
49
+ });
50
+ // Create collection if it doesn't exist
51
+ try {
52
+ const exists = await this.client.collectionExists(this.collectionName);
53
+ if (!exists.exists) {
54
+ await this.client.createCollection(this.collectionName, {
55
+ vectors: {
56
+ size: this._dimensions,
57
+ distance: 'Cosine',
58
+ },
59
+ });
60
+ }
61
+ this.collectionReady = true;
62
+ }
63
+ catch {
64
+ // Collection may already exist from a prior run
65
+ this.collectionReady = true;
66
+ }
67
+ }
68
+ async ensureConnected() {
69
+ if (!this.client) {
70
+ await this.connect();
71
+ }
72
+ }
73
+ async upsert(ids, embeddings, metadata) {
74
+ try {
75
+ for (const id of ids) {
76
+ if (!validateId(id)) {
77
+ return err(new StoreError(`Invalid chunk ID: ${id}`));
78
+ }
79
+ }
80
+ await this.ensureConnected();
81
+ if (ids.length === 0) {
82
+ return ok(undefined);
83
+ }
84
+ const points = ids.map((id, i) => ({
85
+ id: stringToPointId(id),
86
+ vector: embeddings[i] ?? [],
87
+ payload: {
88
+ _coderag_id: id,
89
+ ...(metadata[i] ?? {}),
90
+ },
91
+ }));
92
+ await this.client.upsert(this.collectionName, {
93
+ wait: true,
94
+ points,
95
+ });
96
+ return ok(undefined);
97
+ }
98
+ catch (error) {
99
+ const message = error instanceof Error ? error.message : 'Unknown error';
100
+ return err(new StoreError(`Qdrant upsert failed: ${message}`));
101
+ }
102
+ }
103
+ async query(embedding, topK) {
104
+ try {
105
+ await this.ensureConnected();
106
+ if (!this.collectionReady) {
107
+ return ok([]);
108
+ }
109
+ const results = await this.client.search(this.collectionName, {
110
+ vector: embedding,
111
+ limit: topK,
112
+ with_payload: true,
113
+ });
114
+ const mapped = results.map((point) => {
115
+ const payload = point.payload ?? {};
116
+ const id = payload['_coderag_id'] ?? String(point.id);
117
+ const { _coderag_id: _, ...metadata } = payload;
118
+ return {
119
+ id,
120
+ score: point.score,
121
+ metadata,
122
+ };
123
+ });
124
+ return ok(mapped);
125
+ }
126
+ catch (error) {
127
+ const message = error instanceof Error ? error.message : 'Unknown error';
128
+ return err(new StoreError(`Qdrant query failed: ${message}`));
129
+ }
130
+ }
131
+ async delete(ids) {
132
+ try {
133
+ for (const id of ids) {
134
+ if (!validateId(id)) {
135
+ return err(new StoreError(`Invalid chunk ID: ${id}`));
136
+ }
137
+ }
138
+ await this.ensureConnected();
139
+ if (ids.length === 0) {
140
+ return ok(undefined);
141
+ }
142
+ const pointIds = ids.map((id) => stringToPointId(id));
143
+ await this.client.delete(this.collectionName, {
144
+ wait: true,
145
+ points: pointIds,
146
+ });
147
+ return ok(undefined);
148
+ }
149
+ catch (error) {
150
+ const message = error instanceof Error ? error.message : 'Unknown error';
151
+ return err(new StoreError(`Qdrant delete failed: ${message}`));
152
+ }
153
+ }
154
+ async count() {
155
+ try {
156
+ await this.ensureConnected();
157
+ if (!this.collectionReady) {
158
+ return ok(0);
159
+ }
160
+ const result = await this.client.count(this.collectionName, {
161
+ exact: true,
162
+ });
163
+ return ok(result.count);
164
+ }
165
+ catch (error) {
166
+ const message = error instanceof Error ? error.message : 'Unknown error';
167
+ return err(new StoreError(`Qdrant count failed: ${message}`));
168
+ }
169
+ }
170
+ close() {
171
+ this.client = null;
172
+ this.collectionReady = false;
173
+ }
174
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-store.js","sourceRoot":"","sources":["../../src/embedding/qdrant-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAQtD,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,MAAM,kBAAkB,GAAG,SAAS,CAAC;AACrC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAE9C,SAAS,UAAU,CAAC,EAAU;IAC5B,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,GAAG,CAAC;AACvE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,EAAU;IACjC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,mCAAmC;IACnC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,OAAO,iBAAiB;IACX,GAAG,CAAS;IACZ,cAAc,CAAS;IACvB,WAAW,CAAS;IACpB,MAAM,CAAU;IACzB,MAAM,GAAwB,IAAI,CAAC;IACnC,eAAe,GAAG,KAAK,CAAC;IAEhC,YAAY,UAAkB,EAAE,MAAqB;QACnD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,kBAAkB,CAAC;QACnE,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC;IAC/B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,kBAAkB,EAAE,KAAK;SAC1B,CAAC,CAAC;QAEH,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE;oBACtD,OAAO,EAAE;wBACP,IAAI,EAAE,IAAI,CAAC,WAAW;wBACtB,QAAQ,EAAE,QAAQ;qBACnB;iBACF,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAa,EACb,UAAsB,EACtB,QAAmC;QAEnC,IAAI,CAAC;YACH,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpB,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YAED,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE7B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;YACvB,CAAC;YAED,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,EAAE,EAAE,eAAe,CAAC,EAAE,CAAC;gBACvB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC3B,OAAO,EAAE;oBACP,WAAW,EAAE,EAAE;oBACf,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACvB;aACF,CAAC,CAAC,CAAC;YAEJ,MAAM,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;gBAC7C,IAAI,EAAE,IAAI;gBACV,MAAM;aACP,CAAC,CAAC;YAEH,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CACT,SAAmB,EACnB,IAAY;QAEZ,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE7B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;gBAC7D,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;gBACpC,MAAM,EAAE,GAAI,OAAO,CAAC,aAAa,CAAY,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAkC,CAAC;gBAC3E,OAAO;oBACL,EAAE;oBACF,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ;iBACT,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAa;QACxB,IAAI,CAAC;YACH,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpB,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YAED,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE7B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;YACvB,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;YAEtD,MAAM,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;gBAC7C,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YAEH,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE7B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAO,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE;gBAC3D,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,359 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { StoreError } from '../types/provider.js';
3
+ // Mock the Qdrant client before importing the store
4
+ const mockUpsert = vi.fn();
5
+ const mockSearch = vi.fn();
6
+ const mockDelete = vi.fn();
7
+ const mockCount = vi.fn();
8
+ const mockCollectionExists = vi.fn();
9
+ const mockCreateCollection = vi.fn();
10
+ vi.mock('@qdrant/js-client-rest', () => ({
11
+ QdrantClient: vi.fn().mockImplementation(() => ({
12
+ upsert: mockUpsert,
13
+ search: mockSearch,
14
+ delete: mockDelete,
15
+ count: mockCount,
16
+ collectionExists: mockCollectionExists,
17
+ createCollection: mockCreateCollection,
18
+ })),
19
+ }));
20
+ import { QdrantVectorStore } from './qdrant-store.js';
21
+ describe('QdrantVectorStore', () => {
22
+ const DIMENSIONS = 4;
23
+ beforeEach(() => {
24
+ vi.clearAllMocks();
25
+ mockCollectionExists.mockResolvedValue({ exists: false });
26
+ mockCreateCollection.mockResolvedValue(true);
27
+ mockUpsert.mockResolvedValue({ status: 'completed' });
28
+ mockSearch.mockResolvedValue([]);
29
+ mockDelete.mockResolvedValue({ status: 'completed' });
30
+ mockCount.mockResolvedValue({ count: 0 });
31
+ });
32
+ describe('constructor', () => {
33
+ it('should expose the configured dimensions', () => {
34
+ const store = new QdrantVectorStore(DIMENSIONS);
35
+ expect(store.dimensions).toBe(DIMENSIONS);
36
+ });
37
+ it('should use default url and collection name', () => {
38
+ const store = new QdrantVectorStore(DIMENSIONS);
39
+ expect(store.dimensions).toBe(DIMENSIONS);
40
+ });
41
+ it('should accept custom config', () => {
42
+ const store = new QdrantVectorStore(DIMENSIONS, {
43
+ url: 'http://remote:6333',
44
+ collectionName: 'custom-collection',
45
+ apiKey: 'test-key',
46
+ });
47
+ expect(store.dimensions).toBe(DIMENSIONS);
48
+ });
49
+ });
50
+ describe('connect', () => {
51
+ it('should create collection if it does not exist', async () => {
52
+ mockCollectionExists.mockResolvedValue({ exists: false });
53
+ const store = new QdrantVectorStore(DIMENSIONS);
54
+ await store.connect();
55
+ expect(mockCollectionExists).toHaveBeenCalledWith('coderag');
56
+ expect(mockCreateCollection).toHaveBeenCalledWith('coderag', {
57
+ vectors: {
58
+ size: DIMENSIONS,
59
+ distance: 'Cosine',
60
+ },
61
+ });
62
+ });
63
+ it('should not create collection if it already exists', async () => {
64
+ mockCollectionExists.mockResolvedValue({ exists: true });
65
+ const store = new QdrantVectorStore(DIMENSIONS);
66
+ await store.connect();
67
+ expect(mockCollectionExists).toHaveBeenCalledWith('coderag');
68
+ expect(mockCreateCollection).not.toHaveBeenCalled();
69
+ });
70
+ it('should use custom collection name from config', async () => {
71
+ mockCollectionExists.mockResolvedValue({ exists: false });
72
+ const store = new QdrantVectorStore(DIMENSIONS, {
73
+ collectionName: 'my-vectors',
74
+ });
75
+ await store.connect();
76
+ expect(mockCollectionExists).toHaveBeenCalledWith('my-vectors');
77
+ expect(mockCreateCollection).toHaveBeenCalledWith('my-vectors', {
78
+ vectors: {
79
+ size: DIMENSIONS,
80
+ distance: 'Cosine',
81
+ },
82
+ });
83
+ });
84
+ it('should handle errors during connect gracefully', async () => {
85
+ mockCollectionExists.mockRejectedValue(new Error('Connection refused'));
86
+ const store = new QdrantVectorStore(DIMENSIONS);
87
+ // Should not throw - the catch block handles it
88
+ await store.connect();
89
+ });
90
+ });
91
+ describe('upsert', () => {
92
+ it('should insert new records successfully', async () => {
93
+ const store = new QdrantVectorStore(DIMENSIONS);
94
+ await store.connect();
95
+ const result = await store.upsert(['chunk-1', 'chunk-2'], [
96
+ [1.0, 0.0, 0.0, 0.0],
97
+ [0.0, 1.0, 0.0, 0.0],
98
+ ], [
99
+ {
100
+ content: 'function add(a, b) { return a + b; }',
101
+ chunk_type: 'function',
102
+ file_path: 'src/utils.ts',
103
+ language: 'typescript',
104
+ },
105
+ {
106
+ content: 'function sub(a, b) { return a - b; }',
107
+ chunk_type: 'function',
108
+ file_path: 'src/utils.ts',
109
+ language: 'typescript',
110
+ },
111
+ ]);
112
+ expect(result.isOk()).toBe(true);
113
+ expect(mockUpsert).toHaveBeenCalledWith('coderag', {
114
+ wait: true,
115
+ points: expect.arrayContaining([
116
+ expect.objectContaining({
117
+ vector: [1.0, 0.0, 0.0, 0.0],
118
+ payload: expect.objectContaining({
119
+ _coderag_id: 'chunk-1',
120
+ content: 'function add(a, b) { return a + b; }',
121
+ }),
122
+ }),
123
+ expect.objectContaining({
124
+ vector: [0.0, 1.0, 0.0, 0.0],
125
+ payload: expect.objectContaining({
126
+ _coderag_id: 'chunk-2',
127
+ content: 'function sub(a, b) { return a - b; }',
128
+ }),
129
+ }),
130
+ ]),
131
+ });
132
+ });
133
+ it('should return error for invalid chunk ID', async () => {
134
+ const store = new QdrantVectorStore(DIMENSIONS);
135
+ await store.connect();
136
+ const result = await store.upsert(['invalid id with spaces'], [[1.0, 0.0, 0.0, 0.0]], [{ content: 'test' }]);
137
+ expect(result.isErr()).toBe(true);
138
+ if (result.isErr()) {
139
+ expect(result.error).toBeInstanceOf(StoreError);
140
+ expect(result.error.message).toContain('Invalid chunk ID');
141
+ }
142
+ });
143
+ it('should handle empty ids array', async () => {
144
+ const store = new QdrantVectorStore(DIMENSIONS);
145
+ await store.connect();
146
+ const result = await store.upsert([], [], []);
147
+ expect(result.isOk()).toBe(true);
148
+ expect(mockUpsert).not.toHaveBeenCalled();
149
+ });
150
+ it('should handle metadata with missing fields gracefully', async () => {
151
+ const store = new QdrantVectorStore(DIMENSIONS);
152
+ await store.connect();
153
+ const result = await store.upsert(['chunk-1'], [[1.0, 0.0, 0.0, 0.0]], [{}]);
154
+ expect(result.isOk()).toBe(true);
155
+ });
156
+ it('should return StoreError on upsert failure', async () => {
157
+ mockUpsert.mockRejectedValue(new Error('Connection lost'));
158
+ const store = new QdrantVectorStore(DIMENSIONS);
159
+ await store.connect();
160
+ const result = await store.upsert(['chunk-1'], [[1.0, 0.0, 0.0, 0.0]], [{ content: 'test' }]);
161
+ expect(result.isErr()).toBe(true);
162
+ if (result.isErr()) {
163
+ expect(result.error).toBeInstanceOf(StoreError);
164
+ expect(result.error.message).toContain('Qdrant upsert failed');
165
+ expect(result.error.message).toContain('Connection lost');
166
+ }
167
+ });
168
+ it('should handle non-Error throw gracefully', async () => {
169
+ mockUpsert.mockRejectedValue('string error');
170
+ const store = new QdrantVectorStore(DIMENSIONS);
171
+ await store.connect();
172
+ const result = await store.upsert(['chunk-1'], [[1.0, 0.0, 0.0, 0.0]], [{ content: 'test' }]);
173
+ expect(result.isErr()).toBe(true);
174
+ if (result.isErr()) {
175
+ expect(result.error).toBeInstanceOf(StoreError);
176
+ expect(result.error.message).toContain('Unknown error');
177
+ }
178
+ });
179
+ it('should auto-connect on first upsert if not connected', async () => {
180
+ const store = new QdrantVectorStore(DIMENSIONS);
181
+ // Do NOT call connect()
182
+ const result = await store.upsert(['chunk-1'], [[1.0, 0.0, 0.0, 0.0]], [{ content: 'test' }]);
183
+ expect(result.isOk()).toBe(true);
184
+ expect(mockCollectionExists).toHaveBeenCalled();
185
+ });
186
+ });
187
+ describe('query', () => {
188
+ it('should return search results with scores', async () => {
189
+ mockSearch.mockResolvedValue([
190
+ { id: 123, score: 0.95, payload: { _coderag_id: 'chunk-1', content: 'content-1' } },
191
+ { id: 456, score: 0.80, payload: { _coderag_id: 'chunk-2', content: 'content-2' } },
192
+ ]);
193
+ const store = new QdrantVectorStore(DIMENSIONS);
194
+ await store.connect();
195
+ const result = await store.query([1.0, 0.0, 0.0, 0.0], 2);
196
+ expect(result.isOk()).toBe(true);
197
+ if (result.isOk()) {
198
+ expect(result.value).toHaveLength(2);
199
+ expect(result.value[0].id).toBe('chunk-1');
200
+ expect(result.value[0].score).toBe(0.95);
201
+ expect(result.value[1].id).toBe('chunk-2');
202
+ expect(result.value[1].score).toBe(0.80);
203
+ }
204
+ expect(mockSearch).toHaveBeenCalledWith('coderag', {
205
+ vector: [1.0, 0.0, 0.0, 0.0],
206
+ limit: 2,
207
+ with_payload: true,
208
+ });
209
+ });
210
+ it('should return empty array when no results', async () => {
211
+ mockSearch.mockResolvedValue([]);
212
+ const store = new QdrantVectorStore(DIMENSIONS);
213
+ await store.connect();
214
+ const result = await store.query([1.0, 0.0, 0.0, 0.0], 5);
215
+ expect(result.isOk()).toBe(true);
216
+ if (result.isOk()) {
217
+ expect(result.value).toEqual([]);
218
+ }
219
+ });
220
+ it('should fallback to point id when _coderag_id is missing', async () => {
221
+ mockSearch.mockResolvedValue([
222
+ { id: 999, score: 0.5, payload: {} },
223
+ ]);
224
+ const store = new QdrantVectorStore(DIMENSIONS);
225
+ await store.connect();
226
+ const result = await store.query([1.0, 0.0, 0.0, 0.0], 1);
227
+ expect(result.isOk()).toBe(true);
228
+ if (result.isOk()) {
229
+ expect(result.value[0].id).toBe('999');
230
+ }
231
+ });
232
+ it('should handle null payload gracefully', async () => {
233
+ mockSearch.mockResolvedValue([
234
+ { id: 999, score: 0.5, payload: null },
235
+ ]);
236
+ const store = new QdrantVectorStore(DIMENSIONS);
237
+ await store.connect();
238
+ const result = await store.query([1.0, 0.0, 0.0, 0.0], 1);
239
+ expect(result.isOk()).toBe(true);
240
+ if (result.isOk()) {
241
+ expect(result.value[0].id).toBe('999');
242
+ }
243
+ });
244
+ it('should return StoreError on search failure', async () => {
245
+ mockSearch.mockRejectedValue(new Error('Timeout'));
246
+ const store = new QdrantVectorStore(DIMENSIONS);
247
+ await store.connect();
248
+ const result = await store.query([1.0, 0.0, 0.0, 0.0], 5);
249
+ expect(result.isErr()).toBe(true);
250
+ if (result.isErr()) {
251
+ expect(result.error).toBeInstanceOf(StoreError);
252
+ expect(result.error.message).toContain('Qdrant query failed');
253
+ expect(result.error.message).toContain('Timeout');
254
+ }
255
+ });
256
+ it('should auto-connect on first query if not connected', async () => {
257
+ const store = new QdrantVectorStore(DIMENSIONS);
258
+ // Do NOT call connect()
259
+ const result = await store.query([1.0, 0.0, 0.0, 0.0], 5);
260
+ expect(result.isOk()).toBe(true);
261
+ expect(mockCollectionExists).toHaveBeenCalled();
262
+ });
263
+ });
264
+ describe('delete', () => {
265
+ it('should delete points by ID', async () => {
266
+ const store = new QdrantVectorStore(DIMENSIONS);
267
+ await store.connect();
268
+ const result = await store.delete(['chunk-1', 'chunk-2']);
269
+ expect(result.isOk()).toBe(true);
270
+ expect(mockDelete).toHaveBeenCalledWith('coderag', {
271
+ wait: true,
272
+ points: expect.arrayContaining([
273
+ expect.any(Number),
274
+ expect.any(Number),
275
+ ]),
276
+ });
277
+ });
278
+ it('should return error for invalid chunk ID', async () => {
279
+ const store = new QdrantVectorStore(DIMENSIONS);
280
+ await store.connect();
281
+ const result = await store.delete(['invalid id with spaces']);
282
+ expect(result.isErr()).toBe(true);
283
+ if (result.isErr()) {
284
+ expect(result.error).toBeInstanceOf(StoreError);
285
+ expect(result.error.message).toContain('Invalid chunk ID');
286
+ }
287
+ });
288
+ it('should handle empty ids array', async () => {
289
+ const store = new QdrantVectorStore(DIMENSIONS);
290
+ await store.connect();
291
+ const result = await store.delete([]);
292
+ expect(result.isOk()).toBe(true);
293
+ expect(mockDelete).not.toHaveBeenCalled();
294
+ });
295
+ it('should return StoreError on delete failure', async () => {
296
+ mockDelete.mockRejectedValue(new Error('Not found'));
297
+ const store = new QdrantVectorStore(DIMENSIONS);
298
+ await store.connect();
299
+ const result = await store.delete(['chunk-1']);
300
+ expect(result.isErr()).toBe(true);
301
+ if (result.isErr()) {
302
+ expect(result.error).toBeInstanceOf(StoreError);
303
+ expect(result.error.message).toContain('Qdrant delete failed');
304
+ expect(result.error.message).toContain('Not found');
305
+ }
306
+ });
307
+ });
308
+ describe('count', () => {
309
+ it('should return the count of points', async () => {
310
+ mockCount.mockResolvedValue({ count: 42 });
311
+ const store = new QdrantVectorStore(DIMENSIONS);
312
+ await store.connect();
313
+ const countResult = await store.count();
314
+ expect(countResult.isOk()).toBe(true);
315
+ if (countResult.isOk()) {
316
+ expect(countResult.value).toBe(42);
317
+ }
318
+ expect(mockCount).toHaveBeenCalledWith('coderag', { exact: true });
319
+ });
320
+ it('should return 0 for empty collection', async () => {
321
+ mockCount.mockResolvedValue({ count: 0 });
322
+ const store = new QdrantVectorStore(DIMENSIONS);
323
+ await store.connect();
324
+ const countResult = await store.count();
325
+ expect(countResult.isOk()).toBe(true);
326
+ if (countResult.isOk()) {
327
+ expect(countResult.value).toBe(0);
328
+ }
329
+ });
330
+ it('should return StoreError on count failure', async () => {
331
+ mockCount.mockRejectedValue(new Error('Service unavailable'));
332
+ const store = new QdrantVectorStore(DIMENSIONS);
333
+ await store.connect();
334
+ const countResult = await store.count();
335
+ expect(countResult.isErr()).toBe(true);
336
+ if (countResult.isErr()) {
337
+ expect(countResult.error).toBeInstanceOf(StoreError);
338
+ expect(countResult.error.message).toContain('Qdrant count failed');
339
+ }
340
+ });
341
+ });
342
+ describe('close', () => {
343
+ it('should be callable multiple times without error', async () => {
344
+ const store = new QdrantVectorStore(DIMENSIONS);
345
+ await store.connect();
346
+ store.close();
347
+ store.close(); // should not throw
348
+ });
349
+ it('should allow reconnect after close', async () => {
350
+ const store = new QdrantVectorStore(DIMENSIONS);
351
+ await store.connect();
352
+ store.close();
353
+ // Should auto-connect again
354
+ const result = await store.count();
355
+ expect(result.isOk()).toBe(true);
356
+ });
357
+ });
358
+ });
359
+ //# sourceMappingURL=qdrant-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-store.test.js","sourceRoot":"","sources":["../../src/embedding/qdrant-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { OllamaConfig } from './ollama-client.js';
2
+ export { OllamaClient, OllamaError } from './ollama-client.js';
3
+ export { NLEnricher, EnrichmentError } from './nl-enricher.js';
4
+ export type { EnrichBatchResult } from './nl-enricher.js';
@@ -0,0 +1,2 @@
1
+ export { OllamaClient, OllamaError } from './ollama-client.js';
2
+ export { NLEnricher, EnrichmentError } from './nl-enricher.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type Result } from 'neverthrow';
2
+ import type { Chunk } from '../types/chunk.js';
3
+ import type { OllamaClient } from './ollama-client.js';
4
+ export declare class EnrichmentError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export interface EnrichBatchResult {
8
+ readonly enriched: Chunk[];
9
+ readonly failedCount: number;
10
+ }
11
+ export declare class NLEnricher {
12
+ private readonly client;
13
+ constructor(client: OllamaClient);
14
+ enrichChunk(chunk: Chunk): Promise<Result<Chunk, EnrichmentError>>;
15
+ enrichBatch(chunks: Chunk[], concurrency?: number): Promise<Result<EnrichBatchResult, EnrichmentError>>;
16
+ }
@@ -0,0 +1,47 @@
1
+ import { ok, err } from 'neverthrow';
2
+ export class EnrichmentError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'EnrichmentError';
6
+ }
7
+ }
8
+ function buildPrompt(chunk) {
9
+ return `Summarize this ${chunk.language} code in one sentence. Focus on what it does, not how. Code:\n\`\`\`\n${chunk.content}\n\`\`\``;
10
+ }
11
+ export class NLEnricher {
12
+ client;
13
+ constructor(client) {
14
+ this.client = client;
15
+ }
16
+ async enrichChunk(chunk) {
17
+ const prompt = buildPrompt(chunk);
18
+ const result = await this.client.generate(prompt);
19
+ if (result.isErr()) {
20
+ return err(new EnrichmentError(`Failed to enrich chunk ${chunk.id}: ${result.error.message}`));
21
+ }
22
+ return ok({
23
+ ...chunk,
24
+ nlSummary: result.value.trim(),
25
+ });
26
+ }
27
+ async enrichBatch(chunks, concurrency = 6) {
28
+ if (chunks.length === 0) {
29
+ return ok({ enriched: [], failedCount: 0 });
30
+ }
31
+ const results = [];
32
+ const errors = [];
33
+ for (let i = 0; i < chunks.length; i += concurrency) {
34
+ const batch = chunks.slice(i, i + concurrency);
35
+ const batchResults = await Promise.all(batch.map((chunk) => this.enrichChunk(chunk)));
36
+ for (const result of batchResults) {
37
+ if (result.isErr()) {
38
+ errors.push(result.error);
39
+ }
40
+ else {
41
+ results.push(result.value);
42
+ }
43
+ }
44
+ }
45
+ return ok({ enriched: results, failedCount: errors.length });
46
+ }
47
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nl-enricher.js","sourceRoot":"","sources":["../../src/enrichment/nl-enricher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAe,MAAM,YAAY,CAAC;AAIlD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAOD,SAAS,WAAW,CAAC,KAAY;IAC/B,OAAO,kBAAkB,KAAK,CAAC,QAAQ,yEAAyE,KAAK,CAAC,OAAO,UAAU,CAAC;AAC1I,CAAC;AAED,MAAM,OAAO,UAAU;IACJ,MAAM,CAAe;IAEtC,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAY;QAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,GAAG,CACR,IAAI,eAAe,CACjB,0BAA0B,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAC9D,CACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;YACR,GAAG,KAAK;YACR,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAe,EACf,WAAW,GAAG,CAAC;QAEf,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,OAAO,GAAY,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAC9C,CAAC;YAEF,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;CACF"}