@zvec/zvec-grep 0.1.4 → 0.1.6

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 (356) hide show
  1. package/README.md +86 -162
  2. package/README_CN.md +80 -162
  3. package/dist/authorization/index.d.ts +7 -0
  4. package/dist/authorization/index.js +7 -0
  5. package/dist/authorization/index.js.map +1 -0
  6. package/dist/authorization/manager.d.ts +8 -0
  7. package/dist/authorization/manager.js +19 -0
  8. package/dist/authorization/manager.js.map +1 -0
  9. package/dist/authorization/operation.d.ts +7 -0
  10. package/dist/authorization/operation.js +50 -0
  11. package/dist/authorization/operation.js.map +1 -0
  12. package/dist/authorization/planner.d.ts +21 -0
  13. package/dist/authorization/planner.js +97 -0
  14. package/dist/authorization/planner.js.map +1 -0
  15. package/dist/authorization/prompt.d.ts +11 -0
  16. package/dist/authorization/prompt.js +62 -0
  17. package/dist/authorization/prompt.js.map +1 -0
  18. package/dist/authorization/store.d.ts +20 -0
  19. package/dist/authorization/store.js +251 -0
  20. package/dist/authorization/store.js.map +1 -0
  21. package/dist/authorization/target.d.ts +15 -0
  22. package/dist/authorization/target.js +49 -0
  23. package/dist/authorization/target.js.map +1 -0
  24. package/dist/authorization/types.d.ts +61 -0
  25. package/dist/authorization/types.js +2 -0
  26. package/dist/authorization/types.js.map +1 -0
  27. package/dist/cli/args.d.ts +3 -0
  28. package/dist/cli/args.js +749 -201
  29. package/dist/cli/args.js.map +1 -1
  30. package/dist/cli/auth.d.ts +21 -0
  31. package/dist/cli/auth.js +212 -0
  32. package/dist/cli/auth.js.map +1 -0
  33. package/dist/cli/commands.d.ts +3 -1
  34. package/dist/cli/commands.js +529 -180
  35. package/dist/cli/commands.js.map +1 -1
  36. package/dist/cli/errors.js +7 -6
  37. package/dist/cli/errors.js.map +1 -1
  38. package/dist/cli/format/context.d.ts +1 -0
  39. package/dist/cli/format/context.js +270 -70
  40. package/dist/cli/format/context.js.map +1 -1
  41. package/dist/cli/format/debug.js +14 -16
  42. package/dist/cli/format/debug.js.map +1 -1
  43. package/dist/cli/format/highlight.js.map +1 -1
  44. package/dist/cli/format/progress.d.ts +4 -0
  45. package/dist/cli/format/progress.js +222 -44
  46. package/dist/cli/format/progress.js.map +1 -1
  47. package/dist/cli/format/range.js.map +1 -1
  48. package/dist/cli/format/status.d.ts +77 -6
  49. package/dist/cli/format/status.js +343 -114
  50. package/dist/cli/format/status.js.map +1 -1
  51. package/dist/cli/help.d.ts +1 -1
  52. package/dist/cli/help.js +368 -84
  53. package/dist/cli/help.js.map +1 -1
  54. package/dist/cli/index.js +4 -4
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/install.d.ts +4 -0
  57. package/dist/cli/install.js +845 -0
  58. package/dist/cli/install.js.map +1 -0
  59. package/dist/cli/managed-rg.d.ts +10 -0
  60. package/dist/cli/managed-rg.js +329 -0
  61. package/dist/cli/managed-rg.js.map +1 -0
  62. package/dist/cli/types.d.ts +40 -13
  63. package/dist/cli/types.js.map +1 -1
  64. package/dist/cli/version.js +3 -1
  65. package/dist/cli/version.js.map +1 -1
  66. package/dist/client/daemon-client.d.ts +19 -0
  67. package/dist/client/daemon-client.js +180 -0
  68. package/dist/client/daemon-client.js.map +1 -0
  69. package/dist/client/mode-router.d.ts +9 -0
  70. package/dist/client/mode-router.js +28 -0
  71. package/dist/client/mode-router.js.map +1 -0
  72. package/dist/client/search-policy.d.ts +11 -0
  73. package/dist/client/search-policy.js +15 -0
  74. package/dist/client/search-policy.js.map +1 -0
  75. package/dist/daemon/backend.d.ts +76 -0
  76. package/dist/daemon/backend.js +1049 -0
  77. package/dist/daemon/backend.js.map +1 -0
  78. package/dist/daemon/change-set.d.ts +25 -0
  79. package/dist/daemon/change-set.js +101 -0
  80. package/dist/daemon/change-set.js.map +1 -0
  81. package/dist/daemon/config.d.ts +24 -0
  82. package/dist/daemon/config.js +88 -0
  83. package/dist/daemon/config.js.map +1 -0
  84. package/dist/daemon/errors.d.ts +5 -0
  85. package/dist/daemon/errors.js +11 -0
  86. package/dist/daemon/errors.js.map +1 -0
  87. package/dist/daemon/http-server.d.ts +30 -0
  88. package/dist/daemon/http-server.js +287 -0
  89. package/dist/daemon/http-server.js.map +1 -0
  90. package/dist/daemon/index-coordinator.d.ts +23 -0
  91. package/dist/daemon/index-coordinator.js +68 -0
  92. package/dist/daemon/index-coordinator.js.map +1 -0
  93. package/dist/daemon/job-scheduler.d.ts +70 -0
  94. package/dist/daemon/job-scheduler.js +366 -0
  95. package/dist/daemon/job-scheduler.js.map +1 -0
  96. package/dist/daemon/logger.d.ts +9 -0
  97. package/dist/daemon/logger.js +53 -0
  98. package/dist/daemon/logger.js.map +1 -0
  99. package/dist/daemon/model-pool.d.ts +45 -0
  100. package/dist/daemon/model-pool.js +187 -0
  101. package/dist/daemon/model-pool.js.map +1 -0
  102. package/dist/daemon/root-lease.d.ts +14 -0
  103. package/dist/daemon/root-lease.js +188 -0
  104. package/dist/daemon/root-lease.js.map +1 -0
  105. package/dist/daemon/root-runtime.d.ts +78 -0
  106. package/dist/daemon/root-runtime.js +333 -0
  107. package/dist/daemon/root-runtime.js.map +1 -0
  108. package/dist/daemon/runtime-manager.d.ts +45 -0
  109. package/dist/daemon/runtime-manager.js +243 -0
  110. package/dist/daemon/runtime-manager.js.map +1 -0
  111. package/dist/daemon/runtime.d.ts +12 -0
  112. package/dist/daemon/runtime.js +102 -0
  113. package/dist/daemon/runtime.js.map +1 -0
  114. package/dist/daemon/server-controller.d.ts +39 -0
  115. package/dist/daemon/server-controller.js +203 -0
  116. package/dist/daemon/server-controller.js.map +1 -0
  117. package/dist/daemon/watch-manager.d.ts +50 -0
  118. package/dist/daemon/watch-manager.js +293 -0
  119. package/dist/daemon/watch-manager.js.map +1 -0
  120. package/dist/daemon/workspace-read-session-cache.d.ts +31 -0
  121. package/dist/daemon/workspace-read-session-cache.js +115 -0
  122. package/dist/daemon/workspace-read-session-cache.js.map +1 -0
  123. package/dist/engine/config.d.ts +50 -0
  124. package/dist/engine/config.js +321 -0
  125. package/dist/engine/config.js.map +1 -0
  126. package/dist/engine/{errors/index.d.ts → errors.d.ts} +6 -1
  127. package/dist/engine/{errors/details.js → errors.js} +17 -4
  128. package/dist/engine/errors.js.map +1 -0
  129. package/dist/engine/extraction/code/adapter.d.ts +1 -1
  130. package/dist/engine/extraction/code/adapter.js.map +1 -1
  131. package/dist/engine/extraction/code/extractor.d.ts +5 -11
  132. package/dist/engine/extraction/code/extractor.js +184 -109
  133. package/dist/engine/extraction/code/extractor.js.map +1 -1
  134. package/dist/engine/extraction/code/families/c-family.js +13 -7
  135. package/dist/engine/extraction/code/families/c-family.js.map +1 -1
  136. package/dist/engine/extraction/code/families/js-ts.d.ts +1 -1
  137. package/dist/engine/extraction/code/families/js-ts.js +24 -18
  138. package/dist/engine/extraction/code/families/js-ts.js.map +1 -1
  139. package/dist/engine/extraction/code/families/metadata.d.ts +1 -1
  140. package/dist/engine/extraction/code/families/metadata.js +11 -8
  141. package/dist/engine/extraction/code/families/metadata.js.map +1 -1
  142. package/dist/engine/extraction/code/families/name-field.js +5 -5
  143. package/dist/engine/extraction/code/families/name-field.js.map +1 -1
  144. package/dist/engine/extraction/code/languages/c.js +1 -4
  145. package/dist/engine/extraction/code/languages/c.js.map +1 -1
  146. package/dist/engine/extraction/code/languages/cpp.js.map +1 -1
  147. package/dist/engine/extraction/code/languages/go.js +1 -3
  148. package/dist/engine/extraction/code/languages/go.js.map +1 -1
  149. package/dist/engine/extraction/code/languages/java.js.map +1 -1
  150. package/dist/engine/extraction/code/languages/javascript.js +1 -3
  151. package/dist/engine/extraction/code/languages/javascript.js.map +1 -1
  152. package/dist/engine/extraction/code/languages/python.js +5 -6
  153. package/dist/engine/extraction/code/languages/python.js.map +1 -1
  154. package/dist/engine/extraction/code/languages/rust.js +1 -5
  155. package/dist/engine/extraction/code/languages/rust.js.map +1 -1
  156. package/dist/engine/extraction/code/languages/typescript.js.map +1 -1
  157. package/dist/engine/extraction/code/tree-sitter/grammar.js.map +1 -0
  158. package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.js +2 -1
  159. package/dist/engine/extraction/code/tree-sitter/nodes.js.map +1 -0
  160. package/dist/engine/extraction/code/tree-sitter/parser.js.map +1 -0
  161. package/dist/engine/extraction/ids.js.map +1 -1
  162. package/dist/engine/extraction/image/extractor.d.ts +5 -0
  163. package/dist/engine/extraction/image/extractor.js +35 -0
  164. package/dist/engine/extraction/image/extractor.js.map +1 -0
  165. package/dist/engine/extraction/index.d.ts +3 -44
  166. package/dist/engine/extraction/index.js +1 -280
  167. package/dist/engine/extraction/index.js.map +1 -1
  168. package/dist/engine/extraction/markdown/extractor.d.ts +5 -11
  169. package/dist/engine/extraction/markdown/extractor.js +37 -16
  170. package/dist/engine/extraction/markdown/extractor.js.map +1 -1
  171. package/dist/engine/extraction/runtime.d.ts +4 -0
  172. package/dist/engine/extraction/runtime.js +26 -0
  173. package/dist/engine/extraction/runtime.js.map +1 -0
  174. package/dist/engine/extraction/source.d.ts +18 -0
  175. package/dist/engine/extraction/source.js +22 -0
  176. package/dist/engine/extraction/source.js.map +1 -0
  177. package/dist/engine/extraction/text/extractor.d.ts +7 -0
  178. package/dist/engine/extraction/text/extractor.js +168 -0
  179. package/dist/engine/extraction/text/extractor.js.map +1 -0
  180. package/dist/engine/extraction/types.d.ts +4 -0
  181. package/dist/engine/{models → extraction}/types.js.map +1 -1
  182. package/dist/engine/{files/file-type.d.ts → file-type.d.ts} +1 -1
  183. package/dist/engine/file-type.js.map +1 -0
  184. package/dist/engine/index-status.d.ts +9 -0
  185. package/dist/engine/index-status.js +38 -0
  186. package/dist/engine/index-status.js.map +1 -0
  187. package/dist/engine/manifest.d.ts +12 -0
  188. package/dist/engine/manifest.js +120 -0
  189. package/dist/engine/manifest.js.map +1 -0
  190. package/dist/engine/models/{providers/llama-cpp/embedding.d.ts → backends/llama-cpp.d.ts} +25 -20
  191. package/dist/engine/models/{providers/llama-cpp/embedding.js → backends/llama-cpp.js} +165 -113
  192. package/dist/engine/models/backends/llama-cpp.js.map +1 -0
  193. package/dist/engine/models/backends/model2vec.d.ts +57 -0
  194. package/dist/engine/models/backends/model2vec.js +332 -0
  195. package/dist/engine/models/backends/model2vec.js.map +1 -0
  196. package/dist/engine/models/backends/qwen.d.ts +44 -0
  197. package/dist/engine/models/{providers/qwen/embedding.js → backends/qwen.js} +168 -102
  198. package/dist/engine/models/backends/qwen.js.map +1 -0
  199. package/dist/engine/models/backends/transformers-js.d.ts +87 -0
  200. package/dist/engine/models/backends/transformers-js.js +316 -0
  201. package/dist/engine/models/backends/transformers-js.js.map +1 -0
  202. package/dist/engine/models/catalog.d.ts +188 -23
  203. package/dist/engine/models/catalog.js +172 -41
  204. package/dist/engine/models/catalog.js.map +1 -1
  205. package/dist/engine/models/download-progress.d.ts +15 -0
  206. package/dist/engine/models/download-progress.js +48 -0
  207. package/dist/engine/models/download-progress.js.map +1 -0
  208. package/dist/engine/models/embeddings.d.ts +58 -18
  209. package/dist/engine/models/embeddings.js +53 -29
  210. package/dist/engine/models/embeddings.js.map +1 -1
  211. package/dist/engine/models/factory.d.ts +2 -5
  212. package/dist/engine/models/factory.js +41 -56
  213. package/dist/engine/models/factory.js.map +1 -1
  214. package/dist/engine/models/index.d.ts +4 -6
  215. package/dist/engine/models/index.js +4 -4
  216. package/dist/engine/models/index.js.map +1 -1
  217. package/dist/engine/models/ranking.d.ts +7 -3
  218. package/dist/engine/models/resolution.d.ts +8 -0
  219. package/dist/engine/models/resolution.js +22 -0
  220. package/dist/engine/models/resolution.js.map +1 -0
  221. package/dist/engine/pipeline/indexing/index.d.ts +9 -7
  222. package/dist/engine/pipeline/indexing/index.js +399 -147
  223. package/dist/engine/pipeline/indexing/index.js.map +1 -1
  224. package/dist/engine/pipeline/indexing/root-paths.js +16 -19
  225. package/dist/engine/pipeline/indexing/root-paths.js.map +1 -1
  226. package/dist/engine/pipeline/indexing/scanner/index.d.ts +6 -1
  227. package/dist/engine/pipeline/indexing/scanner/index.js +318 -66
  228. package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
  229. package/dist/engine/pipeline/search/index.d.ts +6 -6
  230. package/dist/engine/pipeline/search/index.js +76 -34
  231. package/dist/engine/pipeline/search/index.js.map +1 -1
  232. package/dist/engine/service/index.d.ts +3 -2
  233. package/dist/engine/service/index.js +1 -1
  234. package/dist/engine/service/index.js.map +1 -1
  235. package/dist/engine/service/lexical.d.ts +14 -15
  236. package/dist/engine/service/lexical.js +78 -119
  237. package/dist/engine/service/lexical.js.map +1 -1
  238. package/dist/engine/service/root.d.ts +13 -12
  239. package/dist/engine/service/root.js +35 -24
  240. package/dist/engine/service/root.js.map +1 -1
  241. package/dist/engine/service/structure-enrichment.js +29 -25
  242. package/dist/engine/service/structure-enrichment.js.map +1 -1
  243. package/dist/engine/service/types.d.ts +61 -35
  244. package/dist/engine/service/workspace-index.d.ts +24 -0
  245. package/dist/engine/service/workspace-index.js +151 -0
  246. package/dist/engine/service/workspace-index.js.map +1 -0
  247. package/dist/engine/service/zvec-grep.d.ts +12 -1
  248. package/dist/engine/service/zvec-grep.js +878 -544
  249. package/dist/engine/service/zvec-grep.js.map +1 -1
  250. package/dist/engine/storage/index.d.ts +8 -4
  251. package/dist/engine/storage/index.js +1 -1
  252. package/dist/engine/storage/index.js.map +1 -1
  253. package/dist/engine/storage/zvec.d.ts +10 -33
  254. package/dist/engine/storage/zvec.js +110 -49
  255. package/dist/engine/storage/zvec.js.map +1 -1
  256. package/dist/engine/types.d.ts +29 -23
  257. package/dist/engine/types.js +1 -1
  258. package/dist/engine/types.js.map +1 -1
  259. package/dist/engine/utils/daemon-lease.d.ts +17 -0
  260. package/dist/engine/utils/daemon-lease.js +175 -0
  261. package/dist/engine/utils/daemon-lease.js.map +1 -0
  262. package/dist/engine/utils/file-selection.d.ts +10 -0
  263. package/dist/engine/utils/file-selection.js +157 -0
  264. package/dist/engine/utils/file-selection.js.map +1 -0
  265. package/dist/engine/utils/glob.d.ts +3 -0
  266. package/dist/engine/utils/glob.js +116 -18
  267. package/dist/engine/utils/glob.js.map +1 -1
  268. package/dist/engine/utils/hash.js.map +1 -1
  269. package/dist/engine/utils/json.d.ts +6 -2
  270. package/dist/engine/utils/json.js +50 -12
  271. package/dist/engine/utils/json.js.map +1 -1
  272. package/dist/engine/utils/lock.js +7 -7
  273. package/dist/engine/utils/lock.js.map +1 -1
  274. package/dist/engine/utils/path.js +2 -2
  275. package/dist/engine/utils/path.js.map +1 -1
  276. package/dist/engine/utils/timing.js.map +1 -1
  277. package/dist/index-progress.d.ts +10 -0
  278. package/dist/index-progress.js +159 -0
  279. package/dist/index-progress.js.map +1 -0
  280. package/dist/index.d.ts +6 -6
  281. package/dist/index.js +3 -3
  282. package/dist/index.js.map +1 -1
  283. package/dist/mcp/http-transport.d.ts +27 -0
  284. package/dist/mcp/http-transport.js +182 -0
  285. package/dist/mcp/http-transport.js.map +1 -0
  286. package/dist/mcp/input-normalization.d.ts +38 -0
  287. package/dist/mcp/input-normalization.js +95 -0
  288. package/dist/mcp/input-normalization.js.map +1 -0
  289. package/dist/mcp/progress-heartbeat.d.ts +17 -0
  290. package/dist/mcp/progress-heartbeat.js +46 -0
  291. package/dist/mcp/progress-heartbeat.js.map +1 -0
  292. package/dist/mcp/request-metadata.d.ts +2 -0
  293. package/dist/mcp/request-metadata.js +11 -0
  294. package/dist/mcp/request-metadata.js.map +1 -0
  295. package/dist/mcp/request-state.d.ts +40 -0
  296. package/dist/mcp/request-state.js +210 -0
  297. package/dist/mcp/request-state.js.map +1 -0
  298. package/dist/mcp/result-format.d.ts +13 -0
  299. package/dist/mcp/result-format.js +75 -0
  300. package/dist/mcp/result-format.js.map +1 -0
  301. package/dist/mcp/schemas.d.ts +430 -0
  302. package/dist/mcp/schemas.js +447 -0
  303. package/dist/mcp/schemas.js.map +1 -0
  304. package/dist/mcp/tools.d.ts +150 -0
  305. package/dist/mcp/tools.js +448 -0
  306. package/dist/mcp/tools.js.map +1 -0
  307. package/dist/mcp/toolset.d.ts +5 -0
  308. package/dist/mcp/toolset.js +12 -0
  309. package/dist/mcp/toolset.js.map +1 -0
  310. package/dist/observability/trace-context.d.ts +11 -0
  311. package/dist/observability/trace-context.js +138 -0
  312. package/dist/observability/trace-context.js.map +1 -0
  313. package/docs/01-agents.md +111 -0
  314. package/docs/02-cli.md +229 -0
  315. package/docs/03-mcp.md +167 -0
  316. package/docs/04-pipeline.md +218 -0
  317. package/docs/05-architecture.md +86 -0
  318. package/docs/06-server.md +210 -0
  319. package/docs/07-embedding.md +179 -0
  320. package/docs/08-roadmap.md +85 -0
  321. package/docs/README.md +53 -0
  322. package/package.json +43 -7
  323. package/skills/zvec-grep/SKILL.md +43 -123
  324. package/skills/zvec-grep/agents/openai.yaml +2 -2
  325. package/skills/zvec-grep/references/cli-fallback.md +85 -0
  326. package/dist/engine/collection/index.d.ts +0 -55
  327. package/dist/engine/collection/index.js +0 -710
  328. package/dist/engine/collection/index.js.map +0 -1
  329. package/dist/engine/errors/details.d.ts +0 -6
  330. package/dist/engine/errors/details.js.map +0 -1
  331. package/dist/engine/errors/index.js +0 -16
  332. package/dist/engine/errors/index.js.map +0 -1
  333. package/dist/engine/extraction/tree-sitter/grammar.js.map +0 -1
  334. package/dist/engine/extraction/tree-sitter/nodes.js.map +0 -1
  335. package/dist/engine/extraction/tree-sitter/parser.js.map +0 -1
  336. package/dist/engine/files/file-type.js.map +0 -1
  337. package/dist/engine/models/providers/index.d.ts +0 -2
  338. package/dist/engine/models/providers/index.js +0 -3
  339. package/dist/engine/models/providers/index.js.map +0 -1
  340. package/dist/engine/models/providers/llama-cpp/embedding.js.map +0 -1
  341. package/dist/engine/models/providers/llama-cpp/index.d.ts +0 -1
  342. package/dist/engine/models/providers/llama-cpp/index.js +0 -2
  343. package/dist/engine/models/providers/llama-cpp/index.js.map +0 -1
  344. package/dist/engine/models/providers/qwen/embedding.d.ts +0 -42
  345. package/dist/engine/models/providers/qwen/embedding.js.map +0 -1
  346. package/dist/engine/models/providers/qwen/index.d.ts +0 -1
  347. package/dist/engine/models/providers/qwen/index.js +0 -2
  348. package/dist/engine/models/providers/qwen/index.js.map +0 -1
  349. package/dist/engine/models/types.d.ts +0 -30
  350. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.d.ts +0 -0
  351. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.js +0 -0
  352. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.d.ts +0 -0
  353. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.d.ts +0 -0
  354. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.js +0 -0
  355. /package/dist/engine/{models → extraction}/types.js +0 -0
  356. /package/dist/engine/{files/file-type.js → file-type.js} +0 -0
@@ -1,53 +1,272 @@
1
1
  import { resolve } from "node:path";
2
+ import { createInterface } from "node:readline/promises";
2
3
  import { createZvecGrep, } from "../index.js";
3
- import { findNearestAnonymousWorkspace } from "../engine/service/root.js";
4
- import { contextWarningLines, printAgentContextResult, printHumanContextResult } from "./format/context.js";
4
+ import { globalConfigPath, updateGlobalConfig } from "../engine/config.js";
5
+ import { listEmbeddingModels } from "../engine/models/index.js";
6
+ import { DaemonClient } from "../client/daemon-client.js";
7
+ import { resolveDirectSearchPolicy, resolveServerSearchPolicy, } from "../client/search-policy.js";
8
+ import { resolveClientMode, resolveServerUrl, routeByMode, } from "../client/mode-router.js";
9
+ import { serverStatus } from "../daemon/server-controller.js";
10
+ import { findNearestWorkspace } from "../engine/service/root.js";
11
+ import { contextWarningLines, printAgentContextResult, printHumanContextResult, } from "./format/context.js";
12
+ import { createHighlighter, shouldUseColor } from "./format/highlight.js";
5
13
  import { printDebug } from "./format/debug.js";
6
14
  import { createIndexProgressReporter } from "./format/progress.js";
7
- import { printAnonymousInfo, printCollectionInfo, printCollectionList, printCollectionRemoveResult, printIndexPathFilterTip, printIndexResult, } from "./format/status.js";
15
+ import { printWorkspaceInfo, printIndexPathFilterTip, printIndexResult, printServerIndexInfo, } from "./format/status.js";
16
+ import { planRemoteIndexAuthorization, planRemoteSearchAuthorization, } from "../authorization/index.js";
17
+ import { indexCompletionFromStatus, indexStatusNeedsRefresh, } from "../engine/index-status.js";
18
+ import { indexProgressFromMessage } from "../index-progress.js";
19
+ import { normalizeManagedRgInput } from "./managed-rg.js";
20
+ import { runInstall, runUninstall } from "./install.js";
21
+ import { runAuth, authorizationStore, authorizeCliPlan, resolveAuthorizationSchema, embeddingModelInfo, configuredEmbeddingReference, workspaceRuntimeFromInfo, assertEmbeddingModelCompatible, assertRequestedEndpointCompatible, requireEmbeddingModelCatalogEntry, unsupportedRemoteEmbeddingProvider, withRemoteEmbeddingOperationPermit, } from "./auth.js";
8
22
  export async function runParsedCommand(parsed) {
9
- if (parsed.options.index) {
10
- await runIndex(parsed);
11
- return;
23
+ switch (parsed.command) {
24
+ case "query":
25
+ await runQuery(parsed);
26
+ return;
27
+ case "index":
28
+ await runIndex(parsed);
29
+ return;
30
+ case "status":
31
+ await runStatus(parsed);
32
+ return;
33
+ case "install":
34
+ await runInstall(parsed);
35
+ return;
36
+ case "uninstall":
37
+ await runUninstall(parsed);
38
+ return;
39
+ case "config":
40
+ await runConfig(parsed);
41
+ return;
42
+ case "auth":
43
+ await runAuth(parsed);
44
+ return;
45
+ case "server":
46
+ await runServer(parsed);
47
+ return;
48
+ case "help":
49
+ case "version":
50
+ throw new Error(`${parsed.command} must be handled before dispatch`);
12
51
  }
13
- if (parsed.options.disableIndex) {
14
- await runDisableIndex(parsed);
15
- return;
52
+ }
53
+ async function runConfig(parsed) {
54
+ if (parsed.positionals.length !== 1) {
55
+ throw new Error(`zg config ${parsed.options.configAction === "provider-set" ? "provider" : "model"} set requires exactly one reference`);
16
56
  }
17
- if (parsed.options.status) {
18
- await runStatus(parsed);
57
+ const reference = parsed.positionals[0];
58
+ if (parsed.options.configAction === "provider-set") {
59
+ if (!/^[a-z][a-z0-9_-]*$/.test(reference)) {
60
+ throw unsupportedRemoteEmbeddingProvider(reference, "Invalid embedding provider");
61
+ }
62
+ if (reference === "local" ||
63
+ !listEmbeddingModels().some((entry) => entry.provider === reference)) {
64
+ throw unsupportedRemoteEmbeddingProvider(reference);
65
+ }
66
+ if (parsed.options.apiKey === undefined) {
67
+ throw new Error("zg config provider set requires --api-key");
68
+ }
69
+ updateGlobalConfig({
70
+ providers: {
71
+ [reference]: {
72
+ apiKey: parsed.options.apiKey,
73
+ },
74
+ },
75
+ });
76
+ console.log(`Provider config: ${reference}`);
77
+ console.log(`Global config: ${globalConfigPath()}`);
19
78
  return;
20
79
  }
21
- if (parsed.options.collections) {
22
- await runCollections(parsed);
23
- return;
80
+ if (parsed.options.configAction !== "model-set") {
81
+ throw new Error("zg config requires provider set or model set");
82
+ }
83
+ const catalogEntry = requireEmbeddingModelCatalogEntry(reference);
84
+ if (parsed.options.endpoint === undefined &&
85
+ parsed.options.device === undefined &&
86
+ !parsed.options.defaultModel) {
87
+ throw new Error("zg config model set requires --endpoint, --device, or --default");
88
+ }
89
+ if (catalogEntry.provider === "local" &&
90
+ parsed.options.endpoint !== undefined) {
91
+ throw new Error("--endpoint is only supported for remote embedding models");
92
+ }
93
+ if (catalogEntry.provider !== "local" &&
94
+ parsed.options.device !== undefined) {
95
+ throw new Error("--device is only supported for local embedding models");
96
+ }
97
+ if (parsed.options.endpoint !== undefined) {
98
+ assertHttpEndpoint(parsed.options.endpoint);
99
+ }
100
+ updateGlobalConfig({
101
+ ...(parsed.options.endpoint !== undefined ||
102
+ parsed.options.device !== undefined
103
+ ? {
104
+ models: {
105
+ [reference]: {
106
+ ...(parsed.options.endpoint !== undefined
107
+ ? { endpoint: parsed.options.endpoint }
108
+ : {}),
109
+ ...(parsed.options.device !== undefined
110
+ ? { device: parsed.options.device }
111
+ : {}),
112
+ },
113
+ },
114
+ }
115
+ : {}),
116
+ ...(parsed.options.defaultModel
117
+ ? { defaults: { embedding: reference } }
118
+ : {}),
119
+ });
120
+ console.log(`Model config: ${reference}`);
121
+ console.log(`Global config: ${globalConfigPath()}`);
122
+ }
123
+ function assertHttpEndpoint(endpoint) {
124
+ let parsed;
125
+ try {
126
+ parsed = new URL(endpoint);
127
+ }
128
+ catch {
129
+ throw new Error("--endpoint must be a valid HTTP(S) URL");
130
+ }
131
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
132
+ throw new Error("--endpoint must be a valid HTTP(S) URL");
24
133
  }
25
- await runQuery(parsed);
26
134
  }
27
135
  async function runIndex(parsed) {
28
136
  const explicitRoot = parsed.positionals.length > 0;
29
137
  const root = resolveIndexRoot(parsed.positionals[0]);
30
138
  const rootPath = indexRootPath(root, parsed.options);
31
139
  if (parsed.positionals.length > 1) {
32
- throw new Error("zg --index accepts at most one root path");
140
+ throw new Error("zg index accepts at most one root path");
141
+ }
142
+ if (parsed.options.drop) {
143
+ await runDropIndex(parsed, rootPath.absolutePath);
144
+ return;
145
+ }
146
+ if (parsed.options.embedding) {
147
+ requireEmbeddingModelCatalogEntry(parsed.options.embedding);
33
148
  }
34
- const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, rootPath.absolutePath));
35
- const progress = createIndexProgressReporter();
149
+ const mode = resolveClientMode(parsed.options.mode);
150
+ await routeByMode({
151
+ mode,
152
+ serverAvailable: () => daemonIsReady(parsed.options.home),
153
+ server: async () => {
154
+ const progress = createIndexProgressReporter({
155
+ color: parsed.options.color,
156
+ });
157
+ let result;
158
+ try {
159
+ result = await daemonClient(parsed.options).callTool("zvec_grep_index", {
160
+ root: rootPath.absolutePath,
161
+ embedding: parsed.options.embedding,
162
+ apiKey: parsed.options.apiKey,
163
+ endpoint: parsed.options.endpoint,
164
+ device: parsed.options.device,
165
+ rebuild: parsed.options.rebuild,
166
+ resetPaths: parsed.options.resetPaths,
167
+ globs: parsed.options.globs,
168
+ insensitiveGlobs: parsed.options.insensitiveGlobs,
169
+ fileTypes: parsed.options.fileTypes,
170
+ excludedFileTypes: parsed.options.excludedFileTypes,
171
+ hidden: parsed.options.hidden,
172
+ noIgnore: parsed.options.noIgnore,
173
+ ignoreFiles: parsed.options.ignoreFiles,
174
+ maxDepth: parsed.options.maxDepth,
175
+ maxFileSizeBytes: parsed.options.maxFileSizeBytes,
176
+ follow: parsed.options.follow,
177
+ embeddingConcurrency: parsed.options.embeddingConcurrency,
178
+ wait: true,
179
+ }, {
180
+ onProgress: (event) => {
181
+ const update = indexProgressFromMessage(event.message);
182
+ if (update) {
183
+ progress.report(update.progress);
184
+ }
185
+ },
186
+ embeddingEnvironment: process.env.ZVEC_GREP_EMBEDDING?.trim(),
187
+ });
188
+ }
189
+ finally {
190
+ progress.finish();
191
+ }
192
+ console.log(`Workspace index: ${String(result.state ?? "submitted")}`);
193
+ console.log(`Root: ${String(result.root ?? rootPath.absolutePath)}`);
194
+ console.log(`Job: ${String(result.job_id ?? "unknown")}`);
195
+ if (result.state === "failed") {
196
+ throw new Error(serverIndexFailureMessage(result));
197
+ }
198
+ },
199
+ direct: () => runDirectIndex(parsed, rootPath, explicitRoot),
200
+ });
201
+ }
202
+ function serverIndexFailureMessage(result) {
203
+ const error = result.error;
204
+ if (error && typeof error === "object") {
205
+ const code = error.code;
206
+ const message = error.message;
207
+ if (typeof message === "string" && message.length > 0) {
208
+ if (typeof code !== "string" ||
209
+ code.length === 0 ||
210
+ message.includes(`[${code}]`)) {
211
+ return message;
212
+ }
213
+ return `[${code}] ${message}`;
214
+ }
215
+ if (typeof code === "string" && code.length > 0) {
216
+ return `[${code}] Index job failed.`;
217
+ }
218
+ }
219
+ return `Index job ${String(result.job_id ?? "unknown")} failed. Run zg status --mode server for details.`;
220
+ }
221
+ async function runDirectIndex(parsed, rootPath, explicitRoot) {
222
+ const serviceOptions = createServiceOptions(parsed.options, rootPath.absolutePath);
223
+ const zvecGrep = await createZvecGrep(serviceOptions);
224
+ const progress = createIndexProgressReporter({ color: parsed.options.color });
36
225
  try {
226
+ const infoBefore = await zvecGrep.info({
227
+ root: rootPath.absolutePath,
228
+ includeStatus: parsed.options.rebuild !== true,
229
+ });
230
+ const schema = resolveAuthorizationSchema(configuredEmbeddingReference(parsed.options, infoBefore.workspaceIndex?.embedding), infoBefore.workspaceIndex?.embedding);
231
+ assertEmbeddingModelCompatible(infoBefore.workspaceIndex?.embedding, schema, parsed.options.rebuild === true);
232
+ const workspaceRuntime = workspaceRuntimeFromInfo(infoBefore);
233
+ assertRequestedEndpointCompatible(infoBefore, workspaceRuntime, parsed.options.endpoint, parsed.options.rebuild === true);
234
+ const modelInfo = schema?.provider === "qwen"
235
+ ? await embeddingModelInfo(schema, serviceOptions, workspaceRuntime)
236
+ : undefined;
237
+ const plan = modelInfo
238
+ ? await planRemoteIndexAuthorization({
239
+ info: infoBefore,
240
+ model: modelInfo,
241
+ rebuild: parsed.options.rebuild,
242
+ store: authorizationStore(parsed.options),
243
+ })
244
+ : undefined;
245
+ const authorizationResolution = plan
246
+ ? await authorizeCliPlan(plan, parsed.options)
247
+ : {};
37
248
  printIndexPathFilterTip(parsed.options);
38
- const result = await zvecGrep.index({
249
+ const result = await withRemoteEmbeddingOperationPermit(authorizationResolution.authorization, () => zvecGrep.index({
39
250
  root: rootPath.absolutePath,
40
251
  rootPaths: explicitRoot ? [rootPath] : undefined,
41
252
  rebuild: parsed.options.rebuild,
42
253
  resetPaths: parsed.options.resetPaths,
43
- includePaths: parsed.options.includePaths,
44
- excludePaths: parsed.options.excludePaths,
254
+ globs: parsed.options.globs,
255
+ insensitiveGlobs: parsed.options.insensitiveGlobs,
256
+ fileTypes: parsed.options.fileTypes,
257
+ excludedFileTypes: parsed.options.excludedFileTypes,
258
+ hidden: parsed.options.hidden,
259
+ noIgnore: parsed.options.noIgnore,
260
+ ignoreFiles: parsed.options.ignoreFiles,
261
+ maxDepth: parsed.options.maxDepth,
262
+ maxFileSizeBytes: parsed.options.maxFileSizeBytes,
263
+ follow: parsed.options.follow,
45
264
  embeddingConcurrency: parsed.options.embeddingConcurrency,
46
265
  onProgress: progress.report,
47
- });
266
+ }));
48
267
  progress.finish();
49
268
  const info = await zvecGrep.info({ root: rootPath.absolutePath });
50
- printIndexResult("Indexed anonymous workspace", result, parsed.options, info.collection?.rootPaths);
269
+ printIndexResult("Workspace index", result, parsed.options, info.workspaceIndex?.rootPaths);
51
270
  }
52
271
  catch (error) {
53
272
  progress.finish();
@@ -57,131 +276,186 @@ async function runIndex(parsed) {
57
276
  await zvecGrep.close();
58
277
  }
59
278
  }
60
- async function runDisableIndex(parsed) {
61
- const root = resolveIndexRoot(parsed.positionals[0]);
62
- if (parsed.positionals.length > 1) {
63
- throw new Error("zg --disable-index accepts at most one root path");
279
+ async function runDropIndex(parsed, root) {
280
+ if (!(await confirmIndexDrop(root, parsed.options.yes === true))) {
281
+ console.log("Index drop cancelled.");
282
+ return;
64
283
  }
65
- const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, root));
284
+ const printResult = (removed) => {
285
+ console.log(removed ? `Dropped index for ${root}` : `No index found for ${root}`);
286
+ };
287
+ await routeByMode({
288
+ mode: resolveClientMode(parsed.options.mode),
289
+ serverAvailable: () => daemonIsReady(parsed.options.home),
290
+ server: async () => {
291
+ const result = await daemonClient(parsed.options).callTool("zvec_grep_index_drop", { root });
292
+ printResult(result.removed === true);
293
+ },
294
+ direct: async () => {
295
+ const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, root));
296
+ try {
297
+ printResult(await zvecGrep.dropIndex({ root }));
298
+ }
299
+ finally {
300
+ await zvecGrep.close();
301
+ }
302
+ },
303
+ });
304
+ }
305
+ async function confirmIndexDrop(root, accepted) {
306
+ if (accepted) {
307
+ return true;
308
+ }
309
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
310
+ throw new Error("zg index --drop requires --yes in a non-interactive shell");
311
+ }
312
+ const readline = createInterface({
313
+ input: process.stdin,
314
+ output: process.stdout,
315
+ });
66
316
  try {
67
- const info = await zvecGrep.disableIndex({ root });
68
- printAnonymousInfo(info, parsed.options);
317
+ const answer = await readline.question(`Drop the index for ${root}? [y/N] `);
318
+ return ["y", "yes"].includes(answer.trim().toLowerCase());
69
319
  }
70
320
  finally {
71
- await zvecGrep.close();
321
+ readline.close();
72
322
  }
73
323
  }
74
- async function runStatus(parsed) {
75
- const root = parsed.positionals[0] ?? process.cwd();
76
- if (parsed.positionals.length > 1) {
77
- throw new Error("zg --status accepts at most one root path");
324
+ async function runServer(parsed) {
325
+ if (parsed.positionals.length > 0) {
326
+ throw new Error(`zg server ${parsed.options.serverAction} does not accept positional arguments`);
78
327
  }
79
- const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, root));
80
- try {
81
- const info = await zvecGrep.info({ root });
82
- printAnonymousInfo(info, parsed.options);
328
+ const { readPackageVersion } = await import("./version.js");
329
+ if (parsed.options.serverAction === "on") {
330
+ const { startServer } = await import("../daemon/server-controller.js");
331
+ const status = await startServer({
332
+ cliPath: process.argv[1],
333
+ listen: parsed.options.listen,
334
+ tokenFile: parsed.options.serverTokenFile,
335
+ home: parsed.options.home,
336
+ mcpToolset: parsed.options.mcpToolset,
337
+ });
338
+ printServerControlStatus(status);
339
+ return;
83
340
  }
84
- finally {
85
- await zvecGrep.close();
341
+ if (parsed.options.serverAction === "off") {
342
+ const { stopServer } = await import("../daemon/server-controller.js");
343
+ printServerControlStatus(await stopServer(parsed.options.home, 30_000, parsed.options.serverTokenFile));
344
+ return;
86
345
  }
87
- }
88
- async function runCollections(parsed) {
89
- const [action = "list", name, root] = parsed.positionals;
90
- const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, undefined));
91
- try {
92
- if (action === "list") {
93
- if (parsed.options.resetPaths) {
94
- throw new Error("--reset-paths can only be used with --collections index");
95
- }
96
- printCollectionList(await zvecGrep.collections.list(), parsed.options);
97
- return;
98
- }
99
- if (action === "info") {
100
- if (parsed.options.resetPaths) {
101
- throw new Error("--reset-paths can only be used with --collections index");
102
- }
103
- if (!name) {
104
- throw new Error("zg --collections info requires <name>");
105
- }
106
- const [info, status] = await Promise.all([
107
- zvecGrep.collections.info(name),
108
- zvecGrep.collections.status(name),
109
- ]);
110
- if (!info) {
111
- throw new Error(`Collection not found: ${name}`);
112
- }
113
- printCollectionInfo(info, status, parsed.options);
114
- return;
346
+ if (parsed.options.serverAction === "status") {
347
+ const status = await serverStatus(parsed.options.home);
348
+ printServerControlStatus(status);
349
+ if (parsed.options.checkReady && !status.ready) {
350
+ throw new Error("zvec-grep server is not ready");
115
351
  }
116
- if (action === "index") {
117
- if (!name) {
118
- throw new Error("zg --collections index requires <name>");
119
- }
120
- const explicitRoot = root !== undefined;
121
- const rootPath = indexRootPath(root ?? process.cwd(), parsed.options);
122
- const rootPaths = explicitRoot ? rootPath : undefined;
123
- const progress = createIndexProgressReporter();
352
+ return;
353
+ }
354
+ const { runDaemonForeground } = await import("../daemon/runtime.js");
355
+ await runDaemonForeground({
356
+ version: readPackageVersion(),
357
+ listen: parsed.options.listen,
358
+ tokenFile: parsed.options.serverTokenFile,
359
+ home: parsed.options.home,
360
+ mcpToolset: parsed.options.mcpToolset,
361
+ serviceOptions: createServiceOptions(parsed.options, process.cwd()),
362
+ });
363
+ }
364
+ async function runStatus(parsed) {
365
+ const root = parsed.positionals[0] ?? process.cwd();
366
+ if (parsed.positionals.length > 1) {
367
+ throw new Error("zg status accepts at most one root path");
368
+ }
369
+ const mode = resolveClientMode(parsed.options.mode);
370
+ const state = await routeByMode({
371
+ mode,
372
+ serverAvailable: () => daemonIsReady(parsed.options.home),
373
+ server: async () => {
374
+ const result = await daemonClient(parsed.options).callTool("zvec_grep_index_status", { root: resolve(root) });
375
+ return printServerIndexInfo(result, parsed.options);
376
+ },
377
+ direct: async () => {
378
+ const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, root));
124
379
  try {
125
- const result = await zvecGrep.collections.index(name, rootPaths, {
126
- rebuild: parsed.options.rebuild,
127
- resetPaths: parsed.options.resetPaths,
128
- includePaths: parsed.options.includePaths,
129
- excludePaths: parsed.options.excludePaths,
130
- embeddingConcurrency: parsed.options.embeddingConcurrency,
131
- onProgress: progress.report,
132
- });
133
- progress.finish();
134
- const info = await zvecGrep.collections.info(name);
135
- printIndexResult(`Indexed collection ${name}`, result, parsed.options, info?.rootPaths);
136
- }
137
- catch (error) {
138
- progress.finish();
139
- throw error;
380
+ return printWorkspaceInfo(await zvecGrep.info({ root }), parsed.options);
140
381
  }
141
- return;
142
- }
143
- if (action === "remove") {
144
- if (parsed.options.resetPaths) {
145
- throw new Error("--reset-paths can only be used with --collections index");
382
+ finally {
383
+ await zvecGrep.close();
146
384
  }
147
- if (!name) {
148
- throw new Error("zg --collections remove requires <name>");
149
- }
150
- const removed = await zvecGrep.collections.remove(name);
151
- printCollectionRemoveResult(name, removed, parsed.options);
152
- return;
153
- }
154
- if (parsed.options.resetPaths) {
155
- throw new Error("--reset-paths can only be used with --collections index");
156
- }
157
- throw new Error(`Unknown collections action: ${action}`);
158
- }
159
- finally {
160
- await zvecGrep.close();
385
+ },
386
+ });
387
+ if (parsed.options.checkReady && state !== "ready") {
388
+ throw new Error(`Workspace index is not ready (state: ${state})`);
161
389
  }
162
390
  }
163
391
  async function runQuery(parsed) {
164
392
  const rgInput = parsed.options.rg
165
- ? normalizeRgInput(parsed)
393
+ ? normalizeManagedRgInput(parsed)
166
394
  : undefined;
167
395
  const commandOptions = rgInput?.options ?? parsed.options;
168
- const queries = (rgInput?.queries ?? parsed.positionals)
396
+ const queries = (rgInput?.queries ?? [
397
+ ...parsed.positionals,
398
+ ...(parsed.options.hybridQueries ?? []),
399
+ ])
169
400
  .map((query) => query.trim())
170
401
  .filter((query) => query.length > 0);
171
402
  const routes = parsed.options.routes ?? [];
172
- if (queries.length === 0 && routes.length === 0) {
403
+ if (queries.length === 0 &&
404
+ routes.length === 0 &&
405
+ (parsed.options.rgOptions?.patternFiles?.length ?? 0) === 0) {
173
406
  throw new Error(parsed.options.rg
174
- ? "zg --rg requires a pattern. Use --help for examples."
175
- : "zg query requires text or --fts/--vector routes. Use --help for examples.");
407
+ ? "zg query --rg requires a pattern. Use zg help query for examples."
408
+ : "zg query requires text or --hybrid/--fts/--vector routes. Use zg help query for examples.");
409
+ }
410
+ if (!commandOptions.rg) {
411
+ const mode = resolveClientMode(commandOptions.mode);
412
+ if (mode !== "direct") {
413
+ await routeByMode({
414
+ mode,
415
+ serverAvailable: () => daemonIsReady(commandOptions.home),
416
+ server: () => runServerQuery(commandOptions, queries, routes),
417
+ direct: () => runDirectQuery(commandOptions, queries),
418
+ });
419
+ return;
420
+ }
421
+ }
422
+ await runDirectQuery(commandOptions, queries);
423
+ }
424
+ async function runDirectQuery(commandOptions, queries) {
425
+ if (commandOptions.refresh === "background") {
426
+ console.error("warning: --refresh background requires Server mode; Direct mode uses --refresh off");
176
427
  }
177
- const zvecGrep = await createZvecGrep(createServiceOptions(commandOptions, undefined));
178
- const progress = createIndexProgressReporter();
428
+ const serviceOptions = createServiceOptions(commandOptions, undefined);
429
+ const zvecGrep = await createZvecGrep(serviceOptions);
430
+ const progress = createIndexProgressReporter({
431
+ color: commandOptions.color,
432
+ });
179
433
  try {
180
- const result = await zvecGrep.context(contextOptions(commandOptions, queries, (progressEvent) => {
181
- if (progressEvent.phase !== "done") {
434
+ const contextRequest = contextOptions(commandOptions, queries, (progressEvent) => {
435
+ if (progressEvent.phase !== "done")
182
436
  progress.report(progressEvent);
183
- }
184
- }));
437
+ });
438
+ const info = await directQueryInfo(zvecGrep);
439
+ const schema = info.workspaceIndex?.embedding;
440
+ const workspaceRuntime = workspaceRuntimeFromInfo(info);
441
+ const modelInfo = !commandOptions.rg && schema?.provider === "qwen"
442
+ ? await embeddingModelInfo(schema, createServiceOptions(commandOptions, info.root), workspaceRuntime)
443
+ : undefined;
444
+ const plan = modelInfo
445
+ ? await planRemoteSearchAuthorization({
446
+ info,
447
+ model: modelInfo,
448
+ search: normalizedDirectSearchInput(commandOptions, queries, info.root),
449
+ store: authorizationStore(commandOptions),
450
+ })
451
+ : undefined;
452
+ const authorizationResolution = plan
453
+ ? await authorizeCliPlan(plan, commandOptions, "local_search")
454
+ : {};
455
+ const effectiveContextRequest = authorizationResolution.alternative === "local_search"
456
+ ? ftsFallbackContextRequest(contextRequest)
457
+ : contextRequest;
458
+ const result = await withRemoteEmbeddingOperationPermit(authorizationResolution.authorization, () => zvecGrep.context(effectiveContextRequest));
185
459
  progress.finish();
186
460
  if (commandOptions.human) {
187
461
  printHumanContextResult(result, commandOptions);
@@ -192,6 +466,10 @@ async function runQuery(parsed) {
192
466
  for (const line of contextWarningLines(result)) {
193
467
  console.error(line);
194
468
  }
469
+ if (effectiveContextRequest.autoUpdate !== true &&
470
+ indexStatusNeedsRefresh(info.status)) {
471
+ printStaleIndexStatus("idle", indexCompletionFromStatus(info.status));
472
+ }
195
473
  if (commandOptions.debug) {
196
474
  printDebug(result, {
197
475
  trace: commandOptions.trace === true,
@@ -206,95 +484,166 @@ async function runQuery(parsed) {
206
484
  await zvecGrep.close();
207
485
  }
208
486
  }
487
+ async function runServerQuery(options, queries, routes) {
488
+ const searchPolicy = resolveServerSearchPolicy(options);
489
+ const fts = routes
490
+ .filter((route) => route.mode === "fts")
491
+ .map((route) => route.query);
492
+ const vector = routes
493
+ .filter((route) => route.mode === "vector")
494
+ .map((route) => route.query);
495
+ const response = await daemonClient(options).callTextTool("zvec_grep_search", {
496
+ root: resolve(process.cwd()),
497
+ apiKey: options.apiKey,
498
+ device: options.device,
499
+ queries: queries.length ? queries : undefined,
500
+ fts: fts.length ? fts : undefined,
501
+ vector: vector.length ? vector : undefined,
502
+ fuse: options.fuse,
503
+ limit: options.limit,
504
+ trace: options.trace,
505
+ preferSymbol: options.preferSymbol,
506
+ symbolTypes: options.symbolTypes,
507
+ globs: options.globs,
508
+ insensitiveGlobs: options.insensitiveGlobs,
509
+ fileTypes: options.fileTypes,
510
+ excludedFileTypes: options.excludedFileTypes,
511
+ hidden: options.hidden,
512
+ noIgnore: options.noIgnore,
513
+ ignoreFiles: options.ignoreFiles,
514
+ maxDepth: options.maxDepth,
515
+ maxFileSizeBytes: options.maxFileSizeBytes,
516
+ follow: options.follow,
517
+ embeddingConcurrency: options.embeddingConcurrency,
518
+ modifiedAfter: options.modifiedAfter,
519
+ modifiedBefore: options.modifiedBefore,
520
+ freshness: searchPolicy.freshness,
521
+ autoUpdate: searchPolicy.autoUpdate,
522
+ });
523
+ const highlighter = createHighlighter([...queries, ...fts, ...vector].join(" "), shouldUseColor(options));
524
+ for (const line of response.split("\n")) {
525
+ console.log(highlighter(line));
526
+ }
527
+ }
528
+ function printStaleIndexStatus(state, completion) {
529
+ console.error("status: possibly_stale");
530
+ if (!state)
531
+ return;
532
+ const progress = completion?.completed === undefined || completion.total === undefined
533
+ ? ""
534
+ : ` (${completion.completed}/${completion.total})`;
535
+ console.error(`indexing: ${state}${progress}`);
536
+ }
537
+ function daemonClient(options) {
538
+ return new DaemonClient({
539
+ serverUrl: resolveServerUrl(),
540
+ home: options.home,
541
+ tokenFile: options.serverTokenFile,
542
+ allowRemote: options.allowRemote,
543
+ });
544
+ }
545
+ function ftsFallbackContextRequest(request) {
546
+ const queries = [
547
+ ...(request.queries ?? []),
548
+ ...(request.query ? [request.query] : []),
549
+ ...(request.routes ?? []).map((route) => route.query),
550
+ ];
551
+ return {
552
+ ...request,
553
+ query: undefined,
554
+ queries: undefined,
555
+ routes: queries.map((query) => ({ mode: "fts", query })),
556
+ autoUpdate: false,
557
+ };
558
+ }
559
+ async function directQueryInfo(service) {
560
+ return await service.info({ root: process.cwd() });
561
+ }
562
+ function normalizedDirectSearchInput(options, queries, root) {
563
+ const policy = resolveDirectSearchPolicy(options);
564
+ return {
565
+ root,
566
+ apiKey: options.apiKey,
567
+ device: options.device,
568
+ queries: !options.rg && queries.length > 0 ? [...queries] : undefined,
569
+ routes: [...(options.routes ?? [])],
570
+ ...policy,
571
+ };
572
+ }
573
+ async function daemonIsReady(home) {
574
+ return (await serverStatus(home)).ready;
575
+ }
576
+ function printServerControlStatus(status) {
577
+ console.log(`Server: ${status.running ? (status.ready ? "ready" : "starting") : "stopped"}`);
578
+ if (status.pid)
579
+ console.log(`PID: ${status.pid}`);
580
+ if (status.serverUrl)
581
+ console.log(`URL: ${status.serverUrl}`);
582
+ if (status.mcpToolset)
583
+ console.log(`MCP toolset: ${status.mcpToolset}`);
584
+ }
209
585
  function contextOptions(options, queries, onAutoUpdateProgress) {
586
+ const policy = resolveDirectSearchPolicy(options);
210
587
  return {
211
588
  queries: queries.length > 0 ? queries : undefined,
212
589
  rg: options.rg,
213
590
  rgOptions: options.rgOptions,
214
591
  rgPaths: options.rgPaths,
215
592
  routes: options.routes,
216
- collection: options.collection,
593
+ fuse: options.fuse,
217
594
  limit: options.limit,
218
- fallback: "disabled",
219
- autoUpdate: !options.noAutoUpdate,
595
+ autoUpdate: policy.autoUpdate,
220
596
  onAutoUpdateProgress,
221
597
  trace: options.trace,
222
598
  preferSymbol: options.preferSymbol,
223
- includePaths: options.includePaths,
224
- excludePaths: options.excludePaths,
599
+ globs: options.globs,
600
+ insensitiveGlobs: options.insensitiveGlobs,
601
+ fileTypes: options.fileTypes,
602
+ excludedFileTypes: options.excludedFileTypes,
603
+ hidden: options.hidden,
604
+ noIgnore: options.noIgnore,
605
+ ignoreFiles: options.ignoreFiles,
606
+ maxDepth: options.maxDepth,
607
+ maxFileSizeBytes: options.maxFileSizeBytes,
608
+ follow: options.follow,
225
609
  modifiedAfter: options.modifiedAfter,
226
610
  modifiedBefore: options.modifiedBefore,
227
611
  symbolTypes: options.symbolTypes,
228
612
  embeddingConcurrency: options.embeddingConcurrency,
229
613
  };
230
614
  }
231
- function normalizeRgInput(parsed) {
232
- const explicitPatterns = parsed.options.rgOptions?.patterns ?? [];
233
- const queries = explicitPatterns.length > 0
234
- ? explicitPatterns
235
- : parsed.positionals.slice(0, 1);
236
- const paths = explicitPatterns.length > 0
237
- ? parsed.positionals
238
- : parsed.positionals.slice(1);
239
- return {
240
- queries,
241
- options: {
242
- ...parsed.options,
243
- rgPaths: paths.length > 0 ? paths : undefined,
244
- },
245
- };
246
- }
247
- function createServiceOptions(options, root) {
248
- const embedding = options.embedding ?? process.env.ZVEC_GREP_EMBEDDING;
249
- const apiKey = options.apiKey
250
- ?? process.env.ZVEC_GREP_API_KEY
251
- ?? process.env.DASHSCOPE_API_KEY
252
- ?? process.env.QWEN_API_KEY;
253
- const endpoint = options.endpoint ?? process.env.ZVEC_GREP_ENDPOINT;
615
+ export function createServiceOptions(options, root) {
254
616
  return {
255
617
  root,
256
618
  home: options.home ?? process.env.ZVEC_GREP_HOME,
257
- embedding,
258
- apiKey,
259
- endpoint,
260
- modelCacheDir: options.modelCacheDir ?? process.env.ZVEC_GREP_MODEL_CACHE,
261
- llamaGpu: options.llamaGpu ?? parseEnvLlamaGpu(process.env.ZVEC_GREP_LLAMA_GPU),
262
- embeddingParallelism: options.embeddingParallelism ?? parseEnvPositiveInteger(process.env.ZVEC_GREP_EMBED_PARALLELISM),
619
+ embedding: options.embedding,
620
+ apiKey: options.apiKey,
621
+ endpoint: options.endpoint,
622
+ modelCacheDir: options.modelCacheDir,
623
+ device: options.device,
624
+ authorizationSigningKeyPath: process.env.ZVEC_GREP_AUTHORIZATION_KEY_FILE,
263
625
  };
264
626
  }
265
- function parseEnvLlamaGpu(value) {
266
- const normalized = value?.trim().toLowerCase() ?? "";
267
- if (!normalized) {
268
- return undefined;
269
- }
270
- if (normalized === "auto" || normalized === "metal" || normalized === "vulkan" || normalized === "cuda") {
271
- return normalized;
272
- }
273
- if (["false", "off", "none", "disable", "disabled", "0"].includes(normalized)) {
274
- return false;
275
- }
276
- return undefined;
277
- }
278
- function parseEnvPositiveInteger(value) {
279
- const normalized = value?.trim() ?? "";
280
- if (!normalized) {
281
- return undefined;
282
- }
283
- const parsed = Number.parseInt(normalized, 10);
284
- return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
285
- }
286
627
  function resolveIndexRoot(root) {
287
628
  if (root !== undefined) {
288
629
  return root;
289
630
  }
290
- return findNearestAnonymousWorkspace(process.cwd())?.root ?? process.cwd();
631
+ return findNearestWorkspace(process.cwd())?.root ?? process.cwd();
291
632
  }
292
633
  function indexRootPath(path, options) {
293
634
  return {
294
635
  absolutePath: resolve(path),
295
636
  recursive: true,
296
- include: options.includePaths,
297
- exclude: options.excludePaths,
637
+ globs: options.globs,
638
+ insensitiveGlobs: options.insensitiveGlobs,
639
+ fileTypes: options.fileTypes,
640
+ excludedFileTypes: options.excludedFileTypes,
641
+ hidden: options.hidden,
642
+ noIgnore: options.noIgnore,
643
+ ignoreFiles: options.ignoreFiles,
644
+ maxDepth: options.maxDepth,
645
+ maxFileSizeBytes: options.maxFileSizeBytes,
646
+ follow: options.follow,
298
647
  };
299
648
  }
300
649
  //# sourceMappingURL=commands.js.map