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