@zvec/zvec-grep 0.1.0
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 +222 -0
- package/README_CN.md +222 -0
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.js +611 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands.d.ts +2 -0
- package/dist/cli/commands.js +270 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/errors.d.ts +6 -0
- package/dist/cli/errors.js +97 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/format/context.d.ts +5 -0
- package/dist/cli/format/context.js +490 -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 +42 -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 +9 -0
- package/dist/cli/format/progress.js +92 -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 +7 -0
- package/dist/cli/format/status.js +200 -0
- package/dist/cli/format/status.js.map +1 -0
- package/dist/cli/help.d.ts +1 -0
- package/dist/cli/help.js +88 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +32 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types.d.ts +56 -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 +11 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/engine/collection/index.d.ts +50 -0
- package/dist/engine/collection/index.js +388 -0
- package/dist/engine/collection/index.js.map +1 -0
- package/dist/engine/errors/details.d.ts +6 -0
- package/dist/engine/errors/details.js +27 -0
- package/dist/engine/errors/details.js.map +1 -0
- package/dist/engine/errors/index.d.ts +14 -0
- package/dist/engine/errors/index.js +16 -0
- package/dist/engine/errors/index.js.map +1 -0
- package/dist/engine/models/catalog.d.ts +47 -0
- package/dist/engine/models/catalog.js +68 -0
- package/dist/engine/models/catalog.js.map +1 -0
- package/dist/engine/models/embeddings.d.ts +25 -0
- package/dist/engine/models/embeddings.js +100 -0
- package/dist/engine/models/embeddings.js.map +1 -0
- package/dist/engine/models/factory.d.ts +5 -0
- package/dist/engine/models/factory.js +66 -0
- package/dist/engine/models/factory.js.map +1 -0
- package/dist/engine/models/index.d.ts +6 -0
- package/dist/engine/models/index.js +5 -0
- package/dist/engine/models/index.js.map +1 -0
- package/dist/engine/models/providers/index.d.ts +2 -0
- package/dist/engine/models/providers/index.js +3 -0
- package/dist/engine/models/providers/index.js.map +1 -0
- package/dist/engine/models/providers/llama-cpp/embedding.d.ts +94 -0
- package/dist/engine/models/providers/llama-cpp/embedding.js +459 -0
- package/dist/engine/models/providers/llama-cpp/embedding.js.map +1 -0
- package/dist/engine/models/providers/llama-cpp/index.d.ts +1 -0
- package/dist/engine/models/providers/llama-cpp/index.js +2 -0
- package/dist/engine/models/providers/llama-cpp/index.js.map +1 -0
- package/dist/engine/models/providers/qwen/embedding.d.ts +38 -0
- package/dist/engine/models/providers/qwen/embedding.js +322 -0
- package/dist/engine/models/providers/qwen/embedding.js.map +1 -0
- package/dist/engine/models/providers/qwen/index.d.ts +1 -0
- package/dist/engine/models/providers/qwen/index.js +2 -0
- package/dist/engine/models/providers/qwen/index.js.map +1 -0
- package/dist/engine/models/ranking.d.ts +15 -0
- package/dist/engine/models/ranking.js +2 -0
- package/dist/engine/models/ranking.js.map +1 -0
- package/dist/engine/models/types.d.ts +30 -0
- package/dist/engine/models/types.js +2 -0
- package/dist/engine/models/types.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/adapter.d.ts +19 -0
- package/dist/engine/pipeline/indexing/extractor/code/adapter.js +24 -0
- package/dist/engine/pipeline/indexing/extractor/code/adapter.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/extractor.d.ts +14 -0
- package/dist/engine/pipeline/indexing/extractor/code/extractor.js +594 -0
- package/dist/engine/pipeline/indexing/extractor/code/extractor.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/c-family.d.ts +2 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/c-family.js +116 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/c-family.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/js-ts.d.ts +12 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/js-ts.js +112 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/js-ts.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/metadata.d.ts +8 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/metadata.js +83 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/metadata.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/name-field.d.ts +3 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/name-field.js +22 -0
- package/dist/engine/pipeline/indexing/extractor/code/families/name-field.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/c.d.ts +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/c.js +15 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/c.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/cpp.d.ts +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/cpp.js +18 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/cpp.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/go.d.ts +2 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/go.js +72 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/go.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/java.d.ts +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/java.js +17 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/java.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/javascript.d.ts +2 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/javascript.js +25 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/javascript.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/python.d.ts +2 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/python.js +53 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/python.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/rust.d.ts +2 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/rust.js +29 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/rust.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/typescript.d.ts +2 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/typescript.js +37 -0
- package/dist/engine/pipeline/indexing/extractor/code/languages/typescript.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/index.d.ts +44 -0
- package/dist/engine/pipeline/indexing/extractor/index.js +281 -0
- package/dist/engine/pipeline/indexing/extractor/index.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/markdown/extractor.d.ts +13 -0
- package/dist/engine/pipeline/indexing/extractor/markdown/extractor.js +339 -0
- package/dist/engine/pipeline/indexing/extractor/markdown/extractor.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/grammar.d.ts +4 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/grammar.js +49 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/grammar.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/nodes.d.ts +3 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/nodes.js +26 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/nodes.js.map +1 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/parser.d.ts +2 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/parser.js +31 -0
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/parser.js.map +1 -0
- package/dist/engine/pipeline/indexing/ids.d.ts +1 -0
- package/dist/engine/pipeline/indexing/ids.js +5 -0
- package/dist/engine/pipeline/indexing/ids.js.map +1 -0
- package/dist/engine/pipeline/indexing/index.d.ts +12 -0
- package/dist/engine/pipeline/indexing/index.js +538 -0
- package/dist/engine/pipeline/indexing/index.js.map +1 -0
- package/dist/engine/pipeline/indexing/root-paths.d.ts +7 -0
- package/dist/engine/pipeline/indexing/root-paths.js +151 -0
- package/dist/engine/pipeline/indexing/root-paths.js.map +1 -0
- package/dist/engine/pipeline/indexing/scanner/index.d.ts +5 -0
- package/dist/engine/pipeline/indexing/scanner/index.js +504 -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 +761 -0
- package/dist/engine/pipeline/search/index.js.map +1 -0
- package/dist/engine/service/index.d.ts +2 -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 +29 -0
- package/dist/engine/service/lexical.js +482 -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 +44 -0
- package/dist/engine/service/root.js.map +1 -0
- package/dist/engine/service/types.d.ts +157 -0
- package/dist/engine/service/types.js +2 -0
- package/dist/engine/service/types.js.map +1 -0
- package/dist/engine/service/zvec-grep.d.ts +2 -0
- package/dist/engine/service/zvec-grep.js +935 -0
- package/dist/engine/service/zvec-grep.js.map +1 -0
- package/dist/engine/storage/index.d.ts +42 -0
- package/dist/engine/storage/index.js +2 -0
- package/dist/engine/storage/index.js.map +1 -0
- package/dist/engine/storage/zvec.d.ts +51 -0
- package/dist/engine/storage/zvec.js +706 -0
- package/dist/engine/storage/zvec.js.map +1 -0
- package/dist/engine/types.d.ts +266 -0
- package/dist/engine/types.js +14 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/utils/glob.d.ts +6 -0
- package/dist/engine/utils/glob.js +110 -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 +4 -0
- package/dist/engine/utils/json.js +45 -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/index.d.ts +6 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
- package/skills/zvec-grep/SKILL.md +141 -0
- package/skills/zvec-grep/agents/openai.yaml +4 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { hostname } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { detail, EngineError, errorDetails } from "../errors/index.js";
|
|
6
|
+
const LOCK_INFO_FILE = "lock.json";
|
|
7
|
+
const DEFAULT_STALE_LOCK_MS = 6 * 60 * 60 * 1000;
|
|
8
|
+
function acquireExclusiveDirectoryLock(lockPath, options) {
|
|
9
|
+
mkdirSync(dirname(lockPath), { recursive: true });
|
|
10
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
11
|
+
try {
|
|
12
|
+
mkdirSync(lockPath);
|
|
13
|
+
const info = currentLockInfo(options.operation);
|
|
14
|
+
writeFileSync(lockInfoPath(lockPath), `${JSON.stringify(info, null, 2)}\n`, "utf8");
|
|
15
|
+
return {
|
|
16
|
+
path: lockPath,
|
|
17
|
+
info,
|
|
18
|
+
release: () => releaseFileLock(lockPath, info),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (!isNodeError(error) || error.code !== "EEXIST") {
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
if (cleanupStaleLock(lockPath, options.staleMs ?? DEFAULT_STALE_LOCK_MS)) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
throw lockBusyError(lockPath, options.operation);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
throw lockBusyError(lockPath, options.operation);
|
|
32
|
+
}
|
|
33
|
+
function assertExclusiveDirectoryUnlocked(lockPath, operation) {
|
|
34
|
+
if (!existsSync(lockPath)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (cleanupStaleLock(lockPath, DEFAULT_STALE_LOCK_MS)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
throw lockBusyError(lockPath, operation);
|
|
41
|
+
}
|
|
42
|
+
export function acquireReadWriteLock(lockPath, mode, options) {
|
|
43
|
+
return mode === "read"
|
|
44
|
+
? acquireReadLock(lockPath, options)
|
|
45
|
+
: acquireWriteLock(lockPath, options);
|
|
46
|
+
}
|
|
47
|
+
export function assertNoWriteLock(lockPath, operation) {
|
|
48
|
+
assertExclusiveDirectoryUnlocked(writeLockPath(lockPath), operation);
|
|
49
|
+
}
|
|
50
|
+
function currentLockInfo(operation) {
|
|
51
|
+
return {
|
|
52
|
+
token: randomUUID(),
|
|
53
|
+
pid: process.pid,
|
|
54
|
+
hostname: hostname(),
|
|
55
|
+
startedAt: Date.now(),
|
|
56
|
+
operation,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function acquireReadLock(lockPath, options) {
|
|
60
|
+
mkdirSync(dirname(lockPath), { recursive: true });
|
|
61
|
+
const staleMs = options.staleMs ?? DEFAULT_STALE_LOCK_MS;
|
|
62
|
+
const writePath = writeLockPath(lockPath);
|
|
63
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
64
|
+
if (existsSync(writePath)) {
|
|
65
|
+
if (cleanupStaleLock(writePath, staleMs)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
throw lockBusyError(writePath, options.operation);
|
|
69
|
+
}
|
|
70
|
+
const info = currentLockInfo(options.operation);
|
|
71
|
+
const readerPath = join(readersLockPath(lockPath), `${info.pid}-${info.token}`);
|
|
72
|
+
try {
|
|
73
|
+
mkdirSync(readerPath, { recursive: true });
|
|
74
|
+
writeFileSync(lockInfoPath(readerPath), `${JSON.stringify(info, null, 2)}\n`, "utf8");
|
|
75
|
+
if (existsSync(writePath)) {
|
|
76
|
+
releaseFileLock(readerPath, info);
|
|
77
|
+
if (cleanupStaleLock(writePath, staleMs)) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
throw lockBusyError(writePath, options.operation);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
path: readerPath,
|
|
84
|
+
info,
|
|
85
|
+
release: () => releaseFileLock(readerPath, info),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
releaseFileLock(readerPath, info);
|
|
90
|
+
if (!isNodeError(error) || error.code !== "EEXIST") {
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw lockBusyError(writePath, options.operation);
|
|
96
|
+
}
|
|
97
|
+
function acquireWriteLock(lockPath, options) {
|
|
98
|
+
const staleMs = options.staleMs ?? DEFAULT_STALE_LOCK_MS;
|
|
99
|
+
const writePath = writeLockPath(lockPath);
|
|
100
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
101
|
+
const lock = acquireExclusiveDirectoryLock(writePath, options);
|
|
102
|
+
if (!hasActiveReaders(lockPath, staleMs)) {
|
|
103
|
+
return lock;
|
|
104
|
+
}
|
|
105
|
+
lock.release();
|
|
106
|
+
throw readLockBusyError(lockPath, options.operation);
|
|
107
|
+
}
|
|
108
|
+
throw readLockBusyError(lockPath, options.operation);
|
|
109
|
+
}
|
|
110
|
+
function releaseFileLock(lockPath, owner) {
|
|
111
|
+
const current = readLockInfo(lockPath);
|
|
112
|
+
if (current?.token !== owner.token) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
rmSync(lockPath, { recursive: true, force: true });
|
|
116
|
+
}
|
|
117
|
+
function cleanupStaleLock(lockPath, staleMs) {
|
|
118
|
+
if (!existsSync(lockPath)) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const info = readLockInfo(lockPath);
|
|
122
|
+
if (!isStaleLock(lockPath, info, staleMs)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
rmSync(lockPath, { recursive: true, force: true });
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
function hasActiveReaders(lockPath, staleMs) {
|
|
129
|
+
const readersPath = readersLockPath(lockPath);
|
|
130
|
+
if (!existsSync(readersPath)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
let entries;
|
|
134
|
+
try {
|
|
135
|
+
entries = readdirSync(readersPath);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
let active = false;
|
|
141
|
+
for (const entry of entries) {
|
|
142
|
+
const readerPath = join(readersPath, entry);
|
|
143
|
+
if (cleanupStaleLock(readerPath, staleMs)) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
active = true;
|
|
147
|
+
}
|
|
148
|
+
return active;
|
|
149
|
+
}
|
|
150
|
+
function isStaleLock(lockPath, info, staleMs) {
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
const startedAt = info?.startedAt ?? lockDirectoryMtime(lockPath);
|
|
153
|
+
const expired = now - startedAt > staleMs;
|
|
154
|
+
if (!info) {
|
|
155
|
+
return expired;
|
|
156
|
+
}
|
|
157
|
+
if (info.hostname === hostname() && !processIsAlive(info.pid)) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
return expired;
|
|
161
|
+
}
|
|
162
|
+
function processIsAlive(pid) {
|
|
163
|
+
if (!Number.isInteger(pid) || pid <= 0) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
process.kill(pid, 0);
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return isNodeError(error) && error.code === "EPERM";
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function readLockInfo(lockPath) {
|
|
175
|
+
try {
|
|
176
|
+
const parsed = JSON.parse(readFileSync(lockInfoPath(lockPath), "utf8"));
|
|
177
|
+
if (typeof parsed.token === "string"
|
|
178
|
+
&& typeof parsed.pid === "number"
|
|
179
|
+
&& typeof parsed.hostname === "string"
|
|
180
|
+
&& typeof parsed.startedAt === "number"
|
|
181
|
+
&& typeof parsed.operation === "string") {
|
|
182
|
+
return parsed;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
function lockDirectoryMtime(lockPath) {
|
|
191
|
+
try {
|
|
192
|
+
return statSync(lockPath).mtimeMs;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return Date.now();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function lockBusyError(lockPath, requestedOperation) {
|
|
199
|
+
const owner = readLockInfo(lockPath);
|
|
200
|
+
return new EngineError("Index unavailable", {
|
|
201
|
+
code: "ZVEC_GREP.ENGINE.LOCK.BUSY",
|
|
202
|
+
context: errorDetails([
|
|
203
|
+
detail("lock", lockPath),
|
|
204
|
+
detail("operation", requestedOperation),
|
|
205
|
+
detail("ownerOperation", owner?.operation),
|
|
206
|
+
detail("ownerPid", owner?.pid),
|
|
207
|
+
detail("ownerHost", owner?.hostname),
|
|
208
|
+
]),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function readLockBusyError(lockPath, requestedOperation) {
|
|
212
|
+
const owner = firstActiveReaderInfo(lockPath);
|
|
213
|
+
return new EngineError("Index unavailable", {
|
|
214
|
+
code: "ZVEC_GREP.ENGINE.LOCK.BUSY",
|
|
215
|
+
context: errorDetails([
|
|
216
|
+
detail("lock", readersLockPath(lockPath)),
|
|
217
|
+
detail("operation", requestedOperation),
|
|
218
|
+
detail("ownerOperation", owner?.operation),
|
|
219
|
+
detail("ownerPid", owner?.pid),
|
|
220
|
+
detail("ownerHost", owner?.hostname),
|
|
221
|
+
]),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function firstActiveReaderInfo(lockPath) {
|
|
225
|
+
const readersPath = readersLockPath(lockPath);
|
|
226
|
+
if (!existsSync(readersPath)) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
for (const entry of readdirSync(readersPath)) {
|
|
231
|
+
const info = readLockInfo(join(readersPath, entry));
|
|
232
|
+
if (info) {
|
|
233
|
+
return info;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
function lockInfoPath(lockPath) {
|
|
243
|
+
return join(lockPath, LOCK_INFO_FILE);
|
|
244
|
+
}
|
|
245
|
+
function writeLockPath(lockPath) {
|
|
246
|
+
return `${lockPath}.write`;
|
|
247
|
+
}
|
|
248
|
+
function readersLockPath(lockPath) {
|
|
249
|
+
return `${lockPath}.readers`;
|
|
250
|
+
}
|
|
251
|
+
function isNodeError(error) {
|
|
252
|
+
return typeof error === "object" && error !== null && "code" in error;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/engine/utils/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { resolve, sep } from "node:path";
|
|
3
|
+
export function defaultHome() {
|
|
4
|
+
return process.env.ZVEC_GREP_HOME ?? resolve(homedir(), ".zvec-grep");
|
|
5
|
+
}
|
|
6
|
+
export function normalizePath(path) {
|
|
7
|
+
return resolve(path);
|
|
8
|
+
}
|
|
9
|
+
export function toDisplayPath(path) {
|
|
10
|
+
return path.split(sep).join("/");
|
|
11
|
+
}
|
|
12
|
+
export function isPathInside(parent, child) {
|
|
13
|
+
const normalizedParent = normalizePath(parent);
|
|
14
|
+
const normalizedChild = normalizePath(child);
|
|
15
|
+
return normalizedChild === normalizedParent
|
|
16
|
+
|| normalizedChild.startsWith(`${normalizedParent}${sep}`);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/engine/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACxE,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAGD,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAa;IACxD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAE7C,OAAO,eAAe,KAAK,gBAAgB;WACtC,eAAe,CAAC,UAAU,CAAC,GAAG,gBAAgB,GAAG,GAAG,EAAE,CAAC,CAAC;AAC/D,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createZvecGrep, } from "./engine/service/index.js";
|
|
2
|
+
export type { CreateZvecGrepOptions, ZvecGrep, ZvecGrepCollectionIndexOptions, ZvecGrepCollections, ZvecGrepContent, ZvecGrepContextCollection, ZvecGrepContextCoverage, ZvecGrepContextDiagnostics, ZvecGrepContextFile, ZvecGrepContextItem, ZvecGrepContextItemKind, ZvecGrepContextOptions, ZvecGrepContextResult, ZvecGrepContextRoute, ZvecGrepContextSource, ZvecGrepFallbackPolicy, ZvecGrepIndexDiagnostics, ZvecGrepInfoOptions, ZvecGrepInfoResult, ZvecGrepInitOptions, ZvecGrepLexicalFallbackDiagnostics, } from "./engine/service/index.js";
|
|
3
|
+
export { EMBEDDING_MODEL_CATALOG, MODEL_CATALOG, createEmbeddingModel, createEmbeddingModelFromCatalog, createEmbeddingModelFromReference, EmbeddingModel, getEmbeddingModelCatalogEntry, getEmbeddingModelCatalogEntryByRef, listEmbeddingModels, } from "./engine/models/index.js";
|
|
4
|
+
export { isImageContent, isTextContent, } from "./engine/types.js";
|
|
5
|
+
export type { CodeEntityMetadata, CodeEntityModifier, CodeSymbolType, CollectionEmbeddingSchema, CollectionIndexStatus, CollectionInfo, Content, ContentKind, EntityMetadata, FileFormat, FileIndexStatus, FileInfo, FileKind, ImageContent, ImageFormat, IndexOptions, IndexProgress, IndexProgressPhase, IndexResult, MarkdownEntityMetadata, RootPath, SearchFinalTrace, SearchHitTrace, SearchRecallTrace, SearchStageTrace, TextContent, } from "./engine/types.js";
|
|
6
|
+
export type { EmbeddingCatalogEntry, LlamaCppEmbeddingCatalogEntry, LlamaGpuMode, LocalEmbeddingFormat, ModelProviderOptions, } from "./engine/models/index.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createZvecGrep, } from "./engine/service/index.js";
|
|
2
|
+
export { EMBEDDING_MODEL_CATALOG, MODEL_CATALOG, createEmbeddingModel, createEmbeddingModelFromCatalog, createEmbeddingModelFromReference, EmbeddingModel, getEmbeddingModelCatalogEntry, getEmbeddingModelCatalogEntryByRef, listEmbeddingModels, } from "./engine/models/index.js";
|
|
3
|
+
export { isImageContent, isTextContent, } from "./engine/types.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GACf,MAAM,2BAA2B,CAAC;AAwBnC,OAAO,EACL,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,+BAA+B,EAC/B,iCAAiC,EACjC,cAAc,EACd,6BAA6B,EAC7B,kCAAkC,EAClC,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zvec/zvec-grep",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Agent-friendly hybrid grep with indexed context and lexical fallback.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=20"
|
|
12
|
+
},
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"zg": "dist/cli/index.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"README.md",
|
|
24
|
+
"README_CN.md",
|
|
25
|
+
"LICENSE",
|
|
26
|
+
"dist",
|
|
27
|
+
"skills/zvec-grep"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.json",
|
|
31
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
32
|
+
"test": "npm run build && node --test test/*.test.mjs"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^25.9.4",
|
|
36
|
+
"typescript": "^5.9.3"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@vscode/ripgrep": "^1.18.0",
|
|
40
|
+
"@zvec/zvec": "^0.5.0",
|
|
41
|
+
"tree-sitter-wasms": "^0.1.13",
|
|
42
|
+
"web-tree-sitter": "^0.20.8"
|
|
43
|
+
},
|
|
44
|
+
"optionalDependencies": {
|
|
45
|
+
"node-llama-cpp": "3.18.1"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zvec-grep
|
|
3
|
+
description: Use zvec-grep instead of grep or rg: check the index state once per repository investigation when needed, use existing indexed context when available, and use explicit zg --rg for lexical search when no index exists unless the user asks to initialize.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# zvec-grep
|
|
7
|
+
|
|
8
|
+
Use zvec-grep through the `zg` command for repository search instead of `grep`, `rg`, or broad manual file scans. zvec-grep provides higher-quality results by combining indexed semantic context with lexical matching, while `zg --rg` provides an explicit no-index lexical search route.
|
|
9
|
+
|
|
10
|
+
At the start of a repository investigation, check the current repository's anonymous index status once:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
zg --info
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Do not run `zg --info` before every search. Reuse the initial status for subsequent `zg` queries in the same root. Check again only when switching roots or collections, after an init/rebuild, or when a query reports an index problem that you need to diagnose.
|
|
17
|
+
|
|
18
|
+
If the index is missing, do not initialize it automatically and do not run a default `zg "<query>"` search. Use `zg --rg` for explicit exhaustive literal/regex search, and mention `zg --init` when the user wants persistent indexed semantic search. Initializing creates repository-local state, may load local models or call remote embedding providers, and should be a user-owned action.
|
|
19
|
+
|
|
20
|
+
When initializing or rebuilding, choose useful repo paths instead of indexing everything. Prefer source, tests, docs, config, and scripts. zvec-grep skips dependency, build, cache, `.gitignore`d, and over-1MB files by default; use `--include` and `--exclude` to further keep the index focused:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
zg --init --embedding local/embeddinggemma-300m --include "src/**" --include "docs/**" --include "test/**" --exclude "dist/**,node_modules/**,coverage/**,.zvec-grep/**"
|
|
24
|
+
zg --init --rebuild --embedding local/embeddinggemma-300m --include "src/**" --exclude "dist/**,node_modules/**,coverage/**,.zvec-grep/**"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If `zg --info` reports incompatible settings, ask before rebuilding. Existing anonymous indexes are checked and incrementally refreshed by query commands by default; use `--no-auto-update` only when diagnosing stale-index behavior. Rebuild only when the embedding schema or index version requires it:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
zg --init --rebuild --embedding local/embeddinggemma-300m
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
After an anonymous index exists, start with high-quality semantic context:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
zg "<query>"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Prefer the default indexed/hybrid search for exploration. Agent output uses `--preview none` by default to keep results token-efficient; `--human` uses `--preview full` by default for terminal reading. Use `--limit` to control candidate width, `--preview short` for a small deterministic source window, and `--preview full` after narrowing to a few results.
|
|
40
|
+
|
|
41
|
+
Use filters early. For source-code investigations, start with implementation paths and exclude tests, fixtures, generated output, dependencies, and build artifacts unless the task is specifically about those areas. Good filters keep candidate sets smaller and reduce token use:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
zg "plugin loading lifecycle" --include "src/**" --exclude "test/**,tests/**,**/*.test.*,**/*.spec.*,fixtures/**,dist/**"
|
|
45
|
+
zg "query planning" --include "src/**,packages/*/src/**" --exclude "test/**,tests/**,fixtures/**,node_modules/**,dist/**"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Indexed agent results use `--preview none` by default: essential metadata plus one representative source line when source is available. Human results use `--preview full` by default. Use `--preview short` for essential metadata plus a small deterministic source window, or `--preview full` after narrowing to a few results. `--preview` is for indexed/semantic results; with `--rg`, use ripgrep context flags such as `-A`, `-B`, or `-C` instead.
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
zg "plugin loading" --limit 30 --preview none
|
|
52
|
+
zg "plugin loading" --limit 10 --preview short
|
|
53
|
+
zg "plugin loading" --limit 3 --preview full
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Use multiple quoted queries when you are exploring related ideas or comparing several names/concepts. Each query gets its own search group, and `--limit` applies per query/group:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
zg "request validation" "error handling"
|
|
60
|
+
zg "authentication flow" "session refresh" "permission checks" --limit 5
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Use `zg --rg` only when you need exhaustive literal/regex search, exact verification, or ripgrep-specific flags. For exploratory code understanding, prefer default `zg` indexed search first:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
zg --rg "SymbolName|LogMessage"
|
|
67
|
+
zg --rg -F "ExactSymbolOrText" src
|
|
68
|
+
zg --rg -i -C 2 -g "*.ts" -g "!dist/**" "needle text" src
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Do not call `grep` or `rg` directly for repository search. If exhaustive regex or literal matching is required, use `zg --rg`; otherwise keep using default `zg` indexed search to avoid noisy, token-heavy match lists.
|
|
72
|
+
|
|
73
|
+
Check the local anonymous index explicitly only when starting a repository investigation or diagnosing index state. Build it only when the user asks for persistent indexed semantic search:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
zg --info
|
|
77
|
+
zg --init --embedding local/embeddinggemma-300m
|
|
78
|
+
zg --init --rebuild --embedding local/embeddinggemma-300m
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For a new index, always pass `--embedding <model>` or set `ZVEC_GREP_EMBEDDING`; `zg --init` does not choose a model silently. For an existing index, rerunning `zg --init` without `--embedding` reuses the collection's stored embedding schema. Use `--embedding <model>` when intentionally choosing or changing models. Local models use `local/model`, such as `local/embeddinggemma-300m` and `local/qwen3-embedding-0.6b`. Remote models use `provider/model`, such as `qwen/text-embedding-v4`.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
zg --init --embedding local/qwen3-embedding-0.6b
|
|
85
|
+
zg --init --embedding qwen/text-embedding-v4 --api-key "$DASHSCOPE_API_KEY"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Use explicit routes only when the intent is clear:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
zg --fts "ExactSymbolOrToken"
|
|
92
|
+
zg --vector "natural language description of the code you need"
|
|
93
|
+
zg --fts "AuthService" "validateRequest" --vector "where incoming requests are authorized"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Combine default hybrid queries with `--fts` when you want broad semantic/lexical recall plus exact anchors such as symbols, flags, error codes, or log text. Put the default hybrid queries first, then add one or more `--fts` terms:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
zg "authentication flow" --fts "AuthService" --include "src/**"
|
|
100
|
+
zg "cache invalidation" "stale data handling" --fts "CACHE_TTL" "invalidateCache" --limit 5
|
|
101
|
+
zg "request routing behavior" --fts "routeRequest" "RouteOptions" --include "src/**"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Use query filters to narrow noisy searches before reading results. Prefer adding `--include` and `--exclude` to the first query when you already know the relevant area:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
zg "error handling" --include "src/**" --exclude "dist/**,node_modules/**"
|
|
108
|
+
zg "database migration" --include "src/**" --exclude "**/*.test.*"
|
|
109
|
+
zg "recent API changes" --modified-after 2026-06-01 --modified-before 2026-06-25
|
|
110
|
+
zg "create user" --symbol-type function --prefer-symbol
|
|
111
|
+
zg "service lifecycle" "resource cleanup" --symbol-type class --symbol-type function --limit 5
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Filter notes:
|
|
115
|
+
|
|
116
|
+
- Quote glob filters so the shell does not expand them.
|
|
117
|
+
- `--include` and `--exclude` accept comma-separated globs and can be repeated.
|
|
118
|
+
- Dependency, build, cache, `.gitignore`d, and over-1MB files are skipped during indexing by default. Hidden dot paths are skipped by default; explicitly include useful hidden paths such as `.github/**`, `.codex/**`, or `.agents/**` with `--include` when needed. `.git/**` and `.zvec-grep/**` remain excluded.
|
|
119
|
+
- `--modified-after` and `--modified-before` accept epoch milliseconds, `YYYY-MM-DD`, or other parseable date strings.
|
|
120
|
+
- `--symbol-type` can be repeated; supported values are `module`, `class`, `interface`, `function`, `value`, and `alias`.
|
|
121
|
+
- `--prefer-symbol` is useful when a query names a symbol and you want exact indexed symbol hits ranked first.
|
|
122
|
+
- `--rg` is for exhaustive ripgrep search; do not combine it with indexed symbol options such as `--symbol-type` or `--prefer-symbol`. It uses rg regex syntax by default, so use `-F`/`--fixed-strings` for literal text, and use `-e`/`--regexp` when the pattern begins with `-`. It accepts common agent rg flags: `-n`, `-H`, `-F`, `-i`, `-w`, `-A`, `-B`, `-C`, `-e`/`--regexp`, `-g`/`--glob`, `--hidden`, `-t`/`--type`, `-T`/`--type-not`, `--max-depth`, `--ignore-file`, `--no-ignore`, `--smart-case`, and `--pcre2`. In `--rg`, `--limit` is a global match limit.
|
|
123
|
+
|
|
124
|
+
Combine multiple queries, explicit routes, and filters for focused context:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
zg "authorization failure" "permission checks" \
|
|
128
|
+
--fts "ForbiddenError" "hasPermission" \
|
|
129
|
+
--include "src/**" \
|
|
130
|
+
--exclude "dist/**,**/*.test.*" \
|
|
131
|
+
--symbol-type function \
|
|
132
|
+
--limit 5
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Read output as:
|
|
136
|
+
|
|
137
|
+
- `path:start-end` is the returned entity.
|
|
138
|
+
- `outline:` is generated structure or call summary.
|
|
139
|
+
- `matched:` is the matching excerpt range inside the entity or `--rg` context block.
|
|
140
|
+
- `source:` is original file text for indexed results. `--rg` results omit the `source:` label and print numbered matching lines directly under `path:start-end`.
|
|
141
|
+
- `--preview none` omits `outline:`, `matched:`, and `source:` blocks but keeps metadata and one representative numbered source line when source is available.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "zvec-grep"
|
|
3
|
+
short_description: "Agent-friendly indexed repository search"
|
|
4
|
+
default_prompt: "Use zvec-grep through the zg command instead of grep or rg: check zg --info once at the start of a repository investigation when needed, then reuse that status for later searches in the same root; when initializing or rebuilding the local index, use --include and --exclude to index useful source/docs/tests/config/scripts and exclude generated, dependency, cache, build, log, and .zvec-grep garbage; prefer default zg indexed/hybrid queries for high-quality, token-efficient context; use --preview none for broad candidate scans and --preview full only after narrowing; use filters early, especially --include implementation paths and --exclude tests/fixtures/generated output when the task is about source code; use multiple quoted queries for related concepts; combine default hybrid queries with --fts exact anchors for symbols/flags/errors; narrow noisy searches with --include/--exclude/--modified-after/--modified-before/--symbol-type/--prefer-symbol; and use zg --rg only for exhaustive literal/regex verification with common rg flags such as -F, -i, -w, -A/-B/-C, -e/--regexp, -g/--glob, --hidden, --type, --type-not, --no-ignore, --smart-case, and --pcre2; use -e/--regexp when an rg pattern begins with -."
|