@angri450/zvec-grep 0.2.2

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 (418) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +319 -0
  3. package/README_CN.md +297 -0
  4. package/dist/authorization/index.d.ts +7 -0
  5. package/dist/authorization/index.js +7 -0
  6. package/dist/authorization/index.js.map +1 -0
  7. package/dist/authorization/manager.d.ts +8 -0
  8. package/dist/authorization/manager.js +19 -0
  9. package/dist/authorization/manager.js.map +1 -0
  10. package/dist/authorization/operation.d.ts +7 -0
  11. package/dist/authorization/operation.js +50 -0
  12. package/dist/authorization/operation.js.map +1 -0
  13. package/dist/authorization/planner.d.ts +21 -0
  14. package/dist/authorization/planner.js +97 -0
  15. package/dist/authorization/planner.js.map +1 -0
  16. package/dist/authorization/prompt.d.ts +12 -0
  17. package/dist/authorization/prompt.js +63 -0
  18. package/dist/authorization/prompt.js.map +1 -0
  19. package/dist/authorization/store.d.ts +20 -0
  20. package/dist/authorization/store.js +251 -0
  21. package/dist/authorization/store.js.map +1 -0
  22. package/dist/authorization/target.d.ts +15 -0
  23. package/dist/authorization/target.js +49 -0
  24. package/dist/authorization/target.js.map +1 -0
  25. package/dist/authorization/types.d.ts +61 -0
  26. package/dist/authorization/types.js +2 -0
  27. package/dist/authorization/types.js.map +1 -0
  28. package/dist/cli/args.d.ts +6 -0
  29. package/dist/cli/args.js +1255 -0
  30. package/dist/cli/args.js.map +1 -0
  31. package/dist/cli/auth.d.ts +21 -0
  32. package/dist/cli/auth.js +209 -0
  33. package/dist/cli/auth.js.map +1 -0
  34. package/dist/cli/commands.d.ts +4 -0
  35. package/dist/cli/commands.js +801 -0
  36. package/dist/cli/commands.js.map +1 -0
  37. package/dist/cli/errors.d.ts +9 -0
  38. package/dist/cli/errors.js +131 -0
  39. package/dist/cli/errors.js.map +1 -0
  40. package/dist/cli/format/context.d.ts +9 -0
  41. package/dist/cli/format/context.js +786 -0
  42. package/dist/cli/format/context.js.map +1 -0
  43. package/dist/cli/format/debug.d.ts +4 -0
  44. package/dist/cli/format/debug.js +60 -0
  45. package/dist/cli/format/debug.js.map +1 -0
  46. package/dist/cli/format/highlight.d.ts +3 -0
  47. package/dist/cli/format/highlight.js +106 -0
  48. package/dist/cli/format/highlight.js.map +1 -0
  49. package/dist/cli/format/progress.d.ts +13 -0
  50. package/dist/cli/format/progress.js +290 -0
  51. package/dist/cli/format/progress.js.map +1 -0
  52. package/dist/cli/format/range.d.ts +3 -0
  53. package/dist/cli/format/range.js +24 -0
  54. package/dist/cli/format/range.js.map +1 -0
  55. package/dist/cli/format/status.d.ts +83 -0
  56. package/dist/cli/format/status.js +530 -0
  57. package/dist/cli/format/status.js.map +1 -0
  58. package/dist/cli/help.d.ts +1 -0
  59. package/dist/cli/help.js +546 -0
  60. package/dist/cli/help.js.map +1 -0
  61. package/dist/cli/index.d.ts +2 -0
  62. package/dist/cli/index.js +40 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/install.d.ts +4 -0
  65. package/dist/cli/install.js +1735 -0
  66. package/dist/cli/install.js.map +1 -0
  67. package/dist/cli/managed-rg.d.ts +10 -0
  68. package/dist/cli/managed-rg.js +337 -0
  69. package/dist/cli/managed-rg.js.map +1 -0
  70. package/dist/cli/server-search.d.ts +3 -0
  71. package/dist/cli/server-search.js +12 -0
  72. package/dist/cli/server-search.js.map +1 -0
  73. package/dist/cli/types.d.ts +87 -0
  74. package/dist/cli/types.js +10 -0
  75. package/dist/cli/types.js.map +1 -0
  76. package/dist/cli/version.d.ts +1 -0
  77. package/dist/cli/version.js +13 -0
  78. package/dist/cli/version.js.map +1 -0
  79. package/dist/client/daemon-client.d.ts +31 -0
  80. package/dist/client/daemon-client.js +203 -0
  81. package/dist/client/daemon-client.js.map +1 -0
  82. package/dist/client/mode-router.d.ts +9 -0
  83. package/dist/client/mode-router.js +28 -0
  84. package/dist/client/mode-router.js.map +1 -0
  85. package/dist/client/search-policy.d.ts +11 -0
  86. package/dist/client/search-policy.js +15 -0
  87. package/dist/client/search-policy.js.map +1 -0
  88. package/dist/daemon/backend.d.ts +78 -0
  89. package/dist/daemon/backend.js +1118 -0
  90. package/dist/daemon/backend.js.map +1 -0
  91. package/dist/daemon/change-set.d.ts +30 -0
  92. package/dist/daemon/change-set.js +163 -0
  93. package/dist/daemon/change-set.js.map +1 -0
  94. package/dist/daemon/config.d.ts +27 -0
  95. package/dist/daemon/config.js +107 -0
  96. package/dist/daemon/config.js.map +1 -0
  97. package/dist/daemon/errors.d.ts +5 -0
  98. package/dist/daemon/errors.js +11 -0
  99. package/dist/daemon/errors.js.map +1 -0
  100. package/dist/daemon/http-server.d.ts +30 -0
  101. package/dist/daemon/http-server.js +307 -0
  102. package/dist/daemon/http-server.js.map +1 -0
  103. package/dist/daemon/index-coordinator.d.ts +22 -0
  104. package/dist/daemon/index-coordinator.js +55 -0
  105. package/dist/daemon/index-coordinator.js.map +1 -0
  106. package/dist/daemon/job-scheduler.d.ts +85 -0
  107. package/dist/daemon/job-scheduler.js +492 -0
  108. package/dist/daemon/job-scheduler.js.map +1 -0
  109. package/dist/daemon/logger.d.ts +10 -0
  110. package/dist/daemon/logger.js +101 -0
  111. package/dist/daemon/logger.js.map +1 -0
  112. package/dist/daemon/model-pool.d.ts +48 -0
  113. package/dist/daemon/model-pool.js +190 -0
  114. package/dist/daemon/model-pool.js.map +1 -0
  115. package/dist/daemon/root-lease.d.ts +14 -0
  116. package/dist/daemon/root-lease.js +197 -0
  117. package/dist/daemon/root-lease.js.map +1 -0
  118. package/dist/daemon/root-runtime.d.ts +80 -0
  119. package/dist/daemon/root-runtime.js +340 -0
  120. package/dist/daemon/root-runtime.js.map +1 -0
  121. package/dist/daemon/runtime-manager.d.ts +47 -0
  122. package/dist/daemon/runtime-manager.js +252 -0
  123. package/dist/daemon/runtime-manager.js.map +1 -0
  124. package/dist/daemon/runtime.d.ts +12 -0
  125. package/dist/daemon/runtime.js +105 -0
  126. package/dist/daemon/runtime.js.map +1 -0
  127. package/dist/daemon/server-controller.d.ts +38 -0
  128. package/dist/daemon/server-controller.js +327 -0
  129. package/dist/daemon/server-controller.js.map +1 -0
  130. package/dist/daemon/watch-manager.d.ts +62 -0
  131. package/dist/daemon/watch-manager.js +415 -0
  132. package/dist/daemon/watch-manager.js.map +1 -0
  133. package/dist/daemon/workspace-read-session-cache.d.ts +31 -0
  134. package/dist/daemon/workspace-read-session-cache.js +115 -0
  135. package/dist/daemon/workspace-read-session-cache.js.map +1 -0
  136. package/dist/engine/code-formats.d.ts +3 -0
  137. package/dist/engine/code-formats.js +14 -0
  138. package/dist/engine/code-formats.js.map +1 -0
  139. package/dist/engine/config.d.ts +57 -0
  140. package/dist/engine/config.js +351 -0
  141. package/dist/engine/config.js.map +1 -0
  142. package/dist/engine/errors.d.ts +20 -0
  143. package/dist/engine/errors.js +51 -0
  144. package/dist/engine/errors.js.map +1 -0
  145. package/dist/engine/extraction/code/adapter.d.ts +19 -0
  146. package/dist/engine/extraction/code/adapter.js +24 -0
  147. package/dist/engine/extraction/code/adapter.js.map +1 -0
  148. package/dist/engine/extraction/code/extractor.d.ts +13 -0
  149. package/dist/engine/extraction/code/extractor.js +696 -0
  150. package/dist/engine/extraction/code/extractor.js.map +1 -0
  151. package/dist/engine/extraction/code/families/c-family.d.ts +2 -0
  152. package/dist/engine/extraction/code/families/c-family.js +122 -0
  153. package/dist/engine/extraction/code/families/c-family.js.map +1 -0
  154. package/dist/engine/extraction/code/families/js-ts.d.ts +12 -0
  155. package/dist/engine/extraction/code/families/js-ts.js +118 -0
  156. package/dist/engine/extraction/code/families/js-ts.js.map +1 -0
  157. package/dist/engine/extraction/code/families/metadata.d.ts +8 -0
  158. package/dist/engine/extraction/code/families/metadata.js +86 -0
  159. package/dist/engine/extraction/code/families/metadata.js.map +1 -0
  160. package/dist/engine/extraction/code/families/name-field.d.ts +3 -0
  161. package/dist/engine/extraction/code/families/name-field.js +22 -0
  162. package/dist/engine/extraction/code/families/name-field.js.map +1 -0
  163. package/dist/engine/extraction/code/languages/c.d.ts +1 -0
  164. package/dist/engine/extraction/code/languages/c.js +12 -0
  165. package/dist/engine/extraction/code/languages/c.js.map +1 -0
  166. package/dist/engine/extraction/code/languages/cpp.d.ts +1 -0
  167. package/dist/engine/extraction/code/languages/cpp.js +18 -0
  168. package/dist/engine/extraction/code/languages/cpp.js.map +1 -0
  169. package/dist/engine/extraction/code/languages/go.d.ts +2 -0
  170. package/dist/engine/extraction/code/languages/go.js +70 -0
  171. package/dist/engine/extraction/code/languages/go.js.map +1 -0
  172. package/dist/engine/extraction/code/languages/java.d.ts +1 -0
  173. package/dist/engine/extraction/code/languages/java.js +17 -0
  174. package/dist/engine/extraction/code/languages/java.js.map +1 -0
  175. package/dist/engine/extraction/code/languages/javascript.d.ts +2 -0
  176. package/dist/engine/extraction/code/languages/javascript.js +23 -0
  177. package/dist/engine/extraction/code/languages/javascript.js.map +1 -0
  178. package/dist/engine/extraction/code/languages/python.d.ts +2 -0
  179. package/dist/engine/extraction/code/languages/python.js +52 -0
  180. package/dist/engine/extraction/code/languages/python.js.map +1 -0
  181. package/dist/engine/extraction/code/languages/rust.d.ts +2 -0
  182. package/dist/engine/extraction/code/languages/rust.js +25 -0
  183. package/dist/engine/extraction/code/languages/rust.js.map +1 -0
  184. package/dist/engine/extraction/code/languages/typescript.d.ts +2 -0
  185. package/dist/engine/extraction/code/languages/typescript.js +37 -0
  186. package/dist/engine/extraction/code/languages/typescript.js.map +1 -0
  187. package/dist/engine/extraction/code/tree-sitter/grammar.d.ts +4 -0
  188. package/dist/engine/extraction/code/tree-sitter/grammar.js +49 -0
  189. package/dist/engine/extraction/code/tree-sitter/grammar.js.map +1 -0
  190. package/dist/engine/extraction/code/tree-sitter/nodes.d.ts +3 -0
  191. package/dist/engine/extraction/code/tree-sitter/nodes.js +27 -0
  192. package/dist/engine/extraction/code/tree-sitter/nodes.js.map +1 -0
  193. package/dist/engine/extraction/code/tree-sitter/parser.d.ts +2 -0
  194. package/dist/engine/extraction/code/tree-sitter/parser.js +31 -0
  195. package/dist/engine/extraction/code/tree-sitter/parser.js.map +1 -0
  196. package/dist/engine/extraction/ids.d.ts +1 -0
  197. package/dist/engine/extraction/ids.js +5 -0
  198. package/dist/engine/extraction/ids.js.map +1 -0
  199. package/dist/engine/extraction/image/extractor.d.ts +5 -0
  200. package/dist/engine/extraction/image/extractor.js +35 -0
  201. package/dist/engine/extraction/image/extractor.js.map +1 -0
  202. package/dist/engine/extraction/index.d.ts +4 -0
  203. package/dist/engine/extraction/index.js +3 -0
  204. package/dist/engine/extraction/index.js.map +1 -0
  205. package/dist/engine/extraction/markdown/extractor.d.ts +7 -0
  206. package/dist/engine/extraction/markdown/extractor.js +362 -0
  207. package/dist/engine/extraction/markdown/extractor.js.map +1 -0
  208. package/dist/engine/extraction/runtime.d.ts +9 -0
  209. package/dist/engine/extraction/runtime.js +37 -0
  210. package/dist/engine/extraction/runtime.js.map +1 -0
  211. package/dist/engine/extraction/source.d.ts +18 -0
  212. package/dist/engine/extraction/source.js +22 -0
  213. package/dist/engine/extraction/source.js.map +1 -0
  214. package/dist/engine/extraction/text/extractor.d.ts +7 -0
  215. package/dist/engine/extraction/text/extractor.js +168 -0
  216. package/dist/engine/extraction/text/extractor.js.map +1 -0
  217. package/dist/engine/extraction/types.d.ts +4 -0
  218. package/dist/engine/extraction/types.js +2 -0
  219. package/dist/engine/extraction/types.js.map +1 -0
  220. package/dist/engine/extraction/vector-content.d.ts +5 -0
  221. package/dist/engine/extraction/vector-content.js +83 -0
  222. package/dist/engine/extraction/vector-content.js.map +1 -0
  223. package/dist/engine/file-size-policy.d.ts +6 -0
  224. package/dist/engine/file-size-policy.js +20 -0
  225. package/dist/engine/file-size-policy.js.map +1 -0
  226. package/dist/engine/file-type.d.ts +15 -0
  227. package/dist/engine/file-type.js +152 -0
  228. package/dist/engine/file-type.js.map +1 -0
  229. package/dist/engine/index-status.d.ts +9 -0
  230. package/dist/engine/index-status.js +38 -0
  231. package/dist/engine/index-status.js.map +1 -0
  232. package/dist/engine/manifest.d.ts +13 -0
  233. package/dist/engine/manifest.js +124 -0
  234. package/dist/engine/manifest.js.map +1 -0
  235. package/dist/engine/models/artifact-cache-lock.d.ts +16 -0
  236. package/dist/engine/models/artifact-cache-lock.js +228 -0
  237. package/dist/engine/models/artifact-cache-lock.js.map +1 -0
  238. package/dist/engine/models/artifact-downloader.d.ts +77 -0
  239. package/dist/engine/models/artifact-downloader.js +766 -0
  240. package/dist/engine/models/artifact-downloader.js.map +1 -0
  241. package/dist/engine/models/backends/llama-cpp.d.ts +100 -0
  242. package/dist/engine/models/backends/llama-cpp.js +567 -0
  243. package/dist/engine/models/backends/llama-cpp.js.map +1 -0
  244. package/dist/engine/models/backends/model2vec-runtime.d.ts +63 -0
  245. package/dist/engine/models/backends/model2vec-runtime.js +112 -0
  246. package/dist/engine/models/backends/model2vec-runtime.js.map +1 -0
  247. package/dist/engine/models/backends/model2vec-tokenizer.d.ts +2 -0
  248. package/dist/engine/models/backends/model2vec-tokenizer.js +42 -0
  249. package/dist/engine/models/backends/model2vec-tokenizer.js.map +1 -0
  250. package/dist/engine/models/backends/model2vec-worker-pool.d.ts +25 -0
  251. package/dist/engine/models/backends/model2vec-worker-pool.js +264 -0
  252. package/dist/engine/models/backends/model2vec-worker-pool.js.map +1 -0
  253. package/dist/engine/models/backends/model2vec-worker.d.ts +1 -0
  254. package/dist/engine/models/backends/model2vec-worker.js +41 -0
  255. package/dist/engine/models/backends/model2vec-worker.js.map +1 -0
  256. package/dist/engine/models/backends/model2vec.d.ts +38 -0
  257. package/dist/engine/models/backends/model2vec.js +344 -0
  258. package/dist/engine/models/backends/model2vec.js.map +1 -0
  259. package/dist/engine/models/backends/qwen.d.ts +44 -0
  260. package/dist/engine/models/backends/qwen.js +411 -0
  261. package/dist/engine/models/backends/qwen.js.map +1 -0
  262. package/dist/engine/models/backends/transformers-js.d.ts +90 -0
  263. package/dist/engine/models/backends/transformers-js.js +411 -0
  264. package/dist/engine/models/backends/transformers-js.js.map +1 -0
  265. package/dist/engine/models/catalog.d.ts +490 -0
  266. package/dist/engine/models/catalog.js +522 -0
  267. package/dist/engine/models/catalog.js.map +1 -0
  268. package/dist/engine/models/download-progress.d.ts +16 -0
  269. package/dist/engine/models/download-progress.js +47 -0
  270. package/dist/engine/models/download-progress.js.map +1 -0
  271. package/dist/engine/models/embeddings.d.ts +73 -0
  272. package/dist/engine/models/embeddings.js +125 -0
  273. package/dist/engine/models/embeddings.js.map +1 -0
  274. package/dist/engine/models/factory.d.ts +2 -0
  275. package/dist/engine/models/factory.js +51 -0
  276. package/dist/engine/models/factory.js.map +1 -0
  277. package/dist/engine/models/index.d.ts +5 -0
  278. package/dist/engine/models/index.js +6 -0
  279. package/dist/engine/models/index.js.map +1 -0
  280. package/dist/engine/models/local-embedding-parallelism.d.ts +15 -0
  281. package/dist/engine/models/local-embedding-parallelism.js +63 -0
  282. package/dist/engine/models/local-embedding-parallelism.js.map +1 -0
  283. package/dist/engine/models/local-embedding-queue.d.ts +12 -0
  284. package/dist/engine/models/local-embedding-queue.js +65 -0
  285. package/dist/engine/models/local-embedding-queue.js.map +1 -0
  286. package/dist/engine/models/ranking.d.ts +19 -0
  287. package/dist/engine/models/ranking.js +2 -0
  288. package/dist/engine/models/ranking.js.map +1 -0
  289. package/dist/engine/models/resolution.d.ts +8 -0
  290. package/dist/engine/models/resolution.js +22 -0
  291. package/dist/engine/models/resolution.js.map +1 -0
  292. package/dist/engine/pipeline/indexing/index.d.ts +14 -0
  293. package/dist/engine/pipeline/indexing/index.js +1219 -0
  294. package/dist/engine/pipeline/indexing/index.js.map +1 -0
  295. package/dist/engine/pipeline/indexing/input-budget.d.ts +2 -0
  296. package/dist/engine/pipeline/indexing/input-budget.js +51 -0
  297. package/dist/engine/pipeline/indexing/input-budget.js.map +1 -0
  298. package/dist/engine/pipeline/indexing/root-paths.d.ts +7 -0
  299. package/dist/engine/pipeline/indexing/root-paths.js +148 -0
  300. package/dist/engine/pipeline/indexing/root-paths.js.map +1 -0
  301. package/dist/engine/pipeline/indexing/scanner/index.d.ts +14 -0
  302. package/dist/engine/pipeline/indexing/scanner/index.js +776 -0
  303. package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -0
  304. package/dist/engine/pipeline/search/index.d.ts +12 -0
  305. package/dist/engine/pipeline/search/index.js +811 -0
  306. package/dist/engine/pipeline/search/index.js.map +1 -0
  307. package/dist/engine/service/index.d.ts +3 -0
  308. package/dist/engine/service/index.js +2 -0
  309. package/dist/engine/service/index.js.map +1 -0
  310. package/dist/engine/service/lexical.d.ts +28 -0
  311. package/dist/engine/service/lexical.js +446 -0
  312. package/dist/engine/service/lexical.js.map +1 -0
  313. package/dist/engine/service/root.d.ts +15 -0
  314. package/dist/engine/service/root.js +57 -0
  315. package/dist/engine/service/root.js.map +1 -0
  316. package/dist/engine/service/structure-enrichment.d.ts +8 -0
  317. package/dist/engine/service/structure-enrichment.js +178 -0
  318. package/dist/engine/service/structure-enrichment.js.map +1 -0
  319. package/dist/engine/service/types.d.ts +212 -0
  320. package/dist/engine/service/types.js +2 -0
  321. package/dist/engine/service/types.js.map +1 -0
  322. package/dist/engine/service/workspace-index.d.ts +26 -0
  323. package/dist/engine/service/workspace-index.js +157 -0
  324. package/dist/engine/service/workspace-index.js.map +1 -0
  325. package/dist/engine/service/zvec-grep.d.ts +15 -0
  326. package/dist/engine/service/zvec-grep.js +1520 -0
  327. package/dist/engine/service/zvec-grep.js.map +1 -0
  328. package/dist/engine/storage/index.d.ts +53 -0
  329. package/dist/engine/storage/index.js +3 -0
  330. package/dist/engine/storage/index.js.map +1 -0
  331. package/dist/engine/storage/layout.d.ts +10 -0
  332. package/dist/engine/storage/layout.js +29 -0
  333. package/dist/engine/storage/layout.js.map +1 -0
  334. package/dist/engine/storage/zvec.d.ts +4 -0
  335. package/dist/engine/storage/zvec.js +976 -0
  336. package/dist/engine/storage/zvec.js.map +1 -0
  337. package/dist/engine/types.d.ts +303 -0
  338. package/dist/engine/types.js +14 -0
  339. package/dist/engine/types.js.map +1 -0
  340. package/dist/engine/utils/atomic-file.d.ts +3 -0
  341. package/dist/engine/utils/atomic-file.js +39 -0
  342. package/dist/engine/utils/atomic-file.js.map +1 -0
  343. package/dist/engine/utils/daemon-lease.d.ts +17 -0
  344. package/dist/engine/utils/daemon-lease.js +175 -0
  345. package/dist/engine/utils/daemon-lease.js.map +1 -0
  346. package/dist/engine/utils/file-selection.d.ts +10 -0
  347. package/dist/engine/utils/file-selection.js +157 -0
  348. package/dist/engine/utils/file-selection.js.map +1 -0
  349. package/dist/engine/utils/glob.d.ts +9 -0
  350. package/dist/engine/utils/glob.js +208 -0
  351. package/dist/engine/utils/glob.js.map +1 -0
  352. package/dist/engine/utils/hash.d.ts +2 -0
  353. package/dist/engine/utils/hash.js +8 -0
  354. package/dist/engine/utils/hash.js.map +1 -0
  355. package/dist/engine/utils/json.d.ts +8 -0
  356. package/dist/engine/utils/json.js +83 -0
  357. package/dist/engine/utils/json.js.map +1 -0
  358. package/dist/engine/utils/lock.d.ts +19 -0
  359. package/dist/engine/utils/lock.js +254 -0
  360. package/dist/engine/utils/lock.js.map +1 -0
  361. package/dist/engine/utils/path.d.ts +4 -0
  362. package/dist/engine/utils/path.js +18 -0
  363. package/dist/engine/utils/path.js.map +1 -0
  364. package/dist/engine/utils/timing.d.ts +19 -0
  365. package/dist/engine/utils/timing.js +87 -0
  366. package/dist/engine/utils/timing.js.map +1 -0
  367. package/dist/index-progress.d.ts +10 -0
  368. package/dist/index-progress.js +159 -0
  369. package/dist/index-progress.js.map +1 -0
  370. package/dist/index.d.ts +6 -0
  371. package/dist/index.js +4 -0
  372. package/dist/index.js.map +1 -0
  373. package/dist/mcp/http-transport.d.ts +27 -0
  374. package/dist/mcp/http-transport.js +182 -0
  375. package/dist/mcp/http-transport.js.map +1 -0
  376. package/dist/mcp/input-normalization.d.ts +38 -0
  377. package/dist/mcp/input-normalization.js +104 -0
  378. package/dist/mcp/input-normalization.js.map +1 -0
  379. package/dist/mcp/progress-heartbeat.d.ts +17 -0
  380. package/dist/mcp/progress-heartbeat.js +46 -0
  381. package/dist/mcp/progress-heartbeat.js.map +1 -0
  382. package/dist/mcp/request-metadata.d.ts +2 -0
  383. package/dist/mcp/request-metadata.js +11 -0
  384. package/dist/mcp/request-metadata.js.map +1 -0
  385. package/dist/mcp/request-state.d.ts +40 -0
  386. package/dist/mcp/request-state.js +210 -0
  387. package/dist/mcp/request-state.js.map +1 -0
  388. package/dist/mcp/result-format.d.ts +13 -0
  389. package/dist/mcp/result-format.js +75 -0
  390. package/dist/mcp/result-format.js.map +1 -0
  391. package/dist/mcp/schemas.d.ts +668 -0
  392. package/dist/mcp/schemas.js +512 -0
  393. package/dist/mcp/schemas.js.map +1 -0
  394. package/dist/mcp/stdio-bridge.d.ts +15 -0
  395. package/dist/mcp/stdio-bridge.js +190 -0
  396. package/dist/mcp/stdio-bridge.js.map +1 -0
  397. package/dist/mcp/tools.d.ts +153 -0
  398. package/dist/mcp/tools.js +488 -0
  399. package/dist/mcp/tools.js.map +1 -0
  400. package/dist/mcp/toolset.d.ts +5 -0
  401. package/dist/mcp/toolset.js +12 -0
  402. package/dist/mcp/toolset.js.map +1 -0
  403. package/dist/observability/trace-context.d.ts +11 -0
  404. package/dist/observability/trace-context.js +138 -0
  405. package/dist/observability/trace-context.js.map +1 -0
  406. package/dist/prompts/zvec-grep-guidance.d.ts +2 -0
  407. package/dist/prompts/zvec-grep-guidance.js +9 -0
  408. package/dist/prompts/zvec-grep-guidance.js.map +1 -0
  409. package/docs/01-agents.md +217 -0
  410. package/docs/02-cli.md +259 -0
  411. package/docs/03-mcp.md +185 -0
  412. package/docs/04-pipeline.md +234 -0
  413. package/docs/05-architecture.md +86 -0
  414. package/docs/06-server.md +279 -0
  415. package/docs/07-embedding.md +227 -0
  416. package/docs/08-roadmap.md +85 -0
  417. package/docs/README.md +53 -0
  418. package/package.json +87 -0
@@ -0,0 +1,811 @@
1
+ import { workspaceIndexDetail, detail, EngineError, errorDetails, } from "../../errors.js";
2
+ import { TimingCollector } from "../../utils/timing.js";
3
+ import { hasPathGlob, isAbsolutePathPattern, normalizePathForMatch, normalizePathPattern, pathPatternMatches, } from "../../utils/glob.js";
4
+ import { matchesFileSelection, resolveFileTypePatterns, } from "../../utils/file-selection.js";
5
+ const DEFAULT_LIMIT = 7;
6
+ const RRF_K = 60;
7
+ const RECALL_INITIAL_DEPTH = 200;
8
+ const RECALL_MAX_DEPTH = 2000;
9
+ const RECALL_GROWTH_FACTOR = 2;
10
+ const RECALL_TARGET_FACTOR = 5;
11
+ const RECALL_MIN_TARGET_CANDIDATES = 50;
12
+ export async function searchWorkspaceIndex(plan, ctx) {
13
+ const timings = new TimingCollector();
14
+ const result = await timings.time("search_total", async () => {
15
+ const normalized = timings.timeSync("search_plan", () => validateSearchPlan(plan));
16
+ const limit = normalized.limit ?? DEFAULT_LIMIT;
17
+ const trace = normalized.trace === true || normalized.trackEntityId !== undefined;
18
+ const fileTypePatterns = await timings.time("search_file_types", () => resolveFileTypePatterns(normalized.fileTypes, normalized.excludedFileTypes));
19
+ const filter = timings.timeSync("search_filter", () => searchPlanToStorageFilter(normalized, ctx.storage, fileTypePatterns));
20
+ const hasSearchableFiles = !filterMatchesNoFiles(filter);
21
+ const candidates = new Map();
22
+ const vectorByRoute = hasSearchableFiles && planUsesVector(normalized)
23
+ ? await timings.time("query_embedding", () => embedVectorRoutes(normalized.routes, requireEmbeddingModel(ctx, "searchPlan")))
24
+ : new Map();
25
+ let recallDepth = RECALL_INITIAL_DEPTH;
26
+ if (hasSearchableFiles) {
27
+ recallDepth = timings.timeSync("recall", () => collectAdaptiveRecall({
28
+ routes: normalized.routes,
29
+ filter,
30
+ preferSymbol: normalized.preferSymbol === true,
31
+ vectorByRoute,
32
+ limit,
33
+ storage: ctx.storage,
34
+ candidates,
35
+ }));
36
+ }
37
+ if (normalized.trackEntityId) {
38
+ timings.timeSync("force_track", () => forceTrackEntity({
39
+ entityId: normalized.trackEntityId,
40
+ routes: normalized.routes,
41
+ vectorByRoute,
42
+ recallDepth,
43
+ filter,
44
+ storage: ctx.storage,
45
+ candidates,
46
+ }));
47
+ }
48
+ const fused = timings.timeSync("fusion", () => fuseCandidates(candidates));
49
+ const visible = fused.slice(0, limit);
50
+ const tracked = normalized.trackEntityId
51
+ ? fused.find((candidate) => candidate.id === normalized.trackEntityId)
52
+ : undefined;
53
+ if (tracked && !visible.some((candidate) => candidate.id === tracked.id)) {
54
+ visible.push(tracked);
55
+ }
56
+ const hits = timings.timeSync("materialize", () => visible.map((candidate) => candidateToHit(candidate, limit, trace)));
57
+ const trackedHit = normalized.trackEntityId
58
+ ? hits.find((hit) => hit.entity.id === normalized.trackEntityId)
59
+ : undefined;
60
+ return {
61
+ plan: normalized,
62
+ hits,
63
+ trackedHit,
64
+ };
65
+ });
66
+ return {
67
+ ...result,
68
+ timings: timings.entries(),
69
+ };
70
+ }
71
+ export async function diagnoseEntitySearch(query, entityId, ctx) {
72
+ const stored = ctx.storage.getEntity(entityId);
73
+ if (!stored) {
74
+ throw new Error(`Entity not found: ${entityId}`);
75
+ }
76
+ const search = await searchWorkspaceIndex({
77
+ routes: [
78
+ { mode: "fts", query },
79
+ { mode: "vector", query },
80
+ ],
81
+ trace: true,
82
+ trackEntityId: entityId,
83
+ }, ctx);
84
+ return {
85
+ query,
86
+ entityId,
87
+ file: stored.file,
88
+ entity: stored.entity,
89
+ search,
90
+ };
91
+ }
92
+ export async function diagnoseFileSearch(query, absolutePath, ctx) {
93
+ const file = ctx.storage.getFileByPath(absolutePath);
94
+ if (!file) {
95
+ return null;
96
+ }
97
+ const entityId = await chooseBestEntityInFile(query, file, ctx);
98
+ if (!entityId) {
99
+ return null;
100
+ }
101
+ return diagnoseEntitySearch(query, entityId, ctx);
102
+ }
103
+ function validateSearchPlan(plan) {
104
+ if (!Array.isArray(plan.routes) || plan.routes.length === 0) {
105
+ throw new EngineError("Search plan requires at least one route", {
106
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.EMPTY_ROUTES",
107
+ });
108
+ }
109
+ const routeIds = new Set();
110
+ const routeCounts = new Map();
111
+ const routes = plan.routes.map((route, index) => {
112
+ const query = typeof route.query === "string" ? route.query.trim() : "";
113
+ if (route.mode !== "fts" && route.mode !== "vector") {
114
+ throw new EngineError("Search plan route has an unsupported mode", {
115
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.UNSUPPORTED_ROUTE_MODE",
116
+ context: `routeIndex=${index} mode=${String(route.mode)}`,
117
+ });
118
+ }
119
+ const id = makeDefaultRouteId(route.mode, routeCounts, routeIds);
120
+ if (query.length === 0) {
121
+ throw new EngineError("Search plan route requires a non-empty query", {
122
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.EMPTY_ROUTE_QUERY",
123
+ context: `routeId=${id}`,
124
+ });
125
+ }
126
+ routeIds.add(id);
127
+ return {
128
+ id,
129
+ mode: route.mode,
130
+ query,
131
+ };
132
+ });
133
+ const modifiedAfter = normalizeModifiedTime(plan.modifiedAfter, "modifiedAfter");
134
+ const modifiedBefore = normalizeModifiedTime(plan.modifiedBefore, "modifiedBefore");
135
+ if (modifiedAfter !== undefined &&
136
+ modifiedBefore !== undefined &&
137
+ modifiedAfter > modifiedBefore) {
138
+ throw new EngineError("Search plan modified-after filter must not be later than modified-before", {
139
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.INVALID_MODIFIED_TIME_RANGE",
140
+ context: `modifiedAfter=${modifiedAfter} modifiedBefore=${modifiedBefore}`,
141
+ });
142
+ }
143
+ return {
144
+ ...plan,
145
+ routes,
146
+ includePaths: normalizePathFilters(plan.includePaths, "includePaths"),
147
+ excludePaths: normalizePathFilters(plan.excludePaths, "excludePaths"),
148
+ globs: normalizeStringFilters(plan.globs, "globs"),
149
+ insensitiveGlobs: normalizeStringFilters(plan.insensitiveGlobs, "insensitiveGlobs"),
150
+ fileTypes: normalizeStringFilters(plan.fileTypes, "fileTypes"),
151
+ excludedFileTypes: normalizeStringFilters(plan.excludedFileTypes, "excludedFileTypes"),
152
+ modifiedAfter,
153
+ modifiedBefore,
154
+ };
155
+ }
156
+ function makeDefaultRouteId(mode, routeCounts, usedRouteIds) {
157
+ let count = routeCounts.get(mode) ?? 0;
158
+ while (true) {
159
+ count++;
160
+ const id = count === 1 ? mode : `${mode}-${count}`;
161
+ if (!usedRouteIds.has(id)) {
162
+ routeCounts.set(mode, count);
163
+ return id;
164
+ }
165
+ }
166
+ }
167
+ function planUsesVector(plan) {
168
+ return plan.routes.some((route) => route.mode === "vector");
169
+ }
170
+ function requireEmbeddingModel(ctx, operation) {
171
+ if (!ctx.embeddingModel) {
172
+ throw new EngineError("Search operation requires an embedding model", {
173
+ code: "ZVEC_GREP.ENGINE.SEARCH.EMBEDDING_MODEL_REQUIRED",
174
+ context: errorDetails([
175
+ workspaceIndexDetail(ctx.workspaceIndex.name),
176
+ detail("operation", operation),
177
+ ]),
178
+ });
179
+ }
180
+ return ctx.embeddingModel;
181
+ }
182
+ function normalizePathFilters(value, field) {
183
+ if (value === undefined) {
184
+ return undefined;
185
+ }
186
+ if (!Array.isArray(value)) {
187
+ throw new EngineError("Search plan path filters must be arrays", {
188
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.INVALID_PATH_FILTERS",
189
+ context: `field=${field}`,
190
+ });
191
+ }
192
+ const patterns = [];
193
+ for (const [index, item] of value.entries()) {
194
+ if (typeof item !== "string") {
195
+ throw new EngineError("Search plan path filters must contain strings", {
196
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.INVALID_PATH_FILTER",
197
+ context: `field=${field} index=${index}`,
198
+ });
199
+ }
200
+ const pattern = normalizePathFilterPattern(item);
201
+ if (pattern.length > 0) {
202
+ patterns.push(pattern);
203
+ }
204
+ }
205
+ return patterns.length > 0 ? patterns : undefined;
206
+ }
207
+ function normalizeStringFilters(value, field) {
208
+ if (value === undefined) {
209
+ return undefined;
210
+ }
211
+ if (!Array.isArray(value)) {
212
+ throw new EngineError("Search plan filters must be arrays", {
213
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.INVALID_FILTERS",
214
+ context: `field=${field}`,
215
+ });
216
+ }
217
+ const values = value.map((item, index) => {
218
+ if (typeof item !== "string" || !item.trim()) {
219
+ throw new EngineError("Search plan filters must contain strings", {
220
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.INVALID_FILTER",
221
+ context: `field=${field} index=${index}`,
222
+ });
223
+ }
224
+ return item.trim();
225
+ });
226
+ return values.length > 0 ? values : undefined;
227
+ }
228
+ function normalizeModifiedTime(value, field) {
229
+ if (value === undefined) {
230
+ return undefined;
231
+ }
232
+ if (!Number.isFinite(value) || value < 0) {
233
+ throw new EngineError("Search plan modified time filters must be non-negative epoch milliseconds", {
234
+ code: "ZVEC_GREP.ENGINE.SEARCH_PLAN.INVALID_MODIFIED_TIME_FILTER",
235
+ context: `field=${field} value=${String(value)}`,
236
+ });
237
+ }
238
+ return value;
239
+ }
240
+ async function embedVectorRoutes(routes, model) {
241
+ const vectorRoutes = routes.filter((route) => route.mode === "vector");
242
+ const vectorsByRoute = new Map();
243
+ for (let start = 0; start < vectorRoutes.length; start += model.info.limits.maxBatchSize) {
244
+ const batch = vectorRoutes.slice(start, start + model.info.limits.maxBatchSize);
245
+ const { vectors } = await model.embed(batch.map((route) => ({
246
+ kind: "text",
247
+ text: route.query,
248
+ })), { purpose: "query" });
249
+ for (const [index, route] of batch.entries()) {
250
+ vectorsByRoute.set(route.id, vectors[index]);
251
+ }
252
+ }
253
+ return vectorsByRoute;
254
+ }
255
+ function addRecallHits(candidates, hits, route, storage, options = {}) {
256
+ const startIndex = Math.max(0, options.startIndex ?? 0);
257
+ for (let index = startIndex; index < hits.length; index++) {
258
+ const hit = hits[index];
259
+ if (!hit) {
260
+ continue;
261
+ }
262
+ const rank = index + 1;
263
+ const entityId = publicEntityId(hit.fragment);
264
+ const resolved = candidates.get(entityId) ?? resolveHitEntity(hit, storage);
265
+ if (!resolved) {
266
+ continue;
267
+ }
268
+ const candidate = candidates.get(entityId) ?? {
269
+ id: entityId,
270
+ entity: resolved.entity,
271
+ file: resolved.file,
272
+ sources: new Set(),
273
+ recall: [],
274
+ evidence: [],
275
+ score: 0,
276
+ rank: Number.POSITIVE_INFINITY,
277
+ forced: false,
278
+ };
279
+ candidate.sources.add(route.mode);
280
+ candidate.evidence.push({
281
+ fragment: hit.fragment,
282
+ path: route.mode,
283
+ routeId: route.id,
284
+ query: route.query,
285
+ rank,
286
+ score: hit.score,
287
+ });
288
+ addOrUpdateRecall(candidate, {
289
+ path: route.mode,
290
+ routeId: route.id,
291
+ query: route.query,
292
+ found: true,
293
+ rank,
294
+ score: hit.score,
295
+ });
296
+ candidates.set(candidate.id, candidate);
297
+ }
298
+ }
299
+ function collectAdaptiveRecall(input) {
300
+ const routes = buildRecallRoutes(input.routes, input.filter, input.preferSymbol);
301
+ const targetCandidates = recallTargetCandidateCount(input.limit);
302
+ let previousDepth = 0;
303
+ let depth = RECALL_INITIAL_DEPTH;
304
+ while (true) {
305
+ const saturated = collectRecallPass({
306
+ routes,
307
+ vectorByRoute: input.vectorByRoute,
308
+ depth,
309
+ previousDepth,
310
+ storage: input.storage,
311
+ candidates: input.candidates,
312
+ });
313
+ if (input.candidates.size >= targetCandidates ||
314
+ !saturated ||
315
+ depth >= RECALL_MAX_DEPTH) {
316
+ return depth;
317
+ }
318
+ previousDepth = depth;
319
+ depth = Math.min(depth * RECALL_GROWTH_FACTOR, RECALL_MAX_DEPTH);
320
+ }
321
+ }
322
+ function buildRecallRoutes(routes, filter, preferSymbol) {
323
+ const output = routes.map((route) => ({
324
+ ...route,
325
+ filter,
326
+ vectorRouteId: route.mode === "vector" ? route.id : undefined,
327
+ }));
328
+ if (!preferSymbol) {
329
+ return output;
330
+ }
331
+ const seen = new Set();
332
+ for (const route of routes) {
333
+ const symbolNames = extractSymbolNames(route.query);
334
+ if (symbolNames.length === 0) {
335
+ continue;
336
+ }
337
+ const key = `${route.id}\0${symbolNames.join("\0")}`;
338
+ if (seen.has(key)) {
339
+ continue;
340
+ }
341
+ seen.add(key);
342
+ output.push({
343
+ id: `${route.id}.prefer-symbol`,
344
+ mode: "fts",
345
+ query: route.query,
346
+ filter: {
347
+ ...filter,
348
+ symbolNames,
349
+ },
350
+ });
351
+ }
352
+ return output;
353
+ }
354
+ function collectRecallPass(input) {
355
+ let saturated = false;
356
+ for (const route of input.routes) {
357
+ const hits = recallRouteHits(route, input);
358
+ saturated = saturated || hits.length >= input.depth;
359
+ addRecallHits(input.candidates, hits, route, input.storage, {
360
+ startIndex: input.previousDepth,
361
+ });
362
+ }
363
+ return saturated;
364
+ }
365
+ function recallRouteHits(route, input) {
366
+ if (route.mode === "fts") {
367
+ return input.storage.searchFts(route.query, input.depth, route.filter);
368
+ }
369
+ const vector = input.vectorByRoute.get(route.vectorRouteId ?? route.id);
370
+ return vector
371
+ ? input.storage.searchVector(vector, input.depth, route.filter)
372
+ : [];
373
+ }
374
+ function recallTargetCandidateCount(limit) {
375
+ return Math.max(limit * RECALL_TARGET_FACTOR, RECALL_MIN_TARGET_CANDIDATES);
376
+ }
377
+ function resolveHitEntity(hit, storage) {
378
+ if (!hit.fragment.group || hit.fragment.group === hit.fragment.id) {
379
+ return {
380
+ entity: fragmentToEntity(hit.fragment),
381
+ file: hit.file,
382
+ };
383
+ }
384
+ return storage.getEntity(hit.fragment.group);
385
+ }
386
+ function fragmentToEntity(fragment) {
387
+ return {
388
+ id: publicEntityId(fragment),
389
+ fileId: fragment.fileId,
390
+ range: fragment.range,
391
+ content: fragment.content,
392
+ metadata: fragment.metadata,
393
+ };
394
+ }
395
+ function publicEntityId(fragment) {
396
+ return fragment.group ?? fragment.id;
397
+ }
398
+ function addOrUpdateRecall(candidate, recall) {
399
+ const existing = candidate.recall.find((item) => item.path === recall.path && item.routeId === recall.routeId);
400
+ if (!existing) {
401
+ candidate.recall.push(recall);
402
+ return;
403
+ }
404
+ if (!recall.found) {
405
+ return;
406
+ }
407
+ if (!existing.found ||
408
+ existing.rank === undefined ||
409
+ (recall.rank !== undefined && recall.rank < existing.rank)) {
410
+ Object.assign(existing, recall, {
411
+ forced: existing.forced || recall.forced || undefined,
412
+ });
413
+ return;
414
+ }
415
+ if (recall.forced) {
416
+ existing.forced = true;
417
+ }
418
+ }
419
+ function extractSymbolNames(query) {
420
+ const keywords = new Set([
421
+ "class",
422
+ "struct",
423
+ "enum",
424
+ "interface",
425
+ "function",
426
+ "method",
427
+ "type",
428
+ "const",
429
+ "let",
430
+ "var",
431
+ "namespace",
432
+ "where",
433
+ "find",
434
+ "explain",
435
+ ]);
436
+ const names = new Set();
437
+ for (const match of query.matchAll(/[A-Za-z_~][A-Za-z0-9_:~]*/g)) {
438
+ const token = match[0];
439
+ if (keywords.has(token.toLowerCase())) {
440
+ continue;
441
+ }
442
+ const name = symbolNameFromToken(token);
443
+ if (name) {
444
+ names.add(name);
445
+ }
446
+ }
447
+ return [...names];
448
+ }
449
+ function symbolNameFromToken(token) {
450
+ const parts = token.split("::").filter((part) => part.length > 0);
451
+ const name = parts[parts.length - 1] ?? token;
452
+ if (!/^[A-Za-z_~][A-Za-z0-9_~]*$/.test(name)) {
453
+ return null;
454
+ }
455
+ if (parts.length < 2) {
456
+ return name;
457
+ }
458
+ const owner = parts[parts.length - 2] ?? "";
459
+ if (/^[A-Z_~]/.test(owner)) {
460
+ return `${owner}::${name}`;
461
+ }
462
+ return name;
463
+ }
464
+ function forceTrackEntity(input) {
465
+ const tracked = input.storage.getEntity(input.entityId);
466
+ if (!tracked) {
467
+ return;
468
+ }
469
+ const candidate = input.candidates.get(input.entityId) ?? {
470
+ id: input.entityId,
471
+ entity: tracked.entity,
472
+ file: tracked.file,
473
+ sources: new Set(),
474
+ recall: [],
475
+ evidence: [],
476
+ score: 0,
477
+ rank: Number.POSITIVE_INFINITY,
478
+ forced: true,
479
+ };
480
+ const seenRoutes = new Set(candidate.recall.map((trace) => trace.routeId));
481
+ for (const route of input.routes) {
482
+ if (seenRoutes.has(route.id)) {
483
+ continue;
484
+ }
485
+ if (filterMatchesNoFiles(input.filter)) {
486
+ forceTrackNoMatchingFilesRoute(candidate, route);
487
+ continue;
488
+ }
489
+ if (filterExcludesFile(input.filter, tracked.file.id)) {
490
+ forceTrackPathExcludedRoute(candidate, route);
491
+ continue;
492
+ }
493
+ if (route.mode === "fts") {
494
+ forceTrackFtsRoute(candidate, {
495
+ ...input,
496
+ targetFileId: tracked.file.id,
497
+ }, route);
498
+ }
499
+ else {
500
+ forceTrackVectorRoute(candidate, {
501
+ ...input,
502
+ targetFileId: tracked.file.id,
503
+ }, route);
504
+ }
505
+ }
506
+ input.candidates.set(input.entityId, candidate);
507
+ }
508
+ function filterExcludesFile(filter, fileId) {
509
+ return filter?.fileIds !== undefined && !filter.fileIds.includes(fileId);
510
+ }
511
+ function forceTrackNoMatchingFilesRoute(candidate, route) {
512
+ candidate.recall.push({
513
+ path: route.mode,
514
+ routeId: route.id,
515
+ query: route.query,
516
+ found: false,
517
+ forced: true,
518
+ reason: "No files matched the path filters",
519
+ });
520
+ }
521
+ function forceTrackPathExcludedRoute(candidate, route) {
522
+ candidate.recall.push({
523
+ path: route.mode,
524
+ routeId: route.id,
525
+ query: route.query,
526
+ found: false,
527
+ forced: true,
528
+ reason: "Target entity file was excluded by the path filters",
529
+ });
530
+ }
531
+ function forceTrackFtsRoute(candidate, input, route) {
532
+ const hit = searchTrackedEntityFts(input, route);
533
+ if (hit) {
534
+ candidate.sources.add("fts");
535
+ candidate.evidence.push({
536
+ fragment: hit.fragment,
537
+ path: "fts",
538
+ routeId: route.id,
539
+ query: route.query,
540
+ rank: input.recallDepth + 1,
541
+ score: hit.score,
542
+ forced: true,
543
+ });
544
+ addOrUpdateRecall(candidate, {
545
+ path: "fts",
546
+ routeId: route.id,
547
+ query: route.query,
548
+ found: true,
549
+ forced: true,
550
+ rank: input.recallDepth + 1,
551
+ score: hit.score,
552
+ });
553
+ return;
554
+ }
555
+ candidate.recall.push({
556
+ path: "fts",
557
+ routeId: route.id,
558
+ query: route.query,
559
+ found: false,
560
+ forced: true,
561
+ reason: "Target entity did not match the FTS query",
562
+ });
563
+ }
564
+ function forceTrackVectorRoute(candidate, input, route) {
565
+ const vector = input.vectorByRoute.get(route.id);
566
+ if (!vector) {
567
+ candidate.recall.push({
568
+ path: "vector",
569
+ routeId: route.id,
570
+ query: route.query,
571
+ found: false,
572
+ forced: true,
573
+ reason: "Vector route was not available for this query",
574
+ });
575
+ return;
576
+ }
577
+ const hit = searchTrackedEntityVector(input, vector);
578
+ if (hit) {
579
+ candidate.sources.add("vector");
580
+ candidate.evidence.push({
581
+ fragment: hit.fragment,
582
+ path: "vector",
583
+ routeId: route.id,
584
+ query: route.query,
585
+ rank: input.recallDepth + 1,
586
+ score: hit.score,
587
+ forced: true,
588
+ });
589
+ addOrUpdateRecall(candidate, {
590
+ path: "vector",
591
+ routeId: route.id,
592
+ query: route.query,
593
+ found: true,
594
+ forced: true,
595
+ rank: input.recallDepth + 1,
596
+ score: hit.score,
597
+ });
598
+ return;
599
+ }
600
+ candidate.recall.push({
601
+ path: "vector",
602
+ routeId: route.id,
603
+ query: route.query,
604
+ found: false,
605
+ forced: true,
606
+ reason: "Target entity could not be scored by vector search",
607
+ });
608
+ }
609
+ function searchTrackedEntityFts(input, route) {
610
+ const [groupHit] = input.storage.searchFts(route.query, 1, {
611
+ ...input.filter,
612
+ groupIds: [input.entityId],
613
+ });
614
+ if (groupHit) {
615
+ return groupHit;
616
+ }
617
+ return input.storage
618
+ .searchFts(route.query, input.recallDepth, restrictFilterToFile(input.filter, input.targetFileId))
619
+ .find((hit) => publicEntityId(hit.fragment) === input.entityId);
620
+ }
621
+ function searchTrackedEntityVector(input, vector) {
622
+ const [groupHit] = input.storage.searchVector(vector, 1, {
623
+ ...input.filter,
624
+ groupIds: [input.entityId],
625
+ });
626
+ if (groupHit) {
627
+ return groupHit;
628
+ }
629
+ return input.storage
630
+ .searchVector(vector, input.recallDepth, restrictFilterToFile(input.filter, input.targetFileId))
631
+ .find((hit) => publicEntityId(hit.fragment) === input.entityId);
632
+ }
633
+ function restrictFilterToFile(filter, fileId) {
634
+ return {
635
+ ...filter,
636
+ fileIds: [fileId],
637
+ };
638
+ }
639
+ function searchPlanToStorageFilter(plan, storage, fileTypePatterns) {
640
+ const fileIds = resolveFilteredFileIds(plan, storage.listFiles(), fileTypePatterns);
641
+ const symbolTypes = plan.symbolTypes && plan.symbolTypes.length > 0
642
+ ? plan.symbolTypes
643
+ : undefined;
644
+ if (fileIds === undefined && symbolTypes === undefined) {
645
+ return undefined;
646
+ }
647
+ return {
648
+ ...(fileIds !== undefined ? { fileIds } : {}),
649
+ ...(symbolTypes !== undefined ? { symbolTypes } : {}),
650
+ };
651
+ }
652
+ function filterMatchesNoFiles(filter) {
653
+ return filter?.fileIds !== undefined && filter.fileIds.length === 0;
654
+ }
655
+ function resolveFilteredFileIds(plan, files, fileTypePatterns) {
656
+ const includeMatchers = (plan.includePaths ?? []).map(compilePathFilter);
657
+ const excludeMatchers = (plan.excludePaths ?? []).map(compilePathFilter);
658
+ const hasModifiedFilter = plan.modifiedAfter !== undefined || plan.modifiedBefore !== undefined;
659
+ const hasSharedSelection = (plan.globs?.length ?? 0) > 0 ||
660
+ (plan.insensitiveGlobs?.length ?? 0) > 0 ||
661
+ fileTypePatterns.include.length > 0 ||
662
+ fileTypePatterns.exclude.length > 0;
663
+ if (includeMatchers.length === 0 &&
664
+ excludeMatchers.length === 0 &&
665
+ !hasModifiedFilter &&
666
+ !hasSharedSelection) {
667
+ return undefined;
668
+ }
669
+ return files
670
+ .filter((file) => {
671
+ const included = includeMatchers.length === 0 ||
672
+ includeMatchers.some((matcher) => matcher(file));
673
+ const excluded = excludeMatchers.some((matcher) => matcher(file));
674
+ return (included &&
675
+ !excluded &&
676
+ matchesFileSelection(file.relativePath, plan, fileTypePatterns) &&
677
+ matchesModifiedTimeFilter(file, plan));
678
+ })
679
+ .map((file) => file.id);
680
+ }
681
+ function matchesModifiedTimeFilter(file, plan) {
682
+ if (plan.modifiedAfter !== undefined &&
683
+ file.lastModifiedTime < plan.modifiedAfter) {
684
+ return false;
685
+ }
686
+ if (plan.modifiedBefore !== undefined &&
687
+ file.lastModifiedTime > plan.modifiedBefore) {
688
+ return false;
689
+ }
690
+ return true;
691
+ }
692
+ function compilePathFilter(pattern) {
693
+ const pathTarget = isAbsolutePathPattern(pattern)
694
+ ? "absolutePath"
695
+ : "relativePath";
696
+ if (hasPathGlob(pattern)) {
697
+ return (file) => pathPatternMatches(pattern, normalizePathForMatch(file[pathTarget]));
698
+ }
699
+ return (file) => {
700
+ const path = normalizePathForMatch(file[pathTarget]);
701
+ return pathPatternMatches(pattern, path);
702
+ };
703
+ }
704
+ function normalizePathFilterPattern(pattern) {
705
+ return normalizePathPattern(pattern);
706
+ }
707
+ function fuseCandidates(candidates) {
708
+ for (const candidate of candidates.values()) {
709
+ candidate.score = 0;
710
+ candidate.forced = candidate.recall.some((trace) => trace.forced);
711
+ for (const recall of candidate.recall) {
712
+ if (recall.found && recall.rank !== undefined) {
713
+ candidate.score += 1 / (RRF_K + recall.rank);
714
+ }
715
+ }
716
+ }
717
+ const fused = [...candidates.values()].sort((left, right) => {
718
+ if (right.score !== left.score) {
719
+ return right.score - left.score;
720
+ }
721
+ return left.id.localeCompare(right.id);
722
+ });
723
+ for (const [index, candidate] of fused.entries()) {
724
+ candidate.rank = index + 1;
725
+ }
726
+ return fused;
727
+ }
728
+ function candidateToHit(candidate, limit, trace) {
729
+ return {
730
+ entity: candidate.entity,
731
+ file: candidate.file,
732
+ evidence: sortEvidence(candidate.evidence).map(evidenceToSearchHitEvidence),
733
+ rank: candidate.rank,
734
+ score: candidate.score,
735
+ matchedBy: deriveMatchedBy(candidate.sources),
736
+ trace: trace ? candidateToTrace(candidate, limit) : undefined,
737
+ };
738
+ }
739
+ function evidenceToSearchHitEvidence(evidence) {
740
+ return {
741
+ range: evidence.fragment.range,
742
+ content: evidence.fragment.content,
743
+ metadata: evidence.fragment.metadata,
744
+ isEntity: evidence.fragment.id === publicEntityId(evidence.fragment),
745
+ path: evidence.path,
746
+ routeId: evidence.routeId,
747
+ query: evidence.query,
748
+ rank: evidence.rank,
749
+ score: evidence.score,
750
+ forced: evidence.forced,
751
+ };
752
+ }
753
+ function sortEvidence(evidence) {
754
+ return [...evidence].sort((left, right) => {
755
+ const leftRank = left.rank ?? Number.POSITIVE_INFINITY;
756
+ const rightRank = right.rank ?? Number.POSITIVE_INFINITY;
757
+ if (leftRank !== rightRank) {
758
+ return leftRank - rightRank;
759
+ }
760
+ if (left.path !== right.path) {
761
+ return left.path.localeCompare(right.path);
762
+ }
763
+ return left.fragment.id.localeCompare(right.fragment.id);
764
+ });
765
+ }
766
+ function candidateToTrace(candidate, limit) {
767
+ const final = {
768
+ returnedByLimit: candidate.rank <= limit,
769
+ cutoffRank: limit,
770
+ };
771
+ return {
772
+ recall: candidate.recall,
773
+ fusion: {
774
+ rank: candidate.rank,
775
+ score: candidate.score,
776
+ forced: candidate.forced || undefined,
777
+ },
778
+ final,
779
+ };
780
+ }
781
+ async function chooseBestEntityInFile(query, file, ctx) {
782
+ const candidates = new Map();
783
+ addRecallHits(candidates, ctx.storage.searchFts(query, 10, {
784
+ fileIds: [file.id],
785
+ }), {
786
+ id: "fts",
787
+ mode: "fts",
788
+ query,
789
+ }, ctx.storage);
790
+ const { vectors: [queryVector], } = await requireEmbeddingModel(ctx, "diagnose").embed([{ kind: "text", text: query }], { purpose: "query" });
791
+ addRecallHits(candidates, ctx.storage.searchVector(queryVector, 10, {
792
+ fileIds: [file.id],
793
+ }), {
794
+ id: "vector",
795
+ mode: "vector",
796
+ query,
797
+ }, ctx.storage);
798
+ const [best] = fuseCandidates(candidates);
799
+ if (best) {
800
+ return best.id;
801
+ }
802
+ const [first] = ctx.storage.listEntitiesByFile(file.id, { limit: 1 });
803
+ return first?.entity.id ?? null;
804
+ }
805
+ function deriveMatchedBy(sources) {
806
+ if (sources.has("fts") && sources.has("vector")) {
807
+ return "fts+vector";
808
+ }
809
+ return sources.has("vector") ? "vector" : "fts";
810
+ }
811
+ //# sourceMappingURL=index.js.map