@vibgrate/cli 2026.825.1 → 2026.825.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/{agent-IHNUBFBM.js → agent-DHQYEHVW.js} +13 -13
  2. package/dist/{agent-IHNUBFBM.js.map → agent-DHQYEHVW.js.map} +1 -1
  3. package/dist/{approvals-HRIMDIX3.js → approvals-KBM72NU2.js} +5 -5
  4. package/dist/{approvals-HRIMDIX3.js.map → approvals-KBM72NU2.js.map} +1 -1
  5. package/dist/{attach-L43JUJ7A.js → attach-O74NL4M5.js} +3 -3
  6. package/dist/{attach-L43JUJ7A.js.map → attach-O74NL4M5.js.map} +1 -1
  7. package/dist/{baseline-EZQ7SCRT.js → baseline-4X6MQBDA.js} +3 -3
  8. package/dist/{baseline-EZQ7SCRT.js.map → baseline-4X6MQBDA.js.map} +1 -1
  9. package/dist/{chunk-X34HVFZ6.js → chunk-27TS2AUJ.js} +8 -8
  10. package/dist/{chunk-X34HVFZ6.js.map → chunk-27TS2AUJ.js.map} +1 -1
  11. package/dist/{chunk-RHYRMMN3.js → chunk-2NUS5BOR.js} +3 -3
  12. package/dist/{chunk-RHYRMMN3.js.map → chunk-2NUS5BOR.js.map} +1 -1
  13. package/dist/{chunk-TLYNLQL2.js → chunk-3E7QT4NE.js} +9 -9
  14. package/dist/{chunk-TLYNLQL2.js.map → chunk-3E7QT4NE.js.map} +1 -1
  15. package/dist/{chunk-L3YEEJ6U.js → chunk-6MIJLO5B.js} +3 -3
  16. package/dist/{chunk-L3YEEJ6U.js.map → chunk-6MIJLO5B.js.map} +1 -1
  17. package/dist/{chunk-5BFA532E.js → chunk-7M4E7UGX.js} +3 -3
  18. package/dist/{chunk-5BFA532E.js.map → chunk-7M4E7UGX.js.map} +1 -1
  19. package/dist/{chunk-M7O6IVKN.js → chunk-BICZR6UJ.js} +3 -3
  20. package/dist/{chunk-M7O6IVKN.js.map → chunk-BICZR6UJ.js.map} +1 -1
  21. package/dist/{chunk-BCK2NIBM.js → chunk-DIZ5KI5Q.js} +6 -6
  22. package/dist/{chunk-BCK2NIBM.js.map → chunk-DIZ5KI5Q.js.map} +1 -1
  23. package/dist/{chunk-QTQRM7HQ.js → chunk-E3XVIFSH.js} +3 -3
  24. package/dist/{chunk-QTQRM7HQ.js.map → chunk-E3XVIFSH.js.map} +1 -1
  25. package/dist/{chunk-B5X246UH.js → chunk-FQHWPOTS.js} +3 -3
  26. package/dist/{chunk-B5X246UH.js.map → chunk-FQHWPOTS.js.map} +1 -1
  27. package/dist/chunk-G3ACLBMG.js +6 -0
  28. package/dist/{chunk-KFLNWYZG.js.map → chunk-G3ACLBMG.js.map} +1 -1
  29. package/dist/{chunk-CIC3NY2D.js → chunk-GR7SFCQJ.js} +12 -12
  30. package/dist/{chunk-CIC3NY2D.js.map → chunk-GR7SFCQJ.js.map} +1 -1
  31. package/dist/{chunk-Y3X3ORQ3.js → chunk-GWSJYDK7.js} +5 -5
  32. package/dist/{chunk-Y3X3ORQ3.js.map → chunk-GWSJYDK7.js.map} +1 -1
  33. package/dist/{chunk-ECQFRZJI.js → chunk-HFQIYM6E.js} +4 -4
  34. package/dist/{chunk-ECQFRZJI.js.map → chunk-HFQIYM6E.js.map} +1 -1
  35. package/dist/{chunk-GRMZU24V.js → chunk-IJVWKZRS.js} +3 -3
  36. package/dist/{chunk-GRMZU24V.js.map → chunk-IJVWKZRS.js.map} +1 -1
  37. package/dist/{chunk-YIRDV4YJ.js → chunk-JAEHLTVX.js} +3 -3
  38. package/dist/{chunk-YIRDV4YJ.js.map → chunk-JAEHLTVX.js.map} +1 -1
  39. package/dist/{chunk-LUJ4H4RJ.js → chunk-K3SXWOTT.js} +3 -3
  40. package/dist/{chunk-LUJ4H4RJ.js.map → chunk-K3SXWOTT.js.map} +1 -1
  41. package/dist/{chunk-JSZ46IDG.js → chunk-KYM55VZX.js} +6 -6
  42. package/dist/{chunk-JSZ46IDG.js.map → chunk-KYM55VZX.js.map} +1 -1
  43. package/dist/{chunk-YP243ZKD.js → chunk-L7GCJNDT.js} +3 -3
  44. package/dist/{chunk-YP243ZKD.js.map → chunk-L7GCJNDT.js.map} +1 -1
  45. package/dist/{chunk-UUVOA6WD.js → chunk-NS4DL3QR.js} +8 -8
  46. package/dist/{chunk-UUVOA6WD.js.map → chunk-NS4DL3QR.js.map} +1 -1
  47. package/dist/{chunk-S3HMG6BC.js → chunk-NZES47ST.js} +3 -3
  48. package/dist/{chunk-S3HMG6BC.js.map → chunk-NZES47ST.js.map} +1 -1
  49. package/dist/{chunk-FVBN4E5C.js → chunk-OIUVWCKM.js} +3 -3
  50. package/dist/{chunk-FVBN4E5C.js.map → chunk-OIUVWCKM.js.map} +1 -1
  51. package/dist/{chunk-DLNNNESQ.js → chunk-SIXWWQ6S.js} +3 -3
  52. package/dist/{chunk-DLNNNESQ.js.map → chunk-SIXWWQ6S.js.map} +1 -1
  53. package/dist/{chunk-6VLOI2ZP.js → chunk-SYMJSRYF.js} +3 -3
  54. package/dist/{chunk-6VLOI2ZP.js.map → chunk-SYMJSRYF.js.map} +1 -1
  55. package/dist/{chunk-LKJIYGO5.js → chunk-TT2J2TB6.js} +6 -6
  56. package/dist/{chunk-LKJIYGO5.js.map → chunk-TT2J2TB6.js.map} +1 -1
  57. package/dist/{chunk-4PCFSRYH.js → chunk-VMPKOMHG.js} +5 -5
  58. package/dist/{chunk-4PCFSRYH.js.map → chunk-VMPKOMHG.js.map} +1 -1
  59. package/dist/cli.js +49 -49
  60. package/dist/{daemon-WPX2SBVV.js → daemon-RZS5FPIW.js} +9 -9
  61. package/dist/{daemon-WPX2SBVV.js.map → daemon-RZS5FPIW.js.map} +1 -1
  62. package/dist/embed-worker-main.js +3 -3
  63. package/dist/{ensure-map-MLI4XCRV.js → ensure-map-DL2S774J.js} +14 -14
  64. package/dist/{ensure-map-MLI4XCRV.js.map → ensure-map-DL2S774J.js.map} +1 -1
  65. package/dist/{graph-backend-LK5EFQXN.js → graph-backend-JXARVT3R.js} +7 -7
  66. package/dist/{graph-backend-LK5EFQXN.js.map → graph-backend-JXARVT3R.js.map} +1 -1
  67. package/dist/index.d.ts +1 -1
  68. package/dist/index.js +15 -15
  69. package/dist/{interactive-K446F42I.js → interactive-2XRBRFRB.js} +25 -25
  70. package/dist/{interactive-K446F42I.js.map → interactive-2XRBRFRB.js.map} +1 -1
  71. package/dist/load-7C5VETRD.js +11 -0
  72. package/dist/{load-2FRH37JY.js.map → load-7C5VETRD.js.map} +1 -1
  73. package/dist/parse-worker.js +2 -2
  74. package/dist/{run-outcome-4ETNDPX6.js → run-outcome-TMB5TJNA.js} +5 -5
  75. package/dist/{run-outcome-4ETNDPX6.js.map → run-outcome-TMB5TJNA.js.map} +1 -1
  76. package/dist/{runtime-session-RMSKXFIJ.js → runtime-session-Y23NVY7R.js} +9 -9
  77. package/dist/{runtime-session-RMSKXFIJ.js.map → runtime-session-Y23NVY7R.js.map} +1 -1
  78. package/dist/{session-22BGDYWF.js → session-KXT2ZTPE.js} +8 -8
  79. package/dist/{session-22BGDYWF.js.map → session-KXT2ZTPE.js.map} +1 -1
  80. package/dist/{stream-json-MD7MSSCH.js → stream-json-NW6AOE47.js} +13 -13
  81. package/dist/{stream-json-MD7MSSCH.js.map → stream-json-NW6AOE47.js.map} +1 -1
  82. package/dist/version-7ABYXWOZ.js +4 -0
  83. package/dist/{version-FRUT6RI2.js.map → version-7ABYXWOZ.js.map} +1 -1
  84. package/dist/{vg-mcp-bridge-H6I3ALUW.js → vg-mcp-bridge-LXBHKEFR.js} +8 -8
  85. package/dist/{vg-mcp-bridge-H6I3ALUW.js.map → vg-mcp-bridge-LXBHKEFR.js.map} +1 -1
  86. package/dist/{vgd-TW7HU2PH.js → vgd-RW7HCEIP.js} +8 -8
  87. package/dist/vgd-RW7HCEIP.js.map +1 -0
  88. package/package.json +1 -1
  89. package/dist/chunk-KFLNWYZG.js +0 -6
  90. package/dist/load-2FRH37JY.js +0 -11
  91. package/dist/version-FRUT6RI2.js +0 -4
  92. package/dist/vgd-TW7HU2PH.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine/lockfile.ts","../src/engine/lib.ts","../src/engine/literal-scan.ts","../src/engine/search.ts"],"names":["fs","path","fs3","path3","os2","resolve","path4","fs4","sep"],"mappings":"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","file":"chunk-S3HMG6BC.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DepRecord } from './drift.js';\n\n/**\n * Lockfile-pinned version resolution (VG-LIB-SUPERSET-PLAN A.2 / D13).\n *\n * The version we serve docs for should be the one your **lockfile** pins, not\n * whatever happens to be unpacked in `node_modules` (which is empty in CI / a\n * fresh clone). This reads the pin deterministically and offline. Where a lockfile\n * isn't present or parseable we return `undefined` and the caller falls back to the\n * installed tree, then the declared range — we never fabricate a version.\n *\n * npm covers `package-lock.json` (v1/v2/v3), `pnpm-lock.yaml` (v6/v9) and\n * `yarn.lock`. Other ecosystems follow the same shape and return `undefined`\n * until their parser lands — honest degradation, no false mismatch.\n */\nexport function lockfileVersion(root: string, ecosystem: DepRecord['ecosystem'], name: string): string | undefined {\n if (ecosystem === 'npm') return packageLockVersion(root, name) ?? pnpmLockVersion(root, name) ?? yarnLockVersion(root, name);\n if (ecosystem === 'pypi') return pypiLockVersion(root, name);\n if (ecosystem === 'rust') return tomlPackageLock(root, 'Cargo.lock', name, rustName);\n if (ecosystem === 'ruby') return gemfileLock(root, name);\n if (ecosystem === 'php') return composerLock(root, name);\n if (ecosystem === 'dotnet') return packagesLock(root, name);\n if (ecosystem === 'swift') return packageResolved(root, name);\n if (ecosystem === 'dart') return pubspecLock(root, name);\n if (ecosystem === 'java') return gradleLock(root, name);\n return undefined;\n}\n\n/** Gradle `gradle.lockfile` — lines `group:artifact:version=configurations…`. */\nfunction gradleLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'gradle.lockfile'), 'utf8');\n } catch {\n return undefined;\n }\n const m = new RegExp(`^${escapeRegExp(name)}:([^=\\\\s]+)=`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** Swift `Package.resolved` — JSON pins (v2/v3 `pins[]`, v1 `object.pins[]`); match `identity`. */\nfunction packageResolved(root: string, name: string): string | undefined {\n let data: {\n pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }>;\n object?: { pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }> };\n };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Package.resolved'), 'utf8'));\n } catch {\n return undefined;\n }\n const pins = data.pins ?? data.object?.pins;\n if (!Array.isArray(pins)) return undefined;\n const target = name.toLowerCase();\n for (const p of pins) {\n const id = (p.identity ?? p.package ?? '').toLowerCase();\n if (id === target && p.state?.version) return p.state.version;\n }\n return undefined;\n}\n\n/** Dart `pubspec.lock` — YAML; each ` <name>:` block carries `version: \"x.y.z\"`. */\nfunction pubspecLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'pubspec.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inPkg = false;\n for (const line of text.split('\\n')) {\n const key = /^ ([A-Za-z0-9_.]+):\\s*$/.exec(line);\n if (key) {\n inPkg = key[1] === name;\n continue;\n }\n if (inPkg) {\n const vm = /^\\s+version:\\s*\"?([^\"\\s]+)\"?/.exec(line);\n if (vm) return vm[1];\n }\n }\n return undefined;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Ruby `Gemfile.lock` — the `specs:` block lists ` name (1.2.3)` (4-space indent). */\nfunction gemfileLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'Gemfile.lock'), 'utf8');\n } catch {\n return undefined;\n }\n // Spec definitions are 4-space-indented with a concrete (digit-leading) version;\n // nested dep constraints (6-space) and the DEPENDENCIES list (2-space) don't match.\n const m = new RegExp(`^ ${escapeRegExp(name)} \\\\((\\\\d[^)]*)\\\\)`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** PHP `composer.lock` — JSON `packages` / `packages-dev` arrays of `{ name, version }`. */\nfunction composerLock(root: string, name: string): string | undefined {\n let data: Record<string, Array<{ name?: string; version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'composer.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n for (const section of ['packages', 'packages-dev']) {\n const arr = data[section];\n if (!Array.isArray(arr)) continue;\n const p = arr.find((x) => x && x.name === name);\n if (p && typeof p.version === 'string') return p.version.replace(/^v/, '');\n }\n return undefined;\n}\n\n/** .NET `packages.lock.json` — `dependencies.<framework>.<id>.resolved` (ids case-insensitive). */\nfunction packagesLock(root: string, name: string): string | undefined {\n let data: { dependencies?: Record<string, Record<string, { resolved?: string }>> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'packages.lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = name.toLowerCase();\n for (const fw of Object.values(data.dependencies ?? {})) {\n if (!fw || typeof fw !== 'object') continue;\n for (const [id, v] of Object.entries(fw)) {\n if (id.toLowerCase() === target && v && typeof v.resolved === 'string') return v.resolved;\n }\n }\n return undefined;\n}\n\n/** PEP 503 name normalisation — names are case-insensitive and -/_/. are equivalent. */\nfunction pep503(name: string): string {\n return name.trim().toLowerCase().replace(/[-_.]+/g, '-');\n}\n\n/** Crate names: case-insensitive on crates.io; published name used verbatim otherwise. */\nfunction rustName(name: string): string {\n return name.trim().toLowerCase();\n}\n\n/** Python: `poetry.lock` / `uv.lock` (TOML `[[package]]`), then `Pipfile.lock` (JSON). */\nfunction pypiLockVersion(root: string, name: string): string | undefined {\n return (\n tomlPackageLock(root, 'poetry.lock', name, pep503) ??\n tomlPackageLock(root, 'uv.lock', name, pep503) ??\n pipfileLock(root, name)\n );\n}\n\n/**\n * Parse a TOML lockfile of `[[package]]` tables (poetry, uv, and Cargo.lock share this shape) for\n * the pinned version, without a TOML dependency: split on the array-of-tables\n * header and match `name`/`version` string keys within a block.\n */\nfunction tomlPackageLock(root: string, file: string, name: string, normalize: (s: string) => string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, file), 'utf8');\n } catch {\n return undefined;\n }\n const target = normalize(name);\n for (const block of text.split(/\\[\\[package\\]\\]/)) {\n const nm = /(?:^|\\n)\\s*name\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (nm && normalize(nm[1]) === target) {\n const ver = /(?:^|\\n)\\s*version\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (ver) return ver[1];\n }\n }\n return undefined;\n}\n\n/** Pipenv `Pipfile.lock` — JSON; versions look like `\"==1.2.3\"`. */\nfunction pipfileLock(root: string, name: string): string | undefined {\n let data: Record<string, Record<string, { version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Pipfile.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = pep503(name);\n for (const section of ['default', 'develop']) {\n const deps = data[section];\n if (!deps || typeof deps !== 'object') continue;\n for (const [k, v] of Object.entries(deps)) {\n if (pep503(k) === target && v && typeof v.version === 'string') {\n return v.version.replace(/^==/, '');\n }\n }\n }\n return undefined;\n}\n\n/** npm `package-lock.json` — JSON, deterministic, no dependency. */\nfunction packageLockVersion(root: string, name: string): string | undefined {\n let data: { packages?: Record<string, { version?: string }>; dependencies?: Record<string, { version?: string }> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'package-lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n // v2/v3: packages keyed by install path; the top-level dep is \"node_modules/<name>\".\n const top = data.packages?.[`node_modules/${name}`]?.version;\n if (typeof top === 'string') return top;\n // v1: flat dependencies map.\n const v1 = data.dependencies?.[name]?.version;\n return typeof v1 === 'string' ? v1 : undefined;\n}\n\n/**\n * `pnpm-lock.yaml` (v6 and v9) — the direct dependency's resolved version.\n *\n * pnpm is not a niche case: this repository is itself pnpm-only, so until this\n * existed every `resolveVersion` here reported no lockfile pin and fell through\n * to the installed tree — precisely the fallback this module exists to avoid,\n * because `node_modules` is empty in CI and on a fresh clone.\n *\n * Read from `importers`, not `packages`: the importer block records what this\n * project actually depends on, while `packages` lists the whole transitive\n * graph and can hold several versions of one name. Parsed by hand, like every\n * other reader here — a lockfile is megabytes and only one line is wanted.\n */\nfunction pnpmLockVersion(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'pnpm-lock.yaml'), 'utf8');\n } catch {\n return undefined;\n }\n const importers = sectionOf(text, 'importers');\n if (!importers) return undefined;\n // Entries look like:\n // commander:\n // specifier: ^15.0.0\n // version: 15.0.0(peer@1.2.3)\n // The name may be quoted when scoped ('@scope/pkg':).\n const key = escapeRegExp(name);\n const re = new RegExp(`^\\\\s+'?${key}'?:\\\\s*$\\\\n\\\\s+specifier:.*$\\\\n\\\\s+version:\\\\s*(\\\\S+)\\\\s*$`, 'm');\n const m = re.exec(importers);\n if (!m?.[1]) return undefined;\n // Strip pnpm's peer-suffix — `15.0.0(zod@4.4.3)` is still version 15.0.0.\n const version = m[1].replace(/\\(.*$/, '').trim();\n return version || undefined;\n}\n\n/** The body of a top-level YAML block, up to the next column-0 key. */\nfunction sectionOf(text: string, key: string): string | undefined {\n const start = new RegExp(`^${key}:\\\\s*$`, 'm').exec(text);\n if (!start) return undefined;\n const from = start.index + start[0].length;\n const next = /^\\S[^\\n]*:\\s*$/m.exec(text.slice(from));\n return next ? text.slice(from, from + next.index) : text.slice(from);\n}\n\n/**\n * `yarn.lock` — a custom text format. Each block opens with one or more\n * comma-separated `name@range` specifiers (possibly quoted) and ends with an\n * indented `version \"x.y.z\"`. We find the block whose header names our package and\n * return its version. Scoped names (`@scope/pkg@range`) are handled via lastIndexOf.\n */\nfunction yarnLockVersion(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'yarn.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inBlock = false;\n for (const line of text.split('\\n')) {\n if (line && !/^\\s/.test(line) && !line.startsWith('#')) {\n inBlock = headerNamesPackage(line, name);\n } else if (inBlock) {\n const m = /^\\s+version:?\\s+\"?([^\"\\s]+)\"?/.exec(line);\n if (m) return m[1];\n }\n }\n return undefined;\n}\n\nfunction headerNamesPackage(header: string, name: string): boolean {\n return header\n .replace(/:\\s*$/, '')\n .split(',')\n .some((spec) => {\n const s = spec.trim().replace(/^\"|\"$/g, '');\n const at = s.lastIndexOf('@');\n if (at <= 0) return false; // <=0 keeps scoped leading '@' from matching empty name\n const specName = s.slice(0, at);\n return specName === name;\n });\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { stableStringify } from './serialize.js';\nimport { hashString } from './hash.js';\nimport { inventory, installedTreeVersion, type DriftInventory } from './drift.js';\nimport { lockfileVersion } from './lockfile.js';\n\n/**\n * `vg lib` — a deterministic, on-disk library-currency catalog: version-correct\n * usage docs for the **exact version in your lockfile**, drift-annotated, from\n * on-disk sources (no key).\n *\n * The catalog (`vibgrate.lib.json`) is small and committable; doc bodies live in\n * `.vibgrate/lib/<id>.md` so the team shares them on pull. Ingestion is\n * deterministic from local sources; URL/llms.txt ingestion is opt-in network.\n */\n\nexport const LIB_SCHEMA = 'vg-lib/1.0' as const;\n\nexport interface LibSource {\n type: 'local' | 'llms.txt' | 'website' | 'openapi' | 'git';\n location: string;\n}\n\nexport interface LibEntry {\n id: string;\n name: string;\n version: string; // cataloged doc version ('*' if unknown)\n source: LibSource;\n docFile: string; // relative to root (.vibgrate/lib/<id>.md)\n docHash: string;\n bytes: number;\n}\n\nexport interface LibCatalog {\n schemaVersion: typeof LIB_SCHEMA;\n libraries: Record<string, LibEntry>;\n}\n\nexport function catalogPath(root: string): string {\n return path.join(root, 'vibgrate.lib.json');\n}\nexport function libDir(root: string): string {\n return path.join(root, '.vibgrate', 'lib');\n}\n\nexport function libId(name: string): string {\n return name.trim().toLowerCase().replace(/^@/, '').replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');\n}\n\nexport function loadCatalog(root: string): LibCatalog {\n const file = catalogPath(root);\n if (fs.existsSync(file)) {\n try {\n const data = JSON.parse(fs.readFileSync(file, 'utf8')) as LibCatalog;\n if (data.schemaVersion === LIB_SCHEMA && data.libraries) return data;\n } catch {\n /* fall through to empty */\n }\n }\n return { schemaVersion: LIB_SCHEMA, libraries: {} };\n}\n\nexport function saveCatalog(root: string, catalog: LibCatalog): void {\n fs.writeFileSync(catalogPath(root), `${stableStringify(catalog, 2)}\\n`);\n}\n\n/** Resolve a fuzzy name to a catalog entry (exact id, name, or substring). */\nexport function resolveLib(catalog: LibCatalog, name: string): LibEntry | undefined {\n const id = libId(name);\n if (catalog.libraries[id]) return catalog.libraries[id];\n const lower = name.toLowerCase();\n const all = Object.values(catalog.libraries);\n return (\n all.find((e) => e.name.toLowerCase() === lower) ??\n all.find((e) => e.id.includes(id) || e.name.toLowerCase().includes(lower))\n );\n}\n\n/**\n * The lockfile/manifest version of a dependency, for drift annotation.\n *\n * `inv` lets a caller that resolves many names hand in one inventory instead of\n * rebuilding it per name. Building it walks the manifest tree and probes\n * `node_modules` for every declared dependency, so `vg lib`'s catalog listing —\n * a `driftFor` per entry — was paying that whole cost once per library.\n */\nexport function installedVersion(root: string, name: string, inv?: DriftInventory): string | undefined {\n const rec = (inv ?? inventory(root)).records.find((r) => r.name === name);\n return rec?.installed ?? rec?.declared;\n}\n\nexport interface VersionResolution {\n /** The version we serve docs for: lockfile pin → installed tree → declared range. */\n served?: string;\n source: 'lockfile' | 'installed' | 'declared' | 'unknown';\n lockfile?: string;\n installed?: string;\n declared?: string;\n /** Set when the lockfile pin and the installed tree disagree (the dev should fix). */\n mismatch?: { lockfile: string; installed: string; note: string };\n}\n\nconst stripRange = (v?: string): string | undefined => v?.replace(/^[v^~>=<\\s]+/, '');\n\n/**\n * Resolve the version to serve docs for, **lockfile-first**, and detect a\n * lockfile↔installed disagreement (VG-LIB-SUPERSET-PLAN D13 / G8). Precedence:\n * lockfile pin → installed tree → declared range. When both a lockfile pin and an\n * installed version are readable and differ, surface a mismatch the dev should fix —\n * a signal a hosted docs service can't produce (it has no view of your installed tree).\n */\nexport function resolveVersion(root: string, name: string): VersionResolution {\n const rec = inventory(root).records.find((r) => r.name === name);\n const declared = rec?.declared;\n // npm installed comes from node_modules (via inventory); other ecosystems read their\n // installed tree (Python .dist-info, PHP installed.json) so the mismatch alert applies too.\n const installed = rec?.installed ?? (rec ? installedTreeVersion(root, rec.ecosystem, name) : undefined);\n const lockfile = rec ? lockfileVersion(root, rec.ecosystem, name) : undefined;\n\n let mismatch: VersionResolution['mismatch'];\n if (lockfile && installed && stripRange(lockfile) !== stripRange(installed)) {\n mismatch = {\n lockfile,\n installed,\n note: `lockfile pins ${lockfile} but the installed tree has ${installed} — your install is out of sync with the lockfile (re-install or commit the lock)`,\n };\n }\n\n const served = lockfile ?? installed ?? declared;\n const source: VersionResolution['source'] = lockfile\n ? 'lockfile'\n : installed\n ? 'installed'\n : declared\n ? 'declared'\n : 'unknown';\n return { served, source, lockfile, installed, declared, mismatch };\n}\n\nexport interface DriftNote {\n cataloged: string;\n installed?: string;\n drift: 'current' | 'behind' | 'ahead' | 'unknown';\n}\n\nexport function driftFor(root: string, entry: LibEntry, inv?: DriftInventory): DriftNote {\n const installed = installedVersion(root, entry.name, inv);\n if (!installed || entry.version === '*') return { cataloged: entry.version, installed, drift: 'unknown' };\n const norm = (v: string) => v.replace(/^[v^~>=<\\s]+/, '');\n const a = norm(entry.version);\n const b = norm(installed);\n if (a === b) return { cataloged: entry.version, installed, drift: 'current' };\n return { cataloged: entry.version, installed, drift: cmp(a, b) < 0 ? 'behind' : 'ahead' };\n}\n\nfunction cmp(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const d = (pa[i] || 0) - (pb[i] || 0);\n if (d) return d;\n }\n return 0;\n}\n\nexport interface AddOptions {\n root: string;\n name?: string;\n version?: string;\n /** Allow network for URL/llms.txt sources. */\n allowNetwork?: boolean;\n fetchImpl?: typeof globalThis.fetch;\n}\n\n/**\n * Recognise a git source. We treat a source as git when it is unambiguously\n * one: a `git+` scheme prefix, an `scp`-style `git@host:org/repo`, or a URL\n * ending in `.git`. A plain `https://…/docs` stays a website (no `.git`), so the\n * classification is deterministic and never surprises a URL ingest.\n * Returns the clone URL (with any `git+` prefix stripped), or null.\n */\nexport function parseGitSource(source: string): string | null {\n if (source.startsWith('git+')) return source.slice(4);\n if (/^git@[^:]+:/.test(source)) return source;\n if (/\\.git\\/?$/.test(source)) return source;\n return null;\n}\n\n/** Ingest docs for a library from a local path, a git repo, or (opt-in) a URL. */\nexport async function addLibrary(source: string, opts: AddOptions): Promise<LibEntry> {\n const { root } = opts;\n let content: string;\n let type: LibSource['type'] = 'local';\n\n const gitUrl = parseGitSource(source);\n if (gitUrl) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to clone ${source} without --online (offline by default)`);\n }\n content = cloneAndReadGit(gitUrl);\n type = 'git';\n } else if (/^https?:\\/\\//.test(source)) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to fetch ${source} without --online (offline by default)`);\n }\n const res = await (opts.fetchImpl ?? globalThis.fetch)(source);\n if (!res.ok) throw new Error(`fetch failed (${res.status}) for ${source}`);\n content = await res.text();\n type = source.endsWith('llms.txt') ? 'llms.txt' : source.endsWith('.json') ? 'openapi' : 'website';\n } else {\n const abs = path.resolve(root, source);\n if (!fs.existsSync(abs)) throw new Error(`source not found: ${source}`);\n content = readLocal(abs);\n type = 'local';\n }\n\n const name = opts.name ?? inferName(source);\n const id = libId(name);\n const version = opts.version ?? installedVersion(root, name) ?? '*';\n\n fs.mkdirSync(libDir(root), { recursive: true });\n const docFileAbs = path.join(libDir(root), `${id}.md`);\n fs.writeFileSync(docFileAbs, content);\n\n const entry: LibEntry = {\n id,\n name,\n version,\n source: { type, location: source },\n docFile: path.relative(root, docFileAbs).split(path.sep).join('/'),\n docHash: hashString(content),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n\n const catalog = loadCatalog(root);\n catalog.libraries[id] = entry;\n saveCatalog(root, catalog);\n return entry;\n}\n\nexport function readDoc(root: string, entry: LibEntry): string {\n const abs = path.resolve(root, entry.docFile);\n return fs.existsSync(abs) ? fs.readFileSync(abs, 'utf8') : '';\n}\n\nexport interface LocalDocs {\n docs: string;\n version?: string;\n /** Cited on-disk source, relative to root (e.g. `node_modules/react/README.md`). */\n source: string;\n /**\n * True when the payload is only a package README / description — no package\n * `docs/` markdown was merged in. Used by the quality gate to refuse\n * overconfident answers on focused API queries.\n */\n readmeOnly?: boolean;\n}\n\n/** Find an installed npm package directory, walking up for hoisted `node_modules`. */\nfunction npmPackageDir(root: string, name: string): string | undefined {\n let cur = root;\n for (let i = 0; i < 12; i++) {\n const dir = path.join(cur, 'node_modules', name);\n if (fs.existsSync(path.join(dir, 'package.json'))) return dir;\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return undefined;\n}\n\nconst README_CANDIDATES = ['llms.txt', 'README.md', 'README.mdx', 'README', 'readme.md'] as const;\n\n/** Collect package `docs/` markdown files, optionally filtered by query terms. */\nfunction packageDocsMarkdown(dir: string, query?: string): { text: string; files: string[] } | undefined {\n const docsDir = path.join(dir, 'docs');\n if (!fs.existsSync(docsDir) || !fs.statSync(docsDir).isDirectory()) return undefined;\n const files: string[] = [];\n const walk = (d: string, depth: number): void => {\n if (depth > 3 || files.length >= 40) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const e of entries) {\n if (files.length >= 40) return;\n const full = path.join(d, e.name);\n if (e.isDirectory()) {\n if (e.name.startsWith('.') || e.name === 'node_modules') continue;\n walk(full, depth + 1);\n } else if (e.isFile() && /\\.(md|mdx)$/i.test(e.name)) {\n files.push(full);\n }\n }\n };\n walk(docsDir, 0);\n if (!files.length) return undefined;\n\n const terms = (query ?? '')\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((w) => w.length > 2);\n const scored = files.map((f) => {\n let body = '';\n try {\n body = fs.readFileSync(f, 'utf8');\n } catch {\n return { f, body: '', score: -1 };\n }\n const lc = `${path.basename(f)}\\n${body}`.toLowerCase();\n const score = terms.length ? terms.filter((t) => lc.includes(t)).length : 1;\n return { f, body, score };\n });\n // Prefer query-relevant docs; when no query, take a deterministic head of the tree.\n const picked = (terms.length ? scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score || a.f.localeCompare(b.f)) : scored)\n .filter((s) => s.body.trim())\n .slice(0, terms.length ? 8 : 5);\n if (!picked.length) return undefined;\n const text = picked\n .map((s) => `<!-- ${path.relative(dir, s.f).split(path.sep).join('/')} -->\\n${s.body.trim()}`)\n .join('\\n\\n');\n return {\n text,\n files: picked.map((s) => path.relative(dir, s.f).split(path.sep).join('/')),\n };\n}\n\n/**\n * Local-first resolution ladder (VG-LIB-SUPERSET-PLAN A.2.3): when a library isn't\n * in the committed catalog, read its docs **from the\n * installed package on disk**, version-correct by construction and offline. Prefers\n * `llms.txt`, then the README, then package `docs/` markdown (query-filtered when\n * provided), then the package.json description. First slice: npm (`node_modules`).\n */\nexport function localPackageDocs(root: string, name: string, opts?: { query?: string }): LocalDocs | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n const version = resolveVersion(root, name).served;\n let primary: { docs: string; source: string } | undefined;\n for (const f of README_CANDIDATES) {\n const p = path.join(dir, f);\n try {\n const docs = fs.readFileSync(p, 'utf8');\n if (docs.trim()) {\n primary = { docs, source: path.relative(root, p).split(path.sep).join('/') };\n break;\n }\n } catch {\n /* next candidate */\n }\n }\n\n const extra = packageDocsMarkdown(dir, opts?.query);\n if (primary && extra) {\n return {\n docs: `${primary.docs.trim()}\\n\\n## Package docs\\n\\n${extra.text}`,\n version,\n source: `${primary.source}+docs/`,\n readmeOnly: false,\n };\n }\n if (primary) {\n return { ...primary, version, readmeOnly: true };\n }\n if (extra) {\n return {\n docs: extra.text,\n version,\n source: path.relative(root, path.join(dir, 'docs')).split(path.sep).join('/') + '/',\n readmeOnly: false,\n };\n }\n\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as {\n description?: string;\n version?: string;\n };\n if (pkg.description?.trim()) {\n return {\n docs: `# ${name}\\n\\n${pkg.description}`,\n version: version ?? pkg.version,\n source: path.relative(root, path.join(dir, 'package.json')).split(path.sep).join('/'),\n readmeOnly: true,\n };\n }\n } catch {\n /* ignore */\n }\n return undefined;\n}\n\ntype PkgJson = {\n types?: string;\n typings?: string;\n exports?: unknown;\n};\n\n/** Resolve a relative types path from package.json (including exports map). */\nfunction typesFromPkg(dir: string, pkg: PkgJson): string | undefined {\n const tryRel = (rel: unknown): string | undefined => {\n if (typeof rel !== 'string') return undefined;\n const p = path.join(dir, rel);\n return fs.existsSync(p) ? p : undefined;\n };\n const top = tryRel(pkg.types) ?? tryRel(pkg.typings);\n if (top) return top;\n const exp = pkg.exports;\n if (!exp || typeof exp !== 'object') return undefined;\n // Prefer the \".\" export; fall back to any types condition we can find.\n const roots: unknown[] = [];\n if ('.' in (exp as Record<string, unknown>)) roots.push((exp as Record<string, unknown>)['.']);\n else roots.push(...Object.values(exp as Record<string, unknown>));\n for (const entry of roots) {\n if (typeof entry === 'string') {\n const hit = tryRel(entry.endsWith('.d.ts') ? entry : undefined);\n if (hit) return hit;\n continue;\n }\n if (entry && typeof entry === 'object') {\n const o = entry as Record<string, unknown>;\n for (const key of ['types', 'typings', 'import', 'require', 'default']) {\n const v = o[key];\n if (typeof v === 'string') {\n const hit = tryRel(v.endsWith('.ts') || v.endsWith('.d.ts') || v.endsWith('.mts') || v.endsWith('.cts') ? v : undefined);\n if (hit) return hit;\n } else if (v && typeof v === 'object' && typeof (v as { types?: string }).types === 'string') {\n const hit = tryRel((v as { types: string }).types);\n if (hit) return hit;\n }\n }\n }\n }\n return undefined;\n}\n\n/** Locate a package's TypeScript declaration entry (`types`/`typings`/exports, else conventional paths). */\nfunction dtsEntry(dir: string): string | undefined {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as PkgJson;\n const fromPkg = typesFromPkg(dir, pkg);\n if (fromPkg) return fromPkg;\n } catch {\n /* fall through to conventional paths */\n }\n for (const c of [\n 'index.d.ts',\n 'dist/index.d.ts',\n 'dist/types/index.d.ts',\n 'lib/index.d.ts',\n 'types/index.d.ts',\n 'build/index.d.ts',\n ]) {\n const p = path.join(dir, c);\n if (fs.existsSync(p)) return p;\n }\n return undefined;\n}\n\nconst MAX_DTS_FILES = 30;\nconst MAX_DTS_BYTES = 512_000;\n\n/** Bounded walk for `.d.ts` files under a package (for query-focused symbol lookup). */\nfunction collectDtsFiles(dir: string): string[] {\n const out: string[] = [];\n const walk = (d: string, depth: number): void => {\n if (depth > 4 || out.length >= MAX_DTS_FILES) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const e of entries) {\n if (out.length >= MAX_DTS_FILES) return;\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue;\n const full = path.join(d, e.name);\n if (e.isDirectory()) walk(full, depth + 1);\n else if (e.isFile() && /\\.d\\.(ts|mts|cts)$/.test(e.name)) out.push(full);\n }\n };\n walk(dir, 0);\n return out;\n}\n\n/**\n * Extract exported declaration signatures from a `.d.ts` source. Declaration files\n * are body-less, so a brace-depth scanner is deterministic and robust: capture each\n * top-level `export …` statement from the keyword through its terminating `;` or\n * matching `}`. Also keeps named re-export lines (`export { foo } from '…'`) so\n * modern barrel packages still surface API names.\n */\nexport function extractDtsApi(src: string, maxDecls = 200): string[] {\n const out: string[] = [];\n let depth = 0;\n let capture: string[] | null = null;\n for (const raw of src.split('\\n')) {\n const line = raw.trim();\n // Named re-exports: keep the line so symbols like createMiddleware appear.\n if (capture === null && depth === 0 && /^export\\s+\\{[^}]+\\}/.test(line)) {\n out.push(raw.trim());\n if (out.length >= maxDecls) break;\n continue;\n }\n if (\n capture === null &&\n depth === 0 &&\n /^export\\b/.test(line) &&\n !/^export\\s+(\\{|\\*|default\\b|type\\s+\\{)/.test(line)\n ) {\n capture = [];\n }\n if (capture) capture.push(raw);\n for (const ch of raw) {\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n }\n if (capture && depth === 0 && /[;}]\\s*$/.test(line)) {\n out.push(capture.join('\\n').trim());\n capture = null;\n if (out.length >= maxDecls) break;\n }\n }\n return out;\n}\n\n/** Names mentioned in `export { a, b as c }` lines. */\nfunction reExportNames(decl: string): string[] {\n const m = /^export\\s*\\{([^}]+)\\}/.exec(decl.trim());\n if (!m) return [];\n const names: string[] = [];\n for (const part of m[1].split(',')) {\n const n = part.trim().split(/\\s+as\\s+/i).pop()?.trim();\n if (n && /^[A-Za-z_$][\\w$]*$/.test(n)) names.push(n);\n }\n return names;\n}\n\n/**\n * Version-correct typed API surface from a package's `.d.ts` files.\n * When `query` is set, prefer declarations that mention query terms (so\n * `library_docs({ query: \"createMiddleware\" })` returns the matching signature,\n * not only a truncated README).\n */\nexport function localApiSurface(root: string, name: string, query?: string): string | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n\n const entry = dtsEntry(dir);\n const files = entry ? [entry, ...collectDtsFiles(dir).filter((f) => f !== entry)] : collectDtsFiles(dir);\n if (!files.length) return undefined;\n\n const allDecls: string[] = [];\n const seen = new Set<string>();\n for (const f of files) {\n let src: string;\n try {\n const st = fs.statSync(f);\n if (st.size > MAX_DTS_BYTES) continue;\n src = fs.readFileSync(f, 'utf8');\n } catch {\n continue;\n }\n for (const d of extractDtsApi(src)) {\n if (seen.has(d)) continue;\n seen.add(d);\n allDecls.push(d);\n if (allDecls.length >= 400) break;\n }\n if (allDecls.length >= 400) break;\n }\n if (!allDecls.length) return undefined;\n\n const terms = (query ?? '')\n .split(/[^A-Za-z0-9_$]+/)\n .filter((w) => w.length > 2);\n if (terms.length) {\n const lcTerms = terms.map((t) => t.toLowerCase());\n const matched = allDecls.filter((d) => {\n const lc = d.toLowerCase();\n return lcTerms.some((t) => lc.includes(t));\n });\n // Expand bare re-export lines to fuller decls of the same name when possible.\n const expanded: string[] = [];\n const expandedSeen = new Set<string>();\n for (const d of matched) {\n const names = reExportNames(d);\n if (names.length) {\n for (const n of names) {\n const fuller = allDecls.find(\n (x) => !/^export\\s*\\{/.test(x) && new RegExp(`\\\\b${n}\\\\b`).test(x),\n );\n const pick = fuller ?? d;\n if (!expandedSeen.has(pick)) {\n expandedSeen.add(pick);\n expanded.push(pick);\n }\n }\n } else if (!expandedSeen.has(d)) {\n expandedSeen.add(d);\n expanded.push(d);\n }\n }\n if (expanded.length) return expanded.slice(0, 40).join('\\n\\n');\n }\n\n // No query (or no match): return entry-file decls first, then a capped head.\n return allDecls.slice(0, 80).join('\\n\\n');\n}\n\n/** Append the typed API surface (if any) as a fenced section — composed into served docs. */\nexport function withApiSurface(root: string, name: string, docs: string, query?: string): string {\n const api = localApiSurface(root, name, query);\n return api ? `${docs}\\n\\n## API (types)\\n\\n\\`\\`\\`ts\\n${api}\\n\\`\\`\\`\\n` : docs;\n}\n\n/**\n * Shallow-clone a git repo to a temp dir, read its docs, then remove the clone.\n * Network-touching, so it only runs under `--online` (gated by the caller). The\n * clone is `--depth 1` (no history) and the temp dir is always cleaned up.\n */\nfunction cloneAndReadGit(url: string): string {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'vg-lib-git-'));\n try {\n execFileSync('git', ['clone', '--depth', '1', '--quiet', url, dir], {\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n } catch (err) {\n fs.rmSync(dir, { recursive: true, force: true });\n const detail = err instanceof Error && err.message ? `: ${err.message.split('\\n')[0]}` : '';\n throw new Error(`git clone failed for ${url}${detail}`);\n }\n try {\n return readGitDocs(dir);\n } finally {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/**\n * Read the documentation out of a cloned repo, deterministically: prefer a\n * top-level `docs/` directory, else the root README, else any top-level prose.\n */\nfunction readGitDocs(dir: string): string {\n const docsDir = path.join(dir, 'docs');\n if (fs.existsSync(docsDir) && fs.statSync(docsDir).isDirectory()) return readLocal(docsDir);\n const readme = ['README.md', 'README.mdx', 'README.txt', 'README.rst', 'readme.md']\n .map((f) => path.join(dir, f))\n .find((p) => fs.existsSync(p));\n if (readme) return fs.readFileSync(readme, 'utf8');\n return readLocal(dir);\n}\n\nfunction readLocal(abs: string): string {\n const stat = fs.statSync(abs);\n if (stat.isFile()) return fs.readFileSync(abs, 'utf8');\n // Directory: concatenate markdown/text files deterministically.\n const parts: string[] = [];\n const files = fs\n .readdirSync(abs, { withFileTypes: true })\n .filter((e) => e.isFile() && /\\.(md|mdx|txt|rst)$/i.test(e.name))\n .map((e) => e.name)\n .sort();\n for (const f of files) parts.push(`<!-- ${f} -->\\n${fs.readFileSync(path.join(abs, f), 'utf8')}`);\n return parts.join('\\n\\n');\n}\n\nfunction inferName(source: string): string {\n const cleaned = source.replace(/^git\\+/, '').replace(/\\.git\\/?$/i, '');\n const base = cleaned.replace(/\\/+$/, '').split(/[/:]/).pop() ?? cleaned;\n return base.replace(/\\.(md|mdx|txt|rst|json)$/i, '').replace(/^llms$/, 'docs');\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { Worker } from 'node:worker_threads';\n\n/**\n * The uniform literal-search core for `search_symbols` (VG-LITERAL-INDEX-DESIGN.md\n * Stage 1). Reads a set of candidate files and returns every matching line,\n * case-insensitive, deterministically ordered by (file, line).\n *\n * Performance is delivered WITHOUT any external binary or persisted index, so it\n * is identical on Linux, macOS and Windows and needs nothing installed:\n * - small file sets scan inline (worker startup would cost more than it saves);\n * - large sets fan out across `worker_threads` — a proven, Node-native way to\n * use every core. ripgrep, when present, prunes the candidate set upstream so\n * this scans only a handful of files; when it's absent this is the whole\n * engine, and the parallel path keeps it fast on big repos.\n *\n * The per-file matcher is one tiny function shared by the inline path and the\n * worker (as a source string) so the two can't drift; a parity test asserts they\n * agree. It leans on V8's native `toLowerCase`/`includes` rather than a\n * hand-rolled byte scan — simpler, and faster than interpreted JS byte loops.\n */\n\nconst MAX_FILE_BYTES = 1_000_000;\nconst PREVIEW_CHARS = 120;\nconst NUL = '\\u0000'; // a NUL byte marks a binary file — skipped, same as ripgrep does\n/**\n * Fan out to workers only above this many candidate BYTES. Benchmarking showed\n * that gating on file *count* is wrong: a few thousand small files (≈8 MB) scan\n * ~2× faster inline than across workers, because worker startup + result IPC\n * dwarfs the actual matching. Parallelism only pays once there is real byte\n * volume to amortise it (big monorepos, generated trees). Below the threshold\n * the improved single-thread scan — one lowercase per file, no per-line\n * re-lowercase — is the fastest and has zero worker overhead.\n */\nconst PARALLEL_MIN_BYTES = 64_000_000;\n/**\n * Don't even measure bytes below this file count: a repo with few files can't\n * hold enough work to beat worker startup, and skipping the stat pass keeps\n * typical small repos overhead-free. Above it, `measure` decides by bytes.\n */\nconst PARALLEL_MIN_FILES = 2000;\n/** Hard cap on collected rows so a pathologically common phrase can't blow memory;\n * the true match count is still tallied exactly and `truncated` is set. */\nconst ROW_CAP = 10_000;\n\nexport interface LiteralHit {\n file: string;\n line: number;\n preview: string;\n}\n\nexport interface ScanOutcome {\n /** Matching lines, deterministically ordered by (file, line), capped at ROW_CAP. */\n hits: LiteralHit[];\n /** Exact count of all matching lines (counts past ROW_CAP / past `budget`). */\n total: number;\n /** True when rows were capped (ROW_CAP or, in bounded mode, `budget`). */\n truncated: boolean;\n}\n\nexport interface ScanOptions {\n /** Collect and count every match (a \"find every occurrence\" sweep). When false,\n * stop once `budget` rows are collected (a cheap bounded fallthrough). */\n collectAll: boolean;\n /** Row budget for the bounded (`collectAll: false`) mode. */\n budget: number;\n}\n\n/**\n * Scan `files` (repo-relative paths under `root`) for `needle`, case-insensitive.\n * Chooses inline vs. parallel by set size; both produce identical output.\n */\nexport async function scanCandidates(root: string, files: string[], needle: string, opts: ScanOptions): Promise<ScanOutcome> {\n const needleLower = needle.toLowerCase();\n if (!needleLower || files.length === 0) return { hits: [], total: 0, truncated: false };\n // Few files can't out-earn worker startup — inline directly, no stat pass.\n // (Bounded mode additionally early-stops the moment the budget fills.)\n if (files.length < PARALLEL_MIN_FILES && !process.env.VG_PARALLEL_MIN_BYTES) {\n return opts.collectAll\n ? scanInline(root, files, needleLower, ROW_CAP, false, undefined)\n : scanInline(root, files, needleLower, opts.budget, true, undefined);\n }\n // Many files: measure the candidate bytes once, then let workers in only when\n // there's enough volume to amortise them. This now includes the BOUNDED path\n // (a single-name fallthrough): its early-stop only ever helps when the needle\n // is common enough to fill the budget — the expensive case is precisely a RARE\n // needle, where the scan must sweep everything anyway and used to do so\n // single-threaded (the 16s-per-call trace). Sizes from the measure pass are\n // reused by the inline scan (no double-stat).\n const { over, sizes } = measure(root, files);\n if (!over) {\n return opts.collectAll\n ? scanInline(root, files, needleLower, ROW_CAP, false, sizes)\n : scanInline(root, files, needleLower, opts.budget, true, sizes);\n }\n const out = await scanParallel(root, files, needleLower);\n if (!opts.collectAll && out.hits.length > opts.budget) {\n out.hits.length = opts.budget;\n out.truncated = true;\n }\n return out;\n}\n\n/** The byte threshold, overridable via VG_PARALLEL_MIN_BYTES (ops knob + tests). */\nfunction parallelMinBytes(): number {\n const v = Number(process.env.VG_PARALLEL_MIN_BYTES);\n return Number.isFinite(v) && v >= 0 ? v : PARALLEL_MIN_BYTES;\n}\n\n/** Sum candidate bytes, short-circuiting once the worker threshold is crossed. */\nfunction measure(root: string, files: string[]): { over: boolean; sizes: Map<string, number> } {\n const threshold = parallelMinBytes();\n const sizes = new Map<string, number>();\n let total = 0;\n for (const rel of files) {\n let size: number;\n try {\n size = fs.statSync(path.join(root, rel)).size;\n } catch {\n continue;\n }\n sizes.set(rel, size);\n if (size <= MAX_FILE_BYTES) total += size;\n if (total >= threshold) return { over: true, sizes };\n }\n return { over: false, sizes };\n}\n\n/** The one true per-file matcher. Kept trivial so the worker copy stays in sync. */\nfunction matchLines(text: string, needleLower: string): Array<{ line: number; preview: string }> {\n const low = text.toLowerCase();\n if (!low.includes(needleLower)) return [];\n const lowLines = low.split('\\n');\n const rawLines = text.split('\\n');\n const hits: Array<{ line: number; preview: string }> = [];\n for (let i = 0; i < lowLines.length; i++) {\n if (lowLines[i].includes(needleLower)) hits.push({ line: i + 1, preview: rawLines[i].trim().slice(0, PREVIEW_CHARS) });\n }\n return hits;\n}\n\n/**\n * Read one candidate file, applying the size/binary guards. `null` = skip.\n * `knownSize` (from the measure pass) lets us skip a redundant `statSync`.\n */\nfunction readCandidate(abs: string, knownSize?: number): string | null {\n try {\n const size = knownSize ?? fs.statSync(abs).size;\n if (size > MAX_FILE_BYTES) return null;\n const text = fs.readFileSync(abs, 'utf8');\n return text.includes(NUL) ? null : text;\n } catch {\n return null;\n }\n}\n\nfunction scanInline(root: string, files: string[], needleLower: string, cap: number, stopAtCap: boolean, sizes: Map<string, number> | undefined): ScanOutcome {\n const hits: LiteralHit[] = [];\n let total = 0;\n let truncated = false;\n for (const rel of files) {\n const text = readCandidate(path.join(root, rel), sizes?.get(rel));\n if (text === null) continue;\n for (const h of matchLines(text, needleLower)) {\n total++;\n if (hits.length < cap) hits.push({ file: rel, line: h.line, preview: h.preview });\n else {\n truncated = true;\n if (stopAtCap) return { hits, total, truncated };\n }\n }\n }\n return { hits, total, truncated };\n}\n\n/**\n * Fan the candidate files across `worker_threads`. Each worker runs the same\n * matcher over its shard and returns rows + an exact count; the main thread\n * merges, sorts and caps. The worker source is a self-contained CommonJS string\n * (eval worker) so it survives bundling with no separate worker-file path to\n * resolve at runtime. Any worker failure falls back to a correct inline scan —\n * speed is negotiable, completeness is not.\n */\nasync function scanParallel(root: string, files: string[], needleLower: string): Promise<ScanOutcome> {\n const n = Math.min(files.length, Math.max(2, Math.min(8, os.cpus().length - 1)));\n const shards: string[][] = Array.from({ length: n }, () => []);\n files.forEach((f, i) => shards[i % n].push(f));\n\n let results: ScanOutcome[];\n try {\n results = await Promise.all(shards.map((shard) => runWorker(root, shard, needleLower)));\n } catch {\n return scanInline(root, files, needleLower, ROW_CAP, false, undefined);\n }\n\n const hits: LiteralHit[] = [];\n let total = 0;\n let truncated = false;\n for (const r of results) {\n total += r.total;\n truncated = truncated || r.truncated;\n for (const h of r.hits) hits.push(h);\n }\n hits.sort((a, b) => (a.file < b.file ? -1 : a.file > b.file ? 1 : a.line - b.line));\n if (hits.length > ROW_CAP) {\n hits.length = ROW_CAP;\n truncated = true;\n }\n return { hits, total, truncated };\n}\n\nconst WORKER_SOURCE = [\n \"const { parentPort, workerData } = require('worker_threads');\",\n \"const fs = require('fs');\",\n \"const path = require('path');\",\n `const MAX = ${MAX_FILE_BYTES};`,\n `const PREVIEW = ${PREVIEW_CHARS};`,\n `const CAP = ${ROW_CAP};`,\n 'const NUL = String.fromCharCode(0);',\n 'const NL = String.fromCharCode(10);',\n 'const { root, files, needleLower } = workerData;',\n 'const hits = []; let total = 0, truncated = false;',\n 'for (const rel of files) {',\n ' const abs = path.join(root, rel);',\n ' let text;',\n ' try { if (fs.statSync(abs).size > MAX) continue; text = fs.readFileSync(abs, \"utf8\"); } catch { continue; }',\n ' if (text.includes(NUL)) continue;',\n ' const low = text.toLowerCase();',\n ' if (!low.includes(needleLower)) continue;',\n ' const lowLines = low.split(NL); const rawLines = text.split(NL);',\n ' for (let i = 0; i < lowLines.length; i++) {',\n ' if (!lowLines[i].includes(needleLower)) continue;',\n ' total++;',\n ' if (hits.length < CAP) hits.push({ file: rel, line: i + 1, preview: rawLines[i].trim().slice(0, PREVIEW) });',\n ' else truncated = true;',\n ' }',\n '}',\n 'parentPort.postMessage({ hits, total, truncated });',\n].join('\\n');\n\n/** One shard on one worker; rejects on any worker error so the caller can fall back. */\nfunction runWorker(root: string, files: string[], needleLower: string): Promise<ScanOutcome> {\n return new Promise<ScanOutcome>((resolve, reject) => {\n const w = new Worker(WORKER_SOURCE, { eval: true, workerData: { root, files, needleLower } });\n let settled = false;\n w.once('message', (m: ScanOutcome) => {\n settled = true;\n resolve(m);\n });\n w.once('error', reject);\n w.once('exit', (code) => {\n if (!settled && code !== 0) reject(new Error(`literal-scan worker exited with code ${code}`));\n });\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { findNodes } from './lookup.js';\nimport { scanCandidates } from './literal-scan.js';\nimport { extractLiteralNeedles, residualForSymbolSearch } from './query.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * `search_symbols` — the hybrid flashlight next to the map\n * (docs/graph/VG-GRAPH-OPTIMIZATION-PLAN.md P1).\n *\n * Two passes, both bounded and deterministic:\n * 1. symbol pass — the graph's own name index via findNodes (exact id /\n * qualified name / short name / case-insensitive / substring), ranked;\n * 2. literal pass — a repo-root-jailed substring scan over source files for\n * strings the graph does not model (config keys, log messages, comments),\n * only run when the symbol pass has spare result budget.\n *\n * Rows are tiny by contract ({kind, name, file, line, score|preview}) — this\n * tool exists to make \"I know the name\" discovery one cheap call, so the model\n * never flails through graph queries for a plain string lookup.\n */\n\nexport interface SymbolHit {\n kind: string;\n name: string;\n file: string;\n line: number;\n score: number;\n}\n\nexport interface TextHit {\n kind: 'text';\n file: string;\n line: number;\n preview: string;\n}\n\nexport interface SearchResult {\n matches: (SymbolHit | TextHit)[];\n moreAvailable: boolean;\n /**\n * Total literal (text) matches across the scanned tree, reported when a\n * literal sweep ran (a whitespace/phrase query). Lets a caller doing a \"find\n * every occurrence\" sweep know whether the shown text rows are the complete\n * set (`totalTextMatches` === shown text rows) or a page of a larger set\n * (`totalTextMatches` > shown) — so it never mistakes a truncated list for a\n * complete one, and never has to fall back to grep to be sure. A trailing `+`\n * intent is signalled via `moreAvailable`; absent for single-name lookups.\n */\n totalTextMatches?: number;\n /**\n * Present when nothing matched (the pivot to take) or when a literal sweep was\n * truncated (how to get the rest).\n */\n hint?: string;\n}\n\nconst IGNORE_DIRS = new Set([\n '.git', '.claude', '.vibgrate', 'node_modules', 'dist', 'build', 'out', 'target', 'vendor', '__pycache__',\n // .NET intermediate output and coverage reports: purely generated trees that a\n // C#/coverage-heavy repo pays for on every literal sweep. `bin` is deliberately\n // NOT here — plenty of repos keep real scripts in bin/ (rails, node CLIs), and\n // completeness beats speed; the binary-extension skip below keeps a .NET bin/\n // cheap anyway.\n 'obj', 'coverage',\n]);\nconst MAX_FILES_SCANNED = 20_000;\n\n/**\n * Extensions that are binary by construction — skipped at listing time so the\n * scan never stats/reads megabytes of DLLs or images just to reject them on the\n * NUL check. Applied identically to the Node walk and the rg parse so both\n * listers see the same corpus. Content-level binary detection (the NUL check in\n * literal-scan) still guards everything this list misses.\n */\nconst BINARY_EXTS = new Set([\n '.dll', '.pdb', '.exe', '.so', '.dylib', '.a', '.lib', '.o', '.class', '.jar', '.wasm', '.node',\n '.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.icns', '.bmp',\n '.zip', '.gz', '.tgz', '.bz2', '.xz', '.7z', '.rar',\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n '.mp3', '.mp4', '.mov', '.avi', '.pdf',\n]);\n\nfunction hasBinaryExt(rel: string): boolean {\n return BINARY_EXTS.has(path.extname(rel).toLowerCase());\n}\n\n/** Repo-relative paths are always reported with forward slashes — matching the\n * graph's own file paths, so symbol-hit/text-hit dedup works on Windows too. */\nfunction toPosix(rel: string): string {\n return path.sep === '\\\\' ? rel.replaceAll('\\\\', '/') : rel;\n}\n\nexport async function searchSymbols(graph: VgGraph, root: string, query: string, limit: number): Promise<SearchResult> {\n let q = query.trim();\n if (!q) return { matches: [], moreAvailable: false, hint: 'query is required' };\n\n // A query wrapped in matching quotes is an explicit \"find this exact string\"\n // — the tool description tells agents a QUOTED phrase runs a complete literal\n // sweep, but a quoted SINGLE identifier (\"AddJwtBearer\") has no whitespace,\n // used to take the single-name path, and searched for the quote characters\n // themselves: a guaranteed no-match that sent the agent straight back to grep\n // (the field-report failure). Strip the quotes and honour the intent.\n const quoted = /^([\"'`])(.+)\\1$/.exec(q);\n if (quoted && quoted[2]!.trim()) q = quoted[2]!.trim();\n\n // Embedded URL / quoted needles inside a natural-language ask\n // (\"https://dash…/signup does not exist find occurrences\"). The literal\n // sweep must search for the *needle*, not the whole sentence — otherwise\n // extension.ts:955 (bare URL) is a complete miss while only test fixtures\n // that paste the full ask match.\n const embeddedNeedles = extractLiteralNeedles(q);\n const scanNeedle =\n embeddedNeedles.length === 0\n ? q\n : embeddedNeedles.length === 1 && embeddedNeedles[0] === q\n ? q\n : [...embeddedNeedles].sort((a, b) => b.length - a.length)[0]!;\n // Symbol pass: residual framing only, and empty when residual is pure\n // scaffolding (\"where is …?\") so we do not rank applyPlan.where etc.\n const symbolQuery =\n embeddedNeedles.length > 0 ? residualForSymbolSearch(q) : q;\n\n // Literal-sweep routing. Shapes that can never name one graph symbol:\n // - internal whitespace (\"find every place that says X\");\n // - explicit quotes (stripped above — quoting IS the sweep signal);\n // - a URL (`https://…`) — host/path tokens are not identifiers; without this\n // branch a bare URL stayed symbol-first and never ran the literal sweep\n // (field report: find occurrences of https://dash…/signup);\n // - embedded URL/quote inside NL framing (scanNeedle ≠ full query);\n // - a slash path with no `:` and no glob chars (\"opportunities/mine\",\n // \"api/users/mine\") — a route/path STRING. Its tokens previously fell into\n // the per-token symbol union, where a single loose token (\"mine\") produced\n // a confidently-ranked, completely unrelated symbol instead of a clean\n // literal answer. (`:`-bearing non-URL queries stay symbol-first: file:line\n // and qualified names look like paths too; globs keep the glob tier.)\n // Single-name lookups (the hot path) keep symbol-first behaviour unchanged.\n const isUrl = /^https?:\\/\\//i.test(scanNeedle) || embeddedNeedles.some((n) => /^https?:\\/\\//i.test(n));\n const isPhrase =\n Boolean(quoted) ||\n isUrl ||\n embeddedNeedles.length > 0 ||\n /\\s/.test(q) ||\n (/[/\\\\]/.test(q) && !q.includes(':') && !/[*?]/.test(q));\n\n // Pass 1 — graph name index (already ranked by importance).\n let nodes: GraphNode[] = [];\n if (symbolQuery.trim()) {\n nodes = findNodes(graph, symbolQuery).filter((n) => n.kind !== 'file');\n // File-path tier: a query that IS a repo path (\"src/services/OrderService.ts\")\n // used to dead-end — the name index only knows the file NODE (filtered out as\n // uninteresting) and the literal scan only finds the path where it appears as\n // text. The useful answer is the symbols DEFINED in that file, ranked.\n if (nodes.length === 0) {\n nodes = fileSymbolNodes(graph, symbolQuery);\n }\n // Reconstructed-identifier fallthrough: a humanized/spaced query (\"get id\",\n // \"use team\", \"f 0304\") is frequently a *single* identifier whose original\n // separators (camelCase boundary, `_`) were lost in humanization, not a\n // multi-word phrase. Try the two mechanical rejoins — concatenated (recovers\n // camelCase: \"get id\" -> \"getid\" == \"getId\") and underscore-joined (recovers\n // snake_case: \"f 0304\" -> \"f_0304\") — against the exact/case-insensitive name\n // index before falling through to the noisy per-token substring union below,\n // which has no way to re-associate short tokens back into one identifier and\n // silently drops single-character tokens (\"f\") that carry real information\n // (VG-LOCATE-FAILURE-ANALYSIS.md).\n if (nodes.length === 0 && isPhrase) {\n nodes = reconstructedIdentifierNodes(graph, symbolQuery);\n }\n // Multi-word fallthrough: an agent that types a phrase (\"NewScan modal\n // component\", \"dsn install command\") gets nothing from the whole-string name\n // index and nothing from the whole-string literal scan — a dead end. When the\n // exact query finds no symbol AND the query is multiple words, union the\n // per-token matches and rank by how many distinct query tokens each symbol\n // covers (then importance).\n if (nodes.length === 0) {\n const tokens = queryTokens(symbolQuery);\n if (tokens.length >= 2) nodes = multiTokenNodes(graph, tokens);\n }\n }\n // For a phrase, cap the symbol section to a fraction of the budget so it can\n // never crowd out the literal scan; the string hits lead, the loosely-matching\n // symbols follow as \"the name also means this\" context. Single names keep the\n // full budget for the symbol pass.\n const symbolCap = isPhrase ? Math.max(1, Math.floor(limit / 3)) : limit;\n const symbolHits: SymbolHit[] = nodes.slice(0, symbolCap).map((n, i) => ({\n kind: n.kind,\n name: n.qualifiedName,\n file: n.file,\n line: n.span.start,\n score: Math.round((1 - i / Math.max(nodes.length, 1)) * 100) / 100,\n }));\n\n // Pass 2 — literal scan for what the graph doesn't model. A phrase always gets\n // the budget the symbol cap freed up and a full count of what's out there\n // (`countAll`), so the caller can trust it for a complete sweep. A single name\n // only falls through on spare budget and stops at the budget, as before.\n // Scan `scanNeedle` (extracted URL/quote when present), not the full NL ask.\n const spare = limit - symbolHits.length;\n const textHits: TextHit[] = [];\n let truncatedScan = false;\n let totalTextMatches: number | undefined;\n // A single name the graph resolved EXACTLY (id / name / qualified name /\n // file:line) doesn't fall through to the literal scan at all: the symbol\n // answer is authoritative for \"where is X defined\", and padding it with text\n // occurrences meant every perfect lookup still paid a worst-case full-tree\n // sweep (the 16s-per-call trace on a large repo). Occurrence sweeps stay one\n // explicit call away (quote it / add whitespace, or use impact_of/get_node\n // callers for reference lists). Non-exact fallthroughs are unchanged.\n const skipScan = !isPhrase && hasExactSymbolMatch(nodes, symbolQuery || q);\n if (spare > 0 && !skipScan) {\n const seen = new Set(symbolHits.map((h) => `${h.file}:${h.line}`));\n const scan = await scanFiles(root, scanNeedle, spare, seen, textHits, isPhrase);\n truncatedScan = scan.truncated;\n if (isPhrase) totalTextMatches = scan.total;\n }\n\n // Phrase/URL occurrence answers lead with text hits; symbols are secondary.\n const matches = isPhrase ? [...textHits, ...symbolHits] : [...symbolHits, ...textHits];\n if (matches.length === 0) {\n const empty: SearchResult = {\n matches,\n moreAvailable: false,\n hint: 'no symbol or text match — for meaning-level questions (symptoms, relationships, what-breaks-if) use query_graph',\n };\n // Phrase/URL sweeps still report totalTextMatches (including 0) so callers\n // can tell a complete miss from a symbol-only empty without re-scanning.\n if (totalTextMatches !== undefined) empty.totalTextMatches = totalTextMatches;\n return empty;\n }\n\n const literalTruncated = totalTextMatches !== undefined && totalTextMatches > textHits.length;\n // A phrase's deliberately-capped symbol section is not \"more available\"; only a\n // truncated literal sweep is. A single name reports the usual symbol overflow.\n const moreAvailable = isPhrase ? literalTruncated || truncatedScan : nodes.length > symbolHits.length || truncatedScan;\n const result: SearchResult = { matches, moreAvailable };\n if (totalTextMatches !== undefined) result.totalTextMatches = totalTextMatches;\n if (literalTruncated) {\n result.hint = `showing ${textHits.length} of ${totalTextMatches}${truncatedScan ? '+' : ''} literal matches — raise limit or narrow the query to get them all`;\n }\n return result;\n}\n\n/**\n * Symbols defined in the file the query names, ranked by importance — the\n * file-path resolution tier. Accepts the exact repo-relative path (with or\n * without a leading `./`, either separator style) or an unambiguous path\n * suffix (\"services/OrderService.ts\"). Returns [] when the query names no file.\n */\nfunction fileSymbolNodes(graph: VgGraph, q: string): GraphNode[] {\n if (!/[/\\\\]/.test(q) && !/\\.\\w+$/.test(q)) return []; // cheap guard: not path-shaped\n const norm = q.replaceAll('\\\\', '/').replace(/^\\.\\//, '');\n const inFile = graph.nodes.filter(\n (n) => n.kind !== 'file' && (n.file === norm || n.file.endsWith(`/${norm}`)),\n );\n return [...inFile].sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName));\n}\n\n/**\n * Did the graph resolve `q` as an exact identifier (not a loose substring)?\n * Mirrors findNodes' exact tiers: content-hash id, `file:line`, and whole-name /\n * qualified-name equality (case-insensitive). Substring-tier matches return\n * false so a partial name still gets the literal fallthrough.\n */\nfunction hasExactSymbolMatch(nodes: GraphNode[], q: string): boolean {\n if (nodes.length === 0) return false;\n if (/^(.*):(\\d+)$/.test(q)) return true; // resolved via the file:line tier\n const lower = q.toLowerCase();\n return nodes.some((n) => n.id === q || n.qualifiedName.toLowerCase() === lower || n.name.toLowerCase() === lower);\n}\n\n/** Meaningful query words for the multi-word fallthrough (drop tiny tokens). */\nfunction queryTokens(q: string): string[] {\n return [...new Set(q.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length >= 2))];\n}\n\n/**\n * Rejoin a humanized query's words back into one identifier and look it up\n * exactly. Humanization is lossy (both camelCase boundaries and `_`/`-`\n * collapse to a plain space), so the original separator can't be recovered —\n * try both mechanical rejoins and let `findNodes`'s case-insensitive exact\n * match do the rest. Concatenated first (camelCase is the more common source\n * convention across this engine's languages); underscore-joined second.\n */\nfunction reconstructedIdentifierNodes(graph: VgGraph, q: string): GraphNode[] {\n const words = q.trim().split(/\\s+/).filter(Boolean);\n if (words.length < 2) return [];\n const concat = findNodes(graph, words.join(''));\n if (concat.length) return concat.filter((n) => n.kind !== 'file');\n const snake = findNodes(graph, words.join('_'));\n return snake.filter((n) => n.kind !== 'file');\n}\n\n/**\n * Union of per-token name-index matches, ranked by how many distinct query\n * tokens each symbol covers (then by importance). Reuses `findNodes` per token\n * so the matching rules (exact/short/case-insensitive/substring) stay identical\n * to a single-name lookup — this only broadens a phrase into its words.\n *\n * Noise guard: a symbol that only SUBSTRING-matched a single token is exactly\n * the false-positive case — \"opportunities/mine\" surfacing an unrelated symbol\n * through \"mine\" and presenting it as a confident answer when the honest\n * result is \"no match\" (field report). Such nodes need ≥ 2 covered tokens to\n * survive. A node whose NAME (or qualified name) equals a token outright is a\n * strong signal on its own and always survives — \"UserCard7 card panel\" must\n * keep UserCard7 even when the loose \"card\" token list is capped elsewhere.\n */\nfunction multiTokenNodes(graph: VgGraph, tokens: string[]): GraphNode[] {\n // One uncapped pass over the graph, scoring every node against every token.\n // (Delegating per-token to findNodes hit its 25-row substring cap: on a large\n // graph a common token's list overflows, real targets lose that token's\n // coverage, and the noise filter below would then discard them.)\n const scored: Array<{ node: GraphNode; hits: number; exact: boolean }> = [];\n for (const n of graph.nodes) {\n if (n.kind === 'file') continue;\n const name = n.name.toLowerCase();\n const qn = n.qualifiedName.toLowerCase();\n let hits = 0;\n let exact = false;\n for (const t of tokens) {\n if (name === t || qn === t) {\n hits++;\n exact = true;\n } else if (qn.includes(t)) hits++;\n }\n if (exact || hits >= 2) scored.push({ node: n, hits, exact });\n }\n return scored\n .sort((a, b) => Number(b.exact) - Number(a.exact) || b.hits - a.hits || b.node.importance - a.node.importance || a.node.qualifiedName.localeCompare(b.node.qualifiedName))\n .map((e) => e.node);\n}\n\ninterface ScanResult {\n /** Distinct matching lines found (excluding those already in `seen`). When\n * `countAll` is false this is only a lower bound — the scan stops at `budget`. */\n total: number;\n /** True when the scan stopped early (file cap hit, or budget hit without\n * `countAll`) — more matches may exist beyond what was counted. */\n truncated: boolean;\n}\n\n/**\n * Bounded, repo-root-jailed literal scan. Fills `out` with up to `budget` hits;\n * with `countAll` it reports the true total across the tree (a \"find every\n * occurrence\" sweep), otherwise it stops at `budget` (a cheap fallthrough).\n *\n * Two stages (VG-LITERAL-INDEX-DESIGN.md, Stage 1):\n * 1. LIST candidate files — `ripgrep` when it's on PATH (SIMD/parallel, prunes\n * to just the files that match), else a Node directory walk (Node-native,\n * offline, air-gap-safe). rg is only a pruner, never the authority.\n * 2. SCAN those files — `scanCandidates`, a uniform pure-JS engine that fans\n * large sweeps across `worker_threads` so it's fast on every platform with\n * nothing installed. It is the single source of the reported rows and\n * `total`, so the answer is identical whether or not rg is present.\n *\n * `seen` (the symbol-pass hit lines) is excluded so a line already shown as a\n * symbol isn't repeated as a text hit.\n */\nasync function scanFiles(root: string, needle: string, budget: number, seen: Set<string>, out: TextHit[], countAll: boolean): Promise<ScanResult> {\n const listing = listCandidateFiles(root, needle);\n const outcome = await scanCandidates(root, listing.files, needle, { collectAll: countAll, budget });\n\n let overlap = 0; // matches that coincide with a symbol-pass line (near-zero in practice)\n for (const h of outcome.hits) {\n if (seen.has(`${h.file}:${h.line}`)) {\n overlap++;\n continue;\n }\n seen.add(`${h.file}:${h.line}`);\n if (out.length < budget) out.push({ kind: 'text', file: h.file, line: h.line, preview: h.preview });\n }\n return { total: outcome.total - overlap, truncated: listing.truncated || outcome.truncated };\n}\n\ninterface Listing {\n /** Repo-relative candidate paths, lexicographically sorted (deterministic in\n * both modes so rows and truncation don't depend on which lister ran). */\n files: string[];\n /** True when the candidate set was capped (more files may match beyond it). */\n truncated: boolean;\n}\n\n/** rg-pruned candidates when available (fast), else the (cached) full Node walk. */\nfunction listCandidateFiles(root: string, needle: string): Listing {\n return ripgrepCandidates(root, needle) ?? walkCandidatesCached(root);\n}\n\n/**\n * TTL cache for the Node-walk listing. The walk is needle-independent (it lists\n * every scannable file), so a burst of search_symbols calls — the normal agent\n * pattern is several lookups in one turn — was re-walking the whole tree each\n * time. The TTL bounds staleness to the same few-second window the serve\n * freshness probe already accepts (server.ts PROBE_INTERVAL_MS); file CONTENTS\n * are always read live at scan time, so only a file created/deleted inside the\n * window can be missed, and only from the listing. rg listings are per-needle\n * and fast, so they bypass this cache entirely.\n */\nconst LISTING_TTL_MS = 2000;\nconst listingCache = new Map<string, { listing: Listing; at: number }>();\n\n/** Drop all cached listings (tests, or after a known tree mutation). */\nexport function clearListingCache(): void {\n listingCache.clear();\n}\n\n/** TTL, overridable via VG_LISTING_TTL_MS (0 disables caching entirely). */\nfunction listingTtlMs(): number {\n const v = Number(process.env.VG_LISTING_TTL_MS);\n return Number.isFinite(v) && v >= 0 ? v : LISTING_TTL_MS;\n}\n\nfunction walkCandidatesCached(root: string): Listing {\n const ttl = listingTtlMs();\n if (ttl > 0) {\n const hit = listingCache.get(root);\n if (hit && Date.now() - hit.at < ttl) return hit.listing;\n }\n const listing = walkCandidates(root);\n if (ttl > 0) listingCache.set(root, { listing, at: Date.now() });\n return listing;\n}\n\n/** Every non-ignored, non-hidden file under root — the Node-native fallback. */\nfunction walkCandidates(root: string): Listing {\n const files: string[] = [];\n let truncated = false;\n const stack = [root];\n while (stack.length) {\n const dir = stack.pop()!;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const e of entries) {\n if (e.name.startsWith('.') || IGNORE_DIRS.has(e.name)) continue;\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) {\n stack.push(abs);\n continue;\n }\n if (hasBinaryExt(e.name)) continue;\n if (files.length >= MAX_FILES_SCANNED) {\n truncated = true;\n continue;\n }\n files.push(toPosix(path.relative(root, abs)));\n }\n }\n files.sort();\n return { files, truncated };\n}\n\nlet rgAvailable: boolean | undefined;\n/** Is `ripgrep` usable? Probed once; opt out with VG_DISABLE_RIPGREP. */\nfunction hasRipgrep(): boolean {\n if (process.env.VG_DISABLE_RIPGREP) return false;\n if (rgAvailable === undefined) {\n try {\n rgAvailable = spawnSync('rg', ['--version'], { stdio: 'ignore', timeout: 3000, windowsHide: true }).status === 0;\n } catch {\n rgAvailable = false;\n }\n }\n return rgAvailable;\n}\n\n/**\n * Files containing `needle` per ripgrep, or `null` if rg is unavailable/errored\n * (caller falls back to the Node walk). rg is invoked as a fixed-string,\n * case-insensitive, gitignore-disabled, hidden-skipping lister — the same corpus\n * the Node walk sees — jailed to `root` via cwd. `--fixed-strings` + `--` make\n * the agent-supplied needle inert as a pattern/flag; no shell is involved.\n */\nfunction ripgrepCandidates(root: string, needle: string): Listing | null {\n if (!hasRipgrep()) return null;\n const globs = [...IGNORE_DIRS].flatMap((d) => ['--glob', `!**/${d}/**`, '--glob', `!${d}/**`]);\n const res = spawnSync(\n 'rg',\n ['--files-with-matches', '--fixed-strings', '--ignore-case', '--no-ignore', '--no-messages', ...globs, '--', needle, '.'],\n // windowsHide: rg runs from console-less hosts (vgd, editor-spawned\n // servers) too — never flash a console window for it.\n { cwd: root, encoding: 'utf8', timeout: 15_000, maxBuffer: 32 * 1024 * 1024, windowsHide: true },\n );\n // status 0 = matches, 1 = no matches (both fine); anything else / a spawn error\n // (signal kill on timeout, buffer overflow) is untrustworthy — fall back.\n if (res.error || (res.status !== 0 && res.status !== 1) || res.signal) return null;\n const files = parseRgFileList(res.stdout);\n if (files.length > MAX_FILES_SCANNED) return { files: files.slice(0, MAX_FILES_SCANNED), truncated: true };\n return { files, truncated: false };\n}\n\n/**\n * Parse `rg --files-with-matches` stdout into clean, sorted, POSIX-relative\n * paths. On Windows rg emits `.\\src\\Foo.cs` — before this was separator-aware,\n * the whole backslash path read as ONE segment starting with `.`, so the\n * defensive hidden-file filter below discarded every result and a Windows\n * machine with rg installed silently lost all literal hits. Normalising to\n * forward slashes first (matching the graph's own path style) makes the filter\n * see real segments on every platform. Exported for tests; `sep` is injectable\n * so Windows output can be simulated on any host.\n */\nexport function parseRgFileList(stdout: string, sep: string = path.sep): string[] {\n const seen = new Set<string>();\n for (const raw of stdout.split('\\n')) {\n if (!raw) continue;\n const posix = sep === '\\\\' ? raw.replaceAll('\\\\', '/') : raw;\n const rel = posix.startsWith('./') ? posix.slice(2) : posix;\n if (!rel) continue;\n // Defensive: never trust a path that escaped the ignore/hidden rules, and\n // keep the corpus identical to the walk's (same binary-extension skip).\n const segs = rel.split('/');\n if (segs.some((s) => s.startsWith('.') || IGNORE_DIRS.has(s))) continue;\n if (hasBinaryExt(rel)) continue;\n seen.add(rel);\n }\n return [...seen].sort();\n}\n"]}
1
+ {"version":3,"sources":["../src/engine/lockfile.ts","../src/engine/lib.ts","../src/engine/literal-scan.ts","../src/engine/search.ts"],"names":["fs","path","fs3","path3","os2","resolve","path4","fs4","sep"],"mappings":"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","file":"chunk-NZES47ST.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DepRecord } from './drift.js';\n\n/**\n * Lockfile-pinned version resolution (VG-LIB-SUPERSET-PLAN A.2 / D13).\n *\n * The version we serve docs for should be the one your **lockfile** pins, not\n * whatever happens to be unpacked in `node_modules` (which is empty in CI / a\n * fresh clone). This reads the pin deterministically and offline. Where a lockfile\n * isn't present or parseable we return `undefined` and the caller falls back to the\n * installed tree, then the declared range — we never fabricate a version.\n *\n * npm covers `package-lock.json` (v1/v2/v3), `pnpm-lock.yaml` (v6/v9) and\n * `yarn.lock`. Other ecosystems follow the same shape and return `undefined`\n * until their parser lands — honest degradation, no false mismatch.\n */\nexport function lockfileVersion(root: string, ecosystem: DepRecord['ecosystem'], name: string): string | undefined {\n if (ecosystem === 'npm') return packageLockVersion(root, name) ?? pnpmLockVersion(root, name) ?? yarnLockVersion(root, name);\n if (ecosystem === 'pypi') return pypiLockVersion(root, name);\n if (ecosystem === 'rust') return tomlPackageLock(root, 'Cargo.lock', name, rustName);\n if (ecosystem === 'ruby') return gemfileLock(root, name);\n if (ecosystem === 'php') return composerLock(root, name);\n if (ecosystem === 'dotnet') return packagesLock(root, name);\n if (ecosystem === 'swift') return packageResolved(root, name);\n if (ecosystem === 'dart') return pubspecLock(root, name);\n if (ecosystem === 'java') return gradleLock(root, name);\n return undefined;\n}\n\n/** Gradle `gradle.lockfile` — lines `group:artifact:version=configurations…`. */\nfunction gradleLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'gradle.lockfile'), 'utf8');\n } catch {\n return undefined;\n }\n const m = new RegExp(`^${escapeRegExp(name)}:([^=\\\\s]+)=`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** Swift `Package.resolved` — JSON pins (v2/v3 `pins[]`, v1 `object.pins[]`); match `identity`. */\nfunction packageResolved(root: string, name: string): string | undefined {\n let data: {\n pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }>;\n object?: { pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }> };\n };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Package.resolved'), 'utf8'));\n } catch {\n return undefined;\n }\n const pins = data.pins ?? data.object?.pins;\n if (!Array.isArray(pins)) return undefined;\n const target = name.toLowerCase();\n for (const p of pins) {\n const id = (p.identity ?? p.package ?? '').toLowerCase();\n if (id === target && p.state?.version) return p.state.version;\n }\n return undefined;\n}\n\n/** Dart `pubspec.lock` — YAML; each ` <name>:` block carries `version: \"x.y.z\"`. */\nfunction pubspecLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'pubspec.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inPkg = false;\n for (const line of text.split('\\n')) {\n const key = /^ ([A-Za-z0-9_.]+):\\s*$/.exec(line);\n if (key) {\n inPkg = key[1] === name;\n continue;\n }\n if (inPkg) {\n const vm = /^\\s+version:\\s*\"?([^\"\\s]+)\"?/.exec(line);\n if (vm) return vm[1];\n }\n }\n return undefined;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Ruby `Gemfile.lock` — the `specs:` block lists ` name (1.2.3)` (4-space indent). */\nfunction gemfileLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'Gemfile.lock'), 'utf8');\n } catch {\n return undefined;\n }\n // Spec definitions are 4-space-indented with a concrete (digit-leading) version;\n // nested dep constraints (6-space) and the DEPENDENCIES list (2-space) don't match.\n const m = new RegExp(`^ ${escapeRegExp(name)} \\\\((\\\\d[^)]*)\\\\)`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** PHP `composer.lock` — JSON `packages` / `packages-dev` arrays of `{ name, version }`. */\nfunction composerLock(root: string, name: string): string | undefined {\n let data: Record<string, Array<{ name?: string; version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'composer.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n for (const section of ['packages', 'packages-dev']) {\n const arr = data[section];\n if (!Array.isArray(arr)) continue;\n const p = arr.find((x) => x && x.name === name);\n if (p && typeof p.version === 'string') return p.version.replace(/^v/, '');\n }\n return undefined;\n}\n\n/** .NET `packages.lock.json` — `dependencies.<framework>.<id>.resolved` (ids case-insensitive). */\nfunction packagesLock(root: string, name: string): string | undefined {\n let data: { dependencies?: Record<string, Record<string, { resolved?: string }>> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'packages.lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = name.toLowerCase();\n for (const fw of Object.values(data.dependencies ?? {})) {\n if (!fw || typeof fw !== 'object') continue;\n for (const [id, v] of Object.entries(fw)) {\n if (id.toLowerCase() === target && v && typeof v.resolved === 'string') return v.resolved;\n }\n }\n return undefined;\n}\n\n/** PEP 503 name normalisation — names are case-insensitive and -/_/. are equivalent. */\nfunction pep503(name: string): string {\n return name.trim().toLowerCase().replace(/[-_.]+/g, '-');\n}\n\n/** Crate names: case-insensitive on crates.io; published name used verbatim otherwise. */\nfunction rustName(name: string): string {\n return name.trim().toLowerCase();\n}\n\n/** Python: `poetry.lock` / `uv.lock` (TOML `[[package]]`), then `Pipfile.lock` (JSON). */\nfunction pypiLockVersion(root: string, name: string): string | undefined {\n return (\n tomlPackageLock(root, 'poetry.lock', name, pep503) ??\n tomlPackageLock(root, 'uv.lock', name, pep503) ??\n pipfileLock(root, name)\n );\n}\n\n/**\n * Parse a TOML lockfile of `[[package]]` tables (poetry, uv, and Cargo.lock share this shape) for\n * the pinned version, without a TOML dependency: split on the array-of-tables\n * header and match `name`/`version` string keys within a block.\n */\nfunction tomlPackageLock(root: string, file: string, name: string, normalize: (s: string) => string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, file), 'utf8');\n } catch {\n return undefined;\n }\n const target = normalize(name);\n for (const block of text.split(/\\[\\[package\\]\\]/)) {\n const nm = /(?:^|\\n)\\s*name\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (nm && normalize(nm[1]) === target) {\n const ver = /(?:^|\\n)\\s*version\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (ver) return ver[1];\n }\n }\n return undefined;\n}\n\n/** Pipenv `Pipfile.lock` — JSON; versions look like `\"==1.2.3\"`. */\nfunction pipfileLock(root: string, name: string): string | undefined {\n let data: Record<string, Record<string, { version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Pipfile.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = pep503(name);\n for (const section of ['default', 'develop']) {\n const deps = data[section];\n if (!deps || typeof deps !== 'object') continue;\n for (const [k, v] of Object.entries(deps)) {\n if (pep503(k) === target && v && typeof v.version === 'string') {\n return v.version.replace(/^==/, '');\n }\n }\n }\n return undefined;\n}\n\n/** npm `package-lock.json` — JSON, deterministic, no dependency. */\nfunction packageLockVersion(root: string, name: string): string | undefined {\n let data: { packages?: Record<string, { version?: string }>; dependencies?: Record<string, { version?: string }> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'package-lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n // v2/v3: packages keyed by install path; the top-level dep is \"node_modules/<name>\".\n const top = data.packages?.[`node_modules/${name}`]?.version;\n if (typeof top === 'string') return top;\n // v1: flat dependencies map.\n const v1 = data.dependencies?.[name]?.version;\n return typeof v1 === 'string' ? v1 : undefined;\n}\n\n/**\n * `pnpm-lock.yaml` (v6 and v9) — the direct dependency's resolved version.\n *\n * pnpm is not a niche case: this repository is itself pnpm-only, so until this\n * existed every `resolveVersion` here reported no lockfile pin and fell through\n * to the installed tree — precisely the fallback this module exists to avoid,\n * because `node_modules` is empty in CI and on a fresh clone.\n *\n * Read from `importers`, not `packages`: the importer block records what this\n * project actually depends on, while `packages` lists the whole transitive\n * graph and can hold several versions of one name. Parsed by hand, like every\n * other reader here — a lockfile is megabytes and only one line is wanted.\n */\nfunction pnpmLockVersion(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'pnpm-lock.yaml'), 'utf8');\n } catch {\n return undefined;\n }\n const importers = sectionOf(text, 'importers');\n if (!importers) return undefined;\n // Entries look like:\n // commander:\n // specifier: ^15.0.0\n // version: 15.0.0(peer@1.2.3)\n // The name may be quoted when scoped ('@scope/pkg':).\n const key = escapeRegExp(name);\n const re = new RegExp(`^\\\\s+'?${key}'?:\\\\s*$\\\\n\\\\s+specifier:.*$\\\\n\\\\s+version:\\\\s*(\\\\S+)\\\\s*$`, 'm');\n const m = re.exec(importers);\n if (!m?.[1]) return undefined;\n // Strip pnpm's peer-suffix — `15.0.0(zod@4.4.3)` is still version 15.0.0.\n const version = m[1].replace(/\\(.*$/, '').trim();\n return version || undefined;\n}\n\n/** The body of a top-level YAML block, up to the next column-0 key. */\nfunction sectionOf(text: string, key: string): string | undefined {\n const start = new RegExp(`^${key}:\\\\s*$`, 'm').exec(text);\n if (!start) return undefined;\n const from = start.index + start[0].length;\n const next = /^\\S[^\\n]*:\\s*$/m.exec(text.slice(from));\n return next ? text.slice(from, from + next.index) : text.slice(from);\n}\n\n/**\n * `yarn.lock` — a custom text format. Each block opens with one or more\n * comma-separated `name@range` specifiers (possibly quoted) and ends with an\n * indented `version \"x.y.z\"`. We find the block whose header names our package and\n * return its version. Scoped names (`@scope/pkg@range`) are handled via lastIndexOf.\n */\nfunction yarnLockVersion(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'yarn.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inBlock = false;\n for (const line of text.split('\\n')) {\n if (line && !/^\\s/.test(line) && !line.startsWith('#')) {\n inBlock = headerNamesPackage(line, name);\n } else if (inBlock) {\n const m = /^\\s+version:?\\s+\"?([^\"\\s]+)\"?/.exec(line);\n if (m) return m[1];\n }\n }\n return undefined;\n}\n\nfunction headerNamesPackage(header: string, name: string): boolean {\n return header\n .replace(/:\\s*$/, '')\n .split(',')\n .some((spec) => {\n const s = spec.trim().replace(/^\"|\"$/g, '');\n const at = s.lastIndexOf('@');\n if (at <= 0) return false; // <=0 keeps scoped leading '@' from matching empty name\n const specName = s.slice(0, at);\n return specName === name;\n });\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { stableStringify } from './serialize.js';\nimport { hashString } from './hash.js';\nimport { inventory, installedTreeVersion, type DriftInventory } from './drift.js';\nimport { lockfileVersion } from './lockfile.js';\n\n/**\n * `vg lib` — a deterministic, on-disk library-currency catalog: version-correct\n * usage docs for the **exact version in your lockfile**, drift-annotated, from\n * on-disk sources (no key).\n *\n * The catalog (`vibgrate.lib.json`) is small and committable; doc bodies live in\n * `.vibgrate/lib/<id>.md` so the team shares them on pull. Ingestion is\n * deterministic from local sources; URL/llms.txt ingestion is opt-in network.\n */\n\nexport const LIB_SCHEMA = 'vg-lib/1.0' as const;\n\nexport interface LibSource {\n type: 'local' | 'llms.txt' | 'website' | 'openapi' | 'git';\n location: string;\n}\n\nexport interface LibEntry {\n id: string;\n name: string;\n version: string; // cataloged doc version ('*' if unknown)\n source: LibSource;\n docFile: string; // relative to root (.vibgrate/lib/<id>.md)\n docHash: string;\n bytes: number;\n}\n\nexport interface LibCatalog {\n schemaVersion: typeof LIB_SCHEMA;\n libraries: Record<string, LibEntry>;\n}\n\nexport function catalogPath(root: string): string {\n return path.join(root, 'vibgrate.lib.json');\n}\nexport function libDir(root: string): string {\n return path.join(root, '.vibgrate', 'lib');\n}\n\nexport function libId(name: string): string {\n return name.trim().toLowerCase().replace(/^@/, '').replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');\n}\n\nexport function loadCatalog(root: string): LibCatalog {\n const file = catalogPath(root);\n if (fs.existsSync(file)) {\n try {\n const data = JSON.parse(fs.readFileSync(file, 'utf8')) as LibCatalog;\n if (data.schemaVersion === LIB_SCHEMA && data.libraries) return data;\n } catch {\n /* fall through to empty */\n }\n }\n return { schemaVersion: LIB_SCHEMA, libraries: {} };\n}\n\nexport function saveCatalog(root: string, catalog: LibCatalog): void {\n fs.writeFileSync(catalogPath(root), `${stableStringify(catalog, 2)}\\n`);\n}\n\n/** Resolve a fuzzy name to a catalog entry (exact id, name, or substring). */\nexport function resolveLib(catalog: LibCatalog, name: string): LibEntry | undefined {\n const id = libId(name);\n if (catalog.libraries[id]) return catalog.libraries[id];\n const lower = name.toLowerCase();\n const all = Object.values(catalog.libraries);\n return (\n all.find((e) => e.name.toLowerCase() === lower) ??\n all.find((e) => e.id.includes(id) || e.name.toLowerCase().includes(lower))\n );\n}\n\n/**\n * The lockfile/manifest version of a dependency, for drift annotation.\n *\n * `inv` lets a caller that resolves many names hand in one inventory instead of\n * rebuilding it per name. Building it walks the manifest tree and probes\n * `node_modules` for every declared dependency, so `vg lib`'s catalog listing —\n * a `driftFor` per entry — was paying that whole cost once per library.\n */\nexport function installedVersion(root: string, name: string, inv?: DriftInventory): string | undefined {\n const rec = (inv ?? inventory(root)).records.find((r) => r.name === name);\n return rec?.installed ?? rec?.declared;\n}\n\nexport interface VersionResolution {\n /** The version we serve docs for: lockfile pin → installed tree → declared range. */\n served?: string;\n source: 'lockfile' | 'installed' | 'declared' | 'unknown';\n lockfile?: string;\n installed?: string;\n declared?: string;\n /** Set when the lockfile pin and the installed tree disagree (the dev should fix). */\n mismatch?: { lockfile: string; installed: string; note: string };\n}\n\nconst stripRange = (v?: string): string | undefined => v?.replace(/^[v^~>=<\\s]+/, '');\n\n/**\n * Resolve the version to serve docs for, **lockfile-first**, and detect a\n * lockfile↔installed disagreement (VG-LIB-SUPERSET-PLAN D13 / G8). Precedence:\n * lockfile pin → installed tree → declared range. When both a lockfile pin and an\n * installed version are readable and differ, surface a mismatch the dev should fix —\n * a signal a hosted docs service can't produce (it has no view of your installed tree).\n */\nexport function resolveVersion(root: string, name: string): VersionResolution {\n const rec = inventory(root).records.find((r) => r.name === name);\n const declared = rec?.declared;\n // npm installed comes from node_modules (via inventory); other ecosystems read their\n // installed tree (Python .dist-info, PHP installed.json) so the mismatch alert applies too.\n const installed = rec?.installed ?? (rec ? installedTreeVersion(root, rec.ecosystem, name) : undefined);\n const lockfile = rec ? lockfileVersion(root, rec.ecosystem, name) : undefined;\n\n let mismatch: VersionResolution['mismatch'];\n if (lockfile && installed && stripRange(lockfile) !== stripRange(installed)) {\n mismatch = {\n lockfile,\n installed,\n note: `lockfile pins ${lockfile} but the installed tree has ${installed} — your install is out of sync with the lockfile (re-install or commit the lock)`,\n };\n }\n\n const served = lockfile ?? installed ?? declared;\n const source: VersionResolution['source'] = lockfile\n ? 'lockfile'\n : installed\n ? 'installed'\n : declared\n ? 'declared'\n : 'unknown';\n return { served, source, lockfile, installed, declared, mismatch };\n}\n\nexport interface DriftNote {\n cataloged: string;\n installed?: string;\n drift: 'current' | 'behind' | 'ahead' | 'unknown';\n}\n\nexport function driftFor(root: string, entry: LibEntry, inv?: DriftInventory): DriftNote {\n const installed = installedVersion(root, entry.name, inv);\n if (!installed || entry.version === '*') return { cataloged: entry.version, installed, drift: 'unknown' };\n const norm = (v: string) => v.replace(/^[v^~>=<\\s]+/, '');\n const a = norm(entry.version);\n const b = norm(installed);\n if (a === b) return { cataloged: entry.version, installed, drift: 'current' };\n return { cataloged: entry.version, installed, drift: cmp(a, b) < 0 ? 'behind' : 'ahead' };\n}\n\nfunction cmp(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const d = (pa[i] || 0) - (pb[i] || 0);\n if (d) return d;\n }\n return 0;\n}\n\nexport interface AddOptions {\n root: string;\n name?: string;\n version?: string;\n /** Allow network for URL/llms.txt sources. */\n allowNetwork?: boolean;\n fetchImpl?: typeof globalThis.fetch;\n}\n\n/**\n * Recognise a git source. We treat a source as git when it is unambiguously\n * one: a `git+` scheme prefix, an `scp`-style `git@host:org/repo`, or a URL\n * ending in `.git`. A plain `https://…/docs` stays a website (no `.git`), so the\n * classification is deterministic and never surprises a URL ingest.\n * Returns the clone URL (with any `git+` prefix stripped), or null.\n */\nexport function parseGitSource(source: string): string | null {\n if (source.startsWith('git+')) return source.slice(4);\n if (/^git@[^:]+:/.test(source)) return source;\n if (/\\.git\\/?$/.test(source)) return source;\n return null;\n}\n\n/** Ingest docs for a library from a local path, a git repo, or (opt-in) a URL. */\nexport async function addLibrary(source: string, opts: AddOptions): Promise<LibEntry> {\n const { root } = opts;\n let content: string;\n let type: LibSource['type'] = 'local';\n\n const gitUrl = parseGitSource(source);\n if (gitUrl) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to clone ${source} without --online (offline by default)`);\n }\n content = cloneAndReadGit(gitUrl);\n type = 'git';\n } else if (/^https?:\\/\\//.test(source)) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to fetch ${source} without --online (offline by default)`);\n }\n const res = await (opts.fetchImpl ?? globalThis.fetch)(source);\n if (!res.ok) throw new Error(`fetch failed (${res.status}) for ${source}`);\n content = await res.text();\n type = source.endsWith('llms.txt') ? 'llms.txt' : source.endsWith('.json') ? 'openapi' : 'website';\n } else {\n const abs = path.resolve(root, source);\n if (!fs.existsSync(abs)) throw new Error(`source not found: ${source}`);\n content = readLocal(abs);\n type = 'local';\n }\n\n const name = opts.name ?? inferName(source);\n const id = libId(name);\n const version = opts.version ?? installedVersion(root, name) ?? '*';\n\n fs.mkdirSync(libDir(root), { recursive: true });\n const docFileAbs = path.join(libDir(root), `${id}.md`);\n fs.writeFileSync(docFileAbs, content);\n\n const entry: LibEntry = {\n id,\n name,\n version,\n source: { type, location: source },\n docFile: path.relative(root, docFileAbs).split(path.sep).join('/'),\n docHash: hashString(content),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n\n const catalog = loadCatalog(root);\n catalog.libraries[id] = entry;\n saveCatalog(root, catalog);\n return entry;\n}\n\nexport function readDoc(root: string, entry: LibEntry): string {\n const abs = path.resolve(root, entry.docFile);\n return fs.existsSync(abs) ? fs.readFileSync(abs, 'utf8') : '';\n}\n\nexport interface LocalDocs {\n docs: string;\n version?: string;\n /** Cited on-disk source, relative to root (e.g. `node_modules/react/README.md`). */\n source: string;\n /**\n * True when the payload is only a package README / description — no package\n * `docs/` markdown was merged in. Used by the quality gate to refuse\n * overconfident answers on focused API queries.\n */\n readmeOnly?: boolean;\n}\n\n/** Find an installed npm package directory, walking up for hoisted `node_modules`. */\nfunction npmPackageDir(root: string, name: string): string | undefined {\n let cur = root;\n for (let i = 0; i < 12; i++) {\n const dir = path.join(cur, 'node_modules', name);\n if (fs.existsSync(path.join(dir, 'package.json'))) return dir;\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return undefined;\n}\n\nconst README_CANDIDATES = ['llms.txt', 'README.md', 'README.mdx', 'README', 'readme.md'] as const;\n\n/** Collect package `docs/` markdown files, optionally filtered by query terms. */\nfunction packageDocsMarkdown(dir: string, query?: string): { text: string; files: string[] } | undefined {\n const docsDir = path.join(dir, 'docs');\n if (!fs.existsSync(docsDir) || !fs.statSync(docsDir).isDirectory()) return undefined;\n const files: string[] = [];\n const walk = (d: string, depth: number): void => {\n if (depth > 3 || files.length >= 40) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const e of entries) {\n if (files.length >= 40) return;\n const full = path.join(d, e.name);\n if (e.isDirectory()) {\n if (e.name.startsWith('.') || e.name === 'node_modules') continue;\n walk(full, depth + 1);\n } else if (e.isFile() && /\\.(md|mdx)$/i.test(e.name)) {\n files.push(full);\n }\n }\n };\n walk(docsDir, 0);\n if (!files.length) return undefined;\n\n const terms = (query ?? '')\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((w) => w.length > 2);\n const scored = files.map((f) => {\n let body = '';\n try {\n body = fs.readFileSync(f, 'utf8');\n } catch {\n return { f, body: '', score: -1 };\n }\n const lc = `${path.basename(f)}\\n${body}`.toLowerCase();\n const score = terms.length ? terms.filter((t) => lc.includes(t)).length : 1;\n return { f, body, score };\n });\n // Prefer query-relevant docs; when no query, take a deterministic head of the tree.\n const picked = (terms.length ? scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score || a.f.localeCompare(b.f)) : scored)\n .filter((s) => s.body.trim())\n .slice(0, terms.length ? 8 : 5);\n if (!picked.length) return undefined;\n const text = picked\n .map((s) => `<!-- ${path.relative(dir, s.f).split(path.sep).join('/')} -->\\n${s.body.trim()}`)\n .join('\\n\\n');\n return {\n text,\n files: picked.map((s) => path.relative(dir, s.f).split(path.sep).join('/')),\n };\n}\n\n/**\n * Local-first resolution ladder (VG-LIB-SUPERSET-PLAN A.2.3): when a library isn't\n * in the committed catalog, read its docs **from the\n * installed package on disk**, version-correct by construction and offline. Prefers\n * `llms.txt`, then the README, then package `docs/` markdown (query-filtered when\n * provided), then the package.json description. First slice: npm (`node_modules`).\n */\nexport function localPackageDocs(root: string, name: string, opts?: { query?: string }): LocalDocs | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n const version = resolveVersion(root, name).served;\n let primary: { docs: string; source: string } | undefined;\n for (const f of README_CANDIDATES) {\n const p = path.join(dir, f);\n try {\n const docs = fs.readFileSync(p, 'utf8');\n if (docs.trim()) {\n primary = { docs, source: path.relative(root, p).split(path.sep).join('/') };\n break;\n }\n } catch {\n /* next candidate */\n }\n }\n\n const extra = packageDocsMarkdown(dir, opts?.query);\n if (primary && extra) {\n return {\n docs: `${primary.docs.trim()}\\n\\n## Package docs\\n\\n${extra.text}`,\n version,\n source: `${primary.source}+docs/`,\n readmeOnly: false,\n };\n }\n if (primary) {\n return { ...primary, version, readmeOnly: true };\n }\n if (extra) {\n return {\n docs: extra.text,\n version,\n source: path.relative(root, path.join(dir, 'docs')).split(path.sep).join('/') + '/',\n readmeOnly: false,\n };\n }\n\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as {\n description?: string;\n version?: string;\n };\n if (pkg.description?.trim()) {\n return {\n docs: `# ${name}\\n\\n${pkg.description}`,\n version: version ?? pkg.version,\n source: path.relative(root, path.join(dir, 'package.json')).split(path.sep).join('/'),\n readmeOnly: true,\n };\n }\n } catch {\n /* ignore */\n }\n return undefined;\n}\n\ntype PkgJson = {\n types?: string;\n typings?: string;\n exports?: unknown;\n};\n\n/** Resolve a relative types path from package.json (including exports map). */\nfunction typesFromPkg(dir: string, pkg: PkgJson): string | undefined {\n const tryRel = (rel: unknown): string | undefined => {\n if (typeof rel !== 'string') return undefined;\n const p = path.join(dir, rel);\n return fs.existsSync(p) ? p : undefined;\n };\n const top = tryRel(pkg.types) ?? tryRel(pkg.typings);\n if (top) return top;\n const exp = pkg.exports;\n if (!exp || typeof exp !== 'object') return undefined;\n // Prefer the \".\" export; fall back to any types condition we can find.\n const roots: unknown[] = [];\n if ('.' in (exp as Record<string, unknown>)) roots.push((exp as Record<string, unknown>)['.']);\n else roots.push(...Object.values(exp as Record<string, unknown>));\n for (const entry of roots) {\n if (typeof entry === 'string') {\n const hit = tryRel(entry.endsWith('.d.ts') ? entry : undefined);\n if (hit) return hit;\n continue;\n }\n if (entry && typeof entry === 'object') {\n const o = entry as Record<string, unknown>;\n for (const key of ['types', 'typings', 'import', 'require', 'default']) {\n const v = o[key];\n if (typeof v === 'string') {\n const hit = tryRel(v.endsWith('.ts') || v.endsWith('.d.ts') || v.endsWith('.mts') || v.endsWith('.cts') ? v : undefined);\n if (hit) return hit;\n } else if (v && typeof v === 'object' && typeof (v as { types?: string }).types === 'string') {\n const hit = tryRel((v as { types: string }).types);\n if (hit) return hit;\n }\n }\n }\n }\n return undefined;\n}\n\n/** Locate a package's TypeScript declaration entry (`types`/`typings`/exports, else conventional paths). */\nfunction dtsEntry(dir: string): string | undefined {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as PkgJson;\n const fromPkg = typesFromPkg(dir, pkg);\n if (fromPkg) return fromPkg;\n } catch {\n /* fall through to conventional paths */\n }\n for (const c of [\n 'index.d.ts',\n 'dist/index.d.ts',\n 'dist/types/index.d.ts',\n 'lib/index.d.ts',\n 'types/index.d.ts',\n 'build/index.d.ts',\n ]) {\n const p = path.join(dir, c);\n if (fs.existsSync(p)) return p;\n }\n return undefined;\n}\n\nconst MAX_DTS_FILES = 30;\nconst MAX_DTS_BYTES = 512_000;\n\n/** Bounded walk for `.d.ts` files under a package (for query-focused symbol lookup). */\nfunction collectDtsFiles(dir: string): string[] {\n const out: string[] = [];\n const walk = (d: string, depth: number): void => {\n if (depth > 4 || out.length >= MAX_DTS_FILES) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const e of entries) {\n if (out.length >= MAX_DTS_FILES) return;\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue;\n const full = path.join(d, e.name);\n if (e.isDirectory()) walk(full, depth + 1);\n else if (e.isFile() && /\\.d\\.(ts|mts|cts)$/.test(e.name)) out.push(full);\n }\n };\n walk(dir, 0);\n return out;\n}\n\n/**\n * Extract exported declaration signatures from a `.d.ts` source. Declaration files\n * are body-less, so a brace-depth scanner is deterministic and robust: capture each\n * top-level `export …` statement from the keyword through its terminating `;` or\n * matching `}`. Also keeps named re-export lines (`export { foo } from '…'`) so\n * modern barrel packages still surface API names.\n */\nexport function extractDtsApi(src: string, maxDecls = 200): string[] {\n const out: string[] = [];\n let depth = 0;\n let capture: string[] | null = null;\n for (const raw of src.split('\\n')) {\n const line = raw.trim();\n // Named re-exports: keep the line so symbols like createMiddleware appear.\n if (capture === null && depth === 0 && /^export\\s+\\{[^}]+\\}/.test(line)) {\n out.push(raw.trim());\n if (out.length >= maxDecls) break;\n continue;\n }\n if (\n capture === null &&\n depth === 0 &&\n /^export\\b/.test(line) &&\n !/^export\\s+(\\{|\\*|default\\b|type\\s+\\{)/.test(line)\n ) {\n capture = [];\n }\n if (capture) capture.push(raw);\n for (const ch of raw) {\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n }\n if (capture && depth === 0 && /[;}]\\s*$/.test(line)) {\n out.push(capture.join('\\n').trim());\n capture = null;\n if (out.length >= maxDecls) break;\n }\n }\n return out;\n}\n\n/** Names mentioned in `export { a, b as c }` lines. */\nfunction reExportNames(decl: string): string[] {\n const m = /^export\\s*\\{([^}]+)\\}/.exec(decl.trim());\n if (!m) return [];\n const names: string[] = [];\n for (const part of m[1].split(',')) {\n const n = part.trim().split(/\\s+as\\s+/i).pop()?.trim();\n if (n && /^[A-Za-z_$][\\w$]*$/.test(n)) names.push(n);\n }\n return names;\n}\n\n/**\n * Version-correct typed API surface from a package's `.d.ts` files.\n * When `query` is set, prefer declarations that mention query terms (so\n * `library_docs({ query: \"createMiddleware\" })` returns the matching signature,\n * not only a truncated README).\n */\nexport function localApiSurface(root: string, name: string, query?: string): string | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n\n const entry = dtsEntry(dir);\n const files = entry ? [entry, ...collectDtsFiles(dir).filter((f) => f !== entry)] : collectDtsFiles(dir);\n if (!files.length) return undefined;\n\n const allDecls: string[] = [];\n const seen = new Set<string>();\n for (const f of files) {\n let src: string;\n try {\n const st = fs.statSync(f);\n if (st.size > MAX_DTS_BYTES) continue;\n src = fs.readFileSync(f, 'utf8');\n } catch {\n continue;\n }\n for (const d of extractDtsApi(src)) {\n if (seen.has(d)) continue;\n seen.add(d);\n allDecls.push(d);\n if (allDecls.length >= 400) break;\n }\n if (allDecls.length >= 400) break;\n }\n if (!allDecls.length) return undefined;\n\n const terms = (query ?? '')\n .split(/[^A-Za-z0-9_$]+/)\n .filter((w) => w.length > 2);\n if (terms.length) {\n const lcTerms = terms.map((t) => t.toLowerCase());\n const matched = allDecls.filter((d) => {\n const lc = d.toLowerCase();\n return lcTerms.some((t) => lc.includes(t));\n });\n // Expand bare re-export lines to fuller decls of the same name when possible.\n const expanded: string[] = [];\n const expandedSeen = new Set<string>();\n for (const d of matched) {\n const names = reExportNames(d);\n if (names.length) {\n for (const n of names) {\n const fuller = allDecls.find(\n (x) => !/^export\\s*\\{/.test(x) && new RegExp(`\\\\b${n}\\\\b`).test(x),\n );\n const pick = fuller ?? d;\n if (!expandedSeen.has(pick)) {\n expandedSeen.add(pick);\n expanded.push(pick);\n }\n }\n } else if (!expandedSeen.has(d)) {\n expandedSeen.add(d);\n expanded.push(d);\n }\n }\n if (expanded.length) return expanded.slice(0, 40).join('\\n\\n');\n }\n\n // No query (or no match): return entry-file decls first, then a capped head.\n return allDecls.slice(0, 80).join('\\n\\n');\n}\n\n/** Append the typed API surface (if any) as a fenced section — composed into served docs. */\nexport function withApiSurface(root: string, name: string, docs: string, query?: string): string {\n const api = localApiSurface(root, name, query);\n return api ? `${docs}\\n\\n## API (types)\\n\\n\\`\\`\\`ts\\n${api}\\n\\`\\`\\`\\n` : docs;\n}\n\n/**\n * Shallow-clone a git repo to a temp dir, read its docs, then remove the clone.\n * Network-touching, so it only runs under `--online` (gated by the caller). The\n * clone is `--depth 1` (no history) and the temp dir is always cleaned up.\n */\nfunction cloneAndReadGit(url: string): string {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'vg-lib-git-'));\n try {\n execFileSync('git', ['clone', '--depth', '1', '--quiet', url, dir], {\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n } catch (err) {\n fs.rmSync(dir, { recursive: true, force: true });\n const detail = err instanceof Error && err.message ? `: ${err.message.split('\\n')[0]}` : '';\n throw new Error(`git clone failed for ${url}${detail}`);\n }\n try {\n return readGitDocs(dir);\n } finally {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/**\n * Read the documentation out of a cloned repo, deterministically: prefer a\n * top-level `docs/` directory, else the root README, else any top-level prose.\n */\nfunction readGitDocs(dir: string): string {\n const docsDir = path.join(dir, 'docs');\n if (fs.existsSync(docsDir) && fs.statSync(docsDir).isDirectory()) return readLocal(docsDir);\n const readme = ['README.md', 'README.mdx', 'README.txt', 'README.rst', 'readme.md']\n .map((f) => path.join(dir, f))\n .find((p) => fs.existsSync(p));\n if (readme) return fs.readFileSync(readme, 'utf8');\n return readLocal(dir);\n}\n\nfunction readLocal(abs: string): string {\n const stat = fs.statSync(abs);\n if (stat.isFile()) return fs.readFileSync(abs, 'utf8');\n // Directory: concatenate markdown/text files deterministically.\n const parts: string[] = [];\n const files = fs\n .readdirSync(abs, { withFileTypes: true })\n .filter((e) => e.isFile() && /\\.(md|mdx|txt|rst)$/i.test(e.name))\n .map((e) => e.name)\n .sort();\n for (const f of files) parts.push(`<!-- ${f} -->\\n${fs.readFileSync(path.join(abs, f), 'utf8')}`);\n return parts.join('\\n\\n');\n}\n\nfunction inferName(source: string): string {\n const cleaned = source.replace(/^git\\+/, '').replace(/\\.git\\/?$/i, '');\n const base = cleaned.replace(/\\/+$/, '').split(/[/:]/).pop() ?? cleaned;\n return base.replace(/\\.(md|mdx|txt|rst|json)$/i, '').replace(/^llms$/, 'docs');\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { Worker } from 'node:worker_threads';\n\n/**\n * The uniform literal-search core for `search_symbols` (VG-LITERAL-INDEX-DESIGN.md\n * Stage 1). Reads a set of candidate files and returns every matching line,\n * case-insensitive, deterministically ordered by (file, line).\n *\n * Performance is delivered WITHOUT any external binary or persisted index, so it\n * is identical on Linux, macOS and Windows and needs nothing installed:\n * - small file sets scan inline (worker startup would cost more than it saves);\n * - large sets fan out across `worker_threads` — a proven, Node-native way to\n * use every core. ripgrep, when present, prunes the candidate set upstream so\n * this scans only a handful of files; when it's absent this is the whole\n * engine, and the parallel path keeps it fast on big repos.\n *\n * The per-file matcher is one tiny function shared by the inline path and the\n * worker (as a source string) so the two can't drift; a parity test asserts they\n * agree. It leans on V8's native `toLowerCase`/`includes` rather than a\n * hand-rolled byte scan — simpler, and faster than interpreted JS byte loops.\n */\n\nconst MAX_FILE_BYTES = 1_000_000;\nconst PREVIEW_CHARS = 120;\nconst NUL = '\\u0000'; // a NUL byte marks a binary file — skipped, same as ripgrep does\n/**\n * Fan out to workers only above this many candidate BYTES. Benchmarking showed\n * that gating on file *count* is wrong: a few thousand small files (≈8 MB) scan\n * ~2× faster inline than across workers, because worker startup + result IPC\n * dwarfs the actual matching. Parallelism only pays once there is real byte\n * volume to amortise it (big monorepos, generated trees). Below the threshold\n * the improved single-thread scan — one lowercase per file, no per-line\n * re-lowercase — is the fastest and has zero worker overhead.\n */\nconst PARALLEL_MIN_BYTES = 64_000_000;\n/**\n * Don't even measure bytes below this file count: a repo with few files can't\n * hold enough work to beat worker startup, and skipping the stat pass keeps\n * typical small repos overhead-free. Above it, `measure` decides by bytes.\n */\nconst PARALLEL_MIN_FILES = 2000;\n/** Hard cap on collected rows so a pathologically common phrase can't blow memory;\n * the true match count is still tallied exactly and `truncated` is set. */\nconst ROW_CAP = 10_000;\n\nexport interface LiteralHit {\n file: string;\n line: number;\n preview: string;\n}\n\nexport interface ScanOutcome {\n /** Matching lines, deterministically ordered by (file, line), capped at ROW_CAP. */\n hits: LiteralHit[];\n /** Exact count of all matching lines (counts past ROW_CAP / past `budget`). */\n total: number;\n /** True when rows were capped (ROW_CAP or, in bounded mode, `budget`). */\n truncated: boolean;\n}\n\nexport interface ScanOptions {\n /** Collect and count every match (a \"find every occurrence\" sweep). When false,\n * stop once `budget` rows are collected (a cheap bounded fallthrough). */\n collectAll: boolean;\n /** Row budget for the bounded (`collectAll: false`) mode. */\n budget: number;\n}\n\n/**\n * Scan `files` (repo-relative paths under `root`) for `needle`, case-insensitive.\n * Chooses inline vs. parallel by set size; both produce identical output.\n */\nexport async function scanCandidates(root: string, files: string[], needle: string, opts: ScanOptions): Promise<ScanOutcome> {\n const needleLower = needle.toLowerCase();\n if (!needleLower || files.length === 0) return { hits: [], total: 0, truncated: false };\n // Few files can't out-earn worker startup — inline directly, no stat pass.\n // (Bounded mode additionally early-stops the moment the budget fills.)\n if (files.length < PARALLEL_MIN_FILES && !process.env.VG_PARALLEL_MIN_BYTES) {\n return opts.collectAll\n ? scanInline(root, files, needleLower, ROW_CAP, false, undefined)\n : scanInline(root, files, needleLower, opts.budget, true, undefined);\n }\n // Many files: measure the candidate bytes once, then let workers in only when\n // there's enough volume to amortise them. This now includes the BOUNDED path\n // (a single-name fallthrough): its early-stop only ever helps when the needle\n // is common enough to fill the budget — the expensive case is precisely a RARE\n // needle, where the scan must sweep everything anyway and used to do so\n // single-threaded (the 16s-per-call trace). Sizes from the measure pass are\n // reused by the inline scan (no double-stat).\n const { over, sizes } = measure(root, files);\n if (!over) {\n return opts.collectAll\n ? scanInline(root, files, needleLower, ROW_CAP, false, sizes)\n : scanInline(root, files, needleLower, opts.budget, true, sizes);\n }\n const out = await scanParallel(root, files, needleLower);\n if (!opts.collectAll && out.hits.length > opts.budget) {\n out.hits.length = opts.budget;\n out.truncated = true;\n }\n return out;\n}\n\n/** The byte threshold, overridable via VG_PARALLEL_MIN_BYTES (ops knob + tests). */\nfunction parallelMinBytes(): number {\n const v = Number(process.env.VG_PARALLEL_MIN_BYTES);\n return Number.isFinite(v) && v >= 0 ? v : PARALLEL_MIN_BYTES;\n}\n\n/** Sum candidate bytes, short-circuiting once the worker threshold is crossed. */\nfunction measure(root: string, files: string[]): { over: boolean; sizes: Map<string, number> } {\n const threshold = parallelMinBytes();\n const sizes = new Map<string, number>();\n let total = 0;\n for (const rel of files) {\n let size: number;\n try {\n size = fs.statSync(path.join(root, rel)).size;\n } catch {\n continue;\n }\n sizes.set(rel, size);\n if (size <= MAX_FILE_BYTES) total += size;\n if (total >= threshold) return { over: true, sizes };\n }\n return { over: false, sizes };\n}\n\n/** The one true per-file matcher. Kept trivial so the worker copy stays in sync. */\nfunction matchLines(text: string, needleLower: string): Array<{ line: number; preview: string }> {\n const low = text.toLowerCase();\n if (!low.includes(needleLower)) return [];\n const lowLines = low.split('\\n');\n const rawLines = text.split('\\n');\n const hits: Array<{ line: number; preview: string }> = [];\n for (let i = 0; i < lowLines.length; i++) {\n if (lowLines[i].includes(needleLower)) hits.push({ line: i + 1, preview: rawLines[i].trim().slice(0, PREVIEW_CHARS) });\n }\n return hits;\n}\n\n/**\n * Read one candidate file, applying the size/binary guards. `null` = skip.\n * `knownSize` (from the measure pass) lets us skip a redundant `statSync`.\n */\nfunction readCandidate(abs: string, knownSize?: number): string | null {\n try {\n const size = knownSize ?? fs.statSync(abs).size;\n if (size > MAX_FILE_BYTES) return null;\n const text = fs.readFileSync(abs, 'utf8');\n return text.includes(NUL) ? null : text;\n } catch {\n return null;\n }\n}\n\nfunction scanInline(root: string, files: string[], needleLower: string, cap: number, stopAtCap: boolean, sizes: Map<string, number> | undefined): ScanOutcome {\n const hits: LiteralHit[] = [];\n let total = 0;\n let truncated = false;\n for (const rel of files) {\n const text = readCandidate(path.join(root, rel), sizes?.get(rel));\n if (text === null) continue;\n for (const h of matchLines(text, needleLower)) {\n total++;\n if (hits.length < cap) hits.push({ file: rel, line: h.line, preview: h.preview });\n else {\n truncated = true;\n if (stopAtCap) return { hits, total, truncated };\n }\n }\n }\n return { hits, total, truncated };\n}\n\n/**\n * Fan the candidate files across `worker_threads`. Each worker runs the same\n * matcher over its shard and returns rows + an exact count; the main thread\n * merges, sorts and caps. The worker source is a self-contained CommonJS string\n * (eval worker) so it survives bundling with no separate worker-file path to\n * resolve at runtime. Any worker failure falls back to a correct inline scan —\n * speed is negotiable, completeness is not.\n */\nasync function scanParallel(root: string, files: string[], needleLower: string): Promise<ScanOutcome> {\n const n = Math.min(files.length, Math.max(2, Math.min(8, os.cpus().length - 1)));\n const shards: string[][] = Array.from({ length: n }, () => []);\n files.forEach((f, i) => shards[i % n].push(f));\n\n let results: ScanOutcome[];\n try {\n results = await Promise.all(shards.map((shard) => runWorker(root, shard, needleLower)));\n } catch {\n return scanInline(root, files, needleLower, ROW_CAP, false, undefined);\n }\n\n const hits: LiteralHit[] = [];\n let total = 0;\n let truncated = false;\n for (const r of results) {\n total += r.total;\n truncated = truncated || r.truncated;\n for (const h of r.hits) hits.push(h);\n }\n hits.sort((a, b) => (a.file < b.file ? -1 : a.file > b.file ? 1 : a.line - b.line));\n if (hits.length > ROW_CAP) {\n hits.length = ROW_CAP;\n truncated = true;\n }\n return { hits, total, truncated };\n}\n\nconst WORKER_SOURCE = [\n \"const { parentPort, workerData } = require('worker_threads');\",\n \"const fs = require('fs');\",\n \"const path = require('path');\",\n `const MAX = ${MAX_FILE_BYTES};`,\n `const PREVIEW = ${PREVIEW_CHARS};`,\n `const CAP = ${ROW_CAP};`,\n 'const NUL = String.fromCharCode(0);',\n 'const NL = String.fromCharCode(10);',\n 'const { root, files, needleLower } = workerData;',\n 'const hits = []; let total = 0, truncated = false;',\n 'for (const rel of files) {',\n ' const abs = path.join(root, rel);',\n ' let text;',\n ' try { if (fs.statSync(abs).size > MAX) continue; text = fs.readFileSync(abs, \"utf8\"); } catch { continue; }',\n ' if (text.includes(NUL)) continue;',\n ' const low = text.toLowerCase();',\n ' if (!low.includes(needleLower)) continue;',\n ' const lowLines = low.split(NL); const rawLines = text.split(NL);',\n ' for (let i = 0; i < lowLines.length; i++) {',\n ' if (!lowLines[i].includes(needleLower)) continue;',\n ' total++;',\n ' if (hits.length < CAP) hits.push({ file: rel, line: i + 1, preview: rawLines[i].trim().slice(0, PREVIEW) });',\n ' else truncated = true;',\n ' }',\n '}',\n 'parentPort.postMessage({ hits, total, truncated });',\n].join('\\n');\n\n/** One shard on one worker; rejects on any worker error so the caller can fall back. */\nfunction runWorker(root: string, files: string[], needleLower: string): Promise<ScanOutcome> {\n return new Promise<ScanOutcome>((resolve, reject) => {\n const w = new Worker(WORKER_SOURCE, { eval: true, workerData: { root, files, needleLower } });\n let settled = false;\n w.once('message', (m: ScanOutcome) => {\n settled = true;\n resolve(m);\n });\n w.once('error', reject);\n w.once('exit', (code) => {\n if (!settled && code !== 0) reject(new Error(`literal-scan worker exited with code ${code}`));\n });\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { findNodes } from './lookup.js';\nimport { scanCandidates } from './literal-scan.js';\nimport { extractLiteralNeedles, residualForSymbolSearch } from './query.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * `search_symbols` — the hybrid flashlight next to the map\n * (docs/graph/VG-GRAPH-OPTIMIZATION-PLAN.md P1).\n *\n * Two passes, both bounded and deterministic:\n * 1. symbol pass — the graph's own name index via findNodes (exact id /\n * qualified name / short name / case-insensitive / substring), ranked;\n * 2. literal pass — a repo-root-jailed substring scan over source files for\n * strings the graph does not model (config keys, log messages, comments),\n * only run when the symbol pass has spare result budget.\n *\n * Rows are tiny by contract ({kind, name, file, line, score|preview}) — this\n * tool exists to make \"I know the name\" discovery one cheap call, so the model\n * never flails through graph queries for a plain string lookup.\n */\n\nexport interface SymbolHit {\n kind: string;\n name: string;\n file: string;\n line: number;\n score: number;\n}\n\nexport interface TextHit {\n kind: 'text';\n file: string;\n line: number;\n preview: string;\n}\n\nexport interface SearchResult {\n matches: (SymbolHit | TextHit)[];\n moreAvailable: boolean;\n /**\n * Total literal (text) matches across the scanned tree, reported when a\n * literal sweep ran (a whitespace/phrase query). Lets a caller doing a \"find\n * every occurrence\" sweep know whether the shown text rows are the complete\n * set (`totalTextMatches` === shown text rows) or a page of a larger set\n * (`totalTextMatches` > shown) — so it never mistakes a truncated list for a\n * complete one, and never has to fall back to grep to be sure. A trailing `+`\n * intent is signalled via `moreAvailable`; absent for single-name lookups.\n */\n totalTextMatches?: number;\n /**\n * Present when nothing matched (the pivot to take) or when a literal sweep was\n * truncated (how to get the rest).\n */\n hint?: string;\n}\n\nconst IGNORE_DIRS = new Set([\n '.git', '.claude', '.vibgrate', 'node_modules', 'dist', 'build', 'out', 'target', 'vendor', '__pycache__',\n // .NET intermediate output and coverage reports: purely generated trees that a\n // C#/coverage-heavy repo pays for on every literal sweep. `bin` is deliberately\n // NOT here — plenty of repos keep real scripts in bin/ (rails, node CLIs), and\n // completeness beats speed; the binary-extension skip below keeps a .NET bin/\n // cheap anyway.\n 'obj', 'coverage',\n]);\nconst MAX_FILES_SCANNED = 20_000;\n\n/**\n * Extensions that are binary by construction — skipped at listing time so the\n * scan never stats/reads megabytes of DLLs or images just to reject them on the\n * NUL check. Applied identically to the Node walk and the rg parse so both\n * listers see the same corpus. Content-level binary detection (the NUL check in\n * literal-scan) still guards everything this list misses.\n */\nconst BINARY_EXTS = new Set([\n '.dll', '.pdb', '.exe', '.so', '.dylib', '.a', '.lib', '.o', '.class', '.jar', '.wasm', '.node',\n '.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.icns', '.bmp',\n '.zip', '.gz', '.tgz', '.bz2', '.xz', '.7z', '.rar',\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n '.mp3', '.mp4', '.mov', '.avi', '.pdf',\n]);\n\nfunction hasBinaryExt(rel: string): boolean {\n return BINARY_EXTS.has(path.extname(rel).toLowerCase());\n}\n\n/** Repo-relative paths are always reported with forward slashes — matching the\n * graph's own file paths, so symbol-hit/text-hit dedup works on Windows too. */\nfunction toPosix(rel: string): string {\n return path.sep === '\\\\' ? rel.replaceAll('\\\\', '/') : rel;\n}\n\nexport async function searchSymbols(graph: VgGraph, root: string, query: string, limit: number): Promise<SearchResult> {\n let q = query.trim();\n if (!q) return { matches: [], moreAvailable: false, hint: 'query is required' };\n\n // A query wrapped in matching quotes is an explicit \"find this exact string\"\n // — the tool description tells agents a QUOTED phrase runs a complete literal\n // sweep, but a quoted SINGLE identifier (\"AddJwtBearer\") has no whitespace,\n // used to take the single-name path, and searched for the quote characters\n // themselves: a guaranteed no-match that sent the agent straight back to grep\n // (the field-report failure). Strip the quotes and honour the intent.\n const quoted = /^([\"'`])(.+)\\1$/.exec(q);\n if (quoted && quoted[2]!.trim()) q = quoted[2]!.trim();\n\n // Embedded URL / quoted needles inside a natural-language ask\n // (\"https://dash…/signup does not exist find occurrences\"). The literal\n // sweep must search for the *needle*, not the whole sentence — otherwise\n // extension.ts:955 (bare URL) is a complete miss while only test fixtures\n // that paste the full ask match.\n const embeddedNeedles = extractLiteralNeedles(q);\n const scanNeedle =\n embeddedNeedles.length === 0\n ? q\n : embeddedNeedles.length === 1 && embeddedNeedles[0] === q\n ? q\n : [...embeddedNeedles].sort((a, b) => b.length - a.length)[0]!;\n // Symbol pass: residual framing only, and empty when residual is pure\n // scaffolding (\"where is …?\") so we do not rank applyPlan.where etc.\n const symbolQuery =\n embeddedNeedles.length > 0 ? residualForSymbolSearch(q) : q;\n\n // Literal-sweep routing. Shapes that can never name one graph symbol:\n // - internal whitespace (\"find every place that says X\");\n // - explicit quotes (stripped above — quoting IS the sweep signal);\n // - a URL (`https://…`) — host/path tokens are not identifiers; without this\n // branch a bare URL stayed symbol-first and never ran the literal sweep\n // (field report: find occurrences of https://dash…/signup);\n // - embedded URL/quote inside NL framing (scanNeedle ≠ full query);\n // - a slash path with no `:` and no glob chars (\"opportunities/mine\",\n // \"api/users/mine\") — a route/path STRING. Its tokens previously fell into\n // the per-token symbol union, where a single loose token (\"mine\") produced\n // a confidently-ranked, completely unrelated symbol instead of a clean\n // literal answer. (`:`-bearing non-URL queries stay symbol-first: file:line\n // and qualified names look like paths too; globs keep the glob tier.)\n // Single-name lookups (the hot path) keep symbol-first behaviour unchanged.\n const isUrl = /^https?:\\/\\//i.test(scanNeedle) || embeddedNeedles.some((n) => /^https?:\\/\\//i.test(n));\n const isPhrase =\n Boolean(quoted) ||\n isUrl ||\n embeddedNeedles.length > 0 ||\n /\\s/.test(q) ||\n (/[/\\\\]/.test(q) && !q.includes(':') && !/[*?]/.test(q));\n\n // Pass 1 — graph name index (already ranked by importance).\n let nodes: GraphNode[] = [];\n if (symbolQuery.trim()) {\n nodes = findNodes(graph, symbolQuery).filter((n) => n.kind !== 'file');\n // File-path tier: a query that IS a repo path (\"src/services/OrderService.ts\")\n // used to dead-end — the name index only knows the file NODE (filtered out as\n // uninteresting) and the literal scan only finds the path where it appears as\n // text. The useful answer is the symbols DEFINED in that file, ranked.\n if (nodes.length === 0) {\n nodes = fileSymbolNodes(graph, symbolQuery);\n }\n // Reconstructed-identifier fallthrough: a humanized/spaced query (\"get id\",\n // \"use team\", \"f 0304\") is frequently a *single* identifier whose original\n // separators (camelCase boundary, `_`) were lost in humanization, not a\n // multi-word phrase. Try the two mechanical rejoins — concatenated (recovers\n // camelCase: \"get id\" -> \"getid\" == \"getId\") and underscore-joined (recovers\n // snake_case: \"f 0304\" -> \"f_0304\") — against the exact/case-insensitive name\n // index before falling through to the noisy per-token substring union below,\n // which has no way to re-associate short tokens back into one identifier and\n // silently drops single-character tokens (\"f\") that carry real information\n // (VG-LOCATE-FAILURE-ANALYSIS.md).\n if (nodes.length === 0 && isPhrase) {\n nodes = reconstructedIdentifierNodes(graph, symbolQuery);\n }\n // Multi-word fallthrough: an agent that types a phrase (\"NewScan modal\n // component\", \"dsn install command\") gets nothing from the whole-string name\n // index and nothing from the whole-string literal scan — a dead end. When the\n // exact query finds no symbol AND the query is multiple words, union the\n // per-token matches and rank by how many distinct query tokens each symbol\n // covers (then importance).\n if (nodes.length === 0) {\n const tokens = queryTokens(symbolQuery);\n if (tokens.length >= 2) nodes = multiTokenNodes(graph, tokens);\n }\n }\n // For a phrase, cap the symbol section to a fraction of the budget so it can\n // never crowd out the literal scan; the string hits lead, the loosely-matching\n // symbols follow as \"the name also means this\" context. Single names keep the\n // full budget for the symbol pass.\n const symbolCap = isPhrase ? Math.max(1, Math.floor(limit / 3)) : limit;\n const symbolHits: SymbolHit[] = nodes.slice(0, symbolCap).map((n, i) => ({\n kind: n.kind,\n name: n.qualifiedName,\n file: n.file,\n line: n.span.start,\n score: Math.round((1 - i / Math.max(nodes.length, 1)) * 100) / 100,\n }));\n\n // Pass 2 — literal scan for what the graph doesn't model. A phrase always gets\n // the budget the symbol cap freed up and a full count of what's out there\n // (`countAll`), so the caller can trust it for a complete sweep. A single name\n // only falls through on spare budget and stops at the budget, as before.\n // Scan `scanNeedle` (extracted URL/quote when present), not the full NL ask.\n const spare = limit - symbolHits.length;\n const textHits: TextHit[] = [];\n let truncatedScan = false;\n let totalTextMatches: number | undefined;\n // A single name the graph resolved EXACTLY (id / name / qualified name /\n // file:line) doesn't fall through to the literal scan at all: the symbol\n // answer is authoritative for \"where is X defined\", and padding it with text\n // occurrences meant every perfect lookup still paid a worst-case full-tree\n // sweep (the 16s-per-call trace on a large repo). Occurrence sweeps stay one\n // explicit call away (quote it / add whitespace, or use impact_of/get_node\n // callers for reference lists). Non-exact fallthroughs are unchanged.\n const skipScan = !isPhrase && hasExactSymbolMatch(nodes, symbolQuery || q);\n if (spare > 0 && !skipScan) {\n const seen = new Set(symbolHits.map((h) => `${h.file}:${h.line}`));\n const scan = await scanFiles(root, scanNeedle, spare, seen, textHits, isPhrase);\n truncatedScan = scan.truncated;\n if (isPhrase) totalTextMatches = scan.total;\n }\n\n // Phrase/URL occurrence answers lead with text hits; symbols are secondary.\n const matches = isPhrase ? [...textHits, ...symbolHits] : [...symbolHits, ...textHits];\n if (matches.length === 0) {\n const empty: SearchResult = {\n matches,\n moreAvailable: false,\n hint: 'no symbol or text match — for meaning-level questions (symptoms, relationships, what-breaks-if) use query_graph',\n };\n // Phrase/URL sweeps still report totalTextMatches (including 0) so callers\n // can tell a complete miss from a symbol-only empty without re-scanning.\n if (totalTextMatches !== undefined) empty.totalTextMatches = totalTextMatches;\n return empty;\n }\n\n const literalTruncated = totalTextMatches !== undefined && totalTextMatches > textHits.length;\n // A phrase's deliberately-capped symbol section is not \"more available\"; only a\n // truncated literal sweep is. A single name reports the usual symbol overflow.\n const moreAvailable = isPhrase ? literalTruncated || truncatedScan : nodes.length > symbolHits.length || truncatedScan;\n const result: SearchResult = { matches, moreAvailable };\n if (totalTextMatches !== undefined) result.totalTextMatches = totalTextMatches;\n if (literalTruncated) {\n result.hint = `showing ${textHits.length} of ${totalTextMatches}${truncatedScan ? '+' : ''} literal matches — raise limit or narrow the query to get them all`;\n }\n return result;\n}\n\n/**\n * Symbols defined in the file the query names, ranked by importance — the\n * file-path resolution tier. Accepts the exact repo-relative path (with or\n * without a leading `./`, either separator style) or an unambiguous path\n * suffix (\"services/OrderService.ts\"). Returns [] when the query names no file.\n */\nfunction fileSymbolNodes(graph: VgGraph, q: string): GraphNode[] {\n if (!/[/\\\\]/.test(q) && !/\\.\\w+$/.test(q)) return []; // cheap guard: not path-shaped\n const norm = q.replaceAll('\\\\', '/').replace(/^\\.\\//, '');\n const inFile = graph.nodes.filter(\n (n) => n.kind !== 'file' && (n.file === norm || n.file.endsWith(`/${norm}`)),\n );\n return [...inFile].sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName));\n}\n\n/**\n * Did the graph resolve `q` as an exact identifier (not a loose substring)?\n * Mirrors findNodes' exact tiers: content-hash id, `file:line`, and whole-name /\n * qualified-name equality (case-insensitive). Substring-tier matches return\n * false so a partial name still gets the literal fallthrough.\n */\nfunction hasExactSymbolMatch(nodes: GraphNode[], q: string): boolean {\n if (nodes.length === 0) return false;\n if (/^(.*):(\\d+)$/.test(q)) return true; // resolved via the file:line tier\n const lower = q.toLowerCase();\n return nodes.some((n) => n.id === q || n.qualifiedName.toLowerCase() === lower || n.name.toLowerCase() === lower);\n}\n\n/** Meaningful query words for the multi-word fallthrough (drop tiny tokens). */\nfunction queryTokens(q: string): string[] {\n return [...new Set(q.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length >= 2))];\n}\n\n/**\n * Rejoin a humanized query's words back into one identifier and look it up\n * exactly. Humanization is lossy (both camelCase boundaries and `_`/`-`\n * collapse to a plain space), so the original separator can't be recovered —\n * try both mechanical rejoins and let `findNodes`'s case-insensitive exact\n * match do the rest. Concatenated first (camelCase is the more common source\n * convention across this engine's languages); underscore-joined second.\n */\nfunction reconstructedIdentifierNodes(graph: VgGraph, q: string): GraphNode[] {\n const words = q.trim().split(/\\s+/).filter(Boolean);\n if (words.length < 2) return [];\n const concat = findNodes(graph, words.join(''));\n if (concat.length) return concat.filter((n) => n.kind !== 'file');\n const snake = findNodes(graph, words.join('_'));\n return snake.filter((n) => n.kind !== 'file');\n}\n\n/**\n * Union of per-token name-index matches, ranked by how many distinct query\n * tokens each symbol covers (then by importance). Reuses `findNodes` per token\n * so the matching rules (exact/short/case-insensitive/substring) stay identical\n * to a single-name lookup — this only broadens a phrase into its words.\n *\n * Noise guard: a symbol that only SUBSTRING-matched a single token is exactly\n * the false-positive case — \"opportunities/mine\" surfacing an unrelated symbol\n * through \"mine\" and presenting it as a confident answer when the honest\n * result is \"no match\" (field report). Such nodes need ≥ 2 covered tokens to\n * survive. A node whose NAME (or qualified name) equals a token outright is a\n * strong signal on its own and always survives — \"UserCard7 card panel\" must\n * keep UserCard7 even when the loose \"card\" token list is capped elsewhere.\n */\nfunction multiTokenNodes(graph: VgGraph, tokens: string[]): GraphNode[] {\n // One uncapped pass over the graph, scoring every node against every token.\n // (Delegating per-token to findNodes hit its 25-row substring cap: on a large\n // graph a common token's list overflows, real targets lose that token's\n // coverage, and the noise filter below would then discard them.)\n const scored: Array<{ node: GraphNode; hits: number; exact: boolean }> = [];\n for (const n of graph.nodes) {\n if (n.kind === 'file') continue;\n const name = n.name.toLowerCase();\n const qn = n.qualifiedName.toLowerCase();\n let hits = 0;\n let exact = false;\n for (const t of tokens) {\n if (name === t || qn === t) {\n hits++;\n exact = true;\n } else if (qn.includes(t)) hits++;\n }\n if (exact || hits >= 2) scored.push({ node: n, hits, exact });\n }\n return scored\n .sort((a, b) => Number(b.exact) - Number(a.exact) || b.hits - a.hits || b.node.importance - a.node.importance || a.node.qualifiedName.localeCompare(b.node.qualifiedName))\n .map((e) => e.node);\n}\n\ninterface ScanResult {\n /** Distinct matching lines found (excluding those already in `seen`). When\n * `countAll` is false this is only a lower bound — the scan stops at `budget`. */\n total: number;\n /** True when the scan stopped early (file cap hit, or budget hit without\n * `countAll`) — more matches may exist beyond what was counted. */\n truncated: boolean;\n}\n\n/**\n * Bounded, repo-root-jailed literal scan. Fills `out` with up to `budget` hits;\n * with `countAll` it reports the true total across the tree (a \"find every\n * occurrence\" sweep), otherwise it stops at `budget` (a cheap fallthrough).\n *\n * Two stages (VG-LITERAL-INDEX-DESIGN.md, Stage 1):\n * 1. LIST candidate files — `ripgrep` when it's on PATH (SIMD/parallel, prunes\n * to just the files that match), else a Node directory walk (Node-native,\n * offline, air-gap-safe). rg is only a pruner, never the authority.\n * 2. SCAN those files — `scanCandidates`, a uniform pure-JS engine that fans\n * large sweeps across `worker_threads` so it's fast on every platform with\n * nothing installed. It is the single source of the reported rows and\n * `total`, so the answer is identical whether or not rg is present.\n *\n * `seen` (the symbol-pass hit lines) is excluded so a line already shown as a\n * symbol isn't repeated as a text hit.\n */\nasync function scanFiles(root: string, needle: string, budget: number, seen: Set<string>, out: TextHit[], countAll: boolean): Promise<ScanResult> {\n const listing = listCandidateFiles(root, needle);\n const outcome = await scanCandidates(root, listing.files, needle, { collectAll: countAll, budget });\n\n let overlap = 0; // matches that coincide with a symbol-pass line (near-zero in practice)\n for (const h of outcome.hits) {\n if (seen.has(`${h.file}:${h.line}`)) {\n overlap++;\n continue;\n }\n seen.add(`${h.file}:${h.line}`);\n if (out.length < budget) out.push({ kind: 'text', file: h.file, line: h.line, preview: h.preview });\n }\n return { total: outcome.total - overlap, truncated: listing.truncated || outcome.truncated };\n}\n\ninterface Listing {\n /** Repo-relative candidate paths, lexicographically sorted (deterministic in\n * both modes so rows and truncation don't depend on which lister ran). */\n files: string[];\n /** True when the candidate set was capped (more files may match beyond it). */\n truncated: boolean;\n}\n\n/** rg-pruned candidates when available (fast), else the (cached) full Node walk. */\nfunction listCandidateFiles(root: string, needle: string): Listing {\n return ripgrepCandidates(root, needle) ?? walkCandidatesCached(root);\n}\n\n/**\n * TTL cache for the Node-walk listing. The walk is needle-independent (it lists\n * every scannable file), so a burst of search_symbols calls — the normal agent\n * pattern is several lookups in one turn — was re-walking the whole tree each\n * time. The TTL bounds staleness to the same few-second window the serve\n * freshness probe already accepts (server.ts PROBE_INTERVAL_MS); file CONTENTS\n * are always read live at scan time, so only a file created/deleted inside the\n * window can be missed, and only from the listing. rg listings are per-needle\n * and fast, so they bypass this cache entirely.\n */\nconst LISTING_TTL_MS = 2000;\nconst listingCache = new Map<string, { listing: Listing; at: number }>();\n\n/** Drop all cached listings (tests, or after a known tree mutation). */\nexport function clearListingCache(): void {\n listingCache.clear();\n}\n\n/** TTL, overridable via VG_LISTING_TTL_MS (0 disables caching entirely). */\nfunction listingTtlMs(): number {\n const v = Number(process.env.VG_LISTING_TTL_MS);\n return Number.isFinite(v) && v >= 0 ? v : LISTING_TTL_MS;\n}\n\nfunction walkCandidatesCached(root: string): Listing {\n const ttl = listingTtlMs();\n if (ttl > 0) {\n const hit = listingCache.get(root);\n if (hit && Date.now() - hit.at < ttl) return hit.listing;\n }\n const listing = walkCandidates(root);\n if (ttl > 0) listingCache.set(root, { listing, at: Date.now() });\n return listing;\n}\n\n/** Every non-ignored, non-hidden file under root — the Node-native fallback. */\nfunction walkCandidates(root: string): Listing {\n const files: string[] = [];\n let truncated = false;\n const stack = [root];\n while (stack.length) {\n const dir = stack.pop()!;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const e of entries) {\n if (e.name.startsWith('.') || IGNORE_DIRS.has(e.name)) continue;\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) {\n stack.push(abs);\n continue;\n }\n if (hasBinaryExt(e.name)) continue;\n if (files.length >= MAX_FILES_SCANNED) {\n truncated = true;\n continue;\n }\n files.push(toPosix(path.relative(root, abs)));\n }\n }\n files.sort();\n return { files, truncated };\n}\n\nlet rgAvailable: boolean | undefined;\n/** Is `ripgrep` usable? Probed once; opt out with VG_DISABLE_RIPGREP. */\nfunction hasRipgrep(): boolean {\n if (process.env.VG_DISABLE_RIPGREP) return false;\n if (rgAvailable === undefined) {\n try {\n rgAvailable = spawnSync('rg', ['--version'], { stdio: 'ignore', timeout: 3000, windowsHide: true }).status === 0;\n } catch {\n rgAvailable = false;\n }\n }\n return rgAvailable;\n}\n\n/**\n * Files containing `needle` per ripgrep, or `null` if rg is unavailable/errored\n * (caller falls back to the Node walk). rg is invoked as a fixed-string,\n * case-insensitive, gitignore-disabled, hidden-skipping lister — the same corpus\n * the Node walk sees — jailed to `root` via cwd. `--fixed-strings` + `--` make\n * the agent-supplied needle inert as a pattern/flag; no shell is involved.\n */\nfunction ripgrepCandidates(root: string, needle: string): Listing | null {\n if (!hasRipgrep()) return null;\n const globs = [...IGNORE_DIRS].flatMap((d) => ['--glob', `!**/${d}/**`, '--glob', `!${d}/**`]);\n const res = spawnSync(\n 'rg',\n ['--files-with-matches', '--fixed-strings', '--ignore-case', '--no-ignore', '--no-messages', ...globs, '--', needle, '.'],\n // windowsHide: rg runs from console-less hosts (vgd, editor-spawned\n // servers) too — never flash a console window for it.\n { cwd: root, encoding: 'utf8', timeout: 15_000, maxBuffer: 32 * 1024 * 1024, windowsHide: true },\n );\n // status 0 = matches, 1 = no matches (both fine); anything else / a spawn error\n // (signal kill on timeout, buffer overflow) is untrustworthy — fall back.\n if (res.error || (res.status !== 0 && res.status !== 1) || res.signal) return null;\n const files = parseRgFileList(res.stdout);\n if (files.length > MAX_FILES_SCANNED) return { files: files.slice(0, MAX_FILES_SCANNED), truncated: true };\n return { files, truncated: false };\n}\n\n/**\n * Parse `rg --files-with-matches` stdout into clean, sorted, POSIX-relative\n * paths. On Windows rg emits `.\\src\\Foo.cs` — before this was separator-aware,\n * the whole backslash path read as ONE segment starting with `.`, so the\n * defensive hidden-file filter below discarded every result and a Windows\n * machine with rg installed silently lost all literal hits. Normalising to\n * forward slashes first (matching the graph's own path style) makes the filter\n * see real segments on every platform. Exported for tests; `sep` is injectable\n * so Windows output can be simulated on any host.\n */\nexport function parseRgFileList(stdout: string, sep: string = path.sep): string[] {\n const seen = new Set<string>();\n for (const raw of stdout.split('\\n')) {\n if (!raw) continue;\n const posix = sep === '\\\\' ? raw.replaceAll('\\\\', '/') : raw;\n const rel = posix.startsWith('./') ? posix.slice(2) : posix;\n if (!rel) continue;\n // Defensive: never trust a path that escaped the ignore/hidden rules, and\n // keep the corpus identical to the walk's (same binary-extension skip).\n const segs = rel.split('/');\n if (segs.some((s) => s.startsWith('.') || IGNORE_DIRS.has(s))) continue;\n if (hasBinaryExt(rel)) continue;\n seen.add(rel);\n }\n return [...seen].sort();\n}\n"]}