@zvec/zvec-grep 0.2.2 → 0.3.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/README.md +87 -252
  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 -239
  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 -1210
  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 -742
  40. package/dist/cli/commands.js.map +0 -1
  41. package/dist/cli/errors.d.ts +0 -9
  42. package/dist/cli/errors.js +0 -131
  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 -83
  60. package/dist/cli/format/status.js +0 -530
  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 -528
  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 -34
  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 -337
  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 -1089
  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 -27
  99. package/dist/daemon/config.js +0 -107
  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 -73
  111. package/dist/daemon/job-scheduler.js +0 -434
  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 -197
  121. package/dist/daemon/root-lease.js.map +0 -1
  122. package/dist/daemon/root-runtime.d.ts +0 -80
  123. package/dist/daemon/root-runtime.js +0 -340
  124. package/dist/daemon/root-runtime.js.map +0 -1
  125. package/dist/daemon/runtime-manager.d.ts +0 -47
  126. package/dist/daemon/runtime-manager.js +0 -252
  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 -104
  130. package/dist/daemon/runtime.js.map +0 -1
  131. package/dist/daemon/server-controller.d.ts +0 -38
  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 -347
  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 -20
  147. package/dist/engine/errors.js +0 -51
  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/artifact-cache-lock.d.ts +0 -16
  240. package/dist/engine/models/artifact-cache-lock.js +0 -228
  241. package/dist/engine/models/artifact-cache-lock.js.map +0 -1
  242. package/dist/engine/models/artifact-downloader.d.ts +0 -77
  243. package/dist/engine/models/artifact-downloader.js +0 -766
  244. package/dist/engine/models/artifact-downloader.js.map +0 -1
  245. package/dist/engine/models/backends/llama-cpp.d.ts +0 -99
  246. package/dist/engine/models/backends/llama-cpp.js +0 -573
  247. package/dist/engine/models/backends/llama-cpp.js.map +0 -1
  248. package/dist/engine/models/backends/model2vec-runtime.d.ts +0 -63
  249. package/dist/engine/models/backends/model2vec-runtime.js +0 -112
  250. package/dist/engine/models/backends/model2vec-runtime.js.map +0 -1
  251. package/dist/engine/models/backends/model2vec-tokenizer.d.ts +0 -2
  252. package/dist/engine/models/backends/model2vec-tokenizer.js +0 -42
  253. package/dist/engine/models/backends/model2vec-tokenizer.js.map +0 -1
  254. package/dist/engine/models/backends/model2vec-worker-pool.d.ts +0 -25
  255. package/dist/engine/models/backends/model2vec-worker-pool.js +0 -264
  256. package/dist/engine/models/backends/model2vec-worker-pool.js.map +0 -1
  257. package/dist/engine/models/backends/model2vec-worker.d.ts +0 -1
  258. package/dist/engine/models/backends/model2vec-worker.js +0 -41
  259. package/dist/engine/models/backends/model2vec-worker.js.map +0 -1
  260. package/dist/engine/models/backends/model2vec.d.ts +0 -38
  261. package/dist/engine/models/backends/model2vec.js +0 -344
  262. package/dist/engine/models/backends/model2vec.js.map +0 -1
  263. package/dist/engine/models/backends/qwen.d.ts +0 -44
  264. package/dist/engine/models/backends/qwen.js +0 -411
  265. package/dist/engine/models/backends/qwen.js.map +0 -1
  266. package/dist/engine/models/backends/transformers-js.d.ts +0 -87
  267. package/dist/engine/models/backends/transformers-js.js +0 -360
  268. package/dist/engine/models/backends/transformers-js.js.map +0 -1
  269. package/dist/engine/models/catalog.d.ts +0 -490
  270. package/dist/engine/models/catalog.js +0 -522
  271. package/dist/engine/models/catalog.js.map +0 -1
  272. package/dist/engine/models/download-progress.d.ts +0 -16
  273. package/dist/engine/models/download-progress.js +0 -47
  274. package/dist/engine/models/download-progress.js.map +0 -1
  275. package/dist/engine/models/embeddings.d.ts +0 -69
  276. package/dist/engine/models/embeddings.js +0 -125
  277. package/dist/engine/models/embeddings.js.map +0 -1
  278. package/dist/engine/models/factory.d.ts +0 -2
  279. package/dist/engine/models/factory.js +0 -51
  280. package/dist/engine/models/factory.js.map +0 -1
  281. package/dist/engine/models/index.d.ts +0 -4
  282. package/dist/engine/models/index.js +0 -5
  283. package/dist/engine/models/index.js.map +0 -1
  284. package/dist/engine/models/ranking.d.ts +0 -19
  285. package/dist/engine/models/ranking.js +0 -2
  286. package/dist/engine/models/ranking.js.map +0 -1
  287. package/dist/engine/models/resolution.d.ts +0 -8
  288. package/dist/engine/models/resolution.js +0 -22
  289. package/dist/engine/models/resolution.js.map +0 -1
  290. package/dist/engine/pipeline/indexing/index.d.ts +0 -14
  291. package/dist/engine/pipeline/indexing/index.js +0 -1217
  292. package/dist/engine/pipeline/indexing/index.js.map +0 -1
  293. package/dist/engine/pipeline/indexing/input-budget.d.ts +0 -2
  294. package/dist/engine/pipeline/indexing/input-budget.js +0 -51
  295. package/dist/engine/pipeline/indexing/input-budget.js.map +0 -1
  296. package/dist/engine/pipeline/indexing/root-paths.d.ts +0 -7
  297. package/dist/engine/pipeline/indexing/root-paths.js +0 -148
  298. package/dist/engine/pipeline/indexing/root-paths.js.map +0 -1
  299. package/dist/engine/pipeline/indexing/scanner/index.d.ts +0 -14
  300. package/dist/engine/pipeline/indexing/scanner/index.js +0 -776
  301. package/dist/engine/pipeline/indexing/scanner/index.js.map +0 -1
  302. package/dist/engine/pipeline/search/index.d.ts +0 -12
  303. package/dist/engine/pipeline/search/index.js +0 -811
  304. package/dist/engine/pipeline/search/index.js.map +0 -1
  305. package/dist/engine/service/index.d.ts +0 -3
  306. package/dist/engine/service/index.js +0 -2
  307. package/dist/engine/service/index.js.map +0 -1
  308. package/dist/engine/service/lexical.d.ts +0 -28
  309. package/dist/engine/service/lexical.js +0 -446
  310. package/dist/engine/service/lexical.js.map +0 -1
  311. package/dist/engine/service/root.d.ts +0 -15
  312. package/dist/engine/service/root.js +0 -57
  313. package/dist/engine/service/root.js.map +0 -1
  314. package/dist/engine/service/structure-enrichment.d.ts +0 -8
  315. package/dist/engine/service/structure-enrichment.js +0 -178
  316. package/dist/engine/service/structure-enrichment.js.map +0 -1
  317. package/dist/engine/service/types.d.ts +0 -210
  318. package/dist/engine/service/types.js +0 -2
  319. package/dist/engine/service/types.js.map +0 -1
  320. package/dist/engine/service/workspace-index.d.ts +0 -26
  321. package/dist/engine/service/workspace-index.js +0 -157
  322. package/dist/engine/service/workspace-index.js.map +0 -1
  323. package/dist/engine/service/zvec-grep.d.ts +0 -13
  324. package/dist/engine/service/zvec-grep.js +0 -1393
  325. package/dist/engine/service/zvec-grep.js.map +0 -1
  326. package/dist/engine/storage/index.d.ts +0 -53
  327. package/dist/engine/storage/index.js +0 -3
  328. package/dist/engine/storage/index.js.map +0 -1
  329. package/dist/engine/storage/layout.d.ts +0 -10
  330. package/dist/engine/storage/layout.js +0 -29
  331. package/dist/engine/storage/layout.js.map +0 -1
  332. package/dist/engine/storage/zvec.d.ts +0 -4
  333. package/dist/engine/storage/zvec.js +0 -976
  334. package/dist/engine/storage/zvec.js.map +0 -1
  335. package/dist/engine/types.d.ts +0 -303
  336. package/dist/engine/types.js +0 -14
  337. package/dist/engine/types.js.map +0 -1
  338. package/dist/engine/utils/atomic-file.d.ts +0 -3
  339. package/dist/engine/utils/atomic-file.js +0 -39
  340. package/dist/engine/utils/atomic-file.js.map +0 -1
  341. package/dist/engine/utils/daemon-lease.d.ts +0 -17
  342. package/dist/engine/utils/daemon-lease.js +0 -175
  343. package/dist/engine/utils/daemon-lease.js.map +0 -1
  344. package/dist/engine/utils/file-selection.d.ts +0 -10
  345. package/dist/engine/utils/file-selection.js +0 -157
  346. package/dist/engine/utils/file-selection.js.map +0 -1
  347. package/dist/engine/utils/glob.d.ts +0 -9
  348. package/dist/engine/utils/glob.js +0 -208
  349. package/dist/engine/utils/glob.js.map +0 -1
  350. package/dist/engine/utils/hash.d.ts +0 -2
  351. package/dist/engine/utils/hash.js +0 -8
  352. package/dist/engine/utils/hash.js.map +0 -1
  353. package/dist/engine/utils/json.d.ts +0 -8
  354. package/dist/engine/utils/json.js +0 -83
  355. package/dist/engine/utils/json.js.map +0 -1
  356. package/dist/engine/utils/lock.d.ts +0 -19
  357. package/dist/engine/utils/lock.js +0 -254
  358. package/dist/engine/utils/lock.js.map +0 -1
  359. package/dist/engine/utils/path.d.ts +0 -4
  360. package/dist/engine/utils/path.js +0 -18
  361. package/dist/engine/utils/path.js.map +0 -1
  362. package/dist/engine/utils/timing.d.ts +0 -19
  363. package/dist/engine/utils/timing.js +0 -87
  364. package/dist/engine/utils/timing.js.map +0 -1
  365. package/dist/index-progress.d.ts +0 -10
  366. package/dist/index-progress.js +0 -159
  367. package/dist/index-progress.js.map +0 -1
  368. package/dist/index.d.ts +0 -6
  369. package/dist/index.js +0 -4
  370. package/dist/index.js.map +0 -1
  371. package/dist/mcp/http-transport.d.ts +0 -27
  372. package/dist/mcp/http-transport.js +0 -182
  373. package/dist/mcp/http-transport.js.map +0 -1
  374. package/dist/mcp/input-normalization.d.ts +0 -38
  375. package/dist/mcp/input-normalization.js +0 -104
  376. package/dist/mcp/input-normalization.js.map +0 -1
  377. package/dist/mcp/progress-heartbeat.d.ts +0 -17
  378. package/dist/mcp/progress-heartbeat.js +0 -46
  379. package/dist/mcp/progress-heartbeat.js.map +0 -1
  380. package/dist/mcp/request-metadata.d.ts +0 -2
  381. package/dist/mcp/request-metadata.js +0 -11
  382. package/dist/mcp/request-metadata.js.map +0 -1
  383. package/dist/mcp/request-state.d.ts +0 -40
  384. package/dist/mcp/request-state.js +0 -210
  385. package/dist/mcp/request-state.js.map +0 -1
  386. package/dist/mcp/result-format.d.ts +0 -13
  387. package/dist/mcp/result-format.js +0 -75
  388. package/dist/mcp/result-format.js.map +0 -1
  389. package/dist/mcp/schemas.d.ts +0 -668
  390. package/dist/mcp/schemas.js +0 -512
  391. package/dist/mcp/schemas.js.map +0 -1
  392. package/dist/mcp/stdio-bridge.d.ts +0 -15
  393. package/dist/mcp/stdio-bridge.js +0 -190
  394. package/dist/mcp/stdio-bridge.js.map +0 -1
  395. package/dist/mcp/tools.d.ts +0 -153
  396. package/dist/mcp/tools.js +0 -488
  397. package/dist/mcp/tools.js.map +0 -1
  398. package/dist/mcp/toolset.d.ts +0 -5
  399. package/dist/mcp/toolset.js +0 -12
  400. package/dist/mcp/toolset.js.map +0 -1
  401. package/dist/observability/trace-context.d.ts +0 -11
  402. package/dist/observability/trace-context.js +0 -138
  403. package/dist/observability/trace-context.js.map +0 -1
  404. package/dist/prompts/zvec-grep-guidance.d.ts +0 -2
  405. package/dist/prompts/zvec-grep-guidance.js +0 -9
  406. package/dist/prompts/zvec-grep-guidance.js.map +0 -1
  407. package/docs/01-agents.md +0 -209
  408. package/docs/02-cli.md +0 -247
  409. package/docs/03-mcp.md +0 -185
  410. package/docs/04-pipeline.md +0 -226
  411. package/docs/05-architecture.md +0 -86
  412. package/docs/06-server.md +0 -233
  413. package/docs/07-embedding.md +0 -209
  414. package/docs/08-roadmap.md +0 -85
  415. package/docs/README.md +0 -53
@@ -1,1217 +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
- const PERMANENT_REMOTE_MODEL_PROVIDER_CODES = new Set([
18
- "invalid_model",
19
- "model_not_found",
20
- "unsupported_model",
21
- "invalid_dimension",
22
- "invalid_dimensions",
23
- "unsupported_dimension",
24
- "unsupported_dimensions",
25
- "dimension_out_of_range",
26
- "invalid_embedding_dimension",
27
- "unsupported_embedding_dimension",
28
- ]);
29
- export async function indexWorkspace(ctx) {
30
- try {
31
- return await indexWorkspaceUnchecked(ctx);
32
- }
33
- catch (error) {
34
- throw toEngineError(error, "Indexing workspace failed", {
35
- code: "ZVEC_GREP.ENGINE.INDEXING.WORKSPACE_FAILED",
36
- context: workspaceIndexContext(ctx.workspaceIndex),
37
- });
38
- }
39
- }
40
- export async function indexWorkspacePaths(ctx, changedPaths) {
41
- try {
42
- return await indexWorkspacePathsUnchecked(ctx, changedPaths);
43
- }
44
- catch (error) {
45
- throw toEngineError(error, "Indexing changed paths failed", {
46
- code: "ZVEC_GREP.ENGINE.INDEXING.WORKSPACE_FAILED",
47
- context: workspaceIndexContext(ctx.workspaceIndex),
48
- });
49
- }
50
- }
51
- export async function getWorkspaceIndexStatus(workspaceIndex, storedFiles) {
52
- try {
53
- const scan = await scanRootPaths(workspaceIndex.id, workspaceIndex.rootPaths, { knownFiles: storedFiles });
54
- const diff = await computeDiffFromFiles(scan.files, storedFiles);
55
- const pendingFiles = storedFiles.filter((file) => file.indexStatus?.indexedTime === null);
56
- const failedFiles = pendingFiles.filter((file) => file.indexStatus?.error !== undefined);
57
- const indexedFiles = storedFiles.filter((file) => file.indexStatus?.indexedTime !== undefined &&
58
- file.indexStatus.indexedTime !== null);
59
- const entitiesIndexed = indexedFiles.reduce((count, file) => count + (file.indexStatus?.entityCount ?? 0), 0);
60
- const fragmentsTruncated = indexedFiles.reduce((count, file) => count + (file.indexStatus?.truncatedFragmentCount ?? 0), 0);
61
- return {
62
- filesScanned: scan.files.length,
63
- filesStored: storedFiles.length,
64
- filesIndexed: indexedFiles.length,
65
- entitiesIndexed,
66
- fragmentsTruncated,
67
- filesPending: pendingFiles.length,
68
- filesFailed: failedFiles.length,
69
- filesAdded: diff.added.length,
70
- filesModified: diff.modified.length,
71
- filesDeleted: diff.deleted.length,
72
- filesUnchanged: diff.unchanged.length,
73
- pendingFiles,
74
- failedFiles,
75
- addedFiles: diff.added,
76
- modifiedFiles: diff.modified,
77
- deletedFiles: diff.deleted,
78
- };
79
- }
80
- catch (error) {
81
- throw toEngineError(error, "Inspecting workspace index status failed", {
82
- code: "ZVEC_GREP.ENGINE.INDEXING.STATUS_FAILED",
83
- context: workspaceIndexContext(workspaceIndex),
84
- });
85
- }
86
- }
87
- async function indexWorkspaceUnchecked(ctx) {
88
- const start = Date.now();
89
- const report = ctx.onProgress ?? (() => undefined);
90
- const timings = new TimingCollector();
91
- throwIfIndexCancelled(ctx);
92
- const firstPass = await runIndexPass(ctx, report, "Scanning files...", timings);
93
- const passes = [firstPass];
94
- let progressBase;
95
- if (firstPass.stats.filesFailed > 0) {
96
- const failed = firstPass.stats.filesFailed;
97
- progressBase = retryProgressBase(firstPass);
98
- report({
99
- phase: "scanning",
100
- filesTotal: progressBase.filesTotal,
101
- filesIndexed: progressBase.filesSucceeded,
102
- detail: `Retrying ${failed} failed ${failed === 1 ? "file" : "files"}...`,
103
- });
104
- passes.push(await runIndexPass(ctx, report, "Scanning retry candidates...", timings, progressBase));
105
- }
106
- const finalPass = passes[passes.length - 1];
107
- throwIfIndexCancelled(ctx);
108
- reportIndexFinalizing(ctx, report, finalPass, progressBase);
109
- await timings.time("index_optimize", () => optimizeStorage(ctx));
110
- const result = buildIndexResult(ctx, passes, Date.now() - start, timings);
111
- if (result.filesFailed > 0) {
112
- report({ phase: "done", detail: "Indexing completed with failed files" });
113
- throw filesFailedError(ctx, result, finalPass, passes.length);
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 filesFailedError(ctx, result, finalPass, passes.length);
138
- }
139
- report({ phase: "done", detail: "Indexing complete" });
140
- return result;
141
- }
142
- function filesFailedError(ctx, result, finalPass, passCount) {
143
- return new EngineError(`Indexing completed with ${result.filesFailed} failed ${result.filesFailed === 1 ? "file" : "files"}`, {
144
- code: "ZVEC_GREP.ENGINE.INDEXING.FILES_FAILED",
145
- context: errorDetails([
146
- workspaceIndexDetail(ctx.workspaceIndex.name),
147
- detail("filesFailed", result.filesFailed),
148
- detail("filesScanned", result.filesScanned),
149
- detail("failedFiles", summarizeFailedFiles(finalPass.stats.failedFiles)),
150
- detail("failedReasons", summarizeFailedFiles(finalPass.stats.failedFileReasons)),
151
- detail("hint", passCount > 1
152
- ? "Retried failed files once automatically; if failures persist, fix the failed files or embedding configuration."
153
- : "If the failure was transient, rerun the same indexing command; if it persists, fix the failed files or embedding configuration."),
154
- ]),
155
- });
156
- }
157
- async function runPathIndexPass(ctx, report, changedPaths, timings, progressBase) {
158
- reportScanning(report, "Scanning changed paths...", progressBase);
159
- const scanned = await timings.time("index_scan_paths", async () => {
160
- const files = [];
161
- const diagnostics = emptyScanDiagnostics();
162
- for (const path of changedPaths) {
163
- throwIfIndexCancelled(ctx);
164
- const info = await lstat(path).catch(() => null);
165
- const scan = info?.isDirectory()
166
- ? await scanDirectoryPath(ctx.workspaceIndex.id, ctx.workspaceIndex.rootPaths, path, { signal: ctx.signal })
167
- : await scanFilePath(ctx.workspaceIndex.id, ctx.workspaceIndex.rootPaths, path, {
168
- signal: ctx.signal,
169
- });
170
- files.push(...scan.files);
171
- mergeScanDiagnostics(diagnostics, scan.diagnostics);
172
- }
173
- return {
174
- files: [...new Map(files.map((file) => [file.id, file])).values()],
175
- diagnostics,
176
- };
177
- });
178
- throwIfIndexCancelled(ctx);
179
- const exactExisting = [];
180
- const prefixPaths = [];
181
- for (const path of changedPaths) {
182
- const exact = ctx.storage.getFileByPath(path);
183
- if (exact) {
184
- exactExisting.push(exact);
185
- }
186
- else {
187
- prefixPaths.push(path);
188
- }
189
- }
190
- const existing = [
191
- ...new Map([
192
- ...exactExisting,
193
- ...ctx.storage.listFilesByPathPrefixes(prefixPaths),
194
- ].map((file) => [file.id, file])).values(),
195
- ];
196
- return runDiffPass(ctx, report, scanned.files, existing, timings, progressBase, scanned.diagnostics);
197
- }
198
- async function runIndexPass(ctx, report, scanningDetail, timings, progressBase) {
199
- reportScanning(report, scanningDetail, progressBase);
200
- const existing = ctx.storage.listFiles();
201
- const scan = await timings.time("index_scan", () => scanRootPaths(ctx.workspaceIndex.id, ctx.workspaceIndex.rootPaths, {
202
- signal: ctx.signal,
203
- knownFiles: existing,
204
- }));
205
- throwIfIndexCancelled(ctx);
206
- return runDiffPass(ctx, report, scan.files, existing, timings, progressBase, scan.diagnostics);
207
- }
208
- async function runDiffPass(ctx, report, scannedFiles, existingFiles, timings, progressBase, scanDiagnostics = emptyScanDiagnostics()) {
209
- const diff = await timings.time("index_diff", () => computeDiffFromFiles(scannedFiles, existingFiles));
210
- throwIfIndexCancelled(ctx);
211
- const pending = [...diff.added, ...diff.modified, ...diff.pending];
212
- report({
213
- phase: "scanning",
214
- filesTotal: progressBase?.filesTotal ?? scannedFiles.length,
215
- filesIndexed: progressBase?.filesSucceeded ?? 0,
216
- detail: `${diff.added.length} added, ${diff.modified.length} modified, ${diff.pending.length} pending, ${diff.deleted.length} deleted, ${diff.unchanged.length} unchanged`,
217
- });
218
- timings.timeSync("index_delete_stale", () => {
219
- for (const file of diff.deleted) {
220
- throwIfIndexCancelled(ctx);
221
- try {
222
- ctx.storage.deleteFile(file.id);
223
- }
224
- catch (error) {
225
- throw toEngineError(error, "Indexing failed to delete stale file records", {
226
- code: "ZVEC_GREP.ENGINE.INDEXING.DELETE_FILE_FAILED",
227
- context: fileContext(file),
228
- });
229
- }
230
- }
231
- });
232
- const reportIndexing = (currentStats, detail, embedding) => {
233
- report({
234
- phase: "indexing",
235
- filesTotal: progressBase?.filesTotal ?? pending.length,
236
- filesIndexed: (progressBase?.filesSucceeded ?? 0) +
237
- currentStats.filesIndexed +
238
- currentStats.filesFailed,
239
- filesFailed: currentStats.filesFailed,
240
- detail,
241
- embedding,
242
- });
243
- };
244
- reportIndexing({
245
- filesIndexed: 0,
246
- filesFailed: 0,
247
- failedFiles: [],
248
- failedFileReasons: [],
249
- entitiesCreated: 0,
250
- });
251
- const stats = await indexFiles(pending, ctx, reportIndexing, timings);
252
- throwIfIndexCancelled(ctx);
253
- return {
254
- filesScanned: scannedFiles.length,
255
- scanDiagnostics,
256
- diff,
257
- stats,
258
- };
259
- }
260
- function reportIndexFinalizing(ctx, report, pass, progressBase) {
261
- report({
262
- phase: "indexing",
263
- filesTotal: progressBase?.filesTotal ??
264
- pass.diff.added.length +
265
- pass.diff.modified.length +
266
- pass.diff.pending.length,
267
- filesIndexed: (progressBase?.filesSucceeded ?? 0) +
268
- pass.stats.filesIndexed +
269
- pass.stats.filesFailed,
270
- filesFailed: pass.stats.filesFailed,
271
- detail: "finalizing index",
272
- });
273
- }
274
- function retryProgressBase(pass) {
275
- return {
276
- filesSucceeded: pass.stats.filesIndexed,
277
- filesTotal: pass.diff.added.length +
278
- pass.diff.modified.length +
279
- pass.diff.pending.length,
280
- };
281
- }
282
- function reportScanning(report, detail, progressBase) {
283
- report({
284
- phase: "scanning",
285
- ...(progressBase
286
- ? {
287
- filesTotal: progressBase.filesTotal,
288
- filesIndexed: progressBase.filesSucceeded,
289
- }
290
- : {}),
291
- detail,
292
- });
293
- }
294
- function buildIndexResult(ctx, passes, durationMs, timings) {
295
- const firstPass = passes[0];
296
- const retryPasses = passes.slice(1);
297
- const finalPass = passes[passes.length - 1];
298
- return {
299
- filesScanned: finalPass.filesScanned,
300
- filesAdded: firstPass.diff.added.length +
301
- retryPasses.reduce((count, pass) => count + pass.diff.added.length, 0),
302
- filesModified: firstPass.diff.modified.length +
303
- retryPasses.reduce((count, pass) => count + pass.diff.modified.length, 0),
304
- filesPending: firstPass.diff.pending.length +
305
- retryPasses.reduce((count, pass) => count + pass.diff.pending.length, 0),
306
- filesDeleted: firstPass.diff.deleted.length +
307
- retryPasses.reduce((count, pass) => count + pass.diff.deleted.length, 0),
308
- filesUnchanged: firstPass.diff.unchanged.length,
309
- filesFailed: finalPass.stats.filesFailed,
310
- entitiesCreated: passes.reduce((count, pass) => count + pass.stats.entitiesCreated, 0),
311
- durationMs,
312
- timings: timings.entries(),
313
- ...(finalPass.scanDiagnostics.skippedFiles > 0
314
- ? { scanDiagnostics: finalPass.scanDiagnostics }
315
- : {}),
316
- };
317
- }
318
- const MAX_SKIPPED_FILE_SAMPLES = 20;
319
- function emptyScanDiagnostics() {
320
- return {
321
- skippedFiles: 0,
322
- skippedByReason: {
323
- empty: 0,
324
- too_large: 0,
325
- unsupported: 0,
326
- binary: 0,
327
- },
328
- skippedSamples: [],
329
- };
330
- }
331
- function mergeScanDiagnostics(target, source) {
332
- target.skippedFiles += source.skippedFiles;
333
- for (const reason of [
334
- "empty",
335
- "too_large",
336
- "unsupported",
337
- "binary",
338
- ]) {
339
- target.skippedByReason[reason] += source.skippedByReason[reason];
340
- }
341
- const remaining = MAX_SKIPPED_FILE_SAMPLES - target.skippedSamples.length;
342
- if (remaining > 0) {
343
- target.skippedSamples.push(...source.skippedSamples.slice(0, remaining));
344
- }
345
- }
346
- async function optimizeStorage(ctx) {
347
- try {
348
- await ctx.storage.finalizeWrites();
349
- }
350
- catch (error) {
351
- throw toEngineError(error, "Indexing failed to finalize storage", {
352
- code: "ZVEC_GREP.ENGINE.INDEXING.OPTIMIZE_FAILED",
353
- context: workspaceIndexContext(ctx.workspaceIndex),
354
- });
355
- }
356
- }
357
- async function computeDiffFromFiles(scannedFiles, existingFiles) {
358
- const existingById = new Map(existingFiles.map((file) => [file.id, file]));
359
- const seen = new Set();
360
- const added = [];
361
- const modified = [];
362
- const pending = [];
363
- const unchanged = [];
364
- for (const file of scannedFiles) {
365
- seen.add(file.id);
366
- const existing = existingById.get(file.id);
367
- if (!existing) {
368
- added.push(await withContentHash(file));
369
- continue;
370
- }
371
- if (existing.indexStatus?.indexedTime === null) {
372
- pending.push(await withContentHash(file));
373
- continue;
374
- }
375
- if (existing.sizeBytes === file.sizeBytes &&
376
- existing.lastModifiedTime === file.lastModifiedTime &&
377
- existing.contentHash) {
378
- unchanged.push(existing);
379
- continue;
380
- }
381
- const hashed = await withContentHash(file);
382
- if (existing.sizeBytes === hashed.sizeBytes &&
383
- existing.contentHash === hashed.contentHash) {
384
- unchanged.push(existing);
385
- continue;
386
- }
387
- modified.push(hashed);
388
- }
389
- const deleted = [...existingById.values()].filter((file) => !seen.has(file.id));
390
- return { added, modified, pending, deleted, unchanged };
391
- }
392
- async function indexFiles(files, ctx, onProgress, timings) {
393
- const stats = {
394
- filesIndexed: 0,
395
- filesFailed: 0,
396
- failedFiles: [],
397
- failedFileReasons: [],
398
- entitiesCreated: 0,
399
- };
400
- const batchFiles = [];
401
- let batchFragmentCount = 0;
402
- const embeddingScheduler = createEmbeddingScheduler(ctx.embeddingConcurrency, ctx.embeddingModel);
403
- const embeddingTiming = new ConcurrentTiming(timings, "index_embedding");
404
- const runningEmbeddings = new Set();
405
- let firstEmbeddingError;
406
- const prepareModel = ctx.embeddingModel.info.provider === "local"
407
- ? ctx.embeddingModel.prepare?.bind(ctx.embeddingModel)
408
- : undefined;
409
- let modelPrepared = false;
410
- const reportEmbeddingProgress = (currentStats, detail) => {
411
- onProgress(currentStats, detail, embeddingScheduler.snapshot());
412
- };
413
- const throwFirstEmbeddingError = () => {
414
- const failure = firstEmbeddingError;
415
- if (failure) {
416
- throw failure.error;
417
- }
418
- };
419
- const flushBatch = async () => {
420
- throwFirstEmbeddingError();
421
- throwIfIndexCancelled(ctx);
422
- if (batchFiles.length === 0) {
423
- return;
424
- }
425
- const filesToEmbed = batchFiles.splice(0);
426
- batchFragmentCount = 0;
427
- await scheduleEmbeddingTask(() => embedAndCommitBatch(filesToEmbed, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming));
428
- };
429
- const scheduleEmbeddingTask = async (task) => {
430
- throwFirstEmbeddingError();
431
- throwIfIndexCancelled(ctx);
432
- if (!modelPrepared && prepareModel) {
433
- // Finish shared initialization before any file or fragment batch is queued.
434
- try {
435
- await embeddingTiming.time(() => prepareModel({
436
- signal: ctx.signal,
437
- onProgress: (progress) => reportModelDownloadProgress(stats, progress, onProgress, embeddingScheduler),
438
- }));
439
- }
440
- catch (error) {
441
- throwIfIndexCancelled(ctx);
442
- throw error;
443
- }
444
- throwIfIndexCancelled(ctx);
445
- }
446
- modelPrepared = true;
447
- const cleanup = () => {
448
- runningEmbeddings.delete(promise);
449
- };
450
- const promise = Promise.resolve()
451
- .then(task)
452
- .then(cleanup, (error) => {
453
- if (!firstEmbeddingError) {
454
- firstEmbeddingError = { error };
455
- }
456
- cleanup();
457
- });
458
- runningEmbeddings.add(promise);
459
- if (runningEmbeddings.size >= embeddingScheduler.taskConcurrency) {
460
- await Promise.race(runningEmbeddings);
461
- }
462
- throwFirstEmbeddingError();
463
- throwIfIndexCancelled(ctx);
464
- };
465
- try {
466
- for (const file of files) {
467
- throwFirstEmbeddingError();
468
- throwIfIndexCancelled(ctx);
469
- onProgress(stats, `reading ${file.relativePath}`);
470
- const prepared = await timings.time("index_prepare", () => prepareFile(file, ctx));
471
- throwFirstEmbeddingError();
472
- throwIfIndexCancelled(ctx);
473
- if ("failedReason" in prepared) {
474
- recordFileFailed(stats, file, prepared.failedReason);
475
- onProgress(stats, `failed ${file.relativePath}`);
476
- continue;
477
- }
478
- if (prepared.fragments.length === 0) {
479
- const committed = commitFile(prepared, [], ctx, stats);
480
- onProgress(stats, finishedFileDetail(committed, file.relativePath));
481
- continue;
482
- }
483
- if (prepared.fragments.length > ctx.embeddingModel.info.limits.maxBatchSize) {
484
- await flushBatch();
485
- await scheduleEmbeddingTask(async () => {
486
- throwIfIndexCancelled(ctx);
487
- reportEmbeddingProgress(stats, `embedding ${file.relativePath}`);
488
- await embedAndCommitFile(prepared, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming);
489
- });
490
- continue;
491
- }
492
- if (batchFragmentCount > 0 &&
493
- batchFragmentCount + prepared.fragments.length >
494
- ctx.embeddingModel.info.limits.maxBatchSize) {
495
- await flushBatch();
496
- }
497
- batchFiles.push(prepared);
498
- batchFragmentCount += prepared.fragments.length;
499
- if (batchFragmentCount === ctx.embeddingModel.info.limits.maxBatchSize) {
500
- await flushBatch();
501
- }
502
- }
503
- await flushBatch();
504
- await Promise.all(runningEmbeddings);
505
- throwFirstEmbeddingError();
506
- throwIfIndexCancelled(ctx);
507
- }
508
- catch (error) {
509
- await Promise.allSettled(runningEmbeddings);
510
- throw error;
511
- }
512
- throwIfIndexCancelled(ctx);
513
- return stats;
514
- }
515
- async function prepareFile(file, ctx) {
516
- try {
517
- throwIfIndexCancelled(ctx);
518
- const source = await readSource(file);
519
- const chunkOptions = indexChunkOptions(ctx.embeddingModel.info.limits.maxInputTokens, source.kind === "text" ? source.text : undefined);
520
- const extracted = await extractForIndexing(source, chunkOptions);
521
- throwIfIndexCancelled(ctx);
522
- const fragments = extracted
523
- .filter(({ fragment }) => ctx.embeddingModel.info.inputKinds.includes(fragment.content.kind))
524
- .map(({ fragment, embeddingSource }) => ({
525
- fragment,
526
- embeddingContent: vectorContentForFragment(fragment, embeddingSource, chunkOptions.maxChunkChars),
527
- }));
528
- return { file, fragments };
529
- }
530
- catch (error) {
531
- if (indexIsCancelled(ctx)) {
532
- throw indexCancellationError(ctx);
533
- }
534
- return {
535
- file,
536
- failedReason: markFileFailed(ctx, file, error, "prepare"),
537
- };
538
- }
539
- }
540
- async function embedAndCommitBatch(files, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming) {
541
- try {
542
- throwIfIndexCancelled(ctx);
543
- const contents = files.flatMap((file) => file.fragments.map((fragment) => fragment.embeddingContent));
544
- onProgress(stats, `embedding ${describePreparedFiles(files)}`, embeddingScheduler.snapshot());
545
- const embedding = await embeddingTiming.time(() => embedContentsWithRetry(contents, ctx.embeddingModel, embeddingScheduler, ctx.signal, (progress) => reportModelDownloadProgress(stats, progress, onProgress, embeddingScheduler)));
546
- const truncatedInputIndexes = new Set(embedding.truncated);
547
- throwIfIndexCancelled(ctx);
548
- let offset = 0;
549
- for (const file of files) {
550
- throwIfIndexCancelled(ctx);
551
- const end = offset + file.fragments.length;
552
- const fileVectors = embedding.vectors.slice(offset, end);
553
- let truncatedFragmentCount = 0;
554
- for (let index = offset; index < end; index++) {
555
- if (truncatedInputIndexes.has(index)) {
556
- truncatedFragmentCount++;
557
- }
558
- }
559
- offset += file.fragments.length;
560
- const committed = timings.timeSync("index_commit", () => commitFile(file, fileVectors, ctx, stats, truncatedFragmentCount));
561
- onProgress(stats, finishedFileDetail(committed, file.file.relativePath));
562
- }
563
- }
564
- catch (error) {
565
- if (indexIsCancelled(ctx)) {
566
- throw indexCancellationError(ctx);
567
- }
568
- if (shouldFailFastEmbeddingError(error, ctx.embeddingModel)) {
569
- throw error;
570
- }
571
- for (const file of files) {
572
- onProgress(stats, `embedding ${file.file.relativePath}`, embeddingScheduler.snapshot());
573
- await embedAndCommitFile(file, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming);
574
- }
575
- }
576
- }
577
- async function embedAndCommitFile(file, ctx, stats, onProgress, embeddingScheduler, timings, embeddingTiming) {
578
- try {
579
- throwIfIndexCancelled(ctx);
580
- const embedding = await embeddingTiming.time(() => embedFragments(file.fragments, ctx.embeddingModel, embeddingScheduler, ctx.signal, (progress) => reportModelDownloadProgress(stats, progress, onProgress, embeddingScheduler)));
581
- throwIfIndexCancelled(ctx);
582
- const committed = timings.timeSync("index_commit", () => commitFile(file, embedding.vectors, ctx, stats, embedding.truncated.length));
583
- onProgress(stats, finishedFileDetail(committed, file.file.relativePath));
584
- }
585
- catch (error) {
586
- if (indexIsCancelled(ctx)) {
587
- throw indexCancellationError(ctx);
588
- }
589
- if (shouldFailFastEmbeddingError(error, ctx.embeddingModel)) {
590
- throw error;
591
- }
592
- const reason = markFileFailed(ctx, file.file, error, "embed");
593
- recordFileFailed(stats, file.file, reason);
594
- onProgress(stats, finishedFileDetail(false, file.file.relativePath));
595
- }
596
- }
597
- function commitFile(file, vectors, ctx, stats, truncatedFragmentCount = 0) {
598
- try {
599
- throwIfIndexCancelled(ctx);
600
- if (file.fragments.length !== vectors.length) {
601
- throw new EngineError("Embedding returned mismatched entity/vector counts", {
602
- code: "ZVEC_GREP.ENGINE.STORAGE.ENTITY_VECTOR_COUNT_MISMATCH",
603
- context: `fileId=${file.file.id} fragmentCount=${file.fragments.length} vectorCount=${vectors.length}`,
604
- });
605
- }
606
- ctx.storage.replaceFile(file.file, file.fragments.map(({ fragment }, index) => ({
607
- fragment,
608
- vector: vectors[index],
609
- })), {
610
- truncatedFragmentCount,
611
- });
612
- stats.filesIndexed++;
613
- stats.entitiesCreated += countPublicEntities(file.fragments.map(({ fragment }) => fragment));
614
- return true;
615
- }
616
- catch (error) {
617
- if (indexIsCancelled(ctx)) {
618
- throw indexCancellationError(ctx);
619
- }
620
- const reason = markFileFailed(ctx, file.file, error, "commit");
621
- recordFileFailed(stats, file.file, reason);
622
- return false;
623
- }
624
- }
625
- function throwIfIndexCancelled(ctx) {
626
- if (!indexIsCancelled(ctx)) {
627
- return;
628
- }
629
- throw indexCancellationError(ctx);
630
- }
631
- function indexIsCancelled(ctx) {
632
- return ctx.signal?.aborted === true;
633
- }
634
- function indexCancellationError(ctx) {
635
- return ctx.signal?.reason instanceof Error
636
- ? ctx.signal.reason
637
- : new EngineError("Indexing was cancelled.", {
638
- code: "ZVEC_GREP.ENGINE.INDEXING.CANCELLED",
639
- context: workspaceIndexContext(ctx.workspaceIndex),
640
- });
641
- }
642
- function recordFileFailed(stats, file, reason) {
643
- stats.filesFailed++;
644
- stats.failedFiles.push(file.relativePath);
645
- if (reason) {
646
- stats.failedFileReasons.push(`${file.relativePath}: ${reason}`);
647
- }
648
- }
649
- function summarizeFailedFiles(files) {
650
- const shown = files.slice(0, 5);
651
- const remaining = files.length - shown.length;
652
- return remaining > 0
653
- ? `${shown.join(", ")} and ${remaining} more`
654
- : shown.join(", ");
655
- }
656
- function describePreparedFiles(files) {
657
- if (files.length === 0) {
658
- return "0 files";
659
- }
660
- if (files.length === 1) {
661
- return files[0].file.relativePath;
662
- }
663
- return `${files.length} files, starting with ${files[0].file.relativePath}`;
664
- }
665
- function finishedFileDetail(succeeded, relativePath) {
666
- return succeeded ? `indexed ${relativePath}` : `failed ${relativePath}`;
667
- }
668
- async function readSource(file) {
669
- let bytes;
670
- try {
671
- bytes = await readFile(file.absolutePath);
672
- }
673
- catch (error) {
674
- throw toEngineError(error, "Indexing failed to read source file", {
675
- code: "ZVEC_GREP.ENGINE.INDEXING.READ_SOURCE_FAILED",
676
- context: fileContext(file),
677
- });
678
- }
679
- if (file.kind === "image") {
680
- return {
681
- kind: "image",
682
- file,
683
- data: bytes,
684
- format: file.format,
685
- };
686
- }
687
- return {
688
- kind: "text",
689
- file,
690
- text: bytes.toString("utf8"),
691
- };
692
- }
693
- async function embedFragments(fragments, model, embeddingScheduler, signal, onModelProgress) {
694
- const batches = [];
695
- for (let start = 0; start < fragments.length; start += model.info.limits.maxBatchSize) {
696
- const batch = fragments.slice(start, start + model.info.limits.maxBatchSize);
697
- batches.push({ start, fragments: batch });
698
- }
699
- const vectors = new Array(fragments.length);
700
- const truncatedInputIndexes = [];
701
- const batchAbortController = new AbortController();
702
- const batchSignal = signal
703
- ? AbortSignal.any([signal, batchAbortController.signal])
704
- : batchAbortController.signal;
705
- const results = await Promise.allSettled(batches.map((batch) => embedFragmentBatch(batch.fragments, model, batch.start, embeddingScheduler, batchSignal, onModelProgress, (error) => batchAbortController.abort(error))));
706
- let firstError;
707
- for (const [index, result] of results.entries()) {
708
- if (result.status === "rejected") {
709
- firstError ??= result.reason;
710
- continue;
711
- }
712
- const start = batches[index].start;
713
- for (const [offset, vector] of result.value.vectors.entries()) {
714
- vectors[start + offset] = vector;
715
- }
716
- truncatedInputIndexes.push(...result.value.truncated.map((inputIndex) => start + inputIndex));
717
- }
718
- if (firstError) {
719
- throw firstError;
720
- }
721
- return {
722
- vectors,
723
- truncated: truncatedInputIndexes,
724
- };
725
- }
726
- async function embedFragmentBatch(fragments, model, startIndex, embeddingScheduler, signal, onModelProgress, onTerminalFailure) {
727
- const contents = fragments.map((fragment) => fragment.embeddingContent);
728
- try {
729
- return await embedContentsWithRetry(contents, model, embeddingScheduler, signal, onModelProgress, onTerminalFailure);
730
- }
731
- catch (error) {
732
- if (fragments.length === 1 || shouldFailFastEmbeddingError(error, model)) {
733
- throw error;
734
- }
735
- return await embedFragmentBatchOneByOne(fragments, model, startIndex, embeddingScheduler, signal, onModelProgress, onTerminalFailure);
736
- }
737
- }
738
- async function embedFragmentBatchOneByOne(fragments, model, startIndex, embeddingScheduler, signal, onModelProgress, onTerminalFailure) {
739
- const vectors = [];
740
- const truncatedInputIndexes = [];
741
- for (const [index, fragment] of fragments.entries()) {
742
- try {
743
- const result = await embedContentsWithRetry([fragment.embeddingContent], model, embeddingScheduler, signal, onModelProgress, onTerminalFailure);
744
- vectors.push(result.vectors[0]);
745
- if (result.truncated.length > 0) {
746
- truncatedInputIndexes.push(index);
747
- }
748
- }
749
- catch (error) {
750
- if (shouldFailFastEmbeddingError(error, model)) {
751
- throw error;
752
- }
753
- throw new EngineError("Embedding entity fragment failed after one-by-one fallback", {
754
- code: "ZVEC_GREP.ENGINE.INDEXING.EMBEDDING_FRAGMENT_FAILED",
755
- context: errorDetails([
756
- detail("model", model.info.reference),
757
- detail("fragmentId", fragment.fragment.id),
758
- detail("fragmentIndex", startIndex + index),
759
- isEngineError(error) ? detail("causeCode", error.code) : null,
760
- error instanceof Error ? detail("cause", error.message) : null,
761
- isEngineError(error) ? error.context : null,
762
- ]),
763
- cause: error,
764
- });
765
- }
766
- }
767
- return {
768
- vectors,
769
- truncated: truncatedInputIndexes,
770
- };
771
- }
772
- async function embedContentsWithRetry(contents, model, embeddingScheduler, signal, onModelProgress, onTerminalFailure) {
773
- let attempt = 0;
774
- while (true) {
775
- let retry = nonRetryableEmbeddingError();
776
- let delayMs = 0;
777
- try {
778
- throwIfAborted(signal);
779
- const result = await embeddingScheduler.run(() => model.embed(contents, {
780
- purpose: "document",
781
- signal,
782
- onProgress: onModelProgress,
783
- }), signal, (error) => {
784
- retry = classifyEmbeddingRetry(error, model);
785
- delayMs = retryDelayMs(attempt, retry);
786
- if (retry.retryable) {
787
- embeddingScheduler.recordRetryableFailure({
788
- rateLimited: retry.rateLimited,
789
- delayMs,
790
- });
791
- }
792
- if (retry.failFast &&
793
- (!retry.retryable || attempt >= maxRetryAttempts(retry))) {
794
- onTerminalFailure?.(error);
795
- }
796
- });
797
- embeddingScheduler.recordSuccess();
798
- return result;
799
- }
800
- catch (error) {
801
- if (signal?.aborted) {
802
- throw signal.reason instanceof Error
803
- ? signal.reason
804
- : new Error("Embedding was cancelled.");
805
- }
806
- if (!retry.retryable) {
807
- retry = classifyEmbeddingRetry(error, model);
808
- delayMs = retryDelayMs(attempt, retry);
809
- }
810
- if (attempt >= maxRetryAttempts(retry) || !retry.retryable) {
811
- throw error;
812
- }
813
- await abortableDelay(delayMs, signal);
814
- attempt++;
815
- }
816
- }
817
- }
818
- function reportModelDownloadProgress(stats, progress, onProgress, embeddingScheduler) {
819
- onProgress(stats, `downloading ${progress.model}`, {
820
- ...embeddingScheduler.snapshot(),
821
- ...progress,
822
- });
823
- }
824
- function createEmbeddingScheduler(requestedConcurrency, model) {
825
- return new AdaptiveEmbeddingScheduler(resolveEmbeddingConcurrencyPolicy(requestedConcurrency, model));
826
- }
827
- function resolveEmbeddingConcurrencyPolicy(requestedConcurrency, model) {
828
- if (requestedConcurrency !== undefined &&
829
- Number.isInteger(requestedConcurrency) &&
830
- requestedConcurrency > 0) {
831
- return {
832
- initial: requestedConcurrency,
833
- min: 1,
834
- max: requestedConcurrency,
835
- adaptive: requestedConcurrency > 1,
836
- };
837
- }
838
- const remote = model.info.provider === "qwen";
839
- const multimodal = model.info.inputKinds.includes("image");
840
- const configuredLocalDefault = model.info.defaultConcurrency;
841
- const localDefault = configuredLocalDefault !== undefined &&
842
- Number.isInteger(configuredLocalDefault) &&
843
- configuredLocalDefault > 0
844
- ? configuredLocalDefault
845
- : 1;
846
- const initial = remote ? (multimodal ? 4 : 8) : localDefault;
847
- const max = remote ? (multimodal ? 8 : 12) : localDefault;
848
- const min = Math.min(initial, 4);
849
- return {
850
- initial,
851
- min,
852
- max: Math.max(initial, max),
853
- adaptive: max > 1,
854
- };
855
- }
856
- class AdaptiveEmbeddingScheduler {
857
- policy;
858
- active = 0;
859
- cooldownUntil = 0;
860
- currentConcurrency;
861
- retryableFailures = 0;
862
- successStreak = 0;
863
- queue = [];
864
- constructor(policy) {
865
- this.policy = policy;
866
- this.currentConcurrency = policy.initial;
867
- }
868
- get taskConcurrency() {
869
- return this.policy.max;
870
- }
871
- async run(task, signal, onError) {
872
- throwIfAborted(signal);
873
- await this.waitForCooldown(signal);
874
- await this.acquire(signal);
875
- try {
876
- await this.waitForCooldown(signal);
877
- throwIfAborted(signal);
878
- return await task();
879
- }
880
- catch (error) {
881
- onError?.(error);
882
- throw error;
883
- }
884
- finally {
885
- this.release();
886
- }
887
- }
888
- recordSuccess() {
889
- if (!this.policy.adaptive || this.currentConcurrency >= this.policy.max) {
890
- return;
891
- }
892
- this.successStreak++;
893
- if (this.successStreak <
894
- Math.max(EMBEDDING_SUCCESS_STREAK_MIN, this.currentConcurrency * 2)) {
895
- return;
896
- }
897
- this.currentConcurrency++;
898
- this.successStreak = 0;
899
- this.drainQueue();
900
- }
901
- recordRetryableFailure(retry) {
902
- this.retryableFailures++;
903
- if (retry.rateLimited && retry.delayMs > 0) {
904
- this.cooldownUntil = Math.max(this.cooldownUntil, Date.now() + retry.delayMs);
905
- }
906
- if (!this.policy.adaptive) {
907
- return;
908
- }
909
- this.currentConcurrency = Math.max(this.policy.min, Math.floor(this.currentConcurrency / 2));
910
- this.successStreak = 0;
911
- }
912
- snapshot() {
913
- return {
914
- concurrency: this.currentConcurrency,
915
- maxConcurrency: this.policy.max,
916
- retryableFailures: this.retryableFailures,
917
- };
918
- }
919
- async waitForCooldown(signal) {
920
- const remaining = this.cooldownUntil - Date.now();
921
- if (remaining > 0) {
922
- await abortableDelay(remaining, signal);
923
- }
924
- }
925
- async acquire(signal) {
926
- throwIfAborted(signal);
927
- if (this.active < this.currentConcurrency) {
928
- this.active++;
929
- return;
930
- }
931
- await new Promise((resolve, reject) => {
932
- const queued = () => {
933
- signal?.removeEventListener("abort", abort);
934
- resolve();
935
- };
936
- const abort = () => {
937
- const index = this.queue.indexOf(queued);
938
- if (index >= 0) {
939
- this.queue.splice(index, 1);
940
- }
941
- reject(abortError(signal));
942
- };
943
- if (signal?.aborted) {
944
- reject(abortError(signal));
945
- return;
946
- }
947
- signal?.addEventListener("abort", abort, { once: true });
948
- this.queue.push(queued);
949
- });
950
- }
951
- release() {
952
- this.active--;
953
- this.drainQueue();
954
- }
955
- drainQueue() {
956
- while (this.active < this.currentConcurrency) {
957
- const resolve = this.queue.shift();
958
- if (!resolve) {
959
- return;
960
- }
961
- this.active++;
962
- resolve();
963
- }
964
- }
965
- }
966
- function oneLine(value) {
967
- return value.replace(/\s+/g, " ").trim();
968
- }
969
- function shouldFailFastEmbeddingError(error, model) {
970
- return classifyEmbeddingRetry(error, model).failFast;
971
- }
972
- function classifyEmbeddingRetry(error, model) {
973
- const codes = errorCodes(error);
974
- const text = errorChainText(error);
975
- const status = httpStatusFromText(text);
976
- const remoteEmbedding = model.info.provider !== "local";
977
- const rateLimited = remoteEmbedding &&
978
- (status === 429 ||
979
- /rate limit|quota exceeded|too many requests|request rate increased too quickly/i.test(text));
980
- const serverError = remoteEmbedding &&
981
- typeof status === "number" &&
982
- status >= 500 &&
983
- status <= 599;
984
- const requestTimeout = remoteEmbedding && status === 408;
985
- const requestFailure = codes.some((code) => code.endsWith("_REQUEST_FAILED"));
986
- const transientNetworkFailure = remoteEmbedding && requestFailure && isTransientNetworkFailure(text);
987
- const sharedLocalModelFailure = codes.some((code) => code === "ZVEC_GREP.ENGINE.MODELS.MODEL2VEC_DOWNLOAD_FAILED" ||
988
- code === "ZVEC_GREP.ENGINE.MODELS.MODEL2VEC_LOAD_FAILED" ||
989
- code === "ZVEC_GREP.ENGINE.MODELS.MODEL2VEC_DISPOSED");
990
- const retryable = !sharedLocalModelFailure &&
991
- (rateLimited || serverError || requestTimeout || transientNetworkFailure);
992
- const remoteConfigurationFailure = remoteEmbedding &&
993
- (codes.some((code) => code.endsWith("_MISSING_API_KEY") || code.endsWith("_MISSING_ENDPOINT")) ||
994
- status === 401 ||
995
- status === 403 ||
996
- status === 404 ||
997
- /\b(?:invalid|missing|unauthorized|forbidden)[ _-]?(?:api[ _-]?)?key\b/i.test(text));
998
- const permanentRemoteModelFailure = remoteEmbedding &&
999
- (codes.includes("ZVEC_GREP.ENGINE.MODELS.EMBEDDING_DIMENSION_MISMATCH") ||
1000
- (status === 400 && isPermanentRemoteModelBadRequest(text)));
1001
- return {
1002
- retryable,
1003
- rateLimited,
1004
- failFast: retryable ||
1005
- sharedLocalModelFailure ||
1006
- remoteConfigurationFailure ||
1007
- permanentRemoteModelFailure ||
1008
- (remoteEmbedding && requestFailure),
1009
- retryAfterMs: retryAfterMsFromText(text),
1010
- };
1011
- }
1012
- function isPermanentRemoteModelBadRequest(text) {
1013
- const providerCode = /\bproviderCode=([^\s]+)/i.exec(text)?.[1];
1014
- const normalizedCode = providerCode
1015
- ?.replace(/[^a-z0-9]+/gi, "_")
1016
- .replace(/^_+|_+$/g, "")
1017
- .toLowerCase();
1018
- if (normalizedCode &&
1019
- PERMANENT_REMOTE_MODEL_PROVIDER_CODES.has(normalizedCode)) {
1020
- return true;
1021
- }
1022
- const providerMessage = /\bproviderMessage=(.*?)(?=\s+ZVEC_GREP\.|$)/i.exec(text)?.[1];
1023
- return (providerMessage !== undefined &&
1024
- /(?:\b(?:invalid|unsupported|unknown)\b.{0,48}\bmodel\b|\bmodel\b.{0,48}\b(?:invalid|unsupported|unknown|not found|does not exist)\b|\b(?:invalid|unsupported|out of range)\b.{0,48}\bdimensions?\b|\bdimensions?\b.{0,48}\b(?:invalid|unsupported|not supported|out of range|must|should|expected|between|only supports?)\b)/i.test(providerMessage));
1025
- }
1026
- function nonRetryableEmbeddingError() {
1027
- return {
1028
- retryable: false,
1029
- rateLimited: false,
1030
- failFast: false,
1031
- };
1032
- }
1033
- function errorCodes(error) {
1034
- const codes = [];
1035
- for (const current of errorChain(error)) {
1036
- if (typeof current === "object" &&
1037
- current !== null &&
1038
- "code" in current &&
1039
- typeof current.code === "string") {
1040
- codes.push(current.code);
1041
- }
1042
- }
1043
- return codes;
1044
- }
1045
- function errorChainText(error) {
1046
- const parts = [];
1047
- for (const current of errorChain(error)) {
1048
- if (current instanceof Error) {
1049
- parts.push(current.name, current.message);
1050
- }
1051
- else {
1052
- parts.push(String(current));
1053
- }
1054
- if (isEngineError(current) && current.context) {
1055
- parts.push(current.context);
1056
- }
1057
- if (typeof current === "object" &&
1058
- current !== null &&
1059
- "code" in current &&
1060
- typeof current.code === "string") {
1061
- parts.push(current.code);
1062
- }
1063
- }
1064
- return parts.join(" ");
1065
- }
1066
- function errorChain(error) {
1067
- const chain = [];
1068
- const seen = new Set();
1069
- let current = error;
1070
- while (current !== undefined && current !== null && !seen.has(current)) {
1071
- seen.add(current);
1072
- chain.push(current);
1073
- if (typeof current !== "object" ||
1074
- !("cause" in current) ||
1075
- current.cause === undefined) {
1076
- break;
1077
- }
1078
- current = current.cause;
1079
- }
1080
- return chain;
1081
- }
1082
- function isTransientNetworkFailure(text) {
1083
- return /\b(?:EAI_AGAIN|ECONNREFUSED|ECONNRESET|EHOSTUNREACH|ENETDOWN|ENETUNREACH|ENOTFOUND|ETIMEDOUT|UND_ERR_CONNECT_TIMEOUT|UND_ERR_HEADERS_TIMEOUT|UND_ERR_SOCKET|TimeoutError)\b|connection (?:reset|timed out)|network connection (?:failed|was lost)|socket hang up|temporary failure/i.test(text);
1084
- }
1085
- function maxRetryAttempts(retry) {
1086
- return retry.rateLimited
1087
- ? EMBEDDING_RATE_LIMIT_MAX_RETRIES
1088
- : EMBEDDING_TRANSIENT_MAX_RETRIES;
1089
- }
1090
- function retryDelayMs(attempt, retry) {
1091
- if (typeof retry.retryAfterMs === "number") {
1092
- return retry.retryAfterMs;
1093
- }
1094
- const base = retry.rateLimited
1095
- ? EMBEDDING_RATE_LIMIT_RETRY_BASE_DELAY_MS
1096
- : EMBEDDING_TRANSIENT_RETRY_BASE_DELAY_MS;
1097
- const max = retry.rateLimited
1098
- ? EMBEDDING_RATE_LIMIT_RETRY_MAX_DELAY_MS
1099
- : EMBEDDING_TRANSIENT_RETRY_MAX_DELAY_MS;
1100
- const exponential = base * 2 ** attempt;
1101
- const jitter = Math.floor(Math.random() * EMBEDDING_RETRY_JITTER_MS);
1102
- return Math.min(exponential + jitter, max);
1103
- }
1104
- function httpStatusFromText(text) {
1105
- const match = /\bstatus=(\d{3})\b/i.exec(text);
1106
- if (!match) {
1107
- return undefined;
1108
- }
1109
- return Number(match[1]);
1110
- }
1111
- function retryAfterMsFromText(text) {
1112
- const milliseconds = /\bretryAfterMs=(\d+)\b/i.exec(text);
1113
- if (milliseconds) {
1114
- return Number(milliseconds[1]);
1115
- }
1116
- const seconds = /\bretryAfter=(\d+(?:\.\d+)?)\b/i.exec(text);
1117
- if (seconds) {
1118
- return Math.round(Number(seconds[1]) * 1000);
1119
- }
1120
- return undefined;
1121
- }
1122
- function abortableDelay(ms, signal) {
1123
- if (ms <= 0) {
1124
- return Promise.resolve();
1125
- }
1126
- throwIfAborted(signal);
1127
- return new Promise((resolve, reject) => {
1128
- const timer = setTimeout(() => {
1129
- signal?.removeEventListener("abort", abort);
1130
- resolve();
1131
- }, ms);
1132
- const abort = () => {
1133
- clearTimeout(timer);
1134
- reject(abortError(signal));
1135
- };
1136
- signal?.addEventListener("abort", abort, { once: true });
1137
- });
1138
- }
1139
- function throwIfAborted(signal) {
1140
- if (signal?.aborted) {
1141
- throw abortError(signal);
1142
- }
1143
- }
1144
- function abortError(signal) {
1145
- return signal?.reason instanceof Error
1146
- ? signal.reason
1147
- : new Error("Embedding was cancelled.");
1148
- }
1149
- function countPublicEntities(fragments) {
1150
- let count = 0;
1151
- for (const fragment of fragments) {
1152
- if (!fragment.group || fragment.group === fragment.id) {
1153
- count++;
1154
- }
1155
- }
1156
- return count;
1157
- }
1158
- async function withContentHash(file) {
1159
- let bytes;
1160
- try {
1161
- bytes = await readFile(file.absolutePath);
1162
- }
1163
- catch (error) {
1164
- throw toEngineError(error, "Indexing failed to compute file content hash", {
1165
- code: "ZVEC_GREP.ENGINE.INDEXING.CONTENT_HASH_FAILED",
1166
- context: fileContext(file),
1167
- });
1168
- }
1169
- return {
1170
- ...file,
1171
- contentHash: sha256Bytes(bytes),
1172
- };
1173
- }
1174
- function markFileFailed(ctx, file, error, stage) {
1175
- const reason = fileFailureReason(stage, error);
1176
- try {
1177
- ctx.storage.markFileFailed(file, reason);
1178
- return reason;
1179
- }
1180
- catch (markError) {
1181
- throw toEngineError(markError, "Indexing failed to record file failure", {
1182
- code: "ZVEC_GREP.ENGINE.INDEXING.MARK_FILE_FAILED",
1183
- context: `${fileContext(file)} stage=${stage} original=${reason}`,
1184
- });
1185
- }
1186
- }
1187
- function fileFailureReason(stage, error) {
1188
- return oneLine(`${stage}: ${errorToMessage(error)}`);
1189
- }
1190
- function toEngineError(error, message, options) {
1191
- if (isEngineError(error)) {
1192
- return error;
1193
- }
1194
- return new EngineError(message, {
1195
- ...options,
1196
- cause: error,
1197
- });
1198
- }
1199
- function workspaceIndexContext(workspaceIndex) {
1200
- return (errorDetails([
1201
- detail("workspace_index_id", workspaceIndex.id),
1202
- workspaceIndexDetail(workspaceIndex.name),
1203
- ]) ?? "");
1204
- }
1205
- function fileContext(file) {
1206
- return `fileId=${file.id} path=${file.relativePath}`;
1207
- }
1208
- function errorToMessage(error) {
1209
- if (isEngineError(error) && error.context) {
1210
- return `${error.code}: ${error.message} (${error.context})`;
1211
- }
1212
- if (isEngineError(error)) {
1213
- return `${error.code}: ${error.message}`;
1214
- }
1215
- return error instanceof Error ? error.message : String(error);
1216
- }
1217
- //# sourceMappingURL=index.js.map