@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.
- package/README.md +88 -249
- package/README_CN.md +82 -246
- package/dist/authorization/index.d.ts +7 -0
- package/dist/authorization/index.js +7 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/manager.d.ts +8 -0
- package/dist/authorization/manager.js +19 -0
- package/dist/authorization/manager.js.map +1 -0
- package/dist/authorization/operation.d.ts +7 -0
- package/dist/authorization/operation.js +50 -0
- package/dist/authorization/operation.js.map +1 -0
- package/dist/authorization/planner.d.ts +21 -0
- package/dist/authorization/planner.js +97 -0
- package/dist/authorization/planner.js.map +1 -0
- package/dist/authorization/prompt.d.ts +11 -0
- package/dist/authorization/prompt.js +62 -0
- package/dist/authorization/prompt.js.map +1 -0
- package/dist/authorization/store.d.ts +20 -0
- package/dist/authorization/store.js +251 -0
- package/dist/authorization/store.js.map +1 -0
- package/dist/authorization/target.d.ts +15 -0
- package/dist/authorization/target.js +49 -0
- package/dist/authorization/target.js.map +1 -0
- package/dist/authorization/types.d.ts +61 -0
- package/dist/authorization/types.js +2 -0
- package/dist/authorization/types.js.map +1 -0
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.js +304 -54
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth.d.ts +21 -0
- package/dist/cli/auth.js +212 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/commands.js +433 -618
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/errors.js +2 -2
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/format/context.d.ts +1 -0
- package/dist/cli/format/context.js +241 -45
- package/dist/cli/format/context.js.map +1 -1
- package/dist/cli/format/debug.js +2 -2
- package/dist/cli/format/debug.js.map +1 -1
- package/dist/cli/format/progress.d.ts +4 -0
- package/dist/cli/format/progress.js +219 -46
- package/dist/cli/format/progress.js.map +1 -1
- package/dist/cli/format/status.d.ts +77 -6
- package/dist/cli/format/status.js +302 -106
- package/dist/cli/format/status.js.map +1 -1
- package/dist/cli/help.js +258 -59
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/install.d.ts +4 -0
- package/dist/cli/install.js +845 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/managed-rg.d.ts +10 -0
- package/dist/cli/managed-rg.js +329 -0
- package/dist/cli/managed-rg.js.map +1 -0
- package/dist/cli/types.d.ts +20 -6
- package/dist/cli/types.js.map +1 -1
- package/dist/client/daemon-client.d.ts +19 -0
- package/dist/client/daemon-client.js +180 -0
- package/dist/client/daemon-client.js.map +1 -0
- package/dist/client/mode-router.d.ts +9 -0
- package/dist/client/mode-router.js +28 -0
- package/dist/client/mode-router.js.map +1 -0
- package/dist/client/search-policy.d.ts +11 -0
- package/dist/client/search-policy.js +15 -0
- package/dist/client/search-policy.js.map +1 -0
- package/dist/daemon/backend.d.ts +76 -0
- package/dist/daemon/backend.js +1049 -0
- package/dist/daemon/backend.js.map +1 -0
- package/dist/daemon/change-set.d.ts +25 -0
- package/dist/daemon/change-set.js +101 -0
- package/dist/daemon/change-set.js.map +1 -0
- package/dist/daemon/config.d.ts +24 -0
- package/dist/daemon/config.js +88 -0
- package/dist/daemon/config.js.map +1 -0
- package/dist/daemon/errors.d.ts +5 -0
- package/dist/daemon/errors.js +11 -0
- package/dist/daemon/errors.js.map +1 -0
- package/dist/daemon/http-server.d.ts +30 -0
- package/dist/daemon/http-server.js +287 -0
- package/dist/daemon/http-server.js.map +1 -0
- package/dist/daemon/index-coordinator.d.ts +23 -0
- package/dist/daemon/index-coordinator.js +68 -0
- package/dist/daemon/index-coordinator.js.map +1 -0
- package/dist/daemon/job-scheduler.d.ts +70 -0
- package/dist/daemon/job-scheduler.js +366 -0
- package/dist/daemon/job-scheduler.js.map +1 -0
- package/dist/daemon/logger.d.ts +9 -0
- package/dist/daemon/logger.js +53 -0
- package/dist/daemon/logger.js.map +1 -0
- package/dist/daemon/model-pool.d.ts +45 -0
- package/dist/daemon/model-pool.js +187 -0
- package/dist/daemon/model-pool.js.map +1 -0
- package/dist/daemon/root-lease.d.ts +14 -0
- package/dist/daemon/root-lease.js +188 -0
- package/dist/daemon/root-lease.js.map +1 -0
- package/dist/daemon/root-runtime.d.ts +78 -0
- package/dist/daemon/root-runtime.js +333 -0
- package/dist/daemon/root-runtime.js.map +1 -0
- package/dist/daemon/runtime-manager.d.ts +45 -0
- package/dist/daemon/runtime-manager.js +243 -0
- package/dist/daemon/runtime-manager.js.map +1 -0
- package/dist/daemon/runtime.d.ts +12 -0
- package/dist/daemon/runtime.js +102 -0
- package/dist/daemon/runtime.js.map +1 -0
- package/dist/daemon/server-controller.d.ts +39 -0
- package/dist/daemon/server-controller.js +203 -0
- package/dist/daemon/server-controller.js.map +1 -0
- package/dist/daemon/watch-manager.d.ts +50 -0
- package/dist/daemon/watch-manager.js +293 -0
- package/dist/daemon/watch-manager.js.map +1 -0
- package/dist/daemon/workspace-read-session-cache.d.ts +31 -0
- package/dist/daemon/workspace-read-session-cache.js +115 -0
- package/dist/daemon/workspace-read-session-cache.js.map +1 -0
- package/dist/engine/config.d.ts +30 -8
- package/dist/engine/config.js +171 -45
- package/dist/engine/config.js.map +1 -1
- package/dist/engine/{errors/index.d.ts → errors.d.ts} +6 -1
- package/dist/engine/{errors/details.js → errors.js} +17 -4
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/extraction/code/adapter.d.ts +1 -1
- package/dist/engine/extraction/code/extractor.d.ts +5 -11
- package/dist/engine/extraction/code/extractor.js +105 -44
- package/dist/engine/extraction/code/extractor.js.map +1 -1
- package/dist/engine/extraction/code/families/c-family.js +1 -1
- package/dist/engine/extraction/code/families/c-family.js.map +1 -1
- package/dist/engine/extraction/code/families/js-ts.d.ts +1 -1
- package/dist/engine/extraction/code/families/metadata.d.ts +1 -1
- package/dist/engine/extraction/code/tree-sitter/grammar.js.map +1 -0
- package/dist/engine/extraction/code/tree-sitter/nodes.js.map +1 -0
- package/dist/engine/extraction/code/tree-sitter/parser.js.map +1 -0
- package/dist/engine/extraction/image/extractor.d.ts +5 -0
- package/dist/engine/extraction/image/extractor.js +35 -0
- package/dist/engine/extraction/image/extractor.js.map +1 -0
- package/dist/engine/extraction/index.d.ts +3 -44
- package/dist/engine/extraction/index.js +1 -280
- package/dist/engine/extraction/index.js.map +1 -1
- package/dist/engine/extraction/markdown/extractor.d.ts +5 -11
- package/dist/engine/extraction/markdown/extractor.js +35 -16
- package/dist/engine/extraction/markdown/extractor.js.map +1 -1
- package/dist/engine/extraction/runtime.d.ts +4 -0
- package/dist/engine/extraction/runtime.js +26 -0
- package/dist/engine/extraction/runtime.js.map +1 -0
- package/dist/engine/extraction/source.d.ts +18 -0
- package/dist/engine/extraction/source.js +22 -0
- package/dist/engine/extraction/source.js.map +1 -0
- package/dist/engine/extraction/text/extractor.d.ts +7 -0
- package/dist/engine/extraction/text/extractor.js +168 -0
- package/dist/engine/extraction/text/extractor.js.map +1 -0
- package/dist/engine/extraction/types.d.ts +4 -0
- package/dist/engine/{models → extraction}/types.js.map +1 -1
- package/dist/engine/{files/file-type.d.ts → file-type.d.ts} +1 -1
- package/dist/engine/file-type.js.map +1 -0
- package/dist/engine/index-status.d.ts +9 -0
- package/dist/engine/index-status.js +38 -0
- package/dist/engine/index-status.js.map +1 -0
- package/dist/engine/manifest.d.ts +12 -0
- package/dist/engine/manifest.js +120 -0
- package/dist/engine/manifest.js.map +1 -0
- package/dist/engine/models/{providers/llama-cpp/embedding.d.ts → backends/llama-cpp.d.ts} +25 -20
- package/dist/engine/models/{providers/llama-cpp/embedding.js → backends/llama-cpp.js} +127 -106
- package/dist/engine/models/backends/llama-cpp.js.map +1 -0
- package/dist/engine/models/backends/model2vec.d.ts +57 -0
- package/dist/engine/models/backends/model2vec.js +332 -0
- package/dist/engine/models/backends/model2vec.js.map +1 -0
- package/dist/engine/models/backends/qwen.d.ts +44 -0
- package/dist/engine/models/{providers/qwen/embedding.js → backends/qwen.js} +155 -94
- package/dist/engine/models/backends/qwen.js.map +1 -0
- package/dist/engine/models/backends/transformers-js.d.ts +87 -0
- package/dist/engine/models/backends/transformers-js.js +316 -0
- package/dist/engine/models/backends/transformers-js.js.map +1 -0
- package/dist/engine/models/catalog.d.ts +188 -23
- package/dist/engine/models/catalog.js +172 -25
- package/dist/engine/models/catalog.js.map +1 -1
- package/dist/engine/models/download-progress.d.ts +15 -0
- package/dist/engine/models/download-progress.js +48 -0
- package/dist/engine/models/download-progress.js.map +1 -0
- package/dist/engine/models/embeddings.d.ts +58 -18
- package/dist/engine/models/embeddings.js +52 -28
- package/dist/engine/models/embeddings.js.map +1 -1
- package/dist/engine/models/factory.d.ts +2 -5
- package/dist/engine/models/factory.js +41 -56
- package/dist/engine/models/factory.js.map +1 -1
- package/dist/engine/models/index.d.ts +4 -6
- package/dist/engine/models/index.js +4 -4
- package/dist/engine/models/index.js.map +1 -1
- package/dist/engine/models/ranking.d.ts +7 -3
- package/dist/engine/models/resolution.d.ts +8 -0
- package/dist/engine/models/resolution.js +22 -0
- package/dist/engine/models/resolution.js.map +1 -0
- package/dist/engine/pipeline/indexing/index.d.ts +9 -7
- package/dist/engine/pipeline/indexing/index.js +360 -121
- package/dist/engine/pipeline/indexing/index.js.map +1 -1
- package/dist/engine/pipeline/indexing/root-paths.js +6 -6
- package/dist/engine/pipeline/indexing/root-paths.js.map +1 -1
- package/dist/engine/pipeline/indexing/scanner/index.d.ts +6 -1
- package/dist/engine/pipeline/indexing/scanner/index.js +233 -29
- package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
- package/dist/engine/pipeline/search/index.d.ts +6 -6
- package/dist/engine/pipeline/search/index.js +8 -10
- package/dist/engine/pipeline/search/index.js.map +1 -1
- package/dist/engine/service/index.d.ts +3 -2
- package/dist/engine/service/index.js +1 -1
- package/dist/engine/service/index.js.map +1 -1
- package/dist/engine/service/root.d.ts +13 -12
- package/dist/engine/service/root.js +35 -24
- package/dist/engine/service/root.js.map +1 -1
- package/dist/engine/service/structure-enrichment.js +12 -14
- package/dist/engine/service/structure-enrichment.js.map +1 -1
- package/dist/engine/service/types.d.ts +32 -37
- package/dist/engine/service/workspace-index.d.ts +24 -0
- package/dist/engine/service/workspace-index.js +151 -0
- package/dist/engine/service/workspace-index.js.map +1 -0
- package/dist/engine/service/zvec-grep.d.ts +12 -1
- package/dist/engine/service/zvec-grep.js +677 -486
- package/dist/engine/service/zvec-grep.js.map +1 -1
- package/dist/engine/storage/index.d.ts +8 -4
- package/dist/engine/storage/index.js +1 -1
- package/dist/engine/storage/index.js.map +1 -1
- package/dist/engine/storage/zvec.d.ts +10 -33
- package/dist/engine/storage/zvec.js +95 -38
- package/dist/engine/storage/zvec.js.map +1 -1
- package/dist/engine/types.d.ts +15 -23
- package/dist/engine/types.js +1 -1
- package/dist/engine/types.js.map +1 -1
- package/dist/engine/utils/daemon-lease.d.ts +17 -0
- package/dist/engine/utils/daemon-lease.js +175 -0
- package/dist/engine/utils/daemon-lease.js.map +1 -0
- package/dist/engine/utils/file-selection.js +38 -1
- package/dist/engine/utils/file-selection.js.map +1 -1
- package/dist/engine/utils/lock.js +1 -1
- package/dist/engine/utils/lock.js.map +1 -1
- package/dist/index-progress.d.ts +10 -0
- package/dist/index-progress.js +159 -0
- package/dist/index-progress.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/http-transport.d.ts +27 -0
- package/dist/mcp/http-transport.js +182 -0
- package/dist/mcp/http-transport.js.map +1 -0
- package/dist/mcp/input-normalization.d.ts +38 -0
- package/dist/mcp/input-normalization.js +95 -0
- package/dist/mcp/input-normalization.js.map +1 -0
- package/dist/mcp/progress-heartbeat.d.ts +17 -0
- package/dist/mcp/progress-heartbeat.js +46 -0
- package/dist/mcp/progress-heartbeat.js.map +1 -0
- package/dist/mcp/request-metadata.d.ts +2 -0
- package/dist/mcp/request-metadata.js +11 -0
- package/dist/mcp/request-metadata.js.map +1 -0
- package/dist/mcp/request-state.d.ts +40 -0
- package/dist/mcp/request-state.js +210 -0
- package/dist/mcp/request-state.js.map +1 -0
- package/dist/mcp/result-format.d.ts +13 -0
- package/dist/mcp/result-format.js +75 -0
- package/dist/mcp/result-format.js.map +1 -0
- package/dist/mcp/schemas.d.ts +430 -0
- package/dist/mcp/schemas.js +447 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/tools.d.ts +150 -0
- package/dist/mcp/tools.js +448 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/toolset.d.ts +5 -0
- package/dist/mcp/toolset.js +12 -0
- package/dist/mcp/toolset.js.map +1 -0
- package/dist/observability/trace-context.d.ts +11 -0
- package/dist/observability/trace-context.js +138 -0
- package/dist/observability/trace-context.js.map +1 -0
- package/docs/01-agents.md +111 -0
- package/docs/02-cli.md +229 -0
- package/docs/03-mcp.md +167 -0
- package/docs/04-pipeline.md +218 -0
- package/docs/05-architecture.md +86 -0
- package/docs/06-server.md +210 -0
- package/docs/07-embedding.md +179 -0
- package/docs/08-roadmap.md +85 -0
- package/docs/README.md +53 -0
- package/package.json +17 -8
- package/skills/zvec-grep/SKILL.md +43 -133
- package/skills/zvec-grep/agents/openai.yaml +2 -2
- package/skills/zvec-grep/references/cli-fallback.md +85 -0
- package/dist/cli/mcp.d.ts +0 -2
- package/dist/cli/mcp.js +0 -354
- package/dist/cli/mcp.js.map +0 -1
- package/dist/engine/collection/index.d.ts +0 -55
- package/dist/engine/collection/index.js +0 -710
- package/dist/engine/collection/index.js.map +0 -1
- package/dist/engine/errors/details.d.ts +0 -6
- package/dist/engine/errors/details.js.map +0 -1
- package/dist/engine/errors/index.js +0 -16
- package/dist/engine/errors/index.js.map +0 -1
- package/dist/engine/extraction/tree-sitter/grammar.js.map +0 -1
- package/dist/engine/extraction/tree-sitter/nodes.js.map +0 -1
- package/dist/engine/extraction/tree-sitter/parser.js.map +0 -1
- package/dist/engine/files/file-type.js.map +0 -1
- package/dist/engine/models/providers/index.d.ts +0 -2
- package/dist/engine/models/providers/index.js +0 -3
- package/dist/engine/models/providers/index.js.map +0 -1
- package/dist/engine/models/providers/llama-cpp/embedding.js.map +0 -1
- package/dist/engine/models/providers/llama-cpp/index.d.ts +0 -1
- package/dist/engine/models/providers/llama-cpp/index.js +0 -2
- package/dist/engine/models/providers/llama-cpp/index.js.map +0 -1
- package/dist/engine/models/providers/qwen/embedding.d.ts +0 -42
- package/dist/engine/models/providers/qwen/embedding.js.map +0 -1
- package/dist/engine/models/providers/qwen/index.d.ts +0 -1
- package/dist/engine/models/providers/qwen/index.js +0 -2
- package/dist/engine/models/providers/qwen/index.js.map +0 -1
- package/dist/engine/models/types.d.ts +0 -30
- /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.d.ts +0 -0
- /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.js +0 -0
- /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.d.ts +0 -0
- /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.js +0 -0
- /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.d.ts +0 -0
- /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.js +0 -0
- /package/dist/engine/{models → extraction}/types.js +0 -0
- /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="
|
|
8
|
-
<img src="
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
<
|
|
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
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
```
|
|
45
|
+
只需安装一次集成并为工作区建索引,之后既可以在终端中搜索,也可以直接向
|
|
46
|
+
Agent 提问。
|
|
35
47
|
|
|
36
|
-
>
|
|
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
|
-
##
|
|
50
|
+
## 💫 为什么选择 zg?
|
|
46
51
|
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
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
|
-
|
|
61
|
+
<a id="quickstart"></a>
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
## 🚀 快速开始
|
|
60
64
|
|
|
61
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
切换到适合人看的输出:
|
|
103
|
+
也可以直接在终端中使用同一个本地检索层。查看 [CLI 指南](./docs/02-cli.md),了解
|
|
104
|
+
搜索方式、过滤条件和输出控制。
|
|
145
105
|
|
|
146
106
|
```bash
|
|
147
|
-
zg query --human "
|
|
107
|
+
zg query --human "theme preference persistence on startup" --limit 3
|
|
148
108
|
```
|
|
149
109
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
## <a id="models"></a>🧠 模型
|
|
153
|
-
|
|
154
|
-
本地模型通过 `node-llama-cpp` 运行,适合把代码检索留在本机:
|
|
110
|
+
<a id="benchmarks"></a>
|
|
155
111
|
|
|
156
|
-
|
|
157
|
-
zg index --embedding local/embeddinggemma-300m
|
|
158
|
-
zg index --embedding local/qwen3-embedding-0.6b
|
|
159
|
-
```
|
|
112
|
+
## 📊 性能测试
|
|
160
113
|
|
|
161
|
-
|
|
114
|
+
> 🚧 **正在完善中。**
|
|
162
115
|
|
|
163
|
-
|
|
116
|
+
## 🗺️ Roadmap
|
|
164
117
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
--embedding qwen/text-embedding-v4 \
|
|
168
|
-
--api-key "$DASHSCOPE_API_KEY"
|
|
169
|
-
```
|
|
118
|
+
zg 正在迈向更丰富的多模态格式、更强的混合检索、更开箱即用的体验,以及从
|
|
119
|
+
桌面端到移动端的全平台支持。
|
|
170
120
|
|
|
171
|
-
|
|
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
|
-
|
|
123
|
+
<a id="community"></a>
|
|
189
124
|
|
|
190
|
-
|
|
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
|
-
|
|
|
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?
|
|
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="微信二维码"/> | [](https://discord.gg/rKddFBBu9z) | [](<https://x.com/ZvecAI>) |
|
|
132
|
+
| 扫码加入 | 扫码加入 | 点击加入 | 点击关注 |
|
|
293
133
|
|
|
294
134
|
</div>
|
|
295
135
|
|
|
296
136
|
## ❤️ 参与贡献
|
|
297
137
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
```bash
|
|
301
|
-
npm run check
|
|
302
|
-
```
|
|
138
|
+
始终欢迎社区贡献——缺陷修复、新功能和文档改进都会让 zvec-grep 变得更好。
|
|
303
139
|
|
|
304
|
-
|
|
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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"}
|