@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,1061 +0,0 @@
1
- import { lstat, readFile } from "node:fs/promises";
2
- import { workspaceIndexDetail, detail, EngineError, errorDetails, isEngineError, } from "../../errors.js";
3
- import { sha256Bytes } from "../../utils/hash.js";
4
- import { normalizePath } from "../../utils/path.js";
5
- import { ConcurrentTiming, TimingCollector } from "../../utils/timing.js";
6
- import { extractForIndexing, vectorContentForFragment, } from "../../extraction/index.js";
7
- import { scanDirectoryPath, scanFilePath, scanRootPaths, } from "./scanner/index.js";
8
- import { indexChunkOptions } from "./input-budget.js";
9
- const EMBEDDING_TRANSIENT_MAX_RETRIES = 3;
10
- const EMBEDDING_RATE_LIMIT_MAX_RETRIES = 6;
11
- const EMBEDDING_TRANSIENT_RETRY_BASE_DELAY_MS = 500;
12
- const EMBEDDING_RATE_LIMIT_RETRY_BASE_DELAY_MS = 2000;
13
- const EMBEDDING_TRANSIENT_RETRY_MAX_DELAY_MS = 8000;
14
- const EMBEDDING_RATE_LIMIT_RETRY_MAX_DELAY_MS = 30000;
15
- const EMBEDDING_RETRY_JITTER_MS = 500;
16
- const EMBEDDING_SUCCESS_STREAK_MIN = 4;
17
- export async function indexWorkspace(ctx) {
18
- try {
19
- return await indexWorkspaceUnchecked(ctx);
20
- }
21
- catch (error) {
22
- throw toEngineError(error, "Indexing workspace failed", {
23
- code: "ZVEC_GREP.ENGINE.INDEXING.WORKSPACE_FAILED",
24
- context: workspaceIndexContext(ctx.workspaceIndex),
25
- });
26
- }
27
- }
28
- export async function indexWorkspacePaths(ctx, changedPaths) {
29
- try {
30
- return await indexWorkspacePathsUnchecked(ctx, changedPaths);
31
- }
32
- catch (error) {
33
- throw toEngineError(error, "Indexing changed paths failed", {
34
- code: "ZVEC_GREP.ENGINE.INDEXING.WORKSPACE_FAILED",
35
- context: workspaceIndexContext(ctx.workspaceIndex),
36
- });
37
- }
38
- }
39
- export async function getWorkspaceIndexStatus(workspaceIndex, storedFiles) {
40
- try {
41
- const scan = await scanRootPaths(workspaceIndex.id, workspaceIndex.rootPaths, { knownFiles: storedFiles });
42
- const diff = await computeDiffFromFiles(scan.files, storedFiles);
43
- const pendingFiles = storedFiles.filter((file) => file.indexStatus?.indexedTime === null);
44
- const failedFiles = pendingFiles.filter((file) => file.indexStatus?.error !== undefined);
45
- const indexedFiles = storedFiles.filter((file) => file.indexStatus?.indexedTime !== undefined &&
46
- file.indexStatus.indexedTime !== null);
47
- const entitiesIndexed = indexedFiles.reduce((count, file) => count + (file.indexStatus?.entityCount ?? 0), 0);
48
- const fragmentsTruncated = indexedFiles.reduce((count, file) => count + (file.indexStatus?.truncatedFragmentCount ?? 0), 0);
49
- return {
50
- filesScanned: scan.files.length,
51
- filesStored: storedFiles.length,
52
- filesIndexed: indexedFiles.length,
53
- entitiesIndexed,
54
- fragmentsTruncated,
55
- filesPending: pendingFiles.length,
56
- filesFailed: failedFiles.length,
57
- filesAdded: diff.added.length,
58
- filesModified: diff.modified.length,
59
- filesDeleted: diff.deleted.length,
60
- filesUnchanged: diff.unchanged.length,
61
- pendingFiles,
62
- failedFiles,
63
- addedFiles: diff.added,
64
- modifiedFiles: diff.modified,
65
- deletedFiles: diff.deleted,
66
- };
67
- }
68
- catch (error) {
69
- throw toEngineError(error, "Inspecting workspace index status failed", {
70
- code: "ZVEC_GREP.ENGINE.INDEXING.STATUS_FAILED",
71
- context: workspaceIndexContext(workspaceIndex),
72
- });
73
- }
74
- }
75
- async function indexWorkspaceUnchecked(ctx) {
76
- const start = Date.now();
77
- const report = ctx.onProgress ?? (() => undefined);
78
- const timings = new TimingCollector();
79
- throwIfIndexCancelled(ctx);
80
- const firstPass = await runIndexPass(ctx, report, "Scanning files...", timings);
81
- const passes = [firstPass];
82
- let progressBase;
83
- if (firstPass.stats.filesFailed > 0) {
84
- const failed = firstPass.stats.filesFailed;
85
- progressBase = retryProgressBase(firstPass);
86
- report({
87
- phase: "scanning",
88
- filesTotal: progressBase.filesTotal,
89
- filesIndexed: progressBase.filesSucceeded,
90
- detail: `Retrying ${failed} failed ${failed === 1 ? "file" : "files"}...`,
91
- });
92
- passes.push(await runIndexPass(ctx, report, "Scanning retry candidates...", timings, progressBase));
93
- }
94
- const finalPass = passes[passes.length - 1];
95
- throwIfIndexCancelled(ctx);
96
- reportIndexFinalizing(ctx, report, finalPass, progressBase);
97
- await timings.time("index_optimize", () => optimizeStorage(ctx));
98
- const result = buildIndexResult(ctx, passes, Date.now() - start, timings);
99
- if (result.filesFailed > 0) {
100
- report({ phase: "done", detail: "Indexing completed with failed files" });
101
- throw new EngineError(`Indexing completed with ${result.filesFailed} failed ${result.filesFailed === 1 ? "file" : "files"}`, {
102
- code: "ZVEC_GREP.ENGINE.INDEXING.FILES_FAILED",
103
- context: errorDetails([
104
- workspaceIndexDetail(ctx.workspaceIndex.name),
105
- detail("filesFailed", result.filesFailed),
106
- detail("filesScanned", result.filesScanned),
107
- detail("failedFiles", summarizeFailedFiles(finalPass.stats.failedFiles)),
108
- detail("failedReasons", summarizeFailedFiles(finalPass.stats.failedFileReasons)),
109
- detail("hint", passes.length > 1
110
- ? "Retried failed files once automatically; if failures persist, fix the failed files or embedding configuration."
111
- : "If the failure was transient, rerun the same indexing command; if it persists, fix the failed files or embedding configuration."),
112
- ]),
113
- });
114
- }
115
- report({ phase: "done", detail: "Indexing complete" });
116
- return result;
117
- }
118
- async function indexWorkspacePathsUnchecked(ctx, changedPaths) {
119
- const start = Date.now();
120
- const report = ctx.onProgress ?? (() => undefined);
121
- const timings = new TimingCollector();
122
- const normalizedPaths = [...new Set(changedPaths.map(normalizePath))];
123
- throwIfIndexCancelled(ctx);
124
- const firstPass = await runPathIndexPass(ctx, report, normalizedPaths, timings);
125
- const passes = [firstPass];
126
- let progressBase;
127
- if (firstPass.stats.filesFailed > 0) {
128
- progressBase = retryProgressBase(firstPass);
129
- passes.push(await runPathIndexPass(ctx, report, normalizedPaths, timings, progressBase));
130
- }
131
- const finalPass = passes[passes.length - 1];
132
- throwIfIndexCancelled(ctx);
133
- reportIndexFinalizing(ctx, report, finalPass, progressBase);
134
- await timings.time("index_optimize", () => optimizeStorage(ctx));
135
- const result = buildIndexResult(ctx, passes, Date.now() - start, timings);
136
- if (result.filesFailed > 0) {
137
- throw new EngineError(`Indexing completed with ${result.filesFailed} failed files`, {
138
- code: "ZVEC_GREP.ENGINE.INDEXING.FILES_FAILED",
139
- context: workspaceIndexContext(ctx.workspaceIndex),
140
- });
141
- }
142
- report({ phase: "done", detail: "Indexing complete" });
143
- return result;
144
- }
145
- async function runPathIndexPass(ctx, report, changedPaths, timings, progressBase) {
146
- reportScanning(report, "Scanning changed paths...", progressBase);
147
- const scanned = await timings.time("index_scan_paths", async () => {
148
- const files = [];
149
- const diagnostics = emptyScanDiagnostics();
150
- for (const path of changedPaths) {
151
- throwIfIndexCancelled(ctx);
152
- const info = await lstat(path).catch(() => null);
153
- const scan = info?.isDirectory()
154
- ? await scanDirectoryPath(ctx.workspaceIndex.id, ctx.workspaceIndex.rootPaths, path, { signal: ctx.signal })
155
- : await scanFilePath(ctx.workspaceIndex.id, ctx.workspaceIndex.rootPaths, path, {
156
- signal: ctx.signal,
157
- });
158
- files.push(...scan.files);
159
- mergeScanDiagnostics(diagnostics, scan.diagnostics);
160
- }
161
- return {
162
- files: [...new Map(files.map((file) => [file.id, file])).values()],
163
- diagnostics,
164
- };
165
- });
166
- throwIfIndexCancelled(ctx);
167
- const exactExisting = [];
168
- const prefixPaths = [];
169
- for (const path of changedPaths) {
170
- const exact = ctx.storage.getFileByPath(path);
171
- if (exact) {
172
- exactExisting.push(exact);
173
- }
174
- else {
175
- prefixPaths.push(path);
176
- }
177
- }
178
- const existing = [
179
- ...new Map([
180
- ...exactExisting,
181
- ...ctx.storage.listFilesByPathPrefixes(prefixPaths),
182
- ].map((file) => [file.id, file])).values(),
183
- ];
184
- return runDiffPass(ctx, report, scanned.files, existing, timings, progressBase, scanned.diagnostics);
185
- }
186
- async function runIndexPass(ctx, report, scanningDetail, timings, progressBase) {
187
- reportScanning(report, scanningDetail, progressBase);
188
- const existing = ctx.storage.listFiles();
189
- const scan = await timings.time("index_scan", () => scanRootPaths(ctx.workspaceIndex.id, ctx.workspaceIndex.rootPaths, {
190
- signal: ctx.signal,
191
- knownFiles: existing,
192
- }));
193
- throwIfIndexCancelled(ctx);
194
- return runDiffPass(ctx, report, scan.files, existing, timings, progressBase, scan.diagnostics);
195
- }
196
- async function runDiffPass(ctx, report, scannedFiles, existingFiles, timings, progressBase, scanDiagnostics = emptyScanDiagnostics()) {
197
- const diff = await timings.time("index_diff", () => computeDiffFromFiles(scannedFiles, existingFiles));
198
- throwIfIndexCancelled(ctx);
199
- const pending = [...diff.added, ...diff.modified, ...diff.pending];
200
- report({
201
- phase: "scanning",
202
- filesTotal: progressBase?.filesTotal ?? scannedFiles.length,
203
- filesIndexed: progressBase?.filesSucceeded ?? 0,
204
- detail: `${diff.added.length} added, ${diff.modified.length} modified, ${diff.pending.length} pending, ${diff.deleted.length} deleted, ${diff.unchanged.length} unchanged`,
205
- });
206
- timings.timeSync("index_delete_stale", () => {
207
- for (const file of diff.deleted) {
208
- throwIfIndexCancelled(ctx);
209
- try {
210
- ctx.storage.deleteFile(file.id);
211
- }
212
- catch (error) {
213
- throw toEngineError(error, "Indexing failed to delete stale file records", {
214
- code: "ZVEC_GREP.ENGINE.INDEXING.DELETE_FILE_FAILED",
215
- context: fileContext(file),
216
- });
217
- }
218
- }
219
- });
220
- const reportIndexing = (currentStats, detail, embedding) => {
221
- report({
222
- phase: "indexing",
223
- filesTotal: progressBase?.filesTotal ?? pending.length,
224
- filesIndexed: (progressBase?.filesSucceeded ?? 0) +
225
- currentStats.filesIndexed +
226
- currentStats.filesFailed,
227
- filesFailed: currentStats.filesFailed,
228
- detail,
229
- embedding,
230
- });
231
- };
232
- reportIndexing({
233
- filesIndexed: 0,
234
- filesFailed: 0,
235
- failedFiles: [],
236
- failedFileReasons: [],
237
- entitiesCreated: 0,
238
- });
239
- const stats = await indexFiles(pending, ctx, reportIndexing, timings);
240
- throwIfIndexCancelled(ctx);
241
- return {
242
- filesScanned: scannedFiles.length,
243
- scanDiagnostics,
244
- diff,
245
- stats,
246
- };
247
- }
248
- function reportIndexFinalizing(ctx, report, pass, progressBase) {
249
- report({
250
- phase: "indexing",
251
- filesTotal: progressBase?.filesTotal ??
252
- pass.diff.added.length +
253
- pass.diff.modified.length +
254
- pass.diff.pending.length,
255
- filesIndexed: (progressBase?.filesSucceeded ?? 0) +
256
- pass.stats.filesIndexed +
257
- pass.stats.filesFailed,
258
- filesFailed: pass.stats.filesFailed,
259
- detail: "finalizing index",
260
- });
261
- }
262
- function retryProgressBase(pass) {
263
- return {
264
- filesSucceeded: pass.stats.filesIndexed,
265
- filesTotal: pass.diff.added.length +
266
- pass.diff.modified.length +
267
- pass.diff.pending.length,
268
- };
269
- }
270
- function reportScanning(report, detail, progressBase) {
271
- report({
272
- phase: "scanning",
273
- ...(progressBase
274
- ? {
275
- filesTotal: progressBase.filesTotal,
276
- filesIndexed: progressBase.filesSucceeded,
277
- }
278
- : {}),
279
- detail,
280
- });
281
- }
282
- function buildIndexResult(ctx, passes, durationMs, timings) {
283
- const firstPass = passes[0];
284
- const retryPasses = passes.slice(1);
285
- const finalPass = passes[passes.length - 1];
286
- return {
287
- filesScanned: finalPass.filesScanned,
288
- filesAdded: firstPass.diff.added.length +
289
- retryPasses.reduce((count, pass) => count + pass.diff.added.length, 0),
290
- filesModified: firstPass.diff.modified.length +
291
- retryPasses.reduce((count, pass) => count + pass.diff.modified.length, 0),
292
- filesPending: firstPass.diff.pending.length +
293
- retryPasses.reduce((count, pass) => count + pass.diff.pending.length, 0),
294
- filesDeleted: firstPass.diff.deleted.length +
295
- retryPasses.reduce((count, pass) => count + pass.diff.deleted.length, 0),
296
- filesUnchanged: firstPass.diff.unchanged.length,
297
- filesFailed: finalPass.stats.filesFailed,
298
- entitiesCreated: passes.reduce((count, pass) => count + pass.stats.entitiesCreated, 0),
299
- durationMs,
300
- timings: timings.entries(),
301
- ...(finalPass.scanDiagnostics.skippedFiles > 0
302
- ? { scanDiagnostics: finalPass.scanDiagnostics }
303
- : {}),
304
- };
305
- }
306
- const MAX_SKIPPED_FILE_SAMPLES = 20;
307
- function emptyScanDiagnostics() {
308
- return {
309
- skippedFiles: 0,
310
- skippedByReason: {
311
- empty: 0,
312
- too_large: 0,
313
- unsupported: 0,
314
- binary: 0,
315
- },
316
- skippedSamples: [],
317
- };
318
- }
319
- function mergeScanDiagnostics(target, source) {
320
- target.skippedFiles += source.skippedFiles;
321
- for (const reason of [
322
- "empty",
323
- "too_large",
324
- "unsupported",
325
- "binary",
326
- ]) {
327
- target.skippedByReason[reason] += source.skippedByReason[reason];
328
- }
329
- const remaining = MAX_SKIPPED_FILE_SAMPLES - target.skippedSamples.length;
330
- if (remaining > 0) {
331
- target.skippedSamples.push(...source.skippedSamples.slice(0, remaining));
332
- }
333
- }
334
- async function optimizeStorage(ctx) {
335
- try {
336
- await ctx.storage.finalizeWrites();
337
- }
338
- catch (error) {
339
- throw toEngineError(error, "Indexing failed to finalize storage", {
340
- code: "ZVEC_GREP.ENGINE.INDEXING.OPTIMIZE_FAILED",
341
- context: workspaceIndexContext(ctx.workspaceIndex),
342
- });
343
- }
344
- }
345
- async function computeDiffFromFiles(scannedFiles, existingFiles) {
346
- const existingById = new Map(existingFiles.map((file) => [file.id, file]));
347
- const seen = new Set();
348
- const added = [];
349
- const modified = [];
350
- const pending = [];
351
- const unchanged = [];
352
- for (const file of scannedFiles) {
353
- seen.add(file.id);
354
- const existing = existingById.get(file.id);
355
- if (!existing) {
356
- added.push(await withContentHash(file));
357
- continue;
358
- }
359
- if (existing.indexStatus?.indexedTime === null) {
360
- pending.push(await withContentHash(file));
361
- continue;
362
- }
363
- if (existing.sizeBytes === file.sizeBytes &&
364
- existing.lastModifiedTime === file.lastModifiedTime &&
365
- existing.contentHash) {
366
- unchanged.push(existing);
367
- continue;
368
- }
369
- const hashed = await withContentHash(file);
370
- if (existing.sizeBytes === hashed.sizeBytes &&
371
- existing.contentHash === hashed.contentHash) {
372
- unchanged.push(existing);
373
- continue;
374
- }
375
- modified.push(hashed);
376
- }
377
- const deleted = [...existingById.values()].filter((file) => !seen.has(file.id));
378
- return { added, modified, pending, deleted, unchanged };
379
- }
380
- async function indexFiles(files, ctx, onProgress, timings) {
381
- const stats = {
382
- filesIndexed: 0,
383
- filesFailed: 0,
384
- failedFiles: [],
385
- failedFileReasons: [],
386
- entitiesCreated: 0,
387
- };
388
- const batchFiles = [];
389
- let batchFragmentCount = 0;
390
- const embeddingScheduler = createEmbeddingScheduler(ctx.embeddingConcurrency, ctx.embeddingModel);
391
- const embeddingTiming = new ConcurrentTiming(timings, "index_embedding");
392
- const runningEmbeddings = new Set();
393
- const reportEmbeddingProgress = (currentStats, detail) => {
394
- onProgress(currentStats, detail, embeddingScheduler.snapshot());
395
- };
396
- const flushBatch = async () => {
397
- throwIfIndexCancelled(ctx);
398
- if (batchFiles.length === 0) {
399
- return;
400
- }
401
- const filesToEmbed = batchFiles.splice(0);
402
- batchFragmentCount = 0;
403
- await scheduleEmbeddingTask(() => embedAndCommitBatch(filesToEmbed, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming));
404
- };
405
- const scheduleEmbeddingTask = async (task) => {
406
- throwIfIndexCancelled(ctx);
407
- const promise = task().finally(() => {
408
- runningEmbeddings.delete(promise);
409
- });
410
- runningEmbeddings.add(promise);
411
- if (runningEmbeddings.size >= embeddingScheduler.taskConcurrency) {
412
- await Promise.race(runningEmbeddings);
413
- }
414
- };
415
- try {
416
- for (const file of files) {
417
- throwIfIndexCancelled(ctx);
418
- onProgress(stats, `reading ${file.relativePath}`);
419
- const prepared = await timings.time("index_prepare", () => prepareFile(file, ctx));
420
- throwIfIndexCancelled(ctx);
421
- if ("failedReason" in prepared) {
422
- recordFileFailed(stats, file, prepared.failedReason);
423
- onProgress(stats, `failed ${file.relativePath}`);
424
- continue;
425
- }
426
- if (prepared.fragments.length === 0) {
427
- const committed = commitFile(prepared, [], ctx, stats);
428
- onProgress(stats, finishedFileDetail(committed, file.relativePath));
429
- continue;
430
- }
431
- if (prepared.fragments.length > ctx.embeddingModel.info.limits.maxBatchSize) {
432
- await flushBatch();
433
- await scheduleEmbeddingTask(async () => {
434
- throwIfIndexCancelled(ctx);
435
- reportEmbeddingProgress(stats, `embedding ${file.relativePath}`);
436
- await embedAndCommitFile(prepared, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming);
437
- });
438
- continue;
439
- }
440
- if (batchFragmentCount > 0 &&
441
- batchFragmentCount + prepared.fragments.length >
442
- ctx.embeddingModel.info.limits.maxBatchSize) {
443
- await flushBatch();
444
- }
445
- batchFiles.push(prepared);
446
- batchFragmentCount += prepared.fragments.length;
447
- if (batchFragmentCount === ctx.embeddingModel.info.limits.maxBatchSize) {
448
- await flushBatch();
449
- }
450
- }
451
- await flushBatch();
452
- await Promise.all(runningEmbeddings);
453
- }
454
- catch (error) {
455
- await Promise.allSettled(runningEmbeddings);
456
- throw error;
457
- }
458
- throwIfIndexCancelled(ctx);
459
- return stats;
460
- }
461
- async function prepareFile(file, ctx) {
462
- try {
463
- throwIfIndexCancelled(ctx);
464
- const source = await readSource(file);
465
- const chunkOptions = indexChunkOptions(ctx.embeddingModel.info.limits.maxInputTokens, source.kind === "text" ? source.text : undefined);
466
- const extracted = await extractForIndexing(source, chunkOptions);
467
- throwIfIndexCancelled(ctx);
468
- const fragments = extracted
469
- .filter(({ fragment }) => ctx.embeddingModel.info.inputKinds.includes(fragment.content.kind))
470
- .map(({ fragment, embeddingSource }) => ({
471
- fragment,
472
- embeddingContent: vectorContentForFragment(fragment, embeddingSource, chunkOptions.maxChunkChars),
473
- }));
474
- return { file, fragments };
475
- }
476
- catch (error) {
477
- if (indexIsCancelled(ctx)) {
478
- throw indexCancellationError(ctx);
479
- }
480
- return {
481
- file,
482
- failedReason: markFileFailed(ctx, file, error, "prepare"),
483
- };
484
- }
485
- }
486
- async function embedAndCommitBatch(files, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming) {
487
- try {
488
- throwIfIndexCancelled(ctx);
489
- const contents = files.flatMap((file) => file.fragments.map((fragment) => fragment.embeddingContent));
490
- onProgress(stats, `embedding ${describePreparedFiles(files)}`, embeddingScheduler.snapshot());
491
- const embedding = await embeddingTiming.time(() => embedContentsWithRetry(contents, ctx.embeddingModel, embeddingScheduler, ctx.signal, (progress) => reportModelDownloadProgress(stats, progress, onProgress, embeddingScheduler)));
492
- const truncatedInputIndexes = new Set(embedding.truncated);
493
- throwIfIndexCancelled(ctx);
494
- let offset = 0;
495
- for (const file of files) {
496
- throwIfIndexCancelled(ctx);
497
- const end = offset + file.fragments.length;
498
- const fileVectors = embedding.vectors.slice(offset, end);
499
- let truncatedFragmentCount = 0;
500
- for (let index = offset; index < end; index++) {
501
- if (truncatedInputIndexes.has(index)) {
502
- truncatedFragmentCount++;
503
- }
504
- }
505
- offset += file.fragments.length;
506
- const committed = timings.timeSync("index_commit", () => commitFile(file, fileVectors, ctx, stats, truncatedFragmentCount));
507
- onProgress(stats, finishedFileDetail(committed, file.file.relativePath));
508
- }
509
- }
510
- catch (error) {
511
- if (indexIsCancelled(ctx)) {
512
- throw indexCancellationError(ctx);
513
- }
514
- if (isRetryableEmbeddingError(error)) {
515
- for (const file of files) {
516
- const reason = markFileFailed(ctx, file.file, error, "embed");
517
- recordFileFailed(stats, file.file, reason);
518
- onProgress(stats, finishedFileDetail(false, file.file.relativePath));
519
- }
520
- return;
521
- }
522
- for (const file of files) {
523
- onProgress(stats, `embedding ${file.file.relativePath}`, embeddingScheduler.snapshot());
524
- await embedAndCommitFile(file, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming);
525
- }
526
- }
527
- }
528
- async function embedAndCommitFile(file, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming) {
529
- try {
530
- throwIfIndexCancelled(ctx);
531
- const embedding = await embeddingTiming.time(() => embedFragments(file.fragments, ctx.embeddingModel, embeddingScheduler, ctx.signal, (progress) => reportModelDownloadProgress(stats, progress, onProgress, embeddingScheduler)));
532
- throwIfIndexCancelled(ctx);
533
- const committed = timings.timeSync("index_commit", () => commitFile(file, embedding.vectors, ctx, stats, embedding.truncated.length));
534
- onProgress(stats, finishedFileDetail(committed, file.file.relativePath));
535
- }
536
- catch (error) {
537
- if (indexIsCancelled(ctx)) {
538
- throw indexCancellationError(ctx);
539
- }
540
- const reason = markFileFailed(ctx, file.file, error, "embed");
541
- recordFileFailed(stats, file.file, reason);
542
- onProgress(stats, finishedFileDetail(false, file.file.relativePath));
543
- }
544
- }
545
- function commitFile(file, vectors, ctx, stats, truncatedFragmentCount = 0) {
546
- try {
547
- throwIfIndexCancelled(ctx);
548
- if (file.fragments.length !== vectors.length) {
549
- throw new EngineError("Embedding returned mismatched entity/vector counts", {
550
- code: "ZVEC_GREP.ENGINE.STORAGE.ENTITY_VECTOR_COUNT_MISMATCH",
551
- context: `fileId=${file.file.id} fragmentCount=${file.fragments.length} vectorCount=${vectors.length}`,
552
- });
553
- }
554
- ctx.storage.replaceFile(file.file, file.fragments.map(({ fragment }, index) => ({
555
- fragment,
556
- vector: vectors[index],
557
- })), {
558
- truncatedFragmentCount,
559
- });
560
- stats.filesIndexed++;
561
- stats.entitiesCreated += countPublicEntities(file.fragments.map(({ fragment }) => fragment));
562
- return true;
563
- }
564
- catch (error) {
565
- if (indexIsCancelled(ctx)) {
566
- throw indexCancellationError(ctx);
567
- }
568
- const reason = markFileFailed(ctx, file.file, error, "commit");
569
- recordFileFailed(stats, file.file, reason);
570
- return false;
571
- }
572
- }
573
- function throwIfIndexCancelled(ctx) {
574
- if (!indexIsCancelled(ctx)) {
575
- return;
576
- }
577
- throw indexCancellationError(ctx);
578
- }
579
- function indexIsCancelled(ctx) {
580
- return ctx.signal?.aborted === true;
581
- }
582
- function indexCancellationError(ctx) {
583
- return ctx.signal?.reason instanceof Error
584
- ? ctx.signal.reason
585
- : new EngineError("Indexing was cancelled.", {
586
- code: "ZVEC_GREP.ENGINE.INDEXING.CANCELLED",
587
- context: workspaceIndexContext(ctx.workspaceIndex),
588
- });
589
- }
590
- function recordFileFailed(stats, file, reason) {
591
- stats.filesFailed++;
592
- stats.failedFiles.push(file.relativePath);
593
- if (reason) {
594
- stats.failedFileReasons.push(`${file.relativePath}: ${reason}`);
595
- }
596
- }
597
- function summarizeFailedFiles(files) {
598
- const shown = files.slice(0, 5);
599
- const remaining = files.length - shown.length;
600
- return remaining > 0
601
- ? `${shown.join(", ")} and ${remaining} more`
602
- : shown.join(", ");
603
- }
604
- function describePreparedFiles(files) {
605
- if (files.length === 0) {
606
- return "0 files";
607
- }
608
- if (files.length === 1) {
609
- return files[0].file.relativePath;
610
- }
611
- return `${files.length} files, starting with ${files[0].file.relativePath}`;
612
- }
613
- function finishedFileDetail(succeeded, relativePath) {
614
- return succeeded ? `indexed ${relativePath}` : `failed ${relativePath}`;
615
- }
616
- async function readSource(file) {
617
- let bytes;
618
- try {
619
- bytes = await readFile(file.absolutePath);
620
- }
621
- catch (error) {
622
- throw toEngineError(error, "Indexing failed to read source file", {
623
- code: "ZVEC_GREP.ENGINE.INDEXING.READ_SOURCE_FAILED",
624
- context: fileContext(file),
625
- });
626
- }
627
- if (file.kind === "image") {
628
- return {
629
- kind: "image",
630
- file,
631
- data: bytes,
632
- format: file.format,
633
- };
634
- }
635
- return {
636
- kind: "text",
637
- file,
638
- text: bytes.toString("utf8"),
639
- };
640
- }
641
- async function embedFragments(fragments, model, embeddingScheduler, signal, onModelProgress) {
642
- const batches = [];
643
- for (let start = 0; start < fragments.length; start += model.info.limits.maxBatchSize) {
644
- const batch = fragments.slice(start, start + model.info.limits.maxBatchSize);
645
- batches.push({ start, fragments: batch });
646
- }
647
- const vectors = new Array(fragments.length);
648
- const truncatedInputIndexes = [];
649
- const results = await Promise.allSettled(batches.map((batch) => embedFragmentBatch(batch.fragments, model, batch.start, embeddingScheduler, signal, onModelProgress)));
650
- let firstError;
651
- for (const [index, result] of results.entries()) {
652
- if (result.status === "rejected") {
653
- firstError ??= result.reason;
654
- continue;
655
- }
656
- const start = batches[index].start;
657
- for (const [offset, vector] of result.value.vectors.entries()) {
658
- vectors[start + offset] = vector;
659
- }
660
- truncatedInputIndexes.push(...result.value.truncated.map((inputIndex) => start + inputIndex));
661
- }
662
- if (firstError) {
663
- throw firstError;
664
- }
665
- return {
666
- vectors,
667
- truncated: truncatedInputIndexes,
668
- };
669
- }
670
- async function embedFragmentBatch(fragments, model, startIndex, embeddingScheduler, signal, onModelProgress) {
671
- const contents = fragments.map((fragment) => fragment.embeddingContent);
672
- try {
673
- return await embedContentsWithRetry(contents, model, embeddingScheduler, signal, onModelProgress);
674
- }
675
- catch (error) {
676
- if (fragments.length === 1 || isRetryableEmbeddingError(error)) {
677
- throw error;
678
- }
679
- return await embedFragmentBatchOneByOne(fragments, model, startIndex, embeddingScheduler, signal, onModelProgress);
680
- }
681
- }
682
- async function embedFragmentBatchOneByOne(fragments, model, startIndex, embeddingScheduler, signal, onModelProgress) {
683
- const vectors = [];
684
- const truncatedInputIndexes = [];
685
- for (const [index, fragment] of fragments.entries()) {
686
- try {
687
- const result = await embedContentsWithRetry([fragment.embeddingContent], model, embeddingScheduler, signal, onModelProgress);
688
- vectors.push(result.vectors[0]);
689
- if (result.truncated.length > 0) {
690
- truncatedInputIndexes.push(index);
691
- }
692
- }
693
- catch (error) {
694
- throw new EngineError("Embedding entity fragment failed after one-by-one fallback", {
695
- code: "ZVEC_GREP.ENGINE.INDEXING.EMBEDDING_FRAGMENT_FAILED",
696
- context: errorDetails([
697
- detail("model", model.info.reference),
698
- detail("fragmentId", fragment.fragment.id),
699
- detail("fragmentIndex", startIndex + index),
700
- isEngineError(error) ? detail("causeCode", error.code) : null,
701
- error instanceof Error ? detail("cause", error.message) : null,
702
- isEngineError(error) ? error.context : null,
703
- ]),
704
- cause: error,
705
- });
706
- }
707
- }
708
- return {
709
- vectors,
710
- truncated: truncatedInputIndexes,
711
- };
712
- }
713
- async function embedContentsWithRetry(contents, model, embeddingScheduler, signal, onModelProgress) {
714
- let attempt = 0;
715
- while (true) {
716
- let retry = nonRetryableEmbeddingError();
717
- let delayMs = 0;
718
- try {
719
- throwIfAborted(signal);
720
- const result = await embeddingScheduler.run(() => model.embed(contents, {
721
- purpose: "document",
722
- signal,
723
- onProgress: onModelProgress,
724
- }), signal, (error) => {
725
- retry = classifyEmbeddingRetry(error);
726
- delayMs = retryDelayMs(attempt, retry);
727
- if (retry.retryable) {
728
- embeddingScheduler.recordRetryableFailure({
729
- rateLimited: retry.rateLimited,
730
- delayMs,
731
- });
732
- }
733
- });
734
- embeddingScheduler.recordSuccess();
735
- return result;
736
- }
737
- catch (error) {
738
- if (signal?.aborted) {
739
- throw signal.reason instanceof Error
740
- ? signal.reason
741
- : new Error("Embedding was cancelled.");
742
- }
743
- if (!retry.retryable) {
744
- retry = classifyEmbeddingRetry(error);
745
- delayMs = retryDelayMs(attempt, retry);
746
- }
747
- if (attempt >= maxRetryAttempts(retry) || !retry.retryable) {
748
- throw error;
749
- }
750
- await abortableDelay(delayMs, signal);
751
- attempt++;
752
- }
753
- }
754
- }
755
- function reportModelDownloadProgress(stats, progress, onProgress, embeddingScheduler) {
756
- onProgress(stats, `downloading ${progress.model}`, {
757
- ...embeddingScheduler.snapshot(),
758
- ...progress,
759
- });
760
- }
761
- function createEmbeddingScheduler(requestedConcurrency, model) {
762
- return new AdaptiveEmbeddingScheduler(resolveEmbeddingConcurrencyPolicy(requestedConcurrency, model));
763
- }
764
- function resolveEmbeddingConcurrencyPolicy(requestedConcurrency, model) {
765
- if (requestedConcurrency !== undefined &&
766
- Number.isInteger(requestedConcurrency) &&
767
- requestedConcurrency > 0) {
768
- return {
769
- initial: requestedConcurrency,
770
- min: 1,
771
- max: requestedConcurrency,
772
- adaptive: requestedConcurrency > 1,
773
- };
774
- }
775
- const remote = model.info.provider === "qwen";
776
- const multimodal = model.info.inputKinds.includes("image");
777
- const configuredLocalDefault = model.info.defaultConcurrency;
778
- const localDefault = configuredLocalDefault !== undefined &&
779
- Number.isInteger(configuredLocalDefault) &&
780
- configuredLocalDefault > 0
781
- ? configuredLocalDefault
782
- : 1;
783
- const initial = remote ? (multimodal ? 4 : 8) : localDefault;
784
- const max = remote ? (multimodal ? 8 : 12) : localDefault;
785
- const min = Math.min(initial, 4);
786
- return {
787
- initial,
788
- min,
789
- max: Math.max(initial, max),
790
- adaptive: max > 1,
791
- };
792
- }
793
- class AdaptiveEmbeddingScheduler {
794
- policy;
795
- active = 0;
796
- cooldownUntil = 0;
797
- currentConcurrency;
798
- retryableFailures = 0;
799
- successStreak = 0;
800
- queue = [];
801
- constructor(policy) {
802
- this.policy = policy;
803
- this.currentConcurrency = policy.initial;
804
- }
805
- get taskConcurrency() {
806
- return this.policy.max;
807
- }
808
- async run(task, signal, onError) {
809
- throwIfAborted(signal);
810
- await this.waitForCooldown(signal);
811
- await this.acquire(signal);
812
- try {
813
- await this.waitForCooldown(signal);
814
- throwIfAborted(signal);
815
- return await task();
816
- }
817
- catch (error) {
818
- onError?.(error);
819
- throw error;
820
- }
821
- finally {
822
- this.release();
823
- }
824
- }
825
- recordSuccess() {
826
- if (!this.policy.adaptive || this.currentConcurrency >= this.policy.max) {
827
- return;
828
- }
829
- this.successStreak++;
830
- if (this.successStreak <
831
- Math.max(EMBEDDING_SUCCESS_STREAK_MIN, this.currentConcurrency * 2)) {
832
- return;
833
- }
834
- this.currentConcurrency++;
835
- this.successStreak = 0;
836
- this.drainQueue();
837
- }
838
- recordRetryableFailure(retry) {
839
- this.retryableFailures++;
840
- if (retry.rateLimited && retry.delayMs > 0) {
841
- this.cooldownUntil = Math.max(this.cooldownUntil, Date.now() + retry.delayMs);
842
- }
843
- if (!this.policy.adaptive) {
844
- return;
845
- }
846
- this.currentConcurrency = Math.max(this.policy.min, Math.floor(this.currentConcurrency / 2));
847
- this.successStreak = 0;
848
- }
849
- snapshot() {
850
- return {
851
- concurrency: this.currentConcurrency,
852
- maxConcurrency: this.policy.max,
853
- retryableFailures: this.retryableFailures,
854
- };
855
- }
856
- async waitForCooldown(signal) {
857
- const remaining = this.cooldownUntil - Date.now();
858
- if (remaining > 0) {
859
- await abortableDelay(remaining, signal);
860
- }
861
- }
862
- async acquire(signal) {
863
- throwIfAborted(signal);
864
- if (this.active < this.currentConcurrency) {
865
- this.active++;
866
- return;
867
- }
868
- await new Promise((resolve, reject) => {
869
- const queued = () => {
870
- signal?.removeEventListener("abort", abort);
871
- resolve();
872
- };
873
- const abort = () => {
874
- const index = this.queue.indexOf(queued);
875
- if (index >= 0) {
876
- this.queue.splice(index, 1);
877
- }
878
- reject(abortError(signal));
879
- };
880
- if (signal?.aborted) {
881
- reject(abortError(signal));
882
- return;
883
- }
884
- signal?.addEventListener("abort", abort, { once: true });
885
- this.queue.push(queued);
886
- });
887
- }
888
- release() {
889
- this.active--;
890
- this.drainQueue();
891
- }
892
- drainQueue() {
893
- while (this.active < this.currentConcurrency) {
894
- const resolve = this.queue.shift();
895
- if (!resolve) {
896
- return;
897
- }
898
- this.active++;
899
- resolve();
900
- }
901
- }
902
- }
903
- function oneLine(value) {
904
- return value.replace(/\s+/g, " ").trim();
905
- }
906
- function isRetryableEmbeddingError(error) {
907
- return classifyEmbeddingRetry(error).retryable;
908
- }
909
- function classifyEmbeddingRetry(error) {
910
- const message = errorToMessage(error);
911
- const context = isEngineError(error) && error.context ? ` ${error.context}` : "";
912
- const text = `${message}${context}`;
913
- const status = httpStatusFromText(text);
914
- const rateLimited = status === 429 ||
915
- /rate limit|quota exceeded|too many requests|request rate increased too quickly/i.test(text);
916
- const serverError = typeof status === "number" && status >= 500 && status <= 599;
917
- return {
918
- retryable: rateLimited || serverError,
919
- rateLimited,
920
- retryAfterMs: retryAfterMsFromText(text),
921
- };
922
- }
923
- function nonRetryableEmbeddingError() {
924
- return {
925
- retryable: false,
926
- rateLimited: false,
927
- };
928
- }
929
- function maxRetryAttempts(retry) {
930
- return retry.rateLimited
931
- ? EMBEDDING_RATE_LIMIT_MAX_RETRIES
932
- : EMBEDDING_TRANSIENT_MAX_RETRIES;
933
- }
934
- function retryDelayMs(attempt, retry) {
935
- if (typeof retry.retryAfterMs === "number") {
936
- return retry.retryAfterMs;
937
- }
938
- const base = retry.rateLimited
939
- ? EMBEDDING_RATE_LIMIT_RETRY_BASE_DELAY_MS
940
- : EMBEDDING_TRANSIENT_RETRY_BASE_DELAY_MS;
941
- const max = retry.rateLimited
942
- ? EMBEDDING_RATE_LIMIT_RETRY_MAX_DELAY_MS
943
- : EMBEDDING_TRANSIENT_RETRY_MAX_DELAY_MS;
944
- const exponential = base * 2 ** attempt;
945
- const jitter = Math.floor(Math.random() * EMBEDDING_RETRY_JITTER_MS);
946
- return Math.min(exponential + jitter, max);
947
- }
948
- function httpStatusFromText(text) {
949
- const match = /\bstatus=(\d{3})\b/i.exec(text);
950
- if (!match) {
951
- return undefined;
952
- }
953
- return Number(match[1]);
954
- }
955
- function retryAfterMsFromText(text) {
956
- const milliseconds = /\bretryAfterMs=(\d+)\b/i.exec(text);
957
- if (milliseconds) {
958
- return Number(milliseconds[1]);
959
- }
960
- const seconds = /\bretryAfter=(\d+(?:\.\d+)?)\b/i.exec(text);
961
- if (seconds) {
962
- return Math.round(Number(seconds[1]) * 1000);
963
- }
964
- return undefined;
965
- }
966
- function abortableDelay(ms, signal) {
967
- if (ms <= 0) {
968
- return Promise.resolve();
969
- }
970
- throwIfAborted(signal);
971
- return new Promise((resolve, reject) => {
972
- const timer = setTimeout(() => {
973
- signal?.removeEventListener("abort", abort);
974
- resolve();
975
- }, ms);
976
- const abort = () => {
977
- clearTimeout(timer);
978
- reject(abortError(signal));
979
- };
980
- signal?.addEventListener("abort", abort, { once: true });
981
- });
982
- }
983
- function throwIfAborted(signal) {
984
- if (signal?.aborted) {
985
- throw abortError(signal);
986
- }
987
- }
988
- function abortError(signal) {
989
- return signal?.reason instanceof Error
990
- ? signal.reason
991
- : new Error("Embedding was cancelled.");
992
- }
993
- function countPublicEntities(fragments) {
994
- let count = 0;
995
- for (const fragment of fragments) {
996
- if (!fragment.group || fragment.group === fragment.id) {
997
- count++;
998
- }
999
- }
1000
- return count;
1001
- }
1002
- async function withContentHash(file) {
1003
- let bytes;
1004
- try {
1005
- bytes = await readFile(file.absolutePath);
1006
- }
1007
- catch (error) {
1008
- throw toEngineError(error, "Indexing failed to compute file content hash", {
1009
- code: "ZVEC_GREP.ENGINE.INDEXING.CONTENT_HASH_FAILED",
1010
- context: fileContext(file),
1011
- });
1012
- }
1013
- return {
1014
- ...file,
1015
- contentHash: sha256Bytes(bytes),
1016
- };
1017
- }
1018
- function markFileFailed(ctx, file, error, stage) {
1019
- const reason = fileFailureReason(stage, error);
1020
- try {
1021
- ctx.storage.markFileFailed(file, reason);
1022
- return reason;
1023
- }
1024
- catch (markError) {
1025
- throw toEngineError(markError, "Indexing failed to record file failure", {
1026
- code: "ZVEC_GREP.ENGINE.INDEXING.MARK_FILE_FAILED",
1027
- context: `${fileContext(file)} stage=${stage} original=${reason}`,
1028
- });
1029
- }
1030
- }
1031
- function fileFailureReason(stage, error) {
1032
- return oneLine(`${stage}: ${errorToMessage(error)}`);
1033
- }
1034
- function toEngineError(error, message, options) {
1035
- if (isEngineError(error)) {
1036
- return error;
1037
- }
1038
- return new EngineError(message, {
1039
- ...options,
1040
- cause: error,
1041
- });
1042
- }
1043
- function workspaceIndexContext(workspaceIndex) {
1044
- return (errorDetails([
1045
- detail("workspace_index_id", workspaceIndex.id),
1046
- workspaceIndexDetail(workspaceIndex.name),
1047
- ]) ?? "");
1048
- }
1049
- function fileContext(file) {
1050
- return `fileId=${file.id} path=${file.relativePath}`;
1051
- }
1052
- function errorToMessage(error) {
1053
- if (isEngineError(error) && error.context) {
1054
- return `${error.code}: ${error.message} (${error.context})`;
1055
- }
1056
- if (isEngineError(error)) {
1057
- return `${error.code}: ${error.message}`;
1058
- }
1059
- return error instanceof Error ? error.message : String(error);
1060
- }
1061
- //# sourceMappingURL=index.js.map