@zvec/zvec-grep 0.1.2 → 0.1.3
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 +12 -12
- package/README_CN.md +13 -13
- package/dist/cli/args.js +35 -20
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands.js +34 -16
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/format/context.js +34 -9
- package/dist/cli/format/context.js.map +1 -1
- package/dist/cli/format/debug.js +14 -0
- package/dist/cli/format/debug.js.map +1 -1
- package/dist/cli/format/status.d.ts +1 -1
- package/dist/cli/format/status.js +18 -6
- package/dist/cli/format/status.js.map +1 -1
- package/dist/cli/help.js +12 -9
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/types.d.ts +3 -2
- package/dist/cli/types.js.map +1 -1
- package/dist/engine/collection/index.d.ts +12 -7
- package/dist/engine/collection/index.js +374 -52
- package/dist/engine/collection/index.js.map +1 -1
- package/dist/engine/{pipeline/indexing/extractor → extraction}/code/adapter.d.ts +1 -1
- package/dist/engine/extraction/code/adapter.js.map +1 -0
- package/dist/engine/{pipeline/indexing/extractor → extraction}/code/extractor.d.ts +1 -1
- package/dist/engine/{pipeline/indexing/extractor → extraction}/code/extractor.js +2 -2
- package/dist/engine/extraction/code/extractor.js.map +1 -0
- package/dist/engine/extraction/code/families/c-family.js.map +1 -0
- package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/js-ts.d.ts +1 -1
- package/dist/engine/extraction/code/families/js-ts.js.map +1 -0
- package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/metadata.d.ts +1 -1
- package/dist/engine/extraction/code/families/metadata.js.map +1 -0
- package/dist/engine/extraction/code/families/name-field.js.map +1 -0
- package/dist/engine/extraction/code/languages/c.js.map +1 -0
- package/dist/engine/extraction/code/languages/cpp.js.map +1 -0
- package/dist/engine/extraction/code/languages/go.js.map +1 -0
- package/dist/engine/extraction/code/languages/java.js.map +1 -0
- package/dist/engine/extraction/code/languages/javascript.js.map +1 -0
- package/dist/engine/extraction/code/languages/python.js.map +1 -0
- package/dist/engine/extraction/code/languages/rust.js.map +1 -0
- package/dist/engine/extraction/code/languages/typescript.js.map +1 -0
- package/dist/engine/{pipeline/indexing → extraction}/ids.js +1 -1
- package/dist/engine/extraction/ids.js.map +1 -0
- package/dist/engine/{pipeline/indexing/extractor → extraction}/index.d.ts +1 -1
- package/dist/engine/{pipeline/indexing/extractor → extraction}/index.js +2 -2
- package/dist/engine/extraction/index.js.map +1 -0
- package/dist/engine/{pipeline/indexing/extractor → extraction}/markdown/extractor.d.ts +1 -1
- package/dist/engine/{pipeline/indexing/extractor → extraction}/markdown/extractor.js +1 -1
- package/dist/engine/extraction/markdown/extractor.js.map +1 -0
- package/dist/engine/extraction/tree-sitter/grammar.js.map +1 -0
- package/dist/engine/extraction/tree-sitter/nodes.js.map +1 -0
- package/dist/engine/extraction/tree-sitter/parser.js.map +1 -0
- package/dist/engine/files/file-type.d.ts +5 -0
- package/dist/engine/files/file-type.js +119 -0
- package/dist/engine/files/file-type.js.map +1 -0
- package/dist/engine/pipeline/indexing/index.js +37 -31
- package/dist/engine/pipeline/indexing/index.js.map +1 -1
- package/dist/engine/pipeline/indexing/scanner/index.js +2 -118
- package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
- package/dist/engine/pipeline/search/index.js +57 -49
- package/dist/engine/pipeline/search/index.js.map +1 -1
- package/dist/engine/service/index.d.ts +1 -1
- package/dist/engine/service/root.d.ts +2 -0
- package/dist/engine/service/root.js +14 -5
- package/dist/engine/service/root.js.map +1 -1
- package/dist/engine/service/structure-enrichment.d.ts +8 -0
- package/dist/engine/service/structure-enrichment.js +174 -0
- package/dist/engine/service/structure-enrichment.js.map +1 -0
- package/dist/engine/service/types.d.ts +25 -5
- package/dist/engine/service/zvec-grep.js +168 -63
- package/dist/engine/service/zvec-grep.js.map +1 -1
- package/dist/engine/storage/zvec.d.ts +25 -9
- package/dist/engine/storage/zvec.js +231 -30
- package/dist/engine/storage/zvec.js.map +1 -1
- package/dist/engine/types.d.ts +11 -2
- package/dist/engine/utils/timing.d.ts +19 -0
- package/dist/engine/utils/timing.js +87 -0
- package/dist/engine/utils/timing.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/zvec-grep/SKILL.md +12 -12
- package/skills/zvec-grep/agents/openai.yaml +1 -1
- package/dist/engine/pipeline/indexing/extractor/code/adapter.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/extractor.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/families/c-family.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/families/js-ts.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/families/metadata.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/families/name-field.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/c.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/cpp.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/go.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/java.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/javascript.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/python.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/rust.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/code/languages/typescript.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/index.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/markdown/extractor.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/grammar.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/nodes.js.map +0 -1
- package/dist/engine/pipeline/indexing/extractor/tree-sitter/parser.js.map +0 -1
- package/dist/engine/pipeline/indexing/ids.js.map +0 -1
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/adapter.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/c-family.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/c-family.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/js-ts.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/metadata.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/name-field.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/name-field.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/c.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/c.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/cpp.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/cpp.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/go.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/go.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/java.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/java.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/javascript.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/javascript.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/python.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/python.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/rust.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/rust.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/typescript.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/typescript.js +0 -0
- /package/dist/engine/{pipeline/indexing → extraction}/ids.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/grammar.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/grammar.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/nodes.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/nodes.js +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/parser.d.ts +0 -0
- /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/parser.js +0 -0
|
@@ -3,8 +3,8 @@ import { dirname, join, resolve } from "node:path";
|
|
|
3
3
|
export const ZVEC_GREP_DIR = ".zvec-grep";
|
|
4
4
|
export const ANONYMOUS_COLLECTION_NAME = "__anonymous__";
|
|
5
5
|
export const ANONYMOUS_COLLECTION_DIR = "index";
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const COLLECTIONS_ZVEC = "collections.zvec";
|
|
7
|
+
const ENTITIES_ZVEC = "index.zvec";
|
|
8
8
|
export function resolveZvecGrepRoot(root) {
|
|
9
9
|
return resolve(root ?? process.cwd());
|
|
10
10
|
}
|
|
@@ -24,10 +24,16 @@ export function anonymousIndexLocation(root) {
|
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
export function findNearestAnonymousIndex(start) {
|
|
27
|
+
return findNearestAnonymousLocation(start, hasAnonymousIndex);
|
|
28
|
+
}
|
|
29
|
+
export function findNearestAnonymousWorkspace(start) {
|
|
30
|
+
return findNearestAnonymousLocation(start, hasAnonymousMetadata);
|
|
31
|
+
}
|
|
32
|
+
function findNearestAnonymousLocation(start, predicate) {
|
|
27
33
|
let current = resolve(start);
|
|
28
34
|
while (true) {
|
|
29
35
|
const location = anonymousIndexLocation(current);
|
|
30
|
-
if (
|
|
36
|
+
if (predicate(location)) {
|
|
31
37
|
return location;
|
|
32
38
|
}
|
|
33
39
|
const parent = dirname(current);
|
|
@@ -37,8 +43,11 @@ export function findNearestAnonymousIndex(start) {
|
|
|
37
43
|
current = parent;
|
|
38
44
|
}
|
|
39
45
|
}
|
|
46
|
+
export function hasAnonymousMetadata(location) {
|
|
47
|
+
return existsSync(join(location.home, COLLECTIONS_ZVEC));
|
|
48
|
+
}
|
|
40
49
|
export function hasAnonymousIndex(location) {
|
|
41
|
-
return existsSync(join(location.home,
|
|
42
|
-
&& existsSync(join(location.collectionPath,
|
|
50
|
+
return existsSync(join(location.home, COLLECTIONS_ZVEC))
|
|
51
|
+
&& existsSync(join(location.collectionPath, ENTITIES_ZVEC));
|
|
43
52
|
}
|
|
44
53
|
//# sourceMappingURL=root.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../../src/engine/service/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AACzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAGhD,MAAM,
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../../src/engine/service/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AACzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAGhD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAC5C,MAAM,aAAa,GAAG,YAAY,CAAC;AAWnC,MAAM,UAAU,mBAAmB,CAAC,IAAwB;IAC1D,OAAO,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC;AAGD,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC;AAC7D,CAAC;AAGD,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC;QACjC,cAAc,EAAE,yBAAyB;QACzC,cAAc,EAAE,uBAAuB,CAAC,YAAY,CAAC;KACtD,CAAC;AACJ,CAAC;AAGD,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,OAAO,4BAA4B,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;AAChE,CAAC;AAGD,MAAM,UAAU,6BAA6B,CAAC,KAAa;IACzD,OAAO,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;AACnE,CAAC;AAGD,SAAS,4BAA4B,CACnC,KAAa,EACb,SAAwD;IAExD,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAGD,MAAM,UAAU,oBAAoB,CAAC,QAAgC;IACnE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC3D,CAAC;AAGD,MAAM,UAAU,iBAAiB,CAAC,QAAgC;IAChE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;WACnD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ZvecGrepStructureEnrichmentDiagnostics, ZvecGrepContextItem } from "./types.js";
|
|
2
|
+
export declare const RG_STRUCTURE_ENRICH_FILE_LIMIT = 100;
|
|
3
|
+
type StructureEnrichmentResult = {
|
|
4
|
+
items: ZvecGrepContextItem[];
|
|
5
|
+
diagnostics: ZvecGrepStructureEnrichmentDiagnostics;
|
|
6
|
+
};
|
|
7
|
+
export declare function enrichLexicalItemsWithStructure(root: string, items: readonly ZvecGrepContextItem[], fileLimit?: number): Promise<StructureEnrichmentResult>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { relative } from "node:path";
|
|
3
|
+
import { CodeExtractor } from "../extraction/code/extractor.js";
|
|
4
|
+
import { MarkdownExtractor } from "../extraction/markdown/extractor.js";
|
|
5
|
+
import { detectFileType } from "../files/file-type.js";
|
|
6
|
+
import { normalizePath, toDisplayPath } from "../utils/path.js";
|
|
7
|
+
import { sha256Text } from "../utils/hash.js";
|
|
8
|
+
export const RG_STRUCTURE_ENRICH_FILE_LIMIT = 100;
|
|
9
|
+
const STRUCTURE_ENRICH_COLLECTION_ID = "__rg_structure__";
|
|
10
|
+
const STRUCTURE_ENRICH_MAX_FILE_SIZE_BYTES = 1 * 1024 * 1024;
|
|
11
|
+
export async function enrichLexicalItemsWithStructure(root, items, fileLimit = RG_STRUCTURE_ENRICH_FILE_LIMIT) {
|
|
12
|
+
const matchedFiles = uniqueLexicalFilePaths(items);
|
|
13
|
+
const selectedFiles = new Set(matchedFiles.slice(0, fileLimit));
|
|
14
|
+
const fragmentsByFile = new Map();
|
|
15
|
+
const extractors = [
|
|
16
|
+
new CodeExtractor(),
|
|
17
|
+
new MarkdownExtractor(),
|
|
18
|
+
];
|
|
19
|
+
let parsedFiles = 0;
|
|
20
|
+
for (const absolutePath of selectedFiles) {
|
|
21
|
+
const fragments = await parseStructuralFragments(root, absolutePath, extractors);
|
|
22
|
+
fragmentsByFile.set(absolutePath, fragments);
|
|
23
|
+
if (fragments !== null) {
|
|
24
|
+
parsedFiles++;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
let enrichedItems = 0;
|
|
28
|
+
const enrichedFiles = new Set();
|
|
29
|
+
const enriched = items.map((item) => {
|
|
30
|
+
if (item.kind !== "lexical_match") {
|
|
31
|
+
return item;
|
|
32
|
+
}
|
|
33
|
+
const fragments = fragmentsByFile.get(normalizePath(item.file.absolutePath));
|
|
34
|
+
if (!fragments || fragments.length === 0) {
|
|
35
|
+
return item;
|
|
36
|
+
}
|
|
37
|
+
const matchRange = lexicalMatchRange(item);
|
|
38
|
+
if (!matchRange) {
|
|
39
|
+
return item;
|
|
40
|
+
}
|
|
41
|
+
const container = smallestContainingFragment(fragments, matchRange);
|
|
42
|
+
if (!container) {
|
|
43
|
+
return item;
|
|
44
|
+
}
|
|
45
|
+
enrichedItems++;
|
|
46
|
+
enrichedFiles.add(item.file.absolutePath);
|
|
47
|
+
const contextContainer = {
|
|
48
|
+
entityId: container.group ?? container.id,
|
|
49
|
+
range: container.range,
|
|
50
|
+
metadata: container.metadata,
|
|
51
|
+
};
|
|
52
|
+
return {
|
|
53
|
+
...item,
|
|
54
|
+
metadata: container.metadata ?? item.metadata,
|
|
55
|
+
container: contextContainer,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
items: enriched,
|
|
60
|
+
diagnostics: {
|
|
61
|
+
source: "structural_extraction",
|
|
62
|
+
fileLimit,
|
|
63
|
+
matchedFiles: matchedFiles.length,
|
|
64
|
+
parsedFiles,
|
|
65
|
+
enrichedFiles: enrichedFiles.size,
|
|
66
|
+
enrichedItems,
|
|
67
|
+
skippedFiles: Math.max(0, matchedFiles.length - parsedFiles),
|
|
68
|
+
truncated: matchedFiles.length > fileLimit,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function uniqueLexicalFilePaths(items) {
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
const paths = [];
|
|
75
|
+
for (const item of items) {
|
|
76
|
+
if (item.kind !== "lexical_match") {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const absolutePath = normalizePath(item.file.absolutePath);
|
|
80
|
+
if (!seen.has(absolutePath)) {
|
|
81
|
+
seen.add(absolutePath);
|
|
82
|
+
paths.push(absolutePath);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return paths;
|
|
86
|
+
}
|
|
87
|
+
async function parseStructuralFragments(root, absolutePath, extractors) {
|
|
88
|
+
try {
|
|
89
|
+
const file = await fileInfoForStructure(root, absolutePath);
|
|
90
|
+
if (!file) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const text = await readFile(absolutePath, "utf8");
|
|
94
|
+
const source = {
|
|
95
|
+
kind: "text",
|
|
96
|
+
file,
|
|
97
|
+
text,
|
|
98
|
+
};
|
|
99
|
+
const extractor = extractors.find((candidate) => candidate.supports(source));
|
|
100
|
+
return extractor ? await extractor.extract(source) : null;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function fileInfoForStructure(root, absolutePath) {
|
|
107
|
+
const info = await stat(absolutePath).catch(() => null);
|
|
108
|
+
if (!info || !info.isFile() || info.size <= 0 || info.size > STRUCTURE_ENRICH_MAX_FILE_SIZE_BYTES) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const detected = detectFileType(absolutePath);
|
|
112
|
+
if (!detected || !isStructurallyEnrichableFile(detected)) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
id: makeStructureFileId(absolutePath),
|
|
117
|
+
collectionId: STRUCTURE_ENRICH_COLLECTION_ID,
|
|
118
|
+
absolutePath: normalizePath(absolutePath),
|
|
119
|
+
relativePath: toDisplayPath(relative(root, absolutePath) || "."),
|
|
120
|
+
rootPath: root,
|
|
121
|
+
sizeBytes: info.size,
|
|
122
|
+
lastModifiedTime: info.mtimeMs,
|
|
123
|
+
kind: detected.kind,
|
|
124
|
+
format: detected.format,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function isStructurallyEnrichableFile(file) {
|
|
128
|
+
return file.kind === "code"
|
|
129
|
+
|| (file.kind === "text" && file.format === "markdown");
|
|
130
|
+
}
|
|
131
|
+
function lexicalMatchRange(item) {
|
|
132
|
+
const range = item.excerptRange ?? item.range;
|
|
133
|
+
return range.kind === "text" ? range : null;
|
|
134
|
+
}
|
|
135
|
+
function smallestContainingFragment(fragments, matchRange) {
|
|
136
|
+
let best = null;
|
|
137
|
+
for (const fragment of fragments) {
|
|
138
|
+
if (!textRangeContains(fragment.range, matchRange)) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (!best || compareFragmentContainer(fragment, best) < 0) {
|
|
142
|
+
best = fragment;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return best;
|
|
146
|
+
}
|
|
147
|
+
function textRangeContains(outer, inner) {
|
|
148
|
+
return outer.kind === "text"
|
|
149
|
+
&& outer.startLine <= inner.startLine
|
|
150
|
+
&& outer.endLine >= inner.endLine;
|
|
151
|
+
}
|
|
152
|
+
function compareFragmentContainer(left, right) {
|
|
153
|
+
const leftRange = left.range;
|
|
154
|
+
const rightRange = right.range;
|
|
155
|
+
const leftLines = leftRange.kind === "text" ? leftRange.endLine - leftRange.startLine : Number.MAX_SAFE_INTEGER;
|
|
156
|
+
const rightLines = rightRange.kind === "text" ? rightRange.endLine - rightRange.startLine : Number.MAX_SAFE_INTEGER;
|
|
157
|
+
return leftLines - rightLines
|
|
158
|
+
|| fragmentSpecificityScore(right) - fragmentSpecificityScore(left)
|
|
159
|
+
|| left.id.localeCompare(right.id);
|
|
160
|
+
}
|
|
161
|
+
function fragmentSpecificityScore(fragment) {
|
|
162
|
+
const metadata = fragment.metadata;
|
|
163
|
+
if (!metadata) {
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
if (metadata.kind === "code") {
|
|
167
|
+
return metadata.symbolName ? 2 : 1;
|
|
168
|
+
}
|
|
169
|
+
return metadata.heading ? 1 : 0;
|
|
170
|
+
}
|
|
171
|
+
function makeStructureFileId(absolutePath) {
|
|
172
|
+
return sha256Text(`${STRUCTURE_ENRICH_COLLECTION_ID}\0${normalizePath(absolutePath)}`);
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=structure-enrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure-enrichment.js","sourceRoot":"","sources":["../../../src/engine/service/structure-enrichment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAWxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AASlD,MAAM,8BAA8B,GAAG,kBAAkB,CAAC;AAC1D,MAAM,oCAAoC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAG7D,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,IAAY,EACZ,KAAqC,EACrC,SAAS,GAAG,8BAA8B;IAE1C,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAmC,CAAC;IACnE,MAAM,UAAU,GAAyB;QACvC,IAAI,aAAa,EAAE;QACnB,IAAI,iBAAiB,EAAE;KACxB,CAAC;IACF,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACjF,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,0BAA0B,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,aAAa,EAAE,CAAC;QAChB,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE1C,MAAM,gBAAgB,GAA6B;YACjD,QAAQ,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,EAAE;YACzC,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;SAC7B,CAAC;QAEF,OAAO;YACL,GAAG,IAAI;YACP,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;YAC7C,SAAS,EAAE,gBAAgB;SAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE;YACX,MAAM,EAAE,uBAAuB;YAC/B,SAAS;YACT,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,WAAW;YACX,aAAa,EAAE,aAAa,CAAC,IAAI;YACjC,aAAa;YACb,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,WAAW,CAAC;YAC5D,SAAS,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS;SAC3C;KACF,CAAC;AACJ,CAAC;AAGD,SAAS,sBAAsB,CAAC,KAAqC;IACnE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAGD,KAAK,UAAU,wBAAwB,CACrC,IAAY,EACZ,YAAoB,EACpB,UAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,MAAM;YACZ,IAAI;YACJ,IAAI;SACI,CAAC;QACX,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAGD,KAAK,UAAU,oBAAoB,CAAC,IAAY,EAAE,YAAoB;IACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,oCAAoC,EAAE,CAAC;QAClG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,EAAE,EAAE,mBAAmB,CAAC,YAAY,CAAC;QACrC,YAAY,EAAE,8BAA8B;QAC5C,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC;QACzC,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC;QAChE,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI,CAAC,IAAI;QACpB,gBAAgB,EAAE,IAAI,CAAC,OAAO;QAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC;AAGD,SAAS,4BAA4B,CACnC,IAAuC;IAEvC,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM;WACtB,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAC5D,CAAC;AAGD,SAAS,iBAAiB,CAAC,IAAyB;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC;IAC9C,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAGD,SAAS,0BAA0B,CACjC,SAAoC,EACpC,UAA6C;IAE7C,IAAI,IAAI,GAA0B,IAAI,CAAC;IAEvC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,IAAI,GAAG,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAGD,SAAS,iBAAiB,CACxB,KAAY,EACZ,KAAwC;IAExC,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM;WACvB,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;WAClC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AACtC,CAAC;AAGD,SAAS,wBAAwB,CAAC,IAAoB,EAAE,KAAqB;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;IAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAChH,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAEpH,OAAO,SAAS,GAAG,UAAU;WACxB,wBAAwB,CAAC,KAAK,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC;WAChE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAGD,SAAS,wBAAwB,CAAC,QAAwB;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAGD,SAAS,mBAAmB,CAAC,YAAoB;IAC/C,OAAO,UAAU,CAAC,GAAG,8BAA8B,KAAK,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EmbeddingModel } from "../models/embeddings.js";
|
|
2
|
-
import type { CodeSymbolType, CollectionIndexStatus, CollectionInfo, Content, EntityMetadata, IndexProgress, IndexResult, Range, RootPath, SearchPlanRoute, SearchHitTrace, SearchMatchedBy } from "../types.js";
|
|
2
|
+
import type { CodeSymbolType, CollectionIndexPolicy, CollectionIndexStatus, CollectionInfo, Content, EntityMetadata, IndexProgress, IndexResult, Range, RootPath, SearchPlanRoute, SearchHitTrace, SearchMatchedBy, TimingEntry } from "../types.js";
|
|
3
3
|
export type CreateZvecGrepOptions = {
|
|
4
4
|
root?: string;
|
|
5
5
|
home?: string;
|
|
@@ -12,7 +12,7 @@ export type CreateZvecGrepOptions = {
|
|
|
12
12
|
embeddingParallelism?: number;
|
|
13
13
|
defaultEmbedding?: boolean;
|
|
14
14
|
};
|
|
15
|
-
export type
|
|
15
|
+
export type ZvecGrepIndexOptions = {
|
|
16
16
|
root?: string;
|
|
17
17
|
rootPaths?: readonly (string | RootPath)[];
|
|
18
18
|
rebuild?: boolean;
|
|
@@ -27,10 +27,11 @@ export type ZvecGrepInfoOptions = {
|
|
|
27
27
|
};
|
|
28
28
|
export type ZvecGrepInfoResult = {
|
|
29
29
|
root: string;
|
|
30
|
-
|
|
30
|
+
indexed: boolean;
|
|
31
|
+
indexPolicy: CollectionIndexPolicy | "undecided";
|
|
31
32
|
home: string;
|
|
32
33
|
indexPath: string;
|
|
33
|
-
source: "index" | "
|
|
34
|
+
source: "index" | "unindexed";
|
|
34
35
|
collection?: CollectionInfo;
|
|
35
36
|
status?: CollectionIndexStatus | null;
|
|
36
37
|
suggestion?: string;
|
|
@@ -77,6 +78,11 @@ export type ZvecGrepContextFile = {
|
|
|
77
78
|
rootPath?: string;
|
|
78
79
|
};
|
|
79
80
|
export type ZvecGrepContextItemKind = "indexed_entity" | "lexical_match";
|
|
81
|
+
export type ZvecGrepContextContainer = {
|
|
82
|
+
entityId: string;
|
|
83
|
+
range: Range;
|
|
84
|
+
metadata?: EntityMetadata;
|
|
85
|
+
};
|
|
80
86
|
export type ZvecGrepContextItem = {
|
|
81
87
|
kind: ZvecGrepContextItemKind;
|
|
82
88
|
rank: number;
|
|
@@ -91,6 +97,7 @@ export type ZvecGrepContextItem = {
|
|
|
91
97
|
matchedBy: SearchMatchedBy | "lexical";
|
|
92
98
|
metadata?: EntityMetadata;
|
|
93
99
|
entityId?: string;
|
|
100
|
+
container?: ZvecGrepContextContainer;
|
|
94
101
|
trace?: SearchHitTrace;
|
|
95
102
|
};
|
|
96
103
|
export type ZvecGrepContextCollection = {
|
|
@@ -109,6 +116,16 @@ export type ZvecGrepLexicalFallbackDiagnostics = {
|
|
|
109
116
|
limit?: number;
|
|
110
117
|
truncated: boolean;
|
|
111
118
|
};
|
|
119
|
+
export type ZvecGrepStructureEnrichmentDiagnostics = {
|
|
120
|
+
source: "structural_extraction";
|
|
121
|
+
fileLimit: number;
|
|
122
|
+
matchedFiles: number;
|
|
123
|
+
parsedFiles: number;
|
|
124
|
+
enrichedFiles: number;
|
|
125
|
+
enrichedItems: number;
|
|
126
|
+
skippedFiles: number;
|
|
127
|
+
truncated: boolean;
|
|
128
|
+
};
|
|
112
129
|
export type ZvecGrepIndexDiagnostics = {
|
|
113
130
|
hitsReturned: number;
|
|
114
131
|
routes: readonly {
|
|
@@ -121,6 +138,8 @@ export type ZvecGrepContextDiagnostics = {
|
|
|
121
138
|
emptyReason?: "no_matches" | "no_searchable_files" | "index_unavailable" | "search_failed";
|
|
122
139
|
index?: ZvecGrepIndexDiagnostics;
|
|
123
140
|
fallback?: ZvecGrepLexicalFallbackDiagnostics;
|
|
141
|
+
structure?: ZvecGrepStructureEnrichmentDiagnostics;
|
|
142
|
+
timings?: readonly TimingEntry[];
|
|
124
143
|
};
|
|
125
144
|
export type ZvecGrepContextResult = {
|
|
126
145
|
query: string;
|
|
@@ -149,7 +168,8 @@ export type ZvecGrepCollections = {
|
|
|
149
168
|
export type ZvecGrep = {
|
|
150
169
|
readonly root: string;
|
|
151
170
|
readonly collections: ZvecGrepCollections;
|
|
152
|
-
|
|
171
|
+
index(options?: ZvecGrepIndexOptions): Promise<IndexResult>;
|
|
172
|
+
disableIndex(options?: ZvecGrepInfoOptions): Promise<ZvecGrepInfoResult>;
|
|
153
173
|
info(options?: ZvecGrepInfoOptions): Promise<ZvecGrepInfoResult>;
|
|
154
174
|
context(options: ZvecGrepContextOptions): Promise<ZvecGrepContextResult>;
|
|
155
175
|
close(): Promise<void>;
|