@zvec/zvec-grep 0.2.1 → 0.3.0-rc.1

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 (406) hide show
  1. package/README.md +87 -238
  2. package/bin/zg.exe +3 -0
  3. package/install.cjs +510 -0
  4. package/package.json +22 -72
  5. package/platforms.json +92 -0
  6. package/plugins.cjs +183 -0
  7. package/README_CN.md +0 -230
  8. package/dist/authorization/index.d.ts +0 -7
  9. package/dist/authorization/index.js +0 -7
  10. package/dist/authorization/index.js.map +0 -1
  11. package/dist/authorization/manager.d.ts +0 -8
  12. package/dist/authorization/manager.js +0 -19
  13. package/dist/authorization/manager.js.map +0 -1
  14. package/dist/authorization/operation.d.ts +0 -7
  15. package/dist/authorization/operation.js +0 -50
  16. package/dist/authorization/operation.js.map +0 -1
  17. package/dist/authorization/planner.d.ts +0 -21
  18. package/dist/authorization/planner.js +0 -97
  19. package/dist/authorization/planner.js.map +0 -1
  20. package/dist/authorization/prompt.d.ts +0 -12
  21. package/dist/authorization/prompt.js +0 -63
  22. package/dist/authorization/prompt.js.map +0 -1
  23. package/dist/authorization/store.d.ts +0 -20
  24. package/dist/authorization/store.js +0 -251
  25. package/dist/authorization/store.js.map +0 -1
  26. package/dist/authorization/target.d.ts +0 -15
  27. package/dist/authorization/target.js +0 -49
  28. package/dist/authorization/target.js.map +0 -1
  29. package/dist/authorization/types.d.ts +0 -61
  30. package/dist/authorization/types.js +0 -2
  31. package/dist/authorization/types.js.map +0 -1
  32. package/dist/cli/args.d.ts +0 -5
  33. package/dist/cli/args.js +0 -1207
  34. package/dist/cli/args.js.map +0 -1
  35. package/dist/cli/auth.d.ts +0 -21
  36. package/dist/cli/auth.js +0 -209
  37. package/dist/cli/auth.js.map +0 -1
  38. package/dist/cli/commands.d.ts +0 -4
  39. package/dist/cli/commands.js +0 -697
  40. package/dist/cli/commands.js.map +0 -1
  41. package/dist/cli/errors.d.ts +0 -6
  42. package/dist/cli/errors.js +0 -98
  43. package/dist/cli/errors.js.map +0 -1
  44. package/dist/cli/format/context.d.ts +0 -9
  45. package/dist/cli/format/context.js +0 -786
  46. package/dist/cli/format/context.js.map +0 -1
  47. package/dist/cli/format/debug.d.ts +0 -4
  48. package/dist/cli/format/debug.js +0 -60
  49. package/dist/cli/format/debug.js.map +0 -1
  50. package/dist/cli/format/highlight.d.ts +0 -3
  51. package/dist/cli/format/highlight.js +0 -106
  52. package/dist/cli/format/highlight.js.map +0 -1
  53. package/dist/cli/format/progress.d.ts +0 -13
  54. package/dist/cli/format/progress.js +0 -290
  55. package/dist/cli/format/progress.js.map +0 -1
  56. package/dist/cli/format/range.d.ts +0 -3
  57. package/dist/cli/format/range.js +0 -24
  58. package/dist/cli/format/range.js.map +0 -1
  59. package/dist/cli/format/status.d.ts +0 -81
  60. package/dist/cli/format/status.js +0 -512
  61. package/dist/cli/format/status.js.map +0 -1
  62. package/dist/cli/help.d.ts +0 -1
  63. package/dist/cli/help.js +0 -524
  64. package/dist/cli/help.js.map +0 -1
  65. package/dist/cli/index.d.ts +0 -2
  66. package/dist/cli/index.js +0 -32
  67. package/dist/cli/index.js.map +0 -1
  68. package/dist/cli/install.d.ts +0 -4
  69. package/dist/cli/install.js +0 -1661
  70. package/dist/cli/install.js.map +0 -1
  71. package/dist/cli/managed-rg.d.ts +0 -10
  72. package/dist/cli/managed-rg.js +0 -329
  73. package/dist/cli/managed-rg.js.map +0 -1
  74. package/dist/cli/server-search.d.ts +0 -3
  75. package/dist/cli/server-search.js +0 -12
  76. package/dist/cli/server-search.js.map +0 -1
  77. package/dist/cli/types.d.ts +0 -87
  78. package/dist/cli/types.js +0 -10
  79. package/dist/cli/types.js.map +0 -1
  80. package/dist/cli/version.d.ts +0 -1
  81. package/dist/cli/version.js +0 -13
  82. package/dist/cli/version.js.map +0 -1
  83. package/dist/client/daemon-client.d.ts +0 -31
  84. package/dist/client/daemon-client.js +0 -203
  85. package/dist/client/daemon-client.js.map +0 -1
  86. package/dist/client/mode-router.d.ts +0 -9
  87. package/dist/client/mode-router.js +0 -28
  88. package/dist/client/mode-router.js.map +0 -1
  89. package/dist/client/search-policy.d.ts +0 -11
  90. package/dist/client/search-policy.js +0 -15
  91. package/dist/client/search-policy.js.map +0 -1
  92. package/dist/daemon/backend.d.ts +0 -78
  93. package/dist/daemon/backend.js +0 -1085
  94. package/dist/daemon/backend.js.map +0 -1
  95. package/dist/daemon/change-set.d.ts +0 -30
  96. package/dist/daemon/change-set.js +0 -163
  97. package/dist/daemon/change-set.js.map +0 -1
  98. package/dist/daemon/config.d.ts +0 -24
  99. package/dist/daemon/config.js +0 -88
  100. package/dist/daemon/config.js.map +0 -1
  101. package/dist/daemon/errors.d.ts +0 -5
  102. package/dist/daemon/errors.js +0 -11
  103. package/dist/daemon/errors.js.map +0 -1
  104. package/dist/daemon/http-server.d.ts +0 -30
  105. package/dist/daemon/http-server.js +0 -288
  106. package/dist/daemon/http-server.js.map +0 -1
  107. package/dist/daemon/index-coordinator.d.ts +0 -22
  108. package/dist/daemon/index-coordinator.js +0 -55
  109. package/dist/daemon/index-coordinator.js.map +0 -1
  110. package/dist/daemon/job-scheduler.d.ts +0 -70
  111. package/dist/daemon/job-scheduler.js +0 -366
  112. package/dist/daemon/job-scheduler.js.map +0 -1
  113. package/dist/daemon/logger.d.ts +0 -9
  114. package/dist/daemon/logger.js +0 -53
  115. package/dist/daemon/logger.js.map +0 -1
  116. package/dist/daemon/model-pool.d.ts +0 -45
  117. package/dist/daemon/model-pool.js +0 -187
  118. package/dist/daemon/model-pool.js.map +0 -1
  119. package/dist/daemon/root-lease.d.ts +0 -14
  120. package/dist/daemon/root-lease.js +0 -188
  121. package/dist/daemon/root-lease.js.map +0 -1
  122. package/dist/daemon/root-runtime.d.ts +0 -79
  123. package/dist/daemon/root-runtime.js +0 -337
  124. package/dist/daemon/root-runtime.js.map +0 -1
  125. package/dist/daemon/runtime-manager.d.ts +0 -46
  126. package/dist/daemon/runtime-manager.js +0 -246
  127. package/dist/daemon/runtime-manager.js.map +0 -1
  128. package/dist/daemon/runtime.d.ts +0 -12
  129. package/dist/daemon/runtime.js +0 -102
  130. package/dist/daemon/runtime.js.map +0 -1
  131. package/dist/daemon/server-controller.d.ts +0 -39
  132. package/dist/daemon/server-controller.js +0 -327
  133. package/dist/daemon/server-controller.js.map +0 -1
  134. package/dist/daemon/watch-manager.d.ts +0 -55
  135. package/dist/daemon/watch-manager.js +0 -340
  136. package/dist/daemon/watch-manager.js.map +0 -1
  137. package/dist/daemon/workspace-read-session-cache.d.ts +0 -31
  138. package/dist/daemon/workspace-read-session-cache.js +0 -115
  139. package/dist/daemon/workspace-read-session-cache.js.map +0 -1
  140. package/dist/engine/code-formats.d.ts +0 -3
  141. package/dist/engine/code-formats.js +0 -14
  142. package/dist/engine/code-formats.js.map +0 -1
  143. package/dist/engine/config.d.ts +0 -50
  144. package/dist/engine/config.js +0 -321
  145. package/dist/engine/config.js.map +0 -1
  146. package/dist/engine/errors.d.ts +0 -19
  147. package/dist/engine/errors.js +0 -40
  148. package/dist/engine/errors.js.map +0 -1
  149. package/dist/engine/extraction/code/adapter.d.ts +0 -19
  150. package/dist/engine/extraction/code/adapter.js +0 -24
  151. package/dist/engine/extraction/code/adapter.js.map +0 -1
  152. package/dist/engine/extraction/code/extractor.d.ts +0 -13
  153. package/dist/engine/extraction/code/extractor.js +0 -696
  154. package/dist/engine/extraction/code/extractor.js.map +0 -1
  155. package/dist/engine/extraction/code/families/c-family.d.ts +0 -2
  156. package/dist/engine/extraction/code/families/c-family.js +0 -122
  157. package/dist/engine/extraction/code/families/c-family.js.map +0 -1
  158. package/dist/engine/extraction/code/families/js-ts.d.ts +0 -12
  159. package/dist/engine/extraction/code/families/js-ts.js +0 -118
  160. package/dist/engine/extraction/code/families/js-ts.js.map +0 -1
  161. package/dist/engine/extraction/code/families/metadata.d.ts +0 -8
  162. package/dist/engine/extraction/code/families/metadata.js +0 -86
  163. package/dist/engine/extraction/code/families/metadata.js.map +0 -1
  164. package/dist/engine/extraction/code/families/name-field.d.ts +0 -3
  165. package/dist/engine/extraction/code/families/name-field.js +0 -22
  166. package/dist/engine/extraction/code/families/name-field.js.map +0 -1
  167. package/dist/engine/extraction/code/languages/c.d.ts +0 -1
  168. package/dist/engine/extraction/code/languages/c.js +0 -12
  169. package/dist/engine/extraction/code/languages/c.js.map +0 -1
  170. package/dist/engine/extraction/code/languages/cpp.d.ts +0 -1
  171. package/dist/engine/extraction/code/languages/cpp.js +0 -18
  172. package/dist/engine/extraction/code/languages/cpp.js.map +0 -1
  173. package/dist/engine/extraction/code/languages/go.d.ts +0 -2
  174. package/dist/engine/extraction/code/languages/go.js +0 -70
  175. package/dist/engine/extraction/code/languages/go.js.map +0 -1
  176. package/dist/engine/extraction/code/languages/java.d.ts +0 -1
  177. package/dist/engine/extraction/code/languages/java.js +0 -17
  178. package/dist/engine/extraction/code/languages/java.js.map +0 -1
  179. package/dist/engine/extraction/code/languages/javascript.d.ts +0 -2
  180. package/dist/engine/extraction/code/languages/javascript.js +0 -23
  181. package/dist/engine/extraction/code/languages/javascript.js.map +0 -1
  182. package/dist/engine/extraction/code/languages/python.d.ts +0 -2
  183. package/dist/engine/extraction/code/languages/python.js +0 -52
  184. package/dist/engine/extraction/code/languages/python.js.map +0 -1
  185. package/dist/engine/extraction/code/languages/rust.d.ts +0 -2
  186. package/dist/engine/extraction/code/languages/rust.js +0 -25
  187. package/dist/engine/extraction/code/languages/rust.js.map +0 -1
  188. package/dist/engine/extraction/code/languages/typescript.d.ts +0 -2
  189. package/dist/engine/extraction/code/languages/typescript.js +0 -37
  190. package/dist/engine/extraction/code/languages/typescript.js.map +0 -1
  191. package/dist/engine/extraction/code/tree-sitter/grammar.d.ts +0 -4
  192. package/dist/engine/extraction/code/tree-sitter/grammar.js +0 -49
  193. package/dist/engine/extraction/code/tree-sitter/grammar.js.map +0 -1
  194. package/dist/engine/extraction/code/tree-sitter/nodes.d.ts +0 -3
  195. package/dist/engine/extraction/code/tree-sitter/nodes.js +0 -27
  196. package/dist/engine/extraction/code/tree-sitter/nodes.js.map +0 -1
  197. package/dist/engine/extraction/code/tree-sitter/parser.d.ts +0 -2
  198. package/dist/engine/extraction/code/tree-sitter/parser.js +0 -31
  199. package/dist/engine/extraction/code/tree-sitter/parser.js.map +0 -1
  200. package/dist/engine/extraction/ids.d.ts +0 -1
  201. package/dist/engine/extraction/ids.js +0 -5
  202. package/dist/engine/extraction/ids.js.map +0 -1
  203. package/dist/engine/extraction/image/extractor.d.ts +0 -5
  204. package/dist/engine/extraction/image/extractor.js +0 -35
  205. package/dist/engine/extraction/image/extractor.js.map +0 -1
  206. package/dist/engine/extraction/index.d.ts +0 -4
  207. package/dist/engine/extraction/index.js +0 -3
  208. package/dist/engine/extraction/index.js.map +0 -1
  209. package/dist/engine/extraction/markdown/extractor.d.ts +0 -7
  210. package/dist/engine/extraction/markdown/extractor.js +0 -362
  211. package/dist/engine/extraction/markdown/extractor.js.map +0 -1
  212. package/dist/engine/extraction/runtime.d.ts +0 -9
  213. package/dist/engine/extraction/runtime.js +0 -37
  214. package/dist/engine/extraction/runtime.js.map +0 -1
  215. package/dist/engine/extraction/source.d.ts +0 -18
  216. package/dist/engine/extraction/source.js +0 -22
  217. package/dist/engine/extraction/source.js.map +0 -1
  218. package/dist/engine/extraction/text/extractor.d.ts +0 -7
  219. package/dist/engine/extraction/text/extractor.js +0 -168
  220. package/dist/engine/extraction/text/extractor.js.map +0 -1
  221. package/dist/engine/extraction/types.d.ts +0 -4
  222. package/dist/engine/extraction/types.js +0 -2
  223. package/dist/engine/extraction/types.js.map +0 -1
  224. package/dist/engine/extraction/vector-content.d.ts +0 -5
  225. package/dist/engine/extraction/vector-content.js +0 -83
  226. package/dist/engine/extraction/vector-content.js.map +0 -1
  227. package/dist/engine/file-size-policy.d.ts +0 -6
  228. package/dist/engine/file-size-policy.js +0 -20
  229. package/dist/engine/file-size-policy.js.map +0 -1
  230. package/dist/engine/file-type.d.ts +0 -15
  231. package/dist/engine/file-type.js +0 -152
  232. package/dist/engine/file-type.js.map +0 -1
  233. package/dist/engine/index-status.d.ts +0 -9
  234. package/dist/engine/index-status.js +0 -38
  235. package/dist/engine/index-status.js.map +0 -1
  236. package/dist/engine/manifest.d.ts +0 -13
  237. package/dist/engine/manifest.js +0 -124
  238. package/dist/engine/manifest.js.map +0 -1
  239. package/dist/engine/models/backends/llama-cpp.d.ts +0 -99
  240. package/dist/engine/models/backends/llama-cpp.js +0 -511
  241. package/dist/engine/models/backends/llama-cpp.js.map +0 -1
  242. package/dist/engine/models/backends/model2vec-runtime.d.ts +0 -63
  243. package/dist/engine/models/backends/model2vec-runtime.js +0 -112
  244. package/dist/engine/models/backends/model2vec-runtime.js.map +0 -1
  245. package/dist/engine/models/backends/model2vec-tokenizer.d.ts +0 -2
  246. package/dist/engine/models/backends/model2vec-tokenizer.js +0 -42
  247. package/dist/engine/models/backends/model2vec-tokenizer.js.map +0 -1
  248. package/dist/engine/models/backends/model2vec-worker-pool.d.ts +0 -25
  249. package/dist/engine/models/backends/model2vec-worker-pool.js +0 -264
  250. package/dist/engine/models/backends/model2vec-worker-pool.js.map +0 -1
  251. package/dist/engine/models/backends/model2vec-worker.d.ts +0 -1
  252. package/dist/engine/models/backends/model2vec-worker.js +0 -41
  253. package/dist/engine/models/backends/model2vec-worker.js.map +0 -1
  254. package/dist/engine/models/backends/model2vec.d.ts +0 -40
  255. package/dist/engine/models/backends/model2vec.js +0 -311
  256. package/dist/engine/models/backends/model2vec.js.map +0 -1
  257. package/dist/engine/models/backends/qwen.d.ts +0 -44
  258. package/dist/engine/models/backends/qwen.js +0 -411
  259. package/dist/engine/models/backends/qwen.js.map +0 -1
  260. package/dist/engine/models/backends/transformers-js.d.ts +0 -87
  261. package/dist/engine/models/backends/transformers-js.js +0 -316
  262. package/dist/engine/models/backends/transformers-js.js.map +0 -1
  263. package/dist/engine/models/catalog.d.ts +0 -231
  264. package/dist/engine/models/catalog.js +0 -218
  265. package/dist/engine/models/catalog.js.map +0 -1
  266. package/dist/engine/models/download-progress.d.ts +0 -15
  267. package/dist/engine/models/download-progress.js +0 -48
  268. package/dist/engine/models/download-progress.js.map +0 -1
  269. package/dist/engine/models/embeddings.d.ts +0 -67
  270. package/dist/engine/models/embeddings.js +0 -125
  271. package/dist/engine/models/embeddings.js.map +0 -1
  272. package/dist/engine/models/factory.d.ts +0 -2
  273. package/dist/engine/models/factory.js +0 -51
  274. package/dist/engine/models/factory.js.map +0 -1
  275. package/dist/engine/models/index.d.ts +0 -4
  276. package/dist/engine/models/index.js +0 -5
  277. package/dist/engine/models/index.js.map +0 -1
  278. package/dist/engine/models/ranking.d.ts +0 -19
  279. package/dist/engine/models/ranking.js +0 -2
  280. package/dist/engine/models/ranking.js.map +0 -1
  281. package/dist/engine/models/resolution.d.ts +0 -8
  282. package/dist/engine/models/resolution.js +0 -22
  283. package/dist/engine/models/resolution.js.map +0 -1
  284. package/dist/engine/pipeline/indexing/index.d.ts +0 -14
  285. package/dist/engine/pipeline/indexing/index.js +0 -1061
  286. package/dist/engine/pipeline/indexing/index.js.map +0 -1
  287. package/dist/engine/pipeline/indexing/input-budget.d.ts +0 -2
  288. package/dist/engine/pipeline/indexing/input-budget.js +0 -51
  289. package/dist/engine/pipeline/indexing/input-budget.js.map +0 -1
  290. package/dist/engine/pipeline/indexing/root-paths.d.ts +0 -7
  291. package/dist/engine/pipeline/indexing/root-paths.js +0 -148
  292. package/dist/engine/pipeline/indexing/root-paths.js.map +0 -1
  293. package/dist/engine/pipeline/indexing/scanner/index.d.ts +0 -14
  294. package/dist/engine/pipeline/indexing/scanner/index.js +0 -776
  295. package/dist/engine/pipeline/indexing/scanner/index.js.map +0 -1
  296. package/dist/engine/pipeline/search/index.d.ts +0 -12
  297. package/dist/engine/pipeline/search/index.js +0 -811
  298. package/dist/engine/pipeline/search/index.js.map +0 -1
  299. package/dist/engine/service/index.d.ts +0 -3
  300. package/dist/engine/service/index.js +0 -2
  301. package/dist/engine/service/index.js.map +0 -1
  302. package/dist/engine/service/lexical.d.ts +0 -28
  303. package/dist/engine/service/lexical.js +0 -446
  304. package/dist/engine/service/lexical.js.map +0 -1
  305. package/dist/engine/service/root.d.ts +0 -15
  306. package/dist/engine/service/root.js +0 -57
  307. package/dist/engine/service/root.js.map +0 -1
  308. package/dist/engine/service/structure-enrichment.d.ts +0 -8
  309. package/dist/engine/service/structure-enrichment.js +0 -178
  310. package/dist/engine/service/structure-enrichment.js.map +0 -1
  311. package/dist/engine/service/types.d.ts +0 -210
  312. package/dist/engine/service/types.js +0 -2
  313. package/dist/engine/service/types.js.map +0 -1
  314. package/dist/engine/service/workspace-index.d.ts +0 -26
  315. package/dist/engine/service/workspace-index.js +0 -157
  316. package/dist/engine/service/workspace-index.js.map +0 -1
  317. package/dist/engine/service/zvec-grep.d.ts +0 -13
  318. package/dist/engine/service/zvec-grep.js +0 -1393
  319. package/dist/engine/service/zvec-grep.js.map +0 -1
  320. package/dist/engine/storage/index.d.ts +0 -53
  321. package/dist/engine/storage/index.js +0 -3
  322. package/dist/engine/storage/index.js.map +0 -1
  323. package/dist/engine/storage/layout.d.ts +0 -10
  324. package/dist/engine/storage/layout.js +0 -29
  325. package/dist/engine/storage/layout.js.map +0 -1
  326. package/dist/engine/storage/zvec.d.ts +0 -4
  327. package/dist/engine/storage/zvec.js +0 -976
  328. package/dist/engine/storage/zvec.js.map +0 -1
  329. package/dist/engine/types.d.ts +0 -303
  330. package/dist/engine/types.js +0 -14
  331. package/dist/engine/types.js.map +0 -1
  332. package/dist/engine/utils/daemon-lease.d.ts +0 -17
  333. package/dist/engine/utils/daemon-lease.js +0 -175
  334. package/dist/engine/utils/daemon-lease.js.map +0 -1
  335. package/dist/engine/utils/file-selection.d.ts +0 -10
  336. package/dist/engine/utils/file-selection.js +0 -157
  337. package/dist/engine/utils/file-selection.js.map +0 -1
  338. package/dist/engine/utils/glob.d.ts +0 -9
  339. package/dist/engine/utils/glob.js +0 -208
  340. package/dist/engine/utils/glob.js.map +0 -1
  341. package/dist/engine/utils/hash.d.ts +0 -2
  342. package/dist/engine/utils/hash.js +0 -8
  343. package/dist/engine/utils/hash.js.map +0 -1
  344. package/dist/engine/utils/json.d.ts +0 -8
  345. package/dist/engine/utils/json.js +0 -83
  346. package/dist/engine/utils/json.js.map +0 -1
  347. package/dist/engine/utils/lock.d.ts +0 -19
  348. package/dist/engine/utils/lock.js +0 -254
  349. package/dist/engine/utils/lock.js.map +0 -1
  350. package/dist/engine/utils/path.d.ts +0 -4
  351. package/dist/engine/utils/path.js +0 -18
  352. package/dist/engine/utils/path.js.map +0 -1
  353. package/dist/engine/utils/timing.d.ts +0 -19
  354. package/dist/engine/utils/timing.js +0 -87
  355. package/dist/engine/utils/timing.js.map +0 -1
  356. package/dist/index-progress.d.ts +0 -10
  357. package/dist/index-progress.js +0 -159
  358. package/dist/index-progress.js.map +0 -1
  359. package/dist/index.d.ts +0 -6
  360. package/dist/index.js +0 -4
  361. package/dist/index.js.map +0 -1
  362. package/dist/mcp/http-transport.d.ts +0 -27
  363. package/dist/mcp/http-transport.js +0 -182
  364. package/dist/mcp/http-transport.js.map +0 -1
  365. package/dist/mcp/input-normalization.d.ts +0 -38
  366. package/dist/mcp/input-normalization.js +0 -104
  367. package/dist/mcp/input-normalization.js.map +0 -1
  368. package/dist/mcp/progress-heartbeat.d.ts +0 -17
  369. package/dist/mcp/progress-heartbeat.js +0 -46
  370. package/dist/mcp/progress-heartbeat.js.map +0 -1
  371. package/dist/mcp/request-metadata.d.ts +0 -2
  372. package/dist/mcp/request-metadata.js +0 -11
  373. package/dist/mcp/request-metadata.js.map +0 -1
  374. package/dist/mcp/request-state.d.ts +0 -40
  375. package/dist/mcp/request-state.js +0 -210
  376. package/dist/mcp/request-state.js.map +0 -1
  377. package/dist/mcp/result-format.d.ts +0 -13
  378. package/dist/mcp/result-format.js +0 -75
  379. package/dist/mcp/result-format.js.map +0 -1
  380. package/dist/mcp/schemas.d.ts +0 -664
  381. package/dist/mcp/schemas.js +0 -510
  382. package/dist/mcp/schemas.js.map +0 -1
  383. package/dist/mcp/stdio-bridge.d.ts +0 -14
  384. package/dist/mcp/stdio-bridge.js +0 -178
  385. package/dist/mcp/stdio-bridge.js.map +0 -1
  386. package/dist/mcp/tools.d.ts +0 -153
  387. package/dist/mcp/tools.js +0 -482
  388. package/dist/mcp/tools.js.map +0 -1
  389. package/dist/mcp/toolset.d.ts +0 -5
  390. package/dist/mcp/toolset.js +0 -12
  391. package/dist/mcp/toolset.js.map +0 -1
  392. package/dist/observability/trace-context.d.ts +0 -11
  393. package/dist/observability/trace-context.js +0 -138
  394. package/dist/observability/trace-context.js.map +0 -1
  395. package/dist/prompts/zvec-grep-guidance.d.ts +0 -2
  396. package/dist/prompts/zvec-grep-guidance.js +0 -9
  397. package/dist/prompts/zvec-grep-guidance.js.map +0 -1
  398. package/docs/01-agents.md +0 -209
  399. package/docs/02-cli.md +0 -246
  400. package/docs/03-mcp.md +0 -185
  401. package/docs/04-pipeline.md +0 -226
  402. package/docs/05-architecture.md +0 -86
  403. package/docs/06-server.md +0 -220
  404. package/docs/07-embedding.md +0 -203
  405. package/docs/08-roadmap.md +0 -85
  406. package/docs/README.md +0 -53
@@ -1,976 +0,0 @@
1
- import { ZVecCollectionSchema, ZVecCreateAndOpen, ZVecDataType, ZVecIndexType, ZVecInitialize, ZVecLogLevel, ZVecMetricType, ZVecOpen, } from "@zvec/zvec";
2
- import { closeSync, existsSync, mkdirSync, openSync } from "node:fs";
3
- import { dirname, join } from "node:path";
4
- import { EngineError } from "../errors.js";
5
- import { normalizePath } from "../utils/path.js";
6
- import { resolveWorkspaceIndexStoragePaths } from "./layout.js";
7
- const ENTITY_VECTOR_FIELD = "embedding";
8
- const ENTITY_TEXT_FIELD = "text";
9
- const ZVEC_LOCK_FILE = "LOCK";
10
- const NO_MATCH_FILTER = "file_id = '__zvec_grep_no_match__'";
11
- const ZVEC_UPSERT_BATCH_SIZE = 1024;
12
- const ZVEC_MAX_QUERY_TOPK = 100_000;
13
- const FILE_ID_HEX_ALPHABET = "0123456789abcdef";
14
- const ZVEC_OPEN_RETRY_ATTEMPTS = 8;
15
- const ZVEC_OPEN_RETRY_BASE_DELAY_MS = 100;
16
- const ZVEC_OPEN_RETRY_MAX_DELAY_MS = 1000;
17
- let zvecInitialized = false;
18
- export function createWorkspaceIndexStorage(options) {
19
- return new ZvecWorkspaceIndexStorage(options);
20
- }
21
- class ZvecWorkspaceIndexStorage {
22
- readOnly;
23
- collection;
24
- files;
25
- filesById = new Map();
26
- filesByAbsolutePath = new Map();
27
- needsOptimize = false;
28
- constructor(options) {
29
- const paths = resolveWorkspaceIndexStoragePaths(options.storagePath);
30
- const { readOnly } = options;
31
- this.readOnly = readOnly;
32
- initializeZvec();
33
- if (!readOnly) {
34
- mkdirSync(paths.storagePath, { recursive: true });
35
- }
36
- this.files = new ZvecFileMetaStore(paths.filesPath, readOnly);
37
- for (const file of this.files.list()) {
38
- this.rememberFile(file);
39
- }
40
- const zvecPath = paths.indexPath;
41
- if (existsSync(zvecPath)) {
42
- this.collection = openZvecCollection(zvecPath, readOnly, "open", () => ZVecOpen(zvecPath, { readOnly }));
43
- }
44
- else if (readOnly) {
45
- throw new EngineError("zvec collection storage does not exist", {
46
- code: "ZVEC_GREP.ENGINE.STORAGE.ZVEC_COLLECTION_MISSING",
47
- context: `path=${zvecPath}`,
48
- });
49
- }
50
- else {
51
- this.collection = openZvecCollection(zvecPath, readOnly, "create", () => ZVecCreateAndOpen(zvecPath, createSchema(options.embedding)));
52
- }
53
- }
54
- getFileByPath(absolutePath) {
55
- const file = this.filesByAbsolutePath.get(normalizePath(absolutePath));
56
- return file ? fileRecordToInfo(file) : null;
57
- }
58
- listFilesByPathPrefix(absolutePath) {
59
- return this.listFilesByPathPrefixes([absolutePath]);
60
- }
61
- listFilesByPathPrefixes(absolutePaths) {
62
- const prefixes = new Set(absolutePaths.map((path) => normalizePath(path)));
63
- if (prefixes.size === 0) {
64
- return [];
65
- }
66
- return [...this.filesByAbsolutePath.entries()]
67
- .filter(([path]) => hasPathPrefix(path, prefixes))
68
- .map(([, file]) => fileRecordToInfo(file));
69
- }
70
- listFiles() {
71
- return [...this.filesById.values()].map(fileRecordToInfo);
72
- }
73
- listEntitiesByFile(fileId, options = {}) {
74
- const file = this.filesById.get(fileId);
75
- if (!file) {
76
- return [];
77
- }
78
- const offset = options.offset ?? 0;
79
- const limit = options.limit ?? file.entityIds.length;
80
- const ids = file.entityIds.slice(offset, offset + limit);
81
- return this.fetchStoredEntities(ids);
82
- }
83
- getEntity(entityId) {
84
- const fragment = this.getFragment(entityId);
85
- if (!fragment) {
86
- return null;
87
- }
88
- if (fragment.fragment.group &&
89
- fragment.fragment.group !== fragment.fragment.id) {
90
- return this.getEntity(fragment.fragment.group);
91
- }
92
- return {
93
- file: fragment.file,
94
- entity: fragmentToEntity(fragment.fragment),
95
- };
96
- }
97
- getFragment(fragmentId) {
98
- const docs = this.collection.fetchSync({
99
- ids: fragmentId,
100
- includeVector: false,
101
- });
102
- const doc = docs[fragmentId];
103
- if (!doc) {
104
- return null;
105
- }
106
- return this.docToStoredFragment(doc);
107
- }
108
- replaceFile(file, entries, diagnostics = {}) {
109
- this.assertWritable("replaceFile");
110
- const fragments = entries.map(({ fragment }) => fragment);
111
- validateFragmentGroups(file.id, fragments);
112
- this.markFileDirty(file);
113
- this.deleteFileDocuments(file.id);
114
- const now = Date.now();
115
- const entityIds = publicEntityIds(fragments);
116
- const indexedFile = {
117
- ...file,
118
- absolutePath: normalizePath(file.absolutePath),
119
- indexStatus: {
120
- indexedTime: now,
121
- entityCount: entityIds.length,
122
- truncatedFragmentCount: diagnostics.truncatedFragmentCount ?? 0,
123
- },
124
- entityIds,
125
- };
126
- if (entries.length > 0) {
127
- const docs = entries.map(({ fragment, vector }, index) => ({
128
- id: fragment.id,
129
- vectors: {
130
- [ENTITY_VECTOR_FIELD]: [...vector],
131
- },
132
- fields: fragmentToFields(indexedFile, fragment, index),
133
- }));
134
- this.upsertDocs(file.id, docs);
135
- this.needsOptimize = true;
136
- }
137
- this.rememberFile(indexedFile);
138
- this.persistFile(indexedFile);
139
- }
140
- upsertDocs(fileId, docs) {
141
- for (let start = 0; start < docs.length; start += ZVEC_UPSERT_BATCH_SIZE) {
142
- const batch = docs.slice(start, start + ZVEC_UPSERT_BATCH_SIZE);
143
- const statuses = this.collection.upsertSync(batch);
144
- const failed = statuses.find((status) => !status.ok);
145
- if (failed) {
146
- throw new EngineError("zvec failed to upsert entity documents", {
147
- code: "ZVEC_GREP.ENGINE.STORAGE.ZVEC_UPSERT_FAILED",
148
- context: `fileId=${fileId} batchStart=${start} batchSize=${batch.length} code=${failed.code} message=${failed.message}`,
149
- });
150
- }
151
- }
152
- }
153
- markFileFailed(file, error) {
154
- this.assertWritable("markFileFailed");
155
- this.deleteFileDocuments(file.id);
156
- this.rememberFile({
157
- ...file,
158
- absolutePath: normalizePath(file.absolutePath),
159
- indexStatus: {
160
- indexedTime: null,
161
- entityCount: 0,
162
- error,
163
- },
164
- entityIds: [],
165
- });
166
- this.persistFile(this.filesById.get(file.id));
167
- }
168
- deleteFile(fileId) {
169
- this.assertWritable("deleteFile");
170
- const existing = this.filesById.get(fileId);
171
- this.deleteFileDocuments(fileId);
172
- if (existing) {
173
- this.filesById.delete(fileId);
174
- this.filesByAbsolutePath.delete(normalizePath(existing.absolutePath));
175
- }
176
- this.files.deleteFile(fileId);
177
- }
178
- searchFts(query, limit, filter) {
179
- const zvecFilter = buildFilter(filter);
180
- const docs = this.collection.querySync({
181
- fieldName: ENTITY_TEXT_FIELD,
182
- fts: { matchString: query },
183
- ...(zvecFilter ? { filter: zvecFilter } : {}),
184
- topk: limit,
185
- includeVector: false,
186
- });
187
- return docsToHits(docs, "fts", this);
188
- }
189
- searchVector(vector, limit, filter) {
190
- const zvecFilter = buildFilter(filter);
191
- const docs = this.collection.querySync({
192
- fieldName: ENTITY_VECTOR_FIELD,
193
- vector: [...vector],
194
- ...(zvecFilter ? { filter: zvecFilter } : {}),
195
- topk: limit,
196
- includeVector: false,
197
- });
198
- return docsToHits(docs, "vector", this);
199
- }
200
- async finalizeWrites() {
201
- this.assertWritable("finalizeWrites");
202
- if (this.needsOptimize) {
203
- await this.collection.optimize();
204
- this.needsOptimize = false;
205
- }
206
- }
207
- close() {
208
- if (this.needsOptimize) {
209
- this.collection.optimizeSync();
210
- this.needsOptimize = false;
211
- }
212
- this.files.close();
213
- this.collection.closeSync();
214
- }
215
- fetchStoredEntities(ids) {
216
- if (ids.length === 0) {
217
- return [];
218
- }
219
- const docs = this.collection.fetchSync({
220
- ids: [...ids],
221
- includeVector: false,
222
- });
223
- const entities = [];
224
- for (const id of ids) {
225
- const doc = docs[id];
226
- const entity = doc ? this.docToStoredEntity(doc) : null;
227
- if (entity) {
228
- entities.push(entity);
229
- }
230
- }
231
- return entities;
232
- }
233
- docToStoredEntity(doc) {
234
- const stored = this.docToStoredFragment(doc);
235
- if (!stored) {
236
- return null;
237
- }
238
- if (stored.fragment.group && stored.fragment.group !== stored.fragment.id) {
239
- return this.getEntity(stored.fragment.group);
240
- }
241
- return {
242
- file: stored.file,
243
- entity: fragmentToEntity(stored.fragment),
244
- };
245
- }
246
- docToStoredFragment(doc) {
247
- const fileId = readStringField(doc, "file_id");
248
- const file = this.filesById.get(fileId);
249
- if (!file) {
250
- return null;
251
- }
252
- return {
253
- file: fileRecordToInfo(file),
254
- fragment: {
255
- id: doc.id,
256
- group: readNullableStringFieldFromFields(doc.fields, "group") ?? undefined,
257
- fileId,
258
- range: parseRange(readStringField(doc, "range_json")),
259
- content: parseContent(doc.fields),
260
- metadata: parseMetadata(doc.fields),
261
- },
262
- };
263
- }
264
- rememberFile(file) {
265
- const normalized = {
266
- ...file,
267
- absolutePath: normalizePath(file.absolutePath),
268
- };
269
- this.filesById.set(normalized.id, normalized);
270
- this.filesByAbsolutePath.set(normalized.absolutePath, normalized);
271
- }
272
- markFileDirty(file) {
273
- this.rememberFile({
274
- ...file,
275
- absolutePath: normalizePath(file.absolutePath),
276
- indexStatus: {
277
- indexedTime: null,
278
- entityCount: 0,
279
- },
280
- entityIds: [],
281
- });
282
- this.persistFile(this.filesById.get(file.id));
283
- }
284
- deleteFileDocuments(fileId) {
285
- this.collection.deleteByFilterSync(`file_id = ${quoteFilterString(fileId)}`);
286
- this.needsOptimize = true;
287
- }
288
- persistFile(file) {
289
- this.files.upsertFile(file);
290
- }
291
- assertWritable(operation) {
292
- if (this.readOnly) {
293
- throw new EngineError("Cannot update read-only workspace index storage", {
294
- code: "ZVEC_GREP.ENGINE.STORAGE.READ_ONLY",
295
- context: `operation=${operation}`,
296
- });
297
- }
298
- }
299
- }
300
- function hasPathPrefix(path, prefixes) {
301
- let current = path;
302
- while (true) {
303
- if (prefixes.has(current)) {
304
- return true;
305
- }
306
- const parent = dirname(current);
307
- if (parent === current) {
308
- return false;
309
- }
310
- current = parent;
311
- }
312
- }
313
- class ZvecFileMetaStore {
314
- path;
315
- readOnly;
316
- collection;
317
- needsOptimize = false;
318
- constructor(path, readOnly = false) {
319
- this.path = path;
320
- this.readOnly = readOnly;
321
- initializeZvec();
322
- if (!readOnly) {
323
- mkdirSync(dirname(path), { recursive: true });
324
- }
325
- if (existsSync(path)) {
326
- this.collection = openZvecCollection(path, readOnly, "open", () => ZVecOpen(path, { readOnly }));
327
- }
328
- else if (readOnly) {
329
- throw new EngineError("zvec file metadata storage does not exist", {
330
- code: "ZVEC_GREP.ENGINE.STORAGE.ZVEC_FILE_META_MISSING",
331
- context: `path=${path}`,
332
- });
333
- }
334
- else {
335
- this.collection = openZvecCollection(path, readOnly, "create", () => ZVecCreateAndOpen(path, createFilesSchema()));
336
- }
337
- }
338
- list() {
339
- const docs = queryFileMetadataDocs(this.collection, ZVEC_MAX_QUERY_TOPK);
340
- return docs
341
- .map((doc) => docToFileRecord(doc))
342
- .sort((left, right) => left.relativePath.localeCompare(right.relativePath));
343
- }
344
- upsertFile(file) {
345
- this.assertWritable("upsertFile");
346
- const deleteStatus = this.collection.deleteSync(file.id);
347
- assertZvecStatusOrNotFound(deleteStatus, "file metadata replace", file.id);
348
- const status = this.collection.upsertSync(fileRecordToDoc(file));
349
- assertZvecStatus(status, "file metadata upsert", file.id);
350
- this.needsOptimize = true;
351
- }
352
- deleteFile(fileId) {
353
- this.assertWritable("deleteFile");
354
- const status = this.collection.deleteByFilterSync(`file_id = ${quoteFilterString(fileId)}`);
355
- assertZvecStatus(status, "file metadata delete", fileId);
356
- this.needsOptimize = true;
357
- }
358
- close() {
359
- if (this.needsOptimize) {
360
- this.collection.optimizeSync();
361
- this.needsOptimize = false;
362
- }
363
- this.collection.closeSync();
364
- }
365
- assertWritable(operation) {
366
- if (this.readOnly) {
367
- throw new EngineError("Cannot update read-only file metadata storage", {
368
- code: "ZVEC_GREP.ENGINE.STORAGE.FILE_META_READ_ONLY",
369
- context: `path=${this.path} operation=${operation}`,
370
- });
371
- }
372
- }
373
- }
374
- export function queryFileMetadataDocs(collection, maxTopk = ZVEC_MAX_QUERY_TOPK) {
375
- if (!Number.isInteger(maxTopk) || maxTopk < 1) {
376
- throw new EngineError("zvec metadata query limit must be positive", {
377
- code: "ZVEC_GREP.ENGINE.STORAGE.INVALID_METADATA_QUERY_LIMIT",
378
- context: `maxTopk=${maxTopk}`,
379
- });
380
- }
381
- if (collection.stats.docCount <= maxTopk) {
382
- return collection.querySync({
383
- topk: Math.max(collection.stats.docCount, 1),
384
- includeVector: false,
385
- });
386
- }
387
- return FILE_ID_HEX_ALPHABET.split("").flatMap((prefix) => queryFileMetadataPartition(collection, prefix, maxTopk));
388
- }
389
- function queryFileMetadataPartition(collection, prefix, maxTopk) {
390
- const lower = quoteFilterString(prefix);
391
- const upper = quoteFilterString(`${prefix}g`);
392
- const docs = collection.querySync({
393
- filter: `file_id >= ${lower} AND file_id < ${upper}`,
394
- topk: maxTopk,
395
- includeVector: false,
396
- });
397
- if (docs.length < maxTopk) {
398
- return docs;
399
- }
400
- if (prefix.length >= 64) {
401
- throw new EngineError("zvec metadata partition exceeds query limit", {
402
- code: "ZVEC_GREP.ENGINE.STORAGE.METADATA_PARTITION_TOO_LARGE",
403
- context: `prefix=${prefix} maxTopk=${maxTopk}`,
404
- });
405
- }
406
- return FILE_ID_HEX_ALPHABET.split("").flatMap((suffix) => queryFileMetadataPartition(collection, `${prefix}${suffix}`, maxTopk));
407
- }
408
- function createFilesSchema() {
409
- return new ZVecCollectionSchema({
410
- name: "zvec_grep_files",
411
- fields: [
412
- indexedStringField("file_id"),
413
- indexedStringField("absolute_path"),
414
- stringField("relative_path"),
415
- stringField("root_path"),
416
- {
417
- name: "size_bytes",
418
- dataType: ZVecDataType.INT64,
419
- nullable: false,
420
- },
421
- {
422
- name: "last_modified_time",
423
- dataType: ZVecDataType.INT64,
424
- nullable: false,
425
- },
426
- indexedStringField("content_hash", true),
427
- indexedStringField("kind"),
428
- indexedStringField("format"),
429
- {
430
- name: "has_index_status",
431
- dataType: ZVecDataType.BOOL,
432
- nullable: false,
433
- },
434
- {
435
- name: "indexed_time",
436
- dataType: ZVecDataType.INT64,
437
- nullable: true,
438
- },
439
- {
440
- name: "entity_count",
441
- dataType: ZVecDataType.INT32,
442
- nullable: false,
443
- },
444
- {
445
- name: "token_count",
446
- dataType: ZVecDataType.INT32,
447
- nullable: true,
448
- },
449
- {
450
- name: "truncated_fragment_count",
451
- dataType: ZVecDataType.INT32,
452
- nullable: true,
453
- },
454
- stringField("error", true),
455
- stringField("entity_ids_json"),
456
- ],
457
- });
458
- }
459
- function fileRecordToDoc(file) {
460
- const fields = {
461
- file_id: file.id,
462
- absolute_path: normalizePath(file.absolutePath),
463
- relative_path: file.relativePath,
464
- root_path: file.rootPath,
465
- size_bytes: file.sizeBytes,
466
- last_modified_time: file.lastModifiedTime,
467
- kind: file.kind,
468
- format: file.format,
469
- has_index_status: file.indexStatus !== undefined,
470
- entity_count: file.indexStatus?.entityCount ?? 0,
471
- entity_ids_json: JSON.stringify(file.entityIds),
472
- };
473
- if (file.contentHash !== undefined) {
474
- fields.content_hash = file.contentHash;
475
- }
476
- if (file.indexStatus?.indexedTime !== null &&
477
- file.indexStatus?.indexedTime !== undefined) {
478
- fields.indexed_time = file.indexStatus.indexedTime;
479
- }
480
- if (file.indexStatus?.tokenCount !== undefined) {
481
- fields.token_count = file.indexStatus.tokenCount;
482
- }
483
- if (file.indexStatus?.truncatedFragmentCount !== undefined) {
484
- fields.truncated_fragment_count = file.indexStatus.truncatedFragmentCount;
485
- }
486
- if (file.indexStatus?.error !== undefined) {
487
- fields.error = file.indexStatus.error;
488
- }
489
- return {
490
- id: file.id,
491
- fields,
492
- };
493
- }
494
- function docToFileRecord(doc) {
495
- const fields = doc.fields;
496
- const hasIndexStatus = readBooleanFieldFromFields(fields, "has_index_status");
497
- const indexedTime = readNullableNumberFieldFromFields(fields, "indexed_time");
498
- const tokenCount = readNullableNumberFieldFromFields(fields, "token_count");
499
- const truncatedFragmentCount = readNullableNumberFieldFromFields(fields, "truncated_fragment_count");
500
- const error = readNullableStringFieldFromFields(fields, "error");
501
- return {
502
- id: readStringField(doc, "file_id"),
503
- absolutePath: normalizePath(readStringField(doc, "absolute_path")),
504
- relativePath: readStringField(doc, "relative_path"),
505
- rootPath: readStringField(doc, "root_path"),
506
- sizeBytes: readNumberFieldFromFields(fields, "size_bytes"),
507
- lastModifiedTime: readNumberFieldFromFields(fields, "last_modified_time"),
508
- contentHash: readNullableStringFieldFromFields(fields, "content_hash") ?? undefined,
509
- kind: readStringField(doc, "kind"),
510
- format: readStringField(doc, "format"),
511
- indexStatus: hasIndexStatus
512
- ? {
513
- indexedTime,
514
- entityCount: readNumberFieldFromFields(fields, "entity_count"),
515
- ...(tokenCount === null ? {} : { tokenCount }),
516
- ...(truncatedFragmentCount === null
517
- ? {}
518
- : { truncatedFragmentCount }),
519
- ...(error === null ? {} : { error }),
520
- }
521
- : undefined,
522
- entityIds: parseStringArray(readStringField(doc, "entity_ids_json")),
523
- };
524
- }
525
- function fileRecordToInfo(file) {
526
- const { entityIds: _entityIds, ...info } = file;
527
- return info;
528
- }
529
- function fragmentToEntity(fragment) {
530
- return {
531
- id: publicEntityId(fragment),
532
- fileId: fragment.fileId,
533
- range: fragment.range,
534
- content: fragment.content,
535
- metadata: fragment.metadata,
536
- };
537
- }
538
- function publicEntityId(fragment) {
539
- return fragment.group ?? fragment.id;
540
- }
541
- function publicEntityIds(fragments) {
542
- const ids = new Set();
543
- for (const fragment of fragments) {
544
- if (!fragment.group || fragment.group === fragment.id) {
545
- ids.add(publicEntityId(fragment));
546
- }
547
- }
548
- return [...ids];
549
- }
550
- function validateFragmentGroups(fileId, fragments) {
551
- const ids = new Set();
552
- const groups = new Map();
553
- for (const fragment of fragments) {
554
- if (fragment.fileId !== fileId) {
555
- throw new EngineError("Entity fragment belongs to the wrong file", {
556
- code: "ZVEC_GREP.ENGINE.STORAGE.FRAGMENT_FILE_MISMATCH",
557
- context: `fileId=${fileId} fragmentId=${fragment.id} fragmentFileId=${fragment.fileId}`,
558
- });
559
- }
560
- if (ids.has(fragment.id)) {
561
- throw new EngineError("Duplicate entity fragment id", {
562
- code: "ZVEC_GREP.ENGINE.STORAGE.DUPLICATE_FRAGMENT_ID",
563
- context: `fileId=${fileId} fragmentId=${fragment.id}`,
564
- });
565
- }
566
- ids.add(fragment.id);
567
- if (fragment.group) {
568
- const group = groups.get(fragment.group) ?? [];
569
- group.push(fragment);
570
- groups.set(fragment.group, group);
571
- }
572
- }
573
- for (const [groupId, group] of groups) {
574
- const majorCount = group.filter((fragment) => fragment.id === groupId).length;
575
- if (majorCount !== 1) {
576
- throw new EngineError("Fragment group must have exactly one major fragment", {
577
- code: "ZVEC_GREP.ENGINE.STORAGE.INVALID_FRAGMENT_GROUP",
578
- context: `fileId=${fileId} group=${groupId} majorCount=${majorCount}`,
579
- });
580
- }
581
- }
582
- }
583
- function initializeZvec() {
584
- if (zvecInitialized) {
585
- return;
586
- }
587
- ZVecInitialize({ logLevel: ZVecLogLevel.WARN });
588
- zvecInitialized = true;
589
- }
590
- function openZvecCollection(zvecPath, readOnly, action, open) {
591
- const lockWritable = canTouchZvecLock(zvecPath);
592
- let lastError;
593
- for (let attempt = 0; attempt < ZVEC_OPEN_RETRY_ATTEMPTS; attempt++) {
594
- try {
595
- return open();
596
- }
597
- catch (error) {
598
- lastError = error;
599
- if (attempt + 1 >= ZVEC_OPEN_RETRY_ATTEMPTS ||
600
- !isRetryableZvecOpenError(error, lockWritable)) {
601
- break;
602
- }
603
- sleepSync(zvecOpenRetryDelayMs(attempt));
604
- }
605
- }
606
- throw new EngineError("Failed to open zvec collection storage", {
607
- code: "ZVEC_GREP.ENGINE.STORAGE.ZVEC_OPEN_FAILED",
608
- context: `path=${zvecPath} action=${action} readOnly=${readOnly} attempts=${ZVEC_OPEN_RETRY_ATTEMPTS}`,
609
- cause: lastError,
610
- });
611
- }
612
- function canTouchZvecLock(zvecPath) {
613
- const lockPath = join(zvecPath, ZVEC_LOCK_FILE);
614
- if (!existsSync(lockPath)) {
615
- return true;
616
- }
617
- try {
618
- const fd = openSync(lockPath, "a");
619
- closeSync(fd);
620
- return true;
621
- }
622
- catch {
623
- return false;
624
- }
625
- }
626
- function isRetryableZvecOpenError(error, lockWritable) {
627
- if (!lockWritable) {
628
- return false;
629
- }
630
- const message = error instanceof Error ? error.message : String(error);
631
- if (!/lock/i.test(message)) {
632
- return false;
633
- }
634
- return !/permission|access denied|eacces|eperm|read-only/i.test(message);
635
- }
636
- function zvecOpenRetryDelayMs(attempt) {
637
- const exponential = ZVEC_OPEN_RETRY_BASE_DELAY_MS * 2 ** attempt;
638
- return Math.min(exponential, ZVEC_OPEN_RETRY_MAX_DELAY_MS);
639
- }
640
- function sleepSync(ms) {
641
- const buffer = new SharedArrayBuffer(4);
642
- const values = new Int32Array(buffer);
643
- Atomics.wait(values, 0, 0, ms);
644
- }
645
- function createSchema(embedding) {
646
- return new ZVecCollectionSchema({
647
- name: "zvec_grep_entities",
648
- fields: [
649
- indexedStringField("group", true),
650
- indexedStringField("file_id"),
651
- stringField("content_kind"),
652
- stringField("content_hash", true),
653
- stringField("metadata_kind", true),
654
- indexedStringField("symbol_type", true),
655
- indexedStringField("symbol_name", true),
656
- stringField("symbol_scope", true),
657
- stringField("symbol_signature", true),
658
- stringField("symbol_doc", true),
659
- stringField("symbol_modifiers", true),
660
- stringField("node_type", true),
661
- stringField("heading", true),
662
- {
663
- name: "heading_level",
664
- dataType: ZVecDataType.INT32,
665
- nullable: true,
666
- },
667
- {
668
- name: ENTITY_TEXT_FIELD,
669
- dataType: ZVecDataType.STRING,
670
- nullable: false,
671
- indexParams: {
672
- indexType: ZVecIndexType.FTS,
673
- tokenizerName: "jieba",
674
- filters: ["lowercase"],
675
- },
676
- },
677
- {
678
- name: "fragment_index",
679
- dataType: ZVecDataType.INT32,
680
- nullable: false,
681
- },
682
- { name: "range_json", dataType: ZVecDataType.STRING, nullable: false },
683
- { name: "content_base64", dataType: ZVecDataType.STRING, nullable: true },
684
- { name: "image_format", dataType: ZVecDataType.STRING, nullable: true },
685
- ],
686
- vectors: {
687
- name: ENTITY_VECTOR_FIELD,
688
- dataType: ZVecDataType.VECTOR_FP32,
689
- dimension: embedding.dimension,
690
- indexParams: {
691
- indexType: ZVecIndexType.HNSW,
692
- metricType: metricToZvec(embedding.metric),
693
- },
694
- },
695
- });
696
- }
697
- function indexedStringField(name, nullable = false) {
698
- return {
699
- name,
700
- dataType: ZVecDataType.STRING,
701
- nullable,
702
- indexParams: { indexType: ZVecIndexType.INVERT },
703
- };
704
- }
705
- function stringField(name, nullable = false) {
706
- return {
707
- name,
708
- dataType: ZVecDataType.STRING,
709
- nullable,
710
- };
711
- }
712
- function metricToZvec(metric) {
713
- if (metric === "cosine") {
714
- return ZVecMetricType.COSINE;
715
- }
716
- if (metric === "dot") {
717
- return ZVecMetricType.IP;
718
- }
719
- if (metric === "euclidean") {
720
- return ZVecMetricType.L2;
721
- }
722
- throw new EngineError("Unsupported vector metric for zvec storage", {
723
- code: "ZVEC_GREP.ENGINE.STORAGE.UNSUPPORTED_VECTOR_METRIC",
724
- context: `metric=${metric}`,
725
- });
726
- }
727
- function fragmentToFields(file, fragment, fragmentIndex) {
728
- const contentFields = contentToFields(fragment.content);
729
- return {
730
- ...optionalFields({
731
- group: fragment.group,
732
- content_hash: file.contentHash,
733
- }),
734
- file_id: file.id,
735
- content_kind: fragment.content.kind,
736
- ...metadataToFields(fragment.metadata),
737
- fragment_index: fragmentIndex,
738
- range_json: JSON.stringify(fragment.range),
739
- ...contentFields,
740
- };
741
- }
742
- function contentToFields(content) {
743
- if (content.kind === "text") {
744
- return {
745
- text: content.text,
746
- };
747
- }
748
- return {
749
- text: `[image:${content.format}]`,
750
- content_base64: Buffer.from(content.data).toString("base64"),
751
- image_format: content.format,
752
- };
753
- }
754
- function metadataToFields(metadata) {
755
- if (!metadata) {
756
- return {};
757
- }
758
- if (metadata.kind === "code") {
759
- return {
760
- metadata_kind: "code",
761
- symbol_type: metadata.symbolType,
762
- ...optionalFields({
763
- symbol_name: metadata.symbolName,
764
- symbol_scope: metadata.scope,
765
- symbol_signature: metadata.signature,
766
- symbol_doc: metadata.doc,
767
- symbol_modifiers: metadata.modifiers.length > 0 ? metadata.modifiers.join(" ") : null,
768
- node_type: metadata.nodeType,
769
- }),
770
- };
771
- }
772
- return {
773
- metadata_kind: "markdown",
774
- ...optionalFields({
775
- symbol_scope: metadata.scope,
776
- heading: metadata.heading,
777
- heading_level: metadata.level,
778
- }),
779
- };
780
- }
781
- function optionalFields(fields) {
782
- const result = {};
783
- for (const [key, value] of Object.entries(fields)) {
784
- if (value !== null && value !== undefined) {
785
- result[key] = value;
786
- }
787
- }
788
- return result;
789
- }
790
- function parseContent(fields) {
791
- const kind = fields.content_kind;
792
- if (kind === "text") {
793
- return {
794
- kind: "text",
795
- text: readStringFieldFromFields(fields, "text"),
796
- };
797
- }
798
- if (kind === "image") {
799
- return {
800
- kind: "image",
801
- data: Buffer.from(readStringFieldFromFields(fields, "content_base64"), "base64"),
802
- format: readStringFieldFromFields(fields, "image_format"),
803
- };
804
- }
805
- throw new EngineError("Stored entity has unsupported content kind", {
806
- code: "ZVEC_GREP.ENGINE.STORAGE.UNSUPPORTED_STORED_CONTENT_KIND",
807
- context: `contentKind=${String(kind)}`,
808
- });
809
- }
810
- function parseMetadata(fields) {
811
- const kind = fields.metadata_kind;
812
- if (kind === "code") {
813
- return {
814
- kind: "code",
815
- symbolType: readStringFieldFromFields(fields, "symbol_type"),
816
- symbolName: readNullableStringFieldFromFields(fields, "symbol_name"),
817
- scope: readNullableStringFieldFromFields(fields, "symbol_scope"),
818
- nodeType: readNullableStringFieldFromFields(fields, "node_type"),
819
- signature: readNullableStringFieldFromFields(fields, "symbol_signature"),
820
- doc: readNullableStringFieldFromFields(fields, "symbol_doc"),
821
- modifiers: readCodeModifiers(readNullableStringFieldFromFields(fields, "symbol_modifiers")),
822
- };
823
- }
824
- if (kind === "markdown") {
825
- return {
826
- kind: "markdown",
827
- heading: readNullableStringFieldFromFields(fields, "heading"),
828
- level: readNullableNumberFieldFromFields(fields, "heading_level"),
829
- scope: readNullableStringFieldFromFields(fields, "symbol_scope"),
830
- };
831
- }
832
- return undefined;
833
- }
834
- function readCodeModifiers(value) {
835
- if (!value) {
836
- return [];
837
- }
838
- return value
839
- .split(/\s+/)
840
- .filter((item) => item === "exported" ||
841
- item === "async" ||
842
- item === "static" ||
843
- item === "public" ||
844
- item === "private" ||
845
- item === "protected" ||
846
- item === "internal");
847
- }
848
- function parseRange(value) {
849
- return JSON.parse(value);
850
- }
851
- function docsToHits(docs, path, storage) {
852
- const hits = [];
853
- for (const doc of docs) {
854
- const stored = storage.docToStoredFragment(doc);
855
- if (stored) {
856
- hits.push({
857
- ...stored,
858
- path,
859
- score: doc.score,
860
- });
861
- }
862
- }
863
- return hits;
864
- }
865
- function assertZvecStatusOrNotFound(status, operation, context) {
866
- if (status.ok || status.code === "ZVEC_NOT_FOUND") {
867
- return;
868
- }
869
- assertZvecStatus(status, operation, context);
870
- }
871
- function readStringField(doc, field) {
872
- return readStringFieldFromFields(doc.fields, field);
873
- }
874
- function readStringFieldFromFields(fields, field) {
875
- const value = fields[field];
876
- if (typeof value === "string") {
877
- return value;
878
- }
879
- if (value === null || value === undefined) {
880
- return "";
881
- }
882
- return String(value);
883
- }
884
- function readNumberFieldFromFields(fields, field) {
885
- const value = fields[field];
886
- if (typeof value === "number" && Number.isFinite(value)) {
887
- return value;
888
- }
889
- if (typeof value === "string" && value.length > 0) {
890
- const parsed = Number.parseInt(value, 10);
891
- if (Number.isFinite(parsed)) {
892
- return parsed;
893
- }
894
- }
895
- return 0;
896
- }
897
- function readBooleanFieldFromFields(fields, field) {
898
- const value = fields[field];
899
- if (typeof value === "boolean") {
900
- return value;
901
- }
902
- if (typeof value === "string") {
903
- return value === "true";
904
- }
905
- return Boolean(value);
906
- }
907
- function readNullableStringFieldFromFields(fields, field) {
908
- const value = fields[field];
909
- if (value === null || value === undefined || value === "") {
910
- return null;
911
- }
912
- return String(value);
913
- }
914
- function readNullableNumberFieldFromFields(fields, field) {
915
- const value = fields[field];
916
- if (typeof value === "number" && Number.isFinite(value)) {
917
- return value <= 0 ? null : value;
918
- }
919
- if (typeof value === "string" && value.length > 0) {
920
- const parsed = Number.parseInt(value, 10);
921
- return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
922
- }
923
- return null;
924
- }
925
- function parseStringArray(value) {
926
- try {
927
- const parsed = JSON.parse(value);
928
- return Array.isArray(parsed)
929
- ? parsed.filter((item) => typeof item === "string")
930
- : [];
931
- }
932
- catch {
933
- return [];
934
- }
935
- }
936
- function assertZvecStatus(status, operation, context) {
937
- if (status.ok) {
938
- return;
939
- }
940
- throw new EngineError("zvec metadata operation failed", {
941
- code: "ZVEC_GREP.ENGINE.STORAGE.ZVEC_META_OPERATION_FAILED",
942
- context: `${operation}: ${context} code=${status.code} message=${status.message}`,
943
- });
944
- }
945
- function buildFilter(filter) {
946
- if (!filter) {
947
- return undefined;
948
- }
949
- const clauses = [];
950
- if (filter.fileIds) {
951
- clauses.push(buildNonEmptyInFilter("file_id", filter.fileIds));
952
- }
953
- if (filter.groupIds) {
954
- clauses.push(buildNonEmptyInFilter("group", filter.groupIds));
955
- }
956
- if (filter.symbolNames) {
957
- clauses.push(buildNonEmptyInFilter("symbol_name", filter.symbolNames));
958
- }
959
- if (filter.symbolTypes) {
960
- clauses.push(buildNonEmptyInFilter("symbol_type", filter.symbolTypes));
961
- }
962
- return clauses.length > 0 ? clauses.join(" AND ") : undefined;
963
- }
964
- function buildNonEmptyInFilter(field, values) {
965
- return values.length > 0 ? buildInFilter(field, values) : NO_MATCH_FILTER;
966
- }
967
- function buildInFilter(field, values) {
968
- if (values.length === 1) {
969
- return `${field} = ${quoteFilterString(values[0])}`;
970
- }
971
- return `(${values.map((value) => `${field} = ${quoteFilterString(value)}`).join(" OR ")})`;
972
- }
973
- function quoteFilterString(value) {
974
- return `'${value.replaceAll("\\", "\\\\").replaceAll("'", "\\'")}'`;
975
- }
976
- //# sourceMappingURL=zvec.js.map