@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,236 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { QueryAnalyzer } from './query-analyzer.js';
3
+ describe('QueryAnalyzer', () => {
4
+ const analyzer = new QueryAnalyzer();
5
+ describe('analyze returns correct structure', () => {
6
+ it('should return all required fields', () => {
7
+ const result = analyzer.analyze('hello world');
8
+ expect(result).toHaveProperty('originalQuery', 'hello world');
9
+ expect(result).toHaveProperty('intent');
10
+ expect(result).toHaveProperty('entities');
11
+ expect(result).toHaveProperty('suggestedFilters');
12
+ expect(result).toHaveProperty('expandedTerms');
13
+ expect(Array.isArray(result.entities)).toBe(true);
14
+ expect(Array.isArray(result.expandedTerms)).toBe(true);
15
+ });
16
+ it('should preserve the original query string', () => {
17
+ const query = 'where is MyClass defined';
18
+ const result = analyzer.analyze(query);
19
+ expect(result.originalQuery).toBe(query);
20
+ });
21
+ });
22
+ describe('intent detection', () => {
23
+ const intentCases = [
24
+ // find_definition
25
+ { query: 'where is MyClass defined', expected: 'find_definition' },
26
+ { query: 'definition of parseConfig', expected: 'find_definition' },
27
+ { query: 'find definition of HybridSearch', expected: 'find_definition' },
28
+ { query: 'show me the definition', expected: 'find_definition' },
29
+ { query: 'where is MyClass declared', expected: 'find_definition' },
30
+ { query: 'declaration of SearchResult', expected: 'find_definition' },
31
+ // find_usage
32
+ { query: 'who calls parseConfig', expected: 'find_usage' },
33
+ { query: 'usage of DependencyGraph', expected: 'find_usage' },
34
+ { query: 'where is MyClass used', expected: 'find_usage' },
35
+ { query: 'references to SearchResult', expected: 'find_usage' },
36
+ { query: 'callers of initialize', expected: 'find_usage' },
37
+ { query: 'consumers of the API', expected: 'find_usage' },
38
+ { query: 'find usage of handleRequest', expected: 'find_usage' },
39
+ { query: 'used by other modules', expected: 'find_usage' },
40
+ // understand_module
41
+ { query: 'how does HybridSearch work', expected: 'understand_module' },
42
+ { query: 'explain the indexer module', expected: 'understand_module' },
43
+ { query: 'what does parseConfig do', expected: 'understand_module' },
44
+ { query: 'understand the graph module', expected: 'understand_module' },
45
+ { query: 'overview of the embedding system', expected: 'understand_module' },
46
+ { query: 'describe the chunker', expected: 'understand_module' },
47
+ { query: 'how is BM25Index implemented', expected: 'understand_module' },
48
+ // find_similar
49
+ { query: 'similar to HybridSearch', expected: 'find_similar' },
50
+ { query: 'something like parseConfig', expected: 'find_similar' },
51
+ { query: 'alternatives to LanceDB', expected: 'find_similar' },
52
+ { query: 'related to the search module', expected: 'find_similar' },
53
+ // general
54
+ { query: 'search function', expected: 'general' },
55
+ { query: 'what are the main modules', expected: 'general' },
56
+ { query: 'list all functions', expected: 'general' },
57
+ ];
58
+ for (const { query, expected } of intentCases) {
59
+ it(`should detect "${expected}" for: "${query}"`, () => {
60
+ const result = analyzer.analyze(query);
61
+ expect(result.intent).toBe(expected);
62
+ });
63
+ }
64
+ });
65
+ describe('entity extraction', () => {
66
+ it('should extract PascalCase identifiers as class entities', () => {
67
+ const result = analyzer.analyze('find DependencyGraph');
68
+ const classEntities = result.entities.filter((e) => e.type === 'class');
69
+ expect(classEntities).toContainEqual({
70
+ type: 'class',
71
+ value: 'DependencyGraph',
72
+ });
73
+ });
74
+ it('should extract camelCase identifiers as function entities', () => {
75
+ const result = analyzer.analyze('where is parseConfig defined');
76
+ const funcEntities = result.entities.filter((e) => e.type === 'function');
77
+ expect(funcEntities).toContainEqual({
78
+ type: 'function',
79
+ value: 'parseConfig',
80
+ });
81
+ });
82
+ it('should extract file paths as file entities', () => {
83
+ const result = analyzer.analyze('look at src/graph/dependency-graph.ts');
84
+ const fileEntities = result.entities.filter((e) => e.type === 'file');
85
+ expect(fileEntities).toContainEqual({
86
+ type: 'file',
87
+ value: 'src/graph/dependency-graph.ts',
88
+ });
89
+ });
90
+ it('should not extract common English words as entities', () => {
91
+ const result = analyzer.analyze('find the class');
92
+ const entities = result.entities.map((e) => e.value);
93
+ expect(entities).not.toContain('the');
94
+ expect(entities).not.toContain('find');
95
+ });
96
+ it('should deduplicate entities', () => {
97
+ const result = analyzer.analyze('MyClass and MyClass');
98
+ const myClassEntities = result.entities.filter((e) => e.value === 'MyClass');
99
+ expect(myClassEntities).toHaveLength(1);
100
+ });
101
+ it('should extract multiple identifiers', () => {
102
+ const result = analyzer.analyze('MyClass uses parseConfig from HybridSearch');
103
+ expect(result.entities.length).toBeGreaterThanOrEqual(3);
104
+ });
105
+ it('should return empty entities for plain text query', () => {
106
+ const result = analyzer.analyze('search for something');
107
+ // "something" doesn't match PascalCase or camelCase multi-word
108
+ expect(result.entities).toHaveLength(0);
109
+ });
110
+ });
111
+ describe('filter suggestion', () => {
112
+ it('should suggest typescript language filter', () => {
113
+ const result = analyzer.analyze('find typescript functions');
114
+ expect(result.suggestedFilters.languages).toContain('typescript');
115
+ });
116
+ it('should suggest language filter for abbreviated names', () => {
117
+ const result = analyzer.analyze('show me ts classes');
118
+ expect(result.suggestedFilters.languages).toContain('typescript');
119
+ });
120
+ it('should suggest python language filter', () => {
121
+ const result = analyzer.analyze('find python modules');
122
+ expect(result.suggestedFilters.languages).toContain('python');
123
+ });
124
+ it('should suggest chunk type filter for "function"', () => {
125
+ const result = analyzer.analyze('list all functions');
126
+ expect(result.suggestedFilters.chunkTypes).toContain('function');
127
+ });
128
+ it('should suggest chunk type filter for "class"', () => {
129
+ const result = analyzer.analyze('find the class definition');
130
+ expect(result.suggestedFilters.chunkTypes).toContain('class');
131
+ });
132
+ it('should suggest chunk type filter for "interface"', () => {
133
+ const result = analyzer.analyze('show all interfaces');
134
+ expect(result.suggestedFilters.chunkTypes).toContain('interface');
135
+ });
136
+ it('should suggest file path filter', () => {
137
+ const result = analyzer.analyze('look at src/graph/dependency-graph.ts');
138
+ expect(result.suggestedFilters.filePaths).toContain('src/graph/dependency-graph.ts');
139
+ });
140
+ it('should return empty filters when no language or type mentioned', () => {
141
+ const result = analyzer.analyze('hello world');
142
+ expect(result.suggestedFilters.languages).toBeUndefined();
143
+ expect(result.suggestedFilters.chunkTypes).toBeUndefined();
144
+ expect(result.suggestedFilters.filePaths).toBeUndefined();
145
+ });
146
+ it('should detect multiple languages', () => {
147
+ const result = analyzer.analyze('compare typescript and python');
148
+ expect(result.suggestedFilters.languages).toContain('typescript');
149
+ expect(result.suggestedFilters.languages).toContain('python');
150
+ });
151
+ });
152
+ describe('edge cases', () => {
153
+ it('should return general intent for empty string', () => {
154
+ const result = analyzer.analyze('');
155
+ expect(result.intent).toBe('general');
156
+ expect(result.entities).toHaveLength(0);
157
+ expect(result.expandedTerms).toHaveLength(0);
158
+ expect(result.originalQuery).toBe('');
159
+ });
160
+ it('should return general intent for whitespace-only string', () => {
161
+ const result = analyzer.analyze(' \t\n ');
162
+ expect(result.intent).toBe('general');
163
+ expect(result.entities).toHaveLength(0);
164
+ expect(result.expandedTerms).toHaveLength(0);
165
+ });
166
+ it('should return general intent for oversized string', () => {
167
+ const longQuery = 'a'.repeat(3000);
168
+ const result = analyzer.analyze(longQuery);
169
+ expect(result.intent).toBe('general');
170
+ expect(result.entities).toHaveLength(0);
171
+ expect(result.expandedTerms).toHaveLength(0);
172
+ expect(result.originalQuery).toBe(longQuery);
173
+ });
174
+ it('should handle strings with special regex characters', () => {
175
+ const result = analyzer.analyze('find [MyClass] (deprecated)');
176
+ // Should not throw, should extract MyClass as class entity
177
+ expect(result).toBeDefined();
178
+ const classEntities = result.entities.filter((e) => e.type === 'class');
179
+ expect(classEntities).toContainEqual({
180
+ type: 'class',
181
+ value: 'MyClass',
182
+ });
183
+ });
184
+ });
185
+ describe('term expansion', () => {
186
+ it('should include original query terms', () => {
187
+ const result = analyzer.analyze('search function');
188
+ expect(result.expandedTerms).toContain('search');
189
+ expect(result.expandedTerms).toContain('function');
190
+ });
191
+ it('should expand "test" with related terms', () => {
192
+ const result = analyzer.analyze('test');
193
+ expect(result.expandedTerms).toContain('test');
194
+ expect(result.expandedTerms).toContain('spec');
195
+ expect(result.expandedTerms).toContain('describe');
196
+ expect(result.expandedTerms).toContain('it');
197
+ expect(result.expandedTerms).toContain('expect');
198
+ });
199
+ it('should expand "error" with related terms', () => {
200
+ const result = analyzer.analyze('error handling');
201
+ expect(result.expandedTerms).toContain('error');
202
+ expect(result.expandedTerms).toContain('exception');
203
+ expect(result.expandedTerms).toContain('throw');
204
+ expect(result.expandedTerms).toContain('catch');
205
+ });
206
+ it('should expand "config" with related terms', () => {
207
+ const result = analyzer.analyze('config setup');
208
+ expect(result.expandedTerms).toContain('config');
209
+ expect(result.expandedTerms).toContain('configuration');
210
+ expect(result.expandedTerms).toContain('settings');
211
+ });
212
+ it('should expand "auth" with related terms', () => {
213
+ const result = analyzer.analyze('auth flow');
214
+ expect(result.expandedTerms).toContain('auth');
215
+ expect(result.expandedTerms).toContain('authentication');
216
+ expect(result.expandedTerms).toContain('login');
217
+ });
218
+ it('should expand "database" with related terms', () => {
219
+ const result = analyzer.analyze('database operations');
220
+ expect(result.expandedTerms).toContain('database');
221
+ expect(result.expandedTerms).toContain('db');
222
+ expect(result.expandedTerms).toContain('query');
223
+ });
224
+ it('should not duplicate terms during expansion', () => {
225
+ const result = analyzer.analyze('test spec');
226
+ const testCount = result.expandedTerms.filter((t) => t === 'test').length;
227
+ expect(testCount).toBe(1);
228
+ });
229
+ it('should preserve non-expandable terms', () => {
230
+ const result = analyzer.analyze('foobar baz');
231
+ expect(result.expandedTerms).toContain('foobar');
232
+ expect(result.expandedTerms).toContain('baz');
233
+ });
234
+ });
235
+ });
236
+ //# sourceMappingURL=query-analyzer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-analyzer.test.js","sourceRoot":"","sources":["../../src/retrieval/query-analyzer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { SearchResult } from '../types/index.js';
2
+ import type { ExpandedContext, RelatedChunk } from './context-expander.js';
3
+ export interface TokenBudgetConfig {
4
+ /** Maximum total tokens for assembled context. Default 8000. */
5
+ maxTokens: number;
6
+ /** Tokens reserved for the LLM response. Default 2000. */
7
+ reserveForAnswer: number;
8
+ /** Fraction of available budget for primary results. Default 0.6. */
9
+ primaryWeight: number;
10
+ /** Fraction of available budget for related context. Default 0.3. */
11
+ relatedWeight: number;
12
+ /** Fraction of available budget for graph excerpt. Default 0.1. */
13
+ graphWeight: number;
14
+ }
15
+ export interface AssembledContext {
16
+ /** Final assembled context string with formatted sections. */
17
+ content: string;
18
+ /** Primary results that fit within the budget. */
19
+ primaryChunks: SearchResult[];
20
+ /** Related chunks that fit within the budget. */
21
+ relatedChunks: RelatedChunk[];
22
+ /** Estimated total token count of the assembled content. */
23
+ tokenCount: number;
24
+ /** Whether results were truncated to fit the budget. */
25
+ truncated: boolean;
26
+ }
27
+ export declare class TokenBudgetOptimizer {
28
+ private readonly config;
29
+ constructor(config?: Partial<TokenBudgetConfig>);
30
+ /**
31
+ * Assemble an ExpandedContext into a token-budgeted context string.
32
+ *
33
+ * Pipeline:
34
+ * 1. Calculate available budget: maxTokens - reserveForAnswer
35
+ * 2. Allocate budget: primary * primaryWeight, related * relatedWeight, graph * graphWeight
36
+ * 3. Fill primary results first (highest score first)
37
+ * 4. Fill related chunks (closest relationship first)
38
+ * 5. Add graph excerpt if budget remains
39
+ * 6. Build formatted context string
40
+ */
41
+ assemble(expanded: ExpandedContext): AssembledContext;
42
+ /** Estimate token count using the text.length / 4 approximation. */
43
+ estimateTokens(text: string): number;
44
+ /**
45
+ * Fill a budget with items, returning what fits.
46
+ * Uses the formatted version of each item to estimate tokens.
47
+ */
48
+ private fillBudget;
49
+ /** Format the graph excerpt as a simplified text representation. */
50
+ private formatGraphExcerpt;
51
+ }
@@ -0,0 +1,141 @@
1
+ const DEFAULT_CONFIG = {
2
+ maxTokens: 8000,
3
+ reserveForAnswer: 2000,
4
+ primaryWeight: 0.6,
5
+ relatedWeight: 0.3,
6
+ graphWeight: 0.1,
7
+ };
8
+ export class TokenBudgetOptimizer {
9
+ config;
10
+ constructor(config) {
11
+ this.config = { ...DEFAULT_CONFIG, ...config };
12
+ }
13
+ /**
14
+ * Assemble an ExpandedContext into a token-budgeted context string.
15
+ *
16
+ * Pipeline:
17
+ * 1. Calculate available budget: maxTokens - reserveForAnswer
18
+ * 2. Allocate budget: primary * primaryWeight, related * relatedWeight, graph * graphWeight
19
+ * 3. Fill primary results first (highest score first)
20
+ * 4. Fill related chunks (closest relationship first)
21
+ * 5. Add graph excerpt if budget remains
22
+ * 6. Build formatted context string
23
+ */
24
+ assemble(expanded) {
25
+ const availableBudget = Math.max(0, this.config.maxTokens - this.config.reserveForAnswer);
26
+ const primaryBudget = Math.floor(availableBudget * this.config.primaryWeight);
27
+ const relatedBudget = Math.floor(availableBudget * this.config.relatedWeight);
28
+ const graphBudget = Math.floor(availableBudget * this.config.graphWeight);
29
+ // Step 1: Fill primary results (sorted by score descending)
30
+ const sortedPrimary = [...expanded.primaryResults].sort((a, b) => b.score - a.score);
31
+ const { items: includedPrimary, tokensUsed: primaryTokensUsed } = this.fillBudget(sortedPrimary, primaryBudget, formatPrimaryChunk);
32
+ // Step 2: Fill related chunks (sorted by distance ascending)
33
+ const sortedRelated = [...expanded.relatedChunks].sort((a, b) => a.distance - b.distance);
34
+ const { items: includedRelated, tokensUsed: relatedTokensUsed } = this.fillBudget(sortedRelated, relatedBudget, formatRelatedChunk);
35
+ // Step 3: Build graph excerpt string
36
+ const graphString = this.formatGraphExcerpt(expanded.graphExcerpt);
37
+ const graphTokens = this.estimateTokens(graphString);
38
+ const includedGraph = graphTokens <= graphBudget ? graphString : '';
39
+ const graphTokensUsed = includedGraph ? graphTokens : 0;
40
+ // Step 4: Build formatted context string
41
+ const sections = [];
42
+ if (includedPrimary.length > 0) {
43
+ sections.push('## Primary Results\n');
44
+ for (const chunk of includedPrimary) {
45
+ sections.push(formatPrimaryChunk(chunk));
46
+ }
47
+ }
48
+ if (includedRelated.length > 0) {
49
+ sections.push('## Related Context\n');
50
+ for (const related of includedRelated) {
51
+ sections.push(formatRelatedChunk(related));
52
+ }
53
+ }
54
+ if (includedGraph) {
55
+ sections.push('## Dependency Graph\n');
56
+ sections.push(includedGraph);
57
+ }
58
+ const content = sections.join('\n');
59
+ const totalTokens = primaryTokensUsed + relatedTokensUsed + graphTokensUsed;
60
+ const truncated = includedPrimary.length < expanded.primaryResults.length ||
61
+ includedRelated.length < expanded.relatedChunks.length ||
62
+ (!includedGraph &&
63
+ expanded.graphExcerpt.nodes.length > 0 &&
64
+ graphTokens > graphBudget);
65
+ return {
66
+ content,
67
+ primaryChunks: includedPrimary,
68
+ relatedChunks: includedRelated,
69
+ tokenCount: totalTokens,
70
+ truncated,
71
+ };
72
+ }
73
+ /** Estimate token count using the text.length / 4 approximation. */
74
+ estimateTokens(text) {
75
+ return Math.ceil(text.length / 4);
76
+ }
77
+ /**
78
+ * Fill a budget with items, returning what fits.
79
+ * Uses the formatted version of each item to estimate tokens.
80
+ */
81
+ fillBudget(items, budget, formatter) {
82
+ const included = [];
83
+ let tokensUsed = 0;
84
+ for (const item of items) {
85
+ const formatted = formatter(item);
86
+ const tokens = this.estimateTokens(formatted);
87
+ if (tokensUsed + tokens > budget) {
88
+ break;
89
+ }
90
+ included.push(item);
91
+ tokensUsed += tokens;
92
+ }
93
+ return { items: included, tokensUsed };
94
+ }
95
+ /** Format the graph excerpt as a simplified text representation. */
96
+ formatGraphExcerpt(excerpt) {
97
+ if (excerpt.nodes.length === 0)
98
+ return '';
99
+ const lines = [];
100
+ lines.push(`Nodes: ${excerpt.nodes.join(', ')}`);
101
+ for (const edge of excerpt.edges) {
102
+ lines.push(`${edge.from} --[${edge.type}]--> ${edge.to}`);
103
+ }
104
+ return lines.join('\n');
105
+ }
106
+ }
107
+ /** Format a primary search result chunk for context output. */
108
+ function formatPrimaryChunk(result) {
109
+ const header = result.metadata?.name
110
+ ? `### ${result.metadata.name} (${result.metadata.chunkType})`
111
+ : '### (unnamed chunk)';
112
+ const filePath = result.chunk?.filePath ?? '';
113
+ const lines = result.chunk?.startLine !== undefined && result.chunk?.endLine !== undefined
114
+ ? ` [L${result.chunk.startLine}-${result.chunk.endLine}]`
115
+ : '';
116
+ const locationLine = filePath ? `File: ${filePath}${lines}` : '';
117
+ const parts = [header];
118
+ if (locationLine)
119
+ parts.push(locationLine);
120
+ if (result.nlSummary)
121
+ parts.push(result.nlSummary);
122
+ parts.push('```');
123
+ parts.push(result.content);
124
+ parts.push('```');
125
+ return parts.join('\n');
126
+ }
127
+ /** Format a related chunk for context output. */
128
+ function formatRelatedChunk(related) {
129
+ const label = `[${related.relationship}, distance=${related.distance}]`;
130
+ const name = related.chunk.metadata?.name ?? 'unknown';
131
+ const filePath = related.chunk.chunk?.filePath ?? '';
132
+ const parts = [`### ${name} ${label}`];
133
+ if (filePath)
134
+ parts.push(`File: ${filePath}`);
135
+ if (related.chunk.nlSummary)
136
+ parts.push(related.chunk.nlSummary);
137
+ parts.push('```');
138
+ parts.push(related.chunk.content);
139
+ parts.push('```');
140
+ return parts.join('\n');
141
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-budget.js","sourceRoot":"","sources":["../../src/retrieval/token-budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};