@angri450/zvec-grep 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +319 -0
- package/README_CN.md +297 -0
- 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 +12 -0
- package/dist/authorization/prompt.js +63 -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 +6 -0
- package/dist/cli/args.js +1255 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/auth.d.ts +21 -0
- package/dist/cli/auth.js +209 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/commands.d.ts +4 -0
- package/dist/cli/commands.js +801 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/errors.d.ts +9 -0
- package/dist/cli/errors.js +131 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/format/context.d.ts +9 -0
- package/dist/cli/format/context.js +786 -0
- package/dist/cli/format/context.js.map +1 -0
- package/dist/cli/format/debug.d.ts +4 -0
- package/dist/cli/format/debug.js +60 -0
- package/dist/cli/format/debug.js.map +1 -0
- package/dist/cli/format/highlight.d.ts +3 -0
- package/dist/cli/format/highlight.js +106 -0
- package/dist/cli/format/highlight.js.map +1 -0
- package/dist/cli/format/progress.d.ts +13 -0
- package/dist/cli/format/progress.js +290 -0
- package/dist/cli/format/progress.js.map +1 -0
- package/dist/cli/format/range.d.ts +3 -0
- package/dist/cli/format/range.js +24 -0
- package/dist/cli/format/range.js.map +1 -0
- package/dist/cli/format/status.d.ts +83 -0
- package/dist/cli/format/status.js +530 -0
- package/dist/cli/format/status.js.map +1 -0
- package/dist/cli/help.d.ts +1 -0
- package/dist/cli/help.js +546 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +40 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +4 -0
- package/dist/cli/install.js +1735 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/managed-rg.d.ts +10 -0
- package/dist/cli/managed-rg.js +337 -0
- package/dist/cli/managed-rg.js.map +1 -0
- package/dist/cli/server-search.d.ts +3 -0
- package/dist/cli/server-search.js +12 -0
- package/dist/cli/server-search.js.map +1 -0
- package/dist/cli/types.d.ts +87 -0
- package/dist/cli/types.js +10 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/version.d.ts +1 -0
- package/dist/cli/version.js +13 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/client/daemon-client.d.ts +31 -0
- package/dist/client/daemon-client.js +203 -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 +78 -0
- package/dist/daemon/backend.js +1118 -0
- package/dist/daemon/backend.js.map +1 -0
- package/dist/daemon/change-set.d.ts +30 -0
- package/dist/daemon/change-set.js +163 -0
- package/dist/daemon/change-set.js.map +1 -0
- package/dist/daemon/config.d.ts +27 -0
- package/dist/daemon/config.js +107 -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 +307 -0
- package/dist/daemon/http-server.js.map +1 -0
- package/dist/daemon/index-coordinator.d.ts +22 -0
- package/dist/daemon/index-coordinator.js +55 -0
- package/dist/daemon/index-coordinator.js.map +1 -0
- package/dist/daemon/job-scheduler.d.ts +85 -0
- package/dist/daemon/job-scheduler.js +492 -0
- package/dist/daemon/job-scheduler.js.map +1 -0
- package/dist/daemon/logger.d.ts +10 -0
- package/dist/daemon/logger.js +101 -0
- package/dist/daemon/logger.js.map +1 -0
- package/dist/daemon/model-pool.d.ts +48 -0
- package/dist/daemon/model-pool.js +190 -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 +197 -0
- package/dist/daemon/root-lease.js.map +1 -0
- package/dist/daemon/root-runtime.d.ts +80 -0
- package/dist/daemon/root-runtime.js +340 -0
- package/dist/daemon/root-runtime.js.map +1 -0
- package/dist/daemon/runtime-manager.d.ts +47 -0
- package/dist/daemon/runtime-manager.js +252 -0
- package/dist/daemon/runtime-manager.js.map +1 -0
- package/dist/daemon/runtime.d.ts +12 -0
- package/dist/daemon/runtime.js +105 -0
- package/dist/daemon/runtime.js.map +1 -0
- package/dist/daemon/server-controller.d.ts +38 -0
- package/dist/daemon/server-controller.js +327 -0
- package/dist/daemon/server-controller.js.map +1 -0
- package/dist/daemon/watch-manager.d.ts +62 -0
- package/dist/daemon/watch-manager.js +415 -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/code-formats.d.ts +3 -0
- package/dist/engine/code-formats.js +14 -0
- package/dist/engine/code-formats.js.map +1 -0
- package/dist/engine/config.d.ts +57 -0
- package/dist/engine/config.js +351 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/errors.d.ts +20 -0
- package/dist/engine/errors.js +51 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/extraction/code/adapter.d.ts +19 -0
- package/dist/engine/extraction/code/adapter.js +24 -0
- package/dist/engine/extraction/code/adapter.js.map +1 -0
- package/dist/engine/extraction/code/extractor.d.ts +13 -0
- package/dist/engine/extraction/code/extractor.js +696 -0
- package/dist/engine/extraction/code/extractor.js.map +1 -0
- package/dist/engine/extraction/code/families/c-family.d.ts +2 -0
- package/dist/engine/extraction/code/families/c-family.js +122 -0
- package/dist/engine/extraction/code/families/c-family.js.map +1 -0
- package/dist/engine/extraction/code/families/js-ts.d.ts +12 -0
- package/dist/engine/extraction/code/families/js-ts.js +118 -0
- package/dist/engine/extraction/code/families/js-ts.js.map +1 -0
- package/dist/engine/extraction/code/families/metadata.d.ts +8 -0
- package/dist/engine/extraction/code/families/metadata.js +86 -0
- package/dist/engine/extraction/code/families/metadata.js.map +1 -0
- package/dist/engine/extraction/code/families/name-field.d.ts +3 -0
- package/dist/engine/extraction/code/families/name-field.js +22 -0
- package/dist/engine/extraction/code/families/name-field.js.map +1 -0
- package/dist/engine/extraction/code/languages/c.d.ts +1 -0
- package/dist/engine/extraction/code/languages/c.js +12 -0
- package/dist/engine/extraction/code/languages/c.js.map +1 -0
- package/dist/engine/extraction/code/languages/cpp.d.ts +1 -0
- package/dist/engine/extraction/code/languages/cpp.js +18 -0
- package/dist/engine/extraction/code/languages/cpp.js.map +1 -0
- package/dist/engine/extraction/code/languages/go.d.ts +2 -0
- package/dist/engine/extraction/code/languages/go.js +70 -0
- package/dist/engine/extraction/code/languages/go.js.map +1 -0
- package/dist/engine/extraction/code/languages/java.d.ts +1 -0
- package/dist/engine/extraction/code/languages/java.js +17 -0
- package/dist/engine/extraction/code/languages/java.js.map +1 -0
- package/dist/engine/extraction/code/languages/javascript.d.ts +2 -0
- package/dist/engine/extraction/code/languages/javascript.js +23 -0
- package/dist/engine/extraction/code/languages/javascript.js.map +1 -0
- package/dist/engine/extraction/code/languages/python.d.ts +2 -0
- package/dist/engine/extraction/code/languages/python.js +52 -0
- package/dist/engine/extraction/code/languages/python.js.map +1 -0
- package/dist/engine/extraction/code/languages/rust.d.ts +2 -0
- package/dist/engine/extraction/code/languages/rust.js +25 -0
- package/dist/engine/extraction/code/languages/rust.js.map +1 -0
- package/dist/engine/extraction/code/languages/typescript.d.ts +2 -0
- package/dist/engine/extraction/code/languages/typescript.js +37 -0
- package/dist/engine/extraction/code/languages/typescript.js.map +1 -0
- package/dist/engine/extraction/code/tree-sitter/grammar.d.ts +4 -0
- package/dist/engine/extraction/code/tree-sitter/grammar.js +49 -0
- package/dist/engine/extraction/code/tree-sitter/grammar.js.map +1 -0
- package/dist/engine/extraction/code/tree-sitter/nodes.d.ts +3 -0
- package/dist/engine/extraction/code/tree-sitter/nodes.js +27 -0
- package/dist/engine/extraction/code/tree-sitter/nodes.js.map +1 -0
- package/dist/engine/extraction/code/tree-sitter/parser.d.ts +2 -0
- package/dist/engine/extraction/code/tree-sitter/parser.js +31 -0
- package/dist/engine/extraction/code/tree-sitter/parser.js.map +1 -0
- package/dist/engine/extraction/ids.d.ts +1 -0
- package/dist/engine/extraction/ids.js +5 -0
- package/dist/engine/extraction/ids.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 +4 -0
- package/dist/engine/extraction/index.js +3 -0
- package/dist/engine/extraction/index.js.map +1 -0
- package/dist/engine/extraction/markdown/extractor.d.ts +7 -0
- package/dist/engine/extraction/markdown/extractor.js +362 -0
- package/dist/engine/extraction/markdown/extractor.js.map +1 -0
- package/dist/engine/extraction/runtime.d.ts +9 -0
- package/dist/engine/extraction/runtime.js +37 -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/extraction/types.js +2 -0
- package/dist/engine/extraction/types.js.map +1 -0
- package/dist/engine/extraction/vector-content.d.ts +5 -0
- package/dist/engine/extraction/vector-content.js +83 -0
- package/dist/engine/extraction/vector-content.js.map +1 -0
- package/dist/engine/file-size-policy.d.ts +6 -0
- package/dist/engine/file-size-policy.js +20 -0
- package/dist/engine/file-size-policy.js.map +1 -0
- package/dist/engine/file-type.d.ts +15 -0
- package/dist/engine/file-type.js +152 -0
- 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 +13 -0
- package/dist/engine/manifest.js +124 -0
- package/dist/engine/manifest.js.map +1 -0
- package/dist/engine/models/artifact-cache-lock.d.ts +16 -0
- package/dist/engine/models/artifact-cache-lock.js +228 -0
- package/dist/engine/models/artifact-cache-lock.js.map +1 -0
- package/dist/engine/models/artifact-downloader.d.ts +77 -0
- package/dist/engine/models/artifact-downloader.js +766 -0
- package/dist/engine/models/artifact-downloader.js.map +1 -0
- package/dist/engine/models/backends/llama-cpp.d.ts +100 -0
- package/dist/engine/models/backends/llama-cpp.js +567 -0
- package/dist/engine/models/backends/llama-cpp.js.map +1 -0
- package/dist/engine/models/backends/model2vec-runtime.d.ts +63 -0
- package/dist/engine/models/backends/model2vec-runtime.js +112 -0
- package/dist/engine/models/backends/model2vec-runtime.js.map +1 -0
- package/dist/engine/models/backends/model2vec-tokenizer.d.ts +2 -0
- package/dist/engine/models/backends/model2vec-tokenizer.js +42 -0
- package/dist/engine/models/backends/model2vec-tokenizer.js.map +1 -0
- package/dist/engine/models/backends/model2vec-worker-pool.d.ts +25 -0
- package/dist/engine/models/backends/model2vec-worker-pool.js +264 -0
- package/dist/engine/models/backends/model2vec-worker-pool.js.map +1 -0
- package/dist/engine/models/backends/model2vec-worker.d.ts +1 -0
- package/dist/engine/models/backends/model2vec-worker.js +41 -0
- package/dist/engine/models/backends/model2vec-worker.js.map +1 -0
- package/dist/engine/models/backends/model2vec.d.ts +38 -0
- package/dist/engine/models/backends/model2vec.js +344 -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/backends/qwen.js +411 -0
- package/dist/engine/models/backends/qwen.js.map +1 -0
- package/dist/engine/models/backends/transformers-js.d.ts +90 -0
- package/dist/engine/models/backends/transformers-js.js +411 -0
- package/dist/engine/models/backends/transformers-js.js.map +1 -0
- package/dist/engine/models/catalog.d.ts +490 -0
- package/dist/engine/models/catalog.js +522 -0
- package/dist/engine/models/catalog.js.map +1 -0
- package/dist/engine/models/download-progress.d.ts +16 -0
- package/dist/engine/models/download-progress.js +47 -0
- package/dist/engine/models/download-progress.js.map +1 -0
- package/dist/engine/models/embeddings.d.ts +73 -0
- package/dist/engine/models/embeddings.js +125 -0
- package/dist/engine/models/embeddings.js.map +1 -0
- package/dist/engine/models/factory.d.ts +2 -0
- package/dist/engine/models/factory.js +51 -0
- package/dist/engine/models/factory.js.map +1 -0
- package/dist/engine/models/index.d.ts +5 -0
- package/dist/engine/models/index.js +6 -0
- package/dist/engine/models/index.js.map +1 -0
- package/dist/engine/models/local-embedding-parallelism.d.ts +15 -0
- package/dist/engine/models/local-embedding-parallelism.js +63 -0
- package/dist/engine/models/local-embedding-parallelism.js.map +1 -0
- package/dist/engine/models/local-embedding-queue.d.ts +12 -0
- package/dist/engine/models/local-embedding-queue.js +65 -0
- package/dist/engine/models/local-embedding-queue.js.map +1 -0
- package/dist/engine/models/ranking.d.ts +19 -0
- package/dist/engine/models/ranking.js +2 -0
- package/dist/engine/models/ranking.js.map +1 -0
- 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 +14 -0
- package/dist/engine/pipeline/indexing/index.js +1219 -0
- package/dist/engine/pipeline/indexing/index.js.map +1 -0
- package/dist/engine/pipeline/indexing/input-budget.d.ts +2 -0
- package/dist/engine/pipeline/indexing/input-budget.js +51 -0
- package/dist/engine/pipeline/indexing/input-budget.js.map +1 -0
- package/dist/engine/pipeline/indexing/root-paths.d.ts +7 -0
- package/dist/engine/pipeline/indexing/root-paths.js +148 -0
- package/dist/engine/pipeline/indexing/root-paths.js.map +1 -0
- package/dist/engine/pipeline/indexing/scanner/index.d.ts +14 -0
- package/dist/engine/pipeline/indexing/scanner/index.js +776 -0
- package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -0
- package/dist/engine/pipeline/search/index.d.ts +12 -0
- package/dist/engine/pipeline/search/index.js +811 -0
- package/dist/engine/pipeline/search/index.js.map +1 -0
- package/dist/engine/service/index.d.ts +3 -0
- package/dist/engine/service/index.js +2 -0
- package/dist/engine/service/index.js.map +1 -0
- package/dist/engine/service/lexical.d.ts +28 -0
- package/dist/engine/service/lexical.js +446 -0
- package/dist/engine/service/lexical.js.map +1 -0
- package/dist/engine/service/root.d.ts +15 -0
- package/dist/engine/service/root.js +57 -0
- package/dist/engine/service/root.js.map +1 -0
- package/dist/engine/service/structure-enrichment.d.ts +8 -0
- package/dist/engine/service/structure-enrichment.js +178 -0
- package/dist/engine/service/structure-enrichment.js.map +1 -0
- package/dist/engine/service/types.d.ts +212 -0
- package/dist/engine/service/types.js +2 -0
- package/dist/engine/service/types.js.map +1 -0
- package/dist/engine/service/workspace-index.d.ts +26 -0
- package/dist/engine/service/workspace-index.js +157 -0
- package/dist/engine/service/workspace-index.js.map +1 -0
- package/dist/engine/service/zvec-grep.d.ts +15 -0
- package/dist/engine/service/zvec-grep.js +1520 -0
- package/dist/engine/service/zvec-grep.js.map +1 -0
- package/dist/engine/storage/index.d.ts +53 -0
- package/dist/engine/storage/index.js +3 -0
- package/dist/engine/storage/index.js.map +1 -0
- package/dist/engine/storage/layout.d.ts +10 -0
- package/dist/engine/storage/layout.js +29 -0
- package/dist/engine/storage/layout.js.map +1 -0
- package/dist/engine/storage/zvec.d.ts +4 -0
- package/dist/engine/storage/zvec.js +976 -0
- package/dist/engine/storage/zvec.js.map +1 -0
- package/dist/engine/types.d.ts +303 -0
- package/dist/engine/types.js +14 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/utils/atomic-file.d.ts +3 -0
- package/dist/engine/utils/atomic-file.js +39 -0
- package/dist/engine/utils/atomic-file.js.map +1 -0
- 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.d.ts +10 -0
- package/dist/engine/utils/file-selection.js +157 -0
- package/dist/engine/utils/file-selection.js.map +1 -0
- package/dist/engine/utils/glob.d.ts +9 -0
- package/dist/engine/utils/glob.js +208 -0
- package/dist/engine/utils/glob.js.map +1 -0
- package/dist/engine/utils/hash.d.ts +2 -0
- package/dist/engine/utils/hash.js +8 -0
- package/dist/engine/utils/hash.js.map +1 -0
- package/dist/engine/utils/json.d.ts +8 -0
- package/dist/engine/utils/json.js +83 -0
- package/dist/engine/utils/json.js.map +1 -0
- package/dist/engine/utils/lock.d.ts +19 -0
- package/dist/engine/utils/lock.js +254 -0
- package/dist/engine/utils/lock.js.map +1 -0
- package/dist/engine/utils/path.d.ts +4 -0
- package/dist/engine/utils/path.js +18 -0
- package/dist/engine/utils/path.js.map +1 -0
- package/dist/engine/utils/timing.d.ts +19 -0
- package/dist/engine/utils/timing.js +87 -0
- package/dist/engine/utils/timing.js.map +1 -0
- 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 +6 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- 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 +104 -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 +668 -0
- package/dist/mcp/schemas.js +512 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/stdio-bridge.d.ts +15 -0
- package/dist/mcp/stdio-bridge.js +190 -0
- package/dist/mcp/stdio-bridge.js.map +1 -0
- package/dist/mcp/tools.d.ts +153 -0
- package/dist/mcp/tools.js +488 -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/dist/prompts/zvec-grep-guidance.d.ts +2 -0
- package/dist/prompts/zvec-grep-guidance.js +9 -0
- package/dist/prompts/zvec-grep-guidance.js.map +1 -0
- package/docs/01-agents.md +217 -0
- package/docs/02-cli.md +259 -0
- package/docs/03-mcp.md +185 -0
- package/docs/04-pipeline.md +234 -0
- package/docs/05-architecture.md +86 -0
- package/docs/06-server.md +279 -0
- package/docs/07-embedding.md +227 -0
- package/docs/08-roadmap.md +85 -0
- package/docs/README.md +53 -0
- package/package.json +87 -0
|
@@ -0,0 +1,801 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { createZvecGrep, } from "../index.js";
|
|
4
|
+
import { globalConfigPath, updateGlobalConfig } from "../engine/config.js";
|
|
5
|
+
import { ENGINE_ERROR_CODE_PREFIX, EngineError, } from "../engine/errors.js";
|
|
6
|
+
import { listEmbeddingModels } from "../engine/models/index.js";
|
|
7
|
+
import { DaemonClient } from "../client/daemon-client.js";
|
|
8
|
+
import { resolveDirectSearchPolicy, resolveServerSearchPolicy, } from "../client/search-policy.js";
|
|
9
|
+
import { resolveClientMode, resolveServerUrl, routeByMode, } from "../client/mode-router.js";
|
|
10
|
+
import { serverStatus } from "../daemon/server-controller.js";
|
|
11
|
+
import { findNearestWorkspace } from "../engine/service/root.js";
|
|
12
|
+
import { contextWarningLines, printCliContextResult, } from "./format/context.js";
|
|
13
|
+
import { printDebug } from "./format/debug.js";
|
|
14
|
+
import { createIndexProgressReporter } from "./format/progress.js";
|
|
15
|
+
import { formatContextLines } from "./errors.js";
|
|
16
|
+
import { printWorkspaceInfo, printIndexPathFilterTip, printIndexResult, printIndexScanDiagnostics, printNoIndexableFilesTip, printServerIndexInfo, } from "./format/status.js";
|
|
17
|
+
import { planRemoteIndexAuthorization, planRemoteSearchAuthorization, } from "../authorization/index.js";
|
|
18
|
+
import { indexCompletionFromStatus, indexStatusNeedsRefresh, } from "../engine/index-status.js";
|
|
19
|
+
import { indexProgressFromMessage } from "../index-progress.js";
|
|
20
|
+
import { normalizeManagedRgInput } from "./managed-rg.js";
|
|
21
|
+
import { INCOMPATIBLE_SERVER_SEARCH_MESSAGE, parseServerSearchResponse, } from "./server-search.js";
|
|
22
|
+
import { runInstall, runUninstall } from "./install.js";
|
|
23
|
+
import { runAuth, authorizationStore, authorizeCliPlan, resolveAuthorizationSchema, embeddingModelInfo, configuredEmbeddingReference, workspaceRuntimeFromInfo, assertEmbeddingModelCompatible, assertRequestedEndpointCompatible, requireEmbeddingModelCatalogEntry, unsupportedRemoteEmbeddingProvider, withRemoteEmbeddingOperationPermit, } from "./auth.js";
|
|
24
|
+
const DEFAULT_IMPLICIT_EMBEDDING = "local/potion-code-16m-v2";
|
|
25
|
+
export async function runParsedCommand(parsed) {
|
|
26
|
+
switch (parsed.command) {
|
|
27
|
+
case "query":
|
|
28
|
+
await runQuery(parsed);
|
|
29
|
+
return;
|
|
30
|
+
case "index":
|
|
31
|
+
await runIndex(parsed);
|
|
32
|
+
return;
|
|
33
|
+
case "status":
|
|
34
|
+
await runStatus(parsed);
|
|
35
|
+
return;
|
|
36
|
+
case "install":
|
|
37
|
+
await runInstall(parsed);
|
|
38
|
+
return;
|
|
39
|
+
case "uninstall":
|
|
40
|
+
await runUninstall(parsed);
|
|
41
|
+
return;
|
|
42
|
+
case "config":
|
|
43
|
+
await runConfig(parsed);
|
|
44
|
+
return;
|
|
45
|
+
case "auth":
|
|
46
|
+
await runAuth(parsed);
|
|
47
|
+
return;
|
|
48
|
+
case "server":
|
|
49
|
+
await runServer(parsed);
|
|
50
|
+
return;
|
|
51
|
+
case "help":
|
|
52
|
+
case "version":
|
|
53
|
+
throw new Error(`${parsed.command} must be handled before dispatch`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function runConfig(parsed) {
|
|
57
|
+
if (parsed.positionals.length !== 1) {
|
|
58
|
+
throw new Error(`zg --config ${parsed.options.configAction === "provider-set" ? "provider" : "model"} set requires exactly one reference`);
|
|
59
|
+
}
|
|
60
|
+
const reference = parsed.positionals[0];
|
|
61
|
+
if (parsed.options.configAction === "provider-set") {
|
|
62
|
+
if (!/^[a-z][a-z0-9_-]*$/.test(reference)) {
|
|
63
|
+
throw unsupportedRemoteEmbeddingProvider(reference, "Invalid embedding provider");
|
|
64
|
+
}
|
|
65
|
+
if (reference === "local" ||
|
|
66
|
+
!listEmbeddingModels().some((entry) => entry.provider === reference)) {
|
|
67
|
+
throw unsupportedRemoteEmbeddingProvider(reference);
|
|
68
|
+
}
|
|
69
|
+
if (parsed.options.apiKey === undefined) {
|
|
70
|
+
throw new Error("zg --config provider set requires --api-key");
|
|
71
|
+
}
|
|
72
|
+
updateGlobalConfig({
|
|
73
|
+
providers: {
|
|
74
|
+
[reference]: {
|
|
75
|
+
apiKey: parsed.options.apiKey,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
console.log(`Provider config: ${reference}`);
|
|
80
|
+
console.log(`Global config: ${globalConfigPath()}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (parsed.options.configAction !== "model-set") {
|
|
84
|
+
throw new Error("zg --config requires provider set or model set");
|
|
85
|
+
}
|
|
86
|
+
const catalogEntry = requireEmbeddingModelCatalogEntry(reference);
|
|
87
|
+
if (parsed.options.endpoint === undefined &&
|
|
88
|
+
parsed.options.device === undefined &&
|
|
89
|
+
!parsed.options.defaultModel) {
|
|
90
|
+
throw new Error("zg --config model set requires --endpoint, --device, or --default");
|
|
91
|
+
}
|
|
92
|
+
if (catalogEntry.provider === "local" &&
|
|
93
|
+
parsed.options.endpoint !== undefined) {
|
|
94
|
+
throw new Error("--endpoint is only supported for remote embedding models");
|
|
95
|
+
}
|
|
96
|
+
if (catalogEntry.provider !== "local" &&
|
|
97
|
+
parsed.options.device !== undefined) {
|
|
98
|
+
throw new Error("--device is only supported for local embedding models");
|
|
99
|
+
}
|
|
100
|
+
if (parsed.options.endpoint !== undefined) {
|
|
101
|
+
assertHttpEndpoint(parsed.options.endpoint);
|
|
102
|
+
}
|
|
103
|
+
updateGlobalConfig({
|
|
104
|
+
...(parsed.options.endpoint !== undefined ||
|
|
105
|
+
parsed.options.device !== undefined
|
|
106
|
+
? {
|
|
107
|
+
models: {
|
|
108
|
+
[reference]: {
|
|
109
|
+
...(parsed.options.endpoint !== undefined
|
|
110
|
+
? { endpoint: parsed.options.endpoint }
|
|
111
|
+
: {}),
|
|
112
|
+
...(parsed.options.device !== undefined
|
|
113
|
+
? { device: parsed.options.device }
|
|
114
|
+
: {}),
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
}
|
|
118
|
+
: {}),
|
|
119
|
+
...(parsed.options.defaultModel
|
|
120
|
+
? { defaults: { embedding: reference } }
|
|
121
|
+
: {}),
|
|
122
|
+
});
|
|
123
|
+
console.log(`Model config: ${reference}`);
|
|
124
|
+
console.log(`Global config: ${globalConfigPath()}`);
|
|
125
|
+
}
|
|
126
|
+
function assertHttpEndpoint(endpoint) {
|
|
127
|
+
let parsed;
|
|
128
|
+
try {
|
|
129
|
+
parsed = new URL(endpoint);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
throw new Error("--endpoint must be a valid HTTP(S) URL");
|
|
133
|
+
}
|
|
134
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
135
|
+
throw new Error("--endpoint must be a valid HTTP(S) URL");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function runIndex(parsed) {
|
|
139
|
+
const explicitRoot = parsed.positionals.length > 0;
|
|
140
|
+
const root = resolveIndexRoot(parsed.positionals[0]);
|
|
141
|
+
const rootPath = indexRootPath(root, parsed.options);
|
|
142
|
+
if (parsed.positionals.length > 1) {
|
|
143
|
+
throw new Error("zg --index accepts at most one root path");
|
|
144
|
+
}
|
|
145
|
+
if (parsed.options.drop) {
|
|
146
|
+
await runDropIndex(parsed, rootPath.absolutePath);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (parsed.options.embedding) {
|
|
150
|
+
requireEmbeddingModelCatalogEntry(parsed.options.embedding);
|
|
151
|
+
}
|
|
152
|
+
const mode = resolveClientMode(parsed.options.mode);
|
|
153
|
+
await routeByMode({
|
|
154
|
+
mode,
|
|
155
|
+
serverAvailable: () => daemonIsReady(parsed.options.home),
|
|
156
|
+
server: async () => {
|
|
157
|
+
const client = daemonClient(parsed.options);
|
|
158
|
+
const progress = createIndexProgressReporter({
|
|
159
|
+
color: parsed.options.color,
|
|
160
|
+
});
|
|
161
|
+
let result;
|
|
162
|
+
try {
|
|
163
|
+
result = await client.callTool("zvec_grep_index", {
|
|
164
|
+
root: rootPath.absolutePath,
|
|
165
|
+
embedding: parsed.options.embedding,
|
|
166
|
+
apiKey: parsed.options.apiKey,
|
|
167
|
+
endpoint: parsed.options.endpoint,
|
|
168
|
+
device: parsed.options.device,
|
|
169
|
+
rebuild: parsed.options.rebuild,
|
|
170
|
+
resetPaths: parsed.options.resetPaths,
|
|
171
|
+
globs: parsed.options.globs,
|
|
172
|
+
insensitiveGlobs: parsed.options.insensitiveGlobs,
|
|
173
|
+
fileTypes: parsed.options.fileTypes,
|
|
174
|
+
excludedFileTypes: parsed.options.excludedFileTypes,
|
|
175
|
+
hidden: parsed.options.hidden,
|
|
176
|
+
noIgnore: parsed.options.noIgnore,
|
|
177
|
+
ignoreFiles: parsed.options.ignoreFiles,
|
|
178
|
+
maxDepth: parsed.options.maxDepth,
|
|
179
|
+
maxFileSizeBytes: parsed.options.maxFileSizeBytes,
|
|
180
|
+
follow: parsed.options.follow,
|
|
181
|
+
embeddingConcurrency: parsed.options.embeddingConcurrency,
|
|
182
|
+
debug: parsed.options.debug,
|
|
183
|
+
wait: true,
|
|
184
|
+
}, {
|
|
185
|
+
onProgress: (event) => {
|
|
186
|
+
const update = indexProgressFromMessage(event.message);
|
|
187
|
+
if (update) {
|
|
188
|
+
progress.report(update.progress);
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
embeddingEnvironment: process.env.ZVEC_GREP_EMBEDDING?.trim(),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
progress.finish();
|
|
196
|
+
}
|
|
197
|
+
console.log(`Workspace index: ${String(result.state ?? "submitted")}`);
|
|
198
|
+
console.log(`Root: ${String(result.root ?? rootPath.absolutePath)}`);
|
|
199
|
+
console.log(`Job: ${String(result.job_id ?? "unknown")}`);
|
|
200
|
+
if (parsed.options.debug) {
|
|
201
|
+
printIndexScanDiagnostics(result.scan_diagnostics);
|
|
202
|
+
}
|
|
203
|
+
if (result.state === "failed") {
|
|
204
|
+
throw serverIndexFailure(result);
|
|
205
|
+
}
|
|
206
|
+
if (result.state === "succeeded") {
|
|
207
|
+
const status = (await client
|
|
208
|
+
.callTool("zvec_grep_index_status", {
|
|
209
|
+
root: rootPath.absolutePath,
|
|
210
|
+
})
|
|
211
|
+
.catch(() => undefined));
|
|
212
|
+
if (status?.persistent.files?.scanned === 0) {
|
|
213
|
+
printNoIndexableFilesTip(parsed.options);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
direct: () => runDirectIndex(parsed, rootPath, explicitRoot),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
function serverIndexFailure(result) {
|
|
221
|
+
const error = result.error;
|
|
222
|
+
if (error && typeof error === "object") {
|
|
223
|
+
const fields = error;
|
|
224
|
+
const code = nonEmptyString(fields.code);
|
|
225
|
+
if (code?.startsWith(`${ENGINE_ERROR_CODE_PREFIX}.`)) {
|
|
226
|
+
const message = nonEmptyString(fields.message) ?? "Index job failed unexpectedly.";
|
|
227
|
+
return new EngineError(stripErrorCode(message, code), {
|
|
228
|
+
code: code,
|
|
229
|
+
context: nonEmptyString(fields.context),
|
|
230
|
+
cause: nonEmptyString(fields.cause),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const cause = error && typeof error === "object" && "cause" in error
|
|
235
|
+
? nonEmptyString(error.cause)
|
|
236
|
+
: undefined;
|
|
237
|
+
return new Error(serverIndexFailureMessage(result), { cause });
|
|
238
|
+
}
|
|
239
|
+
function serverIndexFailureMessage(result) {
|
|
240
|
+
const error = result.error;
|
|
241
|
+
const context = error && typeof error === "object" && "context" in error
|
|
242
|
+
? error.context
|
|
243
|
+
: undefined;
|
|
244
|
+
const details = typeof context === "string" ? formatContextLines(context) : [];
|
|
245
|
+
return [
|
|
246
|
+
serverIndexFailureSummary(result),
|
|
247
|
+
...(details.length > 0
|
|
248
|
+
? ["Details:", ...details.map((line) => ` ${line}`)]
|
|
249
|
+
: []),
|
|
250
|
+
].join("\n");
|
|
251
|
+
}
|
|
252
|
+
function serverIndexFailureSummary(result) {
|
|
253
|
+
const error = result.error;
|
|
254
|
+
if (error && typeof error === "object") {
|
|
255
|
+
const code = error.code;
|
|
256
|
+
const message = error.message;
|
|
257
|
+
if (typeof message === "string" && message.length > 0) {
|
|
258
|
+
if (typeof code !== "string" ||
|
|
259
|
+
code.length === 0 ||
|
|
260
|
+
message.includes(`[${code}]`)) {
|
|
261
|
+
return message;
|
|
262
|
+
}
|
|
263
|
+
return `[${code}] ${message}`;
|
|
264
|
+
}
|
|
265
|
+
if (typeof code === "string" && code.length > 0) {
|
|
266
|
+
return `[${code}] Index job failed.`;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return `Index job ${String(result.job_id ?? "unknown")} failed. Run zg --status --mode server for details.`;
|
|
270
|
+
}
|
|
271
|
+
function nonEmptyString(value) {
|
|
272
|
+
return typeof value === "string" && value.trim().length > 0
|
|
273
|
+
? value
|
|
274
|
+
: undefined;
|
|
275
|
+
}
|
|
276
|
+
function stripErrorCode(message, code) {
|
|
277
|
+
const prefix = `[${code}]`;
|
|
278
|
+
return message.startsWith(prefix)
|
|
279
|
+
? message.slice(prefix.length).trimStart()
|
|
280
|
+
: message;
|
|
281
|
+
}
|
|
282
|
+
async function runDirectIndex(parsed, rootPath, explicitRoot) {
|
|
283
|
+
const serviceOptions = createServiceOptions(parsed.options, rootPath.absolutePath);
|
|
284
|
+
const zvecGrep = await createZvecGrep(serviceOptions);
|
|
285
|
+
const progress = createIndexProgressReporter({ color: parsed.options.color });
|
|
286
|
+
try {
|
|
287
|
+
const infoBefore = await zvecGrep.info({
|
|
288
|
+
root: rootPath.absolutePath,
|
|
289
|
+
includeStatus: parsed.options.rebuild !== true,
|
|
290
|
+
});
|
|
291
|
+
const schema = resolveAuthorizationSchema(configuredEmbeddingReference(parsed.options, infoBefore.workspaceIndex?.embedding), infoBefore.workspaceIndex?.embedding);
|
|
292
|
+
assertEmbeddingModelCompatible(infoBefore.workspaceIndex?.embedding, schema, parsed.options.rebuild === true);
|
|
293
|
+
const workspaceRuntime = workspaceRuntimeFromInfo(infoBefore);
|
|
294
|
+
assertRequestedEndpointCompatible(infoBefore, workspaceRuntime, parsed.options.endpoint, parsed.options.rebuild === true);
|
|
295
|
+
const modelInfo = schema?.provider === "qwen"
|
|
296
|
+
? await embeddingModelInfo(schema, serviceOptions, workspaceRuntime)
|
|
297
|
+
: undefined;
|
|
298
|
+
const plan = modelInfo
|
|
299
|
+
? await planRemoteIndexAuthorization({
|
|
300
|
+
info: infoBefore,
|
|
301
|
+
model: modelInfo,
|
|
302
|
+
rebuild: parsed.options.rebuild,
|
|
303
|
+
store: authorizationStore(parsed.options),
|
|
304
|
+
})
|
|
305
|
+
: undefined;
|
|
306
|
+
const authorizationResolution = plan
|
|
307
|
+
? await authorizeCliPlan(plan, parsed.options)
|
|
308
|
+
: {};
|
|
309
|
+
printIndexPathFilterTip(parsed.options);
|
|
310
|
+
const result = await withRemoteEmbeddingOperationPermit(authorizationResolution.authorization, () => zvecGrep.index({
|
|
311
|
+
root: rootPath.absolutePath,
|
|
312
|
+
rootPaths: explicitRoot ? [rootPath] : undefined,
|
|
313
|
+
rebuild: parsed.options.rebuild,
|
|
314
|
+
resetPaths: parsed.options.resetPaths,
|
|
315
|
+
globs: parsed.options.globs,
|
|
316
|
+
insensitiveGlobs: parsed.options.insensitiveGlobs,
|
|
317
|
+
fileTypes: parsed.options.fileTypes,
|
|
318
|
+
excludedFileTypes: parsed.options.excludedFileTypes,
|
|
319
|
+
hidden: parsed.options.hidden,
|
|
320
|
+
noIgnore: parsed.options.noIgnore,
|
|
321
|
+
ignoreFiles: parsed.options.ignoreFiles,
|
|
322
|
+
maxDepth: parsed.options.maxDepth,
|
|
323
|
+
maxFileSizeBytes: parsed.options.maxFileSizeBytes,
|
|
324
|
+
follow: parsed.options.follow,
|
|
325
|
+
embeddingConcurrency: parsed.options.embeddingConcurrency,
|
|
326
|
+
onProgress: progress.report,
|
|
327
|
+
}));
|
|
328
|
+
progress.finish();
|
|
329
|
+
const info = await zvecGrep.info({ root: rootPath.absolutePath });
|
|
330
|
+
printIndexResult("Workspace index", result, parsed.options, info.workspaceIndex?.rootPaths);
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
progress.finish();
|
|
334
|
+
throw error;
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
await zvecGrep.close();
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
async function runDropIndex(parsed, root) {
|
|
341
|
+
if (!(await confirmIndexDrop(root, parsed.options.yes === true))) {
|
|
342
|
+
console.log("Index drop cancelled.");
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const printResult = (removed) => {
|
|
346
|
+
console.log(removed ? `Dropped index for ${root}` : `No index found for ${root}`);
|
|
347
|
+
};
|
|
348
|
+
await routeByMode({
|
|
349
|
+
mode: resolveClientMode(parsed.options.mode),
|
|
350
|
+
serverAvailable: () => daemonIsReady(parsed.options.home),
|
|
351
|
+
server: async () => {
|
|
352
|
+
const result = await daemonClient(parsed.options).callTool("zvec_grep_index_drop", { root });
|
|
353
|
+
printResult(result.removed === true);
|
|
354
|
+
},
|
|
355
|
+
direct: async () => {
|
|
356
|
+
const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, root));
|
|
357
|
+
try {
|
|
358
|
+
printResult(await zvecGrep.dropIndex({ root }));
|
|
359
|
+
}
|
|
360
|
+
finally {
|
|
361
|
+
await zvecGrep.close();
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
async function confirmIndexDrop(root, accepted) {
|
|
367
|
+
if (accepted) {
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
371
|
+
throw new Error("zg --index --drop requires --yes in a non-interactive shell");
|
|
372
|
+
}
|
|
373
|
+
const readline = createInterface({
|
|
374
|
+
input: process.stdin,
|
|
375
|
+
output: process.stdout,
|
|
376
|
+
});
|
|
377
|
+
try {
|
|
378
|
+
const answer = await readline.question(`Drop the index for ${root}? [y/N] `);
|
|
379
|
+
return ["y", "yes"].includes(answer.trim().toLowerCase());
|
|
380
|
+
}
|
|
381
|
+
finally {
|
|
382
|
+
readline.close();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
async function runServer(parsed) {
|
|
386
|
+
if (parsed.positionals.length > 0) {
|
|
387
|
+
throw new Error(`zg --server ${parsed.options.serverStdio ? "--stdio" : parsed.options.serverAction} does not accept positional arguments`);
|
|
388
|
+
}
|
|
389
|
+
const { readPackageVersion } = await import("./version.js");
|
|
390
|
+
if (parsed.options.serverStdio) {
|
|
391
|
+
const { runStdioBootstrapBridge } = await import("../mcp/stdio-bridge.js");
|
|
392
|
+
await runStdioBootstrapBridge({
|
|
393
|
+
cliPath: process.argv[1],
|
|
394
|
+
version: readPackageVersion(),
|
|
395
|
+
home: parsed.options.home,
|
|
396
|
+
tokenFile: parsed.options.serverTokenFile,
|
|
397
|
+
listen: parsed.options.listen,
|
|
398
|
+
mcpToolset: parsed.options.mcpToolset,
|
|
399
|
+
});
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (parsed.options.serverAction === "on") {
|
|
403
|
+
const { startServer } = await import("../daemon/server-controller.js");
|
|
404
|
+
const status = await startServer({
|
|
405
|
+
cliPath: process.argv[1],
|
|
406
|
+
listen: parsed.options.listen,
|
|
407
|
+
tokenFile: parsed.options.serverTokenFile,
|
|
408
|
+
home: parsed.options.home,
|
|
409
|
+
mcpToolset: parsed.options.mcpToolset,
|
|
410
|
+
});
|
|
411
|
+
printServerControlStatus(status);
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
if (parsed.options.serverAction === "off") {
|
|
415
|
+
const { stopServer } = await import("../daemon/server-controller.js");
|
|
416
|
+
printServerControlStatus(await stopServer(parsed.options.home, 30_000, parsed.options.serverTokenFile));
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
if (parsed.options.serverAction === "status") {
|
|
420
|
+
const status = await serverStatus(parsed.options.home);
|
|
421
|
+
printServerControlStatus(status);
|
|
422
|
+
if (parsed.options.checkReady && !status.ready) {
|
|
423
|
+
throw new Error("zvec-grep server is not ready");
|
|
424
|
+
}
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
const { runDaemonForeground } = await import("../daemon/runtime.js");
|
|
428
|
+
await runDaemonForeground({
|
|
429
|
+
version: readPackageVersion(),
|
|
430
|
+
listen: parsed.options.listen,
|
|
431
|
+
tokenFile: parsed.options.serverTokenFile,
|
|
432
|
+
home: parsed.options.home,
|
|
433
|
+
mcpToolset: parsed.options.mcpToolset,
|
|
434
|
+
serviceOptions: createServiceOptions(parsed.options, process.cwd()),
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
async function runStatus(parsed) {
|
|
438
|
+
const root = parsed.positionals[0] ?? process.cwd();
|
|
439
|
+
if (parsed.positionals.length > 1) {
|
|
440
|
+
throw new Error("zg --status accepts at most one root path");
|
|
441
|
+
}
|
|
442
|
+
const mode = resolveClientMode(parsed.options.mode);
|
|
443
|
+
const state = await routeByMode({
|
|
444
|
+
mode,
|
|
445
|
+
serverAvailable: () => daemonIsReady(parsed.options.home),
|
|
446
|
+
server: async () => {
|
|
447
|
+
const result = await daemonClient(parsed.options).callTool("zvec_grep_index_status", { root: resolve(root) });
|
|
448
|
+
return printServerIndexInfo(result, parsed.options);
|
|
449
|
+
},
|
|
450
|
+
direct: async () => {
|
|
451
|
+
const zvecGrep = await createZvecGrep(createServiceOptions(parsed.options, root));
|
|
452
|
+
try {
|
|
453
|
+
return printWorkspaceInfo(await zvecGrep.info({ root }), parsed.options);
|
|
454
|
+
}
|
|
455
|
+
finally {
|
|
456
|
+
await zvecGrep.close();
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
if (parsed.options.checkReady && state !== "ready") {
|
|
461
|
+
throw new Error(`Workspace index is not ready (state: ${state})`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
async function runQuery(parsed) {
|
|
465
|
+
const rgInput = parsed.options.rg
|
|
466
|
+
? normalizeManagedRgInput(parsed)
|
|
467
|
+
: undefined;
|
|
468
|
+
const commandOptions = rgInput?.options ?? parsed.options;
|
|
469
|
+
const queries = (rgInput?.queries ?? [
|
|
470
|
+
...parsed.positionals,
|
|
471
|
+
...(parsed.options.hybridQueries ?? []),
|
|
472
|
+
])
|
|
473
|
+
.map((query) => query.trim())
|
|
474
|
+
.filter((query) => query.length > 0);
|
|
475
|
+
const routes = parsed.options.routes ?? [];
|
|
476
|
+
if (queries.length === 0 &&
|
|
477
|
+
routes.length === 0 &&
|
|
478
|
+
(parsed.options.rgOptions?.patternFiles?.length ?? 0) === 0) {
|
|
479
|
+
throw new Error(parsed.options.rg
|
|
480
|
+
? "zg --rg requires a pattern. Use zg --help search for examples."
|
|
481
|
+
: "zg requires text or --hybrid/--fts/--vector routes. Use zg --help search for examples.");
|
|
482
|
+
}
|
|
483
|
+
if (commandOptions.rg) {
|
|
484
|
+
await runDirectRgQuery(commandOptions, queries);
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
const mode = resolveClientMode(commandOptions.mode);
|
|
488
|
+
if (mode !== "direct") {
|
|
489
|
+
await routeByMode({
|
|
490
|
+
mode,
|
|
491
|
+
serverAvailable: () => daemonIsReady(commandOptions.home),
|
|
492
|
+
server: async () => {
|
|
493
|
+
await ensureServerIndex(commandOptions);
|
|
494
|
+
await runServerQuery(commandOptions, queries, routes);
|
|
495
|
+
},
|
|
496
|
+
direct: () => runDirectQuery(commandOptions, queries),
|
|
497
|
+
});
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
await runDirectQuery(commandOptions, queries);
|
|
501
|
+
}
|
|
502
|
+
async function runDirectRgQuery(commandOptions, queries) {
|
|
503
|
+
const zvecGrep = await createZvecGrep(createServiceOptions(commandOptions, undefined));
|
|
504
|
+
try {
|
|
505
|
+
const result = await zvecGrep.context(contextOptions(commandOptions, queries));
|
|
506
|
+
printCliContextResult(result, commandOptions);
|
|
507
|
+
for (const line of contextWarningLines(result)) {
|
|
508
|
+
console.error(line);
|
|
509
|
+
}
|
|
510
|
+
if (commandOptions.debug) {
|
|
511
|
+
printDebug(result, { trace: false });
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
await zvecGrep.close();
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
async function runDirectQuery(commandOptions, queries) {
|
|
519
|
+
if (commandOptions.refresh === "background") {
|
|
520
|
+
console.error("warning: --refresh background requires Server mode; Direct mode uses --refresh off");
|
|
521
|
+
}
|
|
522
|
+
const serviceOptions = createServiceOptions(commandOptions, undefined);
|
|
523
|
+
const zvecGrep = await createZvecGrep(serviceOptions);
|
|
524
|
+
const progress = createIndexProgressReporter({
|
|
525
|
+
color: commandOptions.color,
|
|
526
|
+
});
|
|
527
|
+
try {
|
|
528
|
+
const contextRequest = contextOptions(commandOptions, queries, (progressEvent) => {
|
|
529
|
+
if (progressEvent.phase !== "done")
|
|
530
|
+
progress.report(progressEvent);
|
|
531
|
+
});
|
|
532
|
+
let info = await directQueryInfo(zvecGrep);
|
|
533
|
+
if (!info.indexed && info.indexPolicy !== "disabled") {
|
|
534
|
+
await buildImplicitDirectIndex(commandOptions, info.root, progress.report);
|
|
535
|
+
info = await directQueryInfo(zvecGrep);
|
|
536
|
+
}
|
|
537
|
+
const schema = info.workspaceIndex?.embedding;
|
|
538
|
+
const workspaceRuntime = workspaceRuntimeFromInfo(info);
|
|
539
|
+
const modelInfo = !commandOptions.rg && schema?.provider === "qwen"
|
|
540
|
+
? await embeddingModelInfo(schema, createServiceOptions(commandOptions, info.root), workspaceRuntime)
|
|
541
|
+
: undefined;
|
|
542
|
+
const plan = modelInfo
|
|
543
|
+
? await planRemoteSearchAuthorization({
|
|
544
|
+
info,
|
|
545
|
+
model: modelInfo,
|
|
546
|
+
search: normalizedDirectSearchInput(commandOptions, queries, info.root),
|
|
547
|
+
store: authorizationStore(commandOptions),
|
|
548
|
+
})
|
|
549
|
+
: undefined;
|
|
550
|
+
const authorizationResolution = plan
|
|
551
|
+
? await authorizeCliPlan(plan, commandOptions, "local_search")
|
|
552
|
+
: {};
|
|
553
|
+
const effectiveContextRequest = authorizationResolution.alternative === "local_search"
|
|
554
|
+
? ftsFallbackContextRequest(contextRequest)
|
|
555
|
+
: contextRequest;
|
|
556
|
+
const result = await withRemoteEmbeddingOperationPermit(authorizationResolution.authorization, () => zvecGrep.context(effectiveContextRequest));
|
|
557
|
+
progress.finish();
|
|
558
|
+
printCliContextResult(result, commandOptions);
|
|
559
|
+
for (const line of contextWarningLines(result)) {
|
|
560
|
+
console.error(line);
|
|
561
|
+
}
|
|
562
|
+
if (result.source === "index" &&
|
|
563
|
+
effectiveContextRequest.autoUpdate !== true &&
|
|
564
|
+
indexStatusNeedsRefresh(info.status)) {
|
|
565
|
+
printStaleIndexStatus("idle", indexCompletionFromStatus(info.status));
|
|
566
|
+
}
|
|
567
|
+
if (commandOptions.debug) {
|
|
568
|
+
printDebug(result, {
|
|
569
|
+
trace: commandOptions.trace === true,
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
progress.finish();
|
|
575
|
+
throw error;
|
|
576
|
+
}
|
|
577
|
+
finally {
|
|
578
|
+
await zvecGrep.close();
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
async function buildImplicitDirectIndex(options, root, onProgress) {
|
|
582
|
+
const embedding = implicitEmbeddingReference(options);
|
|
583
|
+
console.error(`No index found; creating one with ${embedding}.`);
|
|
584
|
+
const service = await createZvecGrep(createServiceOptions({ ...options, embedding }, root));
|
|
585
|
+
try {
|
|
586
|
+
await service.index({
|
|
587
|
+
root,
|
|
588
|
+
onProgress,
|
|
589
|
+
embeddingConcurrency: options.embeddingConcurrency,
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
finally {
|
|
593
|
+
await service.close();
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
async function ensureServerIndex(options) {
|
|
597
|
+
const root = resolve(process.cwd());
|
|
598
|
+
const client = daemonClient(options);
|
|
599
|
+
const status = await client.callTool("zvec_grep_index_status", { root });
|
|
600
|
+
if (status.indexed === true || status.index_policy === "disabled")
|
|
601
|
+
return;
|
|
602
|
+
const embedding = implicitEmbeddingReference(options);
|
|
603
|
+
console.error(`No index found; creating one with ${embedding}.`);
|
|
604
|
+
const progress = createIndexProgressReporter({ color: options.color });
|
|
605
|
+
let result;
|
|
606
|
+
try {
|
|
607
|
+
result = await client.callTool("zvec_grep_index", {
|
|
608
|
+
root,
|
|
609
|
+
embedding,
|
|
610
|
+
device: options.device,
|
|
611
|
+
embeddingConcurrency: options.embeddingConcurrency,
|
|
612
|
+
wait: true,
|
|
613
|
+
}, {
|
|
614
|
+
onProgress: (event) => {
|
|
615
|
+
const update = indexProgressFromMessage(event.message);
|
|
616
|
+
if (update)
|
|
617
|
+
progress.report(update.progress);
|
|
618
|
+
},
|
|
619
|
+
embeddingEnvironment: embedding,
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
finally {
|
|
623
|
+
progress.finish();
|
|
624
|
+
}
|
|
625
|
+
if (result.state === "failed")
|
|
626
|
+
throw serverIndexFailure(result);
|
|
627
|
+
}
|
|
628
|
+
function implicitEmbeddingReference(options) {
|
|
629
|
+
const configured = configuredEmbeddingReference(options, undefined);
|
|
630
|
+
return configured?.startsWith("local/")
|
|
631
|
+
? configured
|
|
632
|
+
: DEFAULT_IMPLICIT_EMBEDDING;
|
|
633
|
+
}
|
|
634
|
+
async function runServerQuery(options, queries, routes) {
|
|
635
|
+
const searchPolicy = resolveServerSearchPolicy(options);
|
|
636
|
+
const structuredContent = await daemonClient(options).callTool("zvec_grep_search", {
|
|
637
|
+
root: resolve(process.cwd()),
|
|
638
|
+
apiKey: options.apiKey,
|
|
639
|
+
device: options.device,
|
|
640
|
+
queries: queries.length ? queries : undefined,
|
|
641
|
+
routes: routes.length ? routes : undefined,
|
|
642
|
+
fuse: options.fuse,
|
|
643
|
+
limit: options.limit,
|
|
644
|
+
trace: options.trace,
|
|
645
|
+
preferSymbol: options.preferSymbol,
|
|
646
|
+
symbolTypes: options.symbolTypes,
|
|
647
|
+
globs: options.globs,
|
|
648
|
+
insensitiveGlobs: options.insensitiveGlobs,
|
|
649
|
+
fileTypes: options.fileTypes,
|
|
650
|
+
excludedFileTypes: options.excludedFileTypes,
|
|
651
|
+
hidden: options.hidden,
|
|
652
|
+
noIgnore: options.noIgnore,
|
|
653
|
+
ignoreFiles: options.ignoreFiles,
|
|
654
|
+
maxDepth: options.maxDepth,
|
|
655
|
+
maxFileSizeBytes: options.maxFileSizeBytes,
|
|
656
|
+
follow: options.follow,
|
|
657
|
+
modifiedAfter: options.modifiedAfter,
|
|
658
|
+
modifiedBefore: options.modifiedBefore,
|
|
659
|
+
freshness: searchPolicy.freshness,
|
|
660
|
+
autoUpdate: searchPolicy.autoUpdate,
|
|
661
|
+
}, {
|
|
662
|
+
toolContract: {
|
|
663
|
+
inputProperties: ["routes"],
|
|
664
|
+
outputProperties: ["result"],
|
|
665
|
+
errorMessage: INCOMPATIBLE_SERVER_SEARCH_MESSAGE,
|
|
666
|
+
},
|
|
667
|
+
});
|
|
668
|
+
const response = parseServerSearchResponse(structuredContent);
|
|
669
|
+
printCliContextResult(response.result, options);
|
|
670
|
+
for (const line of contextWarningLines(response.result)) {
|
|
671
|
+
console.error(line);
|
|
672
|
+
}
|
|
673
|
+
if (response.freshness === "possibly_stale") {
|
|
674
|
+
printStaleIndexStatus(response.indexing?.state, response.indexing);
|
|
675
|
+
}
|
|
676
|
+
if (options.debug) {
|
|
677
|
+
printDebug(response.result, { trace: options.trace === true });
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
function printStaleIndexStatus(state, completion) {
|
|
681
|
+
console.error("status: possibly_stale");
|
|
682
|
+
if (!state)
|
|
683
|
+
return;
|
|
684
|
+
const progress = completion?.completed === undefined || completion.total === undefined
|
|
685
|
+
? ""
|
|
686
|
+
: ` (${completion.completed}/${completion.total})`;
|
|
687
|
+
console.error("results: served_from_current_index");
|
|
688
|
+
console.error(`background_refresh: ${state}${progress}`);
|
|
689
|
+
}
|
|
690
|
+
function daemonClient(options) {
|
|
691
|
+
return new DaemonClient({
|
|
692
|
+
serverUrl: resolveServerUrl(),
|
|
693
|
+
home: options.home,
|
|
694
|
+
tokenFile: options.serverTokenFile,
|
|
695
|
+
allowRemote: options.allowRemote,
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
function ftsFallbackContextRequest(request) {
|
|
699
|
+
const queries = [
|
|
700
|
+
...(request.queries ?? []),
|
|
701
|
+
...(request.query ? [request.query] : []),
|
|
702
|
+
...(request.routes ?? []).map((route) => route.query),
|
|
703
|
+
];
|
|
704
|
+
return {
|
|
705
|
+
...request,
|
|
706
|
+
query: undefined,
|
|
707
|
+
queries: undefined,
|
|
708
|
+
routes: queries.map((query) => ({ mode: "fts", query })),
|
|
709
|
+
autoUpdate: false,
|
|
710
|
+
};
|
|
711
|
+
}
|
|
712
|
+
async function directQueryInfo(service) {
|
|
713
|
+
return await service.info({ root: process.cwd() });
|
|
714
|
+
}
|
|
715
|
+
function normalizedDirectSearchInput(options, queries, root) {
|
|
716
|
+
const policy = resolveDirectSearchPolicy(options);
|
|
717
|
+
return {
|
|
718
|
+
root,
|
|
719
|
+
apiKey: options.apiKey,
|
|
720
|
+
device: options.device,
|
|
721
|
+
queries: !options.rg && queries.length > 0 ? [...queries] : undefined,
|
|
722
|
+
routes: [...(options.routes ?? [])],
|
|
723
|
+
...policy,
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
async function daemonIsReady(home) {
|
|
727
|
+
return (await serverStatus(home)).ready;
|
|
728
|
+
}
|
|
729
|
+
function printServerControlStatus(status) {
|
|
730
|
+
console.log(`Server: ${status.running ? (status.ready ? "ready" : "starting") : "stopped"}`);
|
|
731
|
+
if (status.pid)
|
|
732
|
+
console.log(`PID: ${status.pid}`);
|
|
733
|
+
if (status.serverUrl)
|
|
734
|
+
console.log(`URL: ${status.serverUrl}`);
|
|
735
|
+
if (status.mcpToolset)
|
|
736
|
+
console.log(`MCP toolset: ${status.mcpToolset}`);
|
|
737
|
+
}
|
|
738
|
+
function contextOptions(options, queries, onAutoUpdateProgress) {
|
|
739
|
+
const policy = resolveDirectSearchPolicy(options);
|
|
740
|
+
return {
|
|
741
|
+
queries: queries.length > 0 ? queries : undefined,
|
|
742
|
+
rg: options.rg,
|
|
743
|
+
rgOptions: options.rgOptions,
|
|
744
|
+
rgPaths: options.rgPaths,
|
|
745
|
+
routes: options.routes,
|
|
746
|
+
fuse: options.fuse,
|
|
747
|
+
limit: options.limit,
|
|
748
|
+
autoUpdate: policy.autoUpdate,
|
|
749
|
+
onAutoUpdateProgress,
|
|
750
|
+
trace: options.trace,
|
|
751
|
+
preferSymbol: options.preferSymbol,
|
|
752
|
+
globs: options.globs,
|
|
753
|
+
insensitiveGlobs: options.insensitiveGlobs,
|
|
754
|
+
fileTypes: options.fileTypes,
|
|
755
|
+
excludedFileTypes: options.excludedFileTypes,
|
|
756
|
+
hidden: options.hidden,
|
|
757
|
+
noIgnore: options.noIgnore,
|
|
758
|
+
ignoreFiles: options.ignoreFiles,
|
|
759
|
+
maxDepth: options.maxDepth,
|
|
760
|
+
maxFileSizeBytes: options.maxFileSizeBytes,
|
|
761
|
+
follow: options.follow,
|
|
762
|
+
modifiedAfter: options.modifiedAfter,
|
|
763
|
+
modifiedBefore: options.modifiedBefore,
|
|
764
|
+
symbolTypes: options.symbolTypes,
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
export function createServiceOptions(options, root) {
|
|
768
|
+
return {
|
|
769
|
+
root,
|
|
770
|
+
home: options.home ?? process.env.ZVEC_GREP_HOME,
|
|
771
|
+
embedding: options.embedding,
|
|
772
|
+
apiKey: options.apiKey,
|
|
773
|
+
endpoint: options.endpoint,
|
|
774
|
+
modelCacheDir: options.modelCacheDir,
|
|
775
|
+
device: options.device,
|
|
776
|
+
authorizationSigningKeyPath: process.env.ZVEC_GREP_AUTHORIZATION_KEY_FILE,
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
function resolveIndexRoot(root) {
|
|
780
|
+
if (root !== undefined) {
|
|
781
|
+
return root;
|
|
782
|
+
}
|
|
783
|
+
return findNearestWorkspace(process.cwd())?.root ?? process.cwd();
|
|
784
|
+
}
|
|
785
|
+
function indexRootPath(path, options) {
|
|
786
|
+
return {
|
|
787
|
+
absolutePath: resolve(path),
|
|
788
|
+
recursive: true,
|
|
789
|
+
globs: options.globs,
|
|
790
|
+
insensitiveGlobs: options.insensitiveGlobs,
|
|
791
|
+
fileTypes: options.fileTypes,
|
|
792
|
+
excludedFileTypes: options.excludedFileTypes,
|
|
793
|
+
hidden: options.hidden,
|
|
794
|
+
noIgnore: options.noIgnore,
|
|
795
|
+
ignoreFiles: options.ignoreFiles,
|
|
796
|
+
maxDepth: options.maxDepth,
|
|
797
|
+
maxFileSizeBytes: options.maxFileSizeBytes,
|
|
798
|
+
follow: options.follow,
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
//# sourceMappingURL=commands.js.map
|