@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,1089 +0,0 @@
1
- import { createZvecGrep } from "../engine/service/index.js";
2
- import { isEngineError } from "../engine/errors.js";
3
- import { readGlobalConfig, resolveEmbeddingRuntimeOptions, } from "../engine/config.js";
4
- import { readWorkspaceManifest } from "../engine/manifest.js";
5
- import { workspaceIndexLocation } from "../engine/service/root.js";
6
- import { resolveEmbeddingReference } from "../engine/models/index.js";
7
- import { indexCompletionForJob, indexCompletionFromStatus, } from "../engine/index-status.js";
8
- import { contextOptionsFromRgInput, normalizePlainStringList, } from "../mcp/input-normalization.js";
9
- import { DaemonError } from "./errors.js";
10
- import { JobScheduler, } from "./job-scheduler.js";
11
- import { EmbeddingModelPool, } from "./model-pool.js";
12
- import { IndexCoordinator, } from "./index-coordinator.js";
13
- import { inspectRoot, resolveRequestedRoot, RuntimeManager, } from "./runtime-manager.js";
14
- import { WatchManager } from "./watch-manager.js";
15
- import { rootIdentity } from "./logger.js";
16
- import { RemoteEmbeddingAuthorizationManager, RemoteEmbeddingAuthorizationStore, planRemoteIndexAuthorization, planRemoteSearchAuthorization, withRemoteEmbeddingOperationPermit, } from "../authorization/index.js";
17
- const DEFAULT_LOCAL_EMBEDDING = "local/potion-code-16m-v2";
18
- export class DaemonBackend {
19
- options;
20
- modelPool;
21
- runtimeManager;
22
- scheduler;
23
- startedAt = Date.now();
24
- statusCache = new Map();
25
- lastScanDiagnostics = new Map();
26
- workspaceRuntimeCache = new Map();
27
- watchers = new Map();
28
- indexCoordinators = new Map();
29
- droppingRoots = new Set();
30
- authorizationManager;
31
- shuttingDown = false;
32
- closePromise;
33
- constructor(options) {
34
- this.options = options;
35
- this.authorizationManager = new RemoteEmbeddingAuthorizationManager(options.authorizationStore ??
36
- new RemoteEmbeddingAuthorizationStore({
37
- signingKeyPath: options.serviceOptions?.authorizationSigningKeyPath,
38
- }));
39
- this.modelPool = new EmbeddingModelPool({
40
- ...options.modelPoolOptions,
41
- serviceOptions: options.serviceOptions,
42
- logger: options.logger,
43
- });
44
- this.runtimeManager = new RuntimeManager({
45
- modelPool: this.modelPool,
46
- serviceOptions: options.serviceOptions,
47
- readSessionIdleTtlMs: options.readSessionIdleTtlMs,
48
- runtimeIdleTtlMs: options.runtimeIdleTtlMs,
49
- onRuntimeEvicted: async (root) => {
50
- this.statusCache.delete(root);
51
- this.lastScanDiagnostics.delete(root);
52
- this.workspaceRuntimeCache.delete(root);
53
- await this.closeWatcher(root);
54
- },
55
- });
56
- this.scheduler = new JobScheduler({
57
- ...options.schedulerOptions,
58
- logger: options.logger,
59
- });
60
- }
61
- async planIndexAuthorization(input) {
62
- if (input.drop === true) {
63
- return undefined;
64
- }
65
- const requestedRoot = await resolveRequestedRoot(input.root, false);
66
- if (input.rebuild !== true && this.scheduler.hasActiveRoot(requestedRoot)) {
67
- return undefined;
68
- }
69
- const info = await inspectRoot(input.root, this.options.serviceOptions, input.rebuild !== true);
70
- let modelLoadRequest;
71
- try {
72
- modelLoadRequest = this.indexModelLoadRequest(info, input);
73
- }
74
- catch (error) {
75
- if (error instanceof DaemonError && error.code === "MODEL_LOAD_FAILED") {
76
- return undefined;
77
- }
78
- throw error;
79
- }
80
- let lease;
81
- try {
82
- lease = await this.modelPool.acquire(modelLoadRequest);
83
- }
84
- catch (error) {
85
- if (isEngineError(error)) {
86
- return undefined;
87
- }
88
- throw error;
89
- }
90
- let schema;
91
- let modelInfo;
92
- try {
93
- schema = embeddingSchema(lease.model);
94
- modelInfo = lease.model.info;
95
- }
96
- finally {
97
- lease.release();
98
- }
99
- const existing = info.workspaceIndex?.embedding;
100
- if (existing &&
101
- input.embedding &&
102
- input.rebuild !== true &&
103
- (existing.provider !== schema.provider || existing.model !== schema.model)) {
104
- throw new DaemonError("EMBEDDING_MODEL_MISMATCH", `Existing model ${existing.provider}/${existing.model} does not match requested model ${schema.provider}/${schema.model}; use rebuild to change models.`);
105
- }
106
- return await planRemoteIndexAuthorization({
107
- info,
108
- model: modelInfo,
109
- rebuild: input.rebuild,
110
- store: this.authorizationManager.store,
111
- });
112
- }
113
- async planSearchAuthorization(input) {
114
- const requestedRoot = await resolveRequestedRoot(input.root, false);
115
- let activeRuntime = this.runtimeManager.getByRequestedRoot(requestedRoot);
116
- if (activeRuntime?.embeddingProvider() &&
117
- activeRuntime.embeddingProvider() !== "qwen") {
118
- return undefined;
119
- }
120
- let canonicalRoot = activeRuntime?.canonicalRoot;
121
- let discoveredInfo;
122
- if (!canonicalRoot) {
123
- discoveredInfo = await this.inspectRoot(input.root, false);
124
- canonicalRoot = await resolveRequestedRoot(discoveredInfo.root, false);
125
- activeRuntime = this.runtimeManager.getByCanonicalRoot(canonicalRoot);
126
- const provider = activeRuntime?.embeddingProvider() ??
127
- discoveredInfo.workspaceIndex?.embedding?.provider;
128
- if (provider && provider !== "qwen") {
129
- return undefined;
130
- }
131
- }
132
- const cachedInfo = activeRuntime
133
- ? this.statusCache.get(canonicalRoot)
134
- : undefined;
135
- let info;
136
- if (cachedInfo) {
137
- info = cachedInfo;
138
- }
139
- else {
140
- try {
141
- info = await this.inspectRoot(canonicalRoot, true);
142
- this.statusCache.set(canonicalRoot, info);
143
- }
144
- catch (error) {
145
- const cached = this.statusCache.get(canonicalRoot);
146
- if (!cached ||
147
- !isEngineError(error) ||
148
- error.code !== "ZVEC_GREP.ENGINE.LOCK.BUSY") {
149
- throw error;
150
- }
151
- info = cached;
152
- }
153
- }
154
- const schema = info.workspaceIndex?.embedding;
155
- if (!info.indexed || !schema || schema.provider !== "qwen") {
156
- return undefined;
157
- }
158
- const modelLoadRequest = this.searchModelLoadRequest(info, input);
159
- const modelInfo = await this.loadEmbeddingModelInfo(modelLoadRequest);
160
- return await planRemoteSearchAuthorization({
161
- info,
162
- model: modelInfo,
163
- search: input,
164
- runtimeNeedsReconciliation: this.runtimeManager
165
- .getByCanonicalRoot(canonicalRoot)
166
- ?.needsReconciliation() ?? false,
167
- store: this.authorizationManager.store,
168
- });
169
- }
170
- async existingRemoteEmbeddingPermit(plan) {
171
- return await this.authorizationManager.existingWorkspacePermit(plan);
172
- }
173
- async grantRemoteEmbedding(plan, scope) {
174
- return await this.authorizationManager.grant(plan, scope);
175
- }
176
- async index(input, options = {}) {
177
- if (input.drop === true) {
178
- assertDropOnlyInput(input);
179
- const result = await this.dropIndex(input);
180
- return {
181
- root: result.root,
182
- jobId: "drop",
183
- state: "succeeded",
184
- reused: false,
185
- action: "drop",
186
- dropped: result.removed,
187
- };
188
- }
189
- const requestedRoot = await resolveRequestedRoot(input.root, true);
190
- this.assertRootNotDropping(requestedRoot);
191
- const runtime = await this.runtimeManager.activateForIndex(requestedRoot);
192
- this.ensureWatcher(runtime);
193
- const activeJob = this.scheduler.getByRoot(runtime.canonicalRoot);
194
- const followsNarrowJob = activeJob?.state === "queued" || activeJob?.state === "running"
195
- ? activeJob.reason === "watch"
196
- : false;
197
- const createsWork = !this.scheduler.hasActiveRoot(runtime.canonicalRoot) ||
198
- input.rebuild === true ||
199
- followsNarrowJob;
200
- if (createsWork) {
201
- this.lastScanDiagnostics.delete(runtime.canonicalRoot);
202
- }
203
- const targetRevision = createsWork
204
- ? runtime.markDirty()
205
- : runtime.snapshot().dirtyRevision;
206
- const submitted = this.scheduler.submit({
207
- canonicalRoot: runtime.canonicalRoot,
208
- reason: "manual",
209
- followupIfRunning: input.rebuild === true || followsNarrowJob,
210
- run: async (report, signal) => {
211
- const proof = await this.runIndex(runtime, input, report, options.authorization, signal);
212
- this.lastScanDiagnostics.set(runtime.canonicalRoot, proof.scanDiagnostics);
213
- if (proof.reconciled) {
214
- runtime.markReconciled(targetRevision, proof.reconciliationEpoch);
215
- }
216
- else {
217
- runtime.markIndexed(targetRevision);
218
- }
219
- },
220
- });
221
- const job = input.wait
222
- ? await this.scheduler.wait(submitted.job.id, options.onProgress)
223
- : submitted.job;
224
- if (input.wait) {
225
- await this.settleKnownChanges(runtime);
226
- }
227
- this.options.logger?.event("job.submitted", {
228
- root_id: rootIdentity(runtime.canonicalRoot),
229
- job_id: job.id,
230
- reason: "manual",
231
- state: job.state,
232
- reused: submitted.reused,
233
- });
234
- return {
235
- root: runtime.canonicalRoot,
236
- jobId: job.id,
237
- state: job.state,
238
- reused: submitted.reused,
239
- action: "index",
240
- error: job.error,
241
- ...(input.debug === true && input.wait === true
242
- ? {
243
- scanDiagnostics: this.lastScanDiagnostics.get(runtime.canonicalRoot),
244
- }
245
- : {}),
246
- };
247
- }
248
- async dropIndex(input) {
249
- const canonicalRoot = await resolveRequestedRoot(input.root, true);
250
- if (this.droppingRoots.has(canonicalRoot)) {
251
- throw new DaemonError("INDEX_DROP_IN_PROGRESS", "The Workspace index is already being dropped.");
252
- }
253
- this.droppingRoots.add(canonicalRoot);
254
- try {
255
- await this.closeWatcher(canonicalRoot);
256
- this.scheduler.cancelRoot(canonicalRoot);
257
- await this.scheduler.waitForRootIdle(canonicalRoot);
258
- const runtime = this.runtimeManager.getByCanonicalRoot(canonicalRoot);
259
- const drop = async () => {
260
- const service = await (this.options.createService ?? createZvecGrep)({
261
- ...this.options.serviceOptions,
262
- root: canonicalRoot,
263
- daemonInstanceToken: this.runtimeManager.instanceToken,
264
- });
265
- try {
266
- return await service.dropIndex({ root: canonicalRoot });
267
- }
268
- finally {
269
- await service.close();
270
- }
271
- };
272
- const removed = runtime ? await runtime.withWrite(drop) : await drop();
273
- this.options.logger?.event("index.dropped", {
274
- root_id: rootIdentity(canonicalRoot),
275
- dropped: removed,
276
- });
277
- return { root: canonicalRoot, removed };
278
- }
279
- finally {
280
- this.statusCache.delete(canonicalRoot);
281
- this.lastScanDiagnostics.delete(canonicalRoot);
282
- this.workspaceRuntimeCache.delete(canonicalRoot);
283
- try {
284
- await this.runtimeManager.evict(canonicalRoot);
285
- }
286
- finally {
287
- this.droppingRoots.delete(canonicalRoot);
288
- }
289
- }
290
- }
291
- async search(input, options = {}) {
292
- const startedAt = Date.now();
293
- const requestedRoot = await resolveRequestedRoot(input.root, false);
294
- this.assertRootNotDropping(requestedRoot);
295
- const runtime = await this.runtimeManager.activate(requestedRoot);
296
- const releaseRuntimeActivity = runtime.beginActivity();
297
- try {
298
- const searchInfo = await this.inspectRootWithCache(runtime.canonicalRoot);
299
- const currentModelLoadRequest = runtime.currentModelLoadRequest();
300
- const defaultModelLoadRequest = searchInfo.indexed
301
- ? this.searchModelLoadRequest(searchInfo, {})
302
- : currentModelLoadRequest;
303
- if (!defaultModelLoadRequest) {
304
- throw new DaemonError("INDEX_MISSING", "Search requires an existing workspace index.");
305
- }
306
- const searchModelLoadRequest = searchInfo.indexed
307
- ? this.searchModelLoadRequest(searchInfo, input)
308
- : this.overrideActiveModelLoadRequest(defaultModelLoadRequest, input);
309
- runtime.updateModelLoadRequest(defaultModelLoadRequest);
310
- this.ensureWatcher(runtime);
311
- await runtime.probeInitialFreshness(async () => {
312
- const info = await this.inspectRoot(runtime.canonicalRoot, true);
313
- this.statusCache.set(runtime.canonicalRoot, info);
314
- return indexStatusIsFresh(info);
315
- }, (initialFreshness) => {
316
- this.options.logger?.event(`runtime.initial_probe_${initialFreshness}`, {
317
- root_id: rootIdentity(runtime.canonicalRoot),
318
- });
319
- });
320
- let updateJob;
321
- const executeSearch = () => withRemoteEmbeddingOperationPermit(options.authorization, () => runtime.search({
322
- queries: input.queries,
323
- routes: input.routes,
324
- fuse: input.fuse,
325
- limit: input.limit,
326
- trace: input.trace,
327
- preferSymbol: input.preferSymbol,
328
- symbolTypes: input.symbolTypes,
329
- globs: normalizePlainStringList(input.globs),
330
- insensitiveGlobs: normalizePlainStringList(input.insensitiveGlobs),
331
- fileTypes: normalizePlainStringList(input.fileTypes),
332
- excludedFileTypes: normalizePlainStringList(input.excludedFileTypes),
333
- hidden: input.hidden,
334
- noIgnore: input.noIgnore,
335
- ignoreFiles: input.ignoreFiles,
336
- maxDepth: input.maxDepth,
337
- maxFileSizeBytes: input.maxFileSizeBytes,
338
- follow: input.follow,
339
- embeddingConcurrency: input.embeddingConcurrency,
340
- modifiedAfter: input.modifiedAfter,
341
- modifiedBefore: input.modifiedBefore,
342
- autoUpdate: false,
343
- }, searchModelLoadRequest));
344
- let result;
345
- if (input.freshness === "wait_for_fresh") {
346
- while (true) {
347
- updateJob =
348
- (await this.waitForFresh(runtime, options.authorization, input)) ??
349
- updateJob;
350
- const beforeSearch = runtime.snapshot();
351
- result = await executeSearch();
352
- const afterSearch = runtime.snapshot();
353
- if (!afterSearch.watcherPending &&
354
- afterSearch.watcherEpoch === beforeSearch.watcherEpoch &&
355
- !runtime.needsReconciliation()) {
356
- break;
357
- }
358
- }
359
- }
360
- else {
361
- result = await executeSearch();
362
- }
363
- if (runtime.needsReconciliation() &&
364
- input.autoUpdate &&
365
- (runtime.requiresFullReconciliation() ||
366
- !this.scheduler.hasActiveRoot(runtime.canonicalRoot))) {
367
- const currentJob = this.scheduler.getByRoot(runtime.canonicalRoot);
368
- const terminalKnownPathJob = !runtime.requiresFullReconciliation() &&
369
- (currentJob?.state === "failed" || currentJob?.state === "cancelled");
370
- if (runtime.needsReconciliation() && !terminalKnownPathJob) {
371
- updateJob = await this.submitIndex(runtime, {
372
- root: runtime.canonicalRoot,
373
- apiKey: input.apiKey,
374
- device: input.device,
375
- runtimeOverridesAreEphemeral: true,
376
- }, "background_reconcile", false, options.authorization);
377
- }
378
- }
379
- const job = updateJob ?? this.scheduler.getByRoot(runtime.canonicalRoot);
380
- const runtimeSnapshot = runtime.snapshot();
381
- const activeKnownChangeJob = job?.reason !== "background_reconcile" &&
382
- (job?.state === "queued" || job?.state === "running");
383
- const freshness = runtime.hasKnownChanges() ||
384
- runtimeSnapshot.watcherPending ||
385
- activeKnownChangeJob
386
- ? "possibly_stale"
387
- : "fresh";
388
- const response = {
389
- root: runtime.canonicalRoot,
390
- freshness,
391
- indexing: freshness === "possibly_stale"
392
- ? searchIndexingSnapshot(job, this.currentIndexCompletion(runtime.canonicalRoot, job, runtime))
393
- : undefined,
394
- result,
395
- };
396
- this.options.logger?.event("search.completed", {
397
- root_id: rootIdentity(runtime.canonicalRoot),
398
- duration_ms: Date.now() - startedAt,
399
- freshness: response.freshness,
400
- result_count: result.items.length,
401
- });
402
- return response;
403
- }
404
- finally {
405
- releaseRuntimeActivity();
406
- }
407
- }
408
- currentIndexCompletion(canonicalRoot, job, runtime) {
409
- // Narrow watcher updates skip the status scan, so the cached completion
410
- // still describes the previous fresh snapshot rather than the active job.
411
- if (job?.reason === "watch" &&
412
- runtime.needsReconciliation() &&
413
- !runtime.requiresFullReconciliation()) {
414
- return undefined;
415
- }
416
- return indexCompletionFromStatus(this.statusCache.get(canonicalRoot)?.status);
417
- }
418
- async indexStatus(input) {
419
- const requestedCanonicalRoot = await resolveRequestedRoot(input.root, false);
420
- let info;
421
- try {
422
- info = await inspectRoot(input.root, this.options.serviceOptions);
423
- this.statusCache.set(requestedCanonicalRoot, info);
424
- }
425
- catch (error) {
426
- const cached = this.statusCache.get(requestedCanonicalRoot);
427
- if (!cached ||
428
- !isEngineError(error) ||
429
- error.code !== "ZVEC_GREP.ENGINE.LOCK.BUSY") {
430
- throw error;
431
- }
432
- info = cached;
433
- }
434
- const canonicalRoot = await resolveRequestedRoot(info.root, false);
435
- const runtime = this.runtimeManager.getByCanonicalRoot(canonicalRoot);
436
- const runtimeSnapshot = runtime?.snapshot();
437
- const job = this.scheduler.getByRoot(canonicalRoot);
438
- return {
439
- root: canonicalRoot,
440
- indexed: info.indexed,
441
- indexPolicy: info.indexPolicy,
442
- source: info.source,
443
- persistent: persistentStatus(info),
444
- runtime: runtimeSnapshot
445
- ? {
446
- watcherActive: runtimeSnapshot.watcherActive,
447
- dirtyRevision: runtimeSnapshot.dirtyRevision,
448
- indexedRevision: runtimeSnapshot.indexedRevision,
449
- activeJobId: job?.id,
450
- jobState: job?.state,
451
- progress: job?.progress ? formatProgress(job) : undefined,
452
- completion: indexCompletionForJob(indexCompletionFromStatus(info.status), job?.state, job?.progress),
453
- error: job?.error,
454
- }
455
- : undefined,
456
- };
457
- }
458
- async serverStatus() {
459
- const runtime = this.runtimeManager.snapshot();
460
- const models = this.modelPool.snapshot();
461
- const jobs = this.scheduler.snapshot();
462
- return {
463
- version: this.options.version,
464
- uptimeMs: Date.now() - this.startedAt,
465
- shuttingDown: this.shuttingDown,
466
- activeRuntimes: runtime.activeRuntimes,
467
- queuedJobs: jobs.queued,
468
- runningJobs: jobs.running,
469
- models,
470
- };
471
- }
472
- async rg(input) {
473
- const startedAt = Date.now();
474
- const canonicalRoot = await resolveRequestedRoot(input.root, false);
475
- const service = await (this.options.createService ?? createZvecGrep)({
476
- ...this.options.serviceOptions,
477
- root: canonicalRoot,
478
- daemonInstanceToken: this.runtimeManager.instanceToken,
479
- });
480
- try {
481
- const result = await service.context({
482
- ...contextOptionsFromRgInput({ ...input, root: canonicalRoot }),
483
- root: canonicalRoot,
484
- autoUpdate: false,
485
- });
486
- this.options.logger?.event("rg.completed", {
487
- root_id: rootIdentity(canonicalRoot),
488
- duration_ms: Date.now() - startedAt,
489
- result_count: result.items.length,
490
- });
491
- return {
492
- root: canonicalRoot,
493
- result,
494
- };
495
- }
496
- finally {
497
- await service.close();
498
- }
499
- }
500
- async close() {
501
- if (this.closePromise) {
502
- return this.closePromise;
503
- }
504
- this.shuttingDown = true;
505
- this.closePromise = (async () => {
506
- await Promise.all([...this.watchers.values()].map((watcher) => watcher.close()));
507
- for (const root of this.watchers.keys()) {
508
- this.runtimeManager.getByCanonicalRoot(root)?.setWatcherActive(false);
509
- }
510
- this.watchers.clear();
511
- this.indexCoordinators.clear();
512
- await this.scheduler.close();
513
- await this.runtimeManager.close();
514
- await this.modelPool.close();
515
- this.lastScanDiagnostics.clear();
516
- this.workspaceRuntimeCache.clear();
517
- })();
518
- return this.closePromise;
519
- }
520
- async runIndex(runtime, input, report, authorization, signal) {
521
- const releaseRuntimeActivity = runtime.beginActivity();
522
- try {
523
- return await this.runIndexOperation(runtime, input, report, authorization, signal);
524
- }
525
- finally {
526
- releaseRuntimeActivity();
527
- }
528
- }
529
- async runIndexOperation(runtime, input, report, authorization, signal) {
530
- const startedAt = Date.now();
531
- // Watcher path updates already identify their indexing scope. Uncertain
532
- // watcher reconciliations are verified by the final status scan, so neither
533
- // path needs another workspace-wide status scan before indexing starts.
534
- const includeInitialStatus = input.skipInitialStatus !== true &&
535
- input.rebuild !== true &&
536
- input.changedPaths === undefined;
537
- const includeFinalStatus = input.changedPaths === undefined;
538
- const before = await this.inspectRoot(runtime.canonicalRoot, includeInitialStatus);
539
- if (includeInitialStatus) {
540
- this.statusCache.set(runtime.canonicalRoot, before);
541
- }
542
- const modelLoadRequest = this.indexModelLoadRequest(before, input);
543
- const model = modelLoadRequest.model;
544
- runtime.updateModelLoadRequest(modelLoadRequest);
545
- let lease;
546
- try {
547
- lease = await this.modelPool.acquire(modelLoadRequest);
548
- }
549
- catch (error) {
550
- if (isEngineError(error)) {
551
- throw error;
552
- }
553
- throw new DaemonError("MODEL_LOAD_FAILED", `Embedding model ${embeddingModelReference(model)} could not be created: ${error instanceof Error ? error.message : String(error)}`);
554
- }
555
- let service;
556
- let scanDiagnostics;
557
- try {
558
- service = await (this.options.createService ?? createZvecGrep)({
559
- ...this.options.serviceOptions,
560
- root: runtime.canonicalRoot,
561
- embeddingModel: lease.model,
562
- embeddingModelOwnership: "borrowed",
563
- embedding: input.runtimeOverridesAreEphemeral
564
- ? undefined
565
- : input.embedding,
566
- apiKey: input.runtimeOverridesAreEphemeral ? undefined : input.apiKey,
567
- endpoint: input.runtimeOverridesAreEphemeral
568
- ? undefined
569
- : input.endpoint,
570
- device: input.runtimeOverridesAreEphemeral ? undefined : input.device,
571
- daemonInstanceToken: this.runtimeManager.instanceToken,
572
- });
573
- const result = await runtime.withWrite(() => withRemoteEmbeddingOperationPermit(authorization, () => service.index({
574
- root: runtime.canonicalRoot,
575
- rebuild: input.rebuild,
576
- resetPaths: input.resetPaths,
577
- globs: normalizePlainStringList(input.globs),
578
- insensitiveGlobs: normalizePlainStringList(input.insensitiveGlobs),
579
- fileTypes: normalizePlainStringList(input.fileTypes),
580
- excludedFileTypes: normalizePlainStringList(input.excludedFileTypes),
581
- hidden: input.hidden,
582
- noIgnore: input.noIgnore,
583
- ignoreFiles: normalizePlainStringList(input.ignoreFiles),
584
- maxDepth: input.maxDepth,
585
- maxFileSizeBytes: input.maxFileSizeBytes,
586
- follow: input.follow,
587
- embeddingConcurrency: input.embeddingConcurrency,
588
- changedPaths: input.changedPaths,
589
- signal,
590
- onProgress: report,
591
- onWriterContext: (context) => runtime.setWriterContext(context, lease.key),
592
- })));
593
- scanDiagnostics = result.scanDiagnostics;
594
- }
595
- finally {
596
- try {
597
- await service?.close();
598
- }
599
- finally {
600
- lease.release();
601
- }
602
- }
603
- if (includeFinalStatus) {
604
- await this.watchers.get(runtime.canonicalRoot)?.flushPending();
605
- }
606
- const proofReconciliationEpoch = runtime.reconciliationEpoch();
607
- const after = await this.inspectRoot(runtime.canonicalRoot, includeFinalStatus);
608
- if (includeFinalStatus) {
609
- this.statusCache.set(runtime.canonicalRoot, after);
610
- await this.watchers.get(runtime.canonicalRoot)?.refreshPaths?.();
611
- }
612
- if (!after.workspaceIndex?.embedding) {
613
- throw new DaemonError("INDEX_MISSING", "Index completed without an embedding schema.");
614
- }
615
- runtime.updateModelLoadRequest(this.searchModelLoadRequest(after, {}));
616
- this.options.logger?.event("index.completed", {
617
- root_id: rootIdentity(runtime.canonicalRoot),
618
- duration_ms: Date.now() - startedAt,
619
- scope: input.changedPaths ? "paths" : "reconcile",
620
- changed_paths: input.changedPaths?.length,
621
- });
622
- const reconciled = includeFinalStatus && indexStatusIsFresh(after);
623
- if (includeFinalStatus && !reconciled) {
624
- runtime.requireFullReconciliation(true);
625
- }
626
- return {
627
- reconciled,
628
- reconciliationEpoch: proofReconciliationEpoch,
629
- scanDiagnostics,
630
- };
631
- }
632
- async submitIndex(runtime, input, reason, wait, authorization) {
633
- const createsWork = !this.scheduler.hasActiveRoot(runtime.canonicalRoot) ||
634
- input.rebuild === true;
635
- const probeBeforeUpdate = reason === "background_reconcile" && runtime.canProbeFullReconciliation();
636
- let targetRevision = createsWork && !probeBeforeUpdate
637
- ? runtime.markDirty()
638
- : runtime.snapshot().dirtyRevision;
639
- const followsNarrowWatch = this.scheduler.getByRoot(runtime.canonicalRoot)?.reason === "watch";
640
- const submitted = this.scheduler.submit({
641
- canonicalRoot: runtime.canonicalRoot,
642
- reason,
643
- followupIfRunning: followsNarrowWatch,
644
- run: async (report, signal) => {
645
- if (probeBeforeUpdate) {
646
- if ((await this.probeCurrentFreshness(runtime)) === "fresh") {
647
- return;
648
- }
649
- if (createsWork) {
650
- targetRevision = runtime.markDirty();
651
- }
652
- }
653
- const proof = await this.runIndex(runtime, input, report, authorization, signal);
654
- if (proof.reconciled) {
655
- runtime.markReconciled(targetRevision, proof.reconciliationEpoch);
656
- }
657
- else {
658
- runtime.markIndexed(targetRevision);
659
- }
660
- },
661
- });
662
- if (!wait)
663
- return submitted.job;
664
- const job = await this.scheduler.wait(submitted.job.id);
665
- await this.scheduler.waitForRootIdle(runtime.canonicalRoot);
666
- return job;
667
- }
668
- ensureWatcher(runtime) {
669
- if (this.watchers.has(runtime.canonicalRoot) || this.shuttingDown) {
670
- return;
671
- }
672
- const coordinator = new IndexCoordinator({
673
- runtime,
674
- scheduler: this.scheduler,
675
- run: async (changes, report, signal) => {
676
- const changedPaths = [
677
- ...changes.touchedFiles,
678
- ...changes.rescanDirectories,
679
- ...changes.deletedPrefixes,
680
- ];
681
- if (!changes.forceFullReconcile && changedPaths.length === 0) {
682
- return;
683
- }
684
- const automaticAuthorization = await this.automaticIndexAuthorization(runtime);
685
- if (!automaticAuthorization.allowed) {
686
- throw new DaemonError("REMOTE_EMBEDDING_AUTH_REQUIRED", "A Workspace Remote Embedding grant is required for file-watcher index updates.");
687
- }
688
- return await this.runIndex(runtime, {
689
- root: runtime.canonicalRoot,
690
- changedPaths: changes.forceFullReconcile ? undefined : changedPaths,
691
- skipInitialStatus: changes.forceFullReconcile,
692
- }, report, automaticAuthorization.authorization, signal);
693
- },
694
- });
695
- const watcher = (this.options.watchManagerFactory ??
696
- ((options) => new WatchManager(options)))({
697
- root: runtime.canonicalRoot,
698
- onChanges: async (changes, reason) => {
699
- const pathCount = changes.touchedFiles.length +
700
- changes.rescanDirectories.length +
701
- changes.deletedPrefixes.length;
702
- if (changes.forceFullReconcile && pathCount === 0) {
703
- runtime.requireFullReconciliation(true);
704
- this.options.logger?.event("watcher.reconciliation_probe_requested", {
705
- root_id: rootIdentity(runtime.canonicalRoot),
706
- reason,
707
- active_job: this.scheduler.hasActiveRoot(runtime.canonicalRoot),
708
- });
709
- return;
710
- }
711
- const automaticAuthorization = await this.automaticIndexAuthorization(runtime);
712
- if (!automaticAuthorization.allowed) {
713
- runtime.markDirty();
714
- runtime.requireFullReconciliation();
715
- this.options.logger?.event("watcher.authorization_required", {
716
- root_id: rootIdentity(runtime.canonicalRoot),
717
- reason,
718
- });
719
- return;
720
- }
721
- this.options.logger?.event(changes.forceFullReconcile ? "watcher.overflow" : "watcher.changes", {
722
- root_id: rootIdentity(runtime.canonicalRoot),
723
- reason,
724
- touched_files: changes.touchedFiles.length,
725
- rescan_directories: changes.rescanDirectories.length,
726
- deleted_prefixes: changes.deletedPrefixes.length,
727
- });
728
- coordinator.enqueue(changes, reason);
729
- },
730
- onPendingChange: (pending) => runtime.setWatcherPending(pending),
731
- onActivity: () => runtime.recordWatcherActivity(),
732
- getRootPaths: () => this.statusCache.get(runtime.canonicalRoot)?.workspaceIndex?.rootPaths,
733
- });
734
- watcher.start();
735
- this.indexCoordinators.set(runtime.canonicalRoot, coordinator);
736
- this.watchers.set(runtime.canonicalRoot, watcher);
737
- runtime.setWatcherActive(true);
738
- }
739
- async settleKnownChanges(runtime) {
740
- const watcher = this.watchers.get(runtime.canonicalRoot);
741
- while (true) {
742
- await watcher?.flushPending();
743
- await this.scheduler.waitForRootIdle(runtime.canonicalRoot);
744
- const job = this.scheduler.getByRoot(runtime.canonicalRoot);
745
- const snapshot = runtime.snapshot();
746
- if (job?.state === "failed" ||
747
- job?.state === "cancelled" ||
748
- !snapshot.watcherPending) {
749
- return;
750
- }
751
- }
752
- }
753
- async automaticIndexAuthorization(runtime) {
754
- const knownProvider = runtime.embeddingProvider();
755
- if (knownProvider && knownProvider !== "qwen")
756
- return { allowed: true };
757
- const root = runtime.canonicalRoot;
758
- const info = await this.inspectRoot(root, false);
759
- const schema = info.workspaceIndex?.embedding;
760
- if (!schema || schema.provider !== "qwen")
761
- return { allowed: true };
762
- const modelInfo = await this.loadEmbeddingModelInfo(this.searchModelLoadRequest(info, {}));
763
- const plan = await planRemoteIndexAuthorization({
764
- info,
765
- model: modelInfo,
766
- needsUpdate: true,
767
- store: this.authorizationManager.store,
768
- });
769
- if (!plan)
770
- return { allowed: true };
771
- const authorization = await this.authorizationManager.existingWorkspacePermit(plan);
772
- return authorization
773
- ? { allowed: true, authorization }
774
- : { allowed: false };
775
- }
776
- async waitForFresh(runtime, authorization, runtimeOverrides = {}) {
777
- let updateJob;
778
- while (true) {
779
- await this.settleKnownChanges(runtime);
780
- if (!runtime.needsReconciliation()) {
781
- return updateJob;
782
- }
783
- if (!runtime.requiresFullReconciliation() ||
784
- runtime.canProbeFullReconciliation() ||
785
- this.scheduler.getByRoot(runtime.canonicalRoot)?.state === "failed" ||
786
- this.scheduler.getByRoot(runtime.canonicalRoot)?.state === "cancelled") {
787
- const freshness = await this.probeCurrentFreshness(runtime);
788
- if (freshness === "fresh") {
789
- return updateJob;
790
- }
791
- }
792
- const currentJob = this.scheduler.getByRoot(runtime.canonicalRoot);
793
- if (!runtime.requiresFullReconciliation() &&
794
- (currentJob?.state === "failed" || currentJob?.state === "cancelled")) {
795
- throw new DaemonError(currentJob.error?.code ?? "INDEX_FAILED", currentJob.error?.message ??
796
- "Known index changes did not complete successfully.");
797
- }
798
- updateJob = await this.submitIndex(runtime, {
799
- root: runtime.canonicalRoot,
800
- apiKey: runtimeOverrides.apiKey,
801
- device: runtimeOverrides.device,
802
- runtimeOverridesAreEphemeral: true,
803
- }, "fresh_query", true, authorization);
804
- if (updateJob.state !== "succeeded") {
805
- throw new DaemonError(updateJob.error?.code ?? "INDEX_FAILED", updateJob.error?.message ??
806
- "Index reconciliation did not complete successfully.");
807
- }
808
- }
809
- }
810
- async loadEmbeddingModelInfo(request) {
811
- const lease = await this.modelPool.acquire(request);
812
- try {
813
- return lease.model.info;
814
- }
815
- finally {
816
- lease.release();
817
- }
818
- }
819
- async probeCurrentFreshness(runtime) {
820
- const releaseRuntimeActivity = runtime.beginActivity();
821
- try {
822
- const freshness = await runtime.probeFreshness(async () => {
823
- const info = await this.inspectRoot(runtime.canonicalRoot, true);
824
- this.statusCache.set(runtime.canonicalRoot, info);
825
- return indexStatusIsFresh(info);
826
- });
827
- this.options.logger?.event(`runtime.recovery_probe_${freshness}`, {
828
- root_id: rootIdentity(runtime.canonicalRoot),
829
- });
830
- return freshness;
831
- }
832
- finally {
833
- releaseRuntimeActivity();
834
- }
835
- }
836
- async closeWatcher(canonicalRoot) {
837
- const watcher = this.watchers.get(canonicalRoot);
838
- this.watchers.delete(canonicalRoot);
839
- this.indexCoordinators.delete(canonicalRoot);
840
- await watcher?.close();
841
- }
842
- assertRootNotDropping(canonicalRoot) {
843
- if (this.droppingRoots.has(canonicalRoot)) {
844
- throw new DaemonError("INDEX_DROP_IN_PROGRESS", "The Workspace index is being dropped.", true);
845
- }
846
- }
847
- indexModel(info, input) {
848
- if (info.workspaceIndex?.embedding && !input.embedding) {
849
- return {
850
- provider: info.workspaceIndex.embedding.provider,
851
- name: info.workspaceIndex.embedding.model,
852
- };
853
- }
854
- const reference = resolveEmbeddingReference({
855
- explicit: input.embedding ?? this.options.serviceOptions?.embedding,
856
- environment: {
857
- ZVEC_GREP_EMBEDDING: input.embeddingEnvironment ?? process.env.ZVEC_GREP_EMBEDDING,
858
- },
859
- globalDefault: readGlobalConfig().defaults?.embedding,
860
- fallback: DEFAULT_LOCAL_EMBEDDING,
861
- });
862
- if (!reference) {
863
- throw new DaemonError("MODEL_LOAD_FAILED", "A new index requires embedding or an explicit server default model.");
864
- }
865
- return parseEmbeddingModelReference(reference);
866
- }
867
- indexModelLoadRequest(info, input) {
868
- const model = this.indexModel(info, input);
869
- const workspaceRuntime = info.workspaceIndex?.embedding?.provider === model.provider
870
- ? this.readWorkspaceEmbeddingRuntime(info)
871
- : {};
872
- const runtime = this.resolveModelRuntime(model, workspaceRuntime, input);
873
- if (input.rebuild !== true &&
874
- info.workspaceIndex?.embedding &&
875
- workspaceRuntime.endpoint !== runtime.endpoint) {
876
- throw new DaemonError("EMBEDDING_ENDPOINT_MISMATCH", "The requested embedding endpoint differs from the workspace snapshot; use rebuild to change endpoints.");
877
- }
878
- return { model, runtime };
879
- }
880
- searchModelLoadRequest(info, overrides) {
881
- const schema = info.workspaceIndex?.embedding;
882
- if (!info.indexed || !schema) {
883
- throw new DaemonError("INDEX_MISSING", "Search requires an existing workspace index.");
884
- }
885
- const model = {
886
- provider: schema.provider,
887
- name: schema.model,
888
- };
889
- const workspaceRuntime = this.readWorkspaceEmbeddingRuntime(info);
890
- const runtime = this.resolveModelRuntime(model, workspaceRuntime, overrides);
891
- return { model, runtime };
892
- }
893
- resolveModelRuntime(model, workspaceRuntime, overrides) {
894
- const serviceOptions = this.options.serviceOptions;
895
- return resolveEmbeddingRuntimeOptions(embeddingModelReference(model), {
896
- apiKey: overrides.apiKey ?? serviceOptions?.apiKey,
897
- endpoint: overrides.endpoint ?? serviceOptions?.endpoint,
898
- device: overrides.device ?? serviceOptions?.device,
899
- }, workspaceRuntime, readGlobalConfig());
900
- }
901
- overrideActiveModelLoadRequest(request, overrides) {
902
- const runtime = resolveEmbeddingRuntimeOptions(embeddingModelReference(request.model), overrides, request.runtime ?? {}, readGlobalConfig());
903
- return { model: request.model, runtime };
904
- }
905
- readWorkspaceEmbeddingRuntime(info) {
906
- try {
907
- const runtime = readWorkspaceEmbeddingRuntime(info);
908
- this.workspaceRuntimeCache.set(info.root, runtime);
909
- return runtime;
910
- }
911
- catch (error) {
912
- const cached = this.workspaceRuntimeCache.get(info.root);
913
- if (cached &&
914
- isEngineError(error) &&
915
- (error.code === "ZVEC_GREP.ENGINE.STORAGE.ZVEC_OPEN_FAILED" ||
916
- error.code === "ZVEC_GREP.ENGINE.LOCK.BUSY")) {
917
- return cached;
918
- }
919
- throw error;
920
- }
921
- }
922
- async inspectRootWithCache(root) {
923
- const cached = this.statusCache.get(root);
924
- if (cached) {
925
- return cached;
926
- }
927
- try {
928
- const info = await this.inspectRoot(root, false);
929
- this.statusCache.set(root, info);
930
- return info;
931
- }
932
- catch (error) {
933
- const fallback = this.statusCache.get(root);
934
- if (fallback &&
935
- isEngineError(error) &&
936
- error.code === "ZVEC_GREP.ENGINE.LOCK.BUSY") {
937
- return fallback;
938
- }
939
- throw error;
940
- }
941
- }
942
- async inspectRoot(root, includeStatus) {
943
- return await (this.options.inspectRoot ?? inspectRoot)(root, this.options.serviceOptions, includeStatus);
944
- }
945
- }
946
- function readWorkspaceEmbeddingRuntime(info) {
947
- if (!info.workspaceIndex)
948
- return {};
949
- const location = workspaceIndexLocation(info.root);
950
- return readWorkspaceManifest(location.home)?.embeddingRuntime ?? {};
951
- }
952
- function indexStatusIsFresh(info) {
953
- const status = info.status;
954
- return (status !== null &&
955
- status !== undefined &&
956
- status.filesAdded === 0 &&
957
- status.filesModified === 0 &&
958
- status.filesDeleted === 0 &&
959
- status.filesPending === 0 &&
960
- status.filesFailed === 0);
961
- }
962
- function assertDropOnlyInput(input) {
963
- const conflicts = [
964
- [input.embedding !== undefined, "embedding"],
965
- [input.apiKey !== undefined, "apiKey"],
966
- [input.endpoint !== undefined, "endpoint"],
967
- [input.device !== undefined, "device"],
968
- [input.rebuild !== undefined, "rebuild"],
969
- [input.resetPaths !== undefined, "resetPaths"],
970
- [input.globs !== undefined, "globs"],
971
- [input.insensitiveGlobs !== undefined, "insensitiveGlobs"],
972
- [input.fileTypes !== undefined, "fileTypes"],
973
- [input.excludedFileTypes !== undefined, "excludedFileTypes"],
974
- [input.hidden !== undefined, "hidden"],
975
- [input.noIgnore !== undefined, "noIgnore"],
976
- [input.ignoreFiles !== undefined, "ignoreFiles"],
977
- [input.maxDepth !== undefined, "maxDepth"],
978
- [input.maxFileSizeBytes !== undefined, "maxFileSizeBytes"],
979
- [input.follow !== undefined, "follow"],
980
- [input.embeddingConcurrency !== undefined, "embeddingConcurrency"],
981
- [input.wait !== undefined, "wait"],
982
- ];
983
- const names = conflicts
984
- .filter(([conflictsWithDrop]) => conflictsWithDrop)
985
- .map(([, name]) => name);
986
- if (names.length > 0) {
987
- throw new DaemonError("INVALID_ARGUMENT", `zvec_grep_index drop cannot be combined with ${names.join(", ")}.`);
988
- }
989
- }
990
- function embeddingSchema(model) {
991
- return {
992
- provider: model.info.provider,
993
- model: model.info.name,
994
- dimension: model.info.dimension,
995
- metric: model.info.metric,
996
- };
997
- }
998
- function parseEmbeddingModelReference(reference) {
999
- const separator = reference.indexOf("/");
1000
- if (separator <= 0 || separator === reference.length - 1) {
1001
- throw new DaemonError("MODEL_LOAD_FAILED", `Embedding model reference ${reference} is invalid.`);
1002
- }
1003
- return {
1004
- provider: reference.slice(0, separator),
1005
- name: reference.slice(separator + 1),
1006
- };
1007
- }
1008
- function embeddingModelReference(model) {
1009
- return `${model.provider}/${model.name}`;
1010
- }
1011
- function persistentStatus(info) {
1012
- return {
1013
- home: info.home,
1014
- index_path: info.indexPath,
1015
- workspace_index: info.workspaceIndex
1016
- ? {
1017
- id: info.workspaceIndex.id,
1018
- name: info.workspaceIndex.name,
1019
- path: info.workspaceIndex.path,
1020
- root_paths: info.workspaceIndex.rootPaths.map((rootPath) => ({
1021
- absolute_path: rootPath.absolutePath,
1022
- recursive: rootPath.recursive,
1023
- include: rootPath.include ? [...rootPath.include] : undefined,
1024
- exclude: rootPath.exclude ? [...rootPath.exclude] : undefined,
1025
- globs: rootPath.globs ? [...rootPath.globs] : undefined,
1026
- insensitive_globs: rootPath.insensitiveGlobs
1027
- ? [...rootPath.insensitiveGlobs]
1028
- : undefined,
1029
- file_types: rootPath.fileTypes
1030
- ? [...rootPath.fileTypes]
1031
- : undefined,
1032
- excluded_file_types: rootPath.excludedFileTypes
1033
- ? [...rootPath.excludedFileTypes]
1034
- : undefined,
1035
- hidden: rootPath.hidden,
1036
- no_ignore: rootPath.noIgnore,
1037
- ignore_files: rootPath.ignoreFiles
1038
- ? [...rootPath.ignoreFiles]
1039
- : undefined,
1040
- max_depth: rootPath.maxDepth,
1041
- max_file_size_bytes: rootPath.maxFileSizeBytes,
1042
- follow: rootPath.follow,
1043
- })),
1044
- embedding: info.workspaceIndex.embedding,
1045
- index_version: info.workspaceIndex.indexVersion,
1046
- created_time: info.workspaceIndex.createdTime,
1047
- updated_time: info.workspaceIndex.updatedTime,
1048
- }
1049
- : undefined,
1050
- files: info.status
1051
- ? {
1052
- stored: info.status.filesStored,
1053
- scanned: info.status.filesScanned,
1054
- indexed: info.status.filesIndexed,
1055
- pending: info.status.filesPending,
1056
- failed: info.status.filesFailed,
1057
- added: info.status.filesAdded,
1058
- modified: info.status.filesModified,
1059
- deleted: info.status.filesDeleted,
1060
- unchanged: info.status.filesUnchanged,
1061
- entities: info.status.entitiesIndexed,
1062
- truncated_fragments: info.status.fragmentsTruncated,
1063
- }
1064
- : undefined,
1065
- suggestion: info.suggestion,
1066
- };
1067
- }
1068
- function formatProgress(job) {
1069
- const progress = job.progress;
1070
- if (!progress) {
1071
- return undefined;
1072
- }
1073
- return {
1074
- phase: progress.phase,
1075
- files_total: progress.filesTotal,
1076
- files_indexed: progress.filesIndexed,
1077
- files_failed: progress.filesFailed,
1078
- detail: progress.detail,
1079
- };
1080
- }
1081
- function searchIndexingSnapshot(job, completion) {
1082
- const state = !job || job.state === "succeeded" ? "idle" : job.state;
1083
- const effectiveCompletion = indexCompletionForJob(completion, job?.state, job?.progress);
1084
- return {
1085
- state,
1086
- ...effectiveCompletion,
1087
- };
1088
- }
1089
- //# sourceMappingURL=backend.js.map