@zvec/zvec-grep 0.1.1 → 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.
Files changed (132) hide show
  1. package/README.md +12 -12
  2. package/README_CN.md +13 -13
  3. package/dist/cli/args.js +35 -20
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/commands.js +34 -16
  6. package/dist/cli/commands.js.map +1 -1
  7. package/dist/cli/format/context.js +34 -9
  8. package/dist/cli/format/context.js.map +1 -1
  9. package/dist/cli/format/debug.js +14 -0
  10. package/dist/cli/format/debug.js.map +1 -1
  11. package/dist/cli/format/status.d.ts +1 -1
  12. package/dist/cli/format/status.js +18 -6
  13. package/dist/cli/format/status.js.map +1 -1
  14. package/dist/cli/help.js +12 -9
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/cli/index.js +0 -0
  17. package/dist/cli/types.d.ts +3 -2
  18. package/dist/cli/types.js.map +1 -1
  19. package/dist/engine/collection/index.d.ts +12 -7
  20. package/dist/engine/collection/index.js +374 -52
  21. package/dist/engine/collection/index.js.map +1 -1
  22. package/dist/engine/{pipeline/indexing/extractor → extraction}/code/adapter.d.ts +1 -1
  23. package/dist/engine/extraction/code/adapter.js.map +1 -0
  24. package/dist/engine/{pipeline/indexing/extractor → extraction}/code/extractor.d.ts +1 -1
  25. package/dist/engine/{pipeline/indexing/extractor → extraction}/code/extractor.js +2 -2
  26. package/dist/engine/extraction/code/extractor.js.map +1 -0
  27. package/dist/engine/extraction/code/families/c-family.js.map +1 -0
  28. package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/js-ts.d.ts +1 -1
  29. package/dist/engine/extraction/code/families/js-ts.js.map +1 -0
  30. package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/metadata.d.ts +1 -1
  31. package/dist/engine/extraction/code/families/metadata.js.map +1 -0
  32. package/dist/engine/extraction/code/families/name-field.js.map +1 -0
  33. package/dist/engine/extraction/code/languages/c.js.map +1 -0
  34. package/dist/engine/extraction/code/languages/cpp.js.map +1 -0
  35. package/dist/engine/extraction/code/languages/go.js.map +1 -0
  36. package/dist/engine/extraction/code/languages/java.js.map +1 -0
  37. package/dist/engine/extraction/code/languages/javascript.js.map +1 -0
  38. package/dist/engine/extraction/code/languages/python.js.map +1 -0
  39. package/dist/engine/extraction/code/languages/rust.js.map +1 -0
  40. package/dist/engine/extraction/code/languages/typescript.js.map +1 -0
  41. package/dist/engine/{pipeline/indexing → extraction}/ids.js +1 -1
  42. package/dist/engine/extraction/ids.js.map +1 -0
  43. package/dist/engine/{pipeline/indexing/extractor → extraction}/index.d.ts +1 -1
  44. package/dist/engine/{pipeline/indexing/extractor → extraction}/index.js +2 -2
  45. package/dist/engine/extraction/index.js.map +1 -0
  46. package/dist/engine/{pipeline/indexing/extractor → extraction}/markdown/extractor.d.ts +1 -1
  47. package/dist/engine/{pipeline/indexing/extractor → extraction}/markdown/extractor.js +1 -1
  48. package/dist/engine/extraction/markdown/extractor.js.map +1 -0
  49. package/dist/engine/extraction/tree-sitter/grammar.js.map +1 -0
  50. package/dist/engine/extraction/tree-sitter/nodes.js.map +1 -0
  51. package/dist/engine/extraction/tree-sitter/parser.js.map +1 -0
  52. package/dist/engine/files/file-type.d.ts +5 -0
  53. package/dist/engine/files/file-type.js +119 -0
  54. package/dist/engine/files/file-type.js.map +1 -0
  55. package/dist/engine/pipeline/indexing/index.js +37 -31
  56. package/dist/engine/pipeline/indexing/index.js.map +1 -1
  57. package/dist/engine/pipeline/indexing/scanner/index.js +2 -118
  58. package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
  59. package/dist/engine/pipeline/search/index.js +57 -49
  60. package/dist/engine/pipeline/search/index.js.map +1 -1
  61. package/dist/engine/service/index.d.ts +1 -1
  62. package/dist/engine/service/root.d.ts +2 -0
  63. package/dist/engine/service/root.js +14 -5
  64. package/dist/engine/service/root.js.map +1 -1
  65. package/dist/engine/service/structure-enrichment.d.ts +8 -0
  66. package/dist/engine/service/structure-enrichment.js +174 -0
  67. package/dist/engine/service/structure-enrichment.js.map +1 -0
  68. package/dist/engine/service/types.d.ts +25 -5
  69. package/dist/engine/service/zvec-grep.js +168 -63
  70. package/dist/engine/service/zvec-grep.js.map +1 -1
  71. package/dist/engine/storage/zvec.d.ts +25 -9
  72. package/dist/engine/storage/zvec.js +231 -30
  73. package/dist/engine/storage/zvec.js.map +1 -1
  74. package/dist/engine/types.d.ts +11 -2
  75. package/dist/engine/utils/timing.d.ts +19 -0
  76. package/dist/engine/utils/timing.js +87 -0
  77. package/dist/engine/utils/timing.js.map +1 -0
  78. package/dist/index.d.ts +2 -2
  79. package/dist/index.js.map +1 -1
  80. package/package.json +1 -1
  81. package/skills/zvec-grep/SKILL.md +12 -12
  82. package/skills/zvec-grep/agents/openai.yaml +1 -1
  83. package/dist/engine/pipeline/indexing/extractor/code/adapter.js.map +0 -1
  84. package/dist/engine/pipeline/indexing/extractor/code/extractor.js.map +0 -1
  85. package/dist/engine/pipeline/indexing/extractor/code/families/c-family.js.map +0 -1
  86. package/dist/engine/pipeline/indexing/extractor/code/families/js-ts.js.map +0 -1
  87. package/dist/engine/pipeline/indexing/extractor/code/families/metadata.js.map +0 -1
  88. package/dist/engine/pipeline/indexing/extractor/code/families/name-field.js.map +0 -1
  89. package/dist/engine/pipeline/indexing/extractor/code/languages/c.js.map +0 -1
  90. package/dist/engine/pipeline/indexing/extractor/code/languages/cpp.js.map +0 -1
  91. package/dist/engine/pipeline/indexing/extractor/code/languages/go.js.map +0 -1
  92. package/dist/engine/pipeline/indexing/extractor/code/languages/java.js.map +0 -1
  93. package/dist/engine/pipeline/indexing/extractor/code/languages/javascript.js.map +0 -1
  94. package/dist/engine/pipeline/indexing/extractor/code/languages/python.js.map +0 -1
  95. package/dist/engine/pipeline/indexing/extractor/code/languages/rust.js.map +0 -1
  96. package/dist/engine/pipeline/indexing/extractor/code/languages/typescript.js.map +0 -1
  97. package/dist/engine/pipeline/indexing/extractor/index.js.map +0 -1
  98. package/dist/engine/pipeline/indexing/extractor/markdown/extractor.js.map +0 -1
  99. package/dist/engine/pipeline/indexing/extractor/tree-sitter/grammar.js.map +0 -1
  100. package/dist/engine/pipeline/indexing/extractor/tree-sitter/nodes.js.map +0 -1
  101. package/dist/engine/pipeline/indexing/extractor/tree-sitter/parser.js.map +0 -1
  102. package/dist/engine/pipeline/indexing/ids.js.map +0 -1
  103. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/adapter.js +0 -0
  104. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/c-family.d.ts +0 -0
  105. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/c-family.js +0 -0
  106. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/js-ts.js +0 -0
  107. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/metadata.js +0 -0
  108. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/name-field.d.ts +0 -0
  109. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/families/name-field.js +0 -0
  110. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/c.d.ts +0 -0
  111. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/c.js +0 -0
  112. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/cpp.d.ts +0 -0
  113. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/cpp.js +0 -0
  114. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/go.d.ts +0 -0
  115. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/go.js +0 -0
  116. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/java.d.ts +0 -0
  117. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/java.js +0 -0
  118. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/javascript.d.ts +0 -0
  119. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/javascript.js +0 -0
  120. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/python.d.ts +0 -0
  121. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/python.js +0 -0
  122. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/rust.d.ts +0 -0
  123. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/rust.js +0 -0
  124. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/typescript.d.ts +0 -0
  125. /package/dist/engine/{pipeline/indexing/extractor → extraction}/code/languages/typescript.js +0 -0
  126. /package/dist/engine/{pipeline/indexing → extraction}/ids.d.ts +0 -0
  127. /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/grammar.d.ts +0 -0
  128. /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/grammar.js +0 -0
  129. /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/nodes.d.ts +0 -0
  130. /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/nodes.js +0 -0
  131. /package/dist/engine/{pipeline/indexing/extractor → extraction}/tree-sitter/parser.d.ts +0 -0
  132. /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 REGISTRY_FILE = "registry.json";
7
- const COLLECTION_FILE = "collection.json";
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 (hasAnonymousIndex(location)) {
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, REGISTRY_FILE))
42
- && existsSync(join(location.collectionPath, COLLECTION_FILE));
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,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAW1C,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,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,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,iBAAiB,CAAC,QAAgC;IAChE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;WAChD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;AAClE,CAAC"}
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 ZvecGrepInitOptions = {
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
- initialized: boolean;
30
+ indexed: boolean;
31
+ indexPolicy: CollectionIndexPolicy | "undecided";
31
32
  home: string;
32
33
  indexPath: string;
33
- source: "index" | "uninitialized";
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
- init(options?: ZvecGrepInitOptions): Promise<IndexResult>;
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>;