@zvec/zvec-grep 0.1.5 → 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 (317) hide show
  1. package/README.md +88 -249
  2. package/README_CN.md +82 -246
  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 +1 -1
  28. package/dist/cli/args.js +304 -54
  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.js +433 -618
  34. package/dist/cli/commands.js.map +1 -1
  35. package/dist/cli/errors.js +2 -2
  36. package/dist/cli/errors.js.map +1 -1
  37. package/dist/cli/format/context.d.ts +1 -0
  38. package/dist/cli/format/context.js +241 -45
  39. package/dist/cli/format/context.js.map +1 -1
  40. package/dist/cli/format/debug.js +2 -2
  41. package/dist/cli/format/debug.js.map +1 -1
  42. package/dist/cli/format/progress.d.ts +4 -0
  43. package/dist/cli/format/progress.js +219 -46
  44. package/dist/cli/format/progress.js.map +1 -1
  45. package/dist/cli/format/status.d.ts +77 -6
  46. package/dist/cli/format/status.js +302 -106
  47. package/dist/cli/format/status.js.map +1 -1
  48. package/dist/cli/help.js +258 -59
  49. package/dist/cli/help.js.map +1 -1
  50. package/dist/cli/index.js +0 -0
  51. package/dist/cli/install.d.ts +4 -0
  52. package/dist/cli/install.js +845 -0
  53. package/dist/cli/install.js.map +1 -0
  54. package/dist/cli/managed-rg.d.ts +10 -0
  55. package/dist/cli/managed-rg.js +329 -0
  56. package/dist/cli/managed-rg.js.map +1 -0
  57. package/dist/cli/types.d.ts +20 -6
  58. package/dist/cli/types.js.map +1 -1
  59. package/dist/client/daemon-client.d.ts +19 -0
  60. package/dist/client/daemon-client.js +180 -0
  61. package/dist/client/daemon-client.js.map +1 -0
  62. package/dist/client/mode-router.d.ts +9 -0
  63. package/dist/client/mode-router.js +28 -0
  64. package/dist/client/mode-router.js.map +1 -0
  65. package/dist/client/search-policy.d.ts +11 -0
  66. package/dist/client/search-policy.js +15 -0
  67. package/dist/client/search-policy.js.map +1 -0
  68. package/dist/daemon/backend.d.ts +76 -0
  69. package/dist/daemon/backend.js +1049 -0
  70. package/dist/daemon/backend.js.map +1 -0
  71. package/dist/daemon/change-set.d.ts +25 -0
  72. package/dist/daemon/change-set.js +101 -0
  73. package/dist/daemon/change-set.js.map +1 -0
  74. package/dist/daemon/config.d.ts +24 -0
  75. package/dist/daemon/config.js +88 -0
  76. package/dist/daemon/config.js.map +1 -0
  77. package/dist/daemon/errors.d.ts +5 -0
  78. package/dist/daemon/errors.js +11 -0
  79. package/dist/daemon/errors.js.map +1 -0
  80. package/dist/daemon/http-server.d.ts +30 -0
  81. package/dist/daemon/http-server.js +287 -0
  82. package/dist/daemon/http-server.js.map +1 -0
  83. package/dist/daemon/index-coordinator.d.ts +23 -0
  84. package/dist/daemon/index-coordinator.js +68 -0
  85. package/dist/daemon/index-coordinator.js.map +1 -0
  86. package/dist/daemon/job-scheduler.d.ts +70 -0
  87. package/dist/daemon/job-scheduler.js +366 -0
  88. package/dist/daemon/job-scheduler.js.map +1 -0
  89. package/dist/daemon/logger.d.ts +9 -0
  90. package/dist/daemon/logger.js +53 -0
  91. package/dist/daemon/logger.js.map +1 -0
  92. package/dist/daemon/model-pool.d.ts +45 -0
  93. package/dist/daemon/model-pool.js +187 -0
  94. package/dist/daemon/model-pool.js.map +1 -0
  95. package/dist/daemon/root-lease.d.ts +14 -0
  96. package/dist/daemon/root-lease.js +188 -0
  97. package/dist/daemon/root-lease.js.map +1 -0
  98. package/dist/daemon/root-runtime.d.ts +78 -0
  99. package/dist/daemon/root-runtime.js +333 -0
  100. package/dist/daemon/root-runtime.js.map +1 -0
  101. package/dist/daemon/runtime-manager.d.ts +45 -0
  102. package/dist/daemon/runtime-manager.js +243 -0
  103. package/dist/daemon/runtime-manager.js.map +1 -0
  104. package/dist/daemon/runtime.d.ts +12 -0
  105. package/dist/daemon/runtime.js +102 -0
  106. package/dist/daemon/runtime.js.map +1 -0
  107. package/dist/daemon/server-controller.d.ts +39 -0
  108. package/dist/daemon/server-controller.js +203 -0
  109. package/dist/daemon/server-controller.js.map +1 -0
  110. package/dist/daemon/watch-manager.d.ts +50 -0
  111. package/dist/daemon/watch-manager.js +293 -0
  112. package/dist/daemon/watch-manager.js.map +1 -0
  113. package/dist/daemon/workspace-read-session-cache.d.ts +31 -0
  114. package/dist/daemon/workspace-read-session-cache.js +115 -0
  115. package/dist/daemon/workspace-read-session-cache.js.map +1 -0
  116. package/dist/engine/config.d.ts +30 -8
  117. package/dist/engine/config.js +171 -45
  118. package/dist/engine/config.js.map +1 -1
  119. package/dist/engine/{errors/index.d.ts → errors.d.ts} +6 -1
  120. package/dist/engine/{errors/details.js → errors.js} +17 -4
  121. package/dist/engine/errors.js.map +1 -0
  122. package/dist/engine/extraction/code/adapter.d.ts +1 -1
  123. package/dist/engine/extraction/code/extractor.d.ts +5 -11
  124. package/dist/engine/extraction/code/extractor.js +105 -44
  125. package/dist/engine/extraction/code/extractor.js.map +1 -1
  126. package/dist/engine/extraction/code/families/c-family.js +1 -1
  127. package/dist/engine/extraction/code/families/c-family.js.map +1 -1
  128. package/dist/engine/extraction/code/families/js-ts.d.ts +1 -1
  129. package/dist/engine/extraction/code/families/metadata.d.ts +1 -1
  130. package/dist/engine/extraction/code/tree-sitter/grammar.js.map +1 -0
  131. package/dist/engine/extraction/code/tree-sitter/nodes.js.map +1 -0
  132. package/dist/engine/extraction/code/tree-sitter/parser.js.map +1 -0
  133. package/dist/engine/extraction/image/extractor.d.ts +5 -0
  134. package/dist/engine/extraction/image/extractor.js +35 -0
  135. package/dist/engine/extraction/image/extractor.js.map +1 -0
  136. package/dist/engine/extraction/index.d.ts +3 -44
  137. package/dist/engine/extraction/index.js +1 -280
  138. package/dist/engine/extraction/index.js.map +1 -1
  139. package/dist/engine/extraction/markdown/extractor.d.ts +5 -11
  140. package/dist/engine/extraction/markdown/extractor.js +35 -16
  141. package/dist/engine/extraction/markdown/extractor.js.map +1 -1
  142. package/dist/engine/extraction/runtime.d.ts +4 -0
  143. package/dist/engine/extraction/runtime.js +26 -0
  144. package/dist/engine/extraction/runtime.js.map +1 -0
  145. package/dist/engine/extraction/source.d.ts +18 -0
  146. package/dist/engine/extraction/source.js +22 -0
  147. package/dist/engine/extraction/source.js.map +1 -0
  148. package/dist/engine/extraction/text/extractor.d.ts +7 -0
  149. package/dist/engine/extraction/text/extractor.js +168 -0
  150. package/dist/engine/extraction/text/extractor.js.map +1 -0
  151. package/dist/engine/extraction/types.d.ts +4 -0
  152. package/dist/engine/{models → extraction}/types.js.map +1 -1
  153. package/dist/engine/{files/file-type.d.ts → file-type.d.ts} +1 -1
  154. package/dist/engine/file-type.js.map +1 -0
  155. package/dist/engine/index-status.d.ts +9 -0
  156. package/dist/engine/index-status.js +38 -0
  157. package/dist/engine/index-status.js.map +1 -0
  158. package/dist/engine/manifest.d.ts +12 -0
  159. package/dist/engine/manifest.js +120 -0
  160. package/dist/engine/manifest.js.map +1 -0
  161. package/dist/engine/models/{providers/llama-cpp/embedding.d.ts → backends/llama-cpp.d.ts} +25 -20
  162. package/dist/engine/models/{providers/llama-cpp/embedding.js → backends/llama-cpp.js} +127 -106
  163. package/dist/engine/models/backends/llama-cpp.js.map +1 -0
  164. package/dist/engine/models/backends/model2vec.d.ts +57 -0
  165. package/dist/engine/models/backends/model2vec.js +332 -0
  166. package/dist/engine/models/backends/model2vec.js.map +1 -0
  167. package/dist/engine/models/backends/qwen.d.ts +44 -0
  168. package/dist/engine/models/{providers/qwen/embedding.js → backends/qwen.js} +155 -94
  169. package/dist/engine/models/backends/qwen.js.map +1 -0
  170. package/dist/engine/models/backends/transformers-js.d.ts +87 -0
  171. package/dist/engine/models/backends/transformers-js.js +316 -0
  172. package/dist/engine/models/backends/transformers-js.js.map +1 -0
  173. package/dist/engine/models/catalog.d.ts +188 -23
  174. package/dist/engine/models/catalog.js +172 -25
  175. package/dist/engine/models/catalog.js.map +1 -1
  176. package/dist/engine/models/download-progress.d.ts +15 -0
  177. package/dist/engine/models/download-progress.js +48 -0
  178. package/dist/engine/models/download-progress.js.map +1 -0
  179. package/dist/engine/models/embeddings.d.ts +58 -18
  180. package/dist/engine/models/embeddings.js +52 -28
  181. package/dist/engine/models/embeddings.js.map +1 -1
  182. package/dist/engine/models/factory.d.ts +2 -5
  183. package/dist/engine/models/factory.js +41 -56
  184. package/dist/engine/models/factory.js.map +1 -1
  185. package/dist/engine/models/index.d.ts +4 -6
  186. package/dist/engine/models/index.js +4 -4
  187. package/dist/engine/models/index.js.map +1 -1
  188. package/dist/engine/models/ranking.d.ts +7 -3
  189. package/dist/engine/models/resolution.d.ts +8 -0
  190. package/dist/engine/models/resolution.js +22 -0
  191. package/dist/engine/models/resolution.js.map +1 -0
  192. package/dist/engine/pipeline/indexing/index.d.ts +9 -7
  193. package/dist/engine/pipeline/indexing/index.js +360 -121
  194. package/dist/engine/pipeline/indexing/index.js.map +1 -1
  195. package/dist/engine/pipeline/indexing/root-paths.js +6 -6
  196. package/dist/engine/pipeline/indexing/root-paths.js.map +1 -1
  197. package/dist/engine/pipeline/indexing/scanner/index.d.ts +6 -1
  198. package/dist/engine/pipeline/indexing/scanner/index.js +233 -29
  199. package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
  200. package/dist/engine/pipeline/search/index.d.ts +6 -6
  201. package/dist/engine/pipeline/search/index.js +8 -10
  202. package/dist/engine/pipeline/search/index.js.map +1 -1
  203. package/dist/engine/service/index.d.ts +3 -2
  204. package/dist/engine/service/index.js +1 -1
  205. package/dist/engine/service/index.js.map +1 -1
  206. package/dist/engine/service/root.d.ts +13 -12
  207. package/dist/engine/service/root.js +35 -24
  208. package/dist/engine/service/root.js.map +1 -1
  209. package/dist/engine/service/structure-enrichment.js +12 -14
  210. package/dist/engine/service/structure-enrichment.js.map +1 -1
  211. package/dist/engine/service/types.d.ts +32 -37
  212. package/dist/engine/service/workspace-index.d.ts +24 -0
  213. package/dist/engine/service/workspace-index.js +151 -0
  214. package/dist/engine/service/workspace-index.js.map +1 -0
  215. package/dist/engine/service/zvec-grep.d.ts +12 -1
  216. package/dist/engine/service/zvec-grep.js +677 -486
  217. package/dist/engine/service/zvec-grep.js.map +1 -1
  218. package/dist/engine/storage/index.d.ts +8 -4
  219. package/dist/engine/storage/index.js +1 -1
  220. package/dist/engine/storage/index.js.map +1 -1
  221. package/dist/engine/storage/zvec.d.ts +10 -33
  222. package/dist/engine/storage/zvec.js +95 -38
  223. package/dist/engine/storage/zvec.js.map +1 -1
  224. package/dist/engine/types.d.ts +15 -23
  225. package/dist/engine/types.js +1 -1
  226. package/dist/engine/types.js.map +1 -1
  227. package/dist/engine/utils/daemon-lease.d.ts +17 -0
  228. package/dist/engine/utils/daemon-lease.js +175 -0
  229. package/dist/engine/utils/daemon-lease.js.map +1 -0
  230. package/dist/engine/utils/file-selection.js +38 -1
  231. package/dist/engine/utils/file-selection.js.map +1 -1
  232. package/dist/engine/utils/lock.js +1 -1
  233. package/dist/engine/utils/lock.js.map +1 -1
  234. package/dist/index-progress.d.ts +10 -0
  235. package/dist/index-progress.js +159 -0
  236. package/dist/index-progress.js.map +1 -0
  237. package/dist/index.d.ts +4 -4
  238. package/dist/index.js +1 -1
  239. package/dist/index.js.map +1 -1
  240. package/dist/mcp/http-transport.d.ts +27 -0
  241. package/dist/mcp/http-transport.js +182 -0
  242. package/dist/mcp/http-transport.js.map +1 -0
  243. package/dist/mcp/input-normalization.d.ts +38 -0
  244. package/dist/mcp/input-normalization.js +95 -0
  245. package/dist/mcp/input-normalization.js.map +1 -0
  246. package/dist/mcp/progress-heartbeat.d.ts +17 -0
  247. package/dist/mcp/progress-heartbeat.js +46 -0
  248. package/dist/mcp/progress-heartbeat.js.map +1 -0
  249. package/dist/mcp/request-metadata.d.ts +2 -0
  250. package/dist/mcp/request-metadata.js +11 -0
  251. package/dist/mcp/request-metadata.js.map +1 -0
  252. package/dist/mcp/request-state.d.ts +40 -0
  253. package/dist/mcp/request-state.js +210 -0
  254. package/dist/mcp/request-state.js.map +1 -0
  255. package/dist/mcp/result-format.d.ts +13 -0
  256. package/dist/mcp/result-format.js +75 -0
  257. package/dist/mcp/result-format.js.map +1 -0
  258. package/dist/mcp/schemas.d.ts +430 -0
  259. package/dist/mcp/schemas.js +447 -0
  260. package/dist/mcp/schemas.js.map +1 -0
  261. package/dist/mcp/tools.d.ts +150 -0
  262. package/dist/mcp/tools.js +448 -0
  263. package/dist/mcp/tools.js.map +1 -0
  264. package/dist/mcp/toolset.d.ts +5 -0
  265. package/dist/mcp/toolset.js +12 -0
  266. package/dist/mcp/toolset.js.map +1 -0
  267. package/dist/observability/trace-context.d.ts +11 -0
  268. package/dist/observability/trace-context.js +138 -0
  269. package/dist/observability/trace-context.js.map +1 -0
  270. package/docs/01-agents.md +111 -0
  271. package/docs/02-cli.md +229 -0
  272. package/docs/03-mcp.md +167 -0
  273. package/docs/04-pipeline.md +218 -0
  274. package/docs/05-architecture.md +86 -0
  275. package/docs/06-server.md +210 -0
  276. package/docs/07-embedding.md +179 -0
  277. package/docs/08-roadmap.md +85 -0
  278. package/docs/README.md +53 -0
  279. package/package.json +17 -8
  280. package/skills/zvec-grep/SKILL.md +43 -133
  281. package/skills/zvec-grep/agents/openai.yaml +2 -2
  282. package/skills/zvec-grep/references/cli-fallback.md +85 -0
  283. package/dist/cli/mcp.d.ts +0 -2
  284. package/dist/cli/mcp.js +0 -354
  285. package/dist/cli/mcp.js.map +0 -1
  286. package/dist/engine/collection/index.d.ts +0 -55
  287. package/dist/engine/collection/index.js +0 -710
  288. package/dist/engine/collection/index.js.map +0 -1
  289. package/dist/engine/errors/details.d.ts +0 -6
  290. package/dist/engine/errors/details.js.map +0 -1
  291. package/dist/engine/errors/index.js +0 -16
  292. package/dist/engine/errors/index.js.map +0 -1
  293. package/dist/engine/extraction/tree-sitter/grammar.js.map +0 -1
  294. package/dist/engine/extraction/tree-sitter/nodes.js.map +0 -1
  295. package/dist/engine/extraction/tree-sitter/parser.js.map +0 -1
  296. package/dist/engine/files/file-type.js.map +0 -1
  297. package/dist/engine/models/providers/index.d.ts +0 -2
  298. package/dist/engine/models/providers/index.js +0 -3
  299. package/dist/engine/models/providers/index.js.map +0 -1
  300. package/dist/engine/models/providers/llama-cpp/embedding.js.map +0 -1
  301. package/dist/engine/models/providers/llama-cpp/index.d.ts +0 -1
  302. package/dist/engine/models/providers/llama-cpp/index.js +0 -2
  303. package/dist/engine/models/providers/llama-cpp/index.js.map +0 -1
  304. package/dist/engine/models/providers/qwen/embedding.d.ts +0 -42
  305. package/dist/engine/models/providers/qwen/embedding.js.map +0 -1
  306. package/dist/engine/models/providers/qwen/index.d.ts +0 -1
  307. package/dist/engine/models/providers/qwen/index.js +0 -2
  308. package/dist/engine/models/providers/qwen/index.js.map +0 -1
  309. package/dist/engine/models/types.d.ts +0 -30
  310. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.d.ts +0 -0
  311. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.js +0 -0
  312. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.d.ts +0 -0
  313. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.js +0 -0
  314. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.d.ts +0 -0
  315. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.js +0 -0
  316. /package/dist/engine/{models → extraction}/types.js +0 -0
  317. /package/dist/engine/{files/file-type.js → file-type.js} +0 -0
package/README_CN.md CHANGED
@@ -3,302 +3,138 @@
3
3
  </p>
4
4
 
5
5
  <div align="center">
6
+ <p>
7
+ <a href="./docs/08-roadmap.md"><img src="https://img.shields.io/badge/status-work%20in%20progress-F59E0B?style=for-the-badge" alt="项目开发中" /></a>
8
+ </p>
6
9
  <picture>
7
- <source media="(prefers-color-scheme: dark)" srcset="https://zvec.oss-cn-hongkong.aliyuncs.com/logo/github_log_2.svg" />
8
- <img src="https://zvec.oss-cn-hongkong.aliyuncs.com/logo/github_logo_1.svg" width="400" alt="zvec logo" />
10
+ <source media="(prefers-color-scheme: dark)" srcset="./.github/assets/zg-logo-dark.svg">
11
+ <img src="./.github/assets/zg-logo.svg" width="150" alt="zg logo" />
9
12
  </picture>
13
+ <p><strong>Know the words—or don’t. Just zg.</strong></p>
14
+ <p>面向人与 Agent 的本地优先统一检索层。</p>
15
+
16
+ <p>
17
+ <a href="https://www.npmjs.com/package/@zvec/zvec-grep"><img src="https://img.shields.io/npm/v/@zvec/zvec-grep.svg" alt="npm 版本" /></a>
18
+ <a href="https://github.com/zvec-ai/zvec-grep/actions/workflows/ci.yml"><img src="https://github.com/zvec-ai/zvec-grep/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
19
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" alt="Apache 2.0 许可证" /></a>
20
+ <img src="https://img.shields.io/badge/node-%3E%3D22-blue.svg" alt="Node.js 22 或更新版本" />
21
+ </p>
22
+
23
+ <p>
24
+ <a href="#tour">🎬 <strong>功能演示</strong></a> |
25
+ <a href="#features">💫 <strong>核心特性</strong></a> |
26
+ <a href="#quickstart">🚀 <strong>快速开始</strong></a> |
27
+ <a href="./docs/README.md">📚 <strong>文档</strong></a> |
28
+ <a href="#benchmarks">📊 <strong>性能测试</strong></a> |
29
+ <a href="#community">🤝 <strong>社区</strong></a>
30
+ </p>
10
31
  </div>
11
32
 
12
- <p align="center">
13
- <a href="https://www.npmjs.com/package/@zvec/zvec-grep"><img src="https://img.shields.io/npm/v/@zvec/zvec-grep.svg" alt="npm 版本"/></a>
14
- <a href="https://github.com/zvec-ai/zvec-grep/actions/workflows/ci.yml"><img src="https://github.com/zvec-ai/zvec-grep/actions/workflows/ci.yml/badge.svg" alt="CI"/></a>
15
- <a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" alt="许可证"/></a>
16
- <img src="https://img.shields.io/badge/node-%3E%3D22-blue.svg" alt="Node.js >=22"/>
17
- <img src="https://img.shields.io/badge/CLI-zg-2ea44f.svg" alt="zg CLI"/>
18
- </p>
33
+ **zg**(**z**vec-**g**rep)将 ripgrep、BM25 与向量检索统一在一个
34
+ [本地优先的检索入口](./docs/05-architecture.md)中。无论是人在终端中搜索,
35
+ 还是让 Agent 自主检索,只用 zg 即可。
19
36
 
20
- <p align="center">
21
- <a href="#quickstart">🚀 <strong>快速开始</strong></a> |
22
- <a href="#features">💫 <strong>核心特性</strong></a> |
23
- <a href="#installation">📦 <strong>安装</strong></a> |
24
- <a href="#models">🧠 <strong>模型</strong></a> |
25
- <a href="#library-api">🛠️ <strong>库 API</strong></a>
26
- </p>
37
+ <a id="tour"></a>
27
38
 
28
- **zvec-grep** 是基于 Zvec 构建的、面向 agent 的代码库混合检索工具。它为仓库维护本地语义索引,融合向量检索与全文检索,并默认输出节省 token 的结果;当人在终端里阅读时,也可以切换到更完整的展示模式。
39
+ ## 🎬 功能演示
29
40
 
30
- 命令非常短:
41
+ <div align="center">
42
+ <img src="./.github/assets/zvec-grep-tour.gif" width="1000" alt="安装 Agent 集成、为仓库建索引并让 Agent 使用 zvec-grep 搜索代码" />
43
+ </div>
31
44
 
32
- ```bash
33
- zg query "where query auto update happens"
34
- ```
45
+ 只需安装一次集成并为工作区建索引,之后既可以在终端中搜索,也可以直接向
46
+ Agent 提问。
35
47
 
36
- > [!IMPORTANT]
37
- > **命令接口**
38
- >
39
- > - **混合代码检索**:可以用自然语言、精确关键词,或两者组合来搜索代码。
40
- > - **明确的索引生命周期**:新仓库必须显式运行 `zg index --embedding <model>`;agent 不会静默创建索引。
41
- > - **自动刷新**:已有匿名索引会在普通查询前自动检查并增量更新。
42
- > - **节省 Token 的输出**:agent 默认输出 `--preview none`;`--human` 默认展示完整源码 preview。
43
- > - **无索引文本搜索**:`zg query --rg` 提供托管的 ripgrep 搜索,不需要先建索引。
48
+ <a id="features"></a>
44
49
 
45
- ## <a id="features"></a>💫 核心特性
50
+ ## 💫 为什么选择 zg?
46
51
 
47
- - **语义 + 词法检索**:融合向量检索和全文检索,适合源码、文档、测试、脚本和配置。
48
- - **仓库本地索引**:匿名索引存放在 `<repo>/.zvec-grep/`,索引状态跟随仓库。
49
- - **Agent 友好输出**:默认按文件分组,并尽量减少源码 preview,降低上下文成本。
50
- - **人类阅读模式**:加 `--human` 后更适合终端阅读,并默认展示完整 preview。
51
- - **托管 ripgrep 通道**:`zg query --rg` 支持常见 `rg` 参数,未建索引仓库也能使用。
52
- - **显式模型选择**:第一次建索引必须指定模型,例如 `local/embeddinggemma-300m`、`local/qwen3-embedding-0.6b` 或 `qwen/text-embedding-v4`。
53
- - **Schema 复用**:已有索引再次运行 `zg index` 会复用保存的 embedding schema,除非你显式切换模型。
54
- - **MCP Server**:运行 `zg serve --mcp`,向 MCP 客户端暴露索引搜索和无索引文本搜索工具;建索引和状态查看仍由 CLI 提供。
55
- - **库 API**:Node.js 工具、agent 或 MCP server 可以直接使用 `createZvecGrep()`。
52
+ - **开箱即用,零学习成本**:一套引导式安装即可在 macOS、Linux 和 Windows
53
+ 上接入 Agent;直接用自然语言提问,无需学习搜索语法。
54
+ - **一站式检索层**:语义发现、BM25 相关性检索、精确文本与正则搜索
55
+ 都由 zg 统一提供。
56
+ - **对 Agent 和开发者都友好**:为 Agent 提供紧凑、围绕文件组织的上下文,
57
+ 为开发者提供易读的终端输出,双方都能减少无关噪声。
58
+ - **本地优先、权限明确**:ripgrep、索引与本地模型均留在本机;远程 Embedding
59
+ 需要显式授权。
56
60
 
57
- ## <a id="installation"></a>📦 安装
61
+ <a id="quickstart"></a>
58
62
 
59
- 从 npm 安装 CLI:
63
+ ## 🚀 快速开始
60
64
 
61
- ```bash
62
- npm install -g @zvec/zvec-grep
63
- zg version
64
- ```
65
+ 需要 Node.js 22 或更新版本,支持 macOS、Linux 和 Windows。
65
66
 
66
- 也可以不全局安装,直接运行:
67
+ ### 1. 安装并连接 Agent
67
68
 
68
69
  ```bash
69
- npx @zvec/zvec-grep help
70
- ```
71
-
72
- 从最新源码构建,并将 `zg` 安装为全局命令:
73
-
74
- ```bash
75
- git clone https://github.com/zvec-ai/zvec-grep.git
76
- cd zvec-grep
77
- npm ci
78
- npm run build
79
- npm install -g .
80
- zg version
81
- ```
82
-
83
- 运行 stdio MCP server:
84
-
85
- ```bash
86
- zg serve --mcp
70
+ npm install -g @zvec/zvec-grep
71
+ zg install
87
72
  ```
88
73
 
89
- 安装 Codex MCP 集成:
74
+ `zg install` 会检测 Codex、Claude Code、Cursor 和 OpenCode,并配置本地 MCP 集成。
75
+ 查看 [Agent 集成指南](./docs/01-agents.md),了解配置变更、权限和卸载方式。
76
+ 也可以明确指定目标:
90
77
 
91
78
  ```bash
92
79
  zg install --target codex --yes
93
80
  ```
94
81
 
95
- Codex MCP 工具调用默认超时为 600 秒,可在安装时通过 `--mcp-tool-timeout <秒数>` 覆盖。
96
-
97
- ### ✅ 运行要求
98
-
99
- - Node.js 22 或更新版本
100
- - macOS、Linux 或 Windows
101
- - 使用索引检索时需要选择一个支持的 embedding 模型
102
-
103
- `zg query --rg` 不需要 embedding 模型,也不需要索引。
104
-
105
- ## <a id="quickstart"></a>⚡ 快速开始
106
-
107
- 为仓库建索引,并显式指定 embedding 模型:
108
-
109
- ```bash
110
- zg index \
111
- --embedding local/embeddinggemma-300m \
112
- -g "src/**" \
113
- -g "docs/**" \
114
- -g "test/**" \
115
- -g "!dist/**" \
116
- -g "!node_modules/**" \
117
- -g "!coverage/**"
118
- ```
119
-
120
- 查看索引状态:
82
+ ### 2. 为仓库建索引
121
83
 
122
84
  ```bash
123
- zg status
85
+ cd your-repository
86
+ zg index --embedding local/potion-code-16m-v2
124
87
  ```
125
88
 
126
- 用自然语言搜索:
89
+ 快速开始使用轻量的 [Potion Code v2](./docs/07-embedding.md),以便快速完成首次建索引。
90
+ 第一次运行会下载模型,索引保存在 `.zvec-grep/` 下;后续更新只需运行
91
+ `zg index`。查看 [检索 Pipeline](./docs/04-pipeline.md#indexing),进一步控制检索范围、
92
+ 增量更新和重建。
127
93
 
128
- ```bash
129
- zg query "where query auto update happens"
130
- ```
94
+ ### 3. 直接向 Agent 提问
131
95
 
132
- 组合语义意图和精确锚点:
133
-
134
- ```bash
135
- zg query "GPU fallback" --fts "usingCpuFallback" -g "src/**" -t ts --limit 5
96
+ ```text
97
+ 每次刷新页面,应用都会忘记深色模式。帮我找出原因。
136
98
  ```
137
99
 
138
- 不依赖索引,做穷尽文本搜索:
100
+ Agent 会始终通过 zg 完成语义发现、关键词相关性检索与穷尽精确匹配。你无需
101
+ 选择或调用其他搜索工具。[MCP 指南](./docs/03-mcp.md)介绍了 Agent 使用的两个工具。
139
102
 
140
- ```bash
141
- zg query --rg -F "ZVEC_GREP_HOME" src
142
- ```
143
-
144
- 切换到适合人看的输出:
103
+ 也可以直接在终端中使用同一个本地检索层。查看 [CLI 指南](./docs/02-cli.md),了解
104
+ 搜索方式、过滤条件和输出控制。
145
105
 
146
106
  ```bash
147
- zg query --human "root local index discovery" --limit 3
107
+ zg query --human "theme preference persistence on startup" --limit 3
148
108
  ```
149
109
 
150
- 在 MCP 客户端中可使用 `zvec_grep_search` 和 `zvec_grep_rg`。MCP 输入使用 JSON 友好的字段,例如 `include: ["src/**"]`;状态查看和建索引请使用 CLI 的 `zg status` 与 `zg index`。Codex installer 会向 `${CODEX_HOME:-$HOME/.codex}/config.toml` 和 `${CODEX_HOME:-$HOME/.codex}/AGENTS.md` 写入由 zvec-grep 管理的配置块。
151
-
152
- ## <a id="models"></a>🧠 模型
153
-
154
- 本地模型通过 `node-llama-cpp` 运行,适合把代码检索留在本机:
110
+ <a id="benchmarks"></a>
155
111
 
156
- ```bash
157
- zg index --embedding local/embeddinggemma-300m
158
- zg index --embedding local/qwen3-embedding-0.6b
159
- ```
112
+ ## 📊 性能测试
160
113
 
161
- 在 Apple Silicon 上,本地构建默认使用更安静的 llama.cpp CMake 配置,避免无害的 OpenMP 和 ARM native 探测 warning。可以通过 `NODE_LLAMA_CPP_CMAKE_OPTION_<name>` 覆盖任意 llama.cpp CMake 选项,例如设置 `NODE_LLAMA_CPP_CMAKE_OPTION_GGML_NATIVE=ON` 重新启用 native CPU 优化。
114
+ > 🚧 **正在完善中。**
162
115
 
163
- 远程 Qwen embedding 适合希望使用托管 embedding 服务,或不想在本机配置模型的场景:
116
+ ## 🗺️ Roadmap
164
117
 
165
- ```bash
166
- zg index \
167
- --embedding qwen/text-embedding-v4 \
168
- --api-key "$DASHSCOPE_API_KEY"
169
- ```
118
+ zg 正在迈向更丰富的多模态格式、更强的混合检索、更开箱即用的体验,以及从
119
+ 桌面端到移动端的全平台支持。
170
120
 
171
- 索引成功后,通过 CLI 显式传入的全局模型和 provider 参数会保存到 `~/.zvec-grep/config.json`,并使用仅当前用户可读写的权限。已经运行的 `zg` MCP server 会在下一次需要模型时读取新的远程 API key,不需要重启 Codex。只从环境变量读取、没有作为 CLI 参数显式传入的值不会被持久化。
172
-
173
- ```json
174
- {
175
- "version": 1,
176
- "defaults": {
177
- "embedding": "qwen/text-embedding-v4"
178
- },
179
- "providers": {
180
- "qwen": {
181
- "apiKey": "...",
182
- "endpoint": "https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings"
183
- }
184
- }
185
- }
186
- ```
121
+ 查看完整 [Roadmap](./docs/08-roadmap.md)。
187
122
 
188
- 配置优先级为:显式 CLI 或库参数、环境变量、全局配置、内置默认值。仓库 root 和文件选择规则仍保存在各仓库自己的 `.zvec-grep` 元数据中,不进入全局配置。
123
+ <a id="community"></a>
189
124
 
190
- 对于已有索引,`zg index` 不传 `--embedding` 会复用索引里保存的 schema。只有在你明确想切换模型时,才使用 `--rebuild --embedding <model>`:
191
-
192
- ```bash
193
- zg index --rebuild --embedding local/qwen3-embedding-0.6b
194
- ```
195
-
196
- ## 🔎 查询模式
197
-
198
- 多个带引号的 query 会作为多个搜索组分别检索:
199
-
200
- ```bash
201
- zg query "request validation" "error handling" --limit 5
202
- ```
203
-
204
- 每个 route 参数只接收一个 query,并且可以重复使用。需要把所有搜索组合并成一个排序结果时,使用 `--fuse`:
205
-
206
- ```bash
207
- zg query \
208
- --hybrid "authentication flow" \
209
- --fts "AuthService" \
210
- --vector "where credentials are validated" \
211
- --fuse \
212
- --limit 10
213
- ```
214
-
215
- 尽早使用与 ripgrep 一致的路径和文件类型过滤,让结果保持聚焦。普通 glob 表示包含,以 `!` 开头的 glob 表示排除:
216
-
217
- ```bash
218
- zg query "cache invalidation" \
219
- -g "src/**" \
220
- -g "!test/**" \
221
- -g "!tests/**" \
222
- -g "!fixtures/**" \
223
- -g "!dist/**" \
224
- -t ts
225
- ```
226
-
227
- 文件类型过滤会在 glob 过滤之后继续缩小范围。例如,`-g "docs/**" -t ts`
228
- 只会选择 `docs` 目录下的 TypeScript 文件,而不是该目录里的所有文件。
229
-
230
- 使用 `--preview` 控制索引结果的源码展示量:
231
-
232
- ```bash
233
- zg query "plugin lifecycle" --preview none
234
- zg query "plugin lifecycle" --preview short --limit 5
235
- zg query "plugin lifecycle" --preview full --limit 2
236
- ```
237
-
238
- 查精确文本、符号、配置项或错误码时,使用 `--fts` 或 `--rg`:
239
-
240
- ```bash
241
- zg query "authentication flow" --fts "AuthService" --fts "ForbiddenError"
242
- zg query --rg -i -C 2 -g "*.ts" "needle text" src
243
- ```
244
-
245
- 托管的 rg 模式支持常用的 ripgrep 匹配、上下文、文件类型、glob、ignore、
246
- 深度、大小、符号链接、编码和正则引擎参数。结果格式由 zvec-grep 管理,
247
- 因此 `--json`、`--count`、`--files`、`-l`、`-o`、`--replace` 和
248
- `--vimgrep` 等会改变输出形态的模式会被拒绝。`.git/**` 和
249
- `.zvec-grep/**` 始终保持排除。
250
-
251
- ## <a id="library-api"></a>🛠️ 库 API
252
-
253
- ```ts
254
- import { createZvecGrep } from "@zvec/zvec-grep";
255
-
256
- const zvecGrep = await createZvecGrep({
257
- root: process.cwd(),
258
- });
259
-
260
- const result = await zvecGrep.context({
261
- query: "ranking implementation",
262
- limit: 5,
263
- });
264
-
265
- for (const item of result.items) {
266
- const location =
267
- item.range.kind === "text"
268
- ? `${item.file.relativePath}:${item.range.startLine}`
269
- : item.file.relativePath;
270
- console.log(location);
271
- }
272
-
273
- await zvecGrep.close();
274
- ```
275
-
276
- 显式进行无索引文本搜索:
277
-
278
- ```ts
279
- const result = await zvecGrep.context({
280
- query: "ZVEC_GREP_HOME",
281
- rg: true,
282
- });
283
- ```
284
-
285
- ## 🤝 加入 Zvec 社区
125
+ ## 🤝 加入社区
286
126
 
287
127
  <div align="center">
288
128
 
289
- | 💬 钉钉群 | 📱 微信群 | 🎮 Discord | X (Twitter) |
290
- | :-----------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: |
291
- | <img src="https://zvec.oss-cn-hongkong.aliyuncs.com/qrcode/dingding.png" width="150" alt="钉钉二维码"/> | <img src="https://zvec.oss-cn-hongkong.aliyuncs.com/qrcode/wechat.png?v=6" width="150" alt="微信二维码"/> | [![Discord](https://img.shields.io/badge/Discord-Join%20Server-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/rKddFBBu9z) | [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ZvecAI)](https://x.com/ZvecAI) |
292
- | 扫码加入 | 扫码加入 | 点击加入 | 点击关注 |
129
+ | 💬 钉钉群 | 📱 微信群 | 🎮 Discord | X (Twitter) |
130
+ | :---: | :---: | :---: | :---: |
131
+ | <img src="https://zvec.oss-cn-hongkong.aliyuncs.com/qrcode/dingding.png" width="150" alt="钉钉二维码"/> | <img src="https://zvec.oss-cn-hongkong.aliyuncs.com/qrcode/wechat.png?v1" width="150" alt="微信二维码"/> | [![Discord](https://img.shields.io/badge/Discord-Join%20Server-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/rKddFBBu9z) | [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ZvecAI)](<https://x.com/ZvecAI>) |
132
+ | 扫码加入 | 扫码加入 | 点击加入 | 点击关注 |
293
133
 
294
134
  </div>
295
135
 
296
136
  ## ❤️ 参与贡献
297
137
 
298
- 欢迎提交 issue 和 pull request。请保持改动聚焦;如果改变行为,请补充测试,并运行:
299
-
300
- ```bash
301
- npm run check
302
- ```
138
+ 始终欢迎社区贡献——缺陷修复、新功能和文档改进都会让 zvec-grep 变得更好。
303
139
 
304
- Pull request 标题需遵循 Conventional Commits。
140
+ 请查阅我们的[贡献指南](./CONTRIBUTING.md)开始参与!
@@ -0,0 +1,7 @@
1
+ export { RemoteEmbeddingAuthorizationManager } from "./manager.js";
2
+ export { createRemoteEmbeddingOperationPermit, remoteEmbeddingAuthorizationGuard, withRemoteEmbeddingOperationPermit, } from "./operation.js";
3
+ export { RemoteEmbeddingAuthorizationStore } from "./store.js";
4
+ export { formatRemoteEmbeddingAuthorizationPrompt, remoteEmbeddingDisclosureData, type RemoteEmbeddingAuthorizationPromptInput, } from "./prompt.js";
5
+ export { indexStatusIsFresh, planRemoteIndexAuthorization, planRemoteSearchAuthorization, searchUsesVector, } from "./planner.js";
6
+ export { canonicalizeWorkspaceRoots, createRemoteEmbeddingTarget, remoteEmbeddingTargetFingerprint, workspaceFingerprint, } from "./target.js";
7
+ export type { RemoteEmbeddingAuthorizationPlan, RemoteEmbeddingAuthorizationScope, RemoteEmbeddingAuthorizationStatus, RemoteEmbeddingDataDisclosure, RemoteEmbeddingOperation, RemoteEmbeddingOperationPermit, RemoteEmbeddingTarget, RemoteEmbeddingWorkspaceGrant, } from "./types.js";
@@ -0,0 +1,7 @@
1
+ export { RemoteEmbeddingAuthorizationManager } from "./manager.js";
2
+ export { createRemoteEmbeddingOperationPermit, remoteEmbeddingAuthorizationGuard, withRemoteEmbeddingOperationPermit, } from "./operation.js";
3
+ export { RemoteEmbeddingAuthorizationStore } from "./store.js";
4
+ export { formatRemoteEmbeddingAuthorizationPrompt, remoteEmbeddingDisclosureData, } from "./prompt.js";
5
+ export { indexStatusIsFresh, planRemoteIndexAuthorization, planRemoteSearchAuthorization, searchUsesVector, } from "./planner.js";
6
+ export { canonicalizeWorkspaceRoots, createRemoteEmbeddingTarget, remoteEmbeddingTargetFingerprint, workspaceFingerprint, } from "./target.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EACL,oCAAoC,EACpC,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EACL,wCAAwC,EACxC,6BAA6B,GAE9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,gCAAgC,EAChC,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
2
+ import type { RemoteEmbeddingAuthorizationPlan, RemoteEmbeddingAuthorizationScope, RemoteEmbeddingOperationPermit } from "./types.js";
3
+ export declare class RemoteEmbeddingAuthorizationManager {
4
+ readonly store: RemoteEmbeddingAuthorizationStore;
5
+ constructor(store?: RemoteEmbeddingAuthorizationStore);
6
+ existingWorkspacePermit(plan: RemoteEmbeddingAuthorizationPlan): Promise<RemoteEmbeddingOperationPermit | undefined>;
7
+ grant(plan: RemoteEmbeddingAuthorizationPlan, scope: RemoteEmbeddingAuthorizationScope): Promise<RemoteEmbeddingOperationPermit>;
8
+ }
@@ -0,0 +1,19 @@
1
+ import { createRemoteEmbeddingOperationPermit } from "./operation.js";
2
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
3
+ export class RemoteEmbeddingAuthorizationManager {
4
+ store;
5
+ constructor(store = new RemoteEmbeddingAuthorizationStore()) {
6
+ this.store = store;
7
+ }
8
+ async existingWorkspacePermit(plan) {
9
+ if (!(await this.store.hasGrant(plan.target)))
10
+ return undefined;
11
+ return createRemoteEmbeddingOperationPermit(plan.target, "workspace");
12
+ }
13
+ async grant(plan, scope) {
14
+ if (scope === "workspace")
15
+ await this.store.grant(plan.target);
16
+ return createRemoteEmbeddingOperationPermit(plan.target, scope);
17
+ }
18
+ }
19
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/authorization/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oCAAoC,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAO/D,MAAM,OAAO,mCAAmC;IACrC,KAAK,CAAoC;IAElD,YAAY,KAAK,GAAG,IAAI,iCAAiC,EAAE;QACzD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,IAAsC;QAEtC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAChE,OAAO,oCAAoC,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,KAAK,CACT,IAAsC,EACtC,KAAwC;QAExC,IAAI,KAAK,KAAK,WAAW;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,oCAAoC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
2
+ import { type RemoteEmbeddingAuthorizationScope, type RemoteEmbeddingOperationPermit, type RemoteEmbeddingRequest, type RemoteEmbeddingTarget } from "./types.js";
3
+ export declare function createRemoteEmbeddingOperationPermit(target: RemoteEmbeddingTarget, scope: RemoteEmbeddingAuthorizationScope): RemoteEmbeddingOperationPermit;
4
+ export declare function withRemoteEmbeddingOperationPermit<T>(permit: RemoteEmbeddingOperationPermit | undefined, operation: () => Promise<T>): Promise<T>;
5
+ export declare function remoteEmbeddingAuthorizationGuard(options?: {
6
+ store?: RemoteEmbeddingAuthorizationStore;
7
+ }): (request: RemoteEmbeddingRequest) => Promise<void>;
@@ -0,0 +1,50 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { randomUUID } from "node:crypto";
3
+ import { EngineError } from "../engine/errors.js";
4
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
5
+ import { REMOTE_EMBEDDING_CAPABILITY, } from "./types.js";
6
+ const operationPermit = new AsyncLocalStorage();
7
+ export function createRemoteEmbeddingOperationPermit(target, scope) {
8
+ return {
9
+ capability: REMOTE_EMBEDDING_CAPABILITY,
10
+ scope,
11
+ target,
12
+ issuedAt: Date.now(),
13
+ operationId: randomUUID(),
14
+ };
15
+ }
16
+ export async function withRemoteEmbeddingOperationPermit(permit, operation) {
17
+ if (!permit)
18
+ return await operation();
19
+ return await operationPermit.run(permit, operation);
20
+ }
21
+ export function remoteEmbeddingAuthorizationGuard(options = {}) {
22
+ const store = options.store ?? new RemoteEmbeddingAuthorizationStore();
23
+ return async (request) => {
24
+ const permit = operationPermit.getStore();
25
+ if (!permit ||
26
+ permit.capability !== REMOTE_EMBEDDING_CAPABILITY ||
27
+ permit.target.provider !== request.provider ||
28
+ permit.target.model !== request.model ||
29
+ permit.target.endpoint !== request.endpoint) {
30
+ throw authorizationRequiredError(request);
31
+ }
32
+ if (permit.scope === "workspace" &&
33
+ !(await store.hasGrant(permit.target))) {
34
+ throw authorizationRequiredError(request, "Workspace grant is missing, invalid, or revoked.");
35
+ }
36
+ };
37
+ }
38
+ function authorizationRequiredError(request, detail) {
39
+ return new EngineError("Remote Embedding authorization is required", {
40
+ code: "ZVEC_GREP.ENGINE.AUTH.REMOTE_EMBEDDING_REQUIRED",
41
+ context: [
42
+ `provider=${request.provider}`,
43
+ `model=${request.model}`,
44
+ `endpoint=${request.endpoint}`,
45
+ `purpose=${request.purpose}`,
46
+ ...(detail ? [`detail=${detail}`] : []),
47
+ ].join(" "),
48
+ });
49
+ }
50
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../../src/authorization/operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EACL,2BAA2B,GAK5B,MAAM,YAAY,CAAC;AAEpB,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAkC,CAAC;AAEhF,MAAM,UAAU,oCAAoC,CAClD,MAA6B,EAC7B,KAAwC;IAExC,OAAO;QACL,UAAU,EAAE,2BAA2B;QACvC,KAAK;QACL,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;QACpB,WAAW,EAAE,UAAU,EAAE;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,MAAkD,EAClD,SAA2B;IAE3B,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,SAAS,EAAE,CAAC;IACtC,OAAO,MAAM,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,UAEI,EAAE;IAEN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,iCAAiC,EAAE,CAAC;IACvE,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;QAC1C,IACE,CAAC,MAAM;YACP,MAAM,CAAC,UAAU,KAAK,2BAA2B;YACjD,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAC3C,CAAC;YACD,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,IACE,MAAM,CAAC,KAAK,KAAK,WAAW;YAC5B,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EACtC,CAAC;YACD,MAAM,0BAA0B,CAC9B,OAAO,EACP,kDAAkD,CACnD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,OAA+B,EAC/B,MAAe;IAEf,OAAO,IAAI,WAAW,CAAC,4CAA4C,EAAE;QACnE,IAAI,EAAE,iDAAiD;QACvD,OAAO,EAAE;YACP,YAAY,OAAO,CAAC,QAAQ,EAAE;YAC9B,SAAS,OAAO,CAAC,KAAK,EAAE;YACxB,YAAY,OAAO,CAAC,QAAQ,EAAE;YAC9B,WAAW,OAAO,CAAC,OAAO,EAAE;YAC5B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,IAAI,CAAC,GAAG,CAAC;KACZ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { NormalizedSearchInput } from "../mcp/input-normalization.js";
2
+ import type { EmbeddingModelInfo } from "../engine/models/index.js";
3
+ import type { ZvecGrepInfoResult } from "../engine/service/types.js";
4
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
5
+ import type { RemoteEmbeddingAuthorizationPlan } from "./types.js";
6
+ export declare function planRemoteIndexAuthorization(input: {
7
+ info: ZvecGrepInfoResult;
8
+ model: EmbeddingModelInfo;
9
+ rebuild?: boolean;
10
+ needsUpdate?: boolean;
11
+ store?: RemoteEmbeddingAuthorizationStore;
12
+ }): Promise<RemoteEmbeddingAuthorizationPlan | undefined>;
13
+ export declare function planRemoteSearchAuthorization(input: {
14
+ info: ZvecGrepInfoResult;
15
+ model: EmbeddingModelInfo;
16
+ search: NormalizedSearchInput;
17
+ runtimeNeedsReconciliation?: boolean;
18
+ store?: RemoteEmbeddingAuthorizationStore;
19
+ }): Promise<RemoteEmbeddingAuthorizationPlan | undefined>;
20
+ export declare function searchUsesVector(input: Pick<NormalizedSearchInput, "queries" | "routes">): boolean;
21
+ export declare function indexStatusIsFresh(info: ZvecGrepInfoResult): boolean;
@@ -0,0 +1,97 @@
1
+ import { createRemoteEmbeddingTarget } from "./target.js";
2
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
3
+ export async function planRemoteIndexAuthorization(input) {
4
+ if (input.model.provider !== "qwen")
5
+ return undefined;
6
+ const needsEmbedding = input.rebuild === true ||
7
+ input.needsUpdate === true ||
8
+ !input.info.indexed ||
9
+ !indexStatusIsFresh(input.info);
10
+ if (!needsEmbedding)
11
+ return undefined;
12
+ const endpoint = input.model.endpoint;
13
+ if (endpoint === undefined) {
14
+ throw new Error(`Embedding model ${input.model.reference} did not provide a remote endpoint.`);
15
+ }
16
+ const target = await createRemoteEmbeddingTarget({
17
+ roots: workspaceRoots(input.info),
18
+ provider: input.model.provider,
19
+ model: input.model.name,
20
+ endpoint,
21
+ });
22
+ const store = input.store ?? new RemoteEmbeddingAuthorizationStore();
23
+ return {
24
+ operation: "index",
25
+ target,
26
+ disclosure: {
27
+ queryText: false,
28
+ workspaceContent: !input.info.indexed || input.rebuild ? "full" : "changed",
29
+ },
30
+ reason: input.rebuild
31
+ ? "index_rebuild"
32
+ : input.info.indexed
33
+ ? "index_update"
34
+ : "index_create",
35
+ grantPath: store.grantPath(target),
36
+ };
37
+ }
38
+ export async function planRemoteSearchAuthorization(input) {
39
+ const schema = input.info.workspaceIndex?.embedding;
40
+ if (!input.info.indexed || !schema || schema.provider !== "qwen") {
41
+ return undefined;
42
+ }
43
+ if (input.model.provider !== schema.provider ||
44
+ input.model.name !== schema.model) {
45
+ throw new Error(`Embedding model ${input.model.reference} does not match indexed model ${schema.provider}/${schema.model}.`);
46
+ }
47
+ const usesVector = searchUsesVector(input.search);
48
+ const needsUpdate = input.runtimeNeedsReconciliation === true ||
49
+ !indexStatusIsFresh(input.info);
50
+ const updatesIndex = needsUpdate &&
51
+ (input.search.autoUpdate || input.search.freshness === "wait_for_fresh");
52
+ if (!usesVector && !updatesIndex)
53
+ return undefined;
54
+ const endpoint = input.model.endpoint;
55
+ if (endpoint === undefined) {
56
+ throw new Error(`Embedding model ${input.model.reference} did not provide a remote endpoint.`);
57
+ }
58
+ const target = await createRemoteEmbeddingTarget({
59
+ roots: workspaceRoots(input.info),
60
+ provider: input.model.provider,
61
+ model: input.model.name,
62
+ endpoint,
63
+ });
64
+ const store = input.store ?? new RemoteEmbeddingAuthorizationStore();
65
+ return {
66
+ operation: usesVector
67
+ ? updatesIndex
68
+ ? "query_and_index"
69
+ : "query"
70
+ : "index",
71
+ target,
72
+ disclosure: {
73
+ queryText: usesVector,
74
+ workspaceContent: updatesIndex ? "changed" : "none",
75
+ },
76
+ reason: "query",
77
+ grantPath: store.grantPath(target),
78
+ };
79
+ }
80
+ export function searchUsesVector(input) {
81
+ return ((input.queries?.length ?? 0) > 0 ||
82
+ input.routes.some((route) => route.mode === "vector"));
83
+ }
84
+ export function indexStatusIsFresh(info) {
85
+ const status = info.status;
86
+ return Boolean(status &&
87
+ status.filesAdded === 0 &&
88
+ status.filesModified === 0 &&
89
+ status.filesDeleted === 0 &&
90
+ status.filesPending === 0 &&
91
+ status.filesFailed === 0);
92
+ }
93
+ function workspaceRoots(info) {
94
+ const roots = info.workspaceIndex?.rootPaths.map((root) => root.absolutePath) ?? [];
95
+ return roots.length > 0 ? roots : [info.root];
96
+ }
97
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/authorization/planner.ts"],"names":[],"mappings":"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"}